@vuu-ui/vuu-table-extras 3.5.4 → 3.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +12 -12
- package/src/csv-upload/parse/csv-upload-utils.js +6 -3
- package/src/csv-upload/session/useImportSession.js +4 -1
- package/src/csv-upload/useCsvUpload.js +18 -3
- package/types/csv-upload/parse/csv-upload-utils.d.ts +6 -2
- package/types/csv-upload/session/useImportSession.d.ts +2 -1
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.5.
|
|
2
|
+
"version": "3.5.5",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"license": "Apache-2.0",
|
|
@@ -11,19 +11,19 @@
|
|
|
11
11
|
"lezer-generate:column": "lezer-generator --output ./src/column-expression-input/column-language-parser/generated/column-parser.js ./src/column-expression-input/column-language-parser/grammar/column.grammar"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"@vuu-ui/vuu-filter-types": "3.5.
|
|
15
|
-
"@vuu-ui/vuu-protocol-types": "3.5.
|
|
14
|
+
"@vuu-ui/vuu-filter-types": "3.5.5",
|
|
15
|
+
"@vuu-ui/vuu-protocol-types": "3.5.5"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@vuu-ui/vuu-codemirror": "3.5.
|
|
19
|
-
"@vuu-ui/vuu-data-editing": "3.5.
|
|
20
|
-
"@vuu-ui/vuu-data-react": "3.5.
|
|
21
|
-
"@vuu-ui/vuu-data-types": "3.5.
|
|
22
|
-
"@vuu-ui/vuu-table-types": "3.5.
|
|
23
|
-
"@vuu-ui/vuu-popups": "3.5.
|
|
24
|
-
"@vuu-ui/vuu-table": "3.5.
|
|
25
|
-
"@vuu-ui/vuu-utils": "3.5.
|
|
26
|
-
"@vuu-ui/vuu-ui-controls": "3.5.
|
|
18
|
+
"@vuu-ui/vuu-codemirror": "3.5.5",
|
|
19
|
+
"@vuu-ui/vuu-data-editing": "3.5.5",
|
|
20
|
+
"@vuu-ui/vuu-data-react": "3.5.5",
|
|
21
|
+
"@vuu-ui/vuu-data-types": "3.5.5",
|
|
22
|
+
"@vuu-ui/vuu-table-types": "3.5.5",
|
|
23
|
+
"@vuu-ui/vuu-popups": "3.5.5",
|
|
24
|
+
"@vuu-ui/vuu-table": "3.5.5",
|
|
25
|
+
"@vuu-ui/vuu-utils": "3.5.5",
|
|
26
|
+
"@vuu-ui/vuu-ui-controls": "3.5.5",
|
|
27
27
|
"@lezer/lr": "1.4.2",
|
|
28
28
|
"@salt-ds/core": "1.54.1",
|
|
29
29
|
"@salt-ds/lab": "1.0.0-alpha.83",
|
|
@@ -60,15 +60,18 @@ const getInlineRowErrorMessage = (result)=>{
|
|
|
60
60
|
if (isRecord(result) && "data" in result && isRecord(result.data)) {
|
|
61
61
|
const data = result.data;
|
|
62
62
|
const msg = data.vuuMsg ?? data.msg;
|
|
63
|
-
if ("string" == typeof msg && "" !== msg.trim()) return msg;
|
|
63
|
+
if ("string" == typeof msg && "" !== msg.trim()) return msg.trim();
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
const getRowVuuMsgError = (row, vuuMsgDataIndex, vuuRowNumDataIndex)=>{
|
|
67
67
|
if (-1 === vuuMsgDataIndex) return;
|
|
68
68
|
const msg = Array.isArray(row) ? row[vuuMsgDataIndex] : row?.vuuMsg;
|
|
69
69
|
if ("string" == typeof msg && "" !== msg.trim()) {
|
|
70
|
-
const rowNum = -1 !== vuuRowNumDataIndex && void 0 !== row[vuuRowNumDataIndex] ? row[vuuRowNumDataIndex] : Number(row[metadataKeys.IDX]) + CSV_FIRST_DATA_ROW_NUMBER;
|
|
71
|
-
return
|
|
70
|
+
const rowNum = -1 !== vuuRowNumDataIndex && void 0 !== row[vuuRowNumDataIndex] ? Number(row[vuuRowNumDataIndex]) : Number(row[metadataKeys.IDX]) + CSV_FIRST_DATA_ROW_NUMBER;
|
|
71
|
+
return {
|
|
72
|
+
rowNum,
|
|
73
|
+
message: msg.trim()
|
|
74
|
+
};
|
|
72
75
|
}
|
|
73
76
|
};
|
|
74
77
|
const waitForSessionErrors = (isRemote, sessionErrors, receivedRowKeys, expectedRowCount, listeners, timeoutMs = 500)=>{
|
|
@@ -174,7 +174,10 @@ const useImportSession = ({ dataSource, sessionOverrides, rowDefaults, processin
|
|
|
174
174
|
if (isRpcError(result)) throw Error(result.errorMessage);
|
|
175
175
|
if ("string" == typeof result) throw Error(result);
|
|
176
176
|
const inlineMsg = getInlineRowErrorMessage(result);
|
|
177
|
-
if (inlineMsg)
|
|
177
|
+
if (inlineMsg) sessionErrorsRef.current.set(rowNum, {
|
|
178
|
+
rowNum,
|
|
179
|
+
message: inlineMsg
|
|
180
|
+
});
|
|
178
181
|
} catch (error) {
|
|
179
182
|
rpcErrors.push(`${0 === rowNum ? "Header" : `Row ${rowNum}`}: ${toErrorMessage(error)}`);
|
|
180
183
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Range, isSessionTable } from "@vuu-ui/vuu-utils";
|
|
2
2
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { parseCsv } from "./parse/csv-parse.js";
|
|
4
|
-
import { validateCsvAgainstSchema } from "./parse/csv-schema-validation.js";
|
|
5
|
-
import {
|
|
4
|
+
import { CsvValidationErrorEnum, validateCsvAgainstSchema } from "./parse/csv-schema-validation.js";
|
|
5
|
+
import { createUploadError, hasFileParseErrors, isCsvParseError, mergeValidationWithParseErrors, toErrorMessage } from "./parse/csv-upload-utils.js";
|
|
6
6
|
import { useImportSchema } from "./session/useImportSchema.js";
|
|
7
7
|
import { useImportSession } from "./session/useImportSession.js";
|
|
8
8
|
const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importTable, onImportSessionEnded, onImportSessionReady, onError, onImported, onPreview, onProcessingStarted, maxRows, parseOptions, rowDefaults, validators })=>{
|
|
@@ -95,7 +95,22 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
|
|
|
95
95
|
sessionDataSource.range = Range(0, expectedRowCount);
|
|
96
96
|
const sessionErrors = await checkSessionTableErrors(sessionDataSource, expectedRowCount);
|
|
97
97
|
if (operationId !== operationIdRef.current) return;
|
|
98
|
-
if (sessionErrors.length > 0)
|
|
98
|
+
if (sessionErrors.length > 0) {
|
|
99
|
+
const serverValidationErrors = sessionErrors.map(({ rowNum, message })=>({
|
|
100
|
+
rowNum,
|
|
101
|
+
column: "*",
|
|
102
|
+
message,
|
|
103
|
+
value: "",
|
|
104
|
+
errorEnum: CsvValidationErrorEnum.CUSTOM_VALIDATION
|
|
105
|
+
}));
|
|
106
|
+
setValidation((prev)=>prev ? {
|
|
107
|
+
...prev,
|
|
108
|
+
errors: [
|
|
109
|
+
...prev.errors,
|
|
110
|
+
...serverValidationErrors
|
|
111
|
+
]
|
|
112
|
+
} : void 0);
|
|
113
|
+
}
|
|
99
114
|
onImportSessionReady?.(sessionDataSource);
|
|
100
115
|
} catch (error) {
|
|
101
116
|
if (void 0 !== sessionDataSourceRef.current) await endEditSessionAndNotify(false, "failed");
|
|
@@ -20,7 +20,11 @@ export type RpcBatchResult = {
|
|
|
20
20
|
results: unknown[];
|
|
21
21
|
};
|
|
22
22
|
export declare const executeBatchRpcCalls: <T>(items: T[], executor: (item: T) => Promise<unknown>, errorFormatter: (item: T, error: string) => string) => Promise<RpcBatchResult>;
|
|
23
|
+
export type SessionRowError = {
|
|
24
|
+
rowNum: number;
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
23
27
|
export type SessionRowUpdateListener = () => void;
|
|
24
28
|
export declare const getInlineRowErrorMessage: (result: unknown) => string | undefined;
|
|
25
|
-
export declare const getRowVuuMsgError: (row: DataSourceRow, vuuMsgDataIndex: number, vuuRowNumDataIndex: number) =>
|
|
26
|
-
export declare const waitForSessionErrors: (isRemote: boolean, sessionErrors: Map<string | number,
|
|
29
|
+
export declare const getRowVuuMsgError: (row: DataSourceRow, vuuMsgDataIndex: number, vuuRowNumDataIndex: number) => SessionRowError | undefined;
|
|
30
|
+
export declare const waitForSessionErrors: (isRemote: boolean, sessionErrors: Map<string | number, SessionRowError>, receivedRowKeys: Set<string | number>, expectedRowCount: number, listeners: Set<SessionRowUpdateListener>, timeoutMs?: number) => Promise<SessionRowError[]>;
|
|
@@ -2,6 +2,7 @@ import type { DataSource, SessionDataSourceOverrides } from "@vuu-ui/vuu-data-ty
|
|
|
2
2
|
import { EditSession, type RowDefaultDataItemValues } from "@vuu-ui/vuu-data-editing";
|
|
3
3
|
import { type RefObject } from "react";
|
|
4
4
|
import type { CsvValidationResult } from "../parse/csv-schema-validation";
|
|
5
|
+
import { type SessionRowError } from "../parse/csv-upload-utils";
|
|
5
6
|
import type { CsvUploadSessionEndReason, CsvUploadSessionEndResult, CsvUploadSessionTable } from "../CsvUpload";
|
|
6
7
|
export interface UseImportSessionProps {
|
|
7
8
|
dataSource: DataSource;
|
|
@@ -13,7 +14,7 @@ export interface UseImportSessionProps {
|
|
|
13
14
|
export interface UseImportSessionReturn {
|
|
14
15
|
addAllRows: (mergedValidation: CsvValidationResult, isCancelled: () => boolean) => Promise<number | false>;
|
|
15
16
|
beginEditSession: () => Promise<DataSource>;
|
|
16
|
-
checkSessionTableErrors: (sessionDs: DataSource, expectedRowCount: number) => Promise<
|
|
17
|
+
checkSessionTableErrors: (sessionDs: DataSource, expectedRowCount: number) => Promise<SessionRowError[]>;
|
|
17
18
|
closePendingEditSession: (save: boolean) => Promise<void>;
|
|
18
19
|
editSession: EditSession;
|
|
19
20
|
endEditSessionAndNotify: (save: boolean, reason: CsvUploadSessionEndReason) => Promise<void>;
|