@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.
- package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.html +1 -1
- package/lib/field/currency/currency.component.html +4 -4
- package/lib/field/currency/currency.component.ts +31 -19
- package/lib/field/date-time/date-time.component.html +5 -5
- package/lib/field/date-time/date-time.component.ts +8 -39
- package/lib/field/decimal/decimal.component.html +13 -4
- package/lib/field/decimal/decimal.component.ts +41 -5
- package/lib/field/multiselect/utils.ts +1 -1
- package/lib/field/percentage/percentage.component.html +4 -3
- package/lib/field/percentage/percentage.component.ts +24 -5
- package/lib/field/user-reference/user-reference.component.html +50 -45
- package/lib/field/user-reference/user-reference.component.ts +33 -15
- package/lib/infra/Containers/flow-container/flow-container.component.ts +15 -9
- package/lib/infra/Containers/view-container/view-container.component.ts +6 -7
- package/lib/infra/assignment/assignment.component.ts +30 -1
- package/lib/infra/multi-step/multi-step.component.html +1 -1
- package/lib/infra/navbar/navbar.component.html +1 -1
- package/lib/infra/navbar/navbar.component.ts +3 -1
- package/lib/template/case-view/case-view.component.html +1 -1
- package/lib/template/list-view/list-view.component.ts +1 -1
- package/lib/widget/case-history/case-history.component.ts +1 -1
- package/lib/widget/file-utility/file-utility.component.html +2 -2
- package/lib/widget/file-utility/file-utility.component.ts +13 -13
- package/lib/widget/list-utility/list-utility.component.html +1 -1
- package/lib/widget/todo/todo.component.html +3 -3
- package/package.json +1 -1
package/lib/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.html
CHANGED
|
@@ -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="
|
|
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
|
-
[
|
|
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$:
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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(
|
|
21
|
-
<
|
|
22
|
-
<mat-error *ngIf="fieldControl
|
|
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
|
-
|
|
54
|
-
|
|
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
|
-
|
|
206
|
-
|
|
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
|
|
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="
|
|
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
|
-
|
|
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
|
-
[
|
|
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 {
|
|
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
|
-
|
|
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$:
|
|
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
|
-
|
|
167
|
-
|
|
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
|
|
|
@@ -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>% </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
|
-
[
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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="
|
|
3
|
-
<component-mapper name="
|
|
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
|
-
|
|
162
|
-
.invokeRestApi('getListData', { queryPayload } as any, '') // 3rd arg empty string until typedef marked correctly
|
|
163
|
-
|
|
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
|
-
|
|
171
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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() {
|
|
@@ -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
|
|
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('
|
|
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
|
|
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
|
|
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>
|