@vuu-ui/vuu-data-react 0.8.24-debug → 0.8.25-debug

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.
package/cjs/index.js CHANGED
@@ -184,6 +184,10 @@ var import_vuu_shell = require("@vuu-ui/vuu-shell");
184
184
  var import_vuu_utils2 = require("@vuu-ui/vuu-utils");
185
185
  var import_react2 = require("react");
186
186
  var NO_VALUES = [];
187
+ var toListOption = (value) => ({
188
+ label: value,
189
+ value
190
+ });
187
191
  var lookupValueMap = /* @__PURE__ */ new Map();
188
192
  var loadLookupValues = ({
189
193
  labelColumn,
@@ -242,19 +246,29 @@ var getLookupDetails = ({ name, type }) => {
242
246
  }
243
247
  };
244
248
  var useLookupValues = (column, initialValueProp) => {
245
- const lookupDetails = getLookupDetails(column);
249
+ const { type: columnType } = column;
246
250
  const { getLookupValues } = (0, import_vuu_shell.useShellContext)();
247
251
  const initialState = (0, import_react2.useMemo)(() => {
248
252
  var _a;
249
- const values2 = (_a = getLookupValues == null ? void 0 : getLookupValues(lookupDetails.table)) != null ? _a : NO_VALUES;
250
- return {
251
- initialValue: getSelectedOption(values2, initialValueProp),
252
- values: values2
253
- };
254
- }, [getLookupValues, initialValueProp, lookupDetails.table]);
253
+ if ((0, import_vuu_utils2.isTypeDescriptor)(columnType) && (0, import_vuu_utils2.isValueListRenderer)(columnType == null ? void 0 : columnType.renderer)) {
254
+ const values2 = columnType.renderer.values.map(toListOption);
255
+ return {
256
+ initialValue: getSelectedOption(values2, initialValueProp),
257
+ values: values2
258
+ };
259
+ } else {
260
+ const lookupDetails = getLookupDetails(column);
261
+ const values2 = (_a = getLookupValues == null ? void 0 : getLookupValues(lookupDetails.table)) != null ? _a : NO_VALUES;
262
+ return {
263
+ initialValue: getSelectedOption(values2, initialValueProp),
264
+ values: values2
265
+ };
266
+ }
267
+ }, [column, columnType, getLookupValues, initialValueProp]);
255
268
  const [{ initialValue, values }, setLookupState] = (0, import_react2.useState)(initialState);
256
269
  (0, import_react2.useMemo)(() => {
257
270
  if (values === NO_VALUES) {
271
+ const lookupDetails = getLookupDetails(column);
258
272
  loadLookupValues(lookupDetails).then(
259
273
  (values2) => setLookupState({
260
274
  initialValue: getSelectedOption(values2, initialValueProp),
@@ -262,7 +276,7 @@ var useLookupValues = (column, initialValueProp) => {
262
276
  })
263
277
  );
264
278
  }
265
- }, [values, lookupDetails, initialValueProp]);
279
+ }, [values, column, initialValueProp]);
266
280
  return {
267
281
  initialValue,
268
282
  values
package/cjs/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-data-react/src/index.ts", "../../../packages/vuu-data-react/src/hooks/useDataSource.ts", "../../../packages/vuu-data-react/src/hooks/useLookupValues.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionStatus.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionQuality.ts", "../../../packages/vuu-data-react/src/hooks/useTypeaheadSuggestions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuMenuActions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuTables.ts"],
4
- "sourcesContent": ["export * from \"./hooks\";\n", "// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport type {\n DataSource,\n DataSourceRow,\n SubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { useShellContext } from \"@vuu-ui/vuu-shell\";\nimport {\n buildColumnMap,\n isLookupRenderer,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: { from: 0, to: 100 },\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n }\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nexport const getSelectedOption = (\n values: ListOption[],\n selectedValue: string | number | undefined\n) => {\n if (selectedValue === undefined) {\n return null;\n }\n return values.find((option) => option.value === selectedValue) ?? null;\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string\n) => {\n const lookupDetails = getLookupDetails(column);\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n }, [getLookupValues, initialValueProp, lookupDetails.table]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n })\n );\n }\n }, [values, lookupDetails, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\nimport { ConnectionStatusMessage } from \"@vuu-ui/vuu-data-types\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: TableSchemaTable,\n column: string,\n text = \"\",\n selectedValues: string[] = []\n): TypeaheadParams => {\n if (text !== \"\" && !selectedValues.includes(text.toLowerCase())) {\n return [table, column, text];\n }\n return [table, column];\n};\n\nexport const useTypeaheadSuggestions = () =>\n useCallback<SuggestionFetcher>(async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n", "import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceRow,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n MenuRpcResponse,\n ViewportRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport type { MenuActionClosePopup } from \"@vuu-ui/vuu-popups\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder;\n handleMenuAction: MenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport type RpcResponseHandler = (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | ViewportRpcResponse\n) => void;\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: RpcResponseHandler;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nconst isTableLocation = (location: string): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder = useCallback(\n (location, options) => {\n const { links, menu } = dataSource;\n const { visualLink } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (location === \"grid\" && links && !visualLink) {\n links.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (menu && isTableLocation(location)) {\n const menuDescriptor = buildMenuDescriptor(\n menu,\n location,\n options as VuuServerMenuOptions\n );\n if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [dataSource, menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n ({ menuId, options }: MenuActionClosePopup) => {\n if (clientSideMenuActionHandler?.(menuId, options)) {\n return true;\n } else if (menuId === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as unknown as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${menuId}`\n );\n }\n\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { getServerAPI } from \"@vuu-ui/vuu-data-remote\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n console.log(\"GET TABLE LIST\");\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((vuuTable) => server.getTableSchema(vuuTable))\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n\nexport const getVuuTableSchema = (table: VuuTable) =>\n getServerAPI().then((server) => server.getTableSchema(table));\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from \"./hooks\";\n", "// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport type {\n DataSource,\n DataSourceRow,\n SubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { useShellContext } from \"@vuu-ui/vuu-shell\";\nimport {\n buildColumnMap,\n isLookupRenderer,\n isTypeDescriptor,\n isValueListRenderer,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst toListOption = (value: string): ListOption => ({\n label: value,\n value,\n});\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: { from: 0, to: 100 },\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n }\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nexport const getSelectedOption = (\n values: ListOption[],\n selectedValue: string | number | undefined\n) => {\n if (selectedValue === undefined) {\n return null;\n }\n return values.find((option) => option.value === selectedValue) ?? null;\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string\n) => {\n const { type: columnType } = column;\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n if (\n isTypeDescriptor(columnType) &&\n isValueListRenderer(columnType?.renderer)\n ) {\n const values = columnType.renderer.values.map(toListOption);\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n } else {\n const lookupDetails = getLookupDetails(column);\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n }\n }, [column, columnType, getLookupValues, initialValueProp]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n const lookupDetails = getLookupDetails(column);\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n })\n );\n }\n }, [values, column, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\nimport { ConnectionStatusMessage } from \"@vuu-ui/vuu-data-types\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: TableSchemaTable,\n column: string,\n text = \"\",\n selectedValues: string[] = []\n): TypeaheadParams => {\n if (text !== \"\" && !selectedValues.includes(text.toLowerCase())) {\n return [table, column, text];\n }\n return [table, column];\n};\n\nexport const useTypeaheadSuggestions = () =>\n useCallback<SuggestionFetcher>(async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n", "import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceRow,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n MenuRpcResponse,\n ViewportRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport type { MenuActionClosePopup } from \"@vuu-ui/vuu-popups\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder;\n handleMenuAction: MenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport type RpcResponseHandler = (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | ViewportRpcResponse\n) => void;\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: RpcResponseHandler;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nconst isTableLocation = (location: string): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder = useCallback(\n (location, options) => {\n const { links, menu } = dataSource;\n const { visualLink } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (location === \"grid\" && links && !visualLink) {\n links.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (menu && isTableLocation(location)) {\n const menuDescriptor = buildMenuDescriptor(\n menu,\n location,\n options as VuuServerMenuOptions\n );\n if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [dataSource, menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n ({ menuId, options }: MenuActionClosePopup) => {\n if (clientSideMenuActionHandler?.(menuId, options)) {\n return true;\n } else if (menuId === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as unknown as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${menuId}`\n );\n }\n\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { getServerAPI } from \"@vuu-ui/vuu-data-remote\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n console.log(\"GET TABLE LIST\");\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((vuuTable) => server.getTableSchema(vuuTable))\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n\nexport const getVuuTableSchema = (table: VuuTable) =>\n getServerAPI().then((server) => server.getTableSchema(table));\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_vuu_utils", "import_react", "values", "import_react", "import_vuu_data_remote", "import_react", "import_vuu_data_remote", "import_vuu_data_remote", "import_react", "import_vuu_utils", "import_react", "import_vuu_data_remote", "import_react", "tables"]
7
7
  }
package/esm/index.js CHANGED
@@ -147,10 +147,15 @@ import { useShellContext } from "@vuu-ui/vuu-shell";
147
147
  import {
148
148
  buildColumnMap,
149
149
  isLookupRenderer,
150
- isTypeDescriptor
150
+ isTypeDescriptor,
151
+ isValueListRenderer
151
152
  } from "@vuu-ui/vuu-utils";
152
153
  import { useMemo as useMemo2, useState as useState2 } from "react";
153
154
  var NO_VALUES = [];
155
+ var toListOption = (value) => ({
156
+ label: value,
157
+ value
158
+ });
154
159
  var lookupValueMap = /* @__PURE__ */ new Map();
155
160
  var loadLookupValues = ({
156
161
  labelColumn,
@@ -209,19 +214,29 @@ var getLookupDetails = ({ name, type }) => {
209
214
  }
210
215
  };
211
216
  var useLookupValues = (column, initialValueProp) => {
212
- const lookupDetails = getLookupDetails(column);
217
+ const { type: columnType } = column;
213
218
  const { getLookupValues } = useShellContext();
214
219
  const initialState = useMemo2(() => {
215
220
  var _a;
216
- const values2 = (_a = getLookupValues == null ? void 0 : getLookupValues(lookupDetails.table)) != null ? _a : NO_VALUES;
217
- return {
218
- initialValue: getSelectedOption(values2, initialValueProp),
219
- values: values2
220
- };
221
- }, [getLookupValues, initialValueProp, lookupDetails.table]);
221
+ if (isTypeDescriptor(columnType) && isValueListRenderer(columnType == null ? void 0 : columnType.renderer)) {
222
+ const values2 = columnType.renderer.values.map(toListOption);
223
+ return {
224
+ initialValue: getSelectedOption(values2, initialValueProp),
225
+ values: values2
226
+ };
227
+ } else {
228
+ const lookupDetails = getLookupDetails(column);
229
+ const values2 = (_a = getLookupValues == null ? void 0 : getLookupValues(lookupDetails.table)) != null ? _a : NO_VALUES;
230
+ return {
231
+ initialValue: getSelectedOption(values2, initialValueProp),
232
+ values: values2
233
+ };
234
+ }
235
+ }, [column, columnType, getLookupValues, initialValueProp]);
222
236
  const [{ initialValue, values }, setLookupState] = useState2(initialState);
223
237
  useMemo2(() => {
224
238
  if (values === NO_VALUES) {
239
+ const lookupDetails = getLookupDetails(column);
225
240
  loadLookupValues(lookupDetails).then(
226
241
  (values2) => setLookupState({
227
242
  initialValue: getSelectedOption(values2, initialValueProp),
@@ -229,7 +244,7 @@ var useLookupValues = (column, initialValueProp) => {
229
244
  })
230
245
  );
231
246
  }
232
- }, [values, lookupDetails, initialValueProp]);
247
+ }, [values, column, initialValueProp]);
233
248
  return {
234
249
  initialValue,
235
250
  values
package/esm/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/vuu-data-react/src/hooks/useDataSource.ts", "../../../packages/vuu-data-react/src/hooks/useLookupValues.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionStatus.ts", "../../../packages/vuu-data-react/src/hooks/useServerConnectionQuality.ts", "../../../packages/vuu-data-react/src/hooks/useTypeaheadSuggestions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuMenuActions.ts", "../../../packages/vuu-data-react/src/hooks/useVuuTables.ts"],
4
- "sourcesContent": ["// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport type {\n DataSource,\n DataSourceRow,\n SubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { useShellContext } from \"@vuu-ui/vuu-shell\";\nimport {\n buildColumnMap,\n isLookupRenderer,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: { from: 0, to: 100 },\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n }\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nexport const getSelectedOption = (\n values: ListOption[],\n selectedValue: string | number | undefined\n) => {\n if (selectedValue === undefined) {\n return null;\n }\n return values.find((option) => option.value === selectedValue) ?? null;\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string\n) => {\n const lookupDetails = getLookupDetails(column);\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n }, [getLookupValues, initialValueProp, lookupDetails.table]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n })\n );\n }\n }, [values, lookupDetails, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\nimport { ConnectionStatusMessage } from \"@vuu-ui/vuu-data-types\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: TableSchemaTable,\n column: string,\n text = \"\",\n selectedValues: string[] = []\n): TypeaheadParams => {\n if (text !== \"\" && !selectedValues.includes(text.toLowerCase())) {\n return [table, column, text];\n }\n return [table, column];\n};\n\nexport const useTypeaheadSuggestions = () =>\n useCallback<SuggestionFetcher>(async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n", "import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceRow,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n MenuRpcResponse,\n ViewportRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport type { MenuActionClosePopup } from \"@vuu-ui/vuu-popups\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder;\n handleMenuAction: MenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport type RpcResponseHandler = (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | ViewportRpcResponse\n) => void;\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: RpcResponseHandler;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nconst isTableLocation = (location: string): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder = useCallback(\n (location, options) => {\n const { links, menu } = dataSource;\n const { visualLink } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (location === \"grid\" && links && !visualLink) {\n links.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (menu && isTableLocation(location)) {\n const menuDescriptor = buildMenuDescriptor(\n menu,\n location,\n options as VuuServerMenuOptions\n );\n if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [dataSource, menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n ({ menuId, options }: MenuActionClosePopup) => {\n if (clientSideMenuActionHandler?.(menuId, options)) {\n return true;\n } else if (menuId === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as unknown as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${menuId}`\n );\n }\n\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { getServerAPI } from \"@vuu-ui/vuu-data-remote\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n console.log(\"GET TABLE LIST\");\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((vuuTable) => server.getTableSchema(vuuTable))\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n\nexport const getVuuTableSchema = (table: VuuTable) =>\n getServerAPI().then((server) => server.getTableSchema(table));\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// TODO is this hook needed ? it is currently used only in a vuu salt story\nimport type {\n DataSource,\n DataSourceRow,\n SubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { getFullRange, metadataKeys, WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst { SELECTED } = metadataKeys;\n\nexport interface DataSourceHookProps {\n dataSource: DataSource;\n renderBufferSize?: number;\n}\n\nexport function useDataSource({\n dataSource,\n renderBufferSize = 10,\n}: DataSourceHookProps): [\n DataSourceRow[],\n number,\n VuuRange,\n (range: VuuRange) => void\n] {\n const [, forceUpdate] = useState<object | null>(null);\n const isMounted = useRef(true);\n const hasUpdated = useRef(false);\n const rafHandle = useRef(null);\n const data = useRef<DataSourceRow[]>([]);\n const rangeRef = useRef({ from: 0, to: 10 });\n\n const dataWindow = useMemo(\n () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),\n [renderBufferSize]\n );\n\n const setData = useCallback(\n (updates: DataSourceRow[]) => {\n for (const row of updates) {\n dataWindow.add(row);\n }\n // Why bother with the slice ?\n data.current = dataWindow.data.slice();\n\n hasUpdated.current = true;\n },\n [dataWindow]\n );\n\n const datasourceMessageHandler: SubscribeCallback = useCallback(\n (message) => {\n if (message.type === \"viewport-update\") {\n if (message.size !== undefined) {\n dataWindow.setRowCount(message.size);\n }\n if (message.rows) {\n setData(message.rows);\n forceUpdate({});\n } else if (message.size !== undefined) {\n // TODO is this right ?\n data.current = dataWindow.data.slice();\n hasUpdated.current = true;\n }\n }\n },\n [dataWindow, setData]\n );\n\n useEffect(\n () => () => {\n if (rafHandle.current) {\n cancelAnimationFrame(rafHandle.current);\n rafHandle.current = null;\n }\n isMounted.current = false;\n },\n []\n );\n\n const setRange = useCallback(\n (range) => {\n rangeRef.current = range;\n const fullRange = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n },\n [dataSource, dataWindow, renderBufferSize]\n );\n\n useMemo(() => {\n const { from, to } = rangeRef.current;\n const fullRange = getFullRange({ from, to }, renderBufferSize);\n dataSource.range = fullRange;\n dataWindow.setRange(fullRange.from, fullRange.to);\n }, [dataSource, dataWindow, renderBufferSize]);\n\n useEffect(() => {\n const { from, to } = getFullRange(rangeRef.current, renderBufferSize);\n dataSource.subscribe(\n {\n range: { from, to },\n },\n datasourceMessageHandler\n );\n }, [dataSource, datasourceMessageHandler, renderBufferSize]);\n\n useEffect(\n () => () => {\n dataSource.unsubscribe();\n },\n [dataSource]\n );\n\n return [\n data.current,\n dataWindow.rowCount,\n getFullRange(rangeRef.current, renderBufferSize),\n setRange,\n ];\n}\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n this.data = new Array(to - from);\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n if (this.data[internalIndex - 1]) {\n // assign 'post-selected' selection state\n if (\n this.data[internalIndex - 1][SELECTED] === 1 &&\n data[SELECTED] === 0\n ) {\n data[SELECTED] = 2;\n }\n }\n if (index === this.rowCount - 1) {\n this.data.length = internalIndex + 1;\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange(from: number, to: number) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n}\n", "import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { useShellContext } from \"@vuu-ui/vuu-shell\";\nimport {\n buildColumnMap,\n isLookupRenderer,\n isTypeDescriptor,\n isValueListRenderer,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst toListOption = (value: string): ListOption => ({\n label: value,\n value,\n});\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: { from: 0, to: 100 },\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n }\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nexport const getSelectedOption = (\n values: ListOption[],\n selectedValue: string | number | undefined\n) => {\n if (selectedValue === undefined) {\n return null;\n }\n return values.find((option) => option.value === selectedValue) ?? null;\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string\n) => {\n const { type: columnType } = column;\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n if (\n isTypeDescriptor(columnType) &&\n isValueListRenderer(columnType?.renderer)\n ) {\n const values = columnType.renderer.values.map(toListOption);\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n } else {\n const lookupDetails = getLookupDetails(column);\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n\n return {\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n };\n }\n }, [column, columnType, getLookupValues, initialValueProp]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n const lookupDetails = getLookupDetails(column);\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp),\n values,\n })\n );\n }\n }, [values, column, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\nimport { ConnectionStatusMessage } from \"@vuu-ui/vuu-data-types\";\n\nexport const useServerConnectionStatus = () => {\n const [connectionStatus, setConnectionStatus] = useState(\"disconnected\");\n\n const handleStatusChange = useCallback(\n ({ status }: ConnectionStatusMessage) => {\n setConnectionStatus(status);\n },\n []\n );\n\n useEffect(() => {\n ConnectionManager.on(\"connection-status\", handleStatusChange);\n return () => {\n ConnectionManager.removeListener(\"connection-status\", handleStatusChange);\n };\n }, [handleStatusChange]);\n\n return connectionStatus;\n};\n", "import { useCallback, useEffect, useState } from \"react\";\nimport { ConnectionManager } from \"@vuu-ui/vuu-data-remote\";\n\nexport const useServerConnectionQuality = () => {\n const [messagesPerSecond, setMessagesPerSecond] = useState<number>(0);\n const handleConnectivityMessage = useCallback(({ messages }) => {\n setMessagesPerSecond(messages.messagesLength);\n }, []);\n\n useEffect(() => {\n ConnectionManager.on(\"connection-metrics\", handleConnectivityMessage);\n return () => {\n ConnectionManager.removeListener(\n \"connection-metrics\",\n handleConnectivityMessage\n );\n };\n }, [handleConnectivityMessage]);\n\n return messagesPerSecond;\n};\n", "import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerGetUniqueValues,\n ClientToServerGetUniqueValuesStartingWith,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\n\n// const SPECIAL_SPACE = \"_\";\nconst TYPEAHEAD_MESSAGE_CONSTANTS = {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n};\n\nexport const getTypeaheadParams = (\n table: TableSchemaTable,\n column: string,\n text = \"\",\n selectedValues: string[] = []\n): TypeaheadParams => {\n if (text !== \"\" && !selectedValues.includes(text.toLowerCase())) {\n return [table, column, text];\n }\n return [table, column];\n};\n\nexport const useTypeaheadSuggestions = () =>\n useCallback<SuggestionFetcher>(async (params: TypeaheadParams) => {\n const rpcMessage =\n params.length === 2\n ? ({\n method: \"getUniqueFieldValues\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValues)\n : ({\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n ...TYPEAHEAD_MESSAGE_CONSTANTS,\n } as ClientToServerGetUniqueValuesStartingWith);\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n", "import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceRow,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n MenuRpcResponse,\n ViewportRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport type { MenuActionClosePopup } from \"@vuu-ui/vuu-popups\";\nimport {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ColumnMap,\n getRowRecord,\n isGroupMenuItemDescriptor,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\n\nexport const addRowsFromInstruments = \"addRowsFromInstruments\";\n\nexport interface VuuCellMenuItem extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowMenuItem extends VuuMenuItem {\n rowKey: string;\n row: { [key: string]: VuuRowDataItemType };\n}\n\nconst { KEY } = metadataKeys;\n\nconst NO_CONFIG: MenuActionConfig = {};\n\nconst isMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (options: VuuMenuItem): options is VuuCellMenuItem =>\n options.context === \"cell\";\nconst isRowMenu = (options: VuuMenuItem): options is VuuRowMenuItem =>\n options.context === \"row\";\nconst isSelectionMenu = (options: VuuMenuItem): options is VuuMenuItem =>\n options.context === \"selected-rows\";\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: \"grid\" | \"header\" | \"filter\",\n vuuContext: VuuMenuContext,\n selectedRowCount = 0\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst getMenuRpcRequest = (\n options: VuuMenuItem\n): Omit<ClientToServerMenuRPC, \"vpId\"> => {\n const { rpcName } = options;\n if (isCellMenu(options)) {\n return {\n field: options.field,\n rowKey: options.rowKey,\n rpcName,\n value: options.value,\n type: \"VIEW_PORT_MENU_CELL_RPC\",\n } as Omit<ClientToServerMenuCellRPC, \"vpId\">;\n } else if (isRowMenu(options)) {\n return {\n rowKey: options.rowKey,\n row: options.row,\n rpcName,\n type: \"VIEW_PORT_MENU_ROW_RPC\",\n } as Omit<ClientToServerMenuRowRPC, \"vpId\">;\n } else if (isSelectionMenu(options)) {\n return {\n rpcName,\n type: \"VIEW_PORT_MENUS_SELECT_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<ClientToServerMenuRPC, \"vpId\">;\n }\n};\n\nexport type VuuMenuActionHandler = (type: string, options: unknown) => boolean;\n\nexport interface ViewServerHookResult {\n buildViewserverMenuOptions: MenuBuilder;\n handleMenuAction: MenuActionHandler;\n}\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport type RpcResponseHandler = (\n response:\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | ViewportRpcResponse\n) => void;\n\nexport interface VuuMenuActionHookProps {\n /**\n * By default, vuuMenuActions will be handled automatically. When activated, a\n * message will be sent to server and response will be handled here too.\n * This prop allows client to provide a custom handler for a menu Item. This will\n * take priority and if handler returns true, no further processing for the menu\n * item will be handled by Vuu. This can also be used to prevent an item from being\n * actioned, even when no custom handling is intended. If the handler returns false,\n * Vuu will process the menuItem.\n */\n clientSideMenuActionHandler?: VuuMenuActionHandler;\n dataSource: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: RpcResponseHandler;\n}\n\ntype TableMenuLocation = \"grid\" | \"header\" | \"filter\";\n\nconst isTableLocation = (location: string): location is TableMenuLocation =>\n [\"grid\", \"header\", \"filter\"].includes(location);\n\nexport type VuuServerMenuOptions = {\n columnMap: ColumnMap;\n columnName: string;\n row: DataSourceRow;\n selectedRows: DataSourceRow[];\n viewport: string;\n};\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: VuuServerMenuOptions\n): VuuMenuItem => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.columnName,\n rowKey: options.row[KEY],\n value: options.row[options.columnMap[options.columnName]],\n } as VuuCellMenuItem;\n case \"row\":\n return {\n ...menu,\n row: getRowRecord(options.row, options.columnMap),\n rowKey: options.row[KEY],\n } as VuuRowMenuItem;\n default:\n return menu;\n }\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): boolean => {\n if (isGroupMenuItem(menuItem)) {\n return menuItem.menus.some((childMenu) =>\n menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)\n );\n }\n if (\n !vuuContextCompatibleWithTableLocation(\n tableLocation,\n menuItem.context,\n options.selectedRows?.length\n )\n ) {\n return false;\n }\n\n if (tableLocation === \"grid\" && hasFilter(menuItem)) {\n return gridRowMeetsFilterCriteria(\n menuItem.context,\n options.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.columnName;\n }\n\n return true;\n};\n\nconst buildMenuDescriptor = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: VuuServerMenuOptions\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isMenuItem(menu)) {\n return {\n label: menu.name,\n action: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptor(childMenu, tableLocation, options)\n )\n .filter(\n (childMenu) => childMenu !== undefined\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n menuActionConfig = NO_CONFIG,\n onRpcResponse,\n}: VuuMenuActionHookProps): ViewServerHookResult => {\n const buildViewserverMenuOptions: MenuBuilder = useCallback(\n (location, options) => {\n const { links, menu } = dataSource;\n const { visualLink } = menuActionConfig;\n const descriptors: ContextMenuItemDescriptor[] = [];\n\n if (location === \"grid\" && links && !visualLink) {\n links.forEach((linkDescriptor: LinkDescriptorWithLabel) => {\n const { link, label: linkLabel } = linkDescriptor;\n const label = linkLabel ? linkLabel : link.toTable;\n descriptors.push({\n label: `Link to ${label}`,\n action: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (menu && isTableLocation(location)) {\n const menuDescriptor = buildMenuDescriptor(\n menu,\n location,\n options as VuuServerMenuOptions\n );\n if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n\n return descriptors;\n },\n [dataSource, menuActionConfig]\n );\n\n const handleMenuAction = useCallback(\n ({ menuId, options }: MenuActionClosePopup) => {\n if (clientSideMenuActionHandler?.(menuId, options)) {\n return true;\n } else if (menuId === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as unknown as VuuMenuItem);\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (onRpcResponse && rpcResponse) {\n onRpcResponse && onRpcResponse(rpcResponse);\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\n // return dataSource.createLink(options as LinkDescriptorWithLabel), true;\n return (\n (dataSource.visualLink = options as LinkDescriptorWithLabel), true\n );\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${menuId}`\n );\n }\n\n return false;\n },\n [clientSideMenuActionHandler, dataSource, onRpcResponse]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n", "import { getServerAPI } from \"@vuu-ui/vuu-data-remote\";\nimport { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport const useVuuTables = () => {\n const [tables, setTables] = useState<Map<string, TableSchema> | undefined>();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n vuuTables.set(schema.table.table, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n console.log(\"GET TABLE LIST\");\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = buildTables(\n await Promise.all(\n tables.map((vuuTable) => server.getTableSchema(vuuTable))\n )\n );\n setTables(tableSchemas);\n }\n\n fetchTableMetadata();\n }, [buildTables]);\n\n return tables;\n};\n\nexport const getVuuTableSchema = (table: VuuTable) =>\n getServerAPI().then((server) => server.getTableSchema(table));\n"],
5
+ "mappings": "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",
6
6
  "names": ["useMemo", "useState", "values", "useCallback", "useEffect", "useState", "useCallback", "useEffect", "useState", "ConnectionManager", "useCallback", "metadataKeys", "useCallback", "useCallback", "useEffect", "useState", "tables"]
7
7
  }
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@vuu-ui/vuu-data-react",
3
- "version": "0.8.24-debug",
3
+ "version": "0.8.25-debug",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "devDependencies": {
7
- "@vuu-ui/vuu-data-types": "0.8.24-debug",
8
- "@vuu-ui/vuu-filter-types": "0.8.24-debug",
9
- "@vuu-ui/vuu-popups": "0.8.24-debug",
10
- "@vuu-ui/vuu-protocol-types": "0.8.24-debug",
11
- "@vuu-ui/vuu-table-types": "0.8.24-debug"
7
+ "@vuu-ui/vuu-data-types": "0.8.25-debug",
8
+ "@vuu-ui/vuu-filter-types": "0.8.25-debug",
9
+ "@vuu-ui/vuu-popups": "0.8.25-debug",
10
+ "@vuu-ui/vuu-protocol-types": "0.8.25-debug",
11
+ "@vuu-ui/vuu-table-types": "0.8.25-debug"
12
12
  },
13
13
  "dependencies": {
14
- "@vuu-ui/vuu-data-remote": "0.8.24-debug",
15
- "@vuu-ui/vuu-filter-parser": "0.8.24-debug",
16
- "@vuu-ui/vuu-popups": "0.8.24-debug",
17
- "@vuu-ui/vuu-shell": "0.8.24-debug",
18
- "@vuu-ui/vuu-utils": "0.8.24-debug"
14
+ "@vuu-ui/vuu-data-remote": "0.8.25-debug",
15
+ "@vuu-ui/vuu-filter-parser": "0.8.25-debug",
16
+ "@vuu-ui/vuu-popups": "0.8.25-debug",
17
+ "@vuu-ui/vuu-shell": "0.8.25-debug",
18
+ "@vuu-ui/vuu-utils": "0.8.25-debug"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "react": ">=17.0.2",