@pega/angular-sdk-overrides 0.26.1 → 0.26.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 (133) hide show
  1. package/lib/designSystemExtension/alert/alert.component.html +4 -1
  2. package/lib/designSystemExtension/alert/alert.component.scss +9 -10
  3. package/lib/designSystemExtension/alert/alert.component.ts +6 -2
  4. package/lib/designSystemExtension/field-group/field-group.component.ts +11 -3
  5. package/lib/designSystemExtension/material-case-summary/material-case-summary.component.html +12 -3
  6. package/lib/designSystemExtension/operator/operator.component.ts +2 -1
  7. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.html +104 -10
  8. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.scss +141 -1
  9. package/lib/designSystemExtension/rich-text-editor/rich-text-editor.component.ts +224 -72
  10. package/lib/field/auto-complete/auto-complete.component.html +46 -5
  11. package/lib/field/auto-complete/auto-complete.component.scss +92 -0
  12. package/lib/field/auto-complete/auto-complete.component.ts +349 -22
  13. package/lib/field/cancel-alert/cancel-alert.component.ts +38 -15
  14. package/lib/field/check-box/check-box.component.html +3 -1
  15. package/lib/field/check-box/check-box.component.ts +10 -1
  16. package/lib/field/currency/currency.component.html +2 -1
  17. package/lib/field/currency/currency.component.ts +10 -1
  18. package/lib/field/date/date.component.html +2 -1
  19. package/lib/field/date/date.component.ts +2 -0
  20. package/lib/field/date-time/date-time.component.html +2 -1
  21. package/lib/field/date-time/date-time.component.scss +46 -40
  22. package/lib/field/date-time/date-time.component.ts +2 -0
  23. package/lib/field/decimal/decimal.component.html +2 -1
  24. package/lib/field/decimal/decimal.component.ts +2 -0
  25. package/lib/field/dropdown/dropdown.component.html +2 -1
  26. package/lib/field/dropdown/dropdown.component.ts +10 -1
  27. package/lib/field/email/email.component.html +2 -1
  28. package/lib/field/email/email.component.ts +2 -2
  29. package/lib/field/field.base.ts +27 -1
  30. package/lib/field/group/group.component.html +1 -1
  31. package/lib/field/group/group.component.ts +1 -3
  32. package/lib/field/integer/integer.component.html +2 -1
  33. package/lib/field/integer/integer.component.ts +4 -2
  34. package/lib/field/location/location.component.html +2 -1
  35. package/lib/field/location/location.component.ts +3 -1
  36. package/lib/field/object-reference/object-reference.component.html +1 -1
  37. package/lib/field/object-reference/object-reference.component.ts +3 -0
  38. package/lib/field/percentage/percentage.component.html +2 -1
  39. package/lib/field/percentage/percentage.component.ts +10 -1
  40. package/lib/field/phone/phone.component.html +2 -1
  41. package/lib/field/phone/phone.component.ts +2 -1
  42. package/lib/field/radio-buttons/radio-buttons.component.html +2 -1
  43. package/lib/field/radio-buttons/radio-buttons.component.ts +10 -1
  44. package/lib/field/rich-text/rich-text.component.scss +1 -166
  45. package/lib/field/rich-text/rich-text.component.ts +1 -1
  46. package/lib/field/semantic-link/semantic-link.component.html +1 -1
  47. package/lib/field/semantic-link/semantic-link.component.scss +4 -0
  48. package/lib/field/semantic-link/semantic-link.component.ts +9 -5
  49. package/lib/field/text-area/text-area.component.html +2 -1
  50. package/lib/field/text-area/text-area.component.ts +2 -1
  51. package/lib/field/text-input/text-input.component.html +2 -1
  52. package/lib/field/text-input/text-input.component.ts +2 -1
  53. package/lib/field/time/time.component.html +2 -1
  54. package/lib/field/time/time.component.ts +2 -1
  55. package/lib/field/url/url.component.html +2 -1
  56. package/lib/field/url/url.component.ts +2 -1
  57. package/lib/field/user-reference/user-reference.component.html +4 -2
  58. package/lib/field/user-reference/user-reference.component.ts +10 -5
  59. package/lib/infra/Containers/flow-container/flow-container.component.html +1 -1
  60. package/lib/infra/Containers/flow-container/flow-container.component.ts +33 -40
  61. package/lib/infra/Containers/modal-view-container/data-view-action-buttons/data-view-action-buttons.component.html +12 -0
  62. package/lib/infra/Containers/modal-view-container/data-view-action-buttons/data-view-action-buttons.component.spec.ts +130 -0
  63. package/lib/infra/Containers/modal-view-container/data-view-action-buttons/data-view-action-buttons.component.ts +77 -0
  64. package/lib/infra/Containers/modal-view-container/modal-view-container.component.html +35 -8
  65. package/lib/infra/Containers/modal-view-container/modal-view-container.component.spec.ts +24 -11
  66. package/lib/infra/Containers/modal-view-container/modal-view-container.component.ts +185 -194
  67. package/lib/infra/Containers/view-container/view-container.component.ts +32 -31
  68. package/lib/infra/assignment/assignment.component.html +2 -1
  69. package/lib/infra/assignment/assignment.component.ts +30 -13
  70. package/lib/infra/defer-load/defer-load.component.ts +6 -3
  71. package/lib/infra/multi-step/multi-step.component.html +25 -33
  72. package/lib/infra/multi-step/multi-step.component.scss +48 -0
  73. package/lib/infra/multi-step/multi-step.component.ts +11 -0
  74. package/lib/infra/navbar/navbar.component.ts +33 -35
  75. package/lib/infra/root-container/root-container.component.ts +33 -38
  76. package/lib/infra/view/view.component.ts +17 -39
  77. package/lib/template/app-shell/app-shell.component.ts +12 -11
  78. package/lib/template/base/details-template-base.ts +35 -53
  79. package/lib/template/case-summary/case-summary.component.ts +15 -1
  80. package/lib/template/case-view/case-view.component.html +13 -1
  81. package/lib/template/case-view/case-view.component.spec.ts +119 -10
  82. package/lib/template/case-view/case-view.component.ts +52 -3
  83. package/lib/template/data-reference/data-reference.component.ts +27 -18
  84. package/lib/template/data-reference/search-form/search-form.component.html +1 -1
  85. package/lib/template/data-reference/search-form/search-form.component.ts +2 -0
  86. package/lib/template/default-form/default-form.component.html +19 -3
  87. package/lib/template/default-form/default-form.component.ts +13 -3
  88. package/lib/template/details/details.component.html +23 -3
  89. package/lib/template/details/details.component.scss +9 -2
  90. package/lib/template/details/details.component.ts +3 -32
  91. package/lib/template/details-narrow-wide/details-narrow-wide.component.html +21 -2
  92. package/lib/template/details-narrow-wide/details-narrow-wide.component.scss +8 -1
  93. package/lib/template/details-narrow-wide/details-narrow-wide.component.ts +3 -37
  94. package/lib/template/details-one-column/details-one-column.component.html +23 -1
  95. package/lib/template/details-one-column/details-one-column.component.scss +14 -0
  96. package/lib/template/details-one-column/details-one-column.component.ts +3 -38
  97. package/lib/template/details-three-column/details-three-column.component.html +21 -2
  98. package/lib/template/details-three-column/details-three-column.component.scss +8 -1
  99. package/lib/template/details-three-column/details-three-column.component.ts +3 -46
  100. package/lib/template/details-two-column/details-two-column.component.html +21 -2
  101. package/lib/template/details-two-column/details-two-column.component.scss +8 -1
  102. package/lib/template/details-two-column/details-two-column.component.ts +3 -44
  103. package/lib/template/details-wide-narrow/details-wide-narrow.component.html +21 -2
  104. package/lib/template/details-wide-narrow/details-wide-narrow.component.scss +8 -1
  105. package/lib/template/details-wide-narrow/details-wide-narrow.component.ts +3 -41
  106. package/lib/template/field-value-list/field-value-list.component.scss +17 -0
  107. package/lib/template/list-view/list-view.component.ts +39 -0
  108. package/lib/template/self-service-case-view/self-service-case-view.component.html +13 -1
  109. package/lib/template/self-service-case-view/self-service-case-view.component.spec.ts +96 -11
  110. package/lib/template/self-service-case-view/self-service-case-view.component.ts +52 -3
  111. package/lib/template/simple-table-manual/helpers.ts +30 -9
  112. package/lib/template/simple-table-manual/simple-table-manual.component.html +30 -14
  113. package/lib/template/simple-table-manual/simple-table-manual.component.scss +4 -0
  114. package/lib/template/simple-table-manual/simple-table-manual.component.ts +118 -29
  115. package/lib/template/single-reference-readonly/single-reference-readonly.component.html +1 -1
  116. package/lib/template/single-reference-readonly/single-reference-readonly.component.scss +2 -2
  117. package/lib/template/single-reference-readonly/single-reference-readonly.component.ts +4 -4
  118. package/lib/template/wss-nav-bar/wss-nav-bar.component.ts +18 -20
  119. package/lib/widget/attachment/AttachmentUtils.ts +18 -10
  120. package/lib/widget/attachment/attachment.component.html +16 -6
  121. package/lib/widget/attachment/attachment.component.ts +12 -2
  122. package/lib/widget/case-history/case-history.component.ts +6 -2
  123. package/lib/widget/file-utility/file-utility.component.ts +25 -29
  124. package/lib/widget/todo/todo.component.ts +7 -2
  125. package/package.json +1 -1
  126. package/lib/designSystemExtension/material-details/material-details.component.html +0 -40
  127. package/lib/designSystemExtension/material-details/material-details.component.scss +0 -116
  128. package/lib/designSystemExtension/material-details/material-details.component.spec.ts +0 -24
  129. package/lib/designSystemExtension/material-details/material-details.component.ts +0 -31
  130. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.html +0 -41
  131. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.scss +0 -34
  132. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.spec.ts +0 -22
  133. package/lib/designSystemExtension/material-details-fields/material-details-fields.component.ts +0 -61
@@ -4,7 +4,7 @@
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  matInput
@@ -18,6 +18,7 @@
18
18
  />
19
19
  <mat-datepicker-toggle matSuffix [owlDateTimeTrigger]="dtPicker"></mat-datepicker-toggle>
20
20
  <owl-date-time #dtPicker [disabled]="bDisabled$" [scrollStrategy]="scrollStrategy"></owl-date-time>
21
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
21
22
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
22
23
  </mat-form-field>
23
24
  </div>
@@ -20,61 +20,67 @@
20
20
  width: auto;
21
21
  }
22
22
 
23
- .mat-datepicker-content,
24
- .time-container {
25
- box-shadow:
26
- 0px 2px 4px -1px rgba(0, 0, 0, 0.2),
27
- 0px 4px 5px 0px rgba(0, 0, 0, 0.14),
28
- 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
29
- display: block;
30
- border-radius: 4px;
31
- background-color: var(--mat-datepicker-calendar-container-background-color);
32
- color: var(--mat-datepicker-calendar-container-text-color);
23
+ .owl-dt-container {
24
+ background-color: var(--mat-sys-surface-container);
25
+ color: var(--mat-sys-on-surface);
33
26
  }
34
27
 
35
- .mat-calendar-body-cell-content {
36
- color: var(--mat-datepicker-calendar-date-text-color);
37
- border-color: var(--mat-datepicker-calendar-date-outline-color);
28
+ .owl-dt-container-row,
29
+ .owl-dt-container-info .owl-dt-container-range:last-child {
30
+ border-color: var(--mat-sys-outline-variant);
38
31
  }
39
32
 
40
- .mat-calendar-body-selected {
41
- background-color: var(--mat-datepicker-calendar-date-selected-state-background-color);
42
- color: var(--mat-datepicker-calendar-date-selected-state-text-color);
33
+ .owl-dt-calendar-control,
34
+ .owl-dt-calendar-table .owl-dt-calendar-cell {
35
+ color: var(--mat-sys-on-surface);
43
36
  }
44
37
 
45
- .mat-calendar-body-cell-content {
46
- border: none !important;
38
+ .owl-dt-calendar-table .owl-dt-calendar-header,
39
+ .owl-dt-calendar-table .owl-dt-calendar-cell-disabled > .owl-dt-calendar-cell-content:not(.owl-dt-calendar-cell-selected) {
40
+ color: var(--mat-sys-on-surface-variant);
47
41
  }
48
42
 
49
- .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover
50
- > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical) {
51
- background-color: var(--mat-datepicker-calendar-date-hover-state-background-color);
43
+ .owl-dt-calendar-table .owl-dt-calendar-header .owl-dt-calendar-table-divider::after {
44
+ background-color: var(--mat-sys-outline-variant);
52
45
  }
53
46
 
54
- .mat-calendar-arrow {
55
- fill: var(--mat-datepicker-calendar-period-button-icon-color);
47
+ .owl-dt-calendar-table .owl-dt-calendar-cell-today:not(.owl-dt-calendar-cell-selected) {
48
+ border-color: var(--mat-sys-outline);
56
49
  }
57
50
 
58
- .mat-calendar-table-header th {
59
- text-align: center;
60
- padding: 0 0 8px 0;
61
- color: var(--mat-datepicker-calendar-header-text-color);
62
- font-size: var(--mat-datepicker-calendar-header-text-size);
63
- font-weight: var(--mat-datepicker-calendar-header-text-weight);
51
+ .owl-dt-calendar-table .owl-dt-calendar-cell-selected {
52
+ background-color: var(--mat-sys-primary);
53
+ color: var(--mat-sys-on-primary);
64
54
  }
65
55
 
66
- .mat-datepicker-content .mat-calendar-previous-button,
67
- .mat-datepicker-content .mat-calendar-next-button {
68
- color: var(--mat-datepicker-calendar-navigation-button-icon-color);
56
+ .owl-dt-calendar-table .owl-dt-calendar-cell-active:focus > .owl-dt-calendar-cell-content:not(.owl-dt-calendar-cell-selected),
57
+ .owl-dt-calendar-table :not(.owl-dt-calendar-cell-disabled):hover > .owl-dt-calendar-cell-content:not(.owl-dt-calendar-cell-selected),
58
+ .owl-dt-calendar-control .owl-dt-calendar-control-content .owl-dt-calendar-control-button:hover,
59
+ .owl-dt-control-period-button:hover > .owl-dt-control-button-content,
60
+ .owl-dt-container-control-button:hover .owl-dt-control-button-content,
61
+ .owl-dt-control:focus > .owl-dt-control-content {
62
+ background-color: var(--mat-sys-surface-container-high);
69
63
  }
70
64
 
71
- .mat-calendar-table-header-divider::after {
72
- content: '';
73
- position: absolute;
74
- top: 0;
75
- left: -8px;
76
- right: -8px;
77
- height: 1px;
78
- background: var(--mat-datepicker-calendar-header-divider-color);
65
+ .owl-dt-timer-content .owl-dt-timer-input {
66
+ border-color: var(--mat-sys-outline);
67
+ background-color: var(--mat-sys-surface-container-highest);
68
+ color: var(--mat-sys-on-surface);
69
+ }
70
+
71
+ .owl-dt-container-buttons,
72
+ .owl-dt-container-info .owl-dt-container-info-active,
73
+ .owl-dt-timer-hour12 {
74
+ color: var(--mat-sys-primary);
75
+ }
76
+
77
+ .owl-dt-control-arrow-button[disabled] {
78
+ color: var(--mat-sys-on-surface-variant);
79
+ }
80
+
81
+ .owl-dt-timer-hour12 .owl-dt-timer-hour12-box:focus .owl-dt-control-button-content,
82
+ .owl-dt-timer-hour12 .owl-dt-timer-hour12-box:hover .owl-dt-control-button-content {
83
+ background-color: var(--mat-sys-primary);
84
+ color: var(--mat-sys-on-primary);
79
85
  }
80
86
  }
@@ -9,6 +9,7 @@ import { OwlDateTimeModule, OwlNativeDateTimeModule } from '@danielmoncada/angul
9
9
  import dayjs from 'dayjs';
10
10
 
11
11
  import { FieldBase } from '@pega/angular-sdk-components';
12
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
12
13
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
13
14
  import { getDateFormatInfo } from '@pega/angular-sdk-components';
14
15
  import { handleEvent } from '@pega/angular-sdk-components';
@@ -31,6 +32,7 @@ interface DateTimeProps extends PConnFieldProps {
31
32
  MatDatepickerModule,
32
33
  OwlDateTimeModule,
33
34
  OwlNativeDateTimeModule,
35
+ FieldWarningDirective,
34
36
  forwardRef(() => ComponentMapperComponent)
35
37
  ]
36
38
  })
@@ -4,7 +4,7 @@
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  type="text"
@@ -29,6 +29,7 @@
29
29
  (blur)="fieldOnBlur($event)"
30
30
  [readonly]="bReadonly$"
31
31
  />
32
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
32
33
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
33
34
  </mat-form-field>
34
35
  </div>
@@ -6,6 +6,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
6
6
  import { NgxCurrencyDirective, NgxCurrencyInputMode } from 'ngx-currency';
7
7
 
8
8
  import { FieldBase } from '@pega/angular-sdk-components';
9
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
11
  import { handleEvent } from '@pega/angular-sdk-components';
11
12
  import { getCurrencyCharacters, getCurrencyOptions } from '@pega/angular-sdk-components';
@@ -31,6 +32,7 @@ interface DecimalProps extends PConnFieldProps {
31
32
  MatFormFieldModule,
32
33
  MatInputModule,
33
34
  NgxCurrencyDirective,
35
+ FieldWarningDirective,
34
36
  forwardRef(() => ComponentMapperComponent)
35
37
  ]
36
38
  })
@@ -8,7 +8,7 @@
8
8
  <ng-template #noDisplayMode>
9
9
  <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
10
10
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
11
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
11
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
12
12
  <mat-select
13
13
  [value]="value$"
14
14
  [required]="bRequired$"
@@ -22,6 +22,7 @@
22
22
  </mat-option>
23
23
  </mat-select>
24
24
  <mat-label>{{ label$ }}</mat-label>
25
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
25
26
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
26
27
  </mat-form-field>
27
28
  </div>
@@ -7,6 +7,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
7
7
  import isEqual from 'fast-deep-equal';
8
8
 
9
9
  import { FieldBase } from '@pega/angular-sdk-components';
10
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
10
11
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
12
  import { handleEvent } from '@pega/angular-sdk-components';
12
13
  import { PConnFieldProps } from '@pega/angular-sdk-components';
@@ -66,7 +67,15 @@ interface DropdownProps extends PConnFieldProps {
66
67
  selector: 'app-dropdown',
67
68
  templateUrl: './dropdown.component.html',
68
69
  styleUrls: ['./dropdown.component.scss'],
69
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatSelectModule, MatOptionModule, forwardRef(() => ComponentMapperComponent)]
70
+ imports: [
71
+ CommonModule,
72
+ ReactiveFormsModule,
73
+ MatFormFieldModule,
74
+ MatSelectModule,
75
+ MatOptionModule,
76
+ FieldWarningDirective,
77
+ forwardRef(() => ComponentMapperComponent)
78
+ ]
70
79
  })
71
80
  export class DropdownComponent extends FieldBase implements OnInit, OnDestroy {
72
81
  @Output() onRecordChange: EventEmitter<any> = new EventEmitter();
@@ -4,7 +4,7 @@
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  matInput
@@ -17,6 +17,7 @@
17
17
  (change)="fieldOnChange($event)"
18
18
  (blur)="fieldOnBlur($event)"
19
19
  />
20
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
20
21
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
21
22
  </mat-form-field>
22
23
  </div>
@@ -5,6 +5,7 @@ import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
6
 
7
7
  import { FieldBase } from '@pega/angular-sdk-components';
8
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
8
9
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
9
10
  import { handleEvent } from '@pega/angular-sdk-components';
10
11
  import { PConnFieldProps } from '@pega/angular-sdk-components';
@@ -17,7 +18,7 @@ interface EmailProps extends PConnFieldProps {
17
18
  selector: 'app-email',
18
19
  templateUrl: './email.component.html',
19
20
  styleUrls: ['./email.component.scss'],
20
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
21
+ imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, FieldWarningDirective, forwardRef(() => ComponentMapperComponent)]
21
22
  })
22
23
  export class EmailComponent extends FieldBase implements OnInit, OnDestroy {
23
24
  configProps$: EmailProps;
@@ -28,7 +29,6 @@ export class EmailComponent extends FieldBase implements OnInit, OnDestroy {
28
29
  override updateSelf(): void {
29
30
  // Resolve configuration properties
30
31
  this.configProps$ = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps()) as EmailProps;
31
-
32
32
  // Update component common properties
33
33
  this.updateComponentCommonProperties(this.configProps$);
34
34
 
@@ -3,6 +3,7 @@ import { FormControl, FormGroup } from '@angular/forms';
3
3
 
4
4
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
5
5
  import { Utils } from '@pega/angular-sdk-components';
6
+ import type { PConnFieldProps } from '../../_types/PConnProps.interface';
6
7
 
7
8
  @Directive()
8
9
  export class FieldBase implements OnInit, OnDestroy {
@@ -31,6 +32,10 @@ export class FieldBase implements OnInit, OnDestroy {
31
32
  bDisabled$ = false;
32
33
  bVisible$ = true;
33
34
  displayMode$ = '';
35
+ bFieldMessageVisible$ = false;
36
+ fieldMessage = '';
37
+
38
+ private defaultHelperText = '';
34
39
 
35
40
  /**
36
41
  * Initializes the component, registers with AngularPConnect, and sets up form control.
@@ -101,7 +106,7 @@ export class FieldBase implements OnInit, OnDestroy {
101
106
  this.label$ = label;
102
107
  this.hideLabel = hideLabel;
103
108
  this.displayMode$ = displayMode;
104
- this.helperText = helperText;
109
+ this.defaultHelperText = helperText ?? '';
105
110
  this.placeholder = placeholder || '';
106
111
 
107
112
  // Convert boolean properties
@@ -113,10 +118,27 @@ export class FieldBase implements OnInit, OnDestroy {
113
118
  // Enable or disable field control
114
119
  this.fieldControl[this.bDisabled$ ? 'disable' : 'enable']();
115
120
 
121
+ this.updateFieldMessage(configProps);
122
+
116
123
  // Display error message if validation message exists
117
124
  this.displayValidationMessage();
118
125
  }
119
126
 
127
+ /**
128
+ * Updates the contextual field message state for fields that support it.
129
+ *
130
+ * @param configProps The resolved field configuration.
131
+ */
132
+ protected updateFieldMessage(configProps: Pick<PConnFieldProps, 'messageConfig' | 'showFieldMessage'>): void {
133
+ const { messageConfig = {}, showFieldMessage } = configProps;
134
+ const isVisible = this.utils.getBooleanValue(messageConfig.visibility);
135
+ const shouldShowFieldMessage = this.utils.getBooleanValue(showFieldMessage) && isVisible && !this.bReadonly$;
136
+
137
+ this.bFieldMessageVisible$ = shouldShowFieldMessage;
138
+ this.fieldMessage = shouldShowFieldMessage ? (messageConfig.content ?? '') : '';
139
+ this.updateHelperText();
140
+ }
141
+
120
142
  /**
121
143
  * Displays the validation message if it exists.
122
144
  */
@@ -129,6 +151,10 @@ export class FieldBase implements OnInit, OnDestroy {
129
151
  }
130
152
  }
131
153
 
154
+ private updateHelperText(): void {
155
+ this.helperText = this.bFieldMessageVisible$ ? this.fieldMessage : this.defaultHelperText;
156
+ }
157
+
132
158
  /**
133
159
  * Retrieves the error message for the current field control.
134
160
  *
@@ -3,7 +3,7 @@
3
3
  name="FieldGroup"
4
4
  [props]="{
5
5
  name: showHeading$ ? heading$ : undefined,
6
- collapsible: collapsible$,
6
+ collapseOnLoad: configProps$.collapseOnLoad,
7
7
  instructions: instructions$,
8
8
  childrenTemplate: childrenTemplate
9
9
  }"
@@ -10,7 +10,7 @@ interface GroupProps extends PConnFieldProps {
10
10
  showHeading: boolean;
11
11
  heading: string;
12
12
  instructions: string;
13
- collapsible: boolean;
13
+ collapseOnLoad?: 'none' | 'expanded' | 'collapsed';
14
14
  }
15
15
 
16
16
  @Component({
@@ -32,7 +32,6 @@ export class GroupComponent implements OnInit, OnDestroy {
32
32
  showHeading$?: boolean;
33
33
  heading$: string;
34
34
  instructions$: string;
35
- collapsible$: boolean;
36
35
 
37
36
  constructor(private angularPConnect: AngularPConnectService) {}
38
37
 
@@ -74,7 +73,6 @@ export class GroupComponent implements OnInit, OnDestroy {
74
73
  this.showHeading$ = this.configProps$.showHeading;
75
74
  this.heading$ = this.configProps$.heading;
76
75
  this.instructions$ = this.configProps$.instructions;
77
- this.collapsible$ = this.configProps$.collapsible;
78
76
 
79
77
  if (this.configProps$.visibility === undefined) {
80
78
  this.visibility$ = this.pConn$.getComputedVisibility();
@@ -4,7 +4,7 @@
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  matInput
@@ -18,6 +18,7 @@
18
18
  (change)="fieldOnChange($event)"
19
19
  (blur)="fieldOnBlur($event)"
20
20
  />
21
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
21
22
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
22
23
  </mat-form-field>
23
24
  </div>
@@ -5,6 +5,7 @@ import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
6
 
7
7
  import { FieldBase } from '@pega/angular-sdk-components';
8
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
8
9
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
9
10
  import { handleEvent } from '@pega/angular-sdk-components';
10
11
  import { PConnFieldProps } from '@pega/angular-sdk-components';
@@ -17,7 +18,7 @@ interface IntegerProps extends PConnFieldProps {
17
18
  selector: 'app-integer',
18
19
  templateUrl: './integer.component.html',
19
20
  styleUrls: ['./integer.component.scss'],
20
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
21
+ imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, FieldWarningDirective, forwardRef(() => ComponentMapperComponent)]
21
22
  })
22
23
  export class IntegerComponent extends FieldBase {
23
24
  configProps$: IntegerProps;
@@ -57,7 +58,8 @@ export class IntegerComponent extends FieldBase {
57
58
 
58
59
  if (isValueChanged) {
59
60
  const value = event?.target?.value;
60
- handleEvent(this.actionsApi, 'changeNblur', this.propName, value);
61
+ const normalizedValue = value === '' ? '' : Number(value);
62
+ handleEvent(this.actionsApi, 'changeNblur', this.propName, normalizedValue);
61
63
  }
62
64
  }
63
65
  }
@@ -1,6 +1,6 @@
1
1
  <div *ngIf="mapReady && bVisible$">
2
2
  <!-- Google suggestions -->
3
- <mat-form-field class="psdk-full-width" [hintLabel]="helperText">
3
+ <mat-form-field class="psdk-full-width">
4
4
  <mat-label>{{ label$ }}</mat-label>
5
5
  <input
6
6
  matInput
@@ -14,6 +14,7 @@
14
14
  (blur)="fieldOnBlur()"
15
15
  />
16
16
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
17
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
17
18
  <button
18
19
  mat-icon-button
19
20
  matSuffix
@@ -11,6 +11,7 @@ import { GoogleMapsModule } from '@angular/google-maps';
11
11
  import { debounceTime, from, of, switchMap } from 'rxjs';
12
12
 
13
13
  import { FieldBase } from '@pega/angular-sdk-components';
14
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
14
15
  import { GoogleMapsLoaderService } from '@pega/angular-sdk-components';
15
16
  import { handleEvent } from '@pega/angular-sdk-components';
16
17
 
@@ -34,7 +35,8 @@ interface LocationProps extends PConnFieldProps {
34
35
  MatIconModule,
35
36
  MatInputModule,
36
37
  MatProgressSpinnerModule,
37
- ReactiveFormsModule
38
+ ReactiveFormsModule,
39
+ FieldWarningDirective
38
40
  ],
39
41
  templateUrl: './location.component.html',
40
42
  styleUrl: './location.component.scss'
@@ -1,7 +1,7 @@
1
1
  <ng-container *ngIf="bVisible$" [ngSwitch]="renderMode">
2
2
  <!-- SingleReferenceReadOnly mode -->
3
3
  <div *ngSwitchCase="'singleReferenceReadonly'">
4
- <component-mapper name="SingleReferenceReadOnly" [props]="{ pConn$ }"></component-mapper>
4
+ <component-mapper name="SingleReferenceReadOnly" [props]="{ pConn$, isDetails$, dataRelationshipContext }"></component-mapper>
5
5
  </div>
6
6
 
7
7
  <!-- MultiReferenceReadonly mode -->
@@ -46,6 +46,7 @@ type RenderMode = 'singleReferenceReadonly' | 'multiReferenceReadonly' | 'semant
46
46
  export class ObjectReferenceComponent implements OnInit, OnDestroy {
47
47
  @Input() pConn$: typeof PConnect;
48
48
  @Input() formGroup$: FormGroup;
49
+ @Input() isDetails$ = false;
49
50
 
50
51
  angularPConnectData: AngularPConnectData = {};
51
52
  configProps: ObjectReferenceProps;
@@ -56,6 +57,7 @@ export class ObjectReferenceComponent implements OnInit, OnDestroy {
56
57
  newComponentName: string;
57
58
  newPconn: typeof PConnect;
58
59
  rawViewMetadata: ComponentMetadataConfig | undefined;
60
+ dataRelationshipContext: string | null = null;
59
61
 
60
62
  // Rendering mode
61
63
  renderMode: RenderMode = 'dynamicComponent';
@@ -143,6 +145,7 @@ export class ObjectReferenceComponent implements OnInit, OnDestroy {
143
145
 
144
146
  this.isDisplayModeEnabled = displayMode === 'DISPLAY_ONLY';
145
147
  this.type = rawConfig?.componentType;
148
+ this.dataRelationshipContext = rawConfig?.displayField ? getDataRelationshipContextFromKey(rawConfig.displayField) : null;
146
149
  this.canBeChangedInReviewMode = editableInReview && ['AutoComplete', 'Dropdown'].includes(this.type);
147
150
 
148
151
  if (this.handleReadOnlyMode(rawConfig, mode)) {
@@ -4,7 +4,7 @@
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  type="text"
@@ -30,6 +30,7 @@
30
30
  (blur)="fieldOnBlur($event)"
31
31
  [readonly]="bReadonly$"
32
32
  />
33
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
33
34
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
34
35
  </mat-form-field>
35
36
  </div>
@@ -6,6 +6,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
6
6
  import { NgxCurrencyDirective, NgxCurrencyInputMode } from 'ngx-currency';
7
7
 
8
8
  import { FieldBase } from '@pega/angular-sdk-components';
9
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
11
  import { handleEvent } from '@pega/angular-sdk-components';
11
12
  import { getCurrencyCharacters } from '@pega/angular-sdk-components';
@@ -24,7 +25,15 @@ interface PercentageProps extends Omit<PConnFieldProps, 'value'> {
24
25
  selector: 'app-percentage',
25
26
  templateUrl: './percentage.component.html',
26
27
  styleUrls: ['./percentage.component.scss'],
27
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NgxCurrencyDirective, forwardRef(() => ComponentMapperComponent)]
28
+ imports: [
29
+ CommonModule,
30
+ ReactiveFormsModule,
31
+ MatFormFieldModule,
32
+ MatInputModule,
33
+ NgxCurrencyDirective,
34
+ FieldWarningDirective,
35
+ forwardRef(() => ComponentMapperComponent)
36
+ ]
28
37
  })
29
38
  export class PercentageComponent extends FieldBase {
30
39
  configProps$: PercentageProps;
@@ -3,7 +3,7 @@
3
3
  </div>
4
4
  <ng-template #noDisplayMode>
5
5
  <div *ngIf="bHasForm$ && bVisible$; else noEdit">
6
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText" floatLabel="always">
6
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" floatLabel="always">
7
7
  <mat-tel-input
8
8
  [attr.data-test-id]="testId"
9
9
  [formControl]="fieldControl"
@@ -18,6 +18,7 @@
18
18
  >
19
19
  </mat-tel-input>
20
20
  <mat-label>{{ label$ }}</mat-label>
21
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
21
22
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
22
23
  </mat-form-field>
23
24
  </div>
@@ -6,6 +6,7 @@ import { MatTelInput } from 'mat-tel-input';
6
6
  import { parsePhoneNumberFromString } from 'libphonenumber-js';
7
7
 
8
8
  import { FieldBase } from '@pega/angular-sdk-components';
9
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
11
  import { handleEvent } from '@pega/angular-sdk-components';
11
12
  import { PConnFieldProps } from '@pega/angular-sdk-components';
@@ -18,7 +19,7 @@ interface PhoneProps extends PConnFieldProps {
18
19
  selector: 'app-phone',
19
20
  templateUrl: './phone.component.html',
20
21
  styleUrls: ['./phone.component.scss'],
21
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatTelInput, forwardRef(() => ComponentMapperComponent)]
22
+ imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatTelInput, FieldWarningDirective, forwardRef(() => ComponentMapperComponent)]
22
23
  })
23
24
  export class PhoneComponent extends FieldBase {
24
25
  configProps$: PhoneProps;
@@ -9,7 +9,7 @@
9
9
  </div>
10
10
  <ng-template #noDisplayMode>
11
11
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
12
- <mat-form-field class="psdk-radio-form" subscriptSizing="dynamic" [hintLabel]="helperText">
12
+ <mat-form-field class="psdk-radio-form" subscriptSizing="dynamic">
13
13
  <mat-label>{{ label$ }}</mat-label>
14
14
  <input matInput [placeholder]="placeholder" style="display: none" [required]="bRequired$" />
15
15
  <mat-radio-group
@@ -30,6 +30,7 @@
30
30
  {{ getLocalizedOptionValue(opt) }}
31
31
  </mat-radio-button>
32
32
  </mat-radio-group>
33
+ <mat-hint *ngIf="helperText" [appFieldWarning]="bFieldMessageVisible$">{{ helperText }}</mat-hint>
33
34
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
34
35
  </mat-form-field>
35
36
  </div>
@@ -6,6 +6,7 @@ import { MatInputModule } from '@angular/material/input';
6
6
  import { MatFormFieldModule } from '@angular/material/form-field';
7
7
 
8
8
  import { FieldBase } from '@pega/angular-sdk-components';
9
+ import { FieldWarningDirective } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
10
11
  import { Utils } from '@pega/angular-sdk-components';
11
12
  import { handleEvent } from '@pega/angular-sdk-components';
@@ -28,7 +29,15 @@ interface RadioButtonsProps extends PConnFieldProps {
28
29
  templateUrl: './radio-buttons.component.html',
29
30
  styleUrls: ['./radio-buttons.component.scss'],
30
31
  providers: [Utils],
31
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatRadioModule, forwardRef(() => ComponentMapperComponent)]
32
+ imports: [
33
+ CommonModule,
34
+ ReactiveFormsModule,
35
+ MatFormFieldModule,
36
+ MatInputModule,
37
+ MatRadioModule,
38
+ FieldWarningDirective,
39
+ forwardRef(() => ComponentMapperComponent)
40
+ ]
32
41
  })
33
42
  export class RadioButtonsComponent extends FieldBase {
34
43
  configProps$: RadioButtonsProps;