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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/package.json +24 -20
  2. package/src/data-editing/EditForm.css.js +53 -0
  3. package/src/data-editing/EditForm.mjs +82 -0
  4. package/src/data-editing/UnsavedChangesReport.css.js +27 -0
  5. package/src/data-editing/UnsavedChangesReport.mjs +41 -0
  6. package/src/data-editing/edit-rule-validation-checker.mjs +30 -0
  7. package/src/data-editing/edit-validation-rules.mjs +33 -0
  8. package/src/data-editing/form-edit-state.mjs +16 -0
  9. package/src/data-editing/get-data-item-edit-control.mjs +63 -0
  10. package/src/data-editing/index.mjs +6 -0
  11. package/src/data-editing/useEditForm.mjs +253 -0
  12. package/src/datasource-provider/VuuDataSourceProvider.mjs +20 -0
  13. package/src/datasource-provider/index.mjs +1 -0
  14. package/src/datasource-provider/useAutoLoginToVuuServer.mjs +42 -0
  15. package/src/hooks/useLookupValues.mjs +93 -0
  16. package/src/hooks/useSessionDataSource.mjs +37 -0
  17. package/src/hooks/useTypeaheadSuggestions.mjs +50 -0
  18. package/src/hooks/useVisualLinks.mjs +87 -0
  19. package/src/hooks/useVuuMenuActions.mjs +269 -0
  20. package/src/hooks/useVuuTables.mjs +32 -0
  21. package/src/index.mjs +10 -0
  22. package/src/lost-connection-indicator/LostConnectionIndicator.css.js +29 -0
  23. package/src/lost-connection-indicator/LostConnectionIndicator.mjs +30 -0
  24. package/src/lost-connection-indicator/useLostConnection.mjs +28 -0
  25. package/src/session-editing-form/SessionEditingForm.css.js +47 -0
  26. package/src/session-editing-form/SessionEditingForm.mjs +236 -0
  27. package/src/session-editing-form/index.mjs +1 -0
  28. package/cjs/data-editing/EditForm.css.js +0 -6
  29. package/cjs/data-editing/EditForm.css.js.map +0 -1
  30. package/cjs/data-editing/EditForm.js +0 -90
  31. package/cjs/data-editing/EditForm.js.map +0 -1
  32. package/cjs/data-editing/UnsavedChangesReport.css.js +0 -6
  33. package/cjs/data-editing/UnsavedChangesReport.css.js.map +0 -1
  34. package/cjs/data-editing/UnsavedChangesReport.js +0 -29
  35. package/cjs/data-editing/UnsavedChangesReport.js.map +0 -1
  36. package/cjs/data-editing/edit-rule-validation-checker.js +0 -41
  37. package/cjs/data-editing/edit-rule-validation-checker.js.map +0 -1
  38. package/cjs/data-editing/edit-validation-rules.js +0 -52
  39. package/cjs/data-editing/edit-validation-rules.js.map +0 -1
  40. package/cjs/data-editing/form-edit-state.js +0 -26
  41. package/cjs/data-editing/form-edit-state.js.map +0 -1
  42. package/cjs/data-editing/get-data-item-edit-control.js +0 -106
  43. package/cjs/data-editing/get-data-item-edit-control.js.map +0 -1
  44. package/cjs/data-editing/useEditForm.js +0 -258
  45. package/cjs/data-editing/useEditForm.js.map +0 -1
  46. package/cjs/datasource-provider/VuuDataSourceProvider.js +0 -34
  47. package/cjs/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  48. package/cjs/datasource-provider/useAutoLoginToVuuServer.js +0 -52
  49. package/cjs/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  50. package/cjs/hooks/useLookupValues.js +0 -100
  51. package/cjs/hooks/useLookupValues.js.map +0 -1
  52. package/cjs/hooks/useSessionDataSource.js +0 -58
  53. package/cjs/hooks/useSessionDataSource.js.map +0 -1
  54. package/cjs/hooks/useTypeaheadSuggestions.js +0 -57
  55. package/cjs/hooks/useTypeaheadSuggestions.js.map +0 -1
  56. package/cjs/hooks/useVisualLinks.js +0 -84
  57. package/cjs/hooks/useVisualLinks.js.map +0 -1
  58. package/cjs/hooks/useVuuMenuActions.js +0 -352
  59. package/cjs/hooks/useVuuMenuActions.js.map +0 -1
  60. package/cjs/hooks/useVuuTables.js +0 -38
  61. package/cjs/hooks/useVuuTables.js.map +0 -1
  62. package/cjs/index.js +0 -42
  63. package/cjs/index.js.map +0 -1
  64. package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js +0 -6
  65. package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
  66. package/cjs/lost-connection-indicator/LostConnectionIndicator.js +0 -24
  67. package/cjs/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
  68. package/cjs/lost-connection-indicator/useLostConnection.js +0 -34
  69. package/cjs/lost-connection-indicator/useLostConnection.js.map +0 -1
  70. package/cjs/session-editing-form/SessionEditingForm.css.js +0 -6
  71. package/cjs/session-editing-form/SessionEditingForm.css.js.map +0 -1
  72. package/cjs/session-editing-form/SessionEditingForm.js +0 -270
  73. package/cjs/session-editing-form/SessionEditingForm.js.map +0 -1
  74. package/esm/data-editing/EditForm.css.js +0 -4
  75. package/esm/data-editing/EditForm.css.js.map +0 -1
  76. package/esm/data-editing/EditForm.js +0 -88
  77. package/esm/data-editing/EditForm.js.map +0 -1
  78. package/esm/data-editing/UnsavedChangesReport.css.js +0 -4
  79. package/esm/data-editing/UnsavedChangesReport.css.js.map +0 -1
  80. package/esm/data-editing/UnsavedChangesReport.js +0 -27
  81. package/esm/data-editing/UnsavedChangesReport.js.map +0 -1
  82. package/esm/data-editing/edit-rule-validation-checker.js +0 -37
  83. package/esm/data-editing/edit-rule-validation-checker.js.map +0 -1
  84. package/esm/data-editing/edit-validation-rules.js +0 -50
  85. package/esm/data-editing/edit-validation-rules.js.map +0 -1
  86. package/esm/data-editing/form-edit-state.js +0 -23
  87. package/esm/data-editing/form-edit-state.js.map +0 -1
  88. package/esm/data-editing/get-data-item-edit-control.js +0 -104
  89. package/esm/data-editing/get-data-item-edit-control.js.map +0 -1
  90. package/esm/data-editing/useEditForm.js +0 -256
  91. package/esm/data-editing/useEditForm.js.map +0 -1
  92. package/esm/datasource-provider/VuuDataSourceProvider.js +0 -32
  93. package/esm/datasource-provider/VuuDataSourceProvider.js.map +0 -1
  94. package/esm/datasource-provider/useAutoLoginToVuuServer.js +0 -50
  95. package/esm/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
  96. package/esm/hooks/useLookupValues.js +0 -98
  97. package/esm/hooks/useLookupValues.js.map +0 -1
  98. package/esm/hooks/useSessionDataSource.js +0 -56
  99. package/esm/hooks/useSessionDataSource.js.map +0 -1
  100. package/esm/hooks/useTypeaheadSuggestions.js +0 -54
  101. package/esm/hooks/useTypeaheadSuggestions.js.map +0 -1
  102. package/esm/hooks/useVisualLinks.js +0 -82
  103. package/esm/hooks/useVisualLinks.js.map +0 -1
  104. package/esm/hooks/useVuuMenuActions.js +0 -348
  105. package/esm/hooks/useVuuMenuActions.js.map +0 -1
  106. package/esm/hooks/useVuuTables.js +0 -36
  107. package/esm/hooks/useVuuTables.js.map +0 -1
  108. package/esm/index.js +0 -16
  109. package/esm/index.js.map +0 -1
  110. package/esm/lost-connection-indicator/LostConnectionIndicator.css.js +0 -4
  111. package/esm/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
  112. package/esm/lost-connection-indicator/LostConnectionIndicator.js +0 -22
  113. package/esm/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
  114. package/esm/lost-connection-indicator/useLostConnection.js +0 -32
  115. package/esm/lost-connection-indicator/useLostConnection.js.map +0 -1
  116. package/esm/session-editing-form/SessionEditingForm.css.js +0 -4
  117. package/esm/session-editing-form/SessionEditingForm.css.js.map +0 -1
  118. package/esm/session-editing-form/SessionEditingForm.js +0 -268
  119. package/esm/session-editing-form/SessionEditingForm.js.map +0 -1
@@ -1,98 +0,0 @@
1
- import { VuuDataSource } from '@vuu-ui/vuu-data-remote';
2
- import { useShellContext, isTypeDescriptor, isValueListRenderer, getSelectedOption, buildColumnMap, Range, isLookupRenderer } from '@vuu-ui/vuu-utils';
3
- import { useMemo, useState } from 'react';
4
-
5
- const NO_VALUES = [];
6
- const toListOption = (value) => ({
7
- label: value,
8
- value
9
- });
10
- const lookupValueMap = /* @__PURE__ */ new Map();
11
- const loadLookupValues = ({
12
- labelColumn,
13
- table,
14
- valueColumn
15
- }) => {
16
- const tableKey = `${table.module}:${table.table}`;
17
- const lookupValues = lookupValueMap.get(tableKey);
18
- if (lookupValues) {
19
- return lookupValues;
20
- } else {
21
- const promise = new Promise((resolve) => {
22
- const columns = [valueColumn, labelColumn];
23
- const columnMap = buildColumnMap(columns);
24
- const dataSource = new VuuDataSource({
25
- bufferSize: 0,
26
- table
27
- });
28
- dataSource.subscribe(
29
- {
30
- columns,
31
- range: Range(0, 100)
32
- },
33
- (message) => {
34
- if (message.type === "viewport-update") {
35
- if (message.rows) {
36
- const listOptions = message.rows.map((row) => ({
37
- value: row[columnMap[valueColumn]],
38
- label: row[columnMap[labelColumn]]
39
- }));
40
- resolve(listOptions);
41
- dataSource.unsubscribe();
42
- }
43
- }
44
- }
45
- );
46
- });
47
- lookupValueMap.set(tableKey, promise);
48
- return promise;
49
- }
50
- };
51
- const getLookupDetails = ({ name, type }) => {
52
- if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {
53
- return type.renderer.lookup;
54
- } else {
55
- throw Error(
56
- `useLookupValues column ${name} is not configured to use lookup values`
57
- );
58
- }
59
- };
60
- const useLookupValues = (column, initialValueProp) => {
61
- const { type: columnType } = column;
62
- const { getLookupValues } = useShellContext();
63
- const initialState = useMemo(() => {
64
- if (isTypeDescriptor(columnType) && isValueListRenderer(columnType?.renderer)) {
65
- const values2 = columnType.renderer.values.map(toListOption);
66
- return {
67
- initialValue: getSelectedOption(values2, initialValueProp) ?? null,
68
- values: values2
69
- };
70
- } else {
71
- const lookupDetails = getLookupDetails(column);
72
- const values2 = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;
73
- return {
74
- initialValue: getSelectedOption(values2, initialValueProp) ?? null,
75
- values: values2
76
- };
77
- }
78
- }, [column, columnType, getLookupValues, initialValueProp]);
79
- const [{ initialValue, values }, setLookupState] = useState(initialState);
80
- useMemo(() => {
81
- if (values === NO_VALUES) {
82
- const lookupDetails = getLookupDetails(column);
83
- loadLookupValues(lookupDetails).then(
84
- (values2) => setLookupState({
85
- initialValue: getSelectedOption(values2, initialValueProp) ?? null,
86
- values: values2
87
- })
88
- );
89
- }
90
- }, [values, column, initialValueProp]);
91
- return {
92
- initialValue,
93
- values
94
- };
95
- };
96
-
97
- export { useLookupValues };
98
- //# sourceMappingURL=useLookupValues.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLookupValues.js","sources":["../../../../packages/vuu-data-react/src/hooks/useLookupValues.ts"],"sourcesContent":["import {\n ColumnDescriptor,\n ListOption,\n LookupTableDetails,\n} from \"@vuu-ui/vuu-table-types\";\nimport { VuuDataSource } from \"@vuu-ui/vuu-data-remote\";\nimport {\n buildColumnMap,\n getSelectedOption,\n isLookupRenderer,\n isTypeDescriptor,\n isValueListRenderer,\n Range,\n useShellContext,\n} from \"@vuu-ui/vuu-utils\";\nimport { useMemo, useState } from \"react\";\n\nconst NO_VALUES: ListOption[] = [];\n\nconst toListOption = (value: string): ListOption => ({\n label: value,\n value,\n});\n\nconst lookupValueMap = new Map<string, Promise<ListOption[]>>();\n\nconst loadLookupValues = ({\n labelColumn,\n table,\n valueColumn,\n}: LookupTableDetails): Promise<ListOption[]> => {\n const tableKey = `${table.module}:${table.table}`;\n const lookupValues = lookupValueMap.get(tableKey);\n if (lookupValues) {\n return lookupValues;\n } else {\n const promise: Promise<ListOption[]> = new Promise((resolve) => {\n const columns = [valueColumn, labelColumn];\n const columnMap = buildColumnMap(columns);\n const dataSource = new VuuDataSource({\n bufferSize: 0,\n table,\n });\n dataSource.subscribe(\n {\n columns,\n range: Range(0, 100),\n },\n (message) => {\n if (message.type === \"viewport-update\") {\n //TODO check we have full dataset\n if (message.rows) {\n const listOptions = message.rows.map<ListOption>((row) => ({\n value: row[columnMap[valueColumn]] as string | number,\n label: row[columnMap[labelColumn]] as string,\n }));\n resolve(listOptions);\n dataSource.unsubscribe();\n }\n }\n },\n );\n });\n lookupValueMap.set(tableKey, promise);\n return promise;\n }\n};\n\ntype LookupState = {\n initialValue: ListOption | null;\n values: ListOption[];\n};\n\nconst getLookupDetails = ({ name, type }: ColumnDescriptor) => {\n if (isTypeDescriptor(type) && isLookupRenderer(type.renderer)) {\n return type.renderer.lookup;\n } else {\n throw Error(\n `useLookupValues column ${name} is not configured to use lookup values`,\n );\n }\n};\n\nexport const useLookupValues = (\n column: ColumnDescriptor,\n initialValueProp: number | string,\n) => {\n const { type: columnType } = column;\n const { getLookupValues } = useShellContext();\n\n const initialState = useMemo<LookupState>(() => {\n if (\n isTypeDescriptor(columnType) &&\n isValueListRenderer(columnType?.renderer)\n ) {\n const values = columnType.renderer.values.map(toListOption);\n return {\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n };\n } else {\n const lookupDetails = getLookupDetails(column);\n const values = getLookupValues?.(lookupDetails.table) ?? NO_VALUES;\n\n return {\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n };\n }\n }, [column, columnType, getLookupValues, initialValueProp]);\n\n const [{ initialValue, values }, setLookupState] =\n useState<LookupState>(initialState);\n\n useMemo(() => {\n if (values === NO_VALUES) {\n const lookupDetails = getLookupDetails(column);\n loadLookupValues(lookupDetails).then((values) =>\n setLookupState({\n initialValue: getSelectedOption(values, initialValueProp) ?? null,\n values,\n }),\n );\n }\n }, [values, column, initialValueProp]);\n\n return {\n initialValue,\n values,\n };\n};\n"],"names":["values"],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- import { useData } from '@vuu-ui/vuu-utils';
2
- import { useRef, useCallback } from 'react';
3
-
4
- const sessionState = /* @__PURE__ */ new Map();
5
- const useSessionDataSource = (props) => {
6
- const { VuuDataSource } = useData();
7
- const dataSourceConfigRef = useRef(void 0);
8
- const getDataSource = useCallback(
9
- (sessionKey, dataSourceConstructorProps) => {
10
- let ds = sessionState.get(sessionKey);
11
- if (ds) {
12
- return ds;
13
- }
14
- if (dataSourceConstructorProps?.columns) {
15
- ds = new VuuDataSource({
16
- ...dataSourceConstructorProps,
17
- viewport: sessionKey,
18
- ...dataSourceConfigRef.current
19
- });
20
- if (props?.onConfigChange) {
21
- ds.on("config", props.onConfigChange);
22
- }
23
- sessionState.set(sessionKey, ds);
24
- return ds;
25
- } else {
26
- throw Error(
27
- `[useSessionDataSource] unable to create new DataSource, columns have not been defined `
28
- );
29
- }
30
- },
31
- [VuuDataSource, props?.onConfigChange]
32
- );
33
- const clearDataSource = useCallback(
34
- (sessionKey, unsubscribe) => {
35
- const ds = sessionState.get(sessionKey);
36
- if (ds) {
37
- sessionState.delete(sessionKey);
38
- if (unsubscribe === true) {
39
- ds.unsubscribe();
40
- }
41
- } else {
42
- console.warn(
43
- `[useSessionbDatasource] clearDataSource ${sessionKey} not found `
44
- );
45
- }
46
- },
47
- []
48
- );
49
- return {
50
- clearDataSource,
51
- getDataSource
52
- };
53
- };
54
-
55
- export { useSessionDataSource };
56
- //# sourceMappingURL=useSessionDataSource.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSessionDataSource.js","sources":["../../../../packages/vuu-data-react/src/hooks/useSessionDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConfigChangeHandler,\n DataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useData } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useRef } from \"react\";\n\nconst sessionState = new Map<string, DataSource>();\n\nexport interface SessionStateHookProps {\n onConfigChange?: DataSourceConfigChangeHandler;\n}\n\nexport const useSessionDataSource = (props?: SessionStateHookProps) => {\n const { VuuDataSource } = useData();\n\n const dataSourceConfigRef = useRef<DataSourceConfig | undefined>(undefined);\n\n const getDataSource = useCallback(\n (\n sessionKey: string,\n dataSourceConstructorProps?: DataSourceConstructorProps,\n ) => {\n let ds = sessionState.get(sessionKey);\n if (ds) {\n return ds;\n }\n\n if (dataSourceConstructorProps?.columns) {\n ds = new VuuDataSource({\n ...dataSourceConstructorProps,\n viewport: sessionKey,\n ...dataSourceConfigRef.current,\n });\n if (props?.onConfigChange) {\n ds.on(\"config\", props.onConfigChange);\n }\n sessionState.set(sessionKey, ds);\n return ds;\n } else {\n throw Error(\n `[useSessionDataSource] unable to create new DataSource, columns have not been defined `,\n );\n }\n },\n [VuuDataSource, props?.onConfigChange],\n );\n\n const clearDataSource = useCallback(\n (sessionKey: string, unsubscribe?: boolean) => {\n const ds = sessionState.get(sessionKey);\n if (ds) {\n sessionState.delete(sessionKey);\n if (unsubscribe === true) {\n ds.unsubscribe();\n }\n } else {\n console.warn(\n `[useSessionbDatasource] clearDataSource ${sessionKey} not found `,\n );\n }\n },\n [],\n );\n\n return {\n clearDataSource,\n getDataSource,\n };\n};\n"],"names":[],"mappings":";;;AASA,MAAM,YAAA,uBAAmB,GAAwB,EAAA;AAMpC,MAAA,oBAAA,GAAuB,CAAC,KAAkC,KAAA;AACrE,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,OAAQ,EAAA;AAElC,EAAM,MAAA,mBAAA,GAAsB,OAAqC,KAAS,CAAA,CAAA;AAE1E,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CACE,YACA,0BACG,KAAA;AACH,MAAI,IAAA,EAAA,GAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACpC,MAAA,IAAI,EAAI,EAAA;AACN,QAAO,OAAA,EAAA;AAAA;AAGT,MAAA,IAAI,4BAA4B,OAAS,EAAA;AACvC,QAAA,EAAA,GAAK,IAAI,aAAc,CAAA;AAAA,UACrB,GAAG,0BAAA;AAAA,UACH,QAAU,EAAA,UAAA;AAAA,UACV,GAAG,mBAAoB,CAAA;AAAA,SACxB,CAAA;AACD,QAAA,IAAI,OAAO,cAAgB,EAAA;AACzB,UAAG,EAAA,CAAA,EAAA,CAAG,QAAU,EAAA,KAAA,CAAM,cAAc,CAAA;AAAA;AAEtC,QAAa,YAAA,CAAA,GAAA,CAAI,YAAY,EAAE,CAAA;AAC/B,QAAO,OAAA,EAAA;AAAA,OACF,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,sFAAA;AAAA,SACF;AAAA;AACF,KACF;AAAA,IACA,CAAC,aAAe,EAAA,KAAA,EAAO,cAAc;AAAA,GACvC;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,YAAoB,WAA0B,KAAA;AAC7C,MAAM,MAAA,EAAA,GAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACtC,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,YAAA,CAAa,OAAO,UAAU,CAAA;AAC9B,QAAA,IAAI,gBAAgB,IAAM,EAAA;AACxB,UAAA,EAAA,CAAG,WAAY,EAAA;AAAA;AACjB,OACK,MAAA;AACL,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,2CAA2C,UAAU,CAAA,WAAA;AAAA,SACvD;AAAA;AACF,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAO,OAAA;AAAA,IACL,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,54 +0,0 @@
1
- import { useDataSource } 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 dataSource = useDataSource(false);
12
- return useCallback(
13
- async ([{ module, table }, column, starts]) => {
14
- if (dataSource === void 0) {
15
- console.warn(
16
- `[useTypeaheadSuggestions] no dataSource provided (use DataSourceProvider)`
17
- );
18
- return false;
19
- }
20
- const rpcMessage = starts === void 0 ? {
21
- params: {
22
- column,
23
- module,
24
- table
25
- },
26
- rpcName: "getUniqueFieldValues",
27
- type: "RPC_REQUEST"
28
- } : {
29
- params: {
30
- column,
31
- module,
32
- starts,
33
- table
34
- },
35
- rpcName: "getUniqueFieldValuesStartingWith",
36
- type: "RPC_REQUEST"
37
- };
38
- try {
39
- const response = await dataSource.rpcRequest?.(rpcMessage);
40
- if (response?.type === "SUCCESS_RESULT") {
41
- return response.data;
42
- } else {
43
- return false;
44
- }
45
- } catch (err) {
46
- return false;
47
- }
48
- },
49
- [dataSource]
50
- );
51
- };
52
-
53
- export { getTypeaheadParams, useTypeaheadSuggestions };
54
- //# sourceMappingURL=useTypeaheadSuggestions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTypeaheadSuggestions.js","sources":["../../../../packages/vuu-data-react/src/hooks/useTypeaheadSuggestions.ts"],"sourcesContent":["import { SuggestionFetcher, TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport {\n TypeaheadParams,\n VuuRpcServiceRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useDataSource } 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 dataSource = useDataSource(false);\n return useCallback<SuggestionFetcher>(\n async ([{ module, table }, column, starts]: TypeaheadParams) => {\n if (dataSource === undefined) {\n console.warn(\n `[useTypeaheadSuggestions] no dataSource provided (use DataSourceProvider)`,\n );\n return false;\n }\n const rpcMessage: Omit<VuuRpcServiceRequest, \"context\"> =\n starts === undefined\n ? {\n params: {\n column,\n module,\n table,\n },\n rpcName: \"getUniqueFieldValues\",\n type: \"RPC_REQUEST\",\n }\n : {\n params: {\n column,\n module,\n starts,\n table,\n },\n rpcName: \"getUniqueFieldValuesStartingWith\",\n type: \"RPC_REQUEST\",\n };\n\n try {\n // We don't just return 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 dataSource.rpcRequest?.(rpcMessage);\n if (response?.type === \"SUCCESS_RESULT\") {\n return response.data as string[];\n } else {\n return false;\n }\n } catch (err) {\n return false;\n }\n },\n [dataSource],\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,UAAA,GAAa,cAAc,KAAK,CAAA;AACtC,EAAO,OAAA,WAAA;AAAA,IACL,OAAO,CAAC,EAAE,MAAA,EAAQ,OAAS,EAAA,MAAA,EAAQ,MAAM,CAAuB,KAAA;AAC9D,MAAA,IAAI,eAAe,KAAW,CAAA,EAAA;AAC5B,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,CAAA,yEAAA;AAAA,SACF;AACA,QAAO,OAAA,KAAA;AAAA;AAET,MAAM,MAAA,UAAA,GACJ,WAAW,KACP,CAAA,GAAA;AAAA,QACE,MAAQ,EAAA;AAAA,UACN,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,OAAS,EAAA,sBAAA;AAAA,QACT,IAAM,EAAA;AAAA,OAER,GAAA;AAAA,QACE,MAAQ,EAAA;AAAA,UACN,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,OAAS,EAAA,kCAAA;AAAA,QACT,IAAM,EAAA;AAAA,OACR;AAEN,MAAI,IAAA;AAIF,QAAA,MAAM,QAAW,GAAA,MAAM,UAAW,CAAA,UAAA,GAAa,UAAU,CAAA;AACzD,QAAI,IAAA,QAAA,EAAU,SAAS,gBAAkB,EAAA;AACvC,UAAA,OAAO,QAAS,CAAA,IAAA;AAAA,SACX,MAAA;AACL,UAAO,OAAA,KAAA;AAAA;AACT,eACO,GAAK,EAAA;AACZ,QAAO,OAAA,KAAA;AAAA;AACT,KACF;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AACF;;;;"}
@@ -1,82 +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
- appearance: "transparent",
56
- "aria-label": "remove-link",
57
- icon: "link",
58
- onClick: removeVisualLink,
59
- onMouseEnter: highlightVisualLinkTarget,
60
- onMouseLeave: clearVisualLinkTarget,
61
- sentiment: "neutral"
62
- }
63
- )
64
- });
65
- }, [
66
- dispatch,
67
- removeVisualLink,
68
- highlightVisualLinkTarget,
69
- clearVisualLinkTarget
70
- ]);
71
- useEffect(() => {
72
- dataSource.on("visual-link-created", handleLinkCreated);
73
- dataSource.on("visual-link-removed", handleLinkRemoved);
74
- return () => {
75
- dataSource.removeListener("visual-link-created", handleLinkCreated);
76
- dataSource.removeListener("visual-link-removed", handleLinkRemoved);
77
- };
78
- }, [dataSource, handleLinkCreated, handleLinkRemoved]);
79
- };
80
-
81
- export { useVisualLinks };
82
- //# sourceMappingURL=useVisualLinks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useVisualLinks.js","sources":["../../../../packages/vuu-data-react/src/hooks/useVisualLinks.tsx"],"sourcesContent":["import type { 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 appearance=\"transparent\"\n aria-label=\"remove-link\"\n icon=\"link\"\n onClick={removeVisualLink}\n onMouseEnter={highlightVisualLinkTarget}\n onMouseLeave={clearVisualLinkTarget}\n sentiment=\"neutral\"\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,UAAW,EAAA,aAAA;AAAA,UACX,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,SAAU,EAAA;AAAA;AAAA;AACZ,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,348 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { Button } from '@salt-ds/core';
3
- import { isGroupMenuItemDescriptor, hasShowNotificationAction } from '@vuu-ui/vuu-context-menu';
4
- import { getFilterPredicate } from '@vuu-ui/vuu-filter-parser';
5
- import { useNotifications, NotificationType } from '@vuu-ui/vuu-notifications';
6
- import { isTableLocation, BulkEditPanel } from '@vuu-ui/vuu-table';
7
- import { useData, getLayoutComponent, isActionMessage, isSessionTableActionMessage, isCustomComponentActionMessage } from '@vuu-ui/vuu-utils';
8
- import { useCallback } from 'react';
9
- import { SessionEditingForm } from '../session-editing-form/SessionEditingForm.js';
10
- import { useModal } from '@vuu-ui/vuu-ui-controls';
11
-
12
- const isRoot = (menu) => menu.name === "ROOT";
13
- const isCellMenu = (options) => options.context === "cell";
14
- const isRowMenu = (options) => options.context === "row";
15
- const isSelectionMenu = (options) => options.context === "selected-rows";
16
- const isVuuMenuItem = (menu) => "rpcName" in menu;
17
- const isGroupMenuItem = (menu) => "menus" in menu;
18
- const hasFilter = ({ filter }) => typeof filter === "string" && filter.length > 0;
19
- const getMenuItemOptions = (menu, options) => {
20
- switch (menu.context) {
21
- case "cell":
22
- return {
23
- ...menu,
24
- field: options.column.name,
25
- rowKey: options.dataRow.key,
26
- value: options.dataRow[options.column.name]
27
- };
28
- case "row":
29
- return {
30
- ...menu,
31
- columns: options.columns,
32
- row: options.dataRow,
33
- rowKey: options.dataRow.key
34
- };
35
- case "selected-rows":
36
- return {
37
- ...menu,
38
- columns: options.columns
39
- };
40
- default:
41
- return menu;
42
- }
43
- };
44
- const vuuContextCompatibleWithTableLocation = (uiLocation, vuuContext, selectedRowCount = 0) => {
45
- switch (uiLocation) {
46
- case "grid":
47
- if (vuuContext === "selected-rows") {
48
- return selectedRowCount > 0;
49
- } else {
50
- return true;
51
- }
52
- case "header":
53
- return vuuContext === "grid";
54
- default:
55
- return false;
56
- }
57
- };
58
- const gridRowMeetsFilterCriteria = (context, dataRow, selectedRows, filter) => {
59
- if (context === "cell" || context === "row") {
60
- const filterPredicate = getFilterPredicate(filter);
61
- return filterPredicate(dataRow);
62
- } else if (context === "selected-rows") {
63
- if (selectedRows.length === 0) {
64
- return false;
65
- } else {
66
- const filterPredicate = getFilterPredicate(filter);
67
- return selectedRows.every(filterPredicate);
68
- }
69
- }
70
- return true;
71
- };
72
- const menuShouldBeRenderedInThisContext = (menuItem, tableLocation, options) => {
73
- if (isGroupMenuItem(menuItem)) {
74
- return menuItem.menus.some(
75
- (childMenu) => menuShouldBeRenderedInThisContext(childMenu, tableLocation, options)
76
- );
77
- }
78
- if (!vuuContextCompatibleWithTableLocation(
79
- tableLocation,
80
- menuItem.context,
81
- options.selectedRows?.length
82
- )) {
83
- return false;
84
- }
85
- if (tableLocation === "grid" && hasFilter(menuItem)) {
86
- return gridRowMeetsFilterCriteria(
87
- menuItem.context,
88
- options.dataRow,
89
- options.selectedRows,
90
- menuItem.filter
91
- );
92
- }
93
- if (isCellMenu(menuItem) && menuItem.field !== "*") {
94
- return menuItem.field === options.column.name;
95
- }
96
- return true;
97
- };
98
- const buildMenuDescriptorFromVuuMenu = (menu, tableLocation, options) => {
99
- if (menuShouldBeRenderedInThisContext(menu, tableLocation, options)) {
100
- if (isVuuMenuItem(menu)) {
101
- return {
102
- label: menu.name,
103
- id: "MENU_RPC_CALL",
104
- options: getMenuItemOptions(menu, options)
105
- };
106
- } else {
107
- const children = menu.menus.map(
108
- (childMenu) => buildMenuDescriptorFromVuuMenu(childMenu, tableLocation, options)
109
- ).filter(
110
- (childMenu) => childMenu !== void 0
111
- );
112
- if (children.length > 0) {
113
- return {
114
- label: menu.name,
115
- children
116
- };
117
- }
118
- }
119
- }
120
- };
121
- const keyFirst = (c1, c2) => c1.isKeyField ? -1 : c2.isKeyField ? 1 : 0;
122
- const defaultFormConfig = {
123
- fields: [],
124
- key: "",
125
- title: ""
126
- };
127
- const configFromSchema = (schema) => {
128
- if (schema) {
129
- const { columns, key } = schema;
130
- return {
131
- key,
132
- title: `Parameters for command`,
133
- fields: columns.map((col) => ({
134
- description: col.name,
135
- label: col.name,
136
- name: col.name,
137
- type: col.serverDataType,
138
- isKeyField: col.name === key
139
- })).sort(keyFirst)
140
- };
141
- }
142
- };
143
- const getFormConfig = (action) => {
144
- const { tableSchema: schema } = action;
145
- const config = configFromSchema(schema) ?? defaultFormConfig;
146
- return {
147
- config,
148
- schema
149
- };
150
- };
151
- const useVuuMenuActions = ({
152
- clientSideMenuActionHandler,
153
- dataSource,
154
- onRpcResponse
155
- }) => {
156
- const { VuuDataSource } = useData();
157
- const menuBuilder = useCallback(
158
- (location, options) => {
159
- const descriptors = [];
160
- if (dataSource) {
161
- const { links, menu } = dataSource;
162
- const { visualLink } = dataSource;
163
- if (location === "grid" && links && !visualLink) {
164
- links.forEach((linkDescriptor) => {
165
- const { link, label: linkLabel } = linkDescriptor;
166
- const label = linkLabel ? linkLabel : link.toTable;
167
- descriptors.push({
168
- label: `Link to ${label}`,
169
- id: "link-table",
170
- options: linkDescriptor
171
- });
172
- });
173
- }
174
- if (menu && isTableLocation(location)) {
175
- const menuDescriptor = buildMenuDescriptorFromVuuMenu(
176
- menu,
177
- location,
178
- options
179
- );
180
- if (isRoot(menu) && isGroupMenuItemDescriptor(menuDescriptor)) {
181
- descriptors.push(...menuDescriptor.children);
182
- } else if (menuDescriptor) {
183
- descriptors.push(menuDescriptor);
184
- }
185
- }
186
- } else {
187
- throw Error("useVuuMenuActions no dataSource provided");
188
- }
189
- return descriptors;
190
- },
191
- [dataSource]
192
- );
193
- const { showDialog, closeDialog, showPrompt } = useModal();
194
- const { showNotification } = useNotifications();
195
- const showCustomComponentInDialog = useCallback(
196
- (componentId, ds, table) => {
197
- const sessionDs = new VuuDataSource({
198
- columns: ds.columns,
199
- table,
200
- viewport: table.table
201
- });
202
- const handleOpenChangePrompt = (open) => {
203
- if (!open) {
204
- ds.unsubscribe();
205
- }
206
- };
207
- const Component = getLayoutComponent(componentId);
208
- showPrompt(/* @__PURE__ */ jsx(Component, { dataSource: sessionDs }), {
209
- title: "Confirm operation on selected rows",
210
- onOpenChange: handleOpenChangePrompt
211
- });
212
- },
213
- [VuuDataSource, showPrompt]
214
- );
215
- const showSessionEditingForm = useCallback(
216
- async (ds, action) => {
217
- const { tableSchema } = action;
218
- if (tableSchema) {
219
- const formConfig = getFormConfig(action);
220
- showDialog(
221
- /* @__PURE__ */ jsx(SessionEditingForm, { ...formConfig, onClose: closeDialog }),
222
- "Set Parameters"
223
- );
224
- }
225
- const sessionDs = await ds.createSessionDataSource?.("All");
226
- const handleSubmit = () => {
227
- sessionDs?.rpcRequest?.({
228
- params: {
229
- save: true
230
- },
231
- rpcName: "endEditSession",
232
- type: "RPC_REQUEST"
233
- });
234
- closeDialog();
235
- };
236
- if (sessionDs) {
237
- showDialog(
238
- /* @__PURE__ */ jsx(
239
- BulkEditPanel,
240
- {
241
- sessionDs,
242
- onSubmit: handleSubmit,
243
- parentDs: ds
244
- }
245
- ),
246
- "Multi Row Edit",
247
- [
248
- /* @__PURE__ */ jsx(Button, { onClick: closeDialog, children: "Cancel" }, "cancel"),
249
- /* @__PURE__ */ jsx(Button, { onClick: handleSubmit, children: "Save" }, "submit")
250
- ]
251
- );
252
- }
253
- },
254
- [closeDialog, showDialog]
255
- );
256
- const getMenuRpcRequest = (options) => {
257
- const { rpcName } = options;
258
- if (isCellMenu(options)) {
259
- return {
260
- field: options.field,
261
- rowKey: options.rowKey,
262
- rpcName,
263
- value: options.value,
264
- type: "VIEW_PORT_MENU_CELL_RPC"
265
- };
266
- } else if (isRowMenu(options)) {
267
- return {
268
- rowKey: options.rowKey,
269
- row: options.row,
270
- rpcName,
271
- type: "VIEW_PORT_MENU_ROW_RPC"
272
- };
273
- } else if (isSelectionMenu(options)) {
274
- return {
275
- rpcName,
276
- type: "VIEW_PORT_MENUS_SELECT_RPC"
277
- };
278
- } else {
279
- return {
280
- rpcName,
281
- type: "VIEW_PORT_MENU_TABLE_RPC"
282
- };
283
- }
284
- };
285
- const menuActionHandler = useCallback(
286
- (menuItemId, options) => {
287
- if (clientSideMenuActionHandler?.(menuItemId, options)) {
288
- return true;
289
- } else if (menuItemId === "MENU_RPC_CALL") {
290
- const rpcRequest = getMenuRpcRequest(options);
291
- dataSource?.menuRpcCall(rpcRequest).then((rpcResponse) => {
292
- if (rpcResponse) {
293
- if (onRpcResponse?.(rpcResponse) === true) {
294
- return true;
295
- }
296
- if (isActionMessage(rpcResponse)) {
297
- if (hasShowNotificationAction(rpcResponse)) {
298
- const {
299
- action: { message, title = "Success" }
300
- } = rpcResponse;
301
- showNotification({
302
- status: "success",
303
- content: message,
304
- header: title,
305
- type: NotificationType.Toast
306
- });
307
- } else if (isSessionTableActionMessage(rpcResponse)) {
308
- showSessionEditingForm(dataSource, rpcResponse.action);
309
- } else if (isCustomComponentActionMessage(rpcResponse)) {
310
- showCustomComponentInDialog(
311
- rpcResponse.action.renderComponent,
312
- dataSource,
313
- rpcResponse.action.table
314
- );
315
- }
316
- }
317
- }
318
- });
319
- return true;
320
- } else if (menuItemId === "link-table") {
321
- if (dataSource) {
322
- dataSource.visualLink = options;
323
- }
324
- return true;
325
- } else {
326
- console.log(
327
- `useViewServer handleMenuAction, can't handle action type ${menuItemId}`
328
- );
329
- }
330
- return false;
331
- },
332
- [
333
- clientSideMenuActionHandler,
334
- dataSource,
335
- onRpcResponse,
336
- showCustomComponentInDialog,
337
- showNotification,
338
- showSessionEditingForm
339
- ]
340
- );
341
- return {
342
- menuBuilder,
343
- menuActionHandler
344
- };
345
- };
346
-
347
- export { isRowMenu, isSelectionMenu, useVuuMenuActions };
348
- //# sourceMappingURL=useVuuMenuActions.js.map