Skip to content

Commit d678493

Browse files
authored
feat(my): teams - add intersystems + table number (#291)
1 parent ab30941 commit d678493

File tree

6 files changed

+1356
-36
lines changed

6 files changed

+1356
-36
lines changed

app/pages/team.vue

+118-31
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</div>
1515
</div>
1616

17-
You do not have a team yet.
17+
<p>You do not have a team yet.</p>
1818

1919
<button
2020
v-if="canSubmit"
@@ -41,6 +41,9 @@
4141
v-if="editingTeam"
4242
v-model="tempTeam!.teamName"
4343
class="p box-border border-[1px] border-black bg-white text-3xl font-semibold text-black"></ICInput>
44+
45+
<p class="text-3xl font-semibold text-black">Team #{{ team!.id }}</p>
46+
4447
<button v-if="!editingTeam" title="Edit team name">
4548
<img
4649
src="@ui25/assets/edit.svg"
@@ -71,13 +74,17 @@
7174
<ICTeamMember
7275
class="max-w-80"
7376
v-for="(member, i) in team!.members"
77+
:editing="editingTeam"
7478
:name="member.name"
7579
:color="colors[i % 3]!"
76-
:leader="member.leader" />
80+
:leader="member.leader"
81+
@cross="handleRemoveTeammate(member.id)" />
7782
</div>
7883
</div>
7984

80-
<h2 class="text-2xl font-semibold">Pending Invites</h2>
85+
<h2 class="text-2xl font-semibold" v-if="team!.invited.length > 0">
86+
Pending Invites
87+
</h2>
8188
<div class="flex flex-wrap gap-2" v-if="team!.invited.length > 0">
8289
<ICTeamMember
8390
class="w-fit"
@@ -115,12 +122,12 @@
115122

116123
<div class="space-y-6">
117124
<div>
118-
<h3>Phone Number:</h3>
125+
<h3>Phone Number (UK number preferred):</h3>
119126
<ICInput
120127
v-if="!editingTeam"
121128
:frozen="true"
122129
v-model="team!.phone"
123-
placeholder="Please input your phone number." />
130+
placeholder="+44..." />
124131
<ICInput v-else v-model="tempTeam.phone" placeholder="+44..." />
125132
</div>
126133

@@ -129,22 +136,55 @@
129136
<ICInput
130137
v-if="!editingTeam"
131138
:frozen="true"
132-
placeholder="Input your backup phone number."
139+
placeholder="+44..."
133140
v-model="team!.phone2" />
134141
<ICInput v-else v-model="tempTeam.phone2" placeholder="+44..." />
135142
</div>
136143

144+
<div class="max-w-fit">
145+
<h3>Hackspace:</h3>
146+
<ICInputSelect
147+
name="hackspace"
148+
v-if="!editingTeam"
149+
:frozen="true"
150+
placeholder="Hackspace"
151+
:options="hackspaceOptions"
152+
v-model="team!.hackspace" />
153+
<ICInputSelect
154+
v-else
155+
name="hackspaceTmp"
156+
placeholder="Hackspace"
157+
:options="hackspaceOptions"
158+
v-model="tempTeam.hackspace" />
159+
</div>
160+
137161
<div>
138-
<h3>Submission Link:</h3>
162+
<h3>Table number:</h3>
139163
<ICInput
140164
v-if="!editingTeam"
141165
:frozen="true"
142-
placeholder="https://devpost.com/..."
166+
v-model="team!.tableNumber" />
167+
<ICInput v-else v-model="tempTeam.tableNumber" />
168+
</div>
169+
170+
<div>
171+
<h3>
172+
<a
173+
href="https://ic-hack-25.devpost.com/"
174+
target="_blank"
175+
class="underline"
176+
>Submission Link:</a
177+
>
178+
</h3>
179+
<ICInput
180+
v-if="!editingTeam"
181+
:frozen="true"
182+
placeholder="https://ic-hack-25.devpost.com/..."
143183
v-model="team!.submissionLink" />
144184
<ICInput
145185
v-else
146186
v-model="tempTeam.submissionLink"
147-
placeholder="https://devpost.com/..."
187+
placeholder="https://ic-hack-25.devpost.com/..."
148188
pattern="urlRegex" />
149189
</div>
150190

@@ -185,6 +225,42 @@
185225
placeholder="Please select a category"
186226
:options="mapCategories(sponsor_categories)" />
187227
</div>
228+
229+
<div>
230+
<ICInputCheckbox
231+
:fixed="!editingTeam"
232+
title="Have you used Intersystems IRIS Vector Search in your project?"
233+
description="Tick yes to enter for Intersystems' challenge."
234+
name="terms"
235+
v-model="tempTeam.intersystems" />
236+
</div>
237+
238+
<div>
239+
<h3
240+
v-if="!editingTeam"
241+
:class="[
242+
'text-xl font-bold',
243+
missingRequirements.length > 0
244+
? 'text-red-ic'
245+
: 'text-green-400'
246+
]">
247+
You have {{ missingRequirements.length > 0 ? 'not' : '' }} met
248+
all the requirements to submit.
249+
</h3>
250+
<ul v-if="missingRequirements.length > 0 && !editingTeam">
251+
Your team will not be submitted for judging. You are missing:
252+
<li
253+
v-for="req in missingRequirements"
254+
:key="req"
255+
class="ml-8 list-disc">
256+
{{ req }}
257+
</li>
258+
</ul>
259+
<p v-else>
260+
Your team will automatically be submitted for judging at the
261+
deadline.
262+
</p>
263+
</div>
188264
</div>
189265
</div>
190266
</div>
@@ -208,7 +284,7 @@ import TeamInvite from '~~/packages/ui25/components/IC/TeamInvite.vue';
208284
209285
const colors = ['bg-red-ic', 'bg-blue-ic', 'bg-yellow-ic'];
210286
211-
definePageMeta({ middleware: 'require-auth' });
287+
definePageMeta({ middleware: ['require-auth', 'require-link'] });
212288
213289
const { data: canSubmit } = await useAsyncData('can_submit', async () => {
214290
const { getMetaDataInfo } = useAdmin();
@@ -224,6 +300,12 @@ const mapCategories = (values: readonly Category[]) =>
224300
};
225301
});
226302
303+
const hackspaceOptions = [
304+
{ displayName: "Queen's Tower Room", value: 'qtr' },
305+
{ displayName: 'Senior Common Room', value: 'scr' },
306+
{ displayName: 'Junior Common Room', value: 'jcr' }
307+
];
308+
227309
const {
228310
getOwnTeam,
229311
getTeamInvites,
@@ -239,16 +321,25 @@ const {
239321
disbandTeam
240322
} = useTeams();
241323
242-
const urlRegex =
243-
/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
244-
324+
const urlRegex = /https:\/\/ic-hack-25.devpost.com\/.+/;
245325
const store = useProfileStore();
246326
const profile = store.profile!;
247327
248328
const errorMessage = ref('');
329+
const missingRequirements = computed(() => {
330+
const reqs = [];
331+
332+
if (!tempTeam.phone) reqs.push('phone number');
333+
if (!tempTeam.hackspace) reqs.push('hackspace');
334+
if (!tempTeam.tableNumber) reqs.push('table number');
335+
if (!tempTeam.submissionLink) reqs.push('submission link');
336+
if (!tempTeam.docsocCategory) reqs.push('DoCSoc category');
337+
if (!tempTeam.sponsorCategory) reqs.push('sponsor category');
338+
339+
return reqs;
340+
});
249341
250342
const editingTeam = ref(false);
251-
const isInvitingTeam = ref(false);
252343
const maxTeammates = computed(
253344
() =>
254345
(team.value?.members.length ?? 0) + (team.value?.members.length ?? 0) >= 6
@@ -276,8 +367,6 @@ const submissionOutline = computed(() =>
276367
: 'outline-red-700'
277368
);
278369
279-
const searchPerson = ref('');
280-
281370
// TODO: Should this be fetched from some api route?
282371
const editable = ref(true);
283372
@@ -300,8 +389,6 @@ const docsoc_categories =
300389
const sponsor_categories =
301390
all_categories.value?.filter(c => c?.owner != 'DoCSoc') ?? [];
302391
303-
const profileColours = ['bg-red-ic', 'bg-blue-ic', 'bg-yellow-ic'];
304-
305392
const {
306393
data: team,
307394
refresh: reloadTeam,
@@ -344,7 +431,10 @@ const tempTeam = reactive({
344431
sponsorCategory: team.value?.sponsorCategory ?? undefined,
345432
submissionLink: team.value?.submissionLink ?? undefined,
346433
phone: team.value?.phone ?? undefined,
347-
phone2: team.value?.phone2 ?? undefined
434+
phone2: team.value?.phone2 ?? undefined,
435+
intersystems: team.value?.intersystems ?? undefined,
436+
tableNumber: team.value?.tableNumber ?? undefined,
437+
hackspace: team.value?.hackspace ?? undefined
348438
});
349439
350440
async function handleCreateTeam() {
@@ -414,28 +504,27 @@ async function handleConfirmTeamName() {
414504
if (tempTeam.submissionLink == '') tempTeam.submissionLink = undefined;
415505
416506
if (!phoneRegex.test(tempTeam.phone ?? '')) {
417-
console.log('L bozo');
418507
errorMessage.value =
419508
"Please ensure you've provided a phone number, with the country code.";
420509
return;
421510
}
422511
if (tempTeam.phone2 && !phoneRegex.test(tempTeam.phone2)) {
423-
console.log('L bozo 2');
424512
errorMessage.value =
425513
"Please ensure the backup phone number you've provided is correct, with the country code.";
426514
return;
427515
}
428-
if (tempTeam.submissionLink && !urlRegex.test(tempTeam.submissionLink)) {
429-
console.log('L bozo 3');
430-
errorMessage.value = 'Please ensure your submission link is a proper URL.';
516+
if (
517+
tempTeam.submissionLink &&
518+
!tempTeam.submissionLink.includes('ic-hack-25.devpost.com')
519+
) {
520+
errorMessage.value =
521+
'Please ensure your submission link is a proper Devpost URL. It should contain "ic-hack-25.devpost.com".';
431522
return;
432523
}
433524
434525
editingTeam.value = false;
435526
inviteFilter.value = '';
436527
437-
console.log('W bozo');
438-
439528
// Only make the request if something has changed.
440529
const noChanges = Object.keys(tempTeam).every(elem => {
441530
return (
@@ -467,7 +556,9 @@ function handleCancelTeamName() {
467556
sponsorCategory: team.value?.sponsorCategory ?? undefined,
468557
submissionLink: team.value?.submissionLink ?? undefined,
469558
phone: team.value?.phone ?? undefined,
470-
phone2: team.value?.phone2 ?? undefined
559+
phone2: team.value?.phone2 ?? undefined,
560+
intersystems: team.value?.intersystems ?? undefined,
561+
tableNumber: team.value?.tableNumber ?? undefined
471562
});
472563
}
473564
@@ -493,10 +584,6 @@ async function handleCancelInvite(teammate: string) {
493584
alert("apparently we don't have a way to do this");
494585
}
495586
496-
async function startInviting() {
497-
isInvitingTeam.value = true;
498-
}
499-
500587
async function handleInvite(userId: string) {
501588
const req = await inviteTeammate(userId);
502589

packages/ui25/components/IC/TeamMember.vue

+6-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
:class="[color, 'size-16 self-center p-2']" />
1010

1111
<p class="text-xl font-semibold">{{ leader ? '👑' : '' }} {{ name }}</p>
12-
<!--
13-
<div v-if="pending" class="flex items-center justify-center gap-8">
12+
13+
<div
14+
v-if="!leader && editing"
15+
class="flex items-center justify-center gap-8">
1416
<img
1517
class="cursor-pointer"
1618
src="@ui25/assets/cross.svg"
1719
@click="emit('cross')" />
18-
</div> -->
20+
</div>
1921
</div>
2022
</template>
2123

@@ -25,6 +27,7 @@ type Props = {
2527
color: string;
2628
pending?: boolean;
2729
leader?: boolean;
30+
editing?: boolean;
2831
};
2932
3033
defineProps<Props>();

schemas/0010_extra-teams-fields.sql

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ALTER TABLE "teams" ADD COLUMN "intersystems" boolean DEFAULT false NOT NULL;--> statement-breakpoint
2+
ALTER TABLE "teams" ADD COLUMN "hackspace" "hackspaces";--> statement-breakpoint
3+
ALTER TABLE "teams" ADD COLUMN "table_number" text;

0 commit comments

Comments
 (0)