@pega/dx-component-builder-sdk 0.23.20 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) 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-Autocomplete/index.tsx.mustache +11 -0
  17. package/src/tasks/create/templates/Constellation/field/Picklist-Autocomplete/utils.ts.mustache +3 -0
  18. package/src/tasks/create/templates/Constellation/field/Text/index.tsx.mustache +94 -4
  19. package/src/tasks/create/templates/Constellation/template/DETAILS/Avatar.tsx.mustache +78 -0
  20. package/src/tasks/create/templates/Constellation/template/DETAILS/DetailsRender.tsx.mustache +55 -0
  21. package/src/tasks/create/templates/Constellation/template/DETAILS/HighlightRender.tsx.mustache +49 -0
  22. package/src/tasks/create/templates/Constellation/template/DETAILS/Operator.tsx.mustache +218 -0
  23. package/src/tasks/create/templates/Constellation/template/DETAILS/demo.stories.tsx.mustache +77 -23
  24. package/src/tasks/create/templates/Constellation/template/DETAILS/index.tsx.mustache +51 -40
  25. package/src/tasks/create/templates/Constellation/template/DETAILS/mock.ts.mustache +78 -20
  26. package/src/tasks/create/templates/Constellation/template/DETAILS/styles.ts.mustache +16 -0
  27. package/src/tasks/create/templates/Constellation/template/DETAILS-region/Avatar.tsx.mustache +78 -0
  28. package/src/tasks/create/templates/Constellation/template/DETAILS-region/DetailsRender.tsx.mustache +55 -0
  29. package/src/tasks/create/templates/Constellation/template/DETAILS-region/HighlightRender.tsx.mustache +49 -0
  30. package/src/tasks/create/templates/Constellation/template/DETAILS-region/Operator.tsx.mustache +218 -0
  31. package/src/tasks/create/templates/Constellation/template/DETAILS-region/demo.stories.tsx.mustache +95 -26
  32. package/src/tasks/create/templates/Constellation/template/DETAILS-region/index.tsx.mustache +43 -40
  33. package/src/tasks/create/templates/Constellation/template/DETAILS-region/mock.ts.mustache +68 -10
  34. package/src/tasks/create/templates/Constellation/template/DETAILS-region/styles.ts.mustache +15 -0
  35. package/src/tasks/create/templates/Constellation/template/FORM/DetailsRender.tsx +59 -0
  36. package/src/tasks/create/templates/Constellation/template/FORM/index.tsx.mustache +31 -5
  37. package/src/tasks/create/templates/Constellation/template/FORM-region/DetailsRender.tsx +59 -0
  38. package/src/tasks/create/templates/Constellation/template/FORM-region/index.tsx.mustache +29 -7
  39. package/src/tasks/create/templates/Constellation/template/PAGE/GetNextWork.tsx.mustache +2 -1
  40. package/src/tasks/create/templates/Constellation/template/PAGE/localizations.json.mustache +4 -2
  41. package/src/tasks/create/templates/Constellation/widget/PAGE/demo.stories.tsx.mustache +87 -6
  42. package/src/tasks/create/templates/Constellation/widget/PAGE/index.tsx.mustache +67 -5
  43. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/config.json.mustache +64 -0
  44. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/demo.stories.tsx.mustache +42 -0
  45. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/mock.ts.mustache +17 -0
  46. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.html.mustache +29 -0
  47. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.scss.mustache +20 -0
  48. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.spec.ts.mustache +26 -0
  49. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.ts.mustache +179 -0
  50. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/config.json.mustache +64 -0
  51. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/demo.stories.tsx.mustache +58 -0
  52. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/index.tsx.mustache +79 -0
  53. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/mock.ts.mustache +16 -0
  54. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/styles.js.mustache +7 -0
  55. package/src/tasks/create/templates/SDK-React/template/DETAILS/index.tsx.mustache +1 -1
  56. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/index.tsx.mustache +1 -1
  57. package/src/tasks/create-all/index.js +3 -0
  58. package/src/tasks/publish/helper.js +4 -0
  59. package/src/tasks/publish-all/helper.js +6 -2
  60. package/src/tasks/validator/index.js +7 -1
  61. package/tests/assets/sdk-r/components/create/override-sdk/designSystemExtension/CaseSummaryFields/CaseSummaryFields.tsx +2 -2
  62. package/tests/assets/sdk-r/components/create/override-sdk/designSystemExtension/FieldValueList/FieldValueList.tsx +10 -4
  63. package/tests/assets/sdk-r/components/create/override-sdk/field/RichText/RichText.tsx +2 -2
  64. package/tests/assets/sdk-r/components/create/override-sdk/infra/NavBar/NavBar.tsx +1 -1
  65. package/tests/assets/sdk-r/components/create/override-sdk/template/ListView/ListView.tsx +2 -2
  66. package/tests/assets/sdk-r/components/createAll/custom-sdk/template/Pega_DXIL_MyDetails/demo.stories.tsx +3 -0
  67. package/tests/assets/sdk-r/components/createAll/custom-sdk/template/Pega_DXIL_MyTwoColumnDetails/demo.stories.tsx +3 -0
  68. package/tests/assets/sdk-r/components/createAll/override-sdk/designSystemExtension/CaseSummaryFields/CaseSummaryFields.tsx +2 -2
  69. package/tests/assets/sdk-r/components/createAll/override-sdk/designSystemExtension/FieldValueList/FieldValueList.tsx +10 -4
  70. package/tests/assets/sdk-r/components/createAll/override-sdk/field/RichText/RichText.tsx +2 -2
  71. package/tests/assets/sdk-r/components/createAll/override-sdk/infra/NavBar/NavBar.tsx +1 -1
  72. package/tests/assets/sdk-r/components/createAll/override-sdk/template/ListView/ListView.tsx +2 -2
@@ -1,13 +1,14 @@
1
- import { Fragment } from 'react';
2
- import { Grid, Flex, FieldGroup, withConfiguration } from '@pega/cosmos-react-core';
1
+ import { Fragment, Children, ReactElement } from 'react';
2
+ import { Grid, Flex, FieldGroup, withConfiguration, GridContainerProps } from '@pega/cosmos-react-core';
3
3
  import type { PConnFieldProps } from './PConnProps';
4
+ import DetailsRender from './DetailsRender';
5
+ import HighlightRender from './HighlightRender';
4
6
 
5
- import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
7
+ import Styled{{COMPONENT_CLASS_NAME}}Wrapper, { StyledDetailsGridContainer, StyledHighlightedFieldsHrLine } from './styles';
6
8
 
7
9
  // includes in bundle
8
10
  import { getAllFields } from './utils';
9
11
 
10
-
11
12
  // interface for props
12
13
  interface {{COMPONENT_CLASS_NAME}}Props extends PConnFieldProps {
13
14
  // If any, enter additional props that only exist on TextInput here
@@ -16,31 +17,34 @@ interface {{COMPONENT_CLASS_NAME}}Props extends PConnFieldProps {
16
17
  children: any;
17
18
  }
18
19
 
19
- // Duplicated runtime code from Constellation Design System Component
20
-
21
20
  // props passed in combination of props from property panel (config.json) and run time props from Constellation
22
21
  // any default values in config.pros should be set in defaultProps at bottom of this file
23
22
  function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}Props) {
24
23
 
25
- const { getPConnect, children, label, showLabel = true, showHighlightedData = false } = props;
24
+ const { getPConnect, label, showLabel = true, showHighlightedData = false } = props;
26
25
  const propsToUse = { label, showLabel, ...getPConnect().getInheritedProps() };
27
26
 
27
+ // storybook doesn't get children of 1 as an array of 1
28
+ let { children } = props;
29
+ if (!Array.isArray(children)) {
30
+ children = Children.toArray(children);
31
+ }
32
+
33
+ // update children with readonly
34
+ Children.toArray(children).forEach(child => {
35
+ // @ts-ignore
36
+ child.props.getPConnect().setInheritedProp('readOnly', true);
37
+ // @ts-ignore
38
+ child.props.getPConnect().setInheritedProp('displayMode', 'DISPLAY_ONLY');
39
+ });
40
+
28
41
  const numRegions = getAllFields(getPConnect)?.length;
29
42
  const gridRepeat = "repeat(".concat(numRegions).concat(", 1fr)");
30
- const gridContainer = { "colGap": 1};
31
- // @ts-ignore
43
+
44
+ const gridContainer: GridContainerProps = { colGap: 6 };
32
45
  gridContainer.cols = gridRepeat;
33
- // @ts-ignore
34
46
  gridContainer.alignItems = 'start';
35
47
 
36
- const gridHighlightContainer = { "gap": 2};
37
- // @ts-ignore
38
- gridHighlightContainer.cols = gridRepeat;
39
- // @ts-ignore
40
- gridHighlightContainer.alignItems = 'start';
41
- // @ts-ignore
42
- gridHighlightContainer.pad = [0, 0, 2, 0];
43
-
44
48
  // Set up highlighted data to pass in return if is set to show, need raw metadata to pass to createComponent
45
49
  let highlightedDataArr = [];
46
50
  if (showHighlightedData) {
@@ -48,40 +52,47 @@ function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}Props) {
48
52
  const { highlightedData = [] } = getPConnect().getRawMetadata().config;
49
53
  // @ts-ignore
50
54
  highlightedDataArr = highlightedData.map((field) => {
51
- field.config.displayMode = 'STACKED_LARGE_VAL';
52
-
53
- // Mark as status display when using pyStatusWork
54
- if (field.config.value === '@P .pyStatusWork') {
55
- field.type = 'TextInput';
56
- field.config.displayAsStatus = true;
57
- }
58
- // @ts-ignore
59
- return getPConnect().createComponent(field);
55
+ return <HighlightRender field={field} getPConnect={props.getPConnect} />;
60
56
  });
61
57
  }
62
58
 
59
+
63
60
  return (
64
61
  <Styled{{COMPONENT_CLASS_NAME}}Wrapper>
65
- {{! pick new delimiters for mustache }}
66
- {{=<% %>=}}
62
+ {{! pick new delimiters for mustache }}
63
+ {{=<% %>=}}
67
64
  <FieldGroup name={propsToUse.showLabel ? propsToUse.label : ''}>
68
65
  {showHighlightedData && highlightedDataArr.length > 0 && (
69
- <Grid container={gridHighlightContainer}
70
- data-testid={`highlighted-column-count-${numRegions}`}>
71
- {highlightedDataArr.map((child: any, i: number) => (
72
- <Fragment key={`hf-${i + 1}`}>{child}</Fragment>
73
- ))}
74
- </Grid>
66
+ <>
67
+ <Flex
68
+ // @ts-ignore
69
+ container={{ direction: 'row', alignItems: 'normal', colGap: 10 }}
70
+ data-testid={`highlighted-column-count-${numRegions}`}
71
+ >
72
+ {highlightedDataArr.map((child: ReactElement, i: number) => (
73
+ <Fragment key={`hf-${i + 1}`}>{child}</Fragment>
74
+ ))}
75
+ </Flex>
76
+ <StyledHighlightedFieldsHrLine />
77
+ </>
75
78
  )}
76
- <Grid container={gridContainer} data-testid={`column-count-${numRegions}`} >
77
- {children.map((child: any, i: number) => (
78
- <Flex container={{ direction: 'column'}} key={`r-${i + 1}`}>
79
- {child}
79
+ <Grid
80
+ as={StyledDetailsGridContainer}
81
+ container={gridContainer}
82
+ data-testid={`column-count-${numRegions}`} >
83
+ {children.map((child: ReactElement, i: number) => (
84
+
85
+ <Flex
86
+ // @ts-ignore
87
+ container={{ direction: 'column', alignItems: 'normal', colGap: 1, rowGap: 1.5 }}
88
+ key={`r-${i + 1}`}
89
+ >
90
+ <DetailsRender child={child} />
80
91
  </Flex>
81
92
  ))}
82
93
  </Grid>
83
94
  </FieldGroup>
84
- <%={{ }}=%> {{! revert delimiters for mustache }}
95
+ <%={{ }}=%> {{! revert delimiters for mustache }}
85
96
  </Styled{{COMPONENT_CLASS_NAME}}Wrapper>
86
97
  );
87
98
 
@@ -1,5 +1,4 @@
1
1
 
2
-
3
2
  // @ts-nocheck
4
3
  export const pyReviewRaw = {
5
4
  name: 'pyReview',
@@ -17,6 +16,7 @@ export const pyReviewRaw = {
17
16
  config: {
18
17
  value: '@P .pyStatusWork',
19
18
  label: '@L Work Status',
19
+ hideLabel: true,
20
20
  displayMode: 'STACKED_LARGE_VAL',
21
21
  displayAsStatus: true,
22
22
  key: 'pyStatusWork'
@@ -27,6 +27,7 @@ export const pyReviewRaw = {
27
27
  config: {
28
28
  value: '@P .pyID',
29
29
  label: '@L Case ID',
30
+ hideLabel: true,
30
31
  displayMode: 'STACKED_LARGE_VAL',
31
32
  key: 'pyID'
32
33
  }
@@ -36,6 +37,7 @@ export const pyReviewRaw = {
36
37
  config: {
37
38
  value: '@P .pxCreateDateTime',
38
39
  label: '@L Create date/time',
40
+ hideLabel: true,
39
41
  displayMode: 'STACKED_LARGE_VAL',
40
42
  key: 'pxCreateDateTime'
41
43
  }
@@ -44,6 +46,7 @@ export const pyReviewRaw = {
44
46
  type: 'UserReference',
45
47
  config: {
46
48
  label: '@L Create Operator',
49
+ hideLabel: true,
47
50
  value: '@USER .pxCreateOperator',
48
51
  placeholder: 'Select...',
49
52
  displayMode: 'STACKED_LARGE_VAL',
@@ -66,6 +69,7 @@ export const pyReviewRaw = {
66
69
  {
67
70
  name: 'A',
68
71
  type: 'Region',
72
+ key: 'A',
69
73
  getPConnect: () => {
70
74
  return {
71
75
  getRawMetadata: () => {
@@ -78,17 +82,17 @@ export const pyReviewRaw = {
78
82
  type: 'DateTime',
79
83
  config: {
80
84
  value: '@P .pySLADeadline',
81
- label: '@L SLA Deadline'
82
- },
83
- key: '1'
85
+ label: '@L SLA Deadline',
86
+ key: 'pySLADeadline'
87
+ }
84
88
  },
85
89
  {
86
90
  type: 'DateTime',
87
91
  config: {
88
92
  value: '@P .pySLAGoal',
89
- label: '@L SLA Goal'
90
- },
91
- key: '2'
93
+ label: '@L SLA Goal',
94
+ key: 'pySLAGoal'
95
+ }
92
96
  },
93
97
  {
94
98
  type: 'RadioButtons',
@@ -96,9 +100,9 @@ export const pyReviewRaw = {
96
100
  value: '@P .pySLAStartTime',
97
101
  label: '@L SLA Start Time',
98
102
  listType: 'associated',
99
- datasource: '@ASSOCIATED .pySLAStartTime'
100
- },
101
- key: '3'
103
+ datasource: '@ASSOCIATED .pySLAStartTime',
104
+ key: 'pySLAStartTime'
105
+ }
102
106
  }
103
107
  ]
104
108
  }
@@ -120,7 +124,6 @@ export const pyReviewResolved = {
120
124
  config: {
121
125
  value: 'New',
122
126
  label: 'Work Status',
123
- displayMode: 'STACKED_LARGE_VAL',
124
127
  displayAsStatus: true
125
128
  }
126
129
  },
@@ -128,16 +131,14 @@ export const pyReviewResolved = {
128
131
  type: 'TextInput',
129
132
  config: {
130
133
  value: 'M-1002',
131
- label: 'Case ID',
132
- displayMode: 'STACKED_LARGE_VAL'
134
+ label: 'Case ID'
133
135
  }
134
136
  },
135
137
  {
136
138
  type: 'DateTime',
137
139
  config: {
138
140
  value: '2022-12-11T20:06:27.232Z',
139
- label: 'Create date/time',
140
- displayMode: 'STACKED_LARGE_VAL'
141
+ label: 'Create date/time'
141
142
  }
142
143
  },
143
144
  {
@@ -148,8 +149,7 @@ export const pyReviewResolved = {
148
149
  userId: 'conns',
149
150
  userName: 'Sara Connor'
150
151
  },
151
- placeholder: 'Select...',
152
- displayMode: 'STACKED_LARGE_VAL'
152
+ placeholder: 'Select...'
153
153
  }
154
154
  }
155
155
  ],
@@ -159,22 +159,25 @@ export const pyReviewResolved = {
159
159
  export const regionChildrenResolved = [
160
160
  {
161
161
  readOnly: true,
162
- value: '',
162
+ value: 'Deadline',
163
163
  label: 'SLA Deadline',
164
+ hideLabel: true,
164
165
  displayMode: 'LABELS_LEFT',
165
166
  key: 'SLA Deadline'
166
167
  },
167
168
  {
168
169
  readOnly: true,
169
- value: '',
170
+ value: 'Goal',
170
171
  label: 'SLA Goal',
172
+ hideLabel: true,
171
173
  displayMode: 'LABELS_LEFT',
172
174
  key: 'SLA Goal'
173
175
  },
174
176
  {
175
177
  readOnly: true,
176
- value: '',
178
+ value: 'Start Time',
177
179
  label: 'SLA Start Time',
180
+ hideLabel: true,
178
181
  listType: 'associated',
179
182
  datasource: [
180
183
  {
@@ -190,3 +193,58 @@ export const regionChildrenResolved = [
190
193
  key: 'SLA Start Time'
191
194
  }
192
195
  ];
196
+
197
+ export const operatorDetails = {
198
+ data: {
199
+ pzLoadTime: 'January 18, 2023 10:33:19 AM EST',
200
+ pzPageNameHash: '_pa1519192551088960pz',
201
+ pyOperatorInfo: {
202
+ pyUserName: 'french DigV2',
203
+ pyPosition: '',
204
+ pyImageInsKey: '',
205
+ pySkills: [
206
+ {
207
+ pySkillName: '',
208
+ pzIndexOwnerKey: 'DATA-ADMIN-OPERATOR-ID FRENCHTEST.DIGV2',
209
+ pySkillRating: 0
210
+ }
211
+ ],
212
+ pyReportToUserName: '',
213
+ pyReportTo: '',
214
+ pyOrganization: 'DXIL',
215
+ pyTitle: '',
216
+ pyLabel: 'frenchTest.DigV2',
217
+ pyEmailAddress: 'User@DigV2',
218
+ pyTelephone: ''
219
+ }
220
+ },
221
+ status: 200,
222
+ statusText: '',
223
+ headers: {
224
+ 'content-length': '435',
225
+ 'content-type': 'application/json;charset=UTF-8'
226
+ },
227
+ request: {}
228
+ };
229
+
230
+ export const configProps = {
231
+ label: 'Create operator',
232
+ createLabel: 'Created',
233
+ updateLabel: 'Updated',
234
+ updateDateTime: '2023-01-16T14:53:33.280Z',
235
+ createDateTime: '2023-01-16T14:53:33.198Z',
236
+ updateOperator: {
237
+ userId: 'admin@mediaco',
238
+ userName: 'admin'
239
+ },
240
+ createOperator: {
241
+ userId: 'admin@mediaco',
242
+ userName: 'admin'
243
+ },
244
+ resolveLabel: '',
245
+ resolveOperator: '',
246
+ resolveDateTime: '',
247
+ hideLabel: true,
248
+ key: '_532zx1dah',
249
+ displayMode: 'LABELS_LEFT'
250
+ };
@@ -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 = 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;