@lattice-php/lattice 0.1.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/LICENSE.md +21 -0
- package/README.md +39 -0
- package/dist/action/components/action-group.d.ts +10 -0
- package/dist/action/components/action-group.js +79 -0
- package/dist/action/components/action-group.js.map +1 -0
- package/dist/action/components/action.d.ts +26 -0
- package/dist/action/components/action.js +87 -0
- package/dist/action/components/action.js.map +1 -0
- package/dist/action/effects.d.ts +30 -0
- package/dist/action/effects.js +44 -0
- package/dist/action/effects.js.map +1 -0
- package/dist/action/index.d.ts +1 -0
- package/dist/action/index.js +15 -0
- package/dist/action/index.js.map +1 -0
- package/dist/appearance/index.d.ts +9 -0
- package/dist/appearance/index.js +66 -0
- package/dist/appearance/index.js.map +1 -0
- package/dist/clipboard/index.d.ts +5 -0
- package/dist/clipboard/index.js +24 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/core/component-ref.d.ts +8 -0
- package/dist/core/component-ref.js +15 -0
- package/dist/core/component-ref.js.map +1 -0
- package/dist/core/components/badge.d.ts +19 -0
- package/dist/core/components/badge.js +32 -0
- package/dist/core/components/badge.js.map +1 -0
- package/dist/core/components/button.d.ts +23 -0
- package/dist/core/components/button.js +68 -0
- package/dist/core/components/button.js.map +1 -0
- package/dist/core/components/card.d.ts +19 -0
- package/dist/core/components/card.js +62 -0
- package/dist/core/components/card.js.map +1 -0
- package/dist/core/components/confirm-dialog.d.ts +13 -0
- package/dist/core/components/confirm-dialog.js +47 -0
- package/dist/core/components/confirm-dialog.js.map +1 -0
- package/dist/core/components/fragment.d.ts +12 -0
- package/dist/core/components/fragment.js +62 -0
- package/dist/core/components/fragment.js.map +1 -0
- package/dist/core/components/grid.d.ts +10 -0
- package/dist/core/components/grid.js +16 -0
- package/dist/core/components/grid.js.map +1 -0
- package/dist/core/components/heading.d.ts +11 -0
- package/dist/core/components/heading.js +39 -0
- package/dist/core/components/heading.js.map +1 -0
- package/dist/core/components/index.d.ts +1 -0
- package/dist/core/components/index.js +36 -0
- package/dist/core/components/index.js.map +1 -0
- package/dist/core/components/link.d.ts +18 -0
- package/dist/core/components/link.js +26 -0
- package/dist/core/components/link.js.map +1 -0
- package/dist/core/components/modal.d.ts +13 -0
- package/dist/core/components/modal.js +75 -0
- package/dist/core/components/modal.js.map +1 -0
- package/dist/core/components/segmented-control.d.ts +16 -0
- package/dist/core/components/segmented-control.js +30 -0
- package/dist/core/components/segmented-control.js.map +1 -0
- package/dist/core/components/segmented-pills.d.ts +13 -0
- package/dist/core/components/segmented-pills.js +31 -0
- package/dist/core/components/segmented-pills.js.map +1 -0
- package/dist/core/components/spinner.d.ts +2 -0
- package/dist/core/components/spinner.js +16 -0
- package/dist/core/components/spinner.js.map +1 -0
- package/dist/core/components/stack.d.ts +13 -0
- package/dist/core/components/stack.js +47 -0
- package/dist/core/components/stack.js.map +1 -0
- package/dist/core/components/tabs.d.ts +22 -0
- package/dist/core/components/tabs.js +118 -0
- package/dist/core/components/tabs.js.map +1 -0
- package/dist/core/components/text.d.ts +11 -0
- package/dist/core/components/text.js +18 -0
- package/dist/core/components/text.js.map +1 -0
- package/dist/core/props.d.ts +14 -0
- package/dist/core/props.js +30 -0
- package/dist/core/props.js.map +1 -0
- package/dist/core/registry.d.ts +26 -0
- package/dist/core/registry.js +36 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/renderer.d.ts +16 -0
- package/dist/core/renderer.js +61 -0
- package/dist/core/renderer.js.map +1 -0
- package/dist/core/types.d.ts +55 -0
- package/dist/core/types.js +0 -0
- package/dist/events/event-bridge.d.ts +14 -0
- package/dist/events/event-bridge.js +75 -0
- package/dist/events/event-bridge.js.map +1 -0
- package/dist/events/event-names.d.ts +21 -0
- package/dist/events/event-names.js +22 -0
- package/dist/events/event-names.js.map +1 -0
- package/dist/form/components/base/checkbox.d.ts +4 -0
- package/dist/form/components/base/checkbox.js +22 -0
- package/dist/form/components/base/checkbox.js.map +1 -0
- package/dist/form/components/base/field.d.ts +9 -0
- package/dist/form/components/base/field.js +38 -0
- package/dist/form/components/base/field.js.map +1 -0
- package/dist/form/components/base/input-error.d.ts +4 -0
- package/dist/form/components/base/input-error.js +14 -0
- package/dist/form/components/base/input-error.js.map +1 -0
- package/dist/form/components/base/input.d.ts +3 -0
- package/dist/form/components/base/input.js +16 -0
- package/dist/form/components/base/input.js.map +1 -0
- package/dist/form/components/base/label.d.ts +4 -0
- package/dist/form/components/base/label.js +16 -0
- package/dist/form/components/base/label.js.map +1 -0
- package/dist/form/components/base/password-input.d.ts +7 -0
- package/dist/form/components/base/password-input.js +29 -0
- package/dist/form/components/base/password-input.js.map +1 -0
- package/dist/form/components/base/submit-button.d.ts +6 -0
- package/dist/form/components/base/submit-button.js +46 -0
- package/dist/form/components/base/submit-button.js.map +1 -0
- package/dist/form/components/base/textarea.d.ts +3 -0
- package/dist/form/components/base/textarea.js +15 -0
- package/dist/form/components/base/textarea.js.map +1 -0
- package/dist/form/components/conditions.d.ts +25 -0
- package/dist/form/components/conditions.js +62 -0
- package/dist/form/components/conditions.js.map +1 -0
- package/dist/form/components/context.d.ts +20 -0
- package/dist/form/components/context.js +30 -0
- package/dist/form/components/context.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +16 -0
- package/dist/form/components/fields/checkbox.js +51 -0
- package/dist/form/components/fields/checkbox.js.map +1 -0
- package/dist/form/components/fields/choice.d.ts +14 -0
- package/dist/form/components/fields/choice.js +49 -0
- package/dist/form/components/fields/choice.js.map +1 -0
- package/dist/form/components/fields/date-input.d.ts +20 -0
- package/dist/form/components/fields/date-input.js +33 -0
- package/dist/form/components/fields/date-input.js.map +1 -0
- package/dist/form/components/fields/hidden-input.d.ts +10 -0
- package/dist/form/components/fields/hidden-input.js +12 -0
- package/dist/form/components/fields/hidden-input.js.map +1 -0
- package/dist/form/components/fields/number-input.d.ts +23 -0
- package/dist/form/components/fields/number-input.js +55 -0
- package/dist/form/components/fields/number-input.js.map +1 -0
- package/dist/form/components/fields/password-input.d.ts +29 -0
- package/dist/form/components/fields/password-input.js +73 -0
- package/dist/form/components/fields/password-input.js.map +1 -0
- package/dist/form/components/fields/rich-editor.d.ts +17 -0
- package/dist/form/components/fields/rich-editor.js +302 -0
- package/dist/form/components/fields/rich-editor.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +23 -0
- package/dist/form/components/fields/select.js +182 -0
- package/dist/form/components/fields/select.js.map +1 -0
- package/dist/form/components/fields/submit-button.d.ts +10 -0
- package/dist/form/components/fields/submit-button.js +14 -0
- package/dist/form/components/fields/submit-button.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +21 -0
- package/dist/form/components/fields/text-input.js +33 -0
- package/dist/form/components/fields/text-input.js.map +1 -0
- package/dist/form/components/fields/textarea.d.ts +20 -0
- package/dist/form/components/fields/textarea.js +32 -0
- package/dist/form/components/fields/textarea.js.map +1 -0
- package/dist/form/components/form-transport.d.ts +8 -0
- package/dist/form/components/form-transport.js +31 -0
- package/dist/form/components/form-transport.js.map +1 -0
- package/dist/form/components/form.d.ts +21 -0
- package/dist/form/components/form.js +126 -0
- package/dist/form/components/form.js.map +1 -0
- package/dist/form/components/index.d.ts +11 -0
- package/dist/form/components/index.js +12 -0
- package/dist/form/components/resolved-nodes.d.ts +6 -0
- package/dist/form/components/resolved-nodes.js +20 -0
- package/dist/form/components/resolved-nodes.js.map +1 -0
- package/dist/form/components/types.d.ts +7 -0
- package/dist/form/components/types.js +0 -0
- package/dist/form/components/use-controlled-field.d.ts +16 -0
- package/dist/form/components/use-controlled-field.js +33 -0
- package/dist/form/components/use-controlled-field.js.map +1 -0
- package/dist/form/components/use-dependent-field.d.ts +3 -0
- package/dist/form/components/use-dependent-field.js +18 -0
- package/dist/form/components/use-dependent-field.js.map +1 -0
- package/dist/form/components/use-field-commit.d.ts +14 -0
- package/dist/form/components/use-field-commit.js +30 -0
- package/dist/form/components/use-field-commit.js.map +1 -0
- package/dist/form/components/use-form-resolver.d.ts +2 -0
- package/dist/form/components/use-form-resolver.js +57 -0
- package/dist/form/components/use-form-resolver.js.map +1 -0
- package/dist/form/components/values.d.ts +7 -0
- package/dist/form/components/values.js +37 -0
- package/dist/form/components/values.js.map +1 -0
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.js +33 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/skeleton.d.ts +2 -0
- package/dist/form/skeleton.js +21 -0
- package/dist/form/skeleton.js.map +1 -0
- package/dist/generated/types.d.ts +17 -0
- package/dist/generated/types.js +0 -0
- package/dist/icons/default-icons.d.ts +3 -0
- package/dist/icons/default-icons.js +44 -0
- package/dist/icons/default-icons.js.map +1 -0
- package/dist/icons/dynamic-lucide-renderer.d.ts +2 -0
- package/dist/icons/dynamic-lucide-renderer.js +18 -0
- package/dist/icons/dynamic-lucide-renderer.js.map +1 -0
- package/dist/icons/icon-renderer.d.ts +14 -0
- package/dist/icons/icon-renderer.js +35 -0
- package/dist/icons/icon-renderer.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +14 -0
- package/dist/inertia.d.ts +17 -0
- package/dist/inertia.js +26 -0
- package/dist/inertia.js.map +1 -0
- package/dist/lattice.css +247 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +13 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/menu/index.d.ts +1 -0
- package/dist/menu/index.js +2 -0
- package/dist/menu/use-menu.d.ts +2 -0
- package/dist/menu/use-menu.js +9 -0
- package/dist/menu/use-menu.js.map +1 -0
- package/dist/page.d.ts +6 -0
- package/dist/page.js +30 -0
- package/dist/page.js.map +1 -0
- package/dist/provider.d.ts +7 -0
- package/dist/provider.js +19 -0
- package/dist/provider.js.map +1 -0
- package/dist/registry.d.ts +1 -0
- package/dist/registry.js +11 -0
- package/dist/registry.js.map +1 -0
- package/dist/table/bulk.d.ts +18 -0
- package/dist/table/bulk.js +44 -0
- package/dist/table/bulk.js.map +1 -0
- package/dist/table/components/bulk-bar.d.ts +11 -0
- package/dist/table/components/bulk-bar.js +76 -0
- package/dist/table/components/bulk-bar.js.map +1 -0
- package/dist/table/components/column-filter-control.d.ts +14 -0
- package/dist/table/components/column-filter-control.js +244 -0
- package/dist/table/components/column-filter-control.js.map +1 -0
- package/dist/table/components/column-header.d.ts +7 -0
- package/dist/table/components/column-header.js +37 -0
- package/dist/table/components/column-header.js.map +1 -0
- package/dist/table/components/filter-stack-bar.d.ts +7 -0
- package/dist/table/components/filter-stack-bar.js +35 -0
- package/dist/table/components/filter-stack-bar.js.map +1 -0
- package/dist/table/components/filter-value-input.d.ts +11 -0
- package/dist/table/components/filter-value-input.js +82 -0
- package/dist/table/components/filter-value-input.js.map +1 -0
- package/dist/table/components/pagination.d.ts +14 -0
- package/dist/table/components/pagination.js +67 -0
- package/dist/table/components/pagination.js.map +1 -0
- package/dist/table/components/sort-bar.d.ts +7 -0
- package/dist/table/components/sort-bar.js +43 -0
- package/dist/table/components/sort-bar.js.map +1 -0
- package/dist/table/components/table-action-node.d.ts +4 -0
- package/dist/table/components/table-action-node.js +24 -0
- package/dist/table/components/table-action-node.js.map +1 -0
- package/dist/table/components/table-cell.d.ts +5 -0
- package/dist/table/components/table-cell.js +63 -0
- package/dist/table/components/table-cell.js.map +1 -0
- package/dist/table/components/table.d.ts +3 -0
- package/dist/table/components/table.js +189 -0
- package/dist/table/components/table.js.map +1 -0
- package/dist/table/format.d.ts +3 -0
- package/dist/table/format.js +41 -0
- package/dist/table/format.js.map +1 -0
- package/dist/table/index.d.ts +1 -0
- package/dist/table/index.js +10 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/payload.d.ts +9 -0
- package/dist/table/payload.js +46 -0
- package/dist/table/payload.js.map +1 -0
- package/dist/table/query.d.ts +12 -0
- package/dist/table/query.js +83 -0
- package/dist/table/query.js.map +1 -0
- package/dist/table/types.d.ts +67 -0
- package/dist/table/types.js +0 -0
- package/dist/table/use-table-selection.d.ts +12 -0
- package/dist/table/use-table-selection.js +46 -0
- package/dist/table/use-table-selection.js.map +1 -0
- package/dist/table/use-table.d.ts +19 -0
- package/dist/table/use-table.js +157 -0
- package/dist/table/use-table.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +0 -0
- package/package.json +151 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { getBulkActions } from "../bulk.js";
|
|
2
|
+
import { getRowActions, getRowKey } from "../payload.js";
|
|
3
|
+
import { getColumnGridTemplate, getQueryParams, getVisiblePages } from "../query.js";
|
|
4
|
+
import { useTableSelection } from "../use-table-selection.js";
|
|
5
|
+
import { useTable } from "../use-table.js";
|
|
6
|
+
import { BulkBar } from "./bulk-bar.js";
|
|
7
|
+
import { ColumnFilterControl } from "./column-filter-control.js";
|
|
8
|
+
import { ColumnHeader } from "./column-header.js";
|
|
9
|
+
import { FilterStackBar } from "./filter-stack-bar.js";
|
|
10
|
+
import { TablePagination } from "./pagination.js";
|
|
11
|
+
import { SortBar } from "./sort-bar.js";
|
|
12
|
+
import { TableActionNode } from "./table-action-node.js";
|
|
13
|
+
import { ColumnCell } from "./table-cell.js";
|
|
14
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
//#region resources/js/table/components/table.tsx
|
|
16
|
+
var TableComponent = ({ node }) => {
|
|
17
|
+
const { columns, rows, pagination, state, filters, addFilter, updateFilter, removeFilter, processing, hasLoaded, infiniteLoaderRef, sort, clearSort, goToPage, loadMore } = useTable(node);
|
|
18
|
+
const bulkActions = getBulkActions(node.props?.bulkActions);
|
|
19
|
+
const hasBulkActions = bulkActions.length > 0;
|
|
20
|
+
const rowEntries = rows.map((row, index) => ({
|
|
21
|
+
row,
|
|
22
|
+
actions: getRowActions(row),
|
|
23
|
+
key: getRowKey(row, index)
|
|
24
|
+
}));
|
|
25
|
+
const selection = useTableSelection(rowEntries.map((entry) => entry.key));
|
|
26
|
+
const currentPage = pagination.currentPage ?? state.page;
|
|
27
|
+
const lastPage = pagination.lastPage ?? currentPage;
|
|
28
|
+
const mode = pagination.mode ?? "table";
|
|
29
|
+
const visiblePages = getVisiblePages(currentPage, lastPage);
|
|
30
|
+
const hasNextPage = pagination.hasMore ?? currentPage < lastPage;
|
|
31
|
+
const hasActions = rowEntries.some((entry) => entry.actions.length > 0);
|
|
32
|
+
const striped = node.props?.striped === true;
|
|
33
|
+
const hasFilters = columns.some((column) => column.filter?.enabled);
|
|
34
|
+
const filterEntries = filters.map((clause, index) => ({
|
|
35
|
+
clause,
|
|
36
|
+
index
|
|
37
|
+
}));
|
|
38
|
+
const gridTemplateColumns = getColumnGridTemplate(columns, hasActions, hasBulkActions);
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
40
|
+
"data-lattice-component": node.id,
|
|
41
|
+
className: "overflow-x-auto rounded-lt-sm border border-lt-border",
|
|
42
|
+
children: [
|
|
43
|
+
hasBulkActions && selection.active && /* @__PURE__ */ jsx(BulkBar, {
|
|
44
|
+
actions: bulkActions,
|
|
45
|
+
selectedKeys: selection.selectedKeys,
|
|
46
|
+
allMatching: selection.allMatching,
|
|
47
|
+
total: pagination.total,
|
|
48
|
+
query: getQueryParams(state),
|
|
49
|
+
canSelectAllMatching: selection.allVisibleSelected && !selection.allMatching && pagination.total !== void 0 && pagination.total > selection.selectedKeys.length,
|
|
50
|
+
onSelectAllMatching: selection.selectAllMatching,
|
|
51
|
+
onCompleted: selection.clear
|
|
52
|
+
}),
|
|
53
|
+
filters.length > 0 && /* @__PURE__ */ jsx(FilterStackBar, {
|
|
54
|
+
filters,
|
|
55
|
+
columns,
|
|
56
|
+
processing,
|
|
57
|
+
onRemove: removeFilter
|
|
58
|
+
}),
|
|
59
|
+
state.sorts.length > 0 && /* @__PURE__ */ jsx(SortBar, {
|
|
60
|
+
columns,
|
|
61
|
+
state,
|
|
62
|
+
processing,
|
|
63
|
+
onClear: clearSort
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ jsxs("div", {
|
|
66
|
+
className: "w-max min-w-full text-sm",
|
|
67
|
+
role: "table",
|
|
68
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
69
|
+
className: "border-b border-lt-border bg-lt-muted/50",
|
|
70
|
+
role: "rowgroup",
|
|
71
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
72
|
+
className: "hidden min-w-full md:grid md:grid-cols-[var(--lattice-table-columns)]",
|
|
73
|
+
role: "row",
|
|
74
|
+
style: { "--lattice-table-columns": gridTemplateColumns },
|
|
75
|
+
children: [
|
|
76
|
+
hasBulkActions && /* @__PURE__ */ jsx("div", {
|
|
77
|
+
className: "flex items-center px-4 py-3",
|
|
78
|
+
role: "columnheader",
|
|
79
|
+
children: /* @__PURE__ */ jsx("input", {
|
|
80
|
+
type: "checkbox",
|
|
81
|
+
"aria-label": "Select all rows",
|
|
82
|
+
checked: selection.allSelected,
|
|
83
|
+
onChange: selection.toggleAll
|
|
84
|
+
})
|
|
85
|
+
}),
|
|
86
|
+
columns.map((column) => /* @__PURE__ */ jsx(ColumnHeader, {
|
|
87
|
+
column,
|
|
88
|
+
processing,
|
|
89
|
+
sort,
|
|
90
|
+
state
|
|
91
|
+
}, column.key)),
|
|
92
|
+
hasActions && /* @__PURE__ */ jsx("div", {
|
|
93
|
+
className: "px-4 py-3 text-right align-middle font-medium text-lt-muted-fg",
|
|
94
|
+
role: "columnheader",
|
|
95
|
+
children: "Actions"
|
|
96
|
+
})
|
|
97
|
+
]
|
|
98
|
+
}), hasFilters && /* @__PURE__ */ jsxs("div", {
|
|
99
|
+
className: "hidden min-w-full border-t border-lt-border md:grid md:grid-cols-[var(--lattice-table-columns)]",
|
|
100
|
+
role: "row",
|
|
101
|
+
style: { "--lattice-table-columns": gridTemplateColumns },
|
|
102
|
+
children: [
|
|
103
|
+
hasBulkActions && /* @__PURE__ */ jsx("div", {
|
|
104
|
+
className: "px-4 py-2",
|
|
105
|
+
role: "cell"
|
|
106
|
+
}),
|
|
107
|
+
columns.map((column) => /* @__PURE__ */ jsx("div", {
|
|
108
|
+
className: "px-4 py-2",
|
|
109
|
+
role: "cell",
|
|
110
|
+
children: column.filter?.enabled && /* @__PURE__ */ jsx(ColumnFilterControl, {
|
|
111
|
+
column,
|
|
112
|
+
clauses: filterEntries.filter((entry) => entry.clause.field === column.key),
|
|
113
|
+
processing,
|
|
114
|
+
onAdd: addFilter,
|
|
115
|
+
onUpdate: updateFilter,
|
|
116
|
+
onRemove: removeFilter
|
|
117
|
+
})
|
|
118
|
+
}, column.key)),
|
|
119
|
+
hasActions && /* @__PURE__ */ jsx("div", {
|
|
120
|
+
className: "px-4 py-2",
|
|
121
|
+
role: "cell"
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
})]
|
|
125
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
126
|
+
role: "rowgroup",
|
|
127
|
+
children: !hasLoaded ? /* @__PURE__ */ jsx("div", {
|
|
128
|
+
className: "p-4 text-lt-muted-fg",
|
|
129
|
+
role: "row",
|
|
130
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
131
|
+
role: "cell",
|
|
132
|
+
children: "Loading rows..."
|
|
133
|
+
})
|
|
134
|
+
}) : rowEntries.map(({ row, actions, key }) => {
|
|
135
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
136
|
+
className: `grid grid-cols-1 border-b border-lt-border last:border-b-0 md:grid-cols-[var(--lattice-table-columns)] ${striped ? "odd:bg-lt-muted/30" : ""}`,
|
|
137
|
+
role: "row",
|
|
138
|
+
style: { "--lattice-table-columns": gridTemplateColumns },
|
|
139
|
+
children: [
|
|
140
|
+
hasBulkActions && /* @__PURE__ */ jsx("div", {
|
|
141
|
+
className: "flex items-center p-4",
|
|
142
|
+
role: "cell",
|
|
143
|
+
children: /* @__PURE__ */ jsx("input", {
|
|
144
|
+
type: "checkbox",
|
|
145
|
+
"aria-label": `Select row ${key}`,
|
|
146
|
+
checked: selection.isSelected(key),
|
|
147
|
+
onChange: () => selection.toggle(key)
|
|
148
|
+
})
|
|
149
|
+
}),
|
|
150
|
+
columns.map((column) => /* @__PURE__ */ jsxs("div", {
|
|
151
|
+
className: "grid gap-1 p-4 align-middle",
|
|
152
|
+
role: "cell",
|
|
153
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
154
|
+
"aria-hidden": "true",
|
|
155
|
+
className: "text-xs font-medium text-lt-muted-fg md:hidden",
|
|
156
|
+
children: column.label
|
|
157
|
+
}), /* @__PURE__ */ jsx(ColumnCell, {
|
|
158
|
+
column,
|
|
159
|
+
row
|
|
160
|
+
})]
|
|
161
|
+
}, column.key)),
|
|
162
|
+
actions.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
163
|
+
className: "flex items-center justify-start gap-2 p-4 md:justify-end",
|
|
164
|
+
role: "cell",
|
|
165
|
+
children: actions.map((action, actionIndex) => /* @__PURE__ */ jsx(TableActionNode, { node: action }, action.key ?? action.id ?? actionIndex))
|
|
166
|
+
})
|
|
167
|
+
]
|
|
168
|
+
}, key);
|
|
169
|
+
})
|
|
170
|
+
})]
|
|
171
|
+
}),
|
|
172
|
+
hasLoaded && /* @__PURE__ */ jsx(TablePagination, {
|
|
173
|
+
pagination,
|
|
174
|
+
currentPage,
|
|
175
|
+
processing,
|
|
176
|
+
mode,
|
|
177
|
+
hasNextPage,
|
|
178
|
+
visiblePages,
|
|
179
|
+
infiniteLoaderRef,
|
|
180
|
+
onPage: goToPage,
|
|
181
|
+
onLoadMore: loadMore
|
|
182
|
+
})
|
|
183
|
+
]
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
//#endregion
|
|
187
|
+
export { TableComponent as default };
|
|
188
|
+
|
|
189
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//#region resources/js/table/format.ts
|
|
2
|
+
function formatCell(value, column) {
|
|
3
|
+
if (value === null || value === void 0) return "";
|
|
4
|
+
if (column?.date) return formatDate(value, column.date.format ?? null);
|
|
5
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
6
|
+
return JSON.stringify(value);
|
|
7
|
+
}
|
|
8
|
+
function formatDate(value, format) {
|
|
9
|
+
const date = new Date(String(value));
|
|
10
|
+
if (Number.isNaN(date.getTime())) return formatCell(value);
|
|
11
|
+
if (!format) return new Intl.DateTimeFormat(void 0, {
|
|
12
|
+
dateStyle: "medium",
|
|
13
|
+
timeStyle: "short"
|
|
14
|
+
}).format(date);
|
|
15
|
+
const replacements = {
|
|
16
|
+
Y: String(date.getFullYear()),
|
|
17
|
+
y: String(date.getFullYear()).slice(-2),
|
|
18
|
+
m: String(date.getMonth() + 1).padStart(2, "0"),
|
|
19
|
+
n: String(date.getMonth() + 1),
|
|
20
|
+
d: String(date.getDate()).padStart(2, "0"),
|
|
21
|
+
j: String(date.getDate()),
|
|
22
|
+
H: String(date.getHours()).padStart(2, "0"),
|
|
23
|
+
G: String(date.getHours()),
|
|
24
|
+
i: String(date.getMinutes()).padStart(2, "0"),
|
|
25
|
+
s: String(date.getSeconds()).padStart(2, "0")
|
|
26
|
+
};
|
|
27
|
+
return format.replace(/[YymndjHGis]/g, (token) => replacements[token] ?? token);
|
|
28
|
+
}
|
|
29
|
+
function resolveLink(column, row, value) {
|
|
30
|
+
if (!column.link) return null;
|
|
31
|
+
const href = column.link.href ?? String(value ?? "");
|
|
32
|
+
if (href === "") return null;
|
|
33
|
+
return href.replace(/\{([^}]+)\}/g, (_, key) => {
|
|
34
|
+
if (key === "value") return encodeURIComponent(String(value ?? ""));
|
|
35
|
+
return encodeURIComponent(String(row[key] ?? ""));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { formatCell, resolveLink };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +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 if (column?.date) {\n return formatDate(value, column.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 if (!column.link) {\n return null;\n }\n\n const href = column.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,IAAI,QAAQ,MACV,OAAO,WAAW,OAAO,OAAO,KAAK,UAAU,IAAI;CAGrD,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,IAAI,CAAC,OAAO,MACV,OAAO;CAGT,MAAM,OAAO,OAAO,KAAK,QAAQ,OAAO,SAAS,EAAE;CAEnD,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const tableComponents: import('../../../core/registry').Plugin;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createPlugin, lazyComponent } from "../core/registry.js";
|
|
2
|
+
//#region resources/js/table/index.ts
|
|
3
|
+
var tableComponents = createPlugin({
|
|
4
|
+
components: { table: lazyComponent(() => import("./components/table.js")) },
|
|
5
|
+
name: "lattice/table"
|
|
6
|
+
});
|
|
7
|
+
//#endregion
|
|
8
|
+
export { tableComponents };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":";;AAEA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EACV,OAAO,oBAAoB,OAAO,wBAAqB,EACzD;CACA,MAAM;AACR,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Node } from '../../../core/types';
|
|
2
|
+
import { TableColumn, TablePagination, TableRow, TableState } from './types';
|
|
3
|
+
export declare function getColumns(value: unknown): TableColumn[];
|
|
4
|
+
export declare function getRows(value: unknown): TableRow[];
|
|
5
|
+
export declare function getPagination(value: unknown): TablePagination;
|
|
6
|
+
export declare function flattenColumns(columns: TableColumn[]): TableColumn[];
|
|
7
|
+
export declare function getState(value: unknown): TableState;
|
|
8
|
+
export declare function getRowKey(row: TableRow, index: number): string;
|
|
9
|
+
export declare function getRowActions(row: TableRow): Node[];
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region resources/js/table/payload.ts
|
|
2
|
+
function getFilters(value) {
|
|
3
|
+
if (!Array.isArray(value)) return [];
|
|
4
|
+
return value.filter((clause) => typeof clause === "object" && clause !== null && typeof clause.field === "string" && typeof clause.operator === "string" && typeof clause.value === "string");
|
|
5
|
+
}
|
|
6
|
+
function getColumns(value) {
|
|
7
|
+
if (!Array.isArray(value)) return [];
|
|
8
|
+
return value.filter((column) => typeof column === "object" && column !== null && "key" in column && "label" in column && typeof column.key === "string" && typeof column.label === "string");
|
|
9
|
+
}
|
|
10
|
+
function getRows(value) {
|
|
11
|
+
if (!Array.isArray(value)) return [];
|
|
12
|
+
return value.filter((row) => typeof row === "object" && row !== null && !Array.isArray(row));
|
|
13
|
+
}
|
|
14
|
+
function getPagination(value) {
|
|
15
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return {};
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function flattenColumns(columns) {
|
|
19
|
+
return columns.flatMap((column) => [column, ...flattenColumns(column.columns ?? [])]);
|
|
20
|
+
}
|
|
21
|
+
function getState(value) {
|
|
22
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return {
|
|
23
|
+
filters: [],
|
|
24
|
+
sorts: [],
|
|
25
|
+
page: 1,
|
|
26
|
+
perPage: 25
|
|
27
|
+
};
|
|
28
|
+
const state = value;
|
|
29
|
+
return {
|
|
30
|
+
filters: getFilters(state.filters),
|
|
31
|
+
sorts: Array.isArray(state.sorts) ? state.sorts : [],
|
|
32
|
+
page: typeof state.page === "number" ? state.page : 1,
|
|
33
|
+
perPage: typeof state.perPage === "number" ? state.perPage : 25
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getRowKey(row, index) {
|
|
37
|
+
const key = row.id ?? row.uuid ?? row.key ?? index;
|
|
38
|
+
return String(key);
|
|
39
|
+
}
|
|
40
|
+
function getRowActions(row) {
|
|
41
|
+
return Array.isArray(row.actions) ? row.actions : [];
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { flattenColumns, getColumns, getPagination, getRowActions, getRowKey, getRows, getState };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +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 {};\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 };\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 };\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,SAAgB,cAAc,OAAiC;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO,CAAC;CAGV,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;CACX;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;CAC/D;AACF;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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TableColumn, TableSort, TableState } from './types';
|
|
2
|
+
export declare function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined;
|
|
3
|
+
export declare function getSortColumn(columns: TableColumn[], sort: TableSort): TableColumn | undefined;
|
|
4
|
+
export declare function getColumnAriaSort(sort: TableSort | undefined): "ascending" | "descending" | undefined;
|
|
5
|
+
export declare function buildEndpoint(endpoint: string, state: TableState): string;
|
|
6
|
+
export declare function getQueryParams(state: TableState): Record<string, unknown>;
|
|
7
|
+
export declare const VALUELESS_FILTER_OPERATORS: Set<string>;
|
|
8
|
+
export declare function operatorLabel(operator: string): string;
|
|
9
|
+
export declare function getSortDirectionLabel(direction: string): string;
|
|
10
|
+
export declare function nextSort(sorts: TableSort[], column: TableColumn): TableSort[];
|
|
11
|
+
export declare function getVisiblePages(currentPage: number, lastPage: number): number[];
|
|
12
|
+
export declare function getColumnGridTemplate(columns: TableColumn[], hasActions: boolean, hasSelection: boolean): string;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { flattenColumns } from "./payload.js";
|
|
2
|
+
//#region resources/js/table/query.ts
|
|
3
|
+
function getColumnSort(state, column) {
|
|
4
|
+
return state.sorts.find((currentSort) => currentSort.key === column.key);
|
|
5
|
+
}
|
|
6
|
+
function getSortColumn(columns, sort) {
|
|
7
|
+
return flattenColumns(columns).find((column) => column.key === sort.key);
|
|
8
|
+
}
|
|
9
|
+
function getColumnAriaSort(sort) {
|
|
10
|
+
if (sort?.direction === "asc") return "ascending";
|
|
11
|
+
if (sort?.direction === "desc") return "descending";
|
|
12
|
+
}
|
|
13
|
+
function buildEndpoint(endpoint, state) {
|
|
14
|
+
const url = new URL(endpoint, window.location.origin);
|
|
15
|
+
if (state.filters.length > 0) url.searchParams.set("filter", serializeFilters(state));
|
|
16
|
+
if (state.sorts.length > 0) url.searchParams.set("sort", serializeSorts(state));
|
|
17
|
+
url.searchParams.set("page", String(state.page));
|
|
18
|
+
url.searchParams.set("per_page", String(state.perPage));
|
|
19
|
+
return `${url.pathname}${url.search}`;
|
|
20
|
+
}
|
|
21
|
+
function getQueryParams(state) {
|
|
22
|
+
const params = {};
|
|
23
|
+
if (state.filters.length > 0) params.filter = serializeFilters(state);
|
|
24
|
+
if (state.sorts.length > 0) params.sort = serializeSorts(state);
|
|
25
|
+
return params;
|
|
26
|
+
}
|
|
27
|
+
function serializeFilters(state) {
|
|
28
|
+
return state.filters.map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`).join(",");
|
|
29
|
+
}
|
|
30
|
+
function serializeSorts(state) {
|
|
31
|
+
return state.sorts.map((sort) => sort.direction === "desc" ? `-${sort.key}` : sort.key).join(",");
|
|
32
|
+
}
|
|
33
|
+
var operatorLabels = {
|
|
34
|
+
contains: "contains",
|
|
35
|
+
starts_with: "starts with",
|
|
36
|
+
ends_with: "ends with",
|
|
37
|
+
eq: "equals",
|
|
38
|
+
neq: "not equals",
|
|
39
|
+
gt: ">",
|
|
40
|
+
gte: "≥",
|
|
41
|
+
lt: "<",
|
|
42
|
+
lte: "≤",
|
|
43
|
+
before: "before",
|
|
44
|
+
after: "after",
|
|
45
|
+
empty: "is empty",
|
|
46
|
+
filled: "is not empty"
|
|
47
|
+
};
|
|
48
|
+
var VALUELESS_FILTER_OPERATORS = new Set(["empty", "filled"]);
|
|
49
|
+
function operatorLabel(operator) {
|
|
50
|
+
return operatorLabels[operator] ?? operator;
|
|
51
|
+
}
|
|
52
|
+
function getSortDirectionLabel(direction) {
|
|
53
|
+
return direction === "desc" ? "descending" : "ascending";
|
|
54
|
+
}
|
|
55
|
+
function nextSort(sorts, column) {
|
|
56
|
+
if (!column.sortable) return sorts;
|
|
57
|
+
const currentSort = sorts.find((sort) => sort.key === column.key);
|
|
58
|
+
const remainingSorts = sorts.filter((sort) => sort.key !== column.key);
|
|
59
|
+
if (!currentSort) return [...sorts, {
|
|
60
|
+
key: column.key,
|
|
61
|
+
direction: "asc"
|
|
62
|
+
}];
|
|
63
|
+
if (currentSort.direction === "asc") return [...remainingSorts, {
|
|
64
|
+
key: column.key,
|
|
65
|
+
direction: "desc"
|
|
66
|
+
}];
|
|
67
|
+
return remainingSorts;
|
|
68
|
+
}
|
|
69
|
+
function getVisiblePages(currentPage, lastPage) {
|
|
70
|
+
if (lastPage <= 5) return Array.from({ length: lastPage }, (_, index) => index + 1);
|
|
71
|
+
const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));
|
|
72
|
+
return Array.from({ length: 5 }, (_, index) => start + index);
|
|
73
|
+
}
|
|
74
|
+
function getColumnGridTemplate(columns, hasActions, hasSelection) {
|
|
75
|
+
const tracks = columns.map((column) => column.type === "stack" ? "minmax(16rem, 2fr)" : "minmax(9rem, 1fr)");
|
|
76
|
+
if (hasActions) tracks.push("max-content");
|
|
77
|
+
if (hasSelection) tracks.unshift("max-content");
|
|
78
|
+
return tracks.join(" ");
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { VALUELESS_FILTER_OPERATORS, buildEndpoint, getColumnAriaSort, getColumnGridTemplate, getColumnSort, getQueryParams, getSortColumn, getSortDirectionLabel, getVisiblePages, nextSort, operatorLabel };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +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":";;AAGA,SAAgB,cAAc,OAAmB,QAA4C;CAC3F,OAAO,MAAM,MAAM,MAAM,gBAAgB,YAAY,QAAQ,OAAO,GAAG;AACzE;AAEA,SAAgB,cAAc,SAAwB,MAA0C;CAC9F,OAAO,eAAe,OAAO,EAAE,MAAM,WAAW,OAAO,QAAQ,KAAK,GAAG;AACzE;AAEA,SAAgB,kBACd,MACwC;CACxC,IAAI,MAAM,cAAc,OACtB,OAAO;CAGT,IAAI,MAAM,cAAc,QACtB,OAAO;AAIX;AAEA,SAAgB,cAAc,UAAkB,OAA2B;CACzE,MAAM,MAAM,IAAI,IAAI,UAAU,OAAO,SAAS,MAAM;CAEpD,IAAI,MAAM,QAAQ,SAAS,GACzB,IAAI,aAAa,IAAI,UAAU,iBAAiB,KAAK,CAAC;CAGxD,IAAI,MAAM,MAAM,SAAS,GACvB,IAAI,aAAa,IAAI,QAAQ,eAAe,KAAK,CAAC;CAGpD,IAAI,aAAa,IAAI,QAAQ,OAAO,MAAM,IAAI,CAAC;CAC/C,IAAI,aAAa,IAAI,YAAY,OAAO,MAAM,OAAO,CAAC;CAEtD,OAAO,GAAG,IAAI,WAAW,IAAI;AAC/B;AAEA,SAAgB,eAAe,OAA4C;CACzE,MAAM,SAAkC,CAAC;CAEzC,IAAI,MAAM,QAAQ,SAAS,GACzB,OAAO,SAAS,iBAAiB,KAAK;CAGxC,IAAI,MAAM,MAAM,SAAS,GACvB,OAAO,OAAO,eAAe,KAAK;CAGpC,OAAO;AACT;AAEA,SAAS,iBAAiB,OAA2B;CACnD,OAAO,MAAM,QACV,KAAK,WAAW,GAAG,OAAO,MAAM,GAAG,OAAO,SAAS,GAAG,mBAAmB,OAAO,KAAK,GAAG,EACxF,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,OAA2B;CACjD,OAAO,MAAM,MACV,KAAK,SAAU,KAAK,cAAc,SAAS,IAAI,KAAK,QAAQ,KAAK,GAAI,EACrE,KAAK,GAAG;AACb;AAEA,IAAM,iBAAyC;CAC7C,UAAU;CACV,aAAa;CACb,WAAW;CACX,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,QAAQ;CACR,OAAO;CACP,OAAO;CACP,QAAQ;AACV;AAGA,IAAa,6BAA6B,IAAI,IAAY,CAAC,SAAS,QAAQ,CAAC;AAE7E,SAAgB,cAAc,UAA0B;CACtD,OAAO,eAAe,aAAa;AACrC;AAEA,SAAgB,sBAAsB,WAA2B;CAC/D,OAAO,cAAc,SAAS,eAAe;AAC/C;AAEA,SAAgB,SAAS,OAAoB,QAAkC;CAC7E,IAAI,CAAC,OAAO,UACV,OAAO;CAGT,MAAM,cAAc,MAAM,MAAM,SAAS,KAAK,QAAQ,OAAO,GAAG;CAChE,MAAM,iBAAiB,MAAM,QAAQ,SAAS,KAAK,QAAQ,OAAO,GAAG;CAErE,IAAI,CAAC,aACH,OAAO,CAAC,GAAG,OAAO;EAAE,KAAK,OAAO;EAAK,WAAW;CAAM,CAAC;CAGzD,IAAI,YAAY,cAAc,OAC5B,OAAO,CAAC,GAAG,gBAAgB;EAAE,KAAK,OAAO;EAAK,WAAW;CAAO,CAAC;CAGnE,OAAO;AACT;AAEA,SAAgB,gBAAgB,aAAqB,UAA4B;CAC/E,IAAI,YAAY,GACd,OAAO,MAAM,KAAK,EAAE,QAAQ,SAAS,IAAI,GAAG,UAAU,QAAQ,CAAC;CAGjE,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,WAAW,CAAC,CAAC;CAEjE,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,UAAU,QAAQ,KAAK;AAC9D;AAEA,SAAgB,sBACd,SACA,YACA,cACQ;CACR,MAAM,SAAmB,QAAQ,KAAK,WACpC,OAAO,SAAS,UAAU,uBAAuB,mBACnD;CAEA,IAAI,YACF,OAAO,KAAK,aAAa;CAG3B,IAAI,cACF,OAAO,QAAQ,aAAa;CAG9B,OAAO,OAAO,KAAK,GAAG;AACxB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ControlType, FilterOperator, PaginationType, TableSort } from '../../../generated/types';
|
|
2
|
+
export type { TableSort };
|
|
3
|
+
export type TableColumn = {
|
|
4
|
+
columns?: TableColumn[];
|
|
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
|
+
};
|
|
24
|
+
export type TableRow = Record<string, unknown>;
|
|
25
|
+
export type FilterClause = {
|
|
26
|
+
field: string;
|
|
27
|
+
operator: FilterOperator;
|
|
28
|
+
value: string;
|
|
29
|
+
};
|
|
30
|
+
export type TableState = {
|
|
31
|
+
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
|
+
};
|
|
47
|
+
export type TableResponse = {
|
|
48
|
+
data?: TableRow[];
|
|
49
|
+
pagination?: TablePagination;
|
|
50
|
+
state?: Partial<TableState>;
|
|
51
|
+
};
|
|
52
|
+
declare module '../../../core/types' {
|
|
53
|
+
interface ComponentProps {
|
|
54
|
+
table: {
|
|
55
|
+
bulkActions?: Array<Record<string, unknown>>;
|
|
56
|
+
columns?: TableColumn[];
|
|
57
|
+
data?: TableRow[];
|
|
58
|
+
endpoint?: string;
|
|
59
|
+
ref?: string;
|
|
60
|
+
lazy?: boolean;
|
|
61
|
+
layout?: string;
|
|
62
|
+
striped?: boolean;
|
|
63
|
+
pagination?: Record<string, unknown>;
|
|
64
|
+
state?: Record<string, unknown>;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function useTableSelection(keys: string[]): {
|
|
2
|
+
selectedKeys: string[];
|
|
3
|
+
allMatching: boolean;
|
|
4
|
+
allVisibleSelected: boolean;
|
|
5
|
+
allSelected: boolean;
|
|
6
|
+
active: boolean;
|
|
7
|
+
isSelected: (key: string) => boolean;
|
|
8
|
+
toggle: (key: string) => void;
|
|
9
|
+
toggleAll: () => void;
|
|
10
|
+
selectAllMatching: () => void;
|
|
11
|
+
clear: () => void;
|
|
12
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
//#region resources/js/table/use-table-selection.ts
|
|
3
|
+
function useTableSelection(keys) {
|
|
4
|
+
const [selected, setSelected] = useState(() => /* @__PURE__ */ new Set());
|
|
5
|
+
const [allMatching, setAllMatching] = useState(false);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
setSelected(/* @__PURE__ */ new Set());
|
|
8
|
+
setAllMatching(false);
|
|
9
|
+
}, [keys.join(" ")]);
|
|
10
|
+
const toggle = useCallback((key) => {
|
|
11
|
+
setAllMatching(false);
|
|
12
|
+
setSelected((current) => {
|
|
13
|
+
const next = new Set(current);
|
|
14
|
+
if (next.has(key)) next.delete(key);
|
|
15
|
+
else next.add(key);
|
|
16
|
+
return next;
|
|
17
|
+
});
|
|
18
|
+
}, []);
|
|
19
|
+
const toggleAll = useCallback(() => {
|
|
20
|
+
setAllMatching(false);
|
|
21
|
+
setSelected((current) => current.size === keys.length ? /* @__PURE__ */ new Set() : new Set(keys));
|
|
22
|
+
}, [keys]);
|
|
23
|
+
const selectAllMatching = useCallback(() => setAllMatching(true), []);
|
|
24
|
+
const clear = useCallback(() => {
|
|
25
|
+
setAllMatching(false);
|
|
26
|
+
setSelected(/* @__PURE__ */ new Set());
|
|
27
|
+
}, []);
|
|
28
|
+
const selectedKeys = keys.filter((key) => selected.has(key));
|
|
29
|
+
const allVisibleSelected = keys.length > 0 && selectedKeys.length === keys.length;
|
|
30
|
+
return {
|
|
31
|
+
selectedKeys,
|
|
32
|
+
allMatching,
|
|
33
|
+
allVisibleSelected,
|
|
34
|
+
allSelected: allMatching || allVisibleSelected,
|
|
35
|
+
active: allMatching || selectedKeys.length > 0,
|
|
36
|
+
isSelected: (key) => allMatching || selected.has(key),
|
|
37
|
+
toggle,
|
|
38
|
+
toggleAll,
|
|
39
|
+
selectAllMatching,
|
|
40
|
+
clear
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { useTableSelection };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=use-table-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-table-selection.js","names":[],"sources":["../../resources/js/table/use-table-selection.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\nexport function useTableSelection(keys: string[]) {\n const [selected, setSelected] = useState<Set<string>>(() => new Set());\n const [allMatching, setAllMatching] = useState(false);\n const signature = keys.join(\" \");\n\n useEffect(() => {\n setSelected(new Set());\n setAllMatching(false);\n }, [signature]);\n\n const toggle = useCallback((key: string): void => {\n setAllMatching(false);\n setSelected((current) => {\n const next = new Set(current);\n\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n\n return next;\n });\n }, []);\n\n const toggleAll = useCallback((): void => {\n setAllMatching(false);\n setSelected((current) => (current.size === keys.length ? new Set() : new Set(keys)));\n }, [keys]);\n\n const selectAllMatching = useCallback((): void => setAllMatching(true), []);\n\n const clear = useCallback((): void => {\n setAllMatching(false);\n setSelected(new Set());\n }, []);\n\n const selectedKeys = keys.filter((key) => selected.has(key));\n const allVisibleSelected = keys.length > 0 && selectedKeys.length === keys.length;\n\n return {\n selectedKeys,\n allMatching,\n allVisibleSelected,\n allSelected: allMatching || allVisibleSelected,\n active: allMatching || selectedKeys.length > 0,\n isSelected: (key: string): boolean => allMatching || selected.has(key),\n toggle,\n toggleAll,\n selectAllMatching,\n clear,\n };\n}\n"],"mappings":";;AAEA,SAAgB,kBAAkB,MAAgB;CAChD,MAAM,CAAC,UAAU,eAAe,+BAA4B,IAAI,IAAI,CAAC;CACrE,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAGpD,gBAAgB;EACd,4BAAY,IAAI,IAAI,CAAC;EACrB,eAAe,KAAK;CACtB,GAAG,CALe,KAAK,KAAK,GAKxB,CAAS,CAAC;CAEd,MAAM,SAAS,aAAa,QAAsB;EAChD,eAAe,KAAK;EACpB,aAAa,YAAY;GACvB,MAAM,OAAO,IAAI,IAAI,OAAO;GAE5B,IAAI,KAAK,IAAI,GAAG,GACd,KAAK,OAAO,GAAG;QAEf,KAAK,IAAI,GAAG;GAGd,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,YAAY,kBAAwB;EACxC,eAAe,KAAK;EACpB,aAAa,YAAa,QAAQ,SAAS,KAAK,yBAAS,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAE;CACrF,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,oBAAoB,kBAAwB,eAAe,IAAI,GAAG,CAAC,CAAC;CAE1E,MAAM,QAAQ,kBAAwB;EACpC,eAAe,KAAK;EACpB,4BAAY,IAAI,IAAI,CAAC;CACvB,GAAG,CAAC,CAAC;CAEL,MAAM,eAAe,KAAK,QAAQ,QAAQ,SAAS,IAAI,GAAG,CAAC;CAC3D,MAAM,qBAAqB,KAAK,SAAS,KAAK,aAAa,WAAW,KAAK;CAE3E,OAAO;EACL;EACA;EACA;EACA,aAAa,eAAe;EAC5B,QAAQ,eAAe,aAAa,SAAS;EAC7C,aAAa,QAAyB,eAAe,SAAS,IAAI,GAAG;EACrE;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Node } from '../../../core/types';
|
|
2
|
+
import { FilterClause, TableColumn, TableSort, TableState } from './types';
|
|
3
|
+
export declare function useTable(node: Node<"table">): {
|
|
4
|
+
columns: TableColumn[];
|
|
5
|
+
rows: import('./types').TableRow[];
|
|
6
|
+
pagination: import('./types').TablePagination;
|
|
7
|
+
state: TableState;
|
|
8
|
+
filters: FilterClause[];
|
|
9
|
+
addFilter: (clause: FilterClause) => void;
|
|
10
|
+
updateFilter: (index: number, clause: FilterClause) => void;
|
|
11
|
+
removeFilter: (index: number) => void;
|
|
12
|
+
processing: boolean;
|
|
13
|
+
hasLoaded: boolean;
|
|
14
|
+
infiniteLoaderRef: import('react').RefObject<HTMLDivElement | null>;
|
|
15
|
+
sort: (column: TableColumn) => void;
|
|
16
|
+
clearSort: (sort: TableSort) => void;
|
|
17
|
+
goToPage: (page: number) => void;
|
|
18
|
+
loadMore: () => void;
|
|
19
|
+
};
|