@pega/react-sdk-components 25.1.10 → 25.1.11
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/lib/components/designSystemExtension/AlertBanner/AlertBanner.css +46 -0
- package/lib/components/designSystemExtension/AlertBanner/AlertBanner.d.ts +2 -1
- package/lib/components/designSystemExtension/AlertBanner/AlertBanner.d.ts.map +1 -1
- package/lib/components/designSystemExtension/AlertBanner/AlertBanner.js +18 -16
- package/lib/components/designSystemExtension/AlertBanner/AlertBanner.js.map +1 -1
- package/lib/components/designSystemExtension/FieldGroupList/FieldGroupList.js +1 -1
- package/lib/components/designSystemExtension/FieldGroupList/FieldGroupList.js.map +1 -1
- package/lib/components/field/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/lib/components/field/SelectableCard/SelectableCard.js +13 -2
- package/lib/components/field/SelectableCard/SelectableCard.js.map +1 -1
- package/lib/components/infra/Assignment/Assignment.d.ts.map +1 -1
- package/lib/components/infra/Assignment/Assignment.js +6 -2
- package/lib/components/infra/Assignment/Assignment.js.map +1 -1
- package/lib/components/infra/Assignment/useValidationBanner.d.ts +7 -0
- package/lib/components/infra/Assignment/useValidationBanner.d.ts.map +1 -0
- package/lib/components/infra/Assignment/useValidationBanner.js +26 -0
- package/lib/components/infra/Assignment/useValidationBanner.js.map +1 -0
- package/lib/components/infra/Containers/FlowContainer/FlowContainer.d.ts.map +1 -1
- package/lib/components/infra/Containers/FlowContainer/FlowContainer.js +5 -6
- package/lib/components/infra/Containers/FlowContainer/FlowContainer.js.map +1 -1
- package/lib/components/infra/Containers/ModalViewContainer/ModalViewContainer.d.ts +4 -0
- package/lib/components/infra/Containers/ModalViewContainer/ModalViewContainer.d.ts.map +1 -1
- package/lib/components/infra/Containers/ModalViewContainer/ModalViewContainer.js +1 -1
- package/lib/components/infra/Containers/ModalViewContainer/ModalViewContainer.js.map +1 -1
- package/lib/components/infra/Containers/ViewContainer/ViewContainer.d.ts +4 -0
- package/lib/components/infra/Containers/ViewContainer/ViewContainer.d.ts.map +1 -1
- package/lib/components/infra/Containers/ViewContainer/ViewContainer.js +4 -7
- package/lib/components/infra/Containers/ViewContainer/ViewContainer.js.map +1 -1
- package/lib/components/infra/DeferLoad/DeferLoad.d.ts +1 -0
- package/lib/components/infra/DeferLoad/DeferLoad.d.ts.map +1 -1
- package/lib/components/infra/DeferLoad/DeferLoad.js +24 -9
- package/lib/components/infra/DeferLoad/DeferLoad.js.map +1 -1
- package/lib/components/infra/NavBar/NavBar.d.ts.map +1 -1
- package/lib/components/infra/NavBar/NavBar.js +6 -0
- package/lib/components/infra/NavBar/NavBar.js.map +1 -1
- package/lib/components/infra/Reference/Reference.d.ts.map +1 -1
- package/lib/components/infra/Reference/Reference.js +4 -0
- package/lib/components/infra/Reference/Reference.js.map +1 -1
- package/lib/components/infra/RootContainer/RootContainer.d.ts.map +1 -1
- package/lib/components/infra/RootContainer/RootContainer.js +4 -5
- package/lib/components/infra/RootContainer/RootContainer.js.map +1 -1
- package/lib/components/infra/View/View.d.ts.map +1 -1
- package/lib/components/infra/View/View.js +5 -6
- package/lib/components/infra/View/View.js.map +1 -1
- package/lib/components/template/AppShell/AppShell.css +0 -4
- package/lib/components/template/CaseSummary/CaseSummary.d.ts.map +1 -1
- package/lib/components/template/CaseSummary/CaseSummary.js +2 -6
- package/lib/components/template/CaseSummary/CaseSummary.js.map +1 -1
- package/lib/components/template/FieldGroupTemplate/FieldGroupTemplate.d.ts +1 -0
- package/lib/components/template/FieldGroupTemplate/FieldGroupTemplate.d.ts.map +1 -1
- package/lib/components/template/FieldGroupTemplate/FieldGroupTemplate.js +7 -3
- package/lib/components/template/FieldGroupTemplate/FieldGroupTemplate.js.map +1 -1
- package/lib/components/template/HierarchicalForm/HierarchicalForm.d.ts +4 -0
- package/lib/components/template/HierarchicalForm/HierarchicalForm.d.ts.map +1 -0
- package/lib/components/template/HierarchicalForm/HierarchicalForm.js +16 -0
- package/lib/components/template/HierarchicalForm/HierarchicalForm.js.map +1 -0
- package/lib/components/template/HierarchicalForm/hooks.d.ts +15 -0
- package/lib/components/template/HierarchicalForm/hooks.d.ts.map +1 -0
- package/lib/components/template/HierarchicalForm/hooks.js +163 -0
- package/lib/components/template/HierarchicalForm/hooks.js.map +1 -0
- package/lib/components/template/HierarchicalForm/index.d.ts +2 -0
- package/lib/components/template/HierarchicalForm/index.d.ts.map +1 -0
- package/lib/components/template/HierarchicalForm/index.js +2 -0
- package/lib/components/template/HierarchicalForm/index.js.map +1 -0
- package/lib/components/template/ListView/ListView.d.ts +1 -0
- package/lib/components/template/ListView/ListView.d.ts.map +1 -1
- package/lib/components/template/ListView/ListView.js +56 -9
- package/lib/components/template/ListView/ListView.js.map +1 -1
- package/lib/components/template/MultiReferenceReadOnly/MultiReferenceReadOnly.d.ts +3 -1
- package/lib/components/template/MultiReferenceReadOnly/MultiReferenceReadOnly.d.ts.map +1 -1
- package/lib/components/template/MultiReferenceReadOnly/MultiReferenceReadOnly.js +13 -1
- package/lib/components/template/MultiReferenceReadOnly/MultiReferenceReadOnly.js.map +1 -1
- package/lib/components/template/ObjectPage/index.d.ts +2 -0
- package/lib/components/template/ObjectPage/index.d.ts.map +1 -0
- package/lib/components/template/ObjectPage/index.js +2 -0
- package/lib/components/template/ObjectPage/index.js.map +1 -0
- package/lib/components/template/SelfServiceCaseView/SelfServiceCaseView.d.ts.map +1 -1
- package/lib/components/template/SelfServiceCaseView/SelfServiceCaseView.js +13 -2
- package/lib/components/template/SelfServiceCaseView/SelfServiceCaseView.js.map +1 -1
- package/lib/components/template/SimpleTable/SimpleTableManual/SimpleTableManual.d.ts.map +1 -1
- package/lib/components/template/SimpleTable/SimpleTableManual/SimpleTableManual.js +8 -6
- package/lib/components/template/SimpleTable/SimpleTableManual/SimpleTableManual.js.map +1 -1
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/SimpleTableSelectReadonly.d.ts +17 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/SimpleTableSelectReadonly.d.ts.map +1 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/SimpleTableSelectReadonly.js +94 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/SimpleTableSelectReadonly.js.map +1 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/index.d.ts +2 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/index.d.ts.map +1 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/index.js +2 -0
- package/lib/components/template/SimpleTable/SimpleTableSelectReadonly/index.js.map +1 -0
- package/lib/hooks/useFocusFirstField.d.ts +3 -3
- package/lib/hooks/useFocusFirstField.d.ts.map +1 -1
- package/lib/hooks/useFocusFirstField.js +19 -12
- package/lib/hooks/useFocusFirstField.js.map +1 -1
- package/lib/sdk-pega-component-map.d.ts +6 -0
- package/lib/sdk-pega-component-map.d.ts.map +1 -1
- package/lib/sdk-pega-component-map.js +6 -0
- package/lib/sdk-pega-component-map.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { useState, useEffect, useMemo, useCallback, useRef, Children } from 'react';
|
|
2
|
+
import useGetTabsCount from '../../../hooks/useGetTabsCount';
|
|
3
|
+
import { searchtabsClick as tabClick, getActiveTabId, getFirstVisibleTabId } from '../SubTabs/tabUtils';
|
|
4
|
+
import { getInstructions } from '../../helpers/template-utils';
|
|
5
|
+
const ComponentName = 'HierarchicalForm';
|
|
6
|
+
const getLandingPageViewName = (contextName) => {
|
|
7
|
+
const target = contextName.substring(0, contextName.lastIndexOf('_'));
|
|
8
|
+
const activeContainerItemID = PCore.getContainerUtils().getActiveContainerItemName(target);
|
|
9
|
+
const containerItemData = PCore.getContainerUtils().getContainerItemData(target, activeContainerItemID);
|
|
10
|
+
return containerItemData?.view?.config?.name;
|
|
11
|
+
};
|
|
12
|
+
export function useHierarchicalForm(props) {
|
|
13
|
+
const { children = [], getPConnect, tabsVisibility = {}, template } = props;
|
|
14
|
+
const [tabErrors, setTabErrors] = useState({});
|
|
15
|
+
const tabErrorsRef = useRef({});
|
|
16
|
+
const submitAttemptedRef = useRef(false);
|
|
17
|
+
const { lastUpdateCaseTime = getPConnect().getValue('caseInfo.lastUpdateTime') } = props;
|
|
18
|
+
const fullCaseId = getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
19
|
+
const deferLoadedTabs = Children.toArray(children)[0];
|
|
20
|
+
deferLoadedTabs.props.getPConnect().setInheritedProp('template', template);
|
|
21
|
+
const navigationKey = useMemo(() => {
|
|
22
|
+
const parentNavKey = `${getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID) || getLandingPageViewName(getPConnect().getContextName())}`;
|
|
23
|
+
return `${parentNavKey}-${getPConnect().getMetadata()?.name}-${ComponentName}`;
|
|
24
|
+
}, []);
|
|
25
|
+
const instructions = getInstructions(getPConnect(), props.instructions);
|
|
26
|
+
const storedTab = PCore.getNavigationUtils().getComponentState(navigationKey)?.activeTab;
|
|
27
|
+
const tabsFromChildren = deferLoadedTabs.props.getPConnect().getChildren();
|
|
28
|
+
const firstTabId = getFirstVisibleTabId(deferLoadedTabs, undefined);
|
|
29
|
+
const [currentTabId, setCurrentTabId] = useState(getActiveTabId(tabsFromChildren, storedTab || firstTabId));
|
|
30
|
+
const [tabVisibilityStr, setTabVisibilityStr] = useState('');
|
|
31
|
+
const { data: tabData, refreshTabData } = useGetTabsCount(deferLoadedTabs, 'hierarchical', currentTabId, template);
|
|
32
|
+
const handleCaseRefresh = (message) => {
|
|
33
|
+
if (message.subtype === 'tab') {
|
|
34
|
+
refreshTabData();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
let index = 0;
|
|
39
|
+
let caseSubId = '';
|
|
40
|
+
deferLoadedTabs.props
|
|
41
|
+
.getPConnect()
|
|
42
|
+
.getChildren()
|
|
43
|
+
?.forEach((child) => {
|
|
44
|
+
const rawConfigProps = child.getPConnect().getRawConfigProps();
|
|
45
|
+
if ('visibility' in rawConfigProps) {
|
|
46
|
+
tabsVisibility[`${index}`] = rawConfigProps.visibility;
|
|
47
|
+
}
|
|
48
|
+
index += 1;
|
|
49
|
+
});
|
|
50
|
+
getPConnect().registerAdditionalProps({ tabsVisibility });
|
|
51
|
+
getPConnect().registerAdditionalProps({ lastUpdateCaseTime: '@P caseInfo.lastUpdateTime' });
|
|
52
|
+
if (fullCaseId) {
|
|
53
|
+
caseSubId = PCore.getMessagingServiceManager().getCaseSubscription(fullCaseId).subscribe({ caseId: fullCaseId }, handleCaseRefresh);
|
|
54
|
+
}
|
|
55
|
+
return () => {
|
|
56
|
+
if (fullCaseId)
|
|
57
|
+
PCore.getMessagingServiceManager().getCaseSubscription(fullCaseId).unsubscribe(caseSubId);
|
|
58
|
+
};
|
|
59
|
+
}, []);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
refreshTabData();
|
|
62
|
+
}, [lastUpdateCaseTime]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const isVisibilityAvailable = Object.values(tabsVisibility).length > 0 && Object.values(tabsVisibility).every(visibility => typeof visibility === 'boolean');
|
|
65
|
+
if (isVisibilityAvailable) {
|
|
66
|
+
let str = '';
|
|
67
|
+
Object.keys(tabsVisibility).forEach(key => {
|
|
68
|
+
str += key + tabsVisibility[key];
|
|
69
|
+
});
|
|
70
|
+
setTabVisibilityStr(str);
|
|
71
|
+
}
|
|
72
|
+
}, [tabsVisibility]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (tabData && tabData.length) {
|
|
75
|
+
const activeTabId = getActiveTabId(tabData, currentTabId);
|
|
76
|
+
if (activeTabId !== currentTabId) {
|
|
77
|
+
setCurrentTabId(activeTabId);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}, [tabVisibilityStr, tabData]);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
PCore.getNavigationUtils().setComponentState(navigationKey, { activeTab: currentTabId });
|
|
83
|
+
const activeTabNavKey = `${getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID)}-CaseView-ActiveTab`;
|
|
84
|
+
PCore.getNavigationUtils().setComponentState(activeTabNavKey, { id: currentTabId });
|
|
85
|
+
return () => {
|
|
86
|
+
if (getPConnect().getContextName()?.includes('/modal')) {
|
|
87
|
+
PCore.getNavigationUtils().setComponentState(navigationKey, { activeTab: firstTabId });
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}, [currentTabId, children]);
|
|
91
|
+
const handleTabClick = useCallback((event, id) => {
|
|
92
|
+
tabClick(id, tabData, currentTabId, setCurrentTabId);
|
|
93
|
+
}, [tabData, currentTabId]);
|
|
94
|
+
const tabItems = useMemo(() => tabData?.filter((tab) => tab.visibility()) ?? [], [tabData, tabVisibilityStr]);
|
|
95
|
+
const tabsRef = useRef(tabItems);
|
|
96
|
+
tabsRef.current = tabItems;
|
|
97
|
+
const updateTabErrorsOnViewMutate = useCallback((messageObject, tab) => {
|
|
98
|
+
if (!messageObject.type) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const previousTabErrors = tabErrorsRef.current;
|
|
102
|
+
let currentTabState = previousTabErrors[tab.id] || {};
|
|
103
|
+
const { MESSAGES_TYPE_ERROR } = PCore.getConstants().MESSAGES;
|
|
104
|
+
if (messageObject.type !== MESSAGES_TYPE_ERROR) {
|
|
105
|
+
delete currentTabState[messageObject.fieldName];
|
|
106
|
+
currentTabState = Object.keys(currentTabState).length > 0 ? currentTabState : undefined;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
currentTabState = { ...currentTabState, [messageObject.fieldName]: messageObject.messages };
|
|
110
|
+
}
|
|
111
|
+
const newErrors = { ...previousTabErrors, [tab.id]: currentTabState };
|
|
112
|
+
tabErrorsRef.current = newErrors;
|
|
113
|
+
setTabErrors(newErrors);
|
|
114
|
+
}, []);
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
const rawConfig = '_rawConfig';
|
|
117
|
+
tabItems.forEach((tab) => {
|
|
118
|
+
PCore.getContextTreeManager().onViewMutate(tab.getPConnect().getContextName(), tab.getPConnect().getPageReference(), tab.getPConnect()[rawConfig].config?.name, (messageObject) => updateTabErrorsOnViewMutate(messageObject, tab));
|
|
119
|
+
});
|
|
120
|
+
}, [tabItems, updateTabErrorsOnViewMutate]);
|
|
121
|
+
const navigateToFirstErrorTab = useCallback(() => {
|
|
122
|
+
const currentErrors = tabErrorsRef.current;
|
|
123
|
+
const firstTabWithError = tabsRef.current.find((tab) => {
|
|
124
|
+
const tabErrorState = currentErrors[tab.id];
|
|
125
|
+
return tabErrorState && Object.keys(tabErrorState).length > 0;
|
|
126
|
+
});
|
|
127
|
+
if (firstTabWithError) {
|
|
128
|
+
submitAttemptedRef.current = false;
|
|
129
|
+
setCurrentTabId(firstTabWithError.id);
|
|
130
|
+
}
|
|
131
|
+
}, []);
|
|
132
|
+
const highlightFirstErrorTab = useCallback(() => {
|
|
133
|
+
submitAttemptedRef.current = true;
|
|
134
|
+
navigateToFirstErrorTab();
|
|
135
|
+
}, [navigateToFirstErrorTab]);
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
const { CURRENT_ASSIGNMENT_UPDATED } = PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS;
|
|
138
|
+
PCore.getPubSubUtils().subscribe(CURRENT_ASSIGNMENT_UPDATED, () => {
|
|
139
|
+
tabErrorsRef.current = {};
|
|
140
|
+
submitAttemptedRef.current = false;
|
|
141
|
+
setTabErrors({});
|
|
142
|
+
}, 'CURRENT_ASSIGNMENT_UPDATED-HierarchicalForm');
|
|
143
|
+
PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.ERROR_ON_FINISH_ASSIGNMENT, highlightFirstErrorTab, 'ERROR_ON_FINISH_ASSIGNMENT-HierarchicalForm');
|
|
144
|
+
return () => {
|
|
145
|
+
PCore.getPubSubUtils().unsubscribe(CURRENT_ASSIGNMENT_UPDATED, 'CURRENT_ASSIGNMENT_UPDATED-HierarchicalForm');
|
|
146
|
+
PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.ERROR_ON_FINISH_ASSIGNMENT, 'ERROR_ON_FINISH_ASSIGNMENT-HierarchicalForm');
|
|
147
|
+
};
|
|
148
|
+
}, []);
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
if (submitAttemptedRef.current) {
|
|
151
|
+
navigateToFirstErrorTab();
|
|
152
|
+
}
|
|
153
|
+
}, [tabErrors, navigateToFirstErrorTab]);
|
|
154
|
+
const processedTabs = useMemo(() => {
|
|
155
|
+
return tabItems.map(tab => {
|
|
156
|
+
const errorKeys = Object.keys(tabErrors[tab.id] ?? {});
|
|
157
|
+
const errors = errorKeys.length > 0 ? errorKeys.reduce((sum, fieldName) => sum + tabErrors[tab.id][fieldName].length, 0) : undefined;
|
|
158
|
+
return { ...tab, errors };
|
|
159
|
+
});
|
|
160
|
+
}, [tabItems, tabErrors]);
|
|
161
|
+
return { currentTabId, handleTabClick, processedTabs, instructions };
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../src/components/template/HierarchicalForm/hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useMemo, useCallback, useRef, Children, type PropsWithChildren, type SyntheticEvent } from 'react';\n\nimport useGetTabsCount from '../../../hooks/useGetTabsCount';\nimport { searchtabsClick as tabClick, getActiveTabId, getFirstVisibleTabId } from '../SubTabs/tabUtils';\nimport { getInstructions } from '../../helpers/template-utils';\nimport type { PConnProps } from '../../../types/PConnProps';\n\nconst ComponentName = 'HierarchicalForm';\n\nconst getLandingPageViewName = (contextName: string) => {\n const target = contextName.substring(0, contextName.lastIndexOf('_'));\n const activeContainerItemID = PCore.getContainerUtils().getActiveContainerItemName(target);\n const containerItemData = PCore.getContainerUtils().getContainerItemData(target, activeContainerItemID);\n return containerItemData?.view?.config?.name;\n};\n\nexport interface HierarchicalFormProps extends PConnProps {\n tabsVisibility?: Record<string, boolean>;\n template?: string;\n instructions?: string;\n lastUpdateCaseTime?: string | number;\n}\n\nexport function useHierarchicalForm(props: PropsWithChildren<HierarchicalFormProps>) {\n const { children = [], getPConnect, tabsVisibility = {}, template } = props;\n const [tabErrors, setTabErrors] = useState<Record<string, any>>({});\n const tabErrorsRef = useRef<Record<string, any>>({});\n const submitAttemptedRef = useRef(false);\n const { lastUpdateCaseTime = getPConnect().getValue('caseInfo.lastUpdateTime') } = props;\n const fullCaseId = getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);\n\n const deferLoadedTabs: any = Children.toArray(children)[0];\n deferLoadedTabs.props.getPConnect().setInheritedProp('template', template);\n\n const navigationKey = useMemo(() => {\n const parentNavKey = `${\n getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID) || getLandingPageViewName(getPConnect().getContextName())\n }`;\n return `${parentNavKey}-${getPConnect().getMetadata()?.name}-${ComponentName}`;\n }, []);\n\n const instructions = getInstructions(getPConnect(), props.instructions);\n\n const storedTab = (PCore.getNavigationUtils().getComponentState(navigationKey) as any)?.activeTab;\n\n const tabsFromChildren = deferLoadedTabs.props.getPConnect().getChildren();\n\n const firstTabId = getFirstVisibleTabId(deferLoadedTabs, undefined);\n\n const [currentTabId, setCurrentTabId] = useState(getActiveTabId(tabsFromChildren, storedTab || firstTabId));\n const [tabVisibilityStr, setTabVisibilityStr] = useState('');\n const { data: tabData, refreshTabData } = useGetTabsCount(deferLoadedTabs, 'hierarchical', currentTabId, template);\n\n const handleCaseRefresh = (message: any) => {\n if (message.subtype === 'tab') {\n refreshTabData();\n }\n };\n\n useEffect(() => {\n let index = 0;\n let caseSubId = '';\n deferLoadedTabs.props\n .getPConnect()\n .getChildren()\n ?.forEach((child: any) => {\n const rawConfigProps = child.getPConnect().getRawConfigProps();\n if ('visibility' in rawConfigProps) {\n tabsVisibility[`${index}`] = rawConfigProps.visibility;\n }\n index += 1;\n });\n\n getPConnect().registerAdditionalProps({ tabsVisibility });\n getPConnect().registerAdditionalProps({ lastUpdateCaseTime: '@P caseInfo.lastUpdateTime' });\n\n if (fullCaseId) {\n caseSubId = PCore.getMessagingServiceManager().getCaseSubscription(fullCaseId).subscribe({ caseId: fullCaseId }, handleCaseRefresh);\n }\n\n return () => {\n if (fullCaseId) PCore.getMessagingServiceManager().getCaseSubscription(fullCaseId).unsubscribe(caseSubId);\n };\n }, []);\n\n useEffect(() => {\n refreshTabData();\n }, [lastUpdateCaseTime]);\n\n useEffect(() => {\n const isVisibilityAvailable =\n Object.values(tabsVisibility).length > 0 && Object.values(tabsVisibility).every(visibility => typeof visibility === 'boolean');\n if (isVisibilityAvailable) {\n let str = '';\n Object.keys(tabsVisibility).forEach(key => {\n str += key + tabsVisibility[key];\n });\n setTabVisibilityStr(str);\n }\n }, [tabsVisibility]);\n\n useEffect(() => {\n if (tabData && tabData.length) {\n const activeTabId = getActiveTabId(tabData, currentTabId);\n if (activeTabId !== currentTabId) {\n setCurrentTabId(activeTabId);\n }\n }\n }, [tabVisibilityStr, tabData]);\n\n useEffect(() => {\n PCore.getNavigationUtils().setComponentState(navigationKey, { activeTab: currentTabId });\n const activeTabNavKey = `${getPConnect().getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID)}-CaseView-ActiveTab`;\n PCore.getNavigationUtils().setComponentState(activeTabNavKey, { id: currentTabId });\n\n return () => {\n if (getPConnect().getContextName()?.includes('/modal')) {\n PCore.getNavigationUtils().setComponentState(navigationKey, { activeTab: firstTabId });\n }\n };\n }, [currentTabId, children]);\n\n const handleTabClick = useCallback(\n (event: SyntheticEvent, id: string) => {\n tabClick(id, tabData, currentTabId, setCurrentTabId);\n },\n [tabData, currentTabId]\n );\n\n const tabItems = useMemo(() => tabData?.filter((tab: any) => tab.visibility()) ?? [], [tabData, tabVisibilityStr]);\n\n const tabsRef = useRef(tabItems);\n tabsRef.current = tabItems;\n\n const updateTabErrorsOnViewMutate = useCallback((messageObject: any, tab: any) => {\n if (!messageObject.type) {\n return;\n }\n const previousTabErrors = tabErrorsRef.current;\n let currentTabState = previousTabErrors[tab.id] || {};\n const { MESSAGES_TYPE_ERROR } = PCore.getConstants().MESSAGES;\n if (messageObject.type !== MESSAGES_TYPE_ERROR) {\n delete currentTabState[messageObject.fieldName];\n currentTabState = Object.keys(currentTabState).length > 0 ? currentTabState : undefined;\n } else {\n currentTabState = { ...currentTabState, [messageObject.fieldName]: messageObject.messages };\n }\n const newErrors = { ...previousTabErrors, [tab.id]: currentTabState };\n tabErrorsRef.current = newErrors;\n setTabErrors(newErrors);\n }, []);\n\n useEffect(() => {\n const rawConfig = '_rawConfig';\n tabItems.forEach((tab: any) => {\n PCore.getContextTreeManager().onViewMutate(\n tab.getPConnect().getContextName(),\n tab.getPConnect().getPageReference(),\n tab.getPConnect()[rawConfig].config?.name,\n (messageObject: any) => updateTabErrorsOnViewMutate(messageObject, tab)\n );\n });\n }, [tabItems, updateTabErrorsOnViewMutate]);\n\n const navigateToFirstErrorTab = useCallback(() => {\n const currentErrors = tabErrorsRef.current;\n const firstTabWithError = tabsRef.current.find((tab: any) => {\n const tabErrorState = currentErrors[tab.id];\n return tabErrorState && Object.keys(tabErrorState).length > 0;\n });\n if (firstTabWithError) {\n submitAttemptedRef.current = false;\n setCurrentTabId(firstTabWithError.id);\n }\n }, []);\n\n const highlightFirstErrorTab = useCallback(() => {\n submitAttemptedRef.current = true;\n navigateToFirstErrorTab();\n }, [navigateToFirstErrorTab]);\n\n useEffect(() => {\n const { CURRENT_ASSIGNMENT_UPDATED } = PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS;\n PCore.getPubSubUtils().subscribe(\n CURRENT_ASSIGNMENT_UPDATED,\n () => {\n tabErrorsRef.current = {};\n submitAttemptedRef.current = false;\n setTabErrors({});\n },\n 'CURRENT_ASSIGNMENT_UPDATED-HierarchicalForm'\n );\n\n PCore.getPubSubUtils().subscribe(\n PCore.getConstants().PUB_SUB_EVENTS.ERROR_ON_FINISH_ASSIGNMENT,\n highlightFirstErrorTab,\n 'ERROR_ON_FINISH_ASSIGNMENT-HierarchicalForm'\n );\n\n return () => {\n PCore.getPubSubUtils().unsubscribe(CURRENT_ASSIGNMENT_UPDATED, 'CURRENT_ASSIGNMENT_UPDATED-HierarchicalForm');\n PCore.getPubSubUtils().unsubscribe(\n PCore.getConstants().PUB_SUB_EVENTS.ERROR_ON_FINISH_ASSIGNMENT,\n 'ERROR_ON_FINISH_ASSIGNMENT-HierarchicalForm'\n );\n };\n }, []);\n\n useEffect(() => {\n if (submitAttemptedRef.current) {\n navigateToFirstErrorTab();\n }\n }, [tabErrors, navigateToFirstErrorTab]);\n\n const processedTabs = useMemo(() => {\n return tabItems.map(tab => {\n const errorKeys = Object.keys(tabErrors[tab.id] ?? {});\n const errors = errorKeys.length > 0 ? errorKeys.reduce((sum, fieldName) => sum + tabErrors[tab.id][fieldName].length, 0) : undefined;\n return { ...tab, errors };\n });\n }, [tabItems, tabErrors]);\n\n return { currentTabId, handleTabClick, processedTabs, instructions };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/template/HierarchicalForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/template/HierarchicalForm/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export { default } from './HierarchicalForm';\n"]}
|
|
@@ -15,6 +15,7 @@ interface ListViewProps extends PConnProps {
|
|
|
15
15
|
viewName?: string;
|
|
16
16
|
showRecords?: boolean;
|
|
17
17
|
displayAs?: string;
|
|
18
|
+
localeReference?: string;
|
|
18
19
|
}
|
|
19
20
|
export default function ListView(props: ListViewProps): import("react/jsx-runtime").JSX.Element;
|
|
20
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../../src/components/template/ListView/ListView.tsx"],"names":[],"mappings":"AAoCA,OAAO,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,UAAU,aAAc,SAAQ,UAAU;IAExC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IAEtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,GAAG,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../../../src/components/template/ListView/ListView.tsx"],"names":[],"mappings":"AAoCA,OAAO,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,UAAU,aAAc,SAAQ,UAAU;IAExC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IAEtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,GAAG,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAcD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAiyCpD"}
|
|
@@ -50,7 +50,7 @@ export default function ListView(props) {
|
|
|
50
50
|
const { getPConnect, bInForm = true } = props;
|
|
51
51
|
const { globalSearch, referenceList,
|
|
52
52
|
/* rowClickAction, */
|
|
53
|
-
selectionMode, referenceType, payload, parameters, compositeKeys, showDynamicFields, viewName, readonlyContextList: selectedValues, value, displayAs } = props;
|
|
53
|
+
selectionMode, referenceType, payload, parameters, compositeKeys, showDynamicFields, viewName, readonlyContextList: selectedValues, value, displayAs, localeReference } = props;
|
|
54
54
|
let { showRecords } = props;
|
|
55
55
|
const ref = useRef({}).current;
|
|
56
56
|
const cosmosTableRef = useRef();
|
|
@@ -84,6 +84,8 @@ export default function ListView(props) {
|
|
|
84
84
|
const [showSnackbar, setShowSnackbar] = useState(false);
|
|
85
85
|
const [snackbarMessage, setSnackbarMessage] = useState('');
|
|
86
86
|
const [selectedValue, setSelectedValue] = useState(value);
|
|
87
|
+
// Tracks selected row keys for multi-select mode (mirrors Angular's SelectionModel)
|
|
88
|
+
const [selectedRowSet, setSelectedRowSet] = useState(new Set());
|
|
87
89
|
// This basically will hold the list of all current filters
|
|
88
90
|
const filters = useRef({});
|
|
89
91
|
// Will contain the list of columns specific for an instance
|
|
@@ -150,6 +152,7 @@ export default function ListView(props) {
|
|
|
150
152
|
}
|
|
151
153
|
else {
|
|
152
154
|
getPConnect().getListActions().clearSelectedRows();
|
|
155
|
+
setSelectedRowSet(new Set());
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
158
|
}
|
|
@@ -463,6 +466,7 @@ export default function ListView(props) {
|
|
|
463
466
|
const myColumns = getHeaderCells(columnFields, fieldDefs);
|
|
464
467
|
const selectParams = [];
|
|
465
468
|
myColumns.forEach(column => {
|
|
469
|
+
column.label = PCore.getLocaleUtils().getLocaleValue(column.label, localeReference);
|
|
466
470
|
selectParams.push({
|
|
467
471
|
field: column.id
|
|
468
472
|
});
|
|
@@ -482,6 +486,16 @@ export default function ListView(props) {
|
|
|
482
486
|
if (bCallSetRowsColumns) {
|
|
483
487
|
setRows(myRows);
|
|
484
488
|
setColumns(myColumns);
|
|
489
|
+
if (selectionMode === SELECTION_MODE.MULTI && selectedValues?.length > 0) {
|
|
490
|
+
const readonlyIds = new Set(selectedValues.map((element) => element[rowID]));
|
|
491
|
+
const initialSet = new Set();
|
|
492
|
+
myRows?.forEach(row => {
|
|
493
|
+
if (readonlyIds.has(row[rowID])) {
|
|
494
|
+
initialSet.add(row[rowID]);
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
setSelectedRowSet(initialSet);
|
|
498
|
+
}
|
|
485
499
|
}
|
|
486
500
|
return () => {
|
|
487
501
|
// Inspired by https://juliangaramendy.dev/blog/use-promise-subscription
|
|
@@ -834,12 +848,11 @@ export default function ListView(props) {
|
|
|
834
848
|
getPConnect()?.getListActions?.()?.setSelectedRows([reqObj]);
|
|
835
849
|
setSelectedValue(value);
|
|
836
850
|
};
|
|
837
|
-
const
|
|
838
|
-
const
|
|
839
|
-
const checked = event?.target?.checked;
|
|
851
|
+
const getSelectedValue = (row, checked) => {
|
|
852
|
+
const rowValue = row[rowID];
|
|
840
853
|
const reqObj = {};
|
|
841
854
|
if (compositeKeys?.length > 1) {
|
|
842
|
-
const index = response.findIndex(element => element[rowID] ===
|
|
855
|
+
const index = response.findIndex(element => element[rowID] === rowValue);
|
|
843
856
|
const selectedRow = response[index];
|
|
844
857
|
compositeKeys.forEach(element => {
|
|
845
858
|
reqObj[element] = selectedRow[element];
|
|
@@ -847,10 +860,44 @@ export default function ListView(props) {
|
|
|
847
860
|
reqObj.$selected = checked;
|
|
848
861
|
}
|
|
849
862
|
else {
|
|
850
|
-
reqObj[rowID] =
|
|
863
|
+
reqObj[rowID] = rowValue;
|
|
851
864
|
reqObj.$selected = checked;
|
|
852
865
|
}
|
|
853
|
-
|
|
866
|
+
return reqObj;
|
|
867
|
+
};
|
|
868
|
+
const onCheckboxClick = (row) => {
|
|
869
|
+
const rowKey = row[rowID];
|
|
870
|
+
const newSet = new Set(selectedRowSet);
|
|
871
|
+
if (newSet.has(rowKey)) {
|
|
872
|
+
newSet.delete(rowKey);
|
|
873
|
+
}
|
|
874
|
+
else {
|
|
875
|
+
newSet.add(rowKey);
|
|
876
|
+
}
|
|
877
|
+
setSelectedRowSet(newSet);
|
|
878
|
+
const checked = newSet.has(rowKey);
|
|
879
|
+
const requiredValue = getSelectedValue(row, checked);
|
|
880
|
+
getPConnect()?.getListActions()?.setSelectedRows([requiredValue]);
|
|
881
|
+
};
|
|
882
|
+
const isAllSelected = () => {
|
|
883
|
+
const numSelected = selectedRowSet.size;
|
|
884
|
+
const numRows = arRows?.length || 0;
|
|
885
|
+
return numRows > 0 && numSelected === numRows;
|
|
886
|
+
};
|
|
887
|
+
const toggleAllRows = () => {
|
|
888
|
+
if (isAllSelected()) {
|
|
889
|
+
setSelectedRowSet(new Set());
|
|
890
|
+
getPConnect()?.getListActions()?.clearSelectedRows();
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
if (selectedRowSet.size > 0 && !isAllSelected()) {
|
|
894
|
+
getPConnect()?.getListActions()?.clearSelectedRows();
|
|
895
|
+
}
|
|
896
|
+
const newSet = new Set();
|
|
897
|
+
arRows.forEach(row => newSet.add(row[rowID]));
|
|
898
|
+
setSelectedRowSet(newSet);
|
|
899
|
+
const requiredValues = arRows.map(row => getSelectedValue(row, true));
|
|
900
|
+
getPConnect()?.getListActions()?.setSelectedRows(requiredValues);
|
|
854
901
|
};
|
|
855
902
|
const processColumnValue = (column, value) => {
|
|
856
903
|
let val;
|
|
@@ -888,14 +935,14 @@ export default function ListView(props) {
|
|
|
888
935
|
_listViewClick(row, column);
|
|
889
936
|
}, underline: 'hover', children: column.format && typeof value === 'number' ? column.format(value) : value })) : (_jsx(_Fragment, { children: column.format && typeof value === 'number' ? column.format(value) : value || '---' })) }, column.id));
|
|
890
937
|
}) }, row.pxRefObjectInsName || row.pyID));
|
|
891
|
-
}) })] }) })) : (_jsxs(TableContainer, { id: 'list-view', children: [_jsxs(Table, { children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [
|
|
938
|
+
}) })] }) })) : (_jsxs(TableContainer, { id: 'list-view', children: [_jsxs(Table, { children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [selectionMode === SELECTION_MODE.SINGLE && _jsx(TableCell, { padding: 'checkbox' }), selectionMode === SELECTION_MODE.MULTI && (_jsx(TableCell, { padding: 'checkbox', children: _jsx(Checkbox, { indeterminate: selectedRowSet.size > 0 && !isAllSelected(), checked: arRows?.length > 0 && isAllSelected(), onChange: toggleAllRows }) })), arColumns.map(column => {
|
|
892
939
|
return (_jsx(TableCell, { className: classes.cell, sortDirection: orderBy === column.id ? order : false, children: _jsxs(TableSortLabel, { active: orderBy === column.id, direction: orderBy === column.id ? order : 'asc', onClick: createSortHandler(column.id), children: [column.label, orderBy === column.id ? (_jsx("span", { className: classes.visuallyHidden, children: order === 'desc' ? 'sorted descending' : 'sorted ascending' })) : null] }) }, column.id));
|
|
893
940
|
})] }) }), _jsx(TableBody, { children: arRows &&
|
|
894
941
|
arRows.length > 0 &&
|
|
895
942
|
stableSort(arRows, getComparator(order, orderBy))
|
|
896
943
|
.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
|
|
897
944
|
.map(row => {
|
|
898
|
-
return (_jsxs(TableRow, { children: [selectionMode === SELECTION_MODE.SINGLE && (_jsx(TableCell, { children: _jsx(Radio, { onChange: handleChange, value: row[rowID], name: 'radio-buttons', inputProps: { 'aria-label': 'A' }, checked: selectedValue === row[rowID] }) })), selectionMode === SELECTION_MODE.MULTI && (_jsx(TableCell, { children: _jsx(Checkbox, { onChange:
|
|
945
|
+
return (_jsxs(TableRow, { children: [selectionMode === SELECTION_MODE.SINGLE && (_jsx(TableCell, { padding: 'checkbox', children: _jsx(Radio, { onChange: handleChange, value: row[rowID], name: 'radio-buttons', inputProps: { 'aria-label': 'A' }, checked: selectedValue === row[rowID] }) })), selectionMode === SELECTION_MODE.MULTI && (_jsx(TableCell, { padding: 'checkbox', children: _jsx(Checkbox, { onChange: () => onCheckboxClick(row), checked: selectedRowSet.has(row[rowID]) }) })), arColumns.map(column => {
|
|
899
946
|
const value = row[column.id];
|
|
900
947
|
return (_jsx(TableCell, { className: classes.cell, align: column.align, children: processColumnValue(column, value) }, column.id));
|
|
901
948
|
})] }, row[rowID]));
|