@vuu-ui/vuu-data-react 3.0.0-beta.3 → 3.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/package.json +24 -20
  2. package/src/data-editing/EditForm.css.js +53 -0
  3. package/src/data-editing/EditForm.mjs +82 -0
  4. package/src/data-editing/UnsavedChangesReport.css.js +27 -0
  5. package/src/data-editing/UnsavedChangesReport.mjs +41 -0
  6. package/src/data-editing/edit-rule-validation-checker.mjs +30 -0
  7. package/src/data-editing/edit-validation-rules.mjs +33 -0
  8. package/src/data-editing/form-edit-state.mjs +16 -0
  9. package/src/data-editing/get-data-item-edit-control.mjs +63 -0
  10. package/src/data-editing/index.mjs +6 -0
  11. package/src/data-editing/useEditForm.mjs +253 -0
  12. package/src/datasource-provider/VuuDataSourceProvider.mjs +20 -0
  13. package/src/datasource-provider/index.mjs +1 -0
  14. package/src/datasource-provider/useAutoLoginToVuuServer.mjs +42 -0
  15. package/src/hooks/useLookupValues.mjs +93 -0
  16. package/src/hooks/useSessionDataSource.mjs +37 -0
  17. package/src/hooks/useTypeaheadSuggestions.mjs +50 -0
  18. package/src/hooks/useVisualLinks.mjs +87 -0
  19. package/src/hooks/useVuuMenuActions.mjs +269 -0
  20. package/src/hooks/useVuuTables.mjs +32 -0
  21. package/src/index.mjs +10 -0
  22. package/src/lost-connection-indicator/LostConnectionIndicator.css.js +29 -0
  23. package/src/lost-connection-indicator/LostConnectionIndicator.mjs +30 -0
  24. package/src/lost-connection-indicator/useLostConnection.mjs +28 -0
  25. package/src/session-editing-form/SessionEditingForm.css.js +47 -0
  26. package/src/session-editing-form/SessionEditingForm.mjs +236 -0
  27. package/src/session-editing-form/index.mjs +1 -0
  28. package/cjs/data-editing/EditForm.css.js +0 -6
  29. package/cjs/data-editing/EditForm.css.js.map +0 -1
  30. package/cjs/data-editing/EditForm.js +0 -90
  31. package/cjs/data-editing/EditForm.js.map +0 -1
  32. package/cjs/data-editing/UnsavedChangesReport.css.js +0 -6
  33. package/cjs/data-editing/UnsavedChangesReport.css.js.map +0 -1
  34. package/cjs/data-editing/UnsavedChangesReport.js +0 -29
  35. package/cjs/data-editing/UnsavedChangesReport.js.map +0 -1
  36. package/cjs/data-editing/edit-rule-validation-checker.js +0 -41
  37. package/cjs/data-editing/edit-rule-validation-checker.js.map +0 -1
  38. package/cjs/data-editing/edit-validation-rules.js +0 -52
  39. package/cjs/data-editing/edit-validation-rules.js.map +0 -1
  40. package/cjs/data-editing/form-edit-state.js +0 -26
  41. package/cjs/data-editing/form-edit-state.js.map +0 -1
  42. package/cjs/data-editing/get-data-item-edit-control.js +0 -106
  43. package/cjs/data-editing/get-data-item-edit-control.js.map +0 -1
  44. package/cjs/data-editing/useEditForm.js +0 -258
  45. package/cjs/data-editing/useEditForm.js.map +0 -1
  46. package/cjs/datasource-provider/VuuDataSourceProvider.js +0 -34
  47. package/cjs/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  48. package/cjs/datasource-provider/useAutoLoginToVuuServer.js +0 -52
  49. package/cjs/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  50. package/cjs/hooks/useLookupValues.js +0 -100
  51. package/cjs/hooks/useLookupValues.js.map +0 -1
  52. package/cjs/hooks/useSessionDataSource.js +0 -58
  53. package/cjs/hooks/useSessionDataSource.js.map +0 -1
  54. package/cjs/hooks/useTypeaheadSuggestions.js +0 -57
  55. package/cjs/hooks/useTypeaheadSuggestions.js.map +0 -1
  56. package/cjs/hooks/useVisualLinks.js +0 -84
  57. package/cjs/hooks/useVisualLinks.js.map +0 -1
  58. package/cjs/hooks/useVuuMenuActions.js +0 -352
  59. package/cjs/hooks/useVuuMenuActions.js.map +0 -1
  60. package/cjs/hooks/useVuuTables.js +0 -38
  61. package/cjs/hooks/useVuuTables.js.map +0 -1
  62. package/cjs/index.js +0 -42
  63. package/cjs/index.js.map +0 -1
  64. package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js +0 -6
  65. package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
  66. package/cjs/lost-connection-indicator/LostConnectionIndicator.js +0 -24
  67. package/cjs/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
  68. package/cjs/lost-connection-indicator/useLostConnection.js +0 -34
  69. package/cjs/lost-connection-indicator/useLostConnection.js.map +0 -1
  70. package/cjs/session-editing-form/SessionEditingForm.css.js +0 -6
  71. package/cjs/session-editing-form/SessionEditingForm.css.js.map +0 -1
  72. package/cjs/session-editing-form/SessionEditingForm.js +0 -270
  73. package/cjs/session-editing-form/SessionEditingForm.js.map +0 -1
  74. package/esm/data-editing/EditForm.css.js +0 -4
  75. package/esm/data-editing/EditForm.css.js.map +0 -1
  76. package/esm/data-editing/EditForm.js +0 -88
  77. package/esm/data-editing/EditForm.js.map +0 -1
  78. package/esm/data-editing/UnsavedChangesReport.css.js +0 -4
  79. package/esm/data-editing/UnsavedChangesReport.css.js.map +0 -1
  80. package/esm/data-editing/UnsavedChangesReport.js +0 -27
  81. package/esm/data-editing/UnsavedChangesReport.js.map +0 -1
  82. package/esm/data-editing/edit-rule-validation-checker.js +0 -37
  83. package/esm/data-editing/edit-rule-validation-checker.js.map +0 -1
  84. package/esm/data-editing/edit-validation-rules.js +0 -50
  85. package/esm/data-editing/edit-validation-rules.js.map +0 -1
  86. package/esm/data-editing/form-edit-state.js +0 -23
  87. package/esm/data-editing/form-edit-state.js.map +0 -1
  88. package/esm/data-editing/get-data-item-edit-control.js +0 -104
  89. package/esm/data-editing/get-data-item-edit-control.js.map +0 -1
  90. package/esm/data-editing/useEditForm.js +0 -256
  91. package/esm/data-editing/useEditForm.js.map +0 -1
  92. package/esm/datasource-provider/VuuDataSourceProvider.js +0 -32
  93. package/esm/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  94. package/esm/datasource-provider/useAutoLoginToVuuServer.js +0 -50
  95. package/esm/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  96. package/esm/hooks/useLookupValues.js +0 -98
  97. package/esm/hooks/useLookupValues.js.map +0 -1
  98. package/esm/hooks/useSessionDataSource.js +0 -56
  99. package/esm/hooks/useSessionDataSource.js.map +0 -1
  100. package/esm/hooks/useTypeaheadSuggestions.js +0 -54
  101. package/esm/hooks/useTypeaheadSuggestions.js.map +0 -1
  102. package/esm/hooks/useVisualLinks.js +0 -82
  103. package/esm/hooks/useVisualLinks.js.map +0 -1
  104. package/esm/hooks/useVuuMenuActions.js +0 -348
  105. package/esm/hooks/useVuuMenuActions.js.map +0 -1
  106. package/esm/hooks/useVuuTables.js +0 -36
  107. package/esm/hooks/useVuuTables.js.map +0 -1
  108. package/esm/index.js +0 -16
  109. package/esm/index.js.map +0 -1
  110. package/esm/lost-connection-indicator/LostConnectionIndicator.css.js +0 -4
  111. package/esm/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
  112. package/esm/lost-connection-indicator/LostConnectionIndicator.js +0 -22
  113. package/esm/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
  114. package/esm/lost-connection-indicator/useLostConnection.js +0 -32
  115. package/esm/lost-connection-indicator/useLostConnection.js.map +0 -1
  116. package/esm/session-editing-form/SessionEditingForm.css.js +0 -4
  117. package/esm/session-editing-form/SessionEditingForm.css.js.map +0 -1
  118. package/esm/session-editing-form/SessionEditingForm.js +0 -268
  119. package/esm/session-editing-form/SessionEditingForm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVuuMenuActions.js","sources":["../../../../packages/vuu-data-react/src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport {\n type ContextMenuItemDescriptor,\n hasShowNotificationAction,\n isGroupMenuItemDescriptor,\n type MenuActionHandler,\n type MenuBuilder,\n} from \"@vuu-ui/vuu-context-menu\";\nimport {\n DataSource,\n DataSourceVisualLinkCreatedMessage,\n RpcResponseHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport { NotificationType, useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport type {\n ClientToServerMenuCellRPC,\n ClientToServerMenuRowRPC,\n LinkDescriptorWithLabel,\n OpenDialogAction,\n VuuDataRowDto,\n VuuMenu,\n VuuMenuContext,\n VuuMenuItem,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcResponse,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { BulkEditPanel, isTableLocation } from \"@vuu-ui/vuu-table\";\nimport type {\n ColumnDescriptor,\n DataRow,\n TableContextMenuDef,\n TableContextMenuOptions,\n TableMenuLocation,\n} from \"@vuu-ui/vuu-table-types\";\nimport {\n getLayoutComponent,\n isActionMessage,\n isCustomComponentActionMessage,\n isSessionTableActionMessage,\n useData,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\nimport {\n FormConfig,\n FormFieldDescriptor,\n SessionEditingForm,\n} from \"../session-editing-form\";\nimport { useModal } from \"@vuu-ui/vuu-ui-controls\";\n\nexport interface MenuActionConfig {\n vuuMenu?: VuuMenu;\n visualLink?: DataSourceVisualLinkCreatedMessage;\n visualLinks?: LinkDescriptorWithLabel[];\n}\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?: MenuActionHandler;\n dataSource?: DataSource;\n menuActionConfig?: MenuActionConfig;\n onRpcResponse?: RpcResponseHandler;\n}\n\nexport interface VuuCellContextMenuItemOptions extends VuuMenuItem {\n rowKey: string;\n field: string;\n value: VuuRowDataItemType;\n}\nexport interface VuuRowContextMenuItemOptions extends VuuMenuItem {\n rowKey: string;\n row: VuuDataRowDto;\n}\nexport interface VuuSelectedRowsContextMenuItemOptions extends VuuMenuItem {\n columns: ColumnDescriptor[];\n}\n\nconst isRoot = (menu: VuuMenu) => menu.name === \"ROOT\";\n\nconst isCellMenu = (\n options: VuuMenuItem,\n): options is VuuCellContextMenuItemOptions => options.context === \"cell\";\n\nexport const isRowMenu = (\n options: VuuMenuItem,\n): options is VuuRowContextMenuItemOptions => options.context === \"row\";\n\nexport const isSelectionMenu = (\n options: VuuMenuItem,\n): options is VuuSelectedRowsContextMenuItemOptions =>\n options.context === \"selected-rows\";\n\nconst isVuuMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenuItem =>\n \"rpcName\" in menu;\n\nconst isGroupMenuItem = (menu: VuuMenuItem | VuuMenu): menu is VuuMenu =>\n \"menus\" in menu;\n\nconst hasFilter = ({ filter }: VuuMenuItem) =>\n typeof filter === \"string\" && filter.length > 0;\n\nconst getMenuItemOptions = (\n menu: VuuMenuItem,\n options: TableContextMenuOptions,\n) => {\n switch (menu.context) {\n case \"cell\":\n return {\n ...menu,\n field: options.column.name,\n rowKey: options.dataRow.key,\n value: options.dataRow[options.column.name],\n };\n case \"row\":\n return {\n ...menu,\n columns: options.columns,\n row: options.dataRow,\n rowKey: options.dataRow.key,\n };\n case \"selected-rows\":\n return {\n ...menu,\n columns: options.columns,\n };\n default:\n return menu;\n }\n};\n\nconst vuuContextCompatibleWithTableLocation = (\n uiLocation: TableMenuLocation,\n vuuContext: VuuMenuContext,\n selectedRowCount = 0,\n) => {\n switch (uiLocation) {\n case \"grid\":\n if (vuuContext === \"selected-rows\") {\n return selectedRowCount > 0;\n } else {\n return true;\n }\n case \"header\":\n return vuuContext === \"grid\";\n default:\n return false;\n }\n};\n\nconst gridRowMeetsFilterCriteria = (\n context: VuuMenuContext,\n dataRow: DataRow,\n selectedRows: DataRow[],\n filter: string,\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(filter);\n return filterPredicate(dataRow);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst menuShouldBeRenderedInThisContext = (\n menuItem: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: TableContextMenuOptions,\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.dataRow,\n options.selectedRows,\n menuItem.filter,\n );\n }\n\n if (isCellMenu(menuItem) && menuItem.field !== \"*\") {\n return menuItem.field === options.column.name;\n }\n\n return true;\n};\n\nconst buildMenuDescriptorFromVuuMenu = (\n menu: VuuMenu | VuuMenuItem,\n tableLocation: TableMenuLocation,\n options: TableContextMenuOptions,\n): ContextMenuItemDescriptor | undefined => {\n if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {\n if (isVuuMenuItem(menu)) {\n return {\n label: menu.name,\n id: \"MENU_RPC_CALL\",\n options: getMenuItemOptions(menu, options),\n };\n } else {\n const children = menu.menus\n .map((childMenu) =>\n buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options),\n )\n .filter(\n (childMenu) => childMenu !== undefined,\n ) as ContextMenuItemDescriptor[];\n if (children.length > 0) {\n return {\n label: menu.name,\n children,\n };\n }\n }\n }\n};\n\nconst keyFirst = (c1: FormFieldDescriptor, c2: FormFieldDescriptor) =>\n c1.isKeyField ? -1 : c2.isKeyField ? 1 : 0;\n\nconst defaultFormConfig = {\n fields: [],\n key: \"\",\n title: \"\",\n};\n\nconst configFromSchema = (schema?: TableSchema): FormConfig | undefined => {\n if (schema) {\n const { columns, key } = schema;\n return {\n key,\n title: `Parameters for command`,\n fields: columns\n .map((col) => ({\n description: col.name,\n label: col.name,\n name: col.name,\n type: col.serverDataType,\n isKeyField: col.name === key,\n }))\n .sort(keyFirst),\n };\n }\n};\n\nconst getFormConfig = (\n action: OpenDialogAction & { tableSchema: TableSchema },\n) => {\n const { tableSchema: schema } = action;\n const config = configFromSchema(schema) ?? defaultFormConfig;\n\n return {\n config,\n schema,\n };\n};\n\nexport const useVuuMenuActions = ({\n clientSideMenuActionHandler,\n dataSource,\n onRpcResponse,\n}: VuuMenuActionHookProps): TableContextMenuDef => {\n const { VuuDataSource } = useData();\n const menuBuilder: MenuBuilder<TableMenuLocation, TableContextMenuOptions> =\n useCallback(\n (location, options) => {\n const descriptors: ContextMenuItemDescriptor[] = [];\n if (dataSource) {\n const { links, menu } = dataSource;\n const { visualLink } = dataSource;\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 id: \"link-table\",\n options: linkDescriptor,\n });\n });\n }\n\n if (menu && isTableLocation(location)) {\n const menuDescriptor = buildMenuDescriptorFromVuuMenu(\n menu,\n location,\n options,\n );\n if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {\n descriptors.push(...menuDescriptor.children);\n } else if (menuDescriptor) {\n descriptors.push(menuDescriptor);\n }\n }\n } else {\n throw Error(\"useVuuMenuActions no dataSource provided\");\n }\n\n return descriptors;\n },\n [dataSource],\n );\n\n const { showDialog, closeDialog, showPrompt } = useModal();\n const { showNotification } = useNotifications();\n\n const showCustomComponentInDialog = useCallback(\n (componentId: string, ds: DataSource, table: VuuTable) => {\n const sessionDs = new VuuDataSource({\n columns: ds.columns,\n table,\n viewport: table.table,\n });\n\n const handleOpenChangePrompt = (open: boolean) => {\n if (!open) {\n ds.unsubscribe();\n }\n };\n\n const Component = getLayoutComponent(componentId);\n showPrompt(<Component dataSource={sessionDs} />, {\n title: \"Confirm operation on selected rows\",\n onOpenChange: handleOpenChangePrompt,\n });\n },\n [VuuDataSource, showPrompt],\n );\n\n const showSessionEditingForm = useCallback(\n async (\n ds: DataSource,\n action: OpenDialogAction & { tableSchema: TableSchema },\n ) => {\n const { tableSchema } = action;\n if (tableSchema) {\n const formConfig = getFormConfig(action);\n showDialog(\n <SessionEditingForm {...formConfig} onClose={closeDialog} />,\n \"Set Parameters\",\n );\n }\n\n //will the tableSchema be different to ds?\n const sessionDs = await ds.createSessionDataSource?.('All');\n const handleSubmit = () => {\n sessionDs?.rpcRequest?.({\n params: {\n save: true,\n },\n rpcName: \"endEditSession\",\n type: \"RPC_REQUEST\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel\n sessionDs={sessionDs}\n onSubmit={handleSubmit}\n parentDs={ds}\n />,\n \"Multi Row Edit\",\n [\n <Button key=\"cancel\" onClick={closeDialog}>\n Cancel\n </Button>,\n <Button key=\"submit\" onClick={handleSubmit}>\n Save\n </Button>,\n ],\n );\n }\n },\n [closeDialog, showDialog],\n );\n\n const getMenuRpcRequest = (\n options: VuuMenuItem,\n ): Omit<VuuRpcMenuRequest, \"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<VuuRpcMenuRequest, \"vpId\">;\n } else {\n return {\n rpcName,\n type: \"VIEW_PORT_MENU_TABLE_RPC\",\n } as Omit<VuuRpcMenuRequest, \"vpId\">;\n }\n };\n\n const menuActionHandler = useCallback<MenuActionHandler>(\n (menuItemId, options) => {\n if (clientSideMenuActionHandler?.(menuItemId, options)) {\n return true;\n } else if (menuItemId === \"MENU_RPC_CALL\") {\n const rpcRequest = getMenuRpcRequest(options as VuuMenuItem);\n\n dataSource\n ?.menuRpcCall(rpcRequest)\n .then((rpcResponse: Omit<VuuRpcResponse, \"requestId\">) => {\n if (rpcResponse) {\n if (onRpcResponse?.(rpcResponse) === true) {\n return true;\n }\n if (isActionMessage(rpcResponse)) {\n if (hasShowNotificationAction(rpcResponse)) {\n const {\n action: { message, title = \"Success\" },\n } = rpcResponse;\n showNotification({\n status: \"success\",\n content: message,\n header: title,\n type: NotificationType.Toast,\n });\n } else if (isSessionTableActionMessage(rpcResponse)) {\n showSessionEditingForm(dataSource, rpcResponse.action);\n } else if (isCustomComponentActionMessage(rpcResponse)) {\n showCustomComponentInDialog(\n rpcResponse.action.renderComponent,\n dataSource,\n rpcResponse.action.table,\n );\n }\n }\n }\n });\n return true;\n } else if (menuItemId === \"link-table\") {\n if (dataSource) {\n dataSource.visualLink = options as LinkDescriptorWithLabel;\n }\n return true;\n } else {\n console.log(\n `useViewServer handleMenuAction, can't handle action type ${menuItemId}`,\n );\n }\n\n return false;\n },\n [\n clientSideMenuActionHandler,\n dataSource,\n onRpcResponse,\n showCustomComponentInDialog,\n showNotification,\n showSessionEditingForm,\n ],\n );\n\n return {\n menuBuilder,\n menuActionHandler,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import { useData } from '@vuu-ui/vuu-utils';
2
- import { useState, useCallback, useEffect } from 'react';
3
-
4
- const useVuuTables = () => {
5
- const [tableSchemas, setTableSchemas] = useState();
6
- const { getServerAPI } = useData();
7
- const buildTables = useCallback((schemas) => {
8
- const vuuTables = /* @__PURE__ */ new Map();
9
- schemas.forEach((schema) => {
10
- const { module, table } = schema.table;
11
- vuuTables.set(`${module}:${table}`, schema);
12
- });
13
- return vuuTables;
14
- }, []);
15
- useEffect(() => {
16
- async function fetchTableMetadata() {
17
- try {
18
- const server = await getServerAPI();
19
- const { tables } = await server.getTableList();
20
- const tableSchemas2 = await Promise.all(
21
- tables.map((vuuTable) => server.getTableSchema(vuuTable))
22
- );
23
- setTableSchemas(tableSchemas2);
24
- } catch (err) {
25
- console.warn(
26
- `useVuuTables: error fetching table metadata ${String(err)}`
27
- );
28
- }
29
- }
30
- fetchTableMetadata();
31
- }, [buildTables, getServerAPI]);
32
- return tableSchemas;
33
- };
34
-
35
- export { useVuuTables };
36
- //# sourceMappingURL=useVuuTables.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVuuTables.js","sources":["../../../../packages/vuu-data-react/src/hooks/useVuuTables.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { useData } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport const useVuuTables = () => {\n const [tableSchemas, setTableSchemas] = useState<TableSchema[] | undefined>();\n\n const { getServerAPI } = useData();\n\n const buildTables = useCallback((schemas: TableSchema[]) => {\n const vuuTables = new Map<string, TableSchema>();\n schemas.forEach((schema) => {\n const { module, table } = schema.table;\n vuuTables.set(`${module}:${table}`, schema);\n });\n return vuuTables;\n }, []);\n\n useEffect(() => {\n async function fetchTableMetadata() {\n try {\n const server = await getServerAPI();\n const { tables } = await server.getTableList();\n const tableSchemas = await Promise.all(\n tables.map((vuuTable) => server.getTableSchema(vuuTable)),\n );\n setTableSchemas(tableSchemas);\n } catch (err) {\n console.warn(\n `useVuuTables: error fetching table metadata ${String(err)}`,\n );\n }\n }\n\n fetchTableMetadata();\n }, [buildTables, getServerAPI]);\n\n return tableSchemas;\n};\n"],"names":["tableSchemas"],"mappings":";;;AAIO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAoC,EAAA;AAE5E,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,OAAQ,EAAA;AAEjC,EAAM,MAAA,WAAA,GAAc,WAAY,CAAA,CAAC,OAA2B,KAAA;AAC1D,IAAM,MAAA,SAAA,uBAAgB,GAAyB,EAAA;AAC/C,IAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAC1B,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAM,EAAA,GAAI,MAAO,CAAA,KAAA;AACjC,MAAA,SAAA,CAAU,IAAI,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,KAAK,IAAI,MAAM,CAAA;AAAA,KAC3C,CAAA;AACD,IAAO,OAAA,SAAA;AAAA,GACT,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,eAAe,kBAAqB,GAAA;AAClC,MAAI,IAAA;AACF,QAAM,MAAA,MAAA,GAAS,MAAM,YAAa,EAAA;AAClC,QAAA,MAAM,EAAE,MAAA,EAAW,GAAA,MAAM,OAAO,YAAa,EAAA;AAC7C,QAAMA,MAAAA,aAAAA,GAAe,MAAM,OAAQ,CAAA,GAAA;AAAA,UACjC,OAAO,GAAI,CAAA,CAAC,aAAa,MAAO,CAAA,cAAA,CAAe,QAAQ,CAAC;AAAA,SAC1D;AACA,QAAA,eAAA,CAAgBA,aAAY,CAAA;AAAA,eACrB,GAAK,EAAA;AACZ,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,CAAA,4CAAA,EAA+C,MAAO,CAAA,GAAG,CAAC,CAAA;AAAA,SAC5D;AAAA;AACF;AAGF,IAAmB,kBAAA,EAAA;AAAA,GAClB,EAAA,CAAC,WAAa,EAAA,YAAY,CAAC,CAAA;AAE9B,EAAO,OAAA,YAAA;AACT;;;;"}
package/esm/index.js DELETED
@@ -1,16 +0,0 @@
1
- export { getDataItemEditControl } from './data-editing/get-data-item-edit-control.js';
2
- export { EditForm } from './data-editing/EditForm.js';
3
- export { OK, buildValidationChecker, getEditValidationRules } from './data-editing/edit-rule-validation-checker.js';
4
- export { UnsavedChangesReport } from './data-editing/UnsavedChangesReport.js';
5
- export { useEditForm } from './data-editing/useEditForm.js';
6
- export { CLEAN_FORM, buildFormEditState } from './data-editing/form-edit-state.js';
7
- export { VuuDataSourceProvider } from './datasource-provider/VuuDataSourceProvider.js';
8
- export { useLookupValues } from './hooks/useLookupValues.js';
9
- export { useSessionDataSource } from './hooks/useSessionDataSource.js';
10
- export { getTypeaheadParams, useTypeaheadSuggestions } from './hooks/useTypeaheadSuggestions.js';
11
- export { useVisualLinks } from './hooks/useVisualLinks.js';
12
- export { isRowMenu, isSelectionMenu, useVuuMenuActions } from './hooks/useVuuMenuActions.js';
13
- export { useVuuTables } from './hooks/useVuuTables.js';
14
- export { useLostConnection } from './lost-connection-indicator/useLostConnection.js';
15
- export { SessionEditingForm } from './session-editing-form/SessionEditingForm.js';
16
- //# sourceMappingURL=index.js.map
package/esm/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -1,4 +0,0 @@
1
- var workspaceNotificationCss = ".vuuLostConnectionIndicator {\n\n --spinner-color: var(--vuuSpinner-color, #E23434);\n\n align-items: center;\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-300);\n justify-content: center;\n\n\n .vuuLostConnectionIndicator-spinner {\n animation: spinner-rounded-comet-anim 1.0s infinite linear;\n width: 75px;\n height: 75px;\n border-radius: 50%;\n background: radial-gradient(farthest-side,var(--spinner-color) 94%,#0000) top/9px 9px no-repeat,\n conic-gradient(#0000 30%,var(--spinner-color));\n mask: radial-gradient(farthest-side,#0000 calc(100% - 4px),#000 0);\n }\n}\n\n@keyframes spinner-rounded-comet-anim {\n 100% {\n transform: rotate(1turn);\n }\n}\n\n\n\n";
2
-
3
- export { workspaceNotificationCss as default };
4
- //# sourceMappingURL=LostConnectionIndicator.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LostConnectionIndicator.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,22 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useComponentCssInjection } from '@salt-ds/styles';
3
- import { useWindow } from '@salt-ds/window';
4
- import workspaceNotificationCss from './LostConnectionIndicator.css.js';
5
-
6
- const classBase = "vuuLostConnectionIndicator";
7
- const LostConnectionIndicator = () => {
8
- const targetWindow = useWindow();
9
- useComponentCssInjection({
10
- testId: "vuu-toast-notification",
11
- css: workspaceNotificationCss,
12
- window: targetWindow
13
- });
14
- return /* @__PURE__ */ jsxs("div", { className: classBase, children: [
15
- /* @__PURE__ */ jsx("h2", { className: `${classBase}-title`, children: "CONNECTION LOST" }),
16
- /* @__PURE__ */ jsx("div", { className: `${classBase}-spinner` }),
17
- /* @__PURE__ */ jsx("h3", { className: `${classBase}-status`, children: "RECONNECTING" })
18
- ] });
19
- };
20
-
21
- export { LostConnectionIndicator };
22
- //# sourceMappingURL=LostConnectionIndicator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LostConnectionIndicator.js","sources":["../../../../packages/vuu-data-react/src/lost-connection-indicator/LostConnectionIndicator.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport workspaceNotificationCss from \"./LostConnectionIndicator.css\";\n\nconst classBase = \"vuuLostConnectionIndicator\";\n\nexport const LostConnectionIndicator = () => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-toast-notification\",\n css: workspaceNotificationCss,\n window: targetWindow,\n });\n\n return (\n <div className={classBase}>\n <h2 className={`${classBase}-title`}>CONNECTION LOST</h2>\n <div className={`${classBase}-spinner`} />\n <h3 className={`${classBase}-status`}>RECONNECTING</h3>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;AAKA,MAAM,SAAY,GAAA,4BAAA;AAEX,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAA,wBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,SACd,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAG,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAU,QAAe,EAAA,iBAAA,EAAA,CAAA;AAAA,oBACnD,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAAY,QAAA,CAAA,EAAA,CAAA;AAAA,wBACvC,IAAG,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,WAAW,QAAY,EAAA,cAAA,EAAA;AAAA,GACpD,EAAA,CAAA;AAEJ;;;;"}
@@ -1,32 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { ConnectionManager, isConnected } from '@vuu-ui/vuu-data-remote';
3
- import { useRef, useCallback, useMemo } from 'react';
4
- import { useNotifications, NotificationType } from '@vuu-ui/vuu-notifications';
5
- import { LostConnectionIndicator } from './LostConnectionIndicator.js';
6
-
7
- const useLostConnection = () => {
8
- const { hideNotification, showNotification } = useNotifications();
9
- const isConnectedRef = useRef(ConnectionManager.connected);
10
- const handleConnectionStatusChange = useCallback(
11
- (connectionStatus) => {
12
- const { current: wasConnected } = isConnectedRef;
13
- isConnectedRef.current = isConnected(connectionStatus);
14
- if (wasConnected && connectionStatus === "disconnected") {
15
- showNotification({
16
- content: /* @__PURE__ */ jsx(LostConnectionIndicator, {}),
17
- status: "error",
18
- type: NotificationType.Workspace
19
- });
20
- } else if (!wasConnected && isConnectedRef.current) {
21
- hideNotification();
22
- }
23
- },
24
- [hideNotification, showNotification]
25
- );
26
- useMemo(async () => {
27
- ConnectionManager.on("connection-status", handleConnectionStatusChange);
28
- }, [handleConnectionStatusChange]);
29
- };
30
-
31
- export { useLostConnection };
32
- //# sourceMappingURL=useLostConnection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLostConnection.js","sources":["../../../../packages/vuu-data-react/src/lost-connection-indicator/useLostConnection.tsx"],"sourcesContent":["import {\n ConnectionManager,\n ConnectionStatus,\n isConnected,\n} from \"@vuu-ui/vuu-data-remote\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { NotificationType, useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport { LostConnectionIndicator } from \"../lost-connection-indicator/LostConnectionIndicator\";\n\nexport const useLostConnection = () => {\n const { hideNotification, showNotification } = useNotifications();\n\n const isConnectedRef = useRef(ConnectionManager.connected);\n\n const handleConnectionStatusChange = useCallback(\n (connectionStatus: ConnectionStatus) => {\n const { current: wasConnected } = isConnectedRef;\n isConnectedRef.current = isConnected(connectionStatus);\n\n if (wasConnected && connectionStatus === \"disconnected\") {\n showNotification({\n content: <LostConnectionIndicator />,\n status: \"error\",\n type: NotificationType.Workspace,\n });\n } else if (!wasConnected && isConnectedRef.current) {\n hideNotification();\n }\n },\n [hideNotification, showNotification],\n );\n\n useMemo(async () => {\n ConnectionManager.on(\"connection-status\", handleConnectionStatusChange);\n }, [handleConnectionStatusChange]);\n};\n"],"names":[],"mappings":";;;;;;AASO,MAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,EAAE,gBAAA,EAAkB,gBAAiB,EAAA,GAAI,gBAAiB,EAAA;AAEhE,EAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,iBAAA,CAAkB,SAAS,CAAA;AAEzD,EAAA,MAAM,4BAA+B,GAAA,WAAA;AAAA,IACnC,CAAC,gBAAuC,KAAA;AACtC,MAAM,MAAA,EAAE,OAAS,EAAA,YAAA,EAAiB,GAAA,cAAA;AAClC,MAAe,cAAA,CAAA,OAAA,GAAU,YAAY,gBAAgB,CAAA;AAErD,MAAI,IAAA,YAAA,IAAgB,qBAAqB,cAAgB,EAAA;AACvD,QAAiB,gBAAA,CAAA;AAAA,UACf,OAAA,sBAAU,uBAAwB,EAAA,EAAA,CAAA;AAAA,UAClC,MAAQ,EAAA,OAAA;AAAA,UACR,MAAM,gBAAiB,CAAA;AAAA,SACxB,CAAA;AAAA,OACQ,MAAA,IAAA,CAAC,YAAgB,IAAA,cAAA,CAAe,OAAS,EAAA;AAClD,QAAiB,gBAAA,EAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,kBAAkB,gBAAgB;AAAA,GACrC;AAEA,EAAA,OAAA,CAAQ,YAAY;AAClB,IAAkB,iBAAA,CAAA,EAAA,CAAG,qBAAqB,4BAA4B,CAAA;AAAA,GACxE,EAAG,CAAC,4BAA4B,CAAC,CAAA;AACnC;;;;"}
@@ -1,4 +0,0 @@
1
- var sessionEditingFormCss = ".vuuSessionEditingForm {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 400px;\n}\n\n.vuuSessionEditingForm-content {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 3px;\n overflow: auto;\n padding: var(--salt-spacing-200);\n}\n\n\n.vuuSessionEditingForm-fieldValue.vuuReadOnly {\n font-weight: var(--salt-text-label-fontWeight-strong);\n}\n\n.vuuSessionEditingForm-buttonbar {\n align-items: center;\n border-top: solid 1px var(--salt-container-primary-borderColor);\n box-sizing: content-box;\n display: flex;\n justify-content: flex-end;\n flex: 0 0 autox;\n gap: 6px;\n height: var(--salt-size-base);\n margin: var(--salt-spacing-200);\n padding-top: var(--salt-spacing-200);\n\n}\n\n.vuuSessionEditingForm-errorBanner {\n --vuu-icon-left: 3px;\n --vuu-icon-size: 18px;\n --vuu-icon-top: 3px;\n border: solid 1px var(--salt-status-error-borderColor);\n line-height: 24px;\n padding: 0 6px 0 26px;\n position: relative;\n}";
2
-
3
- export { sessionEditingFormCss as default };
4
- //# sourceMappingURL=SessionEditingForm.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionEditingForm.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,268 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { VuuDataSource } from '@vuu-ui/vuu-data-remote';
3
- import { buildColumnMap, Range, getTypedValue, shallowEquals, queryClosest } from '@vuu-ui/vuu-utils';
4
- import { useIdMemo, FormField, FormFieldLabel, FormFieldHelperText, Button, Input } from '@salt-ds/core';
5
- import { useComponentCssInjection } from '@salt-ds/styles';
6
- import { useWindow } from '@salt-ds/window';
7
- import cx from 'clsx';
8
- import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
9
- import sessionEditingFormCss from './SessionEditingForm.css.js';
10
-
11
- const classBase = "vuuSessionEditingForm";
12
- const getField = (fields, name) => {
13
- const field = fields.find((f) => f.name === name);
14
- if (field) {
15
- return field;
16
- } else {
17
- throw Error(`SessionEditingForm, no field '${name}' found`);
18
- }
19
- };
20
- const getFieldNameAndValue = ({
21
- target
22
- }) => {
23
- const formField = queryClosest(target, ".saltFormField");
24
- if (formField) {
25
- const {
26
- dataset: { field }
27
- } = formField;
28
- if (field === void 0) {
29
- throw Error("SessionEditingForm, form field has no field data attribute");
30
- }
31
- return [field, target.value];
32
- } else {
33
- throw Error("Form control is not enclosed in FormField");
34
- }
35
- };
36
- const Status = {
37
- uninitialised: 0,
38
- unchanged: 1,
39
- changed: 2,
40
- invalid: 3
41
- };
42
- const getDataSource = (dataSource, schema) => {
43
- if (dataSource) {
44
- return dataSource;
45
- } else if (schema) {
46
- return new VuuDataSource({
47
- bufferSize: 0,
48
- table: schema.table,
49
- columns: schema.columns.map((col) => col.name)
50
- });
51
- } else {
52
- throw Error(
53
- "SessionEditingForm: either a DataSource or a TableSchema must be provided"
54
- );
55
- }
56
- };
57
- const SessionEditingForm = ({
58
- className,
59
- config: { fields, key: keyField },
60
- dataSource: dataSourceProp,
61
- id: idProp,
62
- onClose,
63
- schema,
64
- ...htmlAttributes
65
- }) => {
66
- const targetWindow = useWindow();
67
- useComponentCssInjection({
68
- testId: "vuu-session-editing-form",
69
- css: sessionEditingFormCss,
70
- window: targetWindow
71
- });
72
- const [fieldStatusValues, setFieldStatusValues] = useState({});
73
- const [values, setValues] = useState();
74
- const [errorMessage, setErrorMessage] = useState("");
75
- const formContentRef = useRef(null);
76
- const initialDataRef = useRef(void 0);
77
- const dataStatusRef = useRef(Status.uninitialised);
78
- const dataSource = useMemo(() => {
79
- const ds = getDataSource(dataSourceProp, schema);
80
- const { columns } = ds;
81
- const columnMap = buildColumnMap(ds.columns);
82
- const applyServerData = (data) => {
83
- if (columnMap) {
84
- const values2 = {};
85
- for (const column of columns) {
86
- values2[column] = data[columnMap[column]];
87
- }
88
- if (dataStatusRef.current === Status.uninitialised) {
89
- dataStatusRef.current = Status.unchanged;
90
- initialDataRef.current = values2;
91
- }
92
- setValues(values2);
93
- }
94
- };
95
- ds.subscribe({ range: Range(0, 5) }, (message) => {
96
- if (message.type === "viewport-update" && message.rows) {
97
- if (dataStatusRef.current === Status.uninitialised) {
98
- applyServerData(message.rows[0]);
99
- } else {
100
- console.log("what do we do with server updates");
101
- }
102
- }
103
- });
104
- return ds;
105
- }, [dataSourceProp, schema]);
106
- const id = useIdMemo(idProp);
107
- const handleChange = useCallback(
108
- (evt) => {
109
- const [field, value] = getFieldNameAndValue(evt);
110
- const { type } = getField(fields, field);
111
- const typedValue = getTypedValue(value, type);
112
- setValues((values2 = {}) => {
113
- const newValues = {
114
- ...values2,
115
- [field]: typedValue
116
- };
117
- const notUpdated = shallowEquals(newValues, initialDataRef.current);
118
- dataStatusRef.current = notUpdated ? Status.unchanged : typedValue !== void 0 ? Status.changed : Status.invalid;
119
- return newValues;
120
- });
121
- },
122
- [fields]
123
- );
124
- const handleBlur = useCallback(
125
- async (evt) => {
126
- const [column, value] = getFieldNameAndValue(evt);
127
- const key = values?.[keyField];
128
- const { type } = getField(fields, column);
129
- const data = getTypedValue(value, type, true);
130
- if (typeof key === "string") {
131
- const response = await dataSource.rpcRequest?.({
132
- params: {
133
- key,
134
- column,
135
- data
136
- },
137
- rpcName: "editCell",
138
- type: "RPC_REQUEST"
139
- });
140
- if (response?.type === "SUCCESS_RESULT") {
141
- setFieldStatusValues((map) => ({
142
- ...map,
143
- [column]: void 0
144
- }));
145
- } else if (response?.type === "ERROR_RESULT") {
146
- console.log(`edit rejected ${response.errorMessage}`);
147
- setFieldStatusValues((map) => ({
148
- ...map,
149
- [column]: response.errorMessage
150
- }));
151
- }
152
- }
153
- },
154
- [dataSource, fields, keyField, values]
155
- );
156
- const handleSubmit = useCallback(async () => {
157
- const response = await dataSource.rpcRequest?.({
158
- params: { comment: "" },
159
- rpcName: "submitForm",
160
- type: "RPC_REQUEST"
161
- });
162
- if (response?.type === "SUCCESS_RESULT") {
163
- onClose?.();
164
- } else if (response?.type === "ERROR_RESULT") {
165
- setErrorMessage(response.errorMessage);
166
- }
167
- }, [dataSource, onClose]);
168
- const handleKeyDown = useCallback(
169
- (evt) => {
170
- if (evt.key === "Enter" && dataStatusRef.current === Status.changed) {
171
- handleSubmit();
172
- }
173
- },
174
- [handleSubmit]
175
- );
176
- const handleCancel = useCallback(() => {
177
- onClose?.();
178
- }, [onClose]);
179
- const getFormControl = (field) => {
180
- const value = String(values?.[field.name] ?? "");
181
- if (field.readonly || field.name === keyField) {
182
- return /* @__PURE__ */ jsx("div", { className: `${classBase}-fieldValue vuuReadOnly`, children: value });
183
- } else {
184
- return /* @__PURE__ */ jsx(
185
- Input,
186
- {
187
- className: `${classBase}-fieldValue`,
188
- onBlur: handleBlur,
189
- onChange: handleChange,
190
- value,
191
- id: `${id}-input-${field.name}`
192
- }
193
- );
194
- }
195
- };
196
- useEffect(() => {
197
- if (formContentRef.current) {
198
- const firstInput = formContentRef.current.querySelector(
199
- "input"
200
- );
201
- if (firstInput) {
202
- setTimeout(() => {
203
- firstInput.focus();
204
- firstInput.select();
205
- }, 100);
206
- }
207
- }
208
- }, []);
209
- useEffect(() => {
210
- return () => {
211
- if (dataSource) {
212
- dataSource.unsubscribe();
213
- }
214
- };
215
- }, [dataSource]);
216
- const isDirty = dataStatusRef.current === Status.changed;
217
- return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: cx(classBase, className), children: [
218
- errorMessage ? /* @__PURE__ */ jsx(
219
- "div",
220
- {
221
- className: `${classBase}-errorBanner`,
222
- "data-icon": "error",
223
- title: errorMessage,
224
- children: "Error, edit(s) not saved"
225
- }
226
- ) : void 0,
227
- /* @__PURE__ */ jsx(
228
- "div",
229
- {
230
- className: `${classBase}-content`,
231
- ref: formContentRef,
232
- onKeyDown: handleKeyDown,
233
- children: fields.map((field) => /* @__PURE__ */ jsxs(
234
- FormField,
235
- {
236
- className: `${classBase}-field`,
237
- "data-field": field.name,
238
- necessity: field.required ? "required" : "optional",
239
- readOnly: field.readonly,
240
- validationStatus: fieldStatusValues[field.name] ? "error" : void 0,
241
- children: [
242
- /* @__PURE__ */ jsx(FormFieldLabel, { children: field?.label ?? field.description }),
243
- getFormControl(field),
244
- /* @__PURE__ */ jsx(FormFieldHelperText, { children: fieldStatusValues[field.name] ?? "" })
245
- ]
246
- },
247
- field.name
248
- ))
249
- }
250
- ),
251
- /* @__PURE__ */ jsxs("div", { className: `${classBase}-buttonbar salt-theme salt-density-high`, children: [
252
- /* @__PURE__ */ jsx(
253
- Button,
254
- {
255
- type: "submit",
256
- variant: "cta",
257
- disabled: !isDirty,
258
- onClick: handleSubmit,
259
- children: "Submit"
260
- }
261
- ),
262
- /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: handleCancel, children: "Cancel" })
263
- ] })
264
- ] });
265
- };
266
-
267
- export { SessionEditingForm };
268
- //# sourceMappingURL=SessionEditingForm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionEditingForm.js","sources":["../../../../packages/vuu-data-react/src/session-editing-form/SessionEditingForm.tsx"],"sourcesContent":["import { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport { DataSource, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuDataRow,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n getTypedValue,\n queryClosest,\n Range,\n shallowEquals,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n Button,\n FormField,\n FormFieldHelperText,\n FormFieldLabel,\n Input,\n useIdMemo,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport {\n ChangeEvent,\n ChangeEventHandler,\n FocusEvent,\n FocusEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport sessionEditingFormCss from \"./SessionEditingForm.css\";\n\nexport type FormFieldDescriptor = {\n isKeyField?: boolean;\n label?: string;\n name: string;\n type: VuuColumnDataType;\n description: string;\n readonly?: boolean;\n required?: boolean;\n};\n\nexport type FormConfig = {\n title: string;\n key: string;\n fields: FormFieldDescriptor[];\n};\n\nexport interface SessionEditingFormProps\n extends HTMLAttributes<HTMLDivElement> {\n config: FormConfig;\n onClose?: () => void;\n dataSource?: DataSource;\n schema?: TableSchema;\n}\n\nconst classBase = \"vuuSessionEditingForm\";\n\nconst getField = (\n fields: FormFieldDescriptor[],\n name: string,\n): FormFieldDescriptor => {\n const field = fields.find((f) => f.name === name);\n if (field) {\n return field;\n } else {\n throw Error(`SessionEditingForm, no field '${name}' found`);\n }\n};\n\nconst getFieldNameAndValue = ({\n target,\n}: ChangeEvent<HTMLInputElement> | FocusEvent<HTMLInputElement>): [\n string,\n string,\n] => {\n const formField = queryClosest(target, \".saltFormField\");\n if (formField) {\n const {\n dataset: { field },\n } = formField;\n if (field === undefined) {\n throw Error(\"SessionEditingForm, form field has no field data attribute\");\n }\n return [field, target.value];\n } else {\n throw Error(\"Form control is not enclosed in FormField\");\n }\n};\n\nconst Status = {\n uninitialised: 0,\n unchanged: 1,\n changed: 2,\n invalid: 3,\n};\n\nconst getDataSource = (\n dataSource?: DataSource,\n schema?: TableSchema,\n): DataSource => {\n if (dataSource) {\n return dataSource;\n } else if (schema) {\n return new VuuDataSource({\n bufferSize: 0,\n table: schema.table,\n columns: schema.columns.map((col) => col.name),\n }) as DataSource;\n } else {\n throw Error(\n \"SessionEditingForm: either a DataSource or a TableSchema must be provided\",\n );\n }\n};\n\ntype FormValues = { [key: string]: VuuRowDataItemType | undefined };\n\nexport const SessionEditingForm = ({\n className,\n config: { fields, key: keyField },\n dataSource: dataSourceProp,\n id: idProp,\n onClose,\n schema,\n ...htmlAttributes\n}: SessionEditingFormProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-session-editing-form\",\n css: sessionEditingFormCss,\n window: targetWindow,\n });\n\n const [fieldStatusValues, setFieldStatusValues] = useState<\n Record<string, string | undefined>\n >({});\n const [values, setValues] = useState<FormValues>();\n const [errorMessage, setErrorMessage] = useState(\"\");\n const formContentRef = useRef<HTMLDivElement>(null);\n const initialDataRef = useRef<FormValues>(undefined);\n const dataStatusRef = useRef(Status.uninitialised);\n\n const dataSource = useMemo(() => {\n const ds = getDataSource(dataSourceProp, schema);\n const { columns } = ds;\n const columnMap = buildColumnMap(ds.columns);\n\n const applyServerData = (data: VuuDataRow) => {\n if (columnMap) {\n const values: { [key: string]: VuuRowDataItemType } = {};\n for (const column of columns) {\n values[column] = data[columnMap[column]];\n }\n if (dataStatusRef.current === Status.uninitialised) {\n dataStatusRef.current = Status.unchanged;\n initialDataRef.current = values;\n }\n setValues(values);\n }\n };\n\n ds.subscribe({ range: Range(0, 5) }, (message) => {\n if (message.type === \"viewport-update\" && message.rows) {\n if (dataStatusRef.current === Status.uninitialised) {\n applyServerData(message.rows[0]);\n } else {\n console.log(\"what do we do with server updates\");\n }\n }\n });\n return ds;\n }, [dataSourceProp, schema]);\n\n const id = useIdMemo(idProp);\n\n const handleChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (evt) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n const typedValue = getTypedValue(value, type);\n setValues((values = {}) => {\n const newValues = {\n ...values,\n [field]: typedValue,\n };\n const notUpdated = shallowEquals(newValues, initialDataRef.current);\n dataStatusRef.current = notUpdated\n ? Status.unchanged\n : typedValue !== undefined\n ? Status.changed\n : Status.invalid;\n return newValues;\n });\n },\n [fields],\n );\n\n const handleBlur = useCallback<FocusEventHandler<HTMLInputElement>>(\n async (evt) => {\n const [column, value] = getFieldNameAndValue(evt);\n const key = values?.[keyField];\n // TODO link this with client side validation if we're going to use it\n const { type } = getField(fields, column);\n const data = getTypedValue(value, type, true);\n if (typeof key === \"string\") {\n const response = await dataSource.rpcRequest?.({\n params: {\n key,\n column,\n data,\n },\n rpcName: \"editCell\",\n type: \"RPC_REQUEST\",\n });\n if (response?.type === \"SUCCESS_RESULT\") {\n setFieldStatusValues((map) => ({\n ...map,\n [column]: undefined,\n }));\n } else if (response?.type === \"ERROR_RESULT\") {\n console.log(`edit rejected ${response.errorMessage}`);\n setFieldStatusValues((map) => ({\n ...map,\n [column]: response.errorMessage,\n }));\n }\n }\n },\n [dataSource, fields, keyField, values],\n );\n\n // const applyAction = useCallback(\n // // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // (action: any) => {\n // if (action?.type === \"CLOSE_DIALOG_ACTION\") {\n // onClose?.();\n // }\n // },\n // [onClose],\n // );\n\n const handleSubmit = useCallback(async () => {\n const response = await dataSource.rpcRequest?.({\n params: { comment: \"\" },\n rpcName: \"submitForm\",\n type: \"RPC_REQUEST\",\n });\n if (response?.type === \"SUCCESS_RESULT\") {\n // applyAction(response.action);\n onClose?.();\n } else if (response?.type === \"ERROR_RESULT\") {\n setErrorMessage(response.errorMessage);\n }\n }, [dataSource, onClose]);\n\n const handleKeyDown = useCallback<KeyboardEventHandler>(\n (evt) => {\n if (evt.key === \"Enter\" && dataStatusRef.current === Status.changed) {\n handleSubmit();\n }\n },\n [handleSubmit],\n );\n\n const handleCancel = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const getFormControl = (field: FormFieldDescriptor) => {\n const value = String(values?.[field.name] ?? \"\");\n if (field.readonly || field.name === keyField) {\n return (\n <div className={`${classBase}-fieldValue vuuReadOnly`}>{value}</div>\n );\n } else {\n return (\n <Input\n className={`${classBase}-fieldValue`}\n onBlur={handleBlur}\n onChange={handleChange}\n value={value}\n id={`${id}-input-${field.name}`}\n />\n );\n }\n };\n\n useEffect(() => {\n if (formContentRef.current) {\n const firstInput = formContentRef.current.querySelector(\n \"input\",\n ) as HTMLInputElement;\n if (firstInput) {\n setTimeout(() => {\n firstInput.focus();\n firstInput.select();\n }, 100);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n if (dataSource) {\n dataSource.unsubscribe();\n }\n };\n }, [dataSource]);\n\n const isDirty = dataStatusRef.current === Status.changed;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {errorMessage ? (\n <div\n className={`${classBase}-errorBanner`}\n data-icon=\"error\"\n title={errorMessage}\n >\n Error, edit(s) not saved\n </div>\n ) : undefined}\n <div\n className={`${classBase}-content`}\n ref={formContentRef}\n onKeyDown={handleKeyDown}\n >\n {fields.map((field) => (\n <FormField\n className={`${classBase}-field`}\n data-field={field.name}\n key={field.name}\n necessity={field.required ? \"required\" : \"optional\"}\n readOnly={field.readonly}\n validationStatus={\n fieldStatusValues[field.name] ? \"error\" : undefined\n }\n >\n <FormFieldLabel>{field?.label ?? field.description}</FormFieldLabel>\n {getFormControl(field)}\n <FormFieldHelperText>\n {fieldStatusValues[field.name] ?? \"\"}\n </FormFieldHelperText>\n </FormField>\n ))}\n </div>\n <div className={`${classBase}-buttonbar salt-theme salt-density-high`}>\n <Button\n type=\"submit\"\n variant=\"cta\"\n disabled={!isDirty}\n onClick={handleSubmit}\n >\n Submit\n </Button>\n <Button variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["values"],"mappings":"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"}