@vuu-ui/vuu-table-extras 2.1.19-beta.3 → 2.1.19

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.
@@ -1 +1 @@
1
- {"version":3,"file":"CsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/CsvUpload.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n FileDropZone,\n FileDropZoneIcon,\n FileDropZoneTrigger,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport type { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { CsvParseError, CsvParseOptions } from \"./parse/csv-parse\";\nimport type { CsvValidationStructuredError } from \"./parse/csv-schema-validation\";\nimport type { CsvUploadTableData } from \"./parse/csv-upload-utils\";\nimport { useCsvUpload } from \"./useCsvUpload\";\nimport css from \"./CsvUpload.css\";\n\nexport type CsvUploadImportedResult = {\n rpcResult: unknown;\n tableData: CsvUploadTableData;\n};\n\nexport type CsvUploadErrors = {\n schemaError?: CsvUploadError;\n validationError?: CsvUploadError;\n importError?: CsvUploadError;\n};\n\nexport type CsvUploadError = {\n message: string;\n parseError?: CsvParseError;\n validationError?: CsvValidationStructuredError;\n source: \"schema\" | \"validation\" | \"import\";\n};\n\nexport type CsvUploadErrorResult = {\n errors: CsvUploadErrors;\n};\n\nexport type CsvUploadSessionTable = VuuTable;\n\nexport type CsvUploadSessionEndReason = \"saved\" | \"discarded\" | \"failed\";\n\nexport type CsvUploadSessionEndResult = {\n reason: CsvUploadSessionEndReason;\n sessionTable?: CsvUploadSessionTable;\n};\n\nexport type CsvUploadPhase =\n | \"idle\"\n | \"processing\"\n | \"preview-ready\"\n | \"importing\"\n | \"imported\"\n | \"failed\";\n\nexport interface CsvUploadProps {\n children?: ReactNode;\n dataSource: DataSource;\n onEditSessionStarted?: (dataSource: DataSource) => void;\n onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onProcessingStarted?: () => void;\n dialogTitle?: string;\n maxRows?: number;\n onCancel?: () => void;\n onClose?: () => void;\n open?: boolean;\n parseOptions?: CsvParseOptions;\n}\n\nconst classBase = \"vuuCsvUpload\";\n\nexport const CsvUpload = (props: CsvUploadProps) => {\n const {\n children,\n dialogTitle = \"Import CSV\",\n onCancel,\n onClose,\n open,\n } = props;\n const isControlledOpen = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(open ?? true);\n\n const handleCancel = useCallback(() => {\n if (!isControlledOpen) {\n setInternalOpen(false);\n }\n onCancel?.();\n }, [isControlledOpen, onCancel]);\n\n const dialogOpen = isControlledOpen ? open : internalOpen;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-csv-upload\",\n css,\n window: targetWindow,\n });\n\n const {\n canImport,\n isProcessingFile,\n isImporting,\n importData,\n onDrop,\n onTriggerChange,\n schema,\n validation,\n } = useCsvUpload(props);\n\n const handleImport = useCallback(async () => {\n await importData();\n onClose?.();\n }, [importData, onClose]);\n\n return (\n <Dialog open={dialogOpen}>\n <DialogHeader header={dialogTitle} />\n <DialogContent>\n <div className={classBase}>\n <FileDropZone\n className={`${classBase}-dropZone`}\n disabled={schema === undefined || isProcessingFile || isImporting}\n onDrop={onDrop}\n status={\n validation && validation.errors.length > 0 ? \"error\" : undefined\n }\n >\n <FileDropZoneIcon />\n {validation && validation.errors.length > 0 ? (\n <>\n <div>Your file contains errors</div>\n <div> Please rectify and reupload</div>\n </>\n ) : (\n <div>Drop a file here or</div>\n )}\n <FileDropZoneTrigger\n accept=\".csv,text/csv\"\n onChange={onTriggerChange}\n >\n BROWSE FILES\n </FileDropZoneTrigger>\n </FileDropZone>\n {children}\n </div>\n </DialogContent>\n <DialogActions>\n <Button appearance=\"solid\" sentiment=\"negative\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n disabled={!canImport}\n appearance=\"solid\"\n sentiment=\"accented\"\n onClick={handleImport}\n >\n {isProcessingFile\n ? \"Validating...\"\n : isImporting\n ? \"Importing...\"\n : \"Import\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":["useState","useCallback","useWindow","useComponentCssInjection","css","useCsvUpload","jsxs","Dialog","jsx","DialogHeader","DialogContent","FileDropZone","FileDropZoneIcon","Fragment","FileDropZoneTrigger","DialogActions","Button"],"mappings":"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"}
1
+ {"version":3,"file":"CsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/CsvUpload.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n FileDropZone,\n FileDropZoneIcon,\n FileDropZoneTrigger,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport type { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { CsvParseError, CsvParseOptions } from \"./parse/csv-parse\";\nimport type { CsvValidationStructuredError } from \"./parse/csv-schema-validation\";\nimport type { CsvUploadTableData } from \"./parse/csv-upload-utils\";\nimport { useCsvUpload } from \"./useCsvUpload\";\nimport css from \"./CsvUpload.css\";\n\nexport type CsvUploadImportedResult = {\n rpcResult: unknown;\n tableData: CsvUploadTableData;\n};\n\nexport type CsvUploadErrors = {\n schemaError?: CsvUploadError;\n validationError?: CsvUploadError;\n importError?: CsvUploadError;\n};\n\nexport type CsvUploadError = {\n message: string;\n parseError?: CsvParseError;\n validationError?: CsvValidationStructuredError;\n source: \"schema\" | \"validation\" | \"import\";\n};\n\nexport type CsvUploadErrorResult = {\n errors: CsvUploadErrors;\n};\n\nexport type CsvUploadSessionTable = VuuTable;\n\nexport type CsvUploadSessionEndReason = \"saved\" | \"discarded\" | \"failed\";\n\nexport type CsvUploadSessionEndResult = {\n reason: CsvUploadSessionEndReason;\n sessionTable?: CsvUploadSessionTable;\n};\n\nexport type CsvUploadPhase =\n | \"idle\"\n | \"processing\"\n | \"preview-ready\"\n | \"importing\"\n | \"imported\"\n | \"failed\";\n\nexport interface CsvUploadProps {\n children?: ReactNode;\n dataSource: DataSource;\n onImportSessionStarted?: (dataSource: DataSource) => void;\n onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onProcessingStarted?: () => void;\n dialogTitle?: string;\n maxRows?: number;\n onCancel?: () => void;\n onClose?: () => void;\n open?: boolean;\n parseOptions?: CsvParseOptions;\n}\n\nconst classBase = \"vuuCsvUpload\";\n\nexport const CsvUpload = (props: CsvUploadProps) => {\n const {\n children,\n dialogTitle = \"Import CSV\",\n onCancel,\n onClose,\n open,\n } = props;\n const isControlledOpen = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(open ?? true);\n\n const handleCancel = useCallback(() => {\n if (!isControlledOpen) {\n setInternalOpen(false);\n }\n onCancel?.();\n }, [isControlledOpen, onCancel]);\n\n const dialogOpen = isControlledOpen ? open : internalOpen;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-csv-upload\",\n css,\n window: targetWindow,\n });\n\n const {\n canImport,\n isProcessingFile,\n isImporting,\n importData,\n onDrop,\n onTriggerChange,\n schema,\n validation,\n } = useCsvUpload(props);\n\n const handleImport = useCallback(async () => {\n await importData();\n onClose?.();\n }, [importData, onClose]);\n\n return (\n <Dialog open={dialogOpen}>\n <DialogHeader header={dialogTitle} />\n <DialogContent>\n <div className={classBase}>\n <FileDropZone\n className={`${classBase}-dropZone`}\n disabled={schema === undefined || isProcessingFile || isImporting}\n onDrop={onDrop}\n status={\n validation && validation.errors.length > 0 ? \"error\" : undefined\n }\n >\n <FileDropZoneIcon />\n {validation && validation.errors.length > 0 ? (\n <>\n <div>Your file contains errors</div>\n <div> Please rectify and reupload</div>\n </>\n ) : (\n <div>Drop a file here or</div>\n )}\n <FileDropZoneTrigger\n accept=\".csv,text/csv\"\n onChange={onTriggerChange}\n >\n BROWSE FILES\n </FileDropZoneTrigger>\n </FileDropZone>\n {children}\n </div>\n </DialogContent>\n <DialogActions>\n <Button appearance=\"solid\" sentiment=\"negative\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n disabled={!canImport}\n appearance=\"solid\"\n sentiment=\"accented\"\n onClick={handleImport}\n >\n {isProcessingFile\n ? \"Validating...\"\n : isImporting\n ? \"Importing...\"\n : \"Import\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":["useState","useCallback","useWindow","useComponentCssInjection","css","useCsvUpload","jsxs","Dialog","jsx","DialogHeader","DialogContent","FileDropZone","FileDropZoneIcon","Fragment","FileDropZoneTrigger","DialogActions","Button"],"mappings":"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"}
@@ -9,8 +9,8 @@ var csvConstants = require('./parse/csv-constants.js');
9
9
 
10
10
  const useCsvUpload = ({
11
11
  dataSource,
12
- onEditSessionEnded,
13
- onEditSessionStarted,
12
+ onImportSessionEnded,
13
+ onImportSessionStarted,
14
14
  onError,
15
15
  onImported,
16
16
  onProcessingStarted,
@@ -25,15 +25,9 @@ const useCsvUpload = ({
25
25
  const setActiveSessionTable = react.useCallback(
26
26
  (table2) => {
27
27
  sessionTableRef.current = table2;
28
- if (table2) {
29
- const sessionDs = dataSource.createSessionDataSource?.(table2);
30
- if (sessionDs) {
31
- onEditSessionStarted?.(sessionDs);
32
- }
33
- }
34
28
  setSessionTable(table2);
35
29
  },
36
- [dataSource, onEditSessionStarted]
30
+ []
37
31
  );
38
32
  const endEditSessionAndNotify = react.useCallback(
39
33
  async (save, reason) => {
@@ -43,13 +37,13 @@ const useCsvUpload = ({
43
37
  const currentSessionTable = sessionTableRef.current;
44
38
  const result = await dataSource.endEditSession(save);
45
39
  setActiveSessionTable(void 0);
46
- onEditSessionEnded?.({
40
+ onImportSessionEnded?.({
47
41
  reason,
48
42
  sessionTable: currentSessionTable
49
43
  });
50
44
  return result;
51
45
  },
52
- [dataSource, onEditSessionEnded, setActiveSessionTable]
46
+ [dataSource, onImportSessionEnded, setActiveSessionTable]
53
47
  );
54
48
  const table = dataSource.table;
55
49
  const schema = dataSource.tableSchema;
@@ -113,15 +107,18 @@ const useCsvUpload = ({
113
107
  [dataSource, onError, table]
114
108
  );
115
109
  const beginEditSession = react.useCallback(async () => {
116
- if (!dataSource.beginEditSession) {
117
- throw Error("CsvUpload requires datasource beginEditSession support.");
110
+ if (!dataSource.createSessionDataSource) {
111
+ throw Error("CsvUpload requires datasource createSessionDataSource support.");
118
112
  }
119
- const sessionDataSource = await dataSource.beginEditSession("empty-session-table");
113
+ const sessionDataSource = await dataSource.createSessionDataSource("Empty");
120
114
  const sessionVuuTable = sessionDataSource?.table;
121
115
  if (sessionVuuTable && vuuUtils.isSessionTable(sessionVuuTable)) {
122
116
  setActiveSessionTable(sessionVuuTable);
117
+ if (sessionDataSource) {
118
+ onImportSessionStarted?.(sessionDataSource);
119
+ }
123
120
  }
124
- }, [dataSource, setActiveSessionTable]);
121
+ }, [dataSource, onImportSessionStarted, setActiveSessionTable]);
125
122
  const closePendingEditSession = react.useCallback(
126
123
  async (save) => {
127
124
  if (sessionTableRef.current === void 0) {
@@ -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 onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onEditSessionStarted?: (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 onEditSessionEnded,\n onEditSessionStarted,\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 if (table) {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n if (sessionDs) {\n onEditSessionStarted?.(sessionDs);\n }\n }\n setSessionTable(table);\n },\n [dataSource, onEditSessionStarted],\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 onEditSessionEnded?.({\n reason,\n sessionTable: currentSessionTable,\n });\n return result;\n },\n [dataSource, onEditSessionEnded, 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.beginEditSession) {\n throw Error(\"CsvUpload requires datasource beginEditSession support.\");\n }\n\n const sessionDataSource = await dataSource.beginEditSession(\"empty-session-table\");\n\n const sessionVuuTable = sessionDataSource?.table;\n if (sessionVuuTable && isSessionTable(sessionVuuTable)) {\n setActiveSessionTable(sessionVuuTable as CsvUploadSessionTable);\n }\n }, [dataSource, 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 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 +1 @@
1
- {"version":3,"file":"CsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/CsvUpload.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n FileDropZone,\n FileDropZoneIcon,\n FileDropZoneTrigger,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport type { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { CsvParseError, CsvParseOptions } from \"./parse/csv-parse\";\nimport type { CsvValidationStructuredError } from \"./parse/csv-schema-validation\";\nimport type { CsvUploadTableData } from \"./parse/csv-upload-utils\";\nimport { useCsvUpload } from \"./useCsvUpload\";\nimport css from \"./CsvUpload.css\";\n\nexport type CsvUploadImportedResult = {\n rpcResult: unknown;\n tableData: CsvUploadTableData;\n};\n\nexport type CsvUploadErrors = {\n schemaError?: CsvUploadError;\n validationError?: CsvUploadError;\n importError?: CsvUploadError;\n};\n\nexport type CsvUploadError = {\n message: string;\n parseError?: CsvParseError;\n validationError?: CsvValidationStructuredError;\n source: \"schema\" | \"validation\" | \"import\";\n};\n\nexport type CsvUploadErrorResult = {\n errors: CsvUploadErrors;\n};\n\nexport type CsvUploadSessionTable = VuuTable;\n\nexport type CsvUploadSessionEndReason = \"saved\" | \"discarded\" | \"failed\";\n\nexport type CsvUploadSessionEndResult = {\n reason: CsvUploadSessionEndReason;\n sessionTable?: CsvUploadSessionTable;\n};\n\nexport type CsvUploadPhase =\n | \"idle\"\n | \"processing\"\n | \"preview-ready\"\n | \"importing\"\n | \"imported\"\n | \"failed\";\n\nexport interface CsvUploadProps {\n children?: ReactNode;\n dataSource: DataSource;\n onEditSessionStarted?: (dataSource: DataSource) => void;\n onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onProcessingStarted?: () => void;\n dialogTitle?: string;\n maxRows?: number;\n onCancel?: () => void;\n onClose?: () => void;\n open?: boolean;\n parseOptions?: CsvParseOptions;\n}\n\nconst classBase = \"vuuCsvUpload\";\n\nexport const CsvUpload = (props: CsvUploadProps) => {\n const {\n children,\n dialogTitle = \"Import CSV\",\n onCancel,\n onClose,\n open,\n } = props;\n const isControlledOpen = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(open ?? true);\n\n const handleCancel = useCallback(() => {\n if (!isControlledOpen) {\n setInternalOpen(false);\n }\n onCancel?.();\n }, [isControlledOpen, onCancel]);\n\n const dialogOpen = isControlledOpen ? open : internalOpen;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-csv-upload\",\n css,\n window: targetWindow,\n });\n\n const {\n canImport,\n isProcessingFile,\n isImporting,\n importData,\n onDrop,\n onTriggerChange,\n schema,\n validation,\n } = useCsvUpload(props);\n\n const handleImport = useCallback(async () => {\n await importData();\n onClose?.();\n }, [importData, onClose]);\n\n return (\n <Dialog open={dialogOpen}>\n <DialogHeader header={dialogTitle} />\n <DialogContent>\n <div className={classBase}>\n <FileDropZone\n className={`${classBase}-dropZone`}\n disabled={schema === undefined || isProcessingFile || isImporting}\n onDrop={onDrop}\n status={\n validation && validation.errors.length > 0 ? \"error\" : undefined\n }\n >\n <FileDropZoneIcon />\n {validation && validation.errors.length > 0 ? (\n <>\n <div>Your file contains errors</div>\n <div> Please rectify and reupload</div>\n </>\n ) : (\n <div>Drop a file here or</div>\n )}\n <FileDropZoneTrigger\n accept=\".csv,text/csv\"\n onChange={onTriggerChange}\n >\n BROWSE FILES\n </FileDropZoneTrigger>\n </FileDropZone>\n {children}\n </div>\n </DialogContent>\n <DialogActions>\n <Button appearance=\"solid\" sentiment=\"negative\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n disabled={!canImport}\n appearance=\"solid\"\n sentiment=\"accented\"\n onClick={handleImport}\n >\n {isProcessingFile\n ? \"Validating...\"\n : isImporting\n ? \"Importing...\"\n : \"Import\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CsvUpload.js","sources":["../../../../../../../packages/vuu-table-extras/src/csv-upload/CsvUpload.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n FileDropZone,\n FileDropZoneIcon,\n FileDropZoneTrigger,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { type ReactNode, useCallback, useState } from \"react\";\nimport type { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { CsvParseError, CsvParseOptions } from \"./parse/csv-parse\";\nimport type { CsvValidationStructuredError } from \"./parse/csv-schema-validation\";\nimport type { CsvUploadTableData } from \"./parse/csv-upload-utils\";\nimport { useCsvUpload } from \"./useCsvUpload\";\nimport css from \"./CsvUpload.css\";\n\nexport type CsvUploadImportedResult = {\n rpcResult: unknown;\n tableData: CsvUploadTableData;\n};\n\nexport type CsvUploadErrors = {\n schemaError?: CsvUploadError;\n validationError?: CsvUploadError;\n importError?: CsvUploadError;\n};\n\nexport type CsvUploadError = {\n message: string;\n parseError?: CsvParseError;\n validationError?: CsvValidationStructuredError;\n source: \"schema\" | \"validation\" | \"import\";\n};\n\nexport type CsvUploadErrorResult = {\n errors: CsvUploadErrors;\n};\n\nexport type CsvUploadSessionTable = VuuTable;\n\nexport type CsvUploadSessionEndReason = \"saved\" | \"discarded\" | \"failed\";\n\nexport type CsvUploadSessionEndResult = {\n reason: CsvUploadSessionEndReason;\n sessionTable?: CsvUploadSessionTable;\n};\n\nexport type CsvUploadPhase =\n | \"idle\"\n | \"processing\"\n | \"preview-ready\"\n | \"importing\"\n | \"imported\"\n | \"failed\";\n\nexport interface CsvUploadProps {\n children?: ReactNode;\n dataSource: DataSource;\n onImportSessionStarted?: (dataSource: DataSource) => void;\n onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onError?: (result: CsvUploadErrorResult | undefined) => void;\n onImported?: (result: CsvUploadImportedResult) => void;\n onProcessingStarted?: () => void;\n dialogTitle?: string;\n maxRows?: number;\n onCancel?: () => void;\n onClose?: () => void;\n open?: boolean;\n parseOptions?: CsvParseOptions;\n}\n\nconst classBase = \"vuuCsvUpload\";\n\nexport const CsvUpload = (props: CsvUploadProps) => {\n const {\n children,\n dialogTitle = \"Import CSV\",\n onCancel,\n onClose,\n open,\n } = props;\n const isControlledOpen = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(open ?? true);\n\n const handleCancel = useCallback(() => {\n if (!isControlledOpen) {\n setInternalOpen(false);\n }\n onCancel?.();\n }, [isControlledOpen, onCancel]);\n\n const dialogOpen = isControlledOpen ? open : internalOpen;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-csv-upload\",\n css,\n window: targetWindow,\n });\n\n const {\n canImport,\n isProcessingFile,\n isImporting,\n importData,\n onDrop,\n onTriggerChange,\n schema,\n validation,\n } = useCsvUpload(props);\n\n const handleImport = useCallback(async () => {\n await importData();\n onClose?.();\n }, [importData, onClose]);\n\n return (\n <Dialog open={dialogOpen}>\n <DialogHeader header={dialogTitle} />\n <DialogContent>\n <div className={classBase}>\n <FileDropZone\n className={`${classBase}-dropZone`}\n disabled={schema === undefined || isProcessingFile || isImporting}\n onDrop={onDrop}\n status={\n validation && validation.errors.length > 0 ? \"error\" : undefined\n }\n >\n <FileDropZoneIcon />\n {validation && validation.errors.length > 0 ? (\n <>\n <div>Your file contains errors</div>\n <div> Please rectify and reupload</div>\n </>\n ) : (\n <div>Drop a file here or</div>\n )}\n <FileDropZoneTrigger\n accept=\".csv,text/csv\"\n onChange={onTriggerChange}\n >\n BROWSE FILES\n </FileDropZoneTrigger>\n </FileDropZone>\n {children}\n </div>\n </DialogContent>\n <DialogActions>\n <Button appearance=\"solid\" sentiment=\"negative\" onClick={handleCancel}>\n Cancel\n </Button>\n <Button\n disabled={!canImport}\n appearance=\"solid\"\n sentiment=\"accented\"\n onClick={handleImport}\n >\n {isProcessingFile\n ? \"Validating...\"\n : isImporting\n ? \"Importing...\"\n : \"Import\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ import { CSV_FIRST_DATA_ROW_NUMBER } from './parse/csv-constants.js';
7
7
 
8
8
  const useCsvUpload = ({
9
9
  dataSource,
10
- onEditSessionEnded,
11
- onEditSessionStarted,
10
+ onImportSessionEnded,
11
+ onImportSessionStarted,
12
12
  onError,
13
13
  onImported,
14
14
  onProcessingStarted,
@@ -23,15 +23,9 @@ const useCsvUpload = ({
23
23
  const setActiveSessionTable = useCallback(
24
24
  (table2) => {
25
25
  sessionTableRef.current = table2;
26
- if (table2) {
27
- const sessionDs = dataSource.createSessionDataSource?.(table2);
28
- if (sessionDs) {
29
- onEditSessionStarted?.(sessionDs);
30
- }
31
- }
32
26
  setSessionTable(table2);
33
27
  },
34
- [dataSource, onEditSessionStarted]
28
+ []
35
29
  );
36
30
  const endEditSessionAndNotify = useCallback(
37
31
  async (save, reason) => {
@@ -41,13 +35,13 @@ const useCsvUpload = ({
41
35
  const currentSessionTable = sessionTableRef.current;
42
36
  const result = await dataSource.endEditSession(save);
43
37
  setActiveSessionTable(void 0);
44
- onEditSessionEnded?.({
38
+ onImportSessionEnded?.({
45
39
  reason,
46
40
  sessionTable: currentSessionTable
47
41
  });
48
42
  return result;
49
43
  },
50
- [dataSource, onEditSessionEnded, setActiveSessionTable]
44
+ [dataSource, onImportSessionEnded, setActiveSessionTable]
51
45
  );
52
46
  const table = dataSource.table;
53
47
  const schema = dataSource.tableSchema;
@@ -111,15 +105,18 @@ const useCsvUpload = ({
111
105
  [dataSource, onError, table]
112
106
  );
113
107
  const beginEditSession = useCallback(async () => {
114
- if (!dataSource.beginEditSession) {
115
- throw Error("CsvUpload requires datasource beginEditSession support.");
108
+ if (!dataSource.createSessionDataSource) {
109
+ throw Error("CsvUpload requires datasource createSessionDataSource support.");
116
110
  }
117
- const sessionDataSource = await dataSource.beginEditSession("empty-session-table");
111
+ const sessionDataSource = await dataSource.createSessionDataSource("Empty");
118
112
  const sessionVuuTable = sessionDataSource?.table;
119
113
  if (sessionVuuTable && isSessionTable(sessionVuuTable)) {
120
114
  setActiveSessionTable(sessionVuuTable);
115
+ if (sessionDataSource) {
116
+ onImportSessionStarted?.(sessionDataSource);
117
+ }
121
118
  }
122
- }, [dataSource, setActiveSessionTable]);
119
+ }, [dataSource, onImportSessionStarted, setActiveSessionTable]);
123
120
  const closePendingEditSession = useCallback(
124
121
  async (save) => {
125
122
  if (sessionTableRef.current === void 0) {
@@ -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 onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;\n onEditSessionStarted?: (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 onEditSessionEnded,\n onEditSessionStarted,\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 if (table) {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n if (sessionDs) {\n onEditSessionStarted?.(sessionDs);\n }\n }\n setSessionTable(table);\n },\n [dataSource, onEditSessionStarted],\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 onEditSessionEnded?.({\n reason,\n sessionTable: currentSessionTable,\n });\n return result;\n },\n [dataSource, onEditSessionEnded, 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.beginEditSession) {\n throw Error(\"CsvUpload requires datasource beginEditSession support.\");\n }\n\n const sessionDataSource = await dataSource.beginEditSession(\"empty-session-table\");\n\n const sessionVuuTable = sessionDataSource?.table;\n if (sessionVuuTable && isSessionTable(sessionVuuTable)) {\n setActiveSessionTable(sessionVuuTable as CsvUploadSessionTable);\n }\n }, [dataSource, 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":["table"],"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 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":["table"],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
- "version": "2.1.19-beta.3",
2
+ "version": "2.1.19",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-filter-types": "2.1.19-beta.3",
7
- "@vuu-ui/vuu-protocol-types": "2.1.19-beta.3"
6
+ "@vuu-ui/vuu-filter-types": "2.1.19",
7
+ "@vuu-ui/vuu-protocol-types": "2.1.19"
8
8
  },
9
9
  "dependencies": {
10
- "@vuu-ui/vuu-codemirror": "2.1.19-beta.3",
11
- "@vuu-ui/vuu-data-react": "2.1.19-beta.3",
12
- "@vuu-ui/vuu-data-types": "2.1.19-beta.3",
13
- "@vuu-ui/vuu-table-types": "2.1.19-beta.3",
14
- "@vuu-ui/vuu-popups": "2.1.19-beta.3",
15
- "@vuu-ui/vuu-table": "2.1.19-beta.3",
16
- "@vuu-ui/vuu-utils": "2.1.19-beta.3",
17
- "@vuu-ui/vuu-ui-controls": "2.1.19-beta.3",
10
+ "@vuu-ui/vuu-codemirror": "2.1.19",
11
+ "@vuu-ui/vuu-data-react": "2.1.19",
12
+ "@vuu-ui/vuu-data-types": "2.1.19",
13
+ "@vuu-ui/vuu-table-types": "2.1.19",
14
+ "@vuu-ui/vuu-popups": "2.1.19",
15
+ "@vuu-ui/vuu-table": "2.1.19",
16
+ "@vuu-ui/vuu-utils": "2.1.19",
17
+ "@vuu-ui/vuu-ui-controls": "2.1.19",
18
18
  "@lezer/lr": "1.4.2",
19
19
  "@salt-ds/core": "1.54.1",
20
20
  "@salt-ds/lab": "1.0.0-alpha.83",
@@ -32,8 +32,8 @@ export type CsvUploadPhase = "idle" | "processing" | "preview-ready" | "importin
32
32
  export interface CsvUploadProps {
33
33
  children?: ReactNode;
34
34
  dataSource: DataSource;
35
- onEditSessionStarted?: (dataSource: DataSource) => void;
36
- onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;
35
+ onImportSessionStarted?: (dataSource: DataSource) => void;
36
+ onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;
37
37
  onError?: (result: CsvUploadErrorResult | undefined) => void;
38
38
  onImported?: (result: CsvUploadImportedResult) => void;
39
39
  onProcessingStarted?: () => void;
@@ -5,8 +5,8 @@ import type { CsvUploadErrorResult, CsvUploadImportedResult, CsvUploadSessionEnd
5
5
  export interface CsvUploadHookProps {
6
6
  dataSource: DataSource;
7
7
  maxRows?: number;
8
- onEditSessionEnded?: (result: CsvUploadSessionEndResult) => void;
9
- onEditSessionStarted?: (dataSource: DataSource) => void;
8
+ onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;
9
+ onImportSessionStarted?: (dataSource: DataSource) => void;
10
10
  onError?: (result: CsvUploadErrorResult | undefined) => void;
11
11
  onImported?: (result: CsvUploadImportedResult) => void;
12
12
  onProcessingStarted?: () => void;
@@ -23,4 +23,4 @@ export type UseCsvUploadReturn = {
23
23
  schema: TableSchema | undefined;
24
24
  validation: CsvValidationResult | undefined;
25
25
  };
26
- export declare const useCsvUpload: ({ dataSource, onEditSessionEnded, onEditSessionStarted, onError, onImported, onProcessingStarted, maxRows, parseOptions, }: CsvUploadHookProps) => UseCsvUploadReturn;
26
+ export declare const useCsvUpload: ({ dataSource, onImportSessionEnded, onImportSessionStarted, onError, onImported, onProcessingStarted, maxRows, parseOptions, }: CsvUploadHookProps) => UseCsvUploadReturn;