@vuu-ui/vuu-table-extras 2.3.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/cjs/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js +3 -0
  2. package/cjs/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -1
  3. package/cjs/packages/vuu-table-extras/src/csv-upload/CsvUpload.js +62 -48
  4. package/cjs/packages/vuu-table-extras/src/csv-upload/CsvUpload.js.map +1 -1
  5. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js +6 -0
  6. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js.map +1 -0
  7. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js +118 -0
  8. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js.map +1 -0
  9. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js +76 -0
  10. package/cjs/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js.map +1 -0
  11. package/cjs/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js +1 -44
  12. package/cjs/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js.map +1 -1
  13. package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js +154 -66
  14. package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js.map +1 -1
  15. package/cjs/packages/vuu-table-extras/src/index.js +6 -2
  16. package/cjs/packages/vuu-table-extras/src/index.js.map +1 -1
  17. package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js +6 -0
  18. package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js.map +1 -0
  19. package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js +44 -0
  20. package/cjs/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js.map +1 -0
  21. package/cjs/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js +137 -0
  22. package/cjs/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js.map +1 -0
  23. package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.css.js +1 -1
  24. package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.js +5 -2
  25. package/cjs/packages/vuu-table-extras/src/table-footer/TableFooter.js.map +1 -1
  26. package/esm/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js +3 -0
  27. package/esm/packages/vuu-table-extras/src/cell-renderers/dropdown-cell/DropdownCell.js.map +1 -1
  28. package/esm/packages/vuu-table-extras/src/csv-upload/CsvUpload.js +63 -49
  29. package/esm/packages/vuu-table-extras/src/csv-upload/CsvUpload.js.map +1 -1
  30. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js +4 -0
  31. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.css.js.map +1 -0
  32. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js +116 -0
  33. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/DataUploadPreview.js.map +1 -0
  34. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js +73 -0
  35. package/esm/packages/vuu-table-extras/src/csv-upload/data-upload-preview/useDataUploadPreview.js.map +1 -0
  36. package/esm/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js +2 -43
  37. package/esm/packages/vuu-table-extras/src/csv-upload/parse/csv-upload-utils.js.map +1 -1
  38. package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js +157 -69
  39. package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUpload.js.map +1 -1
  40. package/esm/packages/vuu-table-extras/src/index.js +3 -1
  41. package/esm/packages/vuu-table-extras/src/index.js.map +1 -1
  42. package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js +4 -0
  43. package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.css.js.map +1 -0
  44. package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js +42 -0
  45. package/esm/packages/vuu-table-extras/src/inline-add-row/InlineAddRow.js.map +1 -0
  46. package/esm/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js +135 -0
  47. package/esm/packages/vuu-table-extras/src/inline-add-row/useInlineAddRow.js.map +1 -0
  48. package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.css.js +1 -1
  49. package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.js +5 -2
  50. package/esm/packages/vuu-table-extras/src/table-footer/TableFooter.js.map +1 -1
  51. package/package.json +12 -11
  52. package/types/csv-upload/CsvUpload.d.ts +9 -1
  53. package/types/csv-upload/data-upload-preview/DataUploadPreview.d.ts +10 -0
  54. package/types/csv-upload/data-upload-preview/useDataUploadPreview.d.ts +17 -0
  55. package/types/csv-upload/index.d.ts +2 -2
  56. package/types/csv-upload/useCsvUpload.d.ts +6 -3
  57. package/types/index.d.ts +1 -0
  58. package/types/inline-add-row/InlineAddRow.d.ts +3 -0
  59. package/types/inline-add-row/index.d.ts +2 -0
  60. package/types/inline-add-row/useInlineAddRow.d.ts +57 -0
  61. package/types/table-footer/TableFooter.d.ts +3 -2
  62. package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js +0 -73
  63. package/cjs/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js.map +0 -1
  64. package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js +0 -71
  65. package/esm/packages/vuu-table-extras/src/csv-upload/useCsvUploadSessionPreview.js.map +0 -1
  66. 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 sessionTableRef = react.useRef(void 0);
25
- const setActiveSessionTable = react.useCallback(
26
- (table2) => {
27
- sessionTableRef.current = table2;
28
- setSessionTable(table2);
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
- if (!dataSource.endEditSession) {
35
- throw Error("CsvUpload requires datasource endEditSession support.");
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 = sessionTableRef.current;
38
- const result = await dataSource.endEditSession(save);
39
- setActiveSessionTable(void 0);
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 result;
83
+ return void 0;
45
84
  },
46
- [dataSource, onImportSessionEnded, setActiveSessionTable]
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((rowNum) => rowNum - csvConstants.CSV_FIRST_DATA_ROW_NUMBER >= parsedRowCount).map((rowNum) => ({
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 { errors: rpcErrors } = await csvUploadUtils.executeBatchRpcCalls(
80
- allRows,
81
- async ({ rowNum, rowData, vuuMsg }) => {
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 dataSource.rpcRequest?.({
84
- type: "RPC_REQUEST",
85
- rpcName: "addRow",
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
- return result;
96
- },
97
- ({ rowNum }, error) => `Row ${rowNum}: ${error}`
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
- const errorMessage = csvUploadUtils.buildRowErrorMessage("Import failed", rpcErrors);
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
- [dataSource, onError, table]
140
+ [editSession]
108
141
  );
109
142
  const beginEditSession = react.useCallback(async () => {
110
- if (!dataSource.createSessionDataSource) {
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 && vuuUtils.isSessionTable(sessionVuuTable)) {
116
- setActiveSessionTable(sessionVuuTable);
117
- if (sessionDataSource) {
118
- onImportSessionStarted?.(sessionDataSource);
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
- }, [dataSource, onImportSessionStarted, setActiveSessionTable]);
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 (sessionTableRef.current === void 0) {
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 parsedCsv = csvParse.parseCsv(await file.text(), parseOptions);
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 processFile(file);
280
+ await processingPromise;
222
281
  } catch (err) {
223
282
  setValidation(void 0);
224
- setActiveSessionTable(void 0);
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, setActiveSessionTable]
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
- onImported?.({
274
- rpcResult,
275
- tableData: csvUploadUtils.normalizeTableData(rpcResult, fallbackTableData)
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
- }, [canImport, endEditSessionAndNotify, onError, onImported, validation]);
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 useCsvUploadSessionPreview = require('./csv-upload/useCsvUploadSessionPreview.js');
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.useCsvUploadSessionPreview = useCsvUploadSessionPreview.useCsvUploadSessionPreview;
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;;;;"}