@burdenoff/microfe-buildmyiq 2026.512.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 +8 -4
- package/dist/buildmyiq/index.d.ts.map +1 -1
- package/dist/buildmyiq/index.js +6 -3
- package/dist/buildmyiq/pages/DashboardPage.d.ts +3 -1
- package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -1
- 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 +343 -12
- package/dist/buildmyiq/types/index.d.ts.map +1 -1
- package/dist/buildmyiq/types/index.js +44 -0
- package/dist/buildmyiq/types/index.js.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 +12 -0
- package/dist/buildmyiq/utils/navigation.d.ts.map +1 -1
- package/dist/buildmyiq/utils/navigation.js +2 -1
- package/dist/buildmyiq/utils/navigation.js.map +1 -1
- 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.d.ts +0 -5
- package/dist/buildmyiq/BuildMyIQRoot.d.ts.map +0 -1
- package/dist/buildmyiq/BuildMyIQRoot.js +0 -329
- package/dist/buildmyiq/BuildMyIQRoot.js.map +0 -1
- package/dist/buildmyiq/BuildMyIQRoutes.d.ts +0 -2
- package/dist/buildmyiq/BuildMyIQRoutes.d.ts.map +0 -1
- package/dist/buildmyiq/BuildMyIQRoutes.js +0 -171
- package/dist/buildmyiq/BuildMyIQRoutes.js.map +0 -1
- package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.d.ts +0 -2
- package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AdminAdminUsersPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AdminIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AiAichatPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AiAitutoringPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AiIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/AssessmentsIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CalendarPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CommunicationForumsPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CommunicationIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CommunicationMessagesPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesCourseContentPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesCourseListPagePage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/CoursesIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/MessagesPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/ProfileProgressPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingAnalyticsPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingContentPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingCoursesPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingGradingPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingIndexPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingLessonPlansPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingQuestionsPage.d.ts.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.d.ts +0 -2
- package/dist/buildmyiq/pages/TeachingStudentsPage.d.ts.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.d.ts +0 -6
- package/dist/buildmyiq/providers/BuildMyIQProvider.d.ts.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.d.ts +0 -189
- package/dist/buildmyiq/store/buildmyiqStore.d.ts.map +0 -1
- package/dist/buildmyiq/store/buildmyiqStore.js +0 -1160
- package/dist/buildmyiq/store/buildmyiqStore.js.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -18199
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -43046
- package/dist/generated/wspace-types.d.ts.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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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
|