@vuu-ui/vuu-table-extras 4.0.0-alpha.20 → 4.0.0-alpha.22

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 (132) hide show
  1. package/package.json +16 -17
  2. package/src/cell-renderers/pct-progress-cell/PctProgressCell.css.js +2 -2
  3. package/src/cell-renderers/progress-cell/ProgressCell.css.js +2 -2
  4. package/src/column-expression-input/ColumnExpressionInput.css.js +5 -5
  5. package/src/column-expression-input/theme.js +1 -1
  6. package/src/column-settings-panel/ColumnNameLabel.css.js +1 -1
  7. package/src/csv-export/export-utils.js +13 -4
  8. package/src/csv-upload/CsvUpload.css.js +7 -7
  9. package/src/csv-upload/parse/csv-upload-utils.js +47 -2
  10. package/src/csv-upload/session/index.js +2 -0
  11. package/src/csv-upload/session/useImportSchema.js +44 -0
  12. package/src/csv-upload/session/useImportSession.js +204 -0
  13. package/src/csv-upload/useCsvUpload.js +45 -188
  14. package/src/freeze-control/FreezeControl.css.js +4 -4
  15. package/src/freeze-control/FrozenBanner.css.js +2 -2
  16. package/types/calculated-column/CalculatedColumnPanel.d.ts +1 -1
  17. package/types/cell-renderers/background-cell/BackgroundCell.d.ts +1 -1
  18. package/types/cell-renderers/background-cell/BackgroundCellConfigurationEditor.d.ts +1 -1
  19. package/types/cell-renderers/button-cell/IconButtonCell.d.ts +1 -1
  20. package/types/cell-renderers/dropdown-cell/DropdownCell.d.ts +1 -1
  21. package/types/cell-renderers/lookup-cell/LookupCell.d.ts +1 -1
  22. package/types/cell-renderers/pct-progress-cell/PctProgressCell.d.ts +1 -1
  23. package/types/column-expression-input/ColumnExpressionInput.d.ts +1 -1
  24. package/types/column-expression-input/column-language-parser/test.d.mts +1 -1
  25. package/types/column-formatting-settings/BaseNumericFormattingSettings.d.ts +1 -1
  26. package/types/column-formatting-settings/ColumnFormattingPanel.d.ts +1 -1
  27. package/types/column-formatting-settings/LongTypeFormattingSettings.d.ts +1 -2
  28. package/types/column-menu/ColumnMenu.d.ts +1 -1
  29. package/types/column-picker/ColumnPickerAction.d.ts +1 -1
  30. package/types/column-settings-panel/ColumnNameLabel.d.ts +1 -1
  31. package/types/column-settings-panel/ColumnSettingsPanel.d.ts +1 -1
  32. package/types/csv-upload/CsvUpload.d.ts +1 -1
  33. package/types/csv-upload/data-upload-preview/DataUploadPreview.d.ts +1 -1
  34. package/types/csv-upload/parse/csv-upload-utils.d.ts +9 -0
  35. package/types/csv-upload/session/index.d.ts +2 -0
  36. package/types/csv-upload/session/useImportSchema.d.ts +13 -0
  37. package/types/csv-upload/session/useImportSession.d.ts +26 -0
  38. package/types/csv-upload/useCsvUpload.d.ts +1 -1
  39. package/types/datasource-stats/DatasourceStats.d.ts +1 -1
  40. package/types/freeze-control/FreezeControl.d.ts +1 -1
  41. package/types/freeze-control/FrozenBanner.d.ts +1 -1
  42. package/types/inline-add-row/InlineAddRow.d.ts +1 -1
  43. package/types/tabbed-table-config-panel/TabbedTableConfigPanel.d.ts +1 -1
  44. package/types/tabbed-table-config-panel/TabbedTableSettingsAction.d.ts +1 -1
  45. package/types/table-footer/TableFooter.d.ts +2 -2
  46. package/types/table-provider/TableProvider.d.ts +1 -1
  47. package/types/table-settings-panel/TableSettingsPanel.d.ts +1 -1
  48. package/types/src/calculated-column/CalculatedColumnPanel.d.ts +0 -12
  49. package/types/src/calculated-column/useCalculatedColumnPanel.d.ts +0 -10
  50. package/types/src/calculated-column/useEditCalculatedColumn.d.ts +0 -13
  51. package/types/src/cell-edit-validators/CaseValidator.d.ts +0 -2
  52. package/types/src/cell-edit-validators/PatternValidator.d.ts +0 -2
  53. package/types/src/cell-edit-validators/index.d.ts +0 -2
  54. package/types/src/cell-renderers/background-cell/BackgroundCell.d.ts +0 -2
  55. package/types/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.d.ts +0 -2
  56. package/types/src/cell-renderers/background-cell/index.d.ts +0 -2
  57. package/types/src/cell-renderers/background-cell/useDirection.d.ts +0 -3
  58. package/types/src/cell-renderers/button-cell/IconButtonCell.d.ts +0 -6
  59. package/types/src/cell-renderers/dropdown-cell/DropdownCell.d.ts +0 -2
  60. package/types/src/cell-renderers/dropdown-cell/index.d.ts +0 -1
  61. package/types/src/cell-renderers/index.d.ts +0 -6
  62. package/types/src/cell-renderers/lookup-cell/LookupCell.d.ts +0 -2
  63. package/types/src/cell-renderers/lookup-cell/index.d.ts +0 -1
  64. package/types/src/cell-renderers/pct-progress-cell/PctProgressCell.d.ts +0 -2
  65. package/types/src/cell-renderers/pct-progress-cell/index.d.ts +0 -1
  66. package/types/src/cell-renderers/progress-cell/ProgressCell.d.ts +0 -1
  67. package/types/src/cell-renderers/progress-cell/index.d.ts +0 -1
  68. package/types/src/column-expression-input/ColumnExpressionInput.d.ts +0 -10
  69. package/types/src/column-expression-input/column-function-descriptors.d.ts +0 -15
  70. package/types/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.d.ts +0 -2
  71. package/types/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.d.ts +0 -57
  72. package/types/src/column-expression-input/column-language-parser/column-expression-parse-utils.d.ts +0 -5
  73. package/types/src/column-expression-input/column-language-parser/generated/column-parser.d.ts +0 -2
  74. package/types/src/column-expression-input/column-language-parser/generated/column-parser.terms.d.ts +0 -1
  75. package/types/src/column-expression-input/column-language-parser/index.d.ts +0 -3
  76. package/types/src/column-expression-input/column-language-parser/test.d.mts +0 -1
  77. package/types/src/column-expression-input/functionDocInfo.d.ts +0 -2
  78. package/types/src/column-expression-input/highlighting.d.ts +0 -1
  79. package/types/src/column-expression-input/index.d.ts +0 -4
  80. package/types/src/column-expression-input/theme.d.ts +0 -1
  81. package/types/src/column-expression-input/useColumnAutoComplete.d.ts +0 -6
  82. package/types/src/column-expression-input/useColumnExpressionEditor.d.ts +0 -25
  83. package/types/src/column-expression-input/useColumnExpressionSuggestionProvider.d.ts +0 -8
  84. package/types/src/column-formatting-settings/BaseNumericFormattingSettings.d.ts +0 -2
  85. package/types/src/column-formatting-settings/ColumnFormattingPanel.d.ts +0 -9
  86. package/types/src/column-formatting-settings/DateTimeFormattingSettings.d.ts +0 -3
  87. package/types/src/column-formatting-settings/LongTypeFormattingSettings.d.ts +0 -3
  88. package/types/src/column-formatting-settings/index.d.ts +0 -3
  89. package/types/src/column-menu/ColumnMenu.d.ts +0 -10
  90. package/types/src/column-menu/column-action-types.d.ts +0 -11
  91. package/types/src/column-menu/column-menu-utils.d.ts +0 -19
  92. package/types/src/column-menu/useColumnActions.d.ts +0 -16
  93. package/types/src/column-picker/ColumnModel.d.ts +0 -81
  94. package/types/src/column-picker/ColumnPicker.d.ts +0 -10
  95. package/types/src/column-picker/ColumnPickerAction.d.ts +0 -5
  96. package/types/src/column-picker/useColumnPicker.d.ts +0 -16
  97. package/types/src/column-picker/useTableColumnPicker.d.ts +0 -7
  98. package/types/src/column-picker/useTableColumnPickerDeprecated.d.ts +0 -14
  99. package/types/src/column-settings-panel/ColumnNameLabel.d.ts +0 -7
  100. package/types/src/column-settings-panel/ColumnSettingsPanel.d.ts +0 -5
  101. package/types/src/column-settings-panel/useColumnSettings.d.ts +0 -30
  102. package/types/src/csv-export/export-utils.d.ts +0 -42
  103. package/types/src/csv-export/index.d.ts +0 -2
  104. package/types/src/csv-export/useCsvExport.d.ts +0 -14
  105. package/types/src/csv-upload/CsvUpload.d.ts +0 -69
  106. package/types/src/csv-upload/data-upload-preview/DataUploadPreview.d.ts +0 -10
  107. package/types/src/csv-upload/data-upload-preview/useDataUploadPreview.d.ts +0 -17
  108. package/types/src/csv-upload/index.d.ts +0 -7
  109. package/types/src/csv-upload/parse/csv-constants.d.ts +0 -3
  110. package/types/src/csv-upload/parse/csv-errors.d.ts +0 -47
  111. package/types/src/csv-upload/parse/csv-parse.d.ts +0 -11
  112. package/types/src/csv-upload/parse/csv-schema-validation.d.ts +0 -18
  113. package/types/src/csv-upload/parse/csv-upload-utils.d.ts +0 -21
  114. package/types/src/csv-upload/parse/index.d.ts +0 -5
  115. package/types/src/csv-upload/useCsvUpload.d.ts +0 -43
  116. package/types/src/datasource-stats/DatasourceStats.d.ts +0 -17
  117. package/types/src/datasource-stats/useDatasourceStats.d.ts +0 -15
  118. package/types/src/freeze-control/FreezeControl.d.ts +0 -15
  119. package/types/src/freeze-control/FrozenBanner.d.ts +0 -6
  120. package/types/src/freeze-control/freezeControlBadge.d.ts +0 -11
  121. package/types/src/freeze-control/useFreezeControl.d.ts +0 -10
  122. package/types/src/index.d.ts +0 -26
  123. package/types/src/inline-add-row/InlineAddRow.d.ts +0 -3
  124. package/types/src/inline-add-row/index.d.ts +0 -2
  125. package/types/src/inline-add-row/useInlineAddRow.d.ts +0 -59
  126. package/types/src/tabbed-table-config-panel/TabbedTableConfigPanel.d.ts +0 -17
  127. package/types/src/tabbed-table-config-panel/TabbedTableSettingsAction.d.ts +0 -7
  128. package/types/src/tabbed-table-config-panel/useTabbedTableConfigPanel.d.ts +0 -13
  129. package/types/src/table-footer/TableFooter.d.ts +0 -10
  130. package/types/src/table-provider/TableProvider.d.ts +0 -18
  131. package/types/src/table-settings-panel/TableSettingsPanel.d.ts +0 -22
  132. package/types/src/table-settings-panel/useTableSettings.d.ts +0 -14
@@ -1,203 +1,36 @@
1
- import { EditSession } from "@vuu-ui/vuu-data-editing";
2
- import { Range, isRpcError, isSessionTable, useData } from "@vuu-ui/vuu-utils";
3
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
1
+ import { Range, isSessionTable } from "@vuu-ui/vuu-utils";
2
+ import { useCallback, useMemo, useRef, useState } from "react";
4
3
  import { parseCsv } from "./parse/csv-parse.js";
5
- import { validateCsvAgainstSchema } from "./parse/csv-schema-validation.js";
6
- import { buildRowErrorMessage, createUploadError, hasFileParseErrors, isCsvParseError, mergeValidationWithParseErrors, toErrorMessage } from "./parse/csv-upload-utils.js";
7
- import { CSV_FIRST_DATA_ROW_NUMBER } from "./parse/csv-constants.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
+ import { useImportSchema } from "./session/useImportSchema.js";
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 })=>{
9
- const { getServerAPI } = useData();
10
9
  const [validation, setValidation] = useState();
11
- const [sessionTable, setSessionTable] = useState();
12
10
  const [isProcessingFile, setIsProcessingFile] = useState(false);
13
11
  const [isImporting, setIsImporting] = useState(false);
14
- const [fetchedImportSchema, setFetchedImportSchema] = useState();
15
12
  const [error, setError] = useState();
13
+ const operationIdRef = useRef(0);
14
+ const processingPromiseRef = useRef(void 0);
16
15
  const handleError = useCallback((errResult)=>{
17
16
  setError(errResult);
18
17
  onError?.(errResult);
19
18
  }, [
20
19
  onError
21
20
  ]);
22
- useEffect(()=>{
23
- if (importSchema || void 0 === importTable) return void setFetchedImportSchema(void 0);
24
- let cancelled = false;
25
- (async ()=>{
26
- try {
27
- const server = await getServerAPI();
28
- const tableSchema = await server.getTableSchema(importTable);
29
- if (!cancelled) setFetchedImportSchema(tableSchema);
30
- } catch (error) {
31
- console.error("[useCsvUpload] failed to fetch import table schema", error);
32
- }
33
- })();
34
- return ()=>{
35
- cancelled = true;
36
- };
37
- }, [
38
- getServerAPI,
21
+ const { schema, sessionOverrides } = useImportSchema({
22
+ dataSource,
39
23
  importSchema,
40
24
  importTable
41
- ]);
42
- const resolvedImportSchema = importSchema ?? fetchedImportSchema;
43
- const sessionOverrides = useMemo(()=>{
44
- const columns = resolvedImportSchema?.columns.map(({ name })=>name);
45
- return columns || importTable ? {
46
- columns,
47
- table: importTable
48
- } : void 0;
49
- }, [
50
- resolvedImportSchema,
51
- importTable
52
- ]);
53
- const importDataSource = useMemo(()=>({
54
- tableSchema: dataSource.tableSchema,
55
- createSessionDataSource: async (copyOption, sessionType)=>{
56
- if (!dataSource.createSessionDataSource) throw Error("[useCsvUpload] dataSource does not support createSessionDataSource");
57
- const sessionDs = await dataSource.createSessionDataSource(copyOption, sessionType, sessionOverrides);
58
- if (!sessionDs) throw Error("[useCsvUpload] Failed to create session datasource");
59
- if (!sessionDs.columns.includes("vuuMsg")) sessionDs.columns = sessionDs.columns.concat("vuuMsg");
60
- if (sessionDs.isRemote) return new Promise((resolve, reject)=>{
61
- const handleSubscribed = ()=>{
62
- sessionDs.removeListener("subscribed", handleSubscribed);
63
- resolve(sessionDs);
64
- };
65
- sessionDs.on("subscribed", handleSubscribed);
66
- try {
67
- sessionDs.subscribe({
68
- range: Range(0, 0)
69
- }, ()=>{});
70
- } catch (err) {
71
- sessionDs.removeListener("subscribed", handleSubscribed);
72
- reject(err);
73
- }
74
- });
75
- return sessionDs;
76
- }
77
- }), [
25
+ });
26
+ const { addAllRows, beginEditSession, checkSessionTableErrors, closePendingEditSession, editSession, endEditSessionAndNotify, releaseEditSessionOwnership, sessionDataSourceRef, sessionTable, setActiveSessionDataSource } = useImportSession({
78
27
  dataSource,
79
- sessionOverrides
80
- ]);
81
- const editSession = useMemo(()=>new EditSession({
82
- dataSource: importDataSource,
83
- editSessionApi: "createSessionDataSource",
84
- rowDefaults
85
- }), [
86
- importDataSource,
87
- rowDefaults
88
- ]);
89
- const ownsEditSessionRef = useRef(true);
90
- const operationIdRef = useRef(0);
91
- const processingPromiseRef = useRef(void 0);
92
- const sessionDataSourceRef = useRef(void 0);
93
- useEffect(()=>()=>{
94
- operationIdRef.current++;
95
- const processingPromise = processingPromiseRef.current;
96
- (async ()=>{
97
- try {
98
- await processingPromise;
99
- } finally{
100
- if (ownsEditSessionRef.current) try {
101
- await editSession.end(false);
102
- } catch (error) {
103
- console.error("[useCsvUpload] failed to discard edit session during cleanup", error);
104
- }
105
- }
106
- })();
107
- }, [
108
- editSession
109
- ]);
110
- const setActiveSessionDataSource = useCallback((sessionDataSource)=>{
111
- sessionDataSourceRef.current = sessionDataSource;
112
- const table = sessionDataSource?.table;
113
- setSessionTable(table && isSessionTable(table) ? table : void 0);
114
- }, []);
115
- const endEditSessionAndNotify = useCallback(async (save, reason)=>{
116
- const sessionDataSource = sessionDataSourceRef.current;
117
- if (!sessionDataSource) throw Error("CsvUpload has no active edit session.");
118
- if (!sessionDataSource.endEditSession) throw Error("CsvUpload requires the session datasource to support endEditSession.");
119
- const currentSessionTable = sessionDataSource.table;
120
- try {
121
- await editSession.end(save);
122
- } finally{
123
- if ("unsubscribed" !== sessionDataSource.status && "function" == typeof sessionDataSource.unsubscribe) sessionDataSource.unsubscribe();
124
- setActiveSessionDataSource(void 0);
125
- }
126
- onImportSessionEnded?.({
127
- reason,
128
- sessionTable: currentSessionTable && isSessionTable(currentSessionTable) ? currentSessionTable : void 0
129
- });
130
- }, [
131
- editSession,
132
- onImportSessionEnded,
133
- setActiveSessionDataSource
134
- ]);
28
+ sessionOverrides,
29
+ rowDefaults,
30
+ processingPromiseRef,
31
+ onImportSessionEnded
32
+ });
135
33
  const table = dataSource.table;
136
- const schema = importTable ? resolvedImportSchema : resolvedImportSchema ?? dataSource.tableSchema;
137
- const addAllRows = useCallback(async (mergedValidation, operationId)=>{
138
- const vuuMsgByRow = new Map();
139
- for (const { rowNum, column, message } of mergedValidation.errors){
140
- if (rowNum < CSV_FIRST_DATA_ROW_NUMBER) continue;
141
- const existing = vuuMsgByRow.get(rowNum);
142
- const columnError = `${column}: ${message}`;
143
- vuuMsgByRow.set(rowNum, existing ? `${existing}; ${columnError}` : columnError);
144
- }
145
- const parsedRowCount = mergedValidation.rows.length;
146
- const unparsedErrorRows = [
147
- ...vuuMsgByRow.keys()
148
- ].filter((rowNum)=>rowNum - CSV_FIRST_DATA_ROW_NUMBER >= parsedRowCount).map((rowNum)=>({
149
- rowNum,
150
- rowData: {},
151
- vuuMsg: vuuMsgByRow.get(rowNum) ?? ""
152
- }));
153
- const allRows = [
154
- ...mergedValidation.rows.map((rowData, idx)=>({
155
- rowNum: idx + CSV_FIRST_DATA_ROW_NUMBER,
156
- rowData: rowData ?? {},
157
- vuuMsg: vuuMsgByRow.get(idx + CSV_FIRST_DATA_ROW_NUMBER) ?? ""
158
- })),
159
- ...unparsedErrorRows
160
- ];
161
- const rpcErrors = [];
162
- for (const { rowNum, rowData, vuuMsg } of allRows){
163
- if (operationId !== operationIdRef.current) return false;
164
- try {
165
- const payload = vuuMsg ? {
166
- vuuRowNum: rowNum,
167
- vuuMsg
168
- } : {
169
- ...rowData,
170
- vuuRowNum: rowNum,
171
- vuuMsg
172
- };
173
- const result = await editSession.addRow(payload);
174
- if (isRpcError(result)) throw Error(result.errorMessage);
175
- if ("string" == typeof result) throw Error(result);
176
- } catch (error) {
177
- rpcErrors.push(`${0 === rowNum ? "Header" : `Row ${rowNum}`}: ${toErrorMessage(error)}`);
178
- }
179
- }
180
- if (rpcErrors.length > 0) throw Error(buildRowErrorMessage("Import failed", rpcErrors));
181
- return true;
182
- }, [
183
- editSession
184
- ]);
185
- const beginEditSession = useCallback(async ()=>{
186
- const sessionDataSource = await editSession.begin("Empty", "import");
187
- const sessionVuuTable = sessionDataSource?.table;
188
- if (void 0 === sessionDataSource || void 0 === sessionVuuTable || !isSessionTable(sessionVuuTable)) throw Error("CsvUpload createSessionDataSource returned no session datasource.");
189
- setActiveSessionDataSource(sessionDataSource);
190
- return sessionDataSource;
191
- }, [
192
- editSession,
193
- setActiveSessionDataSource
194
- ]);
195
- const closePendingEditSession = useCallback(async (save)=>{
196
- if (void 0 === sessionDataSourceRef.current) return;
197
- await endEditSessionAndNotify(save, save ? "saved" : "discarded");
198
- }, [
199
- endEditSessionAndNotify
200
- ]);
201
34
  const cancelImport = useCallback(async ()=>{
202
35
  operationIdRef.current++;
203
36
  processingPromiseRef.current = void 0;
@@ -256,8 +89,28 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
256
89
  if (mergedValidation.rows.length > 0) try {
257
90
  const sessionDataSource = await beginEditSession();
258
91
  if (operationId !== operationIdRef.current) return;
259
- const rowsAdded = await addAllRows(mergedValidation, operationId);
260
- if (!rowsAdded) return;
92
+ const rowsAddedCount = await addAllRows(mergedValidation, ()=>operationId !== operationIdRef.current);
93
+ if (false === rowsAddedCount) return;
94
+ const expectedRowCount = rowsAddedCount;
95
+ sessionDataSource.range = Range(0, expectedRowCount);
96
+ const sessionErrors = await checkSessionTableErrors(sessionDataSource, expectedRowCount);
97
+ if (operationId !== operationIdRef.current) return;
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
+ }
261
114
  onImportSessionReady?.(sessionDataSource);
262
115
  } catch (error) {
263
116
  if (void 0 !== sessionDataSourceRef.current) await endEditSessionAndNotify(false, "failed");
@@ -277,6 +130,7 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
277
130
  handleError,
278
131
  editSession,
279
132
  addAllRows,
133
+ checkSessionTableErrors,
280
134
  maxRows,
281
135
  parseOptions,
282
136
  beginEditSession,
@@ -287,7 +141,8 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
287
141
  endEditSessionAndNotify,
288
142
  schema,
289
143
  validators,
290
- onImportSessionReady
144
+ onImportSessionReady,
145
+ sessionDataSourceRef
291
146
  ]);
292
147
  const handleFiles = useCallback(async (files)=>{
293
148
  const file = files[0];
@@ -355,7 +210,7 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
355
210
  editSession,
356
211
  tableData
357
212
  });
358
- ownsEditSessionRef.current = false;
213
+ releaseEditSessionOwnership();
359
214
  } else {
360
215
  await endEditSessionAndNotify(true, "saved");
361
216
  onImported?.({
@@ -383,6 +238,8 @@ const useCsvUpload = ({ dataSource, importMode = "direct", importSchema, importT
383
238
  onImported,
384
239
  onPreview,
385
240
  importMode,
241
+ releaseEditSessionOwnership,
242
+ sessionDataSourceRef,
386
243
  validation
387
244
  ]);
388
245
  return {
@@ -1,8 +1,8 @@
1
1
  const css = `
2
2
  .vuuFreezeControl {
3
3
  --freeze-control-flash-duration: .25s;
4
- --freeze-control-active-button-color: var(--salt-palette-error-background);
5
- --freeze-control-badge-color: var(--salt-palette-success-background);
4
+ --freeze-control-active-button-color: var(--salt-status-error-background);
5
+ --freeze-control-badge-color: var(--salt-status-success-background);
6
6
  height: fit-content;
7
7
  display: inline-flex;
8
8
 
@@ -31,7 +31,7 @@ const css = `
31
31
 
32
32
  & .vuuFreezeControl-buttonWrapper-active .saltToggleButton {
33
33
  background-color: var(--freeze-control-active-button-color);
34
- color: var(--salt-actionable-secondary-foreground-active);
34
+ color: var(--salt-actionable-subtle-foreground-active);
35
35
  }
36
36
 
37
37
  & .saltToggleButtonGroup.vuuStateButtonGroup {
@@ -43,7 +43,7 @@ const css = `
43
43
  }
44
44
 
45
45
  & .vuuFreezeControl-customBadge {
46
- color: var(--salt-text-primary-foreground);
46
+ color: var(--salt-content-primary-foreground);
47
47
  font-size: var(--salt-text-fontSize);
48
48
  height: var(--salt-size-base);
49
49
  width: var(--salt-size-base);
@@ -1,8 +1,8 @@
1
1
  const css = `
2
2
  .FrozenBanner {
3
- --freeze-control-active-button-color: var(--salt-palette-error-background);
3
+ --freeze-control-active-button-color: var(--salt-status-error-background);
4
4
  background-color: var(--freeze-control-active-button-color);
5
- color: var(--salt-actionable-secondary-foreground-active);
5
+ color: var(--salt-actionable-subtle-foreground-active);
6
6
  font-size: var(--salt-text-fontSize);
7
7
  height: var(--salt-size-base);
8
8
  padding: 0 var(--salt-spacing-200);
@@ -9,4 +9,4 @@ export interface CalculatedColumnPanelProps extends HTMLAttributes<HTMLDivElemen
9
9
  onChangeServerDataType?: (name: VuuColumnDataType) => void;
10
10
  vuuTable: VuuTable;
11
11
  }
12
- export declare const CalculatedColumnPanel: ({ column: columnProp, columnModel, onChangeColumn, onChangeServerDataType: onChangeServerDataTypeProp, vuuTable, }: CalculatedColumnPanelProps) => import("react").JSX.Element;
12
+ export declare const CalculatedColumnPanel: ({ column: columnProp, columnModel, onChangeColumn, onChangeServerDataType: onChangeServerDataTypeProp, vuuTable, }: CalculatedColumnPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
- export declare const BackgroundCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react").JSX.Element>;
2
+ export declare const BackgroundCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1,2 +1,2 @@
1
1
  import { ConfigurationEditorProps } from "@vuu-ui/vuu-utils";
2
- export declare const BackgroundCellConfigurationEditor: ({ column, onChangeRendering, }: ConfigurationEditorProps) => import("react").JSX.Element;
2
+ export declare const BackgroundCellConfigurationEditor: ({ column, onChangeRendering, }: ConfigurationEditorProps) => import("react/jsx-runtime").JSX.Element;
@@ -3,4 +3,4 @@ import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
3
3
  * To assign an icon to the cell, give the columndescriptor
4
4
  * a className. In css, assign an icon variable to --vuu-svg-icon.
5
5
  */
6
- export declare const IconButtonCell: ({ column, dataRow }: TableCellRendererProps) => import("react").JSX.Element;
6
+ export declare const IconButtonCell: ({ column, dataRow }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
- export declare const DropdownCell: import("react").MemoExoticComponent<({ column, dataRow, editedDuringCurrentSession, onEdit, }: TableCellRendererProps) => import("react").JSX.Element>;
2
+ export declare const DropdownCell: import("react").MemoExoticComponent<({ column, dataRow, editedDuringCurrentSession, onEdit, }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1,2 +1,2 @@
1
1
  import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
- export declare const LookupCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react").JSX.Element>;
2
+ export declare const LookupCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1,2 +1,2 @@
1
1
  import { TableCellProps } from "@vuu-ui/vuu-table-types";
2
- export declare const PctProgressCell: ({ column, dataRow }: TableCellProps) => import("react").JSX.Element;
2
+ export declare const PctProgressCell: ({ column, dataRow }: TableCellProps) => import("react/jsx-runtime").JSX.Element;
@@ -7,4 +7,4 @@ export interface ColumnExpressionInputProps extends ExpressionSuggestionConsumer
7
7
  onSubmitExpression?: ColumnExpressionSubmitHandler;
8
8
  source?: string;
9
9
  }
10
- export declare const ColumnExpressionInput: import("react").MemoExoticComponent<({ onChange, onSubmitExpression, source, suggestionProvider, }: ColumnExpressionInputProps) => import("react").JSX.Element>;
10
+ export declare const ColumnExpressionInput: import("react").MemoExoticComponent<({ onChange, onSubmitExpression, source, suggestionProvider, }: ColumnExpressionInputProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1 +1 @@
1
- export function walkTree(tree: any, source: any): void;
1
+ export declare const walkTree: (tree: any, source: any) => void;
@@ -1,2 +1,2 @@
1
1
  import { FormattingSettingsProps } from "@vuu-ui/vuu-table-types";
2
- export declare const BaseNumericFormattingSettings: ({ column, onChangeFormatting: onChange, }: FormattingSettingsProps) => import("react").JSX.Element;
2
+ export declare const BaseNumericFormattingSettings: ({ column, onChangeFormatting: onChange, }: FormattingSettingsProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,4 +6,4 @@ export interface ColumnFormattingPanelProps extends HTMLAttributes<HTMLDivElemen
6
6
  column: ColumnDescriptor;
7
7
  onChangeRendering: (renderProps: ColumnTypeRendering) => void;
8
8
  }
9
- export declare const ColumnFormattingPanel: ({ availableRenderers, className, column, onChangeFormatting, onChangeColumnType, onChangeRendering, ...htmlAttributes }: ColumnFormattingPanelProps) => import("react").JSX.Element;
9
+ export declare const ColumnFormattingPanel: ({ availableRenderers, className, column, onChangeFormatting, onChangeColumnType, onChangeRendering, ...htmlAttributes }: ColumnFormattingPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,2 @@
1
1
  import { FormattingSettingsProps } from "@vuu-ui/vuu-table-types";
2
- import React from "react";
3
- export declare const LongTypeFormattingSettings: (props: FormattingSettingsProps) => React.JSX.Element;
2
+ export declare const LongTypeFormattingSettings: (props: FormattingSettingsProps) => import("react/jsx-runtime").JSX.Element;
@@ -7,4 +7,4 @@ export interface ColumnMenuProps extends HTMLAttributes<HTMLSpanElement> {
7
7
  menuActionHandler?: MenuActionHandler<ColumnMenuActionType, ColumnDescriptor>;
8
8
  menuPermissions?: ColumnMenuPermissions;
9
9
  }
10
- export declare const ColumnMenu: ({ className, column, menuActionHandler: menuActionHandlerProp, menuPermissions: { allowSort, allowGroup, allowAggregation, allowHide, allowRemove, allowPin, }, }: ColumnMenuProps) => import("react").JSX.Element;
10
+ export declare const ColumnMenu: ({ className, column, menuActionHandler: menuActionHandlerProp, menuPermissions: { allowSort, allowGroup, allowAggregation, allowHide, allowRemove, allowPin, }, }: ColumnMenuProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,4 +2,4 @@ import { IconButtonProps } from "@vuu-ui/vuu-ui-controls";
2
2
  import { ColumnPickerHookProps } from "./useColumnPicker";
3
3
  export interface ColumnPickerActionProps extends Partial<IconButtonProps>, ColumnPickerHookProps {
4
4
  }
5
- export declare const ColumnPickerAction: ({ appearance, columnModel, icon, sentiment, ...IconButtonProps }: ColumnPickerActionProps) => import("react").JSX.Element;
5
+ export declare const ColumnPickerAction: ({ appearance, columnModel, icon, sentiment, ...IconButtonProps }: ColumnPickerActionProps) => import("react/jsx-runtime").JSX.Element;
@@ -4,4 +4,4 @@ export interface ColumnNameLabelProps {
4
4
  column: ColumnDescriptor;
5
5
  onClick?: MouseEventHandler;
6
6
  }
7
- export declare const ColumnNameLabel: ({ column, onClick }: ColumnNameLabelProps) => import("react").JSX.Element;
7
+ export declare const ColumnNameLabel: ({ column, onClick }: ColumnNameLabelProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,4 +2,4 @@ import { ColumnSettingsProps } from "./useColumnSettings";
2
2
  export interface ColumnSettinsPanelProps extends ColumnSettingsProps {
3
3
  onClickEditCalculatedColumn?: () => void;
4
4
  }
5
- export declare const ColumnSettingsPanel: ({ column: columnProp, columnModel, onClickEditCalculatedColumn, onConfigChange, }: ColumnSettinsPanelProps) => import("react").JSX.Element;
5
+ export declare const ColumnSettingsPanel: ({ column: columnProp, columnModel, onClickEditCalculatedColumn, onConfigChange, }: ColumnSettinsPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -62,4 +62,4 @@ export interface CsvUploadProps {
62
62
  rowDefaults?: RowDefaultDataItemValues;
63
63
  validators?: Record<string, CsvColumnValidator>;
64
64
  }
65
- export declare const CsvUpload: (props: CsvUploadProps) => import("react").JSX.Element;
65
+ export declare const CsvUpload: (props: CsvUploadProps) => import("react/jsx-runtime").JSX.Element;
@@ -7,4 +7,4 @@ export interface DataUploadPreviewProps extends Omit<HTMLAttributes<HTMLDivEleme
7
7
  saveLabel?: string;
8
8
  tableSchema: TableSchema;
9
9
  }
10
- export declare const DataUploadPreview: ({ className, editSession, onClose, saveLabel, tableSchema, ...htmlAttributes }: DataUploadPreviewProps) => import("react").JSX.Element;
10
+ export declare const DataUploadPreview: ({ className, editSession, onClose, saveLabel, tableSchema, ...htmlAttributes }: DataUploadPreviewProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,5 @@
1
1
  import type { VuuRowDataItemType } from "@vuu-ui/vuu-protocol-types";
2
+ import type { DataSourceRow } from "@vuu-ui/vuu-data-types";
2
3
  import type { CsvUploadError } from "../CsvUpload";
3
4
  import type { CsvParseError } from "./csv-parse";
4
5
  import type { CsvValidationError, CsvValidationResult } from "./csv-schema-validation";
@@ -19,3 +20,11 @@ export type RpcBatchResult = {
19
20
  results: unknown[];
20
21
  };
21
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
+ };
27
+ export type SessionRowUpdateListener = () => void;
28
+ export declare const getInlineRowErrorMessage: (result: unknown) => string | undefined;
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[]>;
@@ -0,0 +1,2 @@
1
+ export * from "./useImportSchema";
2
+ export * from "./useImportSession";
@@ -0,0 +1,13 @@
1
+ import type { DataSource, SessionDataSourceOverrides, TableSchema } from "@vuu-ui/vuu-data-types";
2
+ import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
+ export interface UseImportSchemaProps {
4
+ dataSource: DataSource;
5
+ importSchema?: TableSchema;
6
+ importTable?: VuuTable;
7
+ }
8
+ export interface UseImportSchemaResult {
9
+ resolvedImportSchema: TableSchema | undefined;
10
+ schema: TableSchema | undefined;
11
+ sessionOverrides: SessionDataSourceOverrides | undefined;
12
+ }
13
+ export declare const useImportSchema: ({ dataSource, importSchema, importTable, }: UseImportSchemaProps) => UseImportSchemaResult;
@@ -0,0 +1,26 @@
1
+ import type { DataSource, SessionDataSourceOverrides } from "@vuu-ui/vuu-data-types";
2
+ import { EditSession, type RowDefaultDataItemValues } from "@vuu-ui/vuu-data-editing";
3
+ import { type RefObject } from "react";
4
+ import type { CsvValidationResult } from "../parse/csv-schema-validation";
5
+ import { type SessionRowError } from "../parse/csv-upload-utils";
6
+ import type { CsvUploadSessionEndReason, CsvUploadSessionEndResult, CsvUploadSessionTable } from "../CsvUpload";
7
+ export interface UseImportSessionProps {
8
+ dataSource: DataSource;
9
+ sessionOverrides?: SessionDataSourceOverrides;
10
+ rowDefaults?: RowDefaultDataItemValues;
11
+ processingPromiseRef?: RefObject<Promise<void> | undefined>;
12
+ onImportSessionEnded?: (result: CsvUploadSessionEndResult) => void;
13
+ }
14
+ export interface UseImportSessionReturn {
15
+ addAllRows: (mergedValidation: CsvValidationResult, isCancelled: () => boolean) => Promise<number | false>;
16
+ beginEditSession: () => Promise<DataSource>;
17
+ checkSessionTableErrors: (sessionDs: DataSource, expectedRowCount: number) => Promise<SessionRowError[]>;
18
+ closePendingEditSession: (save: boolean) => Promise<void>;
19
+ editSession: EditSession;
20
+ endEditSessionAndNotify: (save: boolean, reason: CsvUploadSessionEndReason) => Promise<void>;
21
+ releaseEditSessionOwnership: () => void;
22
+ sessionDataSourceRef: React.MutableRefObject<DataSource | undefined>;
23
+ sessionTable: CsvUploadSessionTable | undefined;
24
+ setActiveSessionDataSource: (sessionDataSource?: DataSource) => void;
25
+ }
26
+ export declare const useImportSession: ({ dataSource, sessionOverrides, rowDefaults, processingPromiseRef, onImportSessionEnded, }: UseImportSessionProps) => UseImportSessionReturn;
@@ -1,5 +1,5 @@
1
1
  import type { DataSource, TableSchema } from "@vuu-ui/vuu-data-types";
2
- import { type RowDefaultDataItemValues } from "@vuu-ui/vuu-data-editing";
2
+ import type { RowDefaultDataItemValues } from "@vuu-ui/vuu-data-editing";
3
3
  import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
4
4
  import { type CsvParseOptions } from "./parse/csv-parse";
5
5
  import { type CsvValidationResult, type CsvColumnValidator } from "./parse/csv-schema-validation";
@@ -14,4 +14,4 @@ export interface DataSourceStatsProps extends DatasourceStatsHookProps, Omit<HTM
14
14
  selectionActions?: ReactNode;
15
15
  tooltrayActions?: ReactNode;
16
16
  }
17
- export declare const DataSourceStats: ({ children, className, dataSource, showRowStats, tooltrayActions, ...htmlAttributes }: DataSourceStatsProps) => import("react").JSX.Element;
17
+ export declare const DataSourceStats: ({ children, className, dataSource, showRowStats, tooltrayActions, ...htmlAttributes }: DataSourceStatsProps) => import("react/jsx-runtime").JSX.Element;
@@ -12,4 +12,4 @@ export interface FreezeControlProps extends HTMLAttributes<HTMLDivElement>, Free
12
12
  */
13
13
  flashDuration?: number;
14
14
  }
15
- export declare const FreezeControl: ({ dataSource, className, newItemsLabel, flashDuration, ...htmlAttributes }: FreezeControlProps) => import("react").JSX.Element;
15
+ export declare const FreezeControl: ({ dataSource, className, newItemsLabel, flashDuration, ...htmlAttributes }: FreezeControlProps) => import("react/jsx-runtime").JSX.Element;
@@ -3,4 +3,4 @@ import { DataSource } from "@vuu-ui/vuu-data-types";
3
3
  export interface FrozenBannerProps extends HTMLAttributes<HTMLDivElement> {
4
4
  dataSource: DataSource;
5
5
  }
6
- export declare const FrozenBanner: ({ dataSource, className, ...htmlAttributes }: FrozenBannerProps) => import("react").JSX.Element | null;
6
+ export declare const FrozenBanner: ({ dataSource, className, ...htmlAttributes }: FrozenBannerProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -1,3 +1,3 @@
1
1
  import type { BaseRowProps } from "@vuu-ui/vuu-table-types";
2
2
  export type InlineAddRowProps = BaseRowProps;
3
- export declare const InlineAddRow: ({ ariaRowIndex, className, columns, style, }: InlineAddRowProps) => import("react").JSX.Element;
3
+ export declare const InlineAddRow: ({ ariaRowIndex, className, columns, style, }: InlineAddRowProps) => import("react/jsx-runtime").JSX.Element;
@@ -13,5 +13,5 @@ export interface TabbedTableConfigPanelProps extends ColumnPickerProps, Pick<Tab
13
13
  selectedTab?: TabName;
14
14
  vuuTable?: VuuTable;
15
15
  }
16
- export declare const TabbedTableConfigPanel: ({ allowCreateCalculatedColumn, className, columnModel, config, onDisplayAttributeChange, selectedTab, vuuTable, ...htmlAttributes }: TabbedTableConfigPanelProps) => import("react").JSX.Element;
16
+ export declare const TabbedTableConfigPanel: ({ allowCreateCalculatedColumn, className, columnModel, config, onDisplayAttributeChange, selectedTab, vuuTable, ...htmlAttributes }: TabbedTableConfigPanelProps) => import("react/jsx-runtime").JSX.Element;
17
17
  export {};
@@ -4,4 +4,4 @@ import { TableDisplayAttributeChangeHandler } from "../table-settings-panel/Tabl
4
4
  export interface TabbedTableSettingsActionProps extends Partial<IconButtonProps>, TabbedTableConfigPanelHookProps {
5
5
  onDisplayAttributeChange: TableDisplayAttributeChangeHandler;
6
6
  }
7
- export declare const TabbedTableSettingsAction: ({ allowCreateCalculatedColumn, appearance, columnModel, config, icon, onDisplayAttributeChange, sentiment, vuuTable, ...IconButtonProps }: TabbedTableSettingsActionProps) => import("react").JSX.Element;
7
+ export declare const TabbedTableSettingsAction: ({ allowCreateCalculatedColumn, appearance, columnModel, config, icon, onDisplayAttributeChange, sentiment, vuuTable, ...IconButtonProps }: TabbedTableSettingsActionProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,5 +6,5 @@ export interface TableFooterProps extends HTMLAttributes<HTMLDivElement> {
6
6
  export declare const TableFooterTray: ({ children, position, }: {
7
7
  children: ReactNode;
8
8
  position?: "center" | "end";
9
- }) => import("react").JSX.Element;
10
- export declare const TableFooter: ({ children, className, onInvokeAction, tooltrayActions, ...htmlAttributes }: TableFooterProps) => import("react").JSX.Element;
9
+ }) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const TableFooter: ({ children, className, onInvokeAction, tooltrayActions, ...htmlAttributes }: TableFooterProps) => import("react/jsx-runtime").JSX.Element;
@@ -10,7 +10,7 @@ export interface TableContextProps extends Pick<TableProps, "dataSource" | "rowA
10
10
  export declare const TableContext: import("react").Context<TableContextProps>;
11
11
  export declare const TableProvider: ({ children, dataSource, menuActionHandler, rowActionHandlers, }: TableContextProps & {
12
12
  children: ReactNode;
13
- }) => import("react").JSX.Element;
13
+ }) => import("react/jsx-runtime").JSX.Element;
14
14
  export declare function useTableContext(throwIfNoDataSource?: boolean): {
15
15
  dataSource: DataSource;
16
16
  menuActionHandler: MenuActionHandler<ColumnMenuActionType, ColumnDescriptor>;
@@ -19,4 +19,4 @@ export interface TableSettingsPanelProps {
19
19
  It updates the settings in state locally and notifies caller of
20
20
  every change via onChange callback
21
21
  */
22
- export declare const TableSettingsPanel: ({ onDisplayAttributeChange, tableDisplayAttributes: tableDisplayAttributesProp, permissions: permissionsProp, }: TableSettingsPanelProps) => import("react").JSX.Element;
22
+ export declare const TableSettingsPanel: ({ onDisplayAttributeChange, tableDisplayAttributes: tableDisplayAttributesProp, permissions: permissionsProp, }: TableSettingsPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,12 +0,0 @@
1
- import { HTMLAttributes } from "react";
2
- import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
- import { VuuColumnDataType, VuuTable } from "@vuu-ui/vuu-protocol-types";
4
- import { ColumnModel } from "../column-picker/ColumnModel";
5
- export interface CalculatedColumnPanelProps extends HTMLAttributes<HTMLDivElement> {
6
- column: ColumnDescriptor;
7
- columnModel: ColumnModel;
8
- onChangeColumn: (column: ColumnDescriptor) => void;
9
- onChangeServerDataType?: (name: VuuColumnDataType) => void;
10
- vuuTable: VuuTable;
11
- }
12
- export declare const CalculatedColumnPanel: ({ column: columnProp, columnModel, onChangeColumn, onChangeServerDataType: onChangeServerDataTypeProp, vuuTable, }: CalculatedColumnPanelProps) => import("react").JSX.Element;
@@ -1,10 +0,0 @@
1
- import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
- import { FormEventHandler, SyntheticEvent } from "react";
3
- import { CalculatedColumnPanelProps } from "./CalculatedColumnPanel";
4
- export type ColumnExpressionHookProps = Pick<CalculatedColumnPanelProps, "column" | "onChangeColumn" | "onChangeServerDataType">;
5
- export declare const useCalculatedColumnPanel: ({ column: columnProp, onChangeColumn, onChangeServerDataType: onChangeServerDataTypeProp, }: ColumnExpressionHookProps) => {
6
- column: ColumnDescriptor;
7
- onChangeExpression: (value: string) => void;
8
- onChangeName: FormEventHandler;
9
- onChangeServerDataType: (_e: SyntheticEvent, [serverDataType]: string[]) => void;
10
- };