@pega/angular-sdk-overrides 0.24.1 → 0.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.html +1 -1
  2. package/lib/field/currency/currency.component.html +4 -4
  3. package/lib/field/currency/currency.component.ts +31 -19
  4. package/lib/field/date-time/date-time.component.html +5 -5
  5. package/lib/field/date-time/date-time.component.ts +8 -39
  6. package/lib/field/decimal/decimal.component.html +13 -4
  7. package/lib/field/decimal/decimal.component.ts +41 -5
  8. package/lib/field/multiselect/utils.ts +1 -1
  9. package/lib/field/percentage/percentage.component.html +4 -3
  10. package/lib/field/percentage/percentage.component.ts +24 -5
  11. package/lib/field/user-reference/user-reference.component.html +50 -45
  12. package/lib/field/user-reference/user-reference.component.ts +33 -15
  13. package/lib/infra/Containers/flow-container/flow-container.component.ts +15 -9
  14. package/lib/infra/Containers/view-container/view-container.component.ts +6 -7
  15. package/lib/infra/assignment/assignment.component.ts +30 -1
  16. package/lib/infra/multi-step/multi-step.component.html +1 -1
  17. package/lib/infra/navbar/navbar.component.html +1 -1
  18. package/lib/infra/navbar/navbar.component.ts +3 -1
  19. package/lib/template/case-view/case-view.component.html +1 -1
  20. package/lib/template/list-view/list-view.component.ts +1 -1
  21. package/lib/widget/case-history/case-history.component.ts +1 -1
  22. package/lib/widget/file-utility/file-utility.component.html +2 -2
  23. package/lib/widget/file-utility/file-utility.component.ts +13 -13
  24. package/lib/widget/list-utility/list-utility.component.html +1 -1
  25. package/lib/widget/todo/todo.component.html +3 -3
  26. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  <div>
2
- <mat-button-toggle-group vertical (change)="onChange($event.value)" [value]="selectedTabId$" aria-label="Tabs">
2
+ <mat-button-toggle-group vertical hideSingleSelectionIndicator (change)="onChange($event.value)" [value]="selectedTabId$" aria-label="Tabs">
3
3
  <mat-button-toggle *ngFor="let tab of tabConfig$" [value]="tab.id" style="text-align: left">
4
4
  <div style="display: flex">
5
5
  <div style="flex-grow: 10">{{ tab.name }}</div>
@@ -7,17 +7,17 @@
7
7
  <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <div class="psdk-currency-input">
10
- <span>{{ symbol }}</span>
11
10
  <input
12
11
  style="margin-left: 5px"
13
- type="float"
12
+ type="text"
14
13
  matInput
14
+ currencyMask
15
+ [options]="{ prefix: currSym, thousands: currSep, decimal: currDec, align: 'left', nullable: true }"
15
16
  [placeholder]="placeholder"
16
- [value]="value$ | number: '1.2-2'"
17
+ [formControlName]="controlName$"
17
18
  [required]="bRequired$"
18
19
  [formControl]="fieldControl"
19
20
  [attr.data-test-id]="testId"
20
- (change)="fieldOnChange($event)"
21
21
  (blur)="fieldOnBlur($event)"
22
22
  />
23
23
  </div>
@@ -4,9 +4,11 @@ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
6
  import { interval } from 'rxjs';
7
+ import { NgxCurrencyDirective } from 'ngx-currency';
7
8
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
8
9
  import { Utils } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
+ import { handleEvent } from '@pega/angular-sdk-components';
10
12
  import { getCurrencyCharacters } from '@pega/angular-sdk-components';
11
13
  import { PConnFieldProps } from '@pega/angular-sdk-components';
12
14
 
@@ -20,7 +22,7 @@ interface CurrrencyProps extends PConnFieldProps {
20
22
  templateUrl: './currency.component.html',
21
23
  styleUrls: ['./currency.component.scss'],
22
24
  standalone: true,
23
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
25
+ imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NgxCurrencyDirective, forwardRef(() => ComponentMapperComponent)]
24
26
  })
25
27
  export class CurrencyComponent implements OnInit, OnDestroy {
26
28
  @Input() pConn$: typeof PConnect;
@@ -31,7 +33,7 @@ export class CurrencyComponent implements OnInit, OnDestroy {
31
33
  configProps$: CurrrencyProps;
32
34
 
33
35
  label$ = '';
34
- value$: number | null;
36
+ value$: any;
35
37
  bRequired$ = false;
36
38
  bReadonly$ = false;
37
39
  bDisabled$ = false;
@@ -47,9 +49,9 @@ export class CurrencyComponent implements OnInit, OnDestroy {
47
49
  currencyOptions: Object = {};
48
50
 
49
51
  fieldControl = new FormControl<number | null>(null, { updateOn: 'blur' });
50
- symbol: string;
51
- thousandsSep: string;
52
- decimalSep: string;
52
+ currSym: string;
53
+ currSep: string;
54
+ currDec: string;
53
55
 
54
56
  constructor(
55
57
  private angularPConnect: AngularPConnectService,
@@ -114,10 +116,21 @@ export class CurrencyComponent implements OnInit, OnDestroy {
114
116
  this.testId = this.configProps$.testId;
115
117
  this.label$ = this.configProps$.label;
116
118
  this.displayMode$ = this.configProps$.displayMode;
117
- const nValue: any = this.configProps$.value;
118
- this.value$ = nValue && typeof nValue === 'string' ? parseFloat(nValue) : nValue;
119
+ let nValue: any = this.configProps$.value;
120
+ if (nValue) {
121
+ if (typeof nValue === 'string') {
122
+ nValue = parseFloat(nValue);
123
+ }
124
+ this.value$ = nValue;
125
+ }
119
126
  this.helperText = this.configProps$.helperText;
120
127
  this.placeholder = this.configProps$.placeholder || '';
128
+ const currencyISOCode: any = this.configProps$?.currencyISOCode;
129
+
130
+ const theSymbols = getCurrencyCharacters(currencyISOCode);
131
+ this.currSym = theSymbols.theCurrencySymbol;
132
+ this.currSep = theSymbols.theDigitGroupSeparator;
133
+ this.currDec = theSymbols.theDecimalIndicator;
121
134
 
122
135
  // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
123
136
  setTimeout(() => {
@@ -150,11 +163,6 @@ export class CurrencyComponent implements OnInit, OnDestroy {
150
163
  this.currencyISOCode = this.configProps$.currencyISOCode;
151
164
  }
152
165
 
153
- const theSymbols = getCurrencyCharacters(this.currencyISOCode);
154
- this.symbol = theSymbols.theCurrencySymbol;
155
- this.thousandsSep = theSymbols.theDigitGroupSeparator;
156
- this.decimalSep = theSymbols.theDecimalIndicator;
157
-
158
166
  this.componentReference = (this.pConn$.getStateProps() as any).value;
159
167
 
160
168
  // trigger display of error message with field control
@@ -168,14 +176,18 @@ export class CurrencyComponent implements OnInit, OnDestroy {
168
176
  }
169
177
  }
170
178
 
171
- fieldOnChange(event: any) {
172
- this.angularPConnectData.actions?.onChange(this, event);
173
- }
174
-
175
179
  fieldOnBlur(event: any) {
176
- // PConnect wants to use eventHandler for onBlur
177
-
178
- this.angularPConnectData.actions?.onBlur(this, event);
180
+ const actionsApi = this.pConn$?.getActionsApi();
181
+ const propName = (this.pConn$?.getStateProps() as any).value;
182
+ let value = event?.target?.value;
183
+ value = value?.substring(1);
184
+ if (this.currSep === ',') {
185
+ value = value.replace(/,/g, '');
186
+ } else {
187
+ value = value?.replace(/\./g, '');
188
+ value = value?.replace(/,/g, '.');
189
+ }
190
+ handleEvent(actionsApi, 'changeNblur', propName, value);
179
191
  }
180
192
 
181
193
  getErrorMessage() {
@@ -8,18 +8,18 @@
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  matInput
11
+ [owlDateTime]="dtPicker"
11
12
  [attr.data-test-id]="testId"
12
- [ngxMatDatetimePicker]="picker"
13
13
  [placeholder]="placeholder"
14
14
  [formControl]="fieldControl"
15
- (dateChange)="fieldOnChange($event)"
16
15
  (blur)="fieldOnBlur($event)"
16
+ (dateTimeChange)="fieldOnBlur($event)"
17
17
  [value]="value$"
18
18
  [required]="bRequired$"
19
19
  />
20
- <mat-datepicker-toggle matSuffix [for]="$any(picker)"></mat-datepicker-toggle>
21
- <ngx-mat-datetime-picker #picker [stepHour]="stepHour" [stepMinute]="stepMinute" [stepSecond]="stepSecond"> </ngx-mat-datetime-picker>
22
- <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
20
+ <mat-datepicker-toggle matSuffix [for]="$any(dtPicker)" [owlDateTimeTrigger]="dtPicker"></mat-datepicker-toggle>
21
+ <owl-date-time #dtPicker></owl-date-time>
22
+ <mat-error *ngIf="fieldControl?.invalid">{{ getErrorMessage() }}</mat-error>
23
23
  </mat-form-field>
24
24
  </div>
25
25
  </div>
@@ -1,44 +1,21 @@
1
- /* eslint-disable max-classes-per-file */
2
1
  import { Component, OnInit, Input, ChangeDetectorRef, forwardRef, OnDestroy } from '@angular/core';
3
2
  import { CommonModule } from '@angular/common';
4
3
  import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
5
- import { NgxMatDatetimePickerModule, NgxMatTimepickerModule, NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker';
6
- import { NgxMatMomentModule } from '@angular-material-components/moment-adapter';
7
- import { MomentDateModule } from '@angular/material-moment-adapter';
8
4
  import { MatDatepickerModule } from '@angular/material/datepicker';
9
5
  import { MatInputModule } from '@angular/material/input';
10
6
  import { MatFormFieldModule } from '@angular/material/form-field';
7
+ import { OwlDateTimeModule, OwlNativeDateTimeModule } from '@danielmoncada/angular-datetime-picker';
11
8
  import { interval } from 'rxjs';
12
9
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
13
10
  import { Utils } from '@pega/angular-sdk-components';
14
11
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
15
12
  import { dateFormatInfoDefault, getDateFormatInfo } from '@pega/angular-sdk-components';
16
- import { handleEvent } from '@pega/angular-sdk-components';
17
13
  import { PConnFieldProps } from '@pega/angular-sdk-components';
18
14
 
19
15
  interface DateTimeProps extends PConnFieldProps {
20
16
  // If any, enter additional props that only exist on DateTime here
21
17
  }
22
18
 
23
- class MyFormat {
24
- theDateFormat: any = getDateFormatInfo();
25
-
26
- get display() {
27
- return {
28
- dateInput: `${this.theDateFormat.dateFormatString}, LT`,
29
- monthYearLabel: 'MMM YYYY',
30
- dateA11yLabel: 'LL',
31
- monthYearA11yLabel: 'MMMM YYYY'
32
- };
33
- }
34
-
35
- get parse() {
36
- return {
37
- dateInput: `${this.theDateFormat.dateFormatString}, LT`
38
- };
39
- }
40
- }
41
-
42
19
  @Component({
43
20
  selector: 'app-date-time',
44
21
  templateUrl: './date-time.component.html',
@@ -50,13 +27,10 @@ class MyFormat {
50
27
  MatFormFieldModule,
51
28
  MatInputModule,
52
29
  MatDatepickerModule,
53
- NgxMatMomentModule,
54
- NgxMatDatetimePickerModule,
55
- NgxMatTimepickerModule,
56
- MomentDateModule,
30
+ OwlDateTimeModule,
31
+ OwlNativeDateTimeModule,
57
32
  forwardRef(() => ComponentMapperComponent)
58
- ],
59
- providers: [{ provide: NGX_MAT_DATE_FORMATS, useClass: MyFormat }]
33
+ ]
60
34
  })
61
35
  export class DateTimeComponent implements OnInit, OnDestroy {
62
36
  @Input() pConn$: typeof PConnect;
@@ -194,16 +168,11 @@ export class DateTimeComponent implements OnInit, OnDestroy {
194
168
  }
195
169
  }
196
170
 
197
- fieldOnChange(event: any) {
198
- const value = event.value && event.value.isValid() ? event.value : null;
199
- const actionsApi = this.pConn$?.getActionsApi();
200
- const propName = (this.pConn$?.getStateProps() as any).value;
201
- handleEvent(actionsApi, 'changeNblur', propName, value?.toISOString());
202
- }
203
-
204
171
  fieldOnBlur(event: any) {
205
- // PConnect wants to use eventHandler for onBlur
206
- if (event.target.value) event.value = event.target.value;
172
+ if (typeof event.value === 'object') {
173
+ // convert date to pega "date" format
174
+ event.value = event.value?.toISOString();
175
+ }
207
176
 
208
177
  this.angularPConnectData.actions?.onBlur(this, event);
209
178
  }
@@ -1,22 +1,31 @@
1
1
  <div *ngIf="displayMode$; else noDisplayMode">
2
- <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$, displayMode$ }"></component-mapper>
2
+ <component-mapper *ngIf="bVisible$ !== false" name="FieldValueList" [props]="{ label$, value$: formattedValue, displayMode$ }"></component-mapper>
3
3
  </div>
4
4
  <ng-template #noDisplayMode>
5
- <div *ngIf="!bReadonly$ && bHasForm$; else noEdit">
5
+ <div *ngIf="bHasForm$; else noEdit">
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
7
  <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
9
  <input
10
10
  type="text"
11
11
  matInput
12
- appThousandSeparator
12
+ currencyMask
13
+ [options]="{
14
+ prefix: bReadonly$ && formatter === 'Currency' ? currSym : '',
15
+ thousands: currSep,
16
+ decimal: currDec,
17
+ align: 'left',
18
+ nullable: true,
19
+ inputMode: inputMode
20
+ }"
13
21
  [placeholder]="placeholder"
14
22
  step="0.01"
15
- [value]="value$"
23
+ [formControlName]="controlName$"
16
24
  [required]="bRequired$"
17
25
  [formControl]="fieldControl"
18
26
  [attr.data-test-id]="testId"
19
27
  (blur)="fieldOnBlur($event)"
28
+ [readonly]="bReadonly$"
20
29
  />
21
30
  <mat-error *ngIf="fieldControl.invalid">{{ getErrorMessage() }}</mat-error>
22
31
  </mat-form-field>
@@ -3,18 +3,21 @@ import { CommonModule } from '@angular/common';
3
3
  import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
+ import { NgxCurrencyDirective, NgxCurrencyInputMode } from 'ngx-currency';
6
7
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
7
8
  import { Utils } from '@pega/angular-sdk-components';
8
9
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
9
10
  import { handleEvent } from '@pega/angular-sdk-components';
10
- import { ThousandSeparatorDirective } from '@pega/angular-sdk-components';
11
+ import { getCurrencyCharacters, getCurrencyOptions } from '@pega/angular-sdk-components';
11
12
  import { PConnFieldProps } from '@pega/angular-sdk-components';
13
+ import { format } from '@pega/angular-sdk-components';
12
14
 
13
15
  interface DecimalProps extends PConnFieldProps {
14
16
  // If any, enter additional props that only exist on Decimal here
15
17
  currencyISOCode?: string;
16
18
  decimalPrecision?: number;
17
19
  showGroupSeparators?: string;
20
+ formatter?: string;
18
21
  }
19
22
 
20
23
  @Component({
@@ -28,7 +31,7 @@ interface DecimalProps extends PConnFieldProps {
28
31
  FormsModule,
29
32
  MatFormFieldModule,
30
33
  MatInputModule,
31
- ThousandSeparatorDirective,
34
+ NgxCurrencyDirective,
32
35
  forwardRef(() => ComponentMapperComponent)
33
36
  ]
34
37
  })
@@ -41,7 +44,7 @@ export class DecimalComponent implements OnInit, OnDestroy {
41
44
  configProps$: DecimalProps;
42
45
 
43
46
  label$ = '';
44
- value$: number;
47
+ value$: any;
45
48
  bRequired$ = false;
46
49
  bReadonly$ = false;
47
50
  bDisabled$ = false;
@@ -55,6 +58,13 @@ export class DecimalComponent implements OnInit, OnDestroy {
55
58
  placeholder: string;
56
59
 
57
60
  fieldControl = new FormControl<number | null>(null, null);
61
+ currDec: string;
62
+ currSep: string;
63
+ currSym: string;
64
+ decimalPrecision: number | undefined;
65
+ formatter;
66
+ formattedValue: any;
67
+ inputMode: any;
58
68
 
59
69
  constructor(
60
70
  private angularPConnect: AngularPConnectService,
@@ -119,6 +129,7 @@ export class DecimalComponent implements OnInit, OnDestroy {
119
129
  this.testId = this.configProps$.testId;
120
130
  this.label$ = this.configProps$.label;
121
131
  this.displayMode$ = this.configProps$.displayMode;
132
+ this.inputMode = NgxCurrencyInputMode.Natural;
122
133
  let nValue: any = this.configProps$.value;
123
134
  if (nValue) {
124
135
  if (typeof nValue === 'string') {
@@ -128,6 +139,21 @@ export class DecimalComponent implements OnInit, OnDestroy {
128
139
  }
129
140
  this.helperText = this.configProps$.helperText;
130
141
  this.placeholder = this.configProps$.placeholder || '';
142
+ const showGroupSeparators = this.configProps$.showGroupSeparators;
143
+ const currencyISOCode: any = this.configProps$?.currencyISOCode;
144
+
145
+ const theSymbols = getCurrencyCharacters(currencyISOCode);
146
+ this.currDec = theSymbols.theDecimalIndicator;
147
+ this.currSep = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
148
+
149
+ const theCurrencyOptions = getCurrencyOptions(currencyISOCode);
150
+ this.formatter = this.configProps$.formatter;
151
+
152
+ if (this.formatter === 'Currency') {
153
+ this.formattedValue = format(this.value$, this.formatter.toLowerCase(), theCurrencyOptions);
154
+ } else {
155
+ this.formattedValue = format(this.value$, this.pConn$.getComponentName().toLowerCase(), theCurrencyOptions);
156
+ }
131
157
 
132
158
  // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
133
159
  setTimeout(() => {
@@ -156,6 +182,12 @@ export class DecimalComponent implements OnInit, OnDestroy {
156
182
  this.fieldControl.enable();
157
183
  }
158
184
 
185
+ if (this.bReadonly$ && this.formatter === 'Currency') {
186
+ this.currSym = theSymbols.theCurrencySymbol;
187
+ } else {
188
+ this.currSym = '';
189
+ }
190
+
159
191
  this.componentReference = (this.pConn$.getStateProps() as any).value;
160
192
  }
161
193
 
@@ -163,8 +195,12 @@ export class DecimalComponent implements OnInit, OnDestroy {
163
195
  const actionsApi = this.pConn$?.getActionsApi();
164
196
  const propName = (this.pConn$?.getStateProps() as any).value;
165
197
  let value = event?.target?.value;
166
- value = value.replace(/,/g, '');
167
- value = value !== '' ? Number(value) : value;
198
+ if (this.currSep === ',') {
199
+ value = value.replace(/,/g, '');
200
+ } else {
201
+ value = value?.replace(/\./g, '');
202
+ value = value?.replace(/,/g, '.');
203
+ }
168
204
  handleEvent(actionsApi, 'changeNblur', propName, value);
169
205
  }
170
206
 
@@ -1,4 +1,4 @@
1
- import cloneDeep from 'lodash/cloneDeep';
1
+ import cloneDeep from 'lodash.clonedeep';
2
2
 
3
3
  export function setVisibilityForList(c11nEnv, visibility) {
4
4
  const { selectionMode, selectionList, renderMode, referenceList } = c11nEnv.getComponentConfig();
@@ -6,13 +6,14 @@
6
6
  <div [formGroup]="formGroup$" *ngIf="bVisible$">
7
7
  <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
8
8
  <mat-label>{{ label$ }}</mat-label>
9
- <!-- <span matPrefix>% &nbsp;</span> -->
10
9
  <input
10
+ type="text"
11
11
  matInput
12
+ currencyMask
13
+ [options]="{ prefix: '', suffix: '%', thousands: currSep, decimal: currDec, align: 'left', nullable: true }"
12
14
  [placeholder]="placeholder"
13
- type="number"
14
15
  step=".01"
15
- [value]="value$"
16
+ [formControlName]="controlName$"
16
17
  [required]="bRequired$"
17
18
  [formControl]="fieldControl"
18
19
  [attr.data-test-id]="testId"
@@ -4,12 +4,17 @@ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
4
4
  import { MatInputModule } from '@angular/material/input';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
6
  import { interval } from 'rxjs';
7
+ import { NgxCurrencyDirective } from 'ngx-currency';
7
8
  import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-components';
8
9
  import { Utils } from '@pega/angular-sdk-components';
9
10
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
11
+ import { handleEvent } from '@pega/angular-sdk-components';
12
+ import { getCurrencyCharacters } from '@pega/angular-sdk-components';
10
13
  import { PConnFieldProps } from '@pega/angular-sdk-components';
11
14
 
12
15
  interface PercentageProps extends PConnFieldProps {
16
+ showGroupSeparators?: string;
17
+ decimalPrecision?: number;
13
18
  // If any, enter additional props that only exist on Percentage here
14
19
  }
15
20
 
@@ -18,7 +23,7 @@ interface PercentageProps extends PConnFieldProps {
18
23
  templateUrl: './percentage.component.html',
19
24
  styleUrls: ['./percentage.component.scss'],
20
25
  standalone: true,
21
- imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)]
26
+ imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, NgxCurrencyDirective, forwardRef(() => ComponentMapperComponent)]
22
27
  })
23
28
  export class PercentageComponent implements OnInit, OnDestroy {
24
29
  @Input() pConn$: typeof PConnect;
@@ -41,7 +46,8 @@ export class PercentageComponent implements OnInit, OnDestroy {
41
46
  testId: string;
42
47
  helperText: string;
43
48
  placeholder: string;
44
-
49
+ currDec: string;
50
+ currSep: string;
45
51
  fieldControl = new FormControl<number | null>(null, null);
46
52
 
47
53
  constructor(
@@ -113,6 +119,11 @@ export class PercentageComponent implements OnInit, OnDestroy {
113
119
  }
114
120
  this.helperText = this.configProps$.helperText;
115
121
  this.placeholder = this.configProps$.placeholder || '';
122
+ const showGroupSeparators = this.configProps$.showGroupSeparators;
123
+
124
+ const theSymbols = getCurrencyCharacters('');
125
+ this.currDec = theSymbols.theDecimalIndicator || '2';
126
+ this.currSep = showGroupSeparators ? theSymbols.theDigitGroupSeparator : '';
116
127
 
117
128
  // timeout and detectChanges to avoid ExpressionChangedAfterItHasBeenCheckedError
118
129
  setTimeout(() => {
@@ -158,9 +169,17 @@ export class PercentageComponent implements OnInit, OnDestroy {
158
169
  }
159
170
 
160
171
  fieldOnBlur(event: any) {
161
- // PConnect wants to use eventHandler for onBlur
162
-
163
- this.angularPConnectData.actions?.onBlur(this, event);
172
+ const actionsApi = this.pConn$?.getActionsApi();
173
+ const propName = (this.pConn$?.getStateProps() as any).value;
174
+ let value = event?.target?.value;
175
+ value = value?.replace('%', '');
176
+ if (this.currSep === ',') {
177
+ value = value.replace(/,/g, '');
178
+ } else {
179
+ value = value?.replace(/\./g, '');
180
+ value = value?.replace(/,/g, '.');
181
+ }
182
+ handleEvent(actionsApi, 'changeNblur', propName, value);
164
183
  }
165
184
 
166
185
  getErrorMessage() {
@@ -1,48 +1,53 @@
1
1
  <div class="psdk-user-reference">
2
- <div *ngIf="type === 'operator'">
3
- <component-mapper name="Operator" [props]="{ pConn$ }"></component-mapper>
4
- </div>
5
- <div [formGroup]="formGroup$" *ngIf="type === 'dropdown'">
6
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
7
- <mat-select
8
- [value]="value$"
9
- [required]="bRequired$"
10
- [formControl]="fieldControl"
11
- [attr.data-test-id]="testId"
12
- (selectionChange)="fieldOnChange($event)"
13
- >
14
- <mat-option *ngFor="let opt of options$" [value]="opt.key">
15
- {{ opt.value }}
16
- </mat-option>
17
- </mat-select>
18
- <mat-label>{{ label$ }}</mat-label>
19
- <mat-error *ngIf="fieldControl.invalid">
20
- {{ getErrorMessage() }}
21
- </mat-error>
22
- </mat-form-field>
23
- </div>
24
- <div [formGroup]="formGroup$" *ngIf="type === 'searchbox'">
25
- <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
26
- <mat-label>{{ label$ }}</mat-label>
27
- <input
28
- matInput
29
- [placeholder]="placeholder"
30
- [formControl]="fieldControl"
31
- [value]="value$"
32
- [required]="bRequired$"
33
- [matAutocomplete]="auto"
34
- [attr.data-test-id]="testId"
35
- (change)="fieldOnChange($event)"
36
- (blur)="fieldOnBlur($event)"
37
- />
38
- <mat-autocomplete #auto="matAutocomplete">
39
- <mat-option *ngFor="let opt of options$" [value]="opt.value">
40
- <span>{{ opt.value }}</span>
41
- </mat-option>
42
- </mat-autocomplete>
43
- <mat-error *ngIf="fieldControl.invalid">
44
- {{ getErrorMessage() }}
45
- </mat-error>
46
- </mat-form-field>
2
+ <div *ngIf="displayMode$; else noDisplayMode">
3
+ <component-mapper name="FieldValueList" [props]="{ label$, value$, displayMode$ }"></component-mapper>
47
4
  </div>
5
+ <ng-template #noDisplayMode>
6
+ <div *ngIf="type === 'operator'">
7
+ <component-mapper name="Operator" [props]="{ pConn$ }"></component-mapper>
8
+ </div>
9
+ <div [formGroup]="formGroup$" *ngIf="type === 'dropdown'">
10
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
11
+ <mat-select
12
+ [value]="value$"
13
+ [required]="bRequired$"
14
+ [formControl]="fieldControl"
15
+ [attr.data-test-id]="testId"
16
+ (selectionChange)="fieldOnChange($event)"
17
+ >
18
+ <mat-option *ngFor="let opt of options$" [value]="opt.key">
19
+ {{ opt.value }}
20
+ </mat-option>
21
+ </mat-select>
22
+ <mat-label>{{ label$ }}</mat-label>
23
+ <mat-error *ngIf="fieldControl.invalid">
24
+ {{ getErrorMessage() }}
25
+ </mat-error>
26
+ </mat-form-field>
27
+ </div>
28
+ <div [formGroup]="formGroup$" *ngIf="type === 'searchbox'">
29
+ <mat-form-field class="psdk-full-width" subscriptSizing="dynamic" [hintLabel]="helperText">
30
+ <mat-label>{{ label$ }}</mat-label>
31
+ <input
32
+ matInput
33
+ [placeholder]="placeholder"
34
+ [formControl]="fieldControl"
35
+ [value]="value$"
36
+ [required]="bRequired$"
37
+ [matAutocomplete]="auto"
38
+ [attr.data-test-id]="testId"
39
+ (change)="fieldOnChange($event)"
40
+ (blur)="fieldOnBlur($event)"
41
+ />
42
+ <mat-autocomplete #auto="matAutocomplete">
43
+ <mat-option *ngFor="let opt of filteredOptions | async" [value]="opt.value">
44
+ <span>{{ opt.value }}</span>
45
+ </mat-option>
46
+ </mat-autocomplete>
47
+ <mat-error *ngIf="fieldControl.invalid">
48
+ {{ getErrorMessage() }}
49
+ </mat-error>
50
+ </mat-form-field>
51
+ </div>
52
+ </ng-template>
48
53
  </div>
@@ -10,6 +10,7 @@ import { AngularPConnectData, AngularPConnectService } from '@pega/angular-sdk-c
10
10
  import { Utils } from '@pega/angular-sdk-components';
11
11
  import { ComponentMapperComponent } from '@pega/angular-sdk-components';
12
12
  import { PConnFieldProps } from '@pega/angular-sdk-components';
13
+ import { map, Observable, startWith } from 'rxjs';
13
14
 
14
15
  const OPERATORS_DP = 'D_pyGetOperatorsForCurrentApplication';
15
16
  const DROPDOWN_LIST = 'Drop-down list';
@@ -57,6 +58,9 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
57
58
  testId: string;
58
59
  helperText: string;
59
60
  placeholder: string;
61
+ displayMode$?: string;
62
+ filteredOptions: Observable<any[]>;
63
+ filterValue = '';
60
64
 
61
65
  fieldControl = new FormControl('', null);
62
66
 
@@ -65,19 +69,24 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
65
69
  private utils: Utils
66
70
  ) {}
67
71
 
68
- ngOnInit(): void {
72
+ async ngOnInit(): Promise<void> {
69
73
  // First thing in initialization is registering and subscribing to the AngularPConnect service
70
74
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
71
75
 
72
76
  this.controlName$ = this.angularPConnect.getComponentID(this);
73
77
 
74
- this.checkAndUpdate();
78
+ await this.checkAndUpdate();
75
79
 
76
80
  if (this.formGroup$) {
77
81
  // add control to formGroup
78
82
  this.formGroup$.addControl(this.controlName$, this.fieldControl);
79
83
  this.fieldControl.setValue(this.value$);
80
84
  }
85
+
86
+ this.filteredOptions = this.fieldControl.valueChanges.pipe(
87
+ startWith(''),
88
+ map(value => this._filter(value || ''))
89
+ );
81
90
  }
82
91
 
83
92
  ngOnDestroy() {
@@ -105,32 +114,38 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
105
114
  }
106
115
 
107
116
  // Callback passed when subscribing to store change
108
- onStateChange() {
109
- this.checkAndUpdate();
117
+ async onStateChange() {
118
+ await this.checkAndUpdate();
119
+ }
120
+
121
+ private _filter(value: string): string[] {
122
+ const filterVal = (value || this.filterValue).toLowerCase();
123
+ return this.options$?.filter(option => option.value?.toLowerCase().includes(filterVal));
110
124
  }
111
125
 
112
- checkAndUpdate() {
126
+ async checkAndUpdate() {
113
127
  // Should always check the bridge to see if the component should
114
128
  // update itself (re-render)
115
129
  const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
116
130
 
117
131
  // ONLY call updateSelf when the component should update
118
132
  if (bUpdateSelf) {
119
- this.updateSelf();
133
+ await this.updateSelf();
120
134
  }
121
135
  }
122
136
 
123
- updateSelf() {
137
+ async updateSelf() {
124
138
  const props = this.pConn$.getConfigProps() as UserReferenceProps;
125
139
  this.testId = props.testId;
126
140
 
127
- const { label, displayAs, value, showAsFormattedText, helperText, placeholder } = props;
141
+ const { label, displayAs, value, showAsFormattedText, helperText, placeholder, displayMode } = props;
128
142
 
129
143
  this.label$ = label;
130
144
  this.showAsFormattedText$ = showAsFormattedText;
131
145
  this.displayAs$ = displayAs;
132
146
  this.helperText = helperText;
133
147
  this.placeholder = placeholder || '';
148
+ this.displayMode$ = displayMode;
134
149
 
135
150
  const { readOnly, required } = props;
136
151
  [this.bReadonly$, this.bRequired$] = [readOnly, required].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
@@ -158,18 +173,18 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
158
173
  const queryPayload = {
159
174
  dataViewName: OPERATORS_DP
160
175
  };
161
- PCore.getRestClient()
162
- .invokeRestApi('getListData', { queryPayload } as any, '') // 3rd arg empty string until typedef marked correctly
163
- .then((resp: any) => {
176
+ try {
177
+ const resp: any = await PCore.getRestClient().invokeRestApi('getListData', { queryPayload } as any, ''); // 3rd arg empty string until typedef marked correctly
178
+ if (resp?.data) {
164
179
  const ddDataSource = resp.data.data.map(listItem => ({
165
180
  key: listItem.pyUserIdentifier,
166
181
  value: listItem.pyUserName
167
182
  }));
168
183
  this.options$ = ddDataSource;
169
- })
170
- .catch(err => {
171
- console.log(err);
172
- });
184
+ }
185
+ } catch (error) {
186
+ console.log(error);
187
+ }
173
188
  }
174
189
  }
175
190
 
@@ -177,6 +192,9 @@ export class UserReferenceComponent implements OnInit, OnDestroy {
177
192
  if (event?.value === 'Select') {
178
193
  event.value = '';
179
194
  }
195
+ if (event?.target) {
196
+ this.filterValue = (event.target as HTMLInputElement).value;
197
+ }
180
198
  this.angularPConnectData.actions?.onChange(this, event);
181
199
  }
182
200
 
@@ -274,24 +274,30 @@ export class FlowContainerComponent implements OnInit, OnDestroy {
274
274
  hasAssignments() {
275
275
  let hasAssignments = false;
276
276
  // @ts-ignore - second parameter pageReference for getValue method should be optional
277
- const assignmentsList = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS);
278
- const thisOperator = PCore.getEnvironmentInfo().getOperatorIdentifier();
277
+ const assignmentsList: any[] = this.pConn$.getValue(this.pCoreConstants.CASE_INFO.D_CASE_ASSIGNMENTS_RESULTS);
278
+ // const thisOperator = PCore.getEnvironmentInfo().getOperatorIdentifier();
279
279
  // 8.7 includes assignments in Assignments List that may be assigned to
280
280
  // a different operator. So, see if there are any assignments for
281
281
  // the current operator
282
+ const isEmbedded = window.location.href.includes('embedded');
282
283
  let bAssignmentsForThisOperator = false;
283
284
 
285
+ if (isEmbedded) {
286
+ const thisOperator = PCore.getEnvironmentInfo().getOperatorIdentifier();
287
+ for (const assignment of assignmentsList) {
288
+ if (assignment.assigneeInfo.ID === thisOperator) {
289
+ bAssignmentsForThisOperator = true;
290
+ }
291
+ }
292
+ } else {
293
+ bAssignmentsForThisOperator = true;
294
+ }
295
+
284
296
  // Bail if there is no assignmentsList
285
297
  if (!assignmentsList) {
286
298
  return hasAssignments;
287
299
  }
288
300
 
289
- for (const assignment of assignmentsList) {
290
- if ((assignment as any).assigneeInfo.ID === thisOperator) {
291
- bAssignmentsForThisOperator = true;
292
- }
293
- }
294
-
295
301
  const hasChildCaseAssignments = this.hasChildCaseAssignments();
296
302
 
297
303
  if (bAssignmentsForThisOperator || hasChildCaseAssignments || this.isCaseWideLocalAction()) {
@@ -469,7 +475,7 @@ export class FlowContainerComponent implements OnInit, OnDestroy {
469
475
  PCore.getPubSubUtils().publish('assignmentFinished');
470
476
 
471
477
  this.psService.sendMessage(false);
472
- } else if (this.bHasCaseMessages$) {
478
+ } else {
473
479
  this.bHasCaseMessages$ = false;
474
480
  this.bShowConfirm = false;
475
481
  }
@@ -118,17 +118,16 @@ export class ViewContainerComponent implements OnInit, OnDestroy {
118
118
  /* NOTE: setContainerLimit use is temporary. It is a non-public, unsupported API. */
119
119
  PCore.getContainerUtils().setContainerLimit(`${APP.APP}/${name}`, limit);
120
120
  }
121
+ }
121
122
 
122
- if (!PCore.checkIfSemanticURL()) {
123
+ if (sessionStorage.getItem('hasViewContainer') == 'false') {
124
+ // @ts-ignore - Property 'getMetadata' is private and only accessible within class
125
+ if (this.pConn$.getMetadata().children) {
123
126
  containerMgr.addContainerItem(this.dispatchObject);
124
127
  }
125
- }
126
128
 
127
- // if (sessionStorage.getItem('hasViewContainer') == 'false') {
128
- // // @ts-ignore - Property 'getMetadata' is private and only accessible within class
129
-
130
- // sessionStorage.setItem('hasViewContainer', 'true');
131
- // }
129
+ sessionStorage.setItem('hasViewContainer', 'true');
130
+ }
132
131
 
133
132
  // cannot call checkAndUpdate becasue first time through, will call updateSelf and that is incorrect (causes issues).
134
133
  // however, need angularPConnect to be initialized with currentProps for future updates, so calling shouldComponentUpdate directly
@@ -60,6 +60,8 @@ export class AssignmentComponent implements OnInit, OnDestroy, OnChanges {
60
60
  cancelAssignment: any;
61
61
  cancelCreateStageAssignment: any;
62
62
  showPage: any;
63
+ approveCase: any;
64
+ rejectCase: any;
63
65
 
64
66
  // itemKey: string = ""; // JA - this is what Nebula/Constellation uses to pass to finishAssignment, navigateToStep
65
67
 
@@ -205,6 +207,8 @@ export class AssignmentComponent implements OnInit, OnDestroy, OnChanges {
205
207
  this.showPage = actionsAPI.showPage.bind(actionsAPI);
206
208
 
207
209
  this.cancelCreateStageAssignment = actionsAPI.cancelCreateStageAssignment.bind(actionsAPI);
210
+ this.approveCase = actionsAPI.approveCase?.bind(actionsAPI);
211
+ this.rejectCase = actionsAPI.rejectCase?.bind(actionsAPI);
208
212
 
209
213
  this.createButtons();
210
214
  }
@@ -411,11 +415,23 @@ export class AssignmentComponent implements OnInit, OnDestroy, OnChanges {
411
415
  }
412
416
  break;
413
417
 
418
+ case 'rejectCase': {
419
+ const rejectPromise = this.rejectCase(this.itemKey$);
420
+
421
+ rejectPromise
422
+ .then(() => {})
423
+ .catch(() => {
424
+ this.psService.sendMessage(false);
425
+ this.snackBar.open(`${this.localizedVal('Rejection failed!', this.localeCategory)}`, 'Ok');
426
+ });
427
+
428
+ break;
429
+ }
430
+
414
431
  default:
415
432
  break;
416
433
  }
417
434
  } else if (sButtonType == 'primary') {
418
- // eslint-disable-next-line sonarjs/no-small-switch
419
435
  switch (sAction) {
420
436
  case 'finishAssignment':
421
437
  this.erService.sendMessage('publish', '');
@@ -437,6 +453,19 @@ export class AssignmentComponent implements OnInit, OnDestroy, OnChanges {
437
453
  this.erService.sendMessage('show', this.localizedVal('Please fix errors on form.', this.localeCategory));
438
454
  }
439
455
  break;
456
+
457
+ case 'approveCase': {
458
+ const approvePromise = this.approveCase(this.itemKey$);
459
+
460
+ approvePromise
461
+ .then(() => {})
462
+ .catch(() => {
463
+ this.psService.sendMessage(false);
464
+ this.snackBar.open(`${this.localizedVal('Approve failed!', this.localeCategory)}`, 'Ok');
465
+ });
466
+
467
+ break;
468
+ }
440
469
  default:
441
470
  break;
442
471
  }
@@ -54,7 +54,7 @@
54
54
  <span>{{ i + 1 }}</span>
55
55
  </div>
56
56
  </div>
57
- <div class="{{ _getHLabelClass(mainStep.visited_status) }}">
57
+ <div id="multi-step-label" class="{{ _getHLabelClass(mainStep.visited_status) }}">
58
58
  <div class="psdk-horizontal-step-text-label">
59
59
  {{ mainStep.name }}
60
60
  </div>
@@ -39,7 +39,7 @@
39
39
  </div>
40
40
  <div class="psdk-nav-divider"></div>
41
41
  <div>
42
- <mat-list>
42
+ <mat-list id="profile">
43
43
  <mat-list-item [matMenuTriggerFor]="menu" class="psdk-profile-list-item">
44
44
  <div class="flex-box">
45
45
  <div class="psdk-nav-oper-avatar">{{ portalOperatorInitials$ }}</div>
@@ -165,7 +165,9 @@ export class NavbarComponent implements OnInit, OnDestroy {
165
165
  containerName: 'primary',
166
166
  flowType: sFlowType || 'pyStartCase'
167
167
  };
168
- this.createWork(sCaseType, actionInfo);
168
+ this.createWork(sCaseType, actionInfo).then(() => {
169
+ console.log('createWork completed');
170
+ });
169
171
  }
170
172
 
171
173
  navPanelLogoutClick() {
@@ -9,7 +9,7 @@
9
9
  <div id="current-caseID" [hidden]="true">{{ currentCaseID }}</div>
10
10
  <div class="psdk-case-view-heading-id" id="caseId">{{ id$ }}</div>
11
11
  <div>
12
- <h1>{{ heading$ }}</h1>
12
+ <h1 id="case-name">{{ heading$ }}</h1>
13
13
  </div>
14
14
  </div>
15
15
  </mat-toolbar-row>
@@ -169,7 +169,7 @@ export class ListViewComponent implements OnInit, OnDestroy {
169
169
  /** If compositeKeys is defined, use dynamic value, else fallback to pyID or pyGUID. */
170
170
  this.compositeKeys = this.configProps$?.compositeKeys;
171
171
  this.rowID = this.compositeKeys && this.compositeKeys?.length === 1 ? this.compositeKeys[0] : defRowID;
172
- this.bShowSearch$ = this.utils.getBooleanValue(this.configProps$.globalSearch ? this.configProps$.globalSearch : this.payload?.globalSearch);
172
+ this.bShowSearch$ = this.utils.getBooleanValue(this.configProps$.globalSearch ? this.configProps$.globalSearch : this.payload.globalSearch);
173
173
  this.bColumnReorder$ = this.utils.getBooleanValue(this.configProps$.reorderFields);
174
174
  this.bGrouping$ = this.utils.getBooleanValue(this.configProps$.grouping);
175
175
  this.showDynamicFields = this.configProps$?.showDynamicFields;
@@ -46,7 +46,7 @@ export class CaseHistoryComponent implements OnInit {
46
46
  this.fields$ = [
47
47
  { label: this.pConn$.getLocalizedValue('Date', '', ''), type: 'DateTime', fieldName: 'pxTimeCreated' },
48
48
  { label: this.pConn$.getLocalizedValue('Description', '', ''), type: 'TextInput', fieldName: 'pyMessageKey' },
49
- { label: this.pConn$.getLocalizedValue('User', '', ''), type: 'TextInput', fieldName: 'pyPerformer' }
49
+ { label: this.pConn$.getLocalizedValue('Performed by', '', ''), type: 'TextInput', fieldName: 'pyPerformer' }
50
50
  ];
51
51
 
52
52
  const tableDataResults = this.updateData(historyJSON.data.data, this.fields$);
@@ -41,7 +41,7 @@
41
41
 
42
42
  <div *ngIf="bShowLinkModal$" class="psdk-dialog-background">
43
43
  <div class="psdk-modal-link-top">
44
- <h3>{{ pConn$.getLocalizedValue('Add local link', '', '') }}</h3>
44
+ <h3>{{ pConn$.getLocalizedValue('Add links', '', '') }}</h3>
45
45
  <div class="psdk-modal-link-entry">
46
46
  <div class="psdk-modal-body">
47
47
  <div class="psdk-modal-links-row">
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
 
63
63
  <div class="psdk-modal-link-add">
64
- <button mat-raised-button color="primary" (click)="_addLink()">{{ pConn$.getLocalizedValue('Add Link', '', '') }}</button>
64
+ <button mat-raised-button color="primary" (click)="_addLink()">{{ pConn$.getLocalizedValue('Add link', '', '') }}</button>
65
65
  </div>
66
66
  </div>
67
67
 
@@ -64,18 +64,7 @@ export class FileUtilityComponent implements OnInit, OnDestroy {
64
64
 
65
65
  currentCaseID = '';
66
66
 
67
- addAttachmentsActions: any[] = [
68
- {
69
- text: 'Add files',
70
- id: 'addNewFiles',
71
- onClick: () => this.createModal('addLocalFile')
72
- },
73
- {
74
- text: 'Add links',
75
- id: 'addNewLinks',
76
- onClick: () => this.createModal('addLocalLink')
77
- }
78
- ];
67
+ addAttachmentsActions: any;
79
68
 
80
69
  constructor(
81
70
  private angularPConnect: AngularPConnectService,
@@ -93,7 +82,18 @@ export class FileUtilityComponent implements OnInit, OnDestroy {
93
82
  this.lu_icon$ = 'paper-clip';
94
83
 
95
84
  this.closeSvgIcon$ = this.utils.getImageSrc('times', this.utils.getSDKStaticContentUrl());
96
-
85
+ this.addAttachmentsActions = [
86
+ {
87
+ text: this.pConn$.getLocalizedValue('Add files', '', ''),
88
+ id: 'addNewFiles',
89
+ onClick: () => this.createModal('addLocalFile')
90
+ },
91
+ {
92
+ text: this.pConn$.getLocalizedValue('Add links', '', ''),
93
+ id: 'addNewLinks',
94
+ onClick: () => this.createModal('addLocalLink')
95
+ }
96
+ ];
97
97
  // const onViewAllCallback = () => this.onViewAll(this.arFullListAttachments);
98
98
 
99
99
  this.lu_onViewAllFunction = { onClick: this.onViewAll.bind(this) };
@@ -8,7 +8,7 @@
8
8
  <div class="psdk-utility-count" id="attachments-count">{{ count$ }}</div>
9
9
  <div style="flex-grow: 1"></div>
10
10
  <div class="header-icon">
11
- <button mat-icon-button [matMenuTriggerFor]="utilityMenu">
11
+ <button id="file-menu" mat-icon-button [matMenuTriggerFor]="utilityMenu">
12
12
  <img class="psdk-utility-card-actions-svg-icon" src="{{ settingsSvgIcon$ }}" />
13
13
  </button>
14
14
  <mat-menu #utilityMenu="matMenu" overlapTrigger="false">
@@ -15,7 +15,7 @@
15
15
  <div class="psdk-todo-assignment-title">{{ getAssignmentName(assignment) }}</div>
16
16
  <div class="psdk-todo-assignment-data">
17
17
  <div class="psdk-todo-assignment-task">
18
- Task in
18
+ {{ localizedVal('Task in', localeCategory) }}
19
19
  <button class="psdk-todo-id" style="cursor: pointer" (click)="clickGo(assignment)">
20
20
  {{ assignment.name }} {{ getID(assignment) }}
21
21
  </button>
@@ -37,11 +37,11 @@
37
37
 
38
38
  <div *ngIf="assignmentCount$ > 3">
39
39
  <div *ngIf="bShowMore$; else showLess" class="psdk-todo-show-more">
40
- <button mat-stroked-button (click)="_showMore()">Show more</button>
40
+ <button mat-stroked-button (click)="_showMore()">{{ showMoreLocalizedValue === 'show_more' ? 'Show more' : showMoreLocalizedValue }}</button>
41
41
  </div>
42
42
  <ng-template #showLess>
43
43
  <div class="psdk-todo-show-more">
44
- <button mat-stroked-button (click)="_showLess()">Show less</button>
44
+ <button mat-stroked-button (click)="_showLess()">{{ showlessLocalizedValue === 'show_less' ? 'Show less' : showlessLocalizedValue }}</button>
45
45
  </div>
46
46
  </ng-template>
47
47
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pega/angular-sdk-overrides",
3
- "version": "0.24.1",
3
+ "version": "0.24.2",
4
4
  "description": "Angular SDK - Code for overriding components",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"