@pega/angular-sdk-overrides 24.2.12 → 25.1.11

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 (237) hide show
  1. package/lib/designSystemExtension/alert/alert.component.scss +3 -3
  2. package/lib/designSystemExtension/alert/alert.component.ts +0 -1
  3. package/lib/designSystemExtension/alert-banner/alert-banner.component.ts +0 -1
  4. package/lib/designSystemExtension/banner/banner.component.html +1 -1
  5. package/lib/designSystemExtension/banner/banner.component.scss +17 -3
  6. package/lib/designSystemExtension/banner/banner.component.ts +0 -1
  7. package/lib/designSystemExtension/case-create-stage/case-create-stage.component.ts +0 -1
  8. package/lib/designSystemExtension/field-group/field-group.component.ts +0 -1
  9. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +6 -3
  10. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.scss +5 -34
  11. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.ts +0 -1
  12. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -5
  13. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -1
  14. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +2 -2
  15. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +4 -3
  16. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +0 -1
  17. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.scss +4 -17
  18. package/lib/designSystemExtension/material-summary-item/material-summary-item.component.ts +0 -1
  19. package/lib/designSystemExtension/material-summary-list/material-summary-list.component.ts +0 -1
  20. package/lib/designSystemExtension/material-utility/material-utility.component.scss +1 -2
  21. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.scss +1 -1
  22. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.ts +0 -1
  23. package/lib/designSystemExtension/operator/operator.component.html +1 -1
  24. package/lib/designSystemExtension/operator/operator.component.scss +3 -10
  25. package/lib/designSystemExtension/operator/operator.component.ts +0 -2
  26. package/lib/designSystemExtension/pulse/pulse.component.scss +2 -2
  27. package/lib/designSystemExtension/pulse/pulse.component.ts +0 -1
  28. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.html +4 -17
  29. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +0 -1
  30. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +30 -1
  31. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.scss +16 -9
  32. package/lib/designSystemExtension/wss-quick-create/wss-quick-create.component.ts +0 -1
  33. package/lib/field/auto-complete/auto-complete.component.html +0 -1
  34. package/lib/field/auto-complete/auto-complete.component.ts +35 -173
  35. package/lib/field/cancel-alert/cancel-alert.component.html +8 -12
  36. package/lib/field/cancel-alert/cancel-alert.component.scss +2 -3
  37. package/lib/field/cancel-alert/cancel-alert.component.ts +24 -37
  38. package/lib/field/check-box/check-box.component.html +19 -10
  39. package/lib/field/check-box/check-box.component.scss +6 -1
  40. package/lib/field/check-box/check-box.component.ts +25 -151
  41. package/lib/field/currency/currency.component.ts +36 -169
  42. package/lib/field/date/date.component.html +2 -2
  43. package/lib/field/date/date.component.ts +30 -151
  44. package/lib/field/date-time/date-time.component.html +1 -1
  45. package/lib/field/date-time/date-time.component.ts +34 -149
  46. package/lib/field/decimal/decimal.component.ts +38 -164
  47. package/lib/field/dropdown/dropdown.component.ts +29 -152
  48. package/lib/field/email/email.component.ts +16 -156
  49. package/lib/field/field.base.ts +149 -0
  50. package/lib/field/group/group.component.ts +7 -5
  51. package/lib/field/integer/integer.component.ts +18 -158
  52. package/lib/field/list-view-action-buttons/list-view-action-buttons.component.ts +0 -1
  53. package/lib/field/location/config-ext.json +8 -0
  54. package/lib/field/location/location.component.html +46 -0
  55. package/lib/field/location/location.component.scss +18 -0
  56. package/lib/field/location/location.component.spec.ts +22 -0
  57. package/lib/field/location/location.component.ts +280 -0
  58. package/lib/field/multiselect/multiselect.component.ts +47 -152
  59. package/lib/field/multiselect/utils.ts +55 -47
  60. package/lib/field/object-reference/object-reference.component.html +17 -0
  61. package/lib/field/object-reference/object-reference.component.scss +0 -0
  62. package/lib/field/object-reference/object-reference.component.spec.ts +22 -0
  63. package/lib/field/object-reference/object-reference.component.ts +237 -0
  64. package/lib/field/percentage/percentage.component.ts +37 -155
  65. package/lib/field/phone/phone.component.html +18 -19
  66. package/lib/field/phone/phone.component.scss +4 -0
  67. package/lib/field/phone/phone.component.ts +43 -145
  68. package/lib/field/radio-buttons/radio-buttons.component.html +14 -6
  69. package/lib/field/radio-buttons/radio-buttons.component.scss +4 -2
  70. package/lib/field/radio-buttons/radio-buttons.component.ts +37 -160
  71. package/lib/field/rich-text/rich-text.component.html +2 -0
  72. package/lib/field/rich-text/rich-text.component.scss +172 -0
  73. package/lib/field/rich-text/rich-text.component.ts +21 -91
  74. package/lib/field/scalar-list/scalar-list.component.ts +17 -73
  75. package/lib/field/selectable-card/selectable-card.component.html +70 -0
  76. package/lib/field/selectable-card/selectable-card.component.scss +11 -0
  77. package/lib/field/selectable-card/selectable-card.component.spec.ts +22 -0
  78. package/lib/field/selectable-card/selectable-card.component.ts +219 -0
  79. package/lib/field/semantic-link/semantic-link.component.html +4 -8
  80. package/lib/field/semantic-link/semantic-link.component.scss +0 -13
  81. package/lib/field/semantic-link/semantic-link.component.ts +165 -6
  82. package/lib/field/text/text.component.scss +0 -1
  83. package/lib/field/text/text.component.ts +0 -1
  84. package/lib/field/text-area/text-area.component.ts +18 -153
  85. package/lib/field/text-content/text-content.component.ts +0 -1
  86. package/lib/field/text-input/text-input.component.ts +16 -156
  87. package/lib/field/time/time.component.ts +17 -152
  88. package/lib/field/url/url.component.ts +16 -155
  89. package/lib/field/user-reference/user-reference.component.scss +0 -1
  90. package/lib/field/user-reference/user-reference.component.ts +2 -4
  91. package/lib/infra/Containers/flow-container/flow-container.component.html +2 -2
  92. package/lib/infra/Containers/flow-container/flow-container.component.ts +8 -9
  93. package/lib/infra/Containers/hybrid-view-container/hybrid-view-container.component.ts +0 -1
  94. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +5 -11
  95. package/lib/infra/Containers/view-container/helper.ts +35 -2
  96. package/lib/infra/Containers/view-container/view-container.component.ts +1 -2
  97. package/lib/infra/action-buttons/action-buttons.component.html +13 -8
  98. package/lib/infra/action-buttons/action-buttons.component.scss +23 -0
  99. package/lib/infra/action-buttons/action-buttons.component.ts +1 -3
  100. package/lib/infra/assignment/assignment.component.ts +21 -10
  101. package/lib/infra/assignment-card/assignment-card.component.html +1 -2
  102. package/lib/infra/assignment-card/assignment-card.component.scss +0 -4
  103. package/lib/infra/assignment-card/assignment-card.component.ts +21 -5
  104. package/lib/infra/dashboard-filter/dashboard-filter.component.ts +0 -1
  105. package/lib/infra/defer-load/defer-load.component.html +6 -2
  106. package/lib/infra/defer-load/defer-load.component.ts +22 -12
  107. package/lib/infra/error-boundary/error-boundary.component.ts +0 -1
  108. package/lib/infra/multi-step/multi-step.component.html +22 -38
  109. package/lib/infra/multi-step/multi-step.component.scss +14 -27
  110. package/lib/infra/multi-step/multi-step.component.ts +0 -1
  111. package/lib/infra/navbar/navbar.component.html +36 -41
  112. package/lib/infra/navbar/navbar.component.scss +22 -4
  113. package/lib/infra/navbar/navbar.component.ts +8 -4
  114. package/lib/infra/reference/reference.component.ts +5 -0
  115. package/lib/infra/region/region.component.ts +0 -1
  116. package/lib/infra/root-container/root-container.component.scss +0 -1
  117. package/lib/infra/root-container/root-container.component.ts +1 -5
  118. package/lib/infra/stages/stages.component.html +4 -3
  119. package/lib/infra/stages/stages.component.scss +12 -36
  120. package/lib/infra/stages/stages.component.ts +4 -3
  121. package/lib/infra/view/view.component.html +1 -1
  122. package/lib/infra/view/view.component.ts +3 -7
  123. package/lib/template/advanced-search/advanced-search.component.html +12 -0
  124. package/lib/template/advanced-search/advanced-search.component.scss +0 -0
  125. package/lib/template/advanced-search/advanced-search.component.spec.ts +0 -0
  126. package/lib/template/advanced-search/advanced-search.component.ts +112 -0
  127. package/lib/template/advanced-search/advanced-search.service.ts +27 -0
  128. package/lib/template/advanced-search/search-group/persist-utils.ts +56 -0
  129. package/lib/template/advanced-search/search-groups/search-groups.component.html +32 -0
  130. package/lib/template/advanced-search/search-groups/search-groups.component.scss +0 -0
  131. package/lib/template/advanced-search/search-groups/search-groups.component.spec.ts +0 -0
  132. package/lib/template/advanced-search/search-groups/search-groups.component.ts +294 -0
  133. package/lib/template/advanced-search/search-groups/utils.ts +29 -0
  134. package/lib/template/app-shell/app-shell.component.html +4 -1
  135. package/lib/template/app-shell/app-shell.component.scss +0 -3
  136. package/lib/template/app-shell/app-shell.component.ts +46 -8
  137. package/lib/template/banner-page/banner-page.component.ts +0 -1
  138. package/lib/template/case-summary/case-summary.component.scss +0 -2
  139. package/lib/template/case-summary/case-summary.component.ts +6 -22
  140. package/lib/template/case-view/case-view.component.html +4 -4
  141. package/lib/template/case-view/case-view.component.scss +18 -10
  142. package/lib/template/case-view/case-view.component.ts +1 -11
  143. package/lib/template/confirmation/confirmation.component.html +1 -1
  144. package/lib/template/confirmation/confirmation.component.ts +0 -1
  145. package/lib/template/data-reference/data-reference.component.html +11 -8
  146. package/lib/template/data-reference/data-reference.component.ts +346 -113
  147. package/lib/template/data-reference/search-form/search-form.component.html +39 -0
  148. package/lib/template/data-reference/search-form/search-form.component.scss +11 -0
  149. package/lib/template/data-reference/search-form/search-form.component.spec.ts +0 -0
  150. package/lib/template/data-reference/search-form/search-form.component.ts +167 -0
  151. package/lib/template/data-reference/search-form/tabsData.ts +160 -0
  152. package/lib/template/data-reference/utils.ts +92 -0
  153. package/lib/template/default-form/default-form.component.ts +10 -3
  154. package/lib/template/default-page/default-page.component.html +34 -0
  155. package/lib/template/default-page/default-page.component.scss +31 -0
  156. package/lib/template/default-page/default-page.component.spec.ts +24 -0
  157. package/lib/template/default-page/default-page.component.ts +64 -0
  158. package/lib/template/details/details.component.ts +0 -1
  159. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +0 -1
  160. package/lib/template/details-one-column/details-one-column.component.ts +0 -1
  161. package/lib/template/details-sub-tabs/details-sub-tabs.component.ts +0 -1
  162. package/lib/template/details-three-column/details-three-column.component.ts +0 -1
  163. package/lib/template/details-two-column/details-two-column.component.ts +0 -1
  164. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +0 -1
  165. package/lib/template/dynamic-tabs/dynamic-tabs.component.ts +0 -1
  166. package/lib/template/field-group-list/field-group-list.component.scss +0 -1
  167. package/lib/template/field-group-list/field-group-list.component.ts +0 -1
  168. package/lib/template/field-group-template/field-group-template.component.ts +14 -28
  169. package/lib/template/field-value-list/field-value-list.component.ts +0 -1
  170. package/lib/template/inline-dashboard/inline-dashboard.component.ts +0 -1
  171. package/lib/template/inline-dashboard-page/inline-dashboard-page.component.ts +1 -2
  172. package/lib/template/list-page/list-page.component.ts +0 -1
  173. package/lib/template/list-view/list-view.component.html +170 -162
  174. package/lib/template/list-view/list-view.component.scss +25 -21
  175. package/lib/template/list-view/list-view.component.ts +207 -119
  176. package/lib/template/list-view/listViewHelpers.ts +1 -4
  177. package/lib/template/list-view/utils.ts +25 -2
  178. package/lib/template/multi-reference-readonly/multi-reference-readonly.component.ts +0 -1
  179. package/lib/template/narrow-wide-form/narrow-wide-form.component.ts +0 -1
  180. package/lib/template/object-page/object-page.component.html +1 -0
  181. package/lib/template/object-page/object-page.component.scss +0 -0
  182. package/lib/template/object-page/object-page.component.spec.ts +22 -0
  183. package/lib/template/object-page/object-page.component.ts +14 -0
  184. package/lib/template/one-column/one-column.component.ts +0 -1
  185. package/lib/template/one-column-page/one-column-page.component.ts +0 -1
  186. package/lib/template/one-column-tab/one-column-tab.component.scss +1 -1
  187. package/lib/template/one-column-tab/one-column-tab.component.ts +0 -1
  188. package/lib/template/page/page.component.ts +0 -1
  189. package/lib/template/promoted-filters/promoted-filters.component.ts +0 -1
  190. package/lib/template/repeating-structures/repeating-structures.component.ts +0 -2
  191. package/lib/template/self-service-case-view/self-service-case-view.component.html +78 -0
  192. package/lib/template/self-service-case-view/self-service-case-view.component.scss +132 -0
  193. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +24 -0
  194. package/lib/template/self-service-case-view/self-service-case-view.component.ts +207 -0
  195. package/lib/template/simple-table/simple-table.component.ts +0 -2
  196. package/lib/template/simple-table-manual/helpers.ts +117 -3
  197. package/lib/template/simple-table-manual/simple-table-manual.component.html +4 -4
  198. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -14
  199. package/lib/template/simple-table-manual/simple-table-manual.component.ts +45 -25
  200. package/lib/template/simple-table-select/simple-table-select.component.ts +0 -1
  201. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +4 -1
  202. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +21 -0
  203. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +104 -4
  204. package/lib/template/sub-tabs/sub-tabs.component.ts +0 -1
  205. package/lib/template/three-column/three-column.component.ts +0 -1
  206. package/lib/template/three-column-page/three-column-page.component.ts +0 -1
  207. package/lib/template/two-column/two-column.component.ts +0 -1
  208. package/lib/template/two-column-page/two-column-page.component.ts +0 -1
  209. package/lib/template/two-column-tab/two-column-tab.component.ts +0 -1
  210. package/lib/template/utils.ts +42 -0
  211. package/lib/template/wide-narrow-form/wide-narrow-form.component.ts +0 -1
  212. package/lib/template/wide-narrow-page/wide-narrow-page.component.ts +0 -1
  213. package/lib/template/wss-nav-bar/wss-nav-bar.component.html +6 -5
  214. package/lib/template/wss-nav-bar/wss-nav-bar.component.scss +8 -17
  215. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +1 -9
  216. package/lib/widget/app-announcement/app-announcement.component.html +1 -2
  217. package/lib/widget/app-announcement/app-announcement.component.scss +2 -2
  218. package/lib/widget/app-announcement/app-announcement.component.ts +0 -1
  219. package/lib/widget/attachment/Attachment.types.ts +92 -0
  220. package/lib/widget/attachment/AttachmentUtils.ts +287 -0
  221. package/lib/widget/attachment/attachment.component.html +3 -3
  222. package/lib/widget/attachment/attachment.component.scss +9 -12
  223. package/lib/widget/attachment/attachment.component.ts +267 -254
  224. package/lib/widget/case-history/case-history.component.ts +0 -1
  225. package/lib/widget/feed-container/feed-container.component.scss +3 -9
  226. package/lib/widget/feed-container/feed-container.component.ts +2 -3
  227. package/lib/widget/file-utility/file-utility.component.html +3 -3
  228. package/lib/widget/file-utility/file-utility.component.scss +6 -17
  229. package/lib/widget/file-utility/file-utility.component.ts +24 -9
  230. package/lib/widget/list-utility/list-utility.component.scss +4 -5
  231. package/lib/widget/list-utility/list-utility.component.ts +0 -1
  232. package/lib/widget/quick-create/quick-create.component.ts +41 -23
  233. package/lib/widget/todo/todo.component.html +8 -5
  234. package/lib/widget/todo/todo.component.scss +11 -10
  235. package/lib/widget/todo/todo.component.ts +7 -4
  236. package/lib/widget/utility/utility.component.ts +0 -1
  237. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ import { Component, Input, OnInit, EventEmitter, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatCardModule } from '@angular/material/card';
4
+ import { MatRadioModule } from '@angular/material/radio';
5
+ import { MatCheckboxModule } from '@angular/material/checkbox';
6
+ import { deleteInstruction, insertInstruction } from '@pega/angular-sdk-components';
7
+ import { handleEvent } from '@pega/angular-sdk-components';
8
+ import { PConnFieldProps } from '@pega/angular-sdk-components';
9
+ import { FieldBase } from '@pega/angular-sdk-components';
10
+
11
+ interface SelectableCardProps extends PConnFieldProps {
12
+ selectionList: any;
13
+ readonlyContextList: any;
14
+ image: string;
15
+ primaryField: string;
16
+ selectionKey: string;
17
+ renderMode: string;
18
+ hideFieldLabels?: boolean;
19
+ additionalProps?: any;
20
+ imagePosition?: string;
21
+ imageSize?: string;
22
+ showImageDescription?: boolean;
23
+ datasource?: any;
24
+ }
25
+
26
+ @Component({
27
+ selector: 'lib-selectable-card',
28
+ imports: [MatCardModule, CommonModule, MatRadioModule, MatCheckboxModule],
29
+ templateUrl: './selectable-card.component.html',
30
+ styleUrl: './selectable-card.component.scss'
31
+ })
32
+ export class SelectableCardComponent extends FieldBase implements OnInit {
33
+ @Input() type: string;
34
+ @Output() valueChange: EventEmitter<any> = new EventEmitter();
35
+
36
+ configProps$: SelectableCardProps;
37
+ readOnly = false;
38
+ disabled = false;
39
+ radioBtnValue;
40
+ additionalProps;
41
+ showNoValue = false;
42
+ selectionKey?: string;
43
+ defaultStyle = {};
44
+ specialStyle = {};
45
+ cardStyle = {};
46
+ noLabelStyle: {};
47
+ selectedvalues: any;
48
+ selectionList: any;
49
+ primaryField: string;
50
+ commonProps: any = {};
51
+ contentList: [
52
+ {
53
+ commonCardProps: { id: string; key: string; fields: any; label: string; selected: boolean };
54
+ cardImage: { src: string; alt: string; style: any };
55
+ }
56
+ ];
57
+
58
+ override ngOnInit(): void {
59
+ super.ngOnInit();
60
+
61
+ // styles used in displaying common field props
62
+ this.defaultStyle = {
63
+ display: 'grid',
64
+ gridTemplateColumns: '1fr 1fr',
65
+ margin: '0.5rem',
66
+ wordBreak: 'break-word',
67
+ fontSize: '0.875rem'
68
+ };
69
+ this.specialStyle = {
70
+ margin: '0.5rem',
71
+ fontSize: '0.875rem'
72
+ };
73
+ this.noLabelStyle = {
74
+ alignItems: 'start',
75
+ marginLeft: '0.5rem'
76
+ };
77
+ }
78
+
79
+ override updateSelf(): void {
80
+ this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as SelectableCardProps;
81
+
82
+ const hideFieldLabels = this.configProps$.hideFieldLabels;
83
+ const datasource: any = this.configProps$.datasource;
84
+ const additionalProps: any = this.configProps$.additionalProps;
85
+ const imageSize: string = this.configProps$.imageSize ?? ''; // not using
86
+ const showImageDescription: boolean = this.configProps$.showImageDescription ?? false;
87
+ let recordKey = '';
88
+ let cardLabel = '';
89
+ let image: any;
90
+
91
+ this.disabled = this.configProps$.disabled;
92
+ this.readOnly = this.configProps$.renderMode === 'ReadOnly' || this.displayMode$ === 'DISPLAY_ONLY' || this.configProps$.readOnly;
93
+ const imagePosition = this.configProps$.imagePosition;
94
+
95
+ // dynamic styling based on image position and readOnly option
96
+ let imageWidth = '100%';
97
+ this.cardStyle = { display: 'flex', flexDirection: 'column', height: '100%' };
98
+ if (imagePosition && imagePosition !== 'block-start') {
99
+ imageWidth = '30%';
100
+ if (imagePosition === 'inline-start') {
101
+ this.cardStyle = { display: 'flex', flexDirection: 'row', alignItems: this.readOnly ? 'center' : '' };
102
+ } else if (imagePosition === 'inline-end') {
103
+ this.cardStyle = {
104
+ display: 'flex',
105
+ flexDirection: 'row-reverse',
106
+ justifyContent: this.readOnly ? 'space-between' : '',
107
+ alignItems: this.readOnly ? 'center' : ''
108
+ };
109
+ }
110
+ }
111
+ if (this.type === 'radio') {
112
+ const stateProps = this.pConn$.getStateProps();
113
+ image = {
114
+ imagePosition,
115
+ imageSize,
116
+ showImageDescription,
117
+ imageField: stateProps.image?.split('.').pop(),
118
+ imageDescription: stateProps.imageDescription?.split('.').pop()
119
+ };
120
+
121
+ recordKey = stateProps.value?.split('.').pop() ?? '';
122
+ cardLabel = stateProps.primaryField?.split('.').pop() ?? '';
123
+
124
+ this.value$ = this.configProps$.value;
125
+ this.radioBtnValue = this.value$;
126
+ }
127
+
128
+ if (this.type === 'checkbox') {
129
+ this.testId = this.configProps$.testId;
130
+ this.displayMode$ = this.configProps$.displayMode ?? '';
131
+
132
+ this.selectionKey = this.configProps$.selectionKey;
133
+ recordKey = this.selectionKey?.split('.').pop() ?? '';
134
+ cardLabel = this.configProps$.primaryField.split('.').pop() ?? '';
135
+
136
+ image = {
137
+ imagePosition,
138
+ imageSize,
139
+ showImageDescription,
140
+ imageField: this.configProps$.image?.split('.').pop(),
141
+ imageDescription: (this.pConn$?.getRawMetadata()?.config as any).imageDescription?.split('.').pop()
142
+ };
143
+
144
+ this.selectionList = this.configProps$.selectionList;
145
+ this.selectedvalues = this.configProps$.readonlyContextList;
146
+ this.showNoValue = this.readOnly && this.selectedvalues?.length === 0; // not used
147
+ this.primaryField = this.configProps$.primaryField;
148
+ }
149
+
150
+ this.commonProps = { hideFieldLabels, datasource, additionalProps, image, recordKey, cardLabel, radioBtnValue: this.radioBtnValue ?? '' };
151
+ const imageDescriptionKey = this.commonProps?.image?.showImageDescription ? this.commonProps?.image?.imageDescription : undefined;
152
+ const cardDataSource = this.readOnly || this.displayMode$ == 'DISPLAY_ONLY' ? this.selectedvalues || [] : this.commonProps?.datasource?.source;
153
+
154
+ this.contentList = cardDataSource.map(item => {
155
+ const resolvedFields = this.utils.resolveReferenceFields(item, this.commonProps.hideFieldLabels, this.commonProps.recordKey, this.pConn$);
156
+ const commonCardProps = {
157
+ id: item[this.commonProps.recordKey],
158
+ key: item[this.commonProps.recordKey],
159
+ fields: resolvedFields,
160
+ label: item[this.commonProps.cardLabel],
161
+ selected: this.selectedvalues
162
+ ? this.selectedvalues?.some?.(data => data[this.commonProps.recordKey] === item[this.commonProps.recordKey])
163
+ : false
164
+ };
165
+ const cardImage = item[this.commonProps.image.imageField]
166
+ ? {
167
+ src: item[this.commonProps.image.imageField],
168
+ alt: this.commonProps.image.showImageDescription && imageDescriptionKey ? item[imageDescriptionKey] : '',
169
+ style: {
170
+ width: imageWidth,
171
+ backgroundColor: 'transparent',
172
+ aspectRatio: '16/9',
173
+ maxHeight: '100%',
174
+ objectFit: 'contain',
175
+ maxWidth: '100%',
176
+ height: this.readOnly && imagePosition !== 'block-start' ? '5rem' : ''
177
+ }
178
+ }
179
+ : undefined;
180
+
181
+ return { cardImage, commonCardProps };
182
+ });
183
+ }
184
+
185
+ fieldOnChange(value: any) {
186
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
187
+ }
188
+
189
+ fieldOnBlur() {
190
+ this.pConn$.getValidationApi().validate(this.selectedvalues, this.selectionList);
191
+ }
192
+
193
+ handleChangeMultiMode(event, element) {
194
+ if (!element.selected) {
195
+ insertInstruction(this.pConn$, this.selectionList, this.selectionKey, this.primaryField, {
196
+ id: element.id,
197
+ primary: element.label
198
+ });
199
+ } else {
200
+ deleteInstruction(this.pConn$, this.selectionList, this.selectionKey, {
201
+ id: element.key,
202
+ primary: element.label
203
+ });
204
+ }
205
+ this.pConn$.clearErrorMessages({
206
+ property: this.selectionList,
207
+ category: '',
208
+ context: ''
209
+ });
210
+ }
211
+
212
+ cardSelect(event, element) {
213
+ if (this.type === 'radio') {
214
+ this.fieldOnChange(element.key);
215
+ } else if (this.type === 'checkbox') {
216
+ this.handleChangeMultiMode(event, element);
217
+ }
218
+ }
219
+ }
@@ -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,22 +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
- standalone: true,
19
- imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
24
+ imports: [CommonModule]
20
25
  })
21
26
  export class SemanticLinkComponent implements OnInit, OnDestroy {
22
27
  @Input() pConn$: typeof PConnect;
@@ -29,6 +34,15 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
29
34
  value$ = '';
30
35
  displayMode$?: string = '';
31
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;
32
46
 
33
47
  constructor(
34
48
  private angularPConnect: AngularPConnectService,
@@ -38,7 +52,7 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
38
52
  ngOnInit(): void {
39
53
  // First thing in initialization is registering and subscribing to the AngularPConnect service
40
54
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
41
- this.updateSelf();
55
+ this.checkAndUpdate();
42
56
  }
43
57
 
44
58
  ngOnDestroy(): void {
@@ -48,6 +62,10 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
48
62
  }
49
63
 
50
64
  onStateChange() {
65
+ this.updateSelf();
66
+ }
67
+
68
+ checkAndUpdate() {
51
69
  // Should always check the bridge to see if the component should
52
70
  // update itself (re-render)
53
71
  const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
@@ -59,12 +77,153 @@ export class SemanticLinkComponent implements OnInit, OnDestroy {
59
77
  }
60
78
 
61
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() {
62
128
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as SemanticLinkProps;
63
- this.value$ = this.configProps$.text || '---';
129
+ this.value$ = this.configProps$.text || this.configProps$.value || '';
64
130
  this.displayMode$ = this.configProps$.displayMode;
65
131
  this.label$ = this.configProps$.label;
66
132
  if (this.configProps$.visibility) {
67
133
  this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
68
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
+ );
69
228
  }
70
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
  }
@@ -15,7 +15,6 @@ interface TextProps extends PConnFieldProps {
15
15
  selector: 'app-text',
16
16
  templateUrl: './text.component.html',
17
17
  styleUrls: ['./text.component.scss'],
18
- standalone: true,
19
18
  imports: [CommonModule, forwardRef(() => ComponentMapperComponent)]
20
19
  })
21
20
  export class TextComponent implements OnInit, OnDestroy {
@@ -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
@@ -19,144 +18,29 @@ interface TextAreaProps extends PConnFieldProps {
19
18
  selector: 'app-text-area',
20
19
  templateUrl: './text-area.component.html',
21
20
  styleUrls: ['./text-area.component.scss'],
22
- standalone: true,
23
21
  imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
24
22
  })
25
- export class TextAreaComponent implements OnInit, OnDestroy {
26
- @Input() pConn$: typeof PConnect;
27
- @Input() formGroup$: FormGroup;
28
-
29
- // Used with AngularPConnect
30
- angularPConnectData: AngularPConnectData = {};
23
+ export class TextAreaComponent extends FieldBase {
31
24
  configProps$: TextAreaProps;
32
25
 
33
- label$ = '';
34
- value$ = '';
35
- bRequired$ = false;
36
- bReadonly$ = false;
37
- bDisabled$ = false;
38
- bVisible$ = true;
39
26
  nMaxLength$: number;
40
- displayMode$?: string = '';
41
- controlName$: string;
42
- bHasForm$ = true;
43
- componentReference = '';
44
- testId: string;
45
- helperText: string;
46
-
47
- fieldControl = new FormControl('', null);
48
- actionsApi: Object;
49
- propName: string;
50
-
51
- constructor(
52
- private angularPConnect: AngularPConnectService,
53
- private cdRef: ChangeDetectorRef,
54
- private utils: Utils
55
- ) {}
56
-
57
- ngOnInit(): void {
58
- // First thing in initialization is registering and subscribing to the AngularPConnect service
59
- this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
60
- this.controlName$ = this.angularPConnect.getComponentID(this);
61
-
62
- // Then, continue on with other initialization
63
-
64
- // call updateSelf when initializing
65
- // this.updateSelf();
66
- this.checkAndUpdate();
67
-
68
- if (this.formGroup$) {
69
- // add control to formGroup
70
- this.formGroup$.addControl(this.controlName$, this.fieldControl);
71
- this.fieldControl.setValue(this.value$);
72
- this.bHasForm$ = true;
73
- } else {
74
- this.bReadonly$ = true;
75
- this.bHasForm$ = false;
76
- }
77
- }
78
-
79
- ngOnDestroy(): void {
80
- if (this.formGroup$) {
81
- this.formGroup$.removeControl(this.controlName$);
82
- }
83
-
84
- if (this.angularPConnectData.unsubscribeFn) {
85
- this.angularPConnectData.unsubscribeFn();
86
- }
87
- }
88
-
89
- // Callback passed when subscribing to store change
90
- onStateChange() {
91
- this.checkAndUpdate();
92
- }
93
-
94
- checkAndUpdate() {
95
- // Should always check the bridge to see if the component should
96
- // update itself (re-render)
97
- const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
98
-
99
- // ONLY call updateSelf when the component should update
100
- if (bUpdateSelf) {
101
- this.updateSelf();
102
- }
103
- }
104
27
 
105
- // updateSelf
106
- updateSelf(): void {
107
- // 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
108
33
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as TextAreaProps;
109
34
 
110
- if (this.configProps$.value != undefined) {
111
- this.value$ = this.configProps$.value;
112
- }
113
- this.nMaxLength$ = this.pConn$.getFieldMetadata(this.pConn$.getRawConfigProps()?.value)?.maxLength || 100;
114
- this.testId = this.configProps$.testId;
115
- this.displayMode$ = this.configProps$.displayMode;
116
- this.label$ = this.configProps$.label;
117
- this.helperText = this.configProps$.helperText;
118
-
119
- this.actionsApi = this.pConn$.getActionsApi();
120
- this.propName = this.pConn$.getStateProps().value;
121
-
122
- // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
123
- setTimeout(() => {
124
- if (this.configProps$.required != null) {
125
- this.bRequired$ = this.utils.getBooleanValue(this.configProps$.required);
126
- }
127
- this.cdRef.detectChanges();
128
- });
129
-
130
- if (this.configProps$.visibility != null) {
131
- this.bVisible$ = this.utils.getBooleanValue(this.configProps$.visibility);
132
- }
133
-
134
- // disabled
135
- if (this.configProps$.disabled != undefined) {
136
- this.bDisabled$ = this.utils.getBooleanValue(this.configProps$.disabled);
137
- }
138
-
139
- if (this.bDisabled$) {
140
- this.fieldControl.disable();
141
- } else {
142
- this.fieldControl.enable();
143
- }
144
-
145
- if (this.configProps$.readOnly != null) {
146
- this.bReadonly$ = this.utils.getBooleanValue(this.configProps$.readOnly);
147
- }
35
+ // Update component common properties
36
+ this.updateComponentCommonProperties(this.configProps$);
148
37
 
149
- this.componentReference = this.pConn$.getStateProps().value;
38
+ // Extract properties from config
39
+ const { value } = this.configProps$;
150
40
 
151
- // trigger display of error message with field control
152
- if (this.angularPConnectData.validateMessage != null && this.angularPConnectData.validateMessage != '') {
153
- const timer = interval(100).subscribe(() => {
154
- this.fieldControl.setErrors({ message: true });
155
- this.fieldControl.markAsTouched();
156
-
157
- timer.unsubscribe();
158
- });
159
- }
41
+ // Set component specific properties
42
+ this.value$ = value;
43
+ this.nMaxLength$ = this.pConn$.getFieldMetadata(this.pConn$.getRawConfigProps()?.value)?.maxLength || 100;
160
44
  }
161
45
 
162
46
  fieldOnChange(event: any) {
@@ -179,23 +63,4 @@ export class TextAreaComponent implements OnInit, OnDestroy {
179
63
  handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
180
64
  }
181
65
  }
182
-
183
- getErrorMessage() {
184
- // field control gets error message from here
185
-
186
- let errMessage = '';
187
-
188
- // look for validation messages for json, pre-defined or just an error pushed from workitem (400)
189
- if (this.fieldControl.hasError('message')) {
190
- errMessage = this.angularPConnectData.validateMessage ?? '';
191
- return errMessage;
192
- }
193
- if (this.fieldControl.hasError('required')) {
194
- errMessage = 'You must enter a value';
195
- } else if (this.fieldControl.errors) {
196
- errMessage = this.fieldControl.errors.toString();
197
- }
198
-
199
- return errMessage;
200
- }
201
66
  }