@pega/dx-component-builder-sdk 0.23.21 → 0.24.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.
Files changed (130) hide show
  1. package/package.json +1 -1
  2. package/src/cli.js +1 -1
  3. package/src/constants.js +4 -0
  4. package/src/tasks/build-all/helper.js +6 -0
  5. package/src/tasks/build-comp/helper.js +6 -0
  6. package/src/tasks/bundle/builderAngular/webpack.config.js +14 -1
  7. package/src/tasks/bundle/builderAssociated/webpack.config.js +13 -0
  8. package/src/tasks/bundle/builderReact/webpack.config.js +14 -1
  9. package/src/tasks/create/templates/Constellation/field/Boolean/index.tsx.mustache +3 -2
  10. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/PConnProps.d.ts.mustache +46 -0
  11. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/config.json.mustache +64 -0
  12. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/demo.stories.tsx.mustache +99 -0
  13. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/index.tsx.mustache +204 -0
  14. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/mock.ts.mustache +5 -0
  15. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/styles.ts.mustache +8 -0
  16. package/src/tasks/create/templates/Constellation/field/Picklist/index.tsx.mustache +0 -1
  17. package/src/tasks/create/templates/Constellation/field/Picklist-Autocomplete/date.ts.mustache +15 -37
  18. package/src/tasks/create/templates/Constellation/field/Picklist-Autocomplete/index.tsx.mustache +11 -0
  19. package/src/tasks/create/templates/Constellation/field/Picklist-Autocomplete/utils.ts.mustache +3 -0
  20. package/src/tasks/create/templates/Constellation/field/Text/index.tsx.mustache +94 -4
  21. package/src/tasks/create/templates/Constellation/template/DETAILS/Avatar.tsx.mustache +78 -0
  22. package/src/tasks/create/templates/Constellation/template/DETAILS/DetailsRender.tsx.mustache +55 -0
  23. package/src/tasks/create/templates/Constellation/template/DETAILS/HighlightRender.tsx.mustache +49 -0
  24. package/src/tasks/create/templates/Constellation/template/DETAILS/Operator.tsx.mustache +218 -0
  25. package/src/tasks/create/templates/Constellation/template/DETAILS/demo.stories.tsx.mustache +77 -23
  26. package/src/tasks/create/templates/Constellation/template/DETAILS/index.tsx.mustache +51 -40
  27. package/src/tasks/create/templates/Constellation/template/DETAILS/mock.ts.mustache +78 -20
  28. package/src/tasks/create/templates/Constellation/template/DETAILS/styles.ts.mustache +16 -0
  29. package/src/tasks/create/templates/Constellation/template/DETAILS-region/Avatar.tsx.mustache +78 -0
  30. package/src/tasks/create/templates/Constellation/template/DETAILS-region/DetailsRender.tsx.mustache +55 -0
  31. package/src/tasks/create/templates/Constellation/template/DETAILS-region/HighlightRender.tsx.mustache +49 -0
  32. package/src/tasks/create/templates/Constellation/template/DETAILS-region/Operator.tsx.mustache +218 -0
  33. package/src/tasks/create/templates/Constellation/template/DETAILS-region/demo.stories.tsx.mustache +95 -26
  34. package/src/tasks/create/templates/Constellation/template/DETAILS-region/index.tsx.mustache +42 -39
  35. package/src/tasks/create/templates/Constellation/template/DETAILS-region/mock.ts.mustache +68 -10
  36. package/src/tasks/create/templates/Constellation/template/DETAILS-region/styles.ts.mustache +15 -0
  37. package/src/tasks/create/templates/Constellation/template/FORM/DetailsRender.tsx +59 -0
  38. package/src/tasks/create/templates/Constellation/template/FORM/index.tsx.mustache +31 -5
  39. package/src/tasks/create/templates/Constellation/template/FORM-region/DetailsRender.tsx +59 -0
  40. package/src/tasks/create/templates/Constellation/template/FORM-region/index.tsx.mustache +29 -7
  41. package/src/tasks/create/templates/Constellation/template/PAGE/GetNextWork.tsx.mustache +2 -1
  42. package/src/tasks/create/templates/Constellation/template/PAGE/localizations.json.mustache +4 -2
  43. package/src/tasks/create/templates/Constellation/widget/PAGE/demo.stories.tsx.mustache +87 -6
  44. package/src/tasks/create/templates/Constellation/widget/PAGE/index.tsx.mustache +67 -5
  45. package/src/tasks/create/templates/SDK-Angular/field/Boolean/boolean.component.html.mustache +19 -18
  46. package/src/tasks/create/templates/SDK-Angular/field/Boolean/boolean.component.ts.mustache +127 -44
  47. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/config.json.mustache +64 -0
  48. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/demo.stories.tsx.mustache +63 -0
  49. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.html.mustache +40 -0
  50. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.scss.mustache +24 -0
  51. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.spec.ts.mustache +26 -0
  52. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.ts.mustache +195 -0
  53. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/mock.ts.mustache +37 -0
  54. package/src/tasks/create/templates/SDK-Angular/field/Text-URL/text-url.component.html.mustache +1 -0
  55. package/src/tasks/create/templates/SDK-Angular/field/Text-URL/text-url.component.ts.mustache +2 -0
  56. package/src/tasks/create/templates/SDK-Angular/field/TimeOfDay/time-of-day.component.html.mustache +1 -0
  57. package/src/tasks/create/templates/SDK-Angular/field/TimeOfDay/time-of-day.component.ts.mustache +2 -0
  58. package/src/tasks/create/templates/SDK-Angular/template/FORM-region/form.component.scss.mustache +1 -1
  59. package/src/tasks/create/templates/SDK-Angular/widget/CASE/case.component.ts.mustache +2 -2
  60. package/src/tasks/create/templates/SDK-Angular/widget/PAGE/page.component.html.mustache +1 -1
  61. package/src/tasks/create/templates/SDK-React/field/Boolean/demo.stories.tsx.mustache +1 -1
  62. package/src/tasks/create/templates/SDK-React/field/Boolean/mock.ts.mustache +8 -8
  63. package/src/tasks/create/templates/SDK-React/field/Date/index.tsx.mustache +2 -2
  64. package/src/tasks/create/templates/SDK-React/field/Date/mock.ts.mustache +7 -7
  65. package/src/tasks/create/templates/SDK-React/field/DateTime/demo.stories.tsx.mustache +1 -1
  66. package/src/tasks/create/templates/SDK-React/field/DateTime/index.tsx.mustache +2 -3
  67. package/src/tasks/create/templates/SDK-React/field/DateTime/mock.ts.mustache +6 -6
  68. package/src/tasks/create/templates/SDK-React/field/Decimal/index.tsx.mustache +51 -35
  69. package/src/tasks/create/templates/SDK-React/field/Decimal/mock.ts.mustache +1 -1
  70. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/config.json.mustache +1 -1
  71. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/demo.stories.tsx.mustache +1 -1
  72. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/index.tsx.mustache +47 -37
  73. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/mock.ts.mustache +1 -1
  74. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/config.json.mustache +1 -1
  75. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/index.tsx.mustache +36 -21
  76. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/mock.ts.mustache +1 -1
  77. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/config.json.mustache +64 -0
  78. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/demo.stories.tsx.mustache +91 -0
  79. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/index.tsx.mustache +160 -0
  80. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/mock.ts.mustache +4 -0
  81. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/styles.js.mustache +7 -0
  82. package/src/tasks/create/templates/SDK-React/field/Integer/config.json.mustache +1 -1
  83. package/src/tasks/create/templates/SDK-React/field/Integer/index.tsx.mustache +19 -20
  84. package/src/tasks/create/templates/SDK-React/field/Integer/mock.ts.mustache +1 -1
  85. package/src/tasks/create/templates/SDK-React/field/Picklist/index.tsx.mustache +26 -26
  86. package/src/tasks/create/templates/SDK-React/field/Picklist-RadioButtons/mock.ts.mustache +0 -1
  87. package/src/tasks/create/templates/SDK-React/field/Text/config.json.mustache +1 -1
  88. package/src/tasks/create/templates/SDK-React/field/Text/index.tsx.mustache +0 -1
  89. package/src/tasks/create/templates/SDK-React/field/Text/mock.ts.mustache +1 -1
  90. package/src/tasks/create/templates/SDK-React/field/Text-Email/config.json.mustache +1 -1
  91. package/src/tasks/create/templates/SDK-React/field/Text-Email/mock.ts.mustache +1 -1
  92. package/src/tasks/create/templates/SDK-React/field/Text-Input/config.json.mustache +1 -1
  93. package/src/tasks/create/templates/SDK-React/field/Text-Input/index.tsx.mustache +0 -1
  94. package/src/tasks/create/templates/SDK-React/field/Text-Input/mock.ts.mustache +1 -1
  95. package/src/tasks/create/templates/SDK-React/field/Text-Paragraph/index.tsx.mustache +1 -3
  96. package/src/tasks/create/templates/SDK-React/field/Text-Paragraph/mock.ts.mustache +1 -1
  97. package/src/tasks/create/templates/SDK-React/field/Text-Phone/index.tsx.mustache +1 -2
  98. package/src/tasks/create/templates/SDK-React/field/Text-URL/index.tsx.mustache +1 -2
  99. package/src/tasks/create/templates/SDK-React/field/Text-URL/mock.ts.mustache +1 -1
  100. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/demo.stories.tsx.mustache +4 -4
  101. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/index.tsx.mustache +0 -2
  102. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/mock.ts.mustache +6 -6
  103. package/src/tasks/create/templates/SDK-React/template/DETAILS/demo.stories.tsx.mustache +1 -7
  104. package/src/tasks/create/templates/SDK-React/template/DETAILS/index.tsx.mustache +4 -9
  105. package/src/tasks/create/templates/SDK-React/template/DETAILS/mock.ts.mustache +181 -165
  106. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/demo.stories.tsx.mustache +1 -6
  107. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/index.tsx.mustache +4 -9
  108. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/mock.ts.mustache +207 -163
  109. package/src/tasks/create/templates/SDK-React/template/FORM/config.json.mustache +1 -1
  110. package/src/tasks/create/templates/SDK-React/template/FORM/demo.stories.tsx.mustache +0 -1
  111. package/src/tasks/create/templates/SDK-React/template/FORM/index.tsx.mustache +14 -16
  112. package/src/tasks/create/templates/SDK-React/template/FORM/utils.ts.mustache +1 -1
  113. package/src/tasks/create/templates/SDK-React/template/FORM-region/demo.stories.tsx.mustache +0 -2
  114. package/src/tasks/create/templates/SDK-React/template/FORM-region/mock.ts.mustache +121 -122
  115. package/src/tasks/create/templates/SDK-React/template/PAGE/OneColumn.tsx.mustache +12 -13
  116. package/src/tasks/create/templates/SDK-React/template/PAGE/demo.stories.tsx.mustache +1 -1
  117. package/src/tasks/create/templates/SDK-React/template/PAGE/index.tsx.mustache +3 -5
  118. package/src/tasks/create/templates/SDK-React/template/PAGE/mock.ts.mustache +8 -9
  119. package/src/tasks/create/templates/SDK-React/widget/CASE/config.json.mustache +2 -2
  120. package/src/tasks/create/templates/SDK-React/widget/CASE/demo.stories.tsx.mustache +0 -1
  121. package/src/tasks/create/templates/SDK-React/widget/CASE/index.tsx.mustache +3 -3
  122. package/src/tasks/create/templates/SDK-React/widget/PAGE/config.json.mustache +43 -43
  123. package/src/tasks/create/templates/SDK-React/widget/PAGE/mock.ts.mustache +1 -1
  124. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/demo.stories.tsx.mustache +1 -2
  125. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/index.tsx.mustache +0 -1
  126. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/mock.ts.mustache +0 -1
  127. package/src/tasks/create-all/index.js +3 -0
  128. package/src/tasks/publish/helper.js +4 -0
  129. package/src/tasks/publish-all/helper.js +6 -2
  130. package/src/tasks/validator/index.js +7 -1
@@ -6,3 +6,19 @@ export default styled.div(() => {
6
6
  margin: 0px 0;
7
7
  `;
8
8
  });
9
+
10
+ export const StyledDetailsGridContainer = styled.div(() => {
11
+ return css`
12
+ margin-line-start: 1;
13
+ `;
14
+ });
15
+
16
+
17
+ export const StyledHighlightedFieldsHrLine = styled.hr(() => {
18
+ return css`
19
+ line: {
20
+ margin: '0.75rem 0';
21
+ opacity: '50%'
22
+ }
23
+ `;
24
+ });
@@ -0,0 +1,78 @@
1
+ /* eslint-disable react-hooks/rules-of-hooks */
2
+ import React from 'react';
3
+ import { useEffect, useState } from 'react';
4
+ import { Avatar as CosmosAvatar, withConfiguration } from '@pega/cosmos-react-core';
5
+ import type { PConnFieldProps } from './PConnProps';
6
+
7
+
8
+ // interface for props
9
+ interface {{COMPONENT_CLASS_NAME}}AvatarProps extends PConnFieldProps {
10
+ // If any, enter additional props that only exist on TextInput here
11
+ metaObj: any;
12
+ showStatus: boolean;
13
+
14
+ }
15
+
16
+ function Avatar(props: {{COMPONENT_CLASS_NAME}}AvatarProps) {
17
+ const { metaObj, showStatus = false } = props;
18
+ const [imageBlobUrl, setImageBlobUrl] = useState(null);
19
+ let userName: string;
20
+ let userIdentifier: string;
21
+
22
+ // TODO Below if conditions can be removed once we have apis to get worklist/mywork info
23
+ // This is non CaseView case (Dashboard, MyWork etc)
24
+ if (!metaObj) {
25
+ userName = PCore.getEnvironmentInfo().getOperatorName();
26
+ userIdentifier = PCore.getEnvironmentInfo().getOperatorIdentifier();
27
+ } else {
28
+ userName = metaObj.name;
29
+ userIdentifier = metaObj.ID;
30
+ }
31
+ if (!userName && userIdentifier) {
32
+ userName = userIdentifier;
33
+ }
34
+
35
+ useEffect(() => {
36
+ const imageKey = !metaObj ? PCore.getEnvironmentInfo().getOperatorImageInsKey() : metaObj.image;
37
+ if (imageKey) {
38
+ PCore.getAssetLoader()
39
+ .getSvcImage(imageKey)
40
+ .then((blob) => window.URL.createObjectURL(blob))
41
+ .then((imagePath) => setImageBlobUrl(imagePath as React.SetStateAction<any>));
42
+ }
43
+ }, [metaObj]);
44
+
45
+ if (showStatus) {
46
+ const currentState = PCore.getMessagingServiceManager().getUserPresence().getUserState(userIdentifier);
47
+ const [userState, setUserState]: any = useState(currentState === 'online' ? 'active' : 'inactive');
48
+
49
+ // @ts-ignore
50
+ const handleUserStateChange = ({ state }) => {
51
+ setUserState(state === 'online' ? 'active' : 'inactive');
52
+ };
53
+
54
+ useEffect(() => {
55
+ const subId = PCore.getMessagingServiceManager()
56
+ .getUserPresence()
57
+ // @ts-ignore
58
+ .subscribe(userIdentifier, handleUserStateChange);
59
+
60
+ return function cleanup() {
61
+ PCore.getMessagingServiceManager().getUserPresence().unsubscribe(userIdentifier, subId);
62
+ };
63
+ }, [userIdentifier, handleUserStateChange]);
64
+ // @ts-ignore
65
+ return <CosmosAvatar name={userName} imageSrc={imageBlobUrl as React.SetStateAction<any>} status={userState} />;
66
+ }
67
+
68
+ // Do not render when userName does not exists
69
+ // TODO : In CNR case, pxRequestor is not available, please remove this condition once it populates
70
+ if (!userName) {
71
+ return null;
72
+ }
73
+
74
+ return <CosmosAvatar name={userName} imageSrc={imageBlobUrl as React.SetStateAction<any>} />;
75
+ }
76
+
77
+
78
+ export default withConfiguration(Avatar);
@@ -0,0 +1,55 @@
1
+ import { Fragment, ReactElement } from 'react';
2
+ import { FieldValueList } from '@pega/cosmos-react-core';
3
+
4
+ interface DetailsRenderProps {
5
+ children?: never;
6
+ child: NonNullable<ReactElement>;
7
+ }
8
+
9
+ const DetailsRender = (props: DetailsRenderProps) => {
10
+ const { child } = props;
11
+
12
+ const kids = child.props.getPConnect().getChildren();
13
+
14
+ const displayCompArr: ReactElement[] = [];
15
+
16
+ Object.values(kids).forEach((value: any, i :number) => {
17
+ const { type } = value.getPConnect().getRawMetadata();
18
+ const { hideLabel, variant, testId, label } = value
19
+ .getPConnect()
20
+ .resolveConfigProps(value.getPConnect().getConfigProps());
21
+
22
+ let displayComp;
23
+ const key = JSON.stringify(value.getPConnect());
24
+ const key1 = key.concat(`-${i}`);
25
+
26
+ if (type === 'reference') {
27
+ const refElement = value.getPConnect().getComponent();
28
+
29
+ displayCompArr.push(refElement);
30
+ } else {
31
+ const element = value.getPConnect().getComponent();
32
+ const displayEl = <Fragment key={key}>{element}</Fragment>;
33
+
34
+ {{! pick new delimiters for mustache }}
35
+ {{=<% %>=}}
36
+ displayComp = (
37
+ <Fragment key={key1}>
38
+ <FieldValueList
39
+ style={{ columnGap: '0'}}
40
+ variant={hideLabel ? 'stacked' : variant}
41
+ data-testid={testId}
42
+ fields={[{ id: '1', name: hideLabel ? '' : label, value: displayEl }]}
43
+ />
44
+ </Fragment>
45
+ );
46
+ <%={{ }}=%> {{! revert delimiters for mustache }}
47
+
48
+ displayCompArr.push(displayComp);
49
+ }
50
+ });
51
+
52
+ return <>{displayCompArr}</>;
53
+ };
54
+
55
+ export default DetailsRender;
@@ -0,0 +1,49 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import React from 'react';
3
+ import { FieldValueList, Text } from '@pega/cosmos-react-core';
4
+ import type { PConnProps } from './PConnProps';
5
+
6
+ interface HighlightRenderProps extends PConnProps {
7
+ field?: any;
8
+ }
9
+
10
+ const HighlightRender = (props: HighlightRenderProps) => {
11
+ const { getPConnect, field } = props;
12
+
13
+ field.config.displayMode = 'DISPLAY_ONLY';
14
+
15
+ // Mark as status display when using pyStatusWork
16
+ if (field.config?.value === '@P .pyStatusWork') {
17
+ field.type = 'TextInput';
18
+ field.config.displayAsStatus = true;
19
+ }
20
+
21
+ const configProps: any = getPConnect().resolveConfigProps(field.config);
22
+
23
+ // @ts-ignore
24
+ const reactField = getPConnect().createComponent(field);
25
+
26
+ return (
27
+ {{! pick new delimiters for mustache }}
28
+ {{=<% %>=}}
29
+ <FieldValueList
30
+ style={{ width: 'auto' }}
31
+ variant='stacked'
32
+ data-testid={field.testId}
33
+ fields={[
34
+ {
35
+ id: '2',
36
+ name: configProps.hideLabel ? '' : configProps.label,
37
+ value: (
38
+ <Text variant='h1' as='span'>
39
+ {reactField}
40
+ </Text>
41
+ )
42
+ }
43
+ ]}
44
+ />
45
+ <%={{ }}=%> {{! revert delimiters for mustache }}
46
+ );
47
+ };
48
+
49
+ export default HighlightRender;
@@ -0,0 +1,218 @@
1
+ // @ts-nocheck
2
+ import { useState, useEffect, Fragment } from 'react';
3
+ import {
4
+ Link,
5
+ Button,
6
+ Popover,
7
+ useOuterEvent,
8
+ useElement,
9
+ Progress,
10
+ FormField,
11
+ useTheme,
12
+ withConfiguration
13
+ } from '@pega/cosmos-react-core';
14
+ import { Glimpse } from '@pega/cosmos-react-work';
15
+ import { EmailDisplay } from '@pega/cosmos-react-core';
16
+
17
+ import type { PConnFieldProps } from './PConnProps';
18
+
19
+ import Avatar from './Avatar';
20
+
21
+
22
+ // interface for props
23
+ interface {{COMPONENT_CLASS_NAME}}OperatorProps extends PConnFieldProps {
24
+ // If any, enter additional props that only exist on TextInput here
25
+ name: string;
26
+ id: string;
27
+ label: string;
28
+ metaObj: any;
29
+ externalUser: any;
30
+ }
31
+
32
+ let pTarget = null;
33
+
34
+ function Operator(props: {{COMPONENT_CLASS_NAME}}OperatorProps) {
35
+ const { id, name, label, testId, helperText, externalUser, metaObj } = props;
36
+ const [isOpen, setIsOpen] = useState(false);
37
+ const [isLoading, setIsLoading] = useState(true);
38
+ const [popoverEl, setPopoverEl] = useElement(null);
39
+ const [popoverContent, setpopoverContent] = useState(null);
40
+ const theme: any = useTheme();
41
+
42
+ /* If the id has changed, we need to reset the popover */
43
+ useEffect(() => {
44
+ pTarget = null;
45
+ }, [id]);
46
+
47
+
48
+ {{! pick new delimiters for mustache }}
49
+ {{=<% %>=}}
50
+
51
+ const OperatorPreview = () => {
52
+ const localizedVal = PCore.getLocaleUtils().getLocaleValue;
53
+ const localeCategory = 'Operator';
54
+ setpopoverContent(
55
+ <Progress variant='ring' message={localizedVal('Loading operator...', localeCategory)} placement='local' />
56
+ );
57
+ if (externalUser && externalUser.classID !== 'Data-Party-Operator') {
58
+ const fields = [
59
+ {
60
+ id: 'pyFirstName',
61
+ name: localizedVal('Name', localeCategory),
62
+ value: externalUser.name
63
+ },
64
+ {
65
+ id: 'pyEmail1',
66
+ name: localizedVal('Email', localeCategory),
67
+ value:
68
+ externalUser.email !== '' ? <Link href={`mailto:${externalUser.email}`}>{externalUser.email}</Link> : ''
69
+ },
70
+ {
71
+ id: 'pyPhoneNumber',
72
+ name: localizedVal('Phone', localeCategory),
73
+ value: externalUser.phone !== '' ? <Link href={`tel:${externalUser.phone}`}>{externalUser.phone}</Link> : ''
74
+ }
75
+ ];
76
+ setIsLoading(false);
77
+ setpopoverContent(
78
+ <Glimpse
79
+ visual={
80
+ <Avatar
81
+ metaObj={{
82
+ name: externalUser.name
83
+ }}
84
+ />
85
+ }
86
+ primary={externalUser.name}
87
+ secondary={[externalUser.position]}
88
+ fields={fields}
89
+ target={pTarget}
90
+ />
91
+ );
92
+ } else {
93
+ return PCore.getUserApi()
94
+ .getOperatorDetails(id, true)
95
+ .then(res => {
96
+ if (res.data?.pyOperatorInfo) {
97
+ const fields = [];
98
+ const data = res.data;
99
+ if (data.pyOperatorInfo && data.pyOperatorInfo.pyUserName) {
100
+ fields.push({
101
+ id: 'Name',
102
+ name: localizedVal('Name', localeCategory),
103
+ value: data.pyOperatorInfo.pyUserName
104
+ });
105
+ }
106
+ if (data.pyOperatorInfo && data.pyOperatorInfo.pyEmailAddress) {
107
+ fields.push({
108
+ id: 'Email',
109
+ name: localizedVal('Email address', localeCategory),
110
+ value: <EmailDisplay value={data.pyOperatorInfo.pyEmailAddress} />
111
+ });
112
+ }
113
+ const opAvatar = (
114
+ <Avatar
115
+ metaObj={{
116
+ image: '',
117
+ name: data.pyOperatorInfo.pyUserName
118
+ }}
119
+ />
120
+ );
121
+
122
+ setIsLoading(false);
123
+ setpopoverContent(
124
+ <Glimpse
125
+ heading={{
126
+ primary: data.pyOperatorInfo.pyUserName,
127
+ secondary: data.pyOperatorInfo.pyEmailAddress,
128
+ visual: opAvatar
129
+ }}
130
+ fields={fields}
131
+ target={pTarget}
132
+ onDismiss={() => {pTarget = null;}}
133
+ />
134
+ );
135
+ }
136
+ });
137
+ }
138
+ };
139
+
140
+ <%={{ }}=%> {{! revert delimiters for mustache }}
141
+
142
+ const clickAction = (e: any) => {
143
+
144
+ setIsOpen(!isOpen);
145
+ if (pTarget === null) {
146
+ pTarget = e.currentTarget;
147
+ OperatorPreview();
148
+ }
149
+ };
150
+
151
+ const hidePopover = () => {
152
+ if (isOpen) {
153
+ setIsOpen(false);
154
+ }
155
+ };
156
+
157
+ useOuterEvent('mousedown', [popoverEl], hidePopover); // Call the method on clicking outside these elements
158
+
159
+ const hideOnEscape = (e: any) => {
160
+ if (e.key === 'Escape') hidePopover(); // Call the method when Escape key is pressed
161
+ };
162
+
163
+ const comp = (
164
+ <Fragment>
165
+ {metaObj ? (
166
+ <Button
167
+ variant='text'
168
+ aria-haspopup
169
+ aria-expanded={isOpen}
170
+ onClick={clickAction}
171
+ onKeyDown={hideOnEscape}
172
+ data-test-id={testId}
173
+ style={label !== null ? { width: 'max-content', height: theme.components.input.height } : undefined}
174
+ >
175
+ <Avatar {...props} />
176
+ </Button>
177
+ ) : (
178
+ <Button
179
+ variant='link'
180
+ aria-haspopup
181
+ aria-expanded={isOpen}
182
+ onClick={clickAction}
183
+ onKeyDown={hideOnEscape}
184
+ data-test-id={testId}
185
+ style={label !== null ? { width: 'max-content', height: theme.components.input.height } : undefined}
186
+ >
187
+ {name}
188
+ </Button>
189
+ )}
190
+
191
+ {isOpen && (
192
+ <Popover
193
+ ref={setPopoverEl}
194
+ groupId='operator'
195
+ target={pTarget}
196
+ placement='bottom-start'
197
+ style={isLoading ? { position: 'relative', width: '10rem', minHeight: '4rem' } : undefined}
198
+ strategy='fixed'
199
+ >
200
+ {popoverContent}
201
+ </Popover>
202
+ )}
203
+ </Fragment>
204
+ );
205
+
206
+ if (label !== null) {
207
+ return (
208
+ <FormField label={label} info={helperText}>
209
+ {comp}
210
+ </FormField>
211
+ );
212
+ }
213
+
214
+ return comp;
215
+ };
216
+
217
+
218
+ export default withConfiguration(Operator);
@@ -1,11 +1,12 @@
1
-
2
-
1
+ /* eslint-disable no-nested-ternary */
2
+ /* eslint-disable react/jsx-no-useless-fragment */
3
3
  // @ts-nocheck
4
4
  import type { Meta, StoryObj } from '@storybook/react';
5
- import { Text, FieldValueList, Button, DateTimeDisplay, useTheme } from '@pega/cosmos-react-core';
5
+ import { Text, FieldValueList, DateTimeDisplay, useTheme } from '@pega/cosmos-react-core';
6
6
  import {{COMPONENT_CLASS_NAME}} from './index';
7
- import { pyReviewRaw, pyReviewResolved, regionChildrenResolved } from './mock';
7
+ import { pyReviewRaw, pyReviewResolved, regionChildrenResolved, operatorDetails, configProps } from './mock';
8
8
  import StatusWorkRenderer from './StatusWork';
9
+ import Operator from './Operator';
9
10
 
10
11
  const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {
11
12
  title: '{{COMPONENT_CLASS_NAME}}',
@@ -18,6 +19,33 @@ const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {
18
19
 
19
20
  export default meta;
20
21
  type Story = StoryObj<typeof {{COMPONENT_CLASS_NAME}}>;
22
+
23
+ if (!window.PCore) {
24
+ window.PCore = {};
25
+ }
26
+
27
+ window.PCore.getLocaleUtils = () => {
28
+ return {
29
+ getLocaleValue: value => {
30
+ return value;
31
+ }
32
+ };
33
+ };
34
+
35
+ window.PCore.getUserApi = () => {
36
+ return {
37
+ getOperatorDetails: () => {
38
+ return new Promise(resolve => {
39
+ resolve(operatorDetails);
40
+ });
41
+ }
42
+ };
43
+ };
44
+
45
+ const Region = () => {
46
+ return <></>;
47
+ };
48
+
21
49
  const renderField = resolvedProps => {
22
50
  const {
23
51
  displayAsStatus = false,
@@ -25,7 +53,7 @@ const renderField = resolvedProps => {
25
53
  value = '',
26
54
  label = '',
27
55
  key,
28
- // eslint-disable-next-line react-hooks/rules-of-hooks
56
+ // eslint-disable-next-line react-hooks/rules-of-hooks, @typescript-eslint/no-unused-vars
29
57
  theme = useTheme()
30
58
  } = resolvedProps;
31
59
 
@@ -53,19 +81,30 @@ const renderField = resolvedProps => {
53
81
 
54
82
  if (displayAsStatus === true) val = <StatusWorkRenderer value={value} key={key} />;
55
83
 
84
+ const [_label] =
85
+ label === 'Create operator'
86
+ ? [configProps.createLabel, configProps.createOperator, configProps.createDateTime]
87
+ : label === 'Update operator'
88
+ ? [configProps.updateLabel, configProps.updateOperator, configProps.updateDateTime]
89
+ : [configProps.resolveLabel, configProps.resolveOperator, configProps.resolveDateTime];
90
+
56
91
  if (label === 'Create Operator')
57
92
  val = (
58
- <Button
59
- variant='link'
60
- style={
61
- label !== null
62
- ? { width: 'max-content', height: theme.components.input.height }
63
- : undefined
64
- }
65
- key={key}
66
- >
67
- {value.userName}
68
- </Button>
93
+ <Operator
94
+ label={configProps.hideLabel ? '' : _label}
95
+ name={configProps.createOperator.userName}
96
+ id={configProps.createOperator.userId}
97
+ value={undefined}
98
+ validatemessage=''
99
+ hideLabel={false}
100
+ readOnly={false}
101
+ required={false}
102
+ disabled={false}
103
+ externalUser={undefined}
104
+ metaObj={undefined}
105
+ testId=''
106
+ helperText=''
107
+ />
69
108
  );
70
109
 
71
110
  if (variant === 'inline') {
@@ -122,24 +161,54 @@ export const Base{{COMPONENT_CLASS_NAME}}: Story = args => {
122
161
  setInheritedProp: () => {
123
162
  /* nothing */
124
163
  },
125
- resolveConfigProps: () => {
126
- /* nothing */
164
+ resolveConfigProps: config => {
165
+ return config;
127
166
  }
128
167
  };
129
168
  }
130
169
  };
131
170
 
132
- const regionAChildren = pyReviewRaw.children[0].children.map(child => {
133
- return props.getPConnect().createComponent(child);
134
- });
135
- const regionBChildren = pyReviewRaw.children[1].children.map(child => {
136
- return props.getPConnect().createComponent(child);
137
- });
138
171
 
139
172
  return (
140
173
  <{{COMPONENT_CLASS_NAME}} {...props} {...args}>
141
- {regionAChildren}
142
- {regionBChildren}
174
+ <Region
175
+ {...{
176
+ getPConnect: () => ({
177
+ setInheritedProp: () => {},
178
+ getChildren: () =>
179
+ pyReviewRaw.children[0].children.map((child, index) => {
180
+ return {
181
+ getPConnect: () => ({
182
+ getRawMetadata: () => pyReviewRaw.children[0].children[index],
183
+ getConfigProps: () => {},
184
+ resolveConfigProps: () => regionChildrenResolved[index],
185
+ getComponent: () =>
186
+ props.getPConnect().createComponent(pyReviewRaw.children[0].children[index])
187
+ })
188
+ };
189
+ })
190
+ })
191
+ }}
192
+ />
193
+ <Region
194
+ {...{
195
+ getPConnect: () => ({
196
+ setInheritedProp: () => {},
197
+ getChildren: () =>
198
+ pyReviewRaw.children[1].children.map((child, index) => {
199
+ return {
200
+ getPConnect: () => ({
201
+ getRawMetadata: () => pyReviewRaw.children[1].children[index],
202
+ getConfigProps: () => {},
203
+ resolveConfigProps: () => regionChildrenResolved[index],
204
+ getComponent: () =>
205
+ props.getPConnect().createComponent(pyReviewRaw.children[1].children[index])
206
+ })
207
+ };
208
+ })
209
+ })
210
+ }}
211
+ />
143
212
  </{{COMPONENT_CLASS_NAME}}>
144
213
  );
145
214
  };