@vuu-ui/vuu-data-react 3.0.0 → 3.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +24 -20
- package/src/data-editing/EditForm.css.js +53 -0
- package/src/data-editing/EditForm.js +82 -0
- package/src/data-editing/UnsavedChangesReport.css.js +27 -0
- package/src/data-editing/UnsavedChangesReport.js +41 -0
- package/src/data-editing/edit-rule-validation-checker.js +30 -0
- package/src/data-editing/edit-validation-rules.js +33 -0
- package/src/data-editing/form-edit-state.js +16 -0
- package/src/data-editing/get-data-item-edit-control.js +63 -0
- package/src/data-editing/index.js +6 -0
- package/src/data-editing/useEditForm.js +253 -0
- package/src/datasource-provider/VuuDataSourceProvider.js +20 -0
- package/src/datasource-provider/index.js +1 -0
- package/src/datasource-provider/useAutoLoginToVuuServer.js +42 -0
- package/src/hooks/useLookupValues.js +93 -0
- package/src/hooks/useSessionDataSource.js +37 -0
- package/src/hooks/useTypeaheadSuggestions.js +50 -0
- package/src/hooks/useVisualLinks.js +87 -0
- package/src/hooks/useVuuMenuActions.js +269 -0
- package/src/hooks/useVuuTables.js +32 -0
- package/src/index.js +10 -0
- package/src/lost-connection-indicator/LostConnectionIndicator.css.js +29 -0
- package/src/lost-connection-indicator/LostConnectionIndicator.js +30 -0
- package/src/lost-connection-indicator/useLostConnection.js +28 -0
- package/src/session-editing-form/SessionEditingForm.css.js +47 -0
- package/src/session-editing-form/SessionEditingForm.js +236 -0
- package/src/session-editing-form/index.js +1 -0
- package/cjs/data-editing/EditForm.css.js +0 -6
- package/cjs/data-editing/EditForm.css.js.map +0 -1
- package/cjs/data-editing/EditForm.js +0 -90
- package/cjs/data-editing/EditForm.js.map +0 -1
- package/cjs/data-editing/UnsavedChangesReport.css.js +0 -6
- package/cjs/data-editing/UnsavedChangesReport.css.js.map +0 -1
- package/cjs/data-editing/UnsavedChangesReport.js +0 -29
- package/cjs/data-editing/UnsavedChangesReport.js.map +0 -1
- package/cjs/data-editing/edit-rule-validation-checker.js +0 -41
- package/cjs/data-editing/edit-rule-validation-checker.js.map +0 -1
- package/cjs/data-editing/edit-validation-rules.js +0 -52
- package/cjs/data-editing/edit-validation-rules.js.map +0 -1
- package/cjs/data-editing/form-edit-state.js +0 -26
- package/cjs/data-editing/form-edit-state.js.map +0 -1
- package/cjs/data-editing/get-data-item-edit-control.js +0 -106
- package/cjs/data-editing/get-data-item-edit-control.js.map +0 -1
- package/cjs/data-editing/useEditForm.js +0 -258
- package/cjs/data-editing/useEditForm.js.map +0 -1
- package/cjs/datasource-provider/VuuDataSourceProvider.js +0 -34
- package/cjs/datasource-provider/VuuDataSourceProvider.js.map +0 -1
- package/cjs/datasource-provider/useAutoLoginToVuuServer.js +0 -52
- package/cjs/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
- package/cjs/hooks/useLookupValues.js +0 -100
- package/cjs/hooks/useLookupValues.js.map +0 -1
- package/cjs/hooks/useSessionDataSource.js +0 -58
- package/cjs/hooks/useSessionDataSource.js.map +0 -1
- package/cjs/hooks/useTypeaheadSuggestions.js +0 -57
- package/cjs/hooks/useTypeaheadSuggestions.js.map +0 -1
- package/cjs/hooks/useVisualLinks.js +0 -84
- package/cjs/hooks/useVisualLinks.js.map +0 -1
- package/cjs/hooks/useVuuMenuActions.js +0 -352
- package/cjs/hooks/useVuuMenuActions.js.map +0 -1
- package/cjs/hooks/useVuuTables.js +0 -38
- package/cjs/hooks/useVuuTables.js.map +0 -1
- package/cjs/index.js +0 -42
- package/cjs/index.js.map +0 -1
- package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js +0 -6
- package/cjs/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
- package/cjs/lost-connection-indicator/LostConnectionIndicator.js +0 -24
- package/cjs/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
- package/cjs/lost-connection-indicator/useLostConnection.js +0 -34
- package/cjs/lost-connection-indicator/useLostConnection.js.map +0 -1
- package/cjs/session-editing-form/SessionEditingForm.css.js +0 -6
- package/cjs/session-editing-form/SessionEditingForm.css.js.map +0 -1
- package/cjs/session-editing-form/SessionEditingForm.js +0 -270
- package/cjs/session-editing-form/SessionEditingForm.js.map +0 -1
- package/esm/data-editing/EditForm.css.js +0 -4
- package/esm/data-editing/EditForm.css.js.map +0 -1
- package/esm/data-editing/EditForm.js +0 -88
- package/esm/data-editing/EditForm.js.map +0 -1
- package/esm/data-editing/UnsavedChangesReport.css.js +0 -4
- package/esm/data-editing/UnsavedChangesReport.css.js.map +0 -1
- package/esm/data-editing/UnsavedChangesReport.js +0 -27
- package/esm/data-editing/UnsavedChangesReport.js.map +0 -1
- package/esm/data-editing/edit-rule-validation-checker.js +0 -37
- package/esm/data-editing/edit-rule-validation-checker.js.map +0 -1
- package/esm/data-editing/edit-validation-rules.js +0 -50
- package/esm/data-editing/edit-validation-rules.js.map +0 -1
- package/esm/data-editing/form-edit-state.js +0 -23
- package/esm/data-editing/form-edit-state.js.map +0 -1
- package/esm/data-editing/get-data-item-edit-control.js +0 -104
- package/esm/data-editing/get-data-item-edit-control.js.map +0 -1
- package/esm/data-editing/useEditForm.js +0 -256
- package/esm/data-editing/useEditForm.js.map +0 -1
- package/esm/datasource-provider/VuuDataSourceProvider.js +0 -32
- package/esm/datasource-provider/VuuDataSourceProvider.js.map +0 -1
- package/esm/datasource-provider/useAutoLoginToVuuServer.js +0 -50
- package/esm/datasource-provider/useAutoLoginToVuuServer.js.map +0 -1
- package/esm/hooks/useLookupValues.js +0 -98
- package/esm/hooks/useLookupValues.js.map +0 -1
- package/esm/hooks/useSessionDataSource.js +0 -56
- package/esm/hooks/useSessionDataSource.js.map +0 -1
- package/esm/hooks/useTypeaheadSuggestions.js +0 -54
- package/esm/hooks/useTypeaheadSuggestions.js.map +0 -1
- package/esm/hooks/useVisualLinks.js +0 -82
- package/esm/hooks/useVisualLinks.js.map +0 -1
- package/esm/hooks/useVuuMenuActions.js +0 -348
- package/esm/hooks/useVuuMenuActions.js.map +0 -1
- package/esm/hooks/useVuuTables.js +0 -36
- package/esm/hooks/useVuuTables.js.map +0 -1
- package/esm/index.js +0 -16
- package/esm/index.js.map +0 -1
- package/esm/lost-connection-indicator/LostConnectionIndicator.css.js +0 -4
- package/esm/lost-connection-indicator/LostConnectionIndicator.css.js.map +0 -1
- package/esm/lost-connection-indicator/LostConnectionIndicator.js +0 -22
- package/esm/lost-connection-indicator/LostConnectionIndicator.js.map +0 -1
- package/esm/lost-connection-indicator/useLostConnection.js +0 -32
- package/esm/lost-connection-indicator/useLostConnection.js.map +0 -1
- package/esm/session-editing-form/SessionEditingForm.css.js +0 -4
- package/esm/session-editing-form/SessionEditingForm.css.js.map +0 -1
- package/esm/session-editing-form/SessionEditingForm.js +0 -268
- 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
|