@cratis/scene.blueprint.default 4.38.0 → 4.40.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/ComponentName.ts +27 -0
- package/defaultBlueprintComponents.ts +10 -1
- package/dist/cjs/ComponentName.js +9 -0
- package/dist/cjs/ComponentName.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponents.js +19 -1
- package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
- package/dist/cjs/foundation/BulkBar.js +62 -0
- package/dist/cjs/foundation/BulkBar.js.map +1 -0
- package/dist/cjs/foundation/DataList.js +436 -0
- package/dist/cjs/foundation/DataList.js.map +1 -0
- package/dist/cjs/foundation/FormScreenBody.js +447 -0
- package/dist/cjs/foundation/FormScreenBody.js.map +1 -0
- package/dist/cjs/foundation/FoundationStates.js +2 -1
- package/dist/cjs/foundation/FoundationStates.js.map +1 -1
- package/dist/cjs/foundation/GlobalSearch.js +54 -0
- package/dist/cjs/foundation/GlobalSearch.js.map +1 -0
- package/dist/cjs/foundation/KanbanBoard.js +222 -0
- package/dist/cjs/foundation/KanbanBoard.js.map +1 -0
- package/dist/cjs/foundation/NotificationsButton.js +45 -0
- package/dist/cjs/foundation/NotificationsButton.js.map +1 -0
- package/dist/cjs/foundation/SubNavigation.js +72 -0
- package/dist/cjs/foundation/SubNavigation.js.map +1 -0
- package/dist/cjs/foundation/TabSet.js +101 -0
- package/dist/cjs/foundation/TabSet.js.map +1 -0
- package/dist/cjs/foundation/WizardProgress.js +185 -0
- package/dist/cjs/foundation/WizardProgress.js.map +1 -0
- package/dist/cjs/foundation/boardModel.js +67 -0
- package/dist/cjs/foundation/boardModel.js.map +1 -0
- package/dist/cjs/foundation/formModel.js +158 -0
- package/dist/cjs/foundation/formModel.js.map +1 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js +54 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
- package/dist/cjs/foundation/foundationDescriptors.js +400 -0
- package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
- package/dist/cjs/foundation/foundationSamples.js +303 -0
- package/dist/cjs/foundation/foundationSamples.js.map +1 -1
- package/dist/cjs/foundation/foundationStrings.js +72 -0
- package/dist/cjs/foundation/foundationStrings.js.map +1 -1
- package/dist/cjs/foundation/listModel.js +200 -0
- package/dist/cjs/foundation/listModel.js.map +1 -0
- package/dist/cjs/foundation/tabModel.js +41 -0
- package/dist/cjs/foundation/tabModel.js.map +1 -0
- package/dist/cjs/foundation/urlState.js +57 -0
- package/dist/cjs/foundation/urlState.js.map +1 -0
- package/dist/cjs/foundation/useCompactWidth.js +23 -0
- package/dist/cjs/foundation/useCompactWidth.js.map +1 -0
- package/dist/cjs/foundation/wizardModel.js +50 -0
- package/dist/cjs/foundation/wizardModel.js.map +1 -0
- package/dist/cjs/index.js +71 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/ComponentName.d.ts +10 -1
- package/dist/esm/ComponentName.d.ts.map +1 -1
- package/dist/esm/ComponentName.js +9 -0
- package/dist/esm/ComponentName.js.map +1 -1
- package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
- package/dist/esm/defaultBlueprintComponents.js +19 -1
- package/dist/esm/defaultBlueprintComponents.js.map +1 -1
- package/dist/esm/foundation/BulkBar.d.ts +4 -0
- package/dist/esm/foundation/BulkBar.d.ts.map +1 -0
- package/dist/esm/foundation/BulkBar.js +59 -0
- package/dist/esm/foundation/BulkBar.js.map +1 -0
- package/dist/esm/foundation/DataList.d.ts +3 -0
- package/dist/esm/foundation/DataList.d.ts.map +1 -0
- package/dist/esm/foundation/DataList.js +434 -0
- package/dist/esm/foundation/DataList.js.map +1 -0
- package/dist/esm/foundation/FormScreenBody.d.ts +3 -0
- package/dist/esm/foundation/FormScreenBody.d.ts.map +1 -0
- package/dist/esm/foundation/FormScreenBody.js +445 -0
- package/dist/esm/foundation/FormScreenBody.js.map +1 -0
- package/dist/esm/foundation/FoundationStates.js +2 -1
- package/dist/esm/foundation/FoundationStates.js.map +1 -1
- package/dist/esm/foundation/GlobalSearch.d.ts +3 -0
- package/dist/esm/foundation/GlobalSearch.d.ts.map +1 -0
- package/dist/esm/foundation/GlobalSearch.js +52 -0
- package/dist/esm/foundation/GlobalSearch.js.map +1 -0
- package/dist/esm/foundation/KanbanBoard.d.ts +3 -0
- package/dist/esm/foundation/KanbanBoard.d.ts.map +1 -0
- package/dist/esm/foundation/KanbanBoard.js +220 -0
- package/dist/esm/foundation/KanbanBoard.js.map +1 -0
- package/dist/esm/foundation/NotificationsButton.d.ts +3 -0
- package/dist/esm/foundation/NotificationsButton.d.ts.map +1 -0
- package/dist/esm/foundation/NotificationsButton.js +43 -0
- package/dist/esm/foundation/NotificationsButton.js.map +1 -0
- package/dist/esm/foundation/SubNavigation.d.ts +3 -0
- package/dist/esm/foundation/SubNavigation.d.ts.map +1 -0
- package/dist/esm/foundation/SubNavigation.js +70 -0
- package/dist/esm/foundation/SubNavigation.js.map +1 -0
- package/dist/esm/foundation/TabSet.d.ts +3 -0
- package/dist/esm/foundation/TabSet.d.ts.map +1 -0
- package/dist/esm/foundation/TabSet.js +99 -0
- package/dist/esm/foundation/TabSet.js.map +1 -0
- package/dist/esm/foundation/WizardProgress.d.ts +3 -0
- package/dist/esm/foundation/WizardProgress.d.ts.map +1 -0
- package/dist/esm/foundation/WizardProgress.js +183 -0
- package/dist/esm/foundation/WizardProgress.js.map +1 -0
- package/dist/esm/foundation/boardModel.d.ts +22 -0
- package/dist/esm/foundation/boardModel.d.ts.map +1 -0
- package/dist/esm/foundation/boardModel.js +61 -0
- package/dist/esm/foundation/boardModel.js.map +1 -0
- package/dist/esm/foundation/formModel.d.ts +48 -0
- package/dist/esm/foundation/formModel.d.ts.map +1 -0
- package/dist/esm/foundation/formModel.js +147 -0
- package/dist/esm/foundation/formModel.js.map +1 -0
- package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
- package/dist/esm/foundation/foundationComponentMetadata.js +54 -0
- package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
- package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
- package/dist/esm/foundation/foundationDescriptors.js +400 -0
- package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
- package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
- package/dist/esm/foundation/foundationSamples.js +303 -0
- package/dist/esm/foundation/foundationSamples.js.map +1 -1
- package/dist/esm/foundation/foundationStrings.d.ts +72 -0
- package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
- package/dist/esm/foundation/foundationStrings.js +72 -0
- package/dist/esm/foundation/foundationStrings.js.map +1 -1
- package/dist/esm/foundation/index.d.ts +16 -0
- package/dist/esm/foundation/index.d.ts.map +1 -1
- package/dist/esm/foundation/index.js +16 -0
- package/dist/esm/foundation/index.js.map +1 -1
- package/dist/esm/foundation/listModel.d.ts +49 -0
- package/dist/esm/foundation/listModel.d.ts.map +1 -0
- package/dist/esm/foundation/listModel.js +183 -0
- package/dist/esm/foundation/listModel.js.map +1 -0
- package/dist/esm/foundation/tabModel.d.ts +10 -0
- package/dist/esm/foundation/tabModel.d.ts.map +1 -0
- package/dist/esm/foundation/tabModel.js +37 -0
- package/dist/esm/foundation/tabModel.js.map +1 -0
- package/dist/esm/foundation/urlState.d.ts +4 -0
- package/dist/esm/foundation/urlState.d.ts.map +1 -0
- package/dist/esm/foundation/urlState.js +53 -0
- package/dist/esm/foundation/urlState.js.map +1 -0
- package/dist/esm/foundation/useCompactWidth.d.ts +3 -0
- package/dist/esm/foundation/useCompactWidth.d.ts.map +1 -0
- package/dist/esm/foundation/useCompactWidth.js +20 -0
- package/dist/esm/foundation/useCompactWidth.js.map +1 -0
- package/dist/esm/foundation/wizardModel.d.ts +16 -0
- package/dist/esm/foundation/wizardModel.d.ts.map +1 -0
- package/dist/esm/foundation/wizardModel.js +43 -0
- package/dist/esm/foundation/wizardModel.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/foundation/BulkBar.tsx +38 -0
- package/foundation/DataList.tsx +208 -0
- package/foundation/FormScreenBody.tsx +196 -0
- package/foundation/FoundationStates.tsx +1 -1
- package/foundation/GlobalSearch.tsx +33 -0
- package/foundation/KanbanBoard.tsx +97 -0
- package/foundation/NotificationsButton.tsx +28 -0
- package/foundation/SubNavigation.tsx +49 -0
- package/foundation/TabSet.tsx +65 -0
- package/foundation/WizardProgress.tsx +109 -0
- package/foundation/boardModel.ts +64 -0
- package/foundation/formModel.ts +146 -0
- package/foundation/foundationComponentMetadata.ts +9 -0
- package/foundation/foundationDescriptors.ts +195 -0
- package/foundation/foundationSamples.ts +56 -0
- package/foundation/foundationStrings.ts +72 -0
- package/foundation/index.ts +16 -0
- package/foundation/listModel.ts +190 -0
- package/foundation/tabModel.ts +41 -0
- package/foundation/urlState.ts +52 -0
- package/foundation/useCompactWidth.ts +23 -0
- package/foundation/wizardModel.ts +54 -0
- package/package.json +8 -8
- package/shell/layout.css +513 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var scene_react = require('@cratis/scene.react');
|
|
6
|
+
var elementProperties = require('../shell/elementProperties.js');
|
|
7
|
+
var ComponentState = require('./ComponentState.js');
|
|
8
|
+
var FoundationIcon = require('./FoundationIcon.js');
|
|
9
|
+
var StateFrame = require('./StateFrame.js');
|
|
10
|
+
var formatting = require('./formatting.js');
|
|
11
|
+
var foundationStrings = require('./foundationStrings.js');
|
|
12
|
+
var PermissionRule = require('./PermissionRule.js');
|
|
13
|
+
var listModel = require('./listModel.js');
|
|
14
|
+
var useCompactWidth = require('./useCompactWidth.js');
|
|
15
|
+
var urlState = require('./urlState.js');
|
|
16
|
+
|
|
17
|
+
function Cell({ column, row, locale }) {
|
|
18
|
+
const raw = row[column.field];
|
|
19
|
+
const text = listModel.textOf(row, column.field);
|
|
20
|
+
switch(column.kind){
|
|
21
|
+
case listModel.CellKind.Number:
|
|
22
|
+
return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
23
|
+
children: typeof raw === 'number' ? formatting.formatNumber(raw, locale) : text
|
|
24
|
+
});
|
|
25
|
+
case listModel.CellKind.Currency:
|
|
26
|
+
return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
27
|
+
children: typeof raw === 'number' ? formatting.formatNumber(raw, locale, formatting.NumberFormat.Currency, column.currency ?? 'USD') : text
|
|
28
|
+
});
|
|
29
|
+
case listModel.CellKind.Date:
|
|
30
|
+
return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
31
|
+
children: formatting.formatDate(raw, locale)
|
|
32
|
+
});
|
|
33
|
+
case listModel.CellKind.Status:
|
|
34
|
+
{
|
|
35
|
+
const tone = column.tones[text] ?? 'neutral';
|
|
36
|
+
const icon = {
|
|
37
|
+
success: 'check',
|
|
38
|
+
warning: 'alert',
|
|
39
|
+
danger: 'close',
|
|
40
|
+
info: 'info',
|
|
41
|
+
neutral: 'circle'
|
|
42
|
+
}[tone] ?? 'circle';
|
|
43
|
+
return /*#__PURE__*/ jsxRuntime.jsxs("span", {
|
|
44
|
+
className: "foundation-chip",
|
|
45
|
+
"data-tone": tone,
|
|
46
|
+
children: [
|
|
47
|
+
/*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
48
|
+
name: icon
|
|
49
|
+
}),
|
|
50
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
51
|
+
children: text
|
|
52
|
+
})
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
58
|
+
children: text
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The `dataList` component: the records of a collection as a table, as cards, or grouped with subtotals, with search, sort, paging and
|
|
64
|
+
* selection that live in the address.
|
|
65
|
+
*
|
|
66
|
+
* `rows` and `columns` (`field`, `header`, `kind`: text, number, currency, date or status, `sortable`, `tones`) come from a query; the list takes its
|
|
67
|
+
* text, filter, sort, page and selection from the address when `urlKey` is given (`<urlKey>q`, `sort`, `page`, `selected`), so a shared link or a refresh restores
|
|
68
|
+
* the screen as it was. `search` and `filter` (the filter builder's value) narrow the rows. A header is a button that cycles ascending, descending, none, and the
|
|
69
|
+
* column says so in words. Rows select with checkboxes (`selectionMode` multiple or single), and a row's "Actions" menu names its row. On a phone a table becomes cards -
|
|
70
|
+
* nothing is hidden or cut. The selection is the `value` output; a row action is the `action` output. Header, row and cell elements are real table elements,
|
|
71
|
+
* so a screen reader announces the row and column of the cell it is on.
|
|
72
|
+
*/ function DataList({ element, interactions, bindingOutputs }) {
|
|
73
|
+
const columns = react.useMemo(()=>listModel.readListColumns(element.properties.columns), [
|
|
74
|
+
element.properties.columns
|
|
75
|
+
]);
|
|
76
|
+
const rows = react.useMemo(()=>Array.isArray(element.properties.rows) ? element.properties.rows.filter((row)=>typeof row === 'object' && row !== null && !Array.isArray(row)) : [], [
|
|
77
|
+
element.properties.rows
|
|
78
|
+
]);
|
|
79
|
+
const idField = elementProperties.readOptionalString(element, 'idField') ?? 'id';
|
|
80
|
+
const titleField = elementProperties.readOptionalString(element, 'titleField') ?? columns[0]?.field ?? idField;
|
|
81
|
+
const urlKey = elementProperties.readOptionalString(element, 'urlKey');
|
|
82
|
+
const keyed = (name)=>urlKey === undefined ? undefined : `${urlKey}${name}`;
|
|
83
|
+
const [searchText, setSearchText] = urlState.useUrlState(keyed('q'), elementProperties.readOptionalString(element, 'search'));
|
|
84
|
+
const [sortText, setSortText] = urlState.useUrlState(keyed('sort'), elementProperties.readOptionalString(element, 'sort'));
|
|
85
|
+
const [pageText, setPageText] = urlState.useUrlState(keyed('page'), '1');
|
|
86
|
+
const [selectedText, setSelectedText] = urlState.useUrlState(keyed('selected'), elementProperties.readOptionalString(element, 'selected'));
|
|
87
|
+
const [openGroups, setOpenGroups] = react.useState();
|
|
88
|
+
const strings = foundationStrings.readFoundationStrings(element);
|
|
89
|
+
const locale = formatting.readLocale(element);
|
|
90
|
+
const compact = useCompactWidth.useCompactWidth();
|
|
91
|
+
const requestedVariant = listModel.readListVariant(element.properties.variant);
|
|
92
|
+
const variant = requestedVariant === listModel.ListVariant.Table && compact && element.properties.collapse !== false ? listModel.ListVariant.Cards : requestedVariant;
|
|
93
|
+
const pageSize = typeof element.properties.pageSize === 'number' ? element.properties.pageSize : 0;
|
|
94
|
+
const multiple = element.properties.selectionMode !== 'single';
|
|
95
|
+
const selectable = element.properties.selectionMode === 'multiple' || element.properties.selectionMode === 'single';
|
|
96
|
+
const actions = Array.isArray(element.properties.rowActions) ? element.properties.rowActions.filter((action)=>typeof action === 'string') : [];
|
|
97
|
+
const actionRule = PermissionRule.readPermissionRule(element, 'actionPermission');
|
|
98
|
+
const groupBy = elementProperties.readOptionalString(element, 'groupBy');
|
|
99
|
+
const totalField = elementProperties.readOptionalString(element, 'totalField');
|
|
100
|
+
const sort = listModel.parseSort(sortText, columns);
|
|
101
|
+
const matching = react.useMemo(()=>listModel.filterRows(listModel.searchRows(rows, columns, searchText ?? ''), element.properties.filter), [
|
|
102
|
+
rows,
|
|
103
|
+
columns,
|
|
104
|
+
searchText,
|
|
105
|
+
element.properties.filter
|
|
106
|
+
]);
|
|
107
|
+
const sorted = react.useMemo(()=>listModel.sortRows(matching, sort, locale), [
|
|
108
|
+
matching,
|
|
109
|
+
sort?.field,
|
|
110
|
+
sort?.descending,
|
|
111
|
+
locale
|
|
112
|
+
]);
|
|
113
|
+
const page = listModel.paginate(sorted, Number(pageText), variant === listModel.ListVariant.Grouped ? 0 : pageSize);
|
|
114
|
+
const selected = listModel.parseSelection(selectedText);
|
|
115
|
+
const state = ComponentState.readComponentState(element, rows.length > 0);
|
|
116
|
+
react.useEffect(()=>{
|
|
117
|
+
if (Number(pageText) !== page.page && pageText !== undefined) setPageText(String(page.page));
|
|
118
|
+
}, [
|
|
119
|
+
page.page,
|
|
120
|
+
pageText,
|
|
121
|
+
setPageText
|
|
122
|
+
]);
|
|
123
|
+
scene_react.useValueOutput(bindingOutputs, multiple ? selected : selected[0]);
|
|
124
|
+
const select = (id)=>{
|
|
125
|
+
setSelectedText(listModel.toggleSelection(selected, id, multiple).join(',') || undefined);
|
|
126
|
+
interactions?.onSelect?.();
|
|
127
|
+
};
|
|
128
|
+
const run = (action, id)=>{
|
|
129
|
+
bindingOutputs?.setOutput('action', {
|
|
130
|
+
action,
|
|
131
|
+
row: id
|
|
132
|
+
});
|
|
133
|
+
interactions?.onClick?.({
|
|
134
|
+
stopPropagation: ()=>undefined
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
const sortLabel = (column)=>sort?.field === column.field ? `${column.header}, ${sort.descending ? strings.listSortedDescending : strings.listSortedAscending}` : column.header;
|
|
138
|
+
const nameOf = (row, index)=>listModel.textOf(row, titleField) || listModel.rowId(row, index, idField);
|
|
139
|
+
const allOnPage = page.rows.length > 0 && page.rows.every((row, index)=>selected.includes(listModel.rowId(row, index, idField)));
|
|
140
|
+
const count = matching.length === rows.length ? foundationStrings.formatText(strings.listCount, {
|
|
141
|
+
count: rows.length
|
|
142
|
+
}) : foundationStrings.formatText(strings.listCountFiltered, {
|
|
143
|
+
shown: matching.length,
|
|
144
|
+
total: rows.length
|
|
145
|
+
});
|
|
146
|
+
const rowActions = (row, index)=>actions.length === 0 || actionRule === 'hidden' ? undefined : /*#__PURE__*/ jsxRuntime.jsxs("select", {
|
|
147
|
+
className: "foundation-row-actions",
|
|
148
|
+
"aria-label": foundationStrings.formatText(strings.listRowActions, {
|
|
149
|
+
name: nameOf(row, index)
|
|
150
|
+
}),
|
|
151
|
+
value: "",
|
|
152
|
+
disabled: actionRule === 'disabled',
|
|
153
|
+
title: actionRule === 'disabled' ? strings.disabledNoPermission : undefined,
|
|
154
|
+
onChange: (event)=>{
|
|
155
|
+
if (event.target.value) run(event.target.value, listModel.rowId(row, index, idField));
|
|
156
|
+
},
|
|
157
|
+
children: [
|
|
158
|
+
/*#__PURE__*/ jsxRuntime.jsx("option", {
|
|
159
|
+
value: "",
|
|
160
|
+
children: strings.listActions
|
|
161
|
+
}),
|
|
162
|
+
actions.map((action)=>/*#__PURE__*/ jsxRuntime.jsx("option", {
|
|
163
|
+
value: action,
|
|
164
|
+
children: action
|
|
165
|
+
}, action))
|
|
166
|
+
]
|
|
167
|
+
});
|
|
168
|
+
const checkbox = (row, index)=>!selectable ? undefined : /*#__PURE__*/ jsxRuntime.jsx("input", {
|
|
169
|
+
type: multiple ? 'checkbox' : 'radio',
|
|
170
|
+
name: `${element.id}-select`,
|
|
171
|
+
checked: selected.includes(listModel.rowId(row, index, idField)),
|
|
172
|
+
"aria-label": foundationStrings.formatText(strings.listSelectRow, {
|
|
173
|
+
name: nameOf(row, index)
|
|
174
|
+
}),
|
|
175
|
+
onChange: ()=>select(listModel.rowId(row, index, idField))
|
|
176
|
+
});
|
|
177
|
+
const table = (tableRows, offset = 0, caption)=>/*#__PURE__*/ jsxRuntime.jsx("div", {
|
|
178
|
+
className: "foundation-table-scroll",
|
|
179
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs("table", {
|
|
180
|
+
className: "foundation-table",
|
|
181
|
+
children: [
|
|
182
|
+
/*#__PURE__*/ jsxRuntime.jsx("caption", {
|
|
183
|
+
className: "foundation-visually-hidden",
|
|
184
|
+
children: caption ?? elementProperties.readOptionalString(element, 'label') ?? strings.listTable
|
|
185
|
+
}),
|
|
186
|
+
/*#__PURE__*/ jsxRuntime.jsx("thead", {
|
|
187
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs("tr", {
|
|
188
|
+
children: [
|
|
189
|
+
selectable && /*#__PURE__*/ jsxRuntime.jsx("th", {
|
|
190
|
+
scope: "col",
|
|
191
|
+
className: "foundation-table-select",
|
|
192
|
+
children: multiple && /*#__PURE__*/ jsxRuntime.jsx("input", {
|
|
193
|
+
type: "checkbox",
|
|
194
|
+
checked: allOnPage,
|
|
195
|
+
"aria-label": strings.listSelectAll,
|
|
196
|
+
onChange: ()=>setSelectedText((allOnPage ? selected.filter((id)=>!page.rows.some((row, index)=>listModel.rowId(row, index, idField) === id)) : [
|
|
197
|
+
...new Set([
|
|
198
|
+
...selected,
|
|
199
|
+
...page.rows.map((row, index)=>listModel.rowId(row, index, idField))
|
|
200
|
+
])
|
|
201
|
+
]).join(',') || undefined)
|
|
202
|
+
})
|
|
203
|
+
}),
|
|
204
|
+
columns.map((column)=>/*#__PURE__*/ jsxRuntime.jsx("th", {
|
|
205
|
+
scope: "col",
|
|
206
|
+
"aria-sort": sort?.field === column.field ? sort.descending ? 'descending' : 'ascending' : undefined,
|
|
207
|
+
children: column.sortable ? /*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
208
|
+
type: "button",
|
|
209
|
+
className: "foundation-sort",
|
|
210
|
+
"aria-label": foundationStrings.formatText(strings.listSortBy, {
|
|
211
|
+
column: sortLabel(column)
|
|
212
|
+
}),
|
|
213
|
+
onClick: ()=>{
|
|
214
|
+
setSortText(listModel.formatSort(listModel.nextSort(sort, column.field)));
|
|
215
|
+
setPageText('1');
|
|
216
|
+
},
|
|
217
|
+
children: [
|
|
218
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
219
|
+
children: column.header
|
|
220
|
+
}),
|
|
221
|
+
sort?.field === column.field && /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
222
|
+
name: sort.descending ? 'arrow-down' : 'arrow-up'
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
}) : column.header
|
|
226
|
+
}, column.field)),
|
|
227
|
+
actions.length > 0 && actionRule !== 'hidden' && /*#__PURE__*/ jsxRuntime.jsx("th", {
|
|
228
|
+
scope: "col",
|
|
229
|
+
children: /*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
230
|
+
className: "foundation-visually-hidden",
|
|
231
|
+
children: strings.listActions
|
|
232
|
+
})
|
|
233
|
+
})
|
|
234
|
+
]
|
|
235
|
+
})
|
|
236
|
+
}),
|
|
237
|
+
/*#__PURE__*/ jsxRuntime.jsx("tbody", {
|
|
238
|
+
children: tableRows.map((row, position)=>{
|
|
239
|
+
const index = offset + position;
|
|
240
|
+
const id = listModel.rowId(row, index, idField);
|
|
241
|
+
return /*#__PURE__*/ jsxRuntime.jsxs("tr", {
|
|
242
|
+
"aria-selected": selectable ? selected.includes(id) : undefined,
|
|
243
|
+
"data-selected": selected.includes(id),
|
|
244
|
+
children: [
|
|
245
|
+
selectable && /*#__PURE__*/ jsxRuntime.jsx("td", {
|
|
246
|
+
className: "foundation-table-select",
|
|
247
|
+
children: checkbox(row, index)
|
|
248
|
+
}),
|
|
249
|
+
columns.map((column, columnIndex)=>columnIndex === 0 ? /*#__PURE__*/ jsxRuntime.jsx("th", {
|
|
250
|
+
scope: "row",
|
|
251
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Cell, {
|
|
252
|
+
column: column,
|
|
253
|
+
row: row,
|
|
254
|
+
locale: locale
|
|
255
|
+
})
|
|
256
|
+
}, column.field) : /*#__PURE__*/ jsxRuntime.jsx("td", {
|
|
257
|
+
"data-kind": column.kind,
|
|
258
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Cell, {
|
|
259
|
+
column: column,
|
|
260
|
+
row: row,
|
|
261
|
+
locale: locale
|
|
262
|
+
})
|
|
263
|
+
}, column.field)),
|
|
264
|
+
actions.length > 0 && actionRule !== 'hidden' && /*#__PURE__*/ jsxRuntime.jsx("td", {
|
|
265
|
+
children: rowActions(row, index)
|
|
266
|
+
})
|
|
267
|
+
]
|
|
268
|
+
}, id);
|
|
269
|
+
})
|
|
270
|
+
})
|
|
271
|
+
]
|
|
272
|
+
})
|
|
273
|
+
});
|
|
274
|
+
const cards = (cardRows, offset = 0)=>/*#__PURE__*/ jsxRuntime.jsx("ul", {
|
|
275
|
+
className: "foundation-cards",
|
|
276
|
+
"aria-label": elementProperties.readOptionalString(element, 'label') ?? strings.listCards,
|
|
277
|
+
children: cardRows.map((row, position)=>{
|
|
278
|
+
const index = offset + position;
|
|
279
|
+
const id = listModel.rowId(row, index, idField);
|
|
280
|
+
return /*#__PURE__*/ jsxRuntime.jsxs("li", {
|
|
281
|
+
className: "foundation-card-row",
|
|
282
|
+
"data-selected": selected.includes(id),
|
|
283
|
+
children: [
|
|
284
|
+
/*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
285
|
+
className: "foundation-card-head",
|
|
286
|
+
children: [
|
|
287
|
+
checkbox(row, index),
|
|
288
|
+
/*#__PURE__*/ jsxRuntime.jsx("strong", {
|
|
289
|
+
children: nameOf(row, index)
|
|
290
|
+
})
|
|
291
|
+
]
|
|
292
|
+
}),
|
|
293
|
+
/*#__PURE__*/ jsxRuntime.jsx("dl", {
|
|
294
|
+
children: columns.filter((column)=>column.field !== titleField).map((column)=>/*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
295
|
+
children: [
|
|
296
|
+
/*#__PURE__*/ jsxRuntime.jsx("dt", {
|
|
297
|
+
className: "foundation-count",
|
|
298
|
+
children: column.header
|
|
299
|
+
}),
|
|
300
|
+
/*#__PURE__*/ jsxRuntime.jsx("dd", {
|
|
301
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(Cell, {
|
|
302
|
+
column: column,
|
|
303
|
+
row: row,
|
|
304
|
+
locale: locale
|
|
305
|
+
})
|
|
306
|
+
})
|
|
307
|
+
]
|
|
308
|
+
}, column.field))
|
|
309
|
+
}),
|
|
310
|
+
rowActions(row, index)
|
|
311
|
+
]
|
|
312
|
+
}, id);
|
|
313
|
+
})
|
|
314
|
+
});
|
|
315
|
+
const groups = variant === listModel.ListVariant.Grouped && groupBy ? listModel.groupRows(sorted, groupBy, totalField) : [];
|
|
316
|
+
const isOpen = (key)=>openGroups === undefined ? true : openGroups.has(key);
|
|
317
|
+
const toggleGroup = (key)=>setOpenGroups((current)=>{
|
|
318
|
+
const base = current ?? new Set(groups.map((group)=>group.key));
|
|
319
|
+
const next = new Set(base);
|
|
320
|
+
if (next.has(key)) next.delete(key);
|
|
321
|
+
else next.add(key);
|
|
322
|
+
return next;
|
|
323
|
+
});
|
|
324
|
+
const totalColumn = columns.find((column)=>column.field === totalField);
|
|
325
|
+
return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
|
|
326
|
+
element: element,
|
|
327
|
+
interactions: interactions,
|
|
328
|
+
name: "data-list",
|
|
329
|
+
state: state,
|
|
330
|
+
skeleton: [
|
|
331
|
+
100,
|
|
332
|
+
100,
|
|
333
|
+
100,
|
|
334
|
+
100
|
|
335
|
+
],
|
|
336
|
+
children: (state === ComponentState.ComponentState.Ready || state === ComponentState.ComponentState.Partial) && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
337
|
+
children: [
|
|
338
|
+
/*#__PURE__*/ jsxRuntime.jsx("p", {
|
|
339
|
+
className: "foundation-count",
|
|
340
|
+
role: "status",
|
|
341
|
+
children: count
|
|
342
|
+
}),
|
|
343
|
+
matching.length === 0 ? /*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
344
|
+
className: "foundation-empty",
|
|
345
|
+
role: "status",
|
|
346
|
+
children: [
|
|
347
|
+
/*#__PURE__*/ jsxRuntime.jsx("strong", {
|
|
348
|
+
className: "foundation-empty-headline",
|
|
349
|
+
children: strings.listNoMatches
|
|
350
|
+
}),
|
|
351
|
+
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
352
|
+
type: "button",
|
|
353
|
+
className: "foundation-link",
|
|
354
|
+
onClick: ()=>{
|
|
355
|
+
setSearchText(undefined);
|
|
356
|
+
setPageText('1');
|
|
357
|
+
interactions?.onChange?.();
|
|
358
|
+
},
|
|
359
|
+
children: strings.listClearSearch
|
|
360
|
+
})
|
|
361
|
+
]
|
|
362
|
+
}) : variant === listModel.ListVariant.Grouped && groupBy ? groups.map((group)=>/*#__PURE__*/ jsxRuntime.jsxs("section", {
|
|
363
|
+
className: "foundation-list-group",
|
|
364
|
+
children: [
|
|
365
|
+
/*#__PURE__*/ jsxRuntime.jsxs("h3", {
|
|
366
|
+
children: [
|
|
367
|
+
/*#__PURE__*/ jsxRuntime.jsxs("button", {
|
|
368
|
+
type: "button",
|
|
369
|
+
"aria-expanded": isOpen(group.key),
|
|
370
|
+
className: "foundation-sort",
|
|
371
|
+
onClick: ()=>toggleGroup(group.key),
|
|
372
|
+
"aria-label": foundationStrings.formatText(isOpen(group.key) ? strings.listGroupCollapse : strings.listGroupExpand, {
|
|
373
|
+
group: group.key
|
|
374
|
+
}),
|
|
375
|
+
children: [
|
|
376
|
+
/*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
377
|
+
name: isOpen(group.key) ? 'chevron-down' : 'chevron-right'
|
|
378
|
+
}),
|
|
379
|
+
group.key
|
|
380
|
+
]
|
|
381
|
+
}),
|
|
382
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
383
|
+
className: "foundation-count",
|
|
384
|
+
children: group.subtotal === undefined ? group.rows.length : foundationStrings.formatText(strings.listGroupSubtotal, {
|
|
385
|
+
count: group.rows.length,
|
|
386
|
+
total: formatting.formatNumber(group.subtotal, locale, totalColumn?.kind === listModel.CellKind.Currency ? formatting.NumberFormat.Currency : formatting.NumberFormat.Number, totalColumn?.currency ?? 'USD')
|
|
387
|
+
})
|
|
388
|
+
})
|
|
389
|
+
]
|
|
390
|
+
}),
|
|
391
|
+
isOpen(group.key) && table(group.rows, 0, group.key)
|
|
392
|
+
]
|
|
393
|
+
}, group.key)) : /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
394
|
+
children: [
|
|
395
|
+
variant === listModel.ListVariant.Cards ? cards(page.rows, (page.page - 1) * Math.max(1, pageSize)) : table(page.rows, (page.page - 1) * Math.max(1, pageSize)),
|
|
396
|
+
page.pages > 1 && /*#__PURE__*/ jsxRuntime.jsxs("nav", {
|
|
397
|
+
className: "foundation-pager",
|
|
398
|
+
"aria-label": foundationStrings.formatText(strings.listPage, {
|
|
399
|
+
page: page.page,
|
|
400
|
+
pages: page.pages
|
|
401
|
+
}),
|
|
402
|
+
children: [
|
|
403
|
+
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
404
|
+
type: "button",
|
|
405
|
+
className: "foundation-button",
|
|
406
|
+
"data-emphasis": "secondary",
|
|
407
|
+
disabled: page.page <= 1,
|
|
408
|
+
onClick: ()=>setPageText(String(page.page - 1)),
|
|
409
|
+
children: strings.listPrevious
|
|
410
|
+
}),
|
|
411
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
412
|
+
"aria-current": "page",
|
|
413
|
+
children: foundationStrings.formatText(strings.listPage, {
|
|
414
|
+
page: page.page,
|
|
415
|
+
pages: page.pages
|
|
416
|
+
})
|
|
417
|
+
}),
|
|
418
|
+
/*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
419
|
+
type: "button",
|
|
420
|
+
className: "foundation-button",
|
|
421
|
+
"data-emphasis": "secondary",
|
|
422
|
+
disabled: page.page >= page.pages,
|
|
423
|
+
onClick: ()=>setPageText(String(page.page + 1)),
|
|
424
|
+
children: strings.listNext
|
|
425
|
+
})
|
|
426
|
+
]
|
|
427
|
+
})
|
|
428
|
+
]
|
|
429
|
+
})
|
|
430
|
+
]
|
|
431
|
+
})
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
exports.DataList = DataList;
|
|
436
|
+
//# sourceMappingURL=DataList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataList.js","sources":["../../../foundation/DataList.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon } from './FoundationIcon';\nimport { FoundationFrame } from './StateFrame';\nimport { formatDate, formatNumber, NumberFormat, readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport {\n CellKind, ListColumn, ListRow, ListVariant, filterRows, formatSort, groupRows, nextSort, paginate, parseSelection, parseSort, readListColumns, readListVariant, rowId,\n searchRows, sortRows, textOf, toggleSelection,\n} from './listModel';\nimport { useCompactWidth } from './useCompactWidth';\nimport { useUrlState } from './urlState';\n\nfunction Cell({ column, row, locale }: { column: ListColumn; row: ListRow; locale: string }) {\n const raw = row[column.field];\n const text = textOf(row, column.field);\n switch (column.kind) {\n case CellKind.Number: return <>{typeof raw === 'number' ? formatNumber(raw, locale) : text}</>;\n case CellKind.Currency: return <>{typeof raw === 'number' ? formatNumber(raw, locale, NumberFormat.Currency, column.currency ?? 'USD') : text}</>;\n case CellKind.Date: return <>{formatDate(raw, locale)}</>;\n case CellKind.Status: {\n const tone = column.tones[text] ?? 'neutral';\n const icon = ({ success: 'check', warning: 'alert', danger: 'close', info: 'info', neutral: 'circle' } as const)[tone as 'success'] ?? 'circle';\n return <span className='foundation-chip' data-tone={tone}><FoundationIcon name={icon} /><span>{text}</span></span>;\n }\n default: return <>{text}</>;\n }\n}\n\n/**\n * The `dataList` component: the records of a collection as a table, as cards, or grouped with subtotals, with search, sort, paging and\n * selection that live in the address.\n *\n * `rows` and `columns` (`field`, `header`, `kind`: text, number, currency, date or status, `sortable`, `tones`) come from a query; the list takes its\n * text, filter, sort, page and selection from the address when `urlKey` is given (`<urlKey>q`, `sort`, `page`, `selected`), so a shared link or a refresh restores\n * the screen as it was. `search` and `filter` (the filter builder's value) narrow the rows. A header is a button that cycles ascending, descending, none, and the\n * column says so in words. Rows select with checkboxes (`selectionMode` multiple or single), and a row's \"Actions\" menu names its row. On a phone a table becomes cards -\n * nothing is hidden or cut. The selection is the `value` output; a row action is the `action` output. Header, row and cell elements are real table elements,\n * so a screen reader announces the row and column of the cell it is on.\n */\nexport function DataList({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const columns = useMemo(() => readListColumns(element.properties.columns), [element.properties.columns]);\n const rows = useMemo(() => (Array.isArray(element.properties.rows) ? (element.properties.rows as unknown[]).filter((row): row is ListRow => typeof row === 'object' && row !== null && !Array.isArray(row)) : []), [element.properties.rows]);\n const idField = readOptionalString(element, 'idField') ?? 'id';\n const titleField = readOptionalString(element, 'titleField') ?? columns[0]?.field ?? idField;\n const urlKey = readOptionalString(element, 'urlKey');\n const keyed = (name: string) => (urlKey === undefined ? undefined : `${urlKey}${name}`);\n const [searchText, setSearchText] = useUrlState(keyed('q'), readOptionalString(element, 'search'));\n const [sortText, setSortText] = useUrlState(keyed('sort'), readOptionalString(element, 'sort'));\n const [pageText, setPageText] = useUrlState(keyed('page'), '1');\n const [selectedText, setSelectedText] = useUrlState(keyed('selected'), readOptionalString(element, 'selected'));\n const [openGroups, setOpenGroups] = useState<Set<string> | undefined>();\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const compact = useCompactWidth();\n const requestedVariant = readListVariant(element.properties.variant);\n const variant = requestedVariant === ListVariant.Table && compact && element.properties.collapse !== false ? ListVariant.Cards : requestedVariant;\n const pageSize = typeof element.properties.pageSize === 'number' ? element.properties.pageSize : 0;\n const multiple = element.properties.selectionMode !== 'single';\n const selectable = element.properties.selectionMode === 'multiple' || element.properties.selectionMode === 'single';\n const actions = Array.isArray(element.properties.rowActions) ? element.properties.rowActions.filter((action): action is string => typeof action === 'string') : [];\n const actionRule = readPermissionRule(element, 'actionPermission');\n const groupBy = readOptionalString(element, 'groupBy');\n const totalField = readOptionalString(element, 'totalField');\n const sort = parseSort(sortText, columns);\n\n const matching = useMemo(() => filterRows(searchRows(rows, columns, searchText ?? ''), element.properties.filter), [rows, columns, searchText, element.properties.filter]);\n const sorted = useMemo(() => sortRows(matching, sort, locale), [matching, sort?.field, sort?.descending, locale]);\n const page = paginate(sorted, Number(pageText), variant === ListVariant.Grouped ? 0 : pageSize);\n const selected = parseSelection(selectedText);\n const state = readComponentState(element, rows.length > 0);\n\n useEffect(() => { if (Number(pageText) !== page.page && pageText !== undefined) setPageText(String(page.page)); }, [page.page, pageText, setPageText]);\n useValueOutput(bindingOutputs, multiple ? selected : selected[0]);\n\n const select = (id: string) => { setSelectedText(toggleSelection(selected, id, multiple).join(',') || undefined); interactions?.onSelect?.(); };\n const run = (action: string, id: string) => { bindingOutputs?.setOutput('action', { action, row: id }); interactions?.onClick?.({ stopPropagation: () => undefined }); };\n const sortLabel = (column: ListColumn) => (sort?.field === column.field ? `${column.header}, ${sort.descending ? strings.listSortedDescending : strings.listSortedAscending}` : column.header);\n const nameOf = (row: ListRow, index: number) => textOf(row, titleField) || rowId(row, index, idField);\n const allOnPage = page.rows.length > 0 && page.rows.every((row, index) => selected.includes(rowId(row, index, idField)));\n const count = matching.length === rows.length ? formatText(strings.listCount, { count: rows.length }) : formatText(strings.listCountFiltered, { shown: matching.length, total: rows.length });\n\n const rowActions = (row: ListRow, index: number) => actions.length === 0 || actionRule === 'hidden' ? undefined : (\n <select className='foundation-row-actions' aria-label={formatText(strings.listRowActions, { name: nameOf(row, index) })} value='' disabled={actionRule === 'disabled'} title={actionRule === 'disabled' ? strings.disabledNoPermission : undefined}\n onChange={event => { if (event.target.value) run(event.target.value, rowId(row, index, idField)); }}>\n <option value=''>{strings.listActions}</option>\n {actions.map(action => <option key={action} value={action}>{action}</option>)}\n </select>\n );\n\n const checkbox = (row: ListRow, index: number) => !selectable ? undefined : (\n <input type={multiple ? 'checkbox' : 'radio'} name={`${element.id}-select`} checked={selected.includes(rowId(row, index, idField))} aria-label={formatText(strings.listSelectRow, { name: nameOf(row, index) })} onChange={() => select(rowId(row, index, idField))} />\n );\n\n const table = (tableRows: ListRow[], offset = 0, caption?: string) => (\n <div className='foundation-table-scroll'>\n <table className='foundation-table'>\n <caption className='foundation-visually-hidden'>{caption ?? readOptionalString(element, 'label') ?? strings.listTable}</caption>\n <thead>\n <tr>\n {selectable && (\n <th scope='col' className='foundation-table-select'>\n {multiple && <input type='checkbox' checked={allOnPage} aria-label={strings.listSelectAll}\n onChange={() => setSelectedText((allOnPage ? selected.filter(id => !page.rows.some((row, index) => rowId(row, index, idField) === id)) : [...new Set([...selected, ...page.rows.map((row, index) => rowId(row, index, idField))])]).join(',') || undefined)} />}\n </th>\n )}\n {columns.map(column => (\n <th key={column.field} scope='col' aria-sort={sort?.field === column.field ? (sort.descending ? 'descending' : 'ascending') : undefined}>\n {column.sortable ? (\n <button type='button' className='foundation-sort' aria-label={formatText(strings.listSortBy, { column: sortLabel(column) })} onClick={() => { setSortText(formatSort(nextSort(sort, column.field))); setPageText('1'); }}>\n <span>{column.header}</span>\n {sort?.field === column.field && <FoundationIcon name={sort.descending ? 'arrow-down' : 'arrow-up'} />}\n </button>\n ) : column.header}\n </th>\n ))}\n {actions.length > 0 && actionRule !== 'hidden' && <th scope='col'><span className='foundation-visually-hidden'>{strings.listActions}</span></th>}\n </tr>\n </thead>\n <tbody>\n {tableRows.map((row, position) => {\n const index = offset + position;\n const id = rowId(row, index, idField);\n return (\n <tr key={id} aria-selected={selectable ? selected.includes(id) : undefined} data-selected={selected.includes(id)}>\n {selectable && <td className='foundation-table-select'>{checkbox(row, index)}</td>}\n {columns.map((column, columnIndex) => columnIndex === 0\n ? <th key={column.field} scope='row'><Cell column={column} row={row} locale={locale} /></th>\n : <td key={column.field} data-kind={column.kind}><Cell column={column} row={row} locale={locale} /></td>)}\n {actions.length > 0 && actionRule !== 'hidden' && <td>{rowActions(row, index)}</td>}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n\n const cards = (cardRows: ListRow[], offset = 0) => (\n <ul className='foundation-cards' aria-label={readOptionalString(element, 'label') ?? strings.listCards}>\n {cardRows.map((row, position) => {\n const index = offset + position;\n const id = rowId(row, index, idField);\n return (\n <li key={id} className='foundation-card-row' data-selected={selected.includes(id)}>\n <div className='foundation-card-head'>{checkbox(row, index)}<strong>{nameOf(row, index)}</strong></div>\n <dl>\n {columns.filter(column => column.field !== titleField).map(column => (\n <div key={column.field}><dt className='foundation-count'>{column.header}</dt><dd><Cell column={column} row={row} locale={locale} /></dd></div>\n ))}\n </dl>\n {rowActions(row, index)}\n </li>\n );\n })}\n </ul>\n );\n\n const groups = variant === ListVariant.Grouped && groupBy ? groupRows(sorted, groupBy, totalField) : [];\n const isOpen = (key: string) => (openGroups === undefined ? true : openGroups.has(key));\n const toggleGroup = (key: string) => setOpenGroups(current => { const base = current ?? new Set(groups.map(group => group.key)); const next = new Set(base); if (next.has(key)) next.delete(key); else next.add(key); return next; });\n const totalColumn = columns.find(column => column.field === totalField);\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='data-list' state={state} skeleton={[100, 100, 100, 100]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && (\n <>\n <p className='foundation-count' role='status'>{count}</p>\n {matching.length === 0 ? (\n <div className='foundation-empty' role='status'>\n <strong className='foundation-empty-headline'>{strings.listNoMatches}</strong>\n <button type='button' className='foundation-link' onClick={() => { setSearchText(undefined); setPageText('1'); interactions?.onChange?.(); }}>{strings.listClearSearch}</button>\n </div>\n ) : variant === ListVariant.Grouped && groupBy ? groups.map(group => (\n <section key={group.key} className='foundation-list-group'>\n <h3>\n <button type='button' aria-expanded={isOpen(group.key)} className='foundation-sort' onClick={() => toggleGroup(group.key)}\n aria-label={formatText(isOpen(group.key) ? strings.listGroupCollapse : strings.listGroupExpand, { group: group.key })}>\n <FoundationIcon name={isOpen(group.key) ? 'chevron-down' : 'chevron-right'} />{group.key}\n </button>\n <span className='foundation-count'>{group.subtotal === undefined ? group.rows.length : formatText(strings.listGroupSubtotal, { count: group.rows.length, total: formatNumber(group.subtotal, locale, totalColumn?.kind === CellKind.Currency ? NumberFormat.Currency : NumberFormat.Number, totalColumn?.currency ?? 'USD') })}</span>\n </h3>\n {isOpen(group.key) && table(group.rows, 0, group.key)}\n </section>\n )) : (\n <>\n {variant === ListVariant.Cards ? cards(page.rows, (page.page - 1) * Math.max(1, pageSize)) : table(page.rows, (page.page - 1) * Math.max(1, pageSize))}\n {page.pages > 1 && (\n <nav className='foundation-pager' aria-label={formatText(strings.listPage, { page: page.page, pages: page.pages })}>\n <button type='button' className='foundation-button' data-emphasis='secondary' disabled={page.page <= 1} onClick={() => setPageText(String(page.page - 1))}>{strings.listPrevious}</button>\n <span aria-current='page'>{formatText(strings.listPage, { page: page.page, pages: page.pages })}</span>\n <button type='button' className='foundation-button' data-emphasis='secondary' disabled={page.page >= page.pages} onClick={() => setPageText(String(page.page + 1))}>{strings.listNext}</button>\n </nav>\n )}\n </>\n )}\n </>\n )}\n </FoundationFrame>\n );\n}\n\n"],"names":["Cell","column","row","locale","raw","field","text","textOf","kind","CellKind","Number","_jsx","_Fragment","formatNumber","Currency","NumberFormat","currency","Date","formatDate","Status","tone","tones","icon","success","warning","danger","info","neutral","_jsxs","span","className","data-tone","FoundationIcon","name","DataList","element","interactions","bindingOutputs","columns","useMemo","readListColumns","properties","rows","Array","isArray","filter","idField","readOptionalString","titleField","urlKey","keyed","undefined","searchText","setSearchText","useUrlState","sortText","setSortText","pageText","setPageText","selectedText","setSelectedText","openGroups","setOpenGroups","useState","strings","readFoundationStrings","readLocale","compact","useCompactWidth","requestedVariant","readListVariant","variant","ListVariant","Table","collapse","Cards","pageSize","multiple","selectionMode","selectable","actions","rowActions","action","actionRule","readPermissionRule","groupBy","totalField","sort","parseSort","matching","filterRows","searchRows","sorted","sortRows","descending","page","paginate","Grouped","selected","parseSelection","state","readComponentState","length","useEffect","String","useValueOutput","select","id","toggleSelection","join","onSelect","run","setOutput","onClick","stopPropagation","sortLabel","header","listSortedDescending","listSortedAscending","nameOf","index","rowId","allOnPage","every","includes","count","formatText","listCount","listCountFiltered","shown","total","aria-label","listRowActions","value","disabled","title","disabledNoPermission","onChange","event","target","option","listActions","map","checkbox","input","type","checked","listSelectRow","table","tableRows","offset","caption","div","listTable","thead","tr","th","scope","listSelectAll","some","Set","aria-sort","sortable","button","listSortBy","formatSort","nextSort","tbody","position","aria-selected","data-selected","td","columnIndex","data-kind","cards","cardRows","ul","listCards","li","strong","dl","dt","dd","groups","groupRows","isOpen","key","has","toggleGroup","current","base","group","next","delete","add","totalColumn","find","FoundationFrame","skeleton","ComponentState","Ready","Partial","p","role","listNoMatches","listClearSearch","section","h3","aria-expanded","listGroupCollapse","listGroupExpand","subtotal","listGroupSubtotal","Math","max","pages","nav","listPage","data-emphasis","listPrevious","aria-current","listNext"],"mappings":"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"}
|