@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
@@ -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,12 +1,12 @@
1
-
1
+ /* eslint-disable no-nested-ternary */
2
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
-
9
+ import Operator from './Operator';
10
10
 
11
11
  const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {
12
12
  title: '{{COMPONENT_CLASS_NAME}}',
@@ -20,6 +20,33 @@ const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {
20
20
  export default meta;
21
21
  type Story = StoryObj<typeof {{COMPONENT_CLASS_NAME}}>;
22
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
+
49
+
23
50
  const renderField = resolvedProps => {
24
51
  const {
25
52
  displayAsStatus = false,
@@ -27,7 +54,7 @@ const renderField = resolvedProps => {
27
54
  value = '',
28
55
  label = '',
29
56
  key,
30
- // eslint-disable-next-line react-hooks/rules-of-hooks
57
+ // eslint-disable-next-line react-hooks/rules-of-hooks, @typescript-eslint/no-unused-vars
31
58
  theme = useTheme()
32
59
  } = resolvedProps;
33
60
 
@@ -55,19 +82,30 @@ const renderField = resolvedProps => {
55
82
 
56
83
  if (displayAsStatus === true) val = <StatusWorkRenderer value={value} key={key} />;
57
84
 
85
+ const [_label] =
86
+ label === 'Create operator'
87
+ ? [configProps.createLabel, configProps.createOperator, configProps.createDateTime]
88
+ : label === 'Update operator'
89
+ ? [configProps.updateLabel, configProps.updateOperator, configProps.updateDateTime]
90
+ : [configProps.resolveLabel, configProps.resolveOperator, configProps.resolveDateTime];
91
+
58
92
  if (label === 'Create Operator')
59
93
  val = (
60
- <Button
61
- key={key}
62
- variant='link'
63
- style={
64
- label !== null
65
- ? { width: 'max-content', height: theme.components.input.height }
66
- : undefined
67
- }
68
- >
69
- {value.userName}
70
- </Button>
94
+ <Operator
95
+ label={configProps.hideLabel ? '' : _label}
96
+ name={configProps.createOperator.userName}
97
+ id={configProps.createOperator.userId}
98
+ value={undefined}
99
+ validatemessage=''
100
+ hideLabel={false}
101
+ readOnly={false}
102
+ required={false}
103
+ disabled={false}
104
+ externalUser={undefined}
105
+ metaObj={undefined}
106
+ testId=''
107
+ helperText=''
108
+ />
71
109
  );
72
110
 
73
111
  if (variant === 'inline') {
@@ -124,20 +162,36 @@ export const Base{{COMPONENT_CLASS_NAME}}: Story = args => {
124
162
  setInheritedProp: () => {
125
163
  /* nothing */
126
164
  },
127
- resolveConfigProps: () => {
128
- /* nothing */
165
+ resolveConfigProps: config => {
166
+ return config;
129
167
  }
130
168
  };
131
169
  }
132
170
  };
133
171
 
134
- const regionAChildren = pyReviewRaw.children[0].children.map(child => {
135
- return props.getPConnect().createComponent(child);
136
- });
137
-
138
172
  return (
139
173
  <>
140
- <{{COMPONENT_CLASS_NAME}} {...props} {...args}>{regionAChildren}</{{COMPONENT_CLASS_NAME}}>
174
+ <{{COMPONENT_CLASS_NAME}} {...props} {...args}>
175
+ <Region
176
+ {...{
177
+ getPConnect: () => ({
178
+ setInheritedProp: () => {},
179
+ getChildren: () =>
180
+ pyReviewRaw.children[0].children.map((child, index) => {
181
+ return {
182
+ getPConnect: () => ({
183
+ getRawMetadata: () => pyReviewRaw.children[0].children[index],
184
+ getConfigProps: () => {},
185
+ resolveConfigProps: () => regionChildrenResolved[index],
186
+ getComponent: () =>
187
+ props.getPConnect().createComponent(pyReviewRaw.children[0].children[index])
188
+ })
189
+ };
190
+ })
191
+ })
192
+ }}
193
+ />
194
+ </{{COMPONENT_CLASS_NAME}}>
141
195
  </>
142
196
  );
143
197
  };
@@ -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
+ };