@lattice-php/lattice 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/action/components/action-form.d.ts +24 -0
- package/dist/action/components/action-form.js +238 -0
- package/dist/action/components/action-form.js.map +1 -0
- package/dist/action/components/action-group.d.ts +1 -8
- package/dist/action/components/action-group.js +34 -64
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action-menu-context.d.ts +6 -0
- package/dist/action/components/action-menu-context.js +18 -0
- package/dist/action/components/action-menu-context.js.map +1 -0
- package/dist/action/components/action.d.ts +1 -24
- package/dist/action/components/action.js +73 -51
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/index.d.ts +1 -1
- package/dist/action/index.js.map +1 -1
- package/dist/appearance/index.js +7 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/chat/components/chat-box.d.ts +3 -0
- package/dist/chat/components/chat-box.js +53 -0
- package/dist/chat/components/chat-box.js.map +1 -0
- package/dist/chat/components/message-list.d.ts +5 -0
- package/dist/chat/components/message-list.js +22 -0
- package/dist/chat/components/message-list.js.map +1 -0
- package/dist/chat/components/message.d.ts +5 -0
- package/dist/chat/components/message.js +20 -0
- package/dist/chat/components/message.js.map +1 -0
- package/dist/chat/components/prompt-input.d.ts +8 -0
- package/dist/chat/components/prompt-input.js +49 -0
- package/dist/chat/components/prompt-input.js.map +1 -0
- package/dist/chat/index.d.ts +1 -0
- package/dist/chat/index.js +15 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/parts/text.d.ts +3 -0
- package/dist/chat/parts/text.js +12 -0
- package/dist/chat/parts/text.js.map +1 -0
- package/dist/chat/parts/tool-call.d.ts +3 -0
- package/dist/chat/parts/tool-call.js +20 -0
- package/dist/chat/parts/tool-call.js.map +1 -0
- package/dist/chat/transport.d.ts +2 -0
- package/dist/chat/transport.js +47 -0
- package/dist/chat/transport.js.map +1 -0
- package/dist/chat/types.d.ts +39 -0
- package/dist/chat/use-chat.d.ts +15 -0
- package/dist/chat/use-chat.js +161 -0
- package/dist/chat/use-chat.js.map +1 -0
- package/dist/core/api.d.ts +18 -0
- package/dist/core/api.js +51 -0
- package/dist/core/api.js.map +1 -0
- package/dist/core/collapsed-context.d.ts +2 -0
- package/dist/core/collapsed-context.js +10 -0
- package/dist/core/collapsed-context.js.map +1 -0
- package/dist/core/column-sizing.d.ts +17 -0
- package/dist/core/column-sizing.js +61 -0
- package/dist/core/column-sizing.js.map +1 -0
- package/dist/core/components/badge.d.ts +1 -8
- package/dist/core/components/badge.js +2 -3
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/button.d.ts +5 -13
- package/dist/core/components/button.js +10 -9
- package/dist/core/components/button.js.map +1 -1
- package/dist/core/components/card.d.ts +1 -9
- package/dist/core/components/card.js +1 -3
- package/dist/core/components/card.js.map +1 -1
- package/dist/core/components/chart.d.ts +3 -0
- package/dist/core/components/chart.js +175 -0
- package/dist/core/components/chart.js.map +1 -0
- package/dist/{form/components/base → core/components}/checkbox.js +7 -4
- package/dist/core/components/checkbox.js.map +1 -0
- package/dist/core/components/combobox.d.ts +33 -0
- package/dist/core/components/combobox.js +99 -0
- package/dist/core/components/combobox.js.map +1 -0
- package/dist/core/components/confirm-dialog.d.ts +2 -3
- package/dist/core/components/confirm-dialog.js +17 -17
- package/dist/core/components/confirm-dialog.js.map +1 -1
- package/dist/core/components/control.d.ts +13 -0
- package/dist/core/components/control.js +27 -0
- package/dist/core/components/control.js.map +1 -0
- package/dist/core/components/dialog.d.ts +19 -0
- package/dist/core/components/dialog.js +75 -0
- package/dist/core/components/dialog.js.map +1 -0
- package/dist/core/components/dropdown-menu.d.ts +14 -0
- package/dist/core/components/dropdown-menu.js +42 -0
- package/dist/core/components/dropdown-menu.js.map +1 -0
- package/dist/core/components/floating-panel.d.ts +3 -0
- package/dist/core/components/floating-panel.js +65 -0
- package/dist/core/components/floating-panel.js.map +1 -0
- package/dist/core/components/fragment.d.ts +1 -10
- package/dist/core/components/fragment.js +29 -18
- package/dist/core/components/fragment.js.map +1 -1
- package/dist/core/components/grid.d.ts +1 -8
- package/dist/core/components/grid.js +1 -2
- package/dist/core/components/grid.js.map +1 -1
- package/dist/core/components/heading.d.ts +1 -9
- package/dist/core/components/heading.js +2 -3
- package/dist/core/components/heading.js.map +1 -1
- package/dist/core/components/icon.d.ts +3 -0
- package/dist/core/components/icon.js +31 -0
- package/dist/core/components/icon.js.map +1 -0
- package/dist/core/components/index.d.ts +1 -1
- package/dist/core/components/index.js +12 -1
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/info-tooltip.d.ts +3 -0
- package/dist/core/components/info-tooltip.js +26 -0
- package/dist/core/components/info-tooltip.js.map +1 -0
- package/dist/core/components/link.d.ts +1 -12
- package/dist/core/components/link.js +12 -11
- package/dist/core/components/link.js.map +1 -1
- package/dist/core/components/modal.d.ts +1 -11
- package/dist/core/components/modal.js +16 -42
- package/dist/core/components/modal.js.map +1 -1
- package/dist/core/components/popover.d.ts +8 -0
- package/dist/core/components/popover.js +37 -0
- package/dist/core/components/popover.js.map +1 -0
- package/dist/core/components/raw-block.d.ts +3 -0
- package/dist/core/components/raw-block.js +10 -0
- package/dist/core/components/raw-block.js.map +1 -0
- package/dist/core/components/section.d.ts +3 -0
- package/dist/core/components/section.js +75 -0
- package/dist/core/components/section.js.map +1 -0
- package/dist/core/components/segmented-control.d.ts +1 -14
- package/dist/core/components/segmented-control.js +4 -7
- package/dist/core/components/segmented-control.js.map +1 -1
- package/dist/core/components/segmented-pills.d.ts +4 -2
- package/dist/core/components/segmented-pills.js +10 -1
- package/dist/core/components/segmented-pills.js.map +1 -1
- package/dist/core/components/skeleton.d.ts +3 -0
- package/dist/core/components/skeleton.js +16 -0
- package/dist/core/components/skeleton.js.map +1 -0
- package/dist/core/components/spinner.js +8 -4
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/stack.d.ts +1 -11
- package/dist/core/components/stack.js +24 -13
- package/dist/core/components/stack.js.map +1 -1
- package/dist/core/components/tabs.d.ts +1 -19
- package/dist/core/components/tabs.js +45 -21
- package/dist/core/components/tabs.js.map +1 -1
- package/dist/core/components/text.d.ts +1 -9
- package/dist/core/components/text.js +18 -3
- package/dist/core/components/text.js.map +1 -1
- package/dist/core/headers.d.ts +1 -0
- package/dist/core/headers.js +14 -0
- package/dist/core/headers.js.map +1 -0
- package/dist/core/registry-context.d.ts +21 -0
- package/dist/core/registry-context.js +40 -0
- package/dist/core/registry-context.js.map +1 -0
- package/dist/core/registry.d.ts +12 -3
- package/dist/core/registry.js +30 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/renderer.d.ts +8 -14
- package/dist/core/renderer.js +20 -36
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/test-id.d.ts +8 -0
- package/dist/core/test-id.js +21 -0
- package/dist/core/test-id.js.map +1 -0
- package/dist/core/types.d.ts +68 -26
- package/dist/core/use-column-resizing.d.ts +27 -0
- package/dist/core/use-column-resizing.js +228 -0
- package/dist/core/use-column-resizing.js.map +1 -0
- package/dist/effects/dispatch.d.ts +20 -0
- package/dist/effects/dispatch.js +39 -0
- package/dist/effects/dispatch.js.map +1 -0
- package/dist/effects/registry.d.ts +38 -0
- package/dist/effects/registry.js +51 -0
- package/dist/effects/registry.js.map +1 -0
- package/dist/effects/use-effect-dispatcher.d.ts +8 -0
- package/dist/effects/use-effect-dispatcher.js +20 -0
- package/dist/effects/use-effect-dispatcher.js.map +1 -0
- package/dist/effects/use-flash-effects.d.ts +5 -0
- package/dist/effects/use-flash-effects.js +22 -0
- package/dist/effects/use-flash-effects.js.map +1 -0
- package/dist/events/event-bridge.d.ts +3 -7
- package/dist/events/event-bridge.js +17 -47
- package/dist/events/event-bridge.js.map +1 -1
- package/dist/events/event-names.d.ts +3 -1
- package/dist/events/event-names.js +3 -1
- package/dist/events/event-names.js.map +1 -1
- package/dist/form/components/base/field.d.ts +3 -1
- package/dist/form/components/base/field.js +21 -2
- package/dist/form/components/base/field.js.map +1 -1
- package/dist/form/components/base/input-error.js +1 -1
- package/dist/form/components/base/input-error.js.map +1 -1
- package/dist/form/components/base/input.js +2 -1
- package/dist/form/components/base/input.js.map +1 -1
- package/dist/form/components/base/label.js.map +1 -1
- package/dist/form/components/base/password-input.js +9 -2
- package/dist/form/components/base/password-input.js.map +1 -1
- package/dist/form/components/base/submit-button.d.ts +4 -4
- package/dist/form/components/base/submit-button.js +5 -3
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/base/textarea.js +2 -1
- package/dist/form/components/base/textarea.js.map +1 -1
- package/dist/form/components/conditions.d.ts +6 -9
- package/dist/form/components/conditions.js +10 -2
- package/dist/form/components/conditions.js.map +1 -1
- package/dist/form/components/context.d.ts +1 -4
- package/dist/form/components/context.js +2 -5
- package/dist/form/components/context.js.map +1 -1
- package/dist/form/components/field-props.d.ts +28 -0
- package/dist/form/components/field-props.js +15 -0
- package/dist/form/components/field-props.js.map +1 -0
- package/dist/form/components/field-scope.d.ts +21 -0
- package/dist/form/components/field-scope.js +54 -0
- package/dist/form/components/field-scope.js.map +1 -0
- package/dist/form/components/fields/block-add-menu.d.ts +9 -0
- package/dist/form/components/fields/block-add-menu.js +27 -0
- package/dist/form/components/fields/block-add-menu.js.map +1 -0
- package/dist/form/components/fields/builder.d.ts +2 -0
- package/dist/form/components/fields/builder.js +124 -0
- package/dist/form/components/fields/builder.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +2 -16
- package/dist/form/components/fields/checkbox.js +28 -30
- package/dist/form/components/fields/checkbox.js.map +1 -1
- package/dist/form/components/fields/choice.d.ts +2 -14
- package/dist/form/components/fields/choice.js +14 -20
- package/dist/form/components/fields/choice.js.map +1 -1
- package/dist/form/components/fields/date-input.d.ts +2 -20
- package/dist/form/components/fields/date-input.js +12 -16
- package/dist/form/components/fields/date-input.js.map +1 -1
- package/dist/form/components/fields/file-upload.d.ts +2 -0
- package/dist/form/components/fields/file-upload.js +250 -0
- package/dist/form/components/fields/file-upload.js.map +1 -0
- package/dist/form/components/fields/hidden-input.d.ts +2 -10
- package/dist/form/components/fields/hidden-input.js +11 -6
- package/dist/form/components/fields/hidden-input.js.map +1 -1
- package/dist/form/components/fields/number-input.d.ts +2 -23
- package/dist/form/components/fields/number-input.js +40 -41
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/password-input.d.ts +2 -29
- package/dist/form/components/fields/password-input.js +41 -41
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/repeater-rows.d.ts +12 -0
- package/dist/form/components/fields/repeater-rows.js +46 -0
- package/dist/form/components/fields/repeater-rows.js.map +1 -0
- package/dist/form/components/fields/repeater.d.ts +2 -0
- package/dist/form/components/fields/repeater.js +97 -0
- package/dist/form/components/fields/repeater.js.map +1 -0
- package/dist/form/components/fields/rich-editor.d.ts +2 -17
- package/dist/form/components/fields/rich-editor.js +90 -52
- package/dist/form/components/fields/rich-editor.js.map +1 -1
- package/dist/form/components/fields/row-action-menu.d.ts +17 -0
- package/dist/form/components/fields/row-action-menu.js +61 -0
- package/dist/form/components/fields/row-action-menu.js.map +1 -0
- package/dist/form/components/fields/row-actions.d.ts +10 -0
- package/dist/form/components/fields/row-actions.js +45 -0
- package/dist/form/components/fields/row-actions.js.map +1 -0
- package/dist/form/components/fields/row-item.d.ts +27 -0
- package/dist/form/components/fields/row-item.js +69 -0
- package/dist/form/components/fields/row-item.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +2 -23
- package/dist/form/components/fields/select.js +97 -121
- package/dist/form/components/fields/select.js.map +1 -1
- package/dist/form/components/fields/simple-field.d.ts +9 -0
- package/dist/form/components/fields/simple-field.js +23 -0
- package/dist/form/components/fields/simple-field.js.map +1 -0
- package/dist/form/components/fields/table-rows.d.ts +32 -0
- package/dist/form/components/fields/table-rows.js +188 -0
- package/dist/form/components/fields/table-rows.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +2 -21
- package/dist/form/components/fields/text-input.js +13 -17
- package/dist/form/components/fields/text-input.js.map +1 -1
- package/dist/form/components/fields/textarea.d.ts +2 -20
- package/dist/form/components/fields/textarea.js +12 -16
- package/dist/form/components/fields/textarea.js.map +1 -1
- package/dist/form/components/fields/use-flip-reorder.d.ts +6 -0
- package/dist/form/components/fields/use-flip-reorder.js +51 -0
- package/dist/form/components/fields/use-flip-reorder.js.map +1 -0
- package/dist/form/components/fields/use-row-collection.d.ts +11 -0
- package/dist/form/components/fields/use-row-collection.js +44 -0
- package/dist/form/components/fields/use-row-collection.js.map +1 -0
- package/dist/form/components/form-path.d.ts +5 -0
- package/dist/form/components/form-path.js +40 -0
- package/dist/form/components/form-path.js.map +1 -0
- package/dist/form/components/form-transport.d.ts +3 -4
- package/dist/form/components/form-transport.js +17 -18
- package/dist/form/components/form-transport.js.map +1 -1
- package/dist/form/components/form.d.ts +1 -20
- package/dist/form/components/form.js +47 -48
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/index.d.ts +3 -1
- package/dist/form/components/index.js +4 -2
- package/dist/form/components/override-keys.d.ts +2 -0
- package/dist/form/components/override-keys.js +12 -0
- package/dist/form/components/override-keys.js.map +1 -0
- package/dist/form/components/prefill-context.d.ts +5 -0
- package/dist/form/components/prefill-context.js +11 -0
- package/dist/form/components/prefill-context.js.map +1 -0
- package/dist/form/components/prefill-targets.d.ts +17 -0
- package/dist/form/components/prefill-targets.js +73 -0
- package/dist/form/components/prefill-targets.js.map +1 -0
- package/dist/form/components/resolved-nodes.d.ts +1 -1
- package/dist/form/components/resolved-nodes.js +6 -3
- package/dist/form/components/resolved-nodes.js.map +1 -1
- package/dist/form/components/row-layout-context.d.ts +5 -0
- package/dist/form/components/row-layout-context.js +18 -0
- package/dist/form/components/row-layout-context.js.map +1 -0
- package/dist/form/components/types.d.ts +1 -0
- package/dist/form/components/use-controlled-field.d.ts +5 -9
- package/dist/form/components/use-controlled-field.js +17 -13
- package/dist/form/components/use-controlled-field.js.map +1 -1
- package/dist/form/components/use-dependent-field.d.ts +1 -1
- package/dist/form/components/use-dependent-field.js +14 -8
- package/dist/form/components/use-dependent-field.js.map +1 -1
- package/dist/form/components/use-field-commit.d.ts +4 -0
- package/dist/form/components/use-field-commit.js +21 -7
- package/dist/form/components/use-field-commit.js.map +1 -1
- package/dist/form/components/use-form-resolver.d.ts +7 -2
- package/dist/form/components/use-form-resolver.js +57 -17
- package/dist/form/components/use-form-resolver.js.map +1 -1
- package/dist/form/components/use-seed-default.d.ts +5 -0
- package/dist/form/components/use-seed-default.js +28 -0
- package/dist/form/components/use-seed-default.js.map +1 -0
- package/dist/form/components/values.js +20 -5
- package/dist/form/components/values.js.map +1 -1
- package/dist/form/index.d.ts +1 -1
- package/dist/form/index.js +13 -11
- package/dist/form/index.js.map +1 -1
- package/dist/form/skeleton.d.ts +1 -1
- package/dist/form/skeleton.js +5 -4
- package/dist/form/skeleton.js.map +1 -1
- package/dist/i18n/backend.d.ts +26 -0
- package/dist/i18n/backend.js +54 -0
- package/dist/i18n/backend.js.map +1 -0
- package/dist/i18n/config.d.ts +6 -0
- package/dist/i18n/config.js +36 -0
- package/dist/i18n/config.js.map +1 -0
- package/dist/i18n/index.d.ts +9 -0
- package/dist/i18n/index.js +7 -0
- package/dist/i18n/instance.d.ts +27 -0
- package/dist/i18n/instance.js +95 -0
- package/dist/i18n/instance.js.map +1 -0
- package/dist/i18n/locale-reload.d.ts +3 -0
- package/dist/i18n/locale-reload.js +17 -0
- package/dist/i18n/locale-reload.js.map +1 -0
- package/dist/i18n/locale-switcher.d.ts +21 -0
- package/dist/i18n/locale-switcher.js +25 -0
- package/dist/i18n/locale-switcher.js.map +1 -0
- package/dist/i18n/locale.d.ts +9 -0
- package/dist/i18n/locale.js +93 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/page-props.d.ts +3 -0
- package/dist/i18n/page-props.js +24 -0
- package/dist/i18n/page-props.js.map +1 -0
- package/dist/icons/icon-renderer.js +30 -5
- package/dist/icons/icon-renderer.js.map +1 -1
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -1
- package/dist/icons/sprite.d.ts +30 -0
- package/dist/icons/sprite.js +40 -0
- package/dist/icons/sprite.js.map +1 -0
- package/dist/index.d.ts +23 -9
- package/dist/index.js +22 -7
- package/dist/inertia.d.ts +3 -7
- package/dist/inertia.js +13 -10
- package/dist/inertia.js.map +1 -1
- package/dist/lattice.css +172 -15
- package/dist/layout/breadcrumbs.d.ts +3 -0
- package/dist/layout/breadcrumbs.js +34 -0
- package/dist/layout/breadcrumbs.js.map +1 -0
- package/dist/layout/callouts.d.ts +3 -0
- package/dist/layout/callouts.js +67 -0
- package/dist/layout/callouts.js.map +1 -0
- package/dist/layout/components.d.ts +1 -0
- package/dist/layout/components.js +25 -0
- package/dist/layout/components.js.map +1 -0
- package/dist/layout/context.d.ts +4 -0
- package/dist/layout/context.js +8 -0
- package/dist/layout/context.js.map +1 -0
- package/dist/layout/dropdown.d.ts +3 -0
- package/dist/layout/dropdown.js +23 -0
- package/dist/layout/dropdown.js.map +1 -0
- package/dist/layout/index.d.ts +4 -0
- package/dist/layout/index.js +6 -0
- package/dist/layout/menu-item.d.ts +3 -0
- package/dist/layout/menu-item.js +101 -0
- package/dist/layout/menu-item.js.map +1 -0
- package/dist/layout/menu.d.ts +3 -0
- package/dist/layout/menu.js +13 -0
- package/dist/layout/menu.js.map +1 -0
- package/dist/layout/outlet.d.ts +6 -0
- package/dist/layout/outlet.js +14 -0
- package/dist/layout/outlet.js.map +1 -0
- package/dist/layout/popover.d.ts +17 -0
- package/dist/layout/popover.js +46 -0
- package/dist/layout/popover.js.map +1 -0
- package/dist/layout/schema-layout.d.ts +10 -0
- package/dist/layout/schema-layout.js +23 -0
- package/dist/layout/schema-layout.js.map +1 -0
- package/dist/layout/sidebar.d.ts +3 -0
- package/dist/layout/sidebar.js +48 -0
- package/dist/layout/sidebar.js.map +1 -0
- package/dist/lib/utils.d.ts +0 -2
- package/dist/lib/utils.js +1 -4
- package/dist/lib/utils.js.map +1 -1
- package/dist/page.d.ts +1 -1
- package/dist/page.js +4 -10
- package/dist/page.js.map +1 -1
- package/dist/provider.d.ts +7 -4
- package/dist/provider.js +15 -11
- package/dist/provider.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +3 -1
- package/dist/registry.js.map +1 -1
- package/dist/svg-sprite-client/index.d.ts +1 -0
- package/dist/svg-sprite-client/index.js +0 -0
- package/dist/svg-sprite-client.d.ts +1 -0
- package/dist/table/align.d.ts +4 -0
- package/dist/table/align.js +23 -0
- package/dist/table/align.js.map +1 -0
- package/dist/table/bulk.d.ts +6 -10
- package/dist/table/bulk.js +13 -35
- package/dist/table/bulk.js.map +1 -1
- package/dist/table/components/bulk-bar.js +40 -6
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.d.ts +2 -0
- package/dist/table/components/cells/badge-cell.js +16 -0
- package/dist/table/components/cells/badge-cell.js.map +1 -0
- package/dist/table/components/cells/boolean-cell.d.ts +3 -0
- package/dist/table/components/cells/boolean-cell.js +23 -0
- package/dist/table/components/cells/boolean-cell.js.map +1 -0
- package/dist/table/components/cells/icon-cell.d.ts +2 -0
- package/dist/table/components/cells/icon-cell.js +21 -0
- package/dist/table/components/cells/icon-cell.js.map +1 -0
- package/dist/table/components/cells/image-cell.d.ts +2 -0
- package/dist/table/components/cells/image-cell.js +23 -0
- package/dist/table/components/cells/image-cell.js.map +1 -0
- package/dist/table/components/cells/money-cell.d.ts +2 -0
- package/dist/table/components/cells/money-cell.js +28 -0
- package/dist/table/components/cells/money-cell.js.map +1 -0
- package/dist/table/components/cells/number-cell.d.ts +2 -0
- package/dist/table/components/cells/number-cell.js +25 -0
- package/dist/table/components/cells/number-cell.js.map +1 -0
- package/dist/table/components/cells/numeric.d.ts +2 -0
- package/dist/table/components/cells/numeric.js +10 -0
- package/dist/table/components/cells/numeric.js.map +1 -0
- package/dist/table/components/cells/stack-cell.d.ts +3 -0
- package/dist/table/components/cells/stack-cell.js +17 -0
- package/dist/table/components/cells/stack-cell.js.map +1 -0
- package/dist/table/components/cells/text-cell.d.ts +2 -0
- package/dist/table/components/cells/text-cell.js +49 -0
- package/dist/table/components/cells/text-cell.js.map +1 -0
- package/dist/table/components/column-filter-control.d.ts +3 -1
- package/dist/table/components/column-filter-control.js +125 -100
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.d.ts +3 -1
- package/dist/table/components/column-header.js +28 -14
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/filter-bar.d.ts +15 -0
- package/dist/table/components/filter-bar.js +81 -0
- package/dist/table/components/filter-bar.js.map +1 -0
- package/dist/table/components/filter-controls.d.ts +18 -0
- package/dist/table/components/filter-controls.js +256 -0
- package/dist/table/components/filter-controls.js.map +1 -0
- package/dist/table/components/filter-stack-bar.d.ts +2 -2
- package/dist/table/components/filter-stack-bar.js +10 -8
- package/dist/table/components/filter-stack-bar.js.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +6 -3
- package/dist/table/components/filter-value-input.js +27 -17
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/pagination.d.ts +1 -1
- package/dist/table/components/pagination.js +20 -8
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/components/sort-bar.d.ts +2 -2
- package/dist/table/components/sort-bar.js +12 -10
- package/dist/table/components/sort-bar.js.map +1 -1
- package/dist/table/components/table-action-node.d.ts +1 -1
- package/dist/table/components/table-action-node.js +1 -1
- package/dist/table/components/table-action-node.js.map +1 -1
- package/dist/table/components/table-cell.js +23 -52
- package/dist/table/components/table-cell.js.map +1 -1
- package/dist/table/components/table.d.ts +6 -2
- package/dist/table/components/table.js +198 -136
- package/dist/table/components/table.js.map +1 -1
- package/dist/table/filter-values.d.ts +13 -0
- package/dist/table/filter-values.js +30 -0
- package/dist/table/filter-values.js.map +1 -0
- package/dist/table/format.js +5 -3
- package/dist/table/format.js.map +1 -1
- package/dist/table/index.d.ts +1 -1
- package/dist/table/index.js.map +1 -1
- package/dist/table/payload.d.ts +1 -1
- package/dist/table/payload.js +24 -3
- package/dist/table/payload.js.map +1 -1
- package/dist/table/query.d.ts +10 -2
- package/dist/table/query.js +64 -11
- package/dist/table/query.js.map +1 -1
- package/dist/table/registry.d.ts +19 -0
- package/dist/table/registry.js +14 -0
- package/dist/table/registry.js.map +1 -0
- package/dist/table/types.d.ts +43 -57
- package/dist/table/use-table.d.ts +9 -5
- package/dist/table/use-table.js +66 -27
- package/dist/table/use-table.js.map +1 -1
- package/dist/toast/callout.d.ts +6 -0
- package/dist/toast/callout.js +31 -0
- package/dist/toast/callout.js.map +1 -0
- package/dist/toast/index.d.ts +5 -0
- package/dist/toast/index.js +4 -0
- package/dist/toast/toast.d.ts +14 -0
- package/dist/toast/toast.js +51 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/toast/toaster.d.ts +3 -0
- package/dist/toast/toaster.js +62 -0
- package/dist/toast/toaster.js.map +1 -0
- package/dist/toast/variant-styles.d.ts +6 -0
- package/dist/toast/variant-styles.js +37 -0
- package/dist/toast/variant-styles.js.map +1 -0
- package/dist/types/generated.d.ts +1037 -0
- package/dist/types/generated.js +0 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/vite-env.d.ts +1 -0
- package/dist/vite.d.ts +25 -0
- package/dist/vite.js +72 -0
- package/dist/vite.js.map +1 -0
- package/package.json +125 -12
- package/resources/icons/align-center.svg +17 -0
- package/resources/icons/align-justify.svg +17 -0
- package/resources/icons/align-left.svg +17 -0
- package/resources/icons/align-right.svg +17 -0
- package/resources/icons/arrow-down.svg +16 -0
- package/resources/icons/arrow-up.svg +16 -0
- package/resources/icons/bold.svg +15 -0
- package/resources/icons/check.svg +15 -0
- package/resources/icons/chevron-down.svg +15 -0
- package/resources/icons/chevron-right.svg +15 -0
- package/resources/icons/chevrons-up-down.svg +16 -0
- package/resources/icons/circle-alert.svg +17 -0
- package/resources/icons/circle-check.svg +16 -0
- package/resources/icons/circle-help.svg +17 -0
- package/resources/icons/circle-x.svg +17 -0
- package/resources/icons/code.svg +16 -0
- package/resources/icons/columns-3.svg +17 -0
- package/resources/icons/copy.svg +16 -0
- package/resources/icons/external-link.svg +17 -0
- package/resources/icons/eye-off.svg +18 -0
- package/resources/icons/eye.svg +16 -0
- package/resources/icons/filter.svg +15 -0
- package/resources/icons/heading-1.svg +18 -0
- package/resources/icons/heading-2.svg +18 -0
- package/resources/icons/heading-3.svg +19 -0
- package/resources/icons/highlighter.svg +16 -0
- package/resources/icons/info.svg +17 -0
- package/resources/icons/italic.svg +17 -0
- package/resources/icons/layout-dashboard.svg +18 -0
- package/resources/icons/link.svg +16 -0
- package/resources/icons/list-ordered.svg +20 -0
- package/resources/icons/list.svg +20 -0
- package/resources/icons/loader-2.svg +15 -0
- package/resources/icons/minus.svg +15 -0
- package/resources/icons/more-horizontal.svg +17 -0
- package/resources/icons/panel-left.svg +16 -0
- package/resources/icons/pencil-line.svg +17 -0
- package/resources/icons/pencil.svg +16 -0
- package/resources/icons/plus.svg +16 -0
- package/resources/icons/quote.svg +16 -0
- package/resources/icons/rotate-ccw.svg +16 -0
- package/resources/icons/rows-3.svg +17 -0
- package/resources/icons/search.svg +16 -0
- package/resources/icons/send.svg +16 -0
- package/resources/icons/settings.svg +16 -0
- package/resources/icons/smile.svg +18 -0
- package/resources/icons/strikethrough.svg +17 -0
- package/resources/icons/table.svg +18 -0
- package/resources/icons/trash-2.svg +19 -0
- package/resources/icons/underline.svg +16 -0
- package/resources/icons/x.svg +16 -0
- package/dist/action/effects.d.ts +0 -30
- package/dist/action/effects.js +0 -44
- package/dist/action/effects.js.map +0 -1
- package/dist/core/props.d.ts +0 -14
- package/dist/core/props.js +0 -30
- package/dist/core/props.js.map +0 -1
- package/dist/form/components/base/checkbox.js.map +0 -1
- package/dist/form/components/fields/submit-button.d.ts +0 -10
- package/dist/form/components/fields/submit-button.js +0 -14
- package/dist/form/components/fields/submit-button.js.map +0 -1
- package/dist/generated/types.d.ts +0 -17
- package/dist/icons/default-icons.d.ts +0 -3
- package/dist/icons/default-icons.js +0 -44
- package/dist/icons/default-icons.js.map +0 -1
- package/dist/icons/dynamic-lucide-renderer.d.ts +0 -2
- package/dist/icons/dynamic-lucide-renderer.js +0 -18
- package/dist/icons/dynamic-lucide-renderer.js.map +0 -1
- package/dist/menu/index.d.ts +0 -1
- package/dist/menu/index.js +0 -2
- package/dist/menu/use-menu.d.ts +0 -2
- package/dist/menu/use-menu.js +0 -9
- package/dist/menu/use-menu.js.map +0 -1
- /package/dist/{generated → chat}/types.js +0 -0
- /package/dist/{form/components/base → core/components}/checkbox.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","names":[],"sources":["../../../resources/js/table/components/table.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { getBulkActions } from \"../bulk\";\nimport { getRowActions, getRowKey } from \"../payload\";\nimport { getColumnGridTemplate, getQueryParams, getVisiblePages } from \"../query\";\nimport { useTable } from \"../use-table\";\nimport { useTableSelection } from \"../use-table-selection\";\nimport { BulkBar } from \"./bulk-bar\";\nimport { ColumnFilterControl } from \"./column-filter-control\";\nimport { ColumnHeader } from \"./column-header\";\nimport { FilterStackBar } from \"./filter-stack-bar\";\nimport { TablePagination } from \"./pagination\";\nimport { SortBar } from \"./sort-bar\";\nimport { TableActionNode } from \"./table-action-node\";\nimport { ColumnCell } from \"./table-cell\";\n\nconst TableComponent: RendererComponent<\"table\"> = ({ node }) => {\n const {\n columns,\n rows,\n pagination,\n state,\n filters,\n addFilter,\n updateFilter,\n removeFilter,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n } = useTable(node);\n\n const bulkActions = getBulkActions(node.props?.bulkActions);\n const hasBulkActions = bulkActions.length > 0;\n const rowEntries = rows.map((row, index) => ({\n row,\n actions: getRowActions(row),\n key: getRowKey(row, index),\n }));\n const selection = useTableSelection(rowEntries.map((entry) => entry.key));\n\n const currentPage = pagination.currentPage ?? state.page;\n const lastPage = pagination.lastPage ?? currentPage;\n const mode = pagination.mode ?? \"table\";\n const visiblePages = getVisiblePages(currentPage, lastPage);\n const hasNextPage = pagination.hasMore ?? currentPage < lastPage;\n const hasActions = rowEntries.some((entry) => entry.actions.length > 0);\n const striped = node.props?.striped === true;\n const hasFilters = columns.some((column) => column.filter?.enabled);\n const filterEntries = filters.map((clause, index) => ({ clause, index }));\n const gridTemplateColumns = getColumnGridTemplate(columns, hasActions, hasBulkActions);\n\n return (\n <div\n data-lattice-component={node.id}\n className=\"overflow-x-auto rounded-lt-sm border border-lt-border\"\n >\n {hasBulkActions && selection.active && (\n <BulkBar\n actions={bulkActions}\n selectedKeys={selection.selectedKeys}\n allMatching={selection.allMatching}\n total={pagination.total}\n query={getQueryParams(state)}\n canSelectAllMatching={\n selection.allVisibleSelected &&\n !selection.allMatching &&\n pagination.total !== undefined &&\n pagination.total > selection.selectedKeys.length\n }\n onSelectAllMatching={selection.selectAllMatching}\n onCompleted={selection.clear}\n />\n )}\n {filters.length > 0 && (\n <FilterStackBar\n filters={filters}\n columns={columns}\n processing={processing}\n onRemove={removeFilter}\n />\n )}\n {state.sorts.length > 0 && (\n <SortBar columns={columns} state={state} processing={processing} onClear={clearSort} />\n )}\n <div className=\"w-max min-w-full text-sm\" role=\"table\">\n <div className=\"border-b border-lt-border bg-lt-muted/50\" role=\"rowgroup\">\n <div\n className=\"hidden min-w-full md:grid md:grid-cols-[var(--lattice-table-columns)]\"\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && (\n <div className=\"flex items-center px-4 py-3\" role=\"columnheader\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={selection.allSelected}\n onChange={selection.toggleAll}\n />\n </div>\n )}\n {columns.map((column) => (\n <ColumnHeader\n column={column}\n key={column.key}\n processing={processing}\n sort={sort}\n state={state}\n />\n ))}\n {hasActions && (\n <div\n className=\"px-4 py-3 text-right align-middle font-medium text-lt-muted-fg\"\n role=\"columnheader\"\n >\n Actions\n </div>\n )}\n </div>\n {hasFilters && (\n <div\n className=\"hidden min-w-full border-t border-lt-border md:grid md:grid-cols-[var(--lattice-table-columns)]\"\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && <div className=\"px-4 py-2\" role=\"cell\" />}\n {columns.map((column) => (\n <div key={column.key} className=\"px-4 py-2\" role=\"cell\">\n {column.filter?.enabled && (\n <ColumnFilterControl\n column={column}\n clauses={filterEntries.filter((entry) => entry.clause.field === column.key)}\n processing={processing}\n onAdd={addFilter}\n onUpdate={updateFilter}\n onRemove={removeFilter}\n />\n )}\n </div>\n ))}\n {hasActions && <div className=\"px-4 py-2\" role=\"cell\" />}\n </div>\n )}\n </div>\n <div role=\"rowgroup\">\n {!hasLoaded ? (\n <div className=\"p-4 text-lt-muted-fg\" role=\"row\">\n <div role=\"cell\">Loading rows...</div>\n </div>\n ) : (\n rowEntries.map(({ row, actions, key }) => {\n return (\n <div\n key={key}\n className={`grid grid-cols-1 border-b border-lt-border last:border-b-0 md:grid-cols-[var(--lattice-table-columns)] ${\n striped ? \"odd:bg-lt-muted/30\" : \"\"\n }`}\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && (\n <div className=\"flex items-center p-4\" role=\"cell\">\n <input\n type=\"checkbox\"\n aria-label={`Select row ${key}`}\n checked={selection.isSelected(key)}\n onChange={() => selection.toggle(key)}\n />\n </div>\n )}\n {columns.map((column) => (\n <div key={column.key} className=\"grid gap-1 p-4 align-middle\" role=\"cell\">\n <span\n aria-hidden=\"true\"\n className=\"text-xs font-medium text-lt-muted-fg md:hidden\"\n >\n {column.label}\n </span>\n <ColumnCell column={column} row={row} />\n </div>\n ))}\n {actions.length > 0 && (\n <div\n className=\"flex items-center justify-start gap-2 p-4 md:justify-end\"\n role=\"cell\"\n >\n {actions.map((action, actionIndex) => (\n <TableActionNode\n key={action.key ?? action.id ?? actionIndex}\n node={action}\n />\n ))}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n {hasLoaded && (\n <TablePagination\n pagination={pagination}\n currentPage={currentPage}\n processing={processing}\n mode={mode}\n hasNextPage={hasNextPage}\n visiblePages={visiblePages}\n infiniteLoaderRef={infiniteLoaderRef}\n onPage={goToPage}\n onLoadMore={loadMore}\n />\n )}\n </div>\n );\n};\n\nexport default TableComponent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","names":[],"sources":["../../../resources/js/table/components/table.tsx"],"sourcesContent":["import { type ReactNode, useMemo } from \"react\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useColumnResizing } from \"@lattice-php/lattice/core/use-column-resizing\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport { Checkbox } from \"@lattice-php/lattice/core/components/checkbox\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { alignJustifyItems, alignText } from \"../align\";\nimport type { TableNode } from \"../types\";\nimport { getBulkActions } from \"../bulk\";\nimport { flattenColumns, getRowActions, getRowKey } from \"../payload\";\nimport {\n getQueryParams,\n getTableSizingColumns,\n getTableUtilityTracks,\n getVisiblePages,\n} from \"../query\";\nimport { useTable } from \"../use-table\";\nimport { useTableSelection } from \"../use-table-selection\";\nimport { BulkBar } from \"./bulk-bar\";\nimport { ColumnFilterControl } from \"./column-filter-control\";\nimport { ColumnHeader } from \"./column-header\";\nimport { FilterBar } from \"./filter-bar\";\nimport { FilterStackBar } from \"./filter-stack-bar\";\nimport { TablePagination } from \"./pagination\";\nimport { SortBar } from \"./sort-bar\";\nimport { TableActionNode } from \"./table-action-node\";\nimport { ColumnCell } from \"./table-cell\";\n\nconst TableComponent = ({ node }: { children?: ReactNode; node: TableNode }) => {\n const { t } = useT(\"lattice\");\n const {\n columns,\n rows,\n pagination,\n state,\n filters,\n tableFilters,\n addFilter,\n updateFilter,\n removeFilter,\n setTableFilter,\n resetFilters,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n } = useTable(node);\n\n const bulkActions = useMemo(\n () => getBulkActions(node.props?.bulkActions),\n [node.props?.bulkActions],\n );\n const hasBulkActions = bulkActions.length > 0;\n const rowEntries = useMemo(\n () =>\n rows.map((row, index) => ({ row, actions: getRowActions(row), key: getRowKey(row, index) })),\n [rows],\n );\n const selection = useTableSelection(rowEntries.map((entry) => entry.key));\n\n const columnsByKey = useMemo(\n () => new Map(flattenColumns(columns).map((column) => [column.key, column])),\n [columns],\n );\n const currentPage = pagination.currentPage ?? state.page;\n const lastPage = pagination.lastPage ?? currentPage;\n const mode = pagination.mode ?? \"table\";\n const visiblePages = getVisiblePages(currentPage, lastPage);\n const hasNextPage = pagination.hasMore ?? currentPage < lastPage;\n const hasActions = rowEntries.some((entry) => entry.actions.length > 0);\n const striped = node.props?.striped === true;\n const hasFilters = columns.some((column) => column.filter?.enabled);\n const filterEntries = filters.map((clause, index) => ({ clause, index }));\n const filterDefinitions = useMemo(\n () => (Array.isArray(node.props?.filters) ? node.props.filters : []),\n [node.props?.filters],\n );\n const hasActiveFilters = filters.length > 0 || Object.keys(tableFilters).length > 0;\n const sizingColumns = useMemo(() => getTableSizingColumns(columns), [columns]);\n const utilityTracks = useMemo(\n () => getTableUtilityTracks(hasActions, hasBulkActions),\n [hasActions, hasBulkActions],\n );\n const resizingEnabled = node.props?.resizableColumns === true;\n const resizeStorageIdentity = nodeIdentity(node);\n const { getResizeHandleProps, gridTemplateColumns, hasOverrides, resetColumns } =\n useColumnResizing({\n columns: sizingColumns,\n enabled: resizingEnabled,\n leadingTracks: utilityTracks.leadingTracks,\n showIndicator: node.props?.resizeIndicator === true,\n storageKey:\n resizingEnabled && resizeStorageIdentity\n ? `lattice:table-columns:${resizeStorageIdentity}`\n : undefined,\n trailingTracks: utilityTracks.trailingTracks,\n });\n\n return (\n <div data-lattice-component={node.id} className=\"relative\">\n {hasOverrides && (\n <button\n aria-label={t(\"a11y.resetColumnWidths\", \"Reset column widths\")}\n className=\"absolute right-1 top-1 z-10 hidden rounded-lt-sm p-1 text-lt-muted-fg hover:text-lt-fg md:inline-flex\"\n data-test=\"table-reset-columns\"\n onClick={resetColumns}\n title={t(\"a11y.resetColumnWidths\", \"Reset column widths\")}\n type=\"button\"\n >\n <Icon name=\"rotate-ccw\" className=\"size-lt-icon-sm\" />\n </button>\n )}\n <div className=\"overflow-x-auto rounded-lt-sm border border-lt-border\">\n {filterDefinitions.length > 0 && (\n <FilterBar\n filters={filterDefinitions}\n values={tableFilters}\n processing={processing}\n hasActiveFilters={hasActiveFilters}\n onChange={setTableFilter}\n onReset={resetFilters}\n onSearch={searchFilterOptions}\n />\n )}\n {hasBulkActions && selection.active && (\n <BulkBar\n actions={bulkActions}\n selectedKeys={selection.selectedKeys}\n allMatching={selection.allMatching}\n total={pagination.total ?? undefined}\n query={getQueryParams(state)}\n canSelectAllMatching={\n selection.allVisibleSelected &&\n !selection.allMatching &&\n pagination.total != null &&\n pagination.total > selection.selectedKeys.length\n }\n onSelectAllMatching={selection.selectAllMatching}\n onCompleted={selection.clear}\n />\n )}\n {filters.length > 0 && (\n <FilterStackBar\n filters={filters}\n columnsByKey={columnsByKey}\n processing={processing}\n onRemove={removeFilter}\n />\n )}\n {state.sorts.length > 0 && (\n <SortBar\n columnsByKey={columnsByKey}\n state={state}\n processing={processing}\n onClear={clearSort}\n />\n )}\n <div className=\"min-w-full text-sm\" role=\"table\">\n <div className=\"border-b border-lt-border bg-lt-muted/50\" role=\"rowgroup\">\n <div\n className=\"hidden min-w-full md:grid md:grid-cols-[var(--lattice-table-columns)]\"\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && (\n <div className=\"flex items-center px-4 py-3\" role=\"columnheader\">\n <Checkbox\n aria-label={t(\"a11y.selectAllRows\", \"Select all rows\")}\n data-test=\"select-all\"\n checked={selection.allSelected}\n onCheckedChange={() => selection.toggleAll()}\n />\n </div>\n )}\n {columns.map((column, index) => (\n <ColumnHeader\n column={column}\n key={column.key}\n processing={processing}\n resizeHandleProps={\n resizingEnabled ? getResizeHandleProps(sizingColumns[index]) : undefined\n }\n sort={sort}\n state={state}\n />\n ))}\n {hasActions && (\n <div\n className=\"px-4 py-3 text-right align-middle font-medium text-lt-muted-fg\"\n role=\"columnheader\"\n >\n <span className=\"sr-only\">{node.props?.actionsLabel}</span>\n </div>\n )}\n </div>\n {hasFilters && (\n <div\n className=\"hidden min-w-full border-t border-lt-border md:grid md:grid-cols-[var(--lattice-table-columns)]\"\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && <div className=\"px-4 py-2\" role=\"cell\" />}\n {columns.map((column) => (\n <div key={column.key} className=\"min-w-0 px-2 py-2\" role=\"cell\">\n {column.filter?.enabled && (\n <ColumnFilterControl\n column={column}\n clauses={filterEntries.filter((entry) => entry.clause.field === column.key)}\n processing={processing}\n onAdd={addFilter}\n onUpdate={updateFilter}\n onRemove={removeFilter}\n onSearch={(query) => searchFilterOptions(column.key, query)}\n />\n )}\n </div>\n ))}\n {hasActions && <div className=\"px-4 py-2\" role=\"cell\" />}\n </div>\n )}\n </div>\n <div role=\"rowgroup\">\n {!hasLoaded ? (\n <div className=\"p-4 text-lt-muted-fg\" role=\"row\">\n <div role=\"cell\">{t(\"table.loading\", \"Loading rows...\")}</div>\n </div>\n ) : rowEntries.length === 0 ? (\n <div className=\"p-8 text-center text-lt-muted-fg\" role=\"row\">\n <div role=\"cell\">{node.props?.emptyLabel}</div>\n </div>\n ) : (\n rowEntries.map(({ row, actions, key }) => {\n return (\n <div\n key={key}\n className={`grid grid-cols-1 border-b border-lt-border last:border-b-0 md:grid-cols-[var(--lattice-table-columns)] ${\n striped ? \"odd:bg-lt-muted/30\" : \"\"\n }`}\n role=\"row\"\n style={{ \"--lattice-table-columns\": gridTemplateColumns } as never}\n >\n {hasBulkActions && (\n <div className=\"flex items-center p-4\" role=\"cell\">\n <Checkbox\n aria-label={t(\"a11y.selectRow\", \"Select row {{key}}\", { key })}\n data-test={`select-row-${key}`}\n checked={selection.isSelected(key)}\n onCheckedChange={() => selection.toggle(key)}\n />\n </div>\n )}\n {columns.map((column) => (\n <div\n key={column.key}\n className={cn(\n \"grid min-w-0 gap-1 p-4 align-middle\",\n alignText(column.align),\n alignJustifyItems(column.align),\n )}\n role=\"cell\"\n >\n <span\n aria-hidden=\"true\"\n className=\"text-xs font-medium text-lt-muted-fg md:hidden\"\n >\n {column.label}\n </span>\n <div className=\"min-w-0 truncate\">\n <ColumnCell column={column} row={row} />\n </div>\n </div>\n ))}\n {actions.length > 0 && (\n <div\n className=\"flex items-center justify-start gap-2 p-4 md:justify-end\"\n role=\"cell\"\n >\n {actions.map((action, actionIndex) => (\n <TableActionNode\n key={action.key ?? action.id ?? actionIndex}\n node={action}\n />\n ))}\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </div>\n {hasLoaded && (\n <TablePagination\n pagination={pagination}\n currentPage={currentPage}\n processing={processing}\n mode={mode}\n hasNextPage={hasNextPage}\n visiblePages={visiblePages}\n infiniteLoaderRef={infiniteLoaderRef}\n onPage={goToPage}\n onLoadMore={loadMore}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TableComponent;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FilterData, Option } from '../types/generated';
|
|
2
|
+
/**
|
|
3
|
+
* Whether a table-filter value should clear the filter rather than apply it —
|
|
4
|
+
* an empty string, empty list, or an object whose every member is empty.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isEmptyFilterValue(value: unknown): boolean;
|
|
7
|
+
export declare function isActiveFilterValue(value: unknown): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Read a string entry from a filter's loose `props` bag, falling back when the
|
|
10
|
+
* key is absent or not a string.
|
|
11
|
+
*/
|
|
12
|
+
export declare function stringProp(filter: FilterData, key: string, fallback: string): string;
|
|
13
|
+
export declare function filterOptions(filter: FilterData): Option[];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region resources/js/table/filter-values.ts
|
|
2
|
+
/**
|
|
3
|
+
* Whether a table-filter value should clear the filter rather than apply it —
|
|
4
|
+
* an empty string, empty list, or an object whose every member is empty.
|
|
5
|
+
*/
|
|
6
|
+
function isEmptyFilterValue(value) {
|
|
7
|
+
if (value == null || value === "") return true;
|
|
8
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
9
|
+
if (typeof value === "object") return Object.values(value).every((member) => member == null || member === "");
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
function isActiveFilterValue(value) {
|
|
13
|
+
return !isEmptyFilterValue(value);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read a string entry from a filter's loose `props` bag, falling back when the
|
|
17
|
+
* key is absent or not a string.
|
|
18
|
+
*/
|
|
19
|
+
function stringProp(filter, key, fallback) {
|
|
20
|
+
const value = filter.props[key];
|
|
21
|
+
return typeof value === "string" ? value : fallback;
|
|
22
|
+
}
|
|
23
|
+
function filterOptions(filter) {
|
|
24
|
+
const value = filter.props.options;
|
|
25
|
+
return Array.isArray(value) ? value : [];
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { filterOptions, isActiveFilterValue, isEmptyFilterValue, stringProp };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=filter-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-values.js","names":[],"sources":["../../resources/js/table/filter-values.ts"],"sourcesContent":["import type { FilterData, Option } from \"@lattice-php/lattice/types/generated\";\n\n/**\n * Whether a table-filter value should clear the filter rather than apply it —\n * an empty string, empty list, or an object whose every member is empty.\n */\nexport function isEmptyFilterValue(value: unknown): boolean {\n if (value == null || value === \"\") {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (typeof value === \"object\") {\n return Object.values(value).every((member) => member == null || member === \"\");\n }\n\n return false;\n}\n\nexport function isActiveFilterValue(value: unknown): boolean {\n return !isEmptyFilterValue(value);\n}\n\n/**\n * Read a string entry from a filter's loose `props` bag, falling back when the\n * key is absent or not a string.\n */\nexport function stringProp(filter: FilterData, key: string, fallback: string): string {\n const value = filter.props[key];\n\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function filterOptions(filter: FilterData): Option[] {\n const value = filter.props.options;\n\n return Array.isArray(value) ? (value as Option[]) : [];\n}\n"],"mappings":";;;;;AAMA,SAAgB,mBAAmB,OAAyB;CAC1D,IAAI,SAAS,QAAQ,UAAU,IAC7B,OAAO;CAGT,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,WAAW;CAG1B,IAAI,OAAO,UAAU,UACnB,OAAO,OAAO,OAAO,KAAK,EAAE,OAAO,WAAW,UAAU,QAAQ,WAAW,EAAE;CAG/E,OAAO;AACT;AAEA,SAAgB,oBAAoB,OAAyB;CAC3D,OAAO,CAAC,mBAAmB,KAAK;AAClC;;;;;AAMA,SAAgB,WAAW,QAAoB,KAAa,UAA0B;CACpF,MAAM,QAAQ,OAAO,MAAM;CAE3B,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAgB,cAAc,QAA8B;CAC1D,MAAM,QAAQ,OAAO,MAAM;CAE3B,OAAO,MAAM,QAAQ,KAAK,IAAK,QAAqB,CAAC;AACvD"}
|
package/dist/table/format.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
//#region resources/js/table/format.ts
|
|
2
2
|
function formatCell(value, column) {
|
|
3
3
|
if (value === null || value === void 0) return "";
|
|
4
|
-
|
|
4
|
+
const date = (column?.props)?.date;
|
|
5
|
+
if (date) return formatDate(value, date.format ?? null);
|
|
5
6
|
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
6
7
|
return JSON.stringify(value);
|
|
7
8
|
}
|
|
@@ -27,8 +28,9 @@ function formatDate(value, format) {
|
|
|
27
28
|
return format.replace(/[YymndjHGis]/g, (token) => replacements[token] ?? token);
|
|
28
29
|
}
|
|
29
30
|
function resolveLink(column, row, value) {
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
const link = column.props?.link;
|
|
32
|
+
if (!link) return null;
|
|
33
|
+
const href = link.href ?? String(value ?? "");
|
|
32
34
|
if (href === "") return null;
|
|
33
35
|
return href.replace(/\{([^}]+)\}/g, (_, key) => {
|
|
34
36
|
if (key === "value") return encodeURIComponent(String(value ?? ""));
|
package/dist/table/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","names":[],"sources":["../../resources/js/table/format.ts"],"sourcesContent":["import type { TableColumn, TableRow } from \"./types\";\n\nexport function formatCell(value: unknown, column?: TableColumn): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n
|
|
1
|
+
{"version":3,"file":"format.js","names":[],"sources":["../../resources/js/table/format.ts"],"sourcesContent":["import type { ColumnPropsOf, TableColumn, TableRow } from \"./types\";\n\nexport function formatCell(value: unknown, column?: TableColumn): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n const date = (column?.props as ColumnPropsOf<\"column.text\"> | null)?.date;\n\n if (date) {\n return formatDate(value, date.format ?? null);\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n}\n\nfunction formatDate(value: unknown, format: string | null): string {\n const date = new Date(String(value));\n\n if (Number.isNaN(date.getTime())) {\n return formatCell(value);\n }\n\n if (!format) {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(date);\n }\n\n const replacements: Record<string, string> = {\n Y: String(date.getFullYear()),\n y: String(date.getFullYear()).slice(-2),\n m: String(date.getMonth() + 1).padStart(2, \"0\"),\n n: String(date.getMonth() + 1),\n d: String(date.getDate()).padStart(2, \"0\"),\n j: String(date.getDate()),\n H: String(date.getHours()).padStart(2, \"0\"),\n G: String(date.getHours()),\n i: String(date.getMinutes()).padStart(2, \"0\"),\n s: String(date.getSeconds()).padStart(2, \"0\"),\n };\n\n return format.replace(/[YymndjHGis]/g, (token) => replacements[token] ?? token);\n}\n\nexport function resolveLink(column: TableColumn, row: TableRow, value: unknown): string | null {\n const link = (column.props as ColumnPropsOf<\"column.text\"> | null)?.link;\n\n if (!link) {\n return null;\n }\n\n const href = link.href ?? String(value ?? \"\");\n\n if (href === \"\") {\n return null;\n }\n\n return href.replace(/\\{([^}]+)\\}/g, (_, key: string) => {\n if (key === \"value\") {\n return encodeURIComponent(String(value ?? \"\"));\n }\n\n return encodeURIComponent(String(row[key] ?? \"\"));\n });\n}\n"],"mappings":";AAEA,SAAgB,WAAW,OAAgB,QAA8B;CACvE,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;CAGT,MAAM,QAAQ,QAAQ,QAA+C;CAErE,IAAI,MACF,OAAO,WAAW,OAAO,KAAK,UAAU,IAAI;CAG9C,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAC7E,OAAO,OAAO,KAAK;CAGrB,OAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,WAAW,OAAgB,QAA+B;CACjE,MAAM,OAAO,IAAI,KAAK,OAAO,KAAK,CAAC;CAEnC,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAC7B,OAAO,WAAW,KAAK;CAGzB,IAAI,CAAC,QACH,OAAO,IAAI,KAAK,eAAe,KAAA,GAAW;EACxC,WAAW;EACX,WAAW;CACb,CAAC,EAAE,OAAO,IAAI;CAGhB,MAAM,eAAuC;EAC3C,GAAG,OAAO,KAAK,YAAY,CAAC;EAC5B,GAAG,OAAO,KAAK,YAAY,CAAC,EAAE,MAAM,EAAE;EACtC,GAAG,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;EAC9C,GAAG,OAAO,KAAK,SAAS,IAAI,CAAC;EAC7B,GAAG,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;EACzC,GAAG,OAAO,KAAK,QAAQ,CAAC;EACxB,GAAG,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;EAC1C,GAAG,OAAO,KAAK,SAAS,CAAC;EACzB,GAAG,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;EAC5C,GAAG,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;CAC9C;CAEA,OAAO,OAAO,QAAQ,kBAAkB,UAAU,aAAa,UAAU,KAAK;AAChF;AAEA,SAAgB,YAAY,QAAqB,KAAe,OAA+B;CAC7F,MAAM,OAAQ,OAAO,OAA+C;CAEpE,IAAI,CAAC,MACH,OAAO;CAGT,MAAM,OAAO,KAAK,QAAQ,OAAO,SAAS,EAAE;CAE5C,IAAI,SAAS,IACX,OAAO;CAGT,OAAO,KAAK,QAAQ,iBAAiB,GAAG,QAAgB;EACtD,IAAI,QAAQ,SACV,OAAO,mBAAmB,OAAO,SAAS,EAAE,CAAC;EAG/C,OAAO,mBAAmB,OAAO,IAAI,QAAQ,EAAE,CAAC;CAClD,CAAC;AACH"}
|
package/dist/table/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const tableComponents: import('
|
|
1
|
+
export declare const tableComponents: import('../core/registry').Plugin;
|
package/dist/table/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/table/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice/lattice/core/registry\";\n\nexport const tableComponents = createPlugin({\n components: {\n table: lazyComponent(() => import(\"./components/table\")),\n },\n name: \"lattice/table\",\n});\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/table/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice-php/lattice/core/registry\";\nimport type { RendererComponentModule } from \"@lattice-php/lattice/core/types\";\n\nexport const tableComponents = createPlugin({\n components: {\n // The table renders an enriched TableNode (rows/pagination/state the server\n // hydrates onto it); the registry erases per-component node types here.\n table: lazyComponent(\n () => import(\"./components/table\") as unknown as Promise<RendererComponentModule<\"table\">>,\n ),\n },\n name: \"lattice/table\",\n});\n"],"mappings":";;AAGA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EAGV,OAAO,oBACC,OAAO,wBACf,EACF;CACA,MAAM;AACR,CAAC"}
|
package/dist/table/payload.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Node } from '
|
|
1
|
+
import { Node } from '../core/types';
|
|
2
2
|
import { TableColumn, TablePagination, TableRow, TableState } from './types';
|
|
3
3
|
export declare function getColumns(value: unknown): TableColumn[];
|
|
4
4
|
export declare function getRows(value: unknown): TableRow[];
|
package/dist/table/payload.js
CHANGED
|
@@ -11,8 +11,19 @@ function getRows(value) {
|
|
|
11
11
|
if (!Array.isArray(value)) return [];
|
|
12
12
|
return value.filter((row) => typeof row === "object" && row !== null && !Array.isArray(row));
|
|
13
13
|
}
|
|
14
|
+
var EMPTY_PAGINATION = {
|
|
15
|
+
mode: "none",
|
|
16
|
+
currentPage: null,
|
|
17
|
+
lastPage: null,
|
|
18
|
+
perPage: null,
|
|
19
|
+
total: null,
|
|
20
|
+
from: null,
|
|
21
|
+
to: null,
|
|
22
|
+
hasMore: false,
|
|
23
|
+
nextPage: null
|
|
24
|
+
};
|
|
14
25
|
function getPagination(value) {
|
|
15
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) return
|
|
26
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return EMPTY_PAGINATION;
|
|
16
27
|
return value;
|
|
17
28
|
}
|
|
18
29
|
function flattenColumns(columns) {
|
|
@@ -23,16 +34,26 @@ function getState(value) {
|
|
|
23
34
|
filters: [],
|
|
24
35
|
sorts: [],
|
|
25
36
|
page: 1,
|
|
26
|
-
perPage: 25
|
|
37
|
+
perPage: 25,
|
|
38
|
+
tableFilters: {}
|
|
27
39
|
};
|
|
28
40
|
const state = value;
|
|
29
41
|
return {
|
|
30
42
|
filters: getFilters(state.filters),
|
|
31
43
|
sorts: Array.isArray(state.sorts) ? state.sorts : [],
|
|
32
44
|
page: typeof state.page === "number" ? state.page : 1,
|
|
33
|
-
perPage: typeof state.perPage === "number" ? state.perPage : 25
|
|
45
|
+
perPage: typeof state.perPage === "number" ? state.perPage : 25,
|
|
46
|
+
tableFilters: getTableFilters(state.tableFilters)
|
|
34
47
|
};
|
|
35
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* The wire serializes an empty filter map as `[]` and a populated one as an
|
|
51
|
+
* object, so coerce both to a plain `key => value` record.
|
|
52
|
+
*/
|
|
53
|
+
function getTableFilters(value) {
|
|
54
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
36
57
|
function getRowKey(row, index) {
|
|
37
58
|
const key = row.id ?? row.uuid ?? row.key ?? index;
|
|
38
59
|
return String(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payload.js","names":[],"sources":["../../resources/js/table/payload.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport type { FilterClause, TableColumn, TablePagination, TableRow, TableState } from \"./types\";\n\nfunction getFilters(value: unknown): FilterClause[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (clause): clause is FilterClause =>\n typeof clause === \"object\" &&\n clause !== null &&\n typeof clause.field === \"string\" &&\n typeof clause.operator === \"string\" &&\n typeof clause.value === \"string\",\n );\n}\n\nexport function getColumns(value: unknown): TableColumn[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (column): column is TableColumn =>\n typeof column === \"object\" &&\n column !== null &&\n \"key\" in column &&\n \"label\" in column &&\n typeof column.key === \"string\" &&\n typeof column.label === \"string\",\n );\n}\n\nexport function getRows(value: unknown): TableRow[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (row): row is TableRow => typeof row === \"object\" && row !== null && !Array.isArray(row),\n );\n}\n\nexport function getPagination(value: unknown): TablePagination {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return
|
|
1
|
+
{"version":3,"file":"payload.js","names":[],"sources":["../../resources/js/table/payload.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport type { FilterClause, TableColumn, TablePagination, TableRow, TableState } from \"./types\";\n\nfunction getFilters(value: unknown): FilterClause[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (clause): clause is FilterClause =>\n typeof clause === \"object\" &&\n clause !== null &&\n typeof clause.field === \"string\" &&\n typeof clause.operator === \"string\" &&\n typeof clause.value === \"string\",\n );\n}\n\nexport function getColumns(value: unknown): TableColumn[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (column): column is TableColumn =>\n typeof column === \"object\" &&\n column !== null &&\n \"key\" in column &&\n \"label\" in column &&\n typeof column.key === \"string\" &&\n typeof column.label === \"string\",\n );\n}\n\nexport function getRows(value: unknown): TableRow[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (row): row is TableRow => typeof row === \"object\" && row !== null && !Array.isArray(row),\n );\n}\n\nconst EMPTY_PAGINATION: TablePagination = {\n mode: \"none\",\n currentPage: null,\n lastPage: null,\n perPage: null,\n total: null,\n from: null,\n to: null,\n hasMore: false,\n nextPage: null,\n};\n\nexport function getPagination(value: unknown): TablePagination {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return EMPTY_PAGINATION;\n }\n\n return value as TablePagination;\n}\n\nexport function flattenColumns(columns: TableColumn[]): TableColumn[] {\n return columns.flatMap((column) => [column, ...flattenColumns(column.columns ?? [])]);\n}\n\nexport function getState(value: unknown): TableState {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {\n filters: [],\n sorts: [],\n page: 1,\n perPage: 25,\n tableFilters: {},\n };\n }\n\n const state = value as Partial<TableState>;\n\n return {\n filters: getFilters(state.filters),\n sorts: Array.isArray(state.sorts) ? state.sorts : [],\n page: typeof state.page === \"number\" ? state.page : 1,\n perPage: typeof state.perPage === \"number\" ? state.perPage : 25,\n tableFilters: getTableFilters(state.tableFilters),\n };\n}\n\n/**\n * The wire serializes an empty filter map as `[]` and a populated one as an\n * object, so coerce both to a plain `key => value` record.\n */\nfunction getTableFilters(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {};\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function getRowKey(row: TableRow, index: number): string {\n const key = row.id ?? row.uuid ?? row.key ?? index;\n\n return String(key);\n}\n\nexport function getRowActions(row: TableRow): Node[] {\n return Array.isArray(row.actions) ? (row.actions as Node[]) : [];\n}\n"],"mappings":";AAGA,SAAS,WAAW,OAAgC;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,aAAa,YAC3B,OAAO,OAAO,UAAU,QAC5B;AACF;AAEA,SAAgB,WAAW,OAA+B;CACxD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,SAAS,UACT,WAAW,UACX,OAAO,OAAO,QAAQ,YACtB,OAAO,OAAO,UAAU,QAC5B;AACF;AAEA,SAAgB,QAAQ,OAA4B;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,QAAyB,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,CACzF;AACF;AAEA,IAAM,mBAAoC;CACxC,MAAM;CACN,aAAa;CACb,UAAU;CACV,SAAS;CACT,OAAO;CACP,MAAM;CACN,IAAI;CACJ,SAAS;CACT,UAAU;AACZ;AAEA,SAAgB,cAAc,OAAiC;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,eAAe,SAAuC;CACpE,OAAO,QAAQ,SAAS,WAAW,CAAC,QAAQ,GAAG,eAAe,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACtF;AAEA,SAAgB,SAAS,OAA4B;CACnD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;EACL,SAAS,CAAC;EACV,OAAO,CAAC;EACR,MAAM;EACN,SAAS;EACT,cAAc,CAAC;CACjB;CAGF,MAAM,QAAQ;CAEd,OAAO;EACL,SAAS,WAAW,MAAM,OAAO;EACjC,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;EACnD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;EACpD,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;EAC7D,cAAc,gBAAgB,MAAM,YAAY;CAClD;AACF;;;;;AAMA,SAAS,gBAAgB,OAAyC;CAChE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO,CAAC;CAGV,OAAO;AACT;AAEA,SAAgB,UAAU,KAAe,OAAuB;CAC9D,MAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO;CAE7C,OAAO,OAAO,GAAG;AACnB;AAEA,SAAgB,cAAc,KAAuB;CACnD,OAAO,MAAM,QAAQ,IAAI,OAAO,IAAK,IAAI,UAAqB,CAAC;AACjE"}
|
package/dist/table/query.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { ColumnWidth } from '../types/generated';
|
|
1
2
|
import { TableColumn, TableSort, TableState } from './types';
|
|
2
3
|
export declare function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined;
|
|
3
|
-
export declare function getSortColumn(columns: TableColumn[], sort: TableSort): TableColumn | undefined;
|
|
4
4
|
export declare function getColumnAriaSort(sort: TableSort | undefined): "ascending" | "descending" | undefined;
|
|
5
5
|
export declare function buildEndpoint(endpoint: string, state: TableState): string;
|
|
6
6
|
export declare function getQueryParams(state: TableState): Record<string, unknown>;
|
|
@@ -9,4 +9,12 @@ export declare function operatorLabel(operator: string): string;
|
|
|
9
9
|
export declare function getSortDirectionLabel(direction: string): string;
|
|
10
10
|
export declare function nextSort(sorts: TableSort[], column: TableColumn): TableSort[];
|
|
11
11
|
export declare function getVisiblePages(currentPage: number, lastPage: number): number[];
|
|
12
|
-
export declare function
|
|
12
|
+
export declare function getTableSizingColumns(columns: TableColumn[]): {
|
|
13
|
+
key: string;
|
|
14
|
+
label: string;
|
|
15
|
+
width: ColumnWidth;
|
|
16
|
+
}[];
|
|
17
|
+
export declare function getTableUtilityTracks(hasActions: boolean, hasSelection: boolean): {
|
|
18
|
+
leadingTracks: string[];
|
|
19
|
+
trailingTracks: string[];
|
|
20
|
+
};
|
package/dist/table/query.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { translate } from "../i18n/instance.js";
|
|
2
|
+
import "../core/column-sizing.js";
|
|
2
3
|
//#region resources/js/table/query.ts
|
|
3
4
|
function getColumnSort(state, column) {
|
|
4
5
|
return state.sorts.find((currentSort) => currentSort.key === column.key);
|
|
5
6
|
}
|
|
6
|
-
function getSortColumn(columns, sort) {
|
|
7
|
-
return flattenColumns(columns).find((column) => column.key === sort.key);
|
|
8
|
-
}
|
|
9
7
|
function getColumnAriaSort(sort) {
|
|
10
8
|
if (sort?.direction === "asc") return "ascending";
|
|
11
9
|
if (sort?.direction === "desc") return "descending";
|
|
@@ -14,14 +12,57 @@ function buildEndpoint(endpoint, state) {
|
|
|
14
12
|
const url = new URL(endpoint, window.location.origin);
|
|
15
13
|
if (state.filters.length > 0) url.searchParams.set("filter", serializeFilters(state));
|
|
16
14
|
if (state.sorts.length > 0) url.searchParams.set("sort", serializeSorts(state));
|
|
15
|
+
appendTableFilters(url, state.tableFilters);
|
|
17
16
|
url.searchParams.set("page", String(state.page));
|
|
18
17
|
url.searchParams.set("per_page", String(state.perPage));
|
|
19
18
|
return `${url.pathname}${url.search}`;
|
|
20
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Serialize the dedicated table filters as Laravel-native bracket params:
|
|
22
|
+
* `tf[key]=v`, repeated `tf[key][]=v` for multi-value, and `tf[key][sub]=v`
|
|
23
|
+
* for structured values (e.g. a date range's from/until). Empty values are
|
|
24
|
+
* dropped so an unset filter never reaches the server.
|
|
25
|
+
*/
|
|
26
|
+
function appendTableFilters(url, tableFilters) {
|
|
27
|
+
for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {
|
|
28
|
+
if (typeof value === "string") {
|
|
29
|
+
url.searchParams.set(`tf[${key}]`, value);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
for (const item of value) if (item != null && item !== "") url.searchParams.append(`tf[${key}][]`, String(item));
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === "object" && value !== null) for (const [subKey, subValue] of Object.entries(value)) url.searchParams.set(`tf[${key}][${subKey}]`, String(subValue));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function getTableFilterParams(tableFilters) {
|
|
40
|
+
const params = {};
|
|
41
|
+
for (const [key, value] of Object.entries(tableFilters)) {
|
|
42
|
+
const normalized = normalizeTableFilterValue(value);
|
|
43
|
+
if (normalized !== void 0) params[key] = normalized;
|
|
44
|
+
}
|
|
45
|
+
return params;
|
|
46
|
+
}
|
|
47
|
+
function normalizeTableFilterValue(value) {
|
|
48
|
+
if (value == null || value === "") return;
|
|
49
|
+
if (typeof value === "string") return value;
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
const items = value.filter((item) => item != null && item !== "").map(String);
|
|
52
|
+
return items.length > 0 ? items : void 0;
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === "object") {
|
|
55
|
+
const entries = Object.entries(value).filter(([, subValue]) => subValue != null && subValue !== "").map(([subKey, subValue]) => [subKey, String(subValue)]);
|
|
56
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
57
|
+
}
|
|
58
|
+
return String(value);
|
|
59
|
+
}
|
|
21
60
|
function getQueryParams(state) {
|
|
22
61
|
const params = {};
|
|
23
62
|
if (state.filters.length > 0) params.filter = serializeFilters(state);
|
|
24
63
|
if (state.sorts.length > 0) params.sort = serializeSorts(state);
|
|
64
|
+
const tableFilters = getTableFilterParams(state.tableFilters);
|
|
65
|
+
if (Object.keys(tableFilters).length > 0) params.tf = tableFilters;
|
|
25
66
|
return params;
|
|
26
67
|
}
|
|
27
68
|
function serializeFilters(state) {
|
|
@@ -40,6 +81,8 @@ var operatorLabels = {
|
|
|
40
81
|
gte: "≥",
|
|
41
82
|
lt: "<",
|
|
42
83
|
lte: "≤",
|
|
84
|
+
in: "in",
|
|
85
|
+
not_in: "not in",
|
|
43
86
|
before: "before",
|
|
44
87
|
after: "after",
|
|
45
88
|
empty: "is empty",
|
|
@@ -47,7 +90,7 @@ var operatorLabels = {
|
|
|
47
90
|
};
|
|
48
91
|
var VALUELESS_FILTER_OPERATORS = new Set(["empty", "filled"]);
|
|
49
92
|
function operatorLabel(operator) {
|
|
50
|
-
return operatorLabels[operator] ?? operator;
|
|
93
|
+
return translate("lattice", `operators.${operator}`, operatorLabels[operator] ?? operator);
|
|
51
94
|
}
|
|
52
95
|
function getSortDirectionLabel(direction) {
|
|
53
96
|
return direction === "desc" ? "descending" : "ascending";
|
|
@@ -71,13 +114,23 @@ function getVisiblePages(currentPage, lastPage) {
|
|
|
71
114
|
const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));
|
|
72
115
|
return Array.from({ length: 5 }, (_, index) => start + index);
|
|
73
116
|
}
|
|
74
|
-
function
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
117
|
+
function getTableSizingColumns(columns) {
|
|
118
|
+
return columns.map((column) => ({
|
|
119
|
+
key: column.key,
|
|
120
|
+
label: column.label,
|
|
121
|
+
width: columnWidthOrDefault(column)
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
function columnWidthOrDefault(column) {
|
|
125
|
+
return column.width ?? (column.type === "column.stack" ? "xl" : "md");
|
|
126
|
+
}
|
|
127
|
+
function getTableUtilityTracks(hasActions, hasSelection) {
|
|
128
|
+
return {
|
|
129
|
+
leadingTracks: hasSelection ? ["3rem"] : [],
|
|
130
|
+
trailingTracks: hasActions ? ["10rem"] : []
|
|
131
|
+
};
|
|
79
132
|
}
|
|
80
133
|
//#endregion
|
|
81
|
-
export { VALUELESS_FILTER_OPERATORS, buildEndpoint, getColumnAriaSort,
|
|
134
|
+
export { VALUELESS_FILTER_OPERATORS, buildEndpoint, getColumnAriaSort, getColumnSort, getQueryParams, getSortDirectionLabel, getTableSizingColumns, getTableUtilityTracks, getVisiblePages, nextSort, operatorLabel };
|
|
82
135
|
|
|
83
136
|
//# sourceMappingURL=query.js.map
|
package/dist/table/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","names":[],"sources":["../../resources/js/table/query.ts"],"sourcesContent":["import { flattenColumns } from \"./payload\";\nimport type { TableColumn, TableSort, TableState } from \"./types\";\n\nexport function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined {\n return state.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getSortColumn(columns: TableColumn[], sort: TableSort): TableColumn | undefined {\n return flattenColumns(columns).find((column) => column.key === sort.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, state: TableState): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (state.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(state));\n }\n\n if (state.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(state));\n }\n\n url.searchParams.set(\"page\", String(state.page));\n url.searchParams.set(\"per_page\", String(state.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\nexport function getQueryParams(state: TableState): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (state.filters.length > 0) {\n params.filter = serializeFilters(state);\n }\n\n if (state.sorts.length > 0) {\n params.sort = serializeSorts(state);\n }\n\n return params;\n}\n\nfunction serializeFilters(state: TableState): string {\n return state.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(state: TableState): string {\n return state.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\n// Operators that filter on presence alone and carry no value input.\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return operatorLabels[operator] ?? operator;\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getColumnGridTemplate(\n columns: TableColumn[],\n hasActions: boolean,\n hasSelection: boolean,\n): string {\n const tracks: string[] = columns.map((column) =>\n column.type === \"stack\" ? \"minmax(16rem, 2fr)\" : \"minmax(9rem, 1fr)\",\n );\n\n if (hasActions) {\n tracks.push(\"max-content\");\n }\n\n if (hasSelection) {\n tracks.unshift(\"max-content\");\n }\n\n return tracks.join(\" \");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.js","names":[],"sources":["../../resources/js/table/query.ts"],"sourcesContent":["import { translate } from \"@lattice-php/lattice/i18n\";\nimport { DEFAULT_COLUMN_WIDTH } from \"@lattice-php/lattice/core/column-sizing\";\nimport type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\nimport type { TableColumn, TableSort, TableState } from \"./types\";\n\nexport function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined {\n return state.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, state: TableState): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (state.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(state));\n }\n\n if (state.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(state));\n }\n\n appendTableFilters(url, state.tableFilters);\n\n url.searchParams.set(\"page\", String(state.page));\n url.searchParams.set(\"per_page\", String(state.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\n/**\n * Serialize the dedicated table filters as Laravel-native bracket params:\n * `tf[key]=v`, repeated `tf[key][]=v` for multi-value, and `tf[key][sub]=v`\n * for structured values (e.g. a date range's from/until). Empty values are\n * dropped so an unset filter never reaches the server.\n */\nfunction appendTableFilters(url: URL, tableFilters: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {\n if (typeof value === \"string\") {\n url.searchParams.set(`tf[${key}]`, value);\n\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null && item !== \"\") {\n url.searchParams.append(`tf[${key}][]`, String(item));\n }\n }\n\n continue;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [subKey, subValue] of Object.entries(value as Record<string, unknown>)) {\n url.searchParams.set(`tf[${key}][${subKey}]`, String(subValue));\n }\n }\n }\n}\n\nfunction getTableFilterParams(tableFilters: Record<string, unknown>): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(tableFilters)) {\n const normalized = normalizeTableFilterValue(value);\n\n if (normalized !== undefined) {\n params[key] = normalized;\n }\n }\n\n return params;\n}\n\nfunction normalizeTableFilterValue(value: unknown): unknown | undefined {\n if (value == null || value === \"\") {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n const items = value.filter((item) => item != null && item !== \"\").map(String);\n\n return items.length > 0 ? items : undefined;\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .filter(([, subValue]) => subValue != null && subValue !== \"\")\n .map(([subKey, subValue]) => [subKey, String(subValue)]);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n }\n\n return String(value);\n}\n\nexport function getQueryParams(state: TableState): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (state.filters.length > 0) {\n params.filter = serializeFilters(state);\n }\n\n if (state.sorts.length > 0) {\n params.sort = serializeSorts(state);\n }\n\n const tableFilters = getTableFilterParams(state.tableFilters);\n\n if (Object.keys(tableFilters).length > 0) {\n params.tf = tableFilters;\n }\n\n return params;\n}\n\nfunction serializeFilters(state: TableState): string {\n return state.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(state: TableState): string {\n return state.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n in: \"in\",\n not_in: \"not in\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return translate(\"lattice\", `operators.${operator}`, operatorLabels[operator] ?? operator);\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getTableSizingColumns(columns: TableColumn[]) {\n return columns.map((column) => ({\n key: column.key,\n label: column.label,\n width: columnWidthOrDefault(column),\n }));\n}\n\nfunction columnWidthOrDefault(column: TableColumn): ColumnWidth {\n return (column.width ??\n (column.type === \"column.stack\" ? \"xl\" : DEFAULT_COLUMN_WIDTH)) as ColumnWidth;\n}\n\nexport function getTableUtilityTracks(hasActions: boolean, hasSelection: boolean) {\n // Utility tracks are fixed because the independent header/filter/body grids would drift with content-sized tracks.\n return {\n leadingTracks: hasSelection ? [\"3rem\"] : [],\n trailingTracks: hasActions ? [\"10rem\"] : [],\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ColumnPropsOf, TableColumn, TableRow } from './types';
|
|
3
|
+
export type ColumnCellArgs<TType extends string = string> = {
|
|
4
|
+
/** The full wire column (key, label, type, nested columns). */
|
|
5
|
+
column: TableColumn;
|
|
6
|
+
/** The column's `props`, resolved to the type's shape. */
|
|
7
|
+
props: ColumnPropsOf<TType>;
|
|
8
|
+
row: TableRow;
|
|
9
|
+
value: unknown;
|
|
10
|
+
};
|
|
11
|
+
export type ColumnCellComponent<TType extends string = string> = (args: ColumnCellArgs<TType>) => ReactNode;
|
|
12
|
+
export type ColumnRegistry = Record<string, ColumnCellComponent>;
|
|
13
|
+
/**
|
|
14
|
+
* Registers a typed column cell, erasing the type parameter so it fits the
|
|
15
|
+
* registry. Mirrors `eagerComponent`/`lazyComponent` for the component registry:
|
|
16
|
+
* author against `ColumnCellComponent<"my.type">` for typed `props`, register
|
|
17
|
+
* through this.
|
|
18
|
+
*/
|
|
19
|
+
export declare function columnCell<TType extends string>(cell: ColumnCellComponent<TType>): ColumnCellComponent;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region resources/js/table/registry.ts
|
|
2
|
+
/**
|
|
3
|
+
* Registers a typed column cell, erasing the type parameter so it fits the
|
|
4
|
+
* registry. Mirrors `eagerComponent`/`lazyComponent` for the component registry:
|
|
5
|
+
* author against `ColumnCellComponent<"my.type">` for typed `props`, register
|
|
6
|
+
* through this.
|
|
7
|
+
*/
|
|
8
|
+
function columnCell(cell) {
|
|
9
|
+
return cell;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { columnCell };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../resources/js/table/registry.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { ColumnPropsOf, TableColumn, TableRow } from \"./types\";\n\nexport type ColumnCellArgs<TType extends string = string> = {\n /** The full wire column (key, label, type, nested columns). */\n column: TableColumn;\n /** The column's `props`, resolved to the type's shape. */\n props: ColumnPropsOf<TType>;\n row: TableRow;\n value: unknown;\n};\n\nexport type ColumnCellComponent<TType extends string = string> = (\n args: ColumnCellArgs<TType>,\n) => ReactNode;\n\nexport type ColumnRegistry = Record<string, ColumnCellComponent>;\n\n/**\n * Registers a typed column cell, erasing the type parameter so it fits the\n * registry. Mirrors `eagerComponent`/`lazyComponent` for the component registry:\n * author against `ColumnCellComponent<\"my.type\">` for typed `props`, register\n * through this.\n */\nexport function columnCell<TType extends string>(\n cell: ColumnCellComponent<TType>,\n): ColumnCellComponent {\n return cell as ColumnCellComponent;\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,WACd,MACqB;CACrB,OAAO;AACT"}
|
package/dist/table/types.d.ts
CHANGED
|
@@ -1,67 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
key: string;
|
|
6
|
-
label: string;
|
|
7
|
-
type?: "stack" | "text";
|
|
8
|
-
sortable?: boolean;
|
|
9
|
-
filter?: {
|
|
10
|
-
enabled?: boolean;
|
|
11
|
-
type?: ControlType;
|
|
12
|
-
operators?: FilterOperator[];
|
|
13
|
-
defaultOperator?: FilterOperator;
|
|
14
|
-
};
|
|
15
|
-
date?: {
|
|
16
|
-
format?: string | null;
|
|
17
|
-
};
|
|
18
|
-
copyable?: boolean;
|
|
19
|
-
link?: {
|
|
20
|
-
href?: string | null;
|
|
21
|
-
external?: boolean;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
1
|
+
import { ResolveProps } from '../core/types';
|
|
2
|
+
import { ActionNode, ColumnData, ColumnFilter, ColumnPropsMap, ColumnType, FilterClause as WireFilterClause, Op, Table, TablePagination, TableQuery, TableSort } from '../types/generated';
|
|
3
|
+
export type { ColumnData, ColumnFilter, ColumnType, TablePagination, TableSort };
|
|
4
|
+
export type TableColumn = ColumnData;
|
|
24
5
|
export type TableRow = Record<string, unknown>;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
6
|
+
/**
|
|
7
|
+
* The wire types `operator` as a free string (validated server-side); on the
|
|
8
|
+
* client a clause always carries a known Op, built from a column's
|
|
9
|
+
* allowed operators.
|
|
10
|
+
*/
|
|
11
|
+
export type FilterClause = Omit<WireFilterClause, "operator"> & {
|
|
12
|
+
operator: Op;
|
|
29
13
|
};
|
|
30
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The wire `TableQuery` state, with `filters` narrowed to the client `FilterClause`
|
|
16
|
+
* (known `Op` operator) instead of the wire's free-string operator.
|
|
17
|
+
*/
|
|
18
|
+
export type TableState = Omit<TableQuery, "filters"> & {
|
|
31
19
|
filters: FilterClause[];
|
|
32
|
-
sorts: TableSort[];
|
|
33
|
-
page: number;
|
|
34
|
-
perPage: number;
|
|
35
|
-
};
|
|
36
|
-
export type TablePagination = {
|
|
37
|
-
currentPage?: number;
|
|
38
|
-
hasMore?: boolean;
|
|
39
|
-
lastPage?: number;
|
|
40
|
-
mode?: PaginationType;
|
|
41
|
-
nextPage?: number | null;
|
|
42
|
-
perPage?: number;
|
|
43
|
-
total?: number;
|
|
44
|
-
from?: number | null;
|
|
45
|
-
to?: number | null;
|
|
46
20
|
};
|
|
47
21
|
export type TableResponse = {
|
|
48
22
|
data?: TableRow[];
|
|
49
23
|
pagination?: TablePagination;
|
|
50
24
|
state?: Partial<TableState>;
|
|
51
25
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
26
|
+
/**
|
|
27
|
+
* The table node as it reaches the client: the generated wire props plus the
|
|
28
|
+
* rows, pagination, and state the server hydrates onto it for the initial render.
|
|
29
|
+
*/
|
|
30
|
+
export type TableNodeProps = Partial<Omit<Table, "bulkActions">> & {
|
|
31
|
+
bulkActions?: ActionNode[];
|
|
32
|
+
data?: TableRow[];
|
|
33
|
+
pagination?: TablePagination;
|
|
34
|
+
state?: Partial<TableState>;
|
|
35
|
+
};
|
|
36
|
+
export type TableNode = {
|
|
37
|
+
type: "table";
|
|
38
|
+
id?: string;
|
|
39
|
+
key?: string;
|
|
40
|
+
props?: TableNodeProps;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Augmentable map of column `type` string → props. Consumer apps extend it via
|
|
44
|
+
* `declare module "@lattice-php/lattice"` so their custom columns gain strong
|
|
45
|
+
* prop types; the entries are generated by `php artisan lattice:typescript`.
|
|
46
|
+
*/
|
|
47
|
+
export interface ColumnProps {
|
|
67
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolves a column `type` to its props: consumer augmentations (`ColumnProps`)
|
|
51
|
+
* first, then the generated built-ins, then a loose bag.
|
|
52
|
+
*/
|
|
53
|
+
export type ColumnPropsOf<TType extends string> = ResolveProps<ColumnProps, ColumnPropsMap, TType, Record<string, unknown> | undefined>;
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FilterClause, TableColumn, TableSort, TableState } from './types';
|
|
3
|
-
export declare function useTable(node:
|
|
4
|
-
columns:
|
|
1
|
+
import { Option } from '../types/generated';
|
|
2
|
+
import { FilterClause, TableColumn, TableNode, TableSort, TableState } from './types';
|
|
3
|
+
export declare function useTable(node: TableNode): {
|
|
4
|
+
columns: import('../types/generated').ColumnData[];
|
|
5
5
|
rows: import('./types').TableRow[];
|
|
6
|
-
pagination: import('
|
|
6
|
+
pagination: import('../types/generated').TablePagination;
|
|
7
7
|
state: TableState;
|
|
8
8
|
filters: FilterClause[];
|
|
9
|
+
tableFilters: Record<string, unknown>;
|
|
9
10
|
addFilter: (clause: FilterClause) => void;
|
|
10
11
|
updateFilter: (index: number, clause: FilterClause) => void;
|
|
11
12
|
removeFilter: (index: number) => void;
|
|
13
|
+
setTableFilter: (key: string, value: unknown) => void;
|
|
14
|
+
resetFilters: () => void;
|
|
15
|
+
searchFilterOptions: (filterKey: string, query: string) => Promise<Option[]>;
|
|
12
16
|
processing: boolean;
|
|
13
17
|
hasLoaded: boolean;
|
|
14
18
|
infiniteLoaderRef: import('react').RefObject<HTMLDivElement | null>;
|