@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 CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.4",
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.4",
15
- "@vuu-ui/vuu-protocol-types": "3.5.4"
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.4",
19
- "@vuu-ui/vuu-data-editing": "3.5.4",
20
- "@vuu-ui/vuu-data-react": "3.5.4",
21
- "@vuu-ui/vuu-data-types": "3.5.4",
22
- "@vuu-ui/vuu-table-types": "3.5.4",
23
- "@vuu-ui/vuu-popups": "3.5.4",
24
- "@vuu-ui/vuu-table": "3.5.4",
25
- "@vuu-ui/vuu-utils": "3.5.4",
26
- "@vuu-ui/vuu-ui-controls": "3.5.4",
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 `Row ${rowNum}: ${msg}`;
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) rpcErrors.push(`${0 === rowNum ? "Header" : `Row ${rowNum}`}: ${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 { buildRowErrorMessage, createUploadError, hasFileParseErrors, isCsvParseError, mergeValidationWithParseErrors, toErrorMessage } from "./parse/csv-upload-utils.js";
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) throw Error(buildRowErrorMessage("Import failed", sessionErrors));
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) => string | undefined;
26
- export declare const waitForSessionErrors: (isRemote: boolean, sessionErrors: Map<string | number, string>, receivedRowKeys: Set<string | number>, expectedRowCount: number, listeners: Set<SessionRowUpdateListener>, timeoutMs?: number) => Promise<string[]>;
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<string[]>;
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>;