@exxatdesignux/ui 0.2.18 → 0.3.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/CHANGELOG.md +69 -1
- package/bin/sync-extras.mjs +116 -29
- package/consumer-extras/README.md +43 -4
- package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
- package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
- package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
- package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
- package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +41 -0
- package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
- package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
- package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
- package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
- package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
- package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
- package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
- package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
- package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
- package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
- package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
- package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +28 -0
- package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
- package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
- package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
- package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
- package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +9 -9
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
- package/consumer-extras/handbook/HANDBOOK.md +185 -0
- package/consumer-extras/handbook/glossary.md +57 -0
- package/consumer-extras/handbook/reference-implementations.md +126 -0
- package/consumer-extras/handbook/voice-and-tone.md +262 -0
- package/consumer-extras/patterns/command-menu-pattern.md +1 -1
- package/consumer-extras/patterns/data-views-pattern.md +14 -14
- package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
- package/dist/components/data-table/filter-date-calendar.js +280 -0
- package/dist/components/data-table/filter-date-calendar.js.map +1 -0
- package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
- package/dist/components/data-table/filter-text-value-input.js +561 -0
- package/dist/components/data-table/filter-text-value-input.js.map +1 -0
- package/dist/components/data-table/index.d.ts +45 -0
- package/dist/components/data-table/index.js +3085 -0
- package/dist/components/data-table/index.js.map +1 -0
- package/dist/components/data-table/pagination.d.ts +28 -0
- package/dist/components/data-table/pagination.js +3264 -0
- package/dist/components/data-table/pagination.js.map +1 -0
- package/dist/components/data-table/types.d.ts +84 -0
- package/dist/components/data-table/types.js +3 -0
- package/dist/components/data-table/types.js.map +1 -0
- package/dist/components/data-table/use-table-state.d.ts +116 -0
- package/dist/components/data-table/use-table-state.js +670 -0
- package/dist/components/data-table/use-table-state.js.map +1 -0
- package/dist/components/data-views/board-card-primitives.d.ts +22 -0
- package/dist/components/data-views/board-card-primitives.js +84 -0
- package/dist/components/data-views/board-card-primitives.js.map +1 -0
- package/dist/components/data-views/data-row-list.d.ts +33 -0
- package/dist/components/data-views/data-row-list.js +106 -0
- package/dist/components/data-views/data-row-list.js.map +1 -0
- package/dist/components/data-views/finder-panel-view.d.ts +54 -0
- package/dist/components/data-views/finder-panel-view.js +388 -0
- package/dist/components/data-views/finder-panel-view.js.map +1 -0
- package/dist/components/data-views/folder-grid-view.d.ts +22 -0
- package/dist/components/data-views/folder-grid-view.js +58 -0
- package/dist/components/data-views/folder-grid-view.js.map +1 -0
- package/dist/components/data-views/hub-table.d.ts +167 -0
- package/dist/components/data-views/hub-table.js +5561 -0
- package/dist/components/data-views/hub-table.js.map +1 -0
- package/dist/components/data-views/index.d.ts +27 -0
- package/dist/components/data-views/index.js +6575 -0
- package/dist/components/data-views/index.js.map +1 -0
- package/dist/components/data-views/list-page-board-card.d.ts +72 -0
- package/dist/components/data-views/list-page-board-card.js +264 -0
- package/dist/components/data-views/list-page-board-card.js.map +1 -0
- package/dist/components/data-views/list-page-board-template.d.ts +24 -0
- package/dist/components/data-views/list-page-board-template.js +137 -0
- package/dist/components/data-views/list-page-board-template.js.map +1 -0
- package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
- package/dist/components/data-views/list-page-connected-view-body.js +116 -0
- package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
- package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
- package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
- package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
- package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
- package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
- package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
- package/dist/components/data-views/list-page-tree-column-header.js +22 -0
- package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
- package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
- package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
- package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
- package/dist/components/data-views/os-folder-glyph.js +104 -0
- package/dist/components/data-views/os-folder-glyph.js.map +1 -0
- package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
- package/dist/components/data-views/outline-tree-menu.js +131 -0
- package/dist/components/data-views/outline-tree-menu.js.map +1 -0
- package/dist/components/table-properties/column-row.d.ts +22 -0
- package/dist/components/table-properties/column-row.js +153 -0
- package/dist/components/table-properties/column-row.js.map +1 -0
- package/dist/components/table-properties/draggable-list.d.ts +24 -0
- package/dist/components/table-properties/draggable-list.js +53 -0
- package/dist/components/table-properties/draggable-list.js.map +1 -0
- package/dist/components/table-properties/drawer-button.d.ts +110 -0
- package/dist/components/table-properties/drawer-button.js +2748 -0
- package/dist/components/table-properties/drawer-button.js.map +1 -0
- package/dist/components/table-properties/drawer.d.ts +100 -0
- package/dist/components/table-properties/drawer.js +2595 -0
- package/dist/components/table-properties/drawer.js.map +1 -0
- package/dist/components/table-properties/filter-card.d.ts +24 -0
- package/dist/components/table-properties/filter-card.js +854 -0
- package/dist/components/table-properties/filter-card.js.map +1 -0
- package/dist/components/table-properties/index.d.ts +14 -0
- package/dist/components/table-properties/index.js +2768 -0
- package/dist/components/table-properties/index.js.map +1 -0
- package/dist/components/table-properties/sort-card.d.ts +20 -0
- package/dist/components/table-properties/sort-card.js +102 -0
- package/dist/components/table-properties/sort-card.js.map +1 -0
- package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
- package/dist/components/templates/dedicated-search-landing-template.js +254 -0
- package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
- package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
- package/dist/components/templates/dedicated-search-results-template.js +16 -0
- package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
- package/dist/components/templates/index.d.ts +9 -0
- package/dist/components/templates/index.js +2720 -0
- package/dist/components/templates/index.js.map +1 -0
- package/dist/components/templates/list-page.d.ts +83 -0
- package/dist/components/templates/list-page.js +2433 -0
- package/dist/components/templates/list-page.js.map +1 -0
- package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
- package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
- package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +10 -0
- package/dist/components/ui/accordion.js +74 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +37 -0
- package/dist/components/ui/alert-dialog.js +201 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +84 -0
- package/dist/components/ui/avatar.js +328 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +13 -0
- package/dist/components/ui/badge.js +49 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/banner.d.ts +62 -0
- package/dist/components/ui/banner.js +364 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +14 -0
- package/dist/components/ui/breadcrumb.js +114 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +16 -0
- package/dist/components/ui/button.js +59 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +13 -0
- package/dist/components/ui/calendar.js +238 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +14 -0
- package/dist/components/ui/card.js +102 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/chart.d.ts +58 -0
- package/dist/components/ui/chart.js +292 -0
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +23 -0
- package/dist/components/ui/checkbox.js +155 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/coach-mark.d.ts +27 -0
- package/dist/components/ui/coach-mark.js +306 -0
- package/dist/components/ui/coach-mark.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +8 -0
- package/dist/components/ui/collapsible.js +35 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/command.d.ts +36 -0
- package/dist/components/ui/command.js +274 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +32 -0
- package/dist/components/ui/context-menu.js +245 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/date-picker-field.d.ts +38 -0
- package/dist/components/ui/date-picker-field.js +550 -0
- package/dist/components/ui/date-picker-field.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +22 -0
- package/dist/components/ui/dialog.js +200 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dot-pattern.d.ts +21 -0
- package/dist/components/ui/dot-pattern.js +139 -0
- package/dist/components/ui/dot-pattern.js.map +1 -0
- package/dist/components/ui/drag-handle-grip.d.ts +10 -0
- package/dist/components/ui/drag-handle-grip.js +15 -0
- package/dist/components/ui/drag-handle-grip.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +16 -0
- package/dist/components/ui/drawer.js +125 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +45 -0
- package/dist/components/ui/dropdown-menu.js +353 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/export-drawer.d.ts +11 -0
- package/dist/components/ui/export-drawer.js +1658 -0
- package/dist/components/ui/export-drawer.js.map +1 -0
- package/dist/components/ui/field.d.ts +30 -0
- package/dist/components/ui/field.js +249 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/form.d.ts +28 -0
- package/dist/components/ui/form.js +110 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +9 -0
- package/dist/components/ui/hover-card.js +43 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +20 -0
- package/dist/components/ui/input-group.js +219 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-mask.d.ts +39 -0
- package/dist/components/ui/input-mask.js +118 -0
- package/dist/components/ui/input-mask.js.map +1 -0
- package/dist/components/ui/input.d.ts +5 -0
- package/dist/components/ui/input.js +30 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +20 -0
- package/dist/components/ui/kbd.js +45 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/key-metrics-context.d.ts +19 -0
- package/dist/components/ui/key-metrics-context.js +26 -0
- package/dist/components/ui/key-metrics-context.js.map +1 -0
- package/dist/components/ui/key-metrics.d.ts +131 -0
- package/dist/components/ui/key-metrics.js +1015 -0
- package/dist/components/ui/key-metrics.js.map +1 -0
- package/dist/components/ui/label.d.ts +6 -0
- package/dist/components/ui/label.js +28 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/list-page-view-frame.d.ts +22 -0
- package/dist/components/ui/list-page-view-frame.js +24 -0
- package/dist/components/ui/list-page-view-frame.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +51 -0
- package/dist/components/ui/page-header.js +372 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/payment-card-fields.d.ts +10 -0
- package/dist/components/ui/payment-card-fields.js +80 -0
- package/dist/components/ui/payment-card-fields.js.map +1 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/popover.js +47 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +29 -0
- package/dist/components/ui/radio-group.js +190 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +16 -0
- package/dist/components/ui/resizable.js +51 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +8 -0
- package/dist/components/ui/scroll-area.js +66 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +18 -0
- package/dist/components/ui/select.js +186 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/selection-tile-grid.d.ts +52 -0
- package/dist/components/ui/selection-tile-grid.js +347 -0
- package/dist/components/ui/selection-tile-grid.js.map +1 -0
- package/dist/components/ui/separator.d.ts +7 -0
- package/dist/components/ui/separator.js +33 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +18 -0
- package/dist/components/ui/sheet.js +181 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +94 -0
- package/dist/components/ui/sidebar.js +805 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +5 -0
- package/dist/components/ui/skeleton.js +22 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +7 -0
- package/dist/components/ui/slider.js +66 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +6 -0
- package/dist/components/ui/sonner.js +38 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/status-badge.d.ts +38 -0
- package/dist/components/ui/status-badge.js +77 -0
- package/dist/components/ui/status-badge.js.map +1 -0
- package/dist/components/ui/table.d.ts +13 -0
- package/dist/components/ui/table.js +115 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +15 -0
- package/dist/components/ui/tabs.js +93 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +6 -0
- package/dist/components/ui/textarea.js +25 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tip.d.ts +12 -0
- package/dist/components/ui/tip.js +61 -0
- package/dist/components/ui/tip.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +14 -0
- package/dist/components/ui/toggle-group.js +104 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle-switch.d.ts +10 -0
- package/dist/components/ui/toggle-switch.js +33 -0
- package/dist/components/ui/toggle-switch.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +13 -0
- package/dist/components/ui/toggle.js +51 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.js +68 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/view-segmented-control.d.ts +31 -0
- package/dist/components/ui/view-segmented-control.js +167 -0
- package/dist/components/ui/view-segmented-control.js.map +1 -0
- package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
- package/dist/hooks/use-app-theme.d.ts +24 -0
- package/dist/hooks/use-app-theme.js +286 -0
- package/dist/hooks/use-app-theme.js.map +1 -0
- package/dist/hooks/use-coach-mark.d.ts +86 -0
- package/dist/hooks/use-coach-mark.js +218 -0
- package/dist/hooks/use-coach-mark.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +29 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-mod-key-label.d.ts +6 -0
- package/dist/hooks/use-mod-key-label.js +25 -0
- package/dist/hooks/use-mod-key-label.js.map +1 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +13324 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/compose-refs.d.ts +6 -0
- package/dist/lib/compose-refs.js +17 -0
- package/dist/lib/compose-refs.js.map +1 -0
- package/dist/lib/conditional-rule-match.d.ts +30 -0
- package/dist/lib/conditional-rule-match.js +66 -0
- package/dist/lib/conditional-rule-match.js.map +1 -0
- package/dist/lib/data-list-display-options.d.ts +26 -0
- package/dist/lib/data-list-display-options.js +14 -0
- package/dist/lib/data-list-display-options.js.map +1 -0
- package/dist/lib/data-list-view-registry.d.ts +2 -0
- package/dist/lib/data-list-view-registry.js +102 -0
- package/dist/lib/data-list-view-registry.js.map +1 -0
- package/dist/lib/data-list-view-surface.d.ts +2 -0
- package/dist/lib/data-list-view-surface.js +80 -0
- package/dist/lib/data-list-view-surface.js.map +1 -0
- package/dist/lib/data-list-view.d.ts +21 -0
- package/dist/lib/data-list-view.js +25 -0
- package/dist/lib/data-list-view.js.map +1 -0
- package/dist/lib/date-filter.d.ts +22 -0
- package/dist/lib/date-filter.js +61 -0
- package/dist/lib/date-filter.js.map +1 -0
- package/dist/lib/dev-log.d.ts +8 -0
- package/dist/lib/dev-log.js +10 -0
- package/dist/lib/dev-log.js.map +1 -0
- package/dist/lib/dropdown-menu-surface.d.ts +14 -0
- package/dist/lib/dropdown-menu-surface.js +6 -0
- package/dist/lib/dropdown-menu-surface.js.map +1 -0
- package/dist/lib/editable-target.d.ts +12 -0
- package/dist/lib/editable-target.js +12 -0
- package/dist/lib/editable-target.js.map +1 -0
- package/dist/lib/list-page-table-properties.d.ts +35 -0
- package/dist/lib/list-page-table-properties.js +81 -0
- package/dist/lib/list-page-table-properties.js.map +1 -0
- package/dist/lib/raf-throttle.d.ts +23 -0
- package/dist/lib/raf-throttle.js +27 -0
- package/dist/lib/raf-throttle.js.map +1 -0
- package/dist/lib/row-height.d.ts +16 -0
- package/dist/lib/row-height.js +10 -0
- package/dist/lib/row-height.js.map +1 -0
- package/dist/lib/table-properties-types.d.ts +83 -0
- package/dist/lib/table-properties-types.js +19 -0
- package/dist/lib/table-properties-types.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +83 -18
- package/src/components/data-table/filter-date-calendar.tsx +38 -0
- package/src/components/data-table/filter-text-value-input.tsx +77 -0
- package/src/components/data-table/index.tsx +1678 -0
- package/src/components/data-table/pagination.tsx +255 -0
- package/src/components/data-table/types.ts +96 -0
- package/src/components/data-table/use-table-state.ts +767 -0
- package/src/components/data-views/board-card-primitives.tsx +93 -0
- package/src/components/data-views/data-row-list.tsx +183 -0
- package/src/components/data-views/finder-panel-view.tsx +405 -0
- package/src/components/data-views/folder-grid-view.tsx +86 -0
- package/src/components/data-views/hub-table.tsx +498 -0
- package/src/components/data-views/index.ts +28 -0
- package/src/components/data-views/list-page-board-card.tsx +192 -0
- package/src/components/data-views/list-page-board-template.tsx +122 -0
- package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
- package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
- package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
- package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
- package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
- package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
- package/src/components/data-views/os-folder-glyph.tsx +141 -0
- package/src/components/data-views/outline-tree-menu.tsx +157 -0
- package/src/components/table-properties/column-row.tsx +90 -0
- package/src/components/table-properties/draggable-list.ts +54 -0
- package/src/components/table-properties/drawer-button.tsx +300 -0
- package/src/components/table-properties/drawer.tsx +1148 -0
- package/src/components/table-properties/filter-card.tsx +251 -0
- package/src/components/table-properties/index.ts +36 -0
- package/src/components/table-properties/sort-card.tsx +63 -0
- package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
- package/src/components/templates/dedicated-search-results-template.tsx +19 -0
- package/src/components/templates/index.ts +33 -0
- package/src/components/templates/list-page.tsx +602 -0
- package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
- package/src/components/ui/accordion.tsx +92 -0
- package/src/components/ui/alert-dialog.tsx +221 -0
- package/src/components/ui/avatar.tsx +13 -2
- package/src/components/ui/banner.tsx +2 -2
- package/src/components/ui/calendar.tsx +1 -1
- package/src/components/ui/coach-mark.tsx +1 -1
- package/src/components/ui/context-menu.tsx +291 -0
- package/src/components/ui/date-picker-field.tsx +2 -2
- package/src/components/ui/dot-pattern.tsx +183 -0
- package/src/components/ui/export-drawer.tsx +375 -0
- package/src/components/ui/hover-card.tsx +66 -0
- package/src/components/ui/key-metrics-context.tsx +78 -0
- package/src/components/ui/key-metrics.tsx +1133 -0
- package/src/components/ui/list-page-view-frame.tsx +64 -0
- package/src/components/ui/page-header.tsx +244 -0
- package/src/components/ui/payment-card-fields.tsx +2 -2
- package/src/components/ui/resizable.tsx +68 -0
- package/src/components/ui/scroll-area.tsx +72 -0
- package/src/components/ui/selection-tile-grid.tsx +9 -2
- package/src/components/ui/sidebar.tsx +84 -12
- package/src/components/ui/slider.tsx +83 -0
- package/src/globals.css +494 -151
- package/src/globals.d.ts +20 -0
- package/src/index.ts +68 -1
- package/src/lib/conditional-rule-match.ts +119 -0
- package/src/lib/data-list-display-options.ts +35 -0
- package/src/lib/data-list-view-registry.ts +104 -0
- package/src/lib/data-list-view-surface.ts +83 -0
- package/src/lib/data-list-view.ts +47 -0
- package/src/lib/dev-log.ts +10 -0
- package/src/lib/editable-target.ts +20 -0
- package/src/lib/list-page-table-properties.ts +48 -0
- package/src/lib/raf-throttle.ts +45 -0
- package/src/lib/row-height.ts +19 -0
- package/src/lib/table-properties-types.ts +98 -0
- package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
- package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
- package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
- package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
- package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
- package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
- package/template/AGENTS.md +84 -20
- package/template/app/(app)/examples/page.tsx +0 -1
- package/template/app/(app)/layout.tsx +17 -4
- package/template/app/(app)/question-bank/layout.tsx +1 -1
- package/template/app/(app)/question-bank/new/page.tsx +11 -24
- package/template/app/globals.css +13 -1972
- package/template/components/ask-leo-sidebar.tsx +5 -1
- package/template/components/brand-color-picker.tsx +2 -2
- package/template/components/charts-overview.tsx +1 -1
- package/template/components/compliance-table.tsx +240 -384
- package/template/components/dashboard-report-charts.tsx +1 -1
- package/template/components/dashboard-tabs.tsx +1 -1
- package/template/components/data-table/filter-date-calendar.tsx +1 -38
- package/template/components/data-table/filter-text-value-input.tsx +1 -77
- package/template/components/data-table/index.tsx +1 -1634
- package/template/components/data-table/pagination.tsx +1 -255
- package/template/components/data-table/types.ts +1 -94
- package/template/components/data-table/use-table-state.test.ts +420 -0
- package/template/components/data-table/use-table-state.ts +1 -758
- package/template/components/data-view-dashboard-charts-compliance.tsx +2 -2
- package/template/components/data-view-dashboard-charts-team.tsx +2 -2
- package/template/components/data-view-dashboard-charts.tsx +2 -2
- package/template/components/data-views/board-card-primitives.tsx +1 -93
- package/template/components/data-views/data-row-list.tsx +1 -183
- package/template/components/data-views/finder-panel-view.tsx +1 -405
- package/template/components/data-views/folder-grid-view.tsx +1 -86
- package/template/components/data-views/hub-table.tsx +1 -0
- package/template/components/data-views/index.ts +42 -1
- package/template/components/data-views/list-page-board-card.tsx +1 -192
- package/template/components/data-views/list-page-board-template.tsx +1 -122
- package/template/components/data-views/list-page-connected-view-body.tsx +1 -0
- package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
- package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -60
- package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
- package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
- package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
- package/template/components/data-views/list-page-view-frame.tsx +5 -53
- package/template/components/data-views/os-folder-glyph.tsx +1 -129
- package/template/components/data-views/outline-tree-menu.tsx +1 -157
- package/template/components/export-drawer.test.tsx +71 -0
- package/template/components/export-drawer.tsx +1 -375
- package/template/components/exxat-product-logo.tsx +5 -5
- package/template/components/hub-tree-panel-view.tsx +2 -2
- package/template/components/invite-collaborators-drawer.tsx +3 -3
- package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
- package/template/components/key-metrics.tsx +1 -1063
- package/template/components/leo-insight-indicator.tsx +2 -2
- package/template/components/new-placement-back-btn.tsx +1 -1
- package/template/components/new-placement-form.tsx +63 -189
- package/template/components/new-question-composer.tsx +432 -402
- package/template/components/onboarding/index.ts +9 -0
- package/template/components/onboarding/onboarding-01.tsx +1 -1
- package/template/components/onboarding/onboarding-02.tsx +1 -1
- package/template/components/onboarding/onboarding-03.tsx +1 -1
- package/template/components/onboarding/onboarding-04.tsx +1 -1
- package/template/components/page-header.tsx +8 -226
- package/template/components/placement-board-card.tsx +71 -83
- package/template/components/placements-board-view.tsx +3 -10
- package/template/components/placements-client.tsx +10 -42
- package/template/components/placements-list-view.tsx +22 -69
- package/template/components/placements-table-columns.tsx +8 -438
- package/template/components/placements-table.tsx +588 -1296
- package/template/components/product-switcher.tsx +1 -1
- package/template/components/product-wordmark.tsx +2 -1
- package/template/components/question-bank-client.tsx +4 -1
- package/template/components/question-bank-hub-client.tsx +1 -1
- package/template/components/question-bank-new-folder-sheet.tsx +2 -2
- package/template/components/question-bank-secondary-nav.tsx +3 -3
- package/template/components/question-bank-table.tsx +294 -526
- package/template/components/rotations-empty-state.tsx +1 -1
- package/template/components/rotations-panel-activator.tsx +1 -1
- package/template/components/settings-appearance-card.tsx +1 -1
- package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
- package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +4 -4
- package/template/components/sidebar/index.ts +16 -0
- package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
- package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +6 -3
- package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
- package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
- package/template/components/site-header.tsx +1 -1
- package/template/components/{sites-all-client.tsx → sites-client.tsx} +1 -1
- package/template/components/sites-table.tsx +124 -257
- package/template/components/table-properties/column-row.tsx +1 -90
- package/template/components/table-properties/draggable-list.ts +1 -49
- package/template/components/table-properties/drawer-button.tsx +1 -249
- package/template/components/table-properties/drawer.tsx +1 -1105
- package/template/components/table-properties/filter-card.tsx +1 -251
- package/template/components/table-properties/sort-card.tsx +1 -59
- package/template/components/table-properties/types.ts +28 -71
- package/template/components/team-table.tsx +242 -382
- package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
- package/template/components/templates/dedicated-search-results-template.tsx +1 -19
- package/template/components/templates/list-page.tsx +1 -584
- package/template/components/templates/nested-secondary-panel-shell.tsx +1 -62
- package/template/components/templates/new-focus-template.tsx +659 -0
- package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
- package/template/components/ui/accordion.tsx +1 -0
- package/template/components/ui/alert-dialog.tsx +1 -0
- package/template/components/ui/context-menu.tsx +1 -0
- package/template/components/ui/dot-pattern.tsx +1 -183
- package/template/components/ui/hover-card.tsx +1 -0
- package/template/components/ui/resizable.tsx +1 -68
- package/template/components/ui/scroll-area.tsx +1 -0
- package/template/components/ui/slider.tsx +1 -0
- package/template/docs/blueprints/README.md +86 -0
- package/template/docs/blueprints/_template.md +91 -0
- package/template/docs/blueprints/board-card.md +123 -0
- package/template/docs/blueprints/data-table.md +139 -0
- package/template/docs/blueprints/key-metrics.md +128 -0
- package/template/docs/blueprints/list-page-template.md +123 -0
- package/template/docs/blueprints/page-header.md +130 -0
- package/template/docs/command-menu-pattern.md +1 -1
- package/template/docs/component-selection-guide.md +224 -0
- package/template/docs/components-audit-2026-05.md +158 -0
- package/template/docs/data-views-pattern.md +14 -14
- package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
- package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
- package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
- package/template/docs/migrations/README.md +100 -0
- package/template/docs/migrations/_template.md +64 -0
- package/template/docs/token-taxonomy.md +416 -0
- package/template/eslint.config.mjs +27 -0
- package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
- package/template/lib/command-menu-config.ts +0 -1
- package/template/lib/compliance-supported-views.ts +10 -0
- package/template/lib/conditional-rule-match.ts +6 -97
- package/template/lib/data-list-display-options.ts +1 -35
- package/template/lib/data-list-view-registry.ts +1 -0
- package/template/lib/data-list-view-surface.ts +1 -69
- package/template/lib/data-list-view.ts +1 -38
- package/template/lib/dev-log.ts +1 -8
- package/template/lib/editable-target.ts +1 -10
- package/template/lib/hub-connected-view-renderers.ts +58 -0
- package/template/lib/list-hub-supported-views.ts +10 -0
- package/template/lib/list-page-table-properties.ts +1 -52
- package/template/lib/mock/navigation.tsx +0 -8
- package/template/lib/mock/placements.ts +0 -7
- package/template/lib/placement-board-card-layout.ts +41 -41
- package/template/lib/placements-supported-views.ts +12 -0
- package/template/lib/question-bank-supported-views.ts +12 -0
- package/template/lib/raf-throttle.ts +1 -45
- package/template/lib/row-height.ts +4 -10
- package/template/lib/sidebar-state-cookie.ts +11 -2
- package/template/lib/sites-supported-views.ts +10 -0
- package/template/lib/team-supported-views.ts +10 -0
- package/template/package.json +1 -0
- package/template/tests/setup.ts +25 -0
- package/src/theme.css +0 -1132
- package/template/app/(app)/data-list/[id]/page.tsx +0 -44
- package/template/app/(app)/data-list/new/page.tsx +0 -34
- package/template/app/(app)/data-list/page.tsx +0 -10
- package/template/components/compliance-list-view.tsx +0 -54
- package/template/components/dashboard-onboarding-gallery.tsx +0 -13
- package/template/components/dashboard-onboarding.tsx +0 -21
- package/template/components/question-bank-list-view.tsx +0 -53
- package/template/components/section-cards.tsx +0 -106
- package/template/components/sites-list-view.tsx +0 -42
- package/template/components/team-list-view.tsx +0 -59
- package/template/lib/placement-lifecycle.ts +0 -5
- /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
- /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
- /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
- /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
- /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
- /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/lib/compose-refs.ts
|
|
2
|
+
function composeRefs(...refs) {
|
|
3
|
+
return (node) => {
|
|
4
|
+
for (const ref of refs) {
|
|
5
|
+
if (ref == null) continue;
|
|
6
|
+
if (typeof ref === "function") {
|
|
7
|
+
ref(node);
|
|
8
|
+
} else {
|
|
9
|
+
ref.current = node;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { composeRefs };
|
|
16
|
+
//# sourceMappingURL=compose-refs.js.map
|
|
17
|
+
//# sourceMappingURL=compose-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/compose-refs.ts"],"names":[],"mappings":";AAGO,SAAS,eAAkB,IAAA,EAA0D;AAC1F,EAAA,OAAO,CAAA,IAAA,KAAQ;AACb,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,QAAA,GAAA,CAAI,IAAI,CAAA;AAAA,MACV,CAAA,MAAO;AACJ,QAAC,IAAyC,OAAA,GAAU,IAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAA;AACF","file":"compose-refs.js","sourcesContent":["import * as React from \"react\"\n\n/** Merges multiple refs (callback or object) for the same DOM node — e.g. RHF `field.ref` + mask ref. */\nexport function composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return node => {\n for (const ref of refs) {\n if (ref == null) continue\n if (typeof ref === \"function\") {\n ref(node)\n } else {\n ;(ref as React.MutableRefObject<T | null>).current = node\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FilterTextMask, ConditionalRule } from './table-properties-types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Conditional-formatting matchers shared by `DataTable` cells,
|
|
5
|
+
* `data-row-list` rows, and board card backgrounds. Keeping the logic
|
|
6
|
+
* here ensures the table grid and the list / board derivatives all
|
|
7
|
+
* paint the same row with the same rule (no UI drift between views).
|
|
8
|
+
*
|
|
9
|
+
* `columns` is optional and only used when the consumer needs to:
|
|
10
|
+
* - read from a different row key than the rule's `fieldKey`
|
|
11
|
+
* (`sortKey`-aliased columns), or
|
|
12
|
+
* - apply a `textMask` (phone / zip) so "contains 555" matches the
|
|
13
|
+
* raw digits of "(415) 555-0100".
|
|
14
|
+
*/
|
|
15
|
+
type ConditionalColumnHint = {
|
|
16
|
+
key: string;
|
|
17
|
+
sortKey?: string;
|
|
18
|
+
filter?: {
|
|
19
|
+
type?: string;
|
|
20
|
+
textMask?: FilterTextMask;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
/** Whether a conditional rule matches a row (same logic as DataTable cells). */
|
|
24
|
+
declare function conditionalRuleMatchesRow<T extends Record<string, unknown>>(row: T, rule: ConditionalRule, columns?: ConditionalColumnHint[]): boolean;
|
|
25
|
+
/** First matching conditional rule background for a row (list/board row tint). */
|
|
26
|
+
declare function getConditionalRowBackground<T extends Record<string, unknown>>(row: T, rules: ConditionalRule[] | undefined, columns?: ConditionalColumnHint[]): string | undefined;
|
|
27
|
+
/** Background for one table cell from conditional rules on that column. */
|
|
28
|
+
declare function getConditionalCellBackground<T extends Record<string, unknown>>(row: T, colKey: string, rules: ConditionalRule[] | undefined, columns?: ConditionalColumnHint[]): string | undefined;
|
|
29
|
+
|
|
30
|
+
export { type ConditionalColumnHint, conditionalRuleMatchesRow, getConditionalCellBackground, getConditionalRowBackground };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/lib/conditional-rule-match.ts
|
|
2
|
+
function rowValueForRule(row, rule, columns) {
|
|
3
|
+
const col = columns?.find((c) => c.key === rule.fieldKey);
|
|
4
|
+
const dataKey = col?.sortKey ?? rule.fieldKey;
|
|
5
|
+
return String(row[dataKey] ?? "");
|
|
6
|
+
}
|
|
7
|
+
function ruleHasActiveValues(rule, columns) {
|
|
8
|
+
if (rule.values.length === 0) return false;
|
|
9
|
+
const col = columns?.find((c) => c.key === rule.fieldKey);
|
|
10
|
+
if (col?.filter?.type === "text")
|
|
11
|
+
return (rule.values[0] ?? "").trim().length > 0;
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
function conditionalTextMatches(cellVal, needle, op, textMask) {
|
|
15
|
+
const v = cellVal.trim();
|
|
16
|
+
const n = needle.trim();
|
|
17
|
+
if (!n) return op === "not_contains";
|
|
18
|
+
if (textMask === "phone" || textMask === "zip") {
|
|
19
|
+
const nd = n.replace(/\D/g, "");
|
|
20
|
+
const hay = v.replace(/\D/g, "");
|
|
21
|
+
if (!nd) return op === "not_contains";
|
|
22
|
+
const hit2 = hay.includes(nd);
|
|
23
|
+
return op === "contains" ? hit2 : !hit2;
|
|
24
|
+
}
|
|
25
|
+
const hit = v.toLowerCase().includes(n.toLowerCase());
|
|
26
|
+
return op === "contains" ? hit : !hit;
|
|
27
|
+
}
|
|
28
|
+
function conditionalRuleMatchesRow(row, rule, columns) {
|
|
29
|
+
if (!ruleHasActiveValues(rule, columns)) return false;
|
|
30
|
+
const v = rowValueForRule(row, rule, columns).trim();
|
|
31
|
+
const col = columns?.find((c) => c.key === rule.fieldKey);
|
|
32
|
+
const textMask = col?.filter?.type === "text" ? col.filter.textMask : void 0;
|
|
33
|
+
switch (rule.operator) {
|
|
34
|
+
case "is":
|
|
35
|
+
return rule.values.includes(v);
|
|
36
|
+
case "is_not":
|
|
37
|
+
return !rule.values.includes(v);
|
|
38
|
+
case "contains":
|
|
39
|
+
return rule.values.some(
|
|
40
|
+
(val) => conditionalTextMatches(v, val, "contains", textMask)
|
|
41
|
+
);
|
|
42
|
+
case "not_contains":
|
|
43
|
+
return !rule.values.some(
|
|
44
|
+
(val) => conditionalTextMatches(v, val, "contains", textMask)
|
|
45
|
+
);
|
|
46
|
+
default:
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function getConditionalRowBackground(row, rules, columns) {
|
|
51
|
+
if (!rules?.length) return void 0;
|
|
52
|
+
for (const rule of rules) {
|
|
53
|
+
if (conditionalRuleMatchesRow(row, rule, columns)) return rule.bgColor;
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
function getConditionalCellBackground(row, colKey, rules, columns) {
|
|
58
|
+
if (!rules?.length) return void 0;
|
|
59
|
+
const rule = rules.find((r) => r.fieldKey === colKey);
|
|
60
|
+
if (!rule || !conditionalRuleMatchesRow(row, rule, columns)) return void 0;
|
|
61
|
+
return rule.bgColor;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { conditionalRuleMatchesRow, getConditionalCellBackground, getConditionalRowBackground };
|
|
65
|
+
//# sourceMappingURL=conditional-rule-match.js.map
|
|
66
|
+
//# sourceMappingURL=conditional-rule-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/conditional-rule-match.ts"],"names":["hit"],"mappings":"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","file":"conditional-rule-match.js","sourcesContent":["import type {\n ConditionalRule,\n FilterTextMask,\n} from \"./table-properties-types\"\n\n/**\n * Conditional-formatting matchers shared by `DataTable` cells,\n * `data-row-list` rows, and board card backgrounds. Keeping the logic\n * here ensures the table grid and the list / board derivatives all\n * paint the same row with the same rule (no UI drift between views).\n *\n * `columns` is optional and only used when the consumer needs to:\n * - read from a different row key than the rule's `fieldKey`\n * (`sortKey`-aliased columns), or\n * - apply a `textMask` (phone / zip) so \"contains 555\" matches the\n * raw digits of \"(415) 555-0100\".\n */\n\nexport type ConditionalColumnHint = {\n key: string\n sortKey?: string\n filter?: { type?: string; textMask?: FilterTextMask }\n}\n\nfunction rowValueForRule<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): string {\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const dataKey = (col?.sortKey ?? rule.fieldKey) as keyof T\n return String(row[dataKey] ?? \"\")\n}\n\nfunction ruleHasActiveValues(\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (rule.values.length === 0) return false\n const col = columns?.find((c) => c.key === rule.fieldKey)\n if (col?.filter?.type === \"text\")\n return (rule.values[0] ?? \"\").trim().length > 0\n return true\n}\n\nfunction conditionalTextMatches(\n cellVal: string,\n needle: string,\n op: \"contains\" | \"not_contains\",\n textMask: FilterTextMask | undefined,\n) {\n const v = cellVal.trim()\n const n = needle.trim()\n if (!n) return op === \"not_contains\"\n if (textMask === \"phone\" || textMask === \"zip\") {\n const nd = n.replace(/\\D/g, \"\")\n const hay = v.replace(/\\D/g, \"\")\n if (!nd) return op === \"not_contains\"\n const hit = hay.includes(nd)\n return op === \"contains\" ? hit : !hit\n }\n const hit = v.toLowerCase().includes(n.toLowerCase())\n return op === \"contains\" ? hit : !hit\n}\n\n/** Whether a conditional rule matches a row (same logic as DataTable cells). */\nexport function conditionalRuleMatchesRow<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (!ruleHasActiveValues(rule, columns)) return false\n const v = rowValueForRule(row, rule, columns).trim()\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const textMask =\n col?.filter?.type === \"text\" ? col.filter.textMask : undefined\n switch (rule.operator) {\n case \"is\":\n return rule.values.includes(v)\n case \"is_not\":\n return !rule.values.includes(v)\n case \"contains\":\n return rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n case \"not_contains\":\n return !rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n default:\n return false\n }\n}\n\n/** First matching conditional rule background for a row (list/board row tint). */\nexport function getConditionalRowBackground<T extends Record<string, unknown>>(\n row: T,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n for (const rule of rules) {\n if (conditionalRuleMatchesRow(row, rule, columns)) return rule.bgColor\n }\n return undefined\n}\n\n/** Background for one table cell from conditional rules on that column. */\nexport function getConditionalCellBackground<T extends Record<string, unknown>>(\n row: T,\n colKey: string,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n const rule = rules.find((r) => r.fieldKey === colKey)\n if (!rule || !conditionalRuleMatchesRow(row, rule, columns)) return undefined\n return rule.bgColor\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display options for Data list (table / board / etc.) — shared across view types
|
|
3
|
+
* so hide/show preferences persist when switching views.
|
|
4
|
+
*/
|
|
5
|
+
type BoardLineCount = 1 | 2 | 3;
|
|
6
|
+
interface DataListDisplayOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Board swimlanes: dataset field (table column key) used to split cards into columns.
|
|
9
|
+
* Each hub passes allowed keys via `TablePropertiesDrawer` `boardGroupByColumnOptions`.
|
|
10
|
+
*/
|
|
11
|
+
boardGroupByColumnKey: string;
|
|
12
|
+
/** Max lines for primary text blocks on board cards */
|
|
13
|
+
boardLineCount: BoardLineCount;
|
|
14
|
+
/** Page title block (Placements + subtitle) */
|
|
15
|
+
showViewTitle: boolean;
|
|
16
|
+
/** Board: phase column titles + descriptions. Table: column header row. */
|
|
17
|
+
showColumnLabels: boolean;
|
|
18
|
+
/** Board: “N cards” under each phase column */
|
|
19
|
+
showBoardColumnCounts: boolean;
|
|
20
|
+
boardNewCardAbove: boolean;
|
|
21
|
+
/** Toolbar search control (table view) */
|
|
22
|
+
showToolbarSearch: boolean;
|
|
23
|
+
}
|
|
24
|
+
declare const DEFAULT_DATA_LIST_DISPLAY_OPTIONS: DataListDisplayOptions;
|
|
25
|
+
|
|
26
|
+
export { type BoardLineCount, DEFAULT_DATA_LIST_DISPLAY_OPTIONS, type DataListDisplayOptions };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/lib/data-list-display-options.ts
|
|
2
|
+
var DEFAULT_DATA_LIST_DISPLAY_OPTIONS = {
|
|
3
|
+
boardGroupByColumnKey: "topic",
|
|
4
|
+
boardLineCount: 2,
|
|
5
|
+
showViewTitle: true,
|
|
6
|
+
showColumnLabels: true,
|
|
7
|
+
showBoardColumnCounts: true,
|
|
8
|
+
boardNewCardAbove: true,
|
|
9
|
+
showToolbarSearch: true
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { DEFAULT_DATA_LIST_DISPLAY_OPTIONS };
|
|
13
|
+
//# sourceMappingURL=data-list-display-options.js.map
|
|
14
|
+
//# sourceMappingURL=data-list-display-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/data-list-display-options.ts"],"names":[],"mappings":";AA0BO,IAAM,iCAAA,GAA4D;AAAA,EACvE,qBAAA,EAAuB,OAAA;AAAA,EACvB,cAAA,EAAgB,CAAA;AAAA,EAChB,aAAA,EAAe,IAAA;AAAA,EACf,gBAAA,EAAkB,IAAA;AAAA,EAClB,qBAAA,EAAuB,IAAA;AAAA,EACvB,iBAAA,EAAmB,IAAA;AAAA,EACnB,iBAAA,EAAmB;AACrB","file":"data-list-display-options.js","sourcesContent":["/**\n * Display options for Data list (table / board / etc.) — shared across view types\n * so hide/show preferences persist when switching views.\n */\n\nexport type BoardLineCount = 1 | 2 | 3\n\nexport interface DataListDisplayOptions {\n /**\n * Board swimlanes: dataset field (table column key) used to split cards into columns.\n * Each hub passes allowed keys via `TablePropertiesDrawer` `boardGroupByColumnOptions`.\n */\n boardGroupByColumnKey: string\n /** Max lines for primary text blocks on board cards */\n boardLineCount: BoardLineCount\n /** Page title block (Placements + subtitle) */\n showViewTitle: boolean\n /** Board: phase column titles + descriptions. Table: column header row. */\n showColumnLabels: boolean\n /** Board: “N cards” under each phase column */\n showBoardColumnCounts: boolean\n boardNewCardAbove: boolean\n /** Toolbar search control (table view) */\n showToolbarSearch: boolean\n}\n\nexport const DEFAULT_DATA_LIST_DISPLAY_OPTIONS: DataListDisplayOptions = {\n boardGroupByColumnKey: \"topic\",\n boardLineCount: 2,\n showViewTitle: true,\n showColumnLabels: true,\n showBoardColumnCounts: true,\n boardNewCardAbove: true,\n showToolbarSearch: true,\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { dataListViewAddShortcut, dataListViewIcon, dataListViewLabel } from './data-list-view.js';
|
|
2
|
+
export { D as DATA_LIST_SURFACE_VIEW_TYPES, a as DATA_LIST_VIEW_REGISTRY, b as DataListViewDefinition, c as DataListViewRenderKind, d as dataListViewDefinition, e as dataListViewSelectionTilesForHub, f as dataListViewTilesForHub, g as getDataListViewRenderKind, i as isDataListSurfaceViewType, h as isDataListViewTypeSupported, s as showsListPageHubMetricsStrip } from '../data-list-view-registry-CyBoBML4.js';
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/lib/data-list-view.ts
|
|
2
|
+
var DATA_LIST_VIEW_TILES = [
|
|
3
|
+
{ value: "table", icon: "fa-table", label: "Table view" },
|
|
4
|
+
{ value: "list", icon: "fa-list", label: "List view" },
|
|
5
|
+
{ value: "board", icon: "fa-table-columns", label: "Board view" },
|
|
6
|
+
{ value: "dashboard", icon: "fa-chart-mixed", label: "Dashboard view" },
|
|
7
|
+
{ value: "calendar", icon: "fa-calendar-days", label: "Calendar view" },
|
|
8
|
+
{ value: "folder", icon: "fa-grid-2", label: "Folder view" },
|
|
9
|
+
{ value: "panel", icon: "fa-sidebar", label: "List & details" },
|
|
10
|
+
{ value: "tree-panel", icon: "fa-sitemap", label: "Tree & details" }
|
|
11
|
+
];
|
|
12
|
+
function dataListViewLabel(view) {
|
|
13
|
+
return DATA_LIST_VIEW_TILES.find((t) => t.value === view)?.label ?? view;
|
|
14
|
+
}
|
|
15
|
+
function dataListViewIcon(view) {
|
|
16
|
+
return DATA_LIST_VIEW_TILES.find((t) => t.value === view)?.icon ?? "fa-table";
|
|
17
|
+
}
|
|
18
|
+
function dataListViewAddShortcut(index) {
|
|
19
|
+
if (index < 0 || index > 8) return void 0;
|
|
20
|
+
return String(index + 1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/lib/data-list-view-surface.ts
|
|
24
|
+
function getDataListViewRenderKind(view) {
|
|
25
|
+
switch (view) {
|
|
26
|
+
case "table":
|
|
27
|
+
return "data-table";
|
|
28
|
+
case "list":
|
|
29
|
+
return "list-with-toolbar";
|
|
30
|
+
case "board":
|
|
31
|
+
return "board-with-toolbar";
|
|
32
|
+
case "dashboard":
|
|
33
|
+
return "dashboard-with-toolbar";
|
|
34
|
+
case "calendar":
|
|
35
|
+
return "calendar-with-toolbar";
|
|
36
|
+
case "folder":
|
|
37
|
+
return "folder-with-toolbar";
|
|
38
|
+
case "panel":
|
|
39
|
+
return "panel-with-toolbar";
|
|
40
|
+
case "tree-panel":
|
|
41
|
+
return "tree-panel-with-toolbar";
|
|
42
|
+
default: {
|
|
43
|
+
const _x = view;
|
|
44
|
+
return _x;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/lib/data-list-view-registry.ts
|
|
50
|
+
var DEFINITIONS = DATA_LIST_VIEW_TILES.map((tile) => {
|
|
51
|
+
const renderKind = getDataListViewRenderKind(tile.value);
|
|
52
|
+
const hubMetricsStrip = renderKind !== "calendar-with-toolbar" && renderKind !== "dashboard-with-toolbar";
|
|
53
|
+
return {
|
|
54
|
+
value: tile.value,
|
|
55
|
+
label: tile.label,
|
|
56
|
+
icon: tile.icon,
|
|
57
|
+
renderKind,
|
|
58
|
+
hubMetricsStrip
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
var BY_VALUE = new Map(
|
|
62
|
+
DEFINITIONS.map((d) => [d.value, d])
|
|
63
|
+
);
|
|
64
|
+
var DATA_LIST_VIEW_REGISTRY = DEFINITIONS;
|
|
65
|
+
function dataListViewDefinition(view) {
|
|
66
|
+
const def = BY_VALUE.get(view);
|
|
67
|
+
if (!def) {
|
|
68
|
+
throw new Error(`Unknown DataListViewType: ${view}`);
|
|
69
|
+
}
|
|
70
|
+
return def;
|
|
71
|
+
}
|
|
72
|
+
function showsListPageHubMetricsStrip(view) {
|
|
73
|
+
return dataListViewDefinition(view).hubMetricsStrip;
|
|
74
|
+
}
|
|
75
|
+
function dataListViewTilesForHub(supported) {
|
|
76
|
+
const allowed = new Set(supported);
|
|
77
|
+
return DATA_LIST_VIEW_REGISTRY.filter((d) => allowed.has(d.value)).map((d) => ({
|
|
78
|
+
type: d.value,
|
|
79
|
+
label: d.label,
|
|
80
|
+
icon: d.icon
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
function dataListViewSelectionTilesForHub(supported) {
|
|
84
|
+
return dataListViewTilesForHub(supported).map((t) => ({
|
|
85
|
+
value: t.type,
|
|
86
|
+
label: t.label,
|
|
87
|
+
icon: t.icon
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
var DATA_LIST_SURFACE_VIEW_TYPES = new Set(
|
|
91
|
+
DATA_LIST_VIEW_REGISTRY.map((d) => d.value)
|
|
92
|
+
);
|
|
93
|
+
function isDataListSurfaceViewType(viewType) {
|
|
94
|
+
return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType);
|
|
95
|
+
}
|
|
96
|
+
function isDataListViewTypeSupported(view, supported) {
|
|
97
|
+
return supported.includes(view);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { DATA_LIST_SURFACE_VIEW_TYPES, DATA_LIST_VIEW_REGISTRY, dataListViewAddShortcut, dataListViewDefinition, dataListViewIcon, dataListViewLabel, dataListViewSelectionTilesForHub, dataListViewTilesForHub, getDataListViewRenderKind, isDataListSurfaceViewType, isDataListViewTypeSupported, showsListPageHubMetricsStrip };
|
|
101
|
+
//# sourceMappingURL=data-list-view-registry.js.map
|
|
102
|
+
//# sourceMappingURL=data-list-view-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/data-list-view.ts","../../src/lib/data-list-view-surface.ts","../../src/lib/data-list-view-registry.ts"],"names":[],"mappings":"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","file":"data-list-view-registry.js","sourcesContent":["/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// src/lib/data-list-view.ts
|
|
2
|
+
var DATA_LIST_VIEW_TILES = [
|
|
3
|
+
{ value: "table", icon: "fa-table", label: "Table view" },
|
|
4
|
+
{ value: "list", icon: "fa-list", label: "List view" },
|
|
5
|
+
{ value: "board", icon: "fa-table-columns", label: "Board view" },
|
|
6
|
+
{ value: "dashboard", icon: "fa-chart-mixed", label: "Dashboard view" },
|
|
7
|
+
{ value: "calendar", icon: "fa-calendar-days", label: "Calendar view" },
|
|
8
|
+
{ value: "folder", icon: "fa-grid-2", label: "Folder view" },
|
|
9
|
+
{ value: "panel", icon: "fa-sidebar", label: "List & details" },
|
|
10
|
+
{ value: "tree-panel", icon: "fa-sitemap", label: "Tree & details" }
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
// src/lib/data-list-view-registry.ts
|
|
14
|
+
var DEFINITIONS = DATA_LIST_VIEW_TILES.map((tile) => {
|
|
15
|
+
const renderKind = getDataListViewRenderKind(tile.value);
|
|
16
|
+
const hubMetricsStrip = renderKind !== "calendar-with-toolbar" && renderKind !== "dashboard-with-toolbar";
|
|
17
|
+
return {
|
|
18
|
+
value: tile.value,
|
|
19
|
+
label: tile.label,
|
|
20
|
+
icon: tile.icon,
|
|
21
|
+
renderKind,
|
|
22
|
+
hubMetricsStrip
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
var BY_VALUE = new Map(
|
|
26
|
+
DEFINITIONS.map((d) => [d.value, d])
|
|
27
|
+
);
|
|
28
|
+
var DATA_LIST_VIEW_REGISTRY = DEFINITIONS;
|
|
29
|
+
function dataListViewDefinition(view) {
|
|
30
|
+
const def = BY_VALUE.get(view);
|
|
31
|
+
if (!def) {
|
|
32
|
+
throw new Error(`Unknown DataListViewType: ${view}`);
|
|
33
|
+
}
|
|
34
|
+
return def;
|
|
35
|
+
}
|
|
36
|
+
function showsListPageHubMetricsStrip(view) {
|
|
37
|
+
return dataListViewDefinition(view).hubMetricsStrip;
|
|
38
|
+
}
|
|
39
|
+
new Set(
|
|
40
|
+
DATA_LIST_VIEW_REGISTRY.map((d) => d.value)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// src/lib/data-list-view-surface.ts
|
|
44
|
+
function getDataListViewRenderKind(view) {
|
|
45
|
+
switch (view) {
|
|
46
|
+
case "table":
|
|
47
|
+
return "data-table";
|
|
48
|
+
case "list":
|
|
49
|
+
return "list-with-toolbar";
|
|
50
|
+
case "board":
|
|
51
|
+
return "board-with-toolbar";
|
|
52
|
+
case "dashboard":
|
|
53
|
+
return "dashboard-with-toolbar";
|
|
54
|
+
case "calendar":
|
|
55
|
+
return "calendar-with-toolbar";
|
|
56
|
+
case "folder":
|
|
57
|
+
return "folder-with-toolbar";
|
|
58
|
+
case "panel":
|
|
59
|
+
return "panel-with-toolbar";
|
|
60
|
+
case "tree-panel":
|
|
61
|
+
return "tree-panel-with-toolbar";
|
|
62
|
+
default: {
|
|
63
|
+
const _x = view;
|
|
64
|
+
return _x;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function usesDataTableComponent(view) {
|
|
69
|
+
return view === "table";
|
|
70
|
+
}
|
|
71
|
+
function usesDashboardSurface(view) {
|
|
72
|
+
return view === "dashboard";
|
|
73
|
+
}
|
|
74
|
+
function usesToolbarWithFilteredRows(view) {
|
|
75
|
+
return view === "list" || view === "board" || view === "dashboard" || view === "calendar" || view === "folder" || view === "panel" || view === "tree-panel";
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { getDataListViewRenderKind, showsListPageHubMetricsStrip, usesDashboardSurface, usesDataTableComponent, usesToolbarWithFilteredRows };
|
|
79
|
+
//# sourceMappingURL=data-list-view-surface.js.map
|
|
80
|
+
//# sourceMappingURL=data-list-view-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/data-list-view.ts","../../src/lib/data-list-view-registry.ts","../../src/lib/data-list-view-surface.ts"],"names":[],"mappings":"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","file":"data-list-view-surface.js","sourcesContent":["/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.
|
|
3
|
+
*
|
|
4
|
+
* **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and
|
|
5
|
+
* `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard
|
|
6
|
+
* stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).
|
|
7
|
+
*/
|
|
8
|
+
type DataListViewType = "table" | "list" | "board" | "dashboard" | "calendar" | "folder" | "panel" | "tree-panel";
|
|
9
|
+
declare const DATA_LIST_VIEW_TILES: readonly {
|
|
10
|
+
value: DataListViewType;
|
|
11
|
+
label: string;
|
|
12
|
+
icon: string;
|
|
13
|
+
}[];
|
|
14
|
+
/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */
|
|
15
|
+
declare function dataListViewLabel(view: DataListViewType): string;
|
|
16
|
+
/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */
|
|
17
|
+
declare function dataListViewIcon(view: DataListViewType): string;
|
|
18
|
+
/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */
|
|
19
|
+
declare function dataListViewAddShortcut(index: number): string | undefined;
|
|
20
|
+
|
|
21
|
+
export { DATA_LIST_VIEW_TILES, type DataListViewType, dataListViewAddShortcut, dataListViewIcon, dataListViewLabel };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/lib/data-list-view.ts
|
|
2
|
+
var DATA_LIST_VIEW_TILES = [
|
|
3
|
+
{ value: "table", icon: "fa-table", label: "Table view" },
|
|
4
|
+
{ value: "list", icon: "fa-list", label: "List view" },
|
|
5
|
+
{ value: "board", icon: "fa-table-columns", label: "Board view" },
|
|
6
|
+
{ value: "dashboard", icon: "fa-chart-mixed", label: "Dashboard view" },
|
|
7
|
+
{ value: "calendar", icon: "fa-calendar-days", label: "Calendar view" },
|
|
8
|
+
{ value: "folder", icon: "fa-grid-2", label: "Folder view" },
|
|
9
|
+
{ value: "panel", icon: "fa-sidebar", label: "List & details" },
|
|
10
|
+
{ value: "tree-panel", icon: "fa-sitemap", label: "Tree & details" }
|
|
11
|
+
];
|
|
12
|
+
function dataListViewLabel(view) {
|
|
13
|
+
return DATA_LIST_VIEW_TILES.find((t) => t.value === view)?.label ?? view;
|
|
14
|
+
}
|
|
15
|
+
function dataListViewIcon(view) {
|
|
16
|
+
return DATA_LIST_VIEW_TILES.find((t) => t.value === view)?.icon ?? "fa-table";
|
|
17
|
+
}
|
|
18
|
+
function dataListViewAddShortcut(index) {
|
|
19
|
+
if (index < 0 || index > 8) return void 0;
|
|
20
|
+
return String(index + 1);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { DATA_LIST_VIEW_TILES, dataListViewAddShortcut, dataListViewIcon, dataListViewLabel };
|
|
24
|
+
//# sourceMappingURL=data-list-view.js.map
|
|
25
|
+
//# sourceMappingURL=data-list-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/data-list-view.ts"],"names":[],"mappings":";AAiBO,IAAM,oBAAA,GAIP;AAAA,EACJ,EAAE,KAAA,EAAO,OAAA,EAAa,IAAA,EAAM,UAAA,EAAoB,OAAO,YAAA,EAAa;AAAA,EACpE,EAAE,KAAA,EAAO,MAAA,EAAa,IAAA,EAAM,SAAA,EAAoB,OAAO,WAAA,EAAY;AAAA,EACnE,EAAE,KAAA,EAAO,OAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,OAAO,YAAA,EAAa;AAAA,EACpE,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,gBAAA,EAAoB,OAAO,gBAAA,EAAiB;AAAA,EACxE,EAAE,KAAA,EAAO,UAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,OAAO,eAAA,EAAgB;AAAA,EACvE,EAAE,KAAA,EAAO,QAAA,EAAa,IAAA,EAAM,WAAA,EAAoB,OAAO,aAAA,EAAc;AAAA,EACrE,EAAE,KAAA,EAAO,OAAA,EAAc,IAAA,EAAM,YAAA,EAAmB,OAAO,gBAAA,EAAiB;AAAA,EACxE,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,YAAA,EAAmB,OAAO,gBAAA;AACzD;AAGO,SAAS,kBAAkB,IAAA,EAAgC;AAChE,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,IAAI,GAAG,KAAA,IAAS,IAAA;AACpE;AAGO,SAAS,iBAAiB,IAAA,EAAgC;AAC/D,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,IAAI,GAAG,IAAA,IAAQ,UAAA;AACnE;AAGO,SAAS,wBAAwB,KAAA,EAAmC;AACzE,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG,OAAO,MAAA;AACnC,EAAA,OAAO,MAAA,CAAO,QAAQ,CAAC,CAAA;AACzB","file":"data-list-view.js","sourcesContent":["/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format any date string (ISO, MM/DD/YYYY, "Mar 15 2026", etc.) into the
|
|
3
|
+
* app-wide display format: MM/DD/YYYY.
|
|
4
|
+
* Returns "—" for empty / unparseable values.
|
|
5
|
+
*/
|
|
6
|
+
declare function formatDateUS(raw: string | null | undefined): string;
|
|
7
|
+
/** Format a `Date` with local calendar fields as MM/DD/YYYY (avoids UTC drift from `toISOString()`). */
|
|
8
|
+
declare function formatDateFromDate(raw: Date | null | undefined): string;
|
|
9
|
+
/**
|
|
10
|
+
* Format a Date (or ISO string) into "MM/DD/YYYY hh:mm AM/PM EST".
|
|
11
|
+
* Time zone label is always appended as the literal string "EST" (display only).
|
|
12
|
+
*/
|
|
13
|
+
declare function formatDateTimeUS(raw: Date | string | null | undefined): string;
|
|
14
|
+
/** Parse a human-readable date string into YYYY-MM-DD for comparison (local timezone). */
|
|
15
|
+
declare function parseRowDateToYmd(raw: string): string | null;
|
|
16
|
+
/** Format YYYY-MM-DD for filter chip labels (MM/DD/YYYY). */
|
|
17
|
+
declare function formatYmdForDisplay(ymd: string): string;
|
|
18
|
+
/** Local noon to avoid timezone shifting the calendar day. */
|
|
19
|
+
declare function ymdToLocalDate(ymd: string | undefined): Date | undefined;
|
|
20
|
+
declare function localDateToYmd(d: Date): string;
|
|
21
|
+
|
|
22
|
+
export { formatDateFromDate, formatDateTimeUS, formatDateUS, formatYmdForDisplay, localDateToYmd, parseRowDateToYmd, ymdToLocalDate };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// src/lib/date-filter.ts
|
|
2
|
+
function formatDateUS(raw) {
|
|
3
|
+
if (!raw || raw.trim() === "\u2014" || raw.trim() === "-") return "\u2014";
|
|
4
|
+
if (/^\d{2}\/\d{2}\/\d{4}$/.test(raw.trim())) return raw.trim();
|
|
5
|
+
const d = new Date(raw);
|
|
6
|
+
if (Number.isNaN(d.getTime())) return raw;
|
|
7
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
8
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
9
|
+
const y = d.getFullYear();
|
|
10
|
+
return `${m}/${day}/${y}`;
|
|
11
|
+
}
|
|
12
|
+
function formatDateFromDate(raw) {
|
|
13
|
+
if (!raw || Number.isNaN(raw.getTime())) return "\u2014";
|
|
14
|
+
const m = String(raw.getMonth() + 1).padStart(2, "0");
|
|
15
|
+
const day = String(raw.getDate()).padStart(2, "0");
|
|
16
|
+
const y = raw.getFullYear();
|
|
17
|
+
return `${m}/${day}/${y}`;
|
|
18
|
+
}
|
|
19
|
+
function formatDateTimeUS(raw) {
|
|
20
|
+
if (!raw) return "\u2014";
|
|
21
|
+
const d = raw instanceof Date ? raw : new Date(raw);
|
|
22
|
+
if (Number.isNaN(d.getTime())) return String(raw);
|
|
23
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
24
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
25
|
+
const y = d.getFullYear();
|
|
26
|
+
let h = d.getHours();
|
|
27
|
+
const min = String(d.getMinutes()).padStart(2, "0");
|
|
28
|
+
const ampm = h >= 12 ? "PM" : "AM";
|
|
29
|
+
h = h % 12 || 12;
|
|
30
|
+
return `${m}/${day}/${y} ${String(h).padStart(2, "0")}:${min} ${ampm} EST`;
|
|
31
|
+
}
|
|
32
|
+
function parseRowDateToYmd(raw) {
|
|
33
|
+
const t = raw.trim();
|
|
34
|
+
if (!t || t === "\u2014" || t === "-") return null;
|
|
35
|
+
const d = new Date(t);
|
|
36
|
+
if (Number.isNaN(d.getTime())) return null;
|
|
37
|
+
const y = d.getFullYear();
|
|
38
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
39
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
40
|
+
return `${y}-${m}-${day}`;
|
|
41
|
+
}
|
|
42
|
+
function formatYmdForDisplay(ymd) {
|
|
43
|
+
const d = ymdToLocalDate(ymd);
|
|
44
|
+
if (!d) return ymd;
|
|
45
|
+
return formatDateFromDate(d);
|
|
46
|
+
}
|
|
47
|
+
function ymdToLocalDate(ymd) {
|
|
48
|
+
if (!ymd || !/^\d{4}-\d{2}-\d{2}$/.test(ymd)) return void 0;
|
|
49
|
+
const [y, m, d] = ymd.split("-").map(Number);
|
|
50
|
+
return new Date(y, m - 1, d, 12, 0, 0, 0);
|
|
51
|
+
}
|
|
52
|
+
function localDateToYmd(d) {
|
|
53
|
+
const y = d.getFullYear();
|
|
54
|
+
const m = String(d.getMonth() + 1).padStart(2, "0");
|
|
55
|
+
const day = String(d.getDate()).padStart(2, "0");
|
|
56
|
+
return `${y}-${m}-${day}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { formatDateFromDate, formatDateTimeUS, formatDateUS, formatYmdForDisplay, localDateToYmd, parseRowDateToYmd, ymdToLocalDate };
|
|
60
|
+
//# sourceMappingURL=date-filter.js.map
|
|
61
|
+
//# sourceMappingURL=date-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/date-filter.ts"],"names":[],"mappings":"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","file":"date-filter.js","sourcesContent":["/**\n * Format any date string (ISO, MM/DD/YYYY, \"Mar 15 2026\", etc.) into the\n * app-wide display format: MM/DD/YYYY.\n * Returns \"—\" for empty / unparseable values.\n */\nexport function formatDateUS(raw: string | null | undefined): string {\n if (!raw || raw.trim() === \"—\" || raw.trim() === \"-\") return \"—\"\n // Already MM/DD/YYYY — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(raw.trim())) return raw.trim()\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return raw\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/** Format a `Date` with local calendar fields as MM/DD/YYYY (avoids UTC drift from `toISOString()`). */\nexport function formatDateFromDate(raw: Date | null | undefined): string {\n if (!raw || Number.isNaN(raw.getTime())) return \"—\"\n const m = String(raw.getMonth() + 1).padStart(2, \"0\")\n const day = String(raw.getDate()).padStart(2, \"0\")\n const y = raw.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/**\n * Format a Date (or ISO string) into \"MM/DD/YYYY hh:mm AM/PM EST\".\n * Time zone label is always appended as the literal string \"EST\" (display only).\n */\nexport function formatDateTimeUS(raw: Date | string | null | undefined): string {\n if (!raw) return \"—\"\n const d = raw instanceof Date ? raw : new Date(raw)\n if (Number.isNaN(d.getTime())) return String(raw)\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n let h = d.getHours()\n const min = String(d.getMinutes()).padStart(2, \"0\")\n const ampm = h >= 12 ? \"PM\" : \"AM\"\n h = h % 12 || 12\n return `${m}/${day}/${y} ${String(h).padStart(2, \"0\")}:${min} ${ampm} EST`\n}\n\n/** Parse a human-readable date string into YYYY-MM-DD for comparison (local timezone). */\nexport function parseRowDateToYmd(raw: string): string | null {\n const t = raw.trim()\n if (!t || t === \"—\" || t === \"-\") return null\n const d = new Date(t)\n if (Number.isNaN(d.getTime())) return null\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n\n/** Format YYYY-MM-DD for filter chip labels (MM/DD/YYYY). */\nexport function formatYmdForDisplay(ymd: string): string {\n const d = ymdToLocalDate(ymd)\n if (!d) return ymd\n return formatDateFromDate(d)\n}\n\n/** Local noon to avoid timezone shifting the calendar day. */\nexport function ymdToLocalDate(ymd: string | undefined): Date | undefined {\n if (!ymd || !/^\\d{4}-\\d{2}-\\d{2}$/.test(ymd)) return undefined\n const [y, m, d] = ymd.split(\"-\").map(Number)\n return new Date(y, m - 1, d, 12, 0, 0, 0)\n}\n\nexport function localDateToYmd(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logs only in development. Use for mock flows (export, submit) instead of
|
|
3
|
+
* raw `console.log`. Bundlers replace `process.env.NODE_ENV` at build time,
|
|
4
|
+
* so the call site disappears entirely in production bundles.
|
|
5
|
+
*/
|
|
6
|
+
declare function devLog(...args: unknown[]): void;
|
|
7
|
+
|
|
8
|
+
export { devLog };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/dev-log.ts"],"names":[],"mappings":";AAKO,SAAS,UAAU,IAAA,EAAuB;AAC/C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,EACrB;AACF","file":"dev-log.js","sourcesContent":["/**\n * Logs only in development. Use for mock flows (export, submit) instead of\n * raw `console.log`. Bundlers replace `process.env.NODE_ENV` at build time,\n * so the call site disappears entirely in production bundles.\n */\nexport function devLog(...args: unknown[]): void {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args)\n }\n}\n"]}
|