@platforma-sdk/model 1.9.0 → 1.10.2
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/dist/components/PlDataTable.d.ts +156 -0
- package/dist/components/PlDataTable.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +290 -228
- package/dist/index.mjs.map +1 -1
- package/dist/render/accessor.d.ts +24 -0
- package/dist/render/accessor.d.ts.map +1 -1
- package/dist/render/index.d.ts +1 -0
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/traversal_ops.d.ts +5 -2
- package/dist/render/traversal_ops.d.ts.map +1 -1
- package/dist/render/util/index.d.ts +2 -0
- package/dist/render/util/index.d.ts.map +1 -0
- package/dist/render/util/resource_map.d.ts +15 -0
- package/dist/render/util/resource_map.d.ts.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/PlDataTable.ts +193 -1
- package/src/render/accessor.ts +63 -0
- package/src/render/index.ts +1 -0
- package/src/render/traversal_ops.ts +5 -2
- package/src/render/util/index.ts +1 -0
- package/src/render/util/resource_map.ts +74 -0
package/package.json
CHANGED
|
@@ -28,7 +28,9 @@ export type PlDataTableGridState = {
|
|
|
28
28
|
sort: 'asc' | 'desc';
|
|
29
29
|
}[];
|
|
30
30
|
};
|
|
31
|
+
/** Includes column visibility */
|
|
31
32
|
columnVisibility?: {
|
|
33
|
+
/** All colIds which were hidden */
|
|
32
34
|
hiddenColIds: string[];
|
|
33
35
|
};
|
|
34
36
|
|
|
@@ -52,11 +54,201 @@ export type PTableParams = {
|
|
|
52
54
|
export type PlDataTableState = {
|
|
53
55
|
// internal ag-grid state
|
|
54
56
|
gridState: PlDataTableGridState;
|
|
55
|
-
|
|
56
57
|
// mapping of gridState onto the p-table data structures
|
|
57
58
|
pTableParams?: PTableParams;
|
|
58
59
|
};
|
|
59
60
|
|
|
61
|
+
/** PlTableFilters filter entry */
|
|
62
|
+
export type PlTableFilterIsNotNA = {
|
|
63
|
+
/** Predicate type */
|
|
64
|
+
type: 'isNotNA';
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** PlTableFilters filter entry */
|
|
68
|
+
export type PlTableFilterIsNA = {
|
|
69
|
+
/** Predicate type */
|
|
70
|
+
type: 'isNA';
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/** PlTableFilters filter entries applicable to both string and number values */
|
|
74
|
+
export type PlTableFilterCommon = PlTableFilterIsNotNA | PlTableFilterIsNA;
|
|
75
|
+
|
|
76
|
+
/** PlTableFilters numeric filter entry */
|
|
77
|
+
export type PlTableFilterNumberEquals = {
|
|
78
|
+
/** Predicate type */
|
|
79
|
+
type: 'number_equals';
|
|
80
|
+
/** Referense value */
|
|
81
|
+
reference: number;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/** PlTableFilters numeric filter entry */
|
|
85
|
+
export type PlTableFilterNumberNotEquals = {
|
|
86
|
+
/** Predicate type */
|
|
87
|
+
type: 'number_notEquals';
|
|
88
|
+
/** Referense value */
|
|
89
|
+
reference: number;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/** PlTableFilters numeric filter entry */
|
|
93
|
+
export type PlTableFilterNumberGreaterThen = {
|
|
94
|
+
/** Predicate type */
|
|
95
|
+
type: 'number_greaterThen';
|
|
96
|
+
/** Referense value */
|
|
97
|
+
reference: number;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/** PlTableFilters numeric filter entry */
|
|
101
|
+
export type PlTableFilterNumberGreaterThenOrEqualTo = {
|
|
102
|
+
/** Predicate type */
|
|
103
|
+
type: 'number_greaterThenOrEqualTo';
|
|
104
|
+
/** Referense value */
|
|
105
|
+
reference: number;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** PlTableFilters numeric filter entry */
|
|
109
|
+
export type PlTableFilterNumberLessThen = {
|
|
110
|
+
/** Predicate type */
|
|
111
|
+
type: 'number_lessThen';
|
|
112
|
+
/** Referense value */
|
|
113
|
+
reference: number;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/** PlTableFilters numeric filter entry */
|
|
117
|
+
export type PlTableFilterNumberLessThenOrEqualTo = {
|
|
118
|
+
/** Predicate type */
|
|
119
|
+
type: 'number_lessThenOrEqualTo';
|
|
120
|
+
/** Referense value */
|
|
121
|
+
reference: number;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/** PlTableFilters numeric filter entry */
|
|
125
|
+
export type PlTableFilterNumberBetween = {
|
|
126
|
+
/** Predicate type */
|
|
127
|
+
type: 'number_between';
|
|
128
|
+
/** Referense value for the lower bound */
|
|
129
|
+
lowerBound: number;
|
|
130
|
+
/** Defines whether values equal to lower bound reference value should be matched */
|
|
131
|
+
includeLowerBound: boolean;
|
|
132
|
+
/** Referense value for the upper bound */
|
|
133
|
+
upperBound: number;
|
|
134
|
+
/** Defines whether values equal to upper bound reference value should be matched */
|
|
135
|
+
includeUpperBound: boolean;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/** All PlTableFilters numeric filter entries */
|
|
139
|
+
export type PlTableFilterNumber =
|
|
140
|
+
| PlTableFilterCommon
|
|
141
|
+
| PlTableFilterNumberEquals
|
|
142
|
+
| PlTableFilterNumberNotEquals
|
|
143
|
+
| PlTableFilterNumberGreaterThen
|
|
144
|
+
| PlTableFilterNumberGreaterThenOrEqualTo
|
|
145
|
+
| PlTableFilterNumberLessThen
|
|
146
|
+
| PlTableFilterNumberLessThenOrEqualTo
|
|
147
|
+
| PlTableFilterNumberBetween;
|
|
148
|
+
/** All types of PlTableFilters numeric filter entries */
|
|
149
|
+
export type PlTableFilterNumberType = PlTableFilterNumber['type'];
|
|
150
|
+
|
|
151
|
+
/** PlTableFilters string filter entry */
|
|
152
|
+
export type PlTableFilterStringEquals = {
|
|
153
|
+
/** Predicate type */
|
|
154
|
+
type: 'string_equals';
|
|
155
|
+
/** Referense value */
|
|
156
|
+
reference: string;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/** PlTableFilters string filter entry */
|
|
160
|
+
export type PlTableFilterStringNotEquals = {
|
|
161
|
+
/** Predicate type */
|
|
162
|
+
type: 'string_notEquals';
|
|
163
|
+
/** Referense value */
|
|
164
|
+
reference: string;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** PlTableFilters string filter entry */
|
|
168
|
+
export type PlTableFilterStringContains = {
|
|
169
|
+
/** Predicate type */
|
|
170
|
+
type: 'string_contains';
|
|
171
|
+
/** Referense value */
|
|
172
|
+
reference: string;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/** PlTableFilters string filter entry */
|
|
176
|
+
export type PlTableFilterStringDoesNotContain = {
|
|
177
|
+
/** Predicate type */
|
|
178
|
+
type: 'string_doesNotContain';
|
|
179
|
+
/** Referense value */
|
|
180
|
+
reference: string;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
/** PlTableFilters string filter entry */
|
|
184
|
+
export type PlTableFilterStringMatches = {
|
|
185
|
+
/** Predicate type */
|
|
186
|
+
type: 'string_matches';
|
|
187
|
+
/** Referense value */
|
|
188
|
+
reference: string;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/** PlTableFilters string filter entry */
|
|
192
|
+
export type PlTableFilterStringDoesNotMatch = {
|
|
193
|
+
/** Predicate type */
|
|
194
|
+
type: 'string_doesNotMatch';
|
|
195
|
+
/** Referense value */
|
|
196
|
+
reference: string;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/** PlTableFilters string filter entry */
|
|
200
|
+
export type PlTableFilterStringContainsFuzzyMatch = {
|
|
201
|
+
/** Predicate type */
|
|
202
|
+
type: 'string_containsFuzzyMatch';
|
|
203
|
+
/** Referense value */
|
|
204
|
+
reference: string;
|
|
205
|
+
/**
|
|
206
|
+
* Maximum acceptable edit distance between reference value and matched substring
|
|
207
|
+
* @see https://en.wikipedia.org/wiki/Edit_distance
|
|
208
|
+
*/
|
|
209
|
+
maxEdits: number;
|
|
210
|
+
/**
|
|
211
|
+
* When {@link substitutionsOnly} is set to false
|
|
212
|
+
* Levenshtein distance is used as edit distance (substitutions and indels)
|
|
213
|
+
* @see https://en.wikipedia.org/wiki/Levenshtein_distance
|
|
214
|
+
* When {@link substitutionsOnly} is set to true
|
|
215
|
+
* Hamming distance is used as edit distance (substitutions only)
|
|
216
|
+
* @see https://en.wikipedia.org/wiki/Hamming_distance
|
|
217
|
+
*/
|
|
218
|
+
substitutionsOnly: boolean;
|
|
219
|
+
/**
|
|
220
|
+
* Single character in {@link reference} that will match any
|
|
221
|
+
* single character in searched text.
|
|
222
|
+
*/
|
|
223
|
+
wildcard?: string;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
/** All PlTableFilters string filter entries */
|
|
227
|
+
export type PlTableFilterString =
|
|
228
|
+
| PlTableFilterCommon
|
|
229
|
+
| PlTableFilterStringEquals
|
|
230
|
+
| PlTableFilterStringNotEquals
|
|
231
|
+
| PlTableFilterStringContains
|
|
232
|
+
| PlTableFilterStringDoesNotContain
|
|
233
|
+
| PlTableFilterStringMatches
|
|
234
|
+
| PlTableFilterStringDoesNotMatch
|
|
235
|
+
| PlTableFilterStringContainsFuzzyMatch;
|
|
236
|
+
/** All types of PlTableFilters string filter entries */
|
|
237
|
+
export type PlTableFilterStringType = PlTableFilterString['type'];
|
|
238
|
+
|
|
239
|
+
/** All PlTableFilters filter entries */
|
|
240
|
+
export type PlTableFilter = PlTableFilterNumber | PlTableFilterString;
|
|
241
|
+
/** All types of PlTableFilters filter entries */
|
|
242
|
+
export type PlTableFilterType = PlTableFilter['type'];
|
|
243
|
+
|
|
244
|
+
/** PlTableFilters model */
|
|
245
|
+
export type PlTableFiltersModel = {
|
|
246
|
+
/** Internal PlTableFilters component state, do not change! */
|
|
247
|
+
state?: Record<string, PlTableFilter>;
|
|
248
|
+
/** Resulting filters which should be used in Join */
|
|
249
|
+
filters?: PTableRecordFilter[];
|
|
250
|
+
};
|
|
251
|
+
|
|
60
252
|
/**
|
|
61
253
|
* Create p-table handle given ui table state
|
|
62
254
|
*
|
package/src/render/accessor.ts
CHANGED
|
@@ -47,6 +47,7 @@ type FieldMapOps = {
|
|
|
47
47
|
export class TreeNodeAccessor {
|
|
48
48
|
constructor(public readonly handle: AccessorHandle) {}
|
|
49
49
|
|
|
50
|
+
/** Shortcut for {@link resolveInput} */
|
|
50
51
|
public resolve(
|
|
51
52
|
...steps: [
|
|
52
53
|
Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
|
|
@@ -54,8 +55,70 @@ export class TreeNodeAccessor {
|
|
|
54
55
|
}
|
|
55
56
|
]
|
|
56
57
|
): TreeNodeAccessor;
|
|
58
|
+
/** Shortcut for {@link resolveInput} */
|
|
57
59
|
public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
|
|
58
60
|
public resolve(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
|
|
61
|
+
const transformedSteps = steps.map(
|
|
62
|
+
(s) =>
|
|
63
|
+
({
|
|
64
|
+
assertFieldType: 'Input',
|
|
65
|
+
...(typeof s === 'string' ? { field: s } : s)
|
|
66
|
+
}) satisfies FieldTraversalStep
|
|
67
|
+
);
|
|
68
|
+
return this.resolveWithCommon({}, ...transformedSteps);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** If field type assertion is not specified for the step, default is Output. */
|
|
72
|
+
public resolveOutput(
|
|
73
|
+
...steps: [
|
|
74
|
+
Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
|
|
75
|
+
errorIfFieldNotAssigned: true;
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
): TreeNodeAccessor;
|
|
79
|
+
/** If field type assertion is not specified for the step, default is Output. */
|
|
80
|
+
public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
|
|
81
|
+
public resolveOutput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
|
|
82
|
+
const transformedSteps = steps.map(
|
|
83
|
+
(s) =>
|
|
84
|
+
({
|
|
85
|
+
assertFieldType: 'Output',
|
|
86
|
+
...(typeof s === 'string' ? { field: s } : s)
|
|
87
|
+
}) satisfies FieldTraversalStep
|
|
88
|
+
);
|
|
89
|
+
return this.resolveWithCommon({}, ...transformedSteps);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** If field type assertion is not specified for the step, default is Input. */
|
|
93
|
+
public resolveInput(
|
|
94
|
+
...steps: [
|
|
95
|
+
Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
|
|
96
|
+
errorIfFieldNotAssigned: true;
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
): TreeNodeAccessor;
|
|
100
|
+
/** If field type assertion is not specified for the step, default is Input. */
|
|
101
|
+
public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
|
|
102
|
+
public resolveInput(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
|
|
103
|
+
const transformedSteps = steps.map(
|
|
104
|
+
(s) =>
|
|
105
|
+
({
|
|
106
|
+
assertFieldType: 'Input',
|
|
107
|
+
...(typeof s === 'string' ? { field: s } : s)
|
|
108
|
+
}) satisfies FieldTraversalStep
|
|
109
|
+
);
|
|
110
|
+
return this.resolveWithCommon({}, ...transformedSteps);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public resolveAny(
|
|
114
|
+
...steps: [
|
|
115
|
+
Omit<FieldTraversalStep, 'errorIfFieldNotSet'> & {
|
|
116
|
+
errorIfFieldNotAssigned: true;
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
): TreeNodeAccessor;
|
|
120
|
+
public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined;
|
|
121
|
+
public resolveAny(...steps: (FieldTraversalStep | string)[]): TreeNodeAccessor | undefined {
|
|
59
122
|
return this.resolveWithCommon({}, ...steps);
|
|
60
123
|
}
|
|
61
124
|
|
package/src/render/index.ts
CHANGED
|
@@ -46,8 +46,11 @@ export type GetFieldStep = CommonFieldTraverseOps & {
|
|
|
46
46
|
errorIfFieldNotSet?: true;
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* Assert field type.
|
|
50
|
-
* fulfilled
|
|
49
|
+
* Assert field type.
|
|
50
|
+
* Call will fail with exception if this assertion is not fulfilled.
|
|
51
|
+
* The information about expectedFieldType is also used for stability
|
|
52
|
+
* calculation and field absence error generation, so it is always a good
|
|
53
|
+
* ide to specify it.
|
|
51
54
|
* */
|
|
52
55
|
assertFieldType?: FieldType;
|
|
53
56
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './resource_map'
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { TreeNodeAccessor } from "../accessor";
|
|
2
|
+
|
|
3
|
+
export const ResourceMapResourceTypeName = 'PColumnData/ResourceMap';
|
|
4
|
+
export const ResourceMapResourcePartitionedTypeName = 'PColumnData/Partitioned/ResourceMap';
|
|
5
|
+
|
|
6
|
+
export type PColumnKey = (string | number)[];
|
|
7
|
+
|
|
8
|
+
export type PColumnResourceMapEntry<T> = {
|
|
9
|
+
key: PColumnKey;
|
|
10
|
+
value: T;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type PColumnResourceMapData<T> = {
|
|
14
|
+
isComplete: boolean;
|
|
15
|
+
data: PColumnResourceMapEntry<T>[];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function populateResourceMapData<T>(
|
|
19
|
+
acc: TreeNodeAccessor | undefined,
|
|
20
|
+
resourceParser: (acc: TreeNodeAccessor) => T | undefined,
|
|
21
|
+
data: PColumnResourceMapEntry<T | undefined>[],
|
|
22
|
+
keyPrefix: PColumnKey = [],
|
|
23
|
+
addEntriesWithNoData: boolean
|
|
24
|
+
): boolean {
|
|
25
|
+
if (acc === undefined) return false;
|
|
26
|
+
switch (acc.resourceType.name) {
|
|
27
|
+
case ResourceMapResourceTypeName: {
|
|
28
|
+
let isComplete = acc.getInputsLocked();
|
|
29
|
+
for (const keyStr of acc.listInputFields()) {
|
|
30
|
+
const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });
|
|
31
|
+
const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;
|
|
32
|
+
const converted = value === undefined ? undefined : resourceParser(value);
|
|
33
|
+
if (converted === undefined) isComplete = false;
|
|
34
|
+
if (converted !== undefined || addEntriesWithNoData) data.push({ key, value: converted });
|
|
35
|
+
}
|
|
36
|
+
return isComplete;
|
|
37
|
+
}
|
|
38
|
+
case ResourceMapResourcePartitionedTypeName: {
|
|
39
|
+
let isComplete = acc.getInputsLocked();
|
|
40
|
+
for (const keyStr of acc.listInputFields()) {
|
|
41
|
+
const value = acc.resolve({ field: keyStr, assertFieldType: 'Input' });
|
|
42
|
+
if (value === undefined) isComplete = false;
|
|
43
|
+
else {
|
|
44
|
+
const key = [...keyPrefix, ...JSON.parse(keyStr)] as PColumnKey;
|
|
45
|
+
const populateResult = populateResourceMapData(value, resourceParser, data, key, addEntriesWithNoData)
|
|
46
|
+
isComplete = isComplete && populateResult;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return isComplete;
|
|
50
|
+
}
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Unknown resource type: ${acc.resourceType.name}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function parseResourceMap<T>(
|
|
57
|
+
acc: TreeNodeAccessor | undefined,
|
|
58
|
+
resourceParser: (acc: TreeNodeAccessor) => T | undefined,
|
|
59
|
+
addEntriesWithNoData: false
|
|
60
|
+
): PColumnResourceMapData<NonNullable<T>>;
|
|
61
|
+
export function parseResourceMap<T>(
|
|
62
|
+
acc: TreeNodeAccessor | undefined,
|
|
63
|
+
resourceParser: (acc: TreeNodeAccessor) => T | undefined,
|
|
64
|
+
addEntriesWithNoData: true
|
|
65
|
+
): PColumnResourceMapData<T | undefined>;
|
|
66
|
+
export function parseResourceMap<T>(
|
|
67
|
+
acc: TreeNodeAccessor | undefined,
|
|
68
|
+
resourceParser: (acc: TreeNodeAccessor) => T | undefined,
|
|
69
|
+
addEntriesWithNoData: boolean = false
|
|
70
|
+
): PColumnResourceMapData<T | undefined> {
|
|
71
|
+
const data: PColumnResourceMapEntry<T | undefined>[] = [];
|
|
72
|
+
const isComplete = populateResourceMapData(acc, resourceParser, data, [], addEntriesWithNoData);
|
|
73
|
+
return { isComplete, data };
|
|
74
|
+
}
|