@vuu-ui/vuu-datatable 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/cjs/filter-table/FilterTable.js.map +1 -1
  2. package/cjs/filter-table/useFilterTable.js.map +1 -1
  3. package/cjs/filter-table/usePersistFilterState.js.map +1 -1
  4. package/cjs/index.js +2 -0
  5. package/cjs/index.js.map +1 -1
  6. package/cjs/json-table/JsonCell.js.map +1 -1
  7. package/cjs/json-table/JsonTable.js.map +1 -1
  8. package/cjs/linked-table-view/LinkedTableView.css.js +6 -0
  9. package/cjs/linked-table-view/LinkedTableView.css.js.map +1 -0
  10. package/cjs/linked-table-view/LinkedTableView.js +92 -0
  11. package/cjs/linked-table-view/LinkedTableView.js.map +1 -0
  12. package/cjs/linked-table-view/useLinkedTableView.js +184 -0
  13. package/cjs/linked-table-view/useLinkedTableView.js.map +1 -0
  14. package/cjs/tree-table/TreeTable.js +31 -11
  15. package/cjs/tree-table/TreeTable.js.map +1 -1
  16. package/esm/filter-table/FilterTable.js.map +1 -1
  17. package/esm/filter-table/useFilterTable.js.map +1 -1
  18. package/esm/filter-table/usePersistFilterState.js.map +1 -1
  19. package/esm/index.js +1 -0
  20. package/esm/index.js.map +1 -1
  21. package/esm/json-table/JsonCell.js.map +1 -1
  22. package/esm/json-table/JsonTable.js.map +1 -1
  23. package/esm/linked-table-view/LinkedTableView.css.js +4 -0
  24. package/esm/linked-table-view/LinkedTableView.css.js.map +1 -0
  25. package/esm/linked-table-view/LinkedTableView.js +90 -0
  26. package/esm/linked-table-view/LinkedTableView.js.map +1 -0
  27. package/esm/linked-table-view/useLinkedTableView.js +182 -0
  28. package/esm/linked-table-view/useLinkedTableView.js.map +1 -0
  29. package/esm/tree-table/TreeTable.js +32 -12
  30. package/esm/tree-table/TreeTable.js.map +1 -1
  31. package/package.json +11 -11
  32. package/types/filter-table/FilterTable.d.ts +1 -1
  33. package/types/index.d.ts +1 -0
  34. package/types/json-table/JsonCell.d.ts +1 -2
  35. package/types/json-table/JsonTable.d.ts +1 -2
  36. package/types/linked-table-view/LinkedTableView.d.ts +38 -0
  37. package/types/linked-table-view/useLinkedTableView.d.ts +48 -0
  38. package/types/tree-table/TreeTable.d.ts +12 -5
@@ -1 +1 @@
1
- {"version":3,"file":"usePersistFilterState.js","sources":["../../src/filter-table/usePersistFilterState.ts"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, FilterState, NamedFilter } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterBarProps } from \"@vuu-ui/vuu-filters\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport { useWorkspace } from \"@vuu-ui/vuu-shell\";\nimport { FilterTableFeatureProps } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nconst NO_CONFIG: FilterBarConfig = {};\n\ntype FilterBarConfig = {\n \"filterbar-config\"?: Partial<FilterBarProps>;\n};\n\ntype SavedFilterMap = {\n [key: string]: Omit<NamedFilter, \"name\"> & { name: string }[];\n};\n\nconst hasFilterWithName = (filters: NamedFilter[], name: string) =>\n filters.findIndex((f) => f.name === name) !== -1;\n\nexport const usePersistFilterState = ({\n tableSchema,\n}: FilterTableFeatureProps) => {\n const { load, save } = useViewContext();\n const { getApplicationSettings, saveApplicationSettings } = useWorkspace();\n\n const { \"filterbar-config\": filterbarConfigFromState } =\n useMemo<FilterBarConfig>(() => load?.() ?? NO_CONFIG, [load]);\n\n const [filterState, setFilterState] = useState<FilterState>({\n filters: filterbarConfigFromState?.filterState?.filters ?? [],\n activeIndices: filterbarConfigFromState?.filterState?.activeIndices ?? [],\n });\n\n const savedFilters = useMemo(() => {\n const {\n table: { module, table },\n } = tableSchema;\n const savedFilters = getApplicationSettings(\"filters\") as SavedFilterMap;\n const key = `${module}:${table}`;\n return savedFilters?.[key] ?? [];\n }, [getApplicationSettings, tableSchema]);\n\n const removeFilterFromSettings = useCallback(\n (filter: Filter | NamedFilter) => {\n if (!tableSchema || !filter.name) return;\n\n const savedFilters = getApplicationSettings(\"filters\") as SavedFilterMap;\n if (!savedFilters) return;\n\n const { module, table } = tableSchema.table;\n const key = `${module}:${table}`;\n\n if (hasFilterWithName(savedFilters[key], filter.name)) {\n const newSavedFilters = {\n ...savedFilters,\n [key]: savedFilters[key].filter((f) => f.name !== filter.name),\n };\n saveApplicationSettings(newSavedFilters, \"filters\");\n }\n },\n [getApplicationSettings, saveApplicationSettings, tableSchema],\n );\n\n const saveFilterToSettings = useCallback(\n (filter: Filter, name?: string) => {\n if (tableSchema && name) {\n const savedFilters = getApplicationSettings(\n \"filters\",\n ) as SavedFilterMap;\n let newFilters = savedFilters;\n const { module, table } = tableSchema.table;\n const key = `${module}:${table}`;\n if (savedFilters) {\n if (savedFilters[key]) {\n if (hasFilterWithName(savedFilters[key], name)) {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].map((f) =>\n f.name === name ? { ...filter, name } : f,\n ),\n };\n } else if (\n filter?.name &&\n filter?.name !== name &&\n hasFilterWithName(savedFilters[key], filter.name)\n ) {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].map((f) =>\n f.name === filter.name ? { ...filter, name } : f,\n ),\n };\n } else {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].concat({ ...filter, name }),\n };\n }\n } else {\n newFilters = {\n ...savedFilters,\n [key]: [{ ...filter, name }],\n };\n }\n } else {\n newFilters = {\n [key]: [{ ...filter, name }],\n };\n }\n if (newFilters !== savedFilters) {\n saveApplicationSettings(newFilters, \"filters\");\n }\n }\n },\n [getApplicationSettings, saveApplicationSettings, tableSchema],\n );\n\n const handleFilterStateChanged = useCallback(\n (filterState: FilterState) => {\n save?.({ filterState }, \"filterbar-config\");\n setFilterState(filterState);\n },\n [save],\n );\n\n const handleFilterDeleted = useCallback(\n (filter: Filter) => {\n removeFilterFromSettings(filter);\n },\n [removeFilterFromSettings],\n );\n\n const handleFilterRenamed = useCallback(\n (filter: Filter, name: string) => {\n saveFilterToSettings(filter, name);\n },\n [saveFilterToSettings],\n );\n\n const buildFilterTableMenuOptions = useCallback<MenuBuilder>(\n (location) => {\n if (location === \"filter-bar-menu\") {\n if (savedFilters.length > 0) {\n return savedFilters.map((filter) => ({\n action: \"add-filter\",\n label: filter.name,\n options: { filter },\n }));\n } else {\n return [\n {\n label: `You have no saved filters for this table`,\n action: `no-action`,\n } as ContextMenuItemDescriptor,\n ];\n }\n } else {\n return [];\n }\n },\n [savedFilters],\n );\n\n const handleFilterTableMenuAction = useCallback<MenuActionHandler>(\n (menuAction) => {\n const { menuId, options } = menuAction;\n if (menuId === \"add-filter\") {\n console.log(`add filter `, {\n options,\n });\n return true;\n } else {\n return false;\n }\n console.log(menuId, options);\n // return false;\n },\n [],\n );\n\n return {\n buildFilterTableMenuOptions,\n filterState,\n handleFilterTableMenuAction,\n onFilterStateChanged: handleFilterStateChanged,\n onFilterDeleted: handleFilterDeleted,\n onFilterRenamed: handleFilterRenamed,\n };\n};\n"],"names":["savedFilters","filterState"],"mappings":"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"}
1
+ {"version":3,"file":"usePersistFilterState.js","sources":["../../src/filter-table/usePersistFilterState.ts"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, FilterState, NamedFilter } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterBarProps } from \"@vuu-ui/vuu-filters\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport { useWorkspace } from \"@vuu-ui/vuu-shell\";\nimport { FilterTableFeatureProps } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nconst NO_CONFIG: FilterBarConfig = {};\n\ntype FilterBarConfig = {\n \"filterbar-config\"?: Partial<FilterBarProps>;\n};\n\ntype SavedFilterMap = {\n [key: string]: Omit<NamedFilter, \"name\"> & { name: string }[];\n};\n\nconst hasFilterWithName = (filters: NamedFilter[], name: string) =>\n filters.findIndex((f) => f.name === name) !== -1;\n\nexport const usePersistFilterState = ({\n tableSchema,\n}: FilterTableFeatureProps) => {\n const { load, save } = useViewContext();\n const { getApplicationSettings, saveApplicationSettings } = useWorkspace();\n\n const { \"filterbar-config\": filterbarConfigFromState } =\n useMemo<FilterBarConfig>(() => load?.() ?? NO_CONFIG, [load]);\n\n const [filterState, setFilterState] = useState<FilterState>({\n filters: filterbarConfigFromState?.filterState?.filters ?? [],\n activeIndices: filterbarConfigFromState?.filterState?.activeIndices ?? [],\n });\n\n const savedFilters = useMemo(() => {\n const {\n table: { module, table },\n } = tableSchema;\n const savedFilters = getApplicationSettings(\"filters\") as SavedFilterMap;\n const key = `${module}:${table}`;\n return savedFilters?.[key] ?? [];\n }, [getApplicationSettings, tableSchema]);\n\n const removeFilterFromSettings = useCallback(\n (filter: Filter | NamedFilter) => {\n if (!tableSchema || !filter.name) return;\n\n const savedFilters = getApplicationSettings(\"filters\") as SavedFilterMap;\n if (!savedFilters) return;\n\n const { module, table } = tableSchema.table;\n const key = `${module}:${table}`;\n\n if (hasFilterWithName(savedFilters[key], filter.name)) {\n const newSavedFilters = {\n ...savedFilters,\n [key]: savedFilters[key].filter((f) => f.name !== filter.name),\n };\n saveApplicationSettings(newSavedFilters, \"filters\");\n }\n },\n [getApplicationSettings, saveApplicationSettings, tableSchema],\n );\n\n const saveFilterToSettings = useCallback(\n (filter: Filter, name?: string) => {\n if (tableSchema && name) {\n const savedFilters = getApplicationSettings(\n \"filters\",\n ) as SavedFilterMap;\n let newFilters = savedFilters;\n const { module, table } = tableSchema.table;\n const key = `${module}:${table}`;\n if (savedFilters) {\n if (savedFilters[key]) {\n if (hasFilterWithName(savedFilters[key], name)) {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].map((f) =>\n f.name === name ? { ...filter, name } : f,\n ),\n };\n } else if (\n filter?.name &&\n filter?.name !== name &&\n hasFilterWithName(savedFilters[key], filter.name)\n ) {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].map((f) =>\n f.name === filter.name ? { ...filter, name } : f,\n ),\n };\n } else {\n newFilters = {\n ...savedFilters,\n [key]: savedFilters[key].concat({ ...filter, name }),\n };\n }\n } else {\n newFilters = {\n ...savedFilters,\n [key]: [{ ...filter, name }],\n };\n }\n } else {\n newFilters = {\n [key]: [{ ...filter, name }],\n };\n }\n if (newFilters !== savedFilters) {\n saveApplicationSettings(newFilters, \"filters\");\n }\n }\n },\n [getApplicationSettings, saveApplicationSettings, tableSchema],\n );\n\n const handleFilterStateChanged = useCallback(\n (filterState: FilterState) => {\n save?.({ filterState }, \"filterbar-config\");\n setFilterState(filterState);\n },\n [save],\n );\n\n const handleFilterDeleted = useCallback(\n (filter: Filter) => {\n removeFilterFromSettings(filter);\n },\n [removeFilterFromSettings],\n );\n\n const handleFilterRenamed = useCallback(\n (filter: Filter, name: string) => {\n saveFilterToSettings(filter, name);\n },\n [saveFilterToSettings],\n );\n\n const buildFilterTableMenuOptions = useCallback<MenuBuilder>(\n (location) => {\n if (location === \"filter-bar-menu\") {\n if (savedFilters.length > 0) {\n return savedFilters.map((filter) => ({\n action: \"add-filter\",\n label: filter.name,\n options: { filter },\n }));\n } else {\n return [\n {\n label: `You have no saved filters for this table`,\n action: `no-action`,\n } as ContextMenuItemDescriptor,\n ];\n }\n } else {\n return [];\n }\n },\n [savedFilters],\n );\n\n const handleFilterTableMenuAction = useCallback<MenuActionHandler>(\n (menuAction) => {\n const { menuId, options } = menuAction;\n if (menuId === \"add-filter\") {\n console.log(`add filter `, {\n options,\n });\n return true;\n } else {\n return false;\n }\n console.log(menuId, options);\n // return false;\n },\n [],\n );\n\n return {\n buildFilterTableMenuOptions,\n filterState,\n handleFilterTableMenuAction,\n onFilterStateChanged: handleFilterStateChanged,\n onFilterDeleted: handleFilterDeleted,\n onFilterRenamed: handleFilterRenamed,\n };\n};\n"],"names":["savedFilters","filterState"],"mappings":"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"}
package/esm/index.js CHANGED
@@ -2,4 +2,5 @@ export { FilterTable } from './filter-table/FilterTable.js';
2
2
  export { usePersistFilterState } from './filter-table/usePersistFilterState.js';
3
3
  export { JsonTable } from './json-table/JsonTable.js';
4
4
  export { TreeTable } from './tree-table/TreeTable.js';
5
+ export { LinkedTableView } from './linked-table-view/LinkedTableView.js';
5
6
  //# sourceMappingURL=index.js.map
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":";;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonCell.js","sources":["../../src/json-table/JsonCell.tsx"],"sourcesContent":["import { TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ToggleIconButton } from \"@vuu-ui/vuu-ui-controls\";\n\n// Note the className is actually applied to containing cell\nimport arrayCellCss from \"./JsonCell.css\";\n\nconst { IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nexport const JsonCell = ({ column, columnMap, row }: TableCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-array-cell\",\n css: arrayCellCss,\n window: targetWindow,\n });\n\n const { name } = column;\n const dataIdx = columnMap[name];\n let { [IS_EXPANDED]: isExpanded, [IS_LEAF]: isLeaf, [dataIdx]: value } = row;\n\n const getDisplayValue = () => {\n if (isLeaf) {\n return value;\n } else if (typeof value === \"string\" && value.endsWith(\"{\")) {\n value = value.slice(0, -1);\n if (!isNaN(parseInt(value))) {\n return `${value}: {...}`;\n } else {\n return `value {...}`;\n }\n } else if (typeof value === \"string\" && value.endsWith(\"[\")) {\n value = value.slice(0, -1);\n return `${value} [...]`;\n }\n };\n\n const displayValue = getDisplayValue();\n const isEmpty = displayValue === \"\" || displayValue === undefined;\n\n return (\n <>\n {isLeaf || isEmpty ? null : <ToggleIconButton isExpanded={isExpanded} />}\n <span>{displayValue}</span>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AASA,MAAM,EAAE,WAAa,EAAA,OAAA,EAAY,GAAA,YAAA,CAAA;AAE1B,MAAM,WAAW,CAAC,EAAE,MAAQ,EAAA,SAAA,EAAW,KAA0B,KAAA;AACtE,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA,CAAA;AACjB,EAAM,MAAA,OAAA,GAAU,UAAU,IAAI,CAAA,CAAA;AAC9B,EAAA,IAAI,EAAE,CAAC,WAAW,GAAG,UAAY,EAAA,CAAC,OAAO,GAAG,MAAQ,EAAA,CAAC,OAAO,GAAG,OAAU,GAAA,GAAA,CAAA;AAEzE,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,KAAA,CAAA;AAAA,eACE,OAAO,KAAA,KAAU,YAAY,KAAM,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC3D,MAAQ,KAAA,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA,CAAA;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,QAAS,CAAA,KAAK,CAAC,CAAG,EAAA;AAC3B,QAAA,OAAO,GAAG,KAAK,CAAA,OAAA,CAAA,CAAA;AAAA,OACV,MAAA;AACL,QAAO,OAAA,CAAA,WAAA,CAAA,CAAA;AAAA,OACT;AAAA,eACS,OAAO,KAAA,KAAU,YAAY,KAAM,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC3D,MAAQ,KAAA,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA,CAAA;AACzB,MAAA,OAAO,GAAG,KAAK,CAAA,MAAA,CAAA,CAAA;AAAA,KACjB;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,eAAe,eAAgB,EAAA,CAAA;AACrC,EAAM,MAAA,OAAA,GAAU,YAAiB,KAAA,EAAA,IAAM,YAAiB,KAAA,KAAA,CAAA,CAAA;AAExD,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,MAAA,IAAU,OAAU,GAAA,IAAA,mBAAQ,GAAA,CAAA,gBAAA,EAAA,EAAiB,UAAwB,EAAA,CAAA;AAAA,oBACtE,GAAA,CAAC,UAAM,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,GACtB,EAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"JsonCell.js","sources":["../../src/json-table/JsonCell.tsx"],"sourcesContent":["import { TableCellProps } from \"@vuu-ui/vuu-table-types\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ToggleIconButton } from \"@vuu-ui/vuu-ui-controls\";\n\n// Note the className is actually applied to containing cell\nimport arrayCellCss from \"./JsonCell.css\";\n\nconst { IS_EXPANDED, IS_LEAF } = metadataKeys;\n\nexport const JsonCell = ({ column, columnMap, row }: TableCellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-array-cell\",\n css: arrayCellCss,\n window: targetWindow,\n });\n\n const { name } = column;\n const dataIdx = columnMap[name];\n let { [IS_EXPANDED]: isExpanded, [IS_LEAF]: isLeaf, [dataIdx]: value } = row;\n\n const getDisplayValue = () => {\n if (isLeaf) {\n return value;\n } else if (typeof value === \"string\" && value.endsWith(\"{\")) {\n value = value.slice(0, -1);\n if (!isNaN(parseInt(value))) {\n return `${value}: {...}`;\n } else {\n return `value {...}`;\n }\n } else if (typeof value === \"string\" && value.endsWith(\"[\")) {\n value = value.slice(0, -1);\n return `${value} [...]`;\n }\n };\n\n const displayValue = getDisplayValue();\n const isEmpty = displayValue === \"\" || displayValue === undefined;\n\n return (\n <>\n {isLeaf || isEmpty ? null : <ToggleIconButton isExpanded={isExpanded} />}\n <span>{displayValue}</span>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AASA,MAAM,EAAE,WAAa,EAAA,OAAA,EAAY,GAAA,YAAA;AAE1B,MAAM,WAAW,CAAC,EAAE,MAAQ,EAAA,SAAA,EAAW,KAA0B,KAAA;AACtE,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AACjB,EAAM,MAAA,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,EAAA,IAAI,EAAE,CAAC,WAAW,GAAG,UAAY,EAAA,CAAC,OAAO,GAAG,MAAQ,EAAA,CAAC,OAAO,GAAG,OAAU,GAAA,GAAA;AAEzE,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,KAAA;AAAA,eACE,OAAO,KAAA,KAAU,YAAY,KAAM,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC3D,MAAQ,KAAA,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,QAAS,CAAA,KAAK,CAAC,CAAG,EAAA;AAC3B,QAAA,OAAO,GAAG,KAAK,CAAA,OAAA,CAAA;AAAA,OACV,MAAA;AACL,QAAO,OAAA,CAAA,WAAA,CAAA;AAAA;AACT,eACS,OAAO,KAAA,KAAU,YAAY,KAAM,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC3D,MAAQ,KAAA,GAAA,KAAA,CAAM,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA;AACzB,MAAA,OAAO,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA;AACjB,GACF;AAEA,EAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,EAAM,MAAA,OAAA,GAAU,YAAiB,KAAA,EAAA,IAAM,YAAiB,KAAA,KAAA,CAAA;AAExD,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,MAAA,IAAU,OAAU,GAAA,IAAA,mBAAQ,GAAA,CAAA,gBAAA,EAAA,EAAiB,UAAwB,EAAA,CAAA;AAAA,oBACtE,GAAA,CAAC,UAAM,QAAa,EAAA,YAAA,EAAA;AAAA,GACtB,EAAA,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonTable.js","sources":["../../src/json-table/JsonTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { JsonData, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { JsonDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { JsonCell } from \"./JsonCell\";\n\nregisterComponent(\"json\", JsonCell, \"cell-renderer\");\n\nexport interface JsonTableProps\n extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n source: JsonData;\n}\n\nexport const JsonTable = ({\n config,\n source: sourceProp,\n ...tableProps\n}: JsonTableProps) => {\n const sourceRef = useRef(sourceProp);\n const dataSourceRef = useRef<JsonDataSource>();\n useMemo(() => {\n dataSourceRef.current = new JsonDataSource({\n data: sourceRef.current,\n });\n }, []);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: true,\n rowSeparators: true,\n };\n }, [config]);\n\n useEffect(() => {\n if (dataSourceRef.current) {\n dataSourceRef.current.data = sourceProp;\n }\n }, [sourceProp]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n config={tableConfig}\n dataSource={dataSourceRef.current}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAQA,iBAAkB,CAAA,MAAA,EAAQ,UAAU,eAAe,CAAA,CAAA;AAW5C,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,MAAQ,EAAA,UAAA;AAAA,EACR,GAAG,UAAA;AACL,CAAsB,KAAA;AACpB,EAAM,MAAA,SAAA,GAAY,OAAO,UAAU,CAAA,CAAA;AACnC,EAAA,MAAM,gBAAgB,MAAuB,EAAA,CAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,MACzC,MAAM,SAAU,CAAA,OAAA;AAAA,KACjB,CAAA,CAAA;AAAA,GACH,EAAG,EAAE,CAAA,CAAA;AAEL,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,IAAA;AAAA,MAClB,aAAe,EAAA,IAAA;AAAA,KACjB,CAAA;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAA,aAAA,CAAc,QAAQ,IAAO,GAAA,UAAA,CAAA;AAAA,KAC/B;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,MAAA;AAAA,KAAA;AAAA,GACjB,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"JsonTable.js","sources":["../../src/json-table/JsonTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { JsonData, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { JsonDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { JsonCell } from \"./JsonCell\";\n\nregisterComponent(\"json\", JsonCell, \"cell-renderer\");\n\nexport interface JsonTableProps\n extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n source: JsonData;\n}\n\nexport const JsonTable = ({\n config,\n source: sourceProp,\n ...tableProps\n}: JsonTableProps) => {\n const sourceRef = useRef(sourceProp);\n const dataSourceRef = useRef<JsonDataSource>();\n useMemo(() => {\n dataSourceRef.current = new JsonDataSource({\n data: sourceRef.current,\n });\n }, []);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: true,\n rowSeparators: true,\n };\n }, [config]);\n\n useEffect(() => {\n if (dataSourceRef.current) {\n dataSourceRef.current.data = sourceProp;\n }\n }, [sourceProp]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n config={tableConfig}\n dataSource={dataSourceRef.current}\n showColumnHeaderMenus={false}\n selectionModel=\"none\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAQA,iBAAkB,CAAA,MAAA,EAAQ,UAAU,eAAe,CAAA;AAW5C,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,MAAQ,EAAA,UAAA;AAAA,EACR,GAAG;AACL,CAAsB,KAAA;AACpB,EAAM,MAAA,SAAA,GAAY,OAAO,UAAU,CAAA;AACnC,EAAA,MAAM,gBAAgB,MAAuB,EAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,MACzC,MAAM,SAAU,CAAA;AAAA,KACjB,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,IAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAA,aAAA,CAAc,QAAQ,IAAO,GAAA,UAAA;AAAA;AAC/B,GACF,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA;AAAA;AAAA,GACjB;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var css = ".vuuLinkedTableView {\n \n}\n\n.vuuLinkedTableView-view {\n padding: var(--salt-spacing-100);\n}";
2
+
3
+ export { css as default };
4
+ //# sourceMappingURL=LinkedTableView.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedTableView.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,90 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { View, Flexbox, Stack } from '@vuu-ui/vuu-layout';
3
+ import { Table } from '@vuu-ui/vuu-table';
4
+ import { useComponentCssInjection } from '@salt-ds/styles';
5
+ import { useWindow } from '@salt-ds/window';
6
+ import cx from 'clsx';
7
+ import { useLinkedTableView } from './useLinkedTableView.js';
8
+ import css from './LinkedTableView.css.js';
9
+
10
+ const classBase = "vuuLinkedTableView";
11
+ const LinkedTables = ({
12
+ className,
13
+ linkedDataSources,
14
+ ...htmlAttributes
15
+ }) => {
16
+ const targetWindow = useWindow();
17
+ useComponentCssInjection({
18
+ testId: "vuu-linked-table-view",
19
+ css,
20
+ window: targetWindow
21
+ });
22
+ const { activeTabs, tableConfig, ...config } = useLinkedTableView({
23
+ linkedDataSources
24
+ });
25
+ const getLinkedTables = (tdsConfig, { onTabChange, ...levelConfig }) => Array.isArray(tdsConfig) ? /* @__PURE__ */ jsx(
26
+ Stack,
27
+ {
28
+ active: activeTabs[1],
29
+ "data-resizeable": true,
30
+ onTabSelectionChanged: onTabChange,
31
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
32
+ children: tdsConfig.map(({ config: config2, dataSource, title }, i) => /* @__PURE__ */ jsx(
33
+ View,
34
+ {
35
+ className: `${classBase}-view`,
36
+ resizeable: true,
37
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
38
+ title,
39
+ children: /* @__PURE__ */ jsx(Table, { config: config2, dataSource })
40
+ },
41
+ i
42
+ ))
43
+ },
44
+ levelConfig.key
45
+ ) : /* @__PURE__ */ jsx(
46
+ View,
47
+ {
48
+ ...levelConfig,
49
+ header: true,
50
+ resizeable: true,
51
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
52
+ title: tdsConfig.title,
53
+ children: /* @__PURE__ */ jsx(Table, { config: tdsConfig.config, dataSource: tdsConfig.dataSource })
54
+ }
55
+ );
56
+ const getAllLinkedTables = (level2, level3, config2) => {
57
+ const results = [getLinkedTables(level2, config2.level2)];
58
+ if (level3) {
59
+ results.push(getLinkedTables(level3, config2.level3));
60
+ }
61
+ return results;
62
+ };
63
+ if (tableConfig) {
64
+ const { "1": level1, "2": level2, "3": level3 } = tableConfig;
65
+ return /* @__PURE__ */ jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsxs(Flexbox, { style: { flexDirection: "column", height: "100%" }, children: [
66
+ /* @__PURE__ */ jsx(
67
+ View,
68
+ {
69
+ className: `${classBase}-view`,
70
+ header: true,
71
+ resizeable: true,
72
+ style: { flexBasis: 0, flexGrow: 1, flexShrink: 1 },
73
+ title: level1.title,
74
+ children: /* @__PURE__ */ jsx(Table, { config: level1.config, dataSource: level1.dataSource })
75
+ }
76
+ ),
77
+ ...getAllLinkedTables(level2, level3, config)
78
+ ] }) });
79
+ } else {
80
+ return null;
81
+ }
82
+ };
83
+ const LinkedTableView = ({
84
+ className,
85
+ linkedDataSources,
86
+ ...htmlAttributes
87
+ }) => /* @__PURE__ */ jsx(View, { ...htmlAttributes, className, children: /* @__PURE__ */ jsx(LinkedTables, { linkedDataSources }) });
88
+
89
+ export { LinkedTableView };
90
+ //# sourceMappingURL=LinkedTableView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedTableView.js","sources":["../../src/linked-table-view/LinkedTableView.tsx"],"sourcesContent":["import { DataSource, DataSourceConstructorProps } from \"@vuu-ui/vuu-data-types\";\nimport { Flexbox, Stack, View } from \"@vuu-ui/vuu-layout\";\nimport { VuuLink } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport {\n LevelConfig,\n LevelsConfig,\n type TableDataSourceConfig,\n useLinkedTableView,\n} from \"./useLinkedTableView\";\n\nimport css from \"./LinkedTableView.css\";\n\nconst classBase = \"vuuLinkedTableView\";\n\nexport interface LinkTableConfig {\n config?: TableConfig;\n dataSource: DataSourceConstructorProps | DataSource;\n title: string;\n}\nexport interface LinkedTableConfig extends LinkTableConfig {\n /**\n * toTable will default to the table above in hierarchy. If there are multiple\n * tables in level above, toTable should be specified.\n */\n vuuLink: Pick<VuuLink, \"fromColumn\" | \"toColumn\"> & { toTable?: string };\n}\n\n/**\n * Currently supports max of three levels of hierarchical data\n * 1 = parent (required)\n * 2 = child (required)\n * 3 = grandchild (optional)\n */\nexport type LinkedDataSources = {\n \"1\": LinkTableConfig;\n \"2\": LinkedTableConfig | LinkedTableConfig[];\n \"3\"?: LinkedTableConfig | LinkedTableConfig[];\n};\n\n/**\n * Displays a vertical 'tower' of Tables with a hierarchical relationship.\n * Selection of row(s) on tables higher in the hierarchy drives the population\n * of data in tables below. (could be two-way ?)\n */\nexport interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {\n linkedDataSources: LinkedDataSources;\n}\nconst LinkedTables = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-linked-table-view\",\n css: css,\n window: targetWindow,\n });\n\n const { activeTabs, tableConfig, ...config } = useLinkedTableView({\n linkedDataSources,\n });\n\n const getLinkedTables = (\n tdsConfig: TableDataSourceConfig | TableDataSourceConfig[],\n { onTabChange, ...levelConfig }: LevelConfig,\n ) =>\n Array.isArray(tdsConfig) ? (\n <Stack\n active={activeTabs[1]}\n data-resizeable\n key={levelConfig.key}\n onTabSelectionChanged={onTabChange}\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n >\n {tdsConfig.map(({ config, dataSource, title }, i) => (\n <View\n className={`${classBase}-view`}\n key={i}\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={title}\n >\n <Table config={config} dataSource={dataSource} />\n </View>\n ))}\n </Stack>\n ) : (\n <View\n {...levelConfig}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={tdsConfig.title}\n >\n <Table config={tdsConfig.config} dataSource={tdsConfig.dataSource} />\n </View>\n );\n\n const getAllLinkedTables = (\n level2: TableDataSourceConfig | TableDataSourceConfig[],\n level3: TableDataSourceConfig | TableDataSourceConfig[] | undefined,\n config: LevelsConfig,\n ) => {\n const results = [getLinkedTables(level2, config.level2)];\n if (level3) {\n results.push(getLinkedTables(level3, config.level3));\n }\n return results;\n };\n\n if (tableConfig) {\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = tableConfig;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <Flexbox style={{ flexDirection: \"column\", height: \"100%\" }}>\n <View\n className={`${classBase}-view`}\n header\n resizeable\n style={{ flexBasis: 0, flexGrow: 1, flexShrink: 1 }}\n title={level1.title}\n >\n <Table config={level1.config} dataSource={level1.dataSource} />\n </View>\n {...getAllLinkedTables(level2, level3, config)}\n </Flexbox>\n </div>\n );\n } else {\n return null;\n }\n};\n\n// Wrap the core component in View so we have access to View Context services\nexport const LinkedTableView = ({\n className,\n linkedDataSources,\n ...htmlAttributes\n}: LinkedTableViewProps) => (\n <View {...htmlAttributes} className={className}>\n <LinkedTables linkedDataSources={linkedDataSources} />\n </View>\n);\n"],"names":["config"],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ import { useDataSource } from '@vuu-ui/vuu-utils';
2
+ import { useState, useMemo, useCallback } from 'react';
3
+ import { useViewContext } from '@vuu-ui/vuu-layout';
4
+
5
+ const getSchema = (schemas, { module, table }) => {
6
+ const schema = schemas.find(
7
+ ({ table: t }) => t.module === module && t.table === table
8
+ );
9
+ if (schema) {
10
+ return schema;
11
+ } else {
12
+ throw Error(`No schema for table ${module} ${table}`);
13
+ }
14
+ };
15
+ const getTable = (ds) => {
16
+ if (ds.table) {
17
+ return ds.table;
18
+ } else {
19
+ throw Error("No datasource table specified");
20
+ }
21
+ };
22
+ const getTables = (linkedDataSources) => {
23
+ const { "1": linked1, "2": linked2, "3": linked3 } = linkedDataSources;
24
+ const tables = [];
25
+ tables.push(getTable(linked1.dataSource));
26
+ if (Array.isArray(linked2)) {
27
+ linked2.forEach(({ dataSource }) => {
28
+ tables.push(getTable(dataSource));
29
+ });
30
+ } else {
31
+ tables.push(getTable(linked2.dataSource));
32
+ }
33
+ if (Array.isArray(linked3)) {
34
+ linked3.forEach(({ dataSource }) => {
35
+ tables.push(getTable(dataSource));
36
+ });
37
+ } else if (linked3) {
38
+ tables.push(getTable(linked3.dataSource));
39
+ }
40
+ return tables;
41
+ };
42
+ const useLinkedTableView = ({
43
+ linkedDataSources
44
+ }) => {
45
+ const { VuuDataSource, getServerAPI } = useDataSource();
46
+ const [tableConfig, setTableConfig] = useState();
47
+ const { id } = useViewContext();
48
+ console.log({ id });
49
+ const [activeTabs, setActiveTab] = useState([
50
+ 0,
51
+ 0,
52
+ 0
53
+ ]);
54
+ const [collapsed, setCollapsed] = useState([
55
+ false,
56
+ false
57
+ ]);
58
+ useMemo(async () => {
59
+ const tables = getTables(linkedDataSources);
60
+ const serverAPI = await getServerAPI();
61
+ const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));
62
+ const isDataSource = (ds) => typeof ds === typeof VuuDataSource;
63
+ const getDataSource = (ds) => {
64
+ if (isDataSource(ds)) {
65
+ return ds;
66
+ } else {
67
+ return new VuuDataSource(ds);
68
+ }
69
+ };
70
+ const createVisualLink = (vuuLink, parentDs) => {
71
+ if (parentDs && parentDs.table) {
72
+ const parentVpId = parentDs.viewport;
73
+ const toTable = vuuLink.toTable ?? parentDs.table?.table;
74
+ return {
75
+ link: {
76
+ ...vuuLink,
77
+ toTable
78
+ },
79
+ parentClientVpId: parentVpId,
80
+ parentVpId
81
+ };
82
+ } else {
83
+ throw Error("visual link cannot be created without parent vp id");
84
+ }
85
+ };
86
+ const getLinkedDataSource = (ds, vuuLink, parentDs) => {
87
+ if (isDataSource(ds)) {
88
+ return ds;
89
+ } else {
90
+ return new VuuDataSource({
91
+ ...ds,
92
+ visualLink: createVisualLink(vuuLink, parentDs)
93
+ });
94
+ }
95
+ };
96
+ const getTableConfig = (ds) => {
97
+ const schema = getSchema(schemas, getTable(ds));
98
+ return {
99
+ columns: schema.columns
100
+ };
101
+ };
102
+ const getRootConfig = ({
103
+ dataSource: ds,
104
+ title
105
+ }) => ({
106
+ config: getTableConfig(ds),
107
+ dataSource: getDataSource(ds),
108
+ title
109
+ });
110
+ const getLinkedConfig = ({ dataSource: ds, vuuLink, title }, parentDataSource) => ({
111
+ config: getTableConfig(ds),
112
+ dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),
113
+ title
114
+ });
115
+ const getLinkedConfigs = (linkedTableConfig, parentDataSource) => {
116
+ if (Array.isArray(linkedTableConfig)) {
117
+ return linkedTableConfig.map(
118
+ (config) => getLinkedConfig(config, parentDataSource)
119
+ );
120
+ } else {
121
+ return getLinkedConfig(linkedTableConfig, parentDataSource);
122
+ }
123
+ };
124
+ const { "1": level1, "2": level2, "3": level3 } = linkedDataSources;
125
+ const configLevel1 = getRootConfig(level1);
126
+ const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);
127
+ const dsLevel2 = Array.isArray(configLevel2) ? void 0 : configLevel2.dataSource;
128
+ const configLevel3 = level3 ? getLinkedConfigs(level3, dsLevel2) : void 0;
129
+ const results = {
130
+ "1": configLevel1,
131
+ "2": configLevel2,
132
+ "3": configLevel3
133
+ };
134
+ setTableConfig(results);
135
+ }, [VuuDataSource, getServerAPI, linkedDataSources]);
136
+ const handleTabChangeLevel1 = useCallback((tabIndex) => {
137
+ setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);
138
+ }, []);
139
+ const handleTabChangeLevel2 = useCallback((tabIndex) => {
140
+ setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);
141
+ }, []);
142
+ const handleTabChangeLevel3 = useCallback((tabIndex) => {
143
+ setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);
144
+ }, []);
145
+ const handleCollapseLevel2 = useCallback(() => {
146
+ setCollapsed(([, val]) => [true, val]);
147
+ }, []);
148
+ const handleExpandLevel2 = useCallback(() => {
149
+ setCollapsed(([, val]) => [false, val]);
150
+ }, []);
151
+ const handleCollapseLevel3 = useCallback(() => {
152
+ setCollapsed(([val]) => [val, true]);
153
+ }, []);
154
+ const handleExpandLevel3 = useCallback(() => {
155
+ setCollapsed(([val]) => [val, false]);
156
+ }, []);
157
+ return {
158
+ activeTabs,
159
+ level1: {
160
+ key: "level1",
161
+ onTabChange: handleTabChangeLevel1
162
+ },
163
+ level2: {
164
+ collapsed: collapsed[0],
165
+ key: "level2",
166
+ onCollapse: handleCollapseLevel2,
167
+ onExpand: handleExpandLevel2,
168
+ onTabChange: handleTabChangeLevel2
169
+ },
170
+ level3: {
171
+ collapsed: collapsed[1],
172
+ key: "level3",
173
+ onCollapse: handleCollapseLevel3,
174
+ onExpand: handleExpandLevel3,
175
+ onTabChange: handleTabChangeLevel3
176
+ },
177
+ tableConfig
178
+ };
179
+ };
180
+
181
+ export { useLinkedTableView };
182
+ //# sourceMappingURL=useLinkedTableView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLinkedTableView.js","sources":["../../src/linked-table-view/useLinkedTableView.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConstructorProps,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useDataSource } from \"@vuu-ui/vuu-utils\";\nimport {\n LinkedDataSources,\n LinkedTableConfig,\n LinkedTableViewProps,\n LinkTableConfig,\n} from \"./LinkedTableView\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { LinkDescriptorWithLabel, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\n\nexport type TableDataSourceConfig = {\n config: TableConfig;\n dataSource: DataSource;\n title: string;\n};\n\nexport type ResolvedTableConfig = {\n \"1\": TableDataSourceConfig;\n \"2\": TableDataSourceConfig | TableDataSourceConfig[];\n \"3\"?: TableDataSourceConfig | TableDataSourceConfig[];\n};\n\nexport type LinkedTableViewHookProps = Pick<\n LinkedTableViewProps,\n \"linkedDataSources\"\n>;\n\nconst getSchema = (schemas: TableSchema[], { module, table }: VuuTable) => {\n const schema = schemas.find(\n ({ table: t }) => t.module === module && t.table === table,\n );\n if (schema) {\n return schema;\n } else {\n throw Error(`No schema for table ${module} ${table}`);\n }\n};\n\nconst getTable = (ds: DataSource | DataSourceConstructorProps): VuuTable => {\n if (ds.table) {\n return ds.table;\n } else {\n throw Error(\"No datasource table specified\");\n }\n};\n\nconst getTables = (linkedDataSources: LinkedDataSources): VuuTable[] => {\n const { \"1\": linked1, \"2\": linked2, \"3\": linked3 } = linkedDataSources;\n\n const tables: VuuTable[] = [];\n\n tables.push(getTable(linked1.dataSource));\n\n if (Array.isArray(linked2)) {\n linked2.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else {\n tables.push(getTable(linked2.dataSource));\n }\n\n if (Array.isArray(linked3)) {\n linked3.forEach(({ dataSource }) => {\n tables.push(getTable(dataSource));\n });\n } else if (linked3) {\n tables.push(getTable(linked3.dataSource));\n }\n\n return tables;\n};\n\nexport const useLinkedTableView = ({\n linkedDataSources,\n}: LinkedTableViewHookProps) => {\n const { VuuDataSource, getServerAPI } = useDataSource();\n const [tableConfig, setTableConfig] = useState<\n ResolvedTableConfig | undefined\n >();\n // TBC\n const { id } = useViewContext();\n console.log({ id });\n const [activeTabs, setActiveTab] = useState<[number, number, number]>([\n 0, 0, 0,\n ]);\n const [collapsed, setCollapsed] = useState<[boolean, boolean]>([\n false,\n false,\n ]);\n\n useMemo(async () => {\n const tables = getTables(linkedDataSources);\n const serverAPI = await getServerAPI();\n const schemas = await Promise.all(tables.map(serverAPI.getTableSchema));\n\n const isDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): ds is DataSource => typeof ds === typeof VuuDataSource;\n\n const getDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource(ds);\n }\n };\n\n const createVisualLink = (\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ) => {\n if (parentDs && parentDs.table) {\n const parentVpId = parentDs.viewport;\n const toTable = vuuLink.toTable ?? parentDs.table?.table;\n\n return {\n link: {\n ...vuuLink,\n toTable,\n },\n parentClientVpId: parentVpId,\n parentVpId,\n } as LinkDescriptorWithLabel;\n } else {\n throw Error(\"visual link cannot be created without parent vp id\");\n }\n };\n\n const getLinkedDataSource = (\n ds: DataSourceConstructorProps | DataSource,\n vuuLink: LinkedTableConfig[\"vuuLink\"],\n parentDs?: DataSource,\n ): DataSource => {\n if (isDataSource(ds)) {\n return ds;\n } else {\n return new VuuDataSource({\n ...ds,\n visualLink: createVisualLink(vuuLink, parentDs),\n });\n }\n };\n\n const getTableConfig = (ds: DataSourceConstructorProps | DataSource) => {\n const schema = getSchema(schemas, getTable(ds));\n return {\n columns: schema.columns,\n };\n };\n\n const getRootConfig = ({\n dataSource: ds,\n title,\n }: LinkTableConfig): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getDataSource(ds),\n title,\n });\n\n const getLinkedConfig = (\n { dataSource: ds, vuuLink, title }: LinkedTableConfig,\n parentDataSource?: DataSource,\n ): TableDataSourceConfig => ({\n config: getTableConfig(ds),\n dataSource: getLinkedDataSource(ds, vuuLink, parentDataSource),\n title,\n });\n\n const getLinkedConfigs = (\n linkedTableConfig: LinkedTableConfig | LinkedTableConfig[],\n parentDataSource?: DataSource,\n ): TableDataSourceConfig | TableDataSourceConfig[] => {\n if (Array.isArray(linkedTableConfig)) {\n return linkedTableConfig.map((config) =>\n getLinkedConfig(config, parentDataSource),\n );\n } else {\n return getLinkedConfig(linkedTableConfig, parentDataSource);\n }\n };\n\n const { \"1\": level1, \"2\": level2, \"3\": level3 } = linkedDataSources;\n\n const configLevel1 = getRootConfig(level1);\n const configLevel2 = getLinkedConfigs(level2, configLevel1.dataSource);\n const dsLevel2 = Array.isArray(configLevel2)\n ? undefined\n : configLevel2.dataSource;\n const configLevel3 = level3\n ? getLinkedConfigs(level3, dsLevel2)\n : undefined;\n\n const results: ResolvedTableConfig = {\n \"1\": configLevel1,\n \"2\": configLevel2,\n \"3\": configLevel3,\n };\n setTableConfig(results);\n }, [VuuDataSource, getServerAPI, linkedDataSources]);\n\n const handleTabChangeLevel1 = useCallback((tabIndex: number) => {\n setActiveTab(([, v2, v3]) => [tabIndex, v2, v3]);\n }, []);\n const handleTabChangeLevel2 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, , v3]) => [v1, tabIndex, v3]);\n }, []);\n const handleTabChangeLevel3 = useCallback((tabIndex: number) => {\n setActiveTab(([v1, v2]) => [v1, v2, tabIndex]);\n }, []);\n\n const handleCollapseLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [true, val]);\n }, []);\n const handleExpandLevel2 = useCallback(() => {\n setCollapsed(([, val]) => [false, val]);\n }, []);\n const handleCollapseLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, true]);\n }, []);\n const handleExpandLevel3 = useCallback(() => {\n setCollapsed(([val]) => [val, false]);\n }, []);\n\n return {\n activeTabs,\n level1: {\n key: \"level1\",\n onTabChange: handleTabChangeLevel1,\n },\n level2: {\n collapsed: collapsed[0],\n key: \"level2\",\n onCollapse: handleCollapseLevel2,\n onExpand: handleExpandLevel2,\n onTabChange: handleTabChangeLevel2,\n },\n level3: {\n collapsed: collapsed[1],\n key: \"level3\",\n onCollapse: handleCollapseLevel3,\n onExpand: handleExpandLevel3,\n onTabChange: handleTabChangeLevel3,\n },\n tableConfig,\n };\n};\n\nexport type LevelsConfig = {\n level1: LevelConfig;\n level2: LevelConfig;\n level3: LevelConfig;\n};\n\nexport type LevelConfig = {\n key: string;\n collapsed?: boolean;\n onCollapse?: () => void;\n onTabChange?: (tabIndex: number) => void;\n onExpand?: () => void;\n};\n"],"names":[],"mappings":"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"}
@@ -1,20 +1,43 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { Table } from '@vuu-ui/vuu-table';
3
3
  import { TreeDataSource } from '@vuu-ui/vuu-data-local';
4
- import { useRef, useMemo, useEffect } from 'react';
4
+ import { useRef, useMemo } from 'react';
5
+ import { isRowSelected, metadataKeys } from '@vuu-ui/vuu-utils';
5
6
 
7
+ const { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;
8
+ const rowToTreeNodeObject = (row, columnMap) => {
9
+ const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;
10
+ const firstColIdx = columnMap.nodeData;
11
+ const labelColIdx = firstColIdx + depth;
12
+ return {
13
+ key,
14
+ index,
15
+ isGroupRow: !isLeaf,
16
+ isSelected: isRowSelected(row),
17
+ data: {
18
+ label: row[labelColIdx],
19
+ nodeData: row[firstColIdx]
20
+ }
21
+ };
22
+ };
6
23
  const TreeTable = ({
7
24
  config,
8
- source: sourceProp,
25
+ dataSource,
26
+ source,
9
27
  ...tableProps
10
28
  }) => {
11
- const sourceRef = useRef(sourceProp);
12
29
  const dataSourceRef = useRef();
13
30
  useMemo(() => {
14
- dataSourceRef.current = new TreeDataSource({
15
- data: sourceRef.current
16
- });
17
- }, []);
31
+ if (dataSource) {
32
+ dataSourceRef.current = dataSource;
33
+ } else if (source) {
34
+ dataSourceRef.current = new TreeDataSource({
35
+ data: source
36
+ });
37
+ } else {
38
+ throw Error(`TreeTable either source or dataSource must be provided`);
39
+ }
40
+ }, [dataSource, source]);
18
41
  const tableConfig = useMemo(() => {
19
42
  return {
20
43
  ...config,
@@ -23,11 +46,6 @@ const TreeTable = ({
23
46
  rowSeparators: false
24
47
  };
25
48
  }, [config]);
26
- useEffect(() => {
27
- if (dataSourceRef.current) {
28
- dataSourceRef.current.data = sourceProp;
29
- }
30
- }, [sourceProp]);
31
49
  if (dataSourceRef.current === void 0) {
32
50
  return null;
33
51
  }
@@ -35,10 +53,12 @@ const TreeTable = ({
35
53
  Table,
36
54
  {
37
55
  ...tableProps,
56
+ className: "vuuTreeTable",
38
57
  config: tableConfig,
39
58
  dataSource: dataSourceRef.current,
40
59
  groupToggleTarget: "toggle-icon",
41
60
  navigationStyle: "tree",
61
+ rowToObject: rowToTreeNodeObject,
42
62
  showColumnHeaderMenus: false,
43
63
  selectionModel: "single",
44
64
  selectionBookendWidth: 0
@@ -1 +1 @@
1
- {"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport { TreeSourceNode } from \"@vuu-ui/vuu-utils\";\n\nexport interface TreeTableProps\n extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n source: TreeSourceNode[];\n}\n\nexport const TreeTable = ({\n config,\n source: sourceProp,\n ...tableProps\n}: TreeTableProps) => {\n const sourceRef = useRef(sourceProp);\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n dataSourceRef.current = new TreeDataSource({\n data: sourceRef.current,\n });\n }, []);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n useEffect(() => {\n if (dataSourceRef.current) {\n dataSourceRef.current.data = sourceProp;\n }\n }, [sourceProp]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":[],"mappings":";;;;;AAgBO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,MAAQ,EAAA,UAAA;AAAA,EACR,GAAG,UAAA;AACL,CAAsB,KAAA;AACpB,EAAM,MAAA,SAAA,GAAY,OAAO,UAAU,CAAA,CAAA;AACnC,EAAA,MAAM,gBAAgB,MAAuB,EAAA,CAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,MACzC,MAAM,SAAU,CAAA,OAAA;AAAA,KACjB,CAAA,CAAA;AAAA,GACH,EAAG,EAAE,CAAA,CAAA;AAEL,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA,KAAA;AAAA,KACjB,CAAA;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,OAAS,EAAA;AACzB,MAAA,aAAA,CAAc,QAAQ,IAAO,GAAA,UAAA,CAAA;AAAA,KAC/B;AAAA,GACF,EAAG,CAAC,UAAU,CAAC,CAAA,CAAA;AAEf,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA,CAAA;AAAA,KAAA;AAAA,GACzB,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TreeTable.js","sources":["../../src/tree-table/TreeTable.tsx"],"sourcesContent":["import { TableProps } from \"@vuu-ui/vuu-table\";\nimport { Table } from \"@vuu-ui/vuu-table\";\nimport { TreeDataSource } from \"@vuu-ui/vuu-data-local\";\nimport { useMemo, useRef } from \"react\";\nimport { TableConfig } from \"@vuu-ui/vuu-table-types\";\nimport {\n isRowSelected,\n metadataKeys,\n type RowToObjectMapper,\n type TreeSourceNode,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { DEPTH, IS_LEAF, KEY, IDX } = metadataKeys;\n\ninterface Props extends Omit<TableProps, \"config\" | \"dataSource\"> {\n config?: Pick<\n TableConfig,\n \"columnSeparators\" | \"rowSeparators\" | \"zebraStripes\"\n >;\n dataSource?: TreeDataSource;\n source?: TreeSourceNode[];\n}\n\nexport type TreeTableProps = Props &\n ({ dataSource: TreeDataSource } | { source: TreeSourceNode[] });\n\nconst rowToTreeNodeObject: RowToObjectMapper = (row, columnMap) => {\n const { [IS_LEAF]: isLeaf, [KEY]: key, [IDX]: index, [DEPTH]: depth } = row;\n const firstColIdx = columnMap.nodeData;\n const labelColIdx = firstColIdx + depth;\n\n return {\n key,\n index,\n isGroupRow: !isLeaf,\n isSelected: isRowSelected(row),\n data: {\n label: row[labelColIdx],\n nodeData: row[firstColIdx],\n },\n };\n};\n\nexport const TreeTable = ({\n config,\n dataSource,\n source,\n ...tableProps\n}: TreeTableProps) => {\n const dataSourceRef = useRef<TreeDataSource>();\n useMemo(() => {\n if (dataSource) {\n dataSourceRef.current = dataSource;\n } else if (source) {\n dataSourceRef.current = new TreeDataSource({\n data: source,\n });\n } else {\n throw Error(`TreeTable either source or dataSource must be provided`);\n }\n }, [dataSource, source]);\n\n const tableConfig = useMemo<TableConfig>(() => {\n return {\n ...config,\n columns: dataSourceRef.current?.columnDescriptors ?? [],\n columnSeparators: false,\n rowSeparators: false,\n };\n }, [config]);\n\n if (dataSourceRef.current === undefined) {\n return null;\n }\n\n return (\n <Table\n {...tableProps}\n className=\"vuuTreeTable\"\n config={tableConfig}\n dataSource={dataSourceRef.current}\n groupToggleTarget=\"toggle-icon\"\n navigationStyle=\"tree\"\n rowToObject={rowToTreeNodeObject}\n showColumnHeaderMenus={false}\n selectionModel=\"single\"\n selectionBookendWidth={0}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,GAAA,EAAK,KAAQ,GAAA,YAAA;AAcrC,MAAM,mBAAA,GAAyC,CAAC,GAAA,EAAK,SAAc,KAAA;AACjE,EAAA,MAAM,EAAE,CAAC,OAAO,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,GAAK,EAAA,CAAC,GAAG,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,OAAU,GAAA,GAAA;AACxE,EAAA,MAAM,cAAc,SAAU,CAAA,QAAA;AAC9B,EAAA,MAAM,cAAc,WAAc,GAAA,KAAA;AAElC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAY,CAAC,MAAA;AAAA,IACb,UAAA,EAAY,cAAc,GAAG,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,MACtB,QAAA,EAAU,IAAI,WAAW;AAAA;AAC3B,GACF;AACF,CAAA;AAEO,MAAM,YAAY,CAAC;AAAA,EACxB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,gBAAgB,MAAuB,EAAA;AAC7C,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,OAAU,GAAA,UAAA;AAAA,eACf,MAAQ,EAAA;AACjB,MAAc,aAAA,CAAA,OAAA,GAAU,IAAI,cAAe,CAAA;AAAA,QACzC,IAAM,EAAA;AAAA,OACP,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,GACC,EAAA,CAAC,UAAY,EAAA,MAAM,CAAC,CAAA;AAEvB,EAAM,MAAA,WAAA,GAAc,QAAqB,MAAM;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,aAAA,CAAc,OAAS,EAAA,iBAAA,IAAqB,EAAC;AAAA,MACtD,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA;AAAA,KACjB;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAI,IAAA,aAAA,CAAc,YAAY,KAAW,CAAA,EAAA;AACvC,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAU,EAAA,cAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,YAAY,aAAc,CAAA,OAAA;AAAA,MAC1B,iBAAkB,EAAA,aAAA;AAAA,MAClB,eAAgB,EAAA,MAAA;AAAA,MAChB,WAAa,EAAA,mBAAA;AAAA,MACb,qBAAuB,EAAA,KAAA;AAAA,MACvB,cAAe,EAAA,QAAA;AAAA,MACf,qBAAuB,EAAA;AAAA;AAAA,GACzB;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
- "version": "0.9.2",
2
+ "version": "0.9.3",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "dependencies": {
6
6
  "@salt-ds/styles": "0.2.1",
7
7
  "@salt-ds/window": "0.1.1",
8
- "@vuu-ui/vuu-data-local": "0.9.2",
9
- "@vuu-ui/vuu-table-types": "0.9.2",
10
- "@vuu-ui/vuu-filters": "0.9.2",
11
- "@vuu-ui/vuu-layout": "0.9.2",
12
- "@vuu-ui/vuu-popups": "0.9.2",
13
- "@vuu-ui/vuu-shell": "0.9.2",
14
- "@vuu-ui/vuu-table": "0.9.2",
15
- "@vuu-ui/vuu-table-extras": "0.9.2",
16
- "@vuu-ui/vuu-ui-controls": "0.9.2",
17
- "@vuu-ui/vuu-utils": "0.9.2"
8
+ "@vuu-ui/vuu-data-local": "0.9.3",
9
+ "@vuu-ui/vuu-table-types": "0.9.3",
10
+ "@vuu-ui/vuu-filters": "0.9.3",
11
+ "@vuu-ui/vuu-layout": "0.9.3",
12
+ "@vuu-ui/vuu-popups": "0.9.3",
13
+ "@vuu-ui/vuu-shell": "0.9.3",
14
+ "@vuu-ui/vuu-table": "0.9.3",
15
+ "@vuu-ui/vuu-table-extras": "0.9.3",
16
+ "@vuu-ui/vuu-ui-controls": "0.9.3",
17
+ "@vuu-ui/vuu-utils": "0.9.3"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "clsx": "^2.0.0",
@@ -5,4 +5,4 @@ export interface FilterTableProps extends HTMLAttributes<HTMLDivElement> {
5
5
  FilterBarProps?: Partial<FilterBarProps>;
6
6
  TableProps: Omit<TableProps, "height" | "width">;
7
7
  }
8
- export declare const FilterTable: ({ FilterBarProps, TableProps, style: styleProps, ...htmlAttributes }: FilterTableProps) => JSX.Element;
8
+ export declare const FilterTable: ({ FilterBarProps, TableProps, style: styleProps, ...htmlAttributes }: FilterTableProps) => import("react/jsx-runtime").JSX.Element;
package/types/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./filter-table";
2
2
  export * from "./json-table";
3
3
  export * from "./tree-table";
4
+ export * from "./linked-table-view/LinkedTableView";
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
1
  import { TableCellProps } from "@vuu-ui/vuu-table-types";
3
- export declare const JsonCell: ({ column, columnMap, row }: TableCellProps) => JSX.Element;
2
+ export declare const JsonCell: ({ column, columnMap, row }: TableCellProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { TableProps } from "@vuu-ui/vuu-table";
3
2
  import { JsonData } from "@vuu-ui/vuu-utils";
4
3
  import { TableConfig } from "@vuu-ui/vuu-table-types";
@@ -6,4 +5,4 @@ export interface JsonTableProps extends Omit<TableProps, "config" | "dataSource"
6
5
  config?: Pick<TableConfig, "columnSeparators" | "rowSeparators" | "zebraStripes">;
7
6
  source: JsonData;
8
7
  }
9
- export declare const JsonTable: ({ config, source: sourceProp, ...tableProps }: JsonTableProps) => JSX.Element | null;
8
+ export declare const JsonTable: ({ config, source: sourceProp, ...tableProps }: JsonTableProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,38 @@
1
+ import { DataSource, DataSourceConstructorProps } from "@vuu-ui/vuu-data-types";
2
+ import { VuuLink } from "@vuu-ui/vuu-protocol-types";
3
+ import { TableConfig } from "@vuu-ui/vuu-table-types";
4
+ import { HTMLAttributes } from "react";
5
+ export interface LinkTableConfig {
6
+ config?: TableConfig;
7
+ dataSource: DataSourceConstructorProps | DataSource;
8
+ title: string;
9
+ }
10
+ export interface LinkedTableConfig extends LinkTableConfig {
11
+ /**
12
+ * toTable will default to the table above in hierarchy. If there are multiple
13
+ * tables in level above, toTable should be specified.
14
+ */
15
+ vuuLink: Pick<VuuLink, "fromColumn" | "toColumn"> & {
16
+ toTable?: string;
17
+ };
18
+ }
19
+ /**
20
+ * Currently supports max of three levels of hierarchical data
21
+ * 1 = parent (required)
22
+ * 2 = child (required)
23
+ * 3 = grandchild (optional)
24
+ */
25
+ export type LinkedDataSources = {
26
+ "1": LinkTableConfig;
27
+ "2": LinkedTableConfig | LinkedTableConfig[];
28
+ "3"?: LinkedTableConfig | LinkedTableConfig[];
29
+ };
30
+ /**
31
+ * Displays a vertical 'tower' of Tables with a hierarchical relationship.
32
+ * Selection of row(s) on tables higher in the hierarchy drives the population
33
+ * of data in tables below. (could be two-way ?)
34
+ */
35
+ export interface LinkedTableViewProps extends HTMLAttributes<HTMLDivElement> {
36
+ linkedDataSources: LinkedDataSources;
37
+ }
38
+ export declare const LinkedTableView: ({ className, linkedDataSources, ...htmlAttributes }: LinkedTableViewProps) => import("react/jsx-runtime").JSX.Element;