@burdenoff/microfe-technospam 2026.1031.4 → 2026.1031.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/technospam/api/technospamApi.d.ts +56 -0
- package/dist/technospam/api/technospamApi.d.ts.map +1 -1
- package/dist/technospam/api/technospamApi.js +298 -231
- package/dist/technospam/api/technospamApi.js.map +1 -1
- package/dist/technospam/components/StatusBadge.d.ts.map +1 -1
- package/dist/technospam/components/StatusBadge.js +2 -0
- package/dist/technospam/components/StatusBadge.js.map +1 -1
- package/dist/technospam/components/admin/EnterpriseIntegrationsTab.d.ts +6 -0
- package/dist/technospam/components/admin/EnterpriseIntegrationsTab.d.ts.map +1 -0
- package/dist/technospam/components/admin/EnterpriseIntegrationsTab.js +256 -0
- package/dist/technospam/components/admin/EnterpriseIntegrationsTab.js.map +1 -0
- package/dist/technospam/lib/a11y.d.ts +11 -0
- package/dist/technospam/lib/a11y.d.ts.map +1 -0
- package/dist/technospam/lib/a11y.js +6 -0
- package/dist/technospam/lib/a11y.js.map +1 -0
- package/dist/technospam/lib/enterprise.d.ts +21 -0
- package/dist/technospam/lib/enterprise.d.ts.map +1 -0
- package/dist/technospam/lib/enterprise.js +36 -0
- package/dist/technospam/lib/enterprise.js.map +1 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js +206 -199
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +47 -45
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +74 -72
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +83 -81
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +99 -97
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,49 +8,51 @@ import { EmptyView as f, ErrorView as p, LoadingRows as m } from "../components/
|
|
|
8
8
|
import { TagInput as h } from "../components/TagInput.js";
|
|
9
9
|
import { CodePanel as g, TestResultsPanel as _ } from "../components/SubmissionViews.js";
|
|
10
10
|
import { notify as v } from "../lib/toast.js";
|
|
11
|
-
import { useApproveMentor as y, useArchiveCourse as b, useCompleteHackathon as x, useCoursesQuery as S, useCreateCourse as C, useCreateHackathon as w, useCreateLesson as T, useCreateProblem as ee, useGradeSubmission as E, useHackathonsQuery as D, useLessonQuizKeyQuery as O, useLessonsQuery as k, useMentorsQuery as A, useOpenRegistration as te, useProblemsQuery as
|
|
11
|
+
import { useApproveMentor as y, useArchiveCourse as b, useCompleteHackathon as x, useCoursesQuery as S, useCreateCourse as C, useCreateHackathon as w, useCreateLesson as T, useCreateProblem as ee, useGradeSubmission as E, useHackathonsQuery as D, useLessonQuizKeyQuery as O, useLessonsQuery as k, useMentorsQuery as A, useOpenRegistration as te, useProblemsQuery as ne, usePublishCourse as j, usePublishProblem as M, useRegradeSubmission as N, useScoreTeam as P, useStartHackathon as re, useStartJudging as F, useSubmissionsQuery as I, useTeamsQuery as L, useUpdateLesson as R } from "../api/technospamApi.js";
|
|
12
12
|
import "../components/index.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
13
|
+
import { TAB_PANEL_FOCUS_CLASS as ie } from "../lib/a11y.js";
|
|
14
|
+
import { draftFromLesson as z, draftToInput as ae } from "../components/lesson/lessonAuthoring.js";
|
|
15
|
+
import { LessonKindFields as oe } from "../components/lesson/LessonKindFields.js";
|
|
16
|
+
import { EnterpriseIntegrationsTab as se } from "../components/admin/EnterpriseIntegrationsTab.js";
|
|
17
|
+
import { useMemo as ce, useState as B } from "react";
|
|
18
|
+
import { Archive as V, Award as le, BookOpen as H, Code2 as U, ExternalLink as ue, Gavel as de, ListChecks as W, Pencil as fe, Play as pe, PlugZap as me, Plus as he, RefreshCw as ge, Rocket as _e, ShieldAlert as ve, Trophy as ye, UserCheck as be, Users as G, X as xe } from "lucide-react";
|
|
17
19
|
import { Fragment as K, jsx as q, jsxs as J } from "react/jsx-runtime";
|
|
18
|
-
import { Badge as
|
|
19
|
-
import { nativeConfirm as
|
|
20
|
+
import { Badge as Se, Button as Y, GlassCard as Ce, Input as X, Select as we, SelectContent as Te, SelectItem as Ee, SelectTrigger as De, SelectValue as Oe, Tabs as ke, TabsContent as Ae, TabsList as je, TabsTrigger as Me, Textarea as Z } from "@burdenoff/fe-libs/ui";
|
|
21
|
+
import { nativeConfirm as Ne } from "@burdenoff/fe-libs/shared/native";
|
|
20
22
|
//#region src/technospam/pages/AdminAdminDashboardPagePage.tsx
|
|
21
|
-
var
|
|
23
|
+
var Pe = [
|
|
22
24
|
"ARTICLE",
|
|
23
25
|
"VIDEO",
|
|
24
26
|
"INTERACTIVE",
|
|
25
27
|
"QUIZ",
|
|
26
28
|
"PROJECT"
|
|
27
|
-
],
|
|
29
|
+
], Fe = [
|
|
28
30
|
"ACCEPTED",
|
|
29
31
|
"WRONG_ANSWER",
|
|
30
32
|
"TIME_LIMIT_EXCEEDED",
|
|
31
33
|
"RUNTIME_ERROR",
|
|
32
34
|
"COMPILE_ERROR"
|
|
33
|
-
],
|
|
35
|
+
], Ie = [
|
|
34
36
|
"BEGINNER",
|
|
35
37
|
"INTERMEDIATE",
|
|
36
38
|
"ADVANCED",
|
|
37
39
|
"EXPERT"
|
|
38
|
-
],
|
|
40
|
+
], Le = [
|
|
39
41
|
"EASY",
|
|
40
42
|
"MEDIUM",
|
|
41
43
|
"HARD"
|
|
42
44
|
];
|
|
43
|
-
function
|
|
45
|
+
function Re(e) {
|
|
44
46
|
return e.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
45
47
|
}
|
|
46
|
-
function
|
|
48
|
+
function ze(e) {
|
|
47
49
|
return e.split(",").map((e) => e.trim()).filter(Boolean);
|
|
48
50
|
}
|
|
49
51
|
function Q(e) {
|
|
50
52
|
let t = Number.parseInt(e, 10);
|
|
51
53
|
return Number.isFinite(t) ? t : void 0;
|
|
52
54
|
}
|
|
53
|
-
function
|
|
55
|
+
function Be(e) {
|
|
54
56
|
if (!e) return null;
|
|
55
57
|
let t = new Date(e);
|
|
56
58
|
return Number.isNaN(t.getTime()) ? null : t.toISOString();
|
|
@@ -67,7 +69,7 @@ function $({ label: e, required: t, className: n, children: r }) {
|
|
|
67
69
|
}), r]
|
|
68
70
|
});
|
|
69
71
|
}
|
|
70
|
-
function
|
|
72
|
+
function Ve({ seed: e, icon: n }) {
|
|
71
73
|
return /* @__PURE__ */ q("span", {
|
|
72
74
|
className: t("flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br text-white shadow-sm", r(e)),
|
|
73
75
|
children: /* @__PURE__ */ q(n, {
|
|
@@ -76,8 +78,8 @@ function Re({ seed: e, icon: n }) {
|
|
|
76
78
|
})
|
|
77
79
|
});
|
|
78
80
|
}
|
|
79
|
-
function
|
|
80
|
-
return /* @__PURE__ */ J(
|
|
81
|
+
function He({ title: e, description: t, icon: n, children: r, footer: i }) {
|
|
82
|
+
return /* @__PURE__ */ J(Ce, {
|
|
81
83
|
className: "space-y-4 p-4 sm:p-5",
|
|
82
84
|
children: [
|
|
83
85
|
/* @__PURE__ */ J("div", {
|
|
@@ -107,7 +109,7 @@ function ze({ title: e, description: t, icon: n, children: r, footer: i }) {
|
|
|
107
109
|
]
|
|
108
110
|
});
|
|
109
111
|
}
|
|
110
|
-
function
|
|
112
|
+
function Ue({ summary: e, actionLabel: t, open: n, onToggle: r }) {
|
|
111
113
|
return /* @__PURE__ */ J("div", {
|
|
112
114
|
className: "flex items-center justify-between gap-3",
|
|
113
115
|
children: [/* @__PURE__ */ q("p", {
|
|
@@ -117,12 +119,12 @@ function Be({ summary: e, actionLabel: t, open: n, onToggle: r }) {
|
|
|
117
119
|
size: "sm",
|
|
118
120
|
variant: n ? "outline" : "default",
|
|
119
121
|
onClick: r,
|
|
120
|
-
children: [q(n ?
|
|
122
|
+
children: [q(n ? xe : he, { size: 15 }), n ? "Close" : t]
|
|
121
123
|
}) : null]
|
|
122
124
|
});
|
|
123
125
|
}
|
|
124
|
-
function
|
|
125
|
-
return /* @__PURE__ */ J(
|
|
126
|
+
function We({ leading: e, children: t, actions: n }) {
|
|
127
|
+
return /* @__PURE__ */ J(Ce, {
|
|
126
128
|
className: "flex flex-col gap-3 p-4 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md sm:flex-row sm:items-center sm:justify-between",
|
|
127
129
|
children: [/* @__PURE__ */ J("div", {
|
|
128
130
|
className: "flex min-w-0 items-center gap-3",
|
|
@@ -136,8 +138,8 @@ function Ve({ leading: e, children: t, actions: n }) {
|
|
|
136
138
|
}) : null]
|
|
137
139
|
});
|
|
138
140
|
}
|
|
139
|
-
function
|
|
140
|
-
let [r, { loading: i }] =
|
|
141
|
+
function Ge({ lesson: e, onSaved: t, onCancel: n }) {
|
|
142
|
+
let [r, { loading: i }] = R(), [a, o] = B(e.title), [s, c] = B(e.kind), [l, d] = B(e.content ?? ""), [f, p] = B(String(e.estimatedMinutes ?? "")), [m, h] = B(() => z(e)), { data: g } = O(e.id, s !== "QUIZ"), [_, y] = B(null), b = ce(() => z(null, g?.tecLessonQuizKey).quiz, [g]), x = {
|
|
141
143
|
...m,
|
|
142
144
|
quiz: _ ?? b
|
|
143
145
|
};
|
|
@@ -151,13 +153,13 @@ function He({ lesson: e, onSaved: t, onCancel: n }) {
|
|
|
151
153
|
value: a,
|
|
152
154
|
onChange: (e) => o(e.target.value),
|
|
153
155
|
placeholder: "Lesson title"
|
|
154
|
-
}), /* @__PURE__ */ J(
|
|
156
|
+
}), /* @__PURE__ */ J(we, {
|
|
155
157
|
value: s,
|
|
156
158
|
onValueChange: (e) => c(e),
|
|
157
|
-
children: [/* @__PURE__ */ q(
|
|
159
|
+
children: [/* @__PURE__ */ q(De, {
|
|
158
160
|
"aria-label": "Lesson type",
|
|
159
|
-
children: /* @__PURE__ */ q(
|
|
160
|
-
}), /* @__PURE__ */ q(
|
|
161
|
+
children: /* @__PURE__ */ q(Oe, {})
|
|
162
|
+
}), /* @__PURE__ */ q(Te, { children: Pe.map((e) => /* @__PURE__ */ q(Ee, {
|
|
161
163
|
value: e,
|
|
162
164
|
children: u(e)
|
|
163
165
|
}, e)) })]
|
|
@@ -168,7 +170,7 @@ function He({ lesson: e, onSaved: t, onCancel: n }) {
|
|
|
168
170
|
value: l,
|
|
169
171
|
onChange: (e) => d(e.target.value)
|
|
170
172
|
}),
|
|
171
|
-
/* @__PURE__ */ q(
|
|
173
|
+
/* @__PURE__ */ q(oe, {
|
|
172
174
|
kind: s,
|
|
173
175
|
draft: x,
|
|
174
176
|
onChange: (e) => {
|
|
@@ -196,7 +198,7 @@ function He({ lesson: e, onSaved: t, onCancel: n }) {
|
|
|
196
198
|
onClick: async () => {
|
|
197
199
|
let i = a.trim();
|
|
198
200
|
if (!i) return v.error("Lesson title is required");
|
|
199
|
-
let o =
|
|
201
|
+
let o = ae(s, x);
|
|
200
202
|
if (!o.ok) return v.error(o.error);
|
|
201
203
|
(await r({ variables: {
|
|
202
204
|
id: e.id,
|
|
@@ -217,8 +219,8 @@ function He({ lesson: e, onSaved: t, onCancel: n }) {
|
|
|
217
219
|
]
|
|
218
220
|
});
|
|
219
221
|
}
|
|
220
|
-
function
|
|
221
|
-
let { data: t, loading: n, refetch: r } = k(e), [i, { loading: a }] = T(), [o] =
|
|
222
|
+
function Ke({ courseId: e }) {
|
|
223
|
+
let { data: t, loading: n, refetch: r } = k(e), [i, { loading: a }] = T(), [o] = R(), [c, l] = B(null), [d, f] = B(null), [p, h] = B(""), [g, _] = B("ARTICLE"), [y, b] = B(""), [x, S] = B(""), [C, w] = B(!1), [ee, E] = B(() => z()), D = [...t?.tecListLessons?.items ?? []].sort((e, t) => e.position - t.position), O = async (e) => {
|
|
222
224
|
f(e.id);
|
|
223
225
|
try {
|
|
224
226
|
let t = await o({ variables: {
|
|
@@ -237,7 +239,7 @@ function Ue({ courseId: e }) {
|
|
|
237
239
|
className: "mb-3 flex items-center gap-2",
|
|
238
240
|
children: [/* @__PURE__ */ q("span", {
|
|
239
241
|
className: "flex h-7 w-7 items-center justify-center rounded-lg bg-accent-primary/15 text-accent-primary ring-1 ring-accent-primary/20",
|
|
240
|
-
children: /* @__PURE__ */ q(
|
|
242
|
+
children: /* @__PURE__ */ q(W, { size: 15 })
|
|
241
243
|
}), /* @__PURE__ */ J("span", {
|
|
242
244
|
className: "text-xs font-semibold uppercase tracking-wide text-text-secondary",
|
|
243
245
|
children: [
|
|
@@ -266,7 +268,7 @@ function Ue({ courseId: e }) {
|
|
|
266
268
|
className: "min-w-0 flex-1 truncate",
|
|
267
269
|
children: e.title
|
|
268
270
|
}),
|
|
269
|
-
/* @__PURE__ */ q(
|
|
271
|
+
/* @__PURE__ */ q(Se, {
|
|
270
272
|
variant: "secondary",
|
|
271
273
|
className: "text-[11px]",
|
|
272
274
|
children: u(e.kind)
|
|
@@ -289,13 +291,13 @@ function Ue({ courseId: e }) {
|
|
|
289
291
|
variant: "ghost",
|
|
290
292
|
onClick: () => l(c === e.id ? null : e.id),
|
|
291
293
|
children: [
|
|
292
|
-
/* @__PURE__ */ q(
|
|
294
|
+
/* @__PURE__ */ q(fe, { size: 13 }),
|
|
293
295
|
" ",
|
|
294
296
|
c === e.id ? "Close" : "Edit"
|
|
295
297
|
]
|
|
296
298
|
})
|
|
297
299
|
]
|
|
298
|
-
}), c === e.id ? /* @__PURE__ */ q(
|
|
300
|
+
}), c === e.id ? /* @__PURE__ */ q(Ge, {
|
|
299
301
|
lesson: e,
|
|
300
302
|
onSaved: async () => {
|
|
301
303
|
await r();
|
|
@@ -310,13 +312,13 @@ function Ue({ courseId: e }) {
|
|
|
310
312
|
placeholder: "Lesson title",
|
|
311
313
|
value: p,
|
|
312
314
|
onChange: (e) => h(e.target.value)
|
|
313
|
-
}), /* @__PURE__ */ J(
|
|
315
|
+
}), /* @__PURE__ */ J(we, {
|
|
314
316
|
value: g,
|
|
315
317
|
onValueChange: (e) => _(e),
|
|
316
|
-
children: [/* @__PURE__ */ q(
|
|
318
|
+
children: [/* @__PURE__ */ q(De, {
|
|
317
319
|
"aria-label": "Lesson type",
|
|
318
|
-
children: /* @__PURE__ */ q(
|
|
319
|
-
}), /* @__PURE__ */ q(
|
|
320
|
+
children: /* @__PURE__ */ q(Oe, {})
|
|
321
|
+
}), /* @__PURE__ */ q(Te, { children: Pe.map((e) => /* @__PURE__ */ q(Ee, {
|
|
320
322
|
value: e,
|
|
321
323
|
children: u(e)
|
|
322
324
|
}, e)) })]
|
|
@@ -328,7 +330,7 @@ function Ue({ courseId: e }) {
|
|
|
328
330
|
value: y,
|
|
329
331
|
onChange: (e) => b(e.target.value)
|
|
330
332
|
}),
|
|
331
|
-
/* @__PURE__ */ q(
|
|
333
|
+
/* @__PURE__ */ q(oe, {
|
|
332
334
|
kind: g,
|
|
333
335
|
draft: ee,
|
|
334
336
|
onChange: E
|
|
@@ -356,7 +358,7 @@ function Ue({ courseId: e }) {
|
|
|
356
358
|
onClick: async () => {
|
|
357
359
|
let t = p.trim();
|
|
358
360
|
if (!t) return v.error("Lesson title is required");
|
|
359
|
-
let n =
|
|
361
|
+
let n = ae(g, ee);
|
|
360
362
|
if (!n.ok) return v.error(n.error);
|
|
361
363
|
(await i({ variables: { input: {
|
|
362
364
|
courseId: e,
|
|
@@ -367,19 +369,19 @@ function Ue({ courseId: e }) {
|
|
|
367
369
|
estimatedMinutes: Q(x),
|
|
368
370
|
isPreview: C,
|
|
369
371
|
...n.input
|
|
370
|
-
} } })).data?.tecCreateLesson && (v.success("Lesson added", t), h(""), b(""), S(""), w(!1), E(
|
|
372
|
+
} } })).data?.tecCreateLesson && (v.success("Lesson added", t), h(""), b(""), S(""), w(!1), E(z()), await r());
|
|
371
373
|
},
|
|
372
374
|
disabled: a,
|
|
373
375
|
className: "ml-auto",
|
|
374
|
-
children: [/* @__PURE__ */ q(
|
|
376
|
+
children: [/* @__PURE__ */ q(he, { size: 14 }), " Add lesson"]
|
|
375
377
|
})
|
|
376
378
|
]
|
|
377
379
|
})
|
|
378
380
|
]
|
|
379
381
|
});
|
|
380
382
|
}
|
|
381
|
-
function
|
|
382
|
-
let [i, a] =
|
|
383
|
+
function qe({ submission: e, busy: t, onGrade: n, onRegrade: r }) {
|
|
384
|
+
let [i, a] = B(!1), s = e.verdict !== "PENDING";
|
|
383
385
|
return /* @__PURE__ */ J("div", {
|
|
384
386
|
className: "space-y-3 rounded-lg bg-bg-surface px-3 py-3 text-sm",
|
|
385
387
|
children: [
|
|
@@ -390,7 +392,7 @@ function We({ submission: e, busy: t, onGrade: n, onRegrade: r }) {
|
|
|
390
392
|
/* @__PURE__ */ J("span", {
|
|
391
393
|
className: "inline-flex items-center gap-1 text-xs text-text-muted",
|
|
392
394
|
children: [
|
|
393
|
-
/* @__PURE__ */ q(
|
|
395
|
+
/* @__PURE__ */ q(U, { size: 12 }),
|
|
394
396
|
" ",
|
|
395
397
|
u(e.language)
|
|
396
398
|
]
|
|
@@ -429,7 +431,7 @@ function We({ submission: e, busy: t, onGrade: n, onRegrade: r }) {
|
|
|
429
431
|
variant: "outline",
|
|
430
432
|
onClick: () => a((e) => !e),
|
|
431
433
|
children: [
|
|
432
|
-
/* @__PURE__ */ q(
|
|
434
|
+
/* @__PURE__ */ q(U, { size: 13 }),
|
|
433
435
|
" ",
|
|
434
436
|
i ? "Hide code" : "View code"
|
|
435
437
|
]
|
|
@@ -439,11 +441,11 @@ function We({ submission: e, busy: t, onGrade: n, onRegrade: r }) {
|
|
|
439
441
|
variant: "outline",
|
|
440
442
|
onClick: r,
|
|
441
443
|
disabled: t,
|
|
442
|
-
children: [/* @__PURE__ */ q(
|
|
444
|
+
children: [/* @__PURE__ */ q(ge, { size: 13 }), " Re-run grader"]
|
|
443
445
|
}) : null,
|
|
444
446
|
/* @__PURE__ */ q("div", {
|
|
445
447
|
className: "ml-auto flex flex-wrap gap-1",
|
|
446
|
-
children:
|
|
448
|
+
children: Fe.map((r) => /* @__PURE__ */ q(Y, {
|
|
447
449
|
size: "sm",
|
|
448
450
|
variant: r === "ACCEPTED" ? "default" : "outline",
|
|
449
451
|
onClick: () => n(r),
|
|
@@ -465,8 +467,8 @@ function We({ submission: e, busy: t, onGrade: n, onRegrade: r }) {
|
|
|
465
467
|
]
|
|
466
468
|
});
|
|
467
469
|
}
|
|
468
|
-
function
|
|
469
|
-
let { data: t, loading: n, refetch: r } =
|
|
470
|
+
function Je({ problemId: e }) {
|
|
471
|
+
let { data: t, loading: n, refetch: r } = I({ problemId: e }), [i] = E(), [a] = N(), [o, s] = B(null), [c, l] = B(!1), d = t?.tecListSubmissions?.items ?? [], f = c ? d.filter((e) => e.verdict === "PENDING") : d, p = d.filter((e) => e.verdict === "PENDING").length, h = async (e, t) => {
|
|
470
472
|
s(e);
|
|
471
473
|
try {
|
|
472
474
|
(await i({ variables: {
|
|
@@ -492,7 +494,7 @@ function Ge({ problemId: e }) {
|
|
|
492
494
|
children: [
|
|
493
495
|
/* @__PURE__ */ q("span", {
|
|
494
496
|
className: "flex h-7 w-7 items-center justify-center rounded-lg bg-accent-purple/15 text-accent-purple ring-1 ring-accent-purple/20",
|
|
495
|
-
children: /* @__PURE__ */ q(
|
|
497
|
+
children: /* @__PURE__ */ q(de, { size: 15 })
|
|
496
498
|
}),
|
|
497
499
|
/* @__PURE__ */ J("span", {
|
|
498
500
|
className: "text-xs font-semibold uppercase tracking-wide text-text-secondary",
|
|
@@ -519,7 +521,7 @@ function Ge({ problemId: e }) {
|
|
|
519
521
|
children: c ? "Nothing is waiting on a verdict." : "No submissions yet."
|
|
520
522
|
}) : /* @__PURE__ */ q("div", {
|
|
521
523
|
className: "space-y-2",
|
|
522
|
-
children: f.map((e) => /* @__PURE__ */ q(
|
|
524
|
+
children: f.map((e) => /* @__PURE__ */ q(qe, {
|
|
523
525
|
submission: e,
|
|
524
526
|
busy: o === e.id,
|
|
525
527
|
onGrade: (t) => void h(e.id, t),
|
|
@@ -528,8 +530,8 @@ function Ge({ problemId: e }) {
|
|
|
528
530
|
})]
|
|
529
531
|
});
|
|
530
532
|
}
|
|
531
|
-
function
|
|
532
|
-
let { data: t, loading: n, refetch: r } =
|
|
533
|
+
function Ye({ hackathon: e }) {
|
|
534
|
+
let { data: t, loading: n, refetch: r } = L(e.id), [i] = P(), [a, o] = B(null), [s, c] = B({}), l = t?.tecListTeams?.items ?? [], u = async (e, t) => {
|
|
533
535
|
let n = Math.max(0, Number(s[e] ?? "0") || 0);
|
|
534
536
|
o(e);
|
|
535
537
|
try {
|
|
@@ -610,7 +612,7 @@ function Ke({ hackathon: e }) {
|
|
|
610
612
|
variant: "outline",
|
|
611
613
|
onClick: () => u(t.id, !0),
|
|
612
614
|
disabled: a === t.id,
|
|
613
|
-
children: [/* @__PURE__ */ q(
|
|
615
|
+
children: [/* @__PURE__ */ q(ye, { size: 14 }), " Winner"]
|
|
614
616
|
})
|
|
615
617
|
]
|
|
616
618
|
}) : /* @__PURE__ */ J("span", {
|
|
@@ -636,13 +638,13 @@ function Ke({ hackathon: e }) {
|
|
|
636
638
|
target: "_blank",
|
|
637
639
|
rel: "noreferrer noopener",
|
|
638
640
|
className: "inline-flex items-center gap-1 text-xs font-medium text-accent-primary hover:underline",
|
|
639
|
-
children: [/* @__PURE__ */ q(
|
|
641
|
+
children: [/* @__PURE__ */ q(ue, { size: 12 }), " Project"]
|
|
640
642
|
}) : null, t.repoUrl ? /* @__PURE__ */ J("a", {
|
|
641
643
|
href: t.repoUrl,
|
|
642
644
|
target: "_blank",
|
|
643
645
|
rel: "noreferrer noopener",
|
|
644
646
|
className: "inline-flex items-center gap-1 text-xs font-medium text-accent-primary hover:underline",
|
|
645
|
-
children: [/* @__PURE__ */ q(
|
|
647
|
+
children: [/* @__PURE__ */ q(U, { size: 12 }), " Repository"]
|
|
646
648
|
}) : null]
|
|
647
649
|
})
|
|
648
650
|
]
|
|
@@ -654,32 +656,32 @@ function Ke({ hackathon: e }) {
|
|
|
654
656
|
})]
|
|
655
657
|
});
|
|
656
658
|
}
|
|
657
|
-
function
|
|
658
|
-
let { data: e, loading: t, error: n, refetch: r } = S({}), [o, { loading: c }] = C(), [l] =
|
|
659
|
-
D(""), k(""), te(""),
|
|
660
|
-
},
|
|
659
|
+
function Xe() {
|
|
660
|
+
let { data: e, loading: t, error: n, refetch: r } = S({}), [o, { loading: c }] = C(), [l] = j(), [g] = b(), [_, y] = B(!1), [x, w] = B(null), [T, ee] = B(null), [E, D] = B(""), [O, k] = B(""), [A, te] = B(""), [ne, M] = B(""), [N, P] = B("BEGINNER"), [re, F] = B(""), [I, L] = B([]), R = e?.tecListCourses?.items ?? [], ie = () => {
|
|
661
|
+
D(""), k(""), te(""), M(""), P("BEGINNER"), F(""), L([]), y(!1);
|
|
662
|
+
}, z = async () => {
|
|
661
663
|
let e = E.trim();
|
|
662
664
|
if (!e) return v.error("Title is required");
|
|
663
|
-
let t =
|
|
665
|
+
let t = Re(O || e);
|
|
664
666
|
if (!t) return v.error("A valid slug is required");
|
|
665
667
|
(await o({ variables: { input: {
|
|
666
668
|
title: e,
|
|
667
669
|
slug: t,
|
|
668
670
|
summary: A.trim() || void 0,
|
|
669
|
-
topic:
|
|
670
|
-
level:
|
|
671
|
-
estimatedMinutes: Q(
|
|
672
|
-
tags:
|
|
673
|
-
} } })).data?.tecCreateCourse && (v.success("Course created", `"${e}" saved as a draft.`),
|
|
674
|
-
},
|
|
671
|
+
topic: ne.trim() || void 0,
|
|
672
|
+
level: N,
|
|
673
|
+
estimatedMinutes: Q(re),
|
|
674
|
+
tags: I
|
|
675
|
+
} } })).data?.tecCreateCourse && (v.success("Course created", `"${e}" saved as a draft.`), ie(), await r());
|
|
676
|
+
}, ae = async (e) => {
|
|
675
677
|
w(e);
|
|
676
678
|
try {
|
|
677
679
|
(await l({ variables: { id: e } })).data?.tecPublishCourse && (v.success("Course published"), await r());
|
|
678
680
|
} finally {
|
|
679
681
|
w(null);
|
|
680
682
|
}
|
|
681
|
-
},
|
|
682
|
-
if (await
|
|
683
|
+
}, oe = async (e, t) => {
|
|
684
|
+
if (await Ne({
|
|
683
685
|
title: "Archive course",
|
|
684
686
|
message: `Archive "${t}"? Learners will no longer be able to enroll.`,
|
|
685
687
|
okButtonTitle: "Archive",
|
|
@@ -696,24 +698,24 @@ function qe() {
|
|
|
696
698
|
return /* @__PURE__ */ J("div", {
|
|
697
699
|
className: "space-y-4",
|
|
698
700
|
children: [
|
|
699
|
-
/* @__PURE__ */ q(
|
|
700
|
-
summary: `${
|
|
701
|
+
/* @__PURE__ */ q(Ue, {
|
|
702
|
+
summary: `${R.length} course${R.length === 1 ? "" : "s"}`,
|
|
701
703
|
actionLabel: "New course",
|
|
702
704
|
open: _,
|
|
703
705
|
onToggle: () => y((e) => !e)
|
|
704
706
|
}),
|
|
705
|
-
_ ? /* @__PURE__ */ J(
|
|
707
|
+
_ ? /* @__PURE__ */ J(He, {
|
|
706
708
|
title: "New course",
|
|
707
709
|
description: "Draft a course, then add lessons and publish when it's ready.",
|
|
708
|
-
icon:
|
|
710
|
+
icon: H,
|
|
709
711
|
footer: /* @__PURE__ */ J(K, { children: [/* @__PURE__ */ q(Y, {
|
|
710
712
|
variant: "outline",
|
|
711
713
|
size: "sm",
|
|
712
|
-
onClick:
|
|
714
|
+
onClick: ie,
|
|
713
715
|
children: "Cancel"
|
|
714
716
|
}), /* @__PURE__ */ q(Y, {
|
|
715
717
|
size: "sm",
|
|
716
|
-
onClick:
|
|
718
|
+
onClick: z,
|
|
717
719
|
disabled: c,
|
|
718
720
|
children: c ? "Creating…" : "Create course"
|
|
719
721
|
})] }),
|
|
@@ -739,17 +741,17 @@ function qe() {
|
|
|
739
741
|
/* @__PURE__ */ q($, {
|
|
740
742
|
label: "Topic",
|
|
741
743
|
children: /* @__PURE__ */ q(X, {
|
|
742
|
-
value:
|
|
743
|
-
onChange: (e) =>
|
|
744
|
+
value: ne,
|
|
745
|
+
onChange: (e) => M(e.target.value),
|
|
744
746
|
placeholder: "e.g. Web, AI, Data, Cloud"
|
|
745
747
|
})
|
|
746
748
|
}),
|
|
747
749
|
/* @__PURE__ */ q($, {
|
|
748
750
|
label: "Level",
|
|
749
|
-
children: /* @__PURE__ */ J(
|
|
750
|
-
value:
|
|
751
|
-
onValueChange: (e) =>
|
|
752
|
-
children: [/* @__PURE__ */ q(
|
|
751
|
+
children: /* @__PURE__ */ J(we, {
|
|
752
|
+
value: N,
|
|
753
|
+
onValueChange: (e) => P(e),
|
|
754
|
+
children: [/* @__PURE__ */ q(De, { children: /* @__PURE__ */ q(Oe, {}) }), /* @__PURE__ */ q(Te, { children: Ie.map((e) => /* @__PURE__ */ q(Ee, {
|
|
753
755
|
value: e,
|
|
754
756
|
children: u(e)
|
|
755
757
|
}, e)) })]
|
|
@@ -760,16 +762,16 @@ function qe() {
|
|
|
760
762
|
children: /* @__PURE__ */ q(X, {
|
|
761
763
|
type: "number",
|
|
762
764
|
min: 0,
|
|
763
|
-
value:
|
|
764
|
-
onChange: (e) =>
|
|
765
|
+
value: re,
|
|
766
|
+
onChange: (e) => F(e.target.value),
|
|
765
767
|
placeholder: "120"
|
|
766
768
|
})
|
|
767
769
|
}),
|
|
768
770
|
/* @__PURE__ */ q($, {
|
|
769
771
|
label: "Tags",
|
|
770
772
|
children: /* @__PURE__ */ q(h, {
|
|
771
|
-
value:
|
|
772
|
-
onChange:
|
|
773
|
+
value: I,
|
|
774
|
+
onChange: L,
|
|
773
775
|
placeholder: "typescript, basics"
|
|
774
776
|
})
|
|
775
777
|
}),
|
|
@@ -784,17 +786,17 @@ function qe() {
|
|
|
784
786
|
})
|
|
785
787
|
]
|
|
786
788
|
}) : null,
|
|
787
|
-
t && !
|
|
789
|
+
t && !R.length ? /* @__PURE__ */ q(m, { count: 4 }) : n ? /* @__PURE__ */ q(p, {
|
|
788
790
|
title: "Couldn't load courses",
|
|
789
791
|
error: n
|
|
790
|
-
}) :
|
|
791
|
-
icon: /* @__PURE__ */ q(
|
|
792
|
+
}) : R.length === 0 ? /* @__PURE__ */ q(f, {
|
|
793
|
+
icon: /* @__PURE__ */ q(H, { size: 26 }),
|
|
792
794
|
title: "No courses yet",
|
|
793
795
|
description: "Create your first course with the button above. TechnoSpam is pre-launch."
|
|
794
796
|
}) : /* @__PURE__ */ q("div", {
|
|
795
797
|
className: "space-y-3",
|
|
796
|
-
children:
|
|
797
|
-
leading: /* @__PURE__ */ q(
|
|
798
|
+
children: R.map((e) => /* @__PURE__ */ J("div", { children: [/* @__PURE__ */ J(We, {
|
|
799
|
+
leading: /* @__PURE__ */ q(Ve, {
|
|
798
800
|
seed: `${e.topic ?? ""} ${e.title}`,
|
|
799
801
|
icon: i(e.topic ?? e.title)
|
|
800
802
|
}),
|
|
@@ -803,20 +805,20 @@ function qe() {
|
|
|
803
805
|
size: "sm",
|
|
804
806
|
variant: "outline",
|
|
805
807
|
onClick: () => ee(T === e.id ? null : e.id),
|
|
806
|
-
children: [/* @__PURE__ */ q(
|
|
808
|
+
children: [/* @__PURE__ */ q(W, { size: 15 }), " Lessons"]
|
|
807
809
|
}),
|
|
808
810
|
e.status === "DRAFT" ? /* @__PURE__ */ J(Y, {
|
|
809
811
|
size: "sm",
|
|
810
|
-
onClick: () =>
|
|
812
|
+
onClick: () => ae(e.id),
|
|
811
813
|
disabled: x === e.id,
|
|
812
|
-
children: [/* @__PURE__ */ q(
|
|
814
|
+
children: [/* @__PURE__ */ q(_e, { size: 15 }), " Publish"]
|
|
813
815
|
}) : null,
|
|
814
816
|
e.status === "ARCHIVED" ? null : /* @__PURE__ */ J(Y, {
|
|
815
817
|
size: "sm",
|
|
816
818
|
variant: "outline",
|
|
817
|
-
onClick: () =>
|
|
819
|
+
onClick: () => oe(e.id, e.title),
|
|
818
820
|
disabled: x === e.id,
|
|
819
|
-
children: [/* @__PURE__ */ q(
|
|
821
|
+
children: [/* @__PURE__ */ q(V, { size: 15 }), " Archive"]
|
|
820
822
|
})
|
|
821
823
|
] }),
|
|
822
824
|
children: [/* @__PURE__ */ J("div", {
|
|
@@ -844,18 +846,18 @@ function qe() {
|
|
|
844
846
|
a(e.updatedAt)
|
|
845
847
|
]
|
|
846
848
|
})]
|
|
847
|
-
}), T === e.id ? /* @__PURE__ */ q(
|
|
849
|
+
}), T === e.id ? /* @__PURE__ */ q(Ke, { courseId: e.id }) : null] }, e.id))
|
|
848
850
|
})
|
|
849
851
|
]
|
|
850
852
|
});
|
|
851
853
|
}
|
|
852
|
-
function
|
|
853
|
-
let { data: e, loading: t, error: n, refetch: r } =
|
|
854
|
-
x(""), C(""), T(""), D(""), k("EASY"), te(""),
|
|
855
|
-
},
|
|
854
|
+
function Ze() {
|
|
855
|
+
let { data: e, loading: t, error: n, refetch: r } = ne({}), [a, { loading: o }] = ee(), [s] = M(), [c, l] = B(!1), [h, g] = B(null), [_, y] = B(null), [b, x] = B(""), [S, C] = B(""), [w, T] = B(""), [E, D] = B(""), [O, k] = B("EASY"), [A, te] = B(""), [j, N] = B(""), [P, re] = B(""), F = e?.tecListProblems?.items ?? [], I = () => {
|
|
856
|
+
x(""), C(""), T(""), D(""), k("EASY"), te(""), N(""), re(""), l(!1);
|
|
857
|
+
}, L = async () => {
|
|
856
858
|
let e = b.trim();
|
|
857
859
|
if (!e) return v.error("Title is required");
|
|
858
|
-
let t =
|
|
860
|
+
let t = Re(S || e);
|
|
859
861
|
if (!t) return v.error("A valid slug is required");
|
|
860
862
|
(await a({ variables: { input: {
|
|
861
863
|
title: e,
|
|
@@ -864,10 +866,10 @@ function Je() {
|
|
|
864
866
|
topic: E.trim() || void 0,
|
|
865
867
|
difficulty: O,
|
|
866
868
|
points: Q(A),
|
|
867
|
-
languages:
|
|
868
|
-
starterCode:
|
|
869
|
-
} } })).data?.tecCreateProblem && (v.success("Problem created", `"${e}" saved as a draft.`),
|
|
870
|
-
},
|
|
869
|
+
languages: ze(j),
|
|
870
|
+
starterCode: P.trim() || void 0
|
|
871
|
+
} } })).data?.tecCreateProblem && (v.success("Problem created", `"${e}" saved as a draft.`), I(), await r());
|
|
872
|
+
}, R = async (e) => {
|
|
871
873
|
g(e);
|
|
872
874
|
try {
|
|
873
875
|
(await s({ variables: { id: e } })).data?.tecPublishProblem && (v.success("Problem published"), await r());
|
|
@@ -878,24 +880,24 @@ function Je() {
|
|
|
878
880
|
return /* @__PURE__ */ J("div", {
|
|
879
881
|
className: "space-y-4",
|
|
880
882
|
children: [
|
|
881
|
-
/* @__PURE__ */ q(
|
|
882
|
-
summary: `${
|
|
883
|
+
/* @__PURE__ */ q(Ue, {
|
|
884
|
+
summary: `${F.length} problem${F.length === 1 ? "" : "s"}`,
|
|
883
885
|
actionLabel: "New problem",
|
|
884
886
|
open: c,
|
|
885
887
|
onToggle: () => l((e) => !e)
|
|
886
888
|
}),
|
|
887
|
-
c ? /* @__PURE__ */ J(
|
|
889
|
+
c ? /* @__PURE__ */ J(He, {
|
|
888
890
|
title: "New problem",
|
|
889
891
|
description: "Define a coding challenge learners can solve and submit.",
|
|
890
|
-
icon:
|
|
892
|
+
icon: U,
|
|
891
893
|
footer: /* @__PURE__ */ J(K, { children: [/* @__PURE__ */ q(Y, {
|
|
892
894
|
variant: "outline",
|
|
893
895
|
size: "sm",
|
|
894
|
-
onClick:
|
|
896
|
+
onClick: I,
|
|
895
897
|
children: "Cancel"
|
|
896
898
|
}), /* @__PURE__ */ q(Y, {
|
|
897
899
|
size: "sm",
|
|
898
|
-
onClick:
|
|
900
|
+
onClick: L,
|
|
899
901
|
disabled: o,
|
|
900
902
|
children: o ? "Creating…" : "Create problem"
|
|
901
903
|
})] }),
|
|
@@ -928,10 +930,10 @@ function Je() {
|
|
|
928
930
|
}),
|
|
929
931
|
/* @__PURE__ */ q($, {
|
|
930
932
|
label: "Difficulty",
|
|
931
|
-
children: /* @__PURE__ */ J(
|
|
933
|
+
children: /* @__PURE__ */ J(we, {
|
|
932
934
|
value: O,
|
|
933
935
|
onValueChange: (e) => k(e),
|
|
934
|
-
children: [/* @__PURE__ */ q(
|
|
936
|
+
children: [/* @__PURE__ */ q(De, { children: /* @__PURE__ */ q(Oe, {}) }), /* @__PURE__ */ q(Te, { children: Le.map((e) => /* @__PURE__ */ q(Ee, {
|
|
935
937
|
value: e,
|
|
936
938
|
children: u(e)
|
|
937
939
|
}, e)) })]
|
|
@@ -950,8 +952,8 @@ function Je() {
|
|
|
950
952
|
/* @__PURE__ */ q($, {
|
|
951
953
|
label: "Languages (comma-separated)",
|
|
952
954
|
children: /* @__PURE__ */ q(X, {
|
|
953
|
-
value:
|
|
954
|
-
onChange: (e) =>
|
|
955
|
+
value: j,
|
|
956
|
+
onChange: (e) => N(e.target.value),
|
|
955
957
|
placeholder: "python, typescript"
|
|
956
958
|
})
|
|
957
959
|
}),
|
|
@@ -968,25 +970,25 @@ function Je() {
|
|
|
968
970
|
label: "Starter code",
|
|
969
971
|
className: "sm:col-span-2",
|
|
970
972
|
children: /* @__PURE__ */ q(Z, {
|
|
971
|
-
value:
|
|
972
|
-
onChange: (e) =>
|
|
973
|
+
value: P,
|
|
974
|
+
onChange: (e) => re(e.target.value),
|
|
973
975
|
className: "font-mono",
|
|
974
976
|
placeholder: "def solve(nums, target):\\n pass"
|
|
975
977
|
})
|
|
976
978
|
})
|
|
977
979
|
]
|
|
978
980
|
}) : null,
|
|
979
|
-
t && !
|
|
981
|
+
t && !F.length ? /* @__PURE__ */ q(m, { count: 4 }) : n ? /* @__PURE__ */ q(p, {
|
|
980
982
|
title: "Couldn't load problems",
|
|
981
983
|
error: n
|
|
982
|
-
}) :
|
|
983
|
-
icon: /* @__PURE__ */ q(
|
|
984
|
+
}) : F.length === 0 ? /* @__PURE__ */ q(f, {
|
|
985
|
+
icon: /* @__PURE__ */ q(U, { size: 26 }),
|
|
984
986
|
title: "No problems yet",
|
|
985
987
|
description: "Create your first coding problem with the button above. TechnoSpam is pre-launch."
|
|
986
988
|
}) : /* @__PURE__ */ q("div", {
|
|
987
989
|
className: "space-y-3",
|
|
988
|
-
children:
|
|
989
|
-
leading: /* @__PURE__ */ q(
|
|
990
|
+
children: F.map((e) => /* @__PURE__ */ J("div", { children: [/* @__PURE__ */ J(We, {
|
|
991
|
+
leading: /* @__PURE__ */ q(Ve, {
|
|
990
992
|
seed: `${e.topic ?? ""} ${e.title}`,
|
|
991
993
|
icon: i(e.topic ?? e.title)
|
|
992
994
|
}),
|
|
@@ -994,12 +996,12 @@ function Je() {
|
|
|
994
996
|
size: "sm",
|
|
995
997
|
variant: "outline",
|
|
996
998
|
onClick: () => y(_ === e.id ? null : e.id),
|
|
997
|
-
children: [/* @__PURE__ */ q(
|
|
999
|
+
children: [/* @__PURE__ */ q(de, { size: 15 }), " Grade"]
|
|
998
1000
|
}), e.status === "DRAFT" ? /* @__PURE__ */ J(Y, {
|
|
999
1001
|
size: "sm",
|
|
1000
|
-
onClick: () =>
|
|
1002
|
+
onClick: () => R(e.id),
|
|
1001
1003
|
disabled: h === e.id,
|
|
1002
|
-
children: [/* @__PURE__ */ q(
|
|
1004
|
+
children: [/* @__PURE__ */ q(_e, { size: 15 }), " Publish"]
|
|
1003
1005
|
}) : null] }),
|
|
1004
1006
|
children: [/* @__PURE__ */ J("div", {
|
|
1005
1007
|
className: "flex flex-wrap items-center gap-2",
|
|
@@ -1027,33 +1029,33 @@ function Je() {
|
|
|
1027
1029
|
e.languages.length ? e.languages.join(", ") : "No languages"
|
|
1028
1030
|
]
|
|
1029
1031
|
})]
|
|
1030
|
-
}), _ === e.id ? /* @__PURE__ */ q(
|
|
1032
|
+
}), _ === e.id ? /* @__PURE__ */ q(Je, { problemId: e.id }) : null] }, e.id))
|
|
1031
1033
|
})
|
|
1032
1034
|
]
|
|
1033
1035
|
});
|
|
1034
1036
|
}
|
|
1035
|
-
function
|
|
1036
|
-
let { data: e, loading: t, error: n, refetch: r } = D({}), [a, { loading: s }] = w(), [l] = te(), [u] =
|
|
1037
|
-
O(""), A(""),
|
|
1038
|
-
},
|
|
1037
|
+
function Qe() {
|
|
1038
|
+
let { data: e, loading: t, error: n, refetch: r } = D({}), [a, { loading: s }] = w(), [l] = te(), [u] = re(), [g] = F(), [_] = x(), [y, b] = B(!1), [S, C] = B(null), [T, ee] = B(null), [E, O] = B(""), [k, A] = B(""), [ne, j] = B(""), [M, N] = B(""), [P, I] = B(""), [L, R] = B(""), [ie, z] = B(""), [ae, oe] = B(""), [se, ce] = B([]), V = e?.tecListHackathons?.items ?? [], H = () => {
|
|
1039
|
+
O(""), A(""), j(""), N(""), I(""), R(""), z(""), oe(""), ce([]), b(!1);
|
|
1040
|
+
}, U = async () => {
|
|
1039
1041
|
let e = E.trim();
|
|
1040
1042
|
if (!e) return v.error("Title is required");
|
|
1041
|
-
let t =
|
|
1043
|
+
let t = Re(k || e);
|
|
1042
1044
|
if (!t) return v.error("A valid slug is required");
|
|
1043
|
-
let n =
|
|
1045
|
+
let n = Be(P), i = Be(L);
|
|
1044
1046
|
if (!n || !i) return v.error("Start and end date/time are required");
|
|
1045
1047
|
if (new Date(i) <= new Date(n)) return v.error("End must be after the start");
|
|
1046
1048
|
(await a({ variables: { input: {
|
|
1047
1049
|
title: e,
|
|
1048
1050
|
slug: t,
|
|
1049
|
-
theme:
|
|
1050
|
-
description:
|
|
1051
|
+
theme: ne.trim() || void 0,
|
|
1052
|
+
description: M.trim() || void 0,
|
|
1051
1053
|
startAt: n,
|
|
1052
1054
|
endAt: i,
|
|
1053
|
-
prizePool: Q(
|
|
1054
|
-
maxTeamSize: Q(
|
|
1055
|
-
tags:
|
|
1056
|
-
} } })).data?.tecCreateHackathon && (v.success("Hackathon created", `"${e}" saved as a draft.`),
|
|
1055
|
+
prizePool: Q(ie),
|
|
1056
|
+
maxTeamSize: Q(ae),
|
|
1057
|
+
tags: se
|
|
1058
|
+
} } })).data?.tecCreateHackathon && (v.success("Hackathon created", `"${e}" saved as a draft.`), H(), await r());
|
|
1057
1059
|
}, ue = async (e) => {
|
|
1058
1060
|
C(e);
|
|
1059
1061
|
try {
|
|
@@ -1061,7 +1063,7 @@ function Ye() {
|
|
|
1061
1063
|
} finally {
|
|
1062
1064
|
C(null);
|
|
1063
1065
|
}
|
|
1064
|
-
},
|
|
1066
|
+
}, W = async (e, t, n) => {
|
|
1065
1067
|
C(e);
|
|
1066
1068
|
try {
|
|
1067
1069
|
(await t({ variables: { id: e } })).data && (v.success(n), await r());
|
|
@@ -1072,24 +1074,24 @@ function Ye() {
|
|
|
1072
1074
|
return /* @__PURE__ */ J("div", {
|
|
1073
1075
|
className: "space-y-4",
|
|
1074
1076
|
children: [
|
|
1075
|
-
/* @__PURE__ */ q(
|
|
1076
|
-
summary: `${
|
|
1077
|
+
/* @__PURE__ */ q(Ue, {
|
|
1078
|
+
summary: `${V.length} hackathon${V.length === 1 ? "" : "s"}`,
|
|
1077
1079
|
actionLabel: "New hackathon",
|
|
1078
1080
|
open: y,
|
|
1079
1081
|
onToggle: () => b((e) => !e)
|
|
1080
1082
|
}),
|
|
1081
|
-
y ? /* @__PURE__ */ J(
|
|
1083
|
+
y ? /* @__PURE__ */ J(He, {
|
|
1082
1084
|
title: "New hackathon",
|
|
1083
1085
|
description: "Set up an event, open registration, then run judging to completion.",
|
|
1084
|
-
icon:
|
|
1086
|
+
icon: ye,
|
|
1085
1087
|
footer: /* @__PURE__ */ J(K, { children: [/* @__PURE__ */ q(Y, {
|
|
1086
1088
|
variant: "outline",
|
|
1087
1089
|
size: "sm",
|
|
1088
|
-
onClick:
|
|
1090
|
+
onClick: H,
|
|
1089
1091
|
children: "Cancel"
|
|
1090
1092
|
}), /* @__PURE__ */ q(Y, {
|
|
1091
1093
|
size: "sm",
|
|
1092
|
-
onClick:
|
|
1094
|
+
onClick: U,
|
|
1093
1095
|
disabled: s,
|
|
1094
1096
|
children: s ? "Creating…" : "Create hackathon"
|
|
1095
1097
|
})] }),
|
|
@@ -1115,16 +1117,16 @@ function Ye() {
|
|
|
1115
1117
|
/* @__PURE__ */ q($, {
|
|
1116
1118
|
label: "Theme",
|
|
1117
1119
|
children: /* @__PURE__ */ q(X, {
|
|
1118
|
-
value:
|
|
1119
|
-
onChange: (e) =>
|
|
1120
|
+
value: ne,
|
|
1121
|
+
onChange: (e) => j(e.target.value),
|
|
1120
1122
|
placeholder: "AI for good"
|
|
1121
1123
|
})
|
|
1122
1124
|
}),
|
|
1123
1125
|
/* @__PURE__ */ q($, {
|
|
1124
1126
|
label: "Tags",
|
|
1125
1127
|
children: /* @__PURE__ */ q(h, {
|
|
1126
|
-
value:
|
|
1127
|
-
onChange:
|
|
1128
|
+
value: se,
|
|
1129
|
+
onChange: ce,
|
|
1128
1130
|
placeholder: "ai, web"
|
|
1129
1131
|
})
|
|
1130
1132
|
}),
|
|
@@ -1133,8 +1135,8 @@ function Ye() {
|
|
|
1133
1135
|
required: !0,
|
|
1134
1136
|
children: /* @__PURE__ */ q(X, {
|
|
1135
1137
|
type: "datetime-local",
|
|
1136
|
-
value:
|
|
1137
|
-
onChange: (e) =>
|
|
1138
|
+
value: P,
|
|
1139
|
+
onChange: (e) => I(e.target.value)
|
|
1138
1140
|
})
|
|
1139
1141
|
}),
|
|
1140
1142
|
/* @__PURE__ */ q($, {
|
|
@@ -1142,8 +1144,8 @@ function Ye() {
|
|
|
1142
1144
|
required: !0,
|
|
1143
1145
|
children: /* @__PURE__ */ q(X, {
|
|
1144
1146
|
type: "datetime-local",
|
|
1145
|
-
value:
|
|
1146
|
-
onChange: (e) =>
|
|
1147
|
+
value: L,
|
|
1148
|
+
onChange: (e) => R(e.target.value)
|
|
1147
1149
|
})
|
|
1148
1150
|
}),
|
|
1149
1151
|
/* @__PURE__ */ q($, {
|
|
@@ -1151,8 +1153,8 @@ function Ye() {
|
|
|
1151
1153
|
children: /* @__PURE__ */ q(X, {
|
|
1152
1154
|
type: "number",
|
|
1153
1155
|
min: 0,
|
|
1154
|
-
value:
|
|
1155
|
-
onChange: (e) =>
|
|
1156
|
+
value: ie,
|
|
1157
|
+
onChange: (e) => z(e.target.value),
|
|
1156
1158
|
placeholder: "5000"
|
|
1157
1159
|
})
|
|
1158
1160
|
}),
|
|
@@ -1161,8 +1163,8 @@ function Ye() {
|
|
|
1161
1163
|
children: /* @__PURE__ */ q(X, {
|
|
1162
1164
|
type: "number",
|
|
1163
1165
|
min: 1,
|
|
1164
|
-
value:
|
|
1165
|
-
onChange: (e) =>
|
|
1166
|
+
value: ae,
|
|
1167
|
+
onChange: (e) => oe(e.target.value),
|
|
1166
1168
|
placeholder: "4"
|
|
1167
1169
|
})
|
|
1168
1170
|
}),
|
|
@@ -1170,26 +1172,26 @@ function Ye() {
|
|
|
1170
1172
|
label: "Description",
|
|
1171
1173
|
className: "sm:col-span-2",
|
|
1172
1174
|
children: /* @__PURE__ */ q(Z, {
|
|
1173
|
-
value:
|
|
1174
|
-
onChange: (e) =>
|
|
1175
|
+
value: M,
|
|
1176
|
+
onChange: (e) => N(e.target.value),
|
|
1175
1177
|
placeholder: "What the hackathon is about and how judging works."
|
|
1176
1178
|
})
|
|
1177
1179
|
})
|
|
1178
1180
|
]
|
|
1179
1181
|
}) : null,
|
|
1180
|
-
t && !
|
|
1182
|
+
t && !V.length ? /* @__PURE__ */ q(m, { count: 4 }) : n ? /* @__PURE__ */ q(p, {
|
|
1181
1183
|
title: "Couldn't load hackathons",
|
|
1182
1184
|
error: n
|
|
1183
|
-
}) :
|
|
1184
|
-
icon: /* @__PURE__ */ q(
|
|
1185
|
+
}) : V.length === 0 ? /* @__PURE__ */ q(f, {
|
|
1186
|
+
icon: /* @__PURE__ */ q(ye, { size: 26 }),
|
|
1185
1187
|
title: "No hackathons yet",
|
|
1186
1188
|
description: "Create your first hackathon with the button above. TechnoSpam is pre-launch."
|
|
1187
1189
|
}) : /* @__PURE__ */ q("div", {
|
|
1188
1190
|
className: "space-y-3",
|
|
1189
|
-
children:
|
|
1190
|
-
leading: /* @__PURE__ */ q(
|
|
1191
|
+
children: V.map((e) => /* @__PURE__ */ J("div", { children: [/* @__PURE__ */ J(We, {
|
|
1192
|
+
leading: /* @__PURE__ */ q(Ve, {
|
|
1191
1193
|
seed: e.title,
|
|
1192
|
-
icon: i(e.title,
|
|
1194
|
+
icon: i(e.title, ye)
|
|
1193
1195
|
}),
|
|
1194
1196
|
actions: /* @__PURE__ */ J(K, { children: [
|
|
1195
1197
|
/* @__PURE__ */ J(Y, {
|
|
@@ -1202,25 +1204,25 @@ function Ye() {
|
|
|
1202
1204
|
size: "sm",
|
|
1203
1205
|
onClick: () => ue(e.id),
|
|
1204
1206
|
disabled: S === e.id,
|
|
1205
|
-
children: [/* @__PURE__ */ q(
|
|
1207
|
+
children: [/* @__PURE__ */ q(_e, { size: 15 }), " Open registration"]
|
|
1206
1208
|
}) : null,
|
|
1207
1209
|
e.status === "REGISTRATION_OPEN" ? /* @__PURE__ */ J(Y, {
|
|
1208
1210
|
size: "sm",
|
|
1209
|
-
onClick: () =>
|
|
1211
|
+
onClick: () => W(e.id, u, "Hackathon started"),
|
|
1210
1212
|
disabled: S === e.id,
|
|
1211
|
-
children: [/* @__PURE__ */ q(
|
|
1213
|
+
children: [/* @__PURE__ */ q(pe, { size: 15 }), " Start"]
|
|
1212
1214
|
}) : null,
|
|
1213
1215
|
e.status === "IN_PROGRESS" ? /* @__PURE__ */ J(Y, {
|
|
1214
1216
|
size: "sm",
|
|
1215
|
-
onClick: () =>
|
|
1217
|
+
onClick: () => W(e.id, g, "Judging started"),
|
|
1216
1218
|
disabled: S === e.id,
|
|
1217
|
-
children: [/* @__PURE__ */ q(
|
|
1219
|
+
children: [/* @__PURE__ */ q(de, { size: 15 }), " Start judging"]
|
|
1218
1220
|
}) : null,
|
|
1219
1221
|
e.status === "JUDGING" ? /* @__PURE__ */ J(Y, {
|
|
1220
1222
|
size: "sm",
|
|
1221
|
-
onClick: () =>
|
|
1223
|
+
onClick: () => W(e.id, _, "Hackathon completed"),
|
|
1222
1224
|
disabled: S === e.id,
|
|
1223
|
-
children: [/* @__PURE__ */ q(
|
|
1225
|
+
children: [/* @__PURE__ */ q(le, { size: 15 }), " Complete"]
|
|
1224
1226
|
}) : null
|
|
1225
1227
|
] }),
|
|
1226
1228
|
children: [/* @__PURE__ */ J("div", {
|
|
@@ -1240,13 +1242,13 @@ function Ye() {
|
|
|
1240
1242
|
e.prizePool ? ` · ${c(e.prizePool, e.currency)} prize` : ""
|
|
1241
1243
|
]
|
|
1242
1244
|
})]
|
|
1243
|
-
}), T === e.id ? /* @__PURE__ */ q(
|
|
1245
|
+
}), T === e.id ? /* @__PURE__ */ q(Ye, { hackathon: e }) : null] }, e.id))
|
|
1244
1246
|
})
|
|
1245
1247
|
]
|
|
1246
1248
|
});
|
|
1247
1249
|
}
|
|
1248
|
-
function
|
|
1249
|
-
let { data: e, loading: t, error: n, refetch: r } = A({}), [a] = y(), [o, s] =
|
|
1250
|
+
function $e() {
|
|
1251
|
+
let { data: e, loading: t, error: n, refetch: r } = A({}), [a] = y(), [o, s] = B(null), c = e?.tecListMentors?.items ?? [], u = c.filter((e) => e.status === "PENDING").length, h = async (e) => {
|
|
1250
1252
|
s(e);
|
|
1251
1253
|
try {
|
|
1252
1254
|
(await a({ variables: { id: e } })).data?.tecApproveMentor && (v.success("Mentor approved", "They can now accept mentees."), await r());
|
|
@@ -1256,7 +1258,7 @@ function Xe() {
|
|
|
1256
1258
|
};
|
|
1257
1259
|
return /* @__PURE__ */ J("div", {
|
|
1258
1260
|
className: "space-y-4",
|
|
1259
|
-
children: [/* @__PURE__ */ q(
|
|
1261
|
+
children: [/* @__PURE__ */ q(Ue, { summary: `${c.length} mentor${c.length === 1 ? "" : "s"}${u ? ` · ${u} pending approval` : ""}` }), t && !c.length ? /* @__PURE__ */ q(m, { count: 4 }) : n ? /* @__PURE__ */ q(p, {
|
|
1260
1262
|
title: "Couldn't load mentors",
|
|
1261
1263
|
error: n
|
|
1262
1264
|
}) : c.length === 0 ? /* @__PURE__ */ q(f, {
|
|
@@ -1265,8 +1267,8 @@ function Xe() {
|
|
|
1265
1267
|
description: "Mentor applications will appear here for review. TechnoSpam is pre-launch."
|
|
1266
1268
|
}) : /* @__PURE__ */ q("div", {
|
|
1267
1269
|
className: "space-y-3",
|
|
1268
|
-
children: c.map((e) => /* @__PURE__ */ J(
|
|
1269
|
-
leading: /* @__PURE__ */ q(
|
|
1270
|
+
children: c.map((e) => /* @__PURE__ */ J(We, {
|
|
1271
|
+
leading: /* @__PURE__ */ q(Ve, {
|
|
1270
1272
|
seed: e.headline,
|
|
1271
1273
|
icon: i(e.expertise[0] ?? e.headline, G)
|
|
1272
1274
|
}),
|
|
@@ -1274,7 +1276,7 @@ function Xe() {
|
|
|
1274
1276
|
size: "sm",
|
|
1275
1277
|
onClick: () => h(e.id),
|
|
1276
1278
|
disabled: o === e.id,
|
|
1277
|
-
children: [/* @__PURE__ */ q(
|
|
1279
|
+
children: [/* @__PURE__ */ q(be, { size: 15 }), " Approve"]
|
|
1278
1280
|
}) : void 0,
|
|
1279
1281
|
children: [/* @__PURE__ */ J("div", {
|
|
1280
1282
|
className: "flex flex-wrap items-center gap-2",
|
|
@@ -1284,7 +1286,7 @@ function Xe() {
|
|
|
1284
1286
|
children: e.headline
|
|
1285
1287
|
}),
|
|
1286
1288
|
/* @__PURE__ */ q(d, { status: e.status }),
|
|
1287
|
-
e.isAcceptingMentees ? /* @__PURE__ */ q(
|
|
1289
|
+
e.isAcceptingMentees ? /* @__PURE__ */ q(Se, {
|
|
1288
1290
|
variant: "secondary",
|
|
1289
1291
|
className: "text-[11px]",
|
|
1290
1292
|
children: "Accepting mentees"
|
|
@@ -1307,15 +1309,15 @@ function Xe() {
|
|
|
1307
1309
|
})]
|
|
1308
1310
|
});
|
|
1309
1311
|
}
|
|
1310
|
-
function
|
|
1311
|
-
let [t, r] =
|
|
1312
|
+
function et() {
|
|
1313
|
+
let [t, r] = B("courses"), { currentUser: i } = e(), a = (i?.role ?? "").toLowerCase();
|
|
1312
1314
|
return /* @__PURE__ */ J(n, {
|
|
1313
1315
|
hero: !0,
|
|
1314
1316
|
title: "Authoring Console",
|
|
1315
|
-
description: "Create and manage TechnoSpam content — courses, problems, hackathons, and
|
|
1316
|
-
children: [a.includes("admin") || a.includes("owner") || a.includes("instructor") ? null : /* @__PURE__ */ J(
|
|
1317
|
+
description: "Create and manage TechnoSpam content — courses, problems, hackathons, mentor applications — and enterprise integrations.",
|
|
1318
|
+
children: [a.includes("admin") || a.includes("owner") || a.includes("instructor") ? null : /* @__PURE__ */ J(Ce, {
|
|
1317
1319
|
className: "mb-5 flex items-start gap-3 border-status-warning-border p-4",
|
|
1318
|
-
children: [/* @__PURE__ */ q(
|
|
1320
|
+
children: [/* @__PURE__ */ q(ve, {
|
|
1319
1321
|
size: 18,
|
|
1320
1322
|
className: "mt-0.5 shrink-0 text-status-warning-text"
|
|
1321
1323
|
}), /* @__PURE__ */ J("div", {
|
|
@@ -1329,38 +1331,43 @@ function Ze() {
|
|
|
1329
1331
|
"You can review content here, but create/publish actions require the right permission and will be rejected at the gateway otherwise."
|
|
1330
1332
|
]
|
|
1331
1333
|
})]
|
|
1332
|
-
}), /* @__PURE__ */ J(
|
|
1334
|
+
}), /* @__PURE__ */ J(ke, {
|
|
1333
1335
|
className: "gap-0",
|
|
1334
1336
|
value: t,
|
|
1335
1337
|
onValueChange: (e) => r(e),
|
|
1336
|
-
children: [/* @__PURE__ */ J(
|
|
1338
|
+
children: [/* @__PURE__ */ J(je, {
|
|
1337
1339
|
className: "mb-5",
|
|
1338
1340
|
children: [
|
|
1339
|
-
/* @__PURE__ */ J(
|
|
1341
|
+
/* @__PURE__ */ J(Me, {
|
|
1340
1342
|
value: "courses",
|
|
1341
|
-
children: [/* @__PURE__ */ q(
|
|
1343
|
+
children: [/* @__PURE__ */ q(H, { size: 15 }), " Courses"]
|
|
1342
1344
|
}),
|
|
1343
|
-
/* @__PURE__ */ J(
|
|
1345
|
+
/* @__PURE__ */ J(Me, {
|
|
1344
1346
|
value: "problems",
|
|
1345
|
-
children: [/* @__PURE__ */ q(
|
|
1347
|
+
children: [/* @__PURE__ */ q(U, { size: 15 }), " Problems"]
|
|
1346
1348
|
}),
|
|
1347
|
-
/* @__PURE__ */ J(
|
|
1349
|
+
/* @__PURE__ */ J(Me, {
|
|
1348
1350
|
value: "hackathons",
|
|
1349
|
-
children: [/* @__PURE__ */ q(
|
|
1351
|
+
children: [/* @__PURE__ */ q(ye, { size: 15 }), " Hackathons"]
|
|
1350
1352
|
}),
|
|
1351
|
-
/* @__PURE__ */ J(
|
|
1353
|
+
/* @__PURE__ */ J(Me, {
|
|
1352
1354
|
value: "mentors",
|
|
1353
1355
|
children: [/* @__PURE__ */ q(G, { size: 15 }), " Mentors"]
|
|
1356
|
+
}),
|
|
1357
|
+
/* @__PURE__ */ J(Me, {
|
|
1358
|
+
value: "integrations",
|
|
1359
|
+
children: [/* @__PURE__ */ q(me, { size: 15 }), " Integrations"]
|
|
1354
1360
|
})
|
|
1355
1361
|
]
|
|
1356
|
-
}), /* @__PURE__ */ q(
|
|
1362
|
+
}), /* @__PURE__ */ q(Ae, {
|
|
1357
1363
|
value: t,
|
|
1358
|
-
|
|
1364
|
+
className: ie,
|
|
1365
|
+
children: q(t === "courses" ? Xe : t === "problems" ? Ze : t === "hackathons" ? Qe : t === "mentors" ? $e : se, {})
|
|
1359
1366
|
})]
|
|
1360
1367
|
})]
|
|
1361
1368
|
});
|
|
1362
1369
|
}
|
|
1363
1370
|
//#endregion
|
|
1364
|
-
export {
|
|
1371
|
+
export { et as AdminAdminDashboardPagePage };
|
|
1365
1372
|
|
|
1366
1373
|
//# sourceMappingURL=AdminAdminDashboardPagePage.js.map
|