@vuu-ui/vuu-data-react 0.13.6 → 0.13.8

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 (85) hide show
  1. package/cjs/index.js +1556 -40
  2. package/cjs/index.js.map +1 -1
  3. package/esm/index.js +1535 -15
  4. package/esm/index.js.map +1 -1
  5. package/package.json +14 -14
  6. package/cjs/data-editing/EditForm.css.js +0 -6
  7. package/cjs/data-editing/EditForm.css.js.map +0 -1
  8. package/cjs/data-editing/EditForm.js +0 -90
  9. package/cjs/data-editing/EditForm.js.map +0 -1
  10. package/cjs/data-editing/UnsavedChangesReport.css.js +0 -6
  11. package/cjs/data-editing/UnsavedChangesReport.css.js.map +0 -1
  12. package/cjs/data-editing/UnsavedChangesReport.js +0 -29
  13. package/cjs/data-editing/UnsavedChangesReport.js.map +0 -1
  14. package/cjs/data-editing/edit-rule-validation-checker.js +0 -41
  15. package/cjs/data-editing/edit-rule-validation-checker.js.map +0 -1
  16. package/cjs/data-editing/edit-validation-rules.js +0 -52
  17. package/cjs/data-editing/edit-validation-rules.js.map +0 -1
  18. package/cjs/data-editing/form-edit-state.js +0 -26
  19. package/cjs/data-editing/form-edit-state.js.map +0 -1
  20. package/cjs/data-editing/get-data-item-edit-control.js +0 -56
  21. package/cjs/data-editing/get-data-item-edit-control.js.map +0 -1
  22. package/cjs/data-editing/useEditForm.js +0 -249
  23. package/cjs/data-editing/useEditForm.js.map +0 -1
  24. package/cjs/datasource-provider/RestDataSourceProvider.js +0 -78
  25. package/cjs/datasource-provider/RestDataSourceProvider.js.map +0 -1
  26. package/cjs/datasource-provider/VuuDataSourceProvider.js +0 -34
  27. package/cjs/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  28. package/cjs/datasource-provider/useAutoLoginToVuuServer.js +0 -54
  29. package/cjs/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  30. package/cjs/hooks/useLookupValues.js +0 -100
  31. package/cjs/hooks/useLookupValues.js.map +0 -1
  32. package/cjs/hooks/useSessionDataSource.js +0 -72
  33. package/cjs/hooks/useSessionDataSource.js.map +0 -1
  34. package/cjs/hooks/useTypeaheadSuggestions.js +0 -41
  35. package/cjs/hooks/useTypeaheadSuggestions.js.map +0 -1
  36. package/cjs/hooks/useVisualLinks.js +0 -83
  37. package/cjs/hooks/useVisualLinks.js.map +0 -1
  38. package/cjs/hooks/useVuuMenuActions.js +0 -362
  39. package/cjs/hooks/useVuuMenuActions.js.map +0 -1
  40. package/cjs/hooks/useVuuTables.js +0 -38
  41. package/cjs/hooks/useVuuTables.js.map +0 -1
  42. package/cjs/session-editing-form/SessionEditingForm.css.js +0 -6
  43. package/cjs/session-editing-form/SessionEditingForm.css.js.map +0 -1
  44. package/cjs/session-editing-form/SessionEditingForm.js +0 -269
  45. package/cjs/session-editing-form/SessionEditingForm.js.map +0 -1
  46. package/esm/data-editing/EditForm.css.js +0 -4
  47. package/esm/data-editing/EditForm.css.js.map +0 -1
  48. package/esm/data-editing/EditForm.js +0 -88
  49. package/esm/data-editing/EditForm.js.map +0 -1
  50. package/esm/data-editing/UnsavedChangesReport.css.js +0 -4
  51. package/esm/data-editing/UnsavedChangesReport.css.js.map +0 -1
  52. package/esm/data-editing/UnsavedChangesReport.js +0 -27
  53. package/esm/data-editing/UnsavedChangesReport.js.map +0 -1
  54. package/esm/data-editing/edit-rule-validation-checker.js +0 -37
  55. package/esm/data-editing/edit-rule-validation-checker.js.map +0 -1
  56. package/esm/data-editing/edit-validation-rules.js +0 -50
  57. package/esm/data-editing/edit-validation-rules.js.map +0 -1
  58. package/esm/data-editing/form-edit-state.js +0 -23
  59. package/esm/data-editing/form-edit-state.js.map +0 -1
  60. package/esm/data-editing/get-data-item-edit-control.js +0 -54
  61. package/esm/data-editing/get-data-item-edit-control.js.map +0 -1
  62. package/esm/data-editing/useEditForm.js +0 -247
  63. package/esm/data-editing/useEditForm.js.map +0 -1
  64. package/esm/datasource-provider/RestDataSourceProvider.js +0 -75
  65. package/esm/datasource-provider/RestDataSourceProvider.js.map +0 -1
  66. package/esm/datasource-provider/VuuDataSourceProvider.js +0 -32
  67. package/esm/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  68. package/esm/datasource-provider/useAutoLoginToVuuServer.js +0 -52
  69. package/esm/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  70. package/esm/hooks/useLookupValues.js +0 -98
  71. package/esm/hooks/useLookupValues.js.map +0 -1
  72. package/esm/hooks/useSessionDataSource.js +0 -70
  73. package/esm/hooks/useSessionDataSource.js.map +0 -1
  74. package/esm/hooks/useTypeaheadSuggestions.js +0 -38
  75. package/esm/hooks/useTypeaheadSuggestions.js.map +0 -1
  76. package/esm/hooks/useVisualLinks.js +0 -81
  77. package/esm/hooks/useVisualLinks.js.map +0 -1
  78. package/esm/hooks/useVuuMenuActions.js +0 -358
  79. package/esm/hooks/useVuuMenuActions.js.map +0 -1
  80. package/esm/hooks/useVuuTables.js +0 -36
  81. package/esm/hooks/useVuuTables.js.map +0 -1
  82. package/esm/session-editing-form/SessionEditingForm.css.js +0 -4
  83. package/esm/session-editing-form/SessionEditingForm.css.js.map +0 -1
  84. package/esm/session-editing-form/SessionEditingForm.js +0 -267
  85. package/esm/session-editing-form/SessionEditingForm.js.map +0 -1
@@ -1,70 +0,0 @@
1
- import { useViewContext } from '@vuu-ui/vuu-layout';
2
- import { useData, isConfigChanged } from '@vuu-ui/vuu-utils';
3
- import { useMemo, useRef, useCallback } from 'react';
4
-
5
- const NO_CONFIG = {};
6
- const useSessionDataSource = ({
7
- dataSourceSessionKey = "data-source",
8
- tableSchema
9
- }) => {
10
- const { id, load, save, loadSession, saveSession, title } = useViewContext();
11
- const { VuuDataSource } = useData();
12
- const { "datasource-config": dataSourceConfigFromState } = useMemo(() => load?.() ?? NO_CONFIG, [load]);
13
- const dataSourceConfigRef = useRef(
14
- dataSourceConfigFromState
15
- );
16
- const handleDataSourceConfigChange = useCallback(
17
- (config, _range, confirmed) => {
18
- if (confirmed !== false) {
19
- const { noChanges } = isConfigChanged(
20
- dataSourceConfigRef.current,
21
- config
22
- );
23
- if (noChanges === false) {
24
- dataSourceConfigRef.current = config;
25
- save?.(config, "datasource-config");
26
- }
27
- }
28
- },
29
- [save]
30
- );
31
- const dataSource = useMemo(() => {
32
- let ds = loadSession?.(dataSourceSessionKey);
33
- if (ds) {
34
- if (dataSourceConfigFromState) {
35
- ds.applyConfig(dataSourceConfigFromState, true);
36
- }
37
- if (ds.range.from > 0) {
38
- ds.range = ds.range.reset;
39
- }
40
- return ds;
41
- }
42
- const columns = dataSourceConfigFromState?.columns ?? tableSchema.columns.map((col) => col.name);
43
- ds = new VuuDataSource({
44
- // bufferSize: 0,
45
- viewport: id,
46
- table: tableSchema.table,
47
- ...dataSourceConfigRef.current,
48
- columns,
49
- title
50
- });
51
- ds.on("config", handleDataSourceConfigChange);
52
- saveSession?.(ds, "data-source");
53
- return ds;
54
- }, [
55
- VuuDataSource,
56
- dataSourceConfigFromState,
57
- dataSourceSessionKey,
58
- handleDataSourceConfigChange,
59
- id,
60
- loadSession,
61
- saveSession,
62
- tableSchema.columns,
63
- tableSchema.table,
64
- title
65
- ]);
66
- return dataSource;
67
- };
68
-
69
- export { useSessionDataSource };
70
- //# sourceMappingURL=useSessionDataSource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSessionDataSource.js","sources":["../../src/hooks/useSessionDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConfigChangeHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { isConfigChanged, useData } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\ntype SessionState = {\n \"datasource-config\"?: DataSourceConfig;\n};\n\nconst NO_CONFIG: SessionState = {};\n\nexport const useSessionDataSource = ({\n dataSourceSessionKey = \"data-source\",\n tableSchema,\n}: {\n dataSourceSessionKey?: string;\n tableSchema: TableSchema;\n}) => {\n const { id, load, save, loadSession, saveSession, title } = useViewContext();\n const { VuuDataSource } = useData();\n\n const { \"datasource-config\": dataSourceConfigFromState } =\n useMemo<SessionState>(() => load?.() ?? NO_CONFIG, [load]);\n\n const dataSourceConfigRef = useRef<DataSourceConfig | undefined>(\n dataSourceConfigFromState,\n );\n\n const handleDataSourceConfigChange =\n useCallback<DataSourceConfigChangeHandler>(\n (\n config: DataSourceConfig | undefined,\n _range: VuuRange,\n confirmed?: boolean,\n ) => {\n if (confirmed !== false) {\n const { noChanges } = isConfigChanged(\n dataSourceConfigRef.current,\n config,\n );\n if (noChanges === false) {\n dataSourceConfigRef.current = config;\n save?.(config, \"datasource-config\");\n }\n }\n },\n [save],\n );\n\n const dataSource: DataSource = useMemo(() => {\n let ds = loadSession?.(dataSourceSessionKey) as DataSource;\n if (ds) {\n if (dataSourceConfigFromState) {\n // this won't do anything if dataSource config already matches this\n // This is only really used when injecting a dataSource into session\n // state in Showcase examples\n // DO we definitely need this ? If not apply config can be provate\n ds.applyConfig(dataSourceConfigFromState, true);\n }\n\n if (ds.range.from > 0) {\n // UI does not currently restore scroll position, so always reset to top of dataset\n ds.range = ds.range.reset;\n }\n\n return ds;\n }\n\n const columns =\n dataSourceConfigFromState?.columns ??\n tableSchema.columns.map((col) => col.name);\n\n ds = new VuuDataSource({\n // bufferSize: 0,\n viewport: id,\n table: tableSchema.table,\n ...dataSourceConfigRef.current,\n columns,\n title,\n });\n ds.on(\"config\", handleDataSourceConfigChange);\n saveSession?.(ds, \"data-source\");\n return ds;\n }, [\n VuuDataSource,\n dataSourceConfigFromState,\n dataSourceSessionKey,\n handleDataSourceConfigChange,\n id,\n loadSession,\n saveSession,\n tableSchema.columns,\n tableSchema.table,\n title,\n ]);\n\n return dataSource;\n};\n"],"names":[],"mappings":";;;;AAeA,MAAM,YAA0B,EAAC;AAE1B,MAAM,uBAAuB,CAAC;AAAA,EACnC,oBAAuB,GAAA,aAAA;AAAA,EACvB;AACF,CAGM,KAAA;AACJ,EAAM,MAAA,EAAE,IAAI,IAAM,EAAA,IAAA,EAAM,aAAa,WAAa,EAAA,KAAA,KAAU,cAAe,EAAA;AAC3E,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,OAAQ,EAAA;AAElC,EAAM,MAAA,EAAE,mBAAqB,EAAA,yBAAA,EAC3B,GAAA,OAAA,CAAsB,MAAM,IAAA,IAAY,IAAA,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA;AAE3D,EAAA,MAAM,mBAAsB,GAAA,MAAA;AAAA,IAC1B;AAAA,GACF;AAEA,EAAA,MAAM,4BACJ,GAAA,WAAA;AAAA,IACE,CACE,MACA,EAAA,MAAA,EACA,SACG,KAAA;AACH,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAM,MAAA,EAAE,WAAc,GAAA,eAAA;AAAA,UACpB,mBAAoB,CAAA,OAAA;AAAA,UACpB;AAAA,SACF;AACA,QAAA,IAAI,cAAc,KAAO,EAAA;AACvB,UAAA,mBAAA,CAAoB,OAAU,GAAA,MAAA;AAC9B,UAAA,IAAA,GAAO,QAAQ,mBAAmB,CAAA;AAAA;AACpC;AACF,KACF;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEF,EAAM,MAAA,UAAA,GAAyB,QAAQ,MAAM;AAC3C,IAAI,IAAA,EAAA,GAAK,cAAc,oBAAoB,CAAA;AAC3C,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,IAAI,yBAA2B,EAAA;AAK7B,QAAG,EAAA,CAAA,WAAA,CAAY,2BAA2B,IAAI,CAAA;AAAA;AAGhD,MAAI,IAAA,EAAA,CAAG,KAAM,CAAA,IAAA,GAAO,CAAG,EAAA;AAErB,QAAG,EAAA,CAAA,KAAA,GAAQ,GAAG,KAAM,CAAA,KAAA;AAAA;AAGtB,MAAO,OAAA,EAAA;AAAA;AAGT,IAAM,MAAA,OAAA,GACJ,2BAA2B,OAC3B,IAAA,WAAA,CAAY,QAAQ,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAI,CAAA;AAE3C,IAAA,EAAA,GAAK,IAAI,aAAc,CAAA;AAAA;AAAA,MAErB,QAAU,EAAA,EAAA;AAAA,MACV,OAAO,WAAY,CAAA,KAAA;AAAA,MACnB,GAAG,mBAAoB,CAAA,OAAA;AAAA,MACvB,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAG,EAAA,CAAA,EAAA,CAAG,UAAU,4BAA4B,CAAA;AAC5C,IAAA,WAAA,GAAc,IAAI,aAAa,CAAA;AAC/B,IAAO,OAAA,EAAA;AAAA,GACN,EAAA;AAAA,IACD,aAAA;AAAA,IACA,yBAAA;AAAA,IACA,oBAAA;AAAA,IACA,4BAAA;AAAA,IACA,EAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAY,CAAA,OAAA;AAAA,IACZ,WAAY,CAAA,KAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAED,EAAO,OAAA,UAAA;AACT;;;;"}
@@ -1,38 +0,0 @@
1
- import { useData } from '@vuu-ui/vuu-utils';
2
- import { useCallback } from 'react';
3
-
4
- const getTypeaheadParams = (table, column, text = "", selectedValues = []) => {
5
- if (text !== "" && !selectedValues.includes(text.toLowerCase())) {
6
- return [table, column, text];
7
- }
8
- return [table, column];
9
- };
10
- const useTypeaheadSuggestions = () => {
11
- const { getServerAPI } = useData();
12
- return useCallback(
13
- async (params) => {
14
- const rpcMessage = params.length === 2 ? {
15
- type: "RPC_CALL",
16
- service: "TypeAheadRpcHandler",
17
- method: "getUniqueFieldValues",
18
- params
19
- } : {
20
- type: "RPC_CALL",
21
- service: "TypeAheadRpcHandler",
22
- method: "getUniqueFieldValuesStartingWith",
23
- params
24
- };
25
- try {
26
- const serverAPI = await getServerAPI();
27
- const response = await serverAPI.rpcCall(rpcMessage);
28
- return response;
29
- } catch (err) {
30
- return false;
31
- }
32
- },
33
- [getServerAPI]
34
- );
35
- };
36
-
37
- export { getTypeaheadParams, useTypeaheadSuggestions };
38
- //# sourceMappingURL=useTypeaheadSuggestions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["import { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcServiceRequest,\n TypeaheadParams,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useData } from \"@vuu-ui/vuu-utils\";\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 const { getServerAPI } = useData();\n return useCallback<SuggestionFetcher>(\n async (params: TypeaheadParams) => {\n const rpcMessage: VuuRpcServiceRequest =\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\n try {\n const serverAPI = await getServerAPI();\n // We don't just return serverAPI.rpcCall . In the case of an\n // error we will be returning the rejected promise, bypassing\n // the catch block below.\n const response = await serverAPI.rpcCall<string[]>(rpcMessage);\n return response;\n } catch (err) {\n return false;\n }\n },\n [getServerAPI],\n );\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;AAAA;AAE7B,EAAO,OAAA,CAAC,OAAO,MAAM,CAAA;AACvB;AAEO,MAAM,0BAA0B,MAAM;AAC3C,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,OAAQ,EAAA;AACjC,EAAO,OAAA,WAAA;AAAA,IACL,OAAO,MAA4B,KAAA;AACjC,MAAM,MAAA,UAAA,GACJ,MAAO,CAAA,MAAA,KAAW,CACd,GAAA;AAAA,QACE,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA,qBAAA;AAAA,QACT,MAAQ,EAAA,sBAAA;AAAA,QACR;AAAA,OAEF,GAAA;AAAA,QACE,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA,qBAAA;AAAA,QACT,MAAQ,EAAA,kCAAA;AAAA,QACR;AAAA,OACF;AAEN,MAAI,IAAA;AACF,QAAM,MAAA,SAAA,GAAY,MAAM,YAAa,EAAA;AAIrC,QAAA,MAAM,QAAW,GAAA,MAAM,SAAU,CAAA,OAAA,CAAkB,UAAU,CAAA;AAC7D,QAAO,OAAA,QAAA;AAAA,eACA,GAAK,EAAA;AACZ,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AACF;;;;"}
@@ -1,81 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { useViewContext } from '@vuu-ui/vuu-layout';
3
- import { IconButton } from '@vuu-ui/vuu-ui-controls';
4
- import { useCallback, useEffect } from 'react';
5
-
6
- const useVisualLinks = (dataSource) => {
7
- const { dispatch } = useViewContext();
8
- const clearVisualLinkTarget = useCallback(() => {
9
- if (dataSource.visualLink) {
10
- dispatch?.({
11
- type: "broadcast-message",
12
- message: {
13
- targetId: dataSource.visualLink.parentClientVpId,
14
- type: "highlight-off"
15
- }
16
- });
17
- }
18
- }, [dataSource, dispatch]);
19
- const removeVisualLink = useCallback(() => {
20
- if (dataSource.visualLink) {
21
- dispatch?.({
22
- type: "broadcast-message",
23
- message: {
24
- targetId: dataSource.visualLink.parentClientVpId,
25
- type: "highlight-off"
26
- }
27
- });
28
- dataSource.visualLink = void 0;
29
- }
30
- }, [dataSource, dispatch]);
31
- const handleLinkRemoved = useCallback(() => {
32
- dispatch?.({
33
- type: "remove-toolbar-contribution",
34
- location: "post-title"
35
- });
36
- }, [dispatch]);
37
- const highlightVisualLinkTarget = useCallback(() => {
38
- if (dataSource.visualLink) {
39
- dispatch?.({
40
- type: "broadcast-message",
41
- message: {
42
- targetId: dataSource.visualLink.parentClientVpId,
43
- type: "highlight-on"
44
- }
45
- });
46
- }
47
- }, [dataSource, dispatch]);
48
- const handleLinkCreated = useCallback(() => {
49
- dispatch?.({
50
- type: "add-toolbar-contribution",
51
- location: "post-title",
52
- content: /* @__PURE__ */ jsx(
53
- IconButton,
54
- {
55
- "aria-label": "remove-link",
56
- icon: "link",
57
- onClick: removeVisualLink,
58
- onMouseEnter: highlightVisualLinkTarget,
59
- onMouseLeave: clearVisualLinkTarget,
60
- variant: "secondary"
61
- }
62
- )
63
- });
64
- }, [
65
- dispatch,
66
- removeVisualLink,
67
- highlightVisualLinkTarget,
68
- clearVisualLinkTarget
69
- ]);
70
- useEffect(() => {
71
- dataSource.on("visual-link-created", handleLinkCreated);
72
- dataSource.on("visual-link-removed", handleLinkRemoved);
73
- return () => {
74
- dataSource.removeListener("visual-link-created", handleLinkCreated);
75
- dataSource.removeListener("visual-link-removed", handleLinkRemoved);
76
- };
77
- }, [dataSource, handleLinkCreated, handleLinkRemoved]);
78
- };
79
-
80
- export { useVisualLinks };
81
- //# sourceMappingURL=useVisualLinks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVisualLinks.js","sources":["../../src/hooks/useVisualLinks.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { useViewContext } from \"@vuu-ui/vuu-layout\";\nimport { IconButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { useCallback, useEffect } from \"react\";\n\nexport const useVisualLinks = (dataSource: DataSource) => {\n const { dispatch } = useViewContext();\n\n const clearVisualLinkTarget = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-off\",\n },\n });\n }\n }, [dataSource, dispatch]);\n\n const removeVisualLink = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-off\",\n },\n });\n\n dataSource.visualLink = undefined;\n }\n }, [dataSource, dispatch]);\n\n const handleLinkRemoved = useCallback(() => {\n dispatch?.({\n type: \"remove-toolbar-contribution\",\n location: \"post-title\",\n });\n }, [dispatch]);\n\n const highlightVisualLinkTarget = useCallback(() => {\n if (dataSource.visualLink) {\n dispatch?.({\n type: \"broadcast-message\",\n message: {\n targetId: dataSource.visualLink.parentClientVpId,\n type: \"highlight-on\",\n },\n });\n }\n }, [dataSource, dispatch]);\n\n const handleLinkCreated = useCallback(() => {\n dispatch?.({\n type: \"add-toolbar-contribution\",\n location: \"post-title\",\n content: (\n <IconButton\n aria-label=\"remove-link\"\n icon=\"link\"\n onClick={removeVisualLink}\n onMouseEnter={highlightVisualLinkTarget}\n onMouseLeave={clearVisualLinkTarget}\n variant=\"secondary\"\n />\n ),\n });\n }, [\n dispatch,\n removeVisualLink,\n highlightVisualLinkTarget,\n clearVisualLinkTarget,\n ]);\n\n useEffect(() => {\n dataSource.on(\"visual-link-created\", handleLinkCreated);\n dataSource.on(\"visual-link-removed\", handleLinkRemoved);\n return () => {\n dataSource.removeListener(\"visual-link-created\", handleLinkCreated);\n dataSource.removeListener(\"visual-link-removed\", handleLinkRemoved);\n };\n }, [dataSource, handleLinkCreated, handleLinkRemoved]);\n};\n"],"names":[],"mappings":";;;;;AAKa,MAAA,cAAA,GAAiB,CAAC,UAA2B,KAAA;AACxD,EAAM,MAAA,EAAE,QAAS,EAAA,GAAI,cAAe,EAAA;AAEpC,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAAA;AACH,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAED,MAAA,UAAA,CAAW,UAAa,GAAA,KAAA,CAAA;AAAA;AAC1B,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAW,QAAA,GAAA;AAAA,MACT,IAAM,EAAA,6BAAA;AAAA,MACN,QAAU,EAAA;AAAA,KACX,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,yBAAA,GAA4B,YAAY,MAAM;AAClD,IAAA,IAAI,WAAW,UAAY,EAAA;AACzB,MAAW,QAAA,GAAA;AAAA,QACT,IAAM,EAAA,mBAAA;AAAA,QACN,OAAS,EAAA;AAAA,UACP,QAAA,EAAU,WAAW,UAAW,CAAA,gBAAA;AAAA,UAChC,IAAM,EAAA;AAAA;AACR,OACD,CAAA;AAAA;AACH,GACC,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAM,MAAA,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAW,QAAA,GAAA;AAAA,MACT,IAAM,EAAA,0BAAA;AAAA,MACN,QAAU,EAAA,YAAA;AAAA,MACV,OACE,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,aAAA;AAAA,UACX,IAAK,EAAA,MAAA;AAAA,UACL,OAAS,EAAA,gBAAA;AAAA,UACT,YAAc,EAAA,yBAAA;AAAA,UACd,YAAc,EAAA,qBAAA;AAAA,UACd,OAAQ,EAAA;AAAA;AAAA;AACV,KAEH,CAAA;AAAA,GACA,EAAA;AAAA,IACD,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAW,UAAA,CAAA,EAAA,CAAG,uBAAuB,iBAAiB,CAAA;AACtD,IAAW,UAAA,CAAA,EAAA,CAAG,uBAAuB,iBAAiB,CAAA;AACtD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,uBAAuB,iBAAiB,CAAA;AAClE,MAAW,UAAA,CAAA,cAAA,CAAe,uBAAuB,iBAAiB,CAAA;AAAA,KACpE;AAAA,GACC,EAAA,CAAC,UAAY,EAAA,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AACvD;;;;"}
@@ -1,358 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { Button } from '@salt-ds/core';
3
- import { isGroupMenuItemDescriptor } from '@vuu-ui/vuu-context-menu';
4
- import { getFilterPredicate } from '@vuu-ui/vuu-filter-parser';
5
- import { useDialogContext, useNotifications } from '@vuu-ui/vuu-popups';
6
- import { isTableLocation, BulkEditDialog, BulkEditPanel } from '@vuu-ui/vuu-table';
7
- import { useData, toColumnName, isActionMessage, hasShowNotificationAction, isOpenBulkEditResponse, isSessionTableActionMessage, viewportRpcRequest, dataSourceRowToDataRowDto, metadataKeys } from '@vuu-ui/vuu-utils';
8
- import { useCallback } from 'react';
9
- import { SessionEditingForm } from '../session-editing-form/SessionEditingForm.js';
10
-
11
- const isRoot = (menu) => menu.name === "ROOT";
12
- const isCellMenu = (options) => options.context === "cell";
13
- const isRowMenu = (options) => options.context === "row";
14
- const isSelectionMenu = (options) => options.context === "selected-rows";
15
- const getColumnsFromOptions = (options) => {
16
- if (options && typeof options === "object" && "columns" in options) {
17
- return options.columns;
18
- }
19
- };
20
- const isVuuMenuItem = (menu) => "rpcName" in menu;
21
- const isGroupMenuItem = (menu) => "menus" in menu;
22
- const hasFilter = ({ filter }) => typeof filter === "string" && filter.length > 0;
23
- const { KEY } = metadataKeys;
24
- const getMenuItemOptions = (menu, options) => {
25
- switch (menu.context) {
26
- case "cell":
27
- return {
28
- ...menu,
29
- field: options.column.name,
30
- rowKey: options.row[KEY],
31
- value: options.row[options.columnMap[options.column.name]]
32
- };
33
- case "row":
34
- return {
35
- ...menu,
36
- columns: options.columns,
37
- row: dataSourceRowToDataRowDto(options.row, options.columnMap),
38
- rowKey: options.row[KEY]
39
- };
40
- case "selected-rows":
41
- return {
42
- ...menu,
43
- columns: options.columns
44
- };
45
- default:
46
- return menu;
47
- }
48
- };
49
- const vuuContextCompatibleWithTableLocation = (uiLocation, vuuContext, selectedRowCount = 0) => {
50
- switch (uiLocation) {
51
- case "grid":
52
- if (vuuContext === "selected-rows") {
53
- return selectedRowCount > 0;
54
- } else {
55
- return true;
56
- }
57
- case "header":
58
- return vuuContext === "grid";
59
- default:
60
- return false;
61
- }
62
- };
63
- const gridRowMeetsFilterCriteria = (context, row, selectedRows, filter, columnMap) => {
64
- if (context === "cell" || context === "row") {
65
- const filterPredicate = getFilterPredicate(columnMap, filter);
66
- return filterPredicate(row);
67
- } else if (context === "selected-rows") {
68
- if (selectedRows.length === 0) {
69
- return false;
70
- } else {
71
- const filterPredicate = getFilterPredicate(columnMap, filter);
72
- return selectedRows.every(filterPredicate);
73
- }
74
- }
75
- return true;
76
- };
77
- const menuShouldBeRenderedInThisContext = (menuItem, tableLocation, options) => {
78
- if (isGroupMenuItem(menuItem)) {
79
- return menuItem.menus.some(
80
- (childMenu) => menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)
81
- );
82
- }
83
- if (!vuuContextCompatibleWithTableLocation(
84
- tableLocation,
85
- menuItem.context,
86
- options.selectedRows?.length
87
- )) {
88
- return false;
89
- }
90
- if (tableLocation === "grid" && hasFilter(menuItem)) {
91
- return gridRowMeetsFilterCriteria(
92
- menuItem.context,
93
- options.row,
94
- options.selectedRows,
95
- menuItem.filter,
96
- options.columnMap
97
- );
98
- }
99
- if (isCellMenu(menuItem) && menuItem.field !== "*") {
100
- return menuItem.field === options.column.name;
101
- }
102
- return true;
103
- };
104
- const buildMenuDescriptorFromVuuMenu = (menu, tableLocation, options) => {
105
- if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {
106
- if (isVuuMenuItem(menu)) {
107
- return {
108
- label: menu.name,
109
- id: "MENU_RPC_CALL",
110
- options: getMenuItemOptions(menu, options)
111
- };
112
- } else {
113
- const children = menu.menus.map(
114
- (childMenu) => buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)
115
- ).filter(
116
- (childMenu) => childMenu !== void 0
117
- );
118
- if (children.length > 0) {
119
- return {
120
- label: menu.name,
121
- children
122
- };
123
- }
124
- }
125
- }
126
- };
127
- const keyFirst = (c1, c2) => c1.isKeyField ? -1 : c2.isKeyField ? 1 : 0;
128
- const defaultFormConfig = {
129
- fields: [],
130
- key: "",
131
- title: ""
132
- };
133
- const configFromSchema = (schema) => {
134
- if (schema) {
135
- const { columns, key } = schema;
136
- return {
137
- key,
138
- title: `Parameters for command`,
139
- fields: columns.map((col) => ({
140
- description: col.name,
141
- label: col.name,
142
- name: col.name,
143
- type: col.serverDataType,
144
- isKeyField: col.name === key
145
- })).sort(keyFirst)
146
- };
147
- }
148
- };
149
- const getFormConfig = (action) => {
150
- const { tableSchema: schema } = action;
151
- const config = configFromSchema(schema) ?? defaultFormConfig;
152
- return {
153
- config,
154
- schema
155
- };
156
- };
157
- const useVuuMenuActions = ({
158
- clientSideMenuActionHandler,
159
- dataSource,
160
- onRpcResponse
161
- }) => {
162
- const { VuuDataSource } = useData();
163
- const menuBuilder = useCallback(
164
- (location, options) => {
165
- const descriptors = [];
166
- if (dataSource) {
167
- const { links, menu } = dataSource;
168
- const { visualLink } = dataSource;
169
- if (location === "grid" && links && !visualLink) {
170
- links.forEach((linkDescriptor) => {
171
- const { link, label: linkLabel } = linkDescriptor;
172
- const label = linkLabel ? linkLabel : link.toTable;
173
- descriptors.push({
174
- label: `Link to ${label}`,
175
- id: "link-table",
176
- options: linkDescriptor
177
- });
178
- });
179
- }
180
- if (menu && isTableLocation(location)) {
181
- const menuDescriptor = buildMenuDescriptorFromVuuMenu(
182
- menu,
183
- location,
184
- options
185
- );
186
- if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {
187
- descriptors.push(...menuDescriptor.children);
188
- } else if (menuDescriptor) {
189
- descriptors.push(menuDescriptor);
190
- }
191
- }
192
- } else {
193
- throw Error("useVuuMenuActions no dataSource provided");
194
- }
195
- return descriptors;
196
- },
197
- [dataSource]
198
- );
199
- const { showDialog, closeDialog } = useDialogContext();
200
- const showNotification = useNotifications();
201
- const showBulkEditDialog = useCallback(
202
- (ds, table, columns) => {
203
- const sessionDs = new VuuDataSource({
204
- columns: columns?.map(toColumnName),
205
- table,
206
- viewport: table.table
207
- });
208
- const handleClose = () => {
209
- sessionDs.unsubscribe();
210
- closeDialog();
211
- };
212
- showDialog(
213
- /* @__PURE__ */ jsx(
214
- BulkEditDialog,
215
- {
216
- columns,
217
- sessionDs,
218
- parentDs: ds,
219
- closeDialog: handleClose
220
- }
221
- ),
222
- "Bulk Amend"
223
- );
224
- return true;
225
- },
226
- [VuuDataSource, closeDialog, showDialog]
227
- );
228
- const showSessionEditingForm = useCallback(
229
- (ds, action) => {
230
- const { tableSchema } = action;
231
- if (tableSchema) {
232
- const formConfig = getFormConfig(action);
233
- showDialog(
234
- /* @__PURE__ */ jsx(SessionEditingForm, { ...formConfig, onClose: closeDialog }),
235
- "Set Parameters"
236
- );
237
- }
238
- const sessionDs = ds.createSessionDataSource?.(action.table);
239
- const handleSubmit = () => {
240
- sessionDs?.rpcCall?.(viewportRpcRequest("VP_BULK_EDIT_SUBMIT_RPC"));
241
- closeDialog();
242
- };
243
- const handleChange = (isValid) => {
244
- console.log("placeholder: ", isValid);
245
- };
246
- if (sessionDs) {
247
- showDialog(
248
- /* @__PURE__ */ jsx(
249
- BulkEditPanel,
250
- {
251
- dataSource: sessionDs,
252
- onSubmit: handleSubmit,
253
- parentDs: ds,
254
- onValidationStatusChange: handleChange
255
- }
256
- ),
257
- "Multi Row Edit",
258
- [
259
- /* @__PURE__ */ jsx(Button, { onClick: closeDialog, children: "Cancel" }, "cancel"),
260
- /* @__PURE__ */ jsx(Button, { onClick: handleSubmit, children: "Save" }, "submit")
261
- ]
262
- );
263
- }
264
- },
265
- [closeDialog, showDialog]
266
- );
267
- const getMenuRpcRequest = (options) => {
268
- const { rpcName } = options;
269
- if (isCellMenu(options)) {
270
- return {
271
- field: options.field,
272
- rowKey: options.rowKey,
273
- rpcName,
274
- value: options.value,
275
- type: "VIEW_PORT_MENU_CELL_RPC"
276
- };
277
- } else if (isRowMenu(options)) {
278
- return {
279
- rowKey: options.rowKey,
280
- row: options.row,
281
- rpcName,
282
- type: "VIEW_PORT_MENU_ROW_RPC"
283
- };
284
- } else if (isSelectionMenu(options)) {
285
- return {
286
- rpcName,
287
- type: "VIEW_PORT_MENUS_SELECT_RPC"
288
- };
289
- } else {
290
- return {
291
- rpcName,
292
- type: "VIEW_PORT_MENU_TABLE_RPC"
293
- };
294
- }
295
- };
296
- const menuActionHandler = useCallback(
297
- (menuItemId, options) => {
298
- if (clientSideMenuActionHandler?.(menuItemId, options)) {
299
- return true;
300
- } else if (menuItemId === "MENU_RPC_CALL") {
301
- const rpcRequest = getMenuRpcRequest(options);
302
- dataSource?.menuRpcCall(rpcRequest).then((rpcResponse) => {
303
- if (rpcResponse) {
304
- if (onRpcResponse?.(rpcResponse) === true) {
305
- return true;
306
- }
307
- if (isActionMessage(rpcResponse)) {
308
- if (hasShowNotificationAction(rpcResponse)) {
309
- const {
310
- action: { message, title = "Success" }
311
- } = rpcResponse;
312
- showNotification({
313
- type: "success",
314
- body: message,
315
- header: title
316
- });
317
- } else if (isOpenBulkEditResponse(rpcResponse)) {
318
- showBulkEditDialog(
319
- dataSource,
320
- rpcResponse.action.table,
321
- getColumnsFromOptions(options)
322
- );
323
- } else if (isSessionTableActionMessage(rpcResponse)) {
324
- showSessionEditingForm(dataSource, rpcResponse.action);
325
- }
326
- }
327
- }
328
- });
329
- return true;
330
- } else if (menuItemId === "link-table") {
331
- if (dataSource) {
332
- dataSource.visualLink = options;
333
- }
334
- return true;
335
- } else {
336
- console.log(
337
- `useViewServer handleMenuAction, can't handle action type ${menuItemId}`
338
- );
339
- }
340
- return false;
341
- },
342
- [
343
- clientSideMenuActionHandler,
344
- dataSource,
345
- onRpcResponse,
346
- showBulkEditDialog,
347
- showNotification,
348
- showSessionEditingForm
349
- ]
350
- );
351
- return {
352
- menuBuilder,
353
- menuActionHandler
354
- };
355
- };
356
-
357
- export { isRowMenu, isSelectionMenu, useVuuMenuActions };
358
- //# sourceMappingURL=useVuuMenuActions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVuuMenuActions.js","sources":["../../src/hooks/useVuuMenuActions.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport {\n type ContextMenuItemDescriptor,\n isGroupMenuItemDescriptor,\n type MenuActionHandler,\n type MenuBuilder,\n} from \"@vuu-ui/vuu-context-menu\";\nimport {\n DataSource,\n DataSourceRow,\n DataSourceVisualLinkCreatedMessage,\n RpcResponseHandler,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { getFilterPredicate } from \"@vuu-ui/vuu-filter-parser\";\nimport { useDialogContext, useNotifications } from \"@vuu-ui/vuu-popups\";\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 {\n BulkEditDialog,\n BulkEditPanel,\n isTableLocation,\n TableContextMenuOptions,\n TableMenuLocation,\n} from \"@vuu-ui/vuu-table\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n ColumnMap,\n dataSourceRowToDataRowDto,\n hasShowNotificationAction,\n isActionMessage,\n isOpenBulkEditResponse,\n isSessionTableActionMessage,\n metadataKeys,\n toColumnName,\n useData,\n viewportRpcRequest,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback } from \"react\";\nimport {\n FormConfig,\n FormFieldDescriptor,\n SessionEditingForm,\n} from \"../session-editing-form\";\n\nexport interface VuuMenuActionHookResult {\n menuBuilder: MenuBuilder<TableMenuLocation, TableContextMenuOptions>;\n menuActionHandler: 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?: 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 getColumnsFromOptions = (options: unknown) => {\n if (options && typeof options === \"object\" && \"columns\" in options) {\n return options.columns as VuuSelectedRowsContextMenuItemOptions[\"columns\"];\n }\n};\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 { KEY } = metadataKeys;\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.row[KEY],\n value: options.row[options.columnMap[options.column.name]],\n };\n case \"row\":\n return {\n ...menu,\n columns: options.columns,\n row: dataSourceRowToDataRowDto(options.row, options.columnMap),\n rowKey: options.row[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 row: DataSourceRow,\n selectedRows: DataSourceRow[],\n filter: string,\n columnMap: ColumnMap,\n): boolean => {\n if (context === \"cell\" || context === \"row\") {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return filterPredicate(row);\n } else if (context === \"selected-rows\") {\n if (selectedRows.length === 0) {\n return false;\n } else {\n const filterPredicate = getFilterPredicate(columnMap, filter);\n return selectedRows.every(filterPredicate);\n }\n }\n return true;\n};\n\nconst 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.row,\n options.selectedRows,\n menuItem.filter,\n options.columnMap,\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): VuuMenuActionHookResult => {\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 } = useDialogContext();\n const showNotification = useNotifications();\n\n const showBulkEditDialog = useCallback(\n (ds: DataSource, table: VuuTable, columns?: ColumnDescriptor[]) => {\n const sessionDs = new VuuDataSource({\n columns: columns?.map(toColumnName),\n table,\n viewport: table.table,\n });\n\n const handleClose = () => {\n sessionDs.unsubscribe();\n closeDialog();\n };\n\n showDialog(\n <BulkEditDialog\n columns={columns}\n sessionDs={sessionDs}\n parentDs={ds}\n closeDialog={handleClose}\n />,\n \"Bulk Amend\",\n );\n\n return true;\n },\n [VuuDataSource, closeDialog, showDialog],\n );\n\n const showSessionEditingForm = useCallback(\n (\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 const sessionDs = ds.createSessionDataSource?.(action.table);\n const handleSubmit = () => {\n sessionDs?.rpcCall?.(viewportRpcRequest(\"VP_BULK_EDIT_SUBMIT_RPC\"));\n closeDialog();\n };\n\n const handleChange = (isValid: boolean) => {\n console.log(\"placeholder: \", isValid);\n };\n\n if (sessionDs) {\n showDialog(\n <BulkEditPanel\n dataSource={sessionDs}\n onSubmit={handleSubmit}\n parentDs={ds}\n onValidationStatusChange={handleChange}\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 type: \"success\",\n body: message,\n header: title,\n });\n } else if (isOpenBulkEditResponse(rpcResponse)) {\n showBulkEditDialog(\n dataSource,\n rpcResponse.action.table,\n getColumnsFromOptions(options),\n );\n } else if (isSessionTableActionMessage(rpcResponse)) {\n showSessionEditingForm(dataSource, rpcResponse.action);\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 showBulkEditDialog,\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