@vuu-ui/vuu-utils 2.1.14 → 2.1.15
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/cjs/node_modules/@dnd-kit/react/hooks.js +17 -17
- package/cjs/node_modules/@dnd-kit/react/hooks.js.map +1 -1
- package/cjs/node_modules/@dnd-kit/react/index.js +24 -24
- package/cjs/node_modules/@dnd-kit/react/index.js.map +1 -1
- package/cjs/node_modules/@dnd-kit/react/sortable.js +5 -5
- package/cjs/node_modules/@dnd-kit/react/sortable.js.map +1 -1
- package/cjs/packages/vuu-utils/src/ShellContext.js +3 -3
- package/cjs/packages/vuu-utils/src/ShellContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/ThemeProvider.js +10 -10
- package/cjs/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js +2 -2
- package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js +4 -4
- package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js +5 -5
- package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +3 -3
- package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +5 -5
- package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +12 -15
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js +52 -130
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js +1 -32
- package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +15 -23
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js +3 -2
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js +3 -3
- package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/date/date-utils.js +2 -2
- package/cjs/packages/vuu-utils/src/date/date-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/date/formatter.js +2 -2
- package/cjs/packages/vuu-utils/src/date/formatter.js.map +1 -1
- package/cjs/packages/vuu-utils/src/feature-utils.js +2 -2
- package/cjs/packages/vuu-utils/src/feature-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +2 -9
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/cjs/packages/vuu-utils/src/protocol-message-utils.js +0 -10
- package/cjs/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/react-utils.js +8 -8
- package/cjs/packages/vuu-utils/src/react-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/theme-utils.js +3 -3
- package/cjs/packages/vuu-utils/src/theme-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useId.js +2 -2
- package/cjs/packages/vuu-utils/src/useId.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js +3 -3
- package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useResizeObserver.js +5 -5
- package/cjs/packages/vuu-utils/src/useResizeObserver.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useStateRef.js +4 -4
- package/cjs/packages/vuu-utils/src/useStateRef.js.map +1 -1
- package/esm/packages/vuu-utils/src/ThemeProvider.js +2 -2
- package/esm/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +2 -2
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +4 -7
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js +53 -130
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/edit-utils.js +2 -32
- package/esm/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +9 -17
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js +1 -0
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/esm/packages/vuu-utils/src/feature-utils.js +2 -2
- package/esm/packages/vuu-utils/src/feature-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +3 -3
- package/esm/packages/vuu-utils/src/protocol-message-utils.js +1 -6
- package/esm/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/data-editing/EditButtons.d.ts +1 -1
- package/types/data-editing/EditSession.d.ts +6 -30
- package/types/data-editing/edit-utils.d.ts +0 -2
- package/types/data-editing/useEditableTable.d.ts +1 -1
- package/types/filters/filter-utils.d.ts +1 -2
- package/types/index.d.ts +2 -3
- package/types/protocol-message-utils.d.ts +1 -6
- package/cjs/packages/vuu-utils/dist/index.js +0 -6004
- package/cjs/packages/vuu-utils/dist/index.js.map +0 -1
- package/esm/packages/vuu-utils/dist/index.js +0 -5979
- package/esm/packages/vuu-utils/dist/index.js.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { EventEmitter } from '../event-emitter.js';
|
|
2
|
-
import { isRpcError } from '../../dist/index.js';
|
|
3
2
|
|
|
4
3
|
var __typeError = (msg) => {
|
|
5
4
|
throw TypeError(msg);
|
|
@@ -8,28 +7,26 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
8
7
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
9
8
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
9
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
11
|
-
var _rowEdits, _editCount,
|
|
12
|
-
class StaleUpdateError extends Error {
|
|
13
|
-
}
|
|
10
|
+
var _active, _rowEdits, _editCount, _sourceTableDataSource, _sessionDataSource, _inEditMode;
|
|
14
11
|
class EditSession extends EventEmitter {
|
|
15
12
|
constructor(dataSource) {
|
|
16
13
|
super();
|
|
14
|
+
__privateAdd(this, _active, false);
|
|
17
15
|
/**
|
|
18
16
|
* Row key => row edits
|
|
19
17
|
*/
|
|
20
18
|
__privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
|
|
21
19
|
__privateAdd(this, _editCount, 0);
|
|
22
|
-
__privateAdd(this, _invalidCount, 0);
|
|
23
20
|
__privateAdd(this, _sourceTableDataSource);
|
|
24
21
|
__privateAdd(this, _sessionDataSource);
|
|
25
22
|
__privateAdd(this, _inEditMode, false);
|
|
26
23
|
__privateSet(this, _sourceTableDataSource, dataSource);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
}
|
|
25
|
+
get active() {
|
|
26
|
+
return __privateGet(this, _active);
|
|
27
|
+
}
|
|
28
|
+
set active(isActive) {
|
|
29
|
+
__privateSet(this, _active, isActive);
|
|
33
30
|
}
|
|
34
31
|
get editCount() {
|
|
35
32
|
return __privateGet(this, _editCount);
|
|
@@ -45,51 +42,22 @@ class EditSession extends EventEmitter {
|
|
|
45
42
|
}
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
|
-
get invalidCount() {
|
|
49
|
-
return __privateGet(this, _invalidCount);
|
|
50
|
-
}
|
|
51
|
-
set invalidCount(val) {
|
|
52
|
-
if (val !== __privateGet(this, _invalidCount)) {
|
|
53
|
-
const oldCount = __privateGet(this, _invalidCount);
|
|
54
|
-
__privateSet(this, _invalidCount, val);
|
|
55
|
-
if (val === 0) {
|
|
56
|
-
this.emit("editState", __privateGet(this, _editCount) === 0 ? "clean" : "dirty");
|
|
57
|
-
} else if (oldCount === 0) {
|
|
58
|
-
this.emit("editState", "invalid");
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
45
|
clear() {
|
|
63
46
|
__privateGet(this, _rowEdits).clear();
|
|
64
47
|
__privateSet(this, _editCount, 0);
|
|
65
|
-
__privateSet(this, _inEditMode, false);
|
|
66
48
|
}
|
|
67
49
|
async begin(editSessionMode) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return sessionDataSource;
|
|
73
|
-
} catch (e) {
|
|
74
|
-
__privateSet(this, _inEditMode, false);
|
|
75
|
-
}
|
|
50
|
+
__privateSet(this, _inEditMode, true);
|
|
51
|
+
const sessionDataSource = await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(editSessionMode);
|
|
52
|
+
__privateSet(this, _sessionDataSource, sessionDataSource);
|
|
53
|
+
return sessionDataSource;
|
|
76
54
|
}
|
|
77
55
|
get dataSource() {
|
|
78
56
|
return __privateGet(this, _sessionDataSource) ?? __privateGet(this, _sourceTableDataSource);
|
|
79
57
|
}
|
|
80
|
-
async end(saveChanges = false
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
await this.dataSource?.endEditSession?.(saveChanges, force);
|
|
84
|
-
this.clear();
|
|
85
|
-
}
|
|
86
|
-
} catch (e) {
|
|
87
|
-
if (e instanceof StaleUpdateError) {
|
|
88
|
-
this.emit("editState", "stale");
|
|
89
|
-
} else {
|
|
90
|
-
console.error(`[EditSession] ${e.message}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
58
|
+
async end(saveChanges = false) {
|
|
59
|
+
await this.dataSource?.endEditSession?.(saveChanges);
|
|
60
|
+
this.clear();
|
|
93
61
|
}
|
|
94
62
|
get inEditMode() {
|
|
95
63
|
return __privateGet(this, _inEditMode);
|
|
@@ -97,110 +65,65 @@ class EditSession extends EventEmitter {
|
|
|
97
65
|
get editState() {
|
|
98
66
|
return this.editCount === 0 ? "clean" : "dirty";
|
|
99
67
|
}
|
|
100
|
-
|
|
68
|
+
// TODO how do we deal with the '_edited' pattern
|
|
69
|
+
edit(key, columnName, originalValue, newValue) {
|
|
101
70
|
const rowEditDetails = __privateGet(this, _rowEdits).get(key);
|
|
102
71
|
if (rowEditDetails) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const cellEdit = cellEdits.get(column);
|
|
114
|
-
if (cellEdit) {
|
|
115
|
-
if (isValid && cellEdit.isValid === false) {
|
|
116
|
-
cellEdit.isValid = true;
|
|
117
|
-
this.invalidCount -= 1;
|
|
118
|
-
}
|
|
119
|
-
return cellEdit;
|
|
120
|
-
} else {
|
|
121
|
-
const cellEdit2 = {
|
|
122
|
-
originalValue,
|
|
123
|
-
editedValue,
|
|
124
|
-
isValid
|
|
125
|
-
};
|
|
126
|
-
cellEdits.set(column, cellEdit2);
|
|
127
|
-
this.editCount = __privateGet(this, _editCount) + 1;
|
|
128
|
-
return cellEdit2;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Apply incremental edit(s) to edit control value. Used for TextInput, where multiple
|
|
133
|
-
* edits may follow in sequence before value finally committed.
|
|
134
|
-
*
|
|
135
|
-
* @param key value for edited Row
|
|
136
|
-
* @param columnName
|
|
137
|
-
* @param originalValue
|
|
138
|
-
* @param newValue
|
|
139
|
-
*/
|
|
140
|
-
edit(key, columnName, originalValue, newValue) {
|
|
141
|
-
const { cellEdits } = this.getRowEdits(key);
|
|
142
|
-
const cellEdit = cellEdits.get(columnName);
|
|
143
|
-
if (cellEdit) {
|
|
144
|
-
if (newValue === cellEdit.originalValue) {
|
|
145
|
-
if (cellEdits.size === 1) {
|
|
146
|
-
__privateGet(this, _rowEdits).delete(key);
|
|
72
|
+
const { cellEdits } = rowEditDetails;
|
|
73
|
+
const cellEdit = cellEdits.get(columnName);
|
|
74
|
+
if (cellEdit) {
|
|
75
|
+
if (newValue === cellEdit.originalValue) {
|
|
76
|
+
if (cellEdits.size === 1) {
|
|
77
|
+
__privateGet(this, _rowEdits).delete(key);
|
|
78
|
+
} else {
|
|
79
|
+
cellEdits.delete(columnName);
|
|
80
|
+
}
|
|
81
|
+
this.editCount = __privateGet(this, _editCount) - 1;
|
|
147
82
|
} else {
|
|
148
|
-
|
|
83
|
+
cellEdit.editedValue = newValue;
|
|
149
84
|
}
|
|
150
|
-
this.editCount = __privateGet(this, _editCount) - 1;
|
|
151
85
|
} else {
|
|
152
|
-
|
|
86
|
+
cellEdits.set(columnName, {
|
|
87
|
+
originalValue,
|
|
88
|
+
editedValue: newValue
|
|
89
|
+
});
|
|
90
|
+
this.editCount = __privateGet(this, _editCount) + 1;
|
|
153
91
|
}
|
|
154
92
|
} else {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
93
|
+
__privateGet(this, _rowEdits).set(key, {
|
|
94
|
+
cellEdits: /* @__PURE__ */ new Map([
|
|
95
|
+
[columnName, { originalValue, editedValue: newValue }]
|
|
96
|
+
])
|
|
158
97
|
});
|
|
159
98
|
this.editCount = __privateGet(this, _editCount) + 1;
|
|
160
99
|
}
|
|
161
100
|
}
|
|
162
|
-
async commit(key, columnName,
|
|
163
|
-
const rowEditDetails = this.
|
|
164
|
-
if (
|
|
101
|
+
async commit(key, columnName, typedValue) {
|
|
102
|
+
const rowEditDetails = __privateGet(this, _rowEdits).get(key);
|
|
103
|
+
if (rowEditDetails) {
|
|
165
104
|
const { cellEdits } = rowEditDetails;
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
);
|
|
173
|
-
const response = await this.dataSource?.editCell?.(
|
|
174
|
-
key,
|
|
175
|
-
columnName,
|
|
176
|
-
typedValue
|
|
177
|
-
);
|
|
178
|
-
if (isRpcError(response)) {
|
|
179
|
-
cellEdit.isValid = false;
|
|
180
|
-
this.invalidCount += 1;
|
|
181
|
-
}
|
|
182
|
-
return response;
|
|
183
|
-
} else {
|
|
184
|
-
if (rowEditDetails) {
|
|
185
|
-
const { cellEdits } = rowEditDetails;
|
|
186
|
-
const cellEditValues = cellEdits.get(columnName);
|
|
187
|
-
if (cellEditValues && cellEditValues.isValid !== false) {
|
|
188
|
-
cellEditValues.isValid = false;
|
|
189
|
-
this.invalidCount += 1;
|
|
105
|
+
const cellEditValues = cellEdits.get(columnName);
|
|
106
|
+
if (cellEditValues) {
|
|
107
|
+
try {
|
|
108
|
+
this.dataSource?.editCell?.(key, columnName, typedValue);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
console.error(e);
|
|
190
111
|
}
|
|
191
112
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
113
|
+
} else {
|
|
114
|
+
return {
|
|
115
|
+
errorMessage: "CHANGE_REVERTED",
|
|
116
|
+
type: "ERROR_RESULT"
|
|
117
|
+
};
|
|
195
118
|
}
|
|
196
119
|
}
|
|
197
120
|
}
|
|
121
|
+
_active = new WeakMap();
|
|
198
122
|
_rowEdits = new WeakMap();
|
|
199
123
|
_editCount = new WeakMap();
|
|
200
|
-
_invalidCount = new WeakMap();
|
|
201
124
|
_sourceTableDataSource = new WeakMap();
|
|
202
125
|
_sessionDataSource = new WeakMap();
|
|
203
126
|
_inEditMode = new WeakMap();
|
|
204
127
|
|
|
205
|
-
export { EditSession
|
|
128
|
+
export { EditSession };
|
|
206
129
|
//# sourceMappingURL=EditSession.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../../dist/index.mjs\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #invalidCount = 0;\n #sourceTableDataSource?: DataSource;\n #sessionDataSource?: DataSource;\n #inEditMode = false;\n\n constructor(dataSource: DataSource) {\n super();\n this.#sourceTableDataSource = dataSource;\n\n dataSource.on(\"remote-update-during-local-edit\", (rows) => {\n console.log(\n `source table updated via another channel, whilst we have an inline edit session in progress`,\n { rows },\n );\n });\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n this.#inEditMode = false;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n try {\n this.#inEditMode = true;\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n getRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n this.invalidCount -= 1;\n }\n return cellEdit;\n } else {\n const cellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n this.editCount = this.#editCount + 1;\n return cellEdit;\n }\n }\n\n /**\n * Apply incremental edit(s) to edit control value. Used for TextInput, where multiple\n * edits may follow in sequence before value finally committed.\n *\n * @param key value for edited Row\n * @param columnName\n * @param originalValue\n * @param newValue\n */\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const { cellEdits } = this.getRowEdits(key);\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n const rowEditDetails = this.getRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n const response = await this.dataSource?.editCell?.(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return response;\n } else {\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues && cellEditValues.isValid !== false) {\n cellEditValues.isValid = false;\n this.invalidCount += 1;\n }\n }\n console.log(\n `[EditSession] key ${key}, column ${columnName} is valid ? ${isValid} `,\n );\n }\n }\n}\n"],"names":["rowEditDetails","cellEdit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type {\n RpcResultError,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #sourceTableDataSource?: DataSource;\n #sessionDataSource?: DataSource;\n #inEditMode = false;\n\n constructor(dataSource: DataSource) {\n super();\n this.#sourceTableDataSource = dataSource;\n }\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n this.#inEditMode = true;\n\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false) {\n await this.dataSource?.endEditSession?.(saveChanges);\n this.clear();\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n typedValue: string | number | boolean,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n try {\n this.dataSource?.editCell?.(key, columnName, typedValue);\n } catch (e) {\n // ??\n console.error(e);\n }\n }\n } else {\n return {\n errorMessage: \"CHANGE_REVERTED\",\n type: \"ERROR_RESULT\",\n } as RpcResultError;\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import '../date/date-utils.js';
|
|
3
|
-
import '../date/dateTimePattern.js';
|
|
4
|
-
import { formatDate } from '../date/formatter.js';
|
|
1
|
+
const isInlineEditingSession = (editSessionMode) => editSessionMode === "inline-all-rows";
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
const timeFormatter = formatDate({ time: "hh:mm:ss" });
|
|
8
|
-
const getVuuEditMessage = (dataRow, column, originalValue) => {
|
|
9
|
-
const vuuMsg = dataRow.vuuMsg;
|
|
10
|
-
if (typeof vuuMsg === "string" && vuuMsg !== "") {
|
|
11
|
-
const columnMessages = vuuMsg.split(",");
|
|
12
|
-
const msgForCol = columnMessages.find(
|
|
13
|
-
(msg) => msg.startsWith(`${column.name}:`)
|
|
14
|
-
);
|
|
15
|
-
if (msgForCol) {
|
|
16
|
-
const [, value, updatedValue, ts] = msgForCol.split(":");
|
|
17
|
-
const updateTime = timeFormatter(new Date(parseInt(ts)));
|
|
18
|
-
return /* @__PURE__ */ jsxs("span", { children: [
|
|
19
|
-
"Update rejected. Original value ",
|
|
20
|
-
/* @__PURE__ */ jsx("b", { children: originalValue }),
|
|
21
|
-
" could not be updated to ",
|
|
22
|
-
/* @__PURE__ */ jsx("b", { children: value }),
|
|
23
|
-
". It was updated to ",
|
|
24
|
-
/* @__PURE__ */ jsx("b", { children: updatedValue }),
|
|
25
|
-
" at ",
|
|
26
|
-
updateTime,
|
|
27
|
-
"."
|
|
28
|
-
] });
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
export { getVuuEditMessage, isInlineEditingSession };
|
|
3
|
+
export { isInlineEditingSession };
|
|
34
4
|
//# sourceMappingURL=edit-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.
|
|
1
|
+
{"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.ts"],"sourcesContent":["import { EditSessionMode, InlineEditSessionMode } from \"@vuu-ui/vuu-data-types\";\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode === \"inline-all-rows\";\n"],"names":[],"mappings":"AAEa,MAAA,sBAAA,GAAyB,CACpC,eAAA,KAEA,eAAoB,KAAA;;;;"}
|
|
@@ -6,7 +6,7 @@ import { EditSession } from './EditSession.js';
|
|
|
6
6
|
const useEditableTable = ({
|
|
7
7
|
columns,
|
|
8
8
|
dataSource: dataSourceProp,
|
|
9
|
-
editSessionMode = "
|
|
9
|
+
editSessionMode = "all-rows",
|
|
10
10
|
isEditMode,
|
|
11
11
|
onCancel,
|
|
12
12
|
onSave,
|
|
@@ -36,20 +36,14 @@ const useEditableTable = ({
|
|
|
36
36
|
} catch (e) {
|
|
37
37
|
}
|
|
38
38
|
}, [editSession, onCancel]);
|
|
39
|
-
const handleSave = useCallback(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} catch (e) {
|
|
48
|
-
console.log(`[useEditableTable] handleSave ${e.message}`);
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
[dataSource, editSession, onSave]
|
|
52
|
-
);
|
|
39
|
+
const handleSave = useCallback(async () => {
|
|
40
|
+
dataSource.resume?.();
|
|
41
|
+
try {
|
|
42
|
+
await editSession.end(true);
|
|
43
|
+
onSave();
|
|
44
|
+
} catch (e) {
|
|
45
|
+
}
|
|
46
|
+
}, [dataSource, editSession, onSave]);
|
|
53
47
|
useMemo(async () => {
|
|
54
48
|
console.log(`[useEditableTable] editMode ${isEditMode}`);
|
|
55
49
|
if (isEditMode) {
|
|
@@ -62,8 +56,6 @@ const useEditableTable = ({
|
|
|
62
56
|
console.error(e);
|
|
63
57
|
onCancel();
|
|
64
58
|
}
|
|
65
|
-
} else {
|
|
66
|
-
await editSession.end();
|
|
67
59
|
}
|
|
68
60
|
}, [editSession, editSessionMode, isEditMode, onCancel]);
|
|
69
61
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession } from \"./EditSession\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n editSessionMode?: EditSessionMode;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n editSessionMode = \"
|
|
1
|
+
{"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession } from \"./EditSession\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n editSessionMode?: EditSessionMode;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table?: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n editSessionMode = \"all-rows\",\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n // const { showNotification } = useNotifications();\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n // The dataSource would normally be managed by client and passed in, but for\n // simple use cases we can create it here.\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope by\n // wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(() => new EditSession(dataSource), [dataSource]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n try {\n editSession.end();\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(async () => {\n dataSource.resume?.();\n try {\n await editSession.end(true);\n onSave();\n } catch (e) {\n // cleanup\n }\n }, [dataSource, editSession, onSave]);\n\n useMemo(async () => {\n console.log(`[useEditableTable] editMode ${isEditMode}`);\n if (isEditMode) {\n try {\n const sessionDataSource = await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(e);\n // deal with error\n // showNotification?.({\n // header: \"Error unable to edit\",\n // status: \"error\",\n // type: \"toast\",\n // });\n onCancel();\n }\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n onCancel: handleCancel,\n onSave: handleSave,\n sessionDataSource,\n };\n};\n"],"names":["sessionDataSource"],"mappings":";;;;;AA6BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,eAAkB,GAAA,UAAA;AAAA,EAClB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,OAAQ,EAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAEhD,KAAS,CAAA,CAAA;AAEX,EAAA,wBAAA,CAAyB,MAAM;AAC7B,IAAA,OAAA,CAAQ,KAAK,CAAiD,+CAAA,CAAA,CAAA;AAAA,GAC7D,EAAA,CAAC,OAAS,EAAA,KAAK,CAAC,CAAA;AAEnB,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM;AAG/B,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,OAAA,cAAA;AAAA,eACE,KAAO,EAAA;AAChB,MAAA,OAAO,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KACtC,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,8FAAA;AAAA,OACF;AAAA;AACF,KACC,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAIlD,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM,IAAI,YAAY,UAAU,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAE3E,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AAErC,IAAI,IAAA;AACF,MAAA,WAAA,CAAY,GAAI,EAAA;AAChB,MAAS,QAAA,EAAA;AAAA,aACF,CAAG,EAAA;AAAA;AAEZ,GACC,EAAA,CAAC,WAAa,EAAA,QAAQ,CAAC,CAAA;AAE1B,EAAM,MAAA,UAAA,GAAa,YAAY,YAAY;AACzC,IAAA,UAAA,CAAW,MAAS,IAAA;AACpB,IAAI,IAAA;AACF,MAAM,MAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AAC1B,MAAO,MAAA,EAAA;AAAA,aACA,CAAG,EAAA;AAAA;AAEZ,GACC,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAEpC,EAAA,OAAA,CAAQ,YAAY;AAClB,IAAQ,OAAA,CAAA,GAAA,CAAI,CAA+B,4BAAA,EAAA,UAAU,CAAE,CAAA,CAAA;AACvD,IAAA,IAAI,UAAY,EAAA;AACd,MAAI,IAAA;AACF,QAAA,MAAMA,kBAAoB,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,eAAe,CAAA;AACjE,QAAA,IAAIA,kBAAmB,EAAA;AACrB,UAAA,oBAAA,CAAqBA,kBAAiB,CAAA;AAAA;AACxC,eACO,CAAG,EAAA;AACV,QAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAOf,QAAS,QAAA,EAAA;AAAA;AACX;AACF,KACC,CAAC,WAAA,EAAa,eAAiB,EAAA,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA,UAAA;AAAA,IACR;AAAA,GACF;AACF;;;;"}
|
|
@@ -67,6 +67,7 @@ class BaseDataSource extends EventEmitter {
|
|
|
67
67
|
filterSpec,
|
|
68
68
|
viewport = this.viewport || (this.viewport = uuid())
|
|
69
69
|
}, callback) {
|
|
70
|
+
console.log(`[BaseDataSource] subscribe to ${this.viewport}`);
|
|
70
71
|
this._clientCallback = callback;
|
|
71
72
|
this.viewport = viewport;
|
|
72
73
|
if (aggregations || baseFilterSpec || columns || filterSpec || groupBy || sort) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n console.log(`[BaseDataSource] subscribe to ${this.viewport}`);\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { partition } from './array-utils.js';
|
|
2
2
|
import { wordify } from './text-utils.js';
|
|
3
|
-
import
|
|
3
|
+
import React from 'react';
|
|
4
4
|
import { getLayoutComponent } from './component-registry.js';
|
|
5
5
|
|
|
6
6
|
const env = process.env.NODE_ENV;
|
|
@@ -13,7 +13,7 @@ function featureFromJson({ type }) {
|
|
|
13
13
|
`layoutUtils unable to create feature component from JSON, unknown type ${type}`
|
|
14
14
|
);
|
|
15
15
|
}
|
|
16
|
-
return
|
|
16
|
+
return React.createElement(componentType);
|
|
17
17
|
}
|
|
18
18
|
const isCustomFeature = (feature) => feature.leftNavLocation === "vuu-features";
|
|
19
19
|
const isWildcardSchema = (vuuTables) => vuuTables === "*";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-utils.js","sources":["../../../../../../packages/vuu-utils/src/feature-utils.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ListOption } from \"@vuu-ui/vuu-table-types\";\nimport { partition } from \"./array-utils\";\nimport { wordify } from \"./text-utils\";\nimport React, { ReactElement } from \"react\";\nimport { getLayoutComponent } from \"./component-registry\";\n\nexport type PathMap = {\n [key: string]: Pick<DynamicFeatureDescriptor, \"css\" | \"url\">;\n};\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport type LookupTableProvider = (table: VuuTable) => ListOption[];\n\nexport interface ViewConfig {\n allowRename?: boolean;\n closeable?: boolean;\n header?: boolean;\n}\n\nexport interface DynamicFeatureProps<P extends object | undefined = object> {\n /**\n props that will be passed to the lazily loaded component.\n */\n ComponentProps?: P;\n ViewProps?: ViewConfig;\n css?: string;\n height?: number;\n title?: string;\n /** \n The url of javascript bundle to lazily load. Bundle must provide a default export\n and that export must be a React component.\n */\n url: string;\n width?: number;\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport interface DynamicFeatureDescriptor {\n /**\n * url for css file for feature\n */\n css?: string;\n featureProps?: {\n vuuTables?: \"*\" | VuuTable[];\n };\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n name: string;\n title: string;\n /**\n * url for javascript bundle to load feature\n */\n url: string;\n viewProps?: ViewConfig;\n}\n\nexport interface StaticFeatureDescriptor {\n group?: string;\n label: string;\n type: string;\n}\n\nconst isStaticFeature = (\n feature: unknown,\n): feature is StaticFeatureDescriptor =>\n feature !== null && typeof feature === \"object\" && \"type\" in feature;\n\nexport const isStaticFeatures = (\n features: unknown,\n): features is StaticFeatureDescriptor[] =>\n Array.isArray(features) && features.every(isStaticFeature);\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\nexport type DynamicFeatures = {\n [key: string]: DynamicFeatureDescriptor;\n};\n\nexport function featureFromJson({ type }: { type: string }): ReactElement {\n const componentType = type.match(/^[a-z]/) ? type : getLayoutComponent(type);\n if (componentType === undefined) {\n throw Error(\n `layoutUtils unable to create feature component from JSON, unknown type ${type}`,\n );\n }\n return React.createElement(componentType);\n}\n\nexport interface VuuConfig {\n features: DynamicFeatures;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\n/**\n * We currently categorize 'features' simply by the leftNavLocation\n * @param feature\n * @returns\n */\nexport const isCustomFeature = (feature: DynamicFeatureDescriptor) =>\n feature.leftNavLocation === \"vuu-features\";\n\nexport const isWildcardSchema = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is \"*\" => vuuTables === \"*\";\nexport const isVuuTables = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is VuuTable[] => Array.isArray(vuuTables);\n\nexport interface FeaturePropsWithFilterTableFeature\n extends Omit<DynamicFeatureProps, \"ComponentProps\"> {\n ComponentProps: FilterTableFeatureProps;\n}\n\nexport const hasFilterTableFeatureProps = (\n props: DynamicFeatureProps,\n): props is FeaturePropsWithFilterTableFeature =>\n typeof props.ComponentProps === \"object\" &&\n props.ComponentProps !== null &&\n \"tableSchema\" in props.ComponentProps;\n\nexport const isSameTable = (t1: VuuTable, t2: VuuTable) => {\n t1.module === t2.module && t1.table == t2.table;\n};\n\n// Sort TableScheas by module\nexport const byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => DynamicFeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths,\n) =>\n schemas\n .sort(byModule)\n .map<DynamicFeatureProps<FilterTableFeatureProps>>((schema) => ({\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n ComponentProps: {\n tableSchema: schema,\n },\n ViewProps: {\n allowRename: true,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport type Component = {\n componentName: string;\n component: unknown;\n};\n\nexport const assertComponentRegistered = (\n componentName: string,\n component: unknown,\n) => {\n if (typeof component !== \"function\") {\n console.warn(\n `${componentName} module not loaded, will be unabale to deserialize from layout JSON`,\n );\n }\n};\n\nexport const assertComponentsRegistered = (componentList: Component[]) => {\n for (const { componentName, component } of componentList) {\n assertComponentRegistered(componentName, component);\n }\n};\n/**\n * Process the DynamicFeature descriptors. Identify\n * the vuu tables required and inject the appropriate TableSchemas\n *\n * @param dynamicFeatures\n * @param tableSchemas\n * @returns\n */\nexport const getCustomAndTableFeatures = (\n dynamicFeatures: DynamicFeatureDescriptor[],\n tableSchemas: TableSchema[],\n): {\n dynamicFeatures: DynamicFeatureProps[];\n tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[];\n} => {\n // Split features into simple tables and 'custom' features\n const [customFeatureConfig, tableFeaturesConfig] = partition(\n dynamicFeatures,\n isCustomFeature,\n );\n\n const customFeatures: DynamicFeatureProps[] = [];\n const tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[] = [];\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of tableFeaturesConfig) {\n const { vuuTables } = featureProps;\n // Currently FilterTable is the only 'tableFeature' and it uses the wildcard\n if (isWildcardSchema(vuuTables)) {\n if (tableSchemas) {\n for (const tableSchema of tableSchemas) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n title: `${tableSchema.table.module} ${wordify(\n tableSchema.table.table,\n )}`,\n ViewProps: {\n ...viewProps,\n allowRename: true,\n },\n });\n }\n }\n }\n }\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of customFeatureConfig) {\n const { vuuTables } = featureProps;\n if (isVuuTables(vuuTables)) {\n if (tableSchemas) {\n customFeatures.push({\n ...feature,\n ComponentProps: vuuTables.reduce<Record<string, TableSchema>>(\n (map, vuuTable) => {\n map[`${vuuTable.table}Schema`] = tableSchemas.find(\n (tableSchema) => isSameTable(vuuTable, tableSchema.table),\n ) as TableSchema;\n return map;\n },\n {},\n ),\n ViewProps: viewProps,\n });\n }\n } else {\n customFeatures.push(feature);\n }\n }\n return { dynamicFeatures: customFeatures, tableFeatures: tableFeatures };\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-utils.js","sources":["../../../../../../packages/vuu-utils/src/feature-utils.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ListOption } from \"@vuu-ui/vuu-table-types\";\nimport { partition } from \"./array-utils\";\nimport { wordify } from \"./text-utils\";\nimport React, { ReactElement } from \"react\";\nimport { getLayoutComponent } from \"./component-registry\";\n\nexport type PathMap = {\n [key: string]: Pick<DynamicFeatureDescriptor, \"css\" | \"url\">;\n};\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport type LookupTableProvider = (table: VuuTable) => ListOption[];\n\nexport interface ViewConfig {\n allowRename?: boolean;\n closeable?: boolean;\n header?: boolean;\n}\n\nexport interface DynamicFeatureProps<P extends object | undefined = object> {\n /**\n props that will be passed to the lazily loaded component.\n */\n ComponentProps?: P;\n ViewProps?: ViewConfig;\n css?: string;\n height?: number;\n title?: string;\n /** \n The url of javascript bundle to lazily load. Bundle must provide a default export\n and that export must be a React component.\n */\n url: string;\n width?: number;\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport interface DynamicFeatureDescriptor {\n /**\n * url for css file for feature\n */\n css?: string;\n featureProps?: {\n vuuTables?: \"*\" | VuuTable[];\n };\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n name: string;\n title: string;\n /**\n * url for javascript bundle to load feature\n */\n url: string;\n viewProps?: ViewConfig;\n}\n\nexport interface StaticFeatureDescriptor {\n group?: string;\n label: string;\n type: string;\n}\n\nconst isStaticFeature = (\n feature: unknown,\n): feature is StaticFeatureDescriptor =>\n feature !== null && typeof feature === \"object\" && \"type\" in feature;\n\nexport const isStaticFeatures = (\n features: unknown,\n): features is StaticFeatureDescriptor[] =>\n Array.isArray(features) && features.every(isStaticFeature);\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\nexport type DynamicFeatures = {\n [key: string]: DynamicFeatureDescriptor;\n};\n\nexport function featureFromJson({ type }: { type: string }): ReactElement {\n const componentType = type.match(/^[a-z]/) ? type : getLayoutComponent(type);\n if (componentType === undefined) {\n throw Error(\n `layoutUtils unable to create feature component from JSON, unknown type ${type}`,\n );\n }\n return React.createElement(componentType);\n}\n\nexport interface VuuConfig {\n features: DynamicFeatures;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\n/**\n * We currently categorize 'features' simply by the leftNavLocation\n * @param feature\n * @returns\n */\nexport const isCustomFeature = (feature: DynamicFeatureDescriptor) =>\n feature.leftNavLocation === \"vuu-features\";\n\nexport const isWildcardSchema = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is \"*\" => vuuTables === \"*\";\nexport const isVuuTables = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is VuuTable[] => Array.isArray(vuuTables);\n\nexport interface FeaturePropsWithFilterTableFeature\n extends Omit<DynamicFeatureProps, \"ComponentProps\"> {\n ComponentProps: FilterTableFeatureProps;\n}\n\nexport const hasFilterTableFeatureProps = (\n props: DynamicFeatureProps,\n): props is FeaturePropsWithFilterTableFeature =>\n typeof props.ComponentProps === \"object\" &&\n props.ComponentProps !== null &&\n \"tableSchema\" in props.ComponentProps;\n\nexport const isSameTable = (t1: VuuTable, t2: VuuTable) => {\n t1.module === t2.module && t1.table == t2.table;\n};\n\n// Sort TableScheas by module\nexport const byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => DynamicFeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths,\n) =>\n schemas\n .sort(byModule)\n .map<DynamicFeatureProps<FilterTableFeatureProps>>((schema) => ({\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n ComponentProps: {\n tableSchema: schema,\n },\n ViewProps: {\n allowRename: true,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport type Component = {\n componentName: string;\n component: unknown;\n};\n\nexport const assertComponentRegistered = (\n componentName: string,\n component: unknown,\n) => {\n if (typeof component !== \"function\") {\n console.warn(\n `${componentName} module not loaded, will be unabale to deserialize from layout JSON`,\n );\n }\n};\n\nexport const assertComponentsRegistered = (componentList: Component[]) => {\n for (const { componentName, component } of componentList) {\n assertComponentRegistered(componentName, component);\n }\n};\n/**\n * Process the DynamicFeature descriptors. Identify\n * the vuu tables required and inject the appropriate TableSchemas\n *\n * @param dynamicFeatures\n * @param tableSchemas\n * @returns\n */\nexport const getCustomAndTableFeatures = (\n dynamicFeatures: DynamicFeatureDescriptor[],\n tableSchemas: TableSchema[],\n): {\n dynamicFeatures: DynamicFeatureProps[];\n tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[];\n} => {\n // Split features into simple tables and 'custom' features\n const [customFeatureConfig, tableFeaturesConfig] = partition(\n dynamicFeatures,\n isCustomFeature,\n );\n\n const customFeatures: DynamicFeatureProps[] = [];\n const tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[] = [];\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of tableFeaturesConfig) {\n const { vuuTables } = featureProps;\n // Currently FilterTable is the only 'tableFeature' and it uses the wildcard\n if (isWildcardSchema(vuuTables)) {\n if (tableSchemas) {\n for (const tableSchema of tableSchemas) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n title: `${tableSchema.table.module} ${wordify(\n tableSchema.table.table,\n )}`,\n ViewProps: {\n ...viewProps,\n allowRename: true,\n },\n });\n }\n }\n }\n }\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of customFeatureConfig) {\n const { vuuTables } = featureProps;\n if (isVuuTables(vuuTables)) {\n if (tableSchemas) {\n customFeatures.push({\n ...feature,\n ComponentProps: vuuTables.reduce<Record<string, TableSchema>>(\n (map, vuuTable) => {\n map[`${vuuTable.table}Schema`] = tableSchemas.find(\n (tableSchema) => isSameTable(vuuTable, tableSchema.table),\n ) as TableSchema;\n return map;\n },\n {},\n ),\n ViewProps: viewProps,\n });\n }\n } else {\n customFeatures.push(feature);\n }\n }\n return { dynamicFeatures: customFeatures, tableFeatures: tableFeatures };\n};\n"],"names":[],"mappings":"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"}
|