@itrocks/list 0.8.0 → 0.13.3
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 +99 -1
- package/build.js +21 -8
- package/cjs/access.d.ts +10 -0
- package/cjs/access.js +12 -0
- package/cjs/access.js.map +1 -0
- package/cjs/columns.d.ts +18 -10
- package/cjs/columns.js +57 -23
- package/cjs/columns.js.map +1 -1
- package/cjs/feed.js +1 -1
- package/cjs/feed.js.map +1 -1
- package/cjs/filter.js +24 -5
- package/cjs/filter.js.map +1 -1
- package/cjs/list.d.ts +4 -1
- package/cjs/list.html +9 -9
- package/cjs/list.js +54 -7
- package/cjs/list.js.map +1 -1
- package/cjs/multiple-output.d.ts +4 -0
- package/cjs/multiple-output.js +16 -0
- package/cjs/multiple-output.js.map +1 -0
- package/cjs/projection.d.ts +28 -0
- package/cjs/projection.js +91 -0
- package/cjs/projection.js.map +1 -0
- package/cjs/selector-state.d.ts +22 -0
- package/cjs/selector-state.js +109 -0
- package/cjs/selector-state.js.map +1 -0
- package/cjs/sort.js +8 -3
- package/cjs/sort.js.map +1 -1
- package/column-add.svg +1 -0
- package/config.yaml +1 -0
- package/list.css +83 -5
- package/package.json +23 -2
- package/property-select.d.ts +54 -0
- package/property-select.js +245 -0
- package/selector-state.d.ts +14 -0
- package/selector-state.js +38 -0
package/cjs/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ObjectOrType } from '@itrocks/class-type';
|
|
2
|
+
export type MultipleOutputMode = 'commas' | 'lines';
|
|
3
|
+
export declare function MultipleOutput<T extends object>(mode: MultipleOutputMode): import("@itrocks/decorator/property").DecorateCaller<T, Extract<keyof T, string | symbol>>;
|
|
4
|
+
export declare function multipleOutputOf<T extends object>(target: ObjectOrType<T>, property: keyof T): MultipleOutputMode;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultipleOutput = MultipleOutput;
|
|
4
|
+
exports.multipleOutputOf = multipleOutputOf;
|
|
5
|
+
const composition_1 = require("@itrocks/composition");
|
|
6
|
+
const property_1 = require("@itrocks/decorator/property");
|
|
7
|
+
const property_2 = require("@itrocks/decorator/property");
|
|
8
|
+
const MULTIPLE_OUTPUT = Symbol('multiple-output');
|
|
9
|
+
function MultipleOutput(mode) {
|
|
10
|
+
return (0, property_1.decorate)(MULTIPLE_OUTPUT, mode);
|
|
11
|
+
}
|
|
12
|
+
function multipleOutputOf(target, property) {
|
|
13
|
+
return (0, property_2.decoratorOf)(target, property, MULTIPLE_OUTPUT)
|
|
14
|
+
?? ((0, composition_1.componentOf)(target, property) ? 'lines' : 'commas');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=multiple-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiple-output.js","sourceRoot":"","sources":["../src/multiple-output.ts"],"names":[],"mappings":";;AASA,wCAGC;AAED,4CAIC;AAjBD,sDAAmD;AACnD,0DAA0D;AAC1D,0DAA0D;AAI1D,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA;AAEjD,SAAgB,cAAc,CAAmB,IAAwB;IAExE,OAAO,IAAA,mBAAQ,EAAI,eAAe,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC;AAED,SAAgB,gBAAgB,CAAmB,MAAuB,EAAE,QAAiB;IAE5F,OAAO,IAAA,sBAAW,EAAoC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC;WACpF,CAAC,IAAA,yBAAW,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Type } from '@itrocks/class-type';
|
|
2
|
+
import { resolvePropertyPath } from '@itrocks/reflect-path';
|
|
3
|
+
import { ProjectionCell } from '@itrocks/storage';
|
|
4
|
+
import { Selection } from '@itrocks/storage';
|
|
5
|
+
type RepresentationProperty = ReturnType<typeof resolvePropertyPath>['property'];
|
|
6
|
+
export type RepresentationDependencies = {
|
|
7
|
+
fields?: (type: Type, ancestors: readonly Type[], property?: RepresentationProperty) => readonly string[] | undefined;
|
|
8
|
+
};
|
|
9
|
+
export declare function listRepresentationDependsOn(overrides: Partial<RepresentationDependencies>): void;
|
|
10
|
+
export declare function representationFields(type: Type, ancestors?: readonly Type[], property?: RepresentationProperty): string[];
|
|
11
|
+
export declare class ListColumn {
|
|
12
|
+
readonly root: Type;
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly field: string;
|
|
15
|
+
readonly fields?: readonly string[];
|
|
16
|
+
readonly label: string;
|
|
17
|
+
readonly multiple: boolean;
|
|
18
|
+
readonly property: ReturnType<typeof resolvePropertyPath>['property'];
|
|
19
|
+
readonly sortable: boolean;
|
|
20
|
+
reverse: boolean;
|
|
21
|
+
search: string;
|
|
22
|
+
sort?: number;
|
|
23
|
+
constructor(root: Type, name: string);
|
|
24
|
+
output(cell: ProjectionCell): Promise<string>;
|
|
25
|
+
selection(): Selection;
|
|
26
|
+
sortPaths(): string[];
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ListColumn = void 0;
|
|
4
|
+
exports.listRepresentationDependsOn = listRepresentationDependsOn;
|
|
5
|
+
exports.representationFields = representationFields;
|
|
6
|
+
const class_view_1 = require("@itrocks/class-view");
|
|
7
|
+
const class_view_2 = require("@itrocks/class-view");
|
|
8
|
+
const composition_1 = require("@itrocks/composition");
|
|
9
|
+
const core_transformers_1 = require("@itrocks/core-transformers");
|
|
10
|
+
const core_transformers_2 = require("@itrocks/core-transformers");
|
|
11
|
+
const property_view_1 = require("@itrocks/property-view");
|
|
12
|
+
const reflect_path_1 = require("@itrocks/reflect-path");
|
|
13
|
+
const reflect_path_2 = require("@itrocks/reflect-path");
|
|
14
|
+
const storage_1 = require("@itrocks/storage");
|
|
15
|
+
const transformer_1 = require("@itrocks/transformer");
|
|
16
|
+
const transformer_2 = require("@itrocks/transformer");
|
|
17
|
+
const transformer_3 = require("@itrocks/transformer");
|
|
18
|
+
const transformer_4 = require("@itrocks/transformer");
|
|
19
|
+
const multiple_output_1 = require("./multiple-output");
|
|
20
|
+
const dependencies = {};
|
|
21
|
+
function listRepresentationDependsOn(overrides) {
|
|
22
|
+
Object.assign(dependencies, overrides);
|
|
23
|
+
}
|
|
24
|
+
function representationFields(type, ancestors = [], property) {
|
|
25
|
+
if (ancestors.includes(type))
|
|
26
|
+
throw new storage_1.SelectionError('unsupported-selection', 'Cyclic object representation');
|
|
27
|
+
const branch = [...ancestors, type];
|
|
28
|
+
const fields = dependencies.fields?.(type, branch, property);
|
|
29
|
+
if (!fields && property && (0, transformer_4.resolveTransformer)(property.class.type, property.name, transformer_2.HTML, transformer_3.OUTPUT) !== core_transformers_2.storeOutput)
|
|
30
|
+
throw new storage_1.SelectionError('unsupported-selection', 'Undeclared custom object representation');
|
|
31
|
+
return (fields ?? (0, class_view_1.representativeOf)(type).map(String)).flatMap(path => {
|
|
32
|
+
const resolved = (0, reflect_path_2.resolvePropertyPath)(type, path);
|
|
33
|
+
if (resolved.targetMultiplicity !== 'one')
|
|
34
|
+
throw new storage_1.SelectionError('unsupported-selection', path);
|
|
35
|
+
return resolved.target
|
|
36
|
+
? representationFields(resolved.target, branch, resolved.property).map(field => `${path}.${field}`) : [path];
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
class ListColumn {
|
|
40
|
+
root;
|
|
41
|
+
name;
|
|
42
|
+
field;
|
|
43
|
+
fields;
|
|
44
|
+
label;
|
|
45
|
+
multiple;
|
|
46
|
+
property;
|
|
47
|
+
sortable;
|
|
48
|
+
reverse = false;
|
|
49
|
+
search = '';
|
|
50
|
+
sort;
|
|
51
|
+
constructor(root, name) {
|
|
52
|
+
this.root = root;
|
|
53
|
+
this.name = name;
|
|
54
|
+
this.field = encodeURIComponent(name).replaceAll('.', '%2E');
|
|
55
|
+
const resolved = (0, reflect_path_2.resolvePropertyPath)(root, name);
|
|
56
|
+
this.multiple = resolved.targetMultiplicity === 'many';
|
|
57
|
+
this.sortable = !this.multiple;
|
|
58
|
+
if (resolved.targetMultiplicity !== 'one' && !(this.multiple && resolved.segments.length === 1)) {
|
|
59
|
+
throw new storage_1.SelectionError(resolved.targetMultiplicity === 'many' ? 'multiple-values' : 'unsupported-selection', name);
|
|
60
|
+
}
|
|
61
|
+
this.property = new reflect_path_1.ReflectPropertyPath(root, name);
|
|
62
|
+
this.label = resolved.segments.map(property => (0, property_view_1.displayOf)(property.class.type, property.name)).join(' › ');
|
|
63
|
+
if (resolved.target && !this.multiple)
|
|
64
|
+
this.fields = representationFields(resolved.target, [], resolved.property);
|
|
65
|
+
}
|
|
66
|
+
async output(cell) {
|
|
67
|
+
if (cell.kind === 'absent')
|
|
68
|
+
return '';
|
|
69
|
+
if (cell.kind === 'unloaded')
|
|
70
|
+
return '<span class="unavailable">Unavailable</span>';
|
|
71
|
+
if (this.fields && this.fields.some(field => !cell.loadedFields?.includes(field)))
|
|
72
|
+
throw new storage_1.SelectionError('unsupported-selection', this.name);
|
|
73
|
+
const mode = this.multiple ? (0, multiple_output_1.multipleOutputOf)(this.property.class.type, this.property.name) : undefined;
|
|
74
|
+
if (this.multiple && (mode === 'commas')
|
|
75
|
+
&& (0, composition_1.componentOf)(this.property.class.type, this.property.name)) {
|
|
76
|
+
return (await Promise.all(cell.value.map(class_view_2.representativeValueOf))).sort().join(', ');
|
|
77
|
+
}
|
|
78
|
+
const lines = this.multiple && (mode === 'lines');
|
|
79
|
+
return await (0, transformer_1.applyTransformer)(cell.value, this.property.class.type, this.property.name, transformer_2.HTML, transformer_3.OUTPUT, new core_transformers_1.HtmlContainer(false, !this.multiple || lines));
|
|
80
|
+
}
|
|
81
|
+
selection() {
|
|
82
|
+
if (this.multiple)
|
|
83
|
+
throw new storage_1.SelectionError('multiple-values', this.name);
|
|
84
|
+
return this.fields ? { path: this.name, objectFields: this.fields } : this.name;
|
|
85
|
+
}
|
|
86
|
+
sortPaths() {
|
|
87
|
+
return this.fields ? [...this.fields.map(field => `${this.name}.${field}`), this.name] : [this.name];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.ListColumn = ListColumn;
|
|
91
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Action } from '@itrocks/action';
|
|
2
|
+
import { Request } from '@itrocks/action-request';
|
|
3
|
+
import type { SelectorState } from '@itrocks/property-select';
|
|
4
|
+
import type { StateRecord } from '@itrocks/property-select';
|
|
5
|
+
export type SessionTransaction = <T>(session: object, operation: (data: Record<string, any>) => T | Promise<T>) => Promise<T>;
|
|
6
|
+
export declare function listStateDependsOn(dependencies: {
|
|
7
|
+
transaction: SessionTransaction;
|
|
8
|
+
}): void;
|
|
9
|
+
/** Keep all router-resolved identity segments; format and query are presentation parameters. */
|
|
10
|
+
export declare function selectorStateKey(request: Request): string;
|
|
11
|
+
export declare class SessionStateStore {
|
|
12
|
+
private readonly session;
|
|
13
|
+
private readonly run;
|
|
14
|
+
constructor(session: object, run?: SessionTransaction);
|
|
15
|
+
read(key: string): Promise<StateRecord>;
|
|
16
|
+
remove(key: string, expectedRevision: number): Promise<StateRecord>;
|
|
17
|
+
write(key: string, state: SelectorState, expectedRevision: number): Promise<StateRecord>;
|
|
18
|
+
private change;
|
|
19
|
+
}
|
|
20
|
+
export declare class SelectorStateAction extends Action {
|
|
21
|
+
json(request: Request): Promise<import("@itrocks/core-responses").JsonResponse>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectorStateAction = exports.SessionStateStore = void 0;
|
|
4
|
+
exports.listStateDependsOn = listStateDependsOn;
|
|
5
|
+
exports.selectorStateKey = selectorStateKey;
|
|
6
|
+
const action_1 = require("@itrocks/action");
|
|
7
|
+
const action_request_1 = require("@itrocks/action-request");
|
|
8
|
+
const property_select_1 = require("@itrocks/property-select");
|
|
9
|
+
const property_select_2 = require("@itrocks/property-select");
|
|
10
|
+
const request_response_1 = require("@itrocks/request-response");
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
const access_1 = require("./access");
|
|
13
|
+
let transaction = async () => { throw new Error('Session transactions are not configured'); };
|
|
14
|
+
function listStateDependsOn(dependencies) {
|
|
15
|
+
transaction = dependencies.transaction;
|
|
16
|
+
}
|
|
17
|
+
/** Keep all router-resolved identity segments; format and query are presentation parameters. */
|
|
18
|
+
function selectorStateKey(request) {
|
|
19
|
+
return request.route + (request.ids.length ? '/' + request.ids.join(',') : '') + '/' + request.action;
|
|
20
|
+
}
|
|
21
|
+
class SessionStateStore {
|
|
22
|
+
session;
|
|
23
|
+
run;
|
|
24
|
+
constructor(session, run = transaction) {
|
|
25
|
+
this.session = session;
|
|
26
|
+
this.run = run;
|
|
27
|
+
}
|
|
28
|
+
read(key) {
|
|
29
|
+
return this.run(this.session, data => structuredClone(data.propertySelect?.[key] ?? { revision: 0 }));
|
|
30
|
+
}
|
|
31
|
+
remove(key, expectedRevision) {
|
|
32
|
+
return this.change(key, undefined, expectedRevision);
|
|
33
|
+
}
|
|
34
|
+
write(key, state, expectedRevision) {
|
|
35
|
+
const validated = (0, property_select_2.validateSelectorState)(state);
|
|
36
|
+
if (!validated)
|
|
37
|
+
throw new TypeError('Invalid selector state');
|
|
38
|
+
return this.change(key, validated, expectedRevision);
|
|
39
|
+
}
|
|
40
|
+
change(key, state, expectedRevision) {
|
|
41
|
+
if (!Number.isSafeInteger(expectedRevision) || expectedRevision < 0)
|
|
42
|
+
throw new TypeError('Invalid revision');
|
|
43
|
+
return this.run(this.session, data => {
|
|
44
|
+
const current = data.propertySelect?.[key] ?? { revision: 0 };
|
|
45
|
+
if (current.revision !== expectedRevision)
|
|
46
|
+
throw new property_select_1.StateConflictError();
|
|
47
|
+
const record = state ? { revision: current.revision + 1, state }
|
|
48
|
+
: { revision: current.revision + 1 };
|
|
49
|
+
data.propertySelect ??= {};
|
|
50
|
+
Object.defineProperty(data.propertySelect, key, {
|
|
51
|
+
configurable: true, enumerable: true, writable: true, value: structuredClone(record)
|
|
52
|
+
});
|
|
53
|
+
return structuredClone(record);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.SessionStateStore = SessionStateStore;
|
|
58
|
+
class SelectorStateAction extends action_1.Action {
|
|
59
|
+
async json(request) {
|
|
60
|
+
const headers = { 'Cache-Control': 'no-store' };
|
|
61
|
+
try {
|
|
62
|
+
const input = request.data;
|
|
63
|
+
if (typeof input.key !== 'string' || !input.key.startsWith('/') || input.key.startsWith('//')
|
|
64
|
+
|| input.key.length > 2048)
|
|
65
|
+
throw new TypeError('Invalid selector route');
|
|
66
|
+
const origin = request.request;
|
|
67
|
+
const path = input.key.split('?')[0].split('#')[0];
|
|
68
|
+
const target = new action_request_1.Request(new request_response_1.Request('GET', origin.scheme, origin.host, origin.port, path, {}, {}, {}, origin.session));
|
|
69
|
+
if (target.action !== 'list')
|
|
70
|
+
throw new TypeError('Selector state requires a list route');
|
|
71
|
+
const access = await (0, access_1.listAccess)(target);
|
|
72
|
+
if (!access.root)
|
|
73
|
+
return this.jsonResponse({ error: 'forbidden' }, 403, headers);
|
|
74
|
+
const key = selectorStateKey(target);
|
|
75
|
+
let generation = '';
|
|
76
|
+
const store = new SessionStateStore(origin.session, (session, operation) => transaction(session, data => {
|
|
77
|
+
data.propertySelectGeneration ??= (0, node_crypto_1.randomUUID)();
|
|
78
|
+
generation = data.propertySelectGeneration;
|
|
79
|
+
if (origin.method !== 'GET' && origin.headers['x-property-select-session'] !== generation)
|
|
80
|
+
throw Object.assign(new Error('The selector session has ended'), { code: 'SESSION_STALE' });
|
|
81
|
+
return operation(data);
|
|
82
|
+
}));
|
|
83
|
+
const respond = (record) => this.jsonResponse(record, 200, {
|
|
84
|
+
...headers, 'X-Property-Select-Session': generation
|
|
85
|
+
});
|
|
86
|
+
if (origin.method === 'GET')
|
|
87
|
+
return respond(await store.read(key));
|
|
88
|
+
if (origin.method === 'DELETE')
|
|
89
|
+
return respond(await store.remove(key, Number(input.revision)));
|
|
90
|
+
if (origin.method !== 'PUT')
|
|
91
|
+
throw new TypeError('Invalid state operation');
|
|
92
|
+
const state = (0, property_select_2.validateSelectorState)(input.state);
|
|
93
|
+
if (!state)
|
|
94
|
+
throw new TypeError('Invalid selector state');
|
|
95
|
+
return respond(await store.write(key, state, Number(input.revision)));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof property_select_1.StateConflictError)
|
|
99
|
+
return this.jsonResponse({ error: error.code }, 409, headers);
|
|
100
|
+
if (error.code === 'SESSION_STALE')
|
|
101
|
+
return this.jsonResponse({ error: 'SESSION_STALE' }, 410, headers);
|
|
102
|
+
if (error instanceof TypeError)
|
|
103
|
+
return this.jsonResponse({ error: error.message }, 400, headers);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.SelectorStateAction = SelectorStateAction;
|
|
109
|
+
//# sourceMappingURL=selector-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector-state.js","sourceRoot":"","sources":["../src/selector-state.ts"],"names":[],"mappings":"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"}
|
package/cjs/sort.js
CHANGED
|
@@ -31,7 +31,8 @@ class Sort extends parameter_1.Parameter {
|
|
|
31
31
|
sortReverse = (0, sort_2.sortOf)(type).map(property => property instanceof sort_1.Reverse);
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
if (typeof request.data.sort === 'string'
|
|
34
|
+
if (typeof request.data.sort === 'string'
|
|
35
|
+
&& !this.columns.properties.some(column => column.name === request.data.sort && column.multiple)) {
|
|
35
36
|
const reverse = 'reverse' in request.data;
|
|
36
37
|
const sort = request.data.sort;
|
|
37
38
|
const index = sortProperties.indexOf(sort);
|
|
@@ -52,7 +53,7 @@ class Sort extends parameter_1.Parameter {
|
|
|
52
53
|
for (const column of this.columns) {
|
|
53
54
|
const sortIndex = sortProperties.indexOf(column.name.toString());
|
|
54
55
|
column.reverse = !!sortReverse[sortIndex];
|
|
55
|
-
column.sort = (sortIndex + 1) || undefined;
|
|
56
|
+
column.sort = column.multiple ? undefined : (sortIndex + 1) || undefined;
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
readOptions(options = new Array) {
|
|
@@ -67,7 +68,11 @@ class Sort extends parameter_1.Parameter {
|
|
|
67
68
|
return storage_1.Sort;
|
|
68
69
|
const properties = new Array;
|
|
69
70
|
for (const [propertyName, reverse] of Object.entries(this.sorted)) {
|
|
70
|
-
properties.
|
|
71
|
+
const column = this.columns.properties.find(column => column.name === propertyName);
|
|
72
|
+
if (column?.multiple)
|
|
73
|
+
continue;
|
|
74
|
+
for (const path of column?.sortPaths() ?? [propertyName])
|
|
75
|
+
properties.push(reverse ? new sort_1.Reverse(path) : path);
|
|
71
76
|
}
|
|
72
77
|
return new storage_1.Sort(properties);
|
|
73
78
|
}
|
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,CAAa;IAEnB,YAAY,OAAmB;QAE9B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,OAAkC,CAAA;IAClD,CAAC;IAED,SAAS,CAAC,OAAgB,EAAE,IAAa;QAExC,IAAI,cAAqC,CAAA;QACzC,IAAI,WAAqC,CAAA;QAEzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzC,WAAW,GAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC;aACI,CAAC;YACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzC,IAAI,MAAM,YAAY,cAAU,EAAE,CAAC;oBAClC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;oBACjE,WAAW,GAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,YAAY,cAAO,CAAC,CAAA;gBAChF,CAAC;YACF,CAAC;YACD,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,cAAc,GAAG,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;gBAC5D,WAAW,GAAM,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,YAAY,cAAO,CAAC,CAAA;YAC3E,CAAC;QACF,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;
|
|
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,CAAa;IAEnB,YAAY,OAAmB;QAE9B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,OAAkC,CAAA;IAClD,CAAC;IAED,SAAS,CAAC,OAAgB,EAAE,IAAa;QAExC,IAAI,cAAqC,CAAA;QACzC,IAAI,WAAqC,CAAA;QAEzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzC,WAAW,GAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC;aACI,CAAC;YACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzC,IAAI,MAAM,YAAY,cAAU,EAAE,CAAC;oBAClC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;oBACjE,WAAW,GAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,YAAY,cAAO,CAAC,CAAA;gBAChF,CAAC;YACF,CAAC;YACD,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,cAAc,GAAG,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;gBAC5D,WAAW,GAAM,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,YAAY,cAAO,CAAC,CAAA;YAC3E,CAAC;QACF,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;eACrC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnG,MAAM,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAA;YACzC,MAAM,IAAI,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA;YACjC,MAAM,KAAK,GAAK,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChB,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;gBAC/B,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC7B,CAAC;YACD,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC5B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;YAChB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACxD,CAAC;QACF,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAChE,MAAM,CAAC,OAAO,GAAI,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;YAC1C,MAAM,CAAC,IAAI,GAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,SAAS,CAAA;QAC7E,CAAC;IACF,CAAC;IAED,WAAW,CAAC,UAAU,IAAI,KAAa;QAEtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QAC/B,OAAO,OAAO,CAAA;IACf,CAAC;IAED,SAAS;QAER,OAAO,IAAI,CAAC,MAAM,CAAA;IACnB,CAAC;IAED,UAAU;QAET,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,cAAU,CAAA;QACnC,MAAM,UAAU,GAAG,IAAI,KAAmB,CAAA;QAC1C,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;YACnF,IAAI,MAAM,EAAE,QAAQ;gBAAE,SAAQ;YAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;gBACvD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,cAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,IAAI,cAAU,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC;IAED,WAAW,CAAC,IAAgB;QAE3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACnB,CAAC;CAED;AA3FD,oBA2FC"}
|
package/column-add.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 5v14M5 12h14" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="3"/></svg>
|
package/config.yaml
CHANGED
package/list.css
CHANGED
|
@@ -3,10 +3,13 @@ html.column-reorder * {
|
|
|
3
3
|
cursor: grabbing !important;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
main > article[data-action=list] > header {
|
|
7
|
+
position: relative;
|
|
8
|
+
}
|
|
6
9
|
main > article[data-action=list] > header > .summary {
|
|
7
10
|
padding: 13px 10px 12px;
|
|
8
11
|
position: absolute;
|
|
9
|
-
right:
|
|
12
|
+
right: 48px;
|
|
10
13
|
white-space: nowrap;
|
|
11
14
|
}
|
|
12
15
|
main > article[data-action=list] > form {
|
|
@@ -48,6 +51,9 @@ table.objects > * > tr > .column-reorder {
|
|
|
48
51
|
--column-reorder-tint: inset 0 0 0 100vmax rgb(0 0 0 / 2%);
|
|
49
52
|
box-shadow: var(--column-reorder-tint);
|
|
50
53
|
}
|
|
54
|
+
table.objects > * > tr > .column-reorder.column-add-provisional {
|
|
55
|
+
--column-reorder-tint: inset 0 0 0 100vmax rgb(47 137 67 / 5%);
|
|
56
|
+
}
|
|
51
57
|
table.objects > * > tr > .column-reorder.moving {
|
|
52
58
|
--column-reorder-tint: inset 0 0 0 100vmax rgb(38 116 198 / 4%);
|
|
53
59
|
}
|
|
@@ -81,16 +87,16 @@ table.objects > thead > tr.properties > th {
|
|
|
81
87
|
table.objects > thead > tr.properties > th.moving, table.objects > thead > tr.properties > th.removing {
|
|
82
88
|
z-index: 2;
|
|
83
89
|
}
|
|
84
|
-
table.objects > thead > tr.properties > th.moving::before, table.objects > thead > tr.properties > th.removing::before {
|
|
90
|
+
table.objects > thead > tr.properties > th.moving::before, table.objects > thead > tr.properties > th.removing::before, table.objects > thead > tr.properties > th.column-add-provisional.column-reorder::before {
|
|
85
91
|
content: "";
|
|
86
92
|
display: inline-block;
|
|
87
93
|
height: 1em;
|
|
88
|
-
margin-left: -
|
|
89
|
-
margin-right: 0.4em;
|
|
94
|
+
margin-left: -1em;
|
|
90
95
|
mask-position: center;
|
|
91
96
|
mask-repeat: no-repeat;
|
|
92
97
|
mask-size: contain;
|
|
93
98
|
pointer-events: none;
|
|
99
|
+
transform: translateX(-0.15em);
|
|
94
100
|
vertical-align: -0.22em;
|
|
95
101
|
width: 1em;
|
|
96
102
|
}
|
|
@@ -102,9 +108,16 @@ table.objects > thead > tr.properties > th.removing::before {
|
|
|
102
108
|
background: #d51d2c;
|
|
103
109
|
mask-image: url("column-remove.svg");
|
|
104
110
|
}
|
|
111
|
+
table.objects > thead > tr.properties > th.column-add-provisional.column-reorder::before {
|
|
112
|
+
background: #2f8943;
|
|
113
|
+
mask-image: url("column-add.svg");
|
|
114
|
+
}
|
|
105
115
|
table.objects > thead > tr.properties > th[data-property] {
|
|
106
116
|
cursor: pointer;
|
|
107
117
|
}
|
|
118
|
+
table.objects > thead > tr.properties > th[data-sortable=false] {
|
|
119
|
+
cursor: default;
|
|
120
|
+
}
|
|
108
121
|
table.objects > thead > tr.properties > th[data-sort] {
|
|
109
122
|
padding-right: calc(0.6em + 16px);
|
|
110
123
|
}
|
|
@@ -114,7 +127,7 @@ table.objects > thead > tr.properties > th[data-sort]::after {
|
|
|
114
127
|
mask: url("sort.svg") right center/24px 24px no-repeat;
|
|
115
128
|
position: absolute;
|
|
116
129
|
right: 0;
|
|
117
|
-
top:
|
|
130
|
+
top: 2px;
|
|
118
131
|
width: 24px;
|
|
119
132
|
}
|
|
120
133
|
table.objects > thead > tr.properties > th[data-sort][data-reverse]::after {
|
|
@@ -164,3 +177,68 @@ table.objects > thead + tbody > tr:nth-child(odd) > td {
|
|
|
164
177
|
:not(article, article > form) > table.objects td:first-child, :not(article, article > form) > table.objects th:first-child {
|
|
165
178
|
border-left: 1px solid #d8d8d8;
|
|
166
179
|
}
|
|
180
|
+
|
|
181
|
+
main > article[data-action=list] > header > .add-column {
|
|
182
|
+
background: white;
|
|
183
|
+
border: 0;
|
|
184
|
+
border-bottom: 1px solid #ccc;
|
|
185
|
+
border-left: 1px solid #ccc;
|
|
186
|
+
border-radius: 0;
|
|
187
|
+
bottom: 0;
|
|
188
|
+
cursor: pointer;
|
|
189
|
+
font-size: 16px;
|
|
190
|
+
position: absolute;
|
|
191
|
+
right: 0;
|
|
192
|
+
top: 0;
|
|
193
|
+
width: 44px;
|
|
194
|
+
}
|
|
195
|
+
main > article[data-action=list] > header > .add-column:hover {
|
|
196
|
+
background-color: #f4f4f4;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
table.objects > thead > tr.properties > th {
|
|
200
|
+
line-height: 28px;
|
|
201
|
+
padding-block: 0;
|
|
202
|
+
position: sticky;
|
|
203
|
+
text-align: center;
|
|
204
|
+
}
|
|
205
|
+
table.objects > thead > tr.properties > th.select {
|
|
206
|
+
padding-inline: 0;
|
|
207
|
+
}
|
|
208
|
+
table.objects > thead > tr.properties > th.select::before {
|
|
209
|
+
content: "";
|
|
210
|
+
display: block;
|
|
211
|
+
height: 28px;
|
|
212
|
+
}
|
|
213
|
+
table.objects > thead > tr.properties > th.column-add-provisional::before {
|
|
214
|
+
content: none;
|
|
215
|
+
}
|
|
216
|
+
table.objects > thead > tr.properties > th > input:not([type=checkbox]) {
|
|
217
|
+
border: 0;
|
|
218
|
+
border-top: 1px solid #d8d8d8;
|
|
219
|
+
border-radius: 0;
|
|
220
|
+
display: block;
|
|
221
|
+
height: 28px;
|
|
222
|
+
padding: 0 6px;
|
|
223
|
+
width: 100%;
|
|
224
|
+
}
|
|
225
|
+
table.objects > thead > tr.properties > th > input[name=reset] {
|
|
226
|
+
background: url("filter-reset.svg") center no-repeat;
|
|
227
|
+
color: transparent;
|
|
228
|
+
cursor: pointer;
|
|
229
|
+
font-size: 0;
|
|
230
|
+
padding: 0;
|
|
231
|
+
width: 28px;
|
|
232
|
+
}
|
|
233
|
+
table.objects > thead > tr.properties > th > input[data-property-filter] {
|
|
234
|
+
border-left: 1px solid #d8d8d8;
|
|
235
|
+
margin-left: -0.6em;
|
|
236
|
+
width: calc(100% + 1.2em);
|
|
237
|
+
}
|
|
238
|
+
table.objects > thead > tr.properties > th[data-sort] > input[data-property-filter] {
|
|
239
|
+
width: calc(100% + 1.2em + 16px);
|
|
240
|
+
}
|
|
241
|
+
table.objects > thead > tr.properties > th > input:focus {
|
|
242
|
+
box-shadow: inset 0 0 0 2px Highlight, var(--column-reorder-tint, 0 0 transparent);
|
|
243
|
+
outline: none;
|
|
244
|
+
}
|
package/package.json
CHANGED
|
@@ -4,18 +4,32 @@
|
|
|
4
4
|
"email": "baptiste@pillot.fr"
|
|
5
5
|
},
|
|
6
6
|
"dependencies": {
|
|
7
|
+
"@itrocks/action": "latest",
|
|
7
8
|
"@itrocks/action-pack": "latest",
|
|
9
|
+
"@itrocks/action-request": "latest",
|
|
8
10
|
"@itrocks/build": "latest",
|
|
9
11
|
"@itrocks/class-type": "latest",
|
|
12
|
+
"@itrocks/class-view": "latest",
|
|
13
|
+
"@itrocks/composition": "latest",
|
|
14
|
+
"@itrocks/core-transformers": "latest",
|
|
15
|
+
"@itrocks/decorator": "latest",
|
|
10
16
|
"@itrocks/list-properties": "latest",
|
|
17
|
+
"@itrocks/property-select": "latest",
|
|
18
|
+
"@itrocks/property-view": "latest",
|
|
11
19
|
"@itrocks/reflect": "latest",
|
|
20
|
+
"@itrocks/reflect-path": "latest",
|
|
12
21
|
"@itrocks/request-response": "latest",
|
|
22
|
+
"@itrocks/route": "latest",
|
|
13
23
|
"@itrocks/sort": "latest",
|
|
24
|
+
"@itrocks/storage": "latest",
|
|
14
25
|
"@itrocks/table": "latest",
|
|
26
|
+
"@itrocks/transformer": "latest",
|
|
15
27
|
"@itrocks/xtarget": "latest"
|
|
16
28
|
},
|
|
17
29
|
"description": "Generic action-based object list navigation in HTML and JSON",
|
|
18
30
|
"devDependencies": {
|
|
31
|
+
"@itrocks/class-file": "latest",
|
|
32
|
+
"@itrocks/fastify-file-session-store": "latest",
|
|
19
33
|
"@types/node": "^24.10",
|
|
20
34
|
"sass": "^1.95",
|
|
21
35
|
"typescript": "^7.0"
|
|
@@ -23,7 +37,14 @@
|
|
|
23
37
|
"engines": {
|
|
24
38
|
"node": ">=24"
|
|
25
39
|
},
|
|
26
|
-
"exports":
|
|
40
|
+
"exports": {
|
|
41
|
+
".": "./cjs/list.js",
|
|
42
|
+
"./multiple-output": "./cjs/multiple-output.js",
|
|
43
|
+
"./projection": "./cjs/projection.js",
|
|
44
|
+
"./property-select.js": "./property-select.js",
|
|
45
|
+
"./selector-state": "./cjs/selector-state.js",
|
|
46
|
+
"./selector-state.js": "./selector-state.js"
|
|
47
|
+
},
|
|
27
48
|
"homepage": "https://it.rocks",
|
|
28
49
|
"files": [
|
|
29
50
|
"config.yaml",
|
|
@@ -71,5 +92,5 @@
|
|
|
71
92
|
"build:front": "tsc -p src/front/tsconfig.json",
|
|
72
93
|
"test": "npm run build:cjs && node --test \"test/**/*.test.mjs\""
|
|
73
94
|
},
|
|
74
|
-
"version": "0.
|
|
95
|
+
"version": "0.13.3"
|
|
75
96
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { PropertySelectView } from '@itrocks/property-select/front/property-select.js';
|
|
2
|
+
import type { ConsumerPort } from '@itrocks/property-select/property-select.js';
|
|
3
|
+
import type { MetadataProvider } from '@itrocks/property-select/property-select.js';
|
|
4
|
+
import type { PointerSample } from '@itrocks/property-select/property-select.js';
|
|
5
|
+
import type { Outcome } from '@itrocks/property-select/property-select.js';
|
|
6
|
+
import type { SelectionIntent } from '@itrocks/property-select/property-select.js';
|
|
7
|
+
import { TableColumnAdd } from '@itrocks/table/column-add.js';
|
|
8
|
+
export type PaneHandle = {
|
|
9
|
+
close(): void;
|
|
10
|
+
open(): void;
|
|
11
|
+
remove(): void;
|
|
12
|
+
subscribe(listener: (state: {
|
|
13
|
+
present: boolean;
|
|
14
|
+
open: boolean;
|
|
15
|
+
suspended: boolean;
|
|
16
|
+
}) => void): () => void;
|
|
17
|
+
suspend(options?: {
|
|
18
|
+
mobileOnly?: boolean;
|
|
19
|
+
}): {
|
|
20
|
+
restore(): void;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export type ListSelectorOptions = {
|
|
24
|
+
advice?: readonly string[];
|
|
25
|
+
addition: TableColumnAdd;
|
|
26
|
+
metadata: MetadataProvider;
|
|
27
|
+
mountSelector(content: HTMLElement, title: string): PaneHandle;
|
|
28
|
+
saveColumns(): Promise<void>;
|
|
29
|
+
templateUrl?: string;
|
|
30
|
+
};
|
|
31
|
+
export declare class ListPropertySelect implements ConsumerPort {
|
|
32
|
+
private readonly article;
|
|
33
|
+
private readonly options;
|
|
34
|
+
private readonly abort;
|
|
35
|
+
private readonly button;
|
|
36
|
+
private disposed;
|
|
37
|
+
private drag?;
|
|
38
|
+
private readonly observer;
|
|
39
|
+
private readonly pane;
|
|
40
|
+
private readonly pending;
|
|
41
|
+
readonly view: PropertySelectView;
|
|
42
|
+
constructor(article: HTMLElement, options: ListSelectorOptions);
|
|
43
|
+
private loadColumn;
|
|
44
|
+
private add;
|
|
45
|
+
begin(intent: SelectionIntent, sample: PointerSample): void;
|
|
46
|
+
cancel(id: string): void;
|
|
47
|
+
private previewError;
|
|
48
|
+
dispose(): void;
|
|
49
|
+
end(id: string, sample: PointerSample): Promise<Outcome>;
|
|
50
|
+
mount(): Promise<boolean>;
|
|
51
|
+
move(id: string, sample: PointerSample): void;
|
|
52
|
+
paths(): string[];
|
|
53
|
+
select(intent: SelectionIntent, signal: AbortSignal): Promise<Outcome>;
|
|
54
|
+
}
|