@itrocks/list 0.16.3 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/cjs/columns.js +83 -16
- package/cjs/columns.js.map +1 -1
- package/cjs/date-search.d.ts +1 -0
- package/cjs/date-search.js +150 -0
- package/cjs/date-search.js.map +1 -0
- package/cjs/filter.js +52 -1
- package/cjs/filter.js.map +1 -1
- package/cjs/list.html +1 -1
- package/cjs/list.js +34 -2
- package/cjs/list.js.map +1 -1
- package/cjs/projection.d.ts +7 -0
- package/cjs/projection.js +36 -1
- package/cjs/projection.js.map +1 -1
- package/cjs/sort.d.ts +4 -4
- package/cjs/sort.js +3 -2
- package/cjs/sort.js.map +1 -1
- package/list.css +6 -3
- package/package.json +2 -1
- package/property-select.d.ts +4 -0
- package/property-select.js +95 -11
package/README.md
CHANGED
|
@@ -130,6 +130,67 @@ templates or the configured data source.
|
|
|
130
130
|
|
|
131
131
|
For `json()`, the scope is passed directly to `dataSource().search()`.
|
|
132
132
|
|
|
133
|
+
## Search filters
|
|
134
|
+
|
|
135
|
+
HTML list filters interpret the first hyphen as an interval separator. Spaces around the bounds are ignored:
|
|
136
|
+
|
|
137
|
+
- `2000 - 2010` uses inclusive `between(2000, 2010)`.
|
|
138
|
+
- `-2010` means less than or equal to 2010.
|
|
139
|
+
- `2000-` means greater than or equal to 2000.
|
|
140
|
+
- A hyphen with neither bound applies no criterion.
|
|
141
|
+
|
|
142
|
+
Leading `>`, `>=`, `<`, `<=`, `<>`, `!=` and `!` apply the corresponding comparison.
|
|
143
|
+
The prefixes `<>`, `!=` and `!` mean not equal; the equals sign after `!` is optional.
|
|
144
|
+
With `*` or `?` in their operand, these three prefixes request `NOT LIKE` instead, using the same wildcard conversion.
|
|
145
|
+
A leading `=` requests exact equality, including an empty string. Spaces around explicit comparison operands are ignored.
|
|
146
|
+
Explicit operators take precedence over interval syntax, so `>=-10` compares with negative ten and `=A-B` matches `A-B`.
|
|
147
|
+
|
|
148
|
+
Without an explicit comparison operator, `*` and `?` request `LIKE` for any property type, replacing all `*` with `%`
|
|
149
|
+
and all `?` with `_`. The pattern is used as supplied without an extra trailing wildcard. Wildcards take precedence
|
|
150
|
+
over interval syntax, so `2000-20??` becomes the pattern `2000-20__`.
|
|
151
|
+
|
|
152
|
+
Without an operator, wildcard or hyphen, text properties use prefix matching (`Alice` becomes `LIKE 'Alice%'`).
|
|
153
|
+
Other property types retain equality. The type of nested properties is resolved from the final property.
|
|
154
|
+
Any later hyphens in an interval remain part of the upper bound.
|
|
155
|
+
The original text stays in the input and session; feed requests reconstruct the same criterion from session state.
|
|
156
|
+
The data source converts the bounds according to the property's type.
|
|
157
|
+
|
|
158
|
+
### Date filters
|
|
159
|
+
|
|
160
|
+
Date properties use the dedicated `dateSearch()` implementation in `src/date-search.ts` before ordinary interval
|
|
161
|
+
and wildcard processing. Slash and compact dates use the same request-scoped translated `dd/MM/yyyy` format as
|
|
162
|
+
the framework's date output. ISO dates always use year-month-day order; a leading four-digit year also permits
|
|
163
|
+
`yyyy/MM/dd`.
|
|
164
|
+
|
|
165
|
+
- Four digits select the whole year; one or two digits select that month in the current year (`6` and `06` both mean June).
|
|
166
|
+
- Slash dates accept day/month or month/day according to the display format, with an optional year.
|
|
167
|
+
- Month/year and year/month with a four-digit year select that whole month; either slash or hyphen is accepted.
|
|
168
|
+
- Hyphen dates use ISO order, including short fields such as `26-3-9`. `2020-03` selects March 2020.
|
|
169
|
+
- Six and eight digits are compact local dates, with a two-digit or four-digit year respectively.
|
|
170
|
+
- A separated one-, two- or three-digit year is completed using the current decade, century or millennium.
|
|
171
|
+
- Date ranges use slash dates, for example `01/03/2020-09/03/2020` in day/month order. Open bounds are inclusive.
|
|
172
|
+
- A hyphen between two three- or four-digit years selects all dates from the first January to the last December:
|
|
173
|
+
`2026-2027` includes both whole years. Three-digit years use the current millennium.
|
|
174
|
+
Other hyphens without slash are ISO date separators, so `2026-03` still selects March 2026.
|
|
175
|
+
- A leading or trailing hyphen opens the range, including ISO dates: `2026-` starts on 1 January 2026,
|
|
176
|
+
`-2026` ends on 31 December 2026, `6-` starts on 1 June of the current year, and `-2020-02` includes
|
|
177
|
+
all dates up to the end of February 2020. Missing components follow the same date completion rules.
|
|
178
|
+
|
|
179
|
+
Calendar periods include their full final day. Explicit comparisons use the corresponding beginning or end of the
|
|
180
|
+
period: `>2020` starts after 2020, and `<=2020` includes all of 2020. Not-equal comparisons exclude the whole period
|
|
181
|
+
through `NOT BETWEEN`.
|
|
182
|
+
|
|
183
|
+
Date digits may contain `%`, `?` or `*`. Patterns are reordered into SQL year-month-day order, `?` becomes `_` and `*`
|
|
184
|
+
becomes `%`. For example `??/03/2020` becomes `2020-03-__%` in day/month order; the final `%` also permits stored times.
|
|
185
|
+
Each wildcard counts as one digit while identifying the input format and completing date fields. For example,
|
|
186
|
+
`??` selects month patterns in the current year, `????` selects year patterns, and a two-character year such as `**`
|
|
187
|
+
is prefixed with the current century before replacing the wildcards. One-character month and day fields are zero-padded.
|
|
188
|
+
The prefixes `!`, `!=` and `<>` use `NOT LIKE` for these patterns.
|
|
189
|
+
On a date property, `?` alone excludes the zero date; `!?`, `!=?` and `<>?` find zero dates.
|
|
190
|
+
Empty dates are stored as `0000-00-00`, never SQL `NULL`.
|
|
191
|
+
Invalid dates match no rows, without calendar rollover.
|
|
192
|
+
Original input text is retained in session and restored for subsequent feed requests.
|
|
193
|
+
|
|
133
194
|
## Typical use cases
|
|
134
195
|
|
|
135
196
|
- Back‑office list screens for any business entity (users, products, orders…).
|
|
@@ -272,3 +333,24 @@ Set `PS_PLAYWRIGHT_MODULE` to an installed Playwright module when using a differ
|
|
|
272
333
|
(`PS_DATABASE_PORT` overrides it). It starts and stops its own application instance and checks desktop keyboard, touch,
|
|
273
334
|
reduced motion, horizontal reveal, removal and temporary-row transitions. `PS_TOGGLE_URL` reuses an existing instance
|
|
274
335
|
of that recipe instead. The synthetic database must already be running; this test never resets it.
|
|
336
|
+
|
|
337
|
+
## Component column batches
|
|
338
|
+
|
|
339
|
+
Selecting a component group sends one request with `loadColumns` listing missing paths, `columns` containing the
|
|
340
|
+
complete final configuration and `rowIds` identifying visible roots. The response contains `columns`, each with
|
|
341
|
+
`path`, `label`, `sortable` and rendered `rows`. Empty `loadColumns` saves group removals without querying records.
|
|
342
|
+
Failed batch projections preserve the saved configuration. Checkboxes update optimistically before metadata or HTTP
|
|
343
|
+
requests, for both individual selections and groups. The host commits placeholders and starts the shared green flash
|
|
344
|
+
before the values request; early values remain masked until the flash finishes, while late values appear immediately.
|
|
345
|
+
Removal starts one red flash after publishing the unchecked state, then sends the configuration request. Front-end
|
|
346
|
+
columns disappear at the animation deadline even if that request is still pending. Group actions use one HTTP request.
|
|
347
|
+
|
|
348
|
+
Sub-properties reached through one collection marked `@Component` are projected together when its element type
|
|
349
|
+
has one matching `@Composite` back-reference. The list reads visible root identities once, then all requested fields
|
|
350
|
+
in one query per component collection, restricted to those identities. Singular ancestors and related object labels
|
|
351
|
+
share these queries. Values retain component order and duplicates; these columns are not sortable.
|
|
352
|
+
The same projection is used when reloading the list or adding an individual component sub-property.
|
|
353
|
+
|
|
354
|
+
`test/browser-component-batch.mjs` verifies real browser interactions, HTTP request counts, MySQL query counts,
|
|
355
|
+
rendered values, mandatory row scope, partial selection, removal and session restoration. It creates and cleans up
|
|
356
|
+
its own temporary database and server using the existing selector integration recipe.
|
package/cjs/columns.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.projectColumns = projectColumns;
|
|
|
5
5
|
const list_properties_1 = require("@itrocks/list-properties");
|
|
6
6
|
const storage_1 = require("@itrocks/storage");
|
|
7
7
|
const storage_2 = require("@itrocks/storage");
|
|
8
|
+
const storage_3 = require("@itrocks/storage");
|
|
8
9
|
const parameter_1 = require("./parameter");
|
|
9
10
|
const projection_1 = require("./projection");
|
|
10
11
|
class Columns extends parameter_1.Parameter {
|
|
@@ -23,11 +24,16 @@ class Columns extends parameter_1.Parameter {
|
|
|
23
24
|
this.properties = properties;
|
|
24
25
|
this.configured = true;
|
|
25
26
|
}
|
|
26
|
-
catch {
|
|
27
|
+
catch {
|
|
28
|
+
/* Invalid saved requests preserve the previous configuration. */
|
|
29
|
+
}
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
|
-
if (!this.configured && !this.length)
|
|
30
|
-
this.properties = new list_properties_1.ListReflectClass(type)
|
|
32
|
+
if (!this.configured && !this.length) {
|
|
33
|
+
this.properties = new list_properties_1.ListReflectClass(type)
|
|
34
|
+
.listProperties()
|
|
35
|
+
.map(property => new projection_1.ListColumn(type, String(property.name)));
|
|
36
|
+
}
|
|
31
37
|
this.configured = true;
|
|
32
38
|
}
|
|
33
39
|
get length() {
|
|
@@ -38,13 +44,12 @@ class Columns extends parameter_1.Parameter {
|
|
|
38
44
|
}
|
|
39
45
|
async projected(result) {
|
|
40
46
|
if (result.columns.some((column, index) => column.path !== this.properties[index]?.name)
|
|
41
|
-
|| result.columns.length !== this.length)
|
|
47
|
+
|| (result.columns.length !== this.length)) {
|
|
42
48
|
throw new Error('Projection columns do not match the list');
|
|
49
|
+
}
|
|
43
50
|
return Promise.all(result.rows.map(async (row) => ({
|
|
44
51
|
id: row.rootId,
|
|
45
|
-
properties: await Promise.all(row.cells.map(async (cell, index) => ({
|
|
46
|
-
outputOptionalContainer: await this.properties[index].output(cell)
|
|
47
|
-
})))
|
|
52
|
+
properties: await Promise.all(row.cells.map(async (cell, index) => ({ outputOptionalContainer: await this.properties[index].output(cell) })))
|
|
48
53
|
})));
|
|
49
54
|
}
|
|
50
55
|
readOptions(options = new Array) {
|
|
@@ -74,25 +79,87 @@ class Columns extends parameter_1.Parameter {
|
|
|
74
79
|
exports.Columns = Columns;
|
|
75
80
|
async function projectColumns(type, columns, search, options) {
|
|
76
81
|
const singular = columns.filter(column => !column.multiple);
|
|
77
|
-
const
|
|
78
|
-
|
|
82
|
+
const selections = singular.map(column => column.selection());
|
|
83
|
+
const parents = [...new Set(columns.flatMap(column => column.component?.parent ? [column.component.parent] : []))]
|
|
84
|
+
.filter(path => !singular.some(column => column.name === path));
|
|
85
|
+
selections.push(...parents.map(path => ({ path, objectFields: [] })));
|
|
86
|
+
const result = await (0, storage_1.dataSource)().select(type, selections, search, options);
|
|
87
|
+
if (!columns.some(column => column.multiple))
|
|
79
88
|
return result;
|
|
89
|
+
const projectedColumns = columns.map(column => ({ path: column.name, kind: column.multiple
|
|
90
|
+
? 'scalar'
|
|
91
|
+
: result.columns[singular.indexOf(column)].kind }));
|
|
92
|
+
if (!result.rows.length)
|
|
93
|
+
return { ...result, columns: projectedColumns };
|
|
80
94
|
const ids = result.rows.map(row => row.rootId);
|
|
81
|
-
const
|
|
95
|
+
const direct = columns.filter(column => column.multiple && !column.component);
|
|
96
|
+
const objects = direct.length ? await (0, storage_1.dataSource)().search(type, search, [new storage_2.Identifiers(ids)]) : [];
|
|
82
97
|
const byId = new Map(objects.map(object => [String(object.id), object]));
|
|
98
|
+
const components = new Map();
|
|
99
|
+
for (const path of new Set(columns.flatMap(column => column.component ? [column.component.path] : []))) {
|
|
100
|
+
const grouped = columns.filter(column => column.component?.path === path);
|
|
101
|
+
const component = grouped[0].component;
|
|
102
|
+
const parentIds = result.rows.map(row => {
|
|
103
|
+
if (!component.parent)
|
|
104
|
+
return row.rootId;
|
|
105
|
+
const index = singular.findIndex(column => column.name === component.parent);
|
|
106
|
+
const cell = row.cells[index < 0 ? singular.length + parents.indexOf(component.parent) : index];
|
|
107
|
+
return (cell.kind === 'value') ? cell.value?.id : undefined;
|
|
108
|
+
});
|
|
109
|
+
const selectedIds = [...new Set(parentIds.filter((id) => id !== undefined))];
|
|
110
|
+
const selections = new Map([
|
|
111
|
+
[component.inverse, { path: component.inverse, objectFields: [] }]
|
|
112
|
+
]);
|
|
113
|
+
for (const column of grouped) {
|
|
114
|
+
selections.set(column.component.column.name, column.component.column.selection());
|
|
115
|
+
}
|
|
116
|
+
const names = [...selections.keys()];
|
|
117
|
+
const values = selectedIds.length
|
|
118
|
+
? await (0, storage_1.dataSource)().select(component.type, [...selections.values()], { [component.inverse]: selectedIds }, [new storage_3.Sort([])])
|
|
119
|
+
: undefined;
|
|
120
|
+
for (const column of grouped) {
|
|
121
|
+
const byParent = new Map();
|
|
122
|
+
for (const row of values?.rows ?? []) {
|
|
123
|
+
const owner = row.cells[0];
|
|
124
|
+
if (owner.kind !== 'value' || !owner.value)
|
|
125
|
+
continue;
|
|
126
|
+
const id = String(owner.value.id);
|
|
127
|
+
let cells = byParent.get(id);
|
|
128
|
+
if (!cells) {
|
|
129
|
+
byParent.set(id, cells = []);
|
|
130
|
+
}
|
|
131
|
+
cells.push(row.cells[names.indexOf(column.component.column.name)]);
|
|
132
|
+
}
|
|
133
|
+
components.set(column.name, new Map(result.rows.map((row, index) => [String(row.rootId), byParent.get(String(parentIds[index])) ?? []])));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
83
136
|
return {
|
|
137
|
+
columns: projectedColumns,
|
|
84
138
|
rootType: type,
|
|
85
|
-
columns: columns.map(column => ({ path: column.name, kind: column.multiple ? 'scalar' :
|
|
86
|
-
result.columns[singular.indexOf(column)].kind })),
|
|
87
139
|
rows: await Promise.all(result.rows.map(async (row) => {
|
|
88
140
|
const object = byId.get(String(row.rootId));
|
|
89
141
|
const cells = await Promise.all(columns.map(async (column) => {
|
|
90
|
-
if (!column.multiple)
|
|
142
|
+
if (!column.multiple) {
|
|
91
143
|
return row.cells[singular.indexOf(column)];
|
|
92
|
-
|
|
93
|
-
|
|
144
|
+
}
|
|
145
|
+
if (column.component) {
|
|
146
|
+
return {
|
|
147
|
+
kind: 'value',
|
|
148
|
+
value: components.get(column.name).get(String(row.rootId)) ?? []
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const value = object
|
|
152
|
+
? await object[column.name]
|
|
153
|
+
: [];
|
|
154
|
+
return {
|
|
155
|
+
kind: 'value',
|
|
156
|
+
value: value ?? []
|
|
157
|
+
};
|
|
94
158
|
}));
|
|
95
|
-
return {
|
|
159
|
+
return {
|
|
160
|
+
cells,
|
|
161
|
+
rootId: row.rootId
|
|
162
|
+
};
|
|
96
163
|
}))
|
|
97
164
|
};
|
|
98
165
|
}
|
package/cjs/columns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../src/columns.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../src/columns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function dateSearch(value: string, operator?: string, now?: Date, format?: string): never[] | import("@itrocks/sql-functions").SqlFunction;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dateSearch = dateSearch;
|
|
4
|
+
const sql_functions_1 = require("@itrocks/sql-functions");
|
|
5
|
+
const sql_functions_2 = require("@itrocks/sql-functions");
|
|
6
|
+
const sql_functions_3 = require("@itrocks/sql-functions");
|
|
7
|
+
const sql_functions_4 = require("@itrocks/sql-functions");
|
|
8
|
+
const sql_functions_5 = require("@itrocks/sql-functions");
|
|
9
|
+
const sql_functions_6 = require("@itrocks/sql-functions");
|
|
10
|
+
const sql_functions_7 = require("@itrocks/sql-functions");
|
|
11
|
+
const sql_functions_8 = require("@itrocks/sql-functions");
|
|
12
|
+
const sql_functions_9 = require("@itrocks/sql-functions");
|
|
13
|
+
const sql_functions_10 = require("@itrocks/sql-functions");
|
|
14
|
+
const translate_1 = require("@itrocks/translate");
|
|
15
|
+
function completeYear(value, currentYear) {
|
|
16
|
+
return (value.length === 4)
|
|
17
|
+
? value
|
|
18
|
+
: (String(currentYear).slice(0, 4 - value.length) + value);
|
|
19
|
+
}
|
|
20
|
+
function dateParts(value, format, now) {
|
|
21
|
+
const dayFirst = format.indexOf('d') < format.indexOf('M');
|
|
22
|
+
let day;
|
|
23
|
+
let month;
|
|
24
|
+
let year = String(now.getFullYear());
|
|
25
|
+
if (/^[\d?%*]+$/.test(value)) {
|
|
26
|
+
if (value.length === 4)
|
|
27
|
+
year = value;
|
|
28
|
+
else if (value.length <= 2)
|
|
29
|
+
month = value;
|
|
30
|
+
else if (value.length === 6 || value.length === 8) {
|
|
31
|
+
day = value.slice(dayFirst ? 0 : 2, dayFirst ? 2 : 4);
|
|
32
|
+
month = value.slice(dayFirst ? 2 : 0, dayFirst ? 4 : 2);
|
|
33
|
+
year = value.slice(4);
|
|
34
|
+
}
|
|
35
|
+
else
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const slash = value.includes('/');
|
|
40
|
+
const parts = value.split(slash ? '/' : '-').map(part => part.trim());
|
|
41
|
+
if (parts.some(part => !/^[\d?%*]{1,4}$/.test(part)))
|
|
42
|
+
return;
|
|
43
|
+
if (parts.length === 2) {
|
|
44
|
+
if (parts[0].length === 4)
|
|
45
|
+
[year, month] = parts;
|
|
46
|
+
else if (parts[1].length === 4)
|
|
47
|
+
[month, year] = parts;
|
|
48
|
+
else if (!slash)
|
|
49
|
+
[year, month] = parts;
|
|
50
|
+
else
|
|
51
|
+
[day, month] = dayFirst ? parts : [...parts].reverse();
|
|
52
|
+
}
|
|
53
|
+
else if (parts.length === 3) {
|
|
54
|
+
if (!slash || parts[0].length === 4) {
|
|
55
|
+
[year, month, day] = parts;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
[day, month] = dayFirst ? parts : [parts[1], parts[0]];
|
|
59
|
+
year = parts[2];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if ((month && month.length > 2) || (day && day.length > 2))
|
|
66
|
+
return;
|
|
67
|
+
return {
|
|
68
|
+
day,
|
|
69
|
+
month,
|
|
70
|
+
year: completeYear(year, now.getFullYear())
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function datePeriod(value, format, now) {
|
|
74
|
+
const parts = dateParts(value, format, now);
|
|
75
|
+
if (!parts || /[^\d]/.test(parts.year + (parts.month ?? '') + (parts.day ?? '')))
|
|
76
|
+
return;
|
|
77
|
+
const day = +(parts.day ?? 1);
|
|
78
|
+
const month = +(parts.month ?? 1);
|
|
79
|
+
const year = +parts.year;
|
|
80
|
+
const lower = new Date(0);
|
|
81
|
+
lower.setFullYear(year, month - 1, day);
|
|
82
|
+
lower.setHours(0, 0, 0, 0);
|
|
83
|
+
if ((year < 1) || (year > 9999)
|
|
84
|
+
|| (lower.getFullYear() !== year) || (lower.getMonth() !== month - 1) || (lower.getDate() !== day)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const next = new Date(lower);
|
|
88
|
+
if (!parts.month)
|
|
89
|
+
next.setFullYear(year + 1);
|
|
90
|
+
else if (!parts.day)
|
|
91
|
+
next.setMonth(month);
|
|
92
|
+
else
|
|
93
|
+
next.setDate(day + 1);
|
|
94
|
+
return {
|
|
95
|
+
lower,
|
|
96
|
+
upper: new Date(next.getTime() - 1)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function dateSearch(value, operator = '=', now = new Date(), format = (0, translate_1.tr)('dd/MM/yyyy', { ucFirst: false })) {
|
|
100
|
+
value = value.trim();
|
|
101
|
+
if (value === '?') {
|
|
102
|
+
return ['!', '!=', '<>'].includes(operator)
|
|
103
|
+
? (0, sql_functions_2.equal)('0000-00-00')
|
|
104
|
+
: (0, sql_functions_9.notEqual)('0000-00-00');
|
|
105
|
+
}
|
|
106
|
+
if (/[%*?]/.test(value)) {
|
|
107
|
+
const parts = dateParts(value, format, now);
|
|
108
|
+
if (!parts)
|
|
109
|
+
return [];
|
|
110
|
+
const field = (part) => part.padStart(2, '0');
|
|
111
|
+
const pattern = parts.year + (!parts.month ? '-%' : ('-' + field(parts.month)
|
|
112
|
+
+ (!parts.day ? '-%' : ('-' + field(parts.day) + '%'))));
|
|
113
|
+
const compare = ['!', '!=', '<>'].includes(operator) ? sql_functions_10.notLike : sql_functions_7.like;
|
|
114
|
+
return compare(pattern.replaceAll('*', '%').replaceAll('?', '_'));
|
|
115
|
+
}
|
|
116
|
+
let period;
|
|
117
|
+
const years = value.match(/^(\d{3,4})\s*-\s*(\d{3,4})$/);
|
|
118
|
+
const open = value.startsWith('-') || value.endsWith('-');
|
|
119
|
+
if (years || open || (value.includes('/') && value.includes('-'))) {
|
|
120
|
+
const index = value.endsWith('-') ? value.length - 1 : value.indexOf('-');
|
|
121
|
+
const left = years ? completeYear(years[1], now.getFullYear()) : value.slice(0, index).trim();
|
|
122
|
+
const right = years ? completeYear(years[2], now.getFullYear()) : value.slice(index + 1).trim();
|
|
123
|
+
const bound = (part) => datePeriod(/^\d{3}$/.test(part) ? completeYear(part, now.getFullYear()) : part, format, now);
|
|
124
|
+
const lower = left ? bound(left)?.lower : undefined;
|
|
125
|
+
const upper = right ? bound(right)?.upper : undefined;
|
|
126
|
+
if ((left && !lower) || (right && !upper))
|
|
127
|
+
return [];
|
|
128
|
+
if (lower && upper)
|
|
129
|
+
period = { lower, upper };
|
|
130
|
+
else if (lower)
|
|
131
|
+
return (0, sql_functions_4.greaterOrEqual)(lower);
|
|
132
|
+
else if (upper)
|
|
133
|
+
return (0, sql_functions_6.lessOrEqual)(upper);
|
|
134
|
+
}
|
|
135
|
+
else
|
|
136
|
+
period = datePeriod(value, format, now);
|
|
137
|
+
if (!period)
|
|
138
|
+
return [];
|
|
139
|
+
switch (operator) {
|
|
140
|
+
case '!':
|
|
141
|
+
case '!=':
|
|
142
|
+
case '<>': return (0, sql_functions_8.notBetween)(period.lower, period.upper);
|
|
143
|
+
case '<': return (0, sql_functions_5.less)(period.lower);
|
|
144
|
+
case '<=': return (0, sql_functions_6.lessOrEqual)(period.upper);
|
|
145
|
+
case '>': return (0, sql_functions_3.greater)(period.upper);
|
|
146
|
+
case '>=': return (0, sql_functions_4.greaterOrEqual)(period.lower);
|
|
147
|
+
default: return (0, sql_functions_1.between)(period.lower, period.upper);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=date-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-search.js","sourceRoot":"","sources":["../src/date-search.ts"],"names":[],"mappings":";;AA6FA,gCAkDC;AA/ID,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,0DAAuD;AACvD,2DAAuD;AACvD,kDAAmD;AAKnD,SAAS,YAAY,CAAC,KAAa,EAAE,WAAmB;IAEvD,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,GAAS;IAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1D,IAAI,GAAyB,CAAA;IAC7B,IAAI,KAAyB,CAAA;IAC7B,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;IACpC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAS,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,GAAG,KAAK,CAAA;aACpC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAG,KAAK,GAAG,KAAK,CAAA;aACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,GAAG,GAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvD,IAAI,GAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC;;YACI,OAAM;IACZ,CAAC;SACI,CAAC;QACL,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACrE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAM;QAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;iBAChD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAA;iBAChD,IAAI,CAAC,KAAK;gBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;;gBACrB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;QACvF,CAAC;aACI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAA;YAC3B,CAAC;iBACI,CAAC;gBACL,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACtD,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;QACF,CAAC;;YACI,OAAM;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,OAAM;IAClE,OAAO;QACN,GAAG;QACH,KAAK;QACL,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;KAC3C,CAAA;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,GAAS;IAE3D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAAE,OAAM;IACxF,MAAM,GAAG,GAAK,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;IACjC,MAAM,IAAI,GAAI,CAAC,KAAK,CAAC,IAAI,CAAA;IACzB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IACzB,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACvC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,IACC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;WACxB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,EACjG,CAAC;QACF,OAAM;IACP,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAS,CAAC,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;SAC5C,IAAI,CAAC,KAAK,CAAC,GAAG;QAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAC5C,OAAO;QACN,KAAK;QACL,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;KACnC,CAAA;AACF,CAAC;AAED,SAAgB,UAAU,CACzB,KAAa,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,MAAM,GAAG,IAAA,cAAE,EAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAG9F,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1C,CAAC,CAAC,IAAA,qBAAK,EAAC,YAAY,CAAC;YACrB,CAAC,CAAC,IAAA,wBAAQ,EAAC,YAAY,CAAC,CAAA;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QACrB,MAAM,KAAK,GAAK,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAC5B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACrB,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;cACtB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CACtD,CACD,CAAA;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAO,CAAC,CAAC,CAAC,oBAAI,CAAA;QACrE,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,MAA0B,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACxD,MAAM,IAAI,GAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC1D,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzE,MAAM,IAAI,GAAI,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9F,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/F,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CACzC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAChF,CAAA;QACD,MAAM,KAAK,GAAG,IAAI,CAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAE,CAAC,CAAC,SAAS,CAAA;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACpD,IAAI,KAAK,IAAI,KAAK;YAAE,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;aACxC,IAAI,KAAK;YAAE,OAAO,IAAA,8BAAc,EAAC,KAAK,CAAC,CAAA;aACvC,IAAI,KAAK;YAAE,OAAO,IAAA,2BAAW,EAAC,KAAK,CAAC,CAAA;IAC1C,CAAC;;QACI,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACtB,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,GAAG,CAAC;QAAC,KAAK,IAAI,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAA,0BAAU,EAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7E,KAAK,GAAG,CAAC,CAAE,OAAO,IAAA,oBAAI,EAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAA,2BAAW,EAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,KAAK,GAAG,CAAC,CAAE,OAAO,IAAA,uBAAO,EAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACvC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAA,8BAAc,EAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAG,OAAO,IAAA,uBAAO,EAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC;AACF,CAAC"}
|
package/cjs/filter.js
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Filter = void 0;
|
|
4
|
+
const reflect_path_1 = require("@itrocks/reflect-path");
|
|
5
|
+
const sql_functions_1 = require("@itrocks/sql-functions");
|
|
6
|
+
const sql_functions_2 = require("@itrocks/sql-functions");
|
|
7
|
+
const sql_functions_3 = require("@itrocks/sql-functions");
|
|
8
|
+
const sql_functions_4 = require("@itrocks/sql-functions");
|
|
9
|
+
const sql_functions_5 = require("@itrocks/sql-functions");
|
|
10
|
+
const sql_functions_6 = require("@itrocks/sql-functions");
|
|
11
|
+
const sql_functions_7 = require("@itrocks/sql-functions");
|
|
12
|
+
const sql_functions_8 = require("@itrocks/sql-functions");
|
|
13
|
+
const sql_functions_9 = require("@itrocks/sql-functions");
|
|
14
|
+
const date_search_1 = require("./date-search");
|
|
4
15
|
const parameter_1 = require("./parameter");
|
|
16
|
+
const operators = {
|
|
17
|
+
'!': sql_functions_8.notEqual,
|
|
18
|
+
'!=': sql_functions_8.notEqual,
|
|
19
|
+
'<': sql_functions_5.less,
|
|
20
|
+
'<=': sql_functions_6.lessOrEqual,
|
|
21
|
+
'<>': sql_functions_8.notEqual,
|
|
22
|
+
'=': sql_functions_2.equal,
|
|
23
|
+
'>': sql_functions_3.greater,
|
|
24
|
+
'>=': sql_functions_4.greaterOrEqual
|
|
25
|
+
};
|
|
5
26
|
class Filter extends parameter_1.Parameter {
|
|
6
27
|
columns;
|
|
7
28
|
search = {};
|
|
@@ -46,7 +67,37 @@ class Filter extends parameter_1.Parameter {
|
|
|
46
67
|
for (const [property, value] of Object.entries(this.search)) {
|
|
47
68
|
if (value === '')
|
|
48
69
|
continue;
|
|
49
|
-
|
|
70
|
+
const comparison = value.match(/^(>=|<=|<>|!=|>|<|=|!)(.*)$/s);
|
|
71
|
+
const operator = comparison ? operators[comparison[1]] : undefined;
|
|
72
|
+
const operand = comparison ? comparison[2].trim() : value;
|
|
73
|
+
const propertyType = (0, reflect_path_1.resolvePropertyPath)(type, property).property.type.type;
|
|
74
|
+
if (propertyType === Date) {
|
|
75
|
+
search[property] = (0, date_search_1.dateSearch)(operand, comparison?.[1]);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (/[*?]/.test(operand) && (!operator || operator === sql_functions_8.notEqual)) {
|
|
79
|
+
const compare = operator ? sql_functions_9.notLike : sql_functions_7.like;
|
|
80
|
+
search[property] = compare(operand.replaceAll('*', '%').replaceAll('?', '_'));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (operator) {
|
|
84
|
+
search[property] = operator(operand);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const separator = value.indexOf('-');
|
|
88
|
+
if (separator < 0) {
|
|
89
|
+
const text = propertyType === String;
|
|
90
|
+
search[property] = (text ? (0, sql_functions_7.like)(value + '%') : value);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const lower = value.slice(0, separator).trim();
|
|
94
|
+
const upper = value.slice(separator + 1).trim();
|
|
95
|
+
if (lower && upper)
|
|
96
|
+
search[property] = (0, sql_functions_1.between)(lower, upper);
|
|
97
|
+
else if (lower)
|
|
98
|
+
search[property] = (0, sql_functions_4.greaterOrEqual)(lower);
|
|
99
|
+
else if (upper)
|
|
100
|
+
search[property] = (0, sql_functions_6.lessOrEqual)(upper);
|
|
50
101
|
}
|
|
51
102
|
return Object.setPrototypeOf(search, type.prototype);
|
|
52
103
|
}
|
package/cjs/filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"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"}
|
package/cjs/list.html
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
</ul>
|
|
28
28
|
</header>
|
|
29
29
|
<form action="app://(type.@route)/list" autocomplete="off" method="post" target="main">
|
|
30
|
-
<table class="objects" data-
|
|
30
|
+
<table class="objects" data-link="{type.@route}">
|
|
31
31
|
<thead>
|
|
32
32
|
<tr class="properties">
|
|
33
33
|
<th class="select" data-freeze><input name="select" type="checkbox" value="all">
|
package/cjs/list.js
CHANGED
|
@@ -89,7 +89,8 @@ let List = (() => {
|
|
|
89
89
|
for (const field of column.fields ?? [])
|
|
90
90
|
await access.authorise(`${column.name}.${field}`);
|
|
91
91
|
}
|
|
92
|
-
|
|
92
|
+
const batch = typeof request.request.data.loadColumns === 'string';
|
|
93
|
+
if (request.request.data.columns !== undefined && typeof request.request.data.column !== 'string' && !batch) {
|
|
93
94
|
(0, persist_2.save)(this, request.request, type);
|
|
94
95
|
return this.htmlResponse('', 204);
|
|
95
96
|
}
|
|
@@ -98,13 +99,44 @@ let List = (() => {
|
|
|
98
99
|
for (const column of columns)
|
|
99
100
|
column.search = filter.search[column.name] ?? '';
|
|
100
101
|
sort.getParams(request.request, type);
|
|
101
|
-
|
|
102
|
+
if (!batch)
|
|
103
|
+
(0, persist_2.save)(this, request.request, type);
|
|
102
104
|
const options = feed.readOptions(filter.readOptions(sort.readOptions()));
|
|
103
105
|
const search = Object.assign(filter.searchObject(type), scope);
|
|
104
106
|
for (const path of Object.keys(search))
|
|
105
107
|
await access.authorise(path);
|
|
106
108
|
for (const path of Object.keys(sort.sorted ?? {}))
|
|
107
109
|
await access.authorise(path);
|
|
110
|
+
if (batch) {
|
|
111
|
+
try {
|
|
112
|
+
const names = request.request.data.loadColumns.split(',').filter(Boolean);
|
|
113
|
+
if (new Set(names).size !== names.length)
|
|
114
|
+
throw new Error('Duplicate column paths');
|
|
115
|
+
const requested = names.map(path => new projection_1.ListColumn(type, path));
|
|
116
|
+
for (const column of requested) {
|
|
117
|
+
if (!columns.serialize().includes(column.name))
|
|
118
|
+
throw new Error('Column absent from configuration');
|
|
119
|
+
await access.authorise(column.name);
|
|
120
|
+
for (const field of column.fields ?? [])
|
|
121
|
+
await access.authorise(`${column.name}.${field}`);
|
|
122
|
+
}
|
|
123
|
+
const ids = request.request.data.rowIds;
|
|
124
|
+
if (typeof ids !== 'string')
|
|
125
|
+
throw new Error('Visible row identities are required');
|
|
126
|
+
const result = requested.length ? await (0, columns_2.projectColumns)(type, requested, search, [new storage_1.Identifiers(ids ? ids.split(',') : [])]) : undefined;
|
|
127
|
+
const response = await Promise.all(requested.map(async (column, index) => ({
|
|
128
|
+
label: column.label, path: column.name, sortable: column.sortable,
|
|
129
|
+
rows: await Promise.all(result.rows.map(async (row) => ({
|
|
130
|
+
id: row.rootId, html: await column.output(row.cells[index])
|
|
131
|
+
})))
|
|
132
|
+
})));
|
|
133
|
+
(0, persist_2.save)(this, request.request, type);
|
|
134
|
+
return this.jsonResponse({ columns: response });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return this.jsonResponse({ error: error instanceof Error ? error.message : 'Columns unavailable' }, 400);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
108
140
|
if (typeof request.request.data.column === 'string') {
|
|
109
141
|
try {
|
|
110
142
|
const path = request.request.data.column;
|
package/cjs/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAwD;AAExD,4CAAwD;AACxD,4CAAwD;AAExD,0CAAuD;AACvD,0CAAuD;AACvD,8CAAyD;AAEzD,8CAAyD;AACzD,8CAAyD;AACzD,qCAAiD;AACjD,uCAAkD;AAClD,uCAAkD;AAClD,iCAA+C;AAC/C,qCAAiD;AACjD,uCAAkD;AAClD,uCAAkD;AAClD,6CAAqD;AACrD,qDAAyD;AACzD,qDAAyD;AACzD,iCAA+C;AAE/C,mCAAwC;AAA/B,uGAAA,aAAa,OAAA;IAKT,IAAI;4BAFhB,IAAA,aAAI,EAAC,OAAO,EAAE,KAAK,CAAC,EACpB,IAAA,aAAK,EAAC,OAAO,CAAC;;;;sBACsC,eAAM;oBAAd,SAAQ,WAAS;;;;YAA9D,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
|
package/cjs/projection.d.ts
CHANGED
|
@@ -11,6 +11,13 @@ export declare function representationFields(type: Type, ancestors?: readonly Ty
|
|
|
11
11
|
export declare class ListColumn {
|
|
12
12
|
readonly root: Type;
|
|
13
13
|
readonly name: string;
|
|
14
|
+
readonly component?: {
|
|
15
|
+
column: ListColumn;
|
|
16
|
+
inverse: string;
|
|
17
|
+
parent: string;
|
|
18
|
+
path: string;
|
|
19
|
+
type: Type;
|
|
20
|
+
};
|
|
14
21
|
readonly field: string;
|
|
15
22
|
readonly fields?: readonly string[];
|
|
16
23
|
readonly label: string;
|
package/cjs/projection.js
CHANGED
|
@@ -3,13 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ListColumn = void 0;
|
|
4
4
|
exports.listRepresentationDependsOn = listRepresentationDependsOn;
|
|
5
5
|
exports.representationFields = representationFields;
|
|
6
|
+
const class_type_1 = require("@itrocks/class-type");
|
|
6
7
|
const class_view_1 = require("@itrocks/class-view");
|
|
7
8
|
const class_view_2 = require("@itrocks/class-view");
|
|
8
9
|
const class_view_3 = require("@itrocks/class-view");
|
|
9
10
|
const composition_1 = require("@itrocks/composition");
|
|
11
|
+
const composition_2 = require("@itrocks/composition");
|
|
10
12
|
const core_transformers_1 = require("@itrocks/core-transformers");
|
|
11
13
|
const core_transformers_2 = require("@itrocks/core-transformers");
|
|
12
14
|
const property_view_1 = require("@itrocks/property-view");
|
|
15
|
+
const reflect_1 = require("@itrocks/reflect");
|
|
16
|
+
const reflect_2 = require("@itrocks/reflect");
|
|
13
17
|
const reflect_path_1 = require("@itrocks/reflect-path");
|
|
14
18
|
const reflect_path_2 = require("@itrocks/reflect-path");
|
|
15
19
|
const storage_1 = require("@itrocks/storage");
|
|
@@ -41,6 +45,7 @@ function representationFields(type, ancestors = [], property) {
|
|
|
41
45
|
class ListColumn {
|
|
42
46
|
root;
|
|
43
47
|
name;
|
|
48
|
+
component;
|
|
44
49
|
field;
|
|
45
50
|
fields;
|
|
46
51
|
label;
|
|
@@ -58,12 +63,36 @@ class ListColumn {
|
|
|
58
63
|
const resolved = (0, reflect_path_2.resolvePropertyPath)(root, name);
|
|
59
64
|
this.multiple = resolved.targetMultiplicity === 'many';
|
|
60
65
|
this.sortable = !this.multiple;
|
|
61
|
-
if (
|
|
66
|
+
if (this.multiple && resolved.segments.length > 1) {
|
|
67
|
+
const index = resolved.segments.findIndex(property => property.relation?.targetMultiplicity === 'many');
|
|
68
|
+
const property = resolved.segments[index];
|
|
69
|
+
const target = property?.relation?.target;
|
|
70
|
+
if (target && (0, composition_1.componentOf)(property.class.type, property.name) && index < resolved.segments.length - 1) {
|
|
71
|
+
const inverses = Object.keys(new reflect_1.ReflectClass(target).propertyTypes).filter(name => {
|
|
72
|
+
if (!(0, composition_2.compositeOf)(target, name))
|
|
73
|
+
return false;
|
|
74
|
+
const relation = new reflect_2.ReflectProperty(target, name).relation;
|
|
75
|
+
return relation?.target && (0, class_type_1.inherits)(property.class.type, relation.target);
|
|
76
|
+
});
|
|
77
|
+
if (inverses.length === 1) {
|
|
78
|
+
const column = new ListColumn(target, name.split('.').slice(index + 1).join('.'));
|
|
79
|
+
if (!column.multiple)
|
|
80
|
+
this.component = {
|
|
81
|
+
column, inverse: inverses[0], parent: name.split('.').slice(0, index).join('.'),
|
|
82
|
+
path: name.split('.').slice(0, index + 1).join('.'), type: target
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (resolved.targetMultiplicity !== 'one' && !(this.multiple && resolved.segments.length === 1)
|
|
88
|
+
&& !this.component) {
|
|
62
89
|
throw new storage_1.SelectionError(resolved.targetMultiplicity === 'many' ? 'multiple-values' : 'unsupported-selection', name);
|
|
63
90
|
}
|
|
64
91
|
this.property = new reflect_path_1.ReflectPropertyPath(root, name);
|
|
65
92
|
this.target = resolved.target;
|
|
66
93
|
this.label = resolved.segments.map(property => (0, translate_1.tr)((0, property_view_1.displayOf)(property.class.type, property.name))).join('.');
|
|
94
|
+
if (this.component)
|
|
95
|
+
this.fields = this.component.column.fields;
|
|
67
96
|
if (resolved.target && !this.multiple)
|
|
68
97
|
this.fields = representationFields(resolved.target, [], resolved.property);
|
|
69
98
|
}
|
|
@@ -72,6 +101,12 @@ class ListColumn {
|
|
|
72
101
|
return '';
|
|
73
102
|
if (cell.kind === 'unloaded')
|
|
74
103
|
return '<span class="unavailable">Unavailable</span>';
|
|
104
|
+
if (this.component) {
|
|
105
|
+
const cells = cell.value;
|
|
106
|
+
const values = await Promise.all(cells.map(cell => this.component.column.output(cell)));
|
|
107
|
+
return (0, multiple_output_1.multipleOutputOf)(this.property.class.type, this.property.name) === 'lines'
|
|
108
|
+
? '<ul>' + values.map(value => `<li>${value}</li>`).join('') + '</ul>' : values.join(', ');
|
|
109
|
+
}
|
|
75
110
|
if (this.fields && this.fields.some(field => !cell.loadedFields?.includes(field)))
|
|
76
111
|
throw new storage_1.SelectionError('unsupported-selection', this.name);
|
|
77
112
|
if (this.multiple && (0, composition_1.componentOf)(this.property.class.type, this.property.name)) {
|
package/cjs/projection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"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"}
|
package/cjs/sort.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Option } from '@itrocks/storage';
|
|
|
4
4
|
import { Sort as SortOption } from '@itrocks/storage';
|
|
5
5
|
import { Columns } from './columns';
|
|
6
6
|
import { Parameter } from './parameter';
|
|
7
|
-
interface
|
|
7
|
+
interface Sorted {
|
|
8
8
|
[key: string]: boolean;
|
|
9
9
|
}
|
|
10
10
|
interface Sortable {
|
|
@@ -13,12 +13,12 @@ interface Sortable {
|
|
|
13
13
|
}
|
|
14
14
|
export declare class Sort<T extends object> extends Parameter {
|
|
15
15
|
columns: Columns<T> & Sortable[];
|
|
16
|
-
sorted?:
|
|
16
|
+
sorted?: Sorted;
|
|
17
17
|
constructor(columns: Columns<T>);
|
|
18
18
|
getParams(request: Request, type: Type<T>): void;
|
|
19
19
|
readOptions(options?: Option[]): Option[];
|
|
20
|
-
serialize():
|
|
20
|
+
serialize(): [string, boolean][] | undefined;
|
|
21
21
|
sortOption(): SortOption | Type<SortOption>;
|
|
22
|
-
unserialize(data:
|
|
22
|
+
unserialize(data: [string, boolean][]): void;
|
|
23
23
|
}
|
|
24
24
|
export {};
|
package/cjs/sort.js
CHANGED
|
@@ -61,7 +61,8 @@ class Sort extends parameter_1.Parameter {
|
|
|
61
61
|
return options;
|
|
62
62
|
}
|
|
63
63
|
serialize() {
|
|
64
|
-
|
|
64
|
+
// Session object merges do not preserve key order; array entries preserve sort priority.
|
|
65
|
+
return this.sorted && Object.entries(this.sorted);
|
|
65
66
|
}
|
|
66
67
|
sortOption() {
|
|
67
68
|
if (!this.sorted)
|
|
@@ -77,7 +78,7 @@ class Sort extends parameter_1.Parameter {
|
|
|
77
78
|
return new storage_1.Sort(properties);
|
|
78
79
|
}
|
|
79
80
|
unserialize(data) {
|
|
80
|
-
this.sorted = data;
|
|
81
|
+
this.sorted = Object.fromEntries(data);
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
exports.Sort = Sort;
|
package/cjs/sort.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":";;;AAEA,wCAAkD;AAClD,wCAAkD;AAGlD,8CAAqD;AAErD,2CAAgD;AAWhD,MAAa,IAAuB,SAAQ,qBAAS;IAGpD,OAAO,CAAyB;IAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"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"}
|
package/list.css
CHANGED
|
@@ -33,7 +33,7 @@ table.objects {
|
|
|
33
33
|
overflow-y: auto;
|
|
34
34
|
}
|
|
35
35
|
table.objects th {
|
|
36
|
-
background: #
|
|
36
|
+
background: #eee;
|
|
37
37
|
}
|
|
38
38
|
table.objects tr td, table.objects tr th {
|
|
39
39
|
border-bottom: 1px solid #d8d8d8;
|
|
@@ -164,12 +164,15 @@ table.objects > thead > tr.search > th > input:focus {
|
|
|
164
164
|
outline: none;
|
|
165
165
|
box-shadow: inset 0 0 0 2px Highlight, var(--column-reorder-tint, 0 0 transparent);
|
|
166
166
|
}
|
|
167
|
-
table.objects > thead + tbody > tr:nth-child(even)
|
|
167
|
+
table.objects > thead + tbody > tr:nth-child(even) {
|
|
168
168
|
background: #f8f8f8;
|
|
169
169
|
}
|
|
170
|
-
table.objects > thead + tbody > tr:nth-child(odd)
|
|
170
|
+
table.objects > thead + tbody > tr:nth-child(odd) {
|
|
171
171
|
background: white;
|
|
172
172
|
}
|
|
173
|
+
table.objects > thead + tbody > tr:hover {
|
|
174
|
+
background: #f4f4f4;
|
|
175
|
+
}
|
|
173
176
|
|
|
174
177
|
:not(article, article > form) > table.objects td, :not(article, article > form) > table.objects th {
|
|
175
178
|
border-top: 1px solid #d8d8d8;
|
package/package.json
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"@itrocks/request-response": "latest",
|
|
22
22
|
"@itrocks/route": "latest",
|
|
23
23
|
"@itrocks/sort": "latest",
|
|
24
|
+
"@itrocks/sql-functions": "latest",
|
|
24
25
|
"@itrocks/storage": "latest",
|
|
25
26
|
"@itrocks/table": "latest",
|
|
26
27
|
"@itrocks/translate": "latest",
|
|
@@ -93,5 +94,5 @@
|
|
|
93
94
|
"build:front": "tsc -p src/front/tsconfig.json",
|
|
94
95
|
"test": "npm run build:cjs && node --test \"test/**/*.test.mjs\""
|
|
95
96
|
},
|
|
96
|
-
"version": "0.
|
|
97
|
+
"version": "0.20.1"
|
|
97
98
|
}
|
package/property-select.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export declare class ListPropertySelect implements ConsumerPort {
|
|
|
33
33
|
private readonly article;
|
|
34
34
|
private readonly options;
|
|
35
35
|
private readonly abort;
|
|
36
|
+
private batch;
|
|
36
37
|
private readonly button;
|
|
37
38
|
private readonly content;
|
|
38
39
|
private disposed;
|
|
@@ -46,6 +47,8 @@ export declare class ListPropertySelect implements ConsumerPort {
|
|
|
46
47
|
readonly view: PropertySelectView;
|
|
47
48
|
constructor(article: HTMLElement, options: ListSelectorOptions);
|
|
48
49
|
private loadColumn;
|
|
50
|
+
private loadColumns;
|
|
51
|
+
private columnContent;
|
|
49
52
|
private add;
|
|
50
53
|
begin(intent: SelectionIntent, sample: PointerSample): void;
|
|
51
54
|
private columnSource;
|
|
@@ -58,4 +61,5 @@ export declare class ListPropertySelect implements ConsumerPort {
|
|
|
58
61
|
paths(): string[];
|
|
59
62
|
private remove;
|
|
60
63
|
select(intent: SelectionIntent, signal: AbortSignal): Promise<Outcome>;
|
|
64
|
+
selectMany(intents: readonly SelectionIntent[], signal: AbortSignal): Promise<readonly Outcome[]>;
|
|
61
65
|
}
|
package/property-select.js
CHANGED
|
@@ -5,6 +5,7 @@ export class ListPropertySelect {
|
|
|
5
5
|
article;
|
|
6
6
|
options;
|
|
7
7
|
abort = new AbortController();
|
|
8
|
+
batch = false;
|
|
8
9
|
button;
|
|
9
10
|
content = document.createElement('div');
|
|
10
11
|
disposed = false;
|
|
@@ -46,24 +47,36 @@ export class ListPropertySelect {
|
|
|
46
47
|
this.button.addEventListener('click', () => this.pane.open(), { signal: this.abort.signal });
|
|
47
48
|
}
|
|
48
49
|
async loadColumn(path, signal) {
|
|
50
|
+
return (await this.loadColumns([path], this.paths(), signal, true)).get(path);
|
|
51
|
+
}
|
|
52
|
+
async loadColumns(paths, columns, signal, single = false) {
|
|
49
53
|
const form = this.article.querySelector('form');
|
|
50
54
|
const table = this.article.querySelector('table.objects');
|
|
51
55
|
const rows = [...table.tBodies[0].rows];
|
|
52
56
|
const ids = rows.map(row => row.querySelector('input[name=id]').value);
|
|
53
|
-
const query = new URLSearchParams({
|
|
57
|
+
const query = new URLSearchParams({ columns: columns.join(','), rowIds: ids.join(',') });
|
|
58
|
+
query.set(single ? 'column' : 'loadColumns', paths.join(','));
|
|
54
59
|
const combined = AbortSignal.any([signal, this.abort.signal]);
|
|
55
60
|
const response = this.options.request
|
|
56
61
|
? await this.options.request(query, combined)
|
|
57
62
|
: await fetch(`${form.action}?${query}`, { signal: combined });
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const result = await response.json();
|
|
60
65
|
throw new Error(result.error ?? 'Column unavailable');
|
|
66
|
+
}
|
|
67
|
+
const result = single ? [await response.json()]
|
|
68
|
+
: (await response.json()).columns;
|
|
61
69
|
signal.throwIfAborted();
|
|
62
70
|
if (this.disposed || !this.article.isConnected || rows.some((row, index) => table.tBodies[0].rows[index] !== row)
|
|
63
71
|
|| rows.length !== table.tBodies[0].rows.length)
|
|
64
72
|
throw new Error('The row view changed; try again');
|
|
65
|
-
if (result.
|
|
73
|
+
if (!Array.isArray(result) || result.length !== paths.length
|
|
74
|
+
|| paths.some(path => result.filter(column => column.path === path).length !== 1))
|
|
66
75
|
throw new Error('Mismatched column response');
|
|
76
|
+
return new Map(result.map(column => [column.path, this.columnContent(column, ids, table)]));
|
|
77
|
+
}
|
|
78
|
+
columnContent(result, ids, table) {
|
|
79
|
+
const path = result.path;
|
|
67
80
|
const values = new Map(result.rows.map(row => [String(row.id), row.html]));
|
|
68
81
|
if (ids.some(id => !values.has(id)))
|
|
69
82
|
throw new Error('The row scope changed; reload the list');
|
|
@@ -92,8 +105,10 @@ export class ListPropertySelect {
|
|
|
92
105
|
});
|
|
93
106
|
return { cells, header };
|
|
94
107
|
}
|
|
95
|
-
add(path, signal, options = {}) {
|
|
108
|
+
add(path, signal, options = {}, load) {
|
|
96
109
|
const source = this.columnSource(path);
|
|
110
|
+
if (load)
|
|
111
|
+
source.load = load;
|
|
97
112
|
const operation = this.options.addition.begin(source, options);
|
|
98
113
|
try {
|
|
99
114
|
signal.throwIfAborted();
|
|
@@ -114,7 +129,8 @@ export class ListPropertySelect {
|
|
|
114
129
|
}
|
|
115
130
|
const outcome = operation.commit();
|
|
116
131
|
this.removedColumns.delete(path);
|
|
117
|
-
|
|
132
|
+
if (!this.batch)
|
|
133
|
+
this.view.selector.setConfiguration({ usedPaths: this.paths() });
|
|
118
134
|
return outcome;
|
|
119
135
|
}
|
|
120
136
|
catch (error) {
|
|
@@ -123,7 +139,7 @@ export class ListPropertySelect {
|
|
|
123
139
|
}
|
|
124
140
|
}
|
|
125
141
|
begin(intent, sample) {
|
|
126
|
-
if (this.disposed || this.drag || this.pending.size)
|
|
142
|
+
if (this.disposed || this.batch || this.drag || this.pending.size)
|
|
127
143
|
throw new Error('A column operation is pending');
|
|
128
144
|
const path = normalisePath(intent.path);
|
|
129
145
|
const added = !this.paths().includes(path);
|
|
@@ -266,9 +282,14 @@ export class ListPropertySelect {
|
|
|
266
282
|
// Publish the unchecked state before starting the table's removal flash.
|
|
267
283
|
this.view.selector.setConfiguration({ usedPaths: this.paths() });
|
|
268
284
|
try {
|
|
269
|
-
const saving = this.options.saveColumns(this.paths());
|
|
270
285
|
const animation = this.options.addition.remove(path, AbortSignal.any([signal, removal.signal]));
|
|
271
|
-
const
|
|
286
|
+
const saving = this.options.saveColumns(this.paths());
|
|
287
|
+
const [animationResult, saved] = await Promise.allSettled([animation, saving]);
|
|
288
|
+
if (animationResult.status === 'rejected')
|
|
289
|
+
throw animationResult.reason;
|
|
290
|
+
if (saved.status === 'rejected')
|
|
291
|
+
throw saved.reason;
|
|
292
|
+
const removed = animationResult.value;
|
|
272
293
|
if (!removed) {
|
|
273
294
|
if (removal.signal.aborted && !signal.aborted && !this.disposed) {
|
|
274
295
|
await this.options.saveColumns(this.paths());
|
|
@@ -294,8 +315,8 @@ export class ListPropertySelect {
|
|
|
294
315
|
async select(intent, signal) {
|
|
295
316
|
const path = normalisePath(intent.path);
|
|
296
317
|
try {
|
|
297
|
-
if (this.drag)
|
|
298
|
-
throw new Error('A column
|
|
318
|
+
if (this.drag || this.batch)
|
|
319
|
+
throw new Error('A column operation is pending');
|
|
299
320
|
let status;
|
|
300
321
|
const pending = this.pending.get(path);
|
|
301
322
|
if (pending) {
|
|
@@ -343,4 +364,67 @@ export class ListPropertySelect {
|
|
|
343
364
|
return { ...intent, message: error instanceof Error ? error.message : 'Column unavailable', status: 'rejected' };
|
|
344
365
|
}
|
|
345
366
|
}
|
|
367
|
+
async selectMany(intents, signal) {
|
|
368
|
+
if (!intents.length)
|
|
369
|
+
return [];
|
|
370
|
+
if (this.batch || this.drag || this.pending.size || this.disposed)
|
|
371
|
+
return intents.map(intent => ({ ...intent, status: 'rejected', message: 'A column operation is pending' }));
|
|
372
|
+
this.batch = true;
|
|
373
|
+
const previous = this.paths();
|
|
374
|
+
const added = intents.filter(intent => !previous.includes(intent.path)).map(intent => intent.path);
|
|
375
|
+
const removed = intents.filter(intent => previous.includes(intent.path) && intent.action !== 'add')
|
|
376
|
+
.map(intent => intent.path);
|
|
377
|
+
const paths = [...previous.filter(path => !removed.includes(path)), ...added];
|
|
378
|
+
const abort = new AbortController();
|
|
379
|
+
const combined = AbortSignal.any([signal, this.abort.signal, abort.signal]);
|
|
380
|
+
let receive;
|
|
381
|
+
let fail;
|
|
382
|
+
const content = new Promise((resolve, reject) => { receive = resolve; fail = reject; });
|
|
383
|
+
void content.catch(() => { });
|
|
384
|
+
try {
|
|
385
|
+
for (const path of removed)
|
|
386
|
+
this.removals.set(path, abort);
|
|
387
|
+
for (const path of added) {
|
|
388
|
+
let first = true;
|
|
389
|
+
this.add(path, combined, { effects: 'deferred' }, signal => {
|
|
390
|
+
if (!first)
|
|
391
|
+
return this.loadColumn(path, signal);
|
|
392
|
+
first = false;
|
|
393
|
+
return content.then(content => content.get(path));
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
this.view.selector.setConfiguration({ usedPaths: this.paths() });
|
|
397
|
+
if (added.length)
|
|
398
|
+
this.options.addition.reveal(added.at(-1));
|
|
399
|
+
this.options.addition.highlightMany(added, true);
|
|
400
|
+
const animation = removed.length ? this.options.addition.removeMany(removed, combined) : Promise.resolve(true);
|
|
401
|
+
const request = this.loadColumns(added, paths, combined).then(receive, error => { fail(error); throw error; });
|
|
402
|
+
const [animated, loaded] = await Promise.allSettled([animation, request]);
|
|
403
|
+
if (animated.status === 'rejected')
|
|
404
|
+
throw animated.reason;
|
|
405
|
+
if (loaded.status === 'rejected')
|
|
406
|
+
throw loaded.reason;
|
|
407
|
+
if (!animated.value)
|
|
408
|
+
throw new Error('Column removal cancelled');
|
|
409
|
+
for (const path of removed) {
|
|
410
|
+
const index = previous.indexOf(path);
|
|
411
|
+
this.removedColumns.set(path, { left: previous[index - 1], right: previous[index + 1] });
|
|
412
|
+
}
|
|
413
|
+
return intents.map(intent => ({ ...intent, status: added.includes(intent.path) ? 'added'
|
|
414
|
+
: removed.includes(intent.path) ? 'removed' : 'existing' }));
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
fail(error);
|
|
418
|
+
return intents.map(intent => ({ ...intent, status: 'rejected',
|
|
419
|
+
message: error instanceof Error ? error.message : 'Columns unavailable' }));
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
for (const path of removed)
|
|
423
|
+
if (this.removals.get(path) === abort)
|
|
424
|
+
this.removals.delete(path);
|
|
425
|
+
this.batch = false;
|
|
426
|
+
if (!this.disposed)
|
|
427
|
+
this.view.selector.setConfiguration({ usedPaths: this.paths() });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
346
430
|
}
|