@vuu-ui/vuu-utils 0.8.60 → 0.8.62

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.
@@ -126,7 +126,7 @@ const hasGroupBy = (config) => config !== void 0 && config.groupBy !== void 0 &&
126
126
  const hasFilter = (config) => config?.filter !== void 0 && config.filter.filter.length > 0;
127
127
  const hasSort = (config) => config?.sort !== void 0 && Array.isArray(config.sort?.sortDefs) && config.sort.sortDefs.length > 0;
128
128
  const isTypeaheadSuggestionProvider = (source) => typeof source["getTypeaheadSuggestions"] === "function";
129
- const isTableSchema = (message) => message.type === "TABLE_META_RESP";
129
+ const isTableSchemaMessage = (message) => message.type === "TABLE_META_RESP";
130
130
  const isConnectionStatusMessage = (msg) => msg.type === "connection-status";
131
131
  const isConnectionQualityMetrics = (msg) => msg.type === "connection-metrics";
132
132
  const messageHasResult = (msg) => typeof msg.result !== "undefined";
@@ -169,7 +169,7 @@ exports.isConnectionStatusMessage = isConnectionStatusMessage;
169
169
  exports.isErrorResponse = isErrorResponse;
170
170
  exports.isFilterChanged = isFilterChanged;
171
171
  exports.isGroupByChanged = isGroupByChanged;
172
- exports.isTableSchema = isTableSchema;
172
+ exports.isTableSchemaMessage = isTableSchemaMessage;
173
173
  exports.isTypeaheadSuggestionProvider = isTypeaheadSuggestionProvider;
174
174
  exports.isViewportMessage = isViewportMessage;
175
175
  exports.messageHasResult = messageHasResult;
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-utils.js","sources":["../src/datasource-utils.ts"],"sourcesContent":["import {\n ConnectionQualityMetrics,\n ConnectionStatusMessage,\n DataSourceConfig,\n MenuRpcResponse,\n RpcResponse,\n TypeaheadSuggestionProvider,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n VuuUIMessageInTableMeta,\n VuuUIMessageOutViewport,\n WithFilter,\n WithFullConfig,\n WithGroupBy,\n WithSort,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n LinkDescriptorWithLabel,\n VuuFilter,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const NoFilter: VuuFilter = { filter: \"\" };\nexport const NoSort: VuuSort = { sortDefs: [] };\n\nexport const vanillaConfig: WithFullConfig = {\n aggregations: [],\n columns: [],\n filter: NoFilter,\n groupBy: [],\n sort: NoSort,\n};\n\nexport type DataSourceConfigChanges = {\n aggregationsChanged: boolean;\n columnsChanged: boolean;\n filterChanged: boolean;\n groupByChanged: boolean;\n sortChanged: boolean;\n visualLinkChanged: boolean;\n};\n\nexport type MaybeDataSourceConfigChanges = DataSourceConfigChanges & {\n noChanges: boolean;\n};\n\ntype DataConfigPredicate = (\n config: DataSourceConfig,\n newConfig: DataSourceConfig\n) => boolean;\n\nconst equivalentAggregations: DataConfigPredicate = (\n { aggregations: agg1 },\n { aggregations: agg2 }\n) =>\n (agg1 === undefined && agg2?.length === 0) ||\n (agg2 === undefined && agg1?.length === 0);\n\nconst equivalentColumns: DataConfigPredicate = (\n { columns: cols1 },\n { columns: cols2 }\n) =>\n (cols1 === undefined && cols2?.length === 0) ||\n (cols2 === undefined && cols1?.length === 0);\n\nconst equivalentFilter: DataConfigPredicate = (\n { filter: f1 },\n { filter: f2 }\n) =>\n (f1 === undefined && f2?.filter === \"\") ||\n (f2 === undefined && f1?.filter === \"\");\n\nconst equivalentGroupBy: DataConfigPredicate = (\n { groupBy: val1 },\n { groupBy: val2 }\n) =>\n (val1 === undefined && val2?.length === 0) ||\n (val2 === undefined && val1?.length === 0);\n\nconst equivalentSort: DataConfigPredicate = ({ sort: s1 }, { sort: s2 }) =>\n (s1 === undefined && s2?.sortDefs.length === 0) ||\n (s2 === undefined && s1?.sortDefs.length === 0);\n\nconst exactlyTheSame = (a: unknown, b: unknown) => {\n if (a === b) {\n return true;\n } else if (a === undefined && b === undefined) {\n return true;\n } else {\n return false;\n }\n};\n\nconst isAggregationsChanged: DataConfigPredicate = (config, newConfig) => {\n const { aggregations: agg1 } = config;\n const { aggregations: agg2 } = newConfig;\n if (exactlyTheSame(agg1, agg2) || equivalentAggregations(config, newConfig)) {\n return false;\n } else if (agg1 === undefined || agg2 === undefined) {\n return true;\n } else if (agg1.length !== agg2.length) {\n return true;\n }\n return agg1.some(\n ({ column, aggType }, i) =>\n column !== agg2[i].column || aggType !== agg2[i].aggType\n );\n};\n\nconst isColumnsChanged: DataConfigPredicate = (config, newConfig) => {\n const { columns: cols1 } = config;\n const { columns: cols2 } = newConfig;\n\n if (exactlyTheSame(cols1, cols2) || equivalentColumns(config, newConfig)) {\n return false;\n } else if (cols1 === undefined || cols2 === undefined) {\n return true;\n } else if (cols1?.length !== cols2?.length) {\n return true;\n }\n return cols1.some((column, i) => column !== cols2?.[i]);\n};\n\nexport const isFilterChanged: DataConfigPredicate = (c1, c2) => {\n if (equivalentFilter(c1, c2)) {\n return false;\n } else {\n return c1.filter?.filter !== c2.filter?.filter;\n }\n};\n\nexport const isGroupByChanged: DataConfigPredicate = (config, newConfig) => {\n const { groupBy: g1 } = config;\n const { groupBy: g2 } = newConfig;\n if (exactlyTheSame(g1, g2) || equivalentGroupBy(config, newConfig)) {\n return false;\n } else if (g1 === undefined || g2 === undefined) {\n return true;\n } else if (g1?.length !== g2?.length) {\n return true;\n }\n return g1.some((column, i) => column !== g2?.[i]);\n};\n\nconst isSortChanged: DataConfigPredicate = (config, newConfig) => {\n const { sort: s1 } = config;\n const { sort: s2 } = newConfig;\n if (exactlyTheSame(s1, s2) || equivalentSort(config, newConfig)) {\n return false;\n } else if (s1 === undefined || s2 === undefined) {\n return true;\n } else if (s1?.sortDefs.length !== s2?.sortDefs.length) {\n return true;\n }\n return s1.sortDefs.some(\n ({ column, sortType }, i) =>\n column !== s2.sortDefs[i].column || sortType !== s2.sortDefs[i].sortType\n );\n};\n\nconst isVisualLinkChanged: DataConfigPredicate = () => {\n // TODO\n return false;\n};\n\nexport const NO_CONFIG_CHANGES: MaybeDataSourceConfigChanges = {\n aggregationsChanged: false,\n columnsChanged: false,\n filterChanged: false,\n groupByChanged: false,\n noChanges: true,\n sortChanged: false,\n visualLinkChanged: false,\n};\n\nexport const isConfigChanged = (\n config: DataSourceConfig | undefined,\n newConfig: DataSourceConfig | undefined\n): MaybeDataSourceConfigChanges => {\n if (exactlyTheSame(config, newConfig)) {\n return NO_CONFIG_CHANGES;\n }\n\n if (config === undefined && newConfig == undefined) {\n return NO_CONFIG_CHANGES;\n } else if (config === undefined) {\n return isConfigChanged({}, newConfig);\n } else if (newConfig === undefined) {\n return isConfigChanged(config, {});\n }\n\n const aggregationsChanged = isAggregationsChanged(config, newConfig);\n const columnsChanged = isColumnsChanged(config, newConfig);\n const filterChanged = isFilterChanged(config, newConfig);\n const groupByChanged = isGroupByChanged(config, newConfig);\n const sortChanged = isSortChanged(config, newConfig);\n const visualLinkChanged = isVisualLinkChanged(config, newConfig);\n\n const noChanges = !(\n aggregationsChanged ||\n columnsChanged ||\n filterChanged ||\n groupByChanged ||\n sortChanged ||\n visualLinkChanged\n );\n\n return {\n aggregationsChanged,\n columnsChanged,\n filterChanged,\n groupByChanged,\n noChanges,\n sortChanged,\n visualLinkChanged,\n };\n};\n\nexport const hasGroupBy = (config?: DataSourceConfig): config is WithGroupBy =>\n config !== undefined &&\n config.groupBy !== undefined &&\n config.groupBy.length > 0;\n\nexport const hasFilter = (config?: DataSourceConfig): config is WithFilter =>\n config?.filter !== undefined && config.filter.filter.length > 0;\n\nexport const hasSort = (config?: DataSourceConfig): config is WithSort =>\n config?.sort !== undefined &&\n Array.isArray(config.sort?.sortDefs) &&\n config.sort.sortDefs.length > 0;\n\nexport const isTypeaheadSuggestionProvider = (\n source: unknown\n): source is TypeaheadSuggestionProvider =>\n typeof (source as TypeaheadSuggestionProvider)[\"getTypeaheadSuggestions\"] ===\n \"function\";\n\nexport const isTableSchema = (\n message: VuuUIMessageIn\n): message is VuuUIMessageInTableMeta => message.type === \"TABLE_META_RESP\";\n\nexport const isConnectionStatusMessage = (\n msg: object | ConnectionStatusMessage\n): msg is ConnectionStatusMessage =>\n (msg as ConnectionStatusMessage).type === \"connection-status\";\n\nexport const isConnectionQualityMetrics = (\n msg: object\n): msg is ConnectionQualityMetrics =>\n (msg as ConnectionQualityMetrics).type === \"connection-metrics\";\n\nexport const messageHasResult = (msg: object): msg is VuuUIMessageInRPC =>\n typeof (msg as VuuUIMessageInRPC).result !== \"undefined\";\n\nexport const isErrorResponse = (\n response?: RpcResponse\n): response is VuuUIMessageInRPCEditReject =>\n response !== undefined && \"error\" in response;\n\nexport const hasAction = (\n response?: RpcResponse\n): response is MenuRpcResponse | VuuUIMessageInRPCEditResponse =>\n response != undefined && \"action\" in response;\n\nexport const isViewportMessage = (\n msg: object\n): msg is VuuUIMessageOutViewport => \"viewport\" in msg;\n\nexport const withConfigDefaults = (\n config: DataSourceConfig\n): WithFullConfig & { visualLink?: LinkDescriptorWithLabel } => {\n if (\n config.aggregations &&\n config.columns &&\n config.filter &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datasource-utils.js","sources":["../src/datasource-utils.ts"],"sourcesContent":["import {\n ConnectionQualityMetrics,\n ConnectionStatusMessage,\n DataSourceConfig,\n MenuRpcResponse,\n RpcResponse,\n TypeaheadSuggestionProvider,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n VuuUIMessageInTableMeta,\n VuuUIMessageOutViewport,\n WithFilter,\n WithFullConfig,\n WithGroupBy,\n WithSort,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n LinkDescriptorWithLabel,\n VuuFilter,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const NoFilter: VuuFilter = { filter: \"\" };\nexport const NoSort: VuuSort = { sortDefs: [] };\n\nexport const vanillaConfig: WithFullConfig = {\n aggregations: [],\n columns: [],\n filter: NoFilter,\n groupBy: [],\n sort: NoSort,\n};\n\nexport type DataSourceConfigChanges = {\n aggregationsChanged: boolean;\n columnsChanged: boolean;\n filterChanged: boolean;\n groupByChanged: boolean;\n sortChanged: boolean;\n visualLinkChanged: boolean;\n};\n\nexport type MaybeDataSourceConfigChanges = DataSourceConfigChanges & {\n noChanges: boolean;\n};\n\ntype DataConfigPredicate = (\n config: DataSourceConfig,\n newConfig: DataSourceConfig\n) => boolean;\n\nconst equivalentAggregations: DataConfigPredicate = (\n { aggregations: agg1 },\n { aggregations: agg2 }\n) =>\n (agg1 === undefined && agg2?.length === 0) ||\n (agg2 === undefined && agg1?.length === 0);\n\nconst equivalentColumns: DataConfigPredicate = (\n { columns: cols1 },\n { columns: cols2 }\n) =>\n (cols1 === undefined && cols2?.length === 0) ||\n (cols2 === undefined && cols1?.length === 0);\n\nconst equivalentFilter: DataConfigPredicate = (\n { filter: f1 },\n { filter: f2 }\n) =>\n (f1 === undefined && f2?.filter === \"\") ||\n (f2 === undefined && f1?.filter === \"\");\n\nconst equivalentGroupBy: DataConfigPredicate = (\n { groupBy: val1 },\n { groupBy: val2 }\n) =>\n (val1 === undefined && val2?.length === 0) ||\n (val2 === undefined && val1?.length === 0);\n\nconst equivalentSort: DataConfigPredicate = ({ sort: s1 }, { sort: s2 }) =>\n (s1 === undefined && s2?.sortDefs.length === 0) ||\n (s2 === undefined && s1?.sortDefs.length === 0);\n\nconst exactlyTheSame = (a: unknown, b: unknown) => {\n if (a === b) {\n return true;\n } else if (a === undefined && b === undefined) {\n return true;\n } else {\n return false;\n }\n};\n\nconst isAggregationsChanged: DataConfigPredicate = (config, newConfig) => {\n const { aggregations: agg1 } = config;\n const { aggregations: agg2 } = newConfig;\n if (exactlyTheSame(agg1, agg2) || equivalentAggregations(config, newConfig)) {\n return false;\n } else if (agg1 === undefined || agg2 === undefined) {\n return true;\n } else if (agg1.length !== agg2.length) {\n return true;\n }\n return agg1.some(\n ({ column, aggType }, i) =>\n column !== agg2[i].column || aggType !== agg2[i].aggType\n );\n};\n\nconst isColumnsChanged: DataConfigPredicate = (config, newConfig) => {\n const { columns: cols1 } = config;\n const { columns: cols2 } = newConfig;\n\n if (exactlyTheSame(cols1, cols2) || equivalentColumns(config, newConfig)) {\n return false;\n } else if (cols1 === undefined || cols2 === undefined) {\n return true;\n } else if (cols1?.length !== cols2?.length) {\n return true;\n }\n return cols1.some((column, i) => column !== cols2?.[i]);\n};\n\nexport const isFilterChanged: DataConfigPredicate = (c1, c2) => {\n if (equivalentFilter(c1, c2)) {\n return false;\n } else {\n return c1.filter?.filter !== c2.filter?.filter;\n }\n};\n\nexport const isGroupByChanged: DataConfigPredicate = (config, newConfig) => {\n const { groupBy: g1 } = config;\n const { groupBy: g2 } = newConfig;\n if (exactlyTheSame(g1, g2) || equivalentGroupBy(config, newConfig)) {\n return false;\n } else if (g1 === undefined || g2 === undefined) {\n return true;\n } else if (g1?.length !== g2?.length) {\n return true;\n }\n return g1.some((column, i) => column !== g2?.[i]);\n};\n\nconst isSortChanged: DataConfigPredicate = (config, newConfig) => {\n const { sort: s1 } = config;\n const { sort: s2 } = newConfig;\n if (exactlyTheSame(s1, s2) || equivalentSort(config, newConfig)) {\n return false;\n } else if (s1 === undefined || s2 === undefined) {\n return true;\n } else if (s1?.sortDefs.length !== s2?.sortDefs.length) {\n return true;\n }\n return s1.sortDefs.some(\n ({ column, sortType }, i) =>\n column !== s2.sortDefs[i].column || sortType !== s2.sortDefs[i].sortType\n );\n};\n\nconst isVisualLinkChanged: DataConfigPredicate = () => {\n // TODO\n return false;\n};\n\nexport const NO_CONFIG_CHANGES: MaybeDataSourceConfigChanges = {\n aggregationsChanged: false,\n columnsChanged: false,\n filterChanged: false,\n groupByChanged: false,\n noChanges: true,\n sortChanged: false,\n visualLinkChanged: false,\n};\n\nexport const isConfigChanged = (\n config: DataSourceConfig | undefined,\n newConfig: DataSourceConfig | undefined\n): MaybeDataSourceConfigChanges => {\n if (exactlyTheSame(config, newConfig)) {\n return NO_CONFIG_CHANGES;\n }\n\n if (config === undefined && newConfig == undefined) {\n return NO_CONFIG_CHANGES;\n } else if (config === undefined) {\n return isConfigChanged({}, newConfig);\n } else if (newConfig === undefined) {\n return isConfigChanged(config, {});\n }\n\n const aggregationsChanged = isAggregationsChanged(config, newConfig);\n const columnsChanged = isColumnsChanged(config, newConfig);\n const filterChanged = isFilterChanged(config, newConfig);\n const groupByChanged = isGroupByChanged(config, newConfig);\n const sortChanged = isSortChanged(config, newConfig);\n const visualLinkChanged = isVisualLinkChanged(config, newConfig);\n\n const noChanges = !(\n aggregationsChanged ||\n columnsChanged ||\n filterChanged ||\n groupByChanged ||\n sortChanged ||\n visualLinkChanged\n );\n\n return {\n aggregationsChanged,\n columnsChanged,\n filterChanged,\n groupByChanged,\n noChanges,\n sortChanged,\n visualLinkChanged,\n };\n};\n\nexport const hasGroupBy = (config?: DataSourceConfig): config is WithGroupBy =>\n config !== undefined &&\n config.groupBy !== undefined &&\n config.groupBy.length > 0;\n\nexport const hasFilter = (config?: DataSourceConfig): config is WithFilter =>\n config?.filter !== undefined && config.filter.filter.length > 0;\n\nexport const hasSort = (config?: DataSourceConfig): config is WithSort =>\n config?.sort !== undefined &&\n Array.isArray(config.sort?.sortDefs) &&\n config.sort.sortDefs.length > 0;\n\nexport const isTypeaheadSuggestionProvider = (\n source: unknown\n): source is TypeaheadSuggestionProvider =>\n typeof (source as TypeaheadSuggestionProvider)[\"getTypeaheadSuggestions\"] ===\n \"function\";\n\nexport const isTableSchemaMessage = (\n message: VuuUIMessageIn\n): message is VuuUIMessageInTableMeta => message.type === \"TABLE_META_RESP\";\n\nexport const isConnectionStatusMessage = (\n msg: object | ConnectionStatusMessage\n): msg is ConnectionStatusMessage =>\n (msg as ConnectionStatusMessage).type === \"connection-status\";\n\nexport const isConnectionQualityMetrics = (\n msg: object\n): msg is ConnectionQualityMetrics =>\n (msg as ConnectionQualityMetrics).type === \"connection-metrics\";\n\nexport const messageHasResult = (msg: object): msg is VuuUIMessageInRPC =>\n typeof (msg as VuuUIMessageInRPC).result !== \"undefined\";\n\nexport const isErrorResponse = (\n response?: RpcResponse\n): response is VuuUIMessageInRPCEditReject =>\n response !== undefined && \"error\" in response;\n\nexport const hasAction = (\n response?: RpcResponse\n): response is MenuRpcResponse | VuuUIMessageInRPCEditResponse =>\n response != undefined && \"action\" in response;\n\nexport const isViewportMessage = (\n msg: object\n): msg is VuuUIMessageOutViewport => \"viewport\" in msg;\n\nexport const withConfigDefaults = (\n config: DataSourceConfig\n): WithFullConfig & { visualLink?: LinkDescriptorWithLabel } => {\n if (\n config.aggregations &&\n config.columns &&\n config.filter &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  'use strict';
2
2
 
3
+ var arrayUtils = require('./array-utils.js');
4
+ var textUtils = require('./text-utils.js');
5
+
3
6
  const env = process.env.NODE_ENV;
7
+ const isCustomFeature = (feature) => feature.leftNavLocation === "vuu-features";
8
+ const isWildcardSchema = (schema) => schema === "*";
9
+ const isTableSchema = (schema) => typeof schema === "object" && typeof schema.module === "string" && typeof schema.table === "string";
10
+ const hasFilterTableFeatureProps = (props) => "tableSchema" in (props?.ComponentProps ?? {});
4
11
  const byModule = (schema1, schema2) => {
5
12
  const m1 = schema1.table.module.toLowerCase();
6
13
  const m2 = schema2.table.module.toLowerCase();
@@ -17,13 +24,101 @@ const byModule = (schema1, schema2) => {
17
24
  }
18
25
  };
19
26
  const getFilterTableFeatures = (schemas, getFeaturePath) => schemas.sort(byModule).map((schema) => ({
27
+ ...getFeaturePath({ env, fileName: "FilterTable" }),
20
28
  ComponentProps: {
21
29
  tableSchema: schema
22
30
  },
23
- title: `${schema.table.module} ${schema.table.table}`,
24
- ...getFeaturePath({ env, fileName: "FilterTable" })
31
+ title: `${schema.table.module} ${schema.table.table}`
25
32
  }));
33
+ const assertComponentRegistered = (componentName, component) => {
34
+ if (typeof component !== "function") {
35
+ console.warn(
36
+ `${componentName} module not loaded, will be unabale to deserialize from layout JSON`
37
+ );
38
+ }
39
+ };
40
+ const getCustomAndTableFeatures = (features, vuuTables) => {
41
+ const [customFeatureConfig, tableFeaturesConfig] = arrayUtils.partition(
42
+ Object.values(features),
43
+ isCustomFeature
44
+ );
45
+ const customFeatures = [];
46
+ const tableFeatures = [];
47
+ for (const {
48
+ featureProps = {},
49
+ viewProps,
50
+ ...feature
51
+ } of tableFeaturesConfig) {
52
+ const { schema } = featureProps;
53
+ if (isWildcardSchema(schema) && vuuTables) {
54
+ for (const tableSchema of vuuTables.values()) {
55
+ tableFeatures.push({
56
+ ...feature,
57
+ ComponentProps: {
58
+ tableSchema
59
+ },
60
+ title: `${tableSchema.table.module} ${textUtils.wordify(
61
+ tableSchema.table.table
62
+ )}`,
63
+ ViewProps: viewProps
64
+ });
65
+ }
66
+ } else if (isTableSchema(schema) && vuuTables) {
67
+ const tableSchema = vuuTables.get(schema.table);
68
+ if (tableSchema) {
69
+ tableFeatures.push({
70
+ ...feature,
71
+ ComponentProps: {
72
+ tableSchema
73
+ },
74
+ ViewProps: viewProps
75
+ });
76
+ }
77
+ }
78
+ }
79
+ for (const {
80
+ featureProps = {},
81
+ viewProps,
82
+ ...feature
83
+ } of customFeatureConfig) {
84
+ const { schema, schemas } = featureProps;
85
+ if (isTableSchema(schema) && vuuTables) {
86
+ const tableSchema = vuuTables.get(schema.table);
87
+ customFeatures.push({
88
+ ...feature,
89
+ ComponentProps: {
90
+ tableSchema
91
+ },
92
+ ViewProps: viewProps
93
+ });
94
+ } else if (Array.isArray(schemas) && vuuTables) {
95
+ customFeatures.push({
96
+ ...feature,
97
+ ComponentProps: schemas.reduce(
98
+ (map, schema2) => {
99
+ map[`${schema2.table}Schema`] = vuuTables.get(
100
+ schema2.table
101
+ );
102
+ return map;
103
+ },
104
+ {}
105
+ ),
106
+ ViewProps: viewProps
107
+ });
108
+ } else {
109
+ customFeatures.push(feature);
110
+ }
111
+ }
112
+ return [customFeatures, tableFeatures];
113
+ };
26
114
 
115
+ exports.assertComponentRegistered = assertComponentRegistered;
116
+ exports.byModule = byModule;
27
117
  exports.env = env;
118
+ exports.getCustomAndTableFeatures = getCustomAndTableFeatures;
28
119
  exports.getFilterTableFeatures = getFilterTableFeatures;
120
+ exports.hasFilterTableFeatureProps = hasFilterTableFeatureProps;
121
+ exports.isCustomFeature = isCustomFeature;
122
+ exports.isTableSchema = isTableSchema;
123
+ exports.isWildcardSchema = isWildcardSchema;
29
124
  //# sourceMappingURL=feature-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-utils.js","sources":["../src/feature-utils.ts"],"sourcesContent":["import { FeatureConfig, FeatureProps } from \"@vuu-ui/vuu-shell\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\n\nexport type PathMap = { [key: string]: Pick<FeatureConfig, \"css\" | \"url\"> };\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\n// Sort TableScheas by module\nconst byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => FeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths\n): FeatureProps<FilterTableFeatureProps>[] =>\n schemas.sort(byModule).map((schema) => ({\n ComponentProps: {\n tableSchema: schema,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n }));\n"],"names":[],"mappings":";;AAKa,MAAA,GAAA,GAAM,QAAQ,GAAI,CAAA,SAAA;AAO/B,MAAM,QAAA,GAAW,CAAC,OAAA,EAAsB,OAAyB,KAAA;AAC/D,EAAA,MAAM,EAAK,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAC5C,EAAA,MAAM,EAAK,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAC5C,EAAA,IAAI,KAAK,EAAI,EAAA;AACX,IAAO,OAAA,CAAA,CAAA,CAAA;AAAA,GACT,MAAA,IAAW,KAAK,EAAI,EAAA;AAClB,IAAO,OAAA,CAAA,CAAA;AAAA,aACE,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,KAAO,EAAA;AACpD,IAAO,OAAA,CAAA,CAAA,CAAA;AAAA,aACE,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,KAAO,EAAA;AACpD,IAAO,OAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAQa,MAAA,sBAAA,GAAyB,CACpC,OAAA,EACA,cAEA,KAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA,CAAE,GAAI,CAAA,CAAC,MAAY,MAAA;AAAA,EACtC,cAAgB,EAAA;AAAA,IACd,WAAa,EAAA,MAAA;AAAA,GACf;AAAA,EACA,KAAA,EAAO,GAAG,MAAO,CAAA,KAAA,CAAM,MAAM,CAAI,CAAA,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAA;AAAA,EACnD,GAAG,cAAe,CAAA,EAAE,GAAK,EAAA,QAAA,EAAU,eAAe,CAAA;AACpD,CAAE,CAAA;;;;;"}
1
+ {"version":3,"file":"feature-utils.js","sources":["../src/feature-utils.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { FeatureProps } from \"@vuu-ui/vuu-shell\";\nimport { partition } from \"./array-utils\";\nimport { wordify } from \"./text-utils\";\n\nexport type PathMap = { [key: string]: Pick<FeatureConfig, \"css\" | \"url\"> };\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport interface ViewConfig {\n closeable?: boolean;\n header?: boolean;\n}\n\ndeclare global {\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport interface FeatureConfig {\n name: string;\n title: string;\n url: string;\n css?: string;\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n featureProps?: {\n schema?: \"*\" | VuuTable;\n schemas?: VuuTable[];\n };\n viewProps?: ViewConfig;\n}\n\nexport interface VuuConfig {\n features: Features;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\nexport type Features = {\n [key: string]: FeatureConfig;\n};\nexport interface VuuConfig {\n features: Features;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\nexport const isCustomFeature = (feature: FeatureConfig) =>\n feature.leftNavLocation === \"vuu-features\";\n\nexport const isWildcardSchema = (schema?: \"*\" | VuuTable): schema is \"*\" =>\n schema === \"*\";\nexport const isTableSchema = (schema?: \"*\" | VuuTable): schema is VuuTable =>\n typeof schema === \"object\" &&\n typeof schema.module === \"string\" &&\n typeof schema.table === \"string\";\n\nexport interface FeaturePropsWithFilterTableFeature\n extends Omit<FeatureProps, \"ComponentProps\"> {\n ComponentProps: FilterTableFeatureProps;\n}\n\nexport const hasFilterTableFeatureProps = (\n props: FeatureProps\n): props is FeaturePropsWithFilterTableFeature =>\n \"tableSchema\" in (props?.ComponentProps ?? {});\n\n// Sort TableScheas by module\nexport const byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => FeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths\n) =>\n schemas\n .sort(byModule)\n .map<FeatureProps<FilterTableFeatureProps>>((schema) => ({\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n ComponentProps: {\n tableSchema: schema,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport const assertComponentRegistered = (\n componentName: string,\n component: unknown\n) => {\n if (typeof component !== \"function\") {\n console.warn(\n `${componentName} module not loaded, will be unabale to deserialize from layout JSON`\n );\n }\n};\n\nexport const getCustomAndTableFeatures = (\n features: Features,\n vuuTables: Map<string, TableSchema>\n): [FeatureProps[], FeatureProps<FilterTableFeatureProps>[]] => {\n const [customFeatureConfig, tableFeaturesConfig] = partition(\n Object.values(features),\n isCustomFeature\n );\n\n const customFeatures: FeatureProps[] = [];\n const tableFeatures: FeatureProps<FilterTableFeatureProps>[] = [];\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of tableFeaturesConfig) {\n const { schema } = featureProps;\n if (isWildcardSchema(schema) && vuuTables) {\n for (const tableSchema of vuuTables.values()) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n title: `${tableSchema.table.module} ${wordify(\n tableSchema.table.table\n )}`,\n ViewProps: viewProps,\n });\n }\n } else if (isTableSchema(schema) && vuuTables) {\n const tableSchema = vuuTables.get(schema.table);\n if (tableSchema) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n ViewProps: viewProps,\n });\n }\n }\n }\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of customFeatureConfig) {\n const { schema, schemas } = featureProps;\n if (isTableSchema(schema) && vuuTables) {\n const tableSchema = vuuTables.get(schema.table);\n customFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n ViewProps: viewProps,\n });\n } else if (Array.isArray(schemas) && vuuTables) {\n customFeatures.push({\n ...feature,\n ComponentProps: schemas.reduce<Record<string, TableSchema>>(\n (map, schema) => {\n map[`${schema.table}Schema`] = vuuTables.get(\n schema.table\n ) as TableSchema;\n return map;\n },\n {}\n ),\n ViewProps: viewProps,\n });\n } else {\n customFeatures.push(feature);\n }\n }\n return [customFeatures, tableFeatures];\n};\n"],"names":["partition","wordify","schema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filterAsQuery.js","sources":["../../src/filters/filterAsQuery.ts"],"sourcesContent":["import {\n ColumnDescriptorsByName,\n Filter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { RuntimeColumnDescriptor } from \"packages/vuu-table-types\";\nimport { isDateTimeColumn } from \"../column-utils\";\nimport { isMultiClauseFilter, isMultiValueFilter } from \"./utils\";\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst quotedStrings = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst removeOuterMostParentheses = (s: string) => s.replace(/^\\((.*)\\)$/, \"$1\");\n\nexport const filterAsQuery = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n return removeOuterMostParentheses(filterAsQueryCore(f, opts));\n};\n\nconst filterAsQueryCore = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n if (isMultiClauseFilter(f)) {\n const multiClauseFilter = f.filters\n .map((filter) => filterAsQueryCore(filter, opts))\n .join(` ${f.op} `);\n return `(${multiClauseFilter})`;\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(\",\")}]`;\n } else {\n return singleValueFilterAsQuery(f, opts);\n }\n};\n\nfunction singleValueFilterAsQuery(\n f: SingleValueFilterClause,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string {\n const column = opts?.columnsByName?.[f.column];\n if (column && isDateTimeColumn(column)) {\n return dateFilterAsQuery(f as SingleValueFilterClause<number>);\n } else {\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst ONE_DAY_IN_MILIS = 1000 * 60 * 60 * 24;\nexport function dateFilterAsQuery(f: SingleValueFilterClause<number>): string {\n switch (f.op) {\n case \"=\": {\n const filters: Array<Filter> = [\n { op: \">=\", column: f.column, value: f.value },\n {\n op: \"<\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"and\", filters });\n }\n case \"!=\": {\n const filters: Array<Filter> = [\n { op: \"<\", column: f.column, value: f.value },\n {\n op: \">=\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"or\", filters });\n }\n default:\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst defaultSingleValueFilterAsQuery = (f: SingleValueFilterClause) =>\n `${f.column} ${f.op} ${filterValue(f.value)}`;\n\nexport const removeColumnFromFilter = (\n column: RuntimeColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n"],"names":["isMultiClauseFilter","isMultiValueFilter","isDateTimeColumn"],"mappings":"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"}
1
+ {"version":3,"file":"filterAsQuery.js","sources":["../../src/filters/filterAsQuery.ts"],"sourcesContent":["import {\n ColumnDescriptorsByName,\n Filter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isDateTimeColumn } from \"../column-utils\";\nimport { isMultiClauseFilter, isMultiValueFilter } from \"./utils\";\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst quotedStrings = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst removeOuterMostParentheses = (s: string) => s.replace(/^\\((.*)\\)$/, \"$1\");\n\nexport const filterAsQuery = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n return removeOuterMostParentheses(filterAsQueryCore(f, opts));\n};\n\nconst filterAsQueryCore = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n if (isMultiClauseFilter(f)) {\n const multiClauseFilter = f.filters\n .map((filter) => filterAsQueryCore(filter, opts))\n .join(` ${f.op} `);\n return `(${multiClauseFilter})`;\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(\",\")}]`;\n } else {\n return singleValueFilterAsQuery(f, opts);\n }\n};\n\nfunction singleValueFilterAsQuery(\n f: SingleValueFilterClause,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string {\n const column = opts?.columnsByName?.[f.column];\n if (column && isDateTimeColumn(column)) {\n return dateFilterAsQuery(f as SingleValueFilterClause<number>);\n } else {\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst ONE_DAY_IN_MILIS = 1000 * 60 * 60 * 24;\nexport function dateFilterAsQuery(f: SingleValueFilterClause<number>): string {\n switch (f.op) {\n case \"=\": {\n const filters: Array<Filter> = [\n { op: \">=\", column: f.column, value: f.value },\n {\n op: \"<\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"and\", filters });\n }\n case \"!=\": {\n const filters: Array<Filter> = [\n { op: \"<\", column: f.column, value: f.value },\n {\n op: \">=\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"or\", filters });\n }\n default:\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst defaultSingleValueFilterAsQuery = (f: SingleValueFilterClause) =>\n `${f.column} ${f.op} ${filterValue(f.value)}`;\n\nexport const removeColumnFromFilter = (\n column: RuntimeColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n"],"names":["isMultiClauseFilter","isMultiValueFilter","isDateTimeColumn"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -45,6 +45,7 @@ var rangeUtils = require('./range-utils.js');
45
45
  var rowUtils = require('./row-utils.js');
46
46
  var selectionUtils = require('./selection-utils.js');
47
47
  var sortUtils = require('./sort-utils.js');
48
+ var tableSchemaUtils = require('./table-schema-utils.js');
48
49
  var textUtils = require('./text-utils.js');
49
50
  var ThemeProvider = require('./ThemeProvider.js');
50
51
  var tsUtils = require('./ts-utils.js');
@@ -174,7 +175,7 @@ exports.isConnectionStatusMessage = datasourceUtils.isConnectionStatusMessage;
174
175
  exports.isErrorResponse = datasourceUtils.isErrorResponse;
175
176
  exports.isFilterChanged = datasourceUtils.isFilterChanged;
176
177
  exports.isGroupByChanged = datasourceUtils.isGroupByChanged;
177
- exports.isTableSchema = datasourceUtils.isTableSchema;
178
+ exports.isTableSchemaMessage = datasourceUtils.isTableSchemaMessage;
178
179
  exports.isTypeaheadSuggestionProvider = datasourceUtils.isTypeaheadSuggestionProvider;
179
180
  exports.isViewportMessage = datasourceUtils.isViewportMessage;
180
181
  exports.messageHasResult = datasourceUtils.messageHasResult;
@@ -224,8 +225,15 @@ exports.hasOpenOptionList = htmlUtils.hasOpenOptionList;
224
225
  exports.isSelectableElement = htmlUtils.isSelectableElement;
225
226
  exports.queryClosest = htmlUtils.queryClosest;
226
227
  exports.EventEmitter = eventEmitter.EventEmitter;
228
+ exports.assertComponentRegistered = featureUtils.assertComponentRegistered;
229
+ exports.byModule = featureUtils.byModule;
227
230
  exports.env = featureUtils.env;
231
+ exports.getCustomAndTableFeatures = featureUtils.getCustomAndTableFeatures;
228
232
  exports.getFilterTableFeatures = featureUtils.getFilterTableFeatures;
233
+ exports.hasFilterTableFeatureProps = featureUtils.hasFilterTableFeatureProps;
234
+ exports.isCustomFeature = featureUtils.isCustomFeature;
235
+ exports.isTableSchema = featureUtils.isTableSchema;
236
+ exports.isWildcardSchema = featureUtils.isWildcardSchema;
229
237
  exports.getFieldName = formUtils.getFieldName;
230
238
  exports.defaultValueFormatter = formattingUtils.defaultValueFormatter;
231
239
  exports.getValueFormatter = formattingUtils.getValueFormatter;
@@ -260,6 +268,7 @@ exports.buildMenuDescriptorFromVuuMenu = menuUtils.buildMenuDescriptorFromVuuMen
260
268
  exports.getMenuRpcRequest = menuUtils.getMenuRpcRequest;
261
269
  exports.isCellMenu = menuUtils.isCellMenu;
262
270
  exports.isGroupMenuItemDescriptor = menuUtils.isGroupMenuItemDescriptor;
271
+ exports.isOpenBulkEditResponse = menuUtils.isOpenBulkEditResponse;
263
272
  exports.isRoot = menuUtils.isRoot;
264
273
  exports.isRowMenu = menuUtils.isRowMenu;
265
274
  exports.isSelectionMenu = menuUtils.isSelectionMenu;
@@ -297,6 +306,7 @@ exports.selectItem = selectionUtils.selectItem;
297
306
  exports.addSortColumn = sortUtils.addSortColumn;
298
307
  exports.setSortColumn = sortUtils.setSortColumn;
299
308
  exports.toggleOrApplySort = sortUtils.toggleOrApplySort;
309
+ exports.getVuuTable = tableSchemaUtils.getVuuTable;
300
310
  exports.lastWord = textUtils.lastWord;
301
311
  exports.wordify = textUtils.wordify;
302
312
  exports.DEFAULT_DENSITY = ThemeProvider.DEFAULT_DENSITY;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/cjs/menu-utils.js CHANGED
@@ -139,11 +139,13 @@ const getMenuRpcRequest = (options) => {
139
139
  };
140
140
  }
141
141
  };
142
+ const isOpenBulkEditResponse = (res) => res.rpcName === "VP_BULK_EDIT_BEGIN_RPC";
142
143
 
143
144
  exports.buildMenuDescriptorFromVuuMenu = buildMenuDescriptorFromVuuMenu;
144
145
  exports.getMenuRpcRequest = getMenuRpcRequest;
145
146
  exports.isCellMenu = isCellMenu;
146
147
  exports.isGroupMenuItemDescriptor = isGroupMenuItemDescriptor;
148
+ exports.isOpenBulkEditResponse = isOpenBulkEditResponse;
147
149
  exports.isRoot = isRoot;
148
150
  exports.isRowMenu = isRowMenu;
149
151
  exports.isSelectionMenu = isSelectionMenu;
@@ -1 +1 @@
1
- {"version":3,"file":"menu-utils.js","sources":["../src/menu-utils.ts"],"sourcesContent":["import {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n DataSourceRow,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRPC,\n ClientToServerMenuRowRPC,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n TableMenuLocation,\n VuuCellMenuItem,\n VuuRowMenuItem,\n} from \"@vuu-ui/vuu-table-types\";\nimport { getRowRecord, metadataKeys, type ColumnMap } from \"./column-utils\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst { KEY } = metadataKeys;\n\nexport const isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nexport const isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\n\nexport const isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\n\nexport const isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isTableLocation = (\n location: string\n): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nconst isVuuMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: TableMenuLocation,\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nexport const buildMenuDescriptorFromVuuMenu = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isVuuMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n"],"names":["metadataKeys","getFilterPredicate","getRowRecord"],"mappings":";;;;;AA6BA,MAAM,EAAE,KAAQ,GAAAA,wBAAA,CAAA;AAET,MAAM,MAAS,GAAA,CAAC,IAAkB,KAAA,IAAA,CAAK,IAAS,KAAA,OAAA;AAEhD,MAAM,UAAa,GAAA,CAAC,OACzB,KAAA,OAAA,CAAQ,OAAY,KAAA,OAAA;AAEf,MAAM,SAAY,GAAA,CAAC,OACxB,KAAA,OAAA,CAAQ,OAAY,KAAA,MAAA;AAEf,MAAM,eAAkB,GAAA,CAAC,OAC9B,KAAA,OAAA,CAAQ,OAAY,KAAA,gBAAA;AAEf,MAAM,yBAA4B,GAAA,CACvC,QAEA,KAAA,QAAA,KAAa,UAAa,UAAc,IAAA,SAAA;AAE7B,MAAA,eAAA,GAAkB,CAC7B,QAEA,KAAA,CAAC,QAAQ,QAAU,EAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,QAAQ,EAAA;AAEhD,MAAM,aAAA,GAAgB,CAAC,IAAA,KACrB,SAAa,IAAA,IAAA,CAAA;AAEf,MAAM,eAAA,GAAkB,CAAC,IAAA,KACvB,OAAW,IAAA,IAAA,CAAA;AAEb,MAAM,SAAA,GAAY,CAAC,EAAE,MAAA,OACnB,OAAO,MAAA,KAAW,QAAY,IAAA,MAAA,CAAO,MAAS,GAAA,CAAA,CAAA;AAEhD,MAAM,qCAAwC,GAAA,CAC5C,UACA,EAAA,UAAA,EACA,mBAAmB,CAChB,KAAA;AACH,EAAA,QAAQ,UAAY;AAAA,IAClB,KAAK,MAAA;AACH,MAAA,IAAI,eAAe,eAAiB,EAAA;AAClC,QAAA,OAAO,gBAAmB,GAAA,CAAA,CAAA;AAAA,OACrB,MAAA;AACL,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO,UAAe,KAAA,MAAA,CAAA;AAAA,IACxB;AACE,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AACF,CAAA,CAAA;AAEA,MAAM,6BAA6B,CACjC,OAAA,EACA,GACA,EAAA,YAAA,EACA,QACA,SACY,KAAA;AACZ,EAAI,IAAA,OAAA,KAAY,MAAU,IAAA,OAAA,KAAY,KAAO,EAAA;AAC3C,IAAM,MAAA,eAAA,GAAkBC,kCAAmB,CAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAC5D,IAAA,OAAO,gBAAgB,GAAG,CAAA,CAAA;AAAA,GAC5B,MAAA,IAAW,YAAY,eAAiB,EAAA;AACtC,IAAI,IAAA,YAAA,CAAa,WAAW,CAAG,EAAA;AAC7B,MAAO,OAAA,KAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAM,MAAA,eAAA,GAAkBA,kCAAmB,CAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAC5D,MAAO,OAAA,YAAA,CAAa,MAAM,eAAe,CAAA,CAAA;AAAA,KAC3C;AAAA,GACF;AACA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,iCAAoC,GAAA,CACxC,QACA,EAAA,aAAA,EACA,OACY,KAAA;AACZ,EAAI,IAAA,eAAA,CAAgB,QAAQ,CAAG,EAAA;AAC7B,IAAA,OAAO,SAAS,KAAM,CAAA,IAAA;AAAA,MAAK,CAAC,SAAA,KAC1B,iCAAkC,CAAA,SAAA,EAAW,eAAe,OAAO,CAAA;AAAA,KACrE,CAAA;AAAA,GACF;AACA,EAAA,IACE,CAAC,qCAAA;AAAA,IACC,aAAA;AAAA,IACA,QAAS,CAAA,OAAA;AAAA,IACT,QAAQ,YAAc,EAAA,MAAA;AAAA,GAExB,EAAA;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,aAAkB,KAAA,MAAA,IAAU,SAAU,CAAA,QAAQ,CAAG,EAAA;AACnD,IAAO,OAAA,0BAAA;AAAA,MACL,QAAS,CAAA,OAAA;AAAA,MACT,OAAQ,CAAA,GAAA;AAAA,MACR,OAAQ,CAAA,YAAA;AAAA,MACR,QAAS,CAAA,MAAA;AAAA,MACT,OAAQ,CAAA,SAAA;AAAA,KACV,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,UAAW,CAAA,QAAQ,CAAK,IAAA,QAAA,CAAS,UAAU,GAAK,EAAA;AAClD,IAAO,OAAA,QAAA,CAAS,UAAU,OAAQ,CAAA,UAAA,CAAA;AAAA,GACpC;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,kBAAA,GAAqB,CACzB,IAAA,EACA,OACgB,KAAA;AAChB,EAAA,QAAQ,KAAK,OAAS;AAAA,IACpB,KAAK,MAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,IAAA;AAAA,QACH,OAAO,OAAQ,CAAA,UAAA;AAAA,QACf,MAAA,EAAQ,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA;AAAA,QACvB,OAAO,OAAQ,CAAA,GAAA,CAAI,QAAQ,SAAU,CAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,OAC1D,CAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAO,OAAA;AAAA,QACL,GAAG,IAAA;AAAA,QACH,GAAK,EAAAC,wBAAA,CAAa,OAAQ,CAAA,GAAA,EAAK,QAAQ,SAAS,CAAA;AAAA,QAChD,MAAA,EAAQ,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA;AAAA,OACzB,CAAA;AAAA,IACF;AACE,MAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACF,CAAA,CAAA;AAEO,MAAM,8BAAiC,GAAA,CAC5C,IACA,EAAA,aAAA,EACA,OAC0C,KAAA;AAC1C,EAAA,IAAI,iCAAkC,CAAA,IAAA,EAAM,aAAe,EAAA,OAAO,CAAG,EAAA;AACnE,IAAI,IAAA,aAAA,CAAc,IAAI,CAAG,EAAA;AACvB,MAAO,OAAA;AAAA,QACL,OAAO,IAAK,CAAA,IAAA;AAAA,QACZ,MAAQ,EAAA,eAAA;AAAA,QACR,OAAA,EAAS,kBAAmB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,OAC3C,CAAA;AAAA,KACK,MAAA;AACL,MAAM,MAAA,QAAA,GAAW,KAAK,KACnB,CAAA,GAAA;AAAA,QAAI,CAAC,SAAA,KACJ,8BAA+B,CAAA,SAAA,EAAW,eAAe,OAAO,CAAA;AAAA,OAEjE,CAAA,MAAA;AAAA,QACC,CAAC,cAAc,SAAc,KAAA,KAAA,CAAA;AAAA,OAC/B,CAAA;AACF,MAAI,IAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACvB,QAAO,OAAA;AAAA,UACL,OAAO,IAAK,CAAA,IAAA;AAAA,UACZ,QAAA;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACF;AACF,EAAA;AAEa,MAAA,iBAAA,GAAoB,CAC/B,OACwC,KAAA;AACxC,EAAM,MAAA,EAAE,SAAY,GAAA,OAAA,CAAA;AACpB,EAAI,IAAA,UAAA,CAAW,OAAO,CAAG,EAAA;AACvB,IAAO,OAAA;AAAA,MACL,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,OAAA;AAAA,MACA,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,IAAM,EAAA,yBAAA;AAAA,KACR,CAAA;AAAA,GACF,MAAA,IAAW,SAAU,CAAA,OAAO,CAAG,EAAA;AAC7B,IAAO,OAAA;AAAA,MACL,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,KAAK,OAAQ,CAAA,GAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAM,EAAA,wBAAA;AAAA,KACR,CAAA;AAAA,GACF,MAAA,IAAW,eAAgB,CAAA,OAAO,CAAG,EAAA;AACnC,IAAO,OAAA;AAAA,MACL,OAAA;AAAA,MACA,IAAM,EAAA,4BAAA;AAAA,KACR,CAAA;AAAA,GACK,MAAA;AACL,IAAO,OAAA;AAAA,MACL,OAAA;AAAA,MACA,IAAM,EAAA,0BAAA;AAAA,KACR,CAAA;AAAA,GACF;AACF;;;;;;;;;;;"}
1
+ {"version":3,"file":"menu-utils.js","sources":["../src/menu-utils.ts"],"sourcesContent":["import {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuRpcResponse,\n OpenDialogAction,\n RpcResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRPC,\n ClientToServerMenuRowRPC,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n TableMenuLocation,\n VuuCellMenuItem,\n VuuRowMenuItem,\n} from \"@vuu-ui/vuu-table-types\";\nimport { getRowRecord, metadataKeys, type ColumnMap } from \"./column-utils\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst { KEY } = metadataKeys;\n\nexport const isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nexport const isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\n\nexport const isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\n\nexport const isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isTableLocation = (\n location: string\n): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nconst isVuuMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: TableMenuLocation,\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nexport const buildMenuDescriptorFromVuuMenu = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isVuuMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport const isOpenBulkEditResponse = (\n res: RpcResponse\n): res is MenuRpcResponse<OpenDialogAction> =>\n (res as MenuRpcResponse).rpcName === \"VP_BULK_EDIT_BEGIN_RPC\";\n"],"names":["metadataKeys","getFilterPredicate","getRowRecord"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const getVuuTable = (schemaTable) => {
4
+ if (schemaTable.session) {
5
+ const { module, session } = schemaTable;
6
+ return { module, table: session };
7
+ } else {
8
+ return schemaTable;
9
+ }
10
+ };
11
+
12
+ exports.getVuuTable = getVuuTable;
13
+ //# sourceMappingURL=table-schema-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-schema-utils.js","sources":["../src/table-schema-utils.ts"],"sourcesContent":["import { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nexport const getVuuTable = (schemaTable: TableSchemaTable): VuuTable => {\n if (schemaTable.session) {\n const { module, session } = schemaTable;\n return { module, table: session };\n } else {\n return schemaTable;\n }\n};\n"],"names":[],"mappings":";;AAGa,MAAA,WAAA,GAAc,CAAC,WAA4C,KAAA;AACtE,EAAA,IAAI,YAAY,OAAS,EAAA;AACvB,IAAM,MAAA,EAAE,MAAQ,EAAA,OAAA,EAAY,GAAA,WAAA,CAAA;AAC5B,IAAO,OAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,OAAQ,EAAA,CAAA;AAAA,GAC3B,MAAA;AACL,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AACF;;;;"}
@@ -124,7 +124,7 @@ const hasGroupBy = (config) => config !== void 0 && config.groupBy !== void 0 &&
124
124
  const hasFilter = (config) => config?.filter !== void 0 && config.filter.filter.length > 0;
125
125
  const hasSort = (config) => config?.sort !== void 0 && Array.isArray(config.sort?.sortDefs) && config.sort.sortDefs.length > 0;
126
126
  const isTypeaheadSuggestionProvider = (source) => typeof source["getTypeaheadSuggestions"] === "function";
127
- const isTableSchema = (message) => message.type === "TABLE_META_RESP";
127
+ const isTableSchemaMessage = (message) => message.type === "TABLE_META_RESP";
128
128
  const isConnectionStatusMessage = (msg) => msg.type === "connection-status";
129
129
  const isConnectionQualityMetrics = (msg) => msg.type === "connection-metrics";
130
130
  const messageHasResult = (msg) => typeof msg.result !== "undefined";
@@ -154,5 +154,5 @@ const withConfigDefaults = (config) => {
154
154
  }
155
155
  };
156
156
 
157
- export { NO_CONFIG_CHANGES, NoFilter, NoSort, hasAction, hasFilter, hasGroupBy, hasSort, isConfigChanged, isConnectionQualityMetrics, isConnectionStatusMessage, isErrorResponse, isFilterChanged, isGroupByChanged, isTableSchema, isTypeaheadSuggestionProvider, isViewportMessage, messageHasResult, vanillaConfig, withConfigDefaults };
157
+ export { NO_CONFIG_CHANGES, NoFilter, NoSort, hasAction, hasFilter, hasGroupBy, hasSort, isConfigChanged, isConnectionQualityMetrics, isConnectionStatusMessage, isErrorResponse, isFilterChanged, isGroupByChanged, isTableSchemaMessage, isTypeaheadSuggestionProvider, isViewportMessage, messageHasResult, vanillaConfig, withConfigDefaults };
158
158
  //# sourceMappingURL=datasource-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-utils.js","sources":["../src/datasource-utils.ts"],"sourcesContent":["import {\n ConnectionQualityMetrics,\n ConnectionStatusMessage,\n DataSourceConfig,\n MenuRpcResponse,\n RpcResponse,\n TypeaheadSuggestionProvider,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n VuuUIMessageInTableMeta,\n VuuUIMessageOutViewport,\n WithFilter,\n WithFullConfig,\n WithGroupBy,\n WithSort,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n LinkDescriptorWithLabel,\n VuuFilter,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const NoFilter: VuuFilter = { filter: \"\" };\nexport const NoSort: VuuSort = { sortDefs: [] };\n\nexport const vanillaConfig: WithFullConfig = {\n aggregations: [],\n columns: [],\n filter: NoFilter,\n groupBy: [],\n sort: NoSort,\n};\n\nexport type DataSourceConfigChanges = {\n aggregationsChanged: boolean;\n columnsChanged: boolean;\n filterChanged: boolean;\n groupByChanged: boolean;\n sortChanged: boolean;\n visualLinkChanged: boolean;\n};\n\nexport type MaybeDataSourceConfigChanges = DataSourceConfigChanges & {\n noChanges: boolean;\n};\n\ntype DataConfigPredicate = (\n config: DataSourceConfig,\n newConfig: DataSourceConfig\n) => boolean;\n\nconst equivalentAggregations: DataConfigPredicate = (\n { aggregations: agg1 },\n { aggregations: agg2 }\n) =>\n (agg1 === undefined && agg2?.length === 0) ||\n (agg2 === undefined && agg1?.length === 0);\n\nconst equivalentColumns: DataConfigPredicate = (\n { columns: cols1 },\n { columns: cols2 }\n) =>\n (cols1 === undefined && cols2?.length === 0) ||\n (cols2 === undefined && cols1?.length === 0);\n\nconst equivalentFilter: DataConfigPredicate = (\n { filter: f1 },\n { filter: f2 }\n) =>\n (f1 === undefined && f2?.filter === \"\") ||\n (f2 === undefined && f1?.filter === \"\");\n\nconst equivalentGroupBy: DataConfigPredicate = (\n { groupBy: val1 },\n { groupBy: val2 }\n) =>\n (val1 === undefined && val2?.length === 0) ||\n (val2 === undefined && val1?.length === 0);\n\nconst equivalentSort: DataConfigPredicate = ({ sort: s1 }, { sort: s2 }) =>\n (s1 === undefined && s2?.sortDefs.length === 0) ||\n (s2 === undefined && s1?.sortDefs.length === 0);\n\nconst exactlyTheSame = (a: unknown, b: unknown) => {\n if (a === b) {\n return true;\n } else if (a === undefined && b === undefined) {\n return true;\n } else {\n return false;\n }\n};\n\nconst isAggregationsChanged: DataConfigPredicate = (config, newConfig) => {\n const { aggregations: agg1 } = config;\n const { aggregations: agg2 } = newConfig;\n if (exactlyTheSame(agg1, agg2) || equivalentAggregations(config, newConfig)) {\n return false;\n } else if (agg1 === undefined || agg2 === undefined) {\n return true;\n } else if (agg1.length !== agg2.length) {\n return true;\n }\n return agg1.some(\n ({ column, aggType }, i) =>\n column !== agg2[i].column || aggType !== agg2[i].aggType\n );\n};\n\nconst isColumnsChanged: DataConfigPredicate = (config, newConfig) => {\n const { columns: cols1 } = config;\n const { columns: cols2 } = newConfig;\n\n if (exactlyTheSame(cols1, cols2) || equivalentColumns(config, newConfig)) {\n return false;\n } else if (cols1 === undefined || cols2 === undefined) {\n return true;\n } else if (cols1?.length !== cols2?.length) {\n return true;\n }\n return cols1.some((column, i) => column !== cols2?.[i]);\n};\n\nexport const isFilterChanged: DataConfigPredicate = (c1, c2) => {\n if (equivalentFilter(c1, c2)) {\n return false;\n } else {\n return c1.filter?.filter !== c2.filter?.filter;\n }\n};\n\nexport const isGroupByChanged: DataConfigPredicate = (config, newConfig) => {\n const { groupBy: g1 } = config;\n const { groupBy: g2 } = newConfig;\n if (exactlyTheSame(g1, g2) || equivalentGroupBy(config, newConfig)) {\n return false;\n } else if (g1 === undefined || g2 === undefined) {\n return true;\n } else if (g1?.length !== g2?.length) {\n return true;\n }\n return g1.some((column, i) => column !== g2?.[i]);\n};\n\nconst isSortChanged: DataConfigPredicate = (config, newConfig) => {\n const { sort: s1 } = config;\n const { sort: s2 } = newConfig;\n if (exactlyTheSame(s1, s2) || equivalentSort(config, newConfig)) {\n return false;\n } else if (s1 === undefined || s2 === undefined) {\n return true;\n } else if (s1?.sortDefs.length !== s2?.sortDefs.length) {\n return true;\n }\n return s1.sortDefs.some(\n ({ column, sortType }, i) =>\n column !== s2.sortDefs[i].column || sortType !== s2.sortDefs[i].sortType\n );\n};\n\nconst isVisualLinkChanged: DataConfigPredicate = () => {\n // TODO\n return false;\n};\n\nexport const NO_CONFIG_CHANGES: MaybeDataSourceConfigChanges = {\n aggregationsChanged: false,\n columnsChanged: false,\n filterChanged: false,\n groupByChanged: false,\n noChanges: true,\n sortChanged: false,\n visualLinkChanged: false,\n};\n\nexport const isConfigChanged = (\n config: DataSourceConfig | undefined,\n newConfig: DataSourceConfig | undefined\n): MaybeDataSourceConfigChanges => {\n if (exactlyTheSame(config, newConfig)) {\n return NO_CONFIG_CHANGES;\n }\n\n if (config === undefined && newConfig == undefined) {\n return NO_CONFIG_CHANGES;\n } else if (config === undefined) {\n return isConfigChanged({}, newConfig);\n } else if (newConfig === undefined) {\n return isConfigChanged(config, {});\n }\n\n const aggregationsChanged = isAggregationsChanged(config, newConfig);\n const columnsChanged = isColumnsChanged(config, newConfig);\n const filterChanged = isFilterChanged(config, newConfig);\n const groupByChanged = isGroupByChanged(config, newConfig);\n const sortChanged = isSortChanged(config, newConfig);\n const visualLinkChanged = isVisualLinkChanged(config, newConfig);\n\n const noChanges = !(\n aggregationsChanged ||\n columnsChanged ||\n filterChanged ||\n groupByChanged ||\n sortChanged ||\n visualLinkChanged\n );\n\n return {\n aggregationsChanged,\n columnsChanged,\n filterChanged,\n groupByChanged,\n noChanges,\n sortChanged,\n visualLinkChanged,\n };\n};\n\nexport const hasGroupBy = (config?: DataSourceConfig): config is WithGroupBy =>\n config !== undefined &&\n config.groupBy !== undefined &&\n config.groupBy.length > 0;\n\nexport const hasFilter = (config?: DataSourceConfig): config is WithFilter =>\n config?.filter !== undefined && config.filter.filter.length > 0;\n\nexport const hasSort = (config?: DataSourceConfig): config is WithSort =>\n config?.sort !== undefined &&\n Array.isArray(config.sort?.sortDefs) &&\n config.sort.sortDefs.length > 0;\n\nexport const isTypeaheadSuggestionProvider = (\n source: unknown\n): source is TypeaheadSuggestionProvider =>\n typeof (source as TypeaheadSuggestionProvider)[\"getTypeaheadSuggestions\"] ===\n \"function\";\n\nexport const isTableSchema = (\n message: VuuUIMessageIn\n): message is VuuUIMessageInTableMeta => message.type === \"TABLE_META_RESP\";\n\nexport const isConnectionStatusMessage = (\n msg: object | ConnectionStatusMessage\n): msg is ConnectionStatusMessage =>\n (msg as ConnectionStatusMessage).type === \"connection-status\";\n\nexport const isConnectionQualityMetrics = (\n msg: object\n): msg is ConnectionQualityMetrics =>\n (msg as ConnectionQualityMetrics).type === \"connection-metrics\";\n\nexport const messageHasResult = (msg: object): msg is VuuUIMessageInRPC =>\n typeof (msg as VuuUIMessageInRPC).result !== \"undefined\";\n\nexport const isErrorResponse = (\n response?: RpcResponse\n): response is VuuUIMessageInRPCEditReject =>\n response !== undefined && \"error\" in response;\n\nexport const hasAction = (\n response?: RpcResponse\n): response is MenuRpcResponse | VuuUIMessageInRPCEditResponse =>\n response != undefined && \"action\" in response;\n\nexport const isViewportMessage = (\n msg: object\n): msg is VuuUIMessageOutViewport => \"viewport\" in msg;\n\nexport const withConfigDefaults = (\n config: DataSourceConfig\n): WithFullConfig & { visualLink?: LinkDescriptorWithLabel } => {\n if (\n config.aggregations &&\n config.columns &&\n config.filter &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datasource-utils.js","sources":["../src/datasource-utils.ts"],"sourcesContent":["import {\n ConnectionQualityMetrics,\n ConnectionStatusMessage,\n DataSourceConfig,\n MenuRpcResponse,\n RpcResponse,\n TypeaheadSuggestionProvider,\n VuuUIMessageIn,\n VuuUIMessageInRPC,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n VuuUIMessageInTableMeta,\n VuuUIMessageOutViewport,\n WithFilter,\n WithFullConfig,\n WithGroupBy,\n WithSort,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n LinkDescriptorWithLabel,\n VuuFilter,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nexport const NoFilter: VuuFilter = { filter: \"\" };\nexport const NoSort: VuuSort = { sortDefs: [] };\n\nexport const vanillaConfig: WithFullConfig = {\n aggregations: [],\n columns: [],\n filter: NoFilter,\n groupBy: [],\n sort: NoSort,\n};\n\nexport type DataSourceConfigChanges = {\n aggregationsChanged: boolean;\n columnsChanged: boolean;\n filterChanged: boolean;\n groupByChanged: boolean;\n sortChanged: boolean;\n visualLinkChanged: boolean;\n};\n\nexport type MaybeDataSourceConfigChanges = DataSourceConfigChanges & {\n noChanges: boolean;\n};\n\ntype DataConfigPredicate = (\n config: DataSourceConfig,\n newConfig: DataSourceConfig\n) => boolean;\n\nconst equivalentAggregations: DataConfigPredicate = (\n { aggregations: agg1 },\n { aggregations: agg2 }\n) =>\n (agg1 === undefined && agg2?.length === 0) ||\n (agg2 === undefined && agg1?.length === 0);\n\nconst equivalentColumns: DataConfigPredicate = (\n { columns: cols1 },\n { columns: cols2 }\n) =>\n (cols1 === undefined && cols2?.length === 0) ||\n (cols2 === undefined && cols1?.length === 0);\n\nconst equivalentFilter: DataConfigPredicate = (\n { filter: f1 },\n { filter: f2 }\n) =>\n (f1 === undefined && f2?.filter === \"\") ||\n (f2 === undefined && f1?.filter === \"\");\n\nconst equivalentGroupBy: DataConfigPredicate = (\n { groupBy: val1 },\n { groupBy: val2 }\n) =>\n (val1 === undefined && val2?.length === 0) ||\n (val2 === undefined && val1?.length === 0);\n\nconst equivalentSort: DataConfigPredicate = ({ sort: s1 }, { sort: s2 }) =>\n (s1 === undefined && s2?.sortDefs.length === 0) ||\n (s2 === undefined && s1?.sortDefs.length === 0);\n\nconst exactlyTheSame = (a: unknown, b: unknown) => {\n if (a === b) {\n return true;\n } else if (a === undefined && b === undefined) {\n return true;\n } else {\n return false;\n }\n};\n\nconst isAggregationsChanged: DataConfigPredicate = (config, newConfig) => {\n const { aggregations: agg1 } = config;\n const { aggregations: agg2 } = newConfig;\n if (exactlyTheSame(agg1, agg2) || equivalentAggregations(config, newConfig)) {\n return false;\n } else if (agg1 === undefined || agg2 === undefined) {\n return true;\n } else if (agg1.length !== agg2.length) {\n return true;\n }\n return agg1.some(\n ({ column, aggType }, i) =>\n column !== agg2[i].column || aggType !== agg2[i].aggType\n );\n};\n\nconst isColumnsChanged: DataConfigPredicate = (config, newConfig) => {\n const { columns: cols1 } = config;\n const { columns: cols2 } = newConfig;\n\n if (exactlyTheSame(cols1, cols2) || equivalentColumns(config, newConfig)) {\n return false;\n } else if (cols1 === undefined || cols2 === undefined) {\n return true;\n } else if (cols1?.length !== cols2?.length) {\n return true;\n }\n return cols1.some((column, i) => column !== cols2?.[i]);\n};\n\nexport const isFilterChanged: DataConfigPredicate = (c1, c2) => {\n if (equivalentFilter(c1, c2)) {\n return false;\n } else {\n return c1.filter?.filter !== c2.filter?.filter;\n }\n};\n\nexport const isGroupByChanged: DataConfigPredicate = (config, newConfig) => {\n const { groupBy: g1 } = config;\n const { groupBy: g2 } = newConfig;\n if (exactlyTheSame(g1, g2) || equivalentGroupBy(config, newConfig)) {\n return false;\n } else if (g1 === undefined || g2 === undefined) {\n return true;\n } else if (g1?.length !== g2?.length) {\n return true;\n }\n return g1.some((column, i) => column !== g2?.[i]);\n};\n\nconst isSortChanged: DataConfigPredicate = (config, newConfig) => {\n const { sort: s1 } = config;\n const { sort: s2 } = newConfig;\n if (exactlyTheSame(s1, s2) || equivalentSort(config, newConfig)) {\n return false;\n } else if (s1 === undefined || s2 === undefined) {\n return true;\n } else if (s1?.sortDefs.length !== s2?.sortDefs.length) {\n return true;\n }\n return s1.sortDefs.some(\n ({ column, sortType }, i) =>\n column !== s2.sortDefs[i].column || sortType !== s2.sortDefs[i].sortType\n );\n};\n\nconst isVisualLinkChanged: DataConfigPredicate = () => {\n // TODO\n return false;\n};\n\nexport const NO_CONFIG_CHANGES: MaybeDataSourceConfigChanges = {\n aggregationsChanged: false,\n columnsChanged: false,\n filterChanged: false,\n groupByChanged: false,\n noChanges: true,\n sortChanged: false,\n visualLinkChanged: false,\n};\n\nexport const isConfigChanged = (\n config: DataSourceConfig | undefined,\n newConfig: DataSourceConfig | undefined\n): MaybeDataSourceConfigChanges => {\n if (exactlyTheSame(config, newConfig)) {\n return NO_CONFIG_CHANGES;\n }\n\n if (config === undefined && newConfig == undefined) {\n return NO_CONFIG_CHANGES;\n } else if (config === undefined) {\n return isConfigChanged({}, newConfig);\n } else if (newConfig === undefined) {\n return isConfigChanged(config, {});\n }\n\n const aggregationsChanged = isAggregationsChanged(config, newConfig);\n const columnsChanged = isColumnsChanged(config, newConfig);\n const filterChanged = isFilterChanged(config, newConfig);\n const groupByChanged = isGroupByChanged(config, newConfig);\n const sortChanged = isSortChanged(config, newConfig);\n const visualLinkChanged = isVisualLinkChanged(config, newConfig);\n\n const noChanges = !(\n aggregationsChanged ||\n columnsChanged ||\n filterChanged ||\n groupByChanged ||\n sortChanged ||\n visualLinkChanged\n );\n\n return {\n aggregationsChanged,\n columnsChanged,\n filterChanged,\n groupByChanged,\n noChanges,\n sortChanged,\n visualLinkChanged,\n };\n};\n\nexport const hasGroupBy = (config?: DataSourceConfig): config is WithGroupBy =>\n config !== undefined &&\n config.groupBy !== undefined &&\n config.groupBy.length > 0;\n\nexport const hasFilter = (config?: DataSourceConfig): config is WithFilter =>\n config?.filter !== undefined && config.filter.filter.length > 0;\n\nexport const hasSort = (config?: DataSourceConfig): config is WithSort =>\n config?.sort !== undefined &&\n Array.isArray(config.sort?.sortDefs) &&\n config.sort.sortDefs.length > 0;\n\nexport const isTypeaheadSuggestionProvider = (\n source: unknown\n): source is TypeaheadSuggestionProvider =>\n typeof (source as TypeaheadSuggestionProvider)[\"getTypeaheadSuggestions\"] ===\n \"function\";\n\nexport const isTableSchemaMessage = (\n message: VuuUIMessageIn\n): message is VuuUIMessageInTableMeta => message.type === \"TABLE_META_RESP\";\n\nexport const isConnectionStatusMessage = (\n msg: object | ConnectionStatusMessage\n): msg is ConnectionStatusMessage =>\n (msg as ConnectionStatusMessage).type === \"connection-status\";\n\nexport const isConnectionQualityMetrics = (\n msg: object\n): msg is ConnectionQualityMetrics =>\n (msg as ConnectionQualityMetrics).type === \"connection-metrics\";\n\nexport const messageHasResult = (msg: object): msg is VuuUIMessageInRPC =>\n typeof (msg as VuuUIMessageInRPC).result !== \"undefined\";\n\nexport const isErrorResponse = (\n response?: RpcResponse\n): response is VuuUIMessageInRPCEditReject =>\n response !== undefined && \"error\" in response;\n\nexport const hasAction = (\n response?: RpcResponse\n): response is MenuRpcResponse | VuuUIMessageInRPCEditResponse =>\n response != undefined && \"action\" in response;\n\nexport const isViewportMessage = (\n msg: object\n): msg is VuuUIMessageOutViewport => \"viewport\" in msg;\n\nexport const withConfigDefaults = (\n config: DataSourceConfig\n): WithFullConfig & { visualLink?: LinkDescriptorWithLabel } => {\n if (\n config.aggregations &&\n config.columns &&\n config.filter &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,11 @@
1
+ import { partition } from './array-utils.js';
2
+ import { wordify } from './text-utils.js';
3
+
1
4
  const env = process.env.NODE_ENV;
5
+ const isCustomFeature = (feature) => feature.leftNavLocation === "vuu-features";
6
+ const isWildcardSchema = (schema) => schema === "*";
7
+ const isTableSchema = (schema) => typeof schema === "object" && typeof schema.module === "string" && typeof schema.table === "string";
8
+ const hasFilterTableFeatureProps = (props) => "tableSchema" in (props?.ComponentProps ?? {});
2
9
  const byModule = (schema1, schema2) => {
3
10
  const m1 = schema1.table.module.toLowerCase();
4
11
  const m2 = schema2.table.module.toLowerCase();
@@ -15,12 +22,93 @@ const byModule = (schema1, schema2) => {
15
22
  }
16
23
  };
17
24
  const getFilterTableFeatures = (schemas, getFeaturePath) => schemas.sort(byModule).map((schema) => ({
25
+ ...getFeaturePath({ env, fileName: "FilterTable" }),
18
26
  ComponentProps: {
19
27
  tableSchema: schema
20
28
  },
21
- title: `${schema.table.module} ${schema.table.table}`,
22
- ...getFeaturePath({ env, fileName: "FilterTable" })
29
+ title: `${schema.table.module} ${schema.table.table}`
23
30
  }));
31
+ const assertComponentRegistered = (componentName, component) => {
32
+ if (typeof component !== "function") {
33
+ console.warn(
34
+ `${componentName} module not loaded, will be unabale to deserialize from layout JSON`
35
+ );
36
+ }
37
+ };
38
+ const getCustomAndTableFeatures = (features, vuuTables) => {
39
+ const [customFeatureConfig, tableFeaturesConfig] = partition(
40
+ Object.values(features),
41
+ isCustomFeature
42
+ );
43
+ const customFeatures = [];
44
+ const tableFeatures = [];
45
+ for (const {
46
+ featureProps = {},
47
+ viewProps,
48
+ ...feature
49
+ } of tableFeaturesConfig) {
50
+ const { schema } = featureProps;
51
+ if (isWildcardSchema(schema) && vuuTables) {
52
+ for (const tableSchema of vuuTables.values()) {
53
+ tableFeatures.push({
54
+ ...feature,
55
+ ComponentProps: {
56
+ tableSchema
57
+ },
58
+ title: `${tableSchema.table.module} ${wordify(
59
+ tableSchema.table.table
60
+ )}`,
61
+ ViewProps: viewProps
62
+ });
63
+ }
64
+ } else if (isTableSchema(schema) && vuuTables) {
65
+ const tableSchema = vuuTables.get(schema.table);
66
+ if (tableSchema) {
67
+ tableFeatures.push({
68
+ ...feature,
69
+ ComponentProps: {
70
+ tableSchema
71
+ },
72
+ ViewProps: viewProps
73
+ });
74
+ }
75
+ }
76
+ }
77
+ for (const {
78
+ featureProps = {},
79
+ viewProps,
80
+ ...feature
81
+ } of customFeatureConfig) {
82
+ const { schema, schemas } = featureProps;
83
+ if (isTableSchema(schema) && vuuTables) {
84
+ const tableSchema = vuuTables.get(schema.table);
85
+ customFeatures.push({
86
+ ...feature,
87
+ ComponentProps: {
88
+ tableSchema
89
+ },
90
+ ViewProps: viewProps
91
+ });
92
+ } else if (Array.isArray(schemas) && vuuTables) {
93
+ customFeatures.push({
94
+ ...feature,
95
+ ComponentProps: schemas.reduce(
96
+ (map, schema2) => {
97
+ map[`${schema2.table}Schema`] = vuuTables.get(
98
+ schema2.table
99
+ );
100
+ return map;
101
+ },
102
+ {}
103
+ ),
104
+ ViewProps: viewProps
105
+ });
106
+ } else {
107
+ customFeatures.push(feature);
108
+ }
109
+ }
110
+ return [customFeatures, tableFeatures];
111
+ };
24
112
 
25
- export { env, getFilterTableFeatures };
113
+ export { assertComponentRegistered, byModule, env, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isTableSchema, isWildcardSchema };
26
114
  //# sourceMappingURL=feature-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-utils.js","sources":["../src/feature-utils.ts"],"sourcesContent":["import { FeatureConfig, FeatureProps } from \"@vuu-ui/vuu-shell\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\n\nexport type PathMap = { [key: string]: Pick<FeatureConfig, \"css\" | \"url\"> };\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\n// Sort TableScheas by module\nconst byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => FeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths\n): FeatureProps<FilterTableFeatureProps>[] =>\n schemas.sort(byModule).map((schema) => ({\n ComponentProps: {\n tableSchema: schema,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n }));\n"],"names":[],"mappings":"AAKa,MAAA,GAAA,GAAM,QAAQ,GAAI,CAAA,SAAA;AAO/B,MAAM,QAAA,GAAW,CAAC,OAAA,EAAsB,OAAyB,KAAA;AAC/D,EAAA,MAAM,EAAK,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAC5C,EAAA,MAAM,EAAK,GAAA,OAAA,CAAQ,KAAM,CAAA,MAAA,CAAO,WAAY,EAAA,CAAA;AAC5C,EAAA,IAAI,KAAK,EAAI,EAAA;AACX,IAAO,OAAA,CAAA,CAAA,CAAA;AAAA,GACT,MAAA,IAAW,KAAK,EAAI,EAAA;AAClB,IAAO,OAAA,CAAA,CAAA;AAAA,aACE,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,KAAO,EAAA;AACpD,IAAO,OAAA,CAAA,CAAA,CAAA;AAAA,aACE,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,KAAO,EAAA;AACpD,IAAO,OAAA,CAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAQa,MAAA,sBAAA,GAAyB,CACpC,OAAA,EACA,cAEA,KAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA,CAAE,GAAI,CAAA,CAAC,MAAY,MAAA;AAAA,EACtC,cAAgB,EAAA;AAAA,IACd,WAAa,EAAA,MAAA;AAAA,GACf;AAAA,EACA,KAAA,EAAO,GAAG,MAAO,CAAA,KAAA,CAAM,MAAM,CAAI,CAAA,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAA;AAAA,EACnD,GAAG,cAAe,CAAA,EAAE,GAAK,EAAA,QAAA,EAAU,eAAe,CAAA;AACpD,CAAE,CAAA;;;;"}
1
+ {"version":3,"file":"feature-utils.js","sources":["../src/feature-utils.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport type { FeatureProps } from \"@vuu-ui/vuu-shell\";\nimport { partition } from \"./array-utils\";\nimport { wordify } from \"./text-utils\";\n\nexport type PathMap = { [key: string]: Pick<FeatureConfig, \"css\" | \"url\"> };\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport interface ViewConfig {\n closeable?: boolean;\n header?: boolean;\n}\n\ndeclare global {\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport interface FeatureConfig {\n name: string;\n title: string;\n url: string;\n css?: string;\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n featureProps?: {\n schema?: \"*\" | VuuTable;\n schemas?: VuuTable[];\n };\n viewProps?: ViewConfig;\n}\n\nexport interface VuuConfig {\n features: Features;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\nexport type Features = {\n [key: string]: FeatureConfig;\n};\nexport interface VuuConfig {\n features: Features;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\nexport const isCustomFeature = (feature: FeatureConfig) =>\n feature.leftNavLocation === \"vuu-features\";\n\nexport const isWildcardSchema = (schema?: \"*\" | VuuTable): schema is \"*\" =>\n schema === \"*\";\nexport const isTableSchema = (schema?: \"*\" | VuuTable): schema is VuuTable =>\n typeof schema === \"object\" &&\n typeof schema.module === \"string\" &&\n typeof schema.table === \"string\";\n\nexport interface FeaturePropsWithFilterTableFeature\n extends Omit<FeatureProps, \"ComponentProps\"> {\n ComponentProps: FilterTableFeatureProps;\n}\n\nexport const hasFilterTableFeatureProps = (\n props: FeatureProps\n): props is FeaturePropsWithFilterTableFeature =>\n \"tableSchema\" in (props?.ComponentProps ?? {});\n\n// Sort TableScheas by module\nexport const byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => FeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths\n) =>\n schemas\n .sort(byModule)\n .map<FeatureProps<FilterTableFeatureProps>>((schema) => ({\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n ComponentProps: {\n tableSchema: schema,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport const assertComponentRegistered = (\n componentName: string,\n component: unknown\n) => {\n if (typeof component !== \"function\") {\n console.warn(\n `${componentName} module not loaded, will be unabale to deserialize from layout JSON`\n );\n }\n};\n\nexport const getCustomAndTableFeatures = (\n features: Features,\n vuuTables: Map<string, TableSchema>\n): [FeatureProps[], FeatureProps<FilterTableFeatureProps>[]] => {\n const [customFeatureConfig, tableFeaturesConfig] = partition(\n Object.values(features),\n isCustomFeature\n );\n\n const customFeatures: FeatureProps[] = [];\n const tableFeatures: FeatureProps<FilterTableFeatureProps>[] = [];\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of tableFeaturesConfig) {\n const { schema } = featureProps;\n if (isWildcardSchema(schema) && vuuTables) {\n for (const tableSchema of vuuTables.values()) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n title: `${tableSchema.table.module} ${wordify(\n tableSchema.table.table\n )}`,\n ViewProps: viewProps,\n });\n }\n } else if (isTableSchema(schema) && vuuTables) {\n const tableSchema = vuuTables.get(schema.table);\n if (tableSchema) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n ViewProps: viewProps,\n });\n }\n }\n }\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of customFeatureConfig) {\n const { schema, schemas } = featureProps;\n if (isTableSchema(schema) && vuuTables) {\n const tableSchema = vuuTables.get(schema.table);\n customFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n ViewProps: viewProps,\n });\n } else if (Array.isArray(schemas) && vuuTables) {\n customFeatures.push({\n ...feature,\n ComponentProps: schemas.reduce<Record<string, TableSchema>>(\n (map, schema) => {\n map[`${schema.table}Schema`] = vuuTables.get(\n schema.table\n ) as TableSchema;\n return map;\n },\n {}\n ),\n ViewProps: viewProps,\n });\n } else {\n customFeatures.push(feature);\n }\n }\n return [customFeatures, tableFeatures];\n};\n"],"names":["schema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filterAsQuery.js","sources":["../../src/filters/filterAsQuery.ts"],"sourcesContent":["import {\n ColumnDescriptorsByName,\n Filter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { RuntimeColumnDescriptor } from \"packages/vuu-table-types\";\nimport { isDateTimeColumn } from \"../column-utils\";\nimport { isMultiClauseFilter, isMultiValueFilter } from \"./utils\";\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst quotedStrings = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst removeOuterMostParentheses = (s: string) => s.replace(/^\\((.*)\\)$/, \"$1\");\n\nexport const filterAsQuery = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n return removeOuterMostParentheses(filterAsQueryCore(f, opts));\n};\n\nconst filterAsQueryCore = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n if (isMultiClauseFilter(f)) {\n const multiClauseFilter = f.filters\n .map((filter) => filterAsQueryCore(filter, opts))\n .join(` ${f.op} `);\n return `(${multiClauseFilter})`;\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(\",\")}]`;\n } else {\n return singleValueFilterAsQuery(f, opts);\n }\n};\n\nfunction singleValueFilterAsQuery(\n f: SingleValueFilterClause,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string {\n const column = opts?.columnsByName?.[f.column];\n if (column && isDateTimeColumn(column)) {\n return dateFilterAsQuery(f as SingleValueFilterClause<number>);\n } else {\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst ONE_DAY_IN_MILIS = 1000 * 60 * 60 * 24;\nexport function dateFilterAsQuery(f: SingleValueFilterClause<number>): string {\n switch (f.op) {\n case \"=\": {\n const filters: Array<Filter> = [\n { op: \">=\", column: f.column, value: f.value },\n {\n op: \"<\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"and\", filters });\n }\n case \"!=\": {\n const filters: Array<Filter> = [\n { op: \"<\", column: f.column, value: f.value },\n {\n op: \">=\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"or\", filters });\n }\n default:\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst defaultSingleValueFilterAsQuery = (f: SingleValueFilterClause) =>\n `${f.column} ${f.op} ${filterValue(f.value)}`;\n\nexport const removeColumnFromFilter = (\n column: RuntimeColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filterAsQuery.js","sources":["../../src/filters/filterAsQuery.ts"],"sourcesContent":["import {\n ColumnDescriptorsByName,\n Filter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isDateTimeColumn } from \"../column-utils\";\nimport { isMultiClauseFilter, isMultiValueFilter } from \"./utils\";\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst quotedStrings = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst removeOuterMostParentheses = (s: string) => s.replace(/^\\((.*)\\)$/, \"$1\");\n\nexport const filterAsQuery = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n return removeOuterMostParentheses(filterAsQueryCore(f, opts));\n};\n\nconst filterAsQueryCore = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string => {\n if (isMultiClauseFilter(f)) {\n const multiClauseFilter = f.filters\n .map((filter) => filterAsQueryCore(filter, opts))\n .join(` ${f.op} `);\n return `(${multiClauseFilter})`;\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(\",\")}]`;\n } else {\n return singleValueFilterAsQuery(f, opts);\n }\n};\n\nfunction singleValueFilterAsQuery(\n f: SingleValueFilterClause,\n opts?: { columnsByName?: ColumnDescriptorsByName }\n): string {\n const column = opts?.columnsByName?.[f.column];\n if (column && isDateTimeColumn(column)) {\n return dateFilterAsQuery(f as SingleValueFilterClause<number>);\n } else {\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst ONE_DAY_IN_MILIS = 1000 * 60 * 60 * 24;\nexport function dateFilterAsQuery(f: SingleValueFilterClause<number>): string {\n switch (f.op) {\n case \"=\": {\n const filters: Array<Filter> = [\n { op: \">=\", column: f.column, value: f.value },\n {\n op: \"<\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"and\", filters });\n }\n case \"!=\": {\n const filters: Array<Filter> = [\n { op: \"<\", column: f.column, value: f.value },\n {\n op: \">=\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"or\", filters });\n }\n default:\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst defaultSingleValueFilterAsQuery = (f: SingleValueFilterClause) =>\n `${f.column} ${f.op} ${filterValue(f.value)}`;\n\nexport const removeColumnFromFilter = (\n column: RuntimeColumnDescriptor,\n filter: Filter\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -8,7 +8,7 @@ export { MEASURES } from './common-types.js';
8
8
  export { importCSS } from './css-utils.js';
9
9
  export { DOWN1, DOWN2, UP1, UP2, getMovingValueDirection, isValidNumber, shallowEquals } from './data-utils.js';
10
10
  export { isViewportMenusAction, isVisualLinkCreatedAction, isVisualLinkRemovedAction, isVisualLinksAction, isVuuFeatureAction } from './datasource-action-utils.js';
11
- export { NO_CONFIG_CHANGES, NoFilter, NoSort, hasAction, hasFilter, hasGroupBy, hasSort, isConfigChanged, isConnectionQualityMetrics, isConnectionStatusMessage, isErrorResponse, isFilterChanged, isGroupByChanged, isTableSchema, isTypeaheadSuggestionProvider, isViewportMessage, messageHasResult, vanillaConfig, withConfigDefaults } from './datasource-utils.js';
11
+ export { NO_CONFIG_CHANGES, NoFilter, NoSort, hasAction, hasFilter, hasGroupBy, hasSort, isConfigChanged, isConnectionQualityMetrics, isConnectionStatusMessage, isErrorResponse, isFilterChanged, isGroupByChanged, isTableSchemaMessage, isTypeaheadSuggestionProvider, isViewportMessage, messageHasResult, vanillaConfig, withConfigDefaults } from './datasource-utils.js';
12
12
  export { formatDate, getDateFormatter } from './date/formatter.js';
13
13
  export { dateTimeLabelByType, isDatePattern, isDateTimePattern, isTimePattern, supportedDateTimePatterns } from './date/types.js';
14
14
  export { toCalendarDate } from './date/date-utils.js';
@@ -18,7 +18,7 @@ export { applyFilterToColumns, extractFilterForColumn, isAndFilter, isCompleteFi
18
18
  export { dateFilterAsQuery, filterAsQuery, removeColumnFromFilter } from './filters/filterAsQuery.js';
19
19
  export { createEl, dispatchCustomEvent, dispatchKeyboardEvent, dispatchMouseEvent, focusFirstFocusableElement, getClosest, getClosestIndexItem, getElementByDataIndex, getElementDataIndex, getFocusableElement, getScrollbarSize, hasOpenOptionList, isSelectableElement, queryClosest } from './html-utils.js';
20
20
  export { EventEmitter } from './event-emitter.js';
21
- export { env, getFilterTableFeatures } from './feature-utils.js';
21
+ export { assertComponentRegistered, byModule, env, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isTableSchema, isWildcardSchema } from './feature-utils.js';
22
22
  export { getFieldName } from './form-utils.js';
23
23
  export { defaultValueFormatter, getValueFormatter, numericFormatter } from './formatting-utils.js';
24
24
  export { getUniqueId } from './getUniqueId.js';
@@ -32,7 +32,7 @@ export { KeySet } from './keyset.js';
32
32
  export { getSelectedOption } from './list-utils.js';
33
33
  export { getAllLocalEntity, getLocalEntity, saveLocalEntity } from './local-storage-utils.js';
34
34
  export { getLoggingConfigForWorker, logger } from './logging-utils.js';
35
- export { buildMenuDescriptorFromVuuMenu, getMenuRpcRequest, isCellMenu, isGroupMenuItemDescriptor, isRoot, isRowMenu, isSelectionMenu, isTableLocation } from './menu-utils.js';
35
+ export { buildMenuDescriptorFromVuuMenu, getMenuRpcRequest, isCellMenu, isGroupMenuItemDescriptor, isOpenBulkEditResponse, isRoot, isRowMenu, isSelectionMenu, isTableLocation } from './menu-utils.js';
36
36
  export { assertModuleExportsAtLeastOneComponent, isModule } from './module-utils.js';
37
37
  export { uuid } from './nanoid/index.js';
38
38
  export { asReactElements } from './react-utils.js';
@@ -43,6 +43,7 @@ export { NULL_RANGE, WindowRange, getFullRange, rangeNewItems, rangesAreSame, re
43
43
  export { actualRowPositioning, asDataSourceRowObject, getIndexFromRowElement, getRowElementAtIndex, virtualRowPositioning } from './row-utils.js';
44
44
  export { RowSelected, deselectItem, expandSelection, getSelectionStatus, isRowSelected, isRowSelectedLast, isSelected, selectItem } from './selection-utils.js';
45
45
  export { addSortColumn, setSortColumn, toggleOrApplySort } from './sort-utils.js';
46
+ export { getVuuTable } from './table-schema-utils.js';
46
47
  export { lastWord, wordify } from './text-utils.js';
47
48
  export { DEFAULT_DENSITY, DEFAULT_THEME, DEFAULT_THEME_MODE, ThemeContext, ThemeProvider, useThemeAttributes } from './ThemeProvider.js';
48
49
  export { isNotNullOrUndefined } from './ts-utils.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/esm/menu-utils.js CHANGED
@@ -137,6 +137,7 @@ const getMenuRpcRequest = (options) => {
137
137
  };
138
138
  }
139
139
  };
140
+ const isOpenBulkEditResponse = (res) => res.rpcName === "VP_BULK_EDIT_BEGIN_RPC";
140
141
 
141
- export { buildMenuDescriptorFromVuuMenu, getMenuRpcRequest, isCellMenu, isGroupMenuItemDescriptor, isRoot, isRowMenu, isSelectionMenu, isTableLocation };
142
+ export { buildMenuDescriptorFromVuuMenu, getMenuRpcRequest, isCellMenu, isGroupMenuItemDescriptor, isOpenBulkEditResponse, isRoot, isRowMenu, isSelectionMenu, isTableLocation };
142
143
  //# sourceMappingURL=menu-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu-utils.js","sources":["../src/menu-utils.ts"],"sourcesContent":["import {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n DataSourceRow,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRPC,\n ClientToServerMenuRowRPC,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n TableMenuLocation,\n VuuCellMenuItem,\n VuuRowMenuItem,\n} from \"@vuu-ui/vuu-table-types\";\nimport { getRowRecord, metadataKeys, type ColumnMap } from \"./column-utils\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst { KEY } = metadataKeys;\n\nexport const isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nexport const isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\n\nexport const isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\n\nexport const isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isTableLocation = (\n location: string\n): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nconst isVuuMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: TableMenuLocation,\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nexport const buildMenuDescriptorFromVuuMenu = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isVuuMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu-utils.js","sources":["../src/menu-utils.ts"],"sourcesContent":["import {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n DataSourceRow,\n MenuRpcResponse,\n OpenDialogAction,\n RpcResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRPC,\n ClientToServerMenuRowRPC,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n TableMenuLocation,\n VuuCellMenuItem,\n VuuRowMenuItem,\n} from \"@vuu-ui/vuu-table-types\";\nimport { getRowRecord, metadataKeys, type ColumnMap } from \"./column-utils\";\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst { KEY } = metadataKeys;\n\nexport const isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nexport const isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\n\nexport const isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\n\nexport const isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isTableLocation = (\n location: string\n): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nconst isVuuMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: TableMenuLocation,\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nexport const buildMenuDescriptorFromVuuMenu = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isVuuMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport const isOpenBulkEditResponse = (\n res: RpcResponse\n): res is MenuRpcResponse<OpenDialogAction> =>\n (res as MenuRpcResponse).rpcName === \"VP_BULK_EDIT_BEGIN_RPC\";\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ const getVuuTable = (schemaTable) => {
2
+ if (schemaTable.session) {
3
+ const { module, session } = schemaTable;
4
+ return { module, table: session };
5
+ } else {
6
+ return schemaTable;
7
+ }
8
+ };
9
+
10
+ export { getVuuTable };
11
+ //# sourceMappingURL=table-schema-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-schema-utils.js","sources":["../src/table-schema-utils.ts"],"sourcesContent":["import { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nexport const getVuuTable = (schemaTable: TableSchemaTable): VuuTable => {\n if (schemaTable.session) {\n const { module, session } = schemaTable;\n return { module, table: session };\n } else {\n return schemaTable;\n }\n};\n"],"names":[],"mappings":"AAGa,MAAA,WAAA,GAAc,CAAC,WAA4C,KAAA;AACtE,EAAA,IAAI,YAAY,OAAS,EAAA;AACvB,IAAM,MAAA,EAAE,MAAQ,EAAA,OAAA,EAAY,GAAA,WAAA,CAAA;AAC5B,IAAO,OAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,OAAQ,EAAA,CAAA;AAAA,GAC3B,MAAA;AACL,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AACF;;;;"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
- "version": "0.8.60",
2
+ "version": "0.8.62",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "types": "types/index.d.ts",
6
6
  "devDependencies": {
7
- "@vuu-ui/vuu-data-types": "0.8.60",
8
- "@vuu-ui/vuu-table-types": "0.8.60",
9
- "@vuu-ui/vuu-filter-types": "0.8.60",
10
- "@vuu-ui/vuu-protocol-types": "0.8.60"
7
+ "@vuu-ui/vuu-data-types": "0.8.62",
8
+ "@vuu-ui/vuu-table-types": "0.8.62",
9
+ "@vuu-ui/vuu-filter-types": "0.8.62",
10
+ "@vuu-ui/vuu-protocol-types": "0.8.62"
11
11
  },
12
12
  "peerDependencies": {
13
13
  "@internationalized/date": "^3.0.0",
14
- "@vuu-ui/vuu-filter-parser": "0.8.60",
14
+ "@vuu-ui/vuu-filter-parser": "0.8.62",
15
15
  "clsx": "^2.0.0",
16
16
  "react": ">=17.0.2",
17
17
  "react-dom": ">=17.0.2"
@@ -23,7 +23,7 @@ export declare const hasGroupBy: (config?: DataSourceConfig) => config is WithGr
23
23
  export declare const hasFilter: (config?: DataSourceConfig) => config is WithFilter;
24
24
  export declare const hasSort: (config?: DataSourceConfig) => config is WithSort;
25
25
  export declare const isTypeaheadSuggestionProvider: (source: unknown) => source is TypeaheadSuggestionProvider;
26
- export declare const isTableSchema: (message: VuuUIMessageIn) => message is VuuUIMessageInTableMeta;
26
+ export declare const isTableSchemaMessage: (message: VuuUIMessageIn) => message is VuuUIMessageInTableMeta;
27
27
  export declare const isConnectionStatusMessage: (msg: object | ConnectionStatusMessage) => msg is ConnectionStatusMessage;
28
28
  export declare const isConnectionQualityMetrics: (msg: object) => msg is ConnectionQualityMetrics;
29
29
  export declare const messageHasResult: (msg: object) => msg is VuuUIMessageInRPC;
@@ -1,16 +1,61 @@
1
- import { FeatureConfig, FeatureProps } from "@vuu-ui/vuu-shell";
2
- import { TableSchema } from "@vuu-ui/vuu-data-types";
1
+ import type { TableSchema } from "@vuu-ui/vuu-data-types";
2
+ import type { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
+ import type { FeatureProps } from "@vuu-ui/vuu-shell";
3
4
  export type PathMap = {
4
5
  [key: string]: Pick<FeatureConfig, "css" | "url">;
5
6
  };
6
7
  export type Environment = "development" | "production";
7
8
  export declare const env: Environment;
9
+ export interface ViewConfig {
10
+ closeable?: boolean;
11
+ header?: boolean;
12
+ }
13
+ declare global {
14
+ const vuuConfig: Promise<VuuConfig>;
15
+ }
16
+ export interface FeatureConfig {
17
+ name: string;
18
+ title: string;
19
+ url: string;
20
+ css?: string;
21
+ leftNavLocation: "vuu-features" | "vuu-tables";
22
+ featureProps?: {
23
+ schema?: "*" | VuuTable;
24
+ schemas?: VuuTable[];
25
+ };
26
+ viewProps?: ViewConfig;
27
+ }
28
+ export interface VuuConfig {
29
+ features: Features;
30
+ authUrl?: string;
31
+ websocketUrl: string;
32
+ ssl: boolean;
33
+ }
8
34
  export interface FilterTableFeatureProps {
9
35
  tableSchema: TableSchema;
10
36
  }
37
+ export type Features = {
38
+ [key: string]: FeatureConfig;
39
+ };
40
+ export interface VuuConfig {
41
+ features: Features;
42
+ authUrl?: string;
43
+ websocketUrl: string;
44
+ ssl: boolean;
45
+ }
46
+ export declare const isCustomFeature: (feature: FeatureConfig) => boolean;
47
+ export declare const isWildcardSchema: (schema?: "*" | VuuTable) => schema is "*";
48
+ export declare const isTableSchema: (schema?: "*" | VuuTable) => schema is VuuTable;
49
+ export interface FeaturePropsWithFilterTableFeature extends Omit<FeatureProps, "ComponentProps"> {
50
+ ComponentProps: FilterTableFeatureProps;
51
+ }
52
+ export declare const hasFilterTableFeatureProps: (props: FeatureProps) => props is FeaturePropsWithFilterTableFeature;
53
+ export declare const byModule: (schema1: TableSchema, schema2: TableSchema) => 0 | 1 | -1;
11
54
  export type GetFeaturePaths = (params: {
12
55
  env: Environment;
13
56
  fileName: string;
14
57
  withCss?: boolean;
15
58
  }) => FeatureProps;
16
59
  export declare const getFilterTableFeatures: (schemas: TableSchema[], getFeaturePath: GetFeaturePaths) => FeatureProps<FilterTableFeatureProps>[];
60
+ export declare const assertComponentRegistered: (componentName: string, component: unknown) => void;
61
+ export declare const getCustomAndTableFeatures: (features: Features, vuuTables: Map<string, TableSchema>) => [FeatureProps[], FeatureProps<FilterTableFeatureProps>[]];
@@ -1,5 +1,5 @@
1
1
  import { ColumnDescriptorsByName, Filter, SingleValueFilterClause } from "@vuu-ui/vuu-filter-types";
2
- import { RuntimeColumnDescriptor } from "packages/vuu-table-types";
2
+ import type { RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
3
  export declare const filterAsQuery: (f: Filter, opts?: {
4
4
  columnsByName?: ColumnDescriptorsByName;
5
5
  }) => string;
package/types/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export * from "./range-utils";
39
39
  export * from "./row-utils";
40
40
  export * from "./selection-utils";
41
41
  export * from "./sort-utils";
42
+ export * from "./table-schema-utils";
42
43
  export * from "./text-utils";
43
44
  export * from "./ThemeProvider";
44
45
  export * from "./ts-utils";
@@ -1,4 +1,4 @@
1
- import { ContextMenuGroupItemDescriptor, ContextMenuItemDescriptor, DataSourceRow } from "@vuu-ui/vuu-data-types";
1
+ import { ContextMenuGroupItemDescriptor, ContextMenuItemDescriptor, DataSourceRow, MenuRpcResponse, OpenDialogAction, RpcResponse } from "@vuu-ui/vuu-data-types";
2
2
  import { ClientToServerMenuRPC, VuuMenu, VuuMenuItem } from "@vuu-ui/vuu-protocol-types";
3
3
  import { TableMenuLocation, VuuCellMenuItem, VuuRowMenuItem } from "@vuu-ui/vuu-table-types";
4
4
  import { type ColumnMap } from "./column-utils";
@@ -17,3 +17,4 @@ export declare const isGroupMenuItemDescriptor: (menuItem?: ContextMenuItemDescr
17
17
  export declare const isTableLocation: (location: string) => location is TableMenuLocation;
18
18
  export declare const buildMenuDescriptorFromVuuMenu: (menu: VuuMenu | VuuMenuItem, tableLocation: TableMenuLocation, options: VuuServerMenuOptions) => ContextMenuItemDescriptor | undefined;
19
19
  export declare const getMenuRpcRequest: (options: VuuMenuItem) => Omit<ClientToServerMenuRPC, "vpId">;
20
+ export declare const isOpenBulkEditResponse: (res: RpcResponse) => res is MenuRpcResponse<OpenDialogAction>;
@@ -0,0 +1,3 @@
1
+ import { TableSchemaTable } from "@vuu-ui/vuu-data-types";
2
+ import { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
+ export declare const getVuuTable: (schemaTable: TableSchemaTable) => VuuTable;