@mittwald/flow-react-components 1.5.0-next.48 → 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.
Files changed (136) hide show
  1. package/AGENTS.md +37 -0
  2. package/dist/assets/component-index.json +1 -1
  3. package/dist/assets/doc-properties.json +1 -1
  4. package/dist/js/node_modules/.pnpm/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.mjs.map +1 -1
  5. package/dist/js/packages/components/src/components/Action/models/ActionState.mjs +8 -70
  6. package/dist/js/packages/components/src/components/Action/models/ActionState.mjs.map +1 -1
  7. package/dist/js/packages/components/src/components/Calendar/components/RangeCalendar/helpers/useCalendarDateRangePresets.mjs +1 -1
  8. package/dist/js/packages/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs +1 -1
  9. package/dist/js/packages/components/src/components/List/components/Header/components/ActiveFilters/ActiveFilters.mjs.map +1 -1
  10. package/dist/js/packages/components/src/components/List/model/List.mjs +15 -4
  11. package/dist/js/packages/components/src/components/List/model/List.mjs.map +1 -1
  12. package/dist/js/packages/components/src/components/List/model/ListSettingsStore.mjs.map +1 -1
  13. package/dist/js/packages/components/src/components/List/model/ListViewMode.mjs +35 -23
  14. package/dist/js/packages/components/src/components/List/model/ListViewMode.mjs.map +1 -1
  15. package/dist/js/packages/components/src/components/List/model/ReactTable.mjs +16 -10
  16. package/dist/js/packages/components/src/components/List/model/ReactTable.mjs.map +1 -1
  17. package/dist/js/packages/components/src/components/List/model/filter/DateRangeFilter.mjs +25 -13
  18. package/dist/js/packages/components/src/components/List/model/filter/DateRangeFilter.mjs.map +1 -1
  19. package/dist/js/packages/components/src/components/List/model/filter/Filter.mjs +20 -181
  20. package/dist/js/packages/components/src/components/List/model/filter/Filter.mjs.map +1 -1
  21. package/dist/js/packages/components/src/components/List/model/item/ItemCollection.mjs +11 -7
  22. package/dist/js/packages/components/src/components/List/model/item/ItemCollection.mjs.map +1 -1
  23. package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoader.mjs +10 -13
  24. package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoader.mjs.map +1 -1
  25. package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs +13 -61
  26. package/dist/js/packages/components/src/components/List/model/loading/IncrementalLoaderState.mjs.map +1 -1
  27. package/dist/js/packages/components/src/components/List/model/search/Search.mjs +19 -47
  28. package/dist/js/packages/components/src/components/List/model/search/Search.mjs.map +1 -1
  29. package/dist/js/packages/components/src/components/List/model/sorting/Sorting.mjs +15 -54
  30. package/dist/js/packages/components/src/components/List/model/sorting/Sorting.mjs.map +1 -1
  31. package/dist/js/packages/components/src/components/List/model/sorting/SortingFunctions.mjs.map +1 -1
  32. package/dist/js/packages/components/src/lib/remote/eventHandlerContext.mjs +3 -1
  33. package/dist/js/packages/components/src/lib/remote/eventHandlerContext.mjs.map +1 -1
  34. package/dist/js/packages/components-base/src/action/ActionState.mjs +87 -0
  35. package/dist/js/packages/components-base/src/action/ActionState.mjs.map +1 -0
  36. package/dist/js/packages/components-base/src/index.mjs +18 -0
  37. package/dist/js/packages/components-base/src/lib/array.mjs +9 -0
  38. package/dist/js/packages/components-base/src/lib/array.mjs.map +1 -0
  39. package/dist/js/packages/components-base/src/list/ListModelContext.mjs +19 -0
  40. package/dist/js/packages/components-base/src/list/ListModelContext.mjs.map +1 -0
  41. package/dist/js/packages/components-base/src/list/filter/ListDateRangeFilter.mjs +29 -0
  42. package/dist/js/packages/components-base/src/list/filter/ListDateRangeFilter.mjs.map +1 -0
  43. package/dist/js/packages/components-base/src/list/filter/ListFilter.mjs +229 -0
  44. package/dist/js/packages/components-base/src/list/filter/ListFilter.mjs.map +1 -0
  45. package/dist/js/packages/components-base/src/list/filter/ListFilterValue.mjs +51 -0
  46. package/dist/js/packages/components-base/src/list/filter/ListFilterValue.mjs.map +1 -0
  47. package/dist/js/packages/components-base/src/list/filter/dateRange.mjs +51 -0
  48. package/dist/js/packages/components-base/src/list/filter/dateRange.mjs.map +1 -0
  49. package/dist/js/packages/components-base/src/list/item/ListItem.mjs +21 -0
  50. package/dist/js/packages/components-base/src/list/item/ListItem.mjs.map +1 -0
  51. package/dist/js/packages/components-base/src/list/item/ListItemCollection.mjs +24 -0
  52. package/dist/js/packages/components-base/src/list/item/ListItemCollection.mjs.map +1 -0
  53. package/dist/js/packages/components-base/src/list/loading/ListLoaderState.mjs +86 -0
  54. package/dist/js/packages/components-base/src/list/loading/ListLoaderState.mjs.map +1 -0
  55. package/dist/js/packages/components-base/src/list/loading/types.mjs +29 -0
  56. package/dist/js/packages/components-base/src/list/loading/types.mjs.map +1 -0
  57. package/dist/js/packages/components-base/src/list/pagination/ListBatchesController.mjs +64 -0
  58. package/dist/js/packages/components-base/src/list/pagination/ListBatchesController.mjs.map +1 -0
  59. package/dist/js/packages/components-base/src/list/search/ListSearch.mjs +62 -0
  60. package/dist/js/packages/components-base/src/list/search/ListSearch.mjs.map +1 -0
  61. package/dist/js/packages/components-base/src/list/sorting/ListSorting.mjs +81 -0
  62. package/dist/js/packages/components-base/src/list/sorting/ListSorting.mjs.map +1 -0
  63. package/dist/js/packages/components-base/src/list/table/ListTable.mjs +80 -0
  64. package/dist/js/packages/components-base/src/list/table/ListTable.mjs.map +1 -0
  65. package/dist/js/packages/components-base/src/list/viewMode/ListViewMode.mjs +53 -0
  66. package/dist/js/packages/components-base/src/list/viewMode/ListViewMode.mjs.map +1 -0
  67. package/dist/types/_bundled/flow-components-base/action/ActionState.d.ts +36 -0
  68. package/dist/types/_bundled/flow-components-base/index.d.ts +23 -0
  69. package/dist/types/_bundled/flow-components-base/lib/array.d.ts +4 -0
  70. package/dist/types/_bundled/flow-components-base/list/ListModelContext.d.ts +30 -0
  71. package/dist/types/_bundled/flow-components-base/list/filter/ListDateRangeFilter.d.ts +18 -0
  72. package/dist/types/_bundled/flow-components-base/list/filter/ListFilter.d.ts +104 -0
  73. package/dist/types/_bundled/flow-components-base/list/filter/ListFilterValue.d.ts +21 -0
  74. package/dist/types/_bundled/flow-components-base/list/filter/dateRange.d.ts +23 -0
  75. package/dist/types/_bundled/flow-components-base/list/filter/types.d.ts +18 -0
  76. package/dist/types/_bundled/flow-components-base/list/item/ListItem.d.ts +10 -0
  77. package/dist/types/_bundled/flow-components-base/list/item/ListItemCollection.d.ts +14 -0
  78. package/dist/types/_bundled/flow-components-base/list/loading/ListLoaderState.d.ts +44 -0
  79. package/dist/types/_bundled/flow-components-base/list/loading/types.d.ts +69 -0
  80. package/dist/types/_bundled/flow-components-base/list/pagination/ListBatchesController.d.ts +32 -0
  81. package/dist/types/_bundled/flow-components-base/list/pagination/types.d.ts +17 -0
  82. package/dist/types/_bundled/flow-components-base/list/search/ListSearch.d.ts +27 -0
  83. package/dist/types/_bundled/flow-components-base/list/search/types.d.ts +5 -0
  84. package/dist/types/_bundled/flow-components-base/list/settings/types.d.ts +52 -0
  85. package/dist/types/_bundled/flow-components-base/list/sorting/ListSorting.d.ts +40 -0
  86. package/dist/types/_bundled/flow-components-base/list/sorting/types.d.ts +14 -0
  87. package/dist/types/_bundled/flow-components-base/list/table/ListTable.d.ts +34 -0
  88. package/dist/types/_bundled/flow-components-base/list/types.d.ts +18 -0
  89. package/dist/types/_bundled/flow-components-base/list/viewMode/ListViewMode.d.ts +25 -0
  90. package/dist/types/_bundled/flow-components-base/list/viewMode/types.d.ts +10 -0
  91. package/dist/types/components/Action/models/ActionState.d.ts +8 -21
  92. package/dist/types/components/List/components/Header/lib.d.ts +1 -2
  93. package/dist/types/components/List/model/List.d.ts +6 -1
  94. package/dist/types/components/List/model/ListSettingsStore.d.ts +2 -4
  95. package/dist/types/components/List/model/ListViewMode.d.ts +17 -10
  96. package/dist/types/components/List/model/ReactTable.d.ts +1 -1
  97. package/dist/types/components/List/model/filter/DateRangeFilter.d.ts +21 -9
  98. package/dist/types/components/List/model/filter/Filter.d.ts +18 -52
  99. package/dist/types/components/List/model/filter/FilterValue.d.ts +10 -11
  100. package/dist/types/components/List/model/filter/types.d.ts +6 -18
  101. package/dist/types/components/List/model/item/Item.d.ts +8 -7
  102. package/dist/types/components/List/model/item/ItemCollection.d.ts +9 -4
  103. package/dist/types/components/List/model/loading/IncrementalLoaderState.d.ts +11 -21
  104. package/dist/types/components/List/model/loading/types.d.ts +5 -26
  105. package/dist/types/components/List/model/pagination/BatchesController.d.ts +1 -15
  106. package/dist/types/components/List/model/pagination/types.d.ts +1 -3
  107. package/dist/types/components/List/model/search/Search.d.ts +16 -19
  108. package/dist/types/components/List/model/search/types.d.ts +6 -8
  109. package/dist/types/components/List/model/sorting/Sorting.d.ts +14 -22
  110. package/dist/types/components/List/model/sorting/SortingFunctions.d.ts +1 -1
  111. package/dist/types/components/List/model/sorting/types.d.ts +1 -13
  112. package/dist/types/components/List/model/types.d.ts +7 -24
  113. package/dist/types/components/List/typedList.d.ts +2 -2
  114. package/dist/types/lib/remote/eventHandlerContext.d.ts +2 -1
  115. package/package.json +11 -10
  116. package/dist/js/packages/components/src/components/List/model/filter/FilterValue.mjs +0 -43
  117. package/dist/js/packages/components/src/components/List/model/filter/FilterValue.mjs.map +0 -1
  118. package/dist/js/packages/components/src/components/List/model/filter/dateRangeFilterFn.mjs +0 -23
  119. package/dist/js/packages/components/src/components/List/model/filter/dateRangeFilterFn.mjs.map +0 -1
  120. package/dist/js/packages/components/src/components/List/model/item/Item.mjs +0 -20
  121. package/dist/js/packages/components/src/components/List/model/item/Item.mjs.map +0 -1
  122. package/dist/js/packages/components/src/components/List/model/pagination/BatchesController.mjs +0 -58
  123. package/dist/js/packages/components/src/components/List/model/pagination/BatchesController.mjs.map +0 -1
  124. package/dist/js/packages/components/src/lib/array/toArray.mjs +0 -8
  125. package/dist/js/packages/components/src/lib/array/toArray.mjs.map +0 -1
  126. package/dist/js/packages/components/src/lib/date/transformDateValueToDateTime.mjs +0 -15
  127. package/dist/js/packages/components/src/lib/date/transformDateValueToDateTime.mjs.map +0 -1
  128. package/dist/js/packages/components/src/lib/promises/sleep.mjs +0 -8
  129. package/dist/js/packages/components/src/lib/promises/sleep.mjs.map +0 -1
  130. package/dist/types/components/CartesianChart/typedCartesianChart.test-types.d.ts +0 -1
  131. package/dist/types/components/List/model/filter/dateRangeFilterFn.d.ts +0 -6
  132. package/dist/types/components/List/typedList.test-types.d.ts +0 -1
  133. package/dist/types/integrations/@mittwald/password-tools-js/passwordCreationFieldExport.test-types.d.ts +0 -1
  134. package/dist/types/lib/array/toArray.d.ts +0 -1
  135. package/dist/types/lib/types/array.d.ts +0 -1
  136. package/dist/types/lib/types/props.test-types.d.ts +0 -1
@@ -1,193 +1,32 @@
1
1
  "use client"
2
2
  /* */
3
- import { FilterValue } from "./FilterValue.mjs";
4
- import { toArray } from "../../../../lib/array/toArray.mjs";
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
- var equalsPropertyMatcher = (filterValue, propertyValue) => filterValue === propertyValue;
9
- var selectAllMinValueCount = 6;
10
- var stringCastRenderMethod = (value) => String(value);
11
- var Filter = class {
12
- _values;
13
- _valuesFromTableState;
14
- list;
15
- property;
16
- mode;
17
- matcher;
18
- renderItem;
19
- name;
20
- autosave;
21
- manualSave;
22
- onFilterChangeCallbacks = /* @__PURE__ */ new Set();
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 this._values ?? this.valuesFromTableState;
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
- const value = this.getValue();
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 { Item } from "./Item.mjs";
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
- var ItemCollection = class {
6
- list;
7
- constructor(list) {
8
- this.list = list;
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 this.list.reactTable.table.getRowModel().rows.map((r) => Item.fromRow(this, r));
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 List from \"@/components/List/model/List\";\nimport { Item } from \"@/components/List/model/item/Item\";\n\nexport class ItemCollection<T> {\n public readonly list: List<T>;\n\n public constructor(list: List<T>) {\n this.list = list;\n }\n\n public get entries(): Item<T>[] {\n return this.list.reactTable.table\n .getRowModel()\n .rows.map((r) => Item.fromRow(this, r));\n }\n}\n"],"mappings":";;;;AAGA,IAAa,iBAAb,MAA+B;CAC7B;CAEA,YAAmB,MAAe;EAChC,KAAK,OAAO;CACd;CAEA,IAAW,UAAqB;EAC9B,OAAO,KAAK,KAAK,WAAW,MACzB,YAAY,CAAC,CACb,KAAK,KAAK,MAAM,KAAK,QAAQ,MAAM,CAAC,CAAC;CAC1C;AACF"}
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
- pagination: this.manualPagination ? {
110
- limit: this.list.batches.batchSize,
111
- offset: this.list.batches.batchSize * batchIndex
112
- } : void 0,
113
- sorting: this.manualSorting ? Object.fromEntries(this.list.sorting.filter((s) => s.isSorted()).map((s) => [s.property, s.direction])) : void 0,
114
- filtering: this.manualFiltering ? Object.fromEntries(this.list.filters.filter((f) => f.getValue() !== null).map((f) => [f.property, {
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;
@@ -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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"}
@@ -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 { uniqueBy } from "remeda";
6
- import { action, computed, makeObservable, observable } from "mobx";
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
- var IncrementalLoaderState = class IncrementalLoaderState {
9
- dataBatches = [];
10
- prevDataBatches = [];
11
- batchLoadingStates = ["void"];
12
- metadata = void 0;
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 };
@@ -1 +1 @@
1
- {"version":3,"file":"IncrementalLoaderState.mjs","names":[],"sources":["../../../../../../../../../src/components/List/model/loading/IncrementalLoaderState.ts"],"sourcesContent":["import type { ListData } from \"@/components/List/model/loading/types\";\nimport useSelector from \"@/lib/mobx/useSelector\";\nimport type { AsyncResource } from \"@mittwald/react-use-promise\";\nimport { action, computed, makeObservable, observable } from \"mobx\";\nimport { useStatic } from \"@/lib/hooks/useStatic\";\nimport type List from \"@/components/List/model/List\";\nimport { uniqueBy } from \"remeda\";\n\ntype AsyncResourceLoadingState = AsyncResource[\"state\"][\"value\"];\ntype DataBatches<T> = ListData<T>[];\ntype BatchesLoadingState = AsyncResourceLoadingState[];\n\nexport class IncrementalLoaderState<T> {\n public dataBatches: DataBatches<T> = [];\n public prevDataBatches: DataBatches<T> = [];\n public batchLoadingStates: BatchesLoadingState = [\"void\"];\n public metadata?: unknown = undefined;\n public readonly list: List<T>;\n public isInitiallyLoading = true;\n\n private constructor(list: List<T>) {\n this.list = list;\n makeObservable(this, {\n prevDataBatches: false,\n useMergedData: false,\n useIsLoading: false,\n useIsLoadingMore: false,\n dataBatches: observable.shallow,\n batchLoadingStates: observable.shallow,\n metadata: observable,\n mergedData: computed,\n isLoading: computed,\n isLoadingMore: computed,\n isInitiallyLoading: observable,\n setIsInitiallyLoading: action.bound,\n reset: action.bound,\n setDataBatch: action.bound,\n setBatchLoadingState: action.bound,\n setMetadata: action.bound,\n });\n }\n\n public static useNew<T>(list: List<T>): IncrementalLoaderState<T> {\n return useStatic(() => new IncrementalLoaderState<T>(list));\n }\n\n public reset(): void {\n this.batchLoadingStates = [];\n this.dataBatches = [];\n }\n\n public setDataBatch(index: number, data: ListData<T>): void {\n if (this.dataBatches.length === 0) {\n this.prevDataBatches = [];\n }\n\n if (this.dataBatches[index] !== data) {\n this.dataBatches[index] = data;\n this.prevDataBatches[index] = data;\n }\n }\n\n public setBatchLoadingState(\n index: number,\n state: AsyncResourceLoadingState,\n ): void {\n if (state === \"error\" || state === \"loaded\") {\n this.setIsInitiallyLoading(false);\n }\n if (this.batchLoadingStates[index] !== state) {\n this.batchLoadingStates[index] = state;\n }\n }\n\n public setMetadata(metadata?: unknown): void {\n this.metadata = metadata;\n }\n\n public setIsInitiallyLoading(isInitiallyLoading: boolean): void {\n this.isInitiallyLoading = isInitiallyLoading;\n }\n\n public get mergedData(): T[] {\n const dataBatches =\n this.dataBatches.length === 0 ? this.prevDataBatches : this.dataBatches;\n\n const merged = dataBatches.flatMap((d) => d);\n if (this.list.getItemId) {\n return uniqueBy(merged, this.list.getItemId);\n } else {\n return merged;\n }\n }\n\n public useMergedData(): T[] {\n return useSelector(() => this.mergedData, [this.prevDataBatches]);\n }\n\n public get isLoading(): boolean {\n return this.batchLoadingStates.some((s) => s === \"loading\" || s === \"void\");\n }\n\n public useIsLoading(): boolean {\n return useSelector(() => this.isLoading);\n }\n\n public get isLoadingMore(): boolean {\n return this.isLoading && this.dataBatches.length > 0;\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 public isBatchLoaded(batchIndex: number) {\n return batchIndex in this.dataBatches;\n }\n}\n"],"mappings":";;;;;;;AAYA,IAAa,yBAAb,MAAa,uBAA0B;CACrC,cAAqC,CAAC;CACtC,kBAAyC,CAAC;CAC1C,qBAAiD,CAAC,MAAM;CACxD,WAA4B,KAAA;CAC5B;CACA,qBAA4B;CAE5B,YAAoB,MAAe;EACjC,KAAK,OAAO;EACZ,eAAe,MAAM;GACnB,iBAAiB;GACjB,eAAe;GACf,cAAc;GACd,kBAAkB;GAClB,aAAa,WAAW;GACxB,oBAAoB,WAAW;GAC/B,UAAU;GACV,YAAY;GACZ,WAAW;GACX,eAAe;GACf,oBAAoB;GACpB,uBAAuB,OAAO;GAC9B,OAAO,OAAO;GACd,cAAc,OAAO;GACrB,sBAAsB,OAAO;GAC7B,aAAa,OAAO;EACtB,CAAC;CACH;CAEA,OAAc,OAAU,MAA0C;EAChE,OAAO,gBAAgB,IAAI,uBAA0B,IAAI,CAAC;CAC5D;CAEA,QAAqB;EACnB,KAAK,qBAAqB,CAAC;EAC3B,KAAK,cAAc,CAAC;CACtB;CAEA,aAAoB,OAAe,MAAyB;EAC1D,IAAI,KAAK,YAAY,WAAW,GAC9B,KAAK,kBAAkB,CAAC;EAG1B,IAAI,KAAK,YAAY,WAAW,MAAM;GACpC,KAAK,YAAY,SAAS;GAC1B,KAAK,gBAAgB,SAAS;EAChC;CACF;CAEA,qBACE,OACA,OACM;EACN,IAAI,UAAU,WAAW,UAAU,UACjC,KAAK,sBAAsB,KAAK;EAElC,IAAI,KAAK,mBAAmB,WAAW,OACrC,KAAK,mBAAmB,SAAS;CAErC;CAEA,YAAmB,UAA0B;EAC3C,KAAK,WAAW;CAClB;CAEA,sBAA6B,oBAAmC;EAC9D,KAAK,qBAAqB;CAC5B;CAEA,IAAW,aAAkB;EAI3B,MAAM,UAFJ,KAAK,YAAY,WAAW,IAAI,KAAK,kBAAkB,KAAK,YAAA,CAEnC,SAAS,MAAM,CAAC;EAC3C,IAAI,KAAK,KAAK,WACZ,OAAO,SAAS,QAAQ,KAAK,KAAK,SAAS;OAE3C,OAAO;CAEX;CAEA,gBAA4B;EAC1B,OAAO,kBAAkB,KAAK,YAAY,CAAC,KAAK,eAAe,CAAC;CAClE;CAEA,IAAW,YAAqB;EAC9B,OAAO,KAAK,mBAAmB,MAAM,MAAM,MAAM,aAAa,MAAM,MAAM;CAC5E;CAEA,eAA+B;EAC7B,OAAO,kBAAkB,KAAK,SAAS;CACzC;CAEA,IAAW,gBAAyB;EAClC,OAAO,KAAK,aAAa,KAAK,YAAY,SAAS;CACrD;CAEA,mBAAmC;EACjC,OAAO,kBAAkB,KAAK,aAAa;CAC7C;CAEA,wBAAwC;EACtC,OAAO,kBAAkB,KAAK,kBAAkB;CAClD;CAEA,cAAqB,YAAoB;EACvC,OAAO,cAAc,KAAK;CAC5B;AACF"}
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
- var Search = class {
5
- list;
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
- onUpdateCallbacks = /* @__PURE__ */ new Set();
9
- initialValue;
10
- defaultValue;
11
- autosave;
12
- constructor(list, searchShape) {
13
- const { autosave = list.settingsStorageDefaults?.search?.autosave ?? false, render, textFieldProps, defaultValue } = searchShape;
14
- this.autosave = autosave;
15
- this.list = list;
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 List from \"@/components/List/model/List\";\nimport type {\n SearchFieldRenderComponent,\n SearchShape,\n SearchValue,\n} from \"@/components/List/model/search/types\";\nimport type { InitialTableState } from \"@tanstack/react-table\";\n\nexport class Search<T> {\n public readonly list: List<T>;\n public readonly render?: SearchFieldRenderComponent;\n public readonly textFieldProps: SearchShape<T>[\"textFieldProps\"];\n private onUpdateCallbacks = new Set<() => unknown>();\n private readonly initialValue?: string;\n private readonly defaultValue?: string;\n private readonly autosave: boolean;\n\n public constructor(list: List<T>, searchShape: SearchShape<T>) {\n const {\n autosave = list.settingsStorageDefaults?.search?.autosave ?? false,\n render,\n textFieldProps,\n defaultValue,\n } = searchShape;\n\n this.autosave = autosave;\n this.list = list;\n this.render = render;\n this.textFieldProps = textFieldProps;\n this.defaultValue = defaultValue;\n\n this.initialValue = this.getInitialValue();\n }\n\n public get value(): SearchValue {\n return this.list.reactTable.searchString;\n }\n\n public get isSet() {\n return this.value !== undefined;\n }\n\n private callOnUpdateCallbacks(): void {\n this.onUpdateCallbacks.forEach((cb) => cb());\n }\n\n private getInitialValue() {\n return (\n this.list.settingsStorage?.get(\"search\", { autosave: this.autosave })\n ?.value ?? this.defaultValue\n );\n }\n\n public updateInitialState(initialState: InitialTableState) {\n initialState.globalFilter = this.initialValue;\n }\n\n public setValue(value: SearchValue): void {\n if (value === undefined || value.trim() === \"\") {\n if (this.list.reactTable.table.getState().globalFilter) {\n this.list.reactTable.table.setGlobalFilter(undefined);\n this.callOnUpdateCallbacks();\n }\n } else {\n this.list.reactTable.table.setGlobalFilter(value);\n this.callOnUpdateCallbacks();\n }\n\n this.list.settingsStorage?.store(\n \"search\",\n { value },\n { autosave: this.autosave },\n );\n }\n\n public clear(): void {\n this.setValue(undefined);\n }\n\n public onUpdated(cb: () => unknown): void {\n this.onUpdateCallbacks.add(cb);\n }\n}\n"],"mappings":";;;AAQA,IAAa,SAAb,MAAuB;CACrB;CACA;CACA;CACA,oCAA4B,IAAI,IAAmB;CACnD;CACA;CACA;CAEA,YAAmB,MAAe,aAA6B;EAC7D,MAAM,EACJ,WAAW,KAAK,yBAAyB,QAAQ,YAAY,OAC7D,QACA,gBACA,iBACE;EAEJ,KAAK,WAAW;EAChB,KAAK,OAAO;EACZ,KAAK,SAAS;EACd,KAAK,iBAAiB;EACtB,KAAK,eAAe;EAEpB,KAAK,eAAe,KAAK,gBAAgB;CAC3C;CAEA,IAAW,QAAqB;EAC9B,OAAO,KAAK,KAAK,WAAW;CAC9B;CAEA,IAAW,QAAQ;EACjB,OAAO,KAAK,UAAU,KAAA;CACxB;CAEA,wBAAsC;EACpC,KAAK,kBAAkB,SAAS,OAAO,GAAG,CAAC;CAC7C;CAEA,kBAA0B;EACxB,OACE,KAAK,KAAK,iBAAiB,IAAI,UAAU,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,EACjE,SAAS,KAAK;CAEtB;CAEA,mBAA0B,cAAiC;EACzD,aAAa,eAAe,KAAK;CACnC;CAEA,SAAgB,OAA0B;EACxC,IAAI,UAAU,KAAA,KAAa,MAAM,KAAK,MAAM,IACtC;OAAA,KAAK,KAAK,WAAW,MAAM,SAAS,CAAC,CAAC,cAAc;IACtD,KAAK,KAAK,WAAW,MAAM,gBAAgB,KAAA,CAAS;IACpD,KAAK,sBAAsB;GAC7B;SACK;GACL,KAAK,KAAK,WAAW,MAAM,gBAAgB,KAAK;GAChD,KAAK,sBAAsB;EAC7B;EAEA,KAAK,KAAK,iBAAiB,MACzB,UACA,EAAE,MAAM,GACR,EAAE,UAAU,KAAK,SAAS,CAC5B;CACF;CAEA,QAAqB;EACnB,KAAK,SAAS,KAAA,CAAS;CACzB;CAEA,UAAiB,IAAyB;EACxC,KAAK,kBAAkB,IAAI,EAAE;CAC/B;AACF"}
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"}