@vuu-ui/vuu-table-extras 3.4.0 → 3.4.1

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 (93) hide show
  1. package/package.json +12 -12
  2. package/src/csv-export/export-utils.js +66 -19
  3. package/src/csv-export/index.js +1 -1
  4. package/src/csv-export/useCsvExport.js +9 -1
  5. package/types/csv-export/export-utils.d.ts +22 -9
  6. package/types/csv-export/index.d.ts +1 -1
  7. package/types/csv-export/useCsvExport.d.ts +5 -2
  8. package/types/inline-add-row/useInlineAddRow.d.ts +2 -1
  9. package/types/src/calculated-column/CalculatedColumnPanel.d.ts +12 -0
  10. package/types/src/calculated-column/useCalculatedColumnPanel.d.ts +10 -0
  11. package/types/src/calculated-column/useEditCalculatedColumn.d.ts +13 -0
  12. package/types/src/cell-edit-validators/CaseValidator.d.ts +2 -0
  13. package/types/src/cell-edit-validators/PatternValidator.d.ts +2 -0
  14. package/types/src/cell-edit-validators/index.d.ts +2 -0
  15. package/types/src/cell-renderers/background-cell/BackgroundCell.d.ts +2 -0
  16. package/types/src/cell-renderers/background-cell/BackgroundCellConfigurationEditor.d.ts +2 -0
  17. package/types/src/cell-renderers/background-cell/index.d.ts +2 -0
  18. package/types/src/cell-renderers/background-cell/useDirection.d.ts +3 -0
  19. package/types/src/cell-renderers/button-cell/IconButtonCell.d.ts +6 -0
  20. package/types/src/cell-renderers/dropdown-cell/DropdownCell.d.ts +2 -0
  21. package/types/src/cell-renderers/dropdown-cell/index.d.ts +1 -0
  22. package/types/src/cell-renderers/index.d.ts +6 -0
  23. package/types/src/cell-renderers/lookup-cell/LookupCell.d.ts +2 -0
  24. package/types/src/cell-renderers/lookup-cell/index.d.ts +1 -0
  25. package/types/src/cell-renderers/pct-progress-cell/PctProgressCell.d.ts +2 -0
  26. package/types/src/cell-renderers/pct-progress-cell/index.d.ts +1 -0
  27. package/types/src/cell-renderers/progress-cell/ProgressCell.d.ts +1 -0
  28. package/types/src/cell-renderers/progress-cell/index.d.ts +1 -0
  29. package/types/src/column-expression-input/ColumnExpressionInput.d.ts +10 -0
  30. package/types/src/column-expression-input/column-function-descriptors.d.ts +15 -0
  31. package/types/src/column-expression-input/column-language-parser/ColumnExpressionLanguage.d.ts +2 -0
  32. package/types/src/column-expression-input/column-language-parser/ColumnExpressionTreeWalker.d.ts +57 -0
  33. package/types/src/column-expression-input/column-language-parser/column-expression-parse-utils.d.ts +5 -0
  34. package/types/src/column-expression-input/column-language-parser/generated/column-parser.d.ts +2 -0
  35. package/types/src/column-expression-input/column-language-parser/generated/column-parser.terms.d.ts +1 -0
  36. package/types/src/column-expression-input/column-language-parser/index.d.ts +3 -0
  37. package/types/src/column-expression-input/column-language-parser/test.d.mts +1 -0
  38. package/types/src/column-expression-input/functionDocInfo.d.ts +2 -0
  39. package/types/src/column-expression-input/highlighting.d.ts +1 -0
  40. package/types/src/column-expression-input/index.d.ts +4 -0
  41. package/types/src/column-expression-input/theme.d.ts +1 -0
  42. package/types/src/column-expression-input/useColumnAutoComplete.d.ts +6 -0
  43. package/types/src/column-expression-input/useColumnExpressionEditor.d.ts +25 -0
  44. package/types/src/column-expression-input/useColumnExpressionSuggestionProvider.d.ts +8 -0
  45. package/types/src/column-formatting-settings/BaseNumericFormattingSettings.d.ts +2 -0
  46. package/types/src/column-formatting-settings/ColumnFormattingPanel.d.ts +9 -0
  47. package/types/src/column-formatting-settings/DateTimeFormattingSettings.d.ts +3 -0
  48. package/types/src/column-formatting-settings/LongTypeFormattingSettings.d.ts +3 -0
  49. package/types/src/column-formatting-settings/index.d.ts +3 -0
  50. package/types/src/column-menu/ColumnMenu.d.ts +10 -0
  51. package/types/src/column-menu/column-action-types.d.ts +11 -0
  52. package/types/src/column-menu/column-menu-utils.d.ts +19 -0
  53. package/types/src/column-menu/useColumnActions.d.ts +16 -0
  54. package/types/src/column-picker/ColumnModel.d.ts +81 -0
  55. package/types/src/column-picker/ColumnPicker.d.ts +10 -0
  56. package/types/src/column-picker/ColumnPickerAction.d.ts +5 -0
  57. package/types/src/column-picker/useColumnPicker.d.ts +16 -0
  58. package/types/src/column-picker/useTableColumnPicker.d.ts +7 -0
  59. package/types/src/column-picker/useTableColumnPickerDeprecated.d.ts +14 -0
  60. package/types/src/column-settings-panel/ColumnNameLabel.d.ts +7 -0
  61. package/types/src/column-settings-panel/ColumnSettingsPanel.d.ts +5 -0
  62. package/types/src/column-settings-panel/useColumnSettings.d.ts +30 -0
  63. package/types/src/csv-export/export-utils.d.ts +42 -0
  64. package/types/src/csv-export/index.d.ts +2 -0
  65. package/types/src/csv-export/useCsvExport.d.ts +14 -0
  66. package/types/src/csv-upload/CsvUpload.d.ts +69 -0
  67. package/types/src/csv-upload/data-upload-preview/DataUploadPreview.d.ts +10 -0
  68. package/types/src/csv-upload/data-upload-preview/useDataUploadPreview.d.ts +17 -0
  69. package/types/src/csv-upload/index.d.ts +7 -0
  70. package/types/src/csv-upload/parse/csv-constants.d.ts +3 -0
  71. package/types/src/csv-upload/parse/csv-errors.d.ts +47 -0
  72. package/types/src/csv-upload/parse/csv-parse.d.ts +11 -0
  73. package/types/src/csv-upload/parse/csv-schema-validation.d.ts +18 -0
  74. package/types/src/csv-upload/parse/csv-upload-utils.d.ts +21 -0
  75. package/types/src/csv-upload/parse/index.d.ts +5 -0
  76. package/types/src/csv-upload/useCsvUpload.d.ts +43 -0
  77. package/types/src/datasource-stats/DatasourceStats.d.ts +17 -0
  78. package/types/src/datasource-stats/useDatasourceStats.d.ts +15 -0
  79. package/types/src/freeze-control/FreezeControl.d.ts +15 -0
  80. package/types/src/freeze-control/FrozenBanner.d.ts +6 -0
  81. package/types/src/freeze-control/freezeControlBadge.d.ts +11 -0
  82. package/types/src/freeze-control/useFreezeControl.d.ts +10 -0
  83. package/types/src/index.d.ts +26 -0
  84. package/types/src/inline-add-row/InlineAddRow.d.ts +3 -0
  85. package/types/src/inline-add-row/index.d.ts +2 -0
  86. package/types/src/inline-add-row/useInlineAddRow.d.ts +59 -0
  87. package/types/src/tabbed-table-config-panel/TabbedTableConfigPanel.d.ts +17 -0
  88. package/types/src/tabbed-table-config-panel/TabbedTableSettingsAction.d.ts +7 -0
  89. package/types/src/tabbed-table-config-panel/useTabbedTableConfigPanel.d.ts +13 -0
  90. package/types/src/table-footer/TableFooter.d.ts +10 -0
  91. package/types/src/table-provider/TableProvider.d.ts +18 -0
  92. package/types/src/table-settings-panel/TableSettingsPanel.d.ts +22 -0
  93. package/types/src/table-settings-panel/useTableSettings.d.ts +14 -0
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.4.0",
2
+ "version": "3.4.1",
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.4.0",
15
- "@vuu-ui/vuu-protocol-types": "3.4.0"
14
+ "@vuu-ui/vuu-filter-types": "3.4.1",
15
+ "@vuu-ui/vuu-protocol-types": "3.4.1"
16
16
  },
17
17
  "dependencies": {
18
- "@vuu-ui/vuu-codemirror": "3.4.0",
19
- "@vuu-ui/vuu-data-editing": "3.4.0",
20
- "@vuu-ui/vuu-data-react": "3.4.0",
21
- "@vuu-ui/vuu-data-types": "3.4.0",
22
- "@vuu-ui/vuu-table-types": "3.4.0",
23
- "@vuu-ui/vuu-popups": "3.4.0",
24
- "@vuu-ui/vuu-table": "3.4.0",
25
- "@vuu-ui/vuu-utils": "3.4.0",
26
- "@vuu-ui/vuu-ui-controls": "3.4.0",
18
+ "@vuu-ui/vuu-codemirror": "3.4.1",
19
+ "@vuu-ui/vuu-data-editing": "3.4.1",
20
+ "@vuu-ui/vuu-data-react": "3.4.1",
21
+ "@vuu-ui/vuu-data-types": "3.4.1",
22
+ "@vuu-ui/vuu-table-types": "3.4.1",
23
+ "@vuu-ui/vuu-popups": "3.4.1",
24
+ "@vuu-ui/vuu-table": "3.4.1",
25
+ "@vuu-ui/vuu-utils": "3.4.1",
26
+ "@vuu-ui/vuu-ui-controls": "3.4.1",
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",
@@ -1,4 +1,4 @@
1
- import { Range, isSessionTable, metadataKeys } from "@vuu-ui/vuu-utils";
1
+ import { Range, buildColumnMap, getValueFormatter, isSessionTable, metadataKeys } from "@vuu-ui/vuu-utils";
2
2
  const EXPORT_EXCLUDED_COLUMNS = new Set([
3
3
  "vuuMsg",
4
4
  "vuuAction",
@@ -28,10 +28,31 @@ const triggerCsvDownload = (csv, filename)=>{
28
28
  document.body.removeChild(a);
29
29
  setTimeout(()=>URL.revokeObjectURL(url), 10000);
30
30
  };
31
+ const createRowAccessor = (row, columnMap)=>new Proxy({}, {
32
+ get (_, prop) {
33
+ if ("string" == typeof prop) {
34
+ const idx = columnMap[prop];
35
+ if (void 0 !== idx) return row[idx];
36
+ }
37
+ },
38
+ has (_, prop) {
39
+ return "string" == typeof prop && void 0 !== columnMap[prop];
40
+ }
41
+ });
42
+ const isExportableColumn = (descriptor)=>{
43
+ if (!descriptor) return true;
44
+ if (false === descriptor.exportable) return false;
45
+ if (descriptor.hidden) return false;
46
+ if (descriptor.isSystemColumn) return false;
47
+ if (true === descriptor.exportable) return true;
48
+ if ("client" === descriptor.source && !descriptor.exportFormatter) return false;
49
+ return true;
50
+ };
31
51
  const exportCsvTemplate = async (dataSource, options = {})=>{
32
52
  const { filename = "template.csv", excludeColumns = [], columns, overrides, timeout = DEFAULT_TEMPLATE_TIMEOUT, onError, onSuccess } = options;
33
- const sessionOverrides = overrides ?? (columns ? {
34
- columns
53
+ const targetColumnNames = columns ? columns.filter((col)=>"string" == typeof col ? true : isExportableColumn(col) && "client" !== col.source).map((col)=>"string" == typeof col ? col : col.name) : void 0;
54
+ const sessionOverrides = overrides ?? (targetColumnNames ? {
55
+ columns: targetColumnNames
35
56
  } : void 0);
36
57
  if (!isSessionTable(dataSource.table) && dataSource.createSessionDataSource && "initialising" !== dataSource.status && "unsubscribed" !== dataSource.status) try {
37
58
  const sessionDataSource = await dataSource.createSessionDataSource("Empty", "export", sessionOverrides);
@@ -72,7 +93,7 @@ const exportCsvTemplate = async (dataSource, options = {})=>{
72
93
  console.warn("[exportCsvTemplate] createSessionDataSource failed, falling back to tableSchema", error);
73
94
  }
74
95
  const schema = dataSource.tableSchema;
75
- const targetColumns = columns ?? overrides?.columns;
96
+ const targetColumns = targetColumnNames ?? overrides?.columns;
76
97
  if (void 0 !== targetColumns) {
77
98
  if (schema) {
78
99
  const schemaColumnNames = new Set(schema.columns.map((col)=>col.name));
@@ -99,7 +120,18 @@ const exportCsvTemplate = async (dataSource, options = {})=>{
99
120
  onSuccess?.();
100
121
  };
101
122
  const exportSessionTableToCsv = async (dataSource, options = {})=>{
102
- const { filename = "export.csv", copyOption = "All", excludeColumns = [], maxRows = MAX_EXPORT_ROWS, columnDescriptors, overrides, timeout = DEFAULT_EXPORT_TIMEOUT, onError, onSuccess } = options;
123
+ const { filename = "export.csv", copyOption = "All", excludeColumns = [], maxRows = MAX_EXPORT_ROWS, columnDescriptors: rawColumnDescriptors, columns: rawColumns, overrides, timeout = DEFAULT_EXPORT_TIMEOUT, onError, onSuccess } = options;
124
+ const rawInputColumns = rawColumns ?? rawColumnDescriptors;
125
+ const columnDescriptors = rawInputColumns?.map((col)=>"string" == typeof col ? {
126
+ name: col
127
+ } : col);
128
+ const sessionOverrides = overrides ? {
129
+ ...overrides,
130
+ columns: overrides.columns?.filter((name)=>{
131
+ const desc = columnDescriptors?.find((d)=>d.name === name);
132
+ return desc?.source !== "client";
133
+ })
134
+ } : void 0;
103
135
  const isRemote = !!dataSource.isRemote;
104
136
  if (isRemote && !isSessionTable(dataSource.table) && ("initialising" === dataSource.status || "unsubscribed" === dataSource.status)) {
105
137
  const error = new Error(`exportSessionTableToCsv: dataSource must be subscribed before exporting (current status: "${dataSource.status}")`);
@@ -108,7 +140,7 @@ const exportSessionTableToCsv = async (dataSource, options = {})=>{
108
140
  }
109
141
  let sessionDataSource;
110
142
  if (!isSessionTable(dataSource.table) && dataSource.createSessionDataSource) try {
111
- sessionDataSource = await dataSource.createSessionDataSource(copyOption, "export", overrides);
143
+ sessionDataSource = await dataSource.createSessionDataSource(copyOption, "export", sessionOverrides);
112
144
  } catch (err) {
113
145
  const error = err instanceof Error ? err : new Error(String(err));
114
146
  if (onError) return void onError(error);
@@ -152,18 +184,23 @@ const exportSessionTableToCsv = async (dataSource, options = {})=>{
152
184
  const { columns } = message;
153
185
  if (columnDescriptors) {
154
186
  const subscribedSet = new Set(columns);
155
- const unknown = columnDescriptors.filter((d)=>!excluded.has(d.name) && !subscribedSet.has(d.name)).map((d)=>d.name);
187
+ const unknown = columnDescriptors.filter((d)=>"client" !== d.source && !excluded.has(d.name) && !subscribedSet.has(d.name)).map((d)=>d.name);
156
188
  if (unknown.length > 0) return void fail(new Error(`exportToCsv: unknown column(s) in columnDescriptors: ${unknown.join(", ")}`));
157
189
  descriptorMap = Object.fromEntries(columnDescriptors.map((d)=>[
158
190
  d.name,
159
191
  d
160
192
  ]));
161
193
  }
162
- exportCols = columns.filter((name)=>!excluded.has(name));
163
- colNameToRowIdx = Object.fromEntries(columns.map((name, i)=>[
164
- name,
165
- metadataKeys.count + i
166
- ]));
194
+ if (rawColumns) exportCols = rawColumns.map((c)=>"string" == typeof c ? c : c.name).filter((name)=>!excluded.has(name) && isExportableColumn(descriptorMap[name]));
195
+ else if (columnDescriptors?.some((d)=>"client" === d.source)) {
196
+ const definedNames = new Set(columnDescriptors.map((d)=>d.name));
197
+ const remainingSubscribed = columns.filter((name)=>!excluded.has(name) && !definedNames.has(name) && isExportableColumn(descriptorMap[name]));
198
+ exportCols = [
199
+ ...columnDescriptors.filter((d)=>!excluded.has(d.name) && isExportableColumn(d)).map((d)=>d.name),
200
+ ...remainingSubscribed
201
+ ];
202
+ } else exportCols = columns.filter((name)=>!excluded.has(name) && isExportableColumn(descriptorMap[name]));
203
+ colNameToRowIdx = buildColumnMap(columns);
167
204
  } else if ("viewport-update" === message.type) {
168
205
  if ("size-only" === message.mode) {
169
206
  totalSize = message.size ?? 0;
@@ -191,11 +228,21 @@ const exportSessionTableToCsv = async (dataSource, options = {})=>{
191
228
  ];
192
229
  for(let i = 0; i < totalSize; i++){
193
230
  const row = collectedRows.get(i);
194
- if (row) lines.push(exportCols.map((c)=>{
195
- const raw = row[colNameToRowIdx[c]];
196
- const formatter = descriptorMap[c]?.exportFormatter;
197
- return csvCell(formatter ? formatter(raw) : raw);
198
- }).join(","));
231
+ if (row) {
232
+ const rowAccessor = createRowAccessor(row, colNameToRowIdx);
233
+ lines.push(exportCols.map((c)=>{
234
+ const descriptor = descriptorMap[c];
235
+ const isClientCol = descriptor?.source === "client";
236
+ const raw = isClientCol ? void 0 : void 0 !== colNameToRowIdx[c] ? row[colNameToRowIdx[c]] : void 0;
237
+ let formatted;
238
+ if (descriptor?.exportFormatter) formatted = descriptor.exportFormatter(raw, rowAccessor);
239
+ else if (descriptor && ("type" in descriptor || "serverDataType" in descriptor)) {
240
+ const tableFormatter = getValueFormatter(descriptor);
241
+ formatted = tableFormatter(raw);
242
+ } else formatted = raw;
243
+ return csvCell(formatted);
244
+ }).join(","));
245
+ }
199
246
  }
200
247
  triggerCsvDownload(lines.join("\r\n"), filename);
201
248
  onSuccess?.();
@@ -213,9 +260,9 @@ const exportSessionTableToCsv = async (dataSource, options = {})=>{
213
260
  };
214
261
  activeSessionDataSource.subscribe({
215
262
  range: Range(0, 0),
216
- columns: overrides?.columns
263
+ columns: sessionOverrides?.columns
217
264
  }, handleMessage);
218
265
  });
219
266
  };
220
267
  const exportToCsv = async (dataSource, options)=>exportSessionTableToCsv(dataSource, options);
221
- export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv };
268
+ export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv, isExportableColumn };
@@ -1,2 +1,2 @@
1
- export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv } from "./export-utils.js";
1
+ export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv, isExportableColumn } from "./export-utils.js";
2
2
  export { useCsvExport } from "./useCsvExport.js";
@@ -6,7 +6,7 @@ function useCsvExport(propsOrDataSource) {
6
6
  const config = propsOrDataSource && "table" in propsOrDataSource ? {
7
7
  dataSource: propsOrDataSource
8
8
  } : propsOrDataSource ?? {};
9
- const { dataSource: defaultDataSource, onError, onSuccess } = config;
9
+ const { dataSource: defaultDataSource, tableConfig, columns: defaultColumns, onError, onSuccess } = config;
10
10
  const exportCsv = useCallback(async (options, overrideDataSource)=>{
11
11
  const activeDataSource = overrideDataSource ?? defaultDataSource;
12
12
  if (!activeDataSource) {
@@ -19,7 +19,9 @@ function useCsvExport(propsOrDataSource) {
19
19
  setIsExporting(true);
20
20
  setError(null);
21
21
  try {
22
+ const columnsToExport = options?.columns ?? options?.columnDescriptors ?? defaultColumns ?? tableConfig?.columns;
22
23
  await exportToCsv(activeDataSource, {
24
+ columns: columnsToExport,
23
25
  ...options,
24
26
  onError: (err)=>{
25
27
  setError(err);
@@ -42,6 +44,8 @@ function useCsvExport(propsOrDataSource) {
42
44
  }
43
45
  }, [
44
46
  defaultDataSource,
47
+ defaultColumns,
48
+ tableConfig,
45
49
  onError,
46
50
  onSuccess
47
51
  ]);
@@ -57,7 +61,9 @@ function useCsvExport(propsOrDataSource) {
57
61
  setIsExporting(true);
58
62
  setError(null);
59
63
  try {
64
+ const templateColumns = options?.columns ?? defaultColumns ?? tableConfig?.columns;
60
65
  await exportCsvTemplate(activeDataSource, {
66
+ columns: templateColumns,
61
67
  ...options,
62
68
  onError: (err)=>{
63
69
  setError(err);
@@ -80,6 +86,8 @@ function useCsvExport(propsOrDataSource) {
80
86
  }
81
87
  }, [
82
88
  defaultDataSource,
89
+ defaultColumns,
90
+ tableConfig,
83
91
  onError,
84
92
  onSuccess
85
93
  ]);
@@ -1,16 +1,28 @@
1
1
  import type { CopyOption, DataSource, SessionDataSourceOverrides } from "@vuu-ui/vuu-data-types";
2
- export type ExportColumnDescriptor<TName extends string = string> = {
3
- name: TName;
4
- /** Override the column name used as the CSV header label. */
2
+ import type { ColumnDescriptor, RowAccessor } from "@vuu-ui/vuu-table-types";
3
+ export type { RowAccessor };
4
+ export type ExportServerColumnDescriptor = Omit<ColumnDescriptor, "source" | "exportFormatter"> & {
5
+ name: string;
6
+ source?: "server";
5
7
  label?: string;
6
- exportFormatter?: (value: unknown) => string;
8
+ exportable?: boolean;
9
+ exportFormatter?: (value: unknown, row: RowAccessor) => string;
7
10
  };
8
- export interface ExportToCsvOptions<TName extends string = string> {
11
+ export type ExportClientColumnDescriptor = Omit<ColumnDescriptor, "source" | "exportFormatter"> & {
12
+ name: string;
13
+ source: "client";
14
+ label?: string;
15
+ exportable?: boolean;
16
+ exportFormatter: (value: unknown, row: RowAccessor) => string;
17
+ };
18
+ export type ExportColumnDescriptor = ExportServerColumnDescriptor | ExportClientColumnDescriptor;
19
+ export interface ExportToCsvOptions {
9
20
  filename?: string;
10
21
  copyOption?: CopyOption;
11
22
  excludeColumns?: string[];
12
23
  maxRows?: number;
13
- columnDescriptors?: ExportColumnDescriptor<TName>[];
24
+ columnDescriptors?: readonly (ExportColumnDescriptor | ColumnDescriptor)[];
25
+ columns?: readonly (string | ExportColumnDescriptor | ColumnDescriptor)[];
14
26
  overrides?: SessionDataSourceOverrides;
15
27
  /** Timeout in milliseconds before the export times out. Default: 30_000ms (0 to disable). */
16
28
  timeout?: number;
@@ -20,13 +32,14 @@ export interface ExportToCsvOptions<TName extends string = string> {
20
32
  export interface ExportCsvTemplateOptions {
21
33
  filename?: string;
22
34
  excludeColumns?: string[];
23
- columns?: string[];
35
+ columns?: readonly (string | ColumnDescriptor)[];
24
36
  overrides?: SessionDataSourceOverrides;
25
37
  /** Timeout in milliseconds before template generation times out. Default: 10_000ms (0 to disable). */
26
38
  timeout?: number;
27
39
  onError?: (error: Error) => void;
28
40
  onSuccess?: () => void;
29
41
  }
42
+ export declare const isExportableColumn: (descriptor?: ExportColumnDescriptor | ColumnDescriptor) => boolean;
30
43
  /** Downloads a single-row CSV containing only the column headers, for use as an import template. */
31
44
  export declare const exportCsvTemplate: (dataSource: DataSource, options?: ExportCsvTemplateOptions) => Promise<void>;
32
45
  /**
@@ -35,8 +48,8 @@ export declare const exportCsvTemplate: (dataSource: DataSource, options?: Expor
35
48
  * then triggers a browser download. The session data source is unsubscribed automatically once the download
36
49
  * is initiated.
37
50
  */
38
- export declare const exportSessionTableToCsv: <TName extends string = string>(dataSource: DataSource, options?: ExportToCsvOptions<TName>) => Promise<void>;
51
+ export declare const exportSessionTableToCsv: (dataSource: DataSource, options?: ExportToCsvOptions) => Promise<void>;
39
52
  /**
40
53
  * Creates an export session table from `dataSource`, collects all rows in memory, then triggers a CSV download.
41
54
  */
42
- export declare const exportToCsv: <TName extends string = string>(dataSource: DataSource, options?: ExportToCsvOptions<TName>) => Promise<void>;
55
+ export declare const exportToCsv: (dataSource: DataSource, options?: ExportToCsvOptions) => Promise<void>;
@@ -1,2 +1,2 @@
1
- export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv, type ExportColumnDescriptor, type ExportCsvTemplateOptions, type ExportToCsvOptions, } from "./export-utils";
1
+ export { exportCsvTemplate, exportSessionTableToCsv, exportToCsv, isExportableColumn, type ExportClientColumnDescriptor, type ExportColumnDescriptor, type ExportCsvTemplateOptions, type ExportServerColumnDescriptor, type ExportToCsvOptions, type RowAccessor, } from "./export-utils";
2
2
  export { useCsvExport, type UseCsvExportProps, type UseCsvExportResult, } from "./useCsvExport";
@@ -1,14 +1,17 @@
1
1
  import type { DataSource } from "@vuu-ui/vuu-data-types";
2
- import { type ExportCsvTemplateOptions, type ExportToCsvOptions } from "./export-utils";
2
+ import type { ColumnDescriptor, TableConfig } from "@vuu-ui/vuu-table-types";
3
+ import { type ExportColumnDescriptor, type ExportCsvTemplateOptions, type ExportToCsvOptions } from "./export-utils";
3
4
  export interface UseCsvExportProps {
4
5
  dataSource?: DataSource;
6
+ tableConfig?: TableConfig;
7
+ columns?: readonly (string | ExportColumnDescriptor | ColumnDescriptor)[];
5
8
  onError?: (error: Error) => void;
6
9
  onSuccess?: () => void;
7
10
  }
8
11
  export interface UseCsvExportResult {
9
12
  isExporting: boolean;
10
13
  error: Error | null;
11
- exportCsv: <TName extends string = string>(options?: ExportToCsvOptions<TName>, overrideDataSource?: DataSource) => Promise<void>;
14
+ exportCsv: (options?: ExportToCsvOptions, overrideDataSource?: DataSource) => Promise<void>;
12
15
  exportTemplate: (options?: ExportCsvTemplateOptions, overrideDataSource?: DataSource) => Promise<void>;
13
16
  }
14
17
  export declare function useCsvExport(propsOrDataSource?: DataSource | UseCsvExportProps): UseCsvExportResult;
@@ -38,7 +38,8 @@ export declare const useInlineAddRow: ({ columns }: UseInlineAddRowProps) => {
38
38
  allowColumnHeaderMenu?: false;
39
39
  colHeaderContentRenderer?: string;
40
40
  colHeaderLabelRenderer?: string;
41
- exportFormatter?: (value: unknown) => string;
41
+ exportable?: boolean;
42
+ exportFormatter?: (value: unknown, row: import("@vuu-ui/vuu-table-types").RowAccessor) => string;
42
43
  getIcon?: (row: DataRow) => string | undefined;
43
44
  groupable?: boolean;
44
45
  hidden?: boolean;
@@ -0,0 +1,12 @@
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;
@@ -0,0 +1,10 @@
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
+ };
@@ -0,0 +1,13 @@
1
+ import { VuuTable } from "@vuu-ui/vuu-protocol-types";
2
+ import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
+ import { ColumnModel } from "../column-picker/ColumnModel";
4
+ export interface EditCalculatedColumnProps {
5
+ calculatedColumn?: ColumnDescriptor;
6
+ columnModel: ColumnModel;
7
+ onSaveColumn?: (caclulatedColumn: ColumnDescriptor) => void;
8
+ vuuTable?: VuuTable;
9
+ }
10
+ export declare const useEditCalculatedColumn: ({ calculatedColumn, columnModel, onSaveColumn, vuuTable, }: EditCalculatedColumnProps) => {
11
+ onCreateCalculatedColumn: () => void;
12
+ onEditCalculatedColumn: () => void;
13
+ };
@@ -0,0 +1,2 @@
1
+ import { EditRuleValidator } from "@vuu-ui/vuu-data-types";
2
+ export declare const CaseValidator: EditRuleValidator;
@@ -0,0 +1,2 @@
1
+ import { EditRuleValidator } from "@vuu-ui/vuu-data-types";
2
+ export declare const PatternValidator: EditRuleValidator;
@@ -0,0 +1,2 @@
1
+ export * from "./CaseValidator";
2
+ export * from "./PatternValidator";
@@ -0,0 +1,2 @@
1
+ import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
+ export declare const BackgroundCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react").JSX.Element>;
@@ -0,0 +1,2 @@
1
+ import { ConfigurationEditorProps } from "@vuu-ui/vuu-utils";
2
+ export declare const BackgroundCellConfigurationEditor: ({ column, onChangeRendering, }: ConfigurationEditorProps) => import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export * from "./BackgroundCell";
2
+ export * from "./BackgroundCellConfigurationEditor";
@@ -0,0 +1,3 @@
1
+ import { RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
2
+ import { valueChangeDirection } from "@vuu-ui/vuu-utils";
3
+ export declare function useDirection(key: string, value: unknown, column: RuntimeColumnDescriptor): valueChangeDirection;
@@ -0,0 +1,6 @@
1
+ import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
+ /**
3
+ * To assign an icon to the cell, give the columndescriptor
4
+ * a className. In css, assign an icon variable to --vuu-svg-icon.
5
+ */
6
+ export declare const IconButtonCell: ({ column, dataRow }: TableCellRendererProps) => import("react").JSX.Element;
@@ -0,0 +1,2 @@
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>;
@@ -0,0 +1 @@
1
+ export * from "./DropdownCell";
@@ -0,0 +1,6 @@
1
+ export * from "./background-cell";
2
+ export * from "./dropdown-cell";
3
+ export * from "./lookup-cell";
4
+ export * from "./pct-progress-cell";
5
+ export * from "./progress-cell";
6
+ export { IconButtonCell } from "./button-cell/IconButtonCell";
@@ -0,0 +1,2 @@
1
+ import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
+ export declare const LookupCell: import("react").MemoExoticComponent<({ column, dataRow, }: TableCellRendererProps) => import("react").JSX.Element>;
@@ -0,0 +1 @@
1
+ export * from "./LookupCell";
@@ -0,0 +1,2 @@
1
+ import { TableCellProps } from "@vuu-ui/vuu-table-types";
2
+ export declare const PctProgressCell: ({ column, dataRow }: TableCellProps) => import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./PctProgressCell";
@@ -0,0 +1 @@
1
+ export * from "./ProgressCell";
@@ -0,0 +1,10 @@
1
+ import { HTMLAttributes } from "react";
2
+ import { ColumnDefinitionExpression } from "./column-language-parser";
3
+ import { ExpressionSuggestionConsumer } from "./useColumnExpressionEditor";
4
+ export type ColumnExpressionSubmitHandler = (source: string, expression: ColumnDefinitionExpression | undefined) => void;
5
+ export interface ColumnExpressionInputProps extends ExpressionSuggestionConsumer, Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
6
+ onChange?: (source: string) => void;
7
+ onSubmitExpression?: ColumnExpressionSubmitHandler;
8
+ source?: string;
9
+ }
10
+ export declare const ColumnExpressionInput: import("react").MemoExoticComponent<({ onChange, onSubmitExpression, source, suggestionProvider, }: ColumnExpressionInputProps) => import("react").JSX.Element>;
@@ -0,0 +1,15 @@
1
+ export type ColumnFunctionDescriptor = {
2
+ accepts: "string" | "number" | "boolean" | "any" | Array<"string" | "number" | "boolean">;
3
+ description: string;
4
+ example: {
5
+ expression: string;
6
+ result: string;
7
+ };
8
+ name: string;
9
+ params: {
10
+ count?: number;
11
+ description: string;
12
+ };
13
+ type: "string" | "number" | "boolean" | "variable";
14
+ };
15
+ export declare const columnFunctionDescriptors: ColumnFunctionDescriptor[];
@@ -0,0 +1,2 @@
1
+ import { LanguageSupport } from "@vuu-ui/vuu-codemirror";
2
+ export declare const columnExpressionLanguageSupport: () => LanguageSupport;
@@ -0,0 +1,57 @@
1
+ import type { Tree } from "@vuu-ui/vuu-codemirror";
2
+ type expressionType = "arithmeticExpression" | "booleanCondition" | "booleanLiteralExpression" | "callExpression" | "colExpression" | "conditionalExpression" | "numericLiteralExpression" | "relationalExpression" | "stringLiteralExpression" | "unknown";
3
+ type arithmeticOp = "*" | "/" | "+" | "-" | "unknown";
4
+ type booleanOp = "and" | "or";
5
+ type relationalOp = "=" | "!=" | ">" | ">=" | "<" | "<=" | "unknown";
6
+ export interface Expression {
7
+ type: expressionType;
8
+ expressions?: Expression[];
9
+ toJSON?: () => unknown;
10
+ value?: string | number | boolean;
11
+ }
12
+ interface BooleanLiteralExpression {
13
+ type: "booleanLiteralExpression";
14
+ value: boolean;
15
+ }
16
+ interface NumericLiteralExpression {
17
+ type: "numericLiteralExpression";
18
+ value: number;
19
+ }
20
+ interface StringLiteralExpression {
21
+ type: "stringLiteralExpression";
22
+ value: string;
23
+ }
24
+ interface ArithmeticExpression extends Expression {
25
+ expressions: [Expression, Expression];
26
+ op: arithmeticOp;
27
+ type: "arithmeticExpression";
28
+ }
29
+ interface BooleanCondition extends Expression {
30
+ expressions: Expression[];
31
+ op: booleanOp;
32
+ type: "booleanCondition";
33
+ }
34
+ interface RelationalExpression extends Expression {
35
+ expressions: Expression[];
36
+ op: relationalOp;
37
+ type: "relationalExpression";
38
+ }
39
+ interface ColExpression extends Expression {
40
+ column?: string;
41
+ type: "colExpression";
42
+ }
43
+ interface CallExpression extends Expression {
44
+ arguments: Expression[];
45
+ functionName?: string;
46
+ type: "callExpression";
47
+ }
48
+ type ConditionExpression = RelationalExpression | BooleanCondition;
49
+ interface ConditionalExpression extends Expression {
50
+ type: "conditionalExpression";
51
+ condition: ConditionExpression;
52
+ truthyExpression: Expression;
53
+ falsyExpression: Expression;
54
+ }
55
+ export type ColumnDefinitionExpression = ArithmeticExpression | BooleanLiteralExpression | CallExpression | ColExpression | ConditionalExpression | NumericLiteralExpression | StringLiteralExpression;
56
+ export declare const walkTree: (tree: Tree, source: string) => ColumnDefinitionExpression;
57
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { SyntaxNode } from "@vuu-ui/vuu-codemirror";
2
+ export declare const ColumnNamedTerms: readonly string[];
3
+ export declare const isCompleteExpression: (src: string) => boolean;
4
+ export declare const lastNamedChild: (node: SyntaxNode) => SyntaxNode | null;
5
+ export declare const isCompleteRelationalExpression: (node?: SyntaxNode) => boolean;
@@ -0,0 +1,2 @@
1
+ import { LRParser } from "@lezer/lr";
2
+ export declare const parser: LRParser;
@@ -0,0 +1 @@
1
+ export declare const ColumnDefinitionExpression = 1, Column = 2, Number = 3, String = 4, True = 5, False = 6, ParenthesizedExpression = 7, OpenBrace = 8, CloseBrace = 9, ArithmeticExpression = 10, Divide = 11, Times = 12, Plus = 13, Minus = 14, ConditionalExpression = 15, If = 16, RelationalExpression = 17, RelationalOperator = 18, AndCondition = 19, OrCondition = 20, Comma = 21, CallExpression = 22, Function = 23, ArgList = 24;
@@ -0,0 +1,3 @@
1
+ export * from "./ColumnExpressionLanguage";
2
+ export * from "./ColumnExpressionTreeWalker";
3
+ export * from "./column-expression-parse-utils";
@@ -0,0 +1 @@
1
+ export declare const walkTree: (tree: any, source: any) => void;
@@ -0,0 +1,2 @@
1
+ import { ColumnFunctionDescriptor } from "./column-function-descriptors";
2
+ export declare const functionDocInfo: ({ name, description, example, params, type, }: ColumnFunctionDescriptor) => HTMLElement;
@@ -0,0 +1 @@
1
+ export declare const vuuHighlighting: import("@codemirror/state").Extension;
@@ -0,0 +1,4 @@
1
+ export * from "./ColumnExpressionInput";
2
+ export * from "./column-language-parser";
3
+ export * from "./useColumnExpressionEditor";
4
+ export * from "./useColumnExpressionSuggestionProvider";
@@ -0,0 +1 @@
1
+ export declare const vuuTheme: import("@codemirror/state").Extension;
@@ -0,0 +1,6 @@
1
+ import { type CompletionSource } from "@vuu-ui/vuu-codemirror";
2
+ import { type RefObject } from "react";
3
+ import type { IExpressionSuggestionProvider } from "./useColumnExpressionEditor";
4
+ export type ApplyCompletion = (mode?: "add" | "replace") => void;
5
+ export type Operator = "";
6
+ export declare const useColumnAutoComplete: (suggestionProvider: IExpressionSuggestionProvider, onSubmit: RefObject<ApplyCompletion>) => CompletionSource;
@@ -0,0 +1,25 @@
1
+ import { Completion } from "@vuu-ui/vuu-codemirror";
2
+ import { FocusEventHandler } from "react";
3
+ import { ColumnExpressionInputProps } from "./ColumnExpressionInput";
4
+ export type ColumnExpressionOperator = "Times" | "Divide" | "Minus" | "Plus";
5
+ export type ColumnExpressionSuggestionType = "column" | "columnValue" | "expression" | "condition-operator" | "operator" | "relational-operator";
6
+ export type ColumnExpressionSuggestionOptions = {
7
+ columnName?: string;
8
+ functionName?: string;
9
+ operator?: ColumnExpressionOperator;
10
+ prefix?: string;
11
+ startsWith?: string;
12
+ selection?: string[];
13
+ };
14
+ export interface IExpressionSuggestionProvider {
15
+ getSuggestions: (valueType: ColumnExpressionSuggestionType, options?: ColumnExpressionSuggestionOptions) => Promise<Completion[]>;
16
+ isPartialMatch: (valueType: ColumnExpressionSuggestionType, columnName?: string, text?: string | undefined) => Promise<boolean>;
17
+ }
18
+ export interface ExpressionSuggestionConsumer {
19
+ suggestionProvider: IExpressionSuggestionProvider;
20
+ }
21
+ export declare const useColumnExpressionEditor: ({ onChange, onSubmitExpression, source, suggestionProvider, }: ColumnExpressionInputProps) => {
22
+ editorRef: import("react").RefObject<HTMLDivElement | null>;
23
+ clearInput: () => void;
24
+ onBlur: FocusEventHandler;
25
+ };