@pega/angular-sdk-overrides 0.25.1 → 0.25.3

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 (160) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/banner/banner.component.scss +12 -2
  3. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  4. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  5. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  6. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
  7. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  8. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +2 -17
  9. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  10. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  11. package/lib/designSystemExtension/operator/operator.component.html +1 -1
  12. package/lib/designSystemExtension/operator/operator.component.scss +3 -10
  13. package/lib/designSystemExtension/operator/operator.component.ts +0 -1
  14. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  15. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  16. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -8
  17. package/lib/field/auto-complete/auto-complete.component.html +0 -1
  18. package/lib/field/auto-complete/auto-complete.component.ts +35 -172
  19. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  20. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  21. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -36
  22. package/lib/field/check-box/check-box.component.html +0 -1
  23. package/lib/field/check-box/check-box.component.scss +0 -1
  24. package/lib/field/check-box/check-box.component.ts +19 -149
  25. package/lib/field/currency/currency.component.ts +36 -168
  26. package/lib/field/date/date.component.html +1 -1
  27. package/lib/field/date/date.component.ts +30 -150
  28. package/lib/field/date-time/date-time.component.ts +31 -149
  29. package/lib/field/decimal/decimal.component.ts +38 -163
  30. package/lib/field/dropdown/dropdown.component.ts +29 -151
  31. package/lib/field/email/email.component.ts +16 -155
  32. package/lib/field/field.base.ts +149 -0
  33. package/lib/field/group/group.component.ts +7 -4
  34. package/lib/field/integer/integer.component.ts +18 -157
  35. package/lib/field/location/location.component.ts +1 -1
  36. package/lib/field/multiselect/multiselect.component.ts +46 -148
  37. package/lib/field/multiselect/utils.ts +55 -47
  38. package/lib/field/object-reference/object-reference.component.html +17 -0
  39. package/lib/field/object-reference/object-reference.component.scss +0 -0
  40. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  41. package/lib/field/object-reference/object-reference.component.ts +237 -0
  42. package/lib/field/percentage/percentage.component.ts +37 -154
  43. package/lib/field/phone/phone.component.ts +28 -142
  44. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  45. package/lib/field/radio-buttons/radio-buttons.component.ts +35 -161
  46. package/lib/field/rich-text/rich-text.component.ts +19 -90
  47. package/lib/field/scalar-list/scalar-list.component.ts +17 -72
  48. package/lib/field/selectable-card/selectable-card.component.html +54 -24
  49. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  50. package/lib/field/selectable-card/selectable-card.component.ts +16 -52
  51. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  52. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  53. package/lib/field/semantic-link/semantic-link.component.ts +165 -5
  54. package/lib/field/text/text.component.scss +0 -1
  55. package/lib/field/text-area/text-area.component.ts +18 -152
  56. package/lib/field/text-input/text-input.component.ts +16 -155
  57. package/lib/field/time/time.component.ts +17 -151
  58. package/lib/field/url/url.component.ts +16 -154
  59. package/lib/field/user-reference/user-reference.component.scss +0 -1
  60. package/lib/field/user-reference/user-reference.component.ts +2 -3
  61. package/lib/infra/Containers/flow-container/flow-container.component.ts +5 -7
  62. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -10
  63. package/lib/infra/Containers/view-container/helper.ts +35 -2
  64. package/lib/infra/Containers/view-container/view-container.component.ts +1 -1
  65. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  66. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  67. package/lib/infra/action-buttons/action-buttons.component.ts +1 -2
  68. package/lib/infra/assignment/assignment.component.ts +8 -6
  69. package/lib/infra/assignment-card/assignment-card.component.html +1 -2
  70. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  71. package/lib/infra/assignment-card/assignment-card.component.ts +21 -4
  72. package/lib/infra/defer-load/defer-load.component.html +6 -2
  73. package/lib/infra/defer-load/defer-load.component.ts +16 -10
  74. package/lib/infra/multi-step/multi-step.component.scss +1 -21
  75. package/lib/infra/navbar/navbar.component.html +25 -28
  76. package/lib/infra/navbar/navbar.component.scss +16 -4
  77. package/lib/infra/navbar/navbar.component.ts +8 -3
  78. package/lib/infra/root-container/root-container.component.scss +0 -1
  79. package/lib/infra/root-container/root-container.component.ts +1 -2
  80. package/lib/infra/stages/stages.component.html +2 -2
  81. package/lib/infra/stages/stages.component.scss +7 -35
  82. package/lib/infra/stages/stages.component.ts +4 -2
  83. package/lib/infra/view/view.component.html +1 -1
  84. package/lib/infra/view/view.component.ts +0 -2
  85. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  86. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  87. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  88. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  89. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  90. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  91. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  92. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  93. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  94. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  95. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  96. package/lib/template/app-shell/app-shell.component.html +4 -1
  97. package/lib/template/app-shell/app-shell.component.scss +0 -3
  98. package/lib/template/app-shell/app-shell.component.ts +46 -7
  99. package/lib/template/case-summary/case-summary.component.scss +0 -2
  100. package/lib/template/case-view/case-view.component.html +3 -3
  101. package/lib/template/case-view/case-view.component.scss +18 -10
  102. package/lib/template/case-view/case-view.component.ts +1 -1
  103. package/lib/template/data-reference/data-reference-advanced-search.service.ts +16 -0
  104. package/lib/template/data-reference/data-reference.component.html +11 -8
  105. package/lib/template/data-reference/data-reference.component.ts +346 -112
  106. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  107. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  108. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  109. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  110. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  111. package/lib/template/data-reference/utils.ts +92 -0
  112. package/lib/template/default-form/default-form.component.ts +10 -2
  113. package/lib/template/default-page/default-page.component.html +34 -0
  114. package/lib/template/default-page/default-page.component.scss +31 -0
  115. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  116. package/lib/template/default-page/default-page.component.ts +64 -0
  117. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  118. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -1
  119. package/lib/template/list-view/list-view.component.html +9 -4
  120. package/lib/template/list-view/list-view.component.scss +21 -21
  121. package/lib/template/list-view/list-view.component.ts +154 -84
  122. package/lib/template/list-view/utils.ts +25 -2
  123. package/lib/template/object-page/object-page.component.html +1 -0
  124. package/lib/template/object-page/object-page.component.scss +0 -0
  125. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  126. package/lib/template/object-page/object-page.component.ts +14 -0
  127. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  128. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -1
  129. package/lib/template/self-service-case-view/self-service-case-view.component.html +80 -0
  130. package/lib/template/self-service-case-view/self-service-case-view.component.scss +124 -0
  131. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  132. package/lib/template/self-service-case-view/self-service-case-view.component.ts +216 -0
  133. package/lib/template/simple-table/simple-table.component.ts +0 -1
  134. package/lib/template/simple-table-manual/helpers.ts +2 -2
  135. package/lib/template/simple-table-manual/simple-table-manual.component.html +4 -4
  136. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -14
  137. package/lib/template/simple-table-manual/simple-table-manual.component.ts +8 -4
  138. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  139. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  140. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -3
  141. package/lib/template/utils.ts +42 -0
  142. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +5 -4
  143. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +2 -8
  144. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -8
  145. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  146. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  147. package/lib/widget/attachment/Attachment.types.ts +92 -0
  148. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  149. package/lib/widget/attachment/attachment.component.html +3 -3
  150. package/lib/widget/attachment/attachment.component.scss +2 -5
  151. package/lib/widget/attachment/attachment.component.ts +255 -254
  152. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  153. package/lib/widget/feed-container/feed-container.component.ts +2 -2
  154. package/lib/widget/file-utility/file-utility.component.html +3 -3
  155. package/lib/widget/file-utility/file-utility.component.scss +5 -16
  156. package/lib/widget/list-utility/list-utility.component.scss +3 -5
  157. package/lib/widget/todo/todo.component.html +8 -5
  158. package/lib/widget/todo/todo.component.scss +10 -11
  159. package/lib/widget/todo/todo.component.ts +6 -2
  160. package/package.json +1 -1
@@ -1,13 +1,12 @@
1
- import { Component, Input, OnInit, OnDestroy, EventEmitter, Output } from '@angular/core';
1
+ import { Component, Input, OnInit, EventEmitter, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
2
3
  import { MatCardModule } from '@angular/material/card';
3
4
  import { MatRadioModule } from '@angular/material/radio';
4
5
  import { MatCheckboxModule } from '@angular/material/checkbox';
5
- import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
6
- import { PConnFieldProps } from '@pega/angular-sdk-components';
7
- import { CommonModule } from '@angular/common';
8
6
  import { deleteInstruction, insertInstruction } from '@pega/angular-sdk-components';
9
7
  import { handleEvent } from '@pega/angular-sdk-components';
10
- import { Utils } from '@pega/angular-sdk-components';
8
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
9
+ import { FieldBase } from '@pega/angular-sdk-components';
11
10
 
12
11
  interface SelectableCardProps extends PConnFieldProps {
13
12
  selectionList: any;
@@ -30,26 +29,21 @@ interface SelectableCardProps extends PConnFieldProps {
30
29
  templateUrl: './selectable-card.component.html',
31
30
  styleUrl: './selectable-card.component.scss'
32
31
  })
33
- export class SelectableCardComponent implements OnInit, OnDestroy {
34
- @Input() pConn$: typeof PConnect;
32
+ export class SelectableCardComponent extends FieldBase implements OnInit {
35
33
  @Input() type: string;
36
34
  @Output() valueChange: EventEmitter<any> = new EventEmitter();
37
35
 
38
- // Used with AngularPConnect
39
- angularPConnectData: AngularPConnectData = {};
40
36
  configProps$: SelectableCardProps;
41
- value$: any;
42
37
  readOnly = false;
43
38
  disabled = false;
44
- displayMode$: string | undefined;
45
39
  radioBtnValue;
46
40
  additionalProps;
47
- testId;
48
41
  showNoValue = false;
49
42
  selectionKey?: string;
50
43
  defaultStyle = {};
51
44
  specialStyle = {};
52
45
  cardStyle = {};
46
+ noLabelStyle: {};
53
47
  selectedvalues: any;
54
48
  selectionList: any;
55
49
  primaryField: string;
@@ -61,17 +55,9 @@ export class SelectableCardComponent implements OnInit, OnDestroy {
61
55
  }
62
56
  ];
63
57
 
64
- actionsApi: Object;
65
- propName: string;
58
+ override ngOnInit(): void {
59
+ super.ngOnInit();
66
60
 
67
- constructor(
68
- private angularPConnect: AngularPConnectService,
69
- private utils: Utils
70
- ) {}
71
-
72
- ngOnInit(): void {
73
- // First thing in initialization is registering and subscribing to the AngularPConnect service
74
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
75
61
  // styles used in displaying common field props
76
62
  this.defaultStyle = {
77
63
  display: 'grid',
@@ -84,37 +70,15 @@ export class SelectableCardComponent implements OnInit, OnDestroy {
84
70
  margin: '0.5rem',
85
71
  fontSize: '0.875rem'
86
72
  };
87
- this.checkAndUpdate();
88
- }
89
-
90
- ngOnDestroy(): void {
91
- if (this.angularPConnectData.unsubscribeFn) {
92
- this.angularPConnectData.unsubscribeFn();
93
- }
94
- }
95
-
96
- // Callback passed when subscribing to store change
97
- onStateChange() {
98
- this.checkAndUpdate();
99
- }
100
-
101
- checkAndUpdate() {
102
- // Should always check the bridge to see if the component should
103
- // update itself (re-render)
104
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
105
-
106
- // ONLY call updateSelf when the component should update
107
- if (bUpdateSelf) {
108
- this.updateSelf();
109
- }
73
+ this.noLabelStyle = {
74
+ alignItems: 'start',
75
+ marginLeft: '0.5rem'
76
+ };
110
77
  }
111
78
 
112
- updateSelf(): void {
79
+ override updateSelf(): void {
113
80
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as SelectableCardProps;
114
81
 
115
- this.actionsApi = this.pConn$.getActionsApi();
116
- this.propName = this.pConn$.getStateProps().value;
117
-
118
82
  const hideFieldLabels = this.configProps$.hideFieldLabels;
119
83
  const datasource: any = this.configProps$.datasource;
120
84
  const additionalProps: any = this.configProps$.additionalProps;
@@ -163,7 +127,7 @@ export class SelectableCardComponent implements OnInit, OnDestroy {
163
127
 
164
128
  if (this.type === 'checkbox') {
165
129
  this.testId = this.configProps$.testId;
166
- this.displayMode$ = this.configProps$.displayMode;
130
+ this.displayMode$ = this.configProps$.displayMode ?? '';
167
131
 
168
132
  this.selectionKey = this.configProps$.selectionKey;
169
133
  recordKey = this.selectionKey?.split('.').pop() ?? '';
@@ -179,7 +143,7 @@ export class SelectableCardComponent implements OnInit, OnDestroy {
179
143
 
180
144
  this.selectionList = this.configProps$.selectionList;
181
145
  this.selectedvalues = this.configProps$.readonlyContextList;
182
- this.showNoValue = this.readOnly && this.selectedvalues.length === 0; // not used
146
+ this.showNoValue = this.readOnly && this.selectedvalues?.length === 0; // not used
183
147
  this.primaryField = this.configProps$.primaryField;
184
148
  }
185
149
 
@@ -204,7 +168,7 @@ export class SelectableCardComponent implements OnInit, OnDestroy {
204
168
  alt: this.commonProps.image.showImageDescription && imageDescriptionKey ? item[imageDescriptionKey] : '',
205
169
  style: {
206
170
  width: imageWidth,
207
- backgroundColor: 'rgb(233, 238, 243)',
171
+ backgroundColor: 'transparent',
208
172
  aspectRatio: '16/9',
209
173
  maxHeight: '100%',
210
174
  objectFit: 'contain',
@@ -1,10 +1,6 @@
1
- <div *ngIf="displayMode$; else noDisplayMode">
2
- <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$, displayMode$ }"></component-mapper>
1
+ <div *ngIf="bVisible$ !== false">
2
+ <a *ngIf="!isLinkTextEmpty; else noLink" class="psdk-value" href="#" (click)="openLinkClick($event)">{{ value$ || '---' }}</a>
3
3
  </div>
4
-
5
- <ng-template #noDisplayMode>
6
- <div *ngIf="label$ !== undefined && bVisible$ !== false" class="psdk-grid-filter">
7
- <div class="psdk-grid-label">{{ label$ }}</div>
8
- <div class="psdk-value">{{ value$ || '---' }}</div>
9
- </div>
4
+ <ng-template #noLink>
5
+ <div class="psdk-value">{{ value$ || '---' }}</div>
10
6
  </ng-template>
@@ -1,16 +1,3 @@
1
- .psdk-grid-filter {
2
- display: grid;
3
- grid-template-columns: repeat(2, minmax(0, 1fr));
4
- column-gap: calc(2 * 0.5rem);
5
- row-gap: calc(2 * 0.5rem);
6
- align-items: start;
7
- }
8
-
9
- .psdk-label {
10
- color: var(--app-label-color);
11
- margin: 8px 0px;
12
- }
13
-
14
1
  .psdk-value {
15
2
  margin: 8px 0px;
16
3
  }
@@ -1,21 +1,27 @@
1
- import { Component, OnInit, Input, forwardRef, OnDestroy } from '@angular/core';
1
+ import { Component, OnInit, Input, OnDestroy } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormGroup } from '@angular/forms';
4
4
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
5
- import { ComponentMapperComponent } from '@pega/angular-sdk-components';
5
+ import { getDataReferenceInfo, isLinkTextEmpty } from '@pega/angular-sdk-components';
6
6
  import { Utils } from '@pega/angular-sdk-components';
7
7
  import { PConnFieldProps } from '@pega/angular-sdk-components';
8
8
 
9
9
  interface SemanticLinkProps extends PConnFieldProps {
10
10
  // If any, enter additional props that only exist on SemanticLink here
11
11
  text: string;
12
+ resourcePayload: any;
13
+ resourceParams: any;
14
+ previewKey: string;
15
+ referenceType: string;
16
+ dataRelationshipContext: string;
17
+ contextPage: any;
12
18
  }
13
19
 
14
20
  @Component({
15
21
  selector: 'app-semantic-link',
16
22
  templateUrl: './semantic-link.component.html',
17
23
  styleUrls: ['./semantic-link.component.scss'],
18
- imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
24
+ imports: [CommonModule]
19
25
  })
20
26
  export class SemanticLinkComponent implements OnInit, OnDestroy {
21
27
  @Input() pConn$: typeof PConnect;
@@ -28,6 +34,15 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
28
34
  value$ = '';
29
35
  displayMode$?: string = '';
30
36
  bVisible$ = true;
37
+ linkURL = '';
38
+ dataResourcePayLoad: any;
39
+ referenceType: string;
40
+ shouldTreatAsDataReference: boolean;
41
+ previewKey: string;
42
+ resourcePayload: any = {};
43
+ payload: object;
44
+ dataViewName = '';
45
+ isLinkTextEmpty = false;
31
46
 
32
47
  constructor(
33
48
  private angularPConnect: AngularPConnectService,
@@ -37,7 +52,7 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
37
52
  ngOnInit(): void {
38
53
  // First thing in initialization is registering and subscribing to the AngularPConnect service
39
54
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
40
- this.updateSelf();
55
+ this.checkAndUpdate();
41
56
  }
42
57
 
43
58
  ngOnDestroy(): void {
@@ -47,6 +62,10 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
47
62
  }
48
63
 
49
64
  onStateChange() {
65
+ this.updateSelf();
66
+ }
67
+
68
+ checkAndUpdate() {
50
69
  // Should always check the bridge to see if the component should
51
70
  // update itself (re-render)
52
71
  const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
@@ -58,12 +77,153 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
58
77
  }
59
78
 
60
79
  updateSelf() {
80
+ this.initializeComponentState();
81
+ const isData = this.buildDataPayload();
82
+ this.linkURL = this.buildLinkURL(isData);
83
+ this.isLinkTextEmpty = isLinkTextEmpty(this.value$);
84
+ }
85
+
86
+ showDataAction() {
87
+ if (this.dataResourcePayLoad && this.dataResourcePayLoad.resourceType === 'DATA') {
88
+ const { content } = this.dataResourcePayLoad;
89
+ const lookUpDataPageInfo = PCore.getDataTypeUtils().getLookUpDataPageInfo(this.dataResourcePayLoad?.className);
90
+ const lookUpDataPage = PCore.getDataTypeUtils().getLookUpDataPage(this.dataResourcePayLoad?.className);
91
+ if (lookUpDataPageInfo) {
92
+ const { parameters } = lookUpDataPageInfo as any;
93
+ this.payload = Object.keys(parameters).reduce((acc, param) => {
94
+ const paramValue = parameters[param];
95
+ return {
96
+ ...acc,
97
+ [param]: PCore.getAnnotationUtils().isProperty(paramValue) ? content[PCore.getAnnotationUtils().getPropertyName(paramValue)] : paramValue
98
+ };
99
+ }, {});
100
+ }
101
+ this.pConn$.getActionsApi().showData('pyDetails', lookUpDataPage, {
102
+ ...this.payload
103
+ });
104
+ }
105
+ if ((this.referenceType && this.referenceType.toUpperCase() === 'DATA') || this.shouldTreatAsDataReference) {
106
+ this.pConn$.getActionsApi().showData('pyDetails', this.dataViewName, {
107
+ ...this.payload
108
+ });
109
+ }
110
+ }
111
+
112
+ openLinkClick(e) {
113
+ if (!e.metaKey && !e.ctrlKey) {
114
+ e.preventDefault();
115
+ if (
116
+ (this.dataResourcePayLoad && this.dataResourcePayLoad.resourceType === 'DATA') ||
117
+ (this.referenceType && this.referenceType.toUpperCase() === 'DATA') ||
118
+ this.shouldTreatAsDataReference
119
+ ) {
120
+ this.showDataAction();
121
+ } else if (this.previewKey) {
122
+ this.pConn$.getActionsApi().openWorkByHandle(this.previewKey, this.resourcePayload.caseClassName);
123
+ }
124
+ }
125
+ }
126
+
127
+ private initializeComponentState() {
61
128
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as SemanticLinkProps;
62
- this.value$ = this.configProps$.text || '---';
129
+ this.value$ = this.configProps$.text || this.configProps$.value || '';
63
130
  this.displayMode$ = this.configProps$.displayMode;
64
131
  this.label$ = this.configProps$.label;
65
132
  if (this.configProps$.visibility) {
66
133
  this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
67
134
  }
135
+ this.referenceType = this.configProps$.referenceType;
136
+ this.previewKey = this.configProps$.previewKey;
137
+ this.resourcePayload = this.configProps$.resourcePayload ?? {};
138
+ this.dataResourcePayLoad = this.resourcePayload?.resourceType === 'DATA' ? this.resourcePayload : null;
139
+ this.shouldTreatAsDataReference = !this.previewKey && this.resourcePayload?.caseClassName;
140
+
141
+ const { contextPage } = this.configProps$;
142
+ if (contextPage?.classID) {
143
+ this.resourcePayload.caseClassName = contextPage.classID;
144
+ }
145
+
146
+ const {
147
+ WORKCLASS,
148
+ CASE_INFO: { CASE_INFO_CLASSID }
149
+ } = PCore.getConstants();
150
+ if (this.resourcePayload.caseClassName === WORKCLASS) {
151
+ this.resourcePayload.caseClassName = this.pConn$.getValue(CASE_INFO_CLASSID);
152
+ }
153
+ }
154
+
155
+ private buildDataPayload() {
156
+ const { dataRelationshipContext = null, contextPage } = this.configProps$;
157
+ const {
158
+ RESOURCE_TYPES: { DATA }
159
+ } = PCore.getConstants();
160
+
161
+ if ((this.referenceType && this.referenceType.toUpperCase() === DATA) || this.shouldTreatAsDataReference) {
162
+ try {
163
+ const dataRefContext = getDataReferenceInfo(this.pConn$, dataRelationshipContext, contextPage);
164
+ this.dataViewName = dataRefContext.dataContext ?? '';
165
+ this.payload = dataRefContext.dataContextParameters ?? {};
166
+ return true;
167
+ } catch (error) {
168
+ console.log('Error in getting the data reference info', error);
169
+ return false;
170
+ }
171
+ }
172
+
173
+ if (this.resourcePayload?.resourceType === 'DATA') {
174
+ this.dataViewName = PCore.getDataTypeUtils().getLookUpDataPage(this.resourcePayload.className);
175
+ const lookUpDataPageInfo: any = PCore.getDataTypeUtils().getLookUpDataPageInfo(this.resourcePayload.className);
176
+ const { content } = this.resourcePayload;
177
+
178
+ if (lookUpDataPageInfo) {
179
+ const { parameters } = lookUpDataPageInfo;
180
+ this.payload = Object.keys(parameters).reduce((acc, param) => {
181
+ const paramValue = parameters[param];
182
+ const propName = PCore.getAnnotationUtils().getPropertyName(paramValue);
183
+ const value = PCore.getAnnotationUtils().isProperty(paramValue) ? content[propName] : paramValue;
184
+ return { ...acc, [param]: value };
185
+ }, {});
186
+ } else {
187
+ const keysInfo = PCore.getDataTypeUtils().getDataPageKeys(this.dataViewName) ?? [];
188
+ this.payload = keysInfo.reduce((acc, curr) => {
189
+ const key = curr.isAlternateKeyStorage ? curr.linkedField : curr.keyName;
190
+ return { ...acc, [curr.keyName]: content[key] };
191
+ }, {});
192
+ }
193
+ return true;
194
+ }
195
+ return false;
196
+ }
197
+
198
+ private buildLinkURL(isData: boolean) {
199
+ const { ACTION_OPENWORKBYHANDLE, ACTION_SHOWDATA, ACTION_GETOBJECT } = PCore.getSemanticUrlUtils().getActions() as any;
200
+
201
+ if (isData && this.dataViewName && this.payload) {
202
+ return PCore.getSemanticUrlUtils().getResolvedSemanticURL(
203
+ ACTION_SHOWDATA,
204
+ { pageName: 'pyDetails', dataViewName: this.dataViewName },
205
+ { ...this.payload }
206
+ );
207
+ }
208
+
209
+ const { resourceParams = {} } = this.configProps$;
210
+ const isObjectType = (PCore.getCaseUtils() as any).isObjectCaseType(this.resourcePayload.caseClassName);
211
+ const idKey = isObjectType ? 'objectID' : 'workID';
212
+
213
+ if (resourceParams.workID === '' && typeof this.previewKey === 'string') {
214
+ resourceParams[idKey] = this.previewKey.split(' ')[1];
215
+ } else {
216
+ resourceParams[idKey] = resourceParams.workID;
217
+ }
218
+
219
+ if (this.previewKey) {
220
+ resourceParams.id = this.previewKey;
221
+ }
222
+
223
+ return PCore.getSemanticUrlUtils().getResolvedSemanticURL(
224
+ isObjectType ? ACTION_GETOBJECT : ACTION_OPENWORKBYHANDLE,
225
+ this.resourcePayload,
226
+ resourceParams
227
+ );
68
228
  }
69
229
  }
@@ -25,6 +25,5 @@
25
25
  }
26
26
 
27
27
  .psdk-details-fields-label {
28
- color: var(--app-label-color);
29
28
  margin: 8px 0px;
30
29
  }
@@ -1,14 +1,13 @@
1
- import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
1
+ import { Component, forwardRef } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
- import { interval } from 'rxjs';
7
- import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
8
- import { Utils } from '@pega/angular-sdk-components';
6
+
7
+ import { FieldBase } from '@pega/angular-sdk-components';
9
8
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
- import { PConnFieldProps } from '@pega/angular-sdk-components';
11
9
  import { handleEvent } from '@pega/angular-sdk-components';
10
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
12
11
 
13
12
  interface TextAreaProps extends PConnFieldProps {
14
13
  // If any, enter additional props that only exist on TextArea here
@@ -21,141 +20,27 @@ interface TextAreaProps extends PConnFieldProps {
21
20
  styleUrls: ['./text-area.component.scss'],
22
21
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
23
22
  })
24
- export class TextAreaComponent implements OnInit, OnDestroy {
25
- @Input() pConn$: typeof PConnect;
26
- @Input() formGroup$: FormGroup;
27
-
28
- // Used with AngularPConnect
29
- angularPConnectData: AngularPConnectData = {};
23
+ export class TextAreaComponent extends FieldBase {
30
24
  configProps$: TextAreaProps;
31
25
 
32
- label$ = '';
33
- value$ = '';
34
- bRequired$ = false;
35
- bReadonly$ = false;
36
- bDisabled$ = false;
37
- bVisible$ = true;
38
26
  nMaxLength$: number;
39
- displayMode$?: string = '';
40
- controlName$: string;
41
- bHasForm$ = true;
42
- componentReference = '';
43
- testId: string;
44
- helperText: string;
45
-
46
- fieldControl = new FormControl('', null);
47
- actionsApi: Object;
48
- propName: string;
49
-
50
- constructor(
51
- private angularPConnect: AngularPConnectService,
52
- private cdRef: ChangeDetectorRef,
53
- private utils: Utils
54
- ) {}
55
-
56
- ngOnInit(): void {
57
- // First thing in initialization is registering and subscribing to the AngularPConnect service
58
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
59
- this.controlName$ = this.angularPConnect.getComponentID(this);
60
-
61
- // Then, continue on with other initialization
62
-
63
- // call updateSelf when initializing
64
- // this.updateSelf();
65
- this.checkAndUpdate();
66
-
67
- if (this.formGroup$) {
68
- // add control to formGroup
69
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
70
- this.fieldControl.setValue(this.value$);
71
- this.bHasForm$ = true;
72
- } else {
73
- this.bReadonly$ = true;
74
- this.bHasForm$ = false;
75
- }
76
- }
77
-
78
- ngOnDestroy(): void {
79
- if (this.formGroup$) {
80
- this.formGroup$.removeControl(this.controlName$);
81
- }
82
-
83
- if (this.angularPConnectData.unsubscribeFn) {
84
- this.angularPConnectData.unsubscribeFn();
85
- }
86
- }
87
-
88
- // Callback passed when subscribing to store change
89
- onStateChange() {
90
- this.checkAndUpdate();
91
- }
92
-
93
- checkAndUpdate() {
94
- // Should always check the bridge to see if the component should
95
- // update itself (re-render)
96
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
97
-
98
- // ONLY call updateSelf when the component should update
99
- if (bUpdateSelf) {
100
- this.updateSelf();
101
- }
102
- }
103
27
 
104
- // updateSelf
105
- updateSelf(): void {
106
- // moved this from ngOnInit() and call this from there instead...
28
+ /**
29
+ * Updates the component when there are changes in the state.
30
+ */
31
+ override updateSelf(): void {
32
+ // Resolve config properties
107
33
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as TextAreaProps;
108
34
 
109
- if (this.configProps$.value != undefined) {
110
- this.value$ = this.configProps$.value;
111
- }
112
- this.nMaxLength$ = this.pConn$.getFieldMetadata(this.pConn$.getRawConfigProps()?.value)?.maxLength || 100;
113
- this.testId = this.configProps$.testId;
114
- this.displayMode$ = this.configProps$.displayMode;
115
- this.label$ = this.configProps$.label;
116
- this.helperText = this.configProps$.helperText;
117
-
118
- this.actionsApi = this.pConn$.getActionsApi();
119
- this.propName = this.pConn$.getStateProps().value;
120
-
121
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
122
- setTimeout(() => {
123
- if (this.configProps$.required != null) {
124
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
125
- }
126
- this.cdRef.detectChanges();
127
- });
128
-
129
- if (this.configProps$.visibility != null) {
130
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
131
- }
132
-
133
- // disabled
134
- if (this.configProps$.disabled != undefined) {
135
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
136
- }
137
-
138
- if (this.bDisabled$) {
139
- this.fieldControl.disable();
140
- } else {
141
- this.fieldControl.enable();
142
- }
143
-
144
- if (this.configProps$.readOnly != null) {
145
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
146
- }
35
+ // Update component common properties
36
+ this.updateComponentCommonProperties(this.configProps$);
147
37
 
148
- this.componentReference = this.pConn$.getStateProps().value;
38
+ // Extract properties from config
39
+ const { value } = this.configProps$;
149
40
 
150
- // trigger display of error message with field control
151
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
152
- const timer = interval(100).subscribe(() => {
153
- this.fieldControl.setErrors({ message: true });
154
- this.fieldControl.markAsTouched();
155
-
156
- timer.unsubscribe();
157
- });
158
- }
41
+ // Set component specific properties
42
+ this.value$ = value;
43
+ this.nMaxLength$ = this.pConn$.getFieldMetadata(this.pConn$.getRawConfigProps()?.value)?.maxLength || 100;
159
44
  }
160
45
 
161
46
  fieldOnChange(event: any) {
@@ -178,23 +63,4 @@ export class TextAreaComponent implements OnInit, OnDestroy {
178
63
  handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
179
64
  }
180
65
  }
181
-
182
- getErrorMessage() {
183
- // field control gets error message from here
184
-
185
- let errMessage = '';
186
-
187
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
188
- if (this.fieldControl.hasError('message')) {
189
- errMessage = this.angularPConnectData.validateMessage ?? '';
190
- return errMessage;
191
- }
192
- if (this.fieldControl.hasError('required')) {
193
- errMessage = 'You must enter a value';
194
- } else if (this.fieldControl.errors) {
195
- errMessage = this.fieldControl.errors.toString();
196
- }
197
-
198
- return errMessage;
199
- }
200
66
  }