@burdenoff/microfe-buildmyiq 2026.525.1 → 2026.705.1
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 +5 -0
- package/dist/buildmyiq/BuildmyiqRoot.d.ts.map +1 -0
- package/dist/buildmyiq/BuildmyiqRoot.js +123 -0
- package/dist/buildmyiq/BuildmyiqRoot.js.map +1 -0
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts +4 -0
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts.map +1 -0
- package/dist/buildmyiq/BuildmyiqRoutes.js +84 -0
- package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -0
- package/dist/buildmyiq/components/BuiDiscussion.d.ts +18 -0
- package/dist/buildmyiq/components/BuiDiscussion.d.ts.map +1 -0
- package/dist/buildmyiq/components/BuiDiscussion.js +109 -0
- package/dist/buildmyiq/components/BuiDiscussion.js.map +1 -0
- package/dist/buildmyiq/components/BuiTags.d.ts +17 -0
- package/dist/buildmyiq/components/BuiTags.d.ts.map +1 -0
- package/dist/buildmyiq/components/BuiTags.js +149 -0
- package/dist/buildmyiq/components/BuiTags.js.map +1 -0
- package/dist/buildmyiq/components/DataTable.d.ts +28 -0
- package/dist/buildmyiq/components/DataTable.d.ts.map +1 -0
- package/dist/buildmyiq/components/DataTable.js +71 -0
- package/dist/buildmyiq/components/DataTable.js.map +1 -0
- package/dist/buildmyiq/components/EmptyState.d.ts +18 -0
- package/dist/buildmyiq/components/EmptyState.d.ts.map +1 -0
- package/dist/buildmyiq/components/EmptyState.js +35 -0
- package/dist/buildmyiq/components/EmptyState.js.map +1 -0
- package/dist/buildmyiq/components/EvidenceUpload.d.ts +14 -0
- package/dist/buildmyiq/components/EvidenceUpload.d.ts.map +1 -0
- package/dist/buildmyiq/components/EvidenceUpload.js +93 -0
- package/dist/buildmyiq/components/EvidenceUpload.js.map +1 -0
- package/dist/buildmyiq/components/FileLink.d.ts +15 -0
- package/dist/buildmyiq/components/FileLink.d.ts.map +1 -0
- package/dist/buildmyiq/components/FileLink.js +36 -0
- package/dist/buildmyiq/components/FileLink.js.map +1 -0
- package/dist/buildmyiq/components/FilterTabs.d.ts +18 -0
- package/dist/buildmyiq/components/FilterTabs.d.ts.map +1 -0
- package/dist/buildmyiq/components/FilterTabs.js +27 -0
- package/dist/buildmyiq/components/FilterTabs.js.map +1 -0
- package/dist/buildmyiq/components/MetricsCard.d.ts +23 -0
- package/dist/buildmyiq/components/MetricsCard.d.ts.map +1 -0
- package/dist/buildmyiq/components/MetricsCard.js +64 -0
- package/dist/buildmyiq/components/MetricsCard.js.map +1 -0
- package/dist/buildmyiq/components/MiniBar.d.ts +16 -0
- package/dist/buildmyiq/components/MiniBar.d.ts.map +1 -0
- package/dist/buildmyiq/components/MiniBar.js +22 -0
- package/dist/buildmyiq/components/MiniBar.js.map +1 -0
- package/dist/buildmyiq/components/PageLayout.d.ts +16 -0
- package/dist/buildmyiq/components/PageLayout.d.ts.map +1 -0
- package/dist/buildmyiq/components/PageLayout.js +38 -0
- package/dist/buildmyiq/components/PageLayout.js.map +1 -0
- package/dist/buildmyiq/components/Pagination.d.ts +22 -0
- package/dist/buildmyiq/components/Pagination.d.ts.map +1 -0
- package/dist/buildmyiq/components/Pagination.js +50 -0
- package/dist/buildmyiq/components/Pagination.js.map +1 -0
- package/dist/buildmyiq/components/StateViews.d.ts +24 -0
- package/dist/buildmyiq/components/StateViews.d.ts.map +1 -0
- package/dist/buildmyiq/components/StateViews.js +49 -0
- package/dist/buildmyiq/components/StateViews.js.map +1 -0
- package/dist/buildmyiq/components/StatusBadge.d.ts +9 -0
- package/dist/buildmyiq/components/StatusBadge.d.ts.map +1 -0
- package/dist/buildmyiq/components/StatusBadge.js +60 -0
- package/dist/buildmyiq/components/StatusBadge.js.map +1 -0
- package/dist/buildmyiq/components/Tabs.d.ts +17 -0
- package/dist/buildmyiq/components/Tabs.d.ts.map +1 -0
- package/dist/buildmyiq/components/Tabs.js +31 -0
- package/dist/buildmyiq/components/Tabs.js.map +1 -0
- package/dist/buildmyiq/components/index.d.ts +19 -0
- package/dist/buildmyiq/components/index.d.ts.map +1 -0
- package/dist/buildmyiq/components/index.js +14 -0
- package/dist/buildmyiq/context/BuildmyiqContext.d.ts +16 -0
- package/dist/buildmyiq/context/BuildmyiqContext.d.ts.map +1 -0
- package/dist/buildmyiq/context/BuildmyiqContext.js +85 -0
- package/dist/buildmyiq/context/BuildmyiqContext.js.map +1 -0
- package/dist/buildmyiq/context/index.d.ts +6 -0
- package/dist/buildmyiq/context/index.d.ts.map +1 -0
- package/dist/buildmyiq/context/index.js +1 -0
- package/dist/buildmyiq/hooks/index.d.ts +10 -0
- package/dist/buildmyiq/hooks/index.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/index.js +5 -0
- package/dist/buildmyiq/hooks/useBuiComments.d.ts +36 -0
- package/dist/buildmyiq/hooks/useBuiComments.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiComments.js +45 -0
- package/dist/buildmyiq/hooks/useBuiComments.js.map +1 -0
- package/dist/buildmyiq/hooks/useBuiFiles.d.ts +47 -0
- package/dist/buildmyiq/hooks/useBuiFiles.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiFiles.js +81 -0
- package/dist/buildmyiq/hooks/useBuiFiles.js.map +1 -0
- package/dist/buildmyiq/hooks/useBuiTags.d.ts +44 -0
- package/dist/buildmyiq/hooks/useBuiTags.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiTags.js +89 -0
- package/dist/buildmyiq/hooks/useBuiTags.js.map +1 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts +65 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js +412 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js.map +1 -0
- package/dist/buildmyiq/hooks/useCursorPager.d.ts +33 -0
- package/dist/buildmyiq/hooks/useCursorPager.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useCursorPager.js +25 -0
- package/dist/buildmyiq/hooks/useCursorPager.js.map +1 -0
- package/dist/buildmyiq/index.d.ts +9 -0
- package/dist/buildmyiq/index.d.ts.map +1 -0
- package/dist/buildmyiq/index.js +6 -3
- package/dist/buildmyiq/pages/DashboardPage.d.ts +4 -0
- package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/DashboardPage.js +134 -247
- package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
- package/dist/buildmyiq/pages/_shared/CourseCard.d.ts +13 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.d.ts.map +1 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.js +74 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.js.map +1 -0
- package/dist/buildmyiq/pages/_shared/index.d.ts +6 -0
- package/dist/buildmyiq/pages/_shared/index.d.ts.map +1 -0
- package/dist/buildmyiq/pages/_shared/index.js +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts +4 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js +499 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js.map +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js +390 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js.map +1 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts +4 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js +252 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js.map +1 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts +4 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +680 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -0
- package/dist/buildmyiq/pages/authoring/_forms.d.ts +44 -0
- package/dist/buildmyiq/pages/authoring/_forms.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/_forms.js +54 -0
- package/dist/buildmyiq/pages/authoring/_forms.js.map +1 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts +4 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.js +97 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.js.map +1 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts +4 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +354 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -0
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts +4 -0
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js +363 -0
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js +339 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js.map +1 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts +4 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +303 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js.map +1 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts +4 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.js +187 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.js +230 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.js.map +1 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js +433 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js.map +1 -0
- package/dist/buildmyiq/types/index.d.ts +382 -0
- package/dist/buildmyiq/types/index.d.ts.map +1 -0
- package/dist/buildmyiq/types/index.js +44 -0
- package/dist/buildmyiq/types/index.js.map +1 -0
- package/dist/buildmyiq/utils/cn.d.ts +4 -0
- package/dist/buildmyiq/utils/cn.d.ts.map +1 -0
- package/dist/buildmyiq/utils/cn.js +10 -0
- package/dist/buildmyiq/utils/cn.js.map +1 -0
- package/dist/buildmyiq/utils/formatters.d.ts +33 -0
- package/dist/buildmyiq/utils/formatters.d.ts.map +1 -0
- package/dist/buildmyiq/utils/formatters.js +62 -0
- package/dist/buildmyiq/utils/formatters.js.map +1 -0
- package/dist/buildmyiq/utils/i18n.d.ts +6 -0
- package/dist/buildmyiq/utils/i18n.d.ts.map +1 -0
- package/dist/buildmyiq/utils/index.d.ts +9 -0
- package/dist/buildmyiq/utils/index.d.ts.map +1 -0
- package/dist/buildmyiq/utils/navigation.d.ts +14 -0
- package/dist/buildmyiq/utils/navigation.d.ts.map +1 -0
- package/dist/buildmyiq/utils/navigation.js +2 -1
- package/dist/buildmyiq/utils/navigation.js.map +1 -1
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -4
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +3 -3
- package/dist/buildmyiq/BuildMyIQRoot.js +0 -329
- package/dist/buildmyiq/BuildMyIQRoot.js.map +0 -1
- package/dist/buildmyiq/BuildMyIQRoutes.js +0 -171
- package/dist/buildmyiq/BuildMyIQRoutes.js.map +0 -1
- package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.js +0 -271
- package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.js +0 -212
- package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AdminAdminUsersPagePage.js +0 -235
- package/dist/buildmyiq/pages/AdminAdminUsersPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AdminIndexPage.js +0 -274
- package/dist/buildmyiq/pages/AdminIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/AiAichatPagePage.js +0 -209
- package/dist/buildmyiq/pages/AiAichatPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.js +0 -318
- package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AiAitutoringPagePage.js +0 -290
- package/dist/buildmyiq/pages/AiAitutoringPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AiIndexPage.js +0 -191
- package/dist/buildmyiq/pages/AiIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.js +0 -290
- package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.js +0 -215
- package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.js +0 -224
- package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.js +0 -174
- package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.js.map +0 -1
- package/dist/buildmyiq/pages/AssessmentsIndexPage.js +0 -174
- package/dist/buildmyiq/pages/AssessmentsIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/CalendarPage.js +0 -242
- package/dist/buildmyiq/pages/CalendarPage.js.map +0 -1
- package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.js +0 -180
- package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CommunicationForumsPagePage.js +0 -154
- package/dist/buildmyiq/pages/CommunicationForumsPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CommunicationIndexPage.js +0 -191
- package/dist/buildmyiq/pages/CommunicationIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/CommunicationMessagesPagePage.js +0 -261
- package/dist/buildmyiq/pages/CommunicationMessagesPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesCourseContentPagePage.js +0 -164
- package/dist/buildmyiq/pages/CoursesCourseContentPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.js +0 -239
- package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.js +0 -368
- package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.js +0 -219
- package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesCourseListPagePage.js +0 -153
- package/dist/buildmyiq/pages/CoursesCourseListPagePage.js.map +0 -1
- package/dist/buildmyiq/pages/CoursesIndexPage.js +0 -138
- package/dist/buildmyiq/pages/CoursesIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/MessagesPage.js +0 -261
- package/dist/buildmyiq/pages/MessagesPage.js.map +0 -1
- package/dist/buildmyiq/pages/ProfileProgressPage.js +0 -194
- package/dist/buildmyiq/pages/ProfileProgressPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingAnalyticsPage.js +0 -243
- package/dist/buildmyiq/pages/TeachingAnalyticsPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingContentPage.js +0 -165
- package/dist/buildmyiq/pages/TeachingContentPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingCoursesPage.js +0 -151
- package/dist/buildmyiq/pages/TeachingCoursesPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingGradingPage.js +0 -204
- package/dist/buildmyiq/pages/TeachingGradingPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingIndexPage.js +0 -220
- package/dist/buildmyiq/pages/TeachingIndexPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingLessonPlansPage.js +0 -157
- package/dist/buildmyiq/pages/TeachingLessonPlansPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingQuestionsPage.js +0 -184
- package/dist/buildmyiq/pages/TeachingQuestionsPage.js.map +0 -1
- package/dist/buildmyiq/pages/TeachingStudentsPage.js +0 -204
- package/dist/buildmyiq/pages/TeachingStudentsPage.js.map +0 -1
- package/dist/buildmyiq/providers/BuildMyIQProvider.js +0 -27
- package/dist/buildmyiq/providers/BuildMyIQProvider.js.map +0 -1
- package/dist/buildmyiq/store/buildmyiqStore.js +0 -1160
- package/dist/buildmyiq/store/buildmyiqStore.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuildmyiqRoot.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/BuildmyiqRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAmBhC,OAAO,KAAK,EAAE,kBAAkB,EAAW,MAAM,SAAS,CAAC;AAY3D,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAqHhD,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { joinPath as e } from "./utils/navigation.js";
|
|
2
|
+
import { BuildmyiqProvider as t } from "./context/BuildmyiqContext.js";
|
|
3
|
+
import { BuildmyiqRoutes as n } from "./BuildmyiqRoutes.js";
|
|
4
|
+
import { useCallback as r, useEffect as i } from "react";
|
|
5
|
+
import { QueryClient as a, QueryClientProvider as o } from "@tanstack/react-query";
|
|
6
|
+
import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
7
|
+
import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { Award as l, BookOpen as u, CheckSquare as d, ClipboardCheck as f, GraduationCap as p, LayoutDashboard as m, PencilRuler as h, Target as g, Users as _ } from "lucide-react";
|
|
9
|
+
import { jsx as v } from "react/jsx-runtime";
|
|
10
|
+
//#region src/buildmyiq/BuildmyiqRoot.tsx
|
|
11
|
+
var y = new a({ defaultOptions: { queries: {
|
|
12
|
+
staleTime: 300 * 1e3,
|
|
13
|
+
retry: 1,
|
|
14
|
+
refetchOnWindowFocus: !1
|
|
15
|
+
} } }), b = (a) => {
|
|
16
|
+
let { registerNavItems: b, registerFooterItems: x, basePath: S = "/" } = a, { t: C } = c(), w = r((e, t) => {
|
|
17
|
+
let n = C(e);
|
|
18
|
+
return n === e ? t : n;
|
|
19
|
+
}, [C]);
|
|
20
|
+
return i(() => {
|
|
21
|
+
if (b) return b([
|
|
22
|
+
{
|
|
23
|
+
id: "buildmyiq-dashboard",
|
|
24
|
+
label: w("buildmyiq.nav.dashboard", "Dashboard"),
|
|
25
|
+
path: e(S, ""),
|
|
26
|
+
icon: /* @__PURE__ */ v(m, { size: 20 }),
|
|
27
|
+
order: 0,
|
|
28
|
+
group: "products"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "buildmyiq-catalog",
|
|
32
|
+
label: w("buildmyiq.nav.catalog", "Catalog"),
|
|
33
|
+
path: e(S, "catalog"),
|
|
34
|
+
icon: /* @__PURE__ */ v(u, { size: 20 }),
|
|
35
|
+
order: 1,
|
|
36
|
+
group: "products"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "buildmyiq-learning",
|
|
40
|
+
label: w("buildmyiq.nav.learning", "My Learning"),
|
|
41
|
+
path: e(S, "learning"),
|
|
42
|
+
icon: /* @__PURE__ */ v(p, { size: 20 }),
|
|
43
|
+
order: 2,
|
|
44
|
+
group: "products"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "buildmyiq-authoring",
|
|
48
|
+
label: w("buildmyiq.nav.authoring", "Authoring"),
|
|
49
|
+
path: e(S, "authoring"),
|
|
50
|
+
icon: /* @__PURE__ */ v(h, { size: 20 }),
|
|
51
|
+
order: 3,
|
|
52
|
+
group: "products"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "buildmyiq-assessments",
|
|
56
|
+
label: w("buildmyiq.nav.assessments", "Assessments"),
|
|
57
|
+
path: e(S, "assessments"),
|
|
58
|
+
icon: /* @__PURE__ */ v(f, { size: 20 }),
|
|
59
|
+
order: 4,
|
|
60
|
+
group: "products"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "buildmyiq-submissions",
|
|
64
|
+
label: w("buildmyiq.nav.submissions", "Grading"),
|
|
65
|
+
path: e(S, "submissions"),
|
|
66
|
+
icon: /* @__PURE__ */ v(d, { size: 20 }),
|
|
67
|
+
order: 5,
|
|
68
|
+
group: "products"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "buildmyiq-cohorts",
|
|
72
|
+
label: w("buildmyiq.nav.cohorts", "Cohorts"),
|
|
73
|
+
path: e(S, "cohorts"),
|
|
74
|
+
icon: /* @__PURE__ */ v(_, { size: 20 }),
|
|
75
|
+
order: 6,
|
|
76
|
+
group: "products"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: "buildmyiq-skills",
|
|
80
|
+
label: w("buildmyiq.nav.skills", "Skills"),
|
|
81
|
+
path: e(S, "skills"),
|
|
82
|
+
icon: /* @__PURE__ */ v(g, { size: 20 }),
|
|
83
|
+
order: 7,
|
|
84
|
+
group: "products"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "buildmyiq-certificates",
|
|
88
|
+
label: w("buildmyiq.nav.certificates", "Certificates"),
|
|
89
|
+
path: e(S, "certificates"),
|
|
90
|
+
icon: /* @__PURE__ */ v(l, { size: 20 }),
|
|
91
|
+
order: 8,
|
|
92
|
+
group: "products"
|
|
93
|
+
}
|
|
94
|
+
]);
|
|
95
|
+
}, [
|
|
96
|
+
b,
|
|
97
|
+
S,
|
|
98
|
+
w
|
|
99
|
+
]), i(() => {
|
|
100
|
+
if (x) return x([{
|
|
101
|
+
id: "buildmyiq-status",
|
|
102
|
+
label: w("buildmyiq.footer.ready", "BuildMyIQ Ready"),
|
|
103
|
+
type: "status",
|
|
104
|
+
section: "left",
|
|
105
|
+
order: 10
|
|
106
|
+
}]);
|
|
107
|
+
}, [x, w]), /* @__PURE__ */ v(o, {
|
|
108
|
+
client: y,
|
|
109
|
+
children: /* @__PURE__ */ v(s, {
|
|
110
|
+
workspaceId: null,
|
|
111
|
+
gateway: "global",
|
|
112
|
+
defaultEnabled: !0,
|
|
113
|
+
children: /* @__PURE__ */ v(t, {
|
|
114
|
+
...a,
|
|
115
|
+
children: /* @__PURE__ */ v(n, {})
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
export { b as BuildmyiqRoot };
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=BuildmyiqRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuildmyiqRoot.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoot.tsx"],"sourcesContent":["/**\n * Buildmyiq Root Component\n * @module buildmyiq\n *\n * Host-contract entry point. Registers the product's sidebar nav (nine sections\n * that map 1:1 to the wspace-buildmyiq-svc `bui*` backend) and mounts the routed\n * pages inside the shared QueryClient + FeatureFlag providers.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n LayoutDashboard,\n BookOpen,\n GraduationCap,\n PencilRuler,\n ClipboardCheck,\n CheckSquare,\n Users,\n Target,\n Award,\n} from 'lucide-react';\nimport { BuildmyiqProvider } from './context/BuildmyiqContext';\nimport { BuildmyiqRoutes } from './BuildmyiqRoutes';\nimport { joinPath } from './utils/navigation';\nimport type { BuildmyiqRootProps, NavItem } from './types';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport const BuildmyiqRoot: FC<BuildmyiqRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Register navigation items with the shell on mount. Ids/paths/orders match\n // the app-shell static NavRegistration block so the two are a single,\n // consistent source of truth.\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'buildmyiq-dashboard',\n label: t('buildmyiq.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 0,\n group: 'products',\n },\n {\n id: 'buildmyiq-catalog',\n label: t('buildmyiq.nav.catalog', 'Catalog'),\n path: joinPath(basePath, 'catalog'),\n icon: <BookOpen size={20} />,\n order: 1,\n group: 'products',\n },\n {\n id: 'buildmyiq-learning',\n label: t('buildmyiq.nav.learning', 'My Learning'),\n path: joinPath(basePath, 'learning'),\n icon: <GraduationCap size={20} />,\n order: 2,\n group: 'products',\n },\n {\n id: 'buildmyiq-authoring',\n label: t('buildmyiq.nav.authoring', 'Authoring'),\n path: joinPath(basePath, 'authoring'),\n icon: <PencilRuler size={20} />,\n order: 3,\n group: 'products',\n },\n {\n id: 'buildmyiq-assessments',\n label: t('buildmyiq.nav.assessments', 'Assessments'),\n path: joinPath(basePath, 'assessments'),\n icon: <ClipboardCheck size={20} />,\n order: 4,\n group: 'products',\n },\n {\n id: 'buildmyiq-submissions',\n label: t('buildmyiq.nav.submissions', 'Grading'),\n path: joinPath(basePath, 'submissions'),\n icon: <CheckSquare size={20} />,\n order: 5,\n group: 'products',\n },\n {\n id: 'buildmyiq-cohorts',\n label: t('buildmyiq.nav.cohorts', 'Cohorts'),\n path: joinPath(basePath, 'cohorts'),\n icon: <Users size={20} />,\n order: 6,\n group: 'products',\n },\n {\n id: 'buildmyiq-skills',\n label: t('buildmyiq.nav.skills', 'Skills'),\n path: joinPath(basePath, 'skills'),\n icon: <Target size={20} />,\n order: 7,\n group: 'products',\n },\n {\n id: 'buildmyiq-certificates',\n label: t('buildmyiq.nav.certificates', 'Certificates'),\n path: joinPath(basePath, 'certificates'),\n icon: <Award size={20} />,\n order: 8,\n group: 'products',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath, t]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n return registerFooterItems([\n {\n id: 'buildmyiq-status',\n label: t('buildmyiq.footer.ready', 'BuildMyIQ Ready'),\n type: 'status',\n section: 'left',\n order: 10,\n },\n ]);\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <BuildmyiqProvider {...props}>\n <BuildmyiqRoutes />\n </BuildmyiqProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;;;;;AA8BA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,MAAS;CACpB,OAAO;CACP,sBAAsB;CACvB,EACF,EACF,CAAC,EAEW,KAAyC,MAAU;CAC9D,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,GAAG,MAAc,GAAS,EAC5B,IAAI,GACP,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAU,CACZ;AAmGD,QA9FA,QAAgB;AACT,QA6EL,QAAO,EA3EqB;GAC1B;IACE,IAAI;IACJ,OAAO,EAAE,2BAA2B,YAAY;IAChD,MAAM,EAAS,GAAU,GAAG;IAC5B,MAAM,kBAAC,GAAD,EAAiB,MAAM,IAAM,CAAA;IACnC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,yBAAyB,UAAU;IAC5C,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,0BAA0B,cAAc;IACjD,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA;IACjC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,2BAA2B,YAAY;IAChD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,cAAc;IACpD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IAClC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,6BAA6B,UAAU;IAChD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,yBAAyB,UAAU;IAC5C,MAAM,EAAS,GAAU,UAAU;IACnC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,wBAAwB,SAAS;IAC1C,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;IAC1B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,8BAA8B,eAAe;IACtD,MAAM,EAAS,GAAU,eAAe;IACxC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACF,CAEgC;IAChC;EAAC;EAAkB;EAAU;EAAE,CAAC,EAEnC,QAAgB;AACT,QACL,QAAO,EAAoB,CACzB;GACE,IAAI;GACJ,OAAO,EAAE,0BAA0B,kBAAkB;GACrD,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF,CAAC;IACD,CAAC,GAAqB,EAAE,CAAC,EAG1B,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAAmB,GAAI;cACrB,kBAAC,GAAD,EAAmB,CAAA;IACD,CAAA;GACA,CAAA;EACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuildmyiqRoutes.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAoEhD,eAAO,MAAM,eAAe,EAAE,EA4C7B,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useBuildmyiq as e } from "./context/BuildmyiqContext.js";
|
|
2
|
+
import { DashboardPage as t } from "./pages/DashboardPage.js";
|
|
3
|
+
import { Suspense as n, lazy as r } from "react";
|
|
4
|
+
import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-router-dom";
|
|
5
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { Spinner as u } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/buildmyiq/BuildmyiqRoutes.tsx
|
|
8
|
+
var d = r(() => import("./pages/catalog/CatalogPage.js").then((e) => ({ default: e.CatalogPage }))), f = r(() => import("./pages/catalog/CourseDetailPage.js").then((e) => ({ default: e.CourseDetailPage }))), p = r(() => import("./pages/learning/MyLearningPage.js").then((e) => ({ default: e.MyLearningPage }))), m = r(() => import("./pages/learning/LessonPlayerPage.js").then((e) => ({ default: e.LessonPlayerPage }))), h = r(() => import("./pages/authoring/AuthoringPage.js").then((e) => ({ default: e.AuthoringPage }))), g = r(() => import("./pages/authoring/CourseBuilderPage.js").then((e) => ({ default: e.CourseBuilderPage }))), _ = r(() => import("./pages/assessments/AssessmentsPage.js").then((e) => ({ default: e.AssessmentsPage }))), v = r(() => import("./pages/assessments/AssessmentDetailPage.js").then((e) => ({ default: e.AssessmentDetailPage }))), y = r(() => import("./pages/submissions/SubmissionsPage.js").then((e) => ({ default: e.SubmissionsPage }))), b = r(() => import("./pages/cohorts/CohortsPage.js").then((e) => ({ default: e.CohortsPage }))), x = r(() => import("./pages/skills/SkillsPage.js").then((e) => ({ default: e.SkillsPage }))), S = r(() => import("./pages/certificates/CertificatesPage.js").then((e) => ({ default: e.CertificatesPage }))), C = () => /* @__PURE__ */ c("div", {
|
|
9
|
+
className: "flex min-h-[400px] items-center justify-center",
|
|
10
|
+
children: /* @__PURE__ */ c(u, { size: "lg" })
|
|
11
|
+
}), w = () => {
|
|
12
|
+
let { basePath: r, isStandalone: u } = e(), w = s(), T = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
|
|
13
|
+
return T && !u && !(w.pathname === T || w.pathname.startsWith(T + "/")) ? null : /* @__PURE__ */ c("div", {
|
|
14
|
+
className: "flex min-h-full flex-col",
|
|
15
|
+
children: /* @__PURE__ */ c(n, {
|
|
16
|
+
fallback: /* @__PURE__ */ c(C, {}),
|
|
17
|
+
children: /* @__PURE__ */ l(o, { children: [
|
|
18
|
+
/* @__PURE__ */ c(a, {
|
|
19
|
+
index: !0,
|
|
20
|
+
element: /* @__PURE__ */ c(t, {})
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ c(a, {
|
|
23
|
+
path: "catalog",
|
|
24
|
+
element: /* @__PURE__ */ c(d, {})
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ c(a, {
|
|
27
|
+
path: "catalog/:courseId",
|
|
28
|
+
element: /* @__PURE__ */ c(f, {})
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ c(a, {
|
|
31
|
+
path: "learning",
|
|
32
|
+
element: /* @__PURE__ */ c(p, {})
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ c(a, {
|
|
35
|
+
path: "learning/:enrollmentId",
|
|
36
|
+
element: /* @__PURE__ */ c(m, {})
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ c(a, {
|
|
39
|
+
path: "authoring",
|
|
40
|
+
element: /* @__PURE__ */ c(h, {})
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ c(a, {
|
|
43
|
+
path: "authoring/:courseId",
|
|
44
|
+
element: /* @__PURE__ */ c(g, {})
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ c(a, {
|
|
47
|
+
path: "assessments",
|
|
48
|
+
element: /* @__PURE__ */ c(_, {})
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ c(a, {
|
|
51
|
+
path: "assessments/:assessmentId",
|
|
52
|
+
element: /* @__PURE__ */ c(v, {})
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ c(a, {
|
|
55
|
+
path: "submissions",
|
|
56
|
+
element: /* @__PURE__ */ c(y, {})
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ c(a, {
|
|
59
|
+
path: "cohorts",
|
|
60
|
+
element: /* @__PURE__ */ c(b, {})
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ c(a, {
|
|
63
|
+
path: "skills",
|
|
64
|
+
element: /* @__PURE__ */ c(x, {})
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ c(a, {
|
|
67
|
+
path: "certificates",
|
|
68
|
+
element: /* @__PURE__ */ c(S, {})
|
|
69
|
+
}),
|
|
70
|
+
/* @__PURE__ */ c(a, {
|
|
71
|
+
path: "*",
|
|
72
|
+
element: /* @__PURE__ */ c(i, {
|
|
73
|
+
to: T || "/",
|
|
74
|
+
replace: !0
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
] })
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { w as BuildmyiqRoutes };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=BuildmyiqRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuildmyiqRoutes.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"sourcesContent":["/**\n * Buildmyiq Routes\n * @module buildmyiq\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `bui*` backend capability.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context/BuildmyiqContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Catalog (learner-facing course discovery + detail + enrol)\nconst CatalogPage = lazy(() =>\n import('./pages/catalog/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CourseDetailPage = lazy(() =>\n import('./pages/catalog/CourseDetailPage').then((m) => ({ default: m.CourseDetailPage }))\n);\n\n// My Learning (enrollments + progress + lesson player)\nconst MyLearningPage = lazy(() =>\n import('./pages/learning/MyLearningPage').then((m) => ({ default: m.MyLearningPage }))\n);\nconst LessonPlayerPage = lazy(() =>\n import('./pages/learning/LessonPlayerPage').then((m) => ({ default: m.LessonPlayerPage }))\n);\n\n// Authoring (instructor course management + builder)\nconst AuthoringPage = lazy(() =>\n import('./pages/authoring/AuthoringPage').then((m) => ({ default: m.AuthoringPage }))\n);\nconst CourseBuilderPage = lazy(() =>\n import('./pages/authoring/CourseBuilderPage').then((m) => ({ default: m.CourseBuilderPage }))\n);\n\n// Assessments (list + builder/questions/detail)\nconst AssessmentsPage = lazy(() =>\n import('./pages/assessments/AssessmentsPage').then((m) => ({ default: m.AssessmentsPage }))\n);\nconst AssessmentDetailPage = lazy(() =>\n import('./pages/assessments/AssessmentDetailPage').then((m) => ({\n default: m.AssessmentDetailPage,\n }))\n);\n\n// Grading (submissions queue)\nconst SubmissionsPage = lazy(() =>\n import('./pages/submissions/SubmissionsPage').then((m) => ({ default: m.SubmissionsPage }))\n);\n\n// Cohorts\nconst CohortsPage = lazy(() =>\n import('./pages/cohorts/CohortsPage').then((m) => ({ default: m.CohortsPage }))\n);\n\n// Skills taxonomy\nconst SkillsPage = lazy(() =>\n import('./pages/skills/SkillsPage').then((m) => ({ default: m.SkillsPage }))\n);\n\n// Certificates\nconst CertificatesPage = lazy(() =>\n import('./pages/certificates/CertificatesPage').then((m) => ({ default: m.CertificatesPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const BuildmyiqRoutes: FC = () => {\n const { basePath, isStandalone } = useBuildmyiq();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardPage />} />\n\n <Route path=\"catalog\" element={<CatalogPage />} />\n <Route path=\"catalog/:courseId\" element={<CourseDetailPage />} />\n\n <Route path=\"learning\" element={<MyLearningPage />} />\n <Route path=\"learning/:enrollmentId\" element={<LessonPlayerPage />} />\n\n <Route path=\"authoring\" element={<AuthoringPage />} />\n <Route path=\"authoring/:courseId\" element={<CourseBuilderPage />} />\n\n <Route path=\"assessments\" element={<AssessmentsPage />} />\n <Route path=\"assessments/:assessmentId\" element={<AssessmentDetailPage />} />\n\n <Route path=\"submissions\" element={<SubmissionsPage />} />\n <Route path=\"cohorts\" element={<CohortsPage />} />\n <Route path=\"skills\" element={<SkillsPage />} />\n <Route path=\"certificates\" element={<CertificatesPage />} />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAiBA,IAAM,IAAc,QAClB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAChF,EACK,IAAmB,QACvB,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC1F,EAGK,IAAiB,QACrB,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CACvF,EACK,IAAmB,QACvB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC3F,EAGK,IAAgB,QACpB,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CACtF,EACK,IAAoB,QACxB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAC9F,EAGK,IAAkB,QACtB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC5F,EACK,IAAuB,QAC3B,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,sBACZ,EAAE,CACJ,EAGK,IAAkB,QACtB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC5F,EAGK,IAAc,QAClB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAChF,EAGK,IAAa,QACjB,OAAO,gCAA6B,MAAM,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAC7E,EAGK,IAAmB,QACvB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/F,EAEK,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,GAAD,EAAS,MAAK,MAAO,CAAA;CACjB,CAAA,EAGK,UAA4B;CACvC,IAAM,EAAE,aAAU,oBAAiB,GAAc,EAC3C,IAAW,GAAa,EAExB,IAAqB,MAAa,MAAM,MAAM,KAAY,IAAI,QAAQ,OAAO,GAAG;AAYtF,QATI,KAAsB,CAAC,KAIrB,EAFF,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,IAAI,IAE/C,OAKT,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;aAChC,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAO,OAAA;KAAM,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAE3C,kBAAC,GAAD;KAAO,MAAK;KAAU,SAAS,kBAAC,GAAD,EAAe,CAAA;KAAI,CAAA;IAClD,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAAoB,CAAA;KAAI,CAAA;IAEjE,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,EAAkB,CAAA;KAAI,CAAA;IACtD,kBAAC,GAAD;KAAO,MAAK;KAAyB,SAAS,kBAAC,GAAD,EAAoB,CAAA;KAAI,CAAA;IAEtE,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IACtD,kBAAC,GAAD;KAAO,MAAK;KAAsB,SAAS,kBAAC,GAAD,EAAqB,CAAA;KAAI,CAAA;IAEpE,kBAAC,GAAD;KAAO,MAAK;KAAc,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAC1D,kBAAC,GAAD;KAAO,MAAK;KAA4B,SAAS,kBAAC,GAAD,EAAwB,CAAA;KAAI,CAAA;IAE7E,kBAAC,GAAD;KAAO,MAAK;KAAc,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAC1D,kBAAC,GAAD;KAAO,MAAK;KAAU,SAAS,kBAAC,GAAD,EAAe,CAAA;KAAI,CAAA;IAClD,kBAAC,GAAD;KAAO,MAAK;KAAS,SAAS,kBAAC,GAAD,EAAc,CAAA;KAAI,CAAA;IAChD,kBAAC,GAAD;KAAO,MAAK;KAAe,SAAS,kBAAC,GAAD,EAAoB,CAAA;KAAI,CAAA;IAE5D,kBAAC,GAAD;KAAO,MAAK;KAAI,SAAS,kBAAC,GAAD;MAAU,IAAI,KAAsB;MAAK,SAAA;MAAU,CAAA;KAAI,CAAA;IACzE,EAAA,CAAA;GACA,CAAA;EACP,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BuiDiscussion — a comment thread on any Buildmyiq entity (Integration B).
|
|
3
|
+
* @module buildmyiq/components/BuiDiscussion
|
|
4
|
+
*
|
|
5
|
+
* Reuses the platform EntityComment API (`getEntityComments` /
|
|
6
|
+
* `createEntityComment`) keyed by `(entityType, entityId)` — no buildmyiq-svc change.
|
|
7
|
+
* Renders root comments (author, body, time) + a composer. Robust to empty
|
|
8
|
+
* state and errors.
|
|
9
|
+
*/
|
|
10
|
+
interface BuiDiscussionProps {
|
|
11
|
+
entityType: string;
|
|
12
|
+
entityId: string;
|
|
13
|
+
title?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function BuiDiscussion({ entityType, entityId, title, description, }: BuiDiscussionProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=BuiDiscussion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiDiscussion.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/components/BuiDiscussion.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,QAAQ,EACR,KAAoB,EACpB,WAAkE,GACnE,EAAE,kBAAkB,2CAoGpB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { useBuildmyiq as e } from "../context/BuildmyiqContext.js";
|
|
2
|
+
import { formatDateTime as t } from "../utils/formatters.js";
|
|
3
|
+
import { EmptyState as n } from "./EmptyState.js";
|
|
4
|
+
import { ErrorView as r, LoadingView as i, Section as a } from "./StateViews.js";
|
|
5
|
+
import "../context/index.js";
|
|
6
|
+
import { useBuiComments as o, useEcoCreateComment as s } from "../hooks/useBuiComments.js";
|
|
7
|
+
import "../hooks/index.js";
|
|
8
|
+
import { useState as c } from "react";
|
|
9
|
+
import { MessageSquare as l, Send as u } from "lucide-react";
|
|
10
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
11
|
+
import { Button as p, Textarea as m } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
//#region src/buildmyiq/components/BuiDiscussion.tsx
|
|
13
|
+
function h(e) {
|
|
14
|
+
if (!e) return "You";
|
|
15
|
+
let t = [e.firstName, e.lastName].filter(Boolean).join(" ").trim();
|
|
16
|
+
return e.name || t || e.username || e.email || "You";
|
|
17
|
+
}
|
|
18
|
+
function g(e) {
|
|
19
|
+
let t = e.trim();
|
|
20
|
+
return t ? t[0].toUpperCase() : "?";
|
|
21
|
+
}
|
|
22
|
+
function _({ entityType: _, entityId: v, title: y = "Discussion", description: b = "Coordinate review and verification with your team." }) {
|
|
23
|
+
let { currentUser: x } = e(), { data: S, isLoading: C, isError: w, refetch: T } = o(_, v), E = s(_, v), [D, O] = c(""), [k, A] = c(null), j = h(x), M = (e) => x?.id && e.authorId === x.id ? j : "Workspace member", N = async () => {
|
|
24
|
+
let e = D.trim();
|
|
25
|
+
if (e) {
|
|
26
|
+
A(null);
|
|
27
|
+
try {
|
|
28
|
+
await E.mutateAsync(e), O("");
|
|
29
|
+
} catch (e) {
|
|
30
|
+
A(e instanceof Error ? e.message : "Failed to post comment.");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}, P = S?.items ?? [];
|
|
34
|
+
return /* @__PURE__ */ d(a, {
|
|
35
|
+
title: y,
|
|
36
|
+
description: b,
|
|
37
|
+
children: /* @__PURE__ */ f("div", {
|
|
38
|
+
className: "rounded-xl border border-border-seam bg-bg-surface/40 p-4",
|
|
39
|
+
children: [/* @__PURE__ */ f("div", {
|
|
40
|
+
className: "flex gap-3",
|
|
41
|
+
children: [/* @__PURE__ */ d("div", {
|
|
42
|
+
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/15 text-sm font-semibold text-action-primary-bg",
|
|
43
|
+
children: g(j)
|
|
44
|
+
}), /* @__PURE__ */ f("div", {
|
|
45
|
+
className: "flex-1",
|
|
46
|
+
children: [/* @__PURE__ */ d(m, {
|
|
47
|
+
value: D,
|
|
48
|
+
onChange: (e) => O(e.target.value),
|
|
49
|
+
placeholder: "Add a comment for your team…",
|
|
50
|
+
rows: 2
|
|
51
|
+
}), /* @__PURE__ */ f("div", {
|
|
52
|
+
className: "mt-2 flex items-center justify-end gap-2",
|
|
53
|
+
children: [k && /* @__PURE__ */ d("span", {
|
|
54
|
+
className: "mr-auto text-xs text-status-error-text",
|
|
55
|
+
children: k
|
|
56
|
+
}), /* @__PURE__ */ f(p, {
|
|
57
|
+
size: "sm",
|
|
58
|
+
onClick: N,
|
|
59
|
+
disabled: !D.trim() || E.isPending,
|
|
60
|
+
children: [/* @__PURE__ */ d(u, { className: "mr-1.5 h-4 w-4" }), E.isPending ? "Posting…" : "Comment"]
|
|
61
|
+
})]
|
|
62
|
+
})]
|
|
63
|
+
})]
|
|
64
|
+
}), /* @__PURE__ */ d("div", {
|
|
65
|
+
className: "mt-4 border-t border-border-seam pt-4",
|
|
66
|
+
children: C ? /* @__PURE__ */ d(i, { label: "Loading discussion…" }) : w ? /* @__PURE__ */ d(r, {
|
|
67
|
+
message: "Couldn't load the discussion.",
|
|
68
|
+
onRetry: () => T()
|
|
69
|
+
}) : P.length === 0 ? /* @__PURE__ */ d(n, {
|
|
70
|
+
illustration: "empty-data",
|
|
71
|
+
icon: /* @__PURE__ */ d(l, { className: "h-9 w-9" }),
|
|
72
|
+
title: "No comments yet",
|
|
73
|
+
description: "Start the discussion by adding the first comment."
|
|
74
|
+
}) : /* @__PURE__ */ d("ul", {
|
|
75
|
+
className: "flex flex-col gap-4",
|
|
76
|
+
children: P.map((e) => {
|
|
77
|
+
let n = M(e), r = e.content.text ?? e.content.markdown ?? "";
|
|
78
|
+
return /* @__PURE__ */ f("li", {
|
|
79
|
+
className: "flex gap-3",
|
|
80
|
+
children: [/* @__PURE__ */ d("div", {
|
|
81
|
+
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-secondary",
|
|
82
|
+
children: g(n)
|
|
83
|
+
}), /* @__PURE__ */ f("div", {
|
|
84
|
+
className: "min-w-0 flex-1",
|
|
85
|
+
children: [/* @__PURE__ */ f("div", {
|
|
86
|
+
className: "flex flex-wrap items-baseline gap-x-2",
|
|
87
|
+
children: [/* @__PURE__ */ d("span", {
|
|
88
|
+
className: "text-sm font-semibold text-text-primary",
|
|
89
|
+
children: n
|
|
90
|
+
}), /* @__PURE__ */ f("span", {
|
|
91
|
+
className: "text-xs text-text-tertiary",
|
|
92
|
+
children: [t(e.createdAt), e.edited ? " · edited" : ""]
|
|
93
|
+
})]
|
|
94
|
+
}), /* @__PURE__ */ d("p", {
|
|
95
|
+
className: "mt-0.5 whitespace-pre-wrap break-words text-sm text-text-secondary",
|
|
96
|
+
children: r
|
|
97
|
+
})]
|
|
98
|
+
})]
|
|
99
|
+
}, e.id);
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
})]
|
|
103
|
+
})
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
export { _ as BuiDiscussion };
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=BuiDiscussion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiDiscussion.js","names":[],"sources":["../../../src/buildmyiq/components/BuiDiscussion.tsx"],"sourcesContent":["/**\n * BuiDiscussion — a comment thread on any Buildmyiq entity (Integration B).\n * @module buildmyiq/components/BuiDiscussion\n *\n * Reuses the platform EntityComment API (`getEntityComments` /\n * `createEntityComment`) keyed by `(entityType, entityId)` — no buildmyiq-svc change.\n * Renders root comments (author, body, time) + a composer. Robust to empty\n * state and errors.\n */\n\nimport { useState } from 'react';\nimport { MessageSquare, Send } from 'lucide-react';\nimport { Button, Textarea } from '@burdenoff/fe-libs/ui';\nimport { Section, LoadingView, ErrorView } from './StateViews';\nimport { EmptyState } from './EmptyState';\nimport { useBuildmyiq } from '../context';\nimport { useBuiComments, useEcoCreateComment, type BuiComment } from '../hooks';\nimport { formatDateTime } from '../utils/formatters';\n\ninterface BuiDiscussionProps {\n entityType: string;\n entityId: string;\n title?: string;\n description?: string;\n}\n\nfunction displayName(user: ReturnType<typeof useBuildmyiq>['currentUser']): string {\n if (!user) return 'You';\n const full = [user.firstName, user.lastName].filter(Boolean).join(' ').trim();\n return user.name || full || user.username || user.email || 'You';\n}\n\nfunction initialFor(label: string): string {\n const trimmed = label.trim();\n return trimmed ? trimmed[0]!.toUpperCase() : '?';\n}\n\nexport function BuiDiscussion({\n entityType,\n entityId,\n title = 'Discussion',\n description = 'Coordinate review and verification with your team.',\n}: BuiDiscussionProps) {\n const { currentUser } = useBuildmyiq();\n const { data, isLoading, isError, refetch } = useBuiComments(entityType, entityId);\n const createComment = useEcoCreateComment(entityType, entityId);\n\n const [draft, setDraft] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const selfName = displayName(currentUser);\n\n const authorLabel = (comment: BuiComment): string =>\n currentUser?.id && comment.authorId === currentUser.id ? selfName : 'Workspace member';\n\n const handleSubmit = async () => {\n const text = draft.trim();\n if (!text) return;\n setError(null);\n try {\n await createComment.mutateAsync(text);\n setDraft('');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to post comment.');\n }\n };\n\n const comments = data?.items ?? [];\n\n return (\n <Section title={title} description={description}>\n <div className=\"rounded-xl border border-border-seam bg-bg-surface/40 p-4\">\n {/* Composer */}\n <div className=\"flex gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/15 text-sm font-semibold text-action-primary-bg\">\n {initialFor(selfName)}\n </div>\n <div className=\"flex-1\">\n <Textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n placeholder=\"Add a comment for your team…\"\n rows={2}\n />\n <div className=\"mt-2 flex items-center justify-end gap-2\">\n {error && <span className=\"mr-auto text-xs text-status-error-text\">{error}</span>}\n <Button\n size=\"sm\"\n onClick={handleSubmit}\n disabled={!draft.trim() || createComment.isPending}\n >\n <Send className=\"mr-1.5 h-4 w-4\" />\n {createComment.isPending ? 'Posting…' : 'Comment'}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Thread */}\n <div className=\"mt-4 border-t border-border-seam pt-4\">\n {isLoading ? (\n <LoadingView label=\"Loading discussion…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load the discussion.\" onRetry={() => refetch()} />\n ) : comments.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<MessageSquare className=\"h-9 w-9\" />}\n title=\"No comments yet\"\n description=\"Start the discussion by adding the first comment.\"\n />\n ) : (\n <ul className=\"flex flex-col gap-4\">\n {comments.map((comment) => {\n const label = authorLabel(comment);\n const body = comment.content.text ?? comment.content.markdown ?? '';\n return (\n <li key={comment.id} className=\"flex gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-secondary\">\n {initialFor(label)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-2\">\n <span className=\"text-sm font-semibold text-text-primary\">{label}</span>\n <span className=\"text-xs text-text-tertiary\">\n {formatDateTime(comment.createdAt)}\n {comment.edited ? ' · edited' : ''}\n </span>\n </div>\n <p className=\"mt-0.5 whitespace-pre-wrap break-words text-sm text-text-secondary\">\n {body}\n </p>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </Section>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAS,EAAY,GAA8D;AACjF,KAAI,CAAC,EAAM,QAAO;CAClB,IAAM,IAAO,CAAC,EAAK,WAAW,EAAK,SAAS,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM;AAC7E,QAAO,EAAK,QAAQ,KAAQ,EAAK,YAAY,EAAK,SAAS;;AAG7D,SAAS,EAAW,GAAuB;CACzC,IAAM,IAAU,EAAM,MAAM;AAC5B,QAAO,IAAU,EAAQ,GAAI,aAAa,GAAG;;AAG/C,SAAgB,EAAc,EAC5B,eACA,aACA,WAAQ,cACR,iBAAc,wDACO;CACrB,IAAM,EAAE,mBAAgB,GAAc,EAChC,EAAE,SAAM,cAAW,YAAS,eAAY,EAAe,GAAY,EAAS,EAC5E,IAAgB,EAAoB,GAAY,EAAS,EAEzD,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAO,KAAY,EAAwB,KAAK,EAEjD,IAAW,EAAY,EAAY,EAEnC,KAAe,MACnB,GAAa,MAAM,EAAQ,aAAa,EAAY,KAAK,IAAW,oBAEhE,IAAe,YAAY;EAC/B,IAAM,IAAO,EAAM,MAAM;AACpB,SACL;KAAS,KAAK;AACd,OAAI;AAEF,IADA,MAAM,EAAc,YAAY,EAAK,EACrC,EAAS,GAAG;YACL,GAAK;AACZ,MAAS,aAAe,QAAQ,EAAI,UAAU,0BAA0B;;;IAItE,IAAW,GAAM,SAAS,EAAE;AAElC,QACE,kBAAC,GAAD;EAAgB;EAAoB;YAClC,kBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAW,EAAS;KACjB,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;MACzC,aAAY;MACZ,MAAM;MACN,CAAA,EACF,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,KAAS,kBAAC,QAAD;OAAM,WAAU;iBAA0C;OAAa,CAAA,EACjF,kBAAC,GAAD;OACE,MAAK;OACL,SAAS;OACT,UAAU,CAAC,EAAM,MAAM,IAAI,EAAc;iBAH3C,CAKE,kBAAC,GAAD,EAAM,WAAU,kBAAmB,CAAA,EAClC,EAAc,YAAY,aAAa,UACjC;SACL;QACF;OACF;OAGN,kBAAC,OAAD;IAAK,WAAU;cACZ,IACC,kBAAC,GAAD,EAAa,OAAM,uBAAwB,CAAA,GACzC,IACF,kBAAC,GAAD;KAAW,SAAQ;KAAgC,eAAe,GAAS;KAAI,CAAA,GAC7E,EAAS,WAAW,IACtB,kBAAC,GAAD;KACE,cAAa;KACb,MAAM,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;KAC3C,OAAM;KACN,aAAY;KACZ,CAAA,GAEF,kBAAC,MAAD;KAAI,WAAU;eACX,EAAS,KAAK,MAAY;MACzB,IAAM,IAAQ,EAAY,EAAQ,EAC5B,IAAO,EAAQ,QAAQ,QAAQ,EAAQ,QAAQ,YAAY;AACjE,aACE,kBAAC,MAAD;OAAqB,WAAU;iBAA/B,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAW,EAAM;QACd,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAA2C;UAAa,CAAA,EACxE,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CACG,EAAe,EAAQ,UAAU,EACjC,EAAQ,SAAS,cAAc,GAC3B;YACH;YACN,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,CACA;UACH;SAhBI,EAAQ,GAgBZ;OAEP;KACC,CAAA;IAEH,CAAA,CACF;;EACE,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BuiTags — a lightweight tag control for Buildmyiq entities (Integration C).
|
|
3
|
+
* @module buildmyiq/components/BuiTags
|
|
4
|
+
*
|
|
5
|
+
* The buildmyiq svc exposes no tags field, so this drives the platform tag store
|
|
6
|
+
* directly: `getEntityTags` (display), `searchTags` (+ `createTag`) to pick or
|
|
7
|
+
* create, `assignTag`/`removeTagAssignment` to link — all via the workspace
|
|
8
|
+
* gateway. No buildmyiq-svc change.
|
|
9
|
+
*/
|
|
10
|
+
interface BuiTagsProps {
|
|
11
|
+
entityType: string;
|
|
12
|
+
entityId: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function BuiTags({ entityType, entityId, label }: BuiTagsProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=BuiTags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiTags.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/components/BuiTags.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAc,EAAE,EAAE,YAAY,2CAuL7E"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { useEcoAssignTag as e, useEcoCreateAndAssignTag as t, useEcoEntityTags as n, useEcoRemoveTagAssignment as r, useEcoTagSearch as i } from "../hooks/useBuiTags.js";
|
|
2
|
+
import "../hooks/index.js";
|
|
3
|
+
import { useEffect as a, useState as o } from "react";
|
|
4
|
+
import { Loader2 as s, Plus as c, Tag as l, X as u } from "lucide-react";
|
|
5
|
+
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
6
|
+
import { Button as m, Input as h, Popover as g, PopoverContent as _, PopoverTrigger as v, Spinner as y } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/buildmyiq/components/BuiTags.tsx
|
|
8
|
+
function b({ entityType: b, entityId: x, label: S = "Tags" }) {
|
|
9
|
+
let C = n(b, x), w = e(b, x), T = r(b, x), E = t(b, x), [D, O] = o(!1), [k, A] = o(""), [j, M] = o(""), [N, P] = o(null);
|
|
10
|
+
a(() => {
|
|
11
|
+
let e = setTimeout(() => M(k), 250);
|
|
12
|
+
return () => clearTimeout(e);
|
|
13
|
+
}, [k]);
|
|
14
|
+
let F = i(j), I = C.data ?? [], L = new Set(I.map((e) => e.tag.id)), R = j.trim(), z = (F.data ?? []).filter((e) => !L.has(e.id)), B = R.length > 0 && [...I.map((e) => e.tag.label), ...(F.data ?? []).map((e) => e.label)].some((e) => e.toLowerCase() === R.toLowerCase()), V = R.length > 0 && !B, H = w.isPending || E.isPending, U = () => {
|
|
15
|
+
A(""), M(""), P(null);
|
|
16
|
+
}, W = async (e) => {
|
|
17
|
+
P(null);
|
|
18
|
+
try {
|
|
19
|
+
await w.mutateAsync(e), U(), O(!1);
|
|
20
|
+
} catch (e) {
|
|
21
|
+
P(e instanceof Error ? e.message : "Failed to add tag.");
|
|
22
|
+
}
|
|
23
|
+
}, G = async () => {
|
|
24
|
+
if (R) {
|
|
25
|
+
P(null);
|
|
26
|
+
try {
|
|
27
|
+
await E.mutateAsync(R), U(), O(!1);
|
|
28
|
+
} catch (e) {
|
|
29
|
+
P(e instanceof Error ? e.message : "Failed to create tag.");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}, K = async (e) => {
|
|
33
|
+
P(null);
|
|
34
|
+
try {
|
|
35
|
+
await T.mutateAsync(e);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
P(e instanceof Error ? e.message : "Failed to remove tag.");
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return /* @__PURE__ */ p("div", { children: [
|
|
41
|
+
/* @__PURE__ */ f("p", {
|
|
42
|
+
className: "mb-1.5 text-xs text-text-tertiary",
|
|
43
|
+
children: S
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ p("div", {
|
|
46
|
+
className: "flex flex-wrap items-center gap-2",
|
|
47
|
+
children: [C.isLoading ? /* @__PURE__ */ p("span", {
|
|
48
|
+
className: "inline-flex items-center gap-1.5 text-sm text-text-tertiary",
|
|
49
|
+
children: [/* @__PURE__ */ f(s, { className: "h-3.5 w-3.5 animate-spin" }), " Loading tags…"]
|
|
50
|
+
}) : I.map((e) => /* @__PURE__ */ p("span", {
|
|
51
|
+
className: "inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary",
|
|
52
|
+
children: [
|
|
53
|
+
e.tag.color ? /* @__PURE__ */ f("span", {
|
|
54
|
+
className: "h-2 w-2 shrink-0 rounded-full",
|
|
55
|
+
style: { backgroundColor: e.tag.color },
|
|
56
|
+
"aria-hidden": !0
|
|
57
|
+
}) : /* @__PURE__ */ f(l, { className: "h-3 w-3 text-text-tertiary" }),
|
|
58
|
+
/* @__PURE__ */ f("span", {
|
|
59
|
+
className: "max-w-[10rem] truncate",
|
|
60
|
+
children: e.tag.label
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ f("button", {
|
|
63
|
+
type: "button",
|
|
64
|
+
onClick: () => K(e.id),
|
|
65
|
+
disabled: T.isPending,
|
|
66
|
+
"aria-label": `Remove tag ${e.tag.label}`,
|
|
67
|
+
className: "rounded-full p-0.5 text-text-tertiary hover:bg-bg-canvas hover:text-text-primary",
|
|
68
|
+
children: /* @__PURE__ */ f(u, { className: "h-3 w-3" })
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
}, e.id)), /* @__PURE__ */ p(g, {
|
|
72
|
+
open: D,
|
|
73
|
+
onOpenChange: (e) => {
|
|
74
|
+
O(e), e || U();
|
|
75
|
+
},
|
|
76
|
+
children: [/* @__PURE__ */ f(v, {
|
|
77
|
+
asChild: !0,
|
|
78
|
+
children: /* @__PURE__ */ p(m, {
|
|
79
|
+
size: "sm",
|
|
80
|
+
variant: "outline",
|
|
81
|
+
className: "h-7 gap-1 px-2 text-xs",
|
|
82
|
+
children: [/* @__PURE__ */ f(c, { className: "h-3.5 w-3.5" }), " Add tag"]
|
|
83
|
+
})
|
|
84
|
+
}), /* @__PURE__ */ p(_, {
|
|
85
|
+
align: "start",
|
|
86
|
+
className: "w-64 p-2",
|
|
87
|
+
children: [/* @__PURE__ */ f(h, {
|
|
88
|
+
autoFocus: !0,
|
|
89
|
+
value: k,
|
|
90
|
+
onChange: (e) => A(e.target.value),
|
|
91
|
+
placeholder: "Search or create a tag…",
|
|
92
|
+
className: "h-8"
|
|
93
|
+
}), /* @__PURE__ */ f("div", {
|
|
94
|
+
className: "mt-2 max-h-56 overflow-y-auto",
|
|
95
|
+
children: F.isFetching && R.length > 0 ? /* @__PURE__ */ p("div", {
|
|
96
|
+
className: "flex items-center gap-2 px-1 py-2 text-sm text-text-tertiary",
|
|
97
|
+
children: [/* @__PURE__ */ f(y, { size: "sm" }), " Searching…"]
|
|
98
|
+
}) : /* @__PURE__ */ p(d, { children: [
|
|
99
|
+
z.map((e) => /* @__PURE__ */ p("button", {
|
|
100
|
+
type: "button",
|
|
101
|
+
onClick: () => W(e.id),
|
|
102
|
+
disabled: H,
|
|
103
|
+
className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-text-secondary hover:bg-bg-sunken disabled:opacity-60",
|
|
104
|
+
children: [e.color ? /* @__PURE__ */ f("span", {
|
|
105
|
+
className: "h-2 w-2 shrink-0 rounded-full",
|
|
106
|
+
style: { backgroundColor: e.color },
|
|
107
|
+
"aria-hidden": !0
|
|
108
|
+
}) : /* @__PURE__ */ f(l, { className: "h-3.5 w-3.5 text-text-tertiary" }), /* @__PURE__ */ f("span", {
|
|
109
|
+
className: "truncate",
|
|
110
|
+
children: e.label
|
|
111
|
+
})]
|
|
112
|
+
}, e.id)),
|
|
113
|
+
V && /* @__PURE__ */ p("button", {
|
|
114
|
+
type: "button",
|
|
115
|
+
onClick: G,
|
|
116
|
+
disabled: H,
|
|
117
|
+
className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-action-primary-bg hover:bg-bg-sunken disabled:opacity-60",
|
|
118
|
+
children: [/* @__PURE__ */ f(c, { className: "h-3.5 w-3.5 shrink-0" }), /* @__PURE__ */ p("span", {
|
|
119
|
+
className: "truncate",
|
|
120
|
+
children: [
|
|
121
|
+
"Create “",
|
|
122
|
+
R,
|
|
123
|
+
"”"
|
|
124
|
+
]
|
|
125
|
+
})]
|
|
126
|
+
}),
|
|
127
|
+
!V && z.length === 0 && R.length > 0 && /* @__PURE__ */ f("p", {
|
|
128
|
+
className: "px-2 py-2 text-sm text-text-tertiary",
|
|
129
|
+
children: "Already added."
|
|
130
|
+
}),
|
|
131
|
+
R.length === 0 && /* @__PURE__ */ f("p", {
|
|
132
|
+
className: "px-2 py-2 text-sm text-text-tertiary",
|
|
133
|
+
children: "Type to search existing tags or create a new one."
|
|
134
|
+
})
|
|
135
|
+
] })
|
|
136
|
+
})]
|
|
137
|
+
})]
|
|
138
|
+
})]
|
|
139
|
+
}),
|
|
140
|
+
N && /* @__PURE__ */ f("p", {
|
|
141
|
+
className: "mt-1.5 text-xs text-status-error-text",
|
|
142
|
+
children: N
|
|
143
|
+
})
|
|
144
|
+
] });
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { b as BuiTags };
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=BuiTags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiTags.js","names":[],"sources":["../../../src/buildmyiq/components/BuiTags.tsx"],"sourcesContent":["/**\n * BuiTags — a lightweight tag control for Buildmyiq entities (Integration C).\n * @module buildmyiq/components/BuiTags\n *\n * The buildmyiq svc exposes no tags field, so this drives the platform tag store\n * directly: `getEntityTags` (display), `searchTags` (+ `createTag`) to pick or\n * create, `assignTag`/`removeTagAssignment` to link — all via the workspace\n * gateway. No buildmyiq-svc change.\n */\n\nimport { useEffect, useState } from 'react';\nimport { Loader2, Plus, Tag as TagIcon, X } from 'lucide-react';\nimport {\n Button,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport {\n useEcoEntityTags,\n useEcoTagSearch,\n useEcoAssignTag,\n useEcoRemoveTagAssignment,\n useEcoCreateAndAssignTag,\n} from '../hooks';\n\ninterface BuiTagsProps {\n entityType: string;\n entityId: string;\n label?: string;\n}\n\nexport function BuiTags({ entityType, entityId, label = 'Tags' }: BuiTagsProps) {\n const tags = useEcoEntityTags(entityType, entityId);\n const assign = useEcoAssignTag(entityType, entityId);\n const remove = useEcoRemoveTagAssignment(entityType, entityId);\n const createAndAssign = useEcoCreateAndAssignTag(entityType, entityId);\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [debounced, setDebounced] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(query), 250);\n return () => clearTimeout(timer);\n }, [query]);\n\n const search = useEcoTagSearch(debounced);\n\n const assignments = tags.data ?? [];\n const assignedIds = new Set(assignments.map((a) => a.tag.id));\n const q = debounced.trim();\n const searchResults = (search.data ?? []).filter((t) => !assignedIds.has(t.id));\n const hasExact =\n q.length > 0 &&\n [...assignments.map((a) => a.tag.label), ...(search.data ?? []).map((t) => t.label)].some(\n (l) => l.toLowerCase() === q.toLowerCase()\n );\n const showCreate = q.length > 0 && !hasExact;\n const busy = assign.isPending || createAndAssign.isPending;\n\n const resetInput = () => {\n setQuery('');\n setDebounced('');\n setError(null);\n };\n\n const handleAssign = async (tagId: string) => {\n setError(null);\n try {\n await assign.mutateAsync(tagId);\n resetInput();\n setOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add tag.');\n }\n };\n\n const handleCreate = async () => {\n if (!q) return;\n setError(null);\n try {\n await createAndAssign.mutateAsync(q);\n resetInput();\n setOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create tag.');\n }\n };\n\n const handleRemove = async (assignmentId: string) => {\n setError(null);\n try {\n await remove.mutateAsync(assignmentId);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove tag.');\n }\n };\n\n return (\n <div>\n <p className=\"mb-1.5 text-xs text-text-tertiary\">{label}</p>\n <div className=\"flex flex-wrap items-center gap-2\">\n {tags.isLoading ? (\n <span className=\"inline-flex items-center gap-1.5 text-sm text-text-tertiary\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> Loading tags…\n </span>\n ) : (\n assignments.map((assignment) => (\n <span\n key={assignment.id}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary\"\n >\n {assignment.tag.color ? (\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: assignment.tag.color }}\n aria-hidden\n />\n ) : (\n <TagIcon className=\"h-3 w-3 text-text-tertiary\" />\n )}\n <span className=\"max-w-[10rem] truncate\">{assignment.tag.label}</span>\n <button\n type=\"button\"\n onClick={() => handleRemove(assignment.id)}\n disabled={remove.isPending}\n aria-label={`Remove tag ${assignment.tag.label}`}\n className=\"rounded-full p-0.5 text-text-tertiary hover:bg-bg-canvas hover:text-text-primary\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))\n )}\n\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) resetInput();\n }}\n >\n <PopoverTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 gap-1 px-2 text-xs\">\n <Plus className=\"h-3.5 w-3.5\" /> Add tag\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 p-2\">\n <Input\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search or create a tag…\"\n className=\"h-8\"\n />\n <div className=\"mt-2 max-h-56 overflow-y-auto\">\n {search.isFetching && q.length > 0 ? (\n <div className=\"flex items-center gap-2 px-1 py-2 text-sm text-text-tertiary\">\n <Spinner size=\"sm\" /> Searching…\n </div>\n ) : (\n <>\n {searchResults.map((tag) => (\n <button\n key={tag.id}\n type=\"button\"\n onClick={() => handleAssign(tag.id)}\n disabled={busy}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-text-secondary hover:bg-bg-sunken disabled:opacity-60\"\n >\n {tag.color ? (\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: tag.color }}\n aria-hidden\n />\n ) : (\n <TagIcon className=\"h-3.5 w-3.5 text-text-tertiary\" />\n )}\n <span className=\"truncate\">{tag.label}</span>\n </button>\n ))}\n\n {showCreate && (\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={busy}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-action-primary-bg hover:bg-bg-sunken disabled:opacity-60\"\n >\n <Plus className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">Create “{q}”</span>\n </button>\n )}\n\n {!showCreate && searchResults.length === 0 && q.length > 0 && (\n <p className=\"px-2 py-2 text-sm text-text-tertiary\">Already added.</p>\n )}\n {q.length === 0 && (\n <p className=\"px-2 py-2 text-sm text-text-tertiary\">\n Type to search existing tags or create a new one.\n </p>\n )}\n </>\n )}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n\n {error && <p className=\"mt-1.5 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface Column<T> {
|
|
4
|
+
key: string;
|
|
5
|
+
header: ReactNode;
|
|
6
|
+
render: (row: T) => ReactNode;
|
|
7
|
+
align?: 'left' | 'right' | 'center';
|
|
8
|
+
className?: string;
|
|
9
|
+
/** Hide below the `md` breakpoint for a mobile-friendly layout. */
|
|
10
|
+
hideOnMobile?: boolean;
|
|
11
|
+
/** Provide to make this column click-sortable (returns a comparable value). */
|
|
12
|
+
sortValue?: (row: T) => string | number;
|
|
13
|
+
}
|
|
14
|
+
interface DataTableProps<T> {
|
|
15
|
+
columns: Column<T>[];
|
|
16
|
+
rows: T[];
|
|
17
|
+
rowKey: (row: T) => string;
|
|
18
|
+
onRowClick?: (row: T) => void;
|
|
19
|
+
className?: string;
|
|
20
|
+
/** Default sort: a column key + direction. */
|
|
21
|
+
defaultSort?: {
|
|
22
|
+
key: string;
|
|
23
|
+
dir: 'asc' | 'desc';
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare function DataTable<T>({ columns, rows, rowKey, onRowClick, className, defaultSort, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=DataTable.d.ts.map
|