@pega/dx-component-builder-sdk 0.24.1 → 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 (88) hide show
  1. package/package.json +1 -1
  2. package/src/tasks/create/templates/Constellation/field/Icon-Button-URL/demo.stories.tsx.mustache +1 -1
  3. package/src/tasks/create/templates/Constellation/field/Picklist/index.tsx.mustache +0 -1
  4. package/src/tasks/create/templates/Constellation/field/Picklist-Autocomplete/date.ts.mustache +15 -37
  5. package/src/tasks/create/templates/Constellation/template/DETAILS/HighlightRender.tsx.mustache +2 -2
  6. package/src/tasks/create/templates/Constellation/template/DETAILS-region/HighlightRender.tsx.mustache +2 -2
  7. package/src/tasks/create/templates/Constellation/template/DETAILS-region/index.tsx.mustache +1 -1
  8. package/src/tasks/create/templates/SDK-Angular/field/Boolean/boolean.component.html.mustache +19 -18
  9. package/src/tasks/create/templates/SDK-Angular/field/Boolean/boolean.component.ts.mustache +127 -44
  10. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/demo.stories.tsx.mustache +36 -15
  11. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.html.mustache +40 -0
  12. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/{text-url.component.scss.mustache → icon-button-url.component.scss.mustache} +4 -0
  13. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/icon-button-url.component.ts.mustache +195 -0
  14. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/mock.ts.mustache +32 -12
  15. package/src/tasks/create/templates/SDK-Angular/field/Text-URL/text-url.component.html.mustache +1 -0
  16. package/src/tasks/create/templates/SDK-Angular/field/Text-URL/text-url.component.ts.mustache +2 -0
  17. package/src/tasks/create/templates/SDK-Angular/field/TimeOfDay/time-of-day.component.html.mustache +1 -0
  18. package/src/tasks/create/templates/SDK-Angular/field/TimeOfDay/time-of-day.component.ts.mustache +2 -0
  19. package/src/tasks/create/templates/SDK-Angular/template/FORM-region/form.component.scss.mustache +1 -1
  20. package/src/tasks/create/templates/SDK-Angular/widget/CASE/case.component.ts.mustache +2 -2
  21. package/src/tasks/create/templates/SDK-Angular/widget/PAGE/page.component.html.mustache +1 -1
  22. package/src/tasks/create/templates/SDK-React/field/Boolean/demo.stories.tsx.mustache +1 -1
  23. package/src/tasks/create/templates/SDK-React/field/Boolean/mock.ts.mustache +8 -8
  24. package/src/tasks/create/templates/SDK-React/field/Date/index.tsx.mustache +2 -2
  25. package/src/tasks/create/templates/SDK-React/field/Date/mock.ts.mustache +7 -7
  26. package/src/tasks/create/templates/SDK-React/field/DateTime/demo.stories.tsx.mustache +1 -1
  27. package/src/tasks/create/templates/SDK-React/field/DateTime/index.tsx.mustache +2 -3
  28. package/src/tasks/create/templates/SDK-React/field/DateTime/mock.ts.mustache +6 -6
  29. package/src/tasks/create/templates/SDK-React/field/Decimal/index.tsx.mustache +51 -35
  30. package/src/tasks/create/templates/SDK-React/field/Decimal/mock.ts.mustache +1 -1
  31. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/config.json.mustache +1 -1
  32. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/demo.stories.tsx.mustache +1 -1
  33. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/index.tsx.mustache +47 -37
  34. package/src/tasks/create/templates/SDK-React/field/Decimal-Currency/mock.ts.mustache +1 -1
  35. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/config.json.mustache +1 -1
  36. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/index.tsx.mustache +36 -21
  37. package/src/tasks/create/templates/SDK-React/field/Decimal-Percentage/mock.ts.mustache +1 -1
  38. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/demo.stories.tsx.mustache +58 -25
  39. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/index.tsx.mustache +134 -53
  40. package/src/tasks/create/templates/SDK-React/field/Icon-Button-URL/mock.ts.mustache +2 -14
  41. package/src/tasks/create/templates/SDK-React/field/Integer/config.json.mustache +1 -1
  42. package/src/tasks/create/templates/SDK-React/field/Integer/index.tsx.mustache +19 -20
  43. package/src/tasks/create/templates/SDK-React/field/Integer/mock.ts.mustache +1 -1
  44. package/src/tasks/create/templates/SDK-React/field/Picklist/index.tsx.mustache +26 -26
  45. package/src/tasks/create/templates/SDK-React/field/Picklist-RadioButtons/mock.ts.mustache +0 -1
  46. package/src/tasks/create/templates/SDK-React/field/Text/config.json.mustache +1 -1
  47. package/src/tasks/create/templates/SDK-React/field/Text/index.tsx.mustache +0 -1
  48. package/src/tasks/create/templates/SDK-React/field/Text/mock.ts.mustache +1 -1
  49. package/src/tasks/create/templates/SDK-React/field/Text-Email/config.json.mustache +1 -1
  50. package/src/tasks/create/templates/SDK-React/field/Text-Email/mock.ts.mustache +1 -1
  51. package/src/tasks/create/templates/SDK-React/field/Text-Input/config.json.mustache +1 -1
  52. package/src/tasks/create/templates/SDK-React/field/Text-Input/index.tsx.mustache +0 -1
  53. package/src/tasks/create/templates/SDK-React/field/Text-Input/mock.ts.mustache +1 -1
  54. package/src/tasks/create/templates/SDK-React/field/Text-Paragraph/index.tsx.mustache +1 -3
  55. package/src/tasks/create/templates/SDK-React/field/Text-Paragraph/mock.ts.mustache +1 -1
  56. package/src/tasks/create/templates/SDK-React/field/Text-Phone/index.tsx.mustache +1 -2
  57. package/src/tasks/create/templates/SDK-React/field/Text-URL/index.tsx.mustache +1 -2
  58. package/src/tasks/create/templates/SDK-React/field/Text-URL/mock.ts.mustache +1 -1
  59. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/demo.stories.tsx.mustache +4 -4
  60. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/index.tsx.mustache +0 -2
  61. package/src/tasks/create/templates/SDK-React/field/TimeOfDay/mock.ts.mustache +6 -6
  62. package/src/tasks/create/templates/SDK-React/template/DETAILS/demo.stories.tsx.mustache +1 -4
  63. package/src/tasks/create/templates/SDK-React/template/DETAILS/index.tsx.mustache +3 -8
  64. package/src/tasks/create/templates/SDK-React/template/DETAILS/mock.ts.mustache +181 -165
  65. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/demo.stories.tsx.mustache +1 -3
  66. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/index.tsx.mustache +3 -8
  67. package/src/tasks/create/templates/SDK-React/template/DETAILS-region/mock.ts.mustache +207 -163
  68. package/src/tasks/create/templates/SDK-React/template/FORM/config.json.mustache +1 -1
  69. package/src/tasks/create/templates/SDK-React/template/FORM/demo.stories.tsx.mustache +0 -1
  70. package/src/tasks/create/templates/SDK-React/template/FORM/index.tsx.mustache +14 -16
  71. package/src/tasks/create/templates/SDK-React/template/FORM/utils.ts.mustache +1 -1
  72. package/src/tasks/create/templates/SDK-React/template/FORM-region/demo.stories.tsx.mustache +0 -2
  73. package/src/tasks/create/templates/SDK-React/template/FORM-region/mock.ts.mustache +121 -122
  74. package/src/tasks/create/templates/SDK-React/template/PAGE/OneColumn.tsx.mustache +12 -13
  75. package/src/tasks/create/templates/SDK-React/template/PAGE/demo.stories.tsx.mustache +1 -1
  76. package/src/tasks/create/templates/SDK-React/template/PAGE/index.tsx.mustache +3 -5
  77. package/src/tasks/create/templates/SDK-React/template/PAGE/mock.ts.mustache +8 -9
  78. package/src/tasks/create/templates/SDK-React/widget/CASE/config.json.mustache +2 -2
  79. package/src/tasks/create/templates/SDK-React/widget/CASE/demo.stories.tsx.mustache +0 -1
  80. package/src/tasks/create/templates/SDK-React/widget/CASE/index.tsx.mustache +3 -3
  81. package/src/tasks/create/templates/SDK-React/widget/PAGE/config.json.mustache +43 -43
  82. package/src/tasks/create/templates/SDK-React/widget/PAGE/mock.ts.mustache +1 -1
  83. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/demo.stories.tsx.mustache +1 -2
  84. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/index.tsx.mustache +0 -1
  85. package/src/tasks/create/templates/SDK-React/widget/PAGE-CASE/mock.ts.mustache +0 -1
  86. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.html.mustache +0 -29
  87. package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/text-url.component.ts.mustache +0 -179
  88. /package/src/tasks/create/templates/SDK-Angular/field/Icon-Button-URL/{text-url.component.spec.ts.mustache → icon-button-url.component.spec.ts.mustache} +0 -0
@@ -0,0 +1,195 @@
1
+ import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormGroup, ReactiveFormsModule } from '@angular/forms';
4
+ import { MatInputModule } from '@angular/material/input';
5
+ import { MatIconModule } from '@angular/material/icon';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
8
+ import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
9
+ import { Utils } from '@pega/angular-sdk-components';
10
+ import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
12
+
13
+ interface {{COMPONENT_CLASS_NAME}}Props extends PConnFieldProps {
14
+ // If any, enter additional props that only exist on URL here
15
+ countryCode: string;
16
+ }
17
+
18
+ @Component({
19
+ selector: 'app-{{COMPONENT_CLASS_NAME_KEBAB}}',
20
+ templateUrl: './{{COMPONENT_CLASS_NAME_KEBAB}}.component.html',
21
+ styleUrls: ['./{{COMPONENT_CLASS_NAME_KEBAB}}.component.scss'],
22
+ standalone: true,
23
+ imports: [
24
+ CommonModule,
25
+ MatIconModule,
26
+ MatButtonModule,
27
+ ReactiveFormsModule,
28
+ MatInputModule,
29
+ MatTableModule,
30
+ forwardRef(() => ComponentMapperComponent)
31
+ ]
32
+ })
33
+ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit, OnDestroy {
34
+ @Input() pConn$: typeof PConnect;
35
+ @Input() formGroup$: FormGroup;
36
+
37
+ // Used with AngularPConnect
38
+ angularPConnectData: AngularPConnectData = {};
39
+ configProps$: {{COMPONENT_CLASS_NAME}}Props;
40
+
41
+ label$ = '';
42
+ value$ = '';
43
+ controlName$: string;
44
+ bHasForm$ = true;
45
+ componentReference = '';
46
+ displayMode$?: string = '';
47
+ tooltip$ = '';
48
+ showTable$ = false;
49
+ tableLabel$ = '';
50
+ stateNameLabel$ = '';
51
+ stateCodeLabel$ = '';
52
+ waitingForData = false;
53
+ repeatList$: MatTableDataSource<any>;
54
+ fields$: any[];
55
+ displayedColumns$ = ['stateName', 'stateCode'];
56
+ countryCode = 'USA';
57
+
58
+ constructor(
59
+ private angularPConnect: AngularPConnectService,
60
+ private cdRef: ChangeDetectorRef,
61
+ private utils: Utils
62
+ ) {}
63
+
64
+ ngOnInit(): void {
65
+ // First thing in initialization is registering and subscribing to the AngularPConnect service
66
+ this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
67
+ this.controlName$ = this.angularPConnect.getComponentID(this);
68
+
69
+ // Then, continue on with other initialization
70
+
71
+ // call updateSelf when initializing
72
+ // this.updateSelf();
73
+ this.checkAndUpdate();
74
+
75
+ if (this.formGroup$) {
76
+ // add control to formGroup
77
+ // this.formGroup$.addControl(this.controlName$, this.fieldControl);
78
+ // this.fieldControl.setValue(this.value$);
79
+ this.bHasForm$ = true;
80
+ } else {
81
+ this.bHasForm$ = false;
82
+ }
83
+ }
84
+
85
+ ngOnDestroy(): void {
86
+ if (this.formGroup$) {
87
+ this.formGroup$.removeControl(this.controlName$);
88
+ }
89
+
90
+ if (this.angularPConnectData.unsubscribeFn) {
91
+ this.angularPConnectData.unsubscribeFn();
92
+ }
93
+ }
94
+
95
+ // Callback passed when subscribing to store change
96
+ onStateChange() {
97
+ this.checkAndUpdate();
98
+ }
99
+
100
+ checkAndUpdate() {
101
+ // Should always check the bridge to see if the component should
102
+ // update itself (re-render)
103
+ const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
104
+
105
+ // ONLY call updateSelf when the component should update
106
+ if (bUpdateSelf) {
107
+ this.updateSelf();
108
+ }
109
+ }
110
+
111
+ // updateSelf
112
+ updateSelf(): void {
113
+ // moved this from ngOnInit() and call this from there instead...
114
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as PegaDxilMyAngularIconButtonUrlProps;
115
+
116
+ if (this.configProps$.value != undefined) {
117
+ this.value$ = this.configProps$.value;
118
+ }
119
+ if (this.configProps$.countryCode != undefined) {
120
+ this.countryCode = this.configProps$.countryCode;
121
+ }
122
+
123
+ // localized labels
124
+ this.label$ = this.pConn$.getLocalizedValue('State list for', '', '');
125
+ this.label$ = this.label$.concat(' ').concat(this.countryCode);
126
+ this.tooltip$ = this.pConn$.getLocalizedValue('Click to show/hide state list', '', '');
127
+ this.tableLabel$ = this.pConn$.getLocalizedValue('State list', '', '');
128
+ this.stateNameLabel$ = this.pConn$.getLocalizedValue('State name', '', '');
129
+ this.stateCodeLabel$ = this.pConn$.getLocalizedValue('State code', '', '');
130
+
131
+ this.displayMode$ = this.configProps$.displayMode;
132
+
133
+ this.componentReference = (this.pConn$.getStateProps() as any).value;
134
+
135
+ }
136
+
137
+ buttonClick() {
138
+ if (!this.showTable$) {
139
+ this.showTable$ = true;
140
+
141
+ this.configProps$ = this.pConn$.getConfigProps();
142
+ // @ts-ignore - second parameter pageReference for getValue method should be optional
143
+ const dataViewName = 'D_pyStateList';
144
+ const context = this.pConn$.getContextName();
145
+
146
+ this.waitingForData = true;
147
+
148
+ const stateListData = PCore.getDataApiUtils().getData(
149
+ dataViewName,
150
+ { dataViewParameters: [{ pyCountry: this.countryCode }] } as any,
151
+ context
152
+ ) as Promise<any>;
153
+
154
+ stateListData
155
+ .then((stateJSON: any) => {
156
+ this.fields$ = [{ stateName: 'pyLabel', stateCode: 'pyStateCode' }];
157
+
158
+ const tableDataResults = this.updateData(stateJSON.data.data, this.fields$);
159
+
160
+ this.repeatList$ = new MatTableDataSource(tableDataResults);
161
+
162
+ this.waitingForData = false;
163
+ })
164
+ .catch((error: any) => {
165
+ console.log(error);
166
+ });
167
+ } else {
168
+ this.showTable$ = false;
169
+ }
170
+ }
171
+
172
+ updateData(listData: any[], fieldData: any[]): any[] {
173
+ const returnList: any[] = new Array<any>();
174
+ listData.forEach(row => {
175
+ // copy
176
+ const rowData = JSON.parse(JSON.stringify(row));
177
+
178
+ const newRow = { stateName: '', stateCode: '' };
179
+
180
+ for (const field of fieldData) {
181
+ const stateName = this.pConn$.getLocalizedValue(rowData[field.stateName], '', '');
182
+ const stateCode = rowData[field.stateCode];
183
+
184
+ newRow.stateName = stateName;
185
+ newRow.stateCode = stateCode;
186
+ }
187
+ returnList.push(newRow);
188
+ });
189
+ return returnList;
190
+ }
191
+
192
+ getErrorMessage() {
193
+ return '';
194
+ }
195
+ }
@@ -1,17 +1,37 @@
1
1
  export const configProps = {
2
- value: '',
3
- label: 'URL Sample',
4
- placeholder: 'URL Placeholder',
5
- helperText: 'URL Helper Text',
6
- testId: 'url-12345678',
7
- hasSuggestions: false,
8
- required: false,
9
- disabled: false,
10
- readOnly: false,
11
- displayMode: ''
2
+ countryCode: 'USA',
3
+ value: 'https://www.yahoo.com'
4
+ };
5
+
6
+ export const stateListData = {
7
+ data: {
8
+ fetchDateTime: '2023-01-18T12:04:56.517Z',
9
+ pxObjClass: 'Pega-State',
10
+ resultCount: 3,
11
+ data: [
12
+ {
13
+ pyLabel: 'Massachusetts',
14
+ pyStateCode: 'MA'
15
+ },
16
+ {
17
+ pyLabel: 'Rhode Island',
18
+ pyStateCode: 'RI'
19
+ },
20
+ {
21
+ pyLabel: 'Connecticut',
22
+ pyStateCode: 'CT'
23
+ }
24
+ ]
25
+ },
26
+ status: 200,
27
+ statusText: '',
28
+ headers: {
29
+ 'content-length': '1328',
30
+ 'content-type': 'application/json;charset=UTF-8'
31
+ },
32
+ request: {}
12
33
  };
13
34
 
14
35
  export const stateProps = {
15
- value: '.URLSample',
16
- hasSuggestions: false
36
+ value: '.URL'
17
37
  };
@@ -14,6 +14,7 @@
14
14
  type="url"
15
15
  [value]="value$"
16
16
  [required]="bRequired$"
17
+ [attr.data-test-id]="testId"
17
18
  [formControl]="fieldControl"
18
19
  (change)="fieldOnChange($event)"
19
20
  (blur)="fieldOnBlur($event)"
@@ -36,6 +36,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit, OnDestroy {
36
36
  bVisible$ = true;
37
37
  displayMode$?: string = '';
38
38
  controlName$: string;
39
+ testId = '';
39
40
  bHasForm$ = true;
40
41
  componentReference = '';
41
42
  helperText: string;
@@ -106,6 +107,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit, OnDestroy {
106
107
  this.value$ = this.configProps$.value;
107
108
  }
108
109
 
110
+ this.testId = this.configProps$.testId;
109
111
  this.label$ = this.configProps$.label;
110
112
  this.displayMode$ = this.configProps$.displayMode;
111
113
  this.helperText = this.configProps$.helperText;
@@ -14,6 +14,7 @@
14
14
  type="time"
15
15
  [value]="value$"
16
16
  [required]="bRequired$"
17
+ [attr.data-test-id]="testId"
17
18
  [formControl]="fieldControl"
18
19
  (change)="fieldOnChange($event)"
19
20
  (blur)="fieldOnBlur($event)"
@@ -36,6 +36,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit, OnDestroy {
36
36
  bVisible$ = true;
37
37
  displayMode$?: string = '';
38
38
  controlName$: string;
39
+ testId = '';
39
40
  bHasForm$ = true;
40
41
  componentReference = '';
41
42
  helperText: string;
@@ -100,6 +101,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit, OnDestroy {
100
101
  // moved this from ngOnInit() and call this from there instead...
101
102
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as {{COMPONENT_CLASS_NAME}}Props;
102
103
 
104
+ this.testId = this.configProps$.testId;
103
105
  this.label$ = this.configProps$.label;
104
106
  this.displayMode$ = this.configProps$.displayMode;
105
107
 
@@ -11,7 +11,7 @@
11
11
  .psdk-two-column-column {
12
12
  width: 50%;
13
13
  float: left;
14
- padding: 0rem 0.3125rem;
14
+ padding: 0rem 0rem;
15
15
  height: 100%;
16
16
  }
17
17
 
@@ -50,7 +50,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit {
50
50
 
51
51
  const tableDataResults = this.updateData(historyJSON.data.data, this.fields$);
52
52
 
53
- this.displayedColumns$ = this.getDisplayColumns(this.fields$ as never[]);
53
+ this.displayedColumns$ = this.getDisplayColumns(this.fields$);
54
54
 
55
55
  this.repeatList$ = new MatTableDataSource(tableDataResults);
56
56
 
@@ -87,7 +87,7 @@ export class {{COMPONENT_CLASS_NAME}}Component implements OnInit {
87
87
  }
88
88
 
89
89
  getDisplayColumns(fields: any[] = []) {
90
- return fields.map((field: { fieldName: any }) => {
90
+ return fields.map(field => {
91
91
  return field.fieldName;
92
92
  });
93
93
  }
@@ -12,6 +12,6 @@
12
12
  </ul>
13
13
  </div>
14
14
  </div>
15
- <a *ngIf="configProps$.whatsnewlink !== ''" mat-raised-button color="primary" [href]="configProps$.whatsnewlink">See what's new</a>
15
+ <a *ngIf="configProps$.whatsnewlink != ''" mat-raised-button color="primary" [href]="configProps$.whatsnewlink">See what's new</a>
16
16
  </article>
17
17
  <%={{ }}=%> {{! revert delimiters for mustache }}
@@ -51,7 +51,7 @@ export const Base{{COMPONENT_CLASS_NAME}}: Story = args => {
51
51
  }
52
52
  };
53
53
 
54
- return <{{COMPONENT_CLASS_NAME}} {...props} {...args} value={value} />
54
+ return <{{COMPONENT_CLASS_NAME}} {...props} {...args} value={value} />;
55
55
  };
56
56
 
57
57
  Base{{COMPONENT_CLASS_NAME}}.args = {
@@ -1,11 +1,11 @@
1
1
  export const configProps = {
2
- caption: "Boolean Caption SDK",
2
+ caption: 'Boolean Caption SDK',
3
3
  value: false,
4
- trueLabel: "Yes",
5
- falseLabel: "No",
6
- label: "Boolean Sample",
7
- helperText: "Boolean Helper Text",
8
- testId: "boolean-12345678",
4
+ trueLabel: 'Yes',
5
+ falseLabel: 'No',
6
+ label: 'Boolean Sample',
7
+ helperText: 'Boolean Helper Text',
8
+ testId: 'boolean-12345678',
9
9
  hasSuggestions: false,
10
10
  readOnly: false,
11
11
  disabled: false,
@@ -17,6 +17,6 @@ export const configProps = {
17
17
  };
18
18
 
19
19
  export const stateProps = {
20
- value: ".BooleanSample",
20
+ value: '.BooleanSample',
21
21
  hasSuggestions: false
22
- };
22
+ };
@@ -2,7 +2,7 @@ import { KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/picker
2
2
  import DayjsUtils from '@date-io/dayjs';
3
3
  import handleEvent from '@pega/react-sdk-components/lib/components/helpers/event-utils';
4
4
  import { format } from '@pega/react-sdk-components/lib/components/helpers/formatters';
5
- import { dateFormatInfoDefault, getDateFormatInfo} from '@pega/react-sdk-components/lib/components/helpers/date-format-utils';
5
+ import { dateFormatInfoDefault, getDateFormatInfo } from '@pega/react-sdk-components/lib/components/helpers/date-format-utils';
6
6
  import { getComponentFromMap } from '@pega/react-sdk-components/lib/bridge/helpers/sdk_component_map';
7
7
  import { PConnFieldProps } from '@pega/react-sdk-components/lib/types/PConnProps';
8
8
  import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
@@ -118,7 +118,7 @@ export default function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}
118
118
  InputProps={{ ...testProp }}
119
119
  <%={{ }}=%> {{! revert delimiters for mustache }}
120
120
  />
121
- </MuiPickersUtilsProvider>
121
+ </MuiPickersUtilsProvider>
122
122
  </Styled{{COMPONENT_CLASS_NAME}}Wrapper>
123
123
  );
124
124
  }
@@ -1,8 +1,8 @@
1
1
  export const configProps = {
2
- value: "",
3
- label: "Date Sample",
4
- helperText: "Date Helper Text",
5
- testId: "date-12345678",
2
+ value: '',
3
+ label: 'Date Sample',
4
+ helperText: 'Date Helper Text',
5
+ testId: 'date-12345678',
6
6
  readOnly: false,
7
7
  disabled: false,
8
8
  required: true,
@@ -10,9 +10,9 @@ export const configProps = {
10
10
  hideLabel: false,
11
11
  displayMode: '',
12
12
  validatemessage: ''
13
- }
13
+ };
14
14
 
15
15
  export const stateProps = {
16
- value: ".DateSample",
16
+ value: '.DateSample',
17
17
  hasSuggestions: false
18
- }
18
+ };
@@ -22,7 +22,7 @@ window.PCore = {
22
22
  return value;
23
23
  }
24
24
  };
25
- },
25
+ }
26
26
  };
27
27
 
28
28
  const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {
@@ -2,7 +2,7 @@ import { KeyboardDateTimePicker, MuiPickersUtilsProvider } from '@material-ui/pi
2
2
  import DayjsUtils from '@date-io/dayjs';
3
3
  import handleEvent from '@pega/react-sdk-components/lib/components/helpers/event-utils';
4
4
  import { format } from '@pega/react-sdk-components/lib/components/helpers/formatters/';
5
- import { dateFormatInfoDefault, getDateFormatInfo} from '@pega/react-sdk-components/lib/components/helpers/date-format-utils';
5
+ import { dateFormatInfoDefault, getDateFormatInfo } from '@pega/react-sdk-components/lib/components/helpers/date-format-utils';
6
6
  import { getComponentFromMap } from '@pega/react-sdk-components/lib/bridge/helpers/sdk_component_map';
7
7
  import { PConnFieldProps } from '@pega/react-sdk-components/lib/types/PConnProps';
8
8
 
@@ -106,8 +106,7 @@ export default function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}
106
106
  onAccept={handleAccept}
107
107
  data-test-id={testId}
108
108
  />
109
- </MuiPickersUtilsProvider>
109
+ </MuiPickersUtilsProvider>
110
110
  </Styled{{COMPONENT_CLASS_NAME}}Wrapper>
111
111
  );
112
112
  }
113
-
@@ -1,8 +1,8 @@
1
1
  export const configProps = {
2
- value: "",
3
- label: "Date Time Sample",
4
- helperText: "Date Time Helper Text",
5
- testId: "datetime-12345678",
2
+ value: '',
3
+ label: 'Date Time Sample',
4
+ helperText: 'Date Time Helper Text',
5
+ testId: 'datetime-12345678',
6
6
  readOnly: false,
7
7
  disabled: false,
8
8
  required: true,
@@ -13,6 +13,6 @@ export const configProps = {
13
13
  };
14
14
 
15
15
  export const stateProps = {
16
- value: ".DateTimeSample",
16
+ value: '.DateTimeSample',
17
17
  hasSuggestions: false
18
- };
18
+ };
@@ -1,5 +1,6 @@
1
- import CurrencyTextField from '@unicef/material-ui-currency-textfield';
2
-
1
+ import { TextField } from '@material-ui/core';
2
+ import { NumericFormat } from 'react-number-format';
3
+ import { useState } from 'react';
3
4
  import { getCurrencyCharacters, getCurrencyOptions } from '@pega/react-sdk-components/lib/components/field/Currency/currency-utils.js';
4
5
  import handleEvent from '@pega/react-sdk-components/lib/components/helpers/event-utils';
5
6
  import { format } from '@pega/react-sdk-components/lib/components/helpers/formatters';
@@ -7,13 +8,15 @@ import { getComponentFromMap } from '@pega/react-sdk-components/lib/bridge/helpe
7
8
  import { PConnFieldProps } from '@pega/react-sdk-components/lib/types/PConnProps';
8
9
  import Styled{{COMPONENT_CLASS_NAME}}Wrapper from './styles';
9
10
 
10
- // Using control from: https://github.com/unicef/material-ui-currency-textfield
11
+ /* Using react-number-format component here, since it allows formatting decimal values,
12
+ as per the locale.
13
+ */
11
14
 
12
15
  interface {{COMPONENT_CLASS_NAME}}Props extends PConnFieldProps {
13
16
  // If any, enter additional props that only exist on this componentName
14
17
  currencyISOCode?: string;
15
18
  decimalPrecision?: number;
16
- showGroupSeparators?: string;
19
+ showGroupSeparators?: boolean;
17
20
  formatter?: string;
18
21
  }
19
22
 
@@ -38,13 +41,15 @@ export default function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}
38
41
  displayMode,
39
42
  hideLabel,
40
43
  currencyISOCode = 'USD',
41
- decimalPrecision = 2,
42
- showGroupSeparators = true,
44
+ decimalPrecision,
45
+ showGroupSeparators,
43
46
  testId,
44
47
  placeholder,
45
48
  formatter
46
49
  } = props;
47
50
 
51
+ const [values, setValues] = useState(value.toString());
52
+
48
53
  const pConn = getPConnect();
49
54
  const actions = pConn.getActionsApi();
50
55
  const propName = (pConn.getStateProps() as any).value;
@@ -57,6 +62,12 @@ export default function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}
57
62
 
58
63
  const theCurrencyOptions = getCurrencyOptions(currencyISOCode);
59
64
 
65
+ let readOnlyProp = {}; // Note: empty if NOT ReadOnly
66
+
67
+ if (readOnly) {
68
+ readOnlyProp = { readOnly: true };
69
+ }
70
+
60
71
  let formattedValue = '';
61
72
  if (formatter === 'Currency') {
62
73
  formattedValue = format(value, formatter.toLowerCase(), theCurrencyOptions);
@@ -76,37 +87,42 @@ export default function {{COMPONENT_CLASS_NAME}}(props: {{COMPONENT_CLASS_NAME}}
76
87
  'data-test-id': testId
77
88
  };
78
89
 
79
- function decimalOnBlur(event, inValue) {
80
- handleEvent(actions, 'changeNblur', propName, inValue !== '' ? Number(inValue) : inValue);
90
+ function decimalOnBlur() {
91
+ handleEvent(actions, 'changeNblur', propName, values);
81
92
  }
82
93
 
94
+ const handleChange = val => {
95
+ setValues(val.value);
96
+ };
97
+
83
98
  return (
84
- <Styled{{COMPONENT_CLASS_NAME}}Wrapper>
85
- <CurrencyTextField
86
- fullWidth
87
- variant={readOnly ? 'standard' : 'outlined'}
88
- helperText={helperTextToDisplay}
89
- placeholder={placeholder ?? ''}
90
- size='small'
91
- required={required}
92
- disabled={disabled}
93
- error={status === 'error'}
94
- label={label}
95
- value={value}
96
- readOnly={!!readOnly}
97
- type='text'
98
- outputFormat='number'
99
- textAlign='left'
100
- {{! pick new delimiters for mustache }}
101
- {{=<% %>=}}
102
- InputProps={{ inputProps: { ...testProp } }}
103
- <%={{ }}=%> {{! revert delimiters for mustache }}
104
- currencySymbol={readOnly && formatter === 'Currency' ? theCurrSym : ''}
105
- decimalCharacter={theCurrDec}
106
- digitGroupSeparator={showGroupSeparators ? theCurrSep : ''}
107
- decimalPlaces={decimalPrecision}
108
- onBlur={!readOnly ? decimalOnBlur : undefined}
109
- />
110
- </Styled{{COMPONENT_CLASS_NAME}}Wrapper>
99
+ <Styled{{COMPONENT_CLASS_NAME}}Wrapper>
100
+ <NumericFormat
101
+ valueIsNumericString
102
+ fullWidth
103
+ variant={readOnly ? 'standard' : 'outlined'}
104
+ helperText={helperTextToDisplay}
105
+ placeholder={placeholder ?? ''}
106
+ size='small'
107
+ required={required}
108
+ disabled={disabled}
109
+ error={status === 'error'}
110
+ label={label}
111
+ value={values}
112
+ onValueChange={val => {
113
+ handleChange(val);
114
+ }}
115
+ onBlur={!readOnly ? decimalOnBlur : undefined}
116
+ prefix={readOnly && formatter === 'Currency' ? theCurrSym : ''}
117
+ decimalSeparator={theCurrDec}
118
+ thousandSeparator={showGroupSeparators ? theCurrSep : ''}
119
+ decimalScale={readOnly && formatter === 'Currency' ? undefined : decimalPrecision}
120
+ {{! pick new delimiters for mustache }}
121
+ {{=<% %>=}}
122
+ InputProps={{ ...readOnlyProp, inputProps: { ...testProp } }}
123
+ <%={{ }}=%> {{! revert delimiters for mustache }}
124
+ customInput={TextField}
125
+ />
126
+ </Styled{{COMPONENT_CLASS_NAME}}Wrapper>
111
127
  );
112
128
  }
@@ -18,4 +18,4 @@ export const fieldMetadata = {
18
18
  type: 'Decimal',
19
19
  displayAs: 'pxNumber',
20
20
  label: 'Decimal sample'
21
- };
21
+ };
@@ -10,7 +10,7 @@
10
10
  "type": "{{TYPE}}",
11
11
  "subtype": {{{SUB_TYPE}}},
12
12
  "icon": "images/pz-currency-active.svg",
13
- "properties": [
13
+ "properties": [
14
14
  {
15
15
  "name": "label",
16
16
  "label": "Label value",
@@ -15,7 +15,7 @@ window.PCore = {
15
15
  return 'en-GB';
16
16
  }
17
17
  };
18
- }
18
+ }
19
19
  };
20
20
 
21
21
  const meta: Meta<typeof {{COMPONENT_CLASS_NAME}}> = {