@vuu-ui/vuu-table-extras 2.3.0 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js +3 -0
- package/cjs/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -1
- package/cjs/packages/vuu-table-extras/src/csv-upload/CsvUpload.js +62 -48
- package/cjs/packages/vuu-table-extras/src/csv-upload/CsvUpload.js.map +1 -1
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js +6 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js +118 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js +76 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js +1 -44
- package/cjs/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js.map +1 -1
- package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js +154 -66
- package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js.map +1 -1
- package/cjs/packages/vuu-table-extras/src/index.js +6 -2
- package/cjs/packages/vuu-table-extras/src/index.js.map +1 -1
- package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js +6 -0
- package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js +44 -0
- package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js +137 -0
- package/cjs/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js.map +1 -0
- package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.css.js +1 -1
- package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.js +5 -2
- package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js +3 -0
- package/esm/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/csv-upload/CsvUpload.js +63 -49
- package/esm/packages/vuu-table-extras/src/csv-upload/CsvUpload.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js +4 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js +116 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js +73 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js +2 -43
- package/esm/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js +157 -69
- package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/index.js +3 -1
- package/esm/packages/vuu-table-extras/src/index.js.map +1 -1
- package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js +4 -0
- package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js +42 -0
- package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js +135 -0
- package/esm/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js.map +1 -0
- package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.css.js +1 -1
- package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.js +5 -2
- package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.js.map +1 -1
- package/package.json +12 -11
- package/types/csv-upload/CsvUpload.d.ts +9 -1
- package/types/csv-upload/data-upload-preview/DataUploadPreview.d.ts +10 -0
- package/types/csv-upload/data-upload-preview/useDataUploadPreview.d.ts +17 -0
- package/types/csv-upload/index.d.ts +2 -2
- package/types/csv-upload/useCsvUpload.d.ts +6 -3
- package/types/index.d.ts +1 -0
- package/types/inline-add-row/InlineAddRow.d.ts +3 -0
- package/types/inline-add-row/index.d.ts +2 -0
- package/types/inline-add-row/useInlineAddRow.d.ts +57 -0
- package/types/table-footer/TableFooter.d.ts +3 -2
- package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js +0 -73
- package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js.map +0 -1
- package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js +0 -71
- package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js.map +0 -1
- package/types/csv-upload/useCsvUploadSessionPreview.d.ts +0 -10
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var vuuDataEditing = require('@vuu-ui/vuu-data-editing');
|
|
3
4
|
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
5
|
var react = require('react');
|
|
5
6
|
var csvParse = require('./parse/csv-parse.js');
|
|
@@ -9,10 +10,12 @@ var csvConstants = require('./parse/csv-constants.js');
|
|
|
9
10
|
|
|
10
11
|
const useCsvUpload = ({
|
|
11
12
|
dataSource,
|
|
13
|
+
importMode = "direct",
|
|
12
14
|
onImportSessionEnded,
|
|
13
15
|
onImportSessionStarted,
|
|
14
16
|
onError,
|
|
15
17
|
onImported,
|
|
18
|
+
onPreview,
|
|
16
19
|
onProcessingStarted,
|
|
17
20
|
maxRows,
|
|
18
21
|
parseOptions
|
|
@@ -21,37 +24,70 @@ const useCsvUpload = ({
|
|
|
21
24
|
const [sessionTable, setSessionTable] = react.useState();
|
|
22
25
|
const [isProcessingFile, setIsProcessingFile] = react.useState(false);
|
|
23
26
|
const [isImporting, setIsImporting] = react.useState(false);
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const editSession = react.useMemo(() => new vuuDataEditing.EditSession(dataSource), [dataSource]);
|
|
28
|
+
const ownsEditSessionRef = react.useRef(true);
|
|
29
|
+
const operationIdRef = react.useRef(0);
|
|
30
|
+
const processingPromiseRef = react.useRef(void 0);
|
|
31
|
+
const sessionDataSourceRef = react.useRef(void 0);
|
|
32
|
+
react.useEffect(
|
|
33
|
+
() => () => {
|
|
34
|
+
operationIdRef.current++;
|
|
35
|
+
const processingPromise = processingPromiseRef.current;
|
|
36
|
+
void (async () => {
|
|
37
|
+
try {
|
|
38
|
+
await processingPromise;
|
|
39
|
+
} finally {
|
|
40
|
+
if (ownsEditSessionRef.current) {
|
|
41
|
+
try {
|
|
42
|
+
await editSession.end(false);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error(
|
|
45
|
+
"[useCsvUpload] failed to discard edit session during cleanup",
|
|
46
|
+
error
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
})();
|
|
52
|
+
},
|
|
53
|
+
[editSession]
|
|
54
|
+
);
|
|
55
|
+
const setActiveSessionDataSource = react.useCallback(
|
|
56
|
+
(sessionDataSource) => {
|
|
57
|
+
sessionDataSourceRef.current = sessionDataSource;
|
|
58
|
+
const table2 = sessionDataSource?.table;
|
|
59
|
+
setSessionTable(
|
|
60
|
+
table2 && vuuUtils.isSessionTable(table2) ? table2 : void 0
|
|
61
|
+
);
|
|
29
62
|
},
|
|
30
63
|
[]
|
|
31
64
|
);
|
|
32
65
|
const endEditSessionAndNotify = react.useCallback(
|
|
33
66
|
async (save, reason) => {
|
|
34
|
-
|
|
35
|
-
|
|
67
|
+
const sessionDataSource = sessionDataSourceRef.current;
|
|
68
|
+
if (!sessionDataSource) {
|
|
69
|
+
throw Error("CsvUpload has no active edit session.");
|
|
70
|
+
}
|
|
71
|
+
if (!sessionDataSource.endEditSession) {
|
|
72
|
+
throw Error(
|
|
73
|
+
"CsvUpload requires the session datasource to support endEditSession."
|
|
74
|
+
);
|
|
36
75
|
}
|
|
37
|
-
const currentSessionTable =
|
|
38
|
-
|
|
39
|
-
|
|
76
|
+
const currentSessionTable = sessionDataSource.table;
|
|
77
|
+
await editSession.end(save);
|
|
78
|
+
setActiveSessionDataSource(void 0);
|
|
40
79
|
onImportSessionEnded?.({
|
|
41
80
|
reason,
|
|
42
|
-
sessionTable: currentSessionTable
|
|
81
|
+
sessionTable: currentSessionTable && vuuUtils.isSessionTable(currentSessionTable) ? currentSessionTable : void 0
|
|
43
82
|
});
|
|
44
|
-
return
|
|
83
|
+
return void 0;
|
|
45
84
|
},
|
|
46
|
-
[
|
|
85
|
+
[editSession, onImportSessionEnded, setActiveSessionDataSource]
|
|
47
86
|
);
|
|
48
87
|
const table = dataSource.table;
|
|
49
88
|
const schema = dataSource.tableSchema;
|
|
50
89
|
const addAllRows = react.useCallback(
|
|
51
|
-
async (mergedValidation) => {
|
|
52
|
-
if (table === void 0) {
|
|
53
|
-
throw Error("CsvUpload requires dataSource.table to be defined.");
|
|
54
|
-
}
|
|
90
|
+
async (mergedValidation, operationId) => {
|
|
55
91
|
const vuuMsgByRow = /* @__PURE__ */ new Map();
|
|
56
92
|
for (const { rowNum, column, message } of mergedValidation.errors) {
|
|
57
93
|
if (rowNum < csvConstants.CSV_FIRST_DATA_ROW_NUMBER) continue;
|
|
@@ -63,7 +99,9 @@ const useCsvUpload = ({
|
|
|
63
99
|
);
|
|
64
100
|
}
|
|
65
101
|
const parsedRowCount = mergedValidation.rows.length;
|
|
66
|
-
const unparsedErrorRows = [...vuuMsgByRow.keys()].filter(
|
|
102
|
+
const unparsedErrorRows = [...vuuMsgByRow.keys()].filter(
|
|
103
|
+
(rowNum) => rowNum - csvConstants.CSV_FIRST_DATA_ROW_NUMBER >= parsedRowCount
|
|
104
|
+
).map((rowNum) => ({
|
|
67
105
|
rowNum,
|
|
68
106
|
rowData: {},
|
|
69
107
|
vuuMsg: vuuMsgByRow.get(rowNum) ?? ""
|
|
@@ -76,70 +114,82 @@ const useCsvUpload = ({
|
|
|
76
114
|
})),
|
|
77
115
|
...unparsedErrorRows
|
|
78
116
|
];
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
117
|
+
const rpcErrors = [];
|
|
118
|
+
for (const { rowNum, rowData, vuuMsg } of allRows) {
|
|
119
|
+
if (operationId !== operationIdRef.current) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
82
123
|
const payload = { ...rowData, rowNum, vuuMsg };
|
|
83
|
-
const result = await
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
params: {
|
|
87
|
-
key: String(rowNum),
|
|
88
|
-
data: payload
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
if (!vuuUtils.isRpcSuccess(result)) {
|
|
92
|
-
const msg = result && "errorMessage" in result ? String(result.errorMessage) : "addRow RPC failed";
|
|
93
|
-
throw Error(msg);
|
|
124
|
+
const result = await editSession.addRow(payload);
|
|
125
|
+
if (vuuUtils.isRpcError(result)) {
|
|
126
|
+
throw Error(result.errorMessage);
|
|
94
127
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
128
|
+
if (typeof result === "string") {
|
|
129
|
+
throw Error(result);
|
|
130
|
+
}
|
|
131
|
+
} catch (error) {
|
|
132
|
+
rpcErrors.push(`Row ${rowNum}: ${csvUploadUtils.toErrorMessage(error)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
99
135
|
if (rpcErrors.length > 0) {
|
|
100
|
-
|
|
101
|
-
const errors = {
|
|
102
|
-
importError: csvUploadUtils.createUploadError("import", errorMessage)
|
|
103
|
-
};
|
|
104
|
-
onError?.({ errors });
|
|
136
|
+
throw Error(csvUploadUtils.buildRowErrorMessage("Import failed", rpcErrors));
|
|
105
137
|
}
|
|
138
|
+
return true;
|
|
106
139
|
},
|
|
107
|
-
[
|
|
140
|
+
[editSession]
|
|
108
141
|
);
|
|
109
142
|
const beginEditSession = react.useCallback(async () => {
|
|
110
|
-
|
|
111
|
-
throw Error("CsvUpload requires datasource createSessionDataSource support.");
|
|
112
|
-
}
|
|
113
|
-
const sessionDataSource = await dataSource.createSessionDataSource("Empty");
|
|
143
|
+
const sessionDataSource = await editSession.begin("Empty");
|
|
114
144
|
const sessionVuuTable = sessionDataSource?.table;
|
|
115
|
-
if (sessionVuuTable
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
145
|
+
if (sessionDataSource === void 0 || sessionVuuTable === void 0 || !vuuUtils.isSessionTable(sessionVuuTable)) {
|
|
146
|
+
throw Error(
|
|
147
|
+
"CsvUpload createSessionDataSource returned no session datasource."
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
if (!sessionDataSource.columns.includes("vuuMsg")) {
|
|
151
|
+
sessionDataSource.columns = sessionDataSource.columns.concat("vuuMsg");
|
|
120
152
|
}
|
|
121
|
-
|
|
153
|
+
setActiveSessionDataSource(sessionDataSource);
|
|
154
|
+
onImportSessionStarted?.(sessionDataSource);
|
|
155
|
+
return sessionDataSource;
|
|
156
|
+
}, [editSession, onImportSessionStarted, setActiveSessionDataSource]);
|
|
122
157
|
const closePendingEditSession = react.useCallback(
|
|
123
158
|
async (save) => {
|
|
124
|
-
if (
|
|
159
|
+
if (sessionDataSourceRef.current === void 0) {
|
|
125
160
|
return;
|
|
126
161
|
}
|
|
127
162
|
await endEditSessionAndNotify(save, save ? "saved" : "discarded");
|
|
128
163
|
},
|
|
129
164
|
[endEditSessionAndNotify]
|
|
130
165
|
);
|
|
166
|
+
const cancelImport = react.useCallback(async () => {
|
|
167
|
+
operationIdRef.current++;
|
|
168
|
+
try {
|
|
169
|
+
await processingPromiseRef.current;
|
|
170
|
+
} catch {
|
|
171
|
+
}
|
|
172
|
+
await closePendingEditSession(false);
|
|
173
|
+
}, [closePendingEditSession]);
|
|
131
174
|
const processFile = react.useCallback(
|
|
132
|
-
async (file) => {
|
|
175
|
+
async (file, operationId) => {
|
|
133
176
|
setValidation(void 0);
|
|
134
177
|
onError?.(void 0);
|
|
135
178
|
await closePendingEditSession(false);
|
|
179
|
+
if (operationId !== operationIdRef.current) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
136
182
|
if (schema === void 0) {
|
|
137
183
|
throw Error("Table schema is not yet available.");
|
|
138
184
|
}
|
|
139
185
|
if (table === void 0) {
|
|
140
186
|
throw Error("CsvUpload requires dataSource.table to be defined.");
|
|
141
187
|
}
|
|
142
|
-
const
|
|
188
|
+
const fileContents = await file.text();
|
|
189
|
+
if (operationId !== operationIdRef.current) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const parsedCsv = csvParse.parseCsv(fileContents, parseOptions);
|
|
143
193
|
if (parsedCsv.error && csvUploadUtils.hasFileParseErrors(parsedCsv.error)) {
|
|
144
194
|
setValidation(void 0);
|
|
145
195
|
onError?.({
|
|
@@ -181,8 +231,14 @@ const useCsvUpload = ({
|
|
|
181
231
|
setValidation(mergedValidation);
|
|
182
232
|
if (mergedValidation.rows.length > 0) {
|
|
183
233
|
await beginEditSession();
|
|
234
|
+
if (operationId !== operationIdRef.current) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
184
237
|
try {
|
|
185
|
-
await addAllRows(mergedValidation);
|
|
238
|
+
const rowsAdded = await addAllRows(mergedValidation, operationId);
|
|
239
|
+
if (!rowsAdded) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
186
242
|
} catch (error) {
|
|
187
243
|
await endEditSessionAndNotify(false, "failed");
|
|
188
244
|
setValidation(void 0);
|
|
@@ -217,11 +273,14 @@ const useCsvUpload = ({
|
|
|
217
273
|
}
|
|
218
274
|
setIsProcessingFile(true);
|
|
219
275
|
onProcessingStarted?.();
|
|
276
|
+
const operationId = ++operationIdRef.current;
|
|
277
|
+
const processingPromise = processFile(file, operationId);
|
|
278
|
+
processingPromiseRef.current = processingPromise;
|
|
220
279
|
try {
|
|
221
|
-
await
|
|
280
|
+
await processingPromise;
|
|
222
281
|
} catch (err) {
|
|
223
282
|
setValidation(void 0);
|
|
224
|
-
|
|
283
|
+
setActiveSessionDataSource(void 0);
|
|
225
284
|
const parseError = csvUploadUtils.isCsvParseError(err) ? err : void 0;
|
|
226
285
|
const errorMessage = parseError ? `Validation failed: ${parseError.message}` : `Validation failed: ${csvUploadUtils.toErrorMessage(err)}`;
|
|
227
286
|
const errors = {
|
|
@@ -235,10 +294,13 @@ const useCsvUpload = ({
|
|
|
235
294
|
};
|
|
236
295
|
onError?.(errors);
|
|
237
296
|
} finally {
|
|
297
|
+
if (processingPromiseRef.current === processingPromise) {
|
|
298
|
+
processingPromiseRef.current = void 0;
|
|
299
|
+
}
|
|
238
300
|
setIsProcessingFile(false);
|
|
239
301
|
}
|
|
240
302
|
},
|
|
241
|
-
[onError, onProcessingStarted, processFile,
|
|
303
|
+
[onError, onProcessingStarted, processFile, setActiveSessionDataSource]
|
|
242
304
|
);
|
|
243
305
|
const onDrop = react.useCallback(
|
|
244
306
|
(_event, files) => {
|
|
@@ -258,22 +320,37 @@ const useCsvUpload = ({
|
|
|
258
320
|
);
|
|
259
321
|
const importData = react.useCallback(async () => {
|
|
260
322
|
if (!canImport || validation === void 0) {
|
|
261
|
-
return;
|
|
323
|
+
return false;
|
|
262
324
|
}
|
|
263
325
|
setIsImporting(true);
|
|
264
326
|
onError?.(void 0);
|
|
265
327
|
try {
|
|
266
|
-
const rpcResult = await endEditSessionAndNotify(true, "saved");
|
|
267
328
|
const fallbackTableData = {
|
|
268
329
|
columns: validation.columns,
|
|
269
330
|
rows: validation.rows.map(
|
|
270
331
|
(row) => validation.columns.map((column) => row[column] ?? "")
|
|
271
332
|
)
|
|
272
333
|
};
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
334
|
+
const tableData = fallbackTableData;
|
|
335
|
+
if (importMode === "preview") {
|
|
336
|
+
const sessionDataSource = sessionDataSourceRef.current;
|
|
337
|
+
if (!sessionDataSource) {
|
|
338
|
+
throw Error("CsvUpload has no session datasource to preview.");
|
|
339
|
+
}
|
|
340
|
+
if (!onPreview) {
|
|
341
|
+
throw Error("CsvUpload preview mode requires an onPreview callback.");
|
|
342
|
+
}
|
|
343
|
+
onPreview({
|
|
344
|
+
dataSource: sessionDataSource,
|
|
345
|
+
editSession,
|
|
346
|
+
tableData
|
|
347
|
+
});
|
|
348
|
+
ownsEditSessionRef.current = false;
|
|
349
|
+
} else {
|
|
350
|
+
await endEditSessionAndNotify(true, "saved");
|
|
351
|
+
onImported?.({ tableData });
|
|
352
|
+
}
|
|
353
|
+
return true;
|
|
277
354
|
} catch (err) {
|
|
278
355
|
const errorMessage = `RPC import failed: ${String(err)}`;
|
|
279
356
|
const errors = {
|
|
@@ -282,12 +359,23 @@ const useCsvUpload = ({
|
|
|
282
359
|
}
|
|
283
360
|
};
|
|
284
361
|
onError?.(errors);
|
|
362
|
+
return false;
|
|
285
363
|
} finally {
|
|
286
364
|
setIsImporting(false);
|
|
287
365
|
}
|
|
288
|
-
}, [
|
|
366
|
+
}, [
|
|
367
|
+
canImport,
|
|
368
|
+
editSession,
|
|
369
|
+
endEditSessionAndNotify,
|
|
370
|
+
onError,
|
|
371
|
+
onImported,
|
|
372
|
+
onPreview,
|
|
373
|
+
importMode,
|
|
374
|
+
validation
|
|
375
|
+
]);
|
|
289
376
|
return {
|
|
290
377
|
canImport,
|
|
378
|
+
cancelImport,
|
|
291
379
|
importData,
|
|
292
380
|
isImporting,
|
|
293
381
|
isProcessingFile,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/useCsvUpload.ts"],"sourcesContent":["import type { DataSource, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { isRpcSuccess, isSessionTable } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { parseCsv, type CsvParseOptions } from \"./parse/csv-parse\";\nimport {\n type CsvValidationResult,\n validateCsvAgainstSchema,\n} from \"./parse/csv-schema-validation\";\nimport {\n buildRowErrorMessage,\n createUploadError,\n executeBatchRpcCalls,\n hasFileParseErrors,\n isCsvParseError,\n normalizeTableData,\n mergeValidationWithParseErrors,\n toErrorMessage,\n} from \"./parse/csv-upload-utils\";\nimport { CSV_FIRST_DATA_ROW_NUMBER } from \"./parse/csv-constants\";\nimport type {\n CsvUploadErrorResult,\n CsvUploadImportedResult,\n CsvUploadErrors,\n CsvUploadSessionEndReason,\n CsvUploadSessionEndResult,\n CsvUploadSessionTable,\n} from \"./CsvUpload\";\n\nexport interface CsvUploadHookProps {\n dataSource: DataSource;\n maxRows?: number;\n onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onImportSessionStarted?: (dataSource: DataSource) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onProcessingStarted?: () => void;\n parseOptions?: CsvParseOptions;\n}\n\nexport type UseCsvUploadReturn = {\n canImport: boolean;\n importData: () => Promise<void>;\n isImporting: boolean;\n isProcessingFile: boolean;\n onDrop: (_event: React.DragEvent<HTMLDivElement>, files: File[]) => void;\n onTriggerChange: (\n _event: React.ChangeEvent<HTMLInputElement>,\n files: File[],\n ) => void;\n sessionTable: CsvUploadSessionTable | undefined;\n schema: TableSchema | undefined;\n validation: CsvValidationResult | undefined;\n};\n\nexport const useCsvUpload = ({\n dataSource,\n onImportSessionEnded,\n onImportSessionStarted,\n onError,\n onImported,\n onProcessingStarted,\n maxRows,\n parseOptions,\n}: CsvUploadHookProps): UseCsvUploadReturn => {\n const [validation, setValidation] = useState<\n CsvValidationResult | undefined\n >();\n const [sessionTable, setSessionTable] = useState<\n CsvUploadSessionTable | undefined\n >();\n const [isProcessingFile, setIsProcessingFile] = useState(false);\n const [isImporting, setIsImporting] = useState(false);\n const sessionTableRef = useRef<CsvUploadSessionTable | undefined>(undefined);\n\n const setActiveSessionTable = useCallback(\n (table?: CsvUploadSessionTable) => {\n sessionTableRef.current = table;\n setSessionTable(table);\n },\n [],\n );\n\n const endEditSessionAndNotify = useCallback(\n async (save: boolean, reason: CsvUploadSessionEndReason) => {\n if (!dataSource.endEditSession) {\n throw Error(\"CsvUpload requires datasource endEditSession support.\");\n }\n const currentSessionTable = sessionTableRef.current;\n const result = await dataSource.endEditSession(save);\n\n setActiveSessionTable(undefined);\n onImportSessionEnded?.({\n reason,\n sessionTable: currentSessionTable,\n });\n return result;\n },\n [dataSource, onImportSessionEnded, setActiveSessionTable],\n );\n\n const table = dataSource.table;\n const schema = dataSource.tableSchema;\n\n const addAllRows = useCallback(\n async (mergedValidation: CsvValidationResult) => {\n if (table === undefined) {\n throw Error(\"CsvUpload requires dataSource.table to be defined.\");\n }\n\n const vuuMsgByRow = new Map<number, string>();\n for (const { rowNum, column, message } of mergedValidation.errors) {\n if (rowNum < CSV_FIRST_DATA_ROW_NUMBER) continue;\n const existing = vuuMsgByRow.get(rowNum);\n const columnError = `${column}: ${message}`;\n vuuMsgByRow.set(\n rowNum,\n existing ? `${existing}; ${columnError}` : `Row ${rowNum}: ${columnError}`,\n );\n }\n\n const parsedRowCount = mergedValidation.rows.length;\n const unparsedErrorRows = [...vuuMsgByRow.keys()]\n .filter((rowNum) => rowNum - CSV_FIRST_DATA_ROW_NUMBER >= parsedRowCount)\n .map((rowNum) => ({\n rowNum,\n rowData: {} as Record<string, VuuRowDataItemType>,\n vuuMsg: vuuMsgByRow.get(rowNum) ?? \"\",\n }));\n\n const allRows = [\n ...mergedValidation.rows.map((rowData, idx) => ({\n rowNum: idx + CSV_FIRST_DATA_ROW_NUMBER,\n rowData: rowData ?? {},\n vuuMsg: vuuMsgByRow.get(idx + CSV_FIRST_DATA_ROW_NUMBER) ?? \"\",\n })),\n ...unparsedErrorRows,\n ];\n\n const { errors: rpcErrors } = await executeBatchRpcCalls(\n allRows,\n async ({ rowNum, rowData, vuuMsg }) => {\n const payload = { ...rowData, rowNum, vuuMsg };\n const result = await dataSource.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"addRow\",\n params: {\n key: String(rowNum),\n data: payload,\n },\n });\n if (!isRpcSuccess(result)) {\n const msg =\n result && \"errorMessage\" in result\n ? String(result.errorMessage)\n : \"addRow RPC failed\";\n throw Error(msg);\n }\n return result;\n },\n ({ rowNum }, error) => `Row ${rowNum}: ${error}`,\n );\n\n if (rpcErrors.length > 0) {\n const errorMessage = buildRowErrorMessage(\"Import failed\", rpcErrors);\n const errors: CsvUploadErrors = {\n importError: createUploadError(\"import\", errorMessage),\n };\n onError?.({ errors });\n }\n },\n [dataSource, onError, table],\n );\n\n const beginEditSession = useCallback(async () => {\n if (!dataSource.createSessionDataSource) {\n throw Error(\"CsvUpload requires datasource createSessionDataSource support.\");\n }\n\n const sessionDataSource = await dataSource.createSessionDataSource(\"Empty\");\n\n const sessionVuuTable = sessionDataSource?.table;\n if (sessionVuuTable && isSessionTable(sessionVuuTable)) {\n setActiveSessionTable(sessionVuuTable as CsvUploadSessionTable);\n if (sessionDataSource) {\n onImportSessionStarted?.(sessionDataSource);\n }\n }\n }, [dataSource, onImportSessionStarted, setActiveSessionTable]);\n\n const closePendingEditSession = useCallback(\n async (save: boolean) => {\n if (sessionTableRef.current === undefined) {\n return;\n }\n await endEditSessionAndNotify(save, save ? \"saved\" : \"discarded\");\n },\n [endEditSessionAndNotify],\n );\n\n const processFile = useCallback(\n async (file: File) => {\n setValidation(undefined);\n onError?.(undefined);\n\n await closePendingEditSession(false);\n\n if (schema === undefined) {\n throw Error(\"Table schema is not yet available.\");\n }\n\n if (table === undefined) {\n throw Error(\"CsvUpload requires dataSource.table to be defined.\");\n }\n\n const parsedCsv = parseCsv(await file.text(), parseOptions);\n if (parsedCsv.error && hasFileParseErrors(parsedCsv.error)) {\n setValidation(undefined);\n onError?.({\n errors: {\n validationError: createUploadError(\n \"validation\",\n `Validation failed: ${parsedCsv.error.message}`,\n parsedCsv.error,\n ),\n },\n });\n return;\n }\n\n const schemaValidation = validateCsvAgainstSchema(parsedCsv, schema, {\n maxRows,\n });\n\n if (Object.keys(schemaValidation.errorMap.fileErrors).length > 0) {\n setValidation(schemaValidation);\n onError?.({\n errors: {\n schemaError: createUploadError(\n \"schema\",\n \"CSV validation failed.\",\n parsedCsv.error,\n {\n errorMap: schemaValidation.errorMap,\n errors: schemaValidation.errors,\n message: \"CSV validation failed.\",\n },\n ),\n },\n });\n return;\n }\n\n const mergedValidation = mergeValidationWithParseErrors(\n schemaValidation,\n parsedCsv.error,\n );\n\n setValidation(mergedValidation);\n\n if (mergedValidation.rows.length > 0) {\n await beginEditSession();\n\n try {\n await addAllRows(mergedValidation);\n } catch (error) {\n await endEditSessionAndNotify(false, \"failed\");\n setValidation(undefined);\n onError?.({\n errors: {\n importError: createUploadError(\n \"import\",\n `RPC import failed: ${toErrorMessage(error)}`,\n ),\n },\n });\n }\n }\n },\n [\n onError,\n addAllRows,\n maxRows,\n parseOptions,\n beginEditSession,\n closePendingEditSession,\n table,\n endEditSessionAndNotify,\n schema,\n ],\n );\n\n const handleFiles = useCallback(\n async (files: File[]) => {\n const file = files[0];\n if (file === undefined) {\n return;\n }\n setIsProcessingFile(true);\n onProcessingStarted?.();\n try {\n await processFile(file);\n } catch (err) {\n setValidation(undefined);\n setActiveSessionTable(undefined);\n const parseError = isCsvParseError(err) ? err : undefined;\n const errorMessage = parseError\n ? `Validation failed: ${parseError.message}`\n : `Validation failed: ${toErrorMessage(err)}`;\n const errors: CsvUploadErrorResult = {\n errors: {\n validationError: createUploadError(\n \"validation\",\n errorMessage,\n parseError,\n ),\n },\n };\n onError?.(errors);\n } finally {\n setIsProcessingFile(false);\n }\n },\n [onError, onProcessingStarted, processFile, setActiveSessionTable],\n );\n\n const onDrop = useCallback(\n (_event: React.DragEvent<HTMLDivElement>, files: File[]) => {\n handleFiles(files);\n },\n [handleFiles],\n );\n\n const onTriggerChange = useCallback(\n (_event: React.ChangeEvent<HTMLInputElement>, files: File[]) => {\n handleFiles(files);\n },\n [handleFiles],\n );\n\n const canImport = useMemo(\n () =>\n validation !== undefined &&\n validation.errors.length === 0 &&\n validation.rows.length > 0 &&\n !isProcessingFile &&\n !isImporting,\n [isImporting, isProcessingFile, validation],\n );\n\n const importData = useCallback(async () => {\n if (!canImport || validation === undefined) {\n return;\n }\n\n setIsImporting(true);\n onError?.(undefined);\n\n try {\n const rpcResult = await endEditSessionAndNotify(true, \"saved\");\n\n const fallbackTableData = {\n columns: validation.columns,\n rows: validation.rows.map((row) =>\n validation.columns.map((column) => row[column] ?? \"\"),\n ),\n };\n\n onImported?.({\n rpcResult,\n tableData: normalizeTableData(rpcResult, fallbackTableData),\n });\n } catch (err) {\n const errorMessage = `RPC import failed: ${String(err)}`;\n const errors: CsvUploadErrorResult = {\n errors: {\n importError: createUploadError(\"import\", errorMessage),\n },\n };\n onError?.(errors);\n } finally {\n setIsImporting(false);\n }\n }, [canImport, endEditSessionAndNotify, onError, onImported, validation]);\n\n return {\n canImport,\n importData,\n isImporting,\n isProcessingFile,\n onDrop,\n onTriggerChange,\n sessionTable,\n schema,\n validation,\n };\n};\n"],"names":["useState","useRef","useCallback","table","CSV_FIRST_DATA_ROW_NUMBER","executeBatchRpcCalls","isRpcSuccess","buildRowErrorMessage","createUploadError","isSessionTable","parseCsv","hasFileParseErrors","validateCsvAgainstSchema","mergeValidationWithParseErrors","toErrorMessage","isCsvParseError","useMemo","normalizeTableData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useCsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/useCsvUpload.ts"],"sourcesContent":["import type { DataSource, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { EditSession } from \"@vuu-ui/vuu-data-editing\";\nimport type { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { isRpcError, isSessionTable } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { parseCsv, type CsvParseOptions } from \"./parse/csv-parse\";\nimport {\n type CsvValidationResult,\n validateCsvAgainstSchema,\n} from \"./parse/csv-schema-validation\";\nimport {\n buildRowErrorMessage,\n createUploadError,\n hasFileParseErrors,\n isCsvParseError,\n mergeValidationWithParseErrors,\n toErrorMessage,\n} from \"./parse/csv-upload-utils\";\nimport { CSV_FIRST_DATA_ROW_NUMBER } from \"./parse/csv-constants\";\nimport type {\n CsvUploadErrorResult,\n CsvUploadImportedResult,\n CsvUploadPreviewResult,\n CsvUploadSessionEndReason,\n CsvUploadSessionEndResult,\n CsvUploadSessionTable,\n} from \"./CsvUpload\";\n\nexport interface CsvUploadHookProps {\n dataSource: DataSource;\n importMode?: \"direct\" | \"preview\";\n maxRows?: number;\n onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onImportSessionStarted?: (dataSource: DataSource) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onPreview?: (result: CsvUploadPreviewResult) => void;\n onProcessingStarted?: () => void;\n parseOptions?: CsvParseOptions;\n}\n\nexport type UseCsvUploadReturn = {\n canImport: boolean;\n cancelImport: () => Promise<void>;\n importData: () => Promise<boolean>;\n isImporting: boolean;\n isProcessingFile: boolean;\n onDrop: (_event: React.DragEvent<HTMLDivElement>, files: File[]) => void;\n onTriggerChange: (\n _event: React.ChangeEvent<HTMLInputElement>,\n files: File[],\n ) => void;\n sessionTable: CsvUploadSessionTable | undefined;\n schema: TableSchema | undefined;\n validation: CsvValidationResult | undefined;\n};\n\nexport const useCsvUpload = ({\n dataSource,\n importMode = \"direct\",\n onImportSessionEnded,\n onImportSessionStarted,\n onError,\n onImported,\n onPreview,\n onProcessingStarted,\n maxRows,\n parseOptions,\n}: CsvUploadHookProps): UseCsvUploadReturn => {\n const [validation, setValidation] = useState<\n CsvValidationResult | undefined\n >();\n const [sessionTable, setSessionTable] = useState<\n CsvUploadSessionTable | undefined\n >();\n const [isProcessingFile, setIsProcessingFile] = useState(false);\n const [isImporting, setIsImporting] = useState(false);\n const editSession = useMemo(() => new EditSession(dataSource), [dataSource]);\n const ownsEditSessionRef = useRef(true);\n const operationIdRef = useRef(0);\n const processingPromiseRef = useRef<Promise<void> | undefined>(undefined);\n const sessionDataSourceRef = useRef<DataSource | undefined>(undefined);\n\n useEffect(\n () => () => {\n operationIdRef.current++;\n const processingPromise = processingPromiseRef.current;\n void (async () => {\n try {\n await processingPromise;\n } finally {\n if (ownsEditSessionRef.current) {\n try {\n await editSession.end(false);\n } catch (error) {\n console.error(\n \"[useCsvUpload] failed to discard edit session during cleanup\",\n error,\n );\n }\n }\n }\n })();\n },\n [editSession],\n );\n\n const setActiveSessionDataSource = useCallback(\n (sessionDataSource?: DataSource) => {\n sessionDataSourceRef.current = sessionDataSource;\n const table = sessionDataSource?.table;\n setSessionTable(\n table && isSessionTable(table)\n ? (table as CsvUploadSessionTable)\n : undefined,\n );\n },\n [],\n );\n\n const endEditSessionAndNotify = useCallback(\n async (save: boolean, reason: CsvUploadSessionEndReason) => {\n const sessionDataSource = sessionDataSourceRef.current;\n if (!sessionDataSource) {\n throw Error(\"CsvUpload has no active edit session.\");\n }\n if (!sessionDataSource.endEditSession) {\n throw Error(\n \"CsvUpload requires the session datasource to support endEditSession.\",\n );\n }\n const currentSessionTable = sessionDataSource.table;\n await editSession.end(save);\n\n setActiveSessionDataSource(undefined);\n onImportSessionEnded?.({\n reason,\n sessionTable:\n currentSessionTable && isSessionTable(currentSessionTable)\n ? (currentSessionTable as CsvUploadSessionTable)\n : undefined,\n });\n return undefined;\n },\n [editSession, onImportSessionEnded, setActiveSessionDataSource],\n );\n\n const table = dataSource.table;\n const schema = dataSource.tableSchema;\n\n const addAllRows = useCallback(\n async (mergedValidation: CsvValidationResult, operationId: number) => {\n const vuuMsgByRow = new Map<number, string>();\n for (const { rowNum, column, message } of mergedValidation.errors) {\n if (rowNum < CSV_FIRST_DATA_ROW_NUMBER) continue;\n const existing = vuuMsgByRow.get(rowNum);\n const columnError = `${column}: ${message}`;\n vuuMsgByRow.set(\n rowNum,\n existing\n ? `${existing}; ${columnError}`\n : `Row ${rowNum}: ${columnError}`,\n );\n }\n\n const parsedRowCount = mergedValidation.rows.length;\n const unparsedErrorRows = [...vuuMsgByRow.keys()]\n .filter(\n (rowNum) => rowNum - CSV_FIRST_DATA_ROW_NUMBER >= parsedRowCount,\n )\n .map((rowNum) => ({\n rowNum,\n rowData: {} as Record<string, VuuRowDataItemType>,\n vuuMsg: vuuMsgByRow.get(rowNum) ?? \"\",\n }));\n\n const allRows = [\n ...mergedValidation.rows.map((rowData, idx) => ({\n rowNum: idx + CSV_FIRST_DATA_ROW_NUMBER,\n rowData: rowData ?? {},\n vuuMsg: vuuMsgByRow.get(idx + CSV_FIRST_DATA_ROW_NUMBER) ?? \"\",\n })),\n ...unparsedErrorRows,\n ];\n\n const rpcErrors: string[] = [];\n for (const { rowNum, rowData, vuuMsg } of allRows) {\n if (operationId !== operationIdRef.current) {\n return false;\n }\n try {\n const payload = { ...rowData, rowNum, vuuMsg };\n const result = await editSession.addRow(payload);\n if (isRpcError(result)) {\n throw Error(result.errorMessage);\n }\n if (typeof result === \"string\") {\n throw Error(result);\n }\n } catch (error) {\n rpcErrors.push(`Row ${rowNum}: ${toErrorMessage(error)}`);\n }\n }\n\n if (rpcErrors.length > 0) {\n throw Error(buildRowErrorMessage(\"Import failed\", rpcErrors));\n }\n return true;\n },\n [editSession],\n );\n\n const beginEditSession = useCallback(async () => {\n const sessionDataSource = await editSession.begin(\"Empty\");\n\n const sessionVuuTable = sessionDataSource?.table;\n if (\n sessionDataSource === undefined ||\n sessionVuuTable === undefined ||\n !isSessionTable(sessionVuuTable)\n ) {\n throw Error(\n \"CsvUpload createSessionDataSource returned no session datasource.\",\n );\n }\n if (!sessionDataSource.columns.includes(\"vuuMsg\")) {\n sessionDataSource.columns = sessionDataSource.columns.concat(\"vuuMsg\");\n }\n setActiveSessionDataSource(sessionDataSource);\n onImportSessionStarted?.(sessionDataSource);\n return sessionDataSource;\n }, [editSession, onImportSessionStarted, setActiveSessionDataSource]);\n\n const closePendingEditSession = useCallback(\n async (save: boolean) => {\n if (sessionDataSourceRef.current === undefined) {\n return;\n }\n await endEditSessionAndNotify(save, save ? \"saved\" : \"discarded\");\n },\n [endEditSessionAndNotify],\n );\n\n const cancelImport = useCallback(async () => {\n operationIdRef.current++;\n try {\n await processingPromiseRef.current;\n } catch {\n // File-processing errors are surfaced by handleFiles.\n }\n await closePendingEditSession(false);\n }, [closePendingEditSession]);\n\n const processFile = useCallback(\n async (file: File, operationId: number) => {\n setValidation(undefined);\n onError?.(undefined);\n\n await closePendingEditSession(false);\n if (operationId !== operationIdRef.current) {\n return;\n }\n\n if (schema === undefined) {\n throw Error(\"Table schema is not yet available.\");\n }\n\n if (table === undefined) {\n throw Error(\"CsvUpload requires dataSource.table to be defined.\");\n }\n\n const fileContents = await file.text();\n if (operationId !== operationIdRef.current) {\n return;\n }\n const parsedCsv = parseCsv(fileContents, parseOptions);\n if (parsedCsv.error && hasFileParseErrors(parsedCsv.error)) {\n setValidation(undefined);\n onError?.({\n errors: {\n validationError: createUploadError(\n \"validation\",\n `Validation failed: ${parsedCsv.error.message}`,\n parsedCsv.error,\n ),\n },\n });\n return;\n }\n\n const schemaValidation = validateCsvAgainstSchema(parsedCsv, schema, {\n maxRows,\n });\n\n if (Object.keys(schemaValidation.errorMap.fileErrors).length > 0) {\n setValidation(schemaValidation);\n onError?.({\n errors: {\n schemaError: createUploadError(\n \"schema\",\n \"CSV validation failed.\",\n parsedCsv.error,\n {\n errorMap: schemaValidation.errorMap,\n errors: schemaValidation.errors,\n message: \"CSV validation failed.\",\n },\n ),\n },\n });\n return;\n }\n\n const mergedValidation = mergeValidationWithParseErrors(\n schemaValidation,\n parsedCsv.error,\n );\n\n setValidation(mergedValidation);\n\n if (mergedValidation.rows.length > 0) {\n await beginEditSession();\n if (operationId !== operationIdRef.current) {\n return;\n }\n\n try {\n const rowsAdded = await addAllRows(mergedValidation, operationId);\n if (!rowsAdded) {\n return;\n }\n } catch (error) {\n await endEditSessionAndNotify(false, \"failed\");\n setValidation(undefined);\n onError?.({\n errors: {\n importError: createUploadError(\n \"import\",\n `RPC import failed: ${toErrorMessage(error)}`,\n ),\n },\n });\n }\n }\n },\n [\n onError,\n addAllRows,\n maxRows,\n parseOptions,\n beginEditSession,\n closePendingEditSession,\n table,\n endEditSessionAndNotify,\n schema,\n ],\n );\n\n const handleFiles = useCallback(\n async (files: File[]) => {\n const file = files[0];\n if (file === undefined) {\n return;\n }\n setIsProcessingFile(true);\n onProcessingStarted?.();\n const operationId = ++operationIdRef.current;\n const processingPromise = processFile(file, operationId);\n processingPromiseRef.current = processingPromise;\n try {\n await processingPromise;\n } catch (err) {\n setValidation(undefined);\n setActiveSessionDataSource(undefined);\n const parseError = isCsvParseError(err) ? err : undefined;\n const errorMessage = parseError\n ? `Validation failed: ${parseError.message}`\n : `Validation failed: ${toErrorMessage(err)}`;\n const errors: CsvUploadErrorResult = {\n errors: {\n validationError: createUploadError(\n \"validation\",\n errorMessage,\n parseError,\n ),\n },\n };\n onError?.(errors);\n } finally {\n if (processingPromiseRef.current === processingPromise) {\n processingPromiseRef.current = undefined;\n }\n setIsProcessingFile(false);\n }\n },\n [onError, onProcessingStarted, processFile, setActiveSessionDataSource],\n );\n\n const onDrop = useCallback(\n (_event: React.DragEvent<HTMLDivElement>, files: File[]) => {\n handleFiles(files);\n },\n [handleFiles],\n );\n\n const onTriggerChange = useCallback(\n (_event: React.ChangeEvent<HTMLInputElement>, files: File[]) => {\n handleFiles(files);\n },\n [handleFiles],\n );\n\n const canImport = useMemo(\n () =>\n validation !== undefined &&\n validation.errors.length === 0 &&\n validation.rows.length > 0 &&\n !isProcessingFile &&\n !isImporting,\n [isImporting, isProcessingFile, validation],\n );\n\n const importData = useCallback(async () => {\n if (!canImport || validation === undefined) {\n return false;\n }\n\n setIsImporting(true);\n onError?.(undefined);\n\n try {\n const fallbackTableData = {\n columns: validation.columns,\n rows: validation.rows.map((row) =>\n validation.columns.map((column) => row[column] ?? \"\"),\n ),\n };\n\n const tableData = fallbackTableData;\n if (importMode === \"preview\") {\n const sessionDataSource = sessionDataSourceRef.current;\n if (!sessionDataSource) {\n throw Error(\"CsvUpload has no session datasource to preview.\");\n }\n if (!onPreview) {\n throw Error(\"CsvUpload preview mode requires an onPreview callback.\");\n }\n onPreview({\n dataSource: sessionDataSource,\n editSession,\n tableData,\n });\n ownsEditSessionRef.current = false;\n } else {\n await endEditSessionAndNotify(true, \"saved\");\n onImported?.({ tableData });\n }\n return true;\n } catch (err) {\n const errorMessage = `RPC import failed: ${String(err)}`;\n const errors: CsvUploadErrorResult = {\n errors: {\n importError: createUploadError(\"import\", errorMessage),\n },\n };\n onError?.(errors);\n return false;\n } finally {\n setIsImporting(false);\n }\n }, [\n canImport,\n editSession,\n endEditSessionAndNotify,\n onError,\n onImported,\n onPreview,\n importMode,\n validation,\n ]);\n\n return {\n canImport,\n cancelImport,\n importData,\n isImporting,\n isProcessingFile,\n onDrop,\n onTriggerChange,\n sessionTable,\n schema,\n validation,\n };\n};\n"],"names":["useState","useMemo","EditSession","useRef","useEffect","useCallback","table","isSessionTable","CSV_FIRST_DATA_ROW_NUMBER","isRpcError","toErrorMessage","buildRowErrorMessage","parseCsv","hasFileParseErrors","createUploadError","validateCsvAgainstSchema","mergeValidationWithParseErrors","isCsvParseError"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var CalculatedColumnPanel = require('./calculated-column/CalculatedColumnPanel.js');
|
|
4
4
|
var CsvUpload = require('./csv-upload/CsvUpload.js');
|
|
5
5
|
var useCsvUpload = require('./csv-upload/useCsvUpload.js');
|
|
6
|
-
var
|
|
6
|
+
var DataUploadPreview = require('./csv-upload/data-upload-preview/DataUploadPreview.js');
|
|
7
7
|
var csvSchemaValidation = require('./csv-upload/parse/csv-schema-validation.js');
|
|
8
8
|
var csvParse = require('./csv-upload/parse/csv-parse.js');
|
|
9
9
|
var csvErrors = require('./csv-upload/parse/csv-errors.js');
|
|
@@ -37,6 +37,8 @@ var useColumnSettings = require('./column-settings-panel/useColumnSettings.js');
|
|
|
37
37
|
var DatasourceStats = require('./datasource-stats/DatasourceStats.js');
|
|
38
38
|
var FreezeControl = require('./freeze-control/FreezeControl.js');
|
|
39
39
|
var FrozenBanner = require('./freeze-control/FrozenBanner.js');
|
|
40
|
+
var InlineAddRow = require('./inline-add-row/InlineAddRow.js');
|
|
41
|
+
var useInlineAddRow = require('./inline-add-row/useInlineAddRow.js');
|
|
40
42
|
var TabbedTableConfigPanel = require('./tabbed-table-config-panel/TabbedTableConfigPanel.js');
|
|
41
43
|
var TabbedTableSettingsAction = require('./tabbed-table-config-panel/TabbedTableSettingsAction.js');
|
|
42
44
|
var TableFooter = require('./table-footer/TableFooter.js');
|
|
@@ -48,7 +50,7 @@ var TableSettingsPanel = require('./table-settings-panel/TableSettingsPanel.js')
|
|
|
48
50
|
exports.CalculatedColumnPanel = CalculatedColumnPanel.CalculatedColumnPanel;
|
|
49
51
|
exports.CsvUpload = CsvUpload.CsvUpload;
|
|
50
52
|
exports.useCsvUpload = useCsvUpload.useCsvUpload;
|
|
51
|
-
exports.
|
|
53
|
+
exports.DataUploadPreview = DataUploadPreview.DataUploadPreview;
|
|
52
54
|
exports.validateCsvAgainstSchema = csvSchemaValidation.validateCsvAgainstSchema;
|
|
53
55
|
exports.parseCsv = csvParse.parseCsv;
|
|
54
56
|
exports.CsvParseErrorEnum = csvErrors.CsvParseErrorEnum;
|
|
@@ -91,6 +93,8 @@ exports.useColumnSettings = useColumnSettings.useColumnSettings;
|
|
|
91
93
|
exports.DataSourceStats = DatasourceStats.DataSourceStats;
|
|
92
94
|
exports.FreezeControl = FreezeControl.FreezeControl;
|
|
93
95
|
exports.FrozenBanner = FrozenBanner.FrozenBanner;
|
|
96
|
+
exports.InlineAddRow = InlineAddRow.InlineAddRow;
|
|
97
|
+
exports.useInlineAddRow = useInlineAddRow.useInlineAddRow;
|
|
94
98
|
exports.TabbedTableConfigPanel = TabbedTableConfigPanel.TabbedTableConfigPanel;
|
|
95
99
|
exports.TabbedTableSettingsAction = TabbedTableSettingsAction.TabbedTableSettingsAction;
|
|
96
100
|
exports.TableFooter = TableFooter.TableFooter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var inlineAddRowCss = ".vuuInlineAddRow {\n --row-borderColor: transparent;\n\n display: flex;\n height: var(--row-height, var(--salt-size-base));\n padding: 0 var(--table-selection-bookend-width, 4px);\n position: relative;\n\n .vuuTableCell {\n height: 100%;\n }\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = inlineAddRowCss;
|
|
6
|
+
//# sourceMappingURL=InlineAddRow.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineAddRow.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var vuuTable = require('@vuu-ui/vuu-table');
|
|
7
|
+
var cx = require('clsx');
|
|
8
|
+
var useInlineAddRow = require('./useInlineAddRow.js');
|
|
9
|
+
var InlineAddRow$1 = require('./InlineAddRow.css.js');
|
|
10
|
+
|
|
11
|
+
const classBase = "vuuInlineAddRow";
|
|
12
|
+
const InlineAddRow = ({
|
|
13
|
+
ariaRowIndex,
|
|
14
|
+
className,
|
|
15
|
+
columns,
|
|
16
|
+
style
|
|
17
|
+
}) => {
|
|
18
|
+
const targetWindow = window.useWindow();
|
|
19
|
+
styles.useComponentCssInjection({
|
|
20
|
+
testId: "vuu-inline-add-row",
|
|
21
|
+
css: InlineAddRow$1,
|
|
22
|
+
window: targetWindow
|
|
23
|
+
});
|
|
24
|
+
const { containerRef, dataRow, draftRevision, inlineAddColumns } = useInlineAddRow.useInlineAddRow({
|
|
25
|
+
columns
|
|
26
|
+
});
|
|
27
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx(classBase, className), ref: containerRef, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
28
|
+
vuuTable.Row,
|
|
29
|
+
{
|
|
30
|
+
ariaRowIndex,
|
|
31
|
+
columns: inlineAddColumns,
|
|
32
|
+
dataRow,
|
|
33
|
+
offset: 0,
|
|
34
|
+
searchPattern: "",
|
|
35
|
+
showBookends: false,
|
|
36
|
+
style,
|
|
37
|
+
virtualColSpan: 0
|
|
38
|
+
},
|
|
39
|
+
draftRevision
|
|
40
|
+
) });
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
exports.InlineAddRow = InlineAddRow;
|
|
44
|
+
//# sourceMappingURL=InlineAddRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineAddRow.js","sources":["../../../../../../../packages/vuu-table-extras/src/inline-add-row/InlineAddRow.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { Row } from \"@vuu-ui/vuu-table\";\nimport type { BaseRowProps } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { useInlineAddRow } from \"./useInlineAddRow\";\n\nimport inlineAddRowCss from \"./InlineAddRow.css\";\n\nconst classBase = \"vuuInlineAddRow\";\n\nexport type InlineAddRowProps = BaseRowProps;\n\nexport const InlineAddRow = ({\n ariaRowIndex,\n className,\n columns,\n style,\n}: InlineAddRowProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-inline-add-row\",\n css: inlineAddRowCss,\n window: targetWindow,\n });\n\n const { containerRef, dataRow, draftRevision, inlineAddColumns } =\n useInlineAddRow({\n columns,\n });\n\n return (\n <div className={cx(classBase, className)} ref={containerRef}>\n <Row\n ariaRowIndex={ariaRowIndex}\n columns={inlineAddColumns}\n dataRow={dataRow}\n key={draftRevision}\n offset={0}\n searchPattern=\"\"\n showBookends={false}\n style={style}\n virtualColSpan={0}\n />\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","inlineAddRowCss","useInlineAddRow","jsx","Row"],"mappings":";;;;;;;;;;AASA,MAAM,SAAY,GAAA,iBAAA;AAIX,MAAM,eAAe,CAAC;AAAA,EAC3B,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,YAAc,EAAA,OAAA,EAAS,aAAe,EAAA,gBAAA,KAC5CC,+BAAgB,CAAA;AAAA,IACd;AAAA,GACD,CAAA;AAEH,EACE,uBAAAC,cAAA,CAAC,SAAI,SAAW,EAAA,EAAA,CAAG,WAAW,SAAS,CAAA,EAAG,KAAK,YAC7C,EAAA,QAAA,kBAAAA,cAAA;AAAA,IAACC,YAAA;AAAA,IAAA;AAAA,MACC,YAAA;AAAA,MACA,OAAS,EAAA,gBAAA;AAAA,MACT,OAAA;AAAA,MAEA,MAAQ,EAAA,CAAA;AAAA,MACR,aAAc,EAAA,EAAA;AAAA,MACd,YAAc,EAAA,KAAA;AAAA,MACd,KAAA;AAAA,MACA,cAAgB,EAAA;AAAA,KAAA;AAAA,IALX;AAAA,GAOT,EAAA,CAAA;AAEJ;;;;"}
|