@arbor-education/design-system.components 4.6.0 → 4.7.0-alpha.0
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/.changeset/twenty-groups-wonder.md +5 -0
- package/.changeset/yellow-falcons-search.md +5 -0
- package/dist/components/button/Button.story.d.ts +47 -0
- package/dist/components/button/Button.story.d.ts.map +1 -0
- package/dist/components/button/Button.story.js +123 -0
- package/dist/components/button/Button.story.js.map +1 -0
- package/dist/components/button/ButtonUsageExample.d.ts +2 -0
- package/dist/components/button/ButtonUsageExample.d.ts.map +1 -0
- package/dist/components/button/ButtonUsageExample.js +11 -0
- package/dist/components/button/ButtonUsageExample.js.map +1 -0
- package/dist/components/combobox/useElementWidth.d.ts +2 -0
- package/dist/components/combobox/useElementWidth.d.ts.map +1 -0
- package/dist/components/combobox/useElementWidth.js +31 -0
- package/dist/components/combobox/useElementWidth.js.map +1 -0
- package/dist/components/combobox/useVisibleChips.d.ts +21 -0
- package/dist/components/combobox/useVisibleChips.d.ts.map +1 -0
- package/dist/components/combobox/useVisibleChips.js +59 -0
- package/dist/components/combobox/useVisibleChips.js.map +1 -0
- package/dist/components/combobox/useVisibleChips.test.d.ts +2 -0
- package/dist/components/combobox/useVisibleChips.test.d.ts.map +1 -0
- package/dist/components/combobox/useVisibleChips.test.js +81 -0
- package/dist/components/combobox/useVisibleChips.test.js.map +1 -0
- package/dist/components/heading/HeadingInnerContainer.d.ts +5 -0
- package/dist/components/heading/HeadingInnerContainer.d.ts.map +1 -0
- package/dist/components/heading/HeadingInnerContainer.js +7 -0
- package/dist/components/heading/HeadingInnerContainer.js.map +1 -0
- package/dist/components/icoText/IcoText.d.ts +37 -0
- package/dist/components/icoText/IcoText.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.js +29 -0
- package/dist/components/icoText/IcoText.js.map +1 -0
- package/dist/components/icoText/IcoText.stories.d.ts +60 -0
- package/dist/components/icoText/IcoText.stories.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.stories.js +319 -0
- package/dist/components/icoText/IcoText.stories.js.map +1 -0
- package/dist/components/icoText/IcoText.test.d.ts +2 -0
- package/dist/components/icoText/IcoText.test.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.test.js +27 -0
- package/dist/components/icoText/IcoText.test.js.map +1 -0
- package/dist/components/pill/Pill.d.ts.map +1 -1
- package/dist/components/pill/Pill.js +1 -1
- package/dist/components/pill/Pill.js.map +1 -1
- package/dist/components/sidebarNav/SidebarNav.d.ts +46 -0
- package/dist/components/sidebarNav/SidebarNav.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNav.js +102 -0
- package/dist/components/sidebarNav/SidebarNav.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNav.stories.d.ts +61 -0
- package/dist/components/sidebarNav/SidebarNav.stories.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNav.stories.js +253 -0
- package/dist/components/sidebarNav/SidebarNav.stories.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNav.test.d.ts +2 -0
- package/dist/components/sidebarNav/SidebarNav.test.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNav.test.js +240 -0
- package/dist/components/sidebarNav/SidebarNav.test.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavContext.d.ts +13 -0
- package/dist/components/sidebarNav/SidebarNavContext.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavContext.js +15 -0
- package/dist/components/sidebarNav/SidebarNavContext.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavGroup.d.ts +10 -0
- package/dist/components/sidebarNav/SidebarNavGroup.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavGroup.js +16 -0
- package/dist/components/sidebarNav/SidebarNavGroup.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavItem.d.ts +32 -0
- package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavItem.js +44 -0
- package/dist/components/sidebarNav/SidebarNavItem.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts +8 -0
- package/dist/components/sidebarNav/SidebarNavItemFavourite.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavItemFavourite.js +14 -0
- package/dist/components/sidebarNav/SidebarNavItemFavourite.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavPanel.d.ts +4 -0
- package/dist/components/sidebarNav/SidebarNavPanel.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavPanel.js +9 -0
- package/dist/components/sidebarNav/SidebarNavPanel.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts +10 -0
- package/dist/components/sidebarNav/SidebarNavPanelNav.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavPanelNav.js +21 -0
- package/dist/components/sidebarNav/SidebarNavPanelNav.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRail.d.ts +6 -0
- package/dist/components/sidebarNav/SidebarNavRail.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRail.js +7 -0
- package/dist/components/sidebarNav/SidebarNavRail.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailItem.d.ts +10 -0
- package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailItem.js +25 -0
- package/dist/components/sidebarNav/SidebarNavRailItem.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailList.d.ts +4 -0
- package/dist/components/sidebarNav/SidebarNavRailList.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailList.js +7 -0
- package/dist/components/sidebarNav/SidebarNavRailList.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts +6 -0
- package/dist/components/sidebarNav/SidebarNavRailSlot.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavRailSlot.js +7 -0
- package/dist/components/sidebarNav/SidebarNavRailSlot.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavSeparator.d.ts +6 -0
- package/dist/components/sidebarNav/SidebarNavSeparator.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavSeparator.js +8 -0
- package/dist/components/sidebarNav/SidebarNavSeparator.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTitle.d.ts +4 -0
- package/dist/components/sidebarNav/SidebarNavTitle.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTitle.js +7 -0
- package/dist/components/sidebarNav/SidebarNavTitle.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTooltip.d.ts +7 -0
- package/dist/components/sidebarNav/SidebarNavTooltip.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTooltip.js +9 -0
- package/dist/components/sidebarNav/SidebarNavTooltip.js.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTrigger.d.ts +8 -0
- package/dist/components/sidebarNav/SidebarNavTrigger.d.ts.map +1 -0
- package/dist/components/sidebarNav/SidebarNavTrigger.js +15 -0
- package/dist/components/sidebarNav/SidebarNavTrigger.js.map +1 -0
- package/dist/components/sidebarNav/index.d.ts +4 -0
- package/dist/components/sidebarNav/index.d.ts.map +1 -0
- package/dist/components/sidebarNav/index.js +3 -0
- package/dist/components/sidebarNav/index.js.map +1 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.d.ts +4 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.d.ts.map +1 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.js +43 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.js.map +1 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts +2 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.test.d.ts.map +1 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.test.js +52 -0
- package/dist/components/sidebarNav/resolvePanelItemProps.test.js.map +1 -0
- package/dist/components/sidebarNav/types.d.ts +100 -0
- package/dist/components/sidebarNav/types.d.ts.map +1 -0
- package/dist/components/sidebarNav/types.js +4 -0
- package/dist/components/sidebarNav/types.js.map +1 -0
- package/dist/components/sidebarNav/useControllableBoolean.d.ts +9 -0
- package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +1 -0
- package/dist/components/sidebarNav/useControllableBoolean.js +15 -0
- package/dist/components/sidebarNav/useControllableBoolean.js.map +1 -0
- package/dist/components/slideover/Slideover.stories.d.ts +10 -0
- package/dist/components/slideover/Slideover.stories.d.ts.map +1 -0
- package/dist/components/slideover/Slideover.stories.js +12 -0
- package/dist/components/slideover/Slideover.stories.js.map +1 -0
- package/dist/components/table/BulkActionsDropdown.d.ts +12 -0
- package/dist/components/table/BulkActionsDropdown.d.ts.map +1 -0
- package/dist/components/table/BulkActionsDropdown.js +11 -0
- package/dist/components/table/BulkActionsDropdown.js.map +1 -0
- package/dist/components/table/HideColumnsDropdown.d.ts +9 -0
- package/dist/components/table/HideColumnsDropdown.d.ts.map +1 -0
- package/dist/components/table/HideColumnsDropdown.js +33 -0
- package/dist/components/table/HideColumnsDropdown.js.map +1 -0
- package/dist/components/table/Table.d.ts +1 -1
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +0 -5
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/Table.test.js +0 -5
- package/dist/components/table/Table.test.js.map +1 -1
- package/dist/components/table/cellRenderers/SelectDropdownCellEditor.d.ts +8 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellEditor.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellEditor.js +19 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellEditor.js.map +1 -0
- package/dist/components/table/hooks/useHistory.d.ts +20 -0
- package/dist/components/table/hooks/useHistory.d.ts.map +1 -0
- package/dist/components/table/hooks/useHistory.js +73 -0
- package/dist/components/table/hooks/useHistory.js.map +1 -0
- package/dist/components/table/hooks/useTableHistory.d.ts +21 -0
- package/dist/components/table/hooks/useTableHistory.d.ts.map +1 -0
- package/dist/components/table/hooks/useTableHistory.js +88 -0
- package/dist/components/table/hooks/useTableHistory.js.map +1 -0
- package/dist/components/table/pagination/TableSettingsDropdown.d.ts +2 -0
- package/dist/components/table/pagination/TableSettingsDropdown.d.ts.map +1 -0
- package/dist/components/table/pagination/TableSettingsDropdown.js +42 -0
- package/dist/components/table/pagination/TableSettingsDropdown.js.map +1 -0
- package/dist/components/table/tableHeader/TableHeader.d.ts +14 -0
- package/dist/components/table/tableHeader/TableHeader.d.ts.map +1 -0
- package/dist/components/table/tableHeader/TableHeader.js +55 -0
- package/dist/components/table/tableHeader/TableHeader.js.map +1 -0
- package/dist/components/table/tableHeader/index.d.ts +2 -0
- package/dist/components/table/tableHeader/index.d.ts.map +1 -0
- package/dist/components/table/tableHeader/index.js +2 -0
- package/dist/components/table/tableHeader/index.js.map +1 -0
- package/dist/components/table/tableTheme.d.ts +2 -0
- package/dist/components/table/tableTheme.d.ts.map +1 -0
- package/dist/components/table/tableTheme.js +18 -0
- package/dist/components/table/tableTheme.js.map +1 -0
- package/dist/components/table/types.d.ts +169 -0
- package/dist/components/table/types.d.ts.map +1 -0
- package/dist/components/table/types.js +11 -0
- package/dist/components/table/types.js.map +1 -0
- package/dist/components/table/utils/setAgGridLicenseKey.d.ts +2 -0
- package/dist/components/table/utils/setAgGridLicenseKey.d.ts.map +1 -0
- package/dist/components/table/utils/setAgGridLicenseKey.js +11 -0
- package/dist/components/table/utils/setAgGridLicenseKey.js.map +1 -0
- package/dist/layoutTest.stories.d.ts +6 -0
- package/dist/layoutTest.stories.d.ts.map +1 -0
- package/dist/layoutTest.stories.js +9 -0
- package/dist/layoutTest.stories.js.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.d.ts +39 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.d.ts.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.js +112 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.js.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.stories.d.ts +184 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.stories.d.ts.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.stories.js +317 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.stories.js.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.test.d.ts +2 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.test.d.ts.map +1 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.test.js +160 -0
- package/dist/pages/assessmentBuilderPage/AssessmentBuilderPage.test.js.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.d.ts +11 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.d.ts.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.js +13 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.js.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.stories.d.ts +174 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.stories.d.ts.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.stories.js +212 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.stories.js.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.test.d.ts +2 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.test.d.ts.map +1 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.test.js +84 -0
- package/dist/pages/assessmentSettingsPage/AssessmentSettingsPage.test.js.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.d.ts +16 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.d.ts.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.js +31 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.js.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.stories.d.ts +162 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.stories.d.ts.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.stories.js +290 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.stories.js.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.test.d.ts +2 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.test.d.ts.map +1 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.test.js +109 -0
- package/dist/pages/assessmentsPage/AssessmentsPage.test.js.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.d.ts +40 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.d.ts.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.js +156 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.js.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.stories.d.ts +239 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.stories.d.ts.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.stories.js +318 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.stories.js.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.test.d.ts +2 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.test.d.ts.map +1 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.test.js +183 -0
- package/dist/pages/customReportWriterPage/CustomReportWriterPage.test.js.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.d.ts +26 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.d.ts.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.js +33 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.js.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.stories.d.ts +176 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.stories.d.ts.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.stories.js +237 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.stories.js.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.test.d.ts +2 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.test.d.ts.map +1 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.test.js +91 -0
- package/dist/pages/gradeSetsPage/GradeSetsPage.test.js.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.d.ts +48 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.d.ts.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.js +52 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.js.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.stories.d.ts +218 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.stories.d.ts.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.stories.js +273 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.stories.js.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.test.d.ts +2 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.test.d.ts.map +1 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.test.js +197 -0
- package/dist/pages/studentProfilePage/StudentProfilePage.test.js.map +1 -0
- package/dist/utils/PopupParentContext.d.ts +3 -0
- package/dist/utils/PopupParentContext.d.ts.map +1 -0
- package/dist/utils/PopupParentContext.js +6 -0
- package/dist/utils/PopupParentContext.js.map +1 -0
- package/dist/utils/PopupParentContext.stories.d.ts +17 -0
- package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
- package/dist/utils/PopupParentContext.stories.js +266 -0
- package/dist/utils/PopupParentContext.stories.js.map +1 -0
- package/dist/utils/getDefaultPopupParent.d.ts +2 -0
- package/dist/utils/getDefaultPopupParent.d.ts.map +1 -0
- package/dist/utils/getDefaultPopupParent.js +19 -0
- package/dist/utils/getDefaultPopupParent.js.map +1 -0
- package/package.json +4 -4
- package/src/components/pill/Pill.tsx +1 -0
- package/src/components/table/Table.stories.tsx +0 -5
- package/src/components/table/Table.test.tsx +0 -5
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { fn } from 'storybook/test';
|
|
2
|
+
import { CustomReportWriterPage } from './CustomReportWriterPage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Well, picture it: St. Olaf, 1989.
|
|
5
|
+
*
|
|
6
|
+
* Every year, the town hall would commission a big batch of reports - attendance
|
|
7
|
+
* of the yodeling classes, staff contracts for the eel wranglers, medical events
|
|
8
|
+
* from the annual lutefisk tasting incident. Old Sigrid Petersen was in charge
|
|
9
|
+
* of keeping track of them all, and she did it by stacking them in three different
|
|
10
|
+
* drawers: Active reports (currently useful), Archived reports (lovingly retired),
|
|
11
|
+
* and Expired reports (the ones that had gone stale because the student groups
|
|
12
|
+
* they referenced no longer existed). Every few months someone would open the
|
|
13
|
+
* Expired drawer and a warning note would fall out saying "Fix the filters, Sigrid!"
|
|
14
|
+
* It was very stressful. Poor Sigrid.
|
|
15
|
+
*
|
|
16
|
+
* The CustomReportWriterPage is the digital solution that would have saved Sigrid
|
|
17
|
+
* years of drawer-related anxiety. It is the main page for browsing and managing
|
|
18
|
+
* custom reports in the Arbor system - three clear tabs (Active, Archived, Expired),
|
|
19
|
+
* a warning banner about expired filters, a download dropdown, scheduling and
|
|
20
|
+
* duplication tooling, and a powerful AG Grid table showing all reports at a glance.
|
|
21
|
+
*
|
|
22
|
+
* **Features:**
|
|
23
|
+
* - Placeholder SVGs for TopNav and SideNav (app shell components not yet in library)
|
|
24
|
+
* - Composed breadcrumb navigation: School / Custom Report Writer
|
|
25
|
+
* - Page heading "Custom Report Writer - All Reports" with a "Create New Report" primary button
|
|
26
|
+
* - Placeholder SVG for Banner/Alert (no Banner component in library yet)
|
|
27
|
+
* - Tab navigation to switch between Active, Archived, and Expired views
|
|
28
|
+
* - AG Grid table with: checkbox selection, Title (text-link), Type (with icon), Created By,
|
|
29
|
+
* Context, Created Date, Modified Date, Accessed Date, and a row-actions dropdown (Duplicate / Edit)
|
|
30
|
+
* - Primary toolbar with: Download dropdown (CSV / PDF), Schedule, Duplicate, Edit buttons
|
|
31
|
+
* - Bulk actions toolbar with: BulkActionsDropdown, HideColumnsDropdown, Export, Settings, Help,
|
|
32
|
+
* and Expand Table icon buttons (all with tooltips)
|
|
33
|
+
* - Filter row footer with a funnel icon, live row count, and a "Change" text-link button
|
|
34
|
+
*
|
|
35
|
+
* **Tab behaviour:**
|
|
36
|
+
* - The Active tab is selected by default on first render
|
|
37
|
+
* - Tab state is managed internally via useState - no external wiring needed
|
|
38
|
+
* - All three tabs (Active, Archived, Expired) display the same `reports` array -
|
|
39
|
+
* the consuming application is responsible for passing the correct subset per tab
|
|
40
|
+
*
|
|
41
|
+
* **Placeholder SVG components:**
|
|
42
|
+
*
|
|
43
|
+
* | Placeholder | Reason |
|
|
44
|
+
* |------------------|---------------------------------------------------------------------|
|
|
45
|
+
* | TopNav | App shell component - not yet available in the design system library |
|
|
46
|
+
* | SideNavIcons | App shell component - not yet available in the design system library |
|
|
47
|
+
* | SideNavText | App shell component - not yet available in the design system library |
|
|
48
|
+
* | Banner | No Banner/Alert component in library yet |
|
|
49
|
+
*
|
|
50
|
+
* **Composed (not library) components:**
|
|
51
|
+
*
|
|
52
|
+
* | Interim pattern | Reason |
|
|
53
|
+
* |------------------|---------------------------------------------------------------------|
|
|
54
|
+
* | Breadcrumb nav | No Breadcrumbs component in library yet - composed with nav/ol/li |
|
|
55
|
+
*
|
|
56
|
+
* **Callbacks:**
|
|
57
|
+
* - `onCreateNewReport` - fired when the "Create New Report" header button is clicked
|
|
58
|
+
* - `onSchedule` - fired when the "Schedule" toolbar button is clicked
|
|
59
|
+
* - `onDuplicateSelected` - fired when the primary toolbar "Duplicate" button is clicked
|
|
60
|
+
* - `onEditSelected` - fired when the primary toolbar "Edit" button is clicked
|
|
61
|
+
* - `onDownloadCsv` - fired when "Download as CSV" is selected from the Download dropdown
|
|
62
|
+
* - `onDownloadPdf` - fired when "Download as PDF" is selected from the Download dropdown
|
|
63
|
+
* - `onChangeFilters` - fired when the "Change" text-link in the filter footer is clicked
|
|
64
|
+
* - `onOpenReport` - fired with the report id when a report title link in the table is clicked
|
|
65
|
+
* - `onDuplicateReport` - fired with the full ReportRow object when "Duplicate" is chosen in a row dropdown
|
|
66
|
+
* - `onEditReport` - fired with the full ReportRow object when "Edit" is chosen in a row dropdown
|
|
67
|
+
*
|
|
68
|
+
* **Accessibility:**
|
|
69
|
+
* - Breadcrumb uses `<nav aria-label="Breadcrumb">` with `aria-current="page"` on the current item
|
|
70
|
+
* - The separator chevrons have `aria-hidden="true"` so screen readers skip them
|
|
71
|
+
* - All icon-only buttons have `iconLeftScreenReaderText` for screen reader users
|
|
72
|
+
* - Tooltip wrappers provide visible labels for Export, Settings, Help, and Expand Table buttons
|
|
73
|
+
* - Page structure uses semantic `<main>`, `<header>`, and `<nav>` landmarks
|
|
74
|
+
* - All placeholder SVGs have `role="img"` with descriptive `aria-label` attributes
|
|
75
|
+
*/
|
|
76
|
+
const meta = {
|
|
77
|
+
title: 'Pages/CustomReportWriterPage',
|
|
78
|
+
component: CustomReportWriterPage,
|
|
79
|
+
parameters: {
|
|
80
|
+
layout: 'fullscreen',
|
|
81
|
+
docs: {
|
|
82
|
+
description: {
|
|
83
|
+
component: 'The Custom Report Writer page for browsing and managing custom reports across Active, Archived, and Expired views. Features a warning banner for expired filters, a Download dropdown, scheduling and duplication tooling, and an AG Grid table with per-row actions. App shell components (TopNav, SideNav) are represented as placeholder SVGs pending their implementation. Back in St. Olaf, Sigrid Petersen kept all her custom reports in three separate drawers and a warning note kept falling out of the Expired one. This page fixes all of that.',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
tags: ['autodocs'],
|
|
88
|
+
args: {
|
|
89
|
+
onCreateNewReport: fn(),
|
|
90
|
+
onSchedule: fn(),
|
|
91
|
+
onDuplicateSelected: fn(),
|
|
92
|
+
onEditSelected: fn(),
|
|
93
|
+
onDownloadCsv: fn(),
|
|
94
|
+
onDownloadPdf: fn(),
|
|
95
|
+
onChangeFilters: fn(),
|
|
96
|
+
onOpenReport: fn(),
|
|
97
|
+
onDuplicateReport: fn(),
|
|
98
|
+
onEditReport: fn(),
|
|
99
|
+
},
|
|
100
|
+
argTypes: {
|
|
101
|
+
reports: {
|
|
102
|
+
control: 'object',
|
|
103
|
+
description: 'The list of reports to display in the AG Grid table. Each report has an id, title, type, createdBy, context, createdDate, modifiedDate, and accessedDate. Defaults to a built-in set of six realistic example reports when not provided.',
|
|
104
|
+
},
|
|
105
|
+
bulkActions: {
|
|
106
|
+
control: 'object',
|
|
107
|
+
description: 'The list of bulk actions available in the BulkActionsDropdown toolbar. Each action has a displayName, a callback (receives the GridApi), and an optional disabled flag. Defaults to Archive and Delete actions.',
|
|
108
|
+
},
|
|
109
|
+
onCreateNewReport: {
|
|
110
|
+
description: 'Called when the "Create New Report" button in the page header is clicked. Wire this up to open a report creation form or navigate to a creation wizard.',
|
|
111
|
+
},
|
|
112
|
+
onSchedule: {
|
|
113
|
+
description: 'Called when the "Schedule" button in the primary toolbar is clicked. Use this to open a scheduling modal for the selected report(s).',
|
|
114
|
+
},
|
|
115
|
+
onDuplicateSelected: {
|
|
116
|
+
description: 'Called when the "Duplicate" button in the primary toolbar is clicked. Use this to duplicate the currently selected report row(s).',
|
|
117
|
+
},
|
|
118
|
+
onEditSelected: {
|
|
119
|
+
description: 'Called when the "Edit" button in the primary toolbar is clicked. Use this to open the edit form for the currently selected report row(s).',
|
|
120
|
+
},
|
|
121
|
+
onDownloadCsv: {
|
|
122
|
+
description: 'Called when "Download as CSV" is selected from the Download dropdown. Wire this up to trigger a CSV export of the current report data.',
|
|
123
|
+
},
|
|
124
|
+
onDownloadPdf: {
|
|
125
|
+
description: 'Called when "Download as PDF" is selected from the Download dropdown. Wire this up to trigger a PDF export of the current report data.',
|
|
126
|
+
},
|
|
127
|
+
onChangeFilters: {
|
|
128
|
+
description: 'Called when the "Change" text-link button in the filter footer row is clicked. Use this to open a filter configuration panel or modal.',
|
|
129
|
+
},
|
|
130
|
+
onOpenReport: {
|
|
131
|
+
description: 'Called with the report id (string) when a report title text-link is clicked in the table. Use this to navigate to the report detail or run the report.',
|
|
132
|
+
},
|
|
133
|
+
onDuplicateReport: {
|
|
134
|
+
description: 'Called with the full ReportRow object when "Duplicate" is selected from a row\'s actions dropdown (ellipsis menu). Use this to duplicate that specific report.',
|
|
135
|
+
},
|
|
136
|
+
onEditReport: {
|
|
137
|
+
description: 'Called with the full ReportRow object when "Edit" is selected from a row\'s actions dropdown (ellipsis menu). Use this to open the edit form for that specific report.',
|
|
138
|
+
},
|
|
139
|
+
className: {
|
|
140
|
+
control: 'text',
|
|
141
|
+
description: 'Optional additional CSS class name(s) to apply to the page root element.',
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
export default meta;
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Shared data fixtures - the finest custom reports this side of St. Olaf
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/**
|
|
150
|
+
* A small, realistic set of reports spanning different types and contexts.
|
|
151
|
+
* Enough to show the table working without overwhelming the viewer.
|
|
152
|
+
*/
|
|
153
|
+
const customReports = [
|
|
154
|
+
{
|
|
155
|
+
id: 'cr-1',
|
|
156
|
+
title: 'Year 11 Attendance Summary',
|
|
157
|
+
type: 'Student',
|
|
158
|
+
createdBy: 'Margaret Thornton',
|
|
159
|
+
context: 'Classes',
|
|
160
|
+
createdDate: '3rd Sep 2023',
|
|
161
|
+
modifiedDate: '14th Nov 2023',
|
|
162
|
+
accessedDate: '5th Feb 2026',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: 'cr-2',
|
|
166
|
+
title: 'Staff Absence Overview',
|
|
167
|
+
type: 'Staff',
|
|
168
|
+
createdBy: 'David Hughes',
|
|
169
|
+
context: 'Staff Contract Port',
|
|
170
|
+
createdDate: '15th Jan 2024',
|
|
171
|
+
modifiedDate: '22nd Jan 2024',
|
|
172
|
+
accessedDate: '10th Feb 2026',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: 'cr-3',
|
|
176
|
+
title: 'Whole School Behaviour Report',
|
|
177
|
+
type: 'School',
|
|
178
|
+
createdBy: 'Arbor Admin',
|
|
179
|
+
context: 'Single Group Staff',
|
|
180
|
+
createdDate: '1st Apr 2024',
|
|
181
|
+
modifiedDate: '1st Apr 2024',
|
|
182
|
+
accessedDate: '12th Jan 2026',
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
/**
|
|
186
|
+
* Bulk actions wired to fn() so they appear in the Actions panel.
|
|
187
|
+
* In a real integration these would call into the application logic.
|
|
188
|
+
*/
|
|
189
|
+
const customBulkActions = [
|
|
190
|
+
{
|
|
191
|
+
displayName: 'Archive',
|
|
192
|
+
callback: fn(),
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
displayName: 'Move to Folder',
|
|
196
|
+
callback: fn(),
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
displayName: 'Delete',
|
|
200
|
+
callback: fn(),
|
|
201
|
+
disabled: false,
|
|
202
|
+
},
|
|
203
|
+
];
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// Stories
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
/**
|
|
208
|
+
* The default state, using the component's built-in example reports.
|
|
209
|
+
*
|
|
210
|
+
* Oh, this is just like St. Olaf on a perfectly ordinary Tuesday! Everything
|
|
211
|
+
* is in its place, the reports are all there, the warning banner is kindly
|
|
212
|
+
* reminding you about those expired filters, and the three tabs are lined up
|
|
213
|
+
* waiting for you to choose: Active, Archived, or Expired.
|
|
214
|
+
*
|
|
215
|
+
* This story renders with no props at all (well, the callback `fn()` spies are
|
|
216
|
+
* there, but they come from the meta args). The component's own built-in default
|
|
217
|
+
* data takes over: six realistic example reports including attendance records,
|
|
218
|
+
* student contacts, school name stamps, aptitude reports, a staff contract port,
|
|
219
|
+
* and a medical events report. Just a lovely cross-section of school life.
|
|
220
|
+
*
|
|
221
|
+
* Things to try:
|
|
222
|
+
* - Click the "Active", "Archived", or "Expired" tabs to switch views
|
|
223
|
+
* - Click "Create New Report" to fire `onCreateNewReport` (see the Actions panel)
|
|
224
|
+
* - Click the "Download" dropdown to access CSV and PDF export options
|
|
225
|
+
* - Click any report title link to fire `onOpenReport` with that report's id
|
|
226
|
+
* - Click the ellipsis icon on any row to access "Duplicate" or "Edit" row actions
|
|
227
|
+
*/
|
|
228
|
+
export const Default = {
|
|
229
|
+
name: 'Default (Built-in Data)',
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* The page loaded with a custom set of reports.
|
|
233
|
+
*
|
|
234
|
+
* You know, this reminds me of the time in St. Olaf when the new school
|
|
235
|
+
* secretary, Ingrid Bergsen, came in and said "I'm going to reorganise all
|
|
236
|
+
* the reports my way." And she did! Three beautiful new reports: an attendance
|
|
237
|
+
* summary for Year 11, a staff absence overview, and a whole-school behaviour
|
|
238
|
+
* report. Each one was relevant, well-named, and lovingly created by a real
|
|
239
|
+
* person (well, two real people and Arbor Admin, but that counts).
|
|
240
|
+
*
|
|
241
|
+
* This story demonstrates passing your own `reports` array to the component.
|
|
242
|
+
* Three reports of different types (Student, Staff, School) are shown, each
|
|
243
|
+
* with a different creator and context. The Type column correctly shows the
|
|
244
|
+
* matching icon for each type - a person icon for Student and Staff, a house
|
|
245
|
+
* for School.
|
|
246
|
+
*
|
|
247
|
+
* Click any report title to fire `onOpenReport`. Use the ellipsis row dropdown
|
|
248
|
+
* to fire `onDuplicateReport` or `onEditReport` with the full report object.
|
|
249
|
+
*/
|
|
250
|
+
export const WithCustomReports = {
|
|
251
|
+
name: 'With Custom Reports',
|
|
252
|
+
args: {
|
|
253
|
+
reports: customReports,
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* The empty state - no reports have been created yet.
|
|
258
|
+
*
|
|
259
|
+
* Oh, this is like arriving at the St. Olaf town hall on the very first day
|
|
260
|
+
* before anyone has filed a single thing. The breadcrumbs are there, the header
|
|
261
|
+
* is gleaming, the three tabs are ready and waiting, the banner placeholder is still
|
|
262
|
+
* dutifully occupying its space (even though there are no expired filters yet,
|
|
263
|
+
* which is a little philosophical if you think about it), and the table
|
|
264
|
+
* is absolutely, beautifully empty. The AG Grid dutifully shows zero rows.
|
|
265
|
+
*
|
|
266
|
+
* This is your starting point. A fresh system with no custom reports yet.
|
|
267
|
+
* Click "Create New Report" to begin populating the list. The toolbar buttons
|
|
268
|
+
* and filter footer render correctly even with an empty table, so you can
|
|
269
|
+
* verify the overall page layout without needing any data.
|
|
270
|
+
*
|
|
271
|
+
* Notice that the warning banner still renders - in a real application you
|
|
272
|
+
* would likely hide it conditionally when there are no expired reports, but
|
|
273
|
+
* this story shows the full page chrome regardless so you can inspect every element.
|
|
274
|
+
*/
|
|
275
|
+
export const EmptyState = {
|
|
276
|
+
name: 'Empty State (No Reports)',
|
|
277
|
+
args: {
|
|
278
|
+
reports: [],
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* All callbacks wired to Storybook action spies so you can watch them fire.
|
|
283
|
+
*
|
|
284
|
+
* Back in St. Olaf, when something important happened - say, someone opened
|
|
285
|
+
* a report or clicked "Create New Report" - we would ring the town bell so
|
|
286
|
+
* the whole village knew. In Storybook, we use the Actions panel at the bottom
|
|
287
|
+
* of the screen instead! It is very much like a town bell, only quieter and
|
|
288
|
+
* with more TypeScript.
|
|
289
|
+
*
|
|
290
|
+
* Since all callbacks are already wired via `fn()` in the meta `args` above,
|
|
291
|
+
* every story technically has them. But this story is named "With Callbacks
|
|
292
|
+
* Logged" so it is easy to find when you want to specifically focus on testing
|
|
293
|
+
* the interaction wiring. It uses the custom report set so there is something
|
|
294
|
+
* interesting to interact with.
|
|
295
|
+
*
|
|
296
|
+
* Open the "Actions" panel at the bottom of Storybook and try these interactions:
|
|
297
|
+
* - Click "Create New Report" --> `onCreateNewReport` fires
|
|
298
|
+
* - Open the Download dropdown and click "Download as CSV" --> `onDownloadCsv` fires
|
|
299
|
+
* - Open the Download dropdown and click "Download as PDF" --> `onDownloadPdf` fires
|
|
300
|
+
* - Click the "Schedule" button --> `onSchedule` fires
|
|
301
|
+
* - Click the primary toolbar "Duplicate" --> `onDuplicateSelected` fires
|
|
302
|
+
* - Click the primary toolbar "Edit" --> `onEditSelected` fires
|
|
303
|
+
* - Click the "Change" link in the filter footer --> `onChangeFilters` fires
|
|
304
|
+
* - Click a report title text-link --> `onOpenReport` fires with the report id
|
|
305
|
+
* - Click an ellipsis row button and choose "Duplicate" --> `onDuplicateReport` fires with the ReportRow
|
|
306
|
+
* - Click an ellipsis row button and choose "Edit" --> `onEditReport` fires with the ReportRow
|
|
307
|
+
*
|
|
308
|
+
* It is most excellent for verifying integration with parent components or
|
|
309
|
+
* application routing logic, hunni!
|
|
310
|
+
*/
|
|
311
|
+
export const WithCallbacksLogged = {
|
|
312
|
+
name: 'With Callbacks Logged',
|
|
313
|
+
args: {
|
|
314
|
+
reports: customReports,
|
|
315
|
+
bulkActions: customBulkActions,
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=CustomReportWriterPage.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomReportWriterPage.stories.js","sourceRoot":"","sources":["../../../src/pages/customReportWriterPage/CustomReportWriterPage.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomReportWriterPage.test.d.ts","sourceRoot":"","sources":["../../../src/pages/customReportWriterPage/CustomReportWriterPage.test.tsx"],"names":[],"mappings":"AAEA,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import '@testing-library/jest-dom/vitest';
|
|
5
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
6
|
+
import { CustomReportWriterPage } from './CustomReportWriterPage.js';
|
|
7
|
+
// AG Grid requires a license key — mock Table to avoid license errors in tests.
|
|
8
|
+
// The factory must be self-contained (vi.mock is hoisted above imports).
|
|
9
|
+
vi.mock('Components/table/Table', () => {
|
|
10
|
+
const Table = ({ rowData, headerContent, footerContent, }) => (_jsxs("div", { children: [headerContent, _jsx("div", { role: "grid", "aria-label": "Reports table", children: rowData.map(row => (_jsxs("div", { role: "row", children: [_jsx("span", { children: row.title }), _jsx("span", { children: row.type }), _jsx("span", { children: row.createdBy })] }, row.id))) }), footerContent] }));
|
|
11
|
+
const BulkActionsDropdown = () => _jsx("div", {});
|
|
12
|
+
BulkActionsDropdown.displayName = 'Table.BulkActionsDropdown';
|
|
13
|
+
Table.BulkActionsDropdown = BulkActionsDropdown;
|
|
14
|
+
const HideColumnsDropdown = () => _jsx("div", {});
|
|
15
|
+
HideColumnsDropdown.displayName = 'Table.HideColumnsDropdown';
|
|
16
|
+
Table.HideColumnsDropdown = HideColumnsDropdown;
|
|
17
|
+
const RowCountInfo = () => _jsx("span", { children: "Showing results" });
|
|
18
|
+
RowCountInfo.displayName = 'Table.RowCountInfo';
|
|
19
|
+
Table.RowCountInfo = RowCountInfo;
|
|
20
|
+
return { Table };
|
|
21
|
+
});
|
|
22
|
+
describe('CustomReportWriterPage', () => {
|
|
23
|
+
describe('page structure', () => {
|
|
24
|
+
it('renders the page heading', () => {
|
|
25
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
26
|
+
expect(screen.getByRole('heading', { name: 'Custom Report Writer - All Reports' })).toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
it('renders placeholder SVGs for missing components', () => {
|
|
29
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
30
|
+
expect(screen.getByRole('img', { name: /TopNav placeholder/i })).toBeInTheDocument();
|
|
31
|
+
expect(screen.getByRole('img', { name: /SideNavIcons placeholder/i })).toBeInTheDocument();
|
|
32
|
+
expect(screen.getByRole('img', { name: /SideNavText placeholder/i })).toBeInTheDocument();
|
|
33
|
+
});
|
|
34
|
+
it('renders with a main landmark', () => {
|
|
35
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
36
|
+
expect(screen.getByRole('main')).toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
it('applies custom className to the root element', () => {
|
|
39
|
+
const { container } = render(_jsx(CustomReportWriterPage, { className: "my-custom-class" }));
|
|
40
|
+
expect(container.firstChild).toHaveClass('my-custom-class');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('breadcrumbs', () => {
|
|
44
|
+
it('renders breadcrumb navigation', () => {
|
|
45
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
46
|
+
expect(screen.getByRole('navigation', { name: /Breadcrumb/i })).toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
it('renders the School breadcrumb link', () => {
|
|
49
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
50
|
+
expect(screen.getByRole('button', { name: /School/i })).toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
it('renders the current page breadcrumb item', () => {
|
|
53
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
54
|
+
expect(screen.getByText('Custom Report Writer')).toBeInTheDocument();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('warning banner', () => {
|
|
58
|
+
it('renders the banner placeholder SVG', () => {
|
|
59
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
60
|
+
expect(screen.getByRole('img', { name: /Banner placeholder/i })).toBeInTheDocument();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('tabs', () => {
|
|
64
|
+
it('renders the Active, Archived, and Expired tabs', () => {
|
|
65
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
66
|
+
expect(screen.getByRole('tab', { name: /Active/i })).toBeInTheDocument();
|
|
67
|
+
expect(screen.getByRole('tab', { name: /Archived/i })).toBeInTheDocument();
|
|
68
|
+
expect(screen.getByRole('tab', { name: /Expired/i })).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
it('renders Active tab as selected by default', () => {
|
|
71
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
72
|
+
expect(screen.getByRole('tab', { name: /Active/i })).toHaveAttribute('aria-selected', 'true');
|
|
73
|
+
});
|
|
74
|
+
it('switches to Archived tab when clicked', async () => {
|
|
75
|
+
const user = userEvent.setup();
|
|
76
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
77
|
+
await user.click(screen.getByRole('tab', { name: /Archived/i }));
|
|
78
|
+
expect(screen.getByRole('tab', { name: /Archived/i })).toHaveAttribute('aria-selected', 'true');
|
|
79
|
+
expect(screen.getByRole('tab', { name: /Active/i })).toHaveAttribute('aria-selected', 'false');
|
|
80
|
+
});
|
|
81
|
+
it('switches to Expired tab when clicked', async () => {
|
|
82
|
+
const user = userEvent.setup();
|
|
83
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
84
|
+
await user.click(screen.getByRole('tab', { name: /Expired/i }));
|
|
85
|
+
expect(screen.getByRole('tab', { name: /Expired/i })).toHaveAttribute('aria-selected', 'true');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('toolbar actions', () => {
|
|
89
|
+
it('renders the Create New Report button', () => {
|
|
90
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
91
|
+
expect(screen.getByRole('button', { name: /Create New Report/i })).toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
it('calls onCreateNewReport when Create New Report is clicked', async () => {
|
|
94
|
+
const user = userEvent.setup();
|
|
95
|
+
const onCreateNewReport = vi.fn();
|
|
96
|
+
render(_jsx(CustomReportWriterPage, { onCreateNewReport: onCreateNewReport }));
|
|
97
|
+
await user.click(screen.getByRole('button', { name: /Create New Report/i }));
|
|
98
|
+
expect(onCreateNewReport).toHaveBeenCalledTimes(1);
|
|
99
|
+
});
|
|
100
|
+
it('renders the Schedule button', () => {
|
|
101
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
102
|
+
expect(screen.getByRole('button', { name: /^Schedule$/i })).toBeInTheDocument();
|
|
103
|
+
});
|
|
104
|
+
it('calls onSchedule when Schedule is clicked', async () => {
|
|
105
|
+
const user = userEvent.setup();
|
|
106
|
+
const onSchedule = vi.fn();
|
|
107
|
+
render(_jsx(CustomReportWriterPage, { onSchedule: onSchedule }));
|
|
108
|
+
await user.click(screen.getByRole('button', { name: /^Schedule$/i }));
|
|
109
|
+
expect(onSchedule).toHaveBeenCalledTimes(1);
|
|
110
|
+
});
|
|
111
|
+
it('renders the Duplicate button', () => {
|
|
112
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
113
|
+
expect(screen.getByRole('button', { name: /^Duplicate$/i })).toBeInTheDocument();
|
|
114
|
+
});
|
|
115
|
+
it('calls onDuplicateSelected when Duplicate is clicked', async () => {
|
|
116
|
+
const user = userEvent.setup();
|
|
117
|
+
const onDuplicateSelected = vi.fn();
|
|
118
|
+
render(_jsx(CustomReportWriterPage, { onDuplicateSelected: onDuplicateSelected }));
|
|
119
|
+
await user.click(screen.getByRole('button', { name: /^Duplicate$/i }));
|
|
120
|
+
expect(onDuplicateSelected).toHaveBeenCalledTimes(1);
|
|
121
|
+
});
|
|
122
|
+
it('renders the Edit button', () => {
|
|
123
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
124
|
+
expect(screen.getByRole('button', { name: /^Edit$/i })).toBeInTheDocument();
|
|
125
|
+
});
|
|
126
|
+
it('calls onEditSelected when Edit is clicked', async () => {
|
|
127
|
+
const user = userEvent.setup();
|
|
128
|
+
const onEditSelected = vi.fn();
|
|
129
|
+
render(_jsx(CustomReportWriterPage, { onEditSelected: onEditSelected }));
|
|
130
|
+
await user.click(screen.getByRole('button', { name: /^Edit$/i }));
|
|
131
|
+
expect(onEditSelected).toHaveBeenCalledTimes(1);
|
|
132
|
+
});
|
|
133
|
+
it('renders the Change filters button', () => {
|
|
134
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
135
|
+
expect(screen.getByRole('button', { name: /^Change$/i })).toBeInTheDocument();
|
|
136
|
+
});
|
|
137
|
+
it('calls onChangeFilters when Change is clicked', async () => {
|
|
138
|
+
const user = userEvent.setup();
|
|
139
|
+
const onChangeFilters = vi.fn();
|
|
140
|
+
render(_jsx(CustomReportWriterPage, { onChangeFilters: onChangeFilters }));
|
|
141
|
+
await user.click(screen.getByRole('button', { name: /^Change$/i }));
|
|
142
|
+
expect(onChangeFilters).toHaveBeenCalledTimes(1);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('icon toolbar buttons', () => {
|
|
146
|
+
it('renders Export, Settings, Help, and Expand icon buttons', () => {
|
|
147
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
148
|
+
expect(screen.getByRole('button', { name: /Export/i })).toBeInTheDocument();
|
|
149
|
+
expect(screen.getByRole('button', { name: /Settings/i })).toBeInTheDocument();
|
|
150
|
+
expect(screen.getByRole('button', { name: /Help/i })).toBeInTheDocument();
|
|
151
|
+
expect(screen.getByRole('button', { name: /Expand table/i })).toBeInTheDocument();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('table', () => {
|
|
155
|
+
it('renders the reports table', () => {
|
|
156
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
157
|
+
expect(screen.getByRole('grid', { name: /Reports table/i })).toBeInTheDocument();
|
|
158
|
+
});
|
|
159
|
+
it('renders default report data', () => {
|
|
160
|
+
render(_jsx(CustomReportWriterPage, {}));
|
|
161
|
+
expect(screen.getByText('Attendance of All Groups')).toBeInTheDocument();
|
|
162
|
+
expect(screen.getByText('Student Contact Reports')).toBeInTheDocument();
|
|
163
|
+
expect(screen.getByText('Medical Events')).toBeInTheDocument();
|
|
164
|
+
});
|
|
165
|
+
it('renders custom reports when provided', () => {
|
|
166
|
+
const customReports = [
|
|
167
|
+
{
|
|
168
|
+
id: '99',
|
|
169
|
+
title: 'My Custom Report',
|
|
170
|
+
type: 'Student',
|
|
171
|
+
createdBy: 'Test User',
|
|
172
|
+
context: 'School',
|
|
173
|
+
createdDate: '1st Jan 2025',
|
|
174
|
+
modifiedDate: '1st Jan 2025',
|
|
175
|
+
accessedDate: '1st Jan 2025',
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
render(_jsx(CustomReportWriterPage, { reports: customReports }));
|
|
179
|
+
expect(screen.getByText('My Custom Report')).toBeInTheDocument();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=CustomReportWriterPage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomReportWriterPage.test.js","sourceRoot":"","sources":["../../../src/pages/customReportWriterPage/CustomReportWriterPage.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GradeSetsPage - Browse and manage Grade Sets.
|
|
3
|
+
* Displays active and archived grade sets in an AG Grid table with tab navigation.
|
|
4
|
+
*/
|
|
5
|
+
import type { GridApi } from 'ag-grid-enterprise';
|
|
6
|
+
export type GradeSet = {
|
|
7
|
+
id: string;
|
|
8
|
+
longName: string;
|
|
9
|
+
shortName: string;
|
|
10
|
+
};
|
|
11
|
+
export type GradeSetBulkAction = {
|
|
12
|
+
displayName: string;
|
|
13
|
+
callback: (api: GridApi | null) => void;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type GradeSetsPageProps = {
|
|
17
|
+
activeGradeSets?: GradeSet[];
|
|
18
|
+
archivedGradeSets?: GradeSet[];
|
|
19
|
+
bulkActions?: GradeSetBulkAction[];
|
|
20
|
+
onCreateGradeSet?: () => void;
|
|
21
|
+
onRowClick?: (gradeSet: GradeSet) => void;
|
|
22
|
+
onExpandTable?: () => void;
|
|
23
|
+
className?: string;
|
|
24
|
+
};
|
|
25
|
+
export declare const GradeSetsPage: ({ activeGradeSets, archivedGradeSets, bulkActions, onCreateGradeSet, onRowClick, onExpandTable, className, }: GradeSetsPageProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=GradeSetsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GradeSetsPage.d.ts","sourceRoot":"","sources":["../../../src/pages/gradeSetsPage/GradeSetsPage.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAU1D,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAeF,eAAO,MAAM,aAAa,GAAI,8GAQ3B,kBAAkB,4CA4FpB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Button } from '../../components/button/Button.js';
|
|
5
|
+
import { Heading } from '../../components/heading/Heading.js';
|
|
6
|
+
import { Icon } from '../../components/icon/Icon.js';
|
|
7
|
+
import { Section } from '../../components/section/Section.js';
|
|
8
|
+
import { Table } from '../../components/table/Table.js';
|
|
9
|
+
import { Tabs } from '../../components/tabs/Tabs.js';
|
|
10
|
+
const columnDefs = [
|
|
11
|
+
{
|
|
12
|
+
field: 'longName',
|
|
13
|
+
headerName: 'Grade Set Long Name',
|
|
14
|
+
flex: 1,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
field: 'shortName',
|
|
18
|
+
headerName: 'Grade Set Short Name',
|
|
19
|
+
flex: 1,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
export const GradeSetsPage = ({ activeGradeSets = [], archivedGradeSets = [], bulkActions = [], onCreateGradeSet, onRowClick, onExpandTable, className, }) => {
|
|
23
|
+
const [activeTab, setActiveTab] = useState('active');
|
|
24
|
+
const rowData = activeTab === 'active' ? activeGradeSets : archivedGradeSets;
|
|
25
|
+
const tableHeaderContent = (_jsxs(_Fragment, { children: [_jsx(Table.BulkActionsDropdown, { actions: bulkActions }), _jsx(Button, { variant: "dropdown", size: "S", children: "Hide" })] }));
|
|
26
|
+
const tableFooterContent = (_jsxs(_Fragment, { children: [_jsxs("span", { children: ["Showing", ' ', rowData.length, ' ', rowData.length === 1 ? 'result' : 'results'] }), _jsx(Button, { variant: "secondary", size: "S", onClick: onExpandTable, children: "Expand Table" })] }));
|
|
27
|
+
return (_jsxs("div", { className: classNames('ds-grade-sets-page', className), children: [_jsx("nav", { "aria-label": "Breadcrumb", className: "ds-grade-sets-page__breadcrumbs", children: _jsxs("ol", { className: "ds-grade-sets-page__breadcrumb-list", children: [_jsx("li", { className: "ds-grade-sets-page__breadcrumb-item", children: _jsx("a", { href: "/assessments", className: "ds-grade-sets-page__breadcrumb-link", children: "Assessments" }) }), _jsx("li", { className: "ds-grade-sets-page__breadcrumb-item", children: _jsx("a", { href: "/assessments/settings", className: "ds-grade-sets-page__breadcrumb-link", children: "Settings" }) }), _jsxs("li", { className: "ds-grade-sets-page__breadcrumb-item ds-grade-sets-page__breadcrumb-item--current", "aria-current": "page", children: ["Grade Sets", _jsx(Icon, { name: "link", size: 16, screenReaderText: "Permalink" })] })] }) }), _jsxs("header", { className: "ds-grade-sets-page__header", children: [_jsx(Heading, { level: 1, children: "Grade Sets" }), _jsx(Button, { variant: "secondary", onClick: onCreateGradeSet, children: "Create Grade Set" })] }), _jsxs(Tabs, { children: [_jsx(Tabs.Item, { active: activeTab === 'active', tabElementProps: { onClick: () => setActiveTab('active') }, children: "Active" }), _jsx(Tabs.Item, { active: activeTab === 'archived', tabElementProps: { onClick: () => setActiveTab('archived') }, children: "Archived" })] }), _jsx(Section, { className: "ds-grade-sets-page__content", children: _jsx(Table, { rowData: rowData, columnDefs: columnDefs, domLayout: "autoHeight", headerContent: tableHeaderContent, footerContent: tableFooterContent, hasSearch: false, onRowClicked: (event) => {
|
|
28
|
+
if (event.data) {
|
|
29
|
+
onRowClick?.(event.data);
|
|
30
|
+
}
|
|
31
|
+
} }) })] }));
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=GradeSetsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GradeSetsPage.js","sourceRoot":"","sources":["../../../src/pages/gradeSetsPage/GradeSetsPage.tsx"],"names":[],"mappings":"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"}
|