@vuu-ui/vuu-utils 0.8.74 → 0.8.76

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.
@@ -21,8 +21,21 @@ const isTypeCompatible = (rendererType, serverDataType) => {
21
21
  return rendererType === serverDataType;
22
22
  }
23
23
  };
24
- const isContainer = (componentType) => containersSet.has(componentType);
25
- const isView = (componentType) => viewsSet.has(componentType);
24
+ const assertComponentRegistered = (componentType) => {
25
+ if (!layoutComponentsMap.has(componentType)) {
26
+ console.warn(
27
+ `isContainer check on ${componentType}, which has not been registered`
28
+ );
29
+ }
30
+ };
31
+ const isContainer = (componentType) => {
32
+ assertComponentRegistered(componentType);
33
+ return containersSet.has(componentType);
34
+ };
35
+ const isView = (componentType) => {
36
+ assertComponentRegistered(componentType);
37
+ return viewsSet.has(componentType);
38
+ };
26
39
  const isLayoutComponent = (componentType) => isContainer(componentType) || isView(componentType);
27
40
  const isCellRenderer = (type, component) => component !== void 0 && type === "cell-renderer";
28
41
  const isColumnHeaderContentRenderer = (type, component) => type === "column-header-content-renderer";
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (\n row: DataSourceRow,\n columnMap: ColumnMap\n) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<string, FC<HeaderCellProps>>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType:\n | VuuColumnDataType\n | (VuuColumnDataType | \"json\")[]\n | \"json\"\n | \"private\"\n | undefined,\n serverDataType: VuuColumnDataType | \"json\"\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n return rendererType.includes(serverDataType);\n } else {\n return rendererType === serverDataType;\n }\n};\n\nexport const isContainer = (componentType: string) =>\n containersSet.has(componentType);\nexport const isView = (componentType: string) => viewsSet.has(componentType);\nexport const isLayoutComponent = (\n componentType: string\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n serverDataType?: VuuColumnDataType | \"json\"\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (serverDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, serverDataType)\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n }\n}\n"],"names":["isTypeDescriptor","isColumnTypeRenderer"],"mappings":"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"}
1
+ {"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (\n row: DataSourceRow,\n columnMap: ColumnMap\n) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<string, FC<HeaderCellProps>>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType:\n | VuuColumnDataType\n | (VuuColumnDataType | \"json\")[]\n | \"json\"\n | \"private\"\n | undefined,\n serverDataType: VuuColumnDataType | \"json\"\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n return rendererType.includes(serverDataType);\n } else {\n return rendererType === serverDataType;\n }\n};\n\nconst assertComponentRegistered = (componentType: string) => {\n if (!layoutComponentsMap.has(componentType)) {\n console.warn(\n `isContainer check on ${componentType}, which has not been registered`\n );\n }\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isContainer = (componentType: string) => {\n assertComponentRegistered(componentType);\n return containersSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isView = (componentType: string) => {\n assertComponentRegistered(componentType);\n return viewsSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isLayoutComponent = (\n componentType: string\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n serverDataType?: VuuColumnDataType | \"json\"\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (serverDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, serverDataType)\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n }\n}\n"],"names":["isTypeDescriptor","isColumnTypeRenderer"],"mappings":"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"}
@@ -5,13 +5,13 @@ const NoSort = { sortDefs: [] };
5
5
  const vanillaConfig = {
6
6
  aggregations: [],
7
7
  columns: [],
8
- filter: NoFilter,
8
+ filterSpec: NoFilter,
9
9
  groupBy: [],
10
10
  sort: NoSort
11
11
  };
12
12
  const equivalentAggregations = ({ aggregations: agg1 }, { aggregations: agg2 }) => agg1 === void 0 && agg2?.length === 0 || agg2 === void 0 && agg1?.length === 0;
13
13
  const equivalentColumns = ({ columns: cols1 }, { columns: cols2 }) => cols1 === void 0 && cols2?.length === 0 || cols2 === void 0 && cols1?.length === 0;
14
- const equivalentFilter = ({ filter: f1 }, { filter: f2 }) => f1 === void 0 && f2?.filter === "" || f2 === void 0 && f1?.filter === "";
14
+ const equivalentFilter = ({ filterSpec: f1 }, { filterSpec: f2 }) => f1 === void 0 && f2?.filter === "" || f2 === void 0 && f1?.filter === "";
15
15
  const equivalentGroupBy = ({ groupBy: val1 }, { groupBy: val2 }) => val1 === void 0 && val2?.length === 0 || val2 === void 0 && val1?.length === 0;
16
16
  const equivalentSort = ({ sort: s1 }, { sort: s2 }) => s1 === void 0 && s2?.sortDefs.length === 0 || s2 === void 0 && s1?.sortDefs.length === 0;
17
17
  const exactlyTheSame = (a, b) => {
@@ -53,7 +53,7 @@ const isFilterChanged = (c1, c2) => {
53
53
  if (equivalentFilter(c1, c2)) {
54
54
  return false;
55
55
  } else {
56
- return c1.filter?.filter !== c2.filter?.filter;
56
+ return c1.filterSpec?.filter !== c2.filterSpec?.filter;
57
57
  }
58
58
  };
59
59
  const isGroupByChanged = (config, newConfig) => {
@@ -123,7 +123,7 @@ const isConfigChanged = (config, newConfig) => {
123
123
  };
124
124
  };
125
125
  const hasGroupBy = (config) => config !== void 0 && config.groupBy !== void 0 && config.groupBy.length > 0;
126
- const hasFilter = (config) => config?.filter !== void 0 && config.filter.filter.length > 0;
126
+ const hasFilter = (config) => config?.filterSpec !== void 0 && config.filterSpec.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
129
  const isTableSchemaMessage = (message) => message.type === "TABLE_META_RESP";
@@ -134,13 +134,13 @@ const isErrorResponse = (response) => response?.type === "VP_EDIT_RPC_REJECT";
134
134
  const hasAction = (response) => response != void 0 && "action" in response;
135
135
  const isViewportMessage = (msg) => "viewport" in msg;
136
136
  const withConfigDefaults = (config) => {
137
- if (config.aggregations && config.columns && config.filter && config.groupBy && config.sort) {
137
+ if (config.aggregations && config.columns && config.filterSpec && config.groupBy && config.sort) {
138
138
  return config;
139
139
  } else {
140
140
  const {
141
141
  aggregations = [],
142
142
  columns = [],
143
- filter = { filter: "" },
143
+ filterSpec: filter = { filter: "" },
144
144
  groupBy = [],
145
145
  sort = { sortDefs: [] },
146
146
  visualLink
@@ -148,7 +148,7 @@ const withConfigDefaults = (config) => {
148
148
  return {
149
149
  aggregations,
150
150
  columns,
151
- filter,
151
+ filterSpec: filter,
152
152
  groupBy,
153
153
  sort,
154
154
  visualLink
@@ -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 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?: Partial<RpcResponse>\n): response is VuuUIMessageInRPCEditReject =>\n response?.type === \"VP_EDIT_RPC_REJECT\";\n\nexport const hasAction = (\n response?: Partial<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 filterSpec: 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 { filterSpec: f1 },\n { filterSpec: 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.filterSpec?.filter !== c2.filterSpec?.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?.filterSpec !== undefined && config.filterSpec.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?: Partial<RpcResponse>\n): response is VuuUIMessageInRPCEditReject =>\n response?.type === \"VP_EDIT_RPC_REJECT\";\n\nexport const hasAction = (\n response?: Partial<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.filterSpec &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filterSpec: filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filterSpec: filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":";;AAwBa,MAAA,QAAA,GAAsB,EAAE,MAAA,EAAQ,EAAG,GAAA;AACzC,MAAM,MAAkB,GAAA,EAAE,QAAU,EAAA,EAAG,GAAA;AAEvC,MAAM,aAAgC,GAAA;AAAA,EAC3C,cAAc,EAAC;AAAA,EACf,SAAS,EAAC;AAAA,EACV,UAAY,EAAA,QAAA;AAAA,EACZ,SAAS,EAAC;AAAA,EACV,IAAM,EAAA,MAAA;AACR,EAAA;AAoBA,MAAM,yBAA8C,CAClD,EAAE,cAAc,IAAK,EAAA,EACrB,EAAE,YAAc,EAAA,IAAA,EAEf,KAAA,IAAA,KAAS,UAAa,IAAM,EAAA,MAAA,KAAW,KACvC,IAAS,KAAA,KAAA,CAAA,IAAa,MAAM,MAAW,KAAA,CAAA,CAAA;AAE1C,MAAM,oBAAyC,CAC7C,EAAE,SAAS,KAAM,EAAA,EACjB,EAAE,OAAS,EAAA,KAAA,EAEV,KAAA,KAAA,KAAU,UAAa,KAAO,EAAA,MAAA,KAAW,KACzC,KAAU,KAAA,KAAA,CAAA,IAAa,OAAO,MAAW,KAAA,CAAA,CAAA;AAE5C,MAAM,mBAAwC,CAC5C,EAAE,YAAY,EAAG,EAAA,EACjB,EAAE,UAAY,EAAA,EAAA,EAEb,KAAA,EAAA,KAAO,UAAa,EAAI,EAAA,MAAA,KAAW,MACnC,EAAO,KAAA,KAAA,CAAA,IAAa,IAAI,MAAW,KAAA,EAAA,CAAA;AAEtC,MAAM,oBAAyC,CAC7C,EAAE,SAAS,IAAK,EAAA,EAChB,EAAE,OAAS,EAAA,IAAA,EAEV,KAAA,IAAA,KAAS,UAAa,IAAM,EAAA,MAAA,KAAW,KACvC,IAAS,KAAA,KAAA,CAAA,IAAa,MAAM,MAAW,KAAA,CAAA,CAAA;AAE1C,MAAM,cAAA,GAAsC,CAAC,EAAE,IAAA,EAAM,IAAM,EAAA,EAAE,MAAM,EAAG,EAAA,KACnE,OAAO,KAAa,CAAA,IAAA,EAAA,EAAI,SAAS,MAAW,KAAA,CAAA,IAC5C,OAAO,KAAa,CAAA,IAAA,EAAA,EAAI,SAAS,MAAW,KAAA,CAAA,CAAA;AAE/C,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAY,CAAe,KAAA;AACjD,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,CAAA,KAAM,KAAa,CAAA,IAAA,CAAA,KAAM,KAAW,CAAA,EAAA;AAC7C,IAAO,OAAA,IAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,qBAAA,GAA6C,CAAC,MAAA,EAAQ,SAAc,KAAA;AACxE,EAAM,MAAA,EAAE,YAAc,EAAA,IAAA,EAAS,GAAA,MAAA,CAAA;AAC/B,EAAM,MAAA,EAAE,YAAc,EAAA,IAAA,EAAS,GAAA,SAAA,CAAA;AAC/B,EAAA,IAAI,eAAe,IAAM,EAAA,IAAI,KAAK,sBAAuB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAC3E,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,IAAA,KAAS,KAAa,CAAA,IAAA,IAAA,KAAS,KAAW,CAAA,EAAA;AACnD,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,IAAA,CAAK,MAAW,KAAA,IAAA,CAAK,MAAQ,EAAA;AACtC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,IAAK,CAAA,IAAA;AAAA,IACV,CAAC,EAAE,MAAQ,EAAA,OAAA,IAAW,CACpB,KAAA,MAAA,KAAW,IAAK,CAAA,CAAC,CAAE,CAAA,MAAA,IAAU,OAAY,KAAA,IAAA,CAAK,CAAC,CAAE,CAAA,OAAA;AAAA,GACrD,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAwC,CAAC,MAAA,EAAQ,SAAc,KAAA;AACnE,EAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,MAAA,CAAA;AAC3B,EAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,SAAA,CAAA;AAE3B,EAAA,IAAI,eAAe,KAAO,EAAA,KAAK,KAAK,iBAAkB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AACxE,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,KAAA,KAAU,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACrD,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,KAAA,EAAO,MAAW,KAAA,KAAA,EAAO,MAAQ,EAAA;AAC1C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,KAAA,CAAM,KAAK,CAAC,MAAA,EAAQ,MAAM,MAAW,KAAA,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AACxD,CAAA,CAAA;AAEa,MAAA,eAAA,GAAuC,CAAC,EAAA,EAAI,EAAO,KAAA;AAC9D,EAAI,IAAA,gBAAA,CAAiB,EAAI,EAAA,EAAE,CAAG,EAAA;AAC5B,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,OAAO,EAAG,CAAA,UAAA,EAAY,MAAW,KAAA,EAAA,CAAG,UAAY,EAAA,MAAA,CAAA;AAAA,GAClD;AACF,EAAA;AAEa,MAAA,gBAAA,GAAwC,CAAC,MAAA,EAAQ,SAAc,KAAA;AAC1E,EAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,MAAA,CAAA;AACxB,EAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACxB,EAAA,IAAI,eAAe,EAAI,EAAA,EAAE,KAAK,iBAAkB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAClE,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,KAAa,CAAA,IAAA,EAAA,KAAO,KAAW,CAAA,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,EAAI,MAAW,KAAA,EAAA,EAAI,MAAQ,EAAA;AACpC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,EAAA,CAAG,KAAK,CAAC,MAAA,EAAQ,MAAM,MAAW,KAAA,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA;AAClD,EAAA;AAEA,MAAM,aAAA,GAAqC,CAAC,MAAA,EAAQ,SAAc,KAAA;AAChE,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,MAAA,CAAA;AACrB,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACrB,EAAA,IAAI,eAAe,EAAI,EAAA,EAAE,KAAK,cAAe,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAC/D,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,KAAa,CAAA,IAAA,EAAA,KAAO,KAAW,CAAA,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,aACE,EAAI,EAAA,QAAA,CAAS,MAAW,KAAA,EAAA,EAAI,SAAS,MAAQ,EAAA;AACtD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,GAAG,QAAS,CAAA,IAAA;AAAA,IACjB,CAAC,EAAE,MAAA,EAAQ,QAAS,EAAA,EAAG,MACrB,MAAW,KAAA,EAAA,CAAG,QAAS,CAAA,CAAC,EAAE,MAAU,IAAA,QAAA,KAAa,EAAG,CAAA,QAAA,CAAS,CAAC,CAAE,CAAA,QAAA;AAAA,GACpE,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,sBAA2C,MAAM;AAErD,EAAO,OAAA,KAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,iBAAkD,GAAA;AAAA,EAC7D,mBAAqB,EAAA,KAAA;AAAA,EACrB,cAAgB,EAAA,KAAA;AAAA,EAChB,aAAe,EAAA,KAAA;AAAA,EACf,cAAgB,EAAA,KAAA;AAAA,EAChB,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,KAAA;AAAA,EACb,iBAAmB,EAAA,KAAA;AACrB,EAAA;AAEa,MAAA,eAAA,GAAkB,CAC7B,MAAA,EACA,SACiC,KAAA;AACjC,EAAI,IAAA,cAAA,CAAe,MAAQ,EAAA,SAAS,CAAG,EAAA;AACrC,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,MAAA,KAAW,KAAa,CAAA,IAAA,SAAA,IAAa,KAAW,CAAA,EAAA;AAClD,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT,MAAA,IAAW,WAAW,KAAW,CAAA,EAAA;AAC/B,IAAO,OAAA,eAAA,CAAgB,EAAC,EAAG,SAAS,CAAA,CAAA;AAAA,GACtC,MAAA,IAAW,cAAc,KAAW,CAAA,EAAA;AAClC,IAAO,OAAA,eAAA,CAAgB,MAAQ,EAAA,EAAE,CAAA,CAAA;AAAA,GACnC;AAEA,EAAM,MAAA,mBAAA,GAAsB,qBAAsB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACnE,EAAM,MAAA,cAAA,GAAiB,gBAAiB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACzD,EAAM,MAAA,aAAA,GAAgB,eAAgB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACvD,EAAM,MAAA,cAAA,GAAiB,gBAAiB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACzD,EAAM,MAAA,WAAA,GAAc,aAAc,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACnD,EAAM,MAAA,iBAAA,GAAoB,mBAAoB,CAAiB,CAAA,CAAA;AAE/D,EAAA,MAAM,YAAY,EAChB,mBAAA,IACA,cACA,IAAA,aAAA,IACA,kBACA,WACA,IAAA,iBAAA,CAAA,CAAA;AAGF,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,GACF,CAAA;AACF,EAAA;AAEa,MAAA,UAAA,GAAa,CAAC,MAAA,KACzB,MAAW,KAAA,KAAA,CAAA,IACX,OAAO,OAAY,KAAA,KAAA,CAAA,IACnB,MAAO,CAAA,OAAA,CAAQ,MAAS,GAAA,EAAA;AAEb,MAAA,SAAA,GAAY,CAAC,MACxB,KAAA,MAAA,EAAQ,eAAe,KAAa,CAAA,IAAA,MAAA,CAAO,UAAW,CAAA,MAAA,CAAO,MAAS,GAAA,EAAA;AAEjE,MAAM,OAAU,GAAA,CAAC,MACtB,KAAA,MAAA,EAAQ,SAAS,KACjB,CAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,CAAO,MAAM,QAAQ,CAAA,IACnC,MAAO,CAAA,IAAA,CAAK,SAAS,MAAS,GAAA,EAAA;AAEzB,MAAM,gCAAgC,CAC3C,MAAA,KAEA,OAAQ,MAAA,CAAuC,yBAAyB,CACxE,KAAA,WAAA;AAEK,MAAM,oBAAuB,GAAA,CAClC,OACuC,KAAA,OAAA,CAAQ,IAAS,KAAA,kBAAA;AAEnD,MAAM,yBAA4B,GAAA,CACvC,GAEC,KAAA,GAAA,CAAgC,IAAS,KAAA,oBAAA;AAErC,MAAM,0BAA6B,GAAA,CACxC,GAEC,KAAA,GAAA,CAAiC,IAAS,KAAA,qBAAA;AAEtC,MAAM,gBAAmB,GAAA,CAAC,GAC/B,KAAA,OAAQ,IAA0B,MAAW,KAAA,YAAA;AAExC,MAAM,eAAkB,GAAA,CAC7B,QAEA,KAAA,QAAA,EAAU,IAAS,KAAA,qBAAA;AAEd,MAAM,SAAY,GAAA,CACvB,QAEA,KAAA,QAAA,IAAY,UAAa,QAAY,IAAA,SAAA;AAE1B,MAAA,iBAAA,GAAoB,CAC/B,GAAA,KACmC,UAAc,IAAA,IAAA;AAEtC,MAAA,kBAAA,GAAqB,CAChC,MAC8D,KAAA;AAC9D,EACE,IAAA,MAAA,CAAO,gBACP,MAAO,CAAA,OAAA,IACP,OAAO,UACP,IAAA,MAAA,CAAO,OACP,IAAA,MAAA,CAAO,IACP,EAAA;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAM,MAAA;AAAA,MACJ,eAAe,EAAC;AAAA,MAChB,UAAU,EAAC;AAAA,MACX,UAAY,EAAA,MAAA,GAAS,EAAE,MAAA,EAAQ,EAAG,EAAA;AAAA,MAClC,UAAU,EAAC;AAAA,MACX,IAAO,GAAA,EAAE,QAAU,EAAA,EAAG,EAAA;AAAA,MACtB,UAAA;AAAA,KACE,GAAA,MAAA,CAAA;AAEJ,IAAO,OAAA;AAAA,MACL,YAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAY,EAAA,MAAA;AAAA,MACZ,OAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF;;;;;;;;;;;;;;;;;;;;;;"}
@@ -40,6 +40,11 @@ const assertComponentRegistered = (componentName, component) => {
40
40
  );
41
41
  }
42
42
  };
43
+ const assertComponentsRegistered = (componentList) => {
44
+ for (const { componentName, component } of componentList) {
45
+ assertComponentRegistered(componentName, component);
46
+ }
47
+ };
43
48
  const getCustomAndTableFeatures = (features, vuuTables) => {
44
49
  const [customFeatureConfig, tableFeaturesConfig] = arrayUtils.partition(
45
50
  Object.values(features),
@@ -119,6 +124,7 @@ const getCustomAndTableFeatures = (features, vuuTables) => {
119
124
  };
120
125
 
121
126
  exports.assertComponentRegistered = assertComponentRegistered;
127
+ exports.assertComponentsRegistered = assertComponentsRegistered;
122
128
  exports.byModule = byModule;
123
129
  exports.env = env;
124
130
  exports.getCustomAndTableFeatures = getCustomAndTableFeatures;
@@ -1 +1 @@
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 allowRename?: boolean;\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 ViewProps: {\n allowRename: true,\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: {\n ...viewProps,\n allowRename: true,\n },\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
+ {"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 allowRename?: boolean;\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 ViewProps: {\n allowRename: true,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport type Component = {\n componentName: string;\n component: unknown;\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 assertComponentsRegistered = (componentList: Component[]) => {\n for (const { componentName, component } of componentList) {\n assertComponentRegistered(componentName, component);\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: {\n ...viewProps,\n allowRename: true,\n },\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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"}
package/cjs/index.js CHANGED
@@ -44,6 +44,7 @@ var protocolMessageUtils = require('./protocol-message-utils.js');
44
44
  var rangeUtils = require('./range-utils.js');
45
45
  var rowUtils = require('./row-utils.js');
46
46
  var selectionUtils = require('./selection-utils.js');
47
+ var shellLayoutTypes = require('./shell-layout-types.js');
47
48
  var sortUtils = require('./sort-utils.js');
48
49
  var tableSchemaUtils = require('./table-schema-utils.js');
49
50
  var textUtils = require('./text-utils.js');
@@ -228,6 +229,7 @@ exports.isSelectableElement = htmlUtils.isSelectableElement;
228
229
  exports.queryClosest = htmlUtils.queryClosest;
229
230
  exports.EventEmitter = eventEmitter.EventEmitter;
230
231
  exports.assertComponentRegistered = featureUtils.assertComponentRegistered;
232
+ exports.assertComponentsRegistered = featureUtils.assertComponentsRegistered;
231
233
  exports.byModule = featureUtils.byModule;
232
234
  exports.env = featureUtils.env;
233
235
  exports.getCustomAndTableFeatures = featureUtils.getCustomAndTableFeatures;
@@ -307,6 +309,7 @@ exports.isRowSelected = selectionUtils.isRowSelected;
307
309
  exports.isRowSelectedLast = selectionUtils.isRowSelectedLast;
308
310
  exports.isSelected = selectionUtils.isSelected;
309
311
  exports.selectItem = selectionUtils.selectItem;
312
+ exports.VuuShellLocation = shellLayoutTypes.VuuShellLocation;
310
313
  exports.addSortColumn = sortUtils.addSortColumn;
311
314
  exports.setSortColumn = sortUtils.setSortColumn;
312
315
  exports.toggleOrApplySort = sortUtils.toggleOrApplySort;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ const VuuShellLocation = {
4
+ ContextPanel: "context-panel",
5
+ SidePanel: "vuu-side-panel",
6
+ Workspace: "vuu-workspace",
7
+ WorkspaceContainer: "vuu-workspace-container"
8
+ };
9
+
10
+ exports.VuuShellLocation = VuuShellLocation;
11
+ //# sourceMappingURL=shell-layout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-layout-types.js","sources":["../src/shell-layout-types.ts"],"sourcesContent":["/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n SidePanel: \"vuu-side-panel\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation =\n (typeof VuuShellLocation)[keyof typeof VuuShellLocation];\n"],"names":[],"mappings":";;AAKO,MAAM,gBAAmB,GAAA;AAAA,EAC9B,YAAc,EAAA,eAAA;AAAA,EACd,SAAW,EAAA,gBAAA;AAAA,EACX,SAAW,EAAA,eAAA;AAAA,EACX,kBAAoB,EAAA,yBAAA;AACtB;;;;"}
@@ -19,8 +19,21 @@ const isTypeCompatible = (rendererType, serverDataType) => {
19
19
  return rendererType === serverDataType;
20
20
  }
21
21
  };
22
- const isContainer = (componentType) => containersSet.has(componentType);
23
- const isView = (componentType) => viewsSet.has(componentType);
22
+ const assertComponentRegistered = (componentType) => {
23
+ if (!layoutComponentsMap.has(componentType)) {
24
+ console.warn(
25
+ `isContainer check on ${componentType}, which has not been registered`
26
+ );
27
+ }
28
+ };
29
+ const isContainer = (componentType) => {
30
+ assertComponentRegistered(componentType);
31
+ return containersSet.has(componentType);
32
+ };
33
+ const isView = (componentType) => {
34
+ assertComponentRegistered(componentType);
35
+ return viewsSet.has(componentType);
36
+ };
24
37
  const isLayoutComponent = (componentType) => isContainer(componentType) || isView(componentType);
25
38
  const isCellRenderer = (type, component) => component !== void 0 && type === "cell-renderer";
26
39
  const isColumnHeaderContentRenderer = (type, component) => type === "column-header-content-renderer";
@@ -1 +1 @@
1
- {"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (\n row: DataSourceRow,\n columnMap: ColumnMap\n) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<string, FC<HeaderCellProps>>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType:\n | VuuColumnDataType\n | (VuuColumnDataType | \"json\")[]\n | \"json\"\n | \"private\"\n | undefined,\n serverDataType: VuuColumnDataType | \"json\"\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n return rendererType.includes(serverDataType);\n } else {\n return rendererType === serverDataType;\n }\n};\n\nexport const isContainer = (componentType: string) =>\n containersSet.has(componentType);\nexport const isView = (componentType: string) => viewsSet.has(componentType);\nexport const isLayoutComponent = (\n componentType: string\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n serverDataType?: VuuColumnDataType | \"json\"\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (serverDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, serverDataType)\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component-registry.js","sources":["../src/component-registry.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnDescriptor,\n ColumnDescriptorCustomRenderer,\n ColumnTypeRendering,\n EditValidationRule,\n HeaderCellProps,\n TableCellRendererProps,\n} from \"@vuu-ui/vuu-table-types\";\nimport { FunctionComponent as FC, HTMLAttributes } from \"react\";\nimport {\n ColumnMap,\n isColumnTypeRenderer,\n isTypeDescriptor,\n} from \"./column-utils\";\n\nexport interface CellConfigPanelProps extends HTMLAttributes<HTMLDivElement> {\n onConfigChange: () => void;\n}\n\nexport type PropertyChangeHandler = (\n propertyName: string,\n propertyValue: string | number | boolean\n) => void;\n\nexport type ColumnRenderPropsChangeHandler = (\n renderProps: ColumnTypeRendering\n) => void;\n\nexport interface ConfigurationEditorProps {\n column: ColumnDescriptorCustomRenderer;\n onChangeRendering: ColumnRenderPropsChangeHandler;\n}\n\nexport type RowClassNameGenerator = (\n row: DataSourceRow,\n columnMap: ColumnMap\n) => string | undefined;\n\nexport type RowClassGenerator = {\n id: string;\n fn: RowClassNameGenerator;\n};\n\nexport type ConfigEditorComponent = FC<CellConfigPanelProps>;\n\nconst containersSet = new Set<string>();\nconst viewsSet = new Set<string>();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst layoutComponentsMap = new Map<string, FC<any>>();\nconst cellRenderersMap = new Map<string, FC<TableCellRendererProps>>();\nconst columnHeaderRenderersMap = new Map<string, FC<HeaderCellProps>>();\nconst configEditorsMap = new Map<string, FC<ConfigurationEditorProps>>();\nconst cellConfigPanelsMap = new Map<string, ConfigEditorComponent>();\nconst editRuleValidatorsMap = new Map<string, EditRuleValidator>();\nconst optionsMap = new Map<string, CellRendererOptions>();\nconst rowClassGeneratorsMap = new Map<string, RowClassGenerator>();\n\nexport type EditRuleValidator = (\n editRule: EditValidationRule,\n value?: VuuRowDataItemType\n) => boolean | string;\n\nexport type layoutComponentType = \"container\" | \"view\";\n\nexport type ComponentType =\n | layoutComponentType\n | \"cell-renderer\"\n | \"cell-config-panel\"\n | \"column-header-content-renderer\"\n | \"column-header-label-renderer\"\n | \"component\"\n | \"data-edit-validator\"\n | \"row-class-generator\";\n\ntype CellRendererOptions = {\n configEditor?: string;\n description?: string;\n label?: string;\n serverDataType?: VuuColumnDataType | VuuColumnDataType[] | \"json\" | \"private\";\n userCanAssign?: boolean;\n};\nexport interface CellRendererDescriptor extends CellRendererOptions {\n name: string;\n}\n\nconst isTypeCompatible = (\n rendererType:\n | VuuColumnDataType\n | (VuuColumnDataType | \"json\")[]\n | \"json\"\n | \"private\"\n | undefined,\n serverDataType: VuuColumnDataType | \"json\"\n) => {\n if (rendererType === undefined || rendererType === \"private\") {\n return true;\n } else if (Array.isArray(rendererType)) {\n return rendererType.includes(serverDataType);\n } else {\n return rendererType === serverDataType;\n }\n};\n\nconst assertComponentRegistered = (componentType: string) => {\n if (!layoutComponentsMap.has(componentType)) {\n console.warn(\n `isContainer check on ${componentType}, which has not been registered`\n );\n }\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isContainer = (componentType: string) => {\n assertComponentRegistered(componentType);\n return containersSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isView = (componentType: string) => {\n assertComponentRegistered(componentType);\n return viewsSet.has(componentType);\n};\n\n/**\n * This check is performed during construction of UI from JSON. If component\n * is not registered, it will log a warning.\n */\nexport const isLayoutComponent = (\n componentType: string\n): componentType is layoutComponentType =>\n isContainer(componentType) || isView(componentType);\n\nconst isCellRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<TableCellRendererProps> =>\n component !== undefined && type === \"cell-renderer\";\n\nconst isColumnHeaderContentRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> =>\n type === \"column-header-content-renderer\";\nconst isColumnHeaderLabelRenderer = (\n type: ComponentType,\n component: unknown\n): component is FC<HeaderCellProps> => type === \"column-header-label-renderer\";\n\nconst isCellConfigPanel = (\n type: ComponentType,\n component: unknown\n): component is FC<CellConfigPanelProps> => type === \"cell-config-panel\";\n\nconst isEditRuleValidator = (\n type: ComponentType,\n component: unknown\n): component is EditRuleValidator => type === \"data-edit-validator\";\n\nconst isRowClassGenerator = (\n type: ComponentType,\n component: unknown\n): component is RowClassGenerator => type === \"row-class-generator\";\n\nexport function registerComponent(\n componentName: string,\n component: RowClassGenerator,\n componentType: \"row-class-generator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n component: EditRuleValidator,\n componentType: \"data-edit-validator\",\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // unknown won't work for us here, we'll get the default children\n // definition for FC which conflicts with some components props.\n // VoidFunctionComponent doesn't help either\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: FC<any>,\n componentType: Omit<\n ComponentType,\n \"data-edit-validator\" | \"row-class-generator\"\n >,\n options?: CellRendererOptions\n): void;\nexport function registerComponent(\n componentName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n componentType: any,\n options?: CellRendererOptions\n): void {\n if (\n componentType === \"container\" ||\n componentType === \"view\" ||\n componentType === \"component\"\n ) {\n layoutComponentsMap.set(componentName, component);\n if (componentType === \"container\") {\n containersSet.add(componentName);\n } else if (componentType === \"view\") {\n viewsSet.add(componentName);\n }\n } else if (isCellRenderer(componentType, component)) {\n cellRenderersMap.set(componentName, component);\n } else if (isColumnHeaderContentRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isColumnHeaderLabelRenderer(componentType, component)) {\n columnHeaderRenderersMap.set(componentName, component);\n } else if (isCellConfigPanel(componentType, component)) {\n cellConfigPanelsMap.set(componentName, component);\n } else if (isEditRuleValidator(componentType, component)) {\n editRuleValidatorsMap.set(componentName, component);\n } else if (isRowClassGenerator(componentType, component)) {\n rowClassGeneratorsMap.set(componentName, component);\n }\n if (options) {\n optionsMap.set(componentName, options);\n }\n}\n\nexport const registerConfigurationEditor = (\n componentName: string,\n configurationEditor: FC<ConfigurationEditorProps>\n) => {\n configEditorsMap.set(componentName, configurationEditor);\n};\n\n// This is invoked by settings panel to allow users to assign\n// non-default, cell renderers. Ignore renderers registered\n// with the attribute userCanAssign = false\nexport const getRegisteredCellRenderers = (\n serverDataType?: VuuColumnDataType | \"json\"\n): CellRendererDescriptor[] => {\n const rendererNames = Array.from(cellRenderersMap.keys());\n const allRenderers = rendererNames\n .map<CellRendererDescriptor>((name) => ({\n name,\n ...(optionsMap.get(name) as CellRendererOptions),\n }))\n .filter(({ userCanAssign }) => userCanAssign !== false);\n if (serverDataType) {\n return allRenderers.filter((renderer) =>\n isTypeCompatible(renderer.serverDataType, serverDataType)\n );\n } else {\n return allRenderers;\n }\n};\n\nexport const getLayoutComponent = (componentName: string) => {\n const layoutComponent = layoutComponentsMap.get(componentName);\n if (layoutComponent) {\n return layoutComponent;\n } else {\n throw Error(\n `layout component ${componentName} not found in ComponentRegistry`\n );\n }\n};\n\nexport const getCellRendererOptions = (renderName: string) =>\n optionsMap.get(renderName);\n\nexport function getCellRenderer(column: ColumnDescriptor) {\n return dataCellRenderer(column);\n}\nexport function getColumnHeaderContentRenderer(column: ColumnDescriptor) {\n if (column.colHeaderContentRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderContentRenderer);\n }\n}\nexport function getColumnHeaderLabelRenderer(column: ColumnDescriptor) {\n if (column.colHeaderLabelRenderer) {\n return columnHeaderRenderersMap.get(column.colHeaderLabelRenderer);\n }\n}\nexport const getRowClassNameGenerator = (generatorId: string) =>\n rowClassGeneratorsMap.get(generatorId);\n\nexport function getConfigurationEditor(configEditor = \"\") {\n return configEditorsMap.get(configEditor);\n}\n\nexport function getCellConfigPanelRenderer(name: string) {\n return cellConfigPanelsMap.get(name);\n}\n\nexport function getEditRuleValidator(name: string) {\n return editRuleValidatorsMap.get(name);\n}\n\nfunction dataCellRenderer(column: ColumnDescriptor) {\n if (isTypeDescriptor(column.type)) {\n const { renderer } = column.type;\n if (isColumnTypeRenderer(renderer)) {\n return cellRenderersMap.get(renderer.name);\n }\n } else if (column.serverDataType === \"boolean\") {\n return cellRenderersMap.get(\"checkbox-cell\");\n } else if (column.editable) {\n // we can only offer a text input edit as a generic editor.\n // If a more specialised editor is required, user must configure\n // it in column config.\n return cellRenderersMap.get(\"input-cell\");\n }\n}\n"],"names":[],"mappings":"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"}
@@ -3,13 +3,13 @@ const NoSort = { sortDefs: [] };
3
3
  const vanillaConfig = {
4
4
  aggregations: [],
5
5
  columns: [],
6
- filter: NoFilter,
6
+ filterSpec: NoFilter,
7
7
  groupBy: [],
8
8
  sort: NoSort
9
9
  };
10
10
  const equivalentAggregations = ({ aggregations: agg1 }, { aggregations: agg2 }) => agg1 === void 0 && agg2?.length === 0 || agg2 === void 0 && agg1?.length === 0;
11
11
  const equivalentColumns = ({ columns: cols1 }, { columns: cols2 }) => cols1 === void 0 && cols2?.length === 0 || cols2 === void 0 && cols1?.length === 0;
12
- const equivalentFilter = ({ filter: f1 }, { filter: f2 }) => f1 === void 0 && f2?.filter === "" || f2 === void 0 && f1?.filter === "";
12
+ const equivalentFilter = ({ filterSpec: f1 }, { filterSpec: f2 }) => f1 === void 0 && f2?.filter === "" || f2 === void 0 && f1?.filter === "";
13
13
  const equivalentGroupBy = ({ groupBy: val1 }, { groupBy: val2 }) => val1 === void 0 && val2?.length === 0 || val2 === void 0 && val1?.length === 0;
14
14
  const equivalentSort = ({ sort: s1 }, { sort: s2 }) => s1 === void 0 && s2?.sortDefs.length === 0 || s2 === void 0 && s1?.sortDefs.length === 0;
15
15
  const exactlyTheSame = (a, b) => {
@@ -51,7 +51,7 @@ const isFilterChanged = (c1, c2) => {
51
51
  if (equivalentFilter(c1, c2)) {
52
52
  return false;
53
53
  } else {
54
- return c1.filter?.filter !== c2.filter?.filter;
54
+ return c1.filterSpec?.filter !== c2.filterSpec?.filter;
55
55
  }
56
56
  };
57
57
  const isGroupByChanged = (config, newConfig) => {
@@ -121,7 +121,7 @@ const isConfigChanged = (config, newConfig) => {
121
121
  };
122
122
  };
123
123
  const hasGroupBy = (config) => config !== void 0 && config.groupBy !== void 0 && config.groupBy.length > 0;
124
- const hasFilter = (config) => config?.filter !== void 0 && config.filter.filter.length > 0;
124
+ const hasFilter = (config) => config?.filterSpec !== void 0 && config.filterSpec.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
127
  const isTableSchemaMessage = (message) => message.type === "TABLE_META_RESP";
@@ -132,13 +132,13 @@ const isErrorResponse = (response) => response?.type === "VP_EDIT_RPC_REJECT";
132
132
  const hasAction = (response) => response != void 0 && "action" in response;
133
133
  const isViewportMessage = (msg) => "viewport" in msg;
134
134
  const withConfigDefaults = (config) => {
135
- if (config.aggregations && config.columns && config.filter && config.groupBy && config.sort) {
135
+ if (config.aggregations && config.columns && config.filterSpec && config.groupBy && config.sort) {
136
136
  return config;
137
137
  } else {
138
138
  const {
139
139
  aggregations = [],
140
140
  columns = [],
141
- filter = { filter: "" },
141
+ filterSpec: filter = { filter: "" },
142
142
  groupBy = [],
143
143
  sort = { sortDefs: [] },
144
144
  visualLink
@@ -146,7 +146,7 @@ const withConfigDefaults = (config) => {
146
146
  return {
147
147
  aggregations,
148
148
  columns,
149
- filter,
149
+ filterSpec: filter,
150
150
  groupBy,
151
151
  sort,
152
152
  visualLink
@@ -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 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?: Partial<RpcResponse>\n): response is VuuUIMessageInRPCEditReject =>\n response?.type === \"VP_EDIT_RPC_REJECT\";\n\nexport const hasAction = (\n response?: Partial<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":"AAwBa,MAAA,QAAA,GAAsB,EAAE,MAAA,EAAQ,EAAG,GAAA;AACzC,MAAM,MAAkB,GAAA,EAAE,QAAU,EAAA,EAAG,GAAA;AAEvC,MAAM,aAAgC,GAAA;AAAA,EAC3C,cAAc,EAAC;AAAA,EACf,SAAS,EAAC;AAAA,EACV,MAAQ,EAAA,QAAA;AAAA,EACR,SAAS,EAAC;AAAA,EACV,IAAM,EAAA,MAAA;AACR,EAAA;AAoBA,MAAM,yBAA8C,CAClD,EAAE,cAAc,IAAK,EAAA,EACrB,EAAE,YAAc,EAAA,IAAA,EAEf,KAAA,IAAA,KAAS,UAAa,IAAM,EAAA,MAAA,KAAW,KACvC,IAAS,KAAA,KAAA,CAAA,IAAa,MAAM,MAAW,KAAA,CAAA,CAAA;AAE1C,MAAM,oBAAyC,CAC7C,EAAE,SAAS,KAAM,EAAA,EACjB,EAAE,OAAS,EAAA,KAAA,EAEV,KAAA,KAAA,KAAU,UAAa,KAAO,EAAA,MAAA,KAAW,KACzC,KAAU,KAAA,KAAA,CAAA,IAAa,OAAO,MAAW,KAAA,CAAA,CAAA;AAE5C,MAAM,mBAAwC,CAC5C,EAAE,QAAQ,EAAG,EAAA,EACb,EAAE,MAAQ,EAAA,EAAA,EAET,KAAA,EAAA,KAAO,UAAa,EAAI,EAAA,MAAA,KAAW,MACnC,EAAO,KAAA,KAAA,CAAA,IAAa,IAAI,MAAW,KAAA,EAAA,CAAA;AAEtC,MAAM,oBAAyC,CAC7C,EAAE,SAAS,IAAK,EAAA,EAChB,EAAE,OAAS,EAAA,IAAA,EAEV,KAAA,IAAA,KAAS,UAAa,IAAM,EAAA,MAAA,KAAW,KACvC,IAAS,KAAA,KAAA,CAAA,IAAa,MAAM,MAAW,KAAA,CAAA,CAAA;AAE1C,MAAM,cAAA,GAAsC,CAAC,EAAE,IAAA,EAAM,IAAM,EAAA,EAAE,MAAM,EAAG,EAAA,KACnE,OAAO,KAAa,CAAA,IAAA,EAAA,EAAI,SAAS,MAAW,KAAA,CAAA,IAC5C,OAAO,KAAa,CAAA,IAAA,EAAA,EAAI,SAAS,MAAW,KAAA,CAAA,CAAA;AAE/C,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAY,CAAe,KAAA;AACjD,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,CAAA,KAAM,KAAa,CAAA,IAAA,CAAA,KAAM,KAAW,CAAA,EAAA;AAC7C,IAAO,OAAA,IAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,qBAAA,GAA6C,CAAC,MAAA,EAAQ,SAAc,KAAA;AACxE,EAAM,MAAA,EAAE,YAAc,EAAA,IAAA,EAAS,GAAA,MAAA,CAAA;AAC/B,EAAM,MAAA,EAAE,YAAc,EAAA,IAAA,EAAS,GAAA,SAAA,CAAA;AAC/B,EAAA,IAAI,eAAe,IAAM,EAAA,IAAI,KAAK,sBAAuB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAC3E,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,IAAA,KAAS,KAAa,CAAA,IAAA,IAAA,KAAS,KAAW,CAAA,EAAA;AACnD,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,IAAA,CAAK,MAAW,KAAA,IAAA,CAAK,MAAQ,EAAA;AACtC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,IAAK,CAAA,IAAA;AAAA,IACV,CAAC,EAAE,MAAQ,EAAA,OAAA,IAAW,CACpB,KAAA,MAAA,KAAW,IAAK,CAAA,CAAC,CAAE,CAAA,MAAA,IAAU,OAAY,KAAA,IAAA,CAAK,CAAC,CAAE,CAAA,OAAA;AAAA,GACrD,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAwC,CAAC,MAAA,EAAQ,SAAc,KAAA;AACnE,EAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,MAAA,CAAA;AAC3B,EAAM,MAAA,EAAE,OAAS,EAAA,KAAA,EAAU,GAAA,SAAA,CAAA;AAE3B,EAAA,IAAI,eAAe,KAAO,EAAA,KAAK,KAAK,iBAAkB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AACxE,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,KAAA,KAAU,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACrD,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,KAAA,EAAO,MAAW,KAAA,KAAA,EAAO,MAAQ,EAAA;AAC1C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,KAAA,CAAM,KAAK,CAAC,MAAA,EAAQ,MAAM,MAAW,KAAA,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AACxD,CAAA,CAAA;AAEa,MAAA,eAAA,GAAuC,CAAC,EAAA,EAAI,EAAO,KAAA;AAC9D,EAAI,IAAA,gBAAA,CAAiB,EAAI,EAAA,EAAE,CAAG,EAAA;AAC5B,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,OAAO,EAAG,CAAA,MAAA,EAAQ,MAAW,KAAA,EAAA,CAAG,MAAQ,EAAA,MAAA,CAAA;AAAA,GAC1C;AACF,EAAA;AAEa,MAAA,gBAAA,GAAwC,CAAC,MAAA,EAAQ,SAAc,KAAA;AAC1E,EAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,MAAA,CAAA;AACxB,EAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACxB,EAAA,IAAI,eAAe,EAAI,EAAA,EAAE,KAAK,iBAAkB,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAClE,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,KAAa,CAAA,IAAA,EAAA,KAAO,KAAW,CAAA,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,EAAI,MAAW,KAAA,EAAA,EAAI,MAAQ,EAAA;AACpC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,EAAA,CAAG,KAAK,CAAC,MAAA,EAAQ,MAAM,MAAW,KAAA,EAAA,GAAK,CAAC,CAAC,CAAA,CAAA;AAClD,EAAA;AAEA,MAAM,aAAA,GAAqC,CAAC,MAAA,EAAQ,SAAc,KAAA;AAChE,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,MAAA,CAAA;AACrB,EAAM,MAAA,EAAE,IAAM,EAAA,EAAA,EAAO,GAAA,SAAA,CAAA;AACrB,EAAA,IAAI,eAAe,EAAI,EAAA,EAAE,KAAK,cAAe,CAAA,MAAA,EAAQ,SAAS,CAAG,EAAA;AAC/D,IAAO,OAAA,KAAA,CAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,KAAa,CAAA,IAAA,EAAA,KAAO,KAAW,CAAA,EAAA;AAC/C,IAAO,OAAA,IAAA,CAAA;AAAA,aACE,EAAI,EAAA,QAAA,CAAS,MAAW,KAAA,EAAA,EAAI,SAAS,MAAQ,EAAA;AACtD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,GAAG,QAAS,CAAA,IAAA;AAAA,IACjB,CAAC,EAAE,MAAA,EAAQ,QAAS,EAAA,EAAG,MACrB,MAAW,KAAA,EAAA,CAAG,QAAS,CAAA,CAAC,EAAE,MAAU,IAAA,QAAA,KAAa,EAAG,CAAA,QAAA,CAAS,CAAC,CAAE,CAAA,QAAA;AAAA,GACpE,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,sBAA2C,MAAM;AAErD,EAAO,OAAA,KAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,iBAAkD,GAAA;AAAA,EAC7D,mBAAqB,EAAA,KAAA;AAAA,EACrB,cAAgB,EAAA,KAAA;AAAA,EAChB,aAAe,EAAA,KAAA;AAAA,EACf,cAAgB,EAAA,KAAA;AAAA,EAChB,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,KAAA;AAAA,EACb,iBAAmB,EAAA,KAAA;AACrB,EAAA;AAEa,MAAA,eAAA,GAAkB,CAC7B,MAAA,EACA,SACiC,KAAA;AACjC,EAAI,IAAA,cAAA,CAAe,MAAQ,EAAA,SAAS,CAAG,EAAA;AACrC,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,MAAA,KAAW,KAAa,CAAA,IAAA,SAAA,IAAa,KAAW,CAAA,EAAA;AAClD,IAAO,OAAA,iBAAA,CAAA;AAAA,GACT,MAAA,IAAW,WAAW,KAAW,CAAA,EAAA;AAC/B,IAAO,OAAA,eAAA,CAAgB,EAAC,EAAG,SAAS,CAAA,CAAA;AAAA,GACtC,MAAA,IAAW,cAAc,KAAW,CAAA,EAAA;AAClC,IAAO,OAAA,eAAA,CAAgB,MAAQ,EAAA,EAAE,CAAA,CAAA;AAAA,GACnC;AAEA,EAAM,MAAA,mBAAA,GAAsB,qBAAsB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACnE,EAAM,MAAA,cAAA,GAAiB,gBAAiB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACzD,EAAM,MAAA,aAAA,GAAgB,eAAgB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACvD,EAAM,MAAA,cAAA,GAAiB,gBAAiB,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACzD,EAAM,MAAA,WAAA,GAAc,aAAc,CAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AACnD,EAAM,MAAA,iBAAA,GAAoB,mBAAoB,CAAiB,CAAA,CAAA;AAE/D,EAAA,MAAM,YAAY,EAChB,mBAAA,IACA,cACA,IAAA,aAAA,IACA,kBACA,WACA,IAAA,iBAAA,CAAA,CAAA;AAGF,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,GACF,CAAA;AACF,EAAA;AAEa,MAAA,UAAA,GAAa,CAAC,MAAA,KACzB,MAAW,KAAA,KAAA,CAAA,IACX,OAAO,OAAY,KAAA,KAAA,CAAA,IACnB,MAAO,CAAA,OAAA,CAAQ,MAAS,GAAA,EAAA;AAEb,MAAA,SAAA,GAAY,CAAC,MACxB,KAAA,MAAA,EAAQ,WAAW,KAAa,CAAA,IAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,MAAS,GAAA,EAAA;AAEzD,MAAM,OAAU,GAAA,CAAC,MACtB,KAAA,MAAA,EAAQ,SAAS,KACjB,CAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,CAAO,MAAM,QAAQ,CAAA,IACnC,MAAO,CAAA,IAAA,CAAK,SAAS,MAAS,GAAA,EAAA;AAEzB,MAAM,gCAAgC,CAC3C,MAAA,KAEA,OAAQ,MAAA,CAAuC,yBAAyB,CACxE,KAAA,WAAA;AAEK,MAAM,oBAAuB,GAAA,CAClC,OACuC,KAAA,OAAA,CAAQ,IAAS,KAAA,kBAAA;AAEnD,MAAM,yBAA4B,GAAA,CACvC,GAEC,KAAA,GAAA,CAAgC,IAAS,KAAA,oBAAA;AAErC,MAAM,0BAA6B,GAAA,CACxC,GAEC,KAAA,GAAA,CAAiC,IAAS,KAAA,qBAAA;AAEtC,MAAM,gBAAmB,GAAA,CAAC,GAC/B,KAAA,OAAQ,IAA0B,MAAW,KAAA,YAAA;AAExC,MAAM,eAAkB,GAAA,CAC7B,QAEA,KAAA,QAAA,EAAU,IAAS,KAAA,qBAAA;AAEd,MAAM,SAAY,GAAA,CACvB,QAEA,KAAA,QAAA,IAAY,UAAa,QAAY,IAAA,SAAA;AAE1B,MAAA,iBAAA,GAAoB,CAC/B,GAAA,KACmC,UAAc,IAAA,IAAA;AAEtC,MAAA,kBAAA,GAAqB,CAChC,MAC8D,KAAA;AAC9D,EACE,IAAA,MAAA,CAAO,gBACP,MAAO,CAAA,OAAA,IACP,OAAO,MACP,IAAA,MAAA,CAAO,OACP,IAAA,MAAA,CAAO,IACP,EAAA;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAM,MAAA;AAAA,MACJ,eAAe,EAAC;AAAA,MAChB,UAAU,EAAC;AAAA,MACX,MAAA,GAAS,EAAE,MAAA,EAAQ,EAAG,EAAA;AAAA,MACtB,UAAU,EAAC;AAAA,MACX,IAAO,GAAA,EAAE,QAAU,EAAA,EAAG,EAAA;AAAA,MACtB,UAAA;AAAA,KACE,GAAA,MAAA,CAAA;AAEJ,IAAO,OAAA;AAAA,MACL,YAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF;;;;"}
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 filterSpec: 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 { filterSpec: f1 },\n { filterSpec: 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.filterSpec?.filter !== c2.filterSpec?.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?.filterSpec !== undefined && config.filterSpec.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?: Partial<RpcResponse>\n): response is VuuUIMessageInRPCEditReject =>\n response?.type === \"VP_EDIT_RPC_REJECT\";\n\nexport const hasAction = (\n response?: Partial<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.filterSpec &&\n config.groupBy &&\n config.sort\n ) {\n return config as WithFullConfig;\n } else {\n const {\n aggregations = [],\n columns = [],\n filterSpec: filter = { filter: \"\" },\n groupBy = [],\n sort = { sortDefs: [] },\n visualLink,\n } = config;\n\n return {\n aggregations,\n columns,\n filterSpec: filter,\n groupBy,\n sort,\n visualLink,\n };\n }\n};\n"],"names":[],"mappings":"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"}
@@ -38,6 +38,11 @@ const assertComponentRegistered = (componentName, component) => {
38
38
  );
39
39
  }
40
40
  };
41
+ const assertComponentsRegistered = (componentList) => {
42
+ for (const { componentName, component } of componentList) {
43
+ assertComponentRegistered(componentName, component);
44
+ }
45
+ };
41
46
  const getCustomAndTableFeatures = (features, vuuTables) => {
42
47
  const [customFeatureConfig, tableFeaturesConfig] = partition(
43
48
  Object.values(features),
@@ -116,5 +121,5 @@ const getCustomAndTableFeatures = (features, vuuTables) => {
116
121
  return [customFeatures, tableFeatures];
117
122
  };
118
123
 
119
- export { assertComponentRegistered, byModule, env, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isTableSchema, isWildcardSchema };
124
+ export { assertComponentRegistered, assertComponentsRegistered, byModule, env, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isTableSchema, isWildcardSchema };
120
125
  //# sourceMappingURL=feature-utils.js.map
@@ -1 +1 @@
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 allowRename?: boolean;\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 ViewProps: {\n allowRename: true,\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: {\n ...viewProps,\n allowRename: true,\n },\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
+ {"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 allowRename?: boolean;\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 ViewProps: {\n allowRename: true,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport type Component = {\n componentName: string;\n component: unknown;\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 assertComponentsRegistered = (componentList: Component[]) => {\n for (const { componentName, component } of componentList) {\n assertComponentRegistered(componentName, component);\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: {\n ...viewProps,\n allowRename: true,\n },\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":";;;AAQa,MAAA,GAAA,GAAM,QAAQ,GAAI,CAAA,SAAA;AA8CxB,MAAM,eAAkB,GAAA,CAAC,OAC9B,KAAA,OAAA,CAAQ,eAAoB,KAAA,eAAA;AAEjB,MAAA,gBAAA,GAAmB,CAAC,MAAA,KAC/B,MAAW,KAAA,IAAA;AACN,MAAM,aAAgB,GAAA,CAAC,MAC5B,KAAA,OAAO,MAAW,KAAA,QAAA,IAClB,OAAO,MAAA,CAAO,MAAW,KAAA,QAAA,IACzB,OAAO,MAAA,CAAO,KAAU,KAAA,SAAA;AAOnB,MAAM,6BAA6B,CACxC,KAAA,KAEA,aAAkB,KAAA,KAAA,EAAO,kBAAkB,EAAC,EAAA;AAGjC,MAAA,QAAA,GAAW,CAAC,OAAA,EAAsB,OAAyB,KAAA;AACtE,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,EAAA;AAQa,MAAA,sBAAA,GAAyB,CACpC,OAAA,EACA,cAEA,KAAA,OAAA,CACG,KAAK,QAAQ,CAAA,CACb,GAA2C,CAAA,CAAC,MAAY,MAAA;AAAA,EACvD,GAAG,cAAe,CAAA,EAAE,GAAK,EAAA,QAAA,EAAU,eAAe,CAAA;AAAA,EAClD,cAAgB,EAAA;AAAA,IACd,WAAa,EAAA,MAAA;AAAA,GACf;AAAA,EACA,SAAW,EAAA;AAAA,IACT,WAAa,EAAA,IAAA;AAAA,GACf;AAAA,EACA,KAAA,EAAO,GAAG,MAAO,CAAA,KAAA,CAAM,MAAM,CAAI,CAAA,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA,CAAA;AACrD,CAAE,CAAA,EAAA;AAOO,MAAA,yBAAA,GAA4B,CACvC,aAAA,EACA,SACG,KAAA;AACH,EAAI,IAAA,OAAO,cAAc,UAAY,EAAA;AACnC,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,GAAG,aAAa,CAAA,mEAAA,CAAA;AAAA,KAClB,CAAA;AAAA,GACF;AACF,EAAA;AAEa,MAAA,0BAAA,GAA6B,CAAC,aAA+B,KAAA;AACxE,EAAA,KAAA,MAAW,EAAE,aAAA,EAAe,SAAU,EAAA,IAAK,aAAe,EAAA;AACxD,IAAA,yBAAA,CAA0B,eAAe,SAAS,CAAA,CAAA;AAAA,GACpD;AACF,EAAA;AAEa,MAAA,yBAAA,GAA4B,CACvC,QAAA,EACA,SAC8D,KAAA;AAC9D,EAAM,MAAA,CAAC,mBAAqB,EAAA,mBAAmB,CAAI,GAAA,SAAA;AAAA,IACjD,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,IACtB,eAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,iBAAiC,EAAC,CAAA;AACxC,EAAA,MAAM,gBAAyD,EAAC,CAAA;AAEhE,EAAW,KAAA,MAAA;AAAA,IACT,eAAe,EAAC;AAAA,IAChB,SAAA;AAAA,IACA,GAAG,OAAA;AAAA,OACA,mBAAqB,EAAA;AACxB,IAAM,MAAA,EAAE,QAAW,GAAA,YAAA,CAAA;AACnB,IAAI,IAAA,gBAAA,CAAiB,MAAM,CAAA,IAAK,SAAW,EAAA;AACzC,MAAW,KAAA,MAAA,WAAA,IAAe,SAAU,CAAA,MAAA,EAAU,EAAA;AAC5C,QAAA,aAAA,CAAc,IAAK,CAAA;AAAA,UACjB,GAAG,OAAA;AAAA,UACH,cAAgB,EAAA;AAAA,YACd,WAAA;AAAA,WACF;AAAA,UACA,KAAO,EAAA,CAAA,EAAG,WAAY,CAAA,KAAA,CAAM,MAAM,CAAI,CAAA,EAAA,OAAA;AAAA,YACpC,YAAY,KAAM,CAAA,KAAA;AAAA,WACnB,CAAA,CAAA;AAAA,UACD,SAAW,EAAA;AAAA,YACT,GAAG,SAAA;AAAA,YACH,WAAa,EAAA,IAAA;AAAA,WACf;AAAA,SACD,CAAA,CAAA;AAAA,OACH;AAAA,KACS,MAAA,IAAA,aAAA,CAAc,MAAM,CAAA,IAAK,SAAW,EAAA;AAC7C,MAAA,MAAM,WAAc,GAAA,SAAA,CAAU,GAAI,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAC9C,MAAA,IAAI,WAAa,EAAA;AACf,QAAA,aAAA,CAAc,IAAK,CAAA;AAAA,UACjB,GAAG,OAAA;AAAA,UACH,cAAgB,EAAA;AAAA,YACd,WAAA;AAAA,WACF;AAAA,UACA,SAAW,EAAA,SAAA;AAAA,SACZ,CAAA,CAAA;AAAA,OACH;AAAA,KACF;AAAA,GACF;AAEA,EAAW,KAAA,MAAA;AAAA,IACT,eAAe,EAAC;AAAA,IAChB,SAAA;AAAA,IACA,GAAG,OAAA;AAAA,OACA,mBAAqB,EAAA;AACxB,IAAM,MAAA,EAAE,MAAQ,EAAA,OAAA,EAAY,GAAA,YAAA,CAAA;AAC5B,IAAI,IAAA,aAAA,CAAc,MAAM,CAAA,IAAK,SAAW,EAAA;AACtC,MAAA,MAAM,WAAc,GAAA,SAAA,CAAU,GAAI,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAC9C,MAAA,cAAA,CAAe,IAAK,CAAA;AAAA,QAClB,GAAG,OAAA;AAAA,QACH,cAAgB,EAAA;AAAA,UACd,WAAA;AAAA,SACF;AAAA,QACA,SAAW,EAAA,SAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACQ,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,OAAO,KAAK,SAAW,EAAA;AAC9C,MAAA,cAAA,CAAe,IAAK,CAAA;AAAA,QAClB,GAAG,OAAA;AAAA,QACH,gBAAgB,OAAQ,CAAA,MAAA;AAAA,UACtB,CAAC,KAAKA,OAAW,KAAA;AACf,YAAA,GAAA,CAAI,CAAGA,EAAAA,OAAAA,CAAO,KAAK,CAAA,MAAA,CAAQ,IAAI,SAAU,CAAA,GAAA;AAAA,cACvCA,OAAO,CAAA,KAAA;AAAA,aACT,CAAA;AACA,YAAO,OAAA,GAAA,CAAA;AAAA,WACT;AAAA,UACA,EAAC;AAAA,SACH;AAAA,QACA,SAAW,EAAA,SAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,cAAA,CAAe,KAAK,OAAO,CAAA,CAAA;AAAA,KAC7B;AAAA,GACF;AACA,EAAO,OAAA,CAAC,gBAAgB,aAAa,CAAA,CAAA;AACvC;;;;"}
package/esm/index.js CHANGED
@@ -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 { assertComponentRegistered, byModule, env, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isTableSchema, isWildcardSchema } from './feature-utils.js';
21
+ export { assertComponentRegistered, assertComponentsRegistered, 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';
@@ -42,6 +42,7 @@ export { isOpenDialogAction, isOpenSessionTableDialogMessage, isRequestResponse,
42
42
  export { NULL_RANGE, WindowRange, getFullRange, rangeNewItems, rangesAreSame, resetRange, withinRange } from './range-utils.js';
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
+ export { VuuShellLocation } from './shell-layout-types.js';
45
46
  export { addSortColumn, setSortColumn, toggleOrApplySort } from './sort-utils.js';
46
47
  export { getVuuTable } from './table-schema-utils.js';
47
48
  export { lastWord, wordify } from './text-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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,9 @@
1
+ const VuuShellLocation = {
2
+ ContextPanel: "context-panel",
3
+ SidePanel: "vuu-side-panel",
4
+ Workspace: "vuu-workspace",
5
+ WorkspaceContainer: "vuu-workspace-container"
6
+ };
7
+
8
+ export { VuuShellLocation };
9
+ //# sourceMappingURL=shell-layout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-layout-types.js","sources":["../src/shell-layout-types.ts"],"sourcesContent":["/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n SidePanel: \"vuu-side-panel\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation =\n (typeof VuuShellLocation)[keyof typeof VuuShellLocation];\n"],"names":[],"mappings":"AAKO,MAAM,gBAAmB,GAAA;AAAA,EAC9B,YAAc,EAAA,eAAA;AAAA,EACd,SAAW,EAAA,gBAAA;AAAA,EACX,SAAW,EAAA,eAAA;AAAA,EACX,kBAAoB,EAAA,yBAAA;AACtB;;;;"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
- "version": "0.8.74",
2
+ "version": "0.8.76",
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.74",
8
- "@vuu-ui/vuu-table-types": "0.8.74",
9
- "@vuu-ui/vuu-filter-types": "0.8.74",
10
- "@vuu-ui/vuu-protocol-types": "0.8.74"
7
+ "@vuu-ui/vuu-data-types": "0.8.76",
8
+ "@vuu-ui/vuu-table-types": "0.8.76",
9
+ "@vuu-ui/vuu-filter-types": "0.8.76",
10
+ "@vuu-ui/vuu-protocol-types": "0.8.76"
11
11
  },
12
12
  "peerDependencies": {
13
13
  "@internationalized/date": "^3.0.0",
14
- "@vuu-ui/vuu-filter-parser": "0.8.74",
14
+ "@vuu-ui/vuu-filter-parser": "0.8.76",
15
15
  "clsx": "^2.0.0",
16
16
  "react": ">=17.0.2",
17
17
  "react-dom": ">=17.0.2"
@@ -7,7 +7,7 @@ export interface VuuBroadcastChannel<T> extends EventTarget {
7
7
  onmessage: ((this: BroadcastChannel, evt: MessageEvent<T>) => void) | null;
8
8
  onmessageerror: ((this: BroadcastChannel, evt: MessageEvent<T>) => void) | null;
9
9
  close(): void;
10
- postMessage(message: T): void;
10
+ postMessage<M extends T = T>(message: M): void;
11
11
  addEventListener<K extends keyof VuuBroadcastChannelEventMap<T>>(type: K, listener: (this: BroadcastChannel, evt: VuuBroadcastChannelEventMap<T>[K]) => void, options?: boolean | AddEventListenerOptions): void;
12
12
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
13
13
  removeEventListener<K extends keyof VuuBroadcastChannelEventMap<T>>(type: K, listener: (this: BroadcastChannel, evt: VuuBroadcastChannelEventMap<T>[K]) => void, options?: boolean | EventListenerOptions): void;
@@ -31,8 +31,20 @@ type CellRendererOptions = {
31
31
  export interface CellRendererDescriptor extends CellRendererOptions {
32
32
  name: string;
33
33
  }
34
+ /**
35
+ * This check is performed during construction of UI from JSON. If component
36
+ * is not registered, it will log a warning.
37
+ */
34
38
  export declare const isContainer: (componentType: string) => boolean;
39
+ /**
40
+ * This check is performed during construction of UI from JSON. If component
41
+ * is not registered, it will log a warning.
42
+ */
35
43
  export declare const isView: (componentType: string) => boolean;
44
+ /**
45
+ * This check is performed during construction of UI from JSON. If component
46
+ * is not registered, it will log a warning.
47
+ */
36
48
  export declare const isLayoutComponent: (componentType: string) => componentType is layoutComponentType;
37
49
  export declare function registerComponent(componentName: string, component: RowClassGenerator, componentType: "row-class-generator", options?: CellRendererOptions): void;
38
50
  export declare function registerComponent(componentName: string, component: EditRuleValidator, componentType: "data-edit-validator", options?: CellRendererOptions): void;
@@ -58,5 +58,10 @@ export type GetFeaturePaths = (params: {
58
58
  withCss?: boolean;
59
59
  }) => FeatureProps;
60
60
  export declare const getFilterTableFeatures: (schemas: TableSchema[], getFeaturePath: GetFeaturePaths) => FeatureProps<FilterTableFeatureProps>[];
61
+ export type Component = {
62
+ componentName: string;
63
+ component: unknown;
64
+ };
61
65
  export declare const assertComponentRegistered: (componentName: string, component: unknown) => void;
66
+ export declare const assertComponentsRegistered: (componentList: Component[]) => void;
62
67
  export declare const getCustomAndTableFeatures: (features: Features, vuuTables: Map<string, TableSchema>) => [FeatureProps[], FeatureProps<FilterTableFeatureProps>[]];
package/types/index.d.ts CHANGED
@@ -40,6 +40,7 @@ export * from "./protocol-message-utils";
40
40
  export * from "./range-utils";
41
41
  export * from "./row-utils";
42
42
  export * from "./selection-utils";
43
+ export * from "./shell-layout-types";
43
44
  export * from "./sort-utils";
44
45
  export * from "./table-schema-utils";
45
46
  export * from "./text-utils";
@@ -16,7 +16,7 @@ export interface ApplicationSettings {
16
16
  export type ApplicationSetting = ValueOf<ApplicationSettings>;
17
17
  export type Settings = Record<string, string | number | boolean>;
18
18
  export interface ApplicationJSON {
19
- layout: LayoutJSON;
19
+ workspaceJSON: LayoutJSON;
20
20
  settings?: ApplicationSettings;
21
21
  userSettings?: Settings;
22
22
  }
@@ -39,13 +39,13 @@ export interface WithType {
39
39
  type: string;
40
40
  }
41
41
  export type LayoutModel = LayoutRoot | ReactElement | WithType;
42
- export interface LayoutJSON extends WithType {
42
+ export interface LayoutJSON<T extends object = {
43
+ [key: string]: unknown;
44
+ }> extends WithType {
43
45
  active?: number;
44
46
  children?: LayoutJSON[];
45
47
  id?: string;
46
- props?: {
47
- [key: string]: unknown;
48
- };
48
+ props?: T;
49
49
  state?: unknown;
50
50
  type: string;
51
51
  style?: CSSProperties;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The Vuu Shell creates the outermost application layout. This includes some
3
+ * 'special' identifiers that can be targetted by layout commands to effect or
4
+ * react to layout changes.
5
+ */
6
+ export declare const VuuShellLocation: {
7
+ readonly ContextPanel: "context-panel";
8
+ readonly SidePanel: "vuu-side-panel";
9
+ readonly Workspace: "vuu-workspace";
10
+ readonly WorkspaceContainer: "vuu-workspace-container";
11
+ };
12
+ export type VuuShellLocation = (typeof VuuShellLocation)[keyof typeof VuuShellLocation];