@burdenoff/microfe-buildmyiq 2026.705.13 → 2026.706.10
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/buildmyiq/BuildmyiqRoot.d.ts.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoot.js +57 -49
- package/dist/buildmyiq/BuildmyiqRoot.js.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoutes.js +15 -11
- package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -1
- package/dist/buildmyiq/components/Avatar.d.ts +15 -0
- package/dist/buildmyiq/components/Avatar.d.ts.map +1 -0
- package/dist/buildmyiq/components/Avatar.js +42 -0
- package/dist/buildmyiq/components/Avatar.js.map +1 -0
- package/dist/buildmyiq/components/Viz.d.ts +25 -0
- package/dist/buildmyiq/components/Viz.d.ts.map +1 -0
- package/dist/buildmyiq/components/Viz.js +78 -0
- package/dist/buildmyiq/components/Viz.js.map +1 -0
- package/dist/buildmyiq/components/index.d.ts +2 -0
- package/dist/buildmyiq/components/index.d.ts.map +1 -1
- package/dist/buildmyiq/components/index.js +2 -0
- package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/DashboardPage.js +200 -98
- package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js +262 -241
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js +142 -115
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js +220 -156
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js +51 -46
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +581 -448
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -1
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/catalog/CatalogPage.js +52 -42
- package/dist/buildmyiq/pages/catalog/CatalogPage.js.map +1 -1
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +422 -301
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js +237 -151
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -1
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js +219 -138
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js.map +1 -1
- package/dist/buildmyiq/pages/insights/InsightsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/insights/InsightsPage.js +276 -152
- package/dist/buildmyiq/pages/insights/InsightsPage.js.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +237 -174
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js.map +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.js +307 -169
- package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -1
- package/dist/buildmyiq/pages/paths/PathsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/paths/PathsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/paths/PathsPage.js +187 -0
- package/dist/buildmyiq/pages/paths/PathsPage.js.map +1 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/skills/SkillsPage.js +233 -140
- package/dist/buildmyiq/pages/skills/SkillsPage.js.map +1 -1
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js +379 -275
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -17,9 +17,9 @@ import { Field as m, Modal as h, NO_SKILL as g, SelectField as _, slugify as v }
|
|
|
17
17
|
import { useMemo as y, useState as b } from "react";
|
|
18
18
|
import { Plus as x } from "lucide-react";
|
|
19
19
|
import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
20
|
-
import { Button as T,
|
|
20
|
+
import { Button as T, GlassCard as E, Input as D, Switch as O, Textarea as k } from "@burdenoff/fe-libs/ui";
|
|
21
21
|
//#region src/buildmyiq/pages/authoring/AuthoringPage.tsx
|
|
22
|
-
var
|
|
22
|
+
var A = [
|
|
23
23
|
{
|
|
24
24
|
value: "ALL",
|
|
25
25
|
label: "All"
|
|
@@ -40,8 +40,8 @@ var k = [
|
|
|
40
40
|
value: "ARCHIVED",
|
|
41
41
|
label: "Archived"
|
|
42
42
|
}
|
|
43
|
-
],
|
|
44
|
-
let { currentUser: i } = e(), a = u(), o = l(), [s, c] = b(""), [d, f] = b(""), [y, x] = b(!1), [
|
|
43
|
+
], j = 24, M = ({ onClose: t, onCreated: r }) => {
|
|
44
|
+
let { currentUser: i } = e(), a = u(), o = l(), [s, c] = b(""), [d, f] = b(""), [y, x] = b(!1), [E, O] = b(""), [A, j] = b("BEGINNER"), [M, N] = b("en"), [P, F] = b(""), [I, L] = b(g), [R, z] = b(null), B = a.data ?? [], V = (e) => {
|
|
45
45
|
c(e), y || f(v(e));
|
|
46
46
|
}, H = s.trim().length > 0 && d.trim().length > 0 && !o.isPending;
|
|
47
47
|
return /* @__PURE__ */ C(h, {
|
|
@@ -62,7 +62,7 @@ var k = [
|
|
|
62
62
|
let e = {
|
|
63
63
|
title: s.trim(),
|
|
64
64
|
slug: d.trim(),
|
|
65
|
-
summary:
|
|
65
|
+
summary: E.trim() || void 0,
|
|
66
66
|
level: A,
|
|
67
67
|
language: M.trim() || "en",
|
|
68
68
|
estimatedHours: P.trim() ? Number(P) : void 0,
|
|
@@ -85,7 +85,7 @@ var k = [
|
|
|
85
85
|
label: "Title",
|
|
86
86
|
htmlFor: "new-course-title",
|
|
87
87
|
required: !0,
|
|
88
|
-
children: /* @__PURE__ */ C(
|
|
88
|
+
children: /* @__PURE__ */ C(D, {
|
|
89
89
|
id: "new-course-title",
|
|
90
90
|
value: s,
|
|
91
91
|
onChange: (e) => V(e.target.value),
|
|
@@ -97,7 +97,7 @@ var k = [
|
|
|
97
97
|
htmlFor: "new-course-slug",
|
|
98
98
|
required: !0,
|
|
99
99
|
hint: "Used in the course URL. Auto-generated from the title — edit if you like.",
|
|
100
|
-
children: /* @__PURE__ */ C(
|
|
100
|
+
children: /* @__PURE__ */ C(D, {
|
|
101
101
|
id: "new-course-slug",
|
|
102
102
|
value: d,
|
|
103
103
|
onChange: (e) => {
|
|
@@ -109,11 +109,11 @@ var k = [
|
|
|
109
109
|
/* @__PURE__ */ C(m, {
|
|
110
110
|
label: "Summary",
|
|
111
111
|
htmlFor: "new-course-summary",
|
|
112
|
-
children: /* @__PURE__ */ C(
|
|
112
|
+
children: /* @__PURE__ */ C(k, {
|
|
113
113
|
id: "new-course-summary",
|
|
114
114
|
rows: 3,
|
|
115
|
-
value:
|
|
116
|
-
onChange: (e) =>
|
|
115
|
+
value: E,
|
|
116
|
+
onChange: (e) => O(e.target.value),
|
|
117
117
|
placeholder: "A short description shown on the catalog card."
|
|
118
118
|
})
|
|
119
119
|
}),
|
|
@@ -134,7 +134,7 @@ var k = [
|
|
|
134
134
|
/* @__PURE__ */ C(m, {
|
|
135
135
|
label: "Language",
|
|
136
136
|
htmlFor: "new-course-language",
|
|
137
|
-
children: /* @__PURE__ */ C(
|
|
137
|
+
children: /* @__PURE__ */ C(D, {
|
|
138
138
|
id: "new-course-language",
|
|
139
139
|
value: M,
|
|
140
140
|
onChange: (e) => N(e.target.value),
|
|
@@ -144,7 +144,7 @@ var k = [
|
|
|
144
144
|
/* @__PURE__ */ C(m, {
|
|
145
145
|
label: "Estimated hours",
|
|
146
146
|
htmlFor: "new-course-hours",
|
|
147
|
-
children: /* @__PURE__ */ C(
|
|
147
|
+
children: /* @__PURE__ */ C(D, {
|
|
148
148
|
id: "new-course-hours",
|
|
149
149
|
type: "number",
|
|
150
150
|
min: 0,
|
|
@@ -176,77 +176,82 @@ var k = [
|
|
|
176
176
|
]
|
|
177
177
|
})
|
|
178
178
|
});
|
|
179
|
-
},
|
|
180
|
-
let { currentUser: l, navigateTo: u } = e(), p = l?.id, [m, h] = b("ALL"), [g, _] = b(!1), [v,
|
|
179
|
+
}, N = () => {
|
|
180
|
+
let { currentUser: l, navigateTo: u } = e(), p = l?.id, [m, h] = b("ALL"), [g, _] = b(!1), [v, D] = b(!1), k = d(), N = c({
|
|
181
181
|
status: m === "ALL" ? void 0 : m,
|
|
182
|
-
cursor:
|
|
183
|
-
limit:
|
|
184
|
-
}),
|
|
185
|
-
|
|
182
|
+
cursor: k.cursor,
|
|
183
|
+
limit: j
|
|
184
|
+
}), P = y(() => N.data?.items ?? [], [N.data]), F = y(() => g && p ? P.filter((e) => e.instructorId === p) : P, [
|
|
185
|
+
P,
|
|
186
186
|
g,
|
|
187
187
|
p
|
|
188
|
-
]),
|
|
189
|
-
h(e),
|
|
190
|
-
},
|
|
188
|
+
]), I = (e) => {
|
|
189
|
+
h(e), k.reset();
|
|
190
|
+
}, L = g ? "No courses you author yet" : m === "ALL" ? "No courses yet" : `No ${n(m).toLowerCase()} courses`;
|
|
191
191
|
return /* @__PURE__ */ w(t, {
|
|
192
192
|
title: "Authoring",
|
|
193
193
|
description: "Create, curate and publish your workspace courses.",
|
|
194
194
|
titleGradient: !0,
|
|
195
195
|
aurora: !0,
|
|
196
196
|
actions: /* @__PURE__ */ w(T, {
|
|
197
|
-
onClick: () =>
|
|
197
|
+
onClick: () => D(!0),
|
|
198
198
|
children: [/* @__PURE__ */ C(x, { className: "mr-1.5 h-4 w-4" }), " New course"]
|
|
199
199
|
}),
|
|
200
200
|
children: [/* @__PURE__ */ w("div", {
|
|
201
201
|
className: "flex flex-col gap-5",
|
|
202
|
-
children: [/* @__PURE__ */ w(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
children: [/* @__PURE__ */ w(E, {
|
|
203
|
+
treatment: "plain",
|
|
204
|
+
className: "flex flex-col gap-3 p-3 sm:flex-row sm:items-center sm:justify-between",
|
|
205
|
+
children: [/* @__PURE__ */ C("div", {
|
|
206
|
+
className: "-mx-1 overflow-x-auto px-1",
|
|
207
|
+
children: /* @__PURE__ */ C(o, {
|
|
208
|
+
options: A,
|
|
209
|
+
value: m,
|
|
210
|
+
onChange: I,
|
|
211
|
+
className: "border-0 bg-transparent p-0"
|
|
212
|
+
})
|
|
208
213
|
}), /* @__PURE__ */ w("label", {
|
|
209
|
-
className: "inline-flex cursor-pointer items-center gap-2 text-sm text-text-secondary",
|
|
210
|
-
children: [/* @__PURE__ */ C(
|
|
214
|
+
className: "inline-flex shrink-0 cursor-pointer items-center gap-2 text-sm text-text-secondary",
|
|
215
|
+
children: [/* @__PURE__ */ C(O, {
|
|
211
216
|
checked: g,
|
|
212
217
|
onCheckedChange: _,
|
|
213
218
|
disabled: !l?.id
|
|
214
219
|
}), "Mine only"]
|
|
215
220
|
})]
|
|
216
|
-
}),
|
|
221
|
+
}), N.isLoading ? /* @__PURE__ */ C(a, { label: "Loading courses…" }) : N.isError ? /* @__PURE__ */ C(i, {
|
|
217
222
|
message: "We couldn't load your courses.",
|
|
218
|
-
onRetry: () =>
|
|
219
|
-
}) : /* @__PURE__ */ w(S, { children: [
|
|
223
|
+
onRetry: () => N.refetch()
|
|
224
|
+
}) : /* @__PURE__ */ w(S, { children: [F.length === 0 ? /* @__PURE__ */ C(r, {
|
|
220
225
|
illustration: "empty-data",
|
|
221
|
-
title:
|
|
226
|
+
title: L,
|
|
222
227
|
description: g ? "None of the courses on this page are authored by you — clear \"Mine only\" or page through to find them." : "Create your first course to start building curriculum, assessments and cohorts.",
|
|
223
228
|
action: /* @__PURE__ */ w(T, {
|
|
224
|
-
onClick: () =>
|
|
229
|
+
onClick: () => D(!0),
|
|
225
230
|
children: [/* @__PURE__ */ C(x, { className: "mr-1.5 h-4 w-4" }), " New course"]
|
|
226
231
|
})
|
|
227
232
|
}) : /* @__PURE__ */ C("div", {
|
|
228
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3
|
|
229
|
-
children:
|
|
233
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4",
|
|
234
|
+
children: F.map((e) => /* @__PURE__ */ C(f, {
|
|
230
235
|
course: e,
|
|
231
236
|
showStatus: !0,
|
|
232
237
|
onClick: () => u(`authoring/${e.id}`)
|
|
233
238
|
}, e.id))
|
|
234
239
|
}), /* @__PURE__ */ C(s, {
|
|
235
|
-
page:
|
|
236
|
-
pageSize:
|
|
237
|
-
itemCount:
|
|
238
|
-
hasMore:
|
|
239
|
-
onPageChange: (e) =>
|
|
240
|
+
page: k.page,
|
|
241
|
+
pageSize: j,
|
|
242
|
+
itemCount: F.length,
|
|
243
|
+
hasMore: N.data?.pageInfo.hasMore ?? !1,
|
|
244
|
+
onPageChange: (e) => k.onPageChange(e, N.data?.pageInfo.cursor)
|
|
240
245
|
})] })]
|
|
241
|
-
}), v && /* @__PURE__ */ C(
|
|
242
|
-
onClose: () =>
|
|
246
|
+
}), v && /* @__PURE__ */ C(M, {
|
|
247
|
+
onClose: () => D(!1),
|
|
243
248
|
onCreated: (e) => {
|
|
244
|
-
|
|
249
|
+
D(!1), u(`authoring/${e.id}`);
|
|
245
250
|
}
|
|
246
251
|
})]
|
|
247
252
|
});
|
|
248
253
|
};
|
|
249
254
|
//#endregion
|
|
250
|
-
export {
|
|
255
|
+
export { N as AuthoringPage };
|
|
251
256
|
|
|
252
257
|
//# sourceMappingURL=AuthoringPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthoringPage.js","names":[],"sources":["../../../../src/buildmyiq/pages/authoring/AuthoringPage.tsx"],"sourcesContent":["/**\n * AuthoringPage — the instructor course-management surface.\n * @module buildmyiq/pages/authoring\n *\n * Lists EVERY workspace course (including DRAFT / IN_REVIEW) via `useBuiCourses`,\n * filterable by workflow status and optionally narrowed to the caller's own\n * courses. A \"New course\" modal creates a draft (`useBuiCreateCourse`) and jumps\n * straight into the CourseBuilder. All data is live `bui*` data — no fabrication.\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Plus } from 'lucide-react';\nimport { Button, Input, Switch, Textarea } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n FilterTabs,\n Pagination,\n EmptyState,\n LoadingView,\n ErrorView,\n} from '../../components';\nimport { CourseCard } from '../_shared';\nimport { Modal, Field, SelectField, NO_SKILL, slugify } from './_forms';\nimport { useBuildmyiq } from '../../context';\nimport { useBuiCourses, useBuiCreateCourse, useBuiSkills, useCursorPager } from '../../hooks';\nimport { COURSE_LEVELS } from '../../types';\nimport type { BuiCourse, BuiCourseLevel, BuiCourseStatus, BuiCreateCourseInput } from '../../types';\nimport { formatEnumLabel } from '../../utils/formatters';\n\ntype StatusFilter = 'ALL' | BuiCourseStatus;\n\nconst STATUS_TABS: { value: StatusFilter; label: string }[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'IN_REVIEW', label: 'In review' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst PAGE_SIZE = 24;\n\n/**\n * Create-course modal. Mounted only while open so its form state resets each\n * time it is opened.\n */\nconst NewCourseModal: FC<{ onClose: () => void; onCreated: (course: BuiCourse) => void }> = ({\n onClose,\n onCreated,\n}) => {\n const { currentUser } = useBuildmyiq();\n const skillsQuery = useBuiSkills();\n const createCourse = useBuiCreateCourse();\n\n const [title, setTitle] = useState('');\n const [slug, setSlug] = useState('');\n const [slugEdited, setSlugEdited] = useState(false);\n const [summary, setSummary] = useState('');\n const [level, setLevel] = useState<BuiCourseLevel>('BEGINNER');\n const [language, setLanguage] = useState('en');\n const [estimatedHours, setEstimatedHours] = useState('');\n const [skillId, setSkillId] = useState<string>(NO_SKILL);\n const [error, setError] = useState<string | null>(null);\n\n const skills = skillsQuery.data ?? [];\n\n const onTitleChange = (value: string) => {\n setTitle(value);\n if (!slugEdited) setSlug(slugify(value));\n };\n\n const canSubmit = title.trim().length > 0 && slug.trim().length > 0 && !createCourse.isPending;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n setError(null);\n const input: BuiCreateCourseInput = {\n title: title.trim(),\n slug: slug.trim(),\n summary: summary.trim() || undefined,\n level,\n language: language.trim() || 'en',\n estimatedHours: estimatedHours.trim() ? Number(estimatedHours) : undefined,\n skillId: skillId !== NO_SKILL ? skillId : undefined,\n instructorId: currentUser?.id,\n };\n try {\n const course = await createCourse.mutateAsync(input);\n onCreated(course);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to create course.');\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"New course\"\n description=\"Create a draft course — you can add modules, lessons and assessments next.\"\n className=\"sm:max-w-xl\"\n footer={\n <>\n <Button variant=\"ghost\" onClick={onClose} disabled={createCourse.isPending}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n {createCourse.isPending ? 'Creating…' : 'Create course'}\n </Button>\n </>\n }\n >\n <div className=\"grid gap-4\">\n <Field label=\"Title\" htmlFor=\"new-course-title\" required>\n <Input\n id=\"new-course-title\"\n value={title}\n onChange={(e) => onTitleChange(e.target.value)}\n placeholder=\"e.g. Foundations of Data Literacy\"\n />\n </Field>\n <Field\n label=\"Slug\"\n htmlFor=\"new-course-slug\"\n required\n hint=\"Used in the course URL. Auto-generated from the title — edit if you like.\"\n >\n <Input\n id=\"new-course-slug\"\n value={slug}\n onChange={(e) => {\n setSlug(e.target.value);\n setSlugEdited(true);\n }}\n placeholder=\"foundations-of-data-literacy\"\n />\n </Field>\n <Field label=\"Summary\" htmlFor=\"new-course-summary\">\n <Textarea\n id=\"new-course-summary\"\n rows={3}\n value={summary}\n onChange={(e) => setSummary(e.target.value)}\n placeholder=\"A short description shown on the catalog card.\"\n />\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field label=\"Level\">\n <SelectField\n value={level}\n onChange={(v) => setLevel(v as BuiCourseLevel)}\n options={COURSE_LEVELS.map((l) => ({ value: l, label: formatEnumLabel(l) }))}\n />\n </Field>\n <Field label=\"Language\" htmlFor=\"new-course-language\">\n <Input\n id=\"new-course-language\"\n value={language}\n onChange={(e) => setLanguage(e.target.value)}\n placeholder=\"en\"\n />\n </Field>\n <Field label=\"Estimated hours\" htmlFor=\"new-course-hours\">\n <Input\n id=\"new-course-hours\"\n type=\"number\"\n min={0}\n value={estimatedHours}\n onChange={(e) => setEstimatedHours(e.target.value)}\n placeholder=\"0\"\n />\n </Field>\n <Field label=\"Skill\">\n <SelectField\n value={skillId}\n onChange={setSkillId}\n options={[\n { value: NO_SKILL, label: skillsQuery.isLoading ? 'Loading…' : 'No skill' },\n ...skills.map((s) => ({ value: s.id, label: s.name })),\n ]}\n />\n </Field>\n </div>\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n </Modal>\n );\n};\n\nexport const AuthoringPage: FC = () => {\n const { currentUser, navigateTo } = useBuildmyiq();\n const myId = currentUser?.id;\n const [status, setStatus] = useState<StatusFilter>('ALL');\n const [mineOnly, setMineOnly] = useState(false);\n const [showCreate, setShowCreate] = useState(false);\n const pager = useCursorPager();\n\n const coursesQuery = useBuiCourses({\n status: status === 'ALL' ? undefined : status,\n cursor: pager.cursor,\n limit: PAGE_SIZE,\n });\n\n const items: BuiCourse[] = useMemo(() => coursesQuery.data?.items ?? [], [coursesQuery.data]);\n const visible = useMemo(\n () => (mineOnly && myId ? items.filter((c) => c.instructorId === myId) : items),\n [items, mineOnly, myId]\n );\n\n const handleStatus = (next: StatusFilter) => {\n setStatus(next);\n pager.reset();\n };\n\n const emptyTitle = mineOnly\n ? 'No courses you author yet'\n : status === 'ALL'\n ? 'No courses yet'\n : `No ${formatEnumLabel(status).toLowerCase()} courses`;\n\n return (\n <PageLayout\n title=\"Authoring\"\n description=\"Create, curate and publish your workspace courses.\"\n titleGradient\n aurora\n actions={\n <Button onClick={() => setShowCreate(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New course\n </Button>\n }\n >\n <div className=\"flex flex-col gap-5\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <FilterTabs options={STATUS_TABS} value={status} onChange={handleStatus} />\n <label className=\"inline-flex cursor-pointer items-center gap-2 text-sm text-text-secondary\">\n <Switch checked={mineOnly} onCheckedChange={setMineOnly} disabled={!currentUser?.id} />\n Mine only\n </label>\n </div>\n\n {coursesQuery.isLoading ? (\n <LoadingView label=\"Loading courses…\" />\n ) : coursesQuery.isError ? (\n <ErrorView\n message=\"We couldn't load your courses.\"\n onRetry={() => coursesQuery.refetch()}\n />\n ) : (\n <>\n {visible.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n title={emptyTitle}\n description={\n mineOnly\n ? 'None of the courses on this page are authored by you — clear \"Mine only\" or page through to find them.'\n : 'Create your first course to start building curriculum, assessments and cohorts.'\n }\n action={\n <Button onClick={() => setShowCreate(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New course\n </Button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {visible.map((course) => (\n <CourseCard\n key={course.id}\n course={course}\n showStatus\n onClick={() => navigateTo(`authoring/${course.id}`)}\n />\n ))}\n </div>\n )}\n {/* Pager stays visible even when mineOnly trims the page empty, so the\n user can advance to later pages to find their courses. */}\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={visible.length}\n hasMore={coursesQuery.data?.pageInfo.hasMore ?? false}\n onPageChange={(p) => pager.onPageChange(p, coursesQuery.data?.pageInfo.cursor)}\n />\n </>\n )}\n </div>\n\n {showCreate && (\n <NewCourseModal\n onClose={() => setShowCreate(false)}\n onCreated={(course) => {\n setShowCreate(false);\n navigateTo(`authoring/${course.id}`);\n }}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuthoringPage.js","names":[],"sources":["../../../../src/buildmyiq/pages/authoring/AuthoringPage.tsx"],"sourcesContent":["/**\n * AuthoringPage — the instructor course-management surface.\n * @module buildmyiq/pages/authoring\n *\n * Lists EVERY workspace course (including DRAFT / IN_REVIEW) via `useBuiCourses`,\n * filterable by workflow status and optionally narrowed to the caller's own\n * courses. A \"New course\" modal creates a draft (`useBuiCreateCourse`) and jumps\n * straight into the CourseBuilder. All data is live `bui*` data — no fabrication.\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Plus } from 'lucide-react';\nimport { Button, GlassCard, Input, Switch, Textarea } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n FilterTabs,\n Pagination,\n EmptyState,\n LoadingView,\n ErrorView,\n} from '../../components';\nimport { CourseCard } from '../_shared';\nimport { Modal, Field, SelectField, NO_SKILL, slugify } from './_forms';\nimport { useBuildmyiq } from '../../context';\nimport { useBuiCourses, useBuiCreateCourse, useBuiSkills, useCursorPager } from '../../hooks';\nimport { COURSE_LEVELS } from '../../types';\nimport type { BuiCourse, BuiCourseLevel, BuiCourseStatus, BuiCreateCourseInput } from '../../types';\nimport { formatEnumLabel } from '../../utils/formatters';\n\ntype StatusFilter = 'ALL' | BuiCourseStatus;\n\nconst STATUS_TABS: { value: StatusFilter; label: string }[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'IN_REVIEW', label: 'In review' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst PAGE_SIZE = 24;\n\n/**\n * Create-course modal. Mounted only while open so its form state resets each\n * time it is opened.\n */\nconst NewCourseModal: FC<{ onClose: () => void; onCreated: (course: BuiCourse) => void }> = ({\n onClose,\n onCreated,\n}) => {\n const { currentUser } = useBuildmyiq();\n const skillsQuery = useBuiSkills();\n const createCourse = useBuiCreateCourse();\n\n const [title, setTitle] = useState('');\n const [slug, setSlug] = useState('');\n const [slugEdited, setSlugEdited] = useState(false);\n const [summary, setSummary] = useState('');\n const [level, setLevel] = useState<BuiCourseLevel>('BEGINNER');\n const [language, setLanguage] = useState('en');\n const [estimatedHours, setEstimatedHours] = useState('');\n const [skillId, setSkillId] = useState<string>(NO_SKILL);\n const [error, setError] = useState<string | null>(null);\n\n const skills = skillsQuery.data ?? [];\n\n const onTitleChange = (value: string) => {\n setTitle(value);\n if (!slugEdited) setSlug(slugify(value));\n };\n\n const canSubmit = title.trim().length > 0 && slug.trim().length > 0 && !createCourse.isPending;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n setError(null);\n const input: BuiCreateCourseInput = {\n title: title.trim(),\n slug: slug.trim(),\n summary: summary.trim() || undefined,\n level,\n language: language.trim() || 'en',\n estimatedHours: estimatedHours.trim() ? Number(estimatedHours) : undefined,\n skillId: skillId !== NO_SKILL ? skillId : undefined,\n instructorId: currentUser?.id,\n };\n try {\n const course = await createCourse.mutateAsync(input);\n onCreated(course);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to create course.');\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"New course\"\n description=\"Create a draft course — you can add modules, lessons and assessments next.\"\n className=\"sm:max-w-xl\"\n footer={\n <>\n <Button variant=\"ghost\" onClick={onClose} disabled={createCourse.isPending}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n {createCourse.isPending ? 'Creating…' : 'Create course'}\n </Button>\n </>\n }\n >\n <div className=\"grid gap-4\">\n <Field label=\"Title\" htmlFor=\"new-course-title\" required>\n <Input\n id=\"new-course-title\"\n value={title}\n onChange={(e) => onTitleChange(e.target.value)}\n placeholder=\"e.g. Foundations of Data Literacy\"\n />\n </Field>\n <Field\n label=\"Slug\"\n htmlFor=\"new-course-slug\"\n required\n hint=\"Used in the course URL. Auto-generated from the title — edit if you like.\"\n >\n <Input\n id=\"new-course-slug\"\n value={slug}\n onChange={(e) => {\n setSlug(e.target.value);\n setSlugEdited(true);\n }}\n placeholder=\"foundations-of-data-literacy\"\n />\n </Field>\n <Field label=\"Summary\" htmlFor=\"new-course-summary\">\n <Textarea\n id=\"new-course-summary\"\n rows={3}\n value={summary}\n onChange={(e) => setSummary(e.target.value)}\n placeholder=\"A short description shown on the catalog card.\"\n />\n </Field>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Field label=\"Level\">\n <SelectField\n value={level}\n onChange={(v) => setLevel(v as BuiCourseLevel)}\n options={COURSE_LEVELS.map((l) => ({ value: l, label: formatEnumLabel(l) }))}\n />\n </Field>\n <Field label=\"Language\" htmlFor=\"new-course-language\">\n <Input\n id=\"new-course-language\"\n value={language}\n onChange={(e) => setLanguage(e.target.value)}\n placeholder=\"en\"\n />\n </Field>\n <Field label=\"Estimated hours\" htmlFor=\"new-course-hours\">\n <Input\n id=\"new-course-hours\"\n type=\"number\"\n min={0}\n value={estimatedHours}\n onChange={(e) => setEstimatedHours(e.target.value)}\n placeholder=\"0\"\n />\n </Field>\n <Field label=\"Skill\">\n <SelectField\n value={skillId}\n onChange={setSkillId}\n options={[\n { value: NO_SKILL, label: skillsQuery.isLoading ? 'Loading…' : 'No skill' },\n ...skills.map((s) => ({ value: s.id, label: s.name })),\n ]}\n />\n </Field>\n </div>\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n </Modal>\n );\n};\n\nexport const AuthoringPage: FC = () => {\n const { currentUser, navigateTo } = useBuildmyiq();\n const myId = currentUser?.id;\n const [status, setStatus] = useState<StatusFilter>('ALL');\n const [mineOnly, setMineOnly] = useState(false);\n const [showCreate, setShowCreate] = useState(false);\n const pager = useCursorPager();\n\n const coursesQuery = useBuiCourses({\n status: status === 'ALL' ? undefined : status,\n cursor: pager.cursor,\n limit: PAGE_SIZE,\n });\n\n const items: BuiCourse[] = useMemo(() => coursesQuery.data?.items ?? [], [coursesQuery.data]);\n const visible = useMemo(\n () => (mineOnly && myId ? items.filter((c) => c.instructorId === myId) : items),\n [items, mineOnly, myId]\n );\n\n const handleStatus = (next: StatusFilter) => {\n setStatus(next);\n pager.reset();\n };\n\n const emptyTitle = mineOnly\n ? 'No courses you author yet'\n : status === 'ALL'\n ? 'No courses yet'\n : `No ${formatEnumLabel(status).toLowerCase()} courses`;\n\n return (\n <PageLayout\n title=\"Authoring\"\n description=\"Create, curate and publish your workspace courses.\"\n titleGradient\n aurora\n actions={\n <Button onClick={() => setShowCreate(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New course\n </Button>\n }\n >\n <div className=\"flex flex-col gap-5\">\n <GlassCard\n treatment=\"plain\"\n className=\"flex flex-col gap-3 p-3 sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"-mx-1 overflow-x-auto px-1\">\n <FilterTabs\n options={STATUS_TABS}\n value={status}\n onChange={handleStatus}\n className=\"border-0 bg-transparent p-0\"\n />\n </div>\n <label className=\"inline-flex shrink-0 cursor-pointer items-center gap-2 text-sm text-text-secondary\">\n <Switch checked={mineOnly} onCheckedChange={setMineOnly} disabled={!currentUser?.id} />\n Mine only\n </label>\n </GlassCard>\n\n {coursesQuery.isLoading ? (\n <LoadingView label=\"Loading courses…\" />\n ) : coursesQuery.isError ? (\n <ErrorView\n message=\"We couldn't load your courses.\"\n onRetry={() => coursesQuery.refetch()}\n />\n ) : (\n <>\n {visible.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n title={emptyTitle}\n description={\n mineOnly\n ? 'None of the courses on this page are authored by you — clear \"Mine only\" or page through to find them.'\n : 'Create your first course to start building curriculum, assessments and cohorts.'\n }\n action={\n <Button onClick={() => setShowCreate(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New course\n </Button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {visible.map((course) => (\n <CourseCard\n key={course.id}\n course={course}\n showStatus\n onClick={() => navigateTo(`authoring/${course.id}`)}\n />\n ))}\n </div>\n )}\n {/* Pager stays visible even when mineOnly trims the page empty, so the\n user can advance to later pages to find their courses. */}\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={visible.length}\n hasMore={coursesQuery.data?.pageInfo.hasMore ?? false}\n onPageChange={(p) => pager.onPageChange(p, coursesQuery.data?.pageInfo.cursor)}\n />\n </>\n )}\n </div>\n\n {showCreate && (\n <NewCourseModal\n onClose={() => setShowCreate(false)}\n onCreated={(course) => {\n setShowCreate(false);\n navigateTo(`authoring/${course.id}`);\n }}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseBuilderPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/authoring/CourseBuilderPage.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CourseBuilderPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/authoring/CourseBuilderPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AA6sB3C,eAAO,MAAM,iBAAiB,EAAE,EAuJ/B,CAAC"}
|