@alfakit/vue 0.1.1 → 0.1.6
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 +16 -0
- package/dist/AlfakitRoot.js.map +1 -1
- package/dist/AlfakitRoot.vue.d.ts.map +1 -1
- package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionButton.js.map +1 -1
- package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionGroupMenu.js.map +1 -1
- package/dist/components/actions/ActionGroupMenu.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js +69 -65
- package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionModal.js.map +1 -1
- package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +221 -219
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ai/AiCopilot.js.map +1 -1
- package/dist/components/ai/AiCopilot.vue.d.ts +2 -0
- package/dist/components/ai/AiCopilot.vue.d.ts.map +1 -1
- package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js +7 -2
- package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js +19 -19
- package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cms/LivePreview.js.map +1 -1
- package/dist/components/cms/LivePreview.vue.d.ts.map +1 -1
- package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js +83 -83
- package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/BuilderField.js.map +1 -1
- package/dist/components/fields/BuilderField.vue.d.ts.map +1 -1
- package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js +162 -157
- package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ColorPickerField.js.map +1 -1
- package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/FileUploadField.js.map +1 -1
- package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ImageEditorDialog.js.map +1 -1
- package/dist/components/fields/ImageEditorDialog.vue.d.ts.map +1 -1
- package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js +46 -46
- package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/KeyValueField.js.map +1 -1
- package/dist/components/fields/KeyValueField.vue.d.ts.map +1 -1
- package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js +66 -66
- package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ModalTablePicker.js.map +1 -1
- package/dist/components/fields/ModalTablePicker.vue.d.ts.map +1 -1
- package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js +113 -113
- package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RepeaterField.js.map +1 -1
- package/dist/components/fields/RepeaterField.vue.d.ts.map +1 -1
- package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js +12 -12
- package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RichEditorInput.js.map +1 -1
- package/dist/components/fields/RichEditorInput.vue.d.ts.map +1 -1
- package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js +166 -165
- package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SelectField.js.map +1 -1
- package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SliderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/item-actions.d.ts +2 -2
- package/dist/components/fields/item-actions.d.ts.map +1 -1
- package/dist/components/fields/item-actions.js +31 -31
- package/dist/components/fields/item-actions.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/FormBlock.js.map +1 -1
- package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/form-context.js +25 -25
- package/dist/components/form/form-context.js.map +1 -1
- package/dist/components/kanban/KanbanBoard.js.map +1 -1
- package/dist/components/kanban/KanbanBoard.vue.d.ts.map +1 -1
- package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.js.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.vue.d.ts.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js +64 -64
- package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/SectionComponent.js.map +1 -1
- package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +23 -23
- package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/TabsComponent.js.map +1 -1
- package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearch.js.map +1 -1
- package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.js.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js +102 -96
- package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/TenantMenu.js.map +1 -1
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +37 -37
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js +11 -11
- package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/realtime/use-live-updates.d.ts.map +1 -1
- package/dist/components/realtime/use-live-updates.js +24 -23
- package/dist/components/realtime/use-live-updates.js.map +1 -1
- package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ColumnHeader.js.map +1 -1
- package/dist/components/table/ColumnHeader.vue.d.ts.map +1 -1
- package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js +55 -49
- package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ColumnManager.js.map +1 -1
- package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ContentLayoutSort.js.map +1 -1
- package/dist/components/table/ContentLayoutSort.vue.d.ts.map +1 -1
- package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectCell.js.map +1 -1
- package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +26 -20
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TableCellContent.js.map +1 -1
- package/dist/components/table/TableCellContent.vue.d.ts.map +1 -1
- package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js +4 -3
- package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TablePagination.js.map +1 -1
- package/dist/components/table/TablePagination.vue.d.ts.map +1 -1
- package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js +87 -87
- package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TextInputCell.js.map +1 -1
- package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +40 -34
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/cell-update.d.ts +6 -0
- package/dist/components/table/cell-update.d.ts.map +1 -1
- package/dist/components/table/cell-update.js.map +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/CommandAutoHighlight.js +7 -0
- package/dist/components/ui/CommandAutoHighlight.js.map +1 -0
- package/dist/components/ui/CommandAutoHighlight.vue.d.ts +21 -0
- package/dist/components/ui/CommandAutoHighlight.vue.d.ts.map +1 -0
- package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js +18 -0
- package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ui/DialogContent.js.map +1 -1
- package/dist/components/ui/DialogContent.vue.d.ts.map +1 -1
- package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js +13 -12
- package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/PopoverContent.js.map +1 -1
- package/dist/components/ui/PopoverContent.vue.d.ts.map +1 -1
- package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js +9 -8
- package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/SheetContent.js.map +1 -1
- package/dist/components/ui/SheetContent.vue.d.ts.map +1 -1
- package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js +13 -12
- package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/TooltipContent.js.map +1 -1
- package/dist/components/ui/TooltipContent.vue.d.ts.map +1 -1
- package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js +9 -8
- package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components.css +347 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -26
- package/dist/context.js.map +1 -1
- package/dist/create-alfakit.d.ts.map +1 -1
- package/dist/create-alfakit.js +33 -31
- package/dist/create-alfakit.js.map +1 -1
- package/dist/eject-manifest.json +11 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +219 -217
- package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/AuthLayout.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/lazy-layouts.d.ts +10 -0
- package/dist/layouts/lazy-layouts.d.ts.map +1 -0
- package/dist/layouts/lazy-layouts.js +8 -0
- package/dist/layouts/lazy-layouts.js.map +1 -0
- package/dist/layouts/panel-layouts.d.ts +8 -0
- package/dist/layouts/panel-layouts.d.ts.map +1 -0
- package/dist/layouts/panel-layouts.js +15 -0
- package/dist/layouts/panel-layouts.js.map +1 -0
- package/dist/lib/lazy.d.ts.map +1 -1
- package/dist/lib/lazy.js +2 -2
- package/dist/lib/lazy.js.map +1 -1
- package/dist/pages/PageShell.js.map +1 -1
- package/dist/pages/PageShell.vue.d.ts.map +1 -1
- package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js +39 -42
- package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/AlfakitComponent.js.map +1 -1
- package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +56 -52
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/AlfakitToaster.js.map +1 -1
- package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone.css +54 -0
- package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts +2 -2
- package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +17 -12
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/dashboard-widgets.d.ts +54 -0
- package/dist/starter-kit/dashboard-widgets.d.ts.map +1 -0
- package/dist/starter-kit/dashboard-widgets.js +54 -0
- package/dist/starter-kit/dashboard-widgets.js.map +1 -0
- package/dist/starter-kit/index.d.ts +2 -1
- package/dist/starter-kit/index.d.ts.map +1 -1
- package/dist/starter-kit/index.js +5 -4
- package/dist/starter-kit/runtime.d.ts +6 -0
- package/dist/starter-kit/runtime.d.ts.map +1 -1
- package/dist/starter-kit/runtime.js +19 -15
- package/dist/starter-kit/runtime.js.map +1 -1
- package/dist/starter-kit/starter-kit.d.ts.map +1 -1
- package/dist/starter-kit/starter-kit.js +8 -8
- package/dist/starter-kit/starter-kit.js.map +1 -1
- package/dist/starter-kit/widgets/CopilotTrigger.js +7 -0
- package/dist/starter-kit/widgets/CopilotTrigger.js.map +1 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts +12 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js +23 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.js +7 -0
- package/dist/starter-kit/widgets/LoadedCopilot.js.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts +8 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js +7 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js.map +1 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts +8 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/index.d.ts +40 -9
- package/dist/starter-kit/widgets/index.d.ts.map +1 -1
- package/dist/starter-kit/widgets/index.js +21 -18
- package/dist/starter-kit/widgets/index.js.map +1 -1
- package/dist/starter-kit/widgets/loaded.d.ts +10 -0
- package/dist/starter-kit/widgets/loaded.d.ts.map +1 -0
- package/dist/starter-kit/widgets/loaded.js +5 -0
- package/dist/styles.css +9 -2
- package/dist/themes.css +8 -335
- package/package.json +3 -3
- package/src/AlfakitRoot.vue +9 -1
- package/src/components/actions/ActionButton.vue +14 -6
- package/src/components/actions/ActionGroupMenu.vue +13 -1
- package/src/components/actions/ActionModal.vue +12 -1
- package/src/components/ai/AiCopilot.vue +7 -1
- package/src/components/cms/LivePreview.vue +8 -2
- package/src/components/fields/BuilderField.vue +15 -2
- package/src/components/fields/ColorPickerField.vue +1 -0
- package/src/components/fields/ComboboxSelect.vue +1 -1
- package/src/components/fields/FileUploadField.vue +14 -11
- package/src/components/fields/ImageEditorDialog.vue +7 -3
- package/src/components/fields/KeyValueField.vue +3 -2
- package/src/components/fields/ModalTablePicker.vue +7 -2
- package/src/components/fields/OneTimeCodeInputField.vue +1 -1
- package/src/components/fields/RepeaterField.vue +2 -3
- package/src/components/fields/RichEditorInput.vue +3 -0
- package/src/components/fields/SelectField.vue +4 -2
- package/src/components/fields/TableColumnHeaders.vue +6 -1
- package/src/components/fields/item-actions.ts +31 -10
- package/src/components/file-manager/FileManagerView.vue +1 -1
- package/src/components/form/FormBlock.vue +26 -1
- package/src/components/form/form-context.ts +3 -3
- package/src/components/kanban/KanbanBoard.vue +15 -3
- package/src/components/kanban/KanbanColumnHeader.vue +6 -4
- package/src/components/layout/FusedGroupComponent.vue +1 -0
- package/src/components/layout/SectionComponent.vue +10 -4
- package/src/components/layout/TabsComponent.vue +61 -5
- package/src/components/notifications/NotificationsMenu.vue +11 -0
- package/src/components/panel/GlobalSearch.vue +1 -0
- package/src/components/panel/GlobalSearchPalette.vue +2 -0
- package/src/components/panel/ShortcutKeys.vue +1 -0
- package/src/components/panel/TenantMenu.vue +2 -2
- package/src/components/realtime/use-live-updates.ts +3 -1
- package/src/components/table/ColumnHeader.vue +23 -12
- package/src/components/table/ColumnManager.vue +12 -8
- package/src/components/table/ContentLayoutSort.vue +7 -1
- package/src/components/table/GroupHeaderRow.vue +27 -0
- package/src/components/table/SelectCell.vue +5 -2
- package/src/components/table/TableCellContent.vue +4 -2
- package/src/components/table/TablePagination.vue +12 -7
- package/src/components/table/TextInputCell.vue +11 -5
- package/src/components/table/cell-update.ts +6 -0
- package/src/components/ui/CommandAutoHighlight.vue +27 -0
- package/src/components/ui/DialogContent.vue +5 -1
- package/src/components/ui/PopoverContent.vue +5 -1
- package/src/components/ui/SheetContent.vue +5 -1
- package/src/components/ui/TooltipContent.vue +5 -1
- package/src/context.ts +10 -0
- package/src/create-alfakit.ts +5 -0
- package/src/index.ts +2 -0
- package/src/layouts/lazy-layouts.ts +14 -0
- package/src/layouts/panel-layouts.ts +17 -0
- package/src/lib/lazy.ts +11 -1
- package/src/pages/PageShell.vue +5 -6
- package/src/standalone/AlfakitComponent.vue +17 -6
- package/src/standalone/AlfakitToaster.vue +12 -2
- package/src/starter-kit/AlfakitStarterKitRoot.vue +12 -3
- package/src/starter-kit/dashboard-widgets.ts +93 -0
- package/src/starter-kit/index.ts +7 -1
- package/src/starter-kit/runtime.ts +17 -1
- package/src/starter-kit/starter-kit.ts +2 -1
- package/src/starter-kit/widgets/CopilotTrigger.vue +58 -0
- package/src/starter-kit/widgets/LoadedCopilot.vue +29 -0
- package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
- package/src/starter-kit/widgets/StarterKitImpersonationBanner.vue +57 -0
- package/src/starter-kit/widgets/TenantChooser.vue +1 -1
- package/src/starter-kit/widgets/index.ts +56 -11
- package/src/starter-kit/widgets/loaded.ts +9 -0
- package/src/styles.css +9 -2
|
@@ -5,12 +5,12 @@ import r from "../ui/Spinner.js";
|
|
|
5
5
|
import i from "../ui/Input.js";
|
|
6
6
|
import a from "../ui/TableHead.js";
|
|
7
7
|
import o from "../panel/Slot.js";
|
|
8
|
-
import { ariaSort as s, columnVisibilityClasses as c,
|
|
9
|
-
import { Fragment as
|
|
10
|
-
import { ArrowDownIcon as
|
|
11
|
-
import { createReusableTemplate as
|
|
8
|
+
import { ariaSort as s, columnVisibilityClasses as c, debounce as l, visitTable as u } from "@alfakit/core";
|
|
9
|
+
import { Fragment as d, createBlock as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createTextVNode as g, createVNode as _, defineComponent as v, mergeProps as y, onBeforeUnmount as b, openBlock as x, ref as S, toDisplayString as C, unref as w, withCtx as T, withKeys as E } from "vue";
|
|
10
|
+
import { ArrowDownIcon as D, ArrowUpDownIcon as O, ArrowUpIcon as k } from "@lucide/vue";
|
|
11
|
+
import { createReusableTemplate as A } from "@vueuse/core";
|
|
12
12
|
//#region src/components/table/ColumnHeader.vue?vue&type=script&setup=true&lang.ts
|
|
13
|
-
var
|
|
13
|
+
var j = ["aria-busy"], M = { class: "flex flex-col gap-1" }, N = ["title"], P = { class: "sr-only" }, F = /*@__PURE__*/ v({
|
|
14
14
|
__name: "ColumnHeader",
|
|
15
15
|
props: {
|
|
16
16
|
table: {},
|
|
@@ -18,88 +18,94 @@ var k = ["aria-busy"], A = { class: "flex flex-col gap-1" }, j = ["title"], M =
|
|
|
18
18
|
rowSpan: {},
|
|
19
19
|
component: {}
|
|
20
20
|
},
|
|
21
|
-
setup(
|
|
22
|
-
let
|
|
21
|
+
setup(v) {
|
|
22
|
+
let F = {
|
|
23
23
|
start: "text-start",
|
|
24
24
|
center: "text-center",
|
|
25
25
|
end: "text-end",
|
|
26
26
|
between: "text-start",
|
|
27
27
|
justify: "text-justify"
|
|
28
|
-
},
|
|
29
|
-
let e =
|
|
30
|
-
|
|
31
|
-
sort:
|
|
28
|
+
}, I = v, L = e(), [R, z] = A(), B = S(!1), V = () => {
|
|
29
|
+
let e = I.table.sort?.column === I.column.name && I.table.sort.direction === "asc" ? "desc" : "asc";
|
|
30
|
+
B.value = !0, u(I.table.identifier, {
|
|
31
|
+
sort: I.column.name,
|
|
32
32
|
direction: e
|
|
33
33
|
}, ["page"], { onFinish: () => {
|
|
34
|
-
|
|
34
|
+
B.value = !1;
|
|
35
35
|
} });
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
}, H = l((e) => u(I.table.identifier, { columnSearch: {
|
|
37
|
+
...I.table.columnSearches ?? {},
|
|
38
|
+
[I.column.name]: e
|
|
39
|
+
} }, ["page"]), I.table.searchDebounce);
|
|
40
|
+
b(() => H.cancel());
|
|
41
|
+
let U = (e) => {
|
|
42
|
+
I.table.searchOnBlur || H(e);
|
|
43
|
+
}, W = (e) => {
|
|
44
|
+
H(e.target.value), H.flush();
|
|
41
45
|
};
|
|
42
|
-
return (e, l) => (
|
|
43
|
-
default:
|
|
46
|
+
return (e, l) => (x(), m(d, null, [_(w(R), null, {
|
|
47
|
+
default: T(() => [I.column.sortable ? (x(), m("button", {
|
|
44
48
|
key: 0,
|
|
45
49
|
type: "button",
|
|
46
50
|
class: "hover:text-foreground inline-flex items-center gap-1",
|
|
47
|
-
"aria-busy":
|
|
48
|
-
onClick:
|
|
49
|
-
}, [
|
|
51
|
+
"aria-busy": B.value || void 0,
|
|
52
|
+
onClick: V
|
|
53
|
+
}, [g(C(I.column.label) + " ", 1), B.value ? (x(), f(r, {
|
|
50
54
|
key: 0,
|
|
51
55
|
"data-slot": "table-sort-spinner",
|
|
52
56
|
class: "size-3.5"
|
|
53
|
-
})) :
|
|
57
|
+
})) : I.table.sort?.column === I.column.name ? (x(), m(d, { key: 1 }, [I.table.sort?.direction === "asc" ? (x(), f(w(n), {
|
|
54
58
|
key: 0,
|
|
55
59
|
name: "alfakit::tables.header-cell.sort-asc-button",
|
|
56
|
-
fallback:
|
|
60
|
+
fallback: w(k),
|
|
57
61
|
class: "size-3.5",
|
|
58
62
|
"aria-hidden": "true"
|
|
59
|
-
}, null, 8, ["fallback"])) : (
|
|
63
|
+
}, null, 8, ["fallback"])) : (x(), f(w(n), {
|
|
60
64
|
key: 1,
|
|
61
65
|
name: "alfakit::tables.header-cell.sort-desc-button",
|
|
62
|
-
fallback:
|
|
66
|
+
fallback: w(D),
|
|
63
67
|
class: "size-3.5",
|
|
64
68
|
"aria-hidden": "true"
|
|
65
|
-
}, null, 8, ["fallback"]))], 64)) : (
|
|
69
|
+
}, null, 8, ["fallback"]))], 64)) : (x(), f(w(n), {
|
|
66
70
|
key: 2,
|
|
67
71
|
name: "alfakit::tables.header-cell.sort-button",
|
|
68
|
-
fallback:
|
|
72
|
+
fallback: w(O),
|
|
69
73
|
class: "size-3.5 opacity-40",
|
|
70
74
|
"aria-hidden": "true"
|
|
71
|
-
}, null, 8, ["fallback"]))], 8,
|
|
75
|
+
}, null, 8, ["fallback"]))], 8, j)) : (x(), m(d, { key: 1 }, [g(C(I.column.label), 1)], 64))]),
|
|
72
76
|
_: 1
|
|
73
|
-
}),
|
|
74
|
-
rowspan:
|
|
75
|
-
class:
|
|
76
|
-
style:
|
|
77
|
-
"aria-sort":
|
|
78
|
-
},
|
|
79
|
-
default:
|
|
80
|
-
|
|
77
|
+
}), _(a, y({
|
|
78
|
+
rowspan: I.rowSpan,
|
|
79
|
+
class: w(t)(F[I.column.alignment ?? "start"], I.column.wrapHeader ? "whitespace-normal" : void 0, I.column.grow === !1 && "w-0", w(c)(I.column)),
|
|
80
|
+
style: I.column.width ? { width: I.column.width } : void 0,
|
|
81
|
+
"aria-sort": I.column.sortable ? w(s)(I.column.name, I.table.sort?.column, I.table.sort?.direction) : void 0
|
|
82
|
+
}, I.column.extraHeaderAttributes), {
|
|
83
|
+
default: T(() => [h("div", M, [
|
|
84
|
+
I.column.headerTooltip ? (x(), m("span", {
|
|
81
85
|
key: 0,
|
|
82
|
-
title:
|
|
86
|
+
title: I.column.headerTooltip,
|
|
83
87
|
"data-slot": "header-tooltip"
|
|
84
|
-
}, [
|
|
85
|
-
|
|
88
|
+
}, [_(w(z)), h("span", P, " (" + C(I.column.headerTooltip) + ")", 1)], 8, N)) : (x(), f(w(z), { key: 1 })),
|
|
89
|
+
_(o, {
|
|
86
90
|
name: "table.header-cell",
|
|
87
|
-
scope:
|
|
88
|
-
data: { column:
|
|
91
|
+
scope: I.component,
|
|
92
|
+
data: { column: I.column.name }
|
|
89
93
|
}, null, 8, ["scope", "data"]),
|
|
90
|
-
|
|
94
|
+
I.column.searchable ? (x(), f(i, {
|
|
91
95
|
key: 2,
|
|
92
96
|
type: "search",
|
|
93
|
-
"model-value":
|
|
94
|
-
placeholder:
|
|
95
|
-
"aria-label": `${
|
|
97
|
+
"model-value": I.table.columnSearches?.[I.column.name] ?? "",
|
|
98
|
+
placeholder: w(L)("search", {}, "Search"),
|
|
99
|
+
"aria-label": `${w(L)("search", {}, "Search")} ${I.column.label}`,
|
|
96
100
|
class: "h-7 text-xs font-normal",
|
|
97
|
-
|
|
101
|
+
"onUpdate:modelValue": U,
|
|
102
|
+
onBlur: l[0] ||= (e) => I.table.searchOnBlur && W(e),
|
|
103
|
+
onKeydown: E(W, ["enter"])
|
|
98
104
|
}, null, 8, [
|
|
99
105
|
"model-value",
|
|
100
106
|
"placeholder",
|
|
101
107
|
"aria-label"
|
|
102
|
-
])) :
|
|
108
|
+
])) : p("", !0)
|
|
103
109
|
])]),
|
|
104
110
|
_: 1
|
|
105
111
|
}, 16, [
|
|
@@ -111,6 +117,6 @@ var k = ["aria-busy"], A = { class: "flex flex-col gap-1" }, j = ["title"], M =
|
|
|
111
117
|
}
|
|
112
118
|
});
|
|
113
119
|
//#endregion
|
|
114
|
-
export {
|
|
120
|
+
export { F as default };
|
|
115
121
|
|
|
116
122
|
//# sourceMappingURL=ColumnHeader.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnHeader.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createTextVNode","_toDisplayString","_createBlock","Spinner","Icon","TableHead","_mergeProps","_createElementVNode","Slot","Input","_withKeys","_createCommentVNode","Icon_default","Spinner_default","Input_default","TableHead_default","Slot_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","ColumnHeader_vue_vue_type_script_setup_true_lang_default","ALIGN","props","__props","t","useT","DefineLabel","ColumnHeaderLabel","createReusableTemplate","sorting","ref","sort","direction","visitTable","columnSearch","event","openBlock","createElementBlock","Fragment","createVNode","unref","withCtx","createTextVNode","toDisplayString","createBlock","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","mergeProps","cn","columnVisibilityClasses","ariaSort","createElementVNode","withKeys","createCommentVNode"],"sources":["../../../src/components/table/ColumnHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColumnSchema, TableSchema } from '@alfakit/core'\nimport { ariaSort, columnVisibilityClasses, visitTable } from '@alfakit/core'\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { ref } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Slot from '../panel/Slot.vue'\nimport Input from '../ui/Input.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport TableHead from '../ui/TableHead.vue'\n\nconst ALIGN: Record<string, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n between: 'text-start',\n justify: 'text-justify',\n}\n\n/** A column's header cell: label, sort button and individual search input. */\nconst props = defineProps<{\n table: TableSchema\n column: ColumnSchema\n rowSpan?: number\n /** The table's component key (`relationManager:<class>`, `widget:<id>`), for slots. */\n component?: string | null\n}>()\nconst t = useT()\nconst [DefineLabel, ColumnHeaderLabel] = createReusableTemplate()\n\n// A spinner replaces the sort icon until the sorted records arrive.\nconst sorting = ref(false)\n\nconst sort = () => {\n const direction =\n props.table.sort?.column === props.column.name && props.table.sort.direction === 'asc'\n ? 'desc'\n : 'asc'\n sorting.value = true\n visitTable(props.table.identifier, { sort: props.column.name, direction }, ['page'], {\n onFinish: () => {\n sorting.value = false\n },\n })\n}\n\nconst
|
|
1
|
+
{"version":3,"file":"ColumnHeader.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createTextVNode","_toDisplayString","_createBlock","Spinner","Icon","TableHead","_mergeProps","_createElementVNode","Slot","Input","_withKeys","_createCommentVNode","Icon_default","Spinner_default","Input_default","TableHead_default","Slot_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","ColumnHeader_vue_vue_type_script_setup_true_lang_default","ALIGN","props","__props","t","useT","DefineLabel","ColumnHeaderLabel","createReusableTemplate","sorting","ref","sort","direction","visitTable","pushColumnSearch","debounce","value","onColumnSearchInput","columnSearch","event","openBlock","createElementBlock","Fragment","createVNode","unref","withCtx","createTextVNode","toDisplayString","createBlock","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","mergeProps","cn","columnVisibilityClasses","ariaSort","createElementVNode","_cache","$event","withKeys","createCommentVNode"],"sources":["../../../src/components/table/ColumnHeader.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColumnSchema, TableSchema } from '@alfakit/core'\nimport { ariaSort, columnVisibilityClasses, debounce, visitTable } from '@alfakit/core'\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { onBeforeUnmount, ref } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Slot from '../panel/Slot.vue'\nimport Input from '../ui/Input.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport TableHead from '../ui/TableHead.vue'\n\nconst ALIGN: Record<string, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n between: 'text-start',\n justify: 'text-justify',\n}\n\n/** A column's header cell: label, sort button and individual search input. */\nconst props = defineProps<{\n table: TableSchema\n column: ColumnSchema\n rowSpan?: number\n /** The table's component key (`relationManager:<class>`, `widget:<id>`), for slots. */\n component?: string | null\n}>()\nconst t = useT()\nconst [DefineLabel, ColumnHeaderLabel] = createReusableTemplate()\n\n// A spinner replaces the sort icon until the sorted records arrive.\nconst sorting = ref(false)\n\nconst sort = () => {\n const direction =\n props.table.sort?.column === props.column.name && props.table.sort.direction === 'asc'\n ? 'desc'\n : 'asc'\n sorting.value = true\n visitTable(props.table.identifier, { sort: props.column.name, direction }, ['page'], {\n onFinish: () => {\n sorting.value = false\n },\n })\n}\n\n// The column search applies after the same pause as the table search; Enter applies at once.\nconst pushColumnSearch = debounce(\n (value: string) =>\n visitTable(\n props.table.identifier,\n { columnSearch: { ...(props.table.columnSearches ?? {}), [props.column.name]: value } },\n ['page'],\n ),\n props.table.searchDebounce,\n)\n\nonBeforeUnmount(() => pushColumnSearch.cancel())\n\nconst onColumnSearchInput = (value: string) => {\n if (!props.table.searchOnBlur) pushColumnSearch(value)\n}\n\nconst columnSearch = (event: Event) => {\n pushColumnSearch((event.target as HTMLInputElement).value)\n pushColumnSearch.flush()\n}\n</script>\n\n<template>\n <DefineLabel>\n <button\n v-if=\"props.column.sortable\"\n type=\"button\"\n class=\"hover:text-foreground inline-flex items-center gap-1\"\n :aria-busy=\"sorting || undefined\"\n @click=\"sort\"\n >\n {{ props.column.label }}\n <Spinner v-if=\"sorting\" data-slot=\"table-sort-spinner\" class=\"size-3.5\" />\n <template v-else-if=\"props.table.sort?.column === props.column.name\">\n <Icon\n v-if=\"props.table.sort?.direction === 'asc'\"\n name=\"alfakit::tables.header-cell.sort-asc-button\"\n :fallback=\"ArrowUpIcon\"\n class=\"size-3.5\"\n aria-hidden=\"true\"\n />\n <Icon\n v-else\n name=\"alfakit::tables.header-cell.sort-desc-button\"\n :fallback=\"ArrowDownIcon\"\n class=\"size-3.5\"\n aria-hidden=\"true\"\n />\n </template>\n <Icon\n v-else\n name=\"alfakit::tables.header-cell.sort-button\"\n :fallback=\"ArrowUpDownIcon\"\n class=\"size-3.5 opacity-40\"\n aria-hidden=\"true\"\n />\n </button>\n <template v-else>{{ props.column.label }}</template>\n </DefineLabel>\n <TableHead\n :rowspan=\"props.rowSpan\"\n :class=\"\n cn(\n ALIGN[props.column.alignment ?? 'start'],\n props.column.wrapHeader ? 'whitespace-normal' : undefined,\n props.column.grow === false && 'w-0',\n columnVisibilityClasses(props.column),\n )\n \"\n :style=\"props.column.width ? { width: props.column.width } : undefined\"\n :aria-sort=\"\n props.column.sortable\n ? ariaSort(props.column.name, props.table.sort?.column, props.table.sort?.direction)\n : undefined\n \"\n v-bind=\"props.column.extraHeaderAttributes\"\n >\n <div class=\"flex flex-col gap-1\">\n <span\n v-if=\"props.column.headerTooltip\"\n :title=\"props.column.headerTooltip\"\n data-slot=\"header-tooltip\"\n >\n <ColumnHeaderLabel />\n <span class=\"sr-only\"> ({{ props.column.headerTooltip }})</span>\n </span>\n <ColumnHeaderLabel v-else />\n <Slot\n name=\"table.header-cell\"\n :scope=\"props.component\"\n :data=\"{ column: props.column.name }\"\n />\n <Input\n v-if=\"props.column.searchable\"\n type=\"search\"\n :model-value=\"props.table.columnSearches?.[props.column.name] ?? ''\"\n :placeholder=\"t('search', {}, 'Search')\"\n :aria-label=\"`${t('search', {}, 'Search')} ${props.column.label}`\"\n class=\"h-7 text-xs font-normal\"\n @update:model-value=\"onColumnSearchInput\"\n @blur=\"props.table.searchOnBlur && columnSearch($event)\"\n @keydown.enter=\"columnSearch\"\n />\n </div>\n </TableHead>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnManager.js","names":["_sfc_main","ColumnManager_vue_vue_type_script_setup_true_lang_default","ColumnManager_default"],"sources":["../../../src/components/table/ColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n columnDraftChanged,\n columnManagerPosition,\n columnOrderChanged,\n defaultVisibleColumns,\n FILTERS_MODAL_WIDTH_CLASSES,\n gridColumnsClasses,\n keepMoveButtonFocus,\n moveColumnInManager,\n moveColumnTo,\n orderColumnsBy,\n saveColumnOrder,\n slideOverSide,\n toggleVisibleColumn,\n triggerButtonView,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronDownIcon, ChevronUpIcon, Columns3Icon, GripVerticalIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { computed, ref, useId, watch } from 'vue'\nimport { useDirection, usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport DialogTrigger from '../ui/DialogTrigger.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport TableTriggerButton from './TableTriggerButton.vue'\n\n/**\n * The column manager: show / hide toggleable columns (kept in the query string) and, with\n * `reorderableColumns()`, move columns (stored per user on the server) by dragging a row\n * onto another or with the move up / down buttons (the keyboard path).\n *\n * `deferColumnManager()` keeps toggles in a draft until \"Apply\"; `columnManagerLayout()`\n * opens it in a dialog; `columnManagerColumns()` lays the list out in a grid.\n */\nconst props = defineProps<{ table: TableSchema; token: string; component: string }>()\nconst t = useT()\nconst panel = usePanel()\nconst direction = useDirection()\nconst open = ref(false)\n// `columnManagerTriggerAction()` may set `slideOver()`, `modalWidth()` and the heading.\nconst modal = computed(() => props.table.triggerActions?.columnManager?.modal)\nconst modalHeading = computed(() => modal.value?.heading ?? t('table.columns', {}, 'Columns'))\nconst modalDescription = computed(() => modal.value?.description ?? props.table.pluralModelLabel)\nconst modalWidthClass = computed(() =>\n modal.value?.width ? FILTERS_MODAL_WIDTH_CLASSES[modal.value.width] : undefined,\n)\nconst saving = ref(false)\nconst dragging = ref<string | null>(null)\nconst dropTarget = ref<string | null>(null)\n// Toggles of a deferred column manager wait here until \"Apply\".\nconst draft = ref<string[] | null>(null)\nconst reorderable = computed(() =>\n Boolean(props.table.reorderableColumns && panel.value.endpoints.tableColumns),\n)\nconst toggleable = computed(() => Boolean(props.table.toggleableColumns))\nconst deferred = computed(() => Boolean(props.table.deferColumnManager))\n// A moved column order: the draft of a deferred column manager, or shown at once while\n// it is saved.\nconst orderDraft = ref<string[] | null>(null)\n// Screen-reader announcement of the last move.\nconst announcement = ref('')\nconst idBase = useId()\nconst columns = computed(() =>\n orderColumnsBy(\n reorderable.value\n ? props.table.columns\n : props.table.columns.filter((column) => column.toggleable),\n orderDraft.value,\n ),\n)\nconst appliedNames = computed(() => props.table.columns.map((column) => column.name))\nconst names = computed(() => orderDraft.value ?? appliedNames.value)\nconst orderChanged = computed(\n () => orderDraft.value !== null && columnOrderChanged(appliedNames.value, orderDraft.value),\n)\nconst positions = computed(() =>\n Object.fromEntries(\n columns.value.map((column) => [\n column.name,\n columnManagerPosition(names.value, column.name, props.table.columnGroups),\n ]),\n ),\n)\n\n// The server's order replaces the one shown while saving.\nwatch(\n () => props.table.columns,\n () => {\n if (!deferred.value) orderDraft.value = null\n },\n)\nconst visible = computed(() => draft.value ?? props.table.visibleColumns)\n\nconst trigger = computed(() =>\n triggerButtonView(props.table, 'columnManager', {\n label: t('table.columns', {}, 'Columns'),\n showLabel: false,\n }),\n)\nconst resetView = computed(() =>\n triggerButtonView(props.table, 'columnManagerReset', {\n label: toggleable.value\n ? t('table.reset_columns', {}, 'Reset')\n : t('table.reset_column_order', {}, 'Reset column order'),\n variant: 'ghost',\n }),\n)\nconst applyView = computed(() =>\n deferred.value\n ? triggerButtonView(props.table, 'columnManagerApply', {\n label: t('table_filters.apply', {}, 'Apply'),\n variant: 'default',\n })\n : null,\n)\nconst inHeader = computed(() => props.table.columnManagerResetActionPosition === 'header')\nconst draftChanged = computed(\n () => draft.value !== null && columnDraftChanged(props.table.visibleColumns, draft.value),\n)\n\nconst toggle = (name: string) => {\n const next = toggleVisibleColumn(visible.value, name)\n\n if (deferred.value) {\n draft.value = next\n } else {\n visitTable(props.table.identifier, { columns: next }, ['page'])\n }\n}\n\nconst dragStart = (event: DragEvent, name: string) => {\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move'\n dragging.value = name\n}\n\nconst dragOver = (event: DragEvent, name: string) => {\n if (dragging.value === null) return\n\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = name\n}\n\nconst drop = (name: string) => {\n if (dragging.value !== null && dragging.value !== name) {\n reorder(dragging.value, moveColumnTo(names.value, dragging.value, name))\n }\n\n dragging.value = null\n dropTarget.value = null\n}\n\nconst save = async (order: string[]): Promise<boolean> => {\n const endpoint = panel.value.endpoints.tableColumns\n\n if (!endpoint) return false\n\n saving.value = true\n\n try {\n await saveColumnOrder(endpoint, props.token, props.component, order)\n\n return true\n } catch (error) {\n showToast({\n id: 'alfakit-column-order-failed',\n title: t('table.column_order_failed', {}, \"Couldn't save the column order\"),\n body: error instanceof Error ? error.message : String(error),\n status: 'danger',\n format: 'alfakit',\n })\n\n return false\n } finally {\n saving.value = false\n }\n}\n\nconst positionText = (name: string) => {\n const { position, count, group } = positions.value[name] ?? { position: 0, count: 0 }\n\n return group\n ? t(\n 'table.column_manager.position_in_group',\n { position, count, group },\n `Position ${position} of ${count} in ${group}.`,\n )\n : t('table.column_manager.position', { position, count }, `Position ${position} of ${count}.`)\n}\n\nconst announce = (name: string, order: string[]) => {\n const { position, count, group } = columnManagerPosition(order, name, props.table.columnGroups)\n const label = props.table.columns.find((column) => column.name === name)?.label ?? name\n const replace = { column: label, position, count, group: group ?? '' }\n\n announcement.value = group\n ? deferred.value\n ? t(\n 'table.column_manager.reordered_in_group_deferred',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered_in_group',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}.`,\n )\n : deferred.value\n ? t(\n 'table.column_manager.reordered_deferred',\n replace,\n `${label} moved to position ${position} of ${count}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered',\n replace,\n `${label} moved to position ${position} of ${count}.`,\n )\n}\n\n// A new order: kept as a draft until \"Apply\" (`deferColumnManager()`), else saved now.\nconst reorder = (name: string, order: string[]) => {\n if (saving.value || !columnOrderChanged(names.value, order)) return\n\n orderDraft.value = order\n announcement.value = ''\n\n if (deferred.value) {\n announce(name, order)\n\n return\n }\n\n void save(order).then((saved) => {\n if (saved) announce(name, order)\n else orderDraft.value = null\n })\n}\n\nconst move = (name: string, offset: -1 | 1, event: MouseEvent) => {\n keepMoveButtonFocus(event.currentTarget as HTMLElement | null)\n reorder(name, moveColumnInManager(names.value, name, offset, props.table.columnGroups))\n}\n\nconst apply = () => {\n if (orderDraft.value && orderChanged.value) void save(orderDraft.value)\n\n if (draft.value && columnDraftChanged(props.table.visibleColumns, draft.value)) {\n visitTable(props.table.identifier, { columns: draft.value }, ['page'])\n }\n\n draft.value = null\n orderDraft.value = null\n announcement.value = ''\n open.value = false\n}\n\n// Reset: the defined column order and, for toggleable columns, the default visibility.\nconst reset = () => {\n if (reorderable.value) {\n orderDraft.value = null\n void save([])\n }\n\n if (toggleable.value) {\n draft.value = null\n visitTable(props.table.identifier, { columns: defaultVisibleColumns(props.table) }, ['page'])\n }\n}\n\nconst setOpen = (next: boolean) => {\n // Closing without \"Apply\" drops the draft.\n if (!next) {\n draft.value = null\n if (deferred.value) orderDraft.value = null\n announcement.value = ''\n }\n open.value = next\n}\n\nconst [DefineBody, ManagerBody] = createReusableTemplate()\nconst [DefineReset, ResetButton] = createReusableTemplate()\n</script>\n\n<template>\n <template v-if=\"(toggleable || reorderable) && trigger\">\n <DefineReset>\n <TableTriggerButton\n v-if=\"resetView\"\n :view=\"resetView\"\n :disabled=\"saving\"\n data-slot=\"column-manager-reset\"\n :class=\"cn(!applyView && 'w-full')\"\n @click=\"reset\"\n />\n </DefineReset>\n <DefineBody>\n <div class=\"flex flex-col gap-1\">\n <div v-if=\"inHeader && resetView\" class=\"flex justify-end\"><ResetButton /></div>\n <ul\n :class=\"\n cn(\n props.table.columnManagerColumns\n ? ['grid gap-0.5', gridColumnsClasses(props.table.columnManagerColumns)]\n : 'flex flex-col gap-0.5',\n )\n \"\n :aria-label=\"t('table.columns', {}, 'Columns')\"\n >\n <li\n v-for=\"column in columns\"\n :key=\"column.name\"\n :data-column=\"column.name\"\n :draggable=\"reorderable && !saving\"\n :class=\"\n cn(\n 'flex items-center gap-2 rounded-md px-2 py-1 text-sm',\n reorderable && 'cursor-grab',\n dragging === column.name && 'opacity-50',\n dropTarget === column.name && dragging !== column.name && 'bg-muted',\n )\n \"\n @dragstart=\"dragStart($event, column.name)\"\n @dragover=\"dragOver($event, column.name)\"\n @dragleave=\"dropTarget === column.name && (dropTarget = null)\"\n @dragend=\"((dragging = null), (dropTarget = null))\"\n @drop.prevent=\"drop(column.name)\"\n >\n <GripVerticalIcon\n v-if=\"reorderable\"\n class=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <label v-if=\"column.toggleable\" class=\"flex min-w-0 flex-1 items-center gap-2\">\n <Checkbox\n :model-value=\"visible.includes(column.name)\"\n @update:model-value=\"toggle(column.name)\"\n />\n <span class=\"truncate\">{{ column.label }}</span>\n </label>\n <span v-else class=\"min-w-0 flex-1 truncate\">{{ column.label }}</span>\n <span v-if=\"reorderable\" class=\"flex shrink-0 items-center\">\n <span\n :id=\"`${idBase}-${column.name}-position`\"\n class=\"sr-only\"\n data-slot=\"column-manager-position\"\n >{{ positionText(column.name) }}</span\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"(positions[column.name]?.position ?? 0) <= 1\"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_up', { column: column.label }, `Move ${column.label} up`)\n \"\n @click=\"move(column.name, -1, $event)\"\n ><ChevronUpIcon\n /></Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"\n (positions[column.name]?.position ?? 0) >= (positions[column.name]?.count ?? 0)\n \"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_down', { column: column.label }, `Move ${column.label} down`)\n \"\n @click=\"move(column.name, 1, $event)\"\n ><ChevronDownIcon\n /></Button>\n </span>\n </li>\n </ul>\n <div\n v-if=\"reorderable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"sr-only\"\n data-slot=\"column-manager-announcement\"\n >\n {{ announcement }}\n </div>\n <div\n v-if=\"(!inHeader && resetView) || applyView\"\n class=\"mt-1 flex items-center justify-end gap-2\"\n >\n <ResetButton v-if=\"!inHeader\" />\n <TableTriggerButton\n v-if=\"applyView\"\n :view=\"applyView\"\n data-slot=\"column-manager-apply\"\n :disabled=\"!draftChanged && !orderChanged\"\n @click=\"apply\"\n />\n </div>\n </div>\n </DefineBody>\n <Sheet\n v-if=\"props.table.columnManagerLayout === 'modal' && modal?.slideOver\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <SheetTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </SheetTrigger>\n <SheetContent\n :side=\"slideOverSide(modal.slideOverPosition, direction)\"\n :class=\"cn('flex w-full flex-col gap-0 p-0', modalWidthClass ?? 'sm:max-w-md')\"\n data-slot=\"column-manager\"\n data-slide-over=\"\"\n >\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ modalHeading }}</SheetTitle>\n <SheetDescription :class=\"modal.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</SheetDescription>\n </SheetHeader>\n <div class=\"flex-1 overflow-y-auto p-4\"><ManagerBody /></div>\n </SheetContent>\n </Sheet>\n <Dialog\n v-else-if=\"props.table.columnManagerLayout === 'modal'\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <DialogTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </DialogTrigger>\n <DialogContent :class=\"modalWidthClass ?? 'sm:max-w-lg'\" data-slot=\"column-manager\">\n <DialogHeader>\n <DialogTitle>{{ modalHeading }}</DialogTitle>\n <DialogDescription :class=\"modal?.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-[60vh] overflow-y-auto\"><ManagerBody /></div>\n </DialogContent>\n </Dialog>\n <Popover v-else :open=\"open\" @update:open=\"setOpen\">\n <PopoverTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n :class=\"cn('p-2', props.table.columnManagerColumns ? 'w-auto min-w-64' : 'w-64')\"\n data-slot=\"column-manager\"\n >\n <ManagerBody />\n </PopoverContent>\n </Popover>\n </template>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ColumnManager.js","names":["_sfc_main","ColumnManager_vue_vue_type_script_setup_true_lang_default","ColumnManager_default"],"sources":["../../../src/components/table/ColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n columnDraftChanged,\n columnManagerPosition,\n columnOrderChanged,\n defaultVisibleColumns,\n FILTERS_MODAL_WIDTH_CLASSES,\n gridColumnsClasses,\n keepMoveButtonFocus,\n moveColumnInManager,\n moveColumnTo,\n orderColumnsBy,\n saveColumnOrder,\n slideOverSide,\n toggleVisibleColumn,\n triggerButtonView,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronDownIcon, ChevronUpIcon, Columns3Icon, GripVerticalIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { computed, ref, useId, watch } from 'vue'\nimport { useDirection, usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport DialogTrigger from '../ui/DialogTrigger.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport TableTriggerButton from './TableTriggerButton.vue'\n\n/**\n * The column manager: show / hide toggleable columns (kept in the query string) and, with\n * `reorderableColumns()`, move columns (stored per user on the server) by dragging a row\n * onto another or with the move up / down buttons (the keyboard path).\n *\n * `deferColumnManager()` keeps toggles in a draft until \"Apply\"; `columnManagerLayout()`\n * opens it in a dialog; `columnManagerColumns()` lays the list out in a grid.\n */\nconst props = defineProps<{ table: TableSchema; token: string; component: string }>()\nconst t = useT()\nconst panel = usePanel()\nconst direction = useDirection()\nconst open = ref(false)\n// `columnManagerTriggerAction()` may set `slideOver()`, `modalWidth()` and the heading.\nconst modal = computed(() => props.table.triggerActions?.columnManager?.modal)\nconst modalHeading = computed(() => modal.value?.heading ?? t('table.columns', {}, 'Columns'))\nconst modalDescription = computed(() => modal.value?.description ?? props.table.pluralModelLabel)\nconst modalWidthClass = computed(() =>\n modal.value?.width ? FILTERS_MODAL_WIDTH_CLASSES[modal.value.width] : undefined,\n)\nconst saving = ref(false)\nconst dragging = ref<string | null>(null)\nconst dropTarget = ref<string | null>(null)\n// Toggles of a deferred column manager wait here until \"Apply\".\nconst draft = ref<string[] | null>(null)\nconst reorderable = computed(() =>\n Boolean(props.table.reorderableColumns && panel.value.endpoints.tableColumns),\n)\nconst toggleable = computed(() => Boolean(props.table.toggleableColumns))\nconst deferred = computed(() => Boolean(props.table.deferColumnManager))\n// A moved column order: the draft of a deferred column manager, or shown at once while\n// it is saved.\nconst orderDraft = ref<string[] | null>(null)\n// Screen-reader announcement of the last move.\nconst announcement = ref('')\nconst idBase = useId()\nconst columns = computed(() =>\n orderColumnsBy(\n reorderable.value\n ? props.table.columns\n : props.table.columns.filter((column) => column.toggleable),\n orderDraft.value,\n ),\n)\nconst appliedNames = computed(() => props.table.columns.map((column) => column.name))\nconst names = computed(() => orderDraft.value ?? appliedNames.value)\nconst orderChanged = computed(\n () => orderDraft.value !== null && columnOrderChanged(appliedNames.value, orderDraft.value),\n)\nconst positions = computed(() =>\n Object.fromEntries(\n columns.value.map((column) => [\n column.name,\n columnManagerPosition(names.value, column.name, props.table.columnGroups),\n ]),\n ),\n)\n\n// The server's order replaces the one shown while saving.\nwatch(\n () => props.table.columns,\n () => {\n if (!deferred.value) orderDraft.value = null\n },\n)\nconst visible = computed(() => draft.value ?? props.table.visibleColumns)\n\nconst trigger = computed(() =>\n triggerButtonView(props.table, 'columnManager', {\n label: t('table.columns', {}, 'Columns'),\n showLabel: false,\n }),\n)\nconst resetView = computed(() =>\n triggerButtonView(props.table, 'columnManagerReset', {\n label: toggleable.value\n ? t('table.reset_columns', {}, 'Reset')\n : t('table.reset_column_order', {}, 'Reset column order'),\n variant: 'ghost',\n }),\n)\nconst applyView = computed(() =>\n deferred.value\n ? triggerButtonView(props.table, 'columnManagerApply', {\n label: t('table_filters.apply', {}, 'Apply'),\n variant: 'default',\n })\n : null,\n)\nconst inHeader = computed(() => props.table.columnManagerResetActionPosition === 'header')\nconst draftChanged = computed(\n () => draft.value !== null && columnDraftChanged(props.table.visibleColumns, draft.value),\n)\n\nconst toggle = (name: string) => {\n const next = toggleVisibleColumn(visible.value, name)\n\n if (deferred.value) {\n draft.value = next\n } else {\n visitTable(props.table.identifier, { columns: next }, ['page'])\n }\n}\n\nconst dragStart = (event: DragEvent, name: string) => {\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move'\n dragging.value = name\n}\n\nconst dragOver = (event: DragEvent, name: string) => {\n if (dragging.value === null) return\n\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = name\n}\n\nconst drop = (name: string) => {\n if (dragging.value !== null && dragging.value !== name) {\n reorder(dragging.value, moveColumnTo(names.value, dragging.value, name))\n }\n\n dragging.value = null\n dropTarget.value = null\n}\n\nconst save = async (order: string[]): Promise<boolean> => {\n const endpoint = panel.value.endpoints.tableColumns\n\n if (!endpoint) return false\n\n saving.value = true\n\n try {\n await saveColumnOrder(endpoint, props.token, props.component, order)\n\n return true\n } catch (error) {\n showToast({\n id: 'alfakit-column-order-failed',\n title: t('table.column_order_failed', {}, \"Couldn't save the column order\"),\n body: error instanceof Error ? error.message : String(error),\n status: 'danger',\n format: 'alfakit',\n })\n\n return false\n } finally {\n saving.value = false\n }\n}\n\nconst positionText = (name: string) => {\n const { position, count, group } = positions.value[name] ?? { position: 0, count: 0 }\n\n return group\n ? t(\n 'table.column_manager.position_in_group',\n { position, count, group },\n `Position ${position} of ${count} in ${group}.`,\n )\n : t('table.column_manager.position', { position, count }, `Position ${position} of ${count}.`)\n}\n\nconst announce = (name: string, order: string[]) => {\n const { position, count, group } = columnManagerPosition(order, name, props.table.columnGroups)\n const label = props.table.columns.find((column) => column.name === name)?.label ?? name\n const replace = { column: label, position, count, group: group ?? '' }\n\n announcement.value = group\n ? deferred.value\n ? t(\n 'table.column_manager.reordered_in_group_deferred',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered_in_group',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}.`,\n )\n : deferred.value\n ? t(\n 'table.column_manager.reordered_deferred',\n replace,\n `${label} moved to position ${position} of ${count}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered',\n replace,\n `${label} moved to position ${position} of ${count}.`,\n )\n}\n\n// A new order: kept as a draft until \"Apply\" (`deferColumnManager()`), else saved now.\nconst reorder = (name: string, order: string[]) => {\n if (saving.value || !columnOrderChanged(names.value, order)) return\n\n orderDraft.value = order\n announcement.value = ''\n\n if (deferred.value) {\n announce(name, order)\n\n return\n }\n\n void save(order).then((saved) => {\n if (saved) announce(name, order)\n else orderDraft.value = null\n })\n}\n\nconst move = (name: string, offset: -1 | 1, event: MouseEvent) => {\n keepMoveButtonFocus(event.currentTarget as HTMLElement | null)\n reorder(name, moveColumnInManager(names.value, name, offset, props.table.columnGroups))\n}\n\n// The order is saved before the visibility visit: both requests share the session, and a\n// visit running alongside the save would write the old order back when it finishes.\nconst apply = async () => {\n const order = orderDraft.value && orderChanged.value ? orderDraft.value : null\n const columns =\n draft.value && columnDraftChanged(props.table.visibleColumns, draft.value) ? draft.value : null\n\n draft.value = null\n orderDraft.value = null\n announcement.value = ''\n open.value = false\n\n if (order) await save(order)\n\n if (columns) visitTable(props.table.identifier, { columns }, ['page'])\n}\n\n// Reset: the defined column order and, for toggleable columns, the default visibility.\nconst reset = async () => {\n if (reorderable.value) {\n orderDraft.value = null\n await save([])\n }\n\n if (toggleable.value) {\n draft.value = null\n visitTable(props.table.identifier, { columns: defaultVisibleColumns(props.table) }, ['page'])\n }\n}\n\nconst setOpen = (next: boolean) => {\n // Closing without \"Apply\" drops the draft.\n if (!next) {\n draft.value = null\n if (deferred.value) orderDraft.value = null\n announcement.value = ''\n }\n open.value = next\n}\n\nconst [DefineBody, ManagerBody] = createReusableTemplate()\nconst [DefineReset, ResetButton] = createReusableTemplate()\n</script>\n\n<template>\n <template v-if=\"(toggleable || reorderable) && trigger\">\n <DefineReset>\n <TableTriggerButton\n v-if=\"resetView\"\n :view=\"resetView\"\n :disabled=\"saving\"\n data-slot=\"column-manager-reset\"\n :class=\"cn(!applyView && 'w-full')\"\n @click=\"reset\"\n />\n </DefineReset>\n <DefineBody>\n <div class=\"flex flex-col gap-1\">\n <div v-if=\"inHeader && resetView\" class=\"flex justify-end\"><ResetButton /></div>\n <ul\n :class=\"\n cn(\n props.table.columnManagerColumns\n ? ['grid gap-0.5', gridColumnsClasses(props.table.columnManagerColumns)]\n : 'flex flex-col gap-0.5',\n )\n \"\n :aria-label=\"t('table.columns', {}, 'Columns')\"\n >\n <li\n v-for=\"column in columns\"\n :key=\"column.name\"\n :data-column=\"column.name\"\n :draggable=\"reorderable && !saving\"\n :class=\"\n cn(\n 'flex items-center gap-2 rounded-md px-2 py-1 text-sm',\n reorderable && 'cursor-grab',\n dragging === column.name && 'opacity-50',\n dropTarget === column.name && dragging !== column.name && 'bg-muted',\n )\n \"\n @dragstart=\"dragStart($event, column.name)\"\n @dragover=\"dragOver($event, column.name)\"\n @dragleave=\"dropTarget === column.name && (dropTarget = null)\"\n @dragend=\"((dragging = null), (dropTarget = null))\"\n @drop.prevent=\"drop(column.name)\"\n >\n <GripVerticalIcon\n v-if=\"reorderable\"\n class=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <label v-if=\"column.toggleable\" class=\"flex min-w-0 flex-1 items-center gap-2\">\n <Checkbox\n :model-value=\"visible.includes(column.name)\"\n @update:model-value=\"toggle(column.name)\"\n />\n <span class=\"truncate\">{{ column.label }}</span>\n </label>\n <span v-else class=\"min-w-0 flex-1 truncate\">{{ column.label }}</span>\n <span v-if=\"reorderable\" class=\"flex shrink-0 items-center\">\n <span\n :id=\"`${idBase}-${column.name}-position`\"\n class=\"sr-only\"\n data-slot=\"column-manager-position\"\n >{{ positionText(column.name) }}</span\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"(positions[column.name]?.position ?? 0) <= 1\"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_up', { column: column.label }, `Move ${column.label} up`)\n \"\n @click=\"move(column.name, -1, $event)\"\n ><ChevronUpIcon\n /></Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"\n (positions[column.name]?.position ?? 0) >= (positions[column.name]?.count ?? 0)\n \"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_down', { column: column.label }, `Move ${column.label} down`)\n \"\n @click=\"move(column.name, 1, $event)\"\n ><ChevronDownIcon\n /></Button>\n </span>\n </li>\n </ul>\n <div\n v-if=\"reorderable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"sr-only\"\n data-slot=\"column-manager-announcement\"\n >\n {{ announcement }}\n </div>\n <div\n v-if=\"(!inHeader && resetView) || applyView\"\n class=\"mt-1 flex items-center justify-end gap-2\"\n >\n <ResetButton v-if=\"!inHeader\" />\n <TableTriggerButton\n v-if=\"applyView\"\n :view=\"applyView\"\n data-slot=\"column-manager-apply\"\n :disabled=\"!draftChanged && !orderChanged\"\n @click=\"apply\"\n />\n </div>\n </div>\n </DefineBody>\n <Sheet\n v-if=\"props.table.columnManagerLayout === 'modal' && modal?.slideOver\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <SheetTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </SheetTrigger>\n <SheetContent\n :side=\"slideOverSide(modal.slideOverPosition, direction)\"\n :class=\"cn('flex w-full flex-col gap-0 p-0', modalWidthClass ?? 'sm:max-w-md')\"\n data-slot=\"column-manager\"\n data-slide-over=\"\"\n >\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ modalHeading }}</SheetTitle>\n <SheetDescription :class=\"modal.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</SheetDescription>\n </SheetHeader>\n <div class=\"flex-1 overflow-y-auto p-4\"><ManagerBody /></div>\n </SheetContent>\n </Sheet>\n <Dialog\n v-else-if=\"props.table.columnManagerLayout === 'modal'\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <DialogTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </DialogTrigger>\n <DialogContent :class=\"modalWidthClass ?? 'sm:max-w-lg'\" data-slot=\"column-manager\">\n <DialogHeader>\n <DialogTitle>{{ modalHeading }}</DialogTitle>\n <DialogDescription :class=\"modal?.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-[60vh] overflow-y-auto\"><ManagerBody /></div>\n </DialogContent>\n </Dialog>\n <Popover v-else :open=\"open\" @update:open=\"setOpen\">\n <PopoverTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n :class=\"cn('p-2', props.table.columnManagerColumns ? 'w-auto min-w-64' : 'w-64')\"\n data-slot=\"column-manager\"\n >\n <ManagerBody />\n </PopoverContent>\n </Popover>\n </template>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/ColumnManager.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ColumnManager.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/ColumnManager.vue"],"names":[],"mappings":"AAgfA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AA4ChD;;;;;;;GAOG;AACH,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;;AAs8B5E,wBAMG"}
|
|
@@ -134,10 +134,11 @@ var Ie = { class: "flex flex-col gap-1" }, Le = {
|
|
|
134
134
|
}
|
|
135
135
|
}, ct = (e, t, n) => {
|
|
136
136
|
xe(n.currentTarget), st(e, Se(U.value, e, t, D.table.columnGroups));
|
|
137
|
-
}, lt = () => {
|
|
138
|
-
z.value && W.value
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
}, lt = async () => {
|
|
138
|
+
let e = z.value && W.value ? z.value : null, t = F.value && c(D.table.visibleColumns, F.value) ? F.value : null;
|
|
139
|
+
F.value = null, z.value = null, B.value = "", k.value = !1, e && await Z(e), t && u(D.table.identifier, { columns: t }, ["page"]);
|
|
140
|
+
}, ut = async () => {
|
|
141
|
+
I.value && (z.value = null, await Z([])), L.value && (F.value = null, u(D.table.identifier, { columns: ye(D.table) }, ["page"]));
|
|
141
142
|
}, Q = (e) => {
|
|
142
143
|
e || (F.value = null, R.value && (z.value = null), B.value = ""), k.value = e;
|
|
143
144
|
}, [dt, $] = E(), [ft, pt] = E();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnManager.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createBlock","TableTriggerButton","_normalizeClass","_createCommentVNode","_createElementVNode","_renderList","_withModifiers","Checkbox","_toDisplayString","Button","Sheet","SheetTrigger","Icon","SheetContent","SheetHeader","SheetTitle","_createTextVNode","SheetDescription","Dialog","DialogTrigger","DialogContent","DialogHeader","DialogTitle","DialogDescription","Popover","PopoverTrigger","PopoverContent","Icon_default","Button_default","Checkbox_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","DialogTrigger_default","Popover_default","PopoverContent_default","PopoverTrigger_default","Sheet_default","SheetContent_default","SheetDescription_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","TableTriggerButton_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","ColumnManager_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","direction","useDirection","open","ref","modal","computed","modalHeading","modalDescription","modalWidthClass","FILTERS_MODAL_WIDTH_CLASSES","saving","dragging","dropTarget","draft","reorderable","toggleable","deferred","orderDraft","announcement","idBase","useId","columns","orderColumnsBy","column","appliedNames","names","orderChanged","columnOrderChanged","positions","columnManagerPosition","visible","trigger","triggerButtonView","resetView","applyView","inHeader","draftChanged","columnDraftChanged","toggle","next","toggleVisibleColumn","name","visitTable","dragStart","event","dragOver","drop","reorder","moveColumnTo","save","endpoint","saveColumnOrder","order","error","showToast","positionText","group","position","count","announce","label","replace","saved","move","keepMoveButtonFocus","moveColumnInManager","offset","apply","reset","defaultVisibleColumns","setOpen","DefineBody","ManagerBody","createReusableTemplate","DefineReset","ResetButton","openBlock","createElementBlock","Fragment","createVNode","unref","withCtx","createBlock","normalizeClass","cn","createCommentVNode","createElementVNode","gridColumnsClasses","renderList","$event","_cache","withModifiers","GripVerticalIcon","toDisplayString","ChevronUpIcon","ChevronDownIcon","Columns3Icon","slideOverSide","createTextVNode"],"sources":["../../../src/components/table/ColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n columnDraftChanged,\n columnManagerPosition,\n columnOrderChanged,\n defaultVisibleColumns,\n FILTERS_MODAL_WIDTH_CLASSES,\n gridColumnsClasses,\n keepMoveButtonFocus,\n moveColumnInManager,\n moveColumnTo,\n orderColumnsBy,\n saveColumnOrder,\n slideOverSide,\n toggleVisibleColumn,\n triggerButtonView,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronDownIcon, ChevronUpIcon, Columns3Icon, GripVerticalIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { computed, ref, useId, watch } from 'vue'\nimport { useDirection, usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport DialogTrigger from '../ui/DialogTrigger.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport TableTriggerButton from './TableTriggerButton.vue'\n\n/**\n * The column manager: show / hide toggleable columns (kept in the query string) and, with\n * `reorderableColumns()`, move columns (stored per user on the server) by dragging a row\n * onto another or with the move up / down buttons (the keyboard path).\n *\n * `deferColumnManager()` keeps toggles in a draft until \"Apply\"; `columnManagerLayout()`\n * opens it in a dialog; `columnManagerColumns()` lays the list out in a grid.\n */\nconst props = defineProps<{ table: TableSchema; token: string; component: string }>()\nconst t = useT()\nconst panel = usePanel()\nconst direction = useDirection()\nconst open = ref(false)\n// `columnManagerTriggerAction()` may set `slideOver()`, `modalWidth()` and the heading.\nconst modal = computed(() => props.table.triggerActions?.columnManager?.modal)\nconst modalHeading = computed(() => modal.value?.heading ?? t('table.columns', {}, 'Columns'))\nconst modalDescription = computed(() => modal.value?.description ?? props.table.pluralModelLabel)\nconst modalWidthClass = computed(() =>\n modal.value?.width ? FILTERS_MODAL_WIDTH_CLASSES[modal.value.width] : undefined,\n)\nconst saving = ref(false)\nconst dragging = ref<string | null>(null)\nconst dropTarget = ref<string | null>(null)\n// Toggles of a deferred column manager wait here until \"Apply\".\nconst draft = ref<string[] | null>(null)\nconst reorderable = computed(() =>\n Boolean(props.table.reorderableColumns && panel.value.endpoints.tableColumns),\n)\nconst toggleable = computed(() => Boolean(props.table.toggleableColumns))\nconst deferred = computed(() => Boolean(props.table.deferColumnManager))\n// A moved column order: the draft of a deferred column manager, or shown at once while\n// it is saved.\nconst orderDraft = ref<string[] | null>(null)\n// Screen-reader announcement of the last move.\nconst announcement = ref('')\nconst idBase = useId()\nconst columns = computed(() =>\n orderColumnsBy(\n reorderable.value\n ? props.table.columns\n : props.table.columns.filter((column) => column.toggleable),\n orderDraft.value,\n ),\n)\nconst appliedNames = computed(() => props.table.columns.map((column) => column.name))\nconst names = computed(() => orderDraft.value ?? appliedNames.value)\nconst orderChanged = computed(\n () => orderDraft.value !== null && columnOrderChanged(appliedNames.value, orderDraft.value),\n)\nconst positions = computed(() =>\n Object.fromEntries(\n columns.value.map((column) => [\n column.name,\n columnManagerPosition(names.value, column.name, props.table.columnGroups),\n ]),\n ),\n)\n\n// The server's order replaces the one shown while saving.\nwatch(\n () => props.table.columns,\n () => {\n if (!deferred.value) orderDraft.value = null\n },\n)\nconst visible = computed(() => draft.value ?? props.table.visibleColumns)\n\nconst trigger = computed(() =>\n triggerButtonView(props.table, 'columnManager', {\n label: t('table.columns', {}, 'Columns'),\n showLabel: false,\n }),\n)\nconst resetView = computed(() =>\n triggerButtonView(props.table, 'columnManagerReset', {\n label: toggleable.value\n ? t('table.reset_columns', {}, 'Reset')\n : t('table.reset_column_order', {}, 'Reset column order'),\n variant: 'ghost',\n }),\n)\nconst applyView = computed(() =>\n deferred.value\n ? triggerButtonView(props.table, 'columnManagerApply', {\n label: t('table_filters.apply', {}, 'Apply'),\n variant: 'default',\n })\n : null,\n)\nconst inHeader = computed(() => props.table.columnManagerResetActionPosition === 'header')\nconst draftChanged = computed(\n () => draft.value !== null && columnDraftChanged(props.table.visibleColumns, draft.value),\n)\n\nconst toggle = (name: string) => {\n const next = toggleVisibleColumn(visible.value, name)\n\n if (deferred.value) {\n draft.value = next\n } else {\n visitTable(props.table.identifier, { columns: next }, ['page'])\n }\n}\n\nconst dragStart = (event: DragEvent, name: string) => {\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move'\n dragging.value = name\n}\n\nconst dragOver = (event: DragEvent, name: string) => {\n if (dragging.value === null) return\n\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = name\n}\n\nconst drop = (name: string) => {\n if (dragging.value !== null && dragging.value !== name) {\n reorder(dragging.value, moveColumnTo(names.value, dragging.value, name))\n }\n\n dragging.value = null\n dropTarget.value = null\n}\n\nconst save = async (order: string[]): Promise<boolean> => {\n const endpoint = panel.value.endpoints.tableColumns\n\n if (!endpoint) return false\n\n saving.value = true\n\n try {\n await saveColumnOrder(endpoint, props.token, props.component, order)\n\n return true\n } catch (error) {\n showToast({\n id: 'alfakit-column-order-failed',\n title: t('table.column_order_failed', {}, \"Couldn't save the column order\"),\n body: error instanceof Error ? error.message : String(error),\n status: 'danger',\n format: 'alfakit',\n })\n\n return false\n } finally {\n saving.value = false\n }\n}\n\nconst positionText = (name: string) => {\n const { position, count, group } = positions.value[name] ?? { position: 0, count: 0 }\n\n return group\n ? t(\n 'table.column_manager.position_in_group',\n { position, count, group },\n `Position ${position} of ${count} in ${group}.`,\n )\n : t('table.column_manager.position', { position, count }, `Position ${position} of ${count}.`)\n}\n\nconst announce = (name: string, order: string[]) => {\n const { position, count, group } = columnManagerPosition(order, name, props.table.columnGroups)\n const label = props.table.columns.find((column) => column.name === name)?.label ?? name\n const replace = { column: label, position, count, group: group ?? '' }\n\n announcement.value = group\n ? deferred.value\n ? t(\n 'table.column_manager.reordered_in_group_deferred',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered_in_group',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}.`,\n )\n : deferred.value\n ? t(\n 'table.column_manager.reordered_deferred',\n replace,\n `${label} moved to position ${position} of ${count}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered',\n replace,\n `${label} moved to position ${position} of ${count}.`,\n )\n}\n\n// A new order: kept as a draft until \"Apply\" (`deferColumnManager()`), else saved now.\nconst reorder = (name: string, order: string[]) => {\n if (saving.value || !columnOrderChanged(names.value, order)) return\n\n orderDraft.value = order\n announcement.value = ''\n\n if (deferred.value) {\n announce(name, order)\n\n return\n }\n\n void save(order).then((saved) => {\n if (saved) announce(name, order)\n else orderDraft.value = null\n })\n}\n\nconst move = (name: string, offset: -1 | 1, event: MouseEvent) => {\n keepMoveButtonFocus(event.currentTarget as HTMLElement | null)\n reorder(name, moveColumnInManager(names.value, name, offset, props.table.columnGroups))\n}\n\nconst apply = () => {\n if (orderDraft.value && orderChanged.value) void save(orderDraft.value)\n\n if (draft.value && columnDraftChanged(props.table.visibleColumns, draft.value)) {\n visitTable(props.table.identifier, { columns: draft.value }, ['page'])\n }\n\n draft.value = null\n orderDraft.value = null\n announcement.value = ''\n open.value = false\n}\n\n// Reset: the defined column order and, for toggleable columns, the default visibility.\nconst reset = () => {\n if (reorderable.value) {\n orderDraft.value = null\n void save([])\n }\n\n if (toggleable.value) {\n draft.value = null\n visitTable(props.table.identifier, { columns: defaultVisibleColumns(props.table) }, ['page'])\n }\n}\n\nconst setOpen = (next: boolean) => {\n // Closing without \"Apply\" drops the draft.\n if (!next) {\n draft.value = null\n if (deferred.value) orderDraft.value = null\n announcement.value = ''\n }\n open.value = next\n}\n\nconst [DefineBody, ManagerBody] = createReusableTemplate()\nconst [DefineReset, ResetButton] = createReusableTemplate()\n</script>\n\n<template>\n <template v-if=\"(toggleable || reorderable) && trigger\">\n <DefineReset>\n <TableTriggerButton\n v-if=\"resetView\"\n :view=\"resetView\"\n :disabled=\"saving\"\n data-slot=\"column-manager-reset\"\n :class=\"cn(!applyView && 'w-full')\"\n @click=\"reset\"\n />\n </DefineReset>\n <DefineBody>\n <div class=\"flex flex-col gap-1\">\n <div v-if=\"inHeader && resetView\" class=\"flex justify-end\"><ResetButton /></div>\n <ul\n :class=\"\n cn(\n props.table.columnManagerColumns\n ? ['grid gap-0.5', gridColumnsClasses(props.table.columnManagerColumns)]\n : 'flex flex-col gap-0.5',\n )\n \"\n :aria-label=\"t('table.columns', {}, 'Columns')\"\n >\n <li\n v-for=\"column in columns\"\n :key=\"column.name\"\n :data-column=\"column.name\"\n :draggable=\"reorderable && !saving\"\n :class=\"\n cn(\n 'flex items-center gap-2 rounded-md px-2 py-1 text-sm',\n reorderable && 'cursor-grab',\n dragging === column.name && 'opacity-50',\n dropTarget === column.name && dragging !== column.name && 'bg-muted',\n )\n \"\n @dragstart=\"dragStart($event, column.name)\"\n @dragover=\"dragOver($event, column.name)\"\n @dragleave=\"dropTarget === column.name && (dropTarget = null)\"\n @dragend=\"((dragging = null), (dropTarget = null))\"\n @drop.prevent=\"drop(column.name)\"\n >\n <GripVerticalIcon\n v-if=\"reorderable\"\n class=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <label v-if=\"column.toggleable\" class=\"flex min-w-0 flex-1 items-center gap-2\">\n <Checkbox\n :model-value=\"visible.includes(column.name)\"\n @update:model-value=\"toggle(column.name)\"\n />\n <span class=\"truncate\">{{ column.label }}</span>\n </label>\n <span v-else class=\"min-w-0 flex-1 truncate\">{{ column.label }}</span>\n <span v-if=\"reorderable\" class=\"flex shrink-0 items-center\">\n <span\n :id=\"`${idBase}-${column.name}-position`\"\n class=\"sr-only\"\n data-slot=\"column-manager-position\"\n >{{ positionText(column.name) }}</span\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"(positions[column.name]?.position ?? 0) <= 1\"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_up', { column: column.label }, `Move ${column.label} up`)\n \"\n @click=\"move(column.name, -1, $event)\"\n ><ChevronUpIcon\n /></Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"\n (positions[column.name]?.position ?? 0) >= (positions[column.name]?.count ?? 0)\n \"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_down', { column: column.label }, `Move ${column.label} down`)\n \"\n @click=\"move(column.name, 1, $event)\"\n ><ChevronDownIcon\n /></Button>\n </span>\n </li>\n </ul>\n <div\n v-if=\"reorderable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"sr-only\"\n data-slot=\"column-manager-announcement\"\n >\n {{ announcement }}\n </div>\n <div\n v-if=\"(!inHeader && resetView) || applyView\"\n class=\"mt-1 flex items-center justify-end gap-2\"\n >\n <ResetButton v-if=\"!inHeader\" />\n <TableTriggerButton\n v-if=\"applyView\"\n :view=\"applyView\"\n data-slot=\"column-manager-apply\"\n :disabled=\"!draftChanged && !orderChanged\"\n @click=\"apply\"\n />\n </div>\n </div>\n </DefineBody>\n <Sheet\n v-if=\"props.table.columnManagerLayout === 'modal' && modal?.slideOver\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <SheetTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </SheetTrigger>\n <SheetContent\n :side=\"slideOverSide(modal.slideOverPosition, direction)\"\n :class=\"cn('flex w-full flex-col gap-0 p-0', modalWidthClass ?? 'sm:max-w-md')\"\n data-slot=\"column-manager\"\n data-slide-over=\"\"\n >\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ modalHeading }}</SheetTitle>\n <SheetDescription :class=\"modal.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</SheetDescription>\n </SheetHeader>\n <div class=\"flex-1 overflow-y-auto p-4\"><ManagerBody /></div>\n </SheetContent>\n </Sheet>\n <Dialog\n v-else-if=\"props.table.columnManagerLayout === 'modal'\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <DialogTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </DialogTrigger>\n <DialogContent :class=\"modalWidthClass ?? 'sm:max-w-lg'\" data-slot=\"column-manager\">\n <DialogHeader>\n <DialogTitle>{{ modalHeading }}</DialogTitle>\n <DialogDescription :class=\"modal?.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-[60vh] overflow-y-auto\"><ManagerBody /></div>\n </DialogContent>\n </Dialog>\n <Popover v-else :open=\"open\" @update:open=\"setOpen\">\n <PopoverTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n :class=\"cn('p-2', props.table.columnManagerColumns ? 'w-auto min-w-64' : 'w-64')\"\n data-slot=\"column-manager\"\n >\n <ManagerBody />\n </PopoverContent>\n </Popover>\n </template>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColumnManager.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_withCtx","_createBlock","TableTriggerButton","_normalizeClass","_createCommentVNode","_createElementVNode","_renderList","_withModifiers","Checkbox","_toDisplayString","Button","Sheet","SheetTrigger","Icon","SheetContent","SheetHeader","SheetTitle","_createTextVNode","SheetDescription","Dialog","DialogTrigger","DialogContent","DialogHeader","DialogTitle","DialogDescription","Popover","PopoverTrigger","PopoverContent","Icon_default","Button_default","Checkbox_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","DialogTrigger_default","Popover_default","PopoverContent_default","PopoverTrigger_default","Sheet_default","SheetContent_default","SheetDescription_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","TableTriggerButton_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","ColumnManager_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","direction","useDirection","open","ref","modal","computed","modalHeading","modalDescription","modalWidthClass","FILTERS_MODAL_WIDTH_CLASSES","saving","dragging","dropTarget","draft","reorderable","toggleable","deferred","orderDraft","announcement","idBase","useId","columns","orderColumnsBy","column","appliedNames","names","orderChanged","columnOrderChanged","positions","columnManagerPosition","visible","trigger","triggerButtonView","resetView","applyView","inHeader","draftChanged","columnDraftChanged","toggle","next","toggleVisibleColumn","name","visitTable","dragStart","event","dragOver","drop","reorder","moveColumnTo","save","endpoint","saveColumnOrder","order","error","showToast","positionText","group","position","count","announce","label","replace","saved","move","keepMoveButtonFocus","moveColumnInManager","offset","apply","reset","defaultVisibleColumns","setOpen","DefineBody","ManagerBody","createReusableTemplate","DefineReset","ResetButton","openBlock","createElementBlock","Fragment","createVNode","unref","withCtx","createBlock","normalizeClass","cn","createCommentVNode","createElementVNode","gridColumnsClasses","renderList","$event","_cache","withModifiers","GripVerticalIcon","toDisplayString","ChevronUpIcon","ChevronDownIcon","Columns3Icon","slideOverSide","createTextVNode"],"sources":["../../../src/components/table/ColumnManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n columnDraftChanged,\n columnManagerPosition,\n columnOrderChanged,\n defaultVisibleColumns,\n FILTERS_MODAL_WIDTH_CLASSES,\n gridColumnsClasses,\n keepMoveButtonFocus,\n moveColumnInManager,\n moveColumnTo,\n orderColumnsBy,\n saveColumnOrder,\n slideOverSide,\n toggleVisibleColumn,\n triggerButtonView,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronDownIcon, ChevronUpIcon, Columns3Icon, GripVerticalIcon } from '@lucide/vue'\nimport { createReusableTemplate } from '@vueuse/core'\nimport { computed, ref, useId, watch } from 'vue'\nimport { useDirection, usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport DialogTrigger from '../ui/DialogTrigger.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport TableTriggerButton from './TableTriggerButton.vue'\n\n/**\n * The column manager: show / hide toggleable columns (kept in the query string) and, with\n * `reorderableColumns()`, move columns (stored per user on the server) by dragging a row\n * onto another or with the move up / down buttons (the keyboard path).\n *\n * `deferColumnManager()` keeps toggles in a draft until \"Apply\"; `columnManagerLayout()`\n * opens it in a dialog; `columnManagerColumns()` lays the list out in a grid.\n */\nconst props = defineProps<{ table: TableSchema; token: string; component: string }>()\nconst t = useT()\nconst panel = usePanel()\nconst direction = useDirection()\nconst open = ref(false)\n// `columnManagerTriggerAction()` may set `slideOver()`, `modalWidth()` and the heading.\nconst modal = computed(() => props.table.triggerActions?.columnManager?.modal)\nconst modalHeading = computed(() => modal.value?.heading ?? t('table.columns', {}, 'Columns'))\nconst modalDescription = computed(() => modal.value?.description ?? props.table.pluralModelLabel)\nconst modalWidthClass = computed(() =>\n modal.value?.width ? FILTERS_MODAL_WIDTH_CLASSES[modal.value.width] : undefined,\n)\nconst saving = ref(false)\nconst dragging = ref<string | null>(null)\nconst dropTarget = ref<string | null>(null)\n// Toggles of a deferred column manager wait here until \"Apply\".\nconst draft = ref<string[] | null>(null)\nconst reorderable = computed(() =>\n Boolean(props.table.reorderableColumns && panel.value.endpoints.tableColumns),\n)\nconst toggleable = computed(() => Boolean(props.table.toggleableColumns))\nconst deferred = computed(() => Boolean(props.table.deferColumnManager))\n// A moved column order: the draft of a deferred column manager, or shown at once while\n// it is saved.\nconst orderDraft = ref<string[] | null>(null)\n// Screen-reader announcement of the last move.\nconst announcement = ref('')\nconst idBase = useId()\nconst columns = computed(() =>\n orderColumnsBy(\n reorderable.value\n ? props.table.columns\n : props.table.columns.filter((column) => column.toggleable),\n orderDraft.value,\n ),\n)\nconst appliedNames = computed(() => props.table.columns.map((column) => column.name))\nconst names = computed(() => orderDraft.value ?? appliedNames.value)\nconst orderChanged = computed(\n () => orderDraft.value !== null && columnOrderChanged(appliedNames.value, orderDraft.value),\n)\nconst positions = computed(() =>\n Object.fromEntries(\n columns.value.map((column) => [\n column.name,\n columnManagerPosition(names.value, column.name, props.table.columnGroups),\n ]),\n ),\n)\n\n// The server's order replaces the one shown while saving.\nwatch(\n () => props.table.columns,\n () => {\n if (!deferred.value) orderDraft.value = null\n },\n)\nconst visible = computed(() => draft.value ?? props.table.visibleColumns)\n\nconst trigger = computed(() =>\n triggerButtonView(props.table, 'columnManager', {\n label: t('table.columns', {}, 'Columns'),\n showLabel: false,\n }),\n)\nconst resetView = computed(() =>\n triggerButtonView(props.table, 'columnManagerReset', {\n label: toggleable.value\n ? t('table.reset_columns', {}, 'Reset')\n : t('table.reset_column_order', {}, 'Reset column order'),\n variant: 'ghost',\n }),\n)\nconst applyView = computed(() =>\n deferred.value\n ? triggerButtonView(props.table, 'columnManagerApply', {\n label: t('table_filters.apply', {}, 'Apply'),\n variant: 'default',\n })\n : null,\n)\nconst inHeader = computed(() => props.table.columnManagerResetActionPosition === 'header')\nconst draftChanged = computed(\n () => draft.value !== null && columnDraftChanged(props.table.visibleColumns, draft.value),\n)\n\nconst toggle = (name: string) => {\n const next = toggleVisibleColumn(visible.value, name)\n\n if (deferred.value) {\n draft.value = next\n } else {\n visitTable(props.table.identifier, { columns: next }, ['page'])\n }\n}\n\nconst dragStart = (event: DragEvent, name: string) => {\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move'\n dragging.value = name\n}\n\nconst dragOver = (event: DragEvent, name: string) => {\n if (dragging.value === null) return\n\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = name\n}\n\nconst drop = (name: string) => {\n if (dragging.value !== null && dragging.value !== name) {\n reorder(dragging.value, moveColumnTo(names.value, dragging.value, name))\n }\n\n dragging.value = null\n dropTarget.value = null\n}\n\nconst save = async (order: string[]): Promise<boolean> => {\n const endpoint = panel.value.endpoints.tableColumns\n\n if (!endpoint) return false\n\n saving.value = true\n\n try {\n await saveColumnOrder(endpoint, props.token, props.component, order)\n\n return true\n } catch (error) {\n showToast({\n id: 'alfakit-column-order-failed',\n title: t('table.column_order_failed', {}, \"Couldn't save the column order\"),\n body: error instanceof Error ? error.message : String(error),\n status: 'danger',\n format: 'alfakit',\n })\n\n return false\n } finally {\n saving.value = false\n }\n}\n\nconst positionText = (name: string) => {\n const { position, count, group } = positions.value[name] ?? { position: 0, count: 0 }\n\n return group\n ? t(\n 'table.column_manager.position_in_group',\n { position, count, group },\n `Position ${position} of ${count} in ${group}.`,\n )\n : t('table.column_manager.position', { position, count }, `Position ${position} of ${count}.`)\n}\n\nconst announce = (name: string, order: string[]) => {\n const { position, count, group } = columnManagerPosition(order, name, props.table.columnGroups)\n const label = props.table.columns.find((column) => column.name === name)?.label ?? name\n const replace = { column: label, position, count, group: group ?? '' }\n\n announcement.value = group\n ? deferred.value\n ? t(\n 'table.column_manager.reordered_in_group_deferred',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered_in_group',\n replace,\n `${label} moved to position ${position} of ${count} in ${group}.`,\n )\n : deferred.value\n ? t(\n 'table.column_manager.reordered_deferred',\n replace,\n `${label} moved to position ${position} of ${count}. Apply columns to save your changes.`,\n )\n : t(\n 'table.column_manager.reordered',\n replace,\n `${label} moved to position ${position} of ${count}.`,\n )\n}\n\n// A new order: kept as a draft until \"Apply\" (`deferColumnManager()`), else saved now.\nconst reorder = (name: string, order: string[]) => {\n if (saving.value || !columnOrderChanged(names.value, order)) return\n\n orderDraft.value = order\n announcement.value = ''\n\n if (deferred.value) {\n announce(name, order)\n\n return\n }\n\n void save(order).then((saved) => {\n if (saved) announce(name, order)\n else orderDraft.value = null\n })\n}\n\nconst move = (name: string, offset: -1 | 1, event: MouseEvent) => {\n keepMoveButtonFocus(event.currentTarget as HTMLElement | null)\n reorder(name, moveColumnInManager(names.value, name, offset, props.table.columnGroups))\n}\n\n// The order is saved before the visibility visit: both requests share the session, and a\n// visit running alongside the save would write the old order back when it finishes.\nconst apply = async () => {\n const order = orderDraft.value && orderChanged.value ? orderDraft.value : null\n const columns =\n draft.value && columnDraftChanged(props.table.visibleColumns, draft.value) ? draft.value : null\n\n draft.value = null\n orderDraft.value = null\n announcement.value = ''\n open.value = false\n\n if (order) await save(order)\n\n if (columns) visitTable(props.table.identifier, { columns }, ['page'])\n}\n\n// Reset: the defined column order and, for toggleable columns, the default visibility.\nconst reset = async () => {\n if (reorderable.value) {\n orderDraft.value = null\n await save([])\n }\n\n if (toggleable.value) {\n draft.value = null\n visitTable(props.table.identifier, { columns: defaultVisibleColumns(props.table) }, ['page'])\n }\n}\n\nconst setOpen = (next: boolean) => {\n // Closing without \"Apply\" drops the draft.\n if (!next) {\n draft.value = null\n if (deferred.value) orderDraft.value = null\n announcement.value = ''\n }\n open.value = next\n}\n\nconst [DefineBody, ManagerBody] = createReusableTemplate()\nconst [DefineReset, ResetButton] = createReusableTemplate()\n</script>\n\n<template>\n <template v-if=\"(toggleable || reorderable) && trigger\">\n <DefineReset>\n <TableTriggerButton\n v-if=\"resetView\"\n :view=\"resetView\"\n :disabled=\"saving\"\n data-slot=\"column-manager-reset\"\n :class=\"cn(!applyView && 'w-full')\"\n @click=\"reset\"\n />\n </DefineReset>\n <DefineBody>\n <div class=\"flex flex-col gap-1\">\n <div v-if=\"inHeader && resetView\" class=\"flex justify-end\"><ResetButton /></div>\n <ul\n :class=\"\n cn(\n props.table.columnManagerColumns\n ? ['grid gap-0.5', gridColumnsClasses(props.table.columnManagerColumns)]\n : 'flex flex-col gap-0.5',\n )\n \"\n :aria-label=\"t('table.columns', {}, 'Columns')\"\n >\n <li\n v-for=\"column in columns\"\n :key=\"column.name\"\n :data-column=\"column.name\"\n :draggable=\"reorderable && !saving\"\n :class=\"\n cn(\n 'flex items-center gap-2 rounded-md px-2 py-1 text-sm',\n reorderable && 'cursor-grab',\n dragging === column.name && 'opacity-50',\n dropTarget === column.name && dragging !== column.name && 'bg-muted',\n )\n \"\n @dragstart=\"dragStart($event, column.name)\"\n @dragover=\"dragOver($event, column.name)\"\n @dragleave=\"dropTarget === column.name && (dropTarget = null)\"\n @dragend=\"((dragging = null), (dropTarget = null))\"\n @drop.prevent=\"drop(column.name)\"\n >\n <GripVerticalIcon\n v-if=\"reorderable\"\n class=\"text-muted-foreground size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <label v-if=\"column.toggleable\" class=\"flex min-w-0 flex-1 items-center gap-2\">\n <Checkbox\n :model-value=\"visible.includes(column.name)\"\n @update:model-value=\"toggle(column.name)\"\n />\n <span class=\"truncate\">{{ column.label }}</span>\n </label>\n <span v-else class=\"min-w-0 flex-1 truncate\">{{ column.label }}</span>\n <span v-if=\"reorderable\" class=\"flex shrink-0 items-center\">\n <span\n :id=\"`${idBase}-${column.name}-position`\"\n class=\"sr-only\"\n data-slot=\"column-manager-position\"\n >{{ positionText(column.name) }}</span\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"(positions[column.name]?.position ?? 0) <= 1\"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_up', { column: column.label }, `Move ${column.label} up`)\n \"\n @click=\"move(column.name, -1, $event)\"\n ><ChevronUpIcon\n /></Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :disabled=\"\n (positions[column.name]?.position ?? 0) >= (positions[column.name]?.count ?? 0)\n \"\n :aria-disabled=\"saving || undefined\"\n :aria-describedby=\"`${idBase}-${column.name}-position`\"\n :aria-label=\"\n t('table.move_column_down', { column: column.label }, `Move ${column.label} down`)\n \"\n @click=\"move(column.name, 1, $event)\"\n ><ChevronDownIcon\n /></Button>\n </span>\n </li>\n </ul>\n <div\n v-if=\"reorderable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n class=\"sr-only\"\n data-slot=\"column-manager-announcement\"\n >\n {{ announcement }}\n </div>\n <div\n v-if=\"(!inHeader && resetView) || applyView\"\n class=\"mt-1 flex items-center justify-end gap-2\"\n >\n <ResetButton v-if=\"!inHeader\" />\n <TableTriggerButton\n v-if=\"applyView\"\n :view=\"applyView\"\n data-slot=\"column-manager-apply\"\n :disabled=\"!draftChanged && !orderChanged\"\n @click=\"apply\"\n />\n </div>\n </div>\n </DefineBody>\n <Sheet\n v-if=\"props.table.columnManagerLayout === 'modal' && modal?.slideOver\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <SheetTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </SheetTrigger>\n <SheetContent\n :side=\"slideOverSide(modal.slideOverPosition, direction)\"\n :class=\"cn('flex w-full flex-col gap-0 p-0', modalWidthClass ?? 'sm:max-w-md')\"\n data-slot=\"column-manager\"\n data-slide-over=\"\"\n >\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ modalHeading }}</SheetTitle>\n <SheetDescription :class=\"modal.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</SheetDescription>\n </SheetHeader>\n <div class=\"flex-1 overflow-y-auto p-4\"><ManagerBody /></div>\n </SheetContent>\n </Sheet>\n <Dialog\n v-else-if=\"props.table.columnManagerLayout === 'modal'\"\n :open=\"open\"\n @update:open=\"setOpen\"\n >\n <DialogTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </DialogTrigger>\n <DialogContent :class=\"modalWidthClass ?? 'sm:max-w-lg'\" data-slot=\"column-manager\">\n <DialogHeader>\n <DialogTitle>{{ modalHeading }}</DialogTitle>\n <DialogDescription :class=\"modal?.description ? undefined : 'sr-only'\">{{\n modalDescription\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-[60vh] overflow-y-auto\"><ManagerBody /></div>\n </DialogContent>\n </Dialog>\n <Popover v-else :open=\"open\" @update:open=\"setOpen\">\n <PopoverTrigger as-child>\n <TableTriggerButton :view=\"trigger\">\n <template #icon\n ><Icon name=\"alfakit::tables.actions.column-manager\" :fallback=\"Columns3Icon\"\n /></template>\n </TableTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n :class=\"cn('p-2', props.table.columnManagerColumns ? 'w-auto min-w-64' : 'w-64')\"\n data-slot=\"column-manager\"\n >\n <ManagerBody />\n </PopoverContent>\n </Popover>\n </template>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentLayoutSort.js","names":["_sfc_main","ContentLayoutSort_vue_vue_type_script_setup_true_lang_default","ContentLayoutSort_default"],"sources":["../../../src/components/table/ContentLayoutSort.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColumnSchema, TableSchema } from '@alfakit/core'\nimport { visitTable } from '@alfakit/core'\nimport { ArrowDownIcon, ArrowUpIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport Button from '../ui/Button.vue'\n\n/**\n * Sorting for content layouts, which have no column headers: a select of the sortable\n * columns and a direction toggle.\n */\nconst props = defineProps<{ table: TableSchema; columns: ColumnSchema[] }>()\nconst t = useT()\nconst sortable = computed(() => props.columns.filter((column) => column.sortable))\nconst direction = computed(() => props.table.sort?.direction ?? 'asc')\n\nconst sortBy = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(\n props.table.identifier,\n { sort: value || null, direction: value ? direction.value : null },\n ['page'],\n )\n}\nconst flip = () =>\n visitTable(\n props.table.identifier,\n {\n sort: props.table.sort?.column ?? null,\n direction: direction.value === 'asc' ? 'desc' : 'asc',\n },\n ['page'],\n )\n</script>\n\n<template>\n <div v-if=\"sortable.length > 0\" class=\"flex items-center gap-1\">\n <label class=\"flex items-center gap-2 text-sm\">\n <span class=\"sr-only\">{{ t('table.sort_by', {}, 'Sort by') }}</span>\n <select\n :value=\"
|
|
1
|
+
{"version":3,"file":"ContentLayoutSort.js","names":["_sfc_main","ContentLayoutSort_vue_vue_type_script_setup_true_lang_default","ContentLayoutSort_default"],"sources":["../../../src/components/table/ContentLayoutSort.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColumnSchema, TableSchema } from '@alfakit/core'\nimport { visitTable } from '@alfakit/core'\nimport { ArrowDownIcon, ArrowUpIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport Button from '../ui/Button.vue'\n\n/**\n * Sorting for content layouts, which have no column headers: a select of the sortable\n * columns and a direction toggle.\n */\nconst props = defineProps<{ table: TableSchema; columns: ColumnSchema[] }>()\nconst t = useT()\nconst sortable = computed(() => props.columns.filter((column) => column.sortable))\nconst direction = computed(() => props.table.sort?.direction ?? 'asc')\n// A default sort on a column the select doesn't list (`created_at`) shows the placeholder.\nconst selected = computed(() =>\n sortable.value.some((column) => column.name === props.table.sort?.column)\n ? (props.table.sort?.column ?? '')\n : '',\n)\n\nconst sortBy = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(\n props.table.identifier,\n { sort: value || null, direction: value ? direction.value : null },\n ['page'],\n )\n}\nconst flip = () =>\n visitTable(\n props.table.identifier,\n {\n sort: props.table.sort?.column ?? null,\n direction: direction.value === 'asc' ? 'desc' : 'asc',\n },\n ['page'],\n )\n</script>\n\n<template>\n <div v-if=\"sortable.length > 0\" class=\"flex items-center gap-1\">\n <label class=\"flex items-center gap-2 text-sm\">\n <span class=\"sr-only\">{{ t('table.sort_by', {}, 'Sort by') }}</span>\n <select\n :value=\"selected\"\n class=\"border-input h-8 rounded-md border bg-transparent px-2 text-sm\"\n @change=\"sortBy\"\n >\n <option value=\"\">\n {{ props.table.defaultSortOptionLabel ?? t('table.sort_by', {}, 'Sort by') }}\n </option>\n <option v-for=\"column in sortable\" :key=\"column.name\" :value=\"column.name\">\n {{ column.label }}\n </option>\n </select>\n </label>\n <Button\n v-if=\"props.table.sort\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :aria-label=\"\n direction === 'asc'\n ? t('table.sort_ascending', {}, 'Ascending')\n : t('table.sort_descending', {}, 'Descending')\n \"\n @click=\"flip\"\n >\n <ArrowUpIcon v-if=\"direction === 'asc'\" />\n <ArrowDownIcon v-else />\n </Button>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentLayoutSort.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/ContentLayoutSort.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ContentLayoutSort.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/ContentLayoutSort.vue"],"names":[],"mappings":"AA8EA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAO9D;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;;AAgKnE,wBAMG"}
|
|
@@ -14,20 +14,20 @@ var _ = {
|
|
|
14
14
|
columns: {}
|
|
15
15
|
},
|
|
16
16
|
setup(l) {
|
|
17
|
-
let C = l, w = e(), T = i(() => C.columns.filter((e) => e.sortable)), E = i(() => C.table.sort?.direction ?? "asc"), D = (e) => {
|
|
17
|
+
let C = l, w = e(), T = i(() => C.columns.filter((e) => e.sortable)), E = i(() => C.table.sort?.direction ?? "asc"), D = i(() => T.value.some((e) => e.name === C.table.sort?.column) ? C.table.sort?.column ?? "" : ""), O = (e) => {
|
|
18
18
|
let t = e.target.value;
|
|
19
19
|
n(C.table.identifier, {
|
|
20
20
|
sort: t || null,
|
|
21
21
|
direction: t ? E.value : null
|
|
22
22
|
}, ["page"]);
|
|
23
|
-
},
|
|
23
|
+
}, k = () => n(C.table.identifier, {
|
|
24
24
|
sort: C.table.sort?.column ?? null,
|
|
25
25
|
direction: E.value === "asc" ? "desc" : "asc"
|
|
26
26
|
}, ["page"]);
|
|
27
27
|
return (e, n) => T.value.length > 0 ? (u(), s("div", _, [c("label", v, [c("span", y, f(p(w)("table.sort_by", {}, "Sort by")), 1), c("select", {
|
|
28
|
-
value:
|
|
28
|
+
value: D.value,
|
|
29
29
|
class: "border-input h-8 rounded-md border bg-transparent px-2 text-sm",
|
|
30
|
-
onChange:
|
|
30
|
+
onChange: O
|
|
31
31
|
}, [c("option", x, f(C.table.defaultSortOptionLabel ?? p(w)("table.sort_by", {}, "Sort by")), 1), (u(!0), s(r, null, d(T.value, (e) => (u(), s("option", {
|
|
32
32
|
key: e.name,
|
|
33
33
|
value: e.name
|
|
@@ -37,7 +37,7 @@ var _ = {
|
|
|
37
37
|
variant: "outline",
|
|
38
38
|
size: "icon-sm",
|
|
39
39
|
"aria-label": E.value === "asc" ? p(w)("table.sort_ascending", {}, "Ascending") : p(w)("table.sort_descending", {}, "Descending"),
|
|
40
|
-
onClick:
|
|
40
|
+
onClick: k
|
|
41
41
|
}, {
|
|
42
42
|
default: m(() => [E.value === "asc" ? (u(), a(p(g), { key: 0 })) : (u(), a(p(h), { key: 1 }))]),
|
|
43
43
|
_: 1
|