@mittwald/flow-react-components 1.5.0-next.47 → 1.5.0-next.49
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/AGENTS.md +37 -0
- package/dist/assets/component-index.json +1 -1
- package/dist/assets/doc-properties.json +1 -1
- package/dist/js/node_modules/.pnpm/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.mjs.map +1 -1
- package/dist/js/packages/components/src/components/Action/models/ActionState.mjs +8 -70
- package/dist/js/packages/components/src/components/Action/models/ActionState.mjs.map +1 -1
- package/dist/js/packages/components/src/components/Calendar/components/RangeCalendar/helpers/useCalendarDateRangePresets.mjs +1 -1
- package/dist/js/packages/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs +1 -1
- package/dist/js/packages/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/List.mjs +15 -4
- package/dist/js/packages/components/src/components/List/model/List.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/ListSettingsStore.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/ListViewMode.mjs +35 -23
- package/dist/js/packages/components/src/components/List/model/ListViewMode.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/ReactTable.mjs +16 -10
- package/dist/js/packages/components/src/components/List/model/ReactTable.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/filter/DateRangeFilter.mjs +25 -13
- package/dist/js/packages/components/src/components/List/model/filter/DateRangeFilter.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/filter/Filter.mjs +20 -181
- package/dist/js/packages/components/src/components/List/model/filter/Filter.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/item/ItemCollection.mjs +11 -7
- package/dist/js/packages/components/src/components/List/model/item/ItemCollection.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoader.mjs +10 -13
- package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoader.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs +13 -61
- package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/search/Search.mjs +19 -47
- package/dist/js/packages/components/src/components/List/model/search/Search.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/sorting/Sorting.mjs +15 -54
- package/dist/js/packages/components/src/components/List/model/sorting/Sorting.mjs.map +1 -1
- package/dist/js/packages/components/src/components/List/model/sorting/SortingFunctions.mjs.map +1 -1
- package/dist/js/packages/components/src/lib/remote/eventHandlerContext.mjs +3 -1
- package/dist/js/packages/components/src/lib/remote/eventHandlerContext.mjs.map +1 -1
- package/dist/js/packages/components-base/src/action/ActionState.mjs +87 -0
- package/dist/js/packages/components-base/src/action/ActionState.mjs.map +1 -0
- package/dist/js/packages/components-base/src/index.mjs +18 -0
- package/dist/js/packages/components-base/src/lib/array.mjs +9 -0
- package/dist/js/packages/components-base/src/lib/array.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/ListModelContext.mjs +19 -0
- package/dist/js/packages/components-base/src/list/ListModelContext.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/filter/ListDateRangeFilter.mjs +29 -0
- package/dist/js/packages/components-base/src/list/filter/ListDateRangeFilter.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/filter/ListFilter.mjs +229 -0
- package/dist/js/packages/components-base/src/list/filter/ListFilter.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/filter/ListFilterValue.mjs +51 -0
- package/dist/js/packages/components-base/src/list/filter/ListFilterValue.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/filter/dateRange.mjs +51 -0
- package/dist/js/packages/components-base/src/list/filter/dateRange.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/item/ListItem.mjs +21 -0
- package/dist/js/packages/components-base/src/list/item/ListItem.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/item/ListItemCollection.mjs +24 -0
- package/dist/js/packages/components-base/src/list/item/ListItemCollection.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/loading/ListLoaderState.mjs +86 -0
- package/dist/js/packages/components-base/src/list/loading/ListLoaderState.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/loading/types.mjs +29 -0
- package/dist/js/packages/components-base/src/list/loading/types.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/pagination/ListBatchesController.mjs +64 -0
- package/dist/js/packages/components-base/src/list/pagination/ListBatchesController.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/search/ListSearch.mjs +62 -0
- package/dist/js/packages/components-base/src/list/search/ListSearch.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/sorting/ListSorting.mjs +81 -0
- package/dist/js/packages/components-base/src/list/sorting/ListSorting.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/table/ListTable.mjs +80 -0
- package/dist/js/packages/components-base/src/list/table/ListTable.mjs.map +1 -0
- package/dist/js/packages/components-base/src/list/viewMode/ListViewMode.mjs +53 -0
- package/dist/js/packages/components-base/src/list/viewMode/ListViewMode.mjs.map +1 -0
- package/dist/types/_bundled/flow-components-base/action/ActionState.d.ts +36 -0
- package/dist/types/_bundled/flow-components-base/index.d.ts +23 -0
- package/dist/types/_bundled/flow-components-base/lib/array.d.ts +4 -0
- package/dist/types/_bundled/flow-components-base/list/ListModelContext.d.ts +30 -0
- package/dist/types/_bundled/flow-components-base/list/filter/ListDateRangeFilter.d.ts +18 -0
- package/dist/types/_bundled/flow-components-base/list/filter/ListFilter.d.ts +104 -0
- package/dist/types/_bundled/flow-components-base/list/filter/ListFilterValue.d.ts +21 -0
- package/dist/types/_bundled/flow-components-base/list/filter/dateRange.d.ts +23 -0
- package/dist/types/_bundled/flow-components-base/list/filter/types.d.ts +18 -0
- package/dist/types/_bundled/flow-components-base/list/item/ListItem.d.ts +10 -0
- package/dist/types/_bundled/flow-components-base/list/item/ListItemCollection.d.ts +14 -0
- package/dist/types/_bundled/flow-components-base/list/loading/ListLoaderState.d.ts +44 -0
- package/dist/types/_bundled/flow-components-base/list/loading/types.d.ts +69 -0
- package/dist/types/_bundled/flow-components-base/list/pagination/ListBatchesController.d.ts +32 -0
- package/dist/types/_bundled/flow-components-base/list/pagination/types.d.ts +17 -0
- package/dist/types/_bundled/flow-components-base/list/search/ListSearch.d.ts +27 -0
- package/dist/types/_bundled/flow-components-base/list/search/types.d.ts +5 -0
- package/dist/types/_bundled/flow-components-base/list/settings/types.d.ts +52 -0
- package/dist/types/_bundled/flow-components-base/list/sorting/ListSorting.d.ts +40 -0
- package/dist/types/_bundled/flow-components-base/list/sorting/types.d.ts +14 -0
- package/dist/types/_bundled/flow-components-base/list/table/ListTable.d.ts +34 -0
- package/dist/types/_bundled/flow-components-base/list/types.d.ts +18 -0
- package/dist/types/_bundled/flow-components-base/list/viewMode/ListViewMode.d.ts +25 -0
- package/dist/types/_bundled/flow-components-base/list/viewMode/types.d.ts +10 -0
- package/dist/types/components/Action/models/ActionState.d.ts +8 -21
- package/dist/types/components/List/components/Header/lib.d.ts +1 -2
- package/dist/types/components/List/model/List.d.ts +6 -1
- package/dist/types/components/List/model/ListSettingsStore.d.ts +2 -4
- package/dist/types/components/List/model/ListViewMode.d.ts +17 -10
- package/dist/types/components/List/model/ReactTable.d.ts +1 -1
- package/dist/types/components/List/model/filter/DateRangeFilter.d.ts +21 -9
- package/dist/types/components/List/model/filter/Filter.d.ts +18 -52
- package/dist/types/components/List/model/filter/FilterValue.d.ts +10 -11
- package/dist/types/components/List/model/filter/types.d.ts +6 -18
- package/dist/types/components/List/model/item/Item.d.ts +8 -7
- package/dist/types/components/List/model/item/ItemCollection.d.ts +9 -4
- package/dist/types/components/List/model/loading/IncrementalLoaderState.d.ts +11 -21
- package/dist/types/components/List/model/loading/types.d.ts +5 -26
- package/dist/types/components/List/model/pagination/BatchesController.d.ts +1 -15
- package/dist/types/components/List/model/pagination/types.d.ts +1 -3
- package/dist/types/components/List/model/search/Search.d.ts +16 -19
- package/dist/types/components/List/model/search/types.d.ts +6 -8
- package/dist/types/components/List/model/sorting/Sorting.d.ts +14 -22
- package/dist/types/components/List/model/sorting/SortingFunctions.d.ts +1 -1
- package/dist/types/components/List/model/sorting/types.d.ts +1 -13
- package/dist/types/components/List/model/types.d.ts +7 -24
- package/dist/types/components/List/typedList.d.ts +2 -2
- package/dist/types/lib/remote/eventHandlerContext.d.ts +2 -1
- package/package.json +11 -10
- package/dist/js/packages/components/src/components/List/model/filter/FilterValue.mjs +0 -43
- package/dist/js/packages/components/src/components/List/model/filter/FilterValue.mjs.map +0 -1
- package/dist/js/packages/components/src/components/List/model/filter/dateRangeFilterFn.mjs +0 -23
- package/dist/js/packages/components/src/components/List/model/filter/dateRangeFilterFn.mjs.map +0 -1
- package/dist/js/packages/components/src/components/List/model/item/Item.mjs +0 -20
- package/dist/js/packages/components/src/components/List/model/item/Item.mjs.map +0 -1
- package/dist/js/packages/components/src/components/List/model/pagination/BatchesController.mjs +0 -58
- package/dist/js/packages/components/src/components/List/model/pagination/BatchesController.mjs.map +0 -1
- package/dist/js/packages/components/src/lib/array/toArray.mjs +0 -8
- package/dist/js/packages/components/src/lib/array/toArray.mjs.map +0 -1
- package/dist/js/packages/components/src/lib/date/transformDateValueToDateTime.mjs +0 -15
- package/dist/js/packages/components/src/lib/date/transformDateValueToDateTime.mjs.map +0 -1
- package/dist/js/packages/components/src/lib/promises/sleep.mjs +0 -8
- package/dist/js/packages/components/src/lib/promises/sleep.mjs.map +0 -1
- package/dist/types/components/CartesianChart/typedCartesianChart.test-types.d.ts +0 -1
- package/dist/types/components/List/model/filter/dateRangeFilterFn.d.ts +0 -6
- package/dist/types/components/List/typedList.test-types.d.ts +0 -1
- package/dist/types/integrations/@mittwald/password-tools-js/passwordCreationFieldExport.test-types.d.ts +0 -1
- package/dist/types/lib/array/toArray.d.ts +0 -1
- package/dist/types/lib/types/array.d.ts +0 -1
- package/dist/types/lib/types/props.test-types.d.ts +0 -1
|
@@ -1,193 +1,32 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import { difference, unique } from "remeda";
|
|
6
|
-
import { getProperty } from "dot-prop";
|
|
3
|
+
import { ListFilter } from "../../../../../../components-base/src/list/filter/ListFilter.mjs";
|
|
4
|
+
import "../../../../../../components-base/src/index.mjs";
|
|
7
5
|
//#region src/components/List/model/filter/Filter.ts
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
defaultSelectedValues;
|
|
24
|
-
priority;
|
|
25
|
-
storageKey;
|
|
26
|
-
constructor(list, shape) {
|
|
27
|
-
const { autosave = list.settingsStorageDefaults?.filters?.autosave ?? false, manualSave = list.settingsStorageDefaults?.filters?.manualSave ?? true, property, mode = "some", values, matcher = equalsPropertyMatcher, renderItem = stringCastRenderMethod, priority = "primary", name, defaultSelected, onChange } = shape;
|
|
28
|
-
this.list = list;
|
|
29
|
-
this.autosave = autosave;
|
|
30
|
-
this.manualSave = manualSave;
|
|
31
|
-
this.property = property;
|
|
32
|
-
this.storageKey = String(property);
|
|
33
|
-
this.mode = mode;
|
|
34
|
-
this._values = values?.map((v) => FilterValue.create(this, v));
|
|
35
|
-
this.matcher = matcher;
|
|
36
|
-
this.renderItem = renderItem;
|
|
37
|
-
this.name = name;
|
|
38
|
-
this.priority = priority;
|
|
39
|
-
this.defaultSelectedValues = defaultSelected?.map((v) => FilterValue.create(this, v));
|
|
40
|
-
if (onChange) this.onFilterChangeCallbacks.add(onChange);
|
|
41
|
-
}
|
|
42
|
-
updateInitialState(initialState) {
|
|
43
|
-
const initialIds = this.getInitialSelectedIds();
|
|
44
|
-
if (initialIds?.length) initialState.columnFilters = [...initialState.columnFilters ?? [], {
|
|
45
|
-
id: this.property,
|
|
46
|
-
value: initialIds
|
|
47
|
-
}];
|
|
48
|
-
}
|
|
49
|
-
getInitialSelectedIds() {
|
|
50
|
-
return this.getStoredSelectedIds({
|
|
51
|
-
autosave: this.autosave,
|
|
52
|
-
manualSave: this.manualSave
|
|
53
|
-
}) ?? this.defaultSelectedValues?.map((v) => v.id);
|
|
54
|
-
}
|
|
55
|
-
getStoredSelectedIds(options) {
|
|
56
|
-
return this.list.settingsStorage?.get("activeFilters", options)?.[this.storageKey];
|
|
57
|
-
}
|
|
58
|
-
getStoredSelectedValues(options) {
|
|
59
|
-
return this.getStoredSelectedIds(options)?.map((id) => this.values.find((v) => v.id === id)).filter((v) => v !== void 0);
|
|
60
|
-
}
|
|
61
|
-
static storeFilters(list, options) {
|
|
62
|
-
const data = Object.fromEntries(list.filters.map((filter) => [filter.storageKey, filter.getArrayValue().map((v) => v.id)]));
|
|
63
|
-
list.settingsStorage?.store("activeFilters", data, options);
|
|
64
|
-
}
|
|
65
|
-
updateTableColumnDef(def) {
|
|
66
|
-
def.enableColumnFilter = true;
|
|
67
|
-
def.filterFn = this.getReactTableFilterFn();
|
|
68
|
-
}
|
|
69
|
-
getReactTableFilterFn() {
|
|
70
|
-
return (row, _, filterValue) => {
|
|
71
|
-
const propertyAsString = this.property;
|
|
72
|
-
const filterBy = propertyAsString.startsWith("$") ? row.original : getProperty(row.original, propertyAsString);
|
|
73
|
-
return this.checkFilterMatches(filterBy, filterValue);
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
checkFilterMatches(property, filterValueInput) {
|
|
77
|
-
if (filterValueInput === null) return true;
|
|
78
|
-
const predicate = (filterValue) => this.matcher(filterValue.value, property);
|
|
79
|
-
const toFilterValue = (something) => FilterValue.create(this, something);
|
|
80
|
-
if (this.mode === "all") return toArray(filterValueInput).map(toFilterValue).every(predicate);
|
|
81
|
-
else if (this.mode === "some") {
|
|
82
|
-
const filterArr = toArray(filterValueInput);
|
|
83
|
-
return filterArr.length === 0 || filterArr.map(toFilterValue).some(predicate);
|
|
84
|
-
} else if (this.mode === "one") return predicate(toFilterValue(Array.isArray(filterValueInput) ? filterValueInput[0] : filterValueInput));
|
|
85
|
-
throw new Error(`Unknown filter mode '${this.mode}'`);
|
|
86
|
-
}
|
|
87
|
-
getTableColumnFilter() {
|
|
88
|
-
return this.list.reactTable.table.getState().columnFilters.find((f) => f.id === this.property);
|
|
89
|
-
}
|
|
90
|
-
getTableColumn() {
|
|
91
|
-
return this.list.reactTable.getTableColumn(this.property);
|
|
92
|
-
}
|
|
93
|
-
getValue() {
|
|
94
|
-
return this.getTableColumnFilter()?.value ?? null;
|
|
95
|
-
}
|
|
96
|
-
getValuesFromTableState() {
|
|
97
|
-
return unique(Array.from(this.getTableColumn().getFacetedUniqueValues().keys()).flatMap((v) => v).filter((v) => v !== void 0 && v !== null)).map((v) => FilterValue.create(this, v));
|
|
98
|
-
}
|
|
99
|
-
checkIfValueIsUnknown(value) {
|
|
100
|
-
return !this.values.some((v) => v.id === value.id);
|
|
101
|
-
}
|
|
102
|
-
deleteUnknownFilterValues() {
|
|
103
|
-
if (this.values === this.valuesFromTableState) return;
|
|
104
|
-
for (const currentValues of this.getArrayValue()) if (this.checkIfValueIsUnknown(currentValues)) this.deactivateValue(currentValues);
|
|
6
|
+
/**
|
|
7
|
+
* React's filter: the shared one, with `renderItem` narrowed.
|
|
8
|
+
*
|
|
9
|
+
* Everything a filter does — values, selection, persistence, the predicate the
|
|
10
|
+
* table runs — is `ListFilter` in `@mittwald/flow-components-base`. The one
|
|
11
|
+
* thing that is not shareable is what a filter value _looks_ like, so the core
|
|
12
|
+
* carries the rendered type as a parameter and this fills it with `ReactNode`.
|
|
13
|
+
*/
|
|
14
|
+
var Filter = class extends ListFilter {
|
|
15
|
+
constructor(context, shape) {
|
|
16
|
+
super(context, shape);
|
|
17
|
+
}
|
|
18
|
+
/** The list this filter belongs to — `context`, typed as React's `List`. */
|
|
19
|
+
get list() {
|
|
20
|
+
return this.context;
|
|
105
21
|
}
|
|
106
22
|
get values() {
|
|
107
|
-
return
|
|
108
|
-
}
|
|
109
|
-
get valuesFromTableState() {
|
|
110
|
-
if (!this._valuesFromTableState) this._valuesFromTableState = this.getValuesFromTableState();
|
|
111
|
-
return this._valuesFromTableState;
|
|
23
|
+
return super.values;
|
|
112
24
|
}
|
|
113
25
|
getArrayValue() {
|
|
114
|
-
|
|
115
|
-
return value === null ? [] : toArray(value).map((v) => FilterValue.create(this, v));
|
|
116
|
-
}
|
|
117
|
-
isValueActive(value) {
|
|
118
|
-
return this.getArrayValue().some((v) => v.equals(value));
|
|
119
|
-
}
|
|
120
|
-
isActive() {
|
|
121
|
-
return this.getArrayValue().length > 0;
|
|
122
|
-
}
|
|
123
|
-
deactivateValue(value) {
|
|
124
|
-
const currentValueAsArray = this.getArrayValue();
|
|
125
|
-
let updatedValue;
|
|
126
|
-
if (this.mode === "all" || this.mode === "some") updatedValue = currentValueAsArray.filter((v) => !v.equals(value));
|
|
127
|
-
else updatedValue = null;
|
|
128
|
-
this.list.reactTable.getTableColumn(this.property).setFilterValue(updatedValue);
|
|
129
|
-
this.callOnChangedHandlers(updatedValue);
|
|
130
|
-
}
|
|
131
|
-
callOnChangedHandlers(newValue) {
|
|
132
|
-
const values = toArray(newValue).map((v) => v?.value);
|
|
133
|
-
this.onFilterChangeCallbacks.forEach((cb) => cb(values));
|
|
134
|
-
}
|
|
135
|
-
hasChanges() {
|
|
136
|
-
const currentIds = this.getArrayValue().map((v) => v.id);
|
|
137
|
-
const defaultIds = this.getStoredSelectedIds({ autosave: false }) ?? this.defaultSelectedValues?.map((v) => v.id) ?? [];
|
|
138
|
-
return currentIds.length !== defaultIds.length || difference(currentIds, defaultIds).length > 0;
|
|
139
|
-
}
|
|
140
|
-
isStoringAvailable() {
|
|
141
|
-
return !!this.list.settingsStorage && this.manualSave;
|
|
142
|
-
}
|
|
143
|
-
resetValues() {
|
|
144
|
-
let resetTo;
|
|
145
|
-
const storedValues = this.getStoredSelectedValues({ autosave: false }) ?? this.defaultSelectedValues;
|
|
146
|
-
if (storedValues) resetTo = storedValues;
|
|
147
|
-
else if (this.mode === "all" || this.mode === "some") resetTo = [];
|
|
148
|
-
else resetTo = null;
|
|
149
|
-
this.list.reactTable.getTableColumn(this.property).setFilterValue(resetTo);
|
|
150
|
-
this.callOnChangedHandlers(resetTo);
|
|
151
|
-
}
|
|
152
|
-
clear() {
|
|
153
|
-
this.list.reactTable.getTableColumn(this.property).setFilterValue(null);
|
|
154
|
-
this.callOnChangedHandlers(null);
|
|
155
|
-
}
|
|
156
|
-
toggleValue(newValue) {
|
|
157
|
-
const currentValueAsArray = this.getArrayValue();
|
|
158
|
-
let updatedValue;
|
|
159
|
-
if (this.mode === "all" || this.mode === "some") {
|
|
160
|
-
if (newValue.isActive) updatedValue = currentValueAsArray.filter((v) => !v.equals(newValue));
|
|
161
|
-
else updatedValue = [...currentValueAsArray, newValue];
|
|
162
|
-
} else updatedValue = newValue.isActive ? null : newValue;
|
|
163
|
-
this.list.reactTable.getTableColumn(this.property).setFilterValue(updatedValue);
|
|
164
|
-
this.callOnChangedHandlers(updatedValue);
|
|
165
|
-
}
|
|
166
|
-
get isSelectAllAvailable() {
|
|
167
|
-
return this.mode === "some" && this.values.length >= selectAllMinValueCount;
|
|
168
|
-
}
|
|
169
|
-
isEveryValueActive() {
|
|
170
|
-
return this.values.every((v) => v.isActive);
|
|
171
|
-
}
|
|
172
|
-
selectAll() {
|
|
173
|
-
this.setArrayValue(this.values);
|
|
174
|
-
}
|
|
175
|
-
setActiveValueIds(ids) {
|
|
176
|
-
const idSet = new Set(ids);
|
|
177
|
-
this.setArrayValue(this.values.filter((v) => idSet.has(v.id)));
|
|
178
|
-
}
|
|
179
|
-
deselectAll() {
|
|
180
|
-
this.setArrayValue([]);
|
|
181
|
-
}
|
|
182
|
-
setArrayValue(value) {
|
|
183
|
-
this.list.reactTable.getTableColumn(this.property).setFilterValue(value);
|
|
184
|
-
this.callOnChangedHandlers(value);
|
|
185
|
-
}
|
|
186
|
-
onFilterUpdated(cb) {
|
|
187
|
-
this.onFilterChangeCallbacks.add(cb);
|
|
26
|
+
return super.getArrayValue();
|
|
188
27
|
}
|
|
189
28
|
};
|
|
190
29
|
//#endregion
|
|
191
|
-
export { Filter };
|
|
30
|
+
export { Filter, Filter as default };
|
|
192
31
|
|
|
193
32
|
//# sourceMappingURL=Filter.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filter.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/filter/Filter.ts"],"sourcesContent":["import type {\n Column,\n ColumnDef,\n ColumnFilter,\n InitialTableState,\n} from \"@tanstack/react-table\";\nimport type List from \"@/components/List/model/List\";\nimport { getProperty } from \"dot-prop\";\nimport type {\n FilterMatcher,\n FilterMode,\n FilterShape,\n FilterUpdatedCallback,\n} from \"@/components/List/model/filter/types\";\nimport type {\n PropertyName,\n PropertyValueRenderMethod,\n} from \"@/components/List/model/types\";\nimport { customPropertyPrefix } from \"@/components/List/model/types\";\nimport { difference, unique } from \"remeda\";\nimport { FilterValue } from \"@/components/List/model/filter/FilterValue\";\nimport { toArray } from \"@/lib/array/toArray\";\nimport type { ListSettingsStoreOperationOptions } from \"../ListSettingsStore\";\n\nconst equalsPropertyMatcher: FilterMatcher<unknown, never, never> = (\n filterValue,\n propertyValue,\n) => filterValue === propertyValue;\n\nconst selectAllMinValueCount = 6;\n\nconst stringCastRenderMethod: PropertyValueRenderMethod<unknown> = (value) =>\n String(value);\n\nexport class Filter<\n T = never,\n TProp extends PropertyName<T> = never,\n TMatchValue = never,\n> {\n private _values?: FilterValue[] | undefined;\n private _valuesFromTableState?: FilterValue[];\n public readonly list: List<T>;\n public readonly property: TProp;\n public readonly mode: FilterMode;\n public readonly matcher: FilterMatcher<T, never, never>;\n public readonly renderItem: PropertyValueRenderMethod<TMatchValue>;\n public readonly name?: string;\n public readonly autosave: boolean;\n public readonly manualSave: boolean;\n private onFilterChangeCallbacks = new Set<FilterUpdatedCallback>();\n private readonly defaultSelectedValues?: FilterValue[];\n public readonly priority: \"primary\" | \"secondary\";\n public readonly storageKey: string;\n\n public constructor(list: List<T>, shape: FilterShape<T, TProp, TMatchValue>) {\n const {\n autosave = list.settingsStorageDefaults?.filters?.autosave ?? false,\n manualSave = list.settingsStorageDefaults?.filters?.manualSave ?? true,\n property,\n mode = \"some\",\n values,\n matcher = equalsPropertyMatcher,\n renderItem = stringCastRenderMethod,\n priority = \"primary\",\n name,\n defaultSelected,\n onChange,\n } = shape;\n\n this.list = list;\n this.autosave = autosave;\n this.manualSave = manualSave;\n this.property = property;\n this.storageKey = String(property);\n this.mode = mode;\n this._values = values?.map((v) => FilterValue.create(this, v));\n this.matcher = matcher;\n this.renderItem = renderItem;\n this.name = name;\n this.priority = priority;\n this.defaultSelectedValues = defaultSelected?.map((v) =>\n FilterValue.create(this, v),\n );\n if (onChange) {\n this.onFilterChangeCallbacks.add(onChange);\n }\n }\n\n public updateInitialState(initialState: InitialTableState) {\n const initialIds = this.getInitialSelectedIds();\n\n if (initialIds?.length) {\n initialState.columnFilters = [\n ...(initialState.columnFilters ?? []),\n {\n id: this.property as string,\n value: initialIds,\n },\n ];\n }\n }\n\n private getInitialSelectedIds() {\n return (\n this.getStoredSelectedIds({\n autosave: this.autosave,\n manualSave: this.manualSave,\n }) ?? this.defaultSelectedValues?.map((v) => v.id)\n );\n }\n\n private getStoredSelectedIds(options: ListSettingsStoreOperationOptions) {\n return this.list.settingsStorage?.get(\"activeFilters\", options)?.[\n this.storageKey\n ];\n }\n\n private getStoredSelectedValues(options: ListSettingsStoreOperationOptions) {\n return this.getStoredSelectedIds(options)\n ?.map((id) => this.values.find((v) => v.id === id))\n .filter((v): v is FilterValue => v !== undefined);\n }\n\n public static storeFilters<T>(\n list: List<T>,\n options: ListSettingsStoreOperationOptions,\n ) {\n const data = Object.fromEntries(\n list.filters.map((filter) => [\n filter.storageKey,\n filter.getArrayValue().map((v) => v.id),\n ]),\n );\n\n list.settingsStorage?.store(\"activeFilters\", data, options);\n }\n\n public updateTableColumnDef(def: ColumnDef<T>): void {\n def.enableColumnFilter = true;\n def.filterFn = this.getReactTableFilterFn();\n }\n\n private getReactTableFilterFn(): ColumnDef<T>[\"filterFn\"] {\n return (row, _, filterValue) => {\n const propertyAsString = this.property as string;\n\n const filterBy = propertyAsString.startsWith(customPropertyPrefix)\n ? row.original\n : getProperty(row.original, propertyAsString);\n\n return this.checkFilterMatches(filterBy, filterValue);\n };\n }\n\n private checkFilterMatches(\n property: unknown,\n filterValueInput: unknown,\n ): boolean {\n if (filterValueInput === null) {\n return true;\n }\n\n const predicate = (filterValue: FilterValue) =>\n this.matcher(filterValue.value as never, property as never);\n\n const toFilterValue = (something: unknown) =>\n FilterValue.create(this, something);\n\n if (this.mode === \"all\") {\n return toArray(filterValueInput).map(toFilterValue).every(predicate);\n } else if (this.mode === \"some\") {\n const filterArr = toArray(filterValueInput);\n return (\n filterArr.length === 0 || filterArr.map(toFilterValue).some(predicate)\n );\n } else if (this.mode === \"one\") {\n const oneValue = Array.isArray(filterValueInput)\n ? filterValueInput[0]\n : filterValueInput;\n return predicate(toFilterValue(oneValue));\n }\n\n throw new Error(`Unknown filter mode '${this.mode}'`);\n }\n\n protected getTableColumnFilter(): ColumnFilter | undefined {\n return this.list.reactTable.table\n .getState()\n .columnFilters.find((f) => f.id === this.property);\n }\n\n private getTableColumn(): Column<T> {\n return this.list.reactTable.getTableColumn(this.property);\n }\n\n public getValue(): unknown {\n return this.getTableColumnFilter()?.value ?? null;\n }\n\n private getValuesFromTableState() {\n return unique(\n Array.from(this.getTableColumn().getFacetedUniqueValues().keys())\n .flatMap((v) => v)\n .filter((v) => v !== undefined && v !== null),\n ).map((v) => FilterValue.create(this, v));\n }\n\n private checkIfValueIsUnknown(value: FilterValue) {\n const isKnown = this.values.some((v) => v.id === value.id);\n return !isKnown;\n }\n\n public deleteUnknownFilterValues() {\n if (this.values === this.valuesFromTableState) {\n return;\n }\n\n for (const currentValues of this.getArrayValue()) {\n if (this.checkIfValueIsUnknown(currentValues)) {\n this.deactivateValue(currentValues);\n }\n }\n }\n\n public get values(): FilterValue[] {\n return this._values ?? this.valuesFromTableState;\n }\n\n private get valuesFromTableState(): FilterValue[] {\n if (!this._valuesFromTableState) {\n this._valuesFromTableState = this.getValuesFromTableState();\n }\n return this._valuesFromTableState;\n }\n\n public getArrayValue(): FilterValue[] {\n const value = this.getValue();\n return value === null\n ? []\n : toArray(value).map((v) => FilterValue.create(this, v));\n }\n\n public isValueActive(value: FilterValue): boolean {\n return this.getArrayValue().some((v) => v.equals(value));\n }\n\n public isActive(): boolean {\n return this.getArrayValue().length > 0;\n }\n\n public deactivateValue(value: FilterValue): void {\n const currentValueAsArray = this.getArrayValue();\n\n let updatedValue: FilterValue[] | FilterValue | null;\n\n if (this.mode === \"all\" || this.mode === \"some\") {\n updatedValue = currentValueAsArray.filter((v) => !v.equals(value));\n } else {\n updatedValue = null;\n }\n\n this.list.reactTable\n .getTableColumn(this.property)\n .setFilterValue(updatedValue);\n\n this.callOnChangedHandlers(updatedValue);\n }\n\n private callOnChangedHandlers(\n newValue: FilterValue[] | FilterValue | null,\n ): void {\n const values = toArray(newValue).map((v) => v?.value);\n this.onFilterChangeCallbacks.forEach((cb) => cb(values));\n }\n\n public hasChanges(): boolean {\n const currentIds = this.getArrayValue().map((v) => v.id);\n\n const defaultIds =\n this.getStoredSelectedIds({ autosave: false }) ??\n this.defaultSelectedValues?.map((v) => v.id) ??\n [];\n\n return (\n currentIds.length !== defaultIds.length ||\n difference(currentIds, defaultIds).length > 0\n );\n }\n\n public isStoringAvailable(): boolean {\n return !!this.list.settingsStorage && this.manualSave;\n }\n\n public resetValues(): void {\n let resetTo: FilterValue[] | FilterValue | null;\n\n const storedValues =\n this.getStoredSelectedValues({ autosave: false }) ??\n this.defaultSelectedValues;\n\n if (storedValues) {\n resetTo = storedValues;\n } else {\n if (this.mode === \"all\" || this.mode === \"some\") {\n resetTo = [];\n } else {\n resetTo = null;\n }\n }\n\n this.list.reactTable.getTableColumn(this.property).setFilterValue(resetTo);\n this.callOnChangedHandlers(resetTo);\n }\n\n public clear(): void {\n this.list.reactTable.getTableColumn(this.property).setFilterValue(null);\n this.callOnChangedHandlers(null);\n }\n\n public toggleValue(newValue: FilterValue): void {\n const currentValueAsArray = this.getArrayValue();\n\n let updatedValue: FilterValue[] | FilterValue | null;\n\n if (this.mode === \"all\" || this.mode === \"some\") {\n if (newValue.isActive) {\n updatedValue = currentValueAsArray.filter((v) => !v.equals(newValue));\n } else {\n updatedValue = [...currentValueAsArray, newValue];\n }\n } else {\n updatedValue = newValue.isActive ? null : newValue;\n }\n\n this.list.reactTable\n .getTableColumn(this.property)\n .setFilterValue(updatedValue);\n this.callOnChangedHandlers(updatedValue);\n }\n\n public get isSelectAllAvailable(): boolean {\n return this.mode === \"some\" && this.values.length >= selectAllMinValueCount;\n }\n\n public isEveryValueActive(): boolean {\n return this.values.every((v) => v.isActive);\n }\n\n public selectAll(): void {\n this.setArrayValue(this.values);\n }\n\n public setActiveValueIds(ids: Iterable<unknown>): void {\n const idSet = new Set(ids);\n this.setArrayValue(this.values.filter((v) => idSet.has(v.id)));\n }\n\n public deselectAll(): void {\n this.setArrayValue([]);\n }\n\n private setArrayValue(value: FilterValue[]): void {\n this.list.reactTable.getTableColumn(this.property).setFilterValue(value);\n this.callOnChangedHandlers(value);\n }\n\n public onFilterUpdated(cb: () => unknown): void {\n this.onFilterChangeCallbacks.add(cb);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filter.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/filter/Filter.ts"],"sourcesContent":["import type { FilterShape } from \"@/components/List/model/filter/types\";\nimport type { PropertyName } from \"@/components/List/model/types\";\nimport type { ListModelContext } from \"@mittwald/flow-components-base\";\nimport { ListFilter } from \"@mittwald/flow-components-base\";\nimport type { ReactNode } from \"react\";\nimport type { List } from \"@/components/List/model/List\";\nimport type { FilterValue } from \"@/components/List/model/filter/FilterValue\";\n\n/**\n * React's filter: the shared one, with `renderItem` narrowed.\n *\n * Everything a filter does — values, selection, persistence, the predicate the\n * table runs — is `ListFilter` in `@mittwald/flow-components-base`. The one\n * thing that is not shareable is what a filter value _looks_ like, so the core\n * carries the rendered type as a parameter and this fills it with `ReactNode`.\n */\nexport class Filter<\n T = never,\n TProp extends PropertyName<T> = never,\n TMatchValue = never,\n> extends ListFilter<T, TProp, TMatchValue, ReactNode> {\n public constructor(\n context: ListModelContext<T>,\n shape: FilterShape<T, TProp, TMatchValue>,\n ) {\n super(context, shape);\n }\n\n /** The list this filter belongs to — `context`, typed as React's `List`. */\n public get list(): List<T> {\n return this.context as List<T>;\n }\n\n /* Created by this filter, so each one's `filter` is React's. */\n public override get values(): FilterValue[] {\n return super.values as FilterValue[];\n }\n\n public override getArrayValue(): FilterValue[] {\n return super.getArrayValue() as FilterValue[];\n }\n}\n\nexport default Filter;\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,SAAb,cAIU,WAA6C;CACrD,YACE,SACA,OACA;EACA,MAAM,SAAS,KAAK;CACtB;;CAGA,IAAW,OAAgB;EACzB,OAAO,KAAK;CACd;CAGA,IAAoB,SAAwB;EAC1C,OAAO,MAAM;CACf;CAEA,gBAA+C;EAC7C,OAAO,MAAM,cAAc;CAC7B;AACF"}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
-
import {
|
|
3
|
+
import { ListItemCollection } from "../../../../../../components-base/src/list/item/ListItemCollection.mjs";
|
|
4
|
+
import "../../../../../../components-base/src/index.mjs";
|
|
4
5
|
//#region src/components/List/model/item/ItemCollection.ts
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
/**
|
|
7
|
+
* React's item collection: `ListItemCollection` from
|
|
8
|
+
* `@mittwald/flow-components-base`, plus `list` — see `Sorting` for why.
|
|
9
|
+
*/
|
|
10
|
+
var ItemCollection = class extends ListItemCollection {
|
|
11
|
+
get list() {
|
|
12
|
+
return this.context;
|
|
9
13
|
}
|
|
10
14
|
get entries() {
|
|
11
|
-
return
|
|
15
|
+
return super.entries;
|
|
12
16
|
}
|
|
13
17
|
};
|
|
14
18
|
//#endregion
|
|
15
|
-
export { ItemCollection };
|
|
19
|
+
export { ItemCollection, ItemCollection as default };
|
|
16
20
|
|
|
17
21
|
//# sourceMappingURL=ItemCollection.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemCollection.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/item/ItemCollection.ts"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"file":"ItemCollection.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/item/ItemCollection.ts"],"sourcesContent":["import { ListItemCollection } from \"@mittwald/flow-components-base\";\nimport type { Item } from \"@/components/List/model/item/Item\";\nimport type { List } from \"@/components/List/model/List\";\n\n/**\n * React's item collection: `ListItemCollection` from\n * `@mittwald/flow-components-base`, plus `list` — see `Sorting` for why.\n */\nexport class ItemCollection<T> extends ListItemCollection<T> {\n public get list(): List<T> {\n return this.context as List<T>;\n }\n\n /* Built with this collection, so each one's `collection` is React's. */\n public override get entries(): Item<T>[] {\n return super.entries as Item<T>[];\n }\n}\n\nexport default ItemCollection;\n"],"mappings":";;;;;;;;;AAQA,IAAa,iBAAb,cAAuC,mBAAsB;CAC3D,IAAW,OAAgB;EACzB,OAAO,KAAK;CACd;CAGA,IAAoB,UAAqB;EACvC,OAAO,MAAM;CACf;AACF"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
+
import { getListDataLoaderOptions } from "../../../../../../components-base/src/list/loading/types.mjs";
|
|
4
|
+
import "../../../../../../components-base/src/index.mjs";
|
|
3
5
|
import { useComponentDefaults } from "../../../ComponentDefaultsProvider/ComponentDefaultsProvider.mjs";
|
|
4
6
|
import { IncrementalLoaderState } from "./IncrementalLoaderState.mjs";
|
|
5
7
|
import { useEffect, useMemo } from "react";
|
|
6
8
|
import { times } from "remeda";
|
|
7
|
-
import { getAsyncResource, usePromise } from "@mittwald/react-use-promise";
|
|
8
9
|
import { hash } from "object-code";
|
|
10
|
+
import { getAsyncResource, usePromise } from "@mittwald/react-use-promise";
|
|
9
11
|
//#region src/components/List/model/loading/IncrementalLoader.ts
|
|
10
12
|
var emptyData = [];
|
|
11
13
|
var IncrementalLoader = class IncrementalLoader {
|
|
@@ -105,18 +107,13 @@ var IncrementalLoader = class IncrementalLoader {
|
|
|
105
107
|
}));
|
|
106
108
|
}
|
|
107
109
|
getDataLoaderOptions(batchIndex) {
|
|
108
|
-
return {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
mode: f.mode,
|
|
116
|
-
values: f.getArrayValue().map((v) => v.value)
|
|
117
|
-
}])) : void 0,
|
|
118
|
-
searchString: this.manualFiltering ? this.list.reactTable.searchString : void 0
|
|
119
|
-
};
|
|
110
|
+
return getListDataLoaderOptions({
|
|
111
|
+
batchSize: this.list.batches.batchSize,
|
|
112
|
+
modes: this,
|
|
113
|
+
sorting: this.list.sorting,
|
|
114
|
+
filters: this.list.filters,
|
|
115
|
+
searchString: this.list.reactTable.searchString
|
|
116
|
+
}, batchIndex);
|
|
120
117
|
}
|
|
121
118
|
getBatchDataAsyncResource(batchIndex) {
|
|
122
119
|
const dataSource = this.dataSource;
|
package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoader.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalLoader.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/loading/IncrementalLoader.ts"],"sourcesContent":["import type List from \"@/components/List/model/List\";\nimport type {\n DataLoaderOptions,\n DataLoaderResult,\n DataSource,\n IncrementalLoaderShape,\n LoaderInvocationHook,\n} from \"@/components/List/model/loading/types\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { getAsyncResource, usePromise } from \"@mittwald/react-use-promise\";\nimport { useEffect } from \"react\";\nimport { times } from \"remeda\";\nimport { IncrementalLoaderState } from \"@/components/List/model/loading/IncrementalLoaderState\";\nimport { hash } from \"object-code\";\nimport type { PropertyName } from \"@/components/List/model/types\";\nimport { useMemo } from \"react\";\nimport { useComponentDefaults } from \"@/components/ComponentDefaultsProvider\";\n\nconst emptyData: never[] = [];\n\nexport class IncrementalLoader<T> {\n private readonly list: List<T>;\n private readonly dataSource: DataSource<T>;\n public readonly manualSorting: boolean;\n public readonly manualFiltering: boolean;\n public readonly manualPagination: boolean;\n public readonly disableInitialSuspenseBoundary: boolean;\n public readonly loaderState: IncrementalLoaderState<T>;\n public readonly staticDataProperties: PropertyName<T>[] = [];\n\n private constructor(list: List<T>, shape: IncrementalLoaderShape<T> = {}) {\n const { source } = shape;\n\n this.dataSource = source ?? { staticData: emptyData };\n\n const {\n disableInitialSuspenseBoundary: disableInitialSuspenseBoundaryDefault,\n } = useComponentDefaults(\"List\");\n\n this.disableInitialSuspenseBoundary =\n \"disableInitialSuspenseBoundary\" in this.dataSource\n ? (this.dataSource.disableInitialSuspenseBoundary ??\n disableInitialSuspenseBoundaryDefault)\n : disableInitialSuspenseBoundaryDefault;\n\n const manualPagination =\n \"manualPagination\" in this.dataSource\n ? this.dataSource.manualPagination\n : undefined;\n\n const manualFiltering =\n \"manualFiltering\" in this.dataSource\n ? this.dataSource.manualFiltering\n : undefined;\n\n const manualSorting =\n \"manualSorting\" in this.dataSource\n ? this.dataSource.manualSorting\n : undefined;\n\n this.list = list;\n this.loaderState = IncrementalLoaderState.useNew<T>(list);\n\n this.manualPagination = manualPagination ?? false;\n this.manualFiltering = manualFiltering ?? this.manualPagination;\n this.manualSorting = manualSorting ?? this.manualPagination;\n this.list.filters.forEach((f) => f.onFilterUpdated(() => this.reset()));\n this.list.search?.onUpdated(() => this.reset());\n\n this.initStaticDataProperties();\n }\n\n public static useNew<T>(\n list: List<T>,\n shape: IncrementalLoaderShape<T> = {},\n ): IncrementalLoader<T> {\n return new IncrementalLoader(list, shape);\n }\n\n private initStaticDataProperties() {\n const addPropertiesOfDataEntry = (data: unknown) => {\n if (typeof data !== \"object\" || data === null) {\n return;\n }\n\n (Object.keys(data) as PropertyName<T>[])\n .filter((p) => !this.staticDataProperties.includes(p))\n .forEach((p) => {\n this.staticDataProperties.push(p);\n });\n };\n\n if (\"staticData\" in this.dataSource) {\n this.dataSource.staticData\n // collect properties from just the first 100 items\n .slice(0, 100)\n .forEach(addPropertiesOfDataEntry);\n }\n }\n\n private reset(): void {\n this.loaderState.reset();\n }\n\n public useIsLoading(): boolean {\n return this.loaderState.useIsLoading();\n }\n\n public useIsInitiallyLoading(): boolean {\n return this.loaderState.useIsInitiallyLoading();\n }\n\n public useIsLoadingMore(): boolean {\n return this.loaderState.useIsLoadingMore();\n }\n\n public useData(): T[] {\n return this.loaderState.useMergedData();\n }\n\n private getUseData(): (options: DataLoaderOptions<T>) => DataLoaderResult<T> {\n const dataSource = this.dataSource;\n\n return (options: DataLoaderOptions<T>) => {\n if (\"staticData\" in dataSource) {\n return useMemo(\n () => ({\n data: dataSource.staticData,\n itemTotalCount: dataSource.staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"useData\" in dataSource) {\n return dataSource.useData(options);\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies\n ? hash(dependencies).toString()\n : undefined;\n\n return usePromise(asyncLoader, [options], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n return dataSource.asyncResourceFactory(options).use();\n }\n\n return useMemo(\n () => ({\n data: [],\n itemTotalCount: 0,\n }),\n [],\n );\n };\n }\n\n public getLoaderInvocationHooks(): LoaderInvocationHook[] {\n const batchesCount = times(this.list.batches.getBatchIndex() + 1, (i) => i);\n const useData = this.getUseData();\n\n return batchesCount.map((batchIndex) => ({\n useLoadBatch: () => {\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n const loaderResult = useData(loaderOptions);\n const { data, itemTotalCount, metadata } = loaderResult;\n\n useEffect(() => {\n this.loaderState.setDataBatch(batchIndex, data);\n\n if (itemTotalCount !== undefined) {\n this.list.batches.updateItemTotalCount(itemTotalCount);\n }\n\n this.loaderState.setMetadata(metadata);\n\n this.loaderState.setBatchLoadingState(batchIndex, \"loaded\");\n }, [loaderResult]);\n },\n\n useRenderSuspense: () => {\n useEffect(() => {\n this.loaderState.setBatchLoadingState(batchIndex, \"loading\");\n }, [batchIndex]);\n },\n }));\n }\n\n private getDataLoaderOptions(batchIndex: number): DataLoaderOptions<T> {\n return {\n pagination: this.manualPagination\n ? {\n limit: this.list.batches.batchSize,\n offset: this.list.batches.batchSize * batchIndex,\n }\n : undefined,\n\n sorting: this.manualSorting\n ? (Object.fromEntries(\n this.list.sorting\n .filter((s) => s.isSorted())\n .map((s) => [s.property, s.direction]),\n ) as DataLoaderOptions<T>[\"sorting\"])\n : undefined,\n\n filtering: this.manualFiltering\n ? (Object.fromEntries(\n this.list.filters\n .filter((f) => f.getValue() !== null)\n .map((f) => [\n f.property,\n {\n mode: f.mode,\n values: f.getArrayValue().map((v) => v.value),\n },\n ]),\n ) as DataLoaderOptions<T>[\"filtering\"])\n : undefined,\n\n searchString: this.manualFiltering\n ? this.list.reactTable.searchString\n : undefined,\n };\n }\n\n private getBatchDataAsyncResource(\n batchIndex: number,\n ): AsyncResource<DataLoaderResult<T>> {\n const dataSource = this.dataSource;\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n\n if (\"staticData\" in dataSource) {\n return getAsyncResource(\n async (staticData) => ({\n data: staticData as T[],\n itemTotalCount: staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies ? hash(dependencies).toString() : undefined;\n return getAsyncResource(asyncLoader, [loaderOptions], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n const asyncResourceFactory = dataSource.asyncResourceFactory;\n return asyncResourceFactory(loaderOptions);\n }\n\n throw new Error(\"Unknown data source\");\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IncrementalLoader.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/loading/IncrementalLoader.ts"],"sourcesContent":["import type List from \"@/components/List/model/List\";\nimport type {\n DataLoaderOptions,\n DataLoaderResult,\n DataSource,\n IncrementalLoaderShape,\n LoaderInvocationHook,\n} from \"@/components/List/model/loading/types\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { getAsyncResource, usePromise } from \"@mittwald/react-use-promise\";\nimport { useEffect } from \"react\";\nimport { times } from \"remeda\";\nimport { IncrementalLoaderState } from \"@/components/List/model/loading/IncrementalLoaderState\";\nimport { getListDataLoaderOptions } from \"@mittwald/flow-components-base\";\nimport { hash } from \"object-code\";\nimport type { PropertyName } from \"@/components/List/model/types\";\nimport { useMemo } from \"react\";\nimport { useComponentDefaults } from \"@/components/ComponentDefaultsProvider\";\n\nconst emptyData: never[] = [];\n\nexport class IncrementalLoader<T> {\n private readonly list: List<T>;\n private readonly dataSource: DataSource<T>;\n public readonly manualSorting: boolean;\n public readonly manualFiltering: boolean;\n public readonly manualPagination: boolean;\n public readonly disableInitialSuspenseBoundary: boolean;\n public readonly loaderState: IncrementalLoaderState<T>;\n public readonly staticDataProperties: PropertyName<T>[] = [];\n\n private constructor(list: List<T>, shape: IncrementalLoaderShape<T> = {}) {\n const { source } = shape;\n\n this.dataSource = source ?? { staticData: emptyData };\n\n const {\n disableInitialSuspenseBoundary: disableInitialSuspenseBoundaryDefault,\n } = useComponentDefaults(\"List\");\n\n this.disableInitialSuspenseBoundary =\n \"disableInitialSuspenseBoundary\" in this.dataSource\n ? (this.dataSource.disableInitialSuspenseBoundary ??\n disableInitialSuspenseBoundaryDefault)\n : disableInitialSuspenseBoundaryDefault;\n\n const manualPagination =\n \"manualPagination\" in this.dataSource\n ? this.dataSource.manualPagination\n : undefined;\n\n const manualFiltering =\n \"manualFiltering\" in this.dataSource\n ? this.dataSource.manualFiltering\n : undefined;\n\n const manualSorting =\n \"manualSorting\" in this.dataSource\n ? this.dataSource.manualSorting\n : undefined;\n\n this.list = list;\n this.loaderState = IncrementalLoaderState.useNew<T>(list);\n\n this.manualPagination = manualPagination ?? false;\n this.manualFiltering = manualFiltering ?? this.manualPagination;\n this.manualSorting = manualSorting ?? this.manualPagination;\n this.list.filters.forEach((f) => f.onFilterUpdated(() => this.reset()));\n this.list.search?.onUpdated(() => this.reset());\n\n this.initStaticDataProperties();\n }\n\n public static useNew<T>(\n list: List<T>,\n shape: IncrementalLoaderShape<T> = {},\n ): IncrementalLoader<T> {\n return new IncrementalLoader(list, shape);\n }\n\n private initStaticDataProperties() {\n const addPropertiesOfDataEntry = (data: unknown) => {\n if (typeof data !== \"object\" || data === null) {\n return;\n }\n\n (Object.keys(data) as PropertyName<T>[])\n .filter((p) => !this.staticDataProperties.includes(p))\n .forEach((p) => {\n this.staticDataProperties.push(p);\n });\n };\n\n if (\"staticData\" in this.dataSource) {\n this.dataSource.staticData\n // collect properties from just the first 100 items\n .slice(0, 100)\n .forEach(addPropertiesOfDataEntry);\n }\n }\n\n private reset(): void {\n this.loaderState.reset();\n }\n\n public useIsLoading(): boolean {\n return this.loaderState.useIsLoading();\n }\n\n public useIsInitiallyLoading(): boolean {\n return this.loaderState.useIsInitiallyLoading();\n }\n\n public useIsLoadingMore(): boolean {\n return this.loaderState.useIsLoadingMore();\n }\n\n public useData(): T[] {\n return this.loaderState.useMergedData();\n }\n\n private getUseData(): (options: DataLoaderOptions<T>) => DataLoaderResult<T> {\n const dataSource = this.dataSource;\n\n return (options: DataLoaderOptions<T>) => {\n if (\"staticData\" in dataSource) {\n return useMemo(\n () => ({\n data: dataSource.staticData,\n itemTotalCount: dataSource.staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"useData\" in dataSource) {\n return dataSource.useData(options);\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies\n ? hash(dependencies).toString()\n : undefined;\n\n return usePromise(asyncLoader, [options], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n return dataSource.asyncResourceFactory(options).use();\n }\n\n return useMemo(\n () => ({\n data: [],\n itemTotalCount: 0,\n }),\n [],\n );\n };\n }\n\n public getLoaderInvocationHooks(): LoaderInvocationHook[] {\n const batchesCount = times(this.list.batches.getBatchIndex() + 1, (i) => i);\n const useData = this.getUseData();\n\n return batchesCount.map((batchIndex) => ({\n useLoadBatch: () => {\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n const loaderResult = useData(loaderOptions);\n const { data, itemTotalCount, metadata } = loaderResult;\n\n useEffect(() => {\n this.loaderState.setDataBatch(batchIndex, data);\n\n if (itemTotalCount !== undefined) {\n this.list.batches.updateItemTotalCount(itemTotalCount);\n }\n\n this.loaderState.setMetadata(metadata);\n\n this.loaderState.setBatchLoadingState(batchIndex, \"loaded\");\n }, [loaderResult]);\n },\n\n useRenderSuspense: () => {\n useEffect(() => {\n this.loaderState.setBatchLoadingState(batchIndex, \"loading\");\n }, [batchIndex]);\n },\n }));\n }\n\n private getDataLoaderOptions(batchIndex: number): DataLoaderOptions<T> {\n return getListDataLoaderOptions<T>(\n {\n batchSize: this.list.batches.batchSize,\n modes: this,\n sorting: this.list.sorting,\n filters: this.list.filters,\n searchString: this.list.reactTable.searchString,\n },\n batchIndex,\n );\n }\n\n private getBatchDataAsyncResource(\n batchIndex: number,\n ): AsyncResource<DataLoaderResult<T>> {\n const dataSource = this.dataSource;\n const loaderOptions = this.getDataLoaderOptions(batchIndex);\n\n if (\"staticData\" in dataSource) {\n return getAsyncResource(\n async (staticData) => ({\n data: staticData as T[],\n itemTotalCount: staticData.length,\n }),\n [dataSource.staticData],\n );\n }\n\n if (\"asyncLoader\" in dataSource) {\n const asyncLoader = dataSource.asyncLoader;\n const dependencies = dataSource.dependencies;\n const loaderId = dependencies ? hash(dependencies).toString() : undefined;\n return getAsyncResource(asyncLoader, [loaderOptions], {\n loaderId,\n });\n }\n\n if (\"asyncResourceFactory\" in dataSource) {\n const asyncResourceFactory = dataSource.asyncResourceFactory;\n return asyncResourceFactory(loaderOptions);\n }\n\n throw new Error(\"Unknown data source\");\n }\n}\n"],"mappings":"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"}
|
package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs
CHANGED
|
@@ -2,87 +2,39 @@
|
|
|
2
2
|
/* */
|
|
3
3
|
import useSelector from "../../../../lib/mobx/useSelector.mjs";
|
|
4
4
|
import { useStatic } from "../../../../lib/hooks/useStatic.mjs";
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import { ListLoaderState } from "../../../../../../components-base/src/list/loading/ListLoaderState.mjs";
|
|
6
|
+
import "../../../../../../components-base/src/index.mjs";
|
|
7
7
|
//#region src/components/List/model/loading/IncrementalLoaderState.ts
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
/**
|
|
9
|
+
* React's view of the list's loading state.
|
|
10
|
+
*
|
|
11
|
+
* Everything the state _is_ — the batches, the deduplication, what counts as
|
|
12
|
+
* loading — lives in `ListLoaderState` in `@mittwald/flow-components-base`, so
|
|
13
|
+
* the Vue binding runs the same rules rather than a second implementation of
|
|
14
|
+
* them. What is left here is the subscription: MobX is framework-agnostic,
|
|
15
|
+
* reading it in a component is not.
|
|
16
|
+
*/
|
|
17
|
+
var IncrementalLoaderState = class IncrementalLoaderState extends ListLoaderState {
|
|
13
18
|
list;
|
|
14
|
-
isInitiallyLoading = true;
|
|
15
19
|
constructor(list) {
|
|
20
|
+
super({ getItemId: list.getItemId });
|
|
16
21
|
this.list = list;
|
|
17
|
-
makeObservable(this, {
|
|
18
|
-
prevDataBatches: false,
|
|
19
|
-
useMergedData: false,
|
|
20
|
-
useIsLoading: false,
|
|
21
|
-
useIsLoadingMore: false,
|
|
22
|
-
dataBatches: observable.shallow,
|
|
23
|
-
batchLoadingStates: observable.shallow,
|
|
24
|
-
metadata: observable,
|
|
25
|
-
mergedData: computed,
|
|
26
|
-
isLoading: computed,
|
|
27
|
-
isLoadingMore: computed,
|
|
28
|
-
isInitiallyLoading: observable,
|
|
29
|
-
setIsInitiallyLoading: action.bound,
|
|
30
|
-
reset: action.bound,
|
|
31
|
-
setDataBatch: action.bound,
|
|
32
|
-
setBatchLoadingState: action.bound,
|
|
33
|
-
setMetadata: action.bound
|
|
34
|
-
});
|
|
35
22
|
}
|
|
36
23
|
static useNew(list) {
|
|
37
24
|
return useStatic(() => new IncrementalLoaderState(list));
|
|
38
25
|
}
|
|
39
|
-
reset() {
|
|
40
|
-
this.batchLoadingStates = [];
|
|
41
|
-
this.dataBatches = [];
|
|
42
|
-
}
|
|
43
|
-
setDataBatch(index, data) {
|
|
44
|
-
if (this.dataBatches.length === 0) this.prevDataBatches = [];
|
|
45
|
-
if (this.dataBatches[index] !== data) {
|
|
46
|
-
this.dataBatches[index] = data;
|
|
47
|
-
this.prevDataBatches[index] = data;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
setBatchLoadingState(index, state) {
|
|
51
|
-
if (state === "error" || state === "loaded") this.setIsInitiallyLoading(false);
|
|
52
|
-
if (this.batchLoadingStates[index] !== state) this.batchLoadingStates[index] = state;
|
|
53
|
-
}
|
|
54
|
-
setMetadata(metadata) {
|
|
55
|
-
this.metadata = metadata;
|
|
56
|
-
}
|
|
57
|
-
setIsInitiallyLoading(isInitiallyLoading) {
|
|
58
|
-
this.isInitiallyLoading = isInitiallyLoading;
|
|
59
|
-
}
|
|
60
|
-
get mergedData() {
|
|
61
|
-
const merged = (this.dataBatches.length === 0 ? this.prevDataBatches : this.dataBatches).flatMap((d) => d);
|
|
62
|
-
if (this.list.getItemId) return uniqueBy(merged, this.list.getItemId);
|
|
63
|
-
else return merged;
|
|
64
|
-
}
|
|
65
26
|
useMergedData() {
|
|
66
27
|
return useSelector(() => this.mergedData, [this.prevDataBatches]);
|
|
67
28
|
}
|
|
68
|
-
get isLoading() {
|
|
69
|
-
return this.batchLoadingStates.some((s) => s === "loading" || s === "void");
|
|
70
|
-
}
|
|
71
29
|
useIsLoading() {
|
|
72
30
|
return useSelector(() => this.isLoading);
|
|
73
31
|
}
|
|
74
|
-
get isLoadingMore() {
|
|
75
|
-
return this.isLoading && this.dataBatches.length > 0;
|
|
76
|
-
}
|
|
77
32
|
useIsLoadingMore() {
|
|
78
33
|
return useSelector(() => this.isLoadingMore);
|
|
79
34
|
}
|
|
80
35
|
useIsInitiallyLoading() {
|
|
81
36
|
return useSelector(() => this.isInitiallyLoading);
|
|
82
37
|
}
|
|
83
|
-
isBatchLoaded(batchIndex) {
|
|
84
|
-
return batchIndex in this.dataBatches;
|
|
85
|
-
}
|
|
86
38
|
};
|
|
87
39
|
//#endregion
|
|
88
40
|
export { IncrementalLoaderState };
|
package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalLoaderState.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/loading/IncrementalLoaderState.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"IncrementalLoaderState.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/loading/IncrementalLoaderState.ts"],"sourcesContent":["import useSelector from \"@/lib/mobx/useSelector\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport type List from \"@/components/List/model/List\";\nimport { ListLoaderState } from \"@mittwald/flow-components-base\";\n\n/**\n * React's view of the list's loading state.\n *\n * Everything the state _is_ — the batches, the deduplication, what counts as\n * loading — lives in `ListLoaderState` in `@mittwald/flow-components-base`, so\n * the Vue binding runs the same rules rather than a second implementation of\n * them. What is left here is the subscription: MobX is framework-agnostic,\n * reading it in a component is not.\n */\nexport class IncrementalLoaderState<T> extends ListLoaderState<T> {\n public readonly list: List<T>;\n\n private constructor(list: List<T>) {\n super({ getItemId: list.getItemId });\n this.list = list;\n }\n\n public static useNew<T>(list: List<T>): IncrementalLoaderState<T> {\n return useStatic(() => new IncrementalLoaderState<T>(list));\n }\n\n public useMergedData(): T[] {\n return useSelector(() => this.mergedData, [this.prevDataBatches]);\n }\n\n public useIsLoading(): boolean {\n return useSelector(() => this.isLoading);\n }\n\n public useIsLoadingMore(): boolean {\n return useSelector(() => this.isLoadingMore);\n }\n\n public useIsInitiallyLoading(): boolean {\n return useSelector(() => this.isInitiallyLoading);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,IAAa,yBAAb,MAAa,+BAAkC,gBAAmB;CAChE;CAEA,YAAoB,MAAe;EACjC,MAAM,EAAE,WAAW,KAAK,UAAU,CAAC;EACnC,KAAK,OAAO;CACd;CAEA,OAAc,OAAU,MAA0C;EAChE,OAAO,gBAAgB,IAAI,uBAA0B,IAAI,CAAC;CAC5D;CAEA,gBAA4B;EAC1B,OAAO,kBAAkB,KAAK,YAAY,CAAC,KAAK,eAAe,CAAC;CAClE;CAEA,eAA+B;EAC7B,OAAO,kBAAkB,KAAK,SAAS;CACzC;CAEA,mBAAmC;EACjC,OAAO,kBAAkB,KAAK,aAAa;CAC7C;CAEA,wBAAwC;EACtC,OAAO,kBAAkB,KAAK,kBAAkB;CAClD;AACF"}
|
|
@@ -1,55 +1,27 @@
|
|
|
1
1
|
"use client"
|
|
2
2
|
/* */
|
|
3
|
+
import { ListSearch } from "../../../../../../components-base/src/list/search/ListSearch.mjs";
|
|
4
|
+
import "../../../../../../components-base/src/index.mjs";
|
|
3
5
|
//#region src/components/List/model/search/Search.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* React's search: the shared one plus how the field is rendered.
|
|
8
|
+
*
|
|
9
|
+
* The term, its initial value and its persistence are `ListSearch` in
|
|
10
|
+
* `@mittwald/flow-components-base`. `render` and `textFieldProps` stay here — a
|
|
11
|
+
* component type and Flow's `SearchField` props are React, and a binding brings
|
|
12
|
+
* its own.
|
|
13
|
+
*/
|
|
14
|
+
var Search = class extends ListSearch {
|
|
6
15
|
render;
|
|
7
16
|
textFieldProps;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.render = render;
|
|
17
|
-
this.textFieldProps = textFieldProps;
|
|
18
|
-
this.defaultValue = defaultValue;
|
|
19
|
-
this.initialValue = this.getInitialValue();
|
|
20
|
-
}
|
|
21
|
-
get value() {
|
|
22
|
-
return this.list.reactTable.searchString;
|
|
23
|
-
}
|
|
24
|
-
get isSet() {
|
|
25
|
-
return this.value !== void 0;
|
|
26
|
-
}
|
|
27
|
-
callOnUpdateCallbacks() {
|
|
28
|
-
this.onUpdateCallbacks.forEach((cb) => cb());
|
|
29
|
-
}
|
|
30
|
-
getInitialValue() {
|
|
31
|
-
return this.list.settingsStorage?.get("search", { autosave: this.autosave })?.value ?? this.defaultValue;
|
|
32
|
-
}
|
|
33
|
-
updateInitialState(initialState) {
|
|
34
|
-
initialState.globalFilter = this.initialValue;
|
|
35
|
-
}
|
|
36
|
-
setValue(value) {
|
|
37
|
-
if (value === void 0 || value.trim() === "") {
|
|
38
|
-
if (this.list.reactTable.table.getState().globalFilter) {
|
|
39
|
-
this.list.reactTable.table.setGlobalFilter(void 0);
|
|
40
|
-
this.callOnUpdateCallbacks();
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
this.list.reactTable.table.setGlobalFilter(value);
|
|
44
|
-
this.callOnUpdateCallbacks();
|
|
45
|
-
}
|
|
46
|
-
this.list.settingsStorage?.store("search", { value }, { autosave: this.autosave });
|
|
47
|
-
}
|
|
48
|
-
clear() {
|
|
49
|
-
this.setValue(void 0);
|
|
50
|
-
}
|
|
51
|
-
onUpdated(cb) {
|
|
52
|
-
this.onUpdateCallbacks.add(cb);
|
|
17
|
+
constructor(context, shape) {
|
|
18
|
+
super(context, shape);
|
|
19
|
+
this.render = shape.render;
|
|
20
|
+
this.textFieldProps = shape.textFieldProps;
|
|
21
|
+
}
|
|
22
|
+
/** The list this search belongs to — `context`, typed as React's `List`. */
|
|
23
|
+
get list() {
|
|
24
|
+
return this.context;
|
|
53
25
|
}
|
|
54
26
|
};
|
|
55
27
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/search/Search.ts"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"file":"Search.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/search/Search.ts"],"sourcesContent":["import type { SearchShape } from \"@/components/List/model/search/types\";\nimport type { ListModelContext } from \"@mittwald/flow-components-base\";\nimport { ListSearch } from \"@mittwald/flow-components-base\";\nimport type { List } from \"@/components/List/model/List\";\n\n/**\n * React's search: the shared one plus how the field is rendered.\n *\n * The term, its initial value and its persistence are `ListSearch` in\n * `@mittwald/flow-components-base`. `render` and `textFieldProps` stay here — a\n * component type and Flow's `SearchField` props are React, and a binding brings\n * its own.\n */\nexport class Search<T> extends ListSearch<T> {\n public readonly render?: SearchShape<T>[\"render\"];\n public readonly textFieldProps: SearchShape<T>[\"textFieldProps\"];\n\n public constructor(context: ListModelContext<T>, shape: SearchShape<T>) {\n super(context, shape);\n this.render = shape.render;\n this.textFieldProps = shape.textFieldProps;\n }\n\n /** The list this search belongs to — `context`, typed as React's `List`. */\n public get list(): List<T> {\n return this.context as List<T>;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAa,SAAb,cAA+B,WAAc;CAC3C;CACA;CAEA,YAAmB,SAA8B,OAAuB;EACtE,MAAM,SAAS,KAAK;EACpB,KAAK,SAAS,MAAM;EACpB,KAAK,iBAAiB,MAAM;CAC9B;;CAGA,IAAW,OAAgB;EACzB,OAAO,KAAK;CACd;AACF"}
|