@vuu-ui/vuu-data-react 0.8.73 → 0.8.75

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.
@@ -3,10 +3,6 @@
3
3
  var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
4
4
  var react = require('react');
5
5
 
6
- const TYPEAHEAD_MESSAGE_CONSTANTS = {
7
- type: "RPC_CALL",
8
- service: "TypeAheadRpcHandler"
9
- };
10
6
  const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
11
7
  if (text !== "" && !selectedValues.includes(text.toLowerCase())) {
12
8
  return [table, column, text];
@@ -15,13 +11,15 @@ const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
15
11
  };
16
12
  const useTypeaheadSuggestions = () => react.useCallback(async (params) => {
17
13
  const rpcMessage = params.length === 2 ? {
14
+ type: "RPC_CALL",
15
+ service: "TypeAheadRpcHandler",
18
16
  method: "getUniqueFieldValues",
19
- params,
20
- ...TYPEAHEAD_MESSAGE_CONSTANTS
17
+ params
21
18
  } : {
19
+ type: "RPC_CALL",
20
+ service: "TypeAheadRpcHandler",
22
21
  method: "getUniqueFieldValuesStartingWith",
23
- params,
24
- ...TYPEAHEAD_MESSAGE_CONSTANTS
22
+ params
25
23
  };
26
24
  return vuuDataRemote.makeRpcCall(rpcMessage);
27
25
  }, []);
@@ -1 +1 @@
1
- {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["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"],"names":["useCallback","makeRpcCall"],"mappings":";;;;;AAUA,MAAM,2BAA8B,GAAA;AAAA,EAClC,IAAM,EAAA,UAAA;AAAA,EACN,OAAS,EAAA,qBAAA;AACX,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,KACA,EAAA,MAAA,EACA,OAAO,EACP,EAAA,cAAA,GAA2B,EACP,KAAA;AACpB,EAAI,IAAA,IAAA,KAAS,MAAM,CAAC,cAAA,CAAe,SAAS,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC/D,IAAO,OAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA,CAAA;AACvB,EAAA;AAEO,MAAM,uBAA0B,GAAA,MACrCA,iBAA+B,CAAA,OAAO,MAA4B,KAAA;AAChE,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACb,GAAA;AAAA,IACC,MAAQ,EAAA,sBAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAG,2BAAA;AAAA,GAEJ,GAAA;AAAA,IACC,MAAQ,EAAA,kCAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAG,2BAAA;AAAA,GACL,CAAA;AACN,EAAA,OAAOC,0BAAsB,UAAU,CAAA,CAAA;AACzC,CAAA,EAAG,EAAE;;;;;"}
1
+ {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerRpcRequest,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\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: ClientToServerRpcRequest =\n params.length === 2\n ? {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValues\",\n params,\n }\n : {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n };\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n"],"names":["useCallback","makeRpcCall"],"mappings":";;;;;AAQa,MAAA,kBAAA,GAAqB,CAChC,KACA,EAAA,MAAA,EACA,OAAO,EACP,EAAA,cAAA,GAA2B,EACP,KAAA;AACpB,EAAI,IAAA,IAAA,KAAS,MAAM,CAAC,cAAA,CAAe,SAAS,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC/D,IAAO,OAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA,CAAA;AACvB,EAAA;AAEO,MAAM,uBAA0B,GAAA,MACrCA,iBAA+B,CAAA,OAAO,MAA4B,KAAA;AAChE,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACd,GAAA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,OAAS,EAAA,qBAAA;AAAA,IACT,MAAQ,EAAA,sBAAA;AAAA,IACR,MAAA;AAAA,GAEF,GAAA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,OAAS,EAAA,qBAAA;AAAA,IACT,MAAQ,EAAA,kCAAA;AAAA,IACR,MAAA;AAAA,GACF,CAAA;AACN,EAAA,OAAOC,0BAAsB,UAAU,CAAA,CAAA;AACzC,CAAA,EAAG,EAAE;;;;;"}
@@ -1,13 +1,45 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
4
5
  var vuuPopups = require('@vuu-ui/vuu-popups');
5
- var vuuUtils = require('@vuu-ui/vuu-utils');
6
- var react = require('react');
6
+ var vuuShell = require('@vuu-ui/vuu-shell');
7
7
  var vuuTable = require('@vuu-ui/vuu-table');
8
+ var vuuUtils = require('@vuu-ui/vuu-utils');
8
9
  var core = require('@salt-ds/core');
10
+ var react = require('react');
9
11
 
10
12
  const NO_CONFIG = {};
13
+ const keyFirst = (c1, c2) => c1.isKeyField ? -1 : c2.isKeyField ? 1 : 0;
14
+ const defaultFormConfig = {
15
+ fields: [],
16
+ key: "",
17
+ title: ""
18
+ };
19
+ const configFromSchema = (schema) => {
20
+ if (schema) {
21
+ const { columns, key } = schema;
22
+ return {
23
+ key,
24
+ title: `Parameters for command`,
25
+ fields: columns.map((col) => ({
26
+ description: col.name,
27
+ label: col.name,
28
+ name: col.name,
29
+ type: col.serverDataType,
30
+ isKeyField: col.name === key
31
+ })).sort(keyFirst)
32
+ };
33
+ }
34
+ };
35
+ const getFormConfig = (action) => {
36
+ const { tableSchema: schema } = action;
37
+ const config = configFromSchema(schema) ?? defaultFormConfig;
38
+ return {
39
+ config,
40
+ schema
41
+ };
42
+ };
11
43
  const useVuuMenuActions = ({
12
44
  clientSideMenuActionHandler,
13
45
  dataSource,
@@ -47,6 +79,7 @@ const useVuuMenuActions = ({
47
79
  [dataSource, menuActionConfig]
48
80
  );
49
81
  const { showDialog, closeDialog } = vuuPopups.useDialogContext();
82
+ const showNotification = vuuPopups.useNotifications();
50
83
  const showBulkEditDialog = react.useCallback(
51
84
  (table) => {
52
85
  const sessionDs = dataSource.createSessionDataSource?.(table);
@@ -73,6 +106,40 @@ const useVuuMenuActions = ({
73
106
  },
74
107
  [closeDialog, dataSource, showDialog]
75
108
  );
109
+ const showSessionEditingForm = react.useCallback(
110
+ (action) => {
111
+ const { tableSchema } = action;
112
+ if (tableSchema) {
113
+ const formConfig = getFormConfig(action);
114
+ showDialog(
115
+ /* @__PURE__ */ jsxRuntime.jsx(vuuShell.SessionEditingForm, { ...formConfig, onClose: closeDialog }),
116
+ "Set Parameters"
117
+ );
118
+ }
119
+ const sessionDs = dataSource.createSessionDataSource?.(action.table);
120
+ const handleSubmit = () => {
121
+ sessionDs?.rpcCall?.({
122
+ namedParams: {},
123
+ params: [],
124
+ rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
125
+ type: "VIEW_PORT_RPC_CALL"
126
+ });
127
+ closeDialog();
128
+ };
129
+ if (sessionDs) {
130
+ showDialog(
131
+ /* @__PURE__ */ jsxRuntime.jsx(vuuTable.BulkEditPanel, { dataSource: sessionDs, onSubmit: handleSubmit }),
132
+ "Multi Row Edit",
133
+ [
134
+ /* @__PURE__ */ jsxRuntime.jsx(core.Button, { onClick: closeDialog, children: "Cancel" }, "cancel"),
135
+ /* @__PURE__ */ jsxRuntime.jsx(core.Button, { onClick: handleSubmit, children: "Save" }, "submit")
136
+ ]
137
+ );
138
+ return true;
139
+ }
140
+ },
141
+ [closeDialog, dataSource, showDialog]
142
+ );
76
143
  const handleMenuAction = react.useCallback(
77
144
  ({ menuId, options }) => {
78
145
  if (clientSideMenuActionHandler?.(menuId, options)) {
@@ -84,8 +151,21 @@ const useVuuMenuActions = ({
84
151
  if (onRpcResponse?.(rpcResponse) === true) {
85
152
  return true;
86
153
  }
87
- if (vuuUtils.isOpenBulkEditResponse(rpcResponse) && rpcResponse.action.table) {
88
- showBulkEditDialog(rpcResponse.action.table);
154
+ if (vuuUtils.hasAction(rpcResponse)) {
155
+ if (vuuUtils.hasShowNotificationAction(rpcResponse)) {
156
+ const {
157
+ action: { message, title = "Success" }
158
+ } = rpcResponse;
159
+ showNotification({
160
+ type: "success",
161
+ body: message,
162
+ header: title
163
+ });
164
+ } else if (vuuUtils.isOpenBulkEditResponse(rpcResponse)) {
165
+ showBulkEditDialog(rpcResponse.action.table);
166
+ } else if (vuuDataRemote.isSessionTableActionMessage(rpcResponse)) {
167
+ showSessionEditingForm(rpcResponse.action);
168
+ }
89
169
  }
90
170
  }
91
171
  });
@@ -99,7 +179,14 @@ const useVuuMenuActions = ({
99
179
  }
100
180
  return false;
101
181
  },
102
- [clientSideMenuActionHandler, dataSource, onRpcResponse, showBulkEditDialog]
182
+ [
183
+ clientSideMenuActionHandler,
184
+ dataSource,
185
+ onRpcResponse,
186
+ showBulkEditDialog,
187
+ showNotification,
188
+ showSessionEditingForm
189
+ ]
103
190
  );
104
191
  return {
105
192
  buildViewserverMenuOptions,
@@ -1 +1 @@
1
- {"version":3,"file":"useVuuMenuActions.js","sources":["../../src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n RpcResponseHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n useDialogContext,\n type MenuActionClosePopup,\n} from \"@vuu-ui/vuu-popups\";\nimport type {\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuItem,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n VuuServerMenuOptions,\n buildMenuDescriptorFromVuuMenu,\n getMenuRpcRequest,\n isGroupMenuItemDescriptor,\n isOpenBulkEditResponse,\n isRoot,\n isTableLocation,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\nimport { BulkEditPanel } from \"@vuu-ui/vuu-table\";\nimport { Button } from \"@salt-ds/core\";\n\nconst NO_CONFIG: MenuActionConfig = {};\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 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\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 = buildMenuDescriptorFromVuuMenu(\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 { showDialog, closeDialog } = useDialogContext();\n\n const showBulkEditDialog = useCallback(\n (table: VuuTable) => {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\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\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (rpcResponse) {\n if (onRpcResponse?.(rpcResponse) === true) {\n return true;\n }\n\n if (\n isOpenBulkEditResponse(rpcResponse) &&\n rpcResponse.action.table\n ) {\n showBulkEditDialog(rpcResponse.action.table);\n }\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, showBulkEditDialog]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n"],"names":["useCallback","isTableLocation","buildMenuDescriptorFromVuuMenu","isRoot","isGroupMenuItemDescriptor","useDialogContext","jsx","BulkEditPanel","Button","getMenuRpcRequest","isOpenBulkEditResponse"],"mappings":"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"}
1
+ {"version":3,"file":"useVuuMenuActions.js","sources":["../../src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import { isSessionTableActionMessage } from \"@vuu-ui/vuu-data-remote\";\nimport {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n RpcResponseHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n useDialogContext,\n useNotifications,\n type MenuActionClosePopup,\n} from \"@vuu-ui/vuu-popups\";\nimport type {\n LinkDescriptorWithLabel,\n OpenDialogAction,\n VuuMenu,\n VuuMenuItem,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n FormConfig,\n FormFieldDescriptor,\n SessionEditingForm,\n} from \"@vuu-ui/vuu-shell\";\nimport { BulkEditPanel } from \"@vuu-ui/vuu-table\";\nimport {\n VuuServerMenuOptions,\n buildMenuDescriptorFromVuuMenu,\n getMenuRpcRequest,\n hasAction,\n hasShowNotificationAction,\n isGroupMenuItemDescriptor,\n isOpenBulkEditResponse,\n isRoot,\n isTableLocation,\n} from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useCallback } from \"react\";\n\nconst NO_CONFIG: MenuActionConfig = {};\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 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\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 // if (rpcName !== undefined && rpcName in static_config) {\n // return {\n // config: getStaticConfig(rpcName, config),\n // schema,\n // };\n // }\n\n return {\n config,\n schema,\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 = buildMenuDescriptorFromVuuMenu(\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 { showDialog, closeDialog } = useDialogContext();\n const showNotification = useNotifications();\n\n const showBulkEditDialog = useCallback(\n (table: VuuTable) => {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\n );\n\n const showSessionEditingForm = useCallback(\n (action: OpenDialogAction & { tableSchema: TableSchema }) => {\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 const sessionDs = dataSource.createSessionDataSource?.(action.table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\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\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (rpcResponse) {\n if (onRpcResponse?.(rpcResponse) === true) {\n return true;\n }\n if (hasAction(rpcResponse)) {\n if (hasShowNotificationAction(rpcResponse)) {\n const {\n action: { message, title = \"Success\" },\n } = rpcResponse;\n showNotification({\n type: \"success\",\n body: message,\n header: title,\n });\n } else if (isOpenBulkEditResponse(rpcResponse)) {\n showBulkEditDialog(rpcResponse.action.table);\n } else if (isSessionTableActionMessage(rpcResponse)) {\n showSessionEditingForm(rpcResponse.action);\n }\n }\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\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 [\n clientSideMenuActionHandler,\n dataSource,\n onRpcResponse,\n showBulkEditDialog,\n showNotification,\n showSessionEditingForm,\n ]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n"],"names":["useCallback","isTableLocation","buildMenuDescriptorFromVuuMenu","isRoot","isGroupMenuItemDescriptor","useDialogContext","useNotifications","jsx","BulkEditPanel","Button","SessionEditingForm","getMenuRpcRequest","hasAction","hasShowNotificationAction","isOpenBulkEditResponse","isSessionTableActionMessage"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var dateEditingUtils = require('./data-editing/date-editing-utils.js');
4
- var useDataSource = require('./hooks/useDataSource.js');
5
4
  var useLookupValues = require('./hooks/useLookupValues.js');
6
5
  var useServerConnectionStatus = require('./hooks/useServerConnectionStatus.js');
7
6
  var useServerConnectionQuality = require('./hooks/useServerConnectionQuality.js');
@@ -12,8 +11,6 @@ var useVuuTables = require('./hooks/useVuuTables.js');
12
11
 
13
12
 
14
13
  exports.getDataItemEditControl = dateEditingUtils.getDataItemEditControl;
15
- exports.MovingWindow = useDataSource.MovingWindow;
16
- exports.useDataSource = useDataSource.useDataSource;
17
14
  exports.useLookupValues = useLookupValues.useLookupValues;
18
15
  exports.useServerConnectionStatus = useServerConnectionStatus.useServerConnectionStatus;
19
16
  exports.useServerConnectionQuality = useServerConnectionQuality.useServerConnectionQuality;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
@@ -1,10 +1,6 @@
1
1
  import { makeRpcCall } from '@vuu-ui/vuu-data-remote';
2
2
  import { useCallback } from 'react';
3
3
 
4
- const TYPEAHEAD_MESSAGE_CONSTANTS = {
5
- type: "RPC_CALL",
6
- service: "TypeAheadRpcHandler"
7
- };
8
4
  const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
9
5
  if (text !== "" && !selectedValues.includes(text.toLowerCase())) {
10
6
  return [table, column, text];
@@ -13,13 +9,15 @@ const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
13
9
  };
14
10
  const useTypeaheadSuggestions = () => useCallback(async (params) => {
15
11
  const rpcMessage = params.length === 2 ? {
12
+ type: "RPC_CALL",
13
+ service: "TypeAheadRpcHandler",
16
14
  method: "getUniqueFieldValues",
17
- params,
18
- ...TYPEAHEAD_MESSAGE_CONSTANTS
15
+ params
19
16
  } : {
17
+ type: "RPC_CALL",
18
+ service: "TypeAheadRpcHandler",
20
19
  method: "getUniqueFieldValuesStartingWith",
21
- params,
22
- ...TYPEAHEAD_MESSAGE_CONSTANTS
20
+ params
23
21
  };
24
22
  return makeRpcCall(rpcMessage);
25
23
  }, []);
@@ -1 +1 @@
1
- {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["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"],"names":[],"mappings":";;;AAUA,MAAM,2BAA8B,GAAA;AAAA,EAClC,IAAM,EAAA,UAAA;AAAA,EACN,OAAS,EAAA,qBAAA;AACX,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,KACA,EAAA,MAAA,EACA,OAAO,EACP,EAAA,cAAA,GAA2B,EACP,KAAA;AACpB,EAAI,IAAA,IAAA,KAAS,MAAM,CAAC,cAAA,CAAe,SAAS,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC/D,IAAO,OAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA,CAAA;AACvB,EAAA;AAEO,MAAM,uBAA0B,GAAA,MACrC,WAA+B,CAAA,OAAO,MAA4B,KAAA;AAChE,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACb,GAAA;AAAA,IACC,MAAQ,EAAA,sBAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAG,2BAAA;AAAA,GAEJ,GAAA;AAAA,IACC,MAAQ,EAAA,kCAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAG,2BAAA;AAAA,GACL,CAAA;AACN,EAAA,OAAO,YAAsB,UAAU,CAAA,CAAA;AACzC,CAAA,EAAG,EAAE;;;;"}
1
+ {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["import { makeRpcCall } from \"@vuu-ui/vuu-data-remote\";\nimport { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerRpcRequest,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback } from \"react\";\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: ClientToServerRpcRequest =\n params.length === 2\n ? {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValues\",\n params,\n }\n : {\n type: \"RPC_CALL\",\n service: \"TypeAheadRpcHandler\",\n method: \"getUniqueFieldValuesStartingWith\",\n params,\n };\n return makeRpcCall<string[]>(rpcMessage);\n }, []);\n"],"names":[],"mappings":";;;AAQa,MAAA,kBAAA,GAAqB,CAChC,KACA,EAAA,MAAA,EACA,OAAO,EACP,EAAA,cAAA,GAA2B,EACP,KAAA;AACpB,EAAI,IAAA,IAAA,KAAS,MAAM,CAAC,cAAA,CAAe,SAAS,IAAK,CAAA,WAAA,EAAa,CAAG,EAAA;AAC/D,IAAO,OAAA,CAAC,KAAO,EAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA,CAAA;AACvB,EAAA;AAEO,MAAM,uBAA0B,GAAA,MACrC,WAA+B,CAAA,OAAO,MAA4B,KAAA;AAChE,EAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACd,GAAA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,OAAS,EAAA,qBAAA;AAAA,IACT,MAAQ,EAAA,sBAAA;AAAA,IACR,MAAA;AAAA,GAEF,GAAA;AAAA,IACE,IAAM,EAAA,UAAA;AAAA,IACN,OAAS,EAAA,qBAAA;AAAA,IACT,MAAQ,EAAA,kCAAA;AAAA,IACR,MAAA;AAAA,GACF,CAAA;AACN,EAAA,OAAO,YAAsB,UAAU,CAAA,CAAA;AACzC,CAAA,EAAG,EAAE;;;;"}
@@ -1,11 +1,43 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { useDialogContext } from '@vuu-ui/vuu-popups';
3
- import { isTableLocation, buildMenuDescriptorFromVuuMenu, isRoot, isGroupMenuItemDescriptor, getMenuRpcRequest, isOpenBulkEditResponse } from '@vuu-ui/vuu-utils';
4
- import { useCallback } from 'react';
2
+ import { isSessionTableActionMessage } from '@vuu-ui/vuu-data-remote';
3
+ import { useDialogContext, useNotifications } from '@vuu-ui/vuu-popups';
4
+ import { SessionEditingForm } from '@vuu-ui/vuu-shell';
5
5
  import { BulkEditPanel } from '@vuu-ui/vuu-table';
6
+ import { isTableLocation, buildMenuDescriptorFromVuuMenu, isRoot, isGroupMenuItemDescriptor, getMenuRpcRequest, hasAction, hasShowNotificationAction, isOpenBulkEditResponse } from '@vuu-ui/vuu-utils';
6
7
  import { Button } from '@salt-ds/core';
8
+ import { useCallback } from 'react';
7
9
 
8
10
  const NO_CONFIG = {};
11
+ const keyFirst = (c1, c2) => c1.isKeyField ? -1 : c2.isKeyField ? 1 : 0;
12
+ const defaultFormConfig = {
13
+ fields: [],
14
+ key: "",
15
+ title: ""
16
+ };
17
+ const configFromSchema = (schema) => {
18
+ if (schema) {
19
+ const { columns, key } = schema;
20
+ return {
21
+ key,
22
+ title: `Parameters for command`,
23
+ fields: columns.map((col) => ({
24
+ description: col.name,
25
+ label: col.name,
26
+ name: col.name,
27
+ type: col.serverDataType,
28
+ isKeyField: col.name === key
29
+ })).sort(keyFirst)
30
+ };
31
+ }
32
+ };
33
+ const getFormConfig = (action) => {
34
+ const { tableSchema: schema } = action;
35
+ const config = configFromSchema(schema) ?? defaultFormConfig;
36
+ return {
37
+ config,
38
+ schema
39
+ };
40
+ };
9
41
  const useVuuMenuActions = ({
10
42
  clientSideMenuActionHandler,
11
43
  dataSource,
@@ -45,6 +77,7 @@ const useVuuMenuActions = ({
45
77
  [dataSource, menuActionConfig]
46
78
  );
47
79
  const { showDialog, closeDialog } = useDialogContext();
80
+ const showNotification = useNotifications();
48
81
  const showBulkEditDialog = useCallback(
49
82
  (table) => {
50
83
  const sessionDs = dataSource.createSessionDataSource?.(table);
@@ -71,6 +104,40 @@ const useVuuMenuActions = ({
71
104
  },
72
105
  [closeDialog, dataSource, showDialog]
73
106
  );
107
+ const showSessionEditingForm = useCallback(
108
+ (action) => {
109
+ const { tableSchema } = action;
110
+ if (tableSchema) {
111
+ const formConfig = getFormConfig(action);
112
+ showDialog(
113
+ /* @__PURE__ */ jsx(SessionEditingForm, { ...formConfig, onClose: closeDialog }),
114
+ "Set Parameters"
115
+ );
116
+ }
117
+ const sessionDs = dataSource.createSessionDataSource?.(action.table);
118
+ const handleSubmit = () => {
119
+ sessionDs?.rpcCall?.({
120
+ namedParams: {},
121
+ params: [],
122
+ rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
123
+ type: "VIEW_PORT_RPC_CALL"
124
+ });
125
+ closeDialog();
126
+ };
127
+ if (sessionDs) {
128
+ showDialog(
129
+ /* @__PURE__ */ jsx(BulkEditPanel, { dataSource: sessionDs, onSubmit: handleSubmit }),
130
+ "Multi Row Edit",
131
+ [
132
+ /* @__PURE__ */ jsx(Button, { onClick: closeDialog, children: "Cancel" }, "cancel"),
133
+ /* @__PURE__ */ jsx(Button, { onClick: handleSubmit, children: "Save" }, "submit")
134
+ ]
135
+ );
136
+ return true;
137
+ }
138
+ },
139
+ [closeDialog, dataSource, showDialog]
140
+ );
74
141
  const handleMenuAction = useCallback(
75
142
  ({ menuId, options }) => {
76
143
  if (clientSideMenuActionHandler?.(menuId, options)) {
@@ -82,8 +149,21 @@ const useVuuMenuActions = ({
82
149
  if (onRpcResponse?.(rpcResponse) === true) {
83
150
  return true;
84
151
  }
85
- if (isOpenBulkEditResponse(rpcResponse) && rpcResponse.action.table) {
86
- showBulkEditDialog(rpcResponse.action.table);
152
+ if (hasAction(rpcResponse)) {
153
+ if (hasShowNotificationAction(rpcResponse)) {
154
+ const {
155
+ action: { message, title = "Success" }
156
+ } = rpcResponse;
157
+ showNotification({
158
+ type: "success",
159
+ body: message,
160
+ header: title
161
+ });
162
+ } else if (isOpenBulkEditResponse(rpcResponse)) {
163
+ showBulkEditDialog(rpcResponse.action.table);
164
+ } else if (isSessionTableActionMessage(rpcResponse)) {
165
+ showSessionEditingForm(rpcResponse.action);
166
+ }
87
167
  }
88
168
  }
89
169
  });
@@ -97,7 +177,14 @@ const useVuuMenuActions = ({
97
177
  }
98
178
  return false;
99
179
  },
100
- [clientSideMenuActionHandler, dataSource, onRpcResponse, showBulkEditDialog]
180
+ [
181
+ clientSideMenuActionHandler,
182
+ dataSource,
183
+ onRpcResponse,
184
+ showBulkEditDialog,
185
+ showNotification,
186
+ showSessionEditingForm
187
+ ]
101
188
  );
102
189
  return {
103
190
  buildViewserverMenuOptions,
@@ -1 +1 @@
1
- {"version":3,"file":"useVuuMenuActions.js","sources":["../../src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n RpcResponseHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n useDialogContext,\n type MenuActionClosePopup,\n} from \"@vuu-ui/vuu-popups\";\nimport type {\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuMenuItem,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n VuuServerMenuOptions,\n buildMenuDescriptorFromVuuMenu,\n getMenuRpcRequest,\n isGroupMenuItemDescriptor,\n isOpenBulkEditResponse,\n isRoot,\n isTableLocation,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\nimport { BulkEditPanel } from \"@vuu-ui/vuu-table\";\nimport { Button } from \"@salt-ds/core\";\n\nconst NO_CONFIG: MenuActionConfig = {};\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 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\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 = buildMenuDescriptorFromVuuMenu(\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 { showDialog, closeDialog } = useDialogContext();\n\n const showBulkEditDialog = useCallback(\n (table: VuuTable) => {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\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\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (rpcResponse) {\n if (onRpcResponse?.(rpcResponse) === true) {\n return true;\n }\n\n if (\n isOpenBulkEditResponse(rpcResponse) &&\n rpcResponse.action.table\n ) {\n showBulkEditDialog(rpcResponse.action.table);\n }\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, showBulkEditDialog]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useVuuMenuActions.js","sources":["../../src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import { isSessionTableActionMessage } from \"@vuu-ui/vuu-data-remote\";\nimport {\n ContextMenuItemDescriptor,\n DataSource,\n DataSourceVisualLinkCreatedMessage,\n MenuActionHandler,\n MenuBuilder,\n RpcResponseHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n useDialogContext,\n useNotifications,\n type MenuActionClosePopup,\n} from \"@vuu-ui/vuu-popups\";\nimport type {\n LinkDescriptorWithLabel,\n OpenDialogAction,\n VuuMenu,\n VuuMenuItem,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n FormConfig,\n FormFieldDescriptor,\n SessionEditingForm,\n} from \"@vuu-ui/vuu-shell\";\nimport { BulkEditPanel } from \"@vuu-ui/vuu-table\";\nimport {\n VuuServerMenuOptions,\n buildMenuDescriptorFromVuuMenu,\n getMenuRpcRequest,\n hasAction,\n hasShowNotificationAction,\n isGroupMenuItemDescriptor,\n isOpenBulkEditResponse,\n isRoot,\n isTableLocation,\n} from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useCallback } from \"react\";\n\nconst NO_CONFIG: MenuActionConfig = {};\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 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\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 // if (rpcName !== undefined && rpcName in static_config) {\n // return {\n // config: getStaticConfig(rpcName, config),\n // schema,\n // };\n // }\n\n return {\n config,\n schema,\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 = buildMenuDescriptorFromVuuMenu(\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 { showDialog, closeDialog } = useDialogContext();\n const showNotification = useNotifications();\n\n const showBulkEditDialog = useCallback(\n (table: VuuTable) => {\n const sessionDs = dataSource.createSessionDataSource?.(table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\n );\n\n const showSessionEditingForm = useCallback(\n (action: OpenDialogAction & { tableSchema: TableSchema }) => {\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 const sessionDs = dataSource.createSessionDataSource?.(action.table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.({\n namedParams: {},\n params: [],\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_RPC_CALL\",\n });\n closeDialog();\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel dataSource={sessionDs} onSubmit={handleSubmit} />,\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 return true;\n }\n },\n [closeDialog, dataSource, showDialog]\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\n dataSource.menuRpcCall(rpcRequest).then((rpcResponse) => {\n if (rpcResponse) {\n if (onRpcResponse?.(rpcResponse) === true) {\n return true;\n }\n if (hasAction(rpcResponse)) {\n if (hasShowNotificationAction(rpcResponse)) {\n const {\n action: { message, title = \"Success\" },\n } = rpcResponse;\n showNotification({\n type: \"success\",\n body: message,\n header: title,\n });\n } else if (isOpenBulkEditResponse(rpcResponse)) {\n showBulkEditDialog(rpcResponse.action.table);\n } else if (isSessionTableActionMessage(rpcResponse)) {\n showSessionEditingForm(rpcResponse.action);\n }\n }\n }\n });\n return true;\n } else if (menuId === \"link-table\") {\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 [\n clientSideMenuActionHandler,\n dataSource,\n onRpcResponse,\n showBulkEditDialog,\n showNotification,\n showSessionEditingForm,\n ]\n );\n\n return {\n buildViewserverMenuOptions,\n handleMenuAction,\n };\n};\n"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  export { getDataItemEditControl } from './data-editing/date-editing-utils.js';
2
- export { MovingWindow, useDataSource } from './hooks/useDataSource.js';
3
2
  export { useLookupValues } from './hooks/useLookupValues.js';
4
3
  export { useServerConnectionStatus } from './hooks/useServerConnectionStatus.js';
5
4
  export { useServerConnectionQuality } from './hooks/useServerConnectionQuality.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
- "version": "0.8.73",
2
+ "version": "0.8.75",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-data-types": "0.8.73",
7
- "@vuu-ui/vuu-filter-types": "0.8.73",
8
- "@vuu-ui/vuu-popups": "0.8.73",
9
- "@vuu-ui/vuu-protocol-types": "0.8.73",
10
- "@vuu-ui/vuu-table-types": "0.8.73"
6
+ "@vuu-ui/vuu-data-types": "0.8.75",
7
+ "@vuu-ui/vuu-filter-types": "0.8.75",
8
+ "@vuu-ui/vuu-popups": "0.8.75",
9
+ "@vuu-ui/vuu-protocol-types": "0.8.75",
10
+ "@vuu-ui/vuu-table-types": "0.8.75"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-data-remote": "0.8.73",
14
- "@vuu-ui/vuu-filter-parser": "0.8.73",
15
- "@vuu-ui/vuu-popups": "0.8.73",
16
- "@vuu-ui/vuu-shell": "0.8.73",
17
- "@vuu-ui/vuu-ui-controls": "0.8.73",
18
- "@vuu-ui/vuu-utils": "0.8.73",
19
- "@vuu-ui/vuu-table": "0.8.73",
13
+ "@vuu-ui/vuu-data-remote": "0.8.75",
14
+ "@vuu-ui/vuu-filter-parser": "0.8.75",
15
+ "@vuu-ui/vuu-popups": "0.8.75",
16
+ "@vuu-ui/vuu-shell": "0.8.75",
17
+ "@vuu-ui/vuu-ui-controls": "0.8.75",
18
+ "@vuu-ui/vuu-utils": "0.8.75",
19
+ "@vuu-ui/vuu-table": "0.8.75",
20
20
  "@salt-ds/core": "1.27.1"
21
21
  },
22
22
  "peerDependencies": {
@@ -1,4 +1,3 @@
1
- export * from "./useDataSource";
2
1
  export * from "./useLookupValues";
3
2
  export * from "./useServerConnectionStatus";
4
3
  export * from "./useServerConnectionQuality";
@@ -1,148 +0,0 @@
1
- 'use strict';
2
-
3
- var vuuUtils = require('@vuu-ui/vuu-utils');
4
- var react = require('react');
5
-
6
- const { SELECTED } = vuuUtils.metadataKeys;
7
- function useDataSource({
8
- dataSource,
9
- renderBufferSize = 10
10
- }) {
11
- const [, forceUpdate] = react.useState(null);
12
- const isMounted = react.useRef(true);
13
- const hasUpdated = react.useRef(false);
14
- const rafHandle = react.useRef(null);
15
- const data = react.useRef([]);
16
- const rangeRef = react.useRef({ from: 0, to: 10 });
17
- const dataWindow = react.useMemo(
18
- () => new MovingWindow(vuuUtils.getFullRange(rangeRef.current, renderBufferSize)),
19
- [renderBufferSize]
20
- );
21
- const setData = react.useCallback(
22
- (updates) => {
23
- for (const row of updates) {
24
- dataWindow.add(row);
25
- }
26
- data.current = dataWindow.data.slice();
27
- hasUpdated.current = true;
28
- },
29
- [dataWindow]
30
- );
31
- const datasourceMessageHandler = react.useCallback(
32
- (message) => {
33
- if (message.type === "viewport-update") {
34
- if (message.size !== void 0) {
35
- dataWindow.setRowCount(message.size);
36
- }
37
- if (message.rows) {
38
- setData(message.rows);
39
- forceUpdate({});
40
- } else if (message.size !== void 0) {
41
- data.current = dataWindow.data.slice();
42
- hasUpdated.current = true;
43
- }
44
- }
45
- },
46
- [dataWindow, setData]
47
- );
48
- react.useEffect(
49
- () => () => {
50
- if (rafHandle.current) {
51
- cancelAnimationFrame(rafHandle.current);
52
- rafHandle.current = null;
53
- }
54
- isMounted.current = false;
55
- },
56
- []
57
- );
58
- const setRange = react.useCallback(
59
- (range) => {
60
- rangeRef.current = range;
61
- const fullRange = vuuUtils.getFullRange(rangeRef.current, renderBufferSize);
62
- dataSource.range = fullRange;
63
- dataWindow.setRange(fullRange.from, fullRange.to);
64
- },
65
- [dataSource, dataWindow, renderBufferSize]
66
- );
67
- react.useMemo(() => {
68
- const { from, to } = rangeRef.current;
69
- const fullRange = vuuUtils.getFullRange({ from, to }, renderBufferSize);
70
- dataSource.range = fullRange;
71
- dataWindow.setRange(fullRange.from, fullRange.to);
72
- }, [dataSource, dataWindow, renderBufferSize]);
73
- react.useEffect(() => {
74
- const { from, to } = vuuUtils.getFullRange(rangeRef.current, renderBufferSize);
75
- dataSource.subscribe(
76
- {
77
- range: { from, to }
78
- },
79
- datasourceMessageHandler
80
- );
81
- }, [dataSource, datasourceMessageHandler, renderBufferSize]);
82
- react.useEffect(
83
- () => () => {
84
- dataSource.unsubscribe();
85
- },
86
- [dataSource]
87
- );
88
- return [
89
- data.current,
90
- dataWindow.rowCount,
91
- vuuUtils.getFullRange(rangeRef.current, renderBufferSize),
92
- setRange
93
- ];
94
- }
95
- class MovingWindow {
96
- constructor({ from, to }) {
97
- this.rowCount = 0;
98
- this.setRowCount = (rowCount) => {
99
- if (rowCount < this.data.length) {
100
- this.data.length = rowCount;
101
- }
102
- this.rowCount = rowCount;
103
- };
104
- this.range = new vuuUtils.WindowRange(from, to);
105
- this.data = new Array(to - from);
106
- }
107
- add(data) {
108
- const [index] = data;
109
- if (this.isWithinRange(index)) {
110
- const internalIndex = index - this.range.from;
111
- this.data[internalIndex] = data;
112
- if (this.data[internalIndex - 1]) {
113
- if (this.data[internalIndex - 1][SELECTED] === 1 && data[SELECTED] === 0) {
114
- data[SELECTED] = 2;
115
- }
116
- }
117
- if (index === this.rowCount - 1) {
118
- this.data.length = internalIndex + 1;
119
- }
120
- }
121
- }
122
- getAtIndex(index) {
123
- return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
124
- }
125
- isWithinRange(index) {
126
- return this.range.isWithin(index);
127
- }
128
- setRange(from, to) {
129
- if (from !== this.range.from || to !== this.range.to) {
130
- const [overlapFrom, overlapTo] = this.range.overlap(from, to);
131
- const newData = new Array(to - from);
132
- for (let i = overlapFrom; i < overlapTo; i++) {
133
- const data = this.getAtIndex(i);
134
- if (data) {
135
- const index = i - from;
136
- newData[index] = data;
137
- }
138
- }
139
- this.data = newData;
140
- this.range.from = from;
141
- this.range.to = to;
142
- }
143
- }
144
- }
145
-
146
- exports.MovingWindow = MovingWindow;
147
- exports.useDataSource = useDataSource;
148
- //# sourceMappingURL=useDataSource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDataSource.js","sources":["../../src/hooks/useDataSource.ts"],"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"],"names":["metadataKeys","useState","useRef","useMemo","getFullRange","useCallback","useEffect","WindowRange"],"mappings":"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"}
@@ -1,145 +0,0 @@
1
- import { getFullRange, WindowRange, metadataKeys } from '@vuu-ui/vuu-utils';
2
- import { useState, useRef, useMemo, useCallback, useEffect } from 'react';
3
-
4
- const { SELECTED } = metadataKeys;
5
- function useDataSource({
6
- dataSource,
7
- renderBufferSize = 10
8
- }) {
9
- const [, forceUpdate] = useState(null);
10
- const isMounted = useRef(true);
11
- const hasUpdated = useRef(false);
12
- const rafHandle = useRef(null);
13
- const data = useRef([]);
14
- const rangeRef = useRef({ from: 0, to: 10 });
15
- const dataWindow = useMemo(
16
- () => new MovingWindow(getFullRange(rangeRef.current, renderBufferSize)),
17
- [renderBufferSize]
18
- );
19
- const setData = useCallback(
20
- (updates) => {
21
- for (const row of updates) {
22
- dataWindow.add(row);
23
- }
24
- data.current = dataWindow.data.slice();
25
- hasUpdated.current = true;
26
- },
27
- [dataWindow]
28
- );
29
- const datasourceMessageHandler = useCallback(
30
- (message) => {
31
- if (message.type === "viewport-update") {
32
- if (message.size !== void 0) {
33
- dataWindow.setRowCount(message.size);
34
- }
35
- if (message.rows) {
36
- setData(message.rows);
37
- forceUpdate({});
38
- } else if (message.size !== void 0) {
39
- data.current = dataWindow.data.slice();
40
- hasUpdated.current = true;
41
- }
42
- }
43
- },
44
- [dataWindow, setData]
45
- );
46
- useEffect(
47
- () => () => {
48
- if (rafHandle.current) {
49
- cancelAnimationFrame(rafHandle.current);
50
- rafHandle.current = null;
51
- }
52
- isMounted.current = false;
53
- },
54
- []
55
- );
56
- const setRange = useCallback(
57
- (range) => {
58
- rangeRef.current = range;
59
- const fullRange = getFullRange(rangeRef.current, renderBufferSize);
60
- dataSource.range = fullRange;
61
- dataWindow.setRange(fullRange.from, fullRange.to);
62
- },
63
- [dataSource, dataWindow, renderBufferSize]
64
- );
65
- useMemo(() => {
66
- const { from, to } = rangeRef.current;
67
- const fullRange = getFullRange({ from, to }, renderBufferSize);
68
- dataSource.range = fullRange;
69
- dataWindow.setRange(fullRange.from, fullRange.to);
70
- }, [dataSource, dataWindow, renderBufferSize]);
71
- useEffect(() => {
72
- const { from, to } = getFullRange(rangeRef.current, renderBufferSize);
73
- dataSource.subscribe(
74
- {
75
- range: { from, to }
76
- },
77
- datasourceMessageHandler
78
- );
79
- }, [dataSource, datasourceMessageHandler, renderBufferSize]);
80
- useEffect(
81
- () => () => {
82
- dataSource.unsubscribe();
83
- },
84
- [dataSource]
85
- );
86
- return [
87
- data.current,
88
- dataWindow.rowCount,
89
- getFullRange(rangeRef.current, renderBufferSize),
90
- setRange
91
- ];
92
- }
93
- class MovingWindow {
94
- constructor({ from, to }) {
95
- this.rowCount = 0;
96
- this.setRowCount = (rowCount) => {
97
- if (rowCount < this.data.length) {
98
- this.data.length = rowCount;
99
- }
100
- this.rowCount = rowCount;
101
- };
102
- this.range = new WindowRange(from, to);
103
- this.data = new Array(to - from);
104
- }
105
- add(data) {
106
- const [index] = data;
107
- if (this.isWithinRange(index)) {
108
- const internalIndex = index - this.range.from;
109
- this.data[internalIndex] = data;
110
- if (this.data[internalIndex - 1]) {
111
- if (this.data[internalIndex - 1][SELECTED] === 1 && data[SELECTED] === 0) {
112
- data[SELECTED] = 2;
113
- }
114
- }
115
- if (index === this.rowCount - 1) {
116
- this.data.length = internalIndex + 1;
117
- }
118
- }
119
- }
120
- getAtIndex(index) {
121
- return this.range.isWithin(index) && this.data[index - this.range.from] != null ? this.data[index - this.range.from] : void 0;
122
- }
123
- isWithinRange(index) {
124
- return this.range.isWithin(index);
125
- }
126
- setRange(from, to) {
127
- if (from !== this.range.from || to !== this.range.to) {
128
- const [overlapFrom, overlapTo] = this.range.overlap(from, to);
129
- const newData = new Array(to - from);
130
- for (let i = overlapFrom; i < overlapTo; i++) {
131
- const data = this.getAtIndex(i);
132
- if (data) {
133
- const index = i - from;
134
- newData[index] = data;
135
- }
136
- }
137
- this.data = newData;
138
- this.range.from = from;
139
- this.range.to = to;
140
- }
141
- }
142
- }
143
-
144
- export { MovingWindow, useDataSource };
145
- //# sourceMappingURL=useDataSource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDataSource.js","sources":["../../src/hooks/useDataSource.ts"],"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"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { DataSource, DataSourceRow } from "@vuu-ui/vuu-data-types";
2
- import type { VuuRange } from "@vuu-ui/vuu-protocol-types";
3
- export interface DataSourceHookProps {
4
- dataSource: DataSource;
5
- renderBufferSize?: number;
6
- }
7
- export declare function useDataSource({ dataSource, renderBufferSize, }: DataSourceHookProps): [
8
- DataSourceRow[],
9
- number,
10
- VuuRange,
11
- (range: VuuRange) => void
12
- ];
13
- export declare class MovingWindow {
14
- data: DataSourceRow[];
15
- rowCount: number;
16
- private range;
17
- constructor({ from, to }: VuuRange);
18
- setRowCount: (rowCount: number) => void;
19
- add(data: DataSourceRow): void;
20
- getAtIndex(index: number): DataSourceRow | undefined;
21
- isWithinRange(index: number): boolean;
22
- setRange(from: number, to: number): void;
23
- }