@rangertechnologies/ngnxt 2.1.105 → 2.1.106
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/package.json +5 -1
- package/esm2022/lib/ar.i18n.mjs +0 -29
- package/esm2022/lib/components/button/nxt-button.component.mjs +0 -130
- package/esm2022/lib/components/custom-button/custom-button.component.mjs +0 -39
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -366
- package/esm2022/lib/components/custom-date/custom-date.component.mjs +0 -47
- package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +0 -48
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -219
- package/esm2022/lib/components/custom-image/custom-image.component.mjs +0 -34
- package/esm2022/lib/components/custom-input/custom-input.component.mjs +0 -93
- package/esm2022/lib/components/custom-label/custom-label.component.mjs +0 -21
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -48
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -115
- package/esm2022/lib/components/custom-rich-text/custom-rich-text.component.mjs +0 -186
- package/esm2022/lib/components/custom-table/custom-table.component.mjs +0 -347
- package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +0 -65
- package/esm2022/lib/components/custom-time/custom-time.component.mjs +0 -61
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -801
- package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +0 -42
- package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +0 -39
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -279
- package/esm2022/lib/components/file-view/file-view.component.mjs +0 -46
- package/esm2022/lib/components/loader/loader.component.mjs +0 -23
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -100
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -216
- package/esm2022/lib/components/search-box/search-box.component.mjs +0 -202
- package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +0 -123
- package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +0 -19
- package/esm2022/lib/en.i18n.mjs +0 -29
- package/esm2022/lib/i18n-config.service.mjs +0 -4
- package/esm2022/lib/i18n.component.mjs +0 -47
- package/esm2022/lib/i18n.module.mjs +0 -38
- package/esm2022/lib/i18n.pipe.mjs +0 -25
- package/esm2022/lib/i18n.service.mjs +0 -56
- package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
- package/esm2022/lib/interfaces/apimeta.mjs +0 -2
- package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
- package/esm2022/lib/model/bookletWrapper.mjs +0 -9
- package/esm2022/lib/model/changeWrapper.mjs +0 -11
- package/esm2022/lib/model/errorWrapper.mjs +0 -6
- package/esm2022/lib/model/tableWrapper.mjs +0 -20
- package/esm2022/lib/nxt-app.component.mjs +0 -22
- package/esm2022/lib/nxt-app.module.mjs +0 -399
- package/esm2022/lib/nxt-app.service.mjs +0 -14
- package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -541
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -193
- package/esm2022/lib/pages/builder/form/form.component.mjs +0 -34
- package/esm2022/lib/pages/builder/menu/menu.component.mjs +0 -28
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -476
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -458
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2387
- package/esm2022/lib/pages/summary-page/summary-page.component.mjs +0 -76
- package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
- package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
- package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
- package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
- package/esm2022/lib/pipe/get-value.pipe.mjs +0 -50
- package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
- package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
- package/esm2022/lib/sample.mjs +0 -3715
- package/esm2022/lib/services/change.service.mjs +0 -53
- package/esm2022/lib/services/data.service.mjs +0 -80
- package/esm2022/lib/services/form-builder.service.mjs +0 -160
- package/esm2022/lib/services/salesforce.service.mjs +0 -46
- package/esm2022/lib/services/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage.service.mjs +0 -44
- package/esm2022/lib/tam.i18n.mjs +0 -29
- package/esm2022/lib/wrapper.mjs +0 -175
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
- package/fesm2022/rangertechnologies-ngnxt.mjs +0 -12866
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/ar.i18n.d.ts +0 -24
- package/lib/components/button/nxt-button.component.d.ts +0 -38
- package/lib/components/custom-button/custom-button.component.d.ts +0 -16
- package/lib/components/custom-calendar/custom-calendar.component.d.ts +0 -65
- package/lib/components/custom-date/custom-date.component.d.ts +0 -18
- package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +0 -19
- package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +0 -39
- package/lib/components/custom-image/custom-image.component.d.ts +0 -13
- package/lib/components/custom-input/custom-input.component.d.ts +0 -31
- package/lib/components/custom-label/custom-label.component.d.ts +0 -10
- package/lib/components/custom-model/custom-model.component.d.ts +0 -19
- package/lib/components/custom-radio/custom-radio.component.d.ts +0 -33
- package/lib/components/custom-rich-text/custom-rich-text.component.d.ts +0 -29
- package/lib/components/custom-table/custom-table.component.d.ts +0 -65
- package/lib/components/custom-text-area/custom-text-area.component.d.ts +0 -22
- package/lib/components/custom-time/custom-time.component.d.ts +0 -18
- package/lib/components/datatable/datatable.component.d.ts +0 -126
- package/lib/components/dependent-table/dependent-table.component.d.ts +0 -15
- package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +0 -16
- package/lib/components/file-upload/file-upload.component.d.ts +0 -47
- package/lib/components/file-view/file-view.component.d.ts +0 -16
- package/lib/components/loader/loader.component.d.ts +0 -11
- package/lib/components/pagination/pagination.component.d.ts +0 -36
- package/lib/components/pick-location/pick-location.component.d.ts +0 -44
- package/lib/components/search-box/search-box.component.d.ts +0 -43
- package/lib/components/table-appendix/table-appendix.component.d.ts +0 -30
- package/lib/directives/componenthost/componenthost.directive.d.ts +0 -8
- package/lib/en.i18n.d.ts +0 -24
- package/lib/i18n-config.service.d.ts +0 -2
- package/lib/i18n.component.d.ts +0 -11
- package/lib/i18n.module.d.ts +0 -9
- package/lib/i18n.pipe.d.ts +0 -10
- package/lib/i18n.service.d.ts +0 -14
- package/lib/interfaces/actionMeta.d.ts +0 -5
- package/lib/interfaces/apimeta.d.ts +0 -15
- package/lib/interfaces/dependencyMeta.d.ts +0 -8
- package/lib/model/bookletWrapper.d.ts +0 -5
- package/lib/model/changeWrapper.d.ts +0 -10
- package/lib/model/errorWrapper.d.ts +0 -5
- package/lib/model/tableWrapper.d.ts +0 -18
- package/lib/nxt-app.component.d.ts +0 -8
- package/lib/nxt-app.module.d.ts +0 -52
- package/lib/nxt-app.service.d.ts +0 -6
- package/lib/pages/booklet/booklet.component.d.ts +0 -68
- package/lib/pages/builder/element/element.component.d.ts +0 -33
- package/lib/pages/builder/form/form.component.d.ts +0 -11
- package/lib/pages/builder/menu/menu.component.d.ts +0 -10
- package/lib/pages/builder/properties/properties.component.d.ts +0 -551
- package/lib/pages/questionbook/questionbook.component.d.ts +0 -68
- package/lib/pages/questionnaire/questionnaire.component.d.ts +0 -220
- package/lib/pages/summary-page/summary-page.component.d.ts +0 -20
- package/lib/pipe/date/date.pipe.d.ts +0 -7
- package/lib/pipe/editColumnCheck/edit-column-check.pipe.d.ts +0 -7
- package/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.d.ts +0 -7
- package/lib/pipe/editColumnType/edit-column-type.pipe.d.ts +0 -7
- package/lib/pipe/get-value.pipe.d.ts +0 -7
- package/lib/pipe/search-filter/search-filter.pipe.d.ts +0 -8
- package/lib/pipe/time/time.pipe.d.ts +0 -7
- package/lib/sample.d.ts +0 -11
- package/lib/services/change.service.d.ts +0 -22
- package/lib/services/data.service.d.ts +0 -13
- package/lib/services/form-builder.service.d.ts +0 -75
- package/lib/services/salesforce.service.d.ts +0 -11
- package/lib/services/shared.service.d.ts +0 -15
- package/lib/services/storage.service.d.ts +0 -13
- package/lib/tam.i18n.d.ts +0 -24
- package/lib/wrapper.d.ts +0 -203
- package/public-api.d.ts +0 -15
- package/rangertechnologies-ngnxt-2.1.105.tgz +0 -0
- package/src/lib/style.css +0 -1817
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../services/change.service";
|
|
4
|
-
import * as i2 from "../../i18n.service";
|
|
5
|
-
import * as i3 from "../../services/salesforce.service";
|
|
6
|
-
import * as i4 from "../../services/data.service";
|
|
7
|
-
import * as i5 from "@angular/common";
|
|
8
|
-
import * as i6 from "@angular/forms";
|
|
9
|
-
import * as i7 from "../../pipe/get-value.pipe";
|
|
10
|
-
export class CustomTableComponent {
|
|
11
|
-
changeService;
|
|
12
|
-
i18nService;
|
|
13
|
-
sfService;
|
|
14
|
-
dataService;
|
|
15
|
-
question;
|
|
16
|
-
valueChange = new EventEmitter();
|
|
17
|
-
saveTableData = new EventEmitter();
|
|
18
|
-
tableInfo;
|
|
19
|
-
tableHeader = [];
|
|
20
|
-
tableData = [];
|
|
21
|
-
filteredData = []; // New property for filtered data
|
|
22
|
-
//RS 03FEB2025
|
|
23
|
-
// Default UI configurations to control row addition, pagination, actions column visibility, search functionality, and the number of items per page.
|
|
24
|
-
showAddRow = true;
|
|
25
|
-
showPagination = true;
|
|
26
|
-
showActions = true;
|
|
27
|
-
showSearch = true;
|
|
28
|
-
itemsPerPage = 5;
|
|
29
|
-
addRowColSpan;
|
|
30
|
-
tableSize; // HA 28DEC23 table size declaration
|
|
31
|
-
objName;
|
|
32
|
-
filterLogic;
|
|
33
|
-
fieldMeta;
|
|
34
|
-
firStr;
|
|
35
|
-
searchBox = false;
|
|
36
|
-
apiMeta;
|
|
37
|
-
options;
|
|
38
|
-
isDisabled = true;
|
|
39
|
-
subscription;
|
|
40
|
-
labelField;
|
|
41
|
-
//RS 03FEB2025
|
|
42
|
-
// New properties for search and pagination
|
|
43
|
-
searchTerm = '';
|
|
44
|
-
currentPage = 1;
|
|
45
|
-
totalItems = 0;
|
|
46
|
-
pages = [];
|
|
47
|
-
Math = Math;
|
|
48
|
-
constructor(changeService, i18nService, sfService, dataService) {
|
|
49
|
-
this.changeService = changeService;
|
|
50
|
-
this.i18nService = i18nService;
|
|
51
|
-
this.sfService = sfService;
|
|
52
|
-
this.dataService = dataService;
|
|
53
|
-
}
|
|
54
|
-
// RS 09DEC24 Changed keys
|
|
55
|
-
// Add new properties for save functionality
|
|
56
|
-
hasUnsavedChanges = false;
|
|
57
|
-
savedData = [];
|
|
58
|
-
ngOnInit() {
|
|
59
|
-
// this.tableData = [];
|
|
60
|
-
// Clear any existing data first
|
|
61
|
-
this.resetComponentState();
|
|
62
|
-
setTimeout(() => console.log('After reset:', this.tableData), 2000);
|
|
63
|
-
try {
|
|
64
|
-
const parsedMeta = JSON.parse(this.question['fieldsMeta']);
|
|
65
|
-
if (!parsedMeta || !Array.isArray(parsedMeta) || parsedMeta.length === 0) {
|
|
66
|
-
console.warn('No valid metadata provided');
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
//RS 03FEB2025
|
|
70
|
-
// Extracts table configuration settings dynamically from metadata and applies them, ensuring flexibility in UI customization
|
|
71
|
-
if (parsedMeta[0]?.tableConfig) {
|
|
72
|
-
const config = parsedMeta[0].tableConfig;
|
|
73
|
-
this.showAddRow = config.showAddRow !== false;
|
|
74
|
-
this.showPagination = config.showPagination !== false;
|
|
75
|
-
this.showActions = config.showActions !== false;
|
|
76
|
-
this.showSearch = config.showSearch !== false;
|
|
77
|
-
this.itemsPerPage = config.itemsPerPage || 5;
|
|
78
|
-
// Remove the config object from headers
|
|
79
|
-
this.tableHeader = parsedMeta.slice(1);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// If no config object found, use all objects as headers
|
|
83
|
-
this.tableHeader = parsedMeta;
|
|
84
|
-
}
|
|
85
|
-
// this.tableHeader = JSON.parse(this.question['fieldsMeta']);
|
|
86
|
-
this.tableSize = 10 / this.tableHeader.length;
|
|
87
|
-
// 12JUN24 - default table value
|
|
88
|
-
if (this.question?.input) {
|
|
89
|
-
this.tableData = this.question?.input;
|
|
90
|
-
this.filteredData = [...this.tableData];
|
|
91
|
-
this.updatePagination();
|
|
92
|
-
}
|
|
93
|
-
if (this.apiMeta !== undefined) {
|
|
94
|
-
this.options = [];
|
|
95
|
-
let apiObj = JSON.parse(this.apiMeta);
|
|
96
|
-
this.labelField = apiObj.field;
|
|
97
|
-
if (apiObj.endpoint) {
|
|
98
|
-
this.dataService.apiResponse(apiObj.endpoint)?.subscribe((apiResponse) => {
|
|
99
|
-
let responses;
|
|
100
|
-
if (apiObj.variable) {
|
|
101
|
-
// VD 22May24 - handling multiple child objects
|
|
102
|
-
responses = this.dataService.getValue(apiResponse, apiObj.variable);
|
|
103
|
-
let results = [];
|
|
104
|
-
// HA 19JAN24 To avoid undefined error in console
|
|
105
|
-
for (let i = 0; i < responses?.length; i++) {
|
|
106
|
-
var resp = responses[i];
|
|
107
|
-
results.push(resp);
|
|
108
|
-
}
|
|
109
|
-
this.options = results;
|
|
110
|
-
}
|
|
111
|
-
else { // VD 19JAN24 - if response has value(which is array) only
|
|
112
|
-
responses = apiResponse;
|
|
113
|
-
this.options = responses;
|
|
114
|
-
}
|
|
115
|
-
this.options = this.options.map((obj) => ({ ...obj, edit: false }));
|
|
116
|
-
// Reference https://www.npmjs.com/package/@ng-select/ng-select
|
|
117
|
-
this.tableData = this.options;
|
|
118
|
-
console.log('tableData', this.tableData);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
// VD NOV23 - handle the dependent update for dropdown
|
|
122
|
-
let sourceId = apiObj.sourceQuestionId;
|
|
123
|
-
let field = apiObj.field; // VD 13MAY24 - dynamic field changes
|
|
124
|
-
if (sourceId) {
|
|
125
|
-
// // VD 10May24 Subscribe for the changes
|
|
126
|
-
this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
|
|
127
|
-
if (changeValue != undefined) {
|
|
128
|
-
if (changeValue.valueObj != undefined && changeValue.fromQuestionId == apiObj.sourceQuestionId) {
|
|
129
|
-
console.log('changes happen');
|
|
130
|
-
this.options = this.options.map((obj) => ({ ...obj, edit: false }));
|
|
131
|
-
let item = changeValue.valueObj;
|
|
132
|
-
let validItem = true;
|
|
133
|
-
// VD 13MAY24 - bind dynamic field
|
|
134
|
-
if (this.tableData.length > 0) {
|
|
135
|
-
this.tableData.forEach(element => {
|
|
136
|
-
// VD 26Jun24 - to handle multiple objects
|
|
137
|
-
const objElementValue = this.dataService.getValue(element, field);
|
|
138
|
-
const objItemValue = this.dataService.getValue(item, field);
|
|
139
|
-
if (objElementValue == objItemValue) {
|
|
140
|
-
validItem = false;
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
// if(validItem){
|
|
145
|
-
// if(this.tableData.length > 0){
|
|
146
|
-
// this.tableData = [...this.tableData,item];
|
|
147
|
-
// this.emitTableDataValue(this.tableData);
|
|
148
|
-
// }else {
|
|
149
|
-
// this.tableData.push(item);
|
|
150
|
-
// this.emitTableDataValue(this.tableData);
|
|
151
|
-
// }
|
|
152
|
-
// }
|
|
153
|
-
//RS 14FEB2025
|
|
154
|
-
//Update Pagination before emit
|
|
155
|
-
if (validItem) {
|
|
156
|
-
if (this.tableData.length > 0) {
|
|
157
|
-
this.tableData = [...this.tableData, item];
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this.tableData.push(item);
|
|
161
|
-
}
|
|
162
|
-
// Update filteredData and pagination
|
|
163
|
-
this.filteredData = [...this.tableData];
|
|
164
|
-
this.updatePagination();
|
|
165
|
-
this.emitTableDataValue(this.tableData);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
this.changeService.confirmChange(apiObj.sourceQuestionId);
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
this.updatePagination();
|
|
174
|
-
//RS 03FEB2025
|
|
175
|
-
//Handles errors during metadata parsing by setting default values to ensure the table functions properly
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
console.error('Error parsing fieldsMeta:', error);
|
|
179
|
-
this.showAddRow = true;
|
|
180
|
-
this.showPagination = true;
|
|
181
|
-
this.showActions = true;
|
|
182
|
-
this.showSearch = true;
|
|
183
|
-
this.itemsPerPage = 5;
|
|
184
|
-
}
|
|
185
|
-
//RS 03FEB2025
|
|
186
|
-
// Initialize saved data
|
|
187
|
-
if (this.question?.input) {
|
|
188
|
-
this.savedData = JSON.parse(JSON.stringify(this.question.input));
|
|
189
|
-
}
|
|
190
|
-
console.log('tableData', this.tableData);
|
|
191
|
-
console.log('tableHeader', this.tableHeader);
|
|
192
|
-
console.log('tableInfo', this.tableInfo);
|
|
193
|
-
}
|
|
194
|
-
//RS 03FEB2025
|
|
195
|
-
// → Filters table data based on user input and updates pagination accordingly.
|
|
196
|
-
search() {
|
|
197
|
-
if (!this.searchTerm.trim()) {
|
|
198
|
-
this.filteredData = [...this.tableData];
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
const searchTermLower = this.searchTerm.toLowerCase();
|
|
202
|
-
this.filteredData = this.tableData.filter(item => {
|
|
203
|
-
return this.tableHeader.some(header => {
|
|
204
|
-
const value = this.dataService.getValue(item, header.apiName);
|
|
205
|
-
return value && value.toString().toLowerCase().includes(searchTermLower);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
this.currentPage = 1;
|
|
210
|
-
this.updatePagination();
|
|
211
|
-
}
|
|
212
|
-
//RS 03FEB2025
|
|
213
|
-
// Calculates total pages, updates the page list, and ensures the current page is within valid bounds.
|
|
214
|
-
updatePagination() {
|
|
215
|
-
this.totalItems = this.filteredData.length;
|
|
216
|
-
const totalPages = Math.ceil(this.totalItems / this.itemsPerPage);
|
|
217
|
-
this.pages = Array.from({ length: totalPages }, (_, i) => i + 1);
|
|
218
|
-
if (this.currentPage > totalPages) {
|
|
219
|
-
this.currentPage = totalPages || 1;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
//RS 03FEB2025
|
|
223
|
-
//Returns a paginated subset of filteredData based on the current page and items per page
|
|
224
|
-
get paginatedData() {
|
|
225
|
-
const startIndex = (this.currentPage - 1) * this.itemsPerPage;
|
|
226
|
-
return this.filteredData.slice(startIndex, startIndex + this.itemsPerPage);
|
|
227
|
-
}
|
|
228
|
-
//RS 03FEB2025
|
|
229
|
-
//Updates currentPage when the user selects a different page
|
|
230
|
-
setPage(page) {
|
|
231
|
-
if (page >= 1 && page <= this.pages.length) {
|
|
232
|
-
this.currentPage = page;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
//RS 03FEB2025
|
|
236
|
-
//Resets table data, filters, pagination, UI settings, and unsubscribes from any subscriptions.
|
|
237
|
-
resetComponentState() {
|
|
238
|
-
this.tableData = [];
|
|
239
|
-
this.filteredData = [];
|
|
240
|
-
this.tableHeader = [];
|
|
241
|
-
this.options = [];
|
|
242
|
-
this.searchTerm = '';
|
|
243
|
-
this.currentPage = 1;
|
|
244
|
-
this.showAddRow = true;
|
|
245
|
-
this.showPagination = true;
|
|
246
|
-
this.showActions = true;
|
|
247
|
-
this.showSearch = true;
|
|
248
|
-
this.itemsPerPage = 5;
|
|
249
|
-
if (this.subscription) {
|
|
250
|
-
this.subscription.unsubscribe();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
addRow() {
|
|
254
|
-
let newItem = {};
|
|
255
|
-
this.tableHeader.forEach(item => {
|
|
256
|
-
if (item.apiName) {
|
|
257
|
-
newItem[item.apiName] = "";
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
// const updatedTableData = [...this.tableData, newItem];
|
|
261
|
-
// this.tableData = updatedTableData;
|
|
262
|
-
// this.emitTableDataValue(updatedTableData);
|
|
263
|
-
this.tableData.push(newItem);
|
|
264
|
-
this.filteredData = [...this.tableData];
|
|
265
|
-
this.updatePagination();
|
|
266
|
-
this.hasUnsavedChanges = true;
|
|
267
|
-
this.emitTableDataValue(this.tableData);
|
|
268
|
-
}
|
|
269
|
-
updateRadio(item, value) {
|
|
270
|
-
item.value = value;
|
|
271
|
-
this.emitTableDataValue(this.tableData);
|
|
272
|
-
}
|
|
273
|
-
// VD 23Aug24 handle Type
|
|
274
|
-
// updateLabel(rowIndex: number, label: string, value: any): void {
|
|
275
|
-
// this.tableData[rowIndex][label] = value;
|
|
276
|
-
// this.emitTableDataValue(this.tableData);
|
|
277
|
-
// }
|
|
278
|
-
// Modified update methods to track changes
|
|
279
|
-
updateLabel(rowIndex, label, value) {
|
|
280
|
-
this.tableData[rowIndex][label] = value;
|
|
281
|
-
this.hasUnsavedChanges = true;
|
|
282
|
-
this.emitTableDataValue(this.tableData);
|
|
283
|
-
}
|
|
284
|
-
//RS 03FEB2025
|
|
285
|
-
deleteRow(rowIndex) {
|
|
286
|
-
// this.tableData.splice(rowIndex, 1);
|
|
287
|
-
const actualIndex = (this.currentPage - 1) * this.itemsPerPage + rowIndex;
|
|
288
|
-
this.tableData.splice(actualIndex, 1);
|
|
289
|
-
this.filteredData = [...this.tableData];
|
|
290
|
-
this.updatePagination();
|
|
291
|
-
this.hasUnsavedChanges = true;
|
|
292
|
-
this.emitTableDataValue(this.tableData);
|
|
293
|
-
}
|
|
294
|
-
//RS 03FEB2025
|
|
295
|
-
// Saves the current table data state, resets the hasUnsavedChanges flag, and emits the updated data.
|
|
296
|
-
saveTable() {
|
|
297
|
-
this.savedData = JSON.parse(JSON.stringify(this.tableData));
|
|
298
|
-
this.hasUnsavedChanges = false;
|
|
299
|
-
this.saveTableData.emit(this.tableData);
|
|
300
|
-
}
|
|
301
|
-
//RS 03FEB2025
|
|
302
|
-
// Restores the last saved state of the table and resets the pagination and UI state
|
|
303
|
-
revertChanges() {
|
|
304
|
-
this.tableData = JSON.parse(JSON.stringify(this.savedData));
|
|
305
|
-
this.filteredData = [...this.tableData];
|
|
306
|
-
this.hasUnsavedChanges = false;
|
|
307
|
-
this.updatePagination();
|
|
308
|
-
this.emitTableDataValue(this.tableData);
|
|
309
|
-
}
|
|
310
|
-
editRow(rowIndex) {
|
|
311
|
-
var a = 0;
|
|
312
|
-
this.tableData.forEach(element => {
|
|
313
|
-
if (a === rowIndex) {
|
|
314
|
-
element.edit = true;
|
|
315
|
-
}
|
|
316
|
-
a++;
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
updateNumber(item, label, value) {
|
|
320
|
-
item.value[label] = value;
|
|
321
|
-
this.emitTableDataValue(this.tableData);
|
|
322
|
-
}
|
|
323
|
-
emitTableDataValue(updatedTableData) {
|
|
324
|
-
this.valueChange.emit(updatedTableData);
|
|
325
|
-
}
|
|
326
|
-
//RS 03FEB2025
|
|
327
|
-
// Cleans up resources and resets the component state when the component is destroyed to prevent memory leaks
|
|
328
|
-
ngOnDestroy() {
|
|
329
|
-
this.resetComponentState();
|
|
330
|
-
console.log('Component Destroyed');
|
|
331
|
-
}
|
|
332
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomTableComponent, deps: [{ token: i1.ChangeService }, { token: i2.I18nService }, { token: i3.SalesforceService }, { token: i4.DataService }], target: i0.ɵɵFactoryTarget.Component });
|
|
333
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomTableComponent, selector: "app-custom-table", inputs: { question: "question", apiMeta: "apiMeta" }, outputs: { valueChange: "valueChange", saveTableData: "saveTableData" }, ngImport: i0, template: "<!-- RS 03FEB2025 -->\n<!-- Search Bar -->\n<!-- Search, Revert & Save in Same Line -->\n<div class=\"d-flex align-items-center justify-content-between mb-3\">\n <!-- Search Bar -->\n <div class=\"search-container me-auto\">\n <div class=\"input-group\">\n <input \n type=\"text\" \n class=\"form-control search-input\"\n [(ngModel)]=\"searchTerm\"\n (input)=\"search()\"\n placeholder=\"Search...\"\n >\n <div class=\"search-icon\">\n <!-- RS 03FEB2025 -->\n <!-- Search icon for user input -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </div>\n </div>\n </div>\n\n <!-- Buttons -->\n <div>\n <!-- RS 03FEB2025 --><!-- Cancel button (visible only when changes are unsaved) -->\n <button \n class=\"btn btn-secondary me-2\" \n *ngIf=\"hasUnsavedChanges\" \n (click)=\"revertChanges()\"\n >\n Cancel\n </button>\n <!-- Save button (disabled if no unsaved changes) --><!-- RS 03FEB2025 -->\n <button \n class=\"btn btn-primary\" \n [disabled]=\"!hasUnsavedChanges\"\n (click)=\"saveTable()\"\n >\n Save Table\n </button>\n </div>\n</div>\n<!-- Table Container -->\n<div class=\"table-container\">\n <table class=\"table table-striped table-bordered\">\n <thead>\n <!-- HA 28DEC23 changed table header values and changed table size logic to evenly visible -->\n <!-- <th><input type=\"checkbox\" (change)=\"selectAll($event.target.checked)\"></th> -->\n <tr>\n <th *ngFor=\"let header of tableHeader\" [style.width]=\"header.width || 'auto'\">\n {{ header.label }}\n </th>\n <!-- Actions column (only if showActions is true) --><!-- RS 03FEB2025 -->\n <th *ngIf=\"showActions\" style=\"width: 140px\" class=\"actions-columns\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of paginatedData; let i = index\">\n <td *ngFor=\"let header of tableHeader\">\n <!-- Image with text input -->\n <ng-container *ngIf=\"header.fldType === 'imagetext'\">\n <div class=\"d-flex align-items-center\">\n <img [src]=\"item.imageSrc\" [alt]=\"item.altText\" style=\"width: 35px; height: 32px; margin-right: 5px;\">\n <input type=\"text\" \n [(ngModel)]=\"item[header.fieldName]\" \n (ngModelChange)=\"updateLabel(i, header.fieldName, item[header.fieldName])\" \n class=\"she-line-input table-input\">\n </div>\n </ng-container>\n\n <!-- Image only -->\n <ng-container *ngIf=\"header.fldType === 'image'\">\n <img [src]=\"item[header.fieldName]\" [alt]=\"item.altText\" style=\"width: 35px; height: 32px;\">\n </ng-container>\n <!--VD 23Aug24 handle readOnly -->\n <!-- Text input -->\n <ng-container *ngIf=\"header.fldType === 'Text'\">\n <input type=\"text\" \n [readonly]=\"header.readOnly\" \n [disabled]=\"!item.edit\" \n [ngClass]=\"{'editInput': item.edit && !header.readOnly}\"\n [ngModel]=\"'' | getValue: item : header.apiName\" \n (ngModelChange)=\"updateLabel(i, header.apiName,$event)\" \n class=\"she-line-input table-input\">\n </ng-container>\n <!--VD 23Aug24 handle Number Type -->\n <!-- Number input -->\n <!-- VD 26Jun24 - pipe change to handle multiple objects-->\n <ng-container *ngIf=\"header.fldType === 'Number'\">\n <input type=\"number\" \n [readonly]=\"header.readOnly\" \n [disabled]=\"!item.edit\" \n [ngClass]=\"{'editInput': item.edit && !header.readOnly}\"\n [ngModel]=\"'' | getValue: item : header.apiName\" \n (ngModelChange)=\"updateLabel(i, header.apiName,$event)\" \n class=\"she-line-input table-input\">\n </ng-container>\n\n <!-- Radio input -->\n <ng-container *ngIf=\"header.fldType === 'radio'\">\n <input type=\"radio\" \n [name]=\"item.name\" \n [checked]=\"item.value == header.fieldName\" \n (click)=\"updateRadio(item, header.fieldName)\">\n </ng-container>\n </td>\n <!-- Actions column --><!-- RS 03FEB2025 -->\n <td *ngIf=\"showActions\" class=\"actions-column\">\n <div class=\"d-flex justify-content-around\">\n <button class=\"btn btn-link p-0\" (click)=\"editRow(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#03A9F4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n <path d=\"m15 5 3 3\" />\n </svg>\n Edit\n </button>\n <button class=\"btn btn-link p-0\" (click)=\"deleteRow(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#F44336\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <path d=\"m10 11 1 6\" />\n <path d=\"m14 11-1 6\" />\n <path d=\"M4 6l1 14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2l1-14\" />\n </svg>\n \n Delete\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<!-- Pagination --><!-- RS 03FEB2025 -->\n<div *ngIf=\"showPagination\" class=\"pagination-container\">\n <div class=\"d-flex justify-content-end align-items-center\">\n <div class=\"items-per-page\">\n <span>Items per page:</span>\n <select [(ngModel)]=\"itemsPerPage\" (change)=\"updatePagination()\" class=\"form-select form-select-sm\">\n <option value=\"5\">5</option>\n <option value=\"10\">10</option>\n <option value=\"20\">20</option>\n <option value=\"50\">50</option>\n </select>\n </div>\n <div class=\"page-info ms-3 me-3\">\n {{((currentPage - 1) * itemsPerPage + 1)}} - {{Math.min(currentPage * itemsPerPage, totalItems)}} of {{totalItems}}\n </div>\n <nav aria-label=\"Table pagination\">\n <!-- First page --><!-- RS 03FEB2025 -->\n <ul class=\"pagination mb-0\">\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\n <a class=\"page-link\" (click)=\"setPage(1)\">\u00AB</a>\n </li>\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\n <a class=\"page-link\" (click)=\"setPage(currentPage - 1)\">\u2039</a>\n </li>\n <!-- Dynamic pagination --><!-- RS 03FEB2025 -->\n <li class=\"page-item\" *ngFor=\"let page of pages\" [class.active]=\"page === currentPage\">\n <a class=\"page-link\" (click)=\"setPage(page)\">{{page}}</a>\n </li>\n <li class=\"page-item\" [class.disabled]=\"currentPage === pages.length\">\n <a class=\"page-link\" (click)=\"setPage(currentPage + 1)\">\u203A</a>\n </li>\n <!-- Last page -->\n <li class=\"page-item\" [class.disabled]=\"currentPage === pages.length\">\n <a class=\"page-link\" (click)=\"setPage(pages.length)\">\u00BB</a>\n </li>\n </ul>\n </nav>\n </div>\n</div>\n<!-- RS 03FEB2025 -->\n<!-- Add Row Button -->\n<div *ngIf=\"showAddRow\" (click)=\"addRow()\" class=\"addRowClass\">\n <div class=\"circle-button\">+</div>\n</div>\n", styles: [".table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse}.table-container{max-height:400px;overflow-y:auto;overflow-x:auto;position:relative;margin-bottom:1rem}.table th,.table td{padding:3px 5px;line-height:1.2;vertical-align:middle;border:1px solid #dee2e6;white-space:nowrap}.table-bordered{border:1px solid #ddd}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9!important}thead{background-color:#03a9f4;position:sticky;top:0;z-index:unset!important}thead th{color:#fff;font-size:14px;text-align:center;vertical-align:bottom;border-bottom:2px solid #dee2e6;padding:12px!important}thead .permission,.permission_yes,.permission_no,.permission_na{text-align:center}th{text-align:left}tbody{color:#797979}tbody td{font-size:12px}.none-border th{border:none}.actions-column{width:140px;white-space:nowrap;position:sticky;right:0;z-index:10;background-color:#fff}.actions-columns{width:140px;white-space:nowrap;position:sticky;right:0;z-index:10;background-color:#03a9f4}.actions-column .btn-link{font-size:11px;color:#797979;text-decoration:none}th.actions-column{background-color:#03a9f4}tr:nth-of-type(odd) .actions-column{background-color:#f9f9f9!important}tr:nth-of-type(2n) .actions-column{background-color:#fff!important}.table-input{width:100%;padding:.375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.editInput{background-color:#fff;border-bottom:1px solid red!important;border-color:#80bdff}.search-container{margin-bottom:1rem}.search-container .input-group{max-width:300px;position:relative}.search-input{padding-right:35px;border-radius:4px!important}.search-icon{position:absolute;right:10px;top:50%;transform:translateY(-50%);color:#666;pointer-events:none}.pagination-container{padding:.5rem 1rem;background-color:#f8f9fa;border-top:1px solid #dee2e6}.pagination-container .d-flex{justify-content:flex-end!important}.items-per-page{margin-right:20px;font-size:12px}.items-per-page select{width:60px;margin-left:8px}.page-info{margin-right:15px;font-size:12px;color:#6c757d}.pagination{margin:0}.page-link{padding:.25rem .5rem;font-size:12px}.page-item.disabled .page-link{cursor:not-allowed}.addRowClass{float:right;margin-top:1rem;margin-right:15%;text-align:center;cursor:pointer}.circle-button{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background-color:#007bff;color:#fff;cursor:pointer;font-size:24px;line-height:1;box-shadow:0 2px 4px #0003}.circle-button:hover{background-color:#0056b3}.small-icon{width:16px;height:16px;margin-right:4px}.action{min-width:80px;text-align:center;cursor:pointer}.action:hover{color:red}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i7.GetValuePipe, name: "getValue" }] });
|
|
334
|
-
}
|
|
335
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomTableComponent, decorators: [{
|
|
336
|
-
type: Component,
|
|
337
|
-
args: [{ selector: 'app-custom-table', template: "<!-- RS 03FEB2025 -->\n<!-- Search Bar -->\n<!-- Search, Revert & Save in Same Line -->\n<div class=\"d-flex align-items-center justify-content-between mb-3\">\n <!-- Search Bar -->\n <div class=\"search-container me-auto\">\n <div class=\"input-group\">\n <input \n type=\"text\" \n class=\"form-control search-input\"\n [(ngModel)]=\"searchTerm\"\n (input)=\"search()\"\n placeholder=\"Search...\"\n >\n <div class=\"search-icon\">\n <!-- RS 03FEB2025 -->\n <!-- Search icon for user input -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n </svg>\n </div>\n </div>\n </div>\n\n <!-- Buttons -->\n <div>\n <!-- RS 03FEB2025 --><!-- Cancel button (visible only when changes are unsaved) -->\n <button \n class=\"btn btn-secondary me-2\" \n *ngIf=\"hasUnsavedChanges\" \n (click)=\"revertChanges()\"\n >\n Cancel\n </button>\n <!-- Save button (disabled if no unsaved changes) --><!-- RS 03FEB2025 -->\n <button \n class=\"btn btn-primary\" \n [disabled]=\"!hasUnsavedChanges\"\n (click)=\"saveTable()\"\n >\n Save Table\n </button>\n </div>\n</div>\n<!-- Table Container -->\n<div class=\"table-container\">\n <table class=\"table table-striped table-bordered\">\n <thead>\n <!-- HA 28DEC23 changed table header values and changed table size logic to evenly visible -->\n <!-- <th><input type=\"checkbox\" (change)=\"selectAll($event.target.checked)\"></th> -->\n <tr>\n <th *ngFor=\"let header of tableHeader\" [style.width]=\"header.width || 'auto'\">\n {{ header.label }}\n </th>\n <!-- Actions column (only if showActions is true) --><!-- RS 03FEB2025 -->\n <th *ngIf=\"showActions\" style=\"width: 140px\" class=\"actions-columns\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let item of paginatedData; let i = index\">\n <td *ngFor=\"let header of tableHeader\">\n <!-- Image with text input -->\n <ng-container *ngIf=\"header.fldType === 'imagetext'\">\n <div class=\"d-flex align-items-center\">\n <img [src]=\"item.imageSrc\" [alt]=\"item.altText\" style=\"width: 35px; height: 32px; margin-right: 5px;\">\n <input type=\"text\" \n [(ngModel)]=\"item[header.fieldName]\" \n (ngModelChange)=\"updateLabel(i, header.fieldName, item[header.fieldName])\" \n class=\"she-line-input table-input\">\n </div>\n </ng-container>\n\n <!-- Image only -->\n <ng-container *ngIf=\"header.fldType === 'image'\">\n <img [src]=\"item[header.fieldName]\" [alt]=\"item.altText\" style=\"width: 35px; height: 32px;\">\n </ng-container>\n <!--VD 23Aug24 handle readOnly -->\n <!-- Text input -->\n <ng-container *ngIf=\"header.fldType === 'Text'\">\n <input type=\"text\" \n [readonly]=\"header.readOnly\" \n [disabled]=\"!item.edit\" \n [ngClass]=\"{'editInput': item.edit && !header.readOnly}\"\n [ngModel]=\"'' | getValue: item : header.apiName\" \n (ngModelChange)=\"updateLabel(i, header.apiName,$event)\" \n class=\"she-line-input table-input\">\n </ng-container>\n <!--VD 23Aug24 handle Number Type -->\n <!-- Number input -->\n <!-- VD 26Jun24 - pipe change to handle multiple objects-->\n <ng-container *ngIf=\"header.fldType === 'Number'\">\n <input type=\"number\" \n [readonly]=\"header.readOnly\" \n [disabled]=\"!item.edit\" \n [ngClass]=\"{'editInput': item.edit && !header.readOnly}\"\n [ngModel]=\"'' | getValue: item : header.apiName\" \n (ngModelChange)=\"updateLabel(i, header.apiName,$event)\" \n class=\"she-line-input table-input\">\n </ng-container>\n\n <!-- Radio input -->\n <ng-container *ngIf=\"header.fldType === 'radio'\">\n <input type=\"radio\" \n [name]=\"item.name\" \n [checked]=\"item.value == header.fieldName\" \n (click)=\"updateRadio(item, header.fieldName)\">\n </ng-container>\n </td>\n <!-- Actions column --><!-- RS 03FEB2025 -->\n <td *ngIf=\"showActions\" class=\"actions-column\">\n <div class=\"d-flex justify-content-around\">\n <button class=\"btn btn-link p-0\" (click)=\"editRow(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#03A9F4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n <path d=\"m15 5 3 3\" />\n </svg>\n Edit\n </button>\n <button class=\"btn btn-link p-0\" (click)=\"deleteRow(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#F44336\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <path d=\"m10 11 1 6\" />\n <path d=\"m14 11-1 6\" />\n <path d=\"M4 6l1 14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2l1-14\" />\n </svg>\n \n Delete\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<!-- Pagination --><!-- RS 03FEB2025 -->\n<div *ngIf=\"showPagination\" class=\"pagination-container\">\n <div class=\"d-flex justify-content-end align-items-center\">\n <div class=\"items-per-page\">\n <span>Items per page:</span>\n <select [(ngModel)]=\"itemsPerPage\" (change)=\"updatePagination()\" class=\"form-select form-select-sm\">\n <option value=\"5\">5</option>\n <option value=\"10\">10</option>\n <option value=\"20\">20</option>\n <option value=\"50\">50</option>\n </select>\n </div>\n <div class=\"page-info ms-3 me-3\">\n {{((currentPage - 1) * itemsPerPage + 1)}} - {{Math.min(currentPage * itemsPerPage, totalItems)}} of {{totalItems}}\n </div>\n <nav aria-label=\"Table pagination\">\n <!-- First page --><!-- RS 03FEB2025 -->\n <ul class=\"pagination mb-0\">\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\n <a class=\"page-link\" (click)=\"setPage(1)\">\u00AB</a>\n </li>\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\n <a class=\"page-link\" (click)=\"setPage(currentPage - 1)\">\u2039</a>\n </li>\n <!-- Dynamic pagination --><!-- RS 03FEB2025 -->\n <li class=\"page-item\" *ngFor=\"let page of pages\" [class.active]=\"page === currentPage\">\n <a class=\"page-link\" (click)=\"setPage(page)\">{{page}}</a>\n </li>\n <li class=\"page-item\" [class.disabled]=\"currentPage === pages.length\">\n <a class=\"page-link\" (click)=\"setPage(currentPage + 1)\">\u203A</a>\n </li>\n <!-- Last page -->\n <li class=\"page-item\" [class.disabled]=\"currentPage === pages.length\">\n <a class=\"page-link\" (click)=\"setPage(pages.length)\">\u00BB</a>\n </li>\n </ul>\n </nav>\n </div>\n</div>\n<!-- RS 03FEB2025 -->\n<!-- Add Row Button -->\n<div *ngIf=\"showAddRow\" (click)=\"addRow()\" class=\"addRowClass\">\n <div class=\"circle-button\">+</div>\n</div>\n", styles: [".table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse}.table-container{max-height:400px;overflow-y:auto;overflow-x:auto;position:relative;margin-bottom:1rem}.table th,.table td{padding:3px 5px;line-height:1.2;vertical-align:middle;border:1px solid #dee2e6;white-space:nowrap}.table-bordered{border:1px solid #ddd}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9!important}thead{background-color:#03a9f4;position:sticky;top:0;z-index:unset!important}thead th{color:#fff;font-size:14px;text-align:center;vertical-align:bottom;border-bottom:2px solid #dee2e6;padding:12px!important}thead .permission,.permission_yes,.permission_no,.permission_na{text-align:center}th{text-align:left}tbody{color:#797979}tbody td{font-size:12px}.none-border th{border:none}.actions-column{width:140px;white-space:nowrap;position:sticky;right:0;z-index:10;background-color:#fff}.actions-columns{width:140px;white-space:nowrap;position:sticky;right:0;z-index:10;background-color:#03a9f4}.actions-column .btn-link{font-size:11px;color:#797979;text-decoration:none}th.actions-column{background-color:#03a9f4}tr:nth-of-type(odd) .actions-column{background-color:#f9f9f9!important}tr:nth-of-type(2n) .actions-column{background-color:#fff!important}.table-input{width:100%;padding:.375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.editInput{background-color:#fff;border-bottom:1px solid red!important;border-color:#80bdff}.search-container{margin-bottom:1rem}.search-container .input-group{max-width:300px;position:relative}.search-input{padding-right:35px;border-radius:4px!important}.search-icon{position:absolute;right:10px;top:50%;transform:translateY(-50%);color:#666;pointer-events:none}.pagination-container{padding:.5rem 1rem;background-color:#f8f9fa;border-top:1px solid #dee2e6}.pagination-container .d-flex{justify-content:flex-end!important}.items-per-page{margin-right:20px;font-size:12px}.items-per-page select{width:60px;margin-left:8px}.page-info{margin-right:15px;font-size:12px;color:#6c757d}.pagination{margin:0}.page-link{padding:.25rem .5rem;font-size:12px}.page-item.disabled .page-link{cursor:not-allowed}.addRowClass{float:right;margin-top:1rem;margin-right:15%;text-align:center;cursor:pointer}.circle-button{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background-color:#007bff;color:#fff;cursor:pointer;font-size:24px;line-height:1;box-shadow:0 2px 4px #0003}.circle-button:hover{background-color:#0056b3}.small-icon{width:16px;height:16px;margin-right:4px}.action{min-width:80px;text-align:center;cursor:pointer}.action:hover{color:red}\n"] }]
|
|
338
|
-
}], ctorParameters: () => [{ type: i1.ChangeService }, { type: i2.I18nService }, { type: i3.SalesforceService }, { type: i4.DataService }], propDecorators: { question: [{
|
|
339
|
-
type: Input
|
|
340
|
-
}], valueChange: [{
|
|
341
|
-
type: Output
|
|
342
|
-
}], saveTableData: [{
|
|
343
|
-
type: Output
|
|
344
|
-
}], apiMeta: [{
|
|
345
|
-
type: Input
|
|
346
|
-
}] } });
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS10YWJsZS9jdXN0b20tdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLXRhYmxlL2N1c3RvbS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQW1CekcsTUFBTSxPQUFPLG9CQUFvQjtJQW9DWDtJQUFvQztJQUFrQztJQUFzQztJQW5DdkgsUUFBUSxDQUFVO0lBQ2pCLFdBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUN6RCxhQUFhLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFDckUsU0FBUyxDQUFlO0lBQ3hCLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNmLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7SUFDdEQsY0FBYztJQUNkLG9KQUFvSjtJQUNwSixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQzNCLGNBQWMsR0FBWSxJQUFJLENBQUM7SUFDL0IsV0FBVyxHQUFZLElBQUksQ0FBQztJQUM1QixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQzNCLFlBQVksR0FBVyxDQUFDLENBQUM7SUFDdkIsYUFBYSxDQUFTO0lBQ3RCLFNBQVMsQ0FBUyxDQUFDLG9DQUFvQztJQUN2RCxPQUFPLENBQU07SUFDYixXQUFXLENBQU07SUFDakIsU0FBUyxDQUFTO0lBQ2xCLE1BQU0sQ0FBUztJQUNmLFNBQVMsR0FBWSxLQUFLLENBQUM7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aEMsU0FBUzsrQkFDRSxrQkFBa0I7c0tBTW5CLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQW1CRSxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvdGFibGVXcmFwcGVyJztcbmltcG9ydCB7IFNhbGVzZm9yY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vd3JhcHBlcic7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBBUElNZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hcGltZXRhJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3VzdG9tLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS10YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBDdXN0b21UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcXVlc3Rpb246IFF1ZXN0aW9uXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNhdmVUYWJsZURhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHRhYmxlSW5mbzogVGFibGVXcmFwcGVyO1xuICB0YWJsZUhlYWRlciA9IFtdO1xuICB0YWJsZURhdGEgPSBbXTtcbiAgZmlsdGVyZWREYXRhID0gW107IC8vIE5ldyBwcm9wZXJ0eSBmb3IgZmlsdGVyZWQgZGF0YVxuLy9SUyAwM0ZFQjIwMjVcbi8vIERlZmF1bHQgVUkgY29uZmlndXJhdGlvbnMgdG8gY29udHJvbCByb3cgYWRkaXRpb24sIHBhZ2luYXRpb24sIGFjdGlvbnMgY29sdW1uIHZpc2liaWxpdHksIHNlYXJjaCBmdW5jdGlvbmFsaXR5LCBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyBwZXIgcGFnZS5cbnNob3dBZGRSb3c6IGJvb2xlYW4gPSB0cnVlO1xuc2hvd1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuc2hvd0FjdGlvbnM6IGJvb2xlYW4gPSB0cnVlO1xuc2hvd1NlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5pdGVtc1BlclBhZ2U6IG51bWJlciA9IDU7XG4gIGFkZFJvd0NvbFNwYW46IG51bWJlcjtcbiAgdGFibGVTaXplOiBudW1iZXI7IC8vIEhBIDI4REVDMjMgdGFibGUgc2l6ZSBkZWNsYXJhdGlvblxuICBvYmpOYW1lOiBhbnk7XG4gIGZpbHRlckxvZ2ljOiBhbnk7XG4gIGZpZWxkTWV0YTogc3RyaW5nO1xuICBmaXJTdHI6IHN0cmluZztcbiAgc2VhcmNoQm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaU1ldGE6IHN0cmluZztcbiAgcHVibGljIG9wdGlvbnM6IHN0cmluZ1tdO1xuICBpc0Rpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIGxhYmVsRmllbGQ6IHN0cmluZztcblxuICAvL1JTIDAzRkVCMjAyNVxuICAvLyBOZXcgcHJvcGVydGllcyBmb3Igc2VhcmNoIGFuZCBwYWdpbmF0aW9uXG4gIHNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcbiAgdG90YWxJdGVtczogbnVtYmVyID0gMDtcbiAgcGFnZXM6IG51bWJlcltdID0gW107XG4gIE1hdGggPSBNYXRoO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UscHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSwgcHJpdmF0ZSBzZlNlcnZpY2U6IFNhbGVzZm9yY2VTZXJ2aWNlLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkgeyB9XG4gIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXG4gIC8vIEFkZCBuZXcgcHJvcGVydGllcyBmb3Igc2F2ZSBmdW5jdGlvbmFsaXR5XG4gIGhhc1Vuc2F2ZWRDaGFuZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHNhdmVkRGF0YTogYW55W10gPSBbXTtcbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvLyB0aGlzLnRhYmxlRGF0YSA9IFtdO1xuLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGRhdGEgZmlyc3RcbnRoaXMucmVzZXRDb21wb25lbnRTdGF0ZSgpO1xuc2V0VGltZW91dCgoKSA9PiBjb25zb2xlLmxvZygnQWZ0ZXIgcmVzZXQ6JywgdGhpcy50YWJsZURhdGEpLCAyMDAwKTtcbnRyeSB7XG4gIGNvbnN0IHBhcnNlZE1ldGEgPSBKU09OLnBhcnNlKHRoaXMucXVlc3Rpb25bJ2ZpZWxkc01ldGEnXSk7XG4gIGlmICghcGFyc2VkTWV0YSB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWRNZXRhKSB8fCBwYXJzZWRNZXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignTm8gdmFsaWQgbWV0YWRhdGEgcHJvdmlkZWQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvL1JTIDAzRkVCMjAyNVxuICAvLyBFeHRyYWN0cyB0YWJsZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGR5bmFtaWNhbGx5IGZyb20gbWV0YWRhdGEgYW5kIGFwcGxpZXMgdGhlbSwgZW5zdXJpbmcgZmxleGliaWxpdHkgaW4gVUkgY3VzdG9taXphdGlvblxuICBpZiAocGFyc2VkTWV0YVswXT8udGFibGVDb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSBwYXJzZWRNZXRhWzBdLnRhYmxlQ29uZmlnO1xuICAgIHRoaXMuc2hvd0FkZFJvdyA9IGNvbmZpZy5zaG93QWRkUm93ICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gY29uZmlnLnNob3dQYWdpbmF0aW9uICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dBY3Rpb25zID0gY29uZmlnLnNob3dBY3Rpb25zICE9PSBmYWxzZTtcbiAgICB0aGlzLnNob3dTZWFyY2ggPSBjb25maWcuc2hvd1NlYXJjaCAhPT0gZmFsc2U7XG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBjb25maWcuaXRlbXNQZXJQYWdlIHx8IDU7XG4gICAgXG4gICAgLy8gUmVtb3ZlIHRoZSBjb25maWcgb2JqZWN0IGZyb20gaGVhZGVyc1xuICAgIHRoaXMudGFibGVIZWFkZXIgPSBwYXJzZWRNZXRhLnNsaWNlKDEpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIG5vIGNvbmZpZyBvYmplY3QgZm91bmQsIHVzZSBhbGwgb2JqZWN0cyBhcyBoZWFkZXJzXG4gICAgdGhpcy50YWJsZUhlYWRlciA9IHBhcnNlZE1ldGE7XG4gIH1cblxuICAgIC8vIHRoaXMudGFibGVIZWFkZXIgPSBKU09OLnBhcnNlKHRoaXMucXVlc3Rpb25bJ2ZpZWxkc01ldGEnXSk7XG4gICAgdGhpcy50YWJsZVNpemUgPSAxMC90aGlzLnRhYmxlSGVhZGVyLmxlbmd0aDtcbi8vIDEySlVOMjQgLSBkZWZhdWx0IHRhYmxlIHZhbHVlXG4gICAgaWYodGhpcy5xdWVzdGlvbj8uaW5wdXQpe1xuICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMucXVlc3Rpb24/LmlucHV0O1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLnRhYmxlRGF0YV07XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcbiAgICB9XG4gICAgaWYodGhpcy5hcGlNZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgICAgbGV0IGFwaU9iajogQVBJTWV0YSA9IEpTT04ucGFyc2UodGhpcy5hcGlNZXRhKTtcbiAgICAgIHRoaXMubGFiZWxGaWVsZCA9IGFwaU9iai5maWVsZDtcbiAgICAgIGlmKGFwaU9iai5lbmRwb2ludCl7XG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpUmVzcG9uc2UoYXBpT2JqLmVuZHBvaW50KT8uc3Vic2NyaWJlKChhcGlSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNwb25zZXM7XG4gICAgICAgICAgaWYoYXBpT2JqLnZhcmlhYmxlKXtcbiAgICAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gaGFuZGxpbmcgbXVsdGlwbGUgY2hpbGQgb2JqZWN0c1xuICAgICAgICAgICAgcmVzcG9uc2VzID0gIHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoYXBpUmVzcG9uc2UsYXBpT2JqLnZhcmlhYmxlKTtcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAvLyBIQSAxOUpBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvciBpbiBjb25zb2xlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3AgPSByZXNwb25zZXNbaV07XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3VsdHM7XG4gICAgICAgICAgfWVsc2V7ICAvLyBWRCAxOUpBTjI0IC0gaWYgcmVzcG9uc2UgaGFzIHZhbHVlKHdoaWNoIGlzIGFycmF5KSBvbmx5XG4gICAgICAgICAgICByZXNwb25zZXMgPSBhcGlSZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3BvbnNlcztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob2JqOiBhbnkpID0+ICh7IC4uLm9iaiwgZWRpdDogZmFsc2UgfSkpO1xuICAgICAgICAgIC8vIFJlZmVyZW5jZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9Abmctc2VsZWN0L25nLXNlbGVjdFxuICAgICAgICAgdGhpcy50YWJsZURhdGEgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0YWJsZURhdGEnLCB0aGlzLnRhYmxlRGF0YSk7XG4gICAgICAgICAgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICBcbiAgICAgIC8vIFZEIE5PVjIzIC0gaGFuZGxlIHRoZSBkZXBlbmRlbnQgdXBkYXRlIGZvciBkcm9wZG93blxuICAgICAgbGV0IHNvdXJjZUlkID0gYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQ7XG4gICAgICBsZXQgZmllbGQgPSBhcGlPYmouZmllbGQ7ICAgICAgICAvLyBWRCAxM01BWTI0IC0gZHluYW1pYyBmaWVsZCBjaGFuZ2VzXG4gICAgICBpZihzb3VyY2VJZCl7XG4gICAgICAgIC8vIC8vIFZEIDEwTWF5MjQgU3Vic2NyaWJlIGZvciB0aGUgY2hhbmdlc1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jaGFuZ2VBbm5vdW5jZWQkLnN1YnNjcmliZShcbiAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmKGNoYW5nZVZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZihjaGFuZ2VWYWx1ZS52YWx1ZU9iaiAhPSB1bmRlZmluZWQgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgPT0gYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2hhbmdlcyBoYXBwZW4nKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvYmo6IGFueSkgPT4gKHsgLi4ub2JqLCBlZGl0OiBmYWxzZSB9KSk7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBjaGFuZ2VWYWx1ZS52YWx1ZU9iajtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWRJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgLy8gVkQgMTNNQVkyNCAtIGJpbmQgZHluYW1pYyBmaWVsZFxuICAgICAgICAgICAgICAgIGlmKHRoaXMudGFibGVEYXRhLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAvLyBWRCAyNkp1bjI0IC0gdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqRWxlbWVudFZhbHVlID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShlbGVtZW50LGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqSXRlbVZhbHVlID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShpdGVtLGZpZWxkKVxuICAgICAgICAgICAgICAgICAgICBpZihvYmpFbGVtZW50VmFsdWUgPT0gb2JqSXRlbVZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRJdGVtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZih2YWxpZEl0ZW0pe1xuICAgICAgICAgICAgICAgIC8vICAgaWYodGhpcy50YWJsZURhdGEubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVEYXRhID0gWy4uLnRoaXMudGFibGVEYXRhLGl0ZW1dO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh0aGlzLnRhYmxlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMudGFibGVEYXRhLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZW1pdFRhYmxlRGF0YVZhbHVlKHRoaXMudGFibGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy9SUyAxNEZFQjIwMjVcbiAgICAgICAgICAgICAgICAvL1VwZGF0ZSBQYWdpbmF0aW9uIGJlZm9yZSBlbWl0XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGVEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEgPSBbLi4udGhpcy50YWJsZURhdGEsIGl0ZW1dO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXJlZERhdGEgYW5kIHBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gWy4uLnRoaXMudGFibGVEYXRhXTtcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0VGFibGVEYXRhVmFsdWUodGhpcy50YWJsZURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2UuY29uZmlybUNoYW5nZShhcGlPYmouc291cmNlUXVlc3Rpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcbiAgICAvL1JTIDAzRkVCMjAyNVxuICAgIC8vSGFuZGxlcyBlcnJvcnMgZHVyaW5nIG1ldGFkYXRhIHBhcnNpbmcgYnkgc2V0dGluZyBkZWZhdWx0IHZhbHVlcyB0byBlbnN1cmUgdGhlIHRhYmxlIGZ1bmN0aW9ucyBwcm9wZXJseVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgZmllbGRzTWV0YTonLCBlcnJvcik7XG4gICAgdGhpcy5zaG93QWRkUm93ID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dBY3Rpb25zID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dTZWFyY2ggPSB0cnVlO1xuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gNTtcbiAgfVxuICAvL1JTIDAzRkVCMjAyNVxuICAvLyBJbml0aWFsaXplIHNhdmVkIGRhdGFcbiAgaWYgKHRoaXMucXVlc3Rpb24/LmlucHV0KSB7XG4gICAgdGhpcy5zYXZlZERhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucXVlc3Rpb24uaW5wdXQpKTtcbiAgfVxuICAgIGNvbnNvbGUubG9nKCd0YWJsZURhdGEnLCB0aGlzLnRhYmxlRGF0YSk7XG4gICAgY29uc29sZS5sb2coJ3RhYmxlSGVhZGVyJywgdGhpcy50YWJsZUhlYWRlcik7XG4gICAgY29uc29sZS5sb2coJ3RhYmxlSW5mbycsIHRoaXMudGFibGVJbmZvKTtcbiAgfVxuICAvL1JTIDAzRkVCMjAyNVxuICAvLyDihpIgRmlsdGVycyB0YWJsZSBkYXRhIGJhc2VkIG9uIHVzZXIgaW5wdXQgYW5kIHVwZGF0ZXMgcGFnaW5hdGlvbiBhY2NvcmRpbmdseS5cbiAgc2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXJtLnRyaW0oKSkge1xuICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBbLi4udGhpcy50YWJsZURhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWFyY2hUZXJtTG93ZXIgPSB0aGlzLnNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gdGhpcy50YWJsZURhdGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUhlYWRlci5zb21lKGhlYWRlciA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGl0ZW0sIGhlYWRlci5hcGlOYW1lKTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm1Mb3dlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xuICB9XG4vL1JTIDAzRkVCMjAyNVxuLy8gQ2FsY3VsYXRlcyB0b3RhbCBwYWdlcywgdXBkYXRlcyB0aGUgcGFnZSBsaXN0LCBhbmQgZW5zdXJlcyB0aGUgY3VycmVudCBwYWdlIGlzIHdpdGhpbiB2YWxpZCBib3VuZHMuXG4gIHVwZGF0ZVBhZ2luYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbEl0ZW1zIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xuICAgIHRoaXMucGFnZXMgPSBBcnJheS5mcm9tKHtsZW5ndGg6IHRvdGFsUGFnZXN9LCAoXywgaSkgPT4gaSArIDEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdG90YWxQYWdlcykge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRvdGFsUGFnZXMgfHwgMTtcbiAgfVxuICB9XG4vL1JTIDAzRkVCMjAyNVxuLy9SZXR1cm5zIGEgcGFnaW5hdGVkIHN1YnNldCBvZiBmaWx0ZXJlZERhdGEgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGFnZSBhbmQgaXRlbXMgcGVyIHBhZ2VcbiAgZ2V0IHBhZ2luYXRlZERhdGEoKTogYW55W10ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyB0aGlzLml0ZW1zUGVyUGFnZSk7XG4gIH1cbi8vUlMgMDNGRUIyMDI1XG4vL1VwZGF0ZXMgY3VycmVudFBhZ2Ugd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50IHBhZ2VcbiAgc2V0UGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocGFnZSA+PSAxICYmIHBhZ2UgPD0gdGhpcy5wYWdlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIH1cbiAgfVxuLy9SUyAwM0ZFQjIwMjVcbi8vUmVzZXRzIHRhYmxlIGRhdGEsIGZpbHRlcnMsIHBhZ2luYXRpb24sIFVJIHNldHRpbmdzLCBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYW55IHN1YnNjcmlwdGlvbnMuXG4gIHByaXZhdGUgcmVzZXRDb21wb25lbnRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlRGF0YSA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZWREYXRhID0gW107XG4gICAgdGhpcy50YWJsZUhlYWRlciA9IFtdO1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMuc2hvd0FkZFJvdyA9IHRydWU7XG4gICAgdGhpcy5zaG93UGFnaW5hdGlvbiA9IHRydWU7XG4gICAgdGhpcy5zaG93QWN0aW9ucyA9IHRydWU7XG4gICAgdGhpcy5zaG93U2VhcmNoID0gdHJ1ZTtcbiAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IDU7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFJvdygpOiB2b2lkIHtcbiAgICBsZXQgbmV3SXRlbSA9IHt9O1xuICAgICAgdGhpcy50YWJsZUhlYWRlci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZihpdGVtLmFwaU5hbWUpe1xuICAgICAgICAgIG5ld0l0ZW1baXRlbS5hcGlOYW1lXT0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgLy8gY29uc3QgdXBkYXRlZFRhYmxlRGF0YSA9IFsuLi50aGlzLnRhYmxlRGF0YSwgbmV3SXRlbV07XG4gICAgLy8gdGhpcy50YWJsZURhdGEgPSB1cGRhdGVkVGFibGVEYXRhO1xuICAgIC8vIHRoaXMuZW1pdFRhYmxlRGF0YVZhbHVlKHVwZGF0ZWRUYWJsZURhdGEpO1xuICAgIHRoaXMudGFibGVEYXRhLnB1c2gobmV3SXRlbSk7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEgPSBbLi4udGhpcy50YWJsZURhdGFdO1xuICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaGFzVW5zYXZlZENoYW5nZXMgPSB0cnVlO1xuXG4gICAgdGhpcy5lbWl0VGFibGVEYXRhVmFsdWUodGhpcy50YWJsZURhdGEpO1xuICB9XG5cbiAgdXBkYXRlUmFkaW8oaXRlbTogYW55LCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaXRlbS52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZW1pdFRhYmxlRGF0YVZhbHVlKHRoaXMudGFibGVEYXRhKTtcbiAgfVxuICAvLyBWRCAyM0F1ZzI0IGhhbmRsZSAgVHlwZVxuICAvLyB1cGRhdGVMYWJlbChyb3dJbmRleDogbnVtYmVyLCBsYWJlbDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIC8vICAgdGhpcy50YWJsZURhdGFbcm93SW5kZXhdW2xhYmVsXSA9IHZhbHVlO1xuICAvLyAgIHRoaXMuZW1pdFRhYmxlRGF0YVZhbHVlKHRoaXMudGFibGVEYXRhKTtcbiAgLy8gfVxuICAvLyBNb2RpZmllZCB1cGRhdGUgbWV0aG9kcyB0byB0cmFjayBjaGFuZ2VzXG4gIHVwZGF0ZUxhYmVsKHJvd0luZGV4OiBudW1iZXIsIGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlRGF0YVtyb3dJbmRleF1bbGFiZWxdID0gdmFsdWU7XG4gICAgdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XG4gICAgdGhpcy5lbWl0VGFibGVEYXRhVmFsdWUodGhpcy50YWJsZURhdGEpO1xuICB9XG4gIC8vUlMgMDNGRUIyMDI1XG4gIGRlbGV0ZVJvdyhyb3dJbmRleDogbnVtYmVyKXtcbiAgICAvLyB0aGlzLnRhYmxlRGF0YS5zcGxpY2Uocm93SW5kZXgsIDEpO1xuICAgIGNvbnN0IGFjdHVhbEluZGV4ID0gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuaXRlbXNQZXJQYWdlICsgcm93SW5kZXg7XG4gICAgdGhpcy50YWJsZURhdGEuc3BsaWNlKGFjdHVhbEluZGV4LCAxKTtcbiAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLnRhYmxlRGF0YV07XG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5oYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7XG5cbiAgICB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh0aGlzLnRhYmxlRGF0YSk7XG4gIH1cbiAgLy9SUyAwM0ZFQjIwMjVcbiAgLy8gU2F2ZXMgdGhlIGN1cnJlbnQgdGFibGUgZGF0YSBzdGF0ZSwgcmVzZXRzIHRoZSBoYXNVbnNhdmVkQ2hhbmdlcyBmbGFnLCBhbmQgZW1pdHMgdGhlIHVwZGF0ZWQgZGF0YS5cbiAgc2F2ZVRhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnRhYmxlRGF0YSkpO1xuICAgIHRoaXMuaGFzVW5zYXZlZENoYW5nZXMgPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVUYWJsZURhdGEuZW1pdCh0aGlzLnRhYmxlRGF0YSk7XG4gIH1cbiAgLy9SUyAwM0ZFQjIwMjVcbiAgLy8gIFJlc3RvcmVzIHRoZSBsYXN0IHNhdmVkIHN0YXRlIG9mIHRoZSB0YWJsZSBhbmQgcmVzZXRzIHRoZSBwYWdpbmF0aW9uIGFuZCBVSSBzdGF0ZVxuICByZXZlcnRDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNhdmVkRGF0YSkpO1xuICAgIHRoaXMuZmlsdGVyZWREYXRhID0gWy4uLnRoaXMudGFibGVEYXRhXTtcbiAgICB0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XG4gICAgdGhpcy5lbWl0VGFibGVEYXRhVmFsdWUodGhpcy50YWJsZURhdGEpO1xuICB9XG4gIGVkaXRSb3cocm93SW5kZXg6IG51bWJlcil7XG4gICAgdmFyIGEgPSAwO1xuICAgIHRoaXMudGFibGVEYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZihhID09PSByb3dJbmRleCl7XG4gICAgICAgIGVsZW1lbnQuZWRpdCA9IHRydWU7XG4gICAgICB9XG4gICAgICBhKys7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVOdW1iZXIoaXRlbTogYW55LCBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKXtcbiAgICBpdGVtLnZhbHVlW2xhYmVsXSA9IHZhbHVlO1xuICAgIHRoaXMuZW1pdFRhYmxlRGF0YVZhbHVlKHRoaXMudGFibGVEYXRhKTtcbiAgfVxuXG5cbiAgZW1pdFRhYmxlRGF0YVZhbHVlKHVwZGF0ZWRUYWJsZURhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHVwZGF0ZWRUYWJsZURhdGEpO1xuICB9XG4vL1JTIDAzRkVCMjAyNVxuLy8gQ2xlYW5zIHVwIHJlc291cmNlcyBhbmQgcmVzZXRzIHRoZSBjb21wb25lbnQgc3RhdGUgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xubmdPbkRlc3Ryb3koKSB7XG4gIHRoaXMucmVzZXRDb21wb25lbnRTdGF0ZSgpO1xuICBjb25zb2xlLmxvZygnQ29tcG9uZW50IERlc3Ryb3llZCcpO1xuXG59XG59IiwiPCEtLSBSUyAwM0ZFQjIwMjUgLS0+XG48IS0tIFNlYXJjaCBCYXIgLS0+XG48IS0tIFNlYXJjaCwgUmV2ZXJ0ICYgU2F2ZSBpbiBTYW1lIExpbmUgLS0+XG48ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XG4gIDwhLS0gU2VhcmNoIEJhciAtLT5cbiAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXIgbWUtYXV0b1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgPGlucHV0IFxuICAgICAgICB0eXBlPVwidGV4dFwiIFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtaW5wdXRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAoaW5wdXQpPVwic2VhcmNoKClcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiXG4gICAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWljb25cIj5cbiAgICA8IS0tIFJTIDAzRkVCMjAyNSAtLT5cbiAgICA8IS0tIFNlYXJjaCBpY29uIGZvciB1c2VyIGlucHV0IC0tPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI4XCI+PC9jaXJjbGU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIyMVwiIHkxPVwiMjFcIiB4Mj1cIjE2LjY1XCIgeTI9XCIxNi42NVwiPjwvbGluZT5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBCdXR0b25zIC0tPlxuICA8ZGl2PlxuICAgIDwhLS0gUlMgMDNGRUIyMDI1IC0tPjwhLS0gQ2FuY2VsIGJ1dHRvbiAodmlzaWJsZSBvbmx5IHdoZW4gY2hhbmdlcyBhcmUgdW5zYXZlZCkgLS0+XG4gICAgPGJ1dHRvbiBcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgbWUtMlwiIFxuICAgICAgKm5nSWY9XCJoYXNVbnNhdmVkQ2hhbmdlc1wiIFxuICAgICAgKGNsaWNrKT1cInJldmVydENoYW5nZXMoKVwiXG4gICAgPlxuICAgICAgQ2FuY2VsXG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBTYXZlIGJ1dHRvbiAoZGlzYWJsZWQgaWYgbm8gdW5zYXZlZCBjaGFuZ2VzKSAtLT48IS0tIFJTIDAzRkVCMjAyNSAtLT5cbiAgICA8YnV0dG9uIFxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBcbiAgICAgIFtkaXNhYmxlZF09XCIhaGFzVW5zYXZlZENoYW5nZXNcIlxuICAgICAgKGNsaWNrKT1cInNhdmVUYWJsZSgpXCJcbiAgICA+XG4gICAgICBTYXZlIFRhYmxlXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIFRhYmxlIENvbnRhaW5lciAtLT5cbjxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZFwiPlxuICAgIDx0aGVhZD5cbiAgICAgICAgPCEtLSBIQSAyOERFQzIzIGNoYW5nZWQgdGFibGUgaGVhZGVyIHZhbHVlcyBhbmQgY2hhbmdlZCB0YWJsZSBzaXplIGxvZ2ljIHRvIGV2ZW5seSB2aXNpYmxlIC0tPlxuICAgIDwhLS0gPHRoPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cInNlbGVjdEFsbCgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCI+PC90aD4gLS0+XG4gICAgICA8dHI+XG4gICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIHRhYmxlSGVhZGVyXCIgW3N0eWxlLndpZHRoXT1cImhlYWRlci53aWR0aCB8fCAnYXV0bydcIj5cbiAgICAgICAgICB7eyBoZWFkZXIubGFiZWwgfX1cbiAgICAgICAgPC90aD5cbiAgICAgICAgPCEtLSBBY3Rpb25zIGNvbHVtbiAob25seSBpZiBzaG93QWN0aW9ucyBpcyB0cnVlKSAtLT48IS0tIFJTIDAzRkVCMjAyNSAtLT5cbiAgICAgICAgPHRoICpuZ0lmPVwic2hvd0FjdGlvbnNcIiBzdHlsZT1cIndpZHRoOiAxNDBweFwiIGNsYXNzPVwiYWN0aW9ucy1jb2x1bW5zXCI+QWN0aW9uczwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBhZ2luYXRlZERhdGE7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgdGFibGVIZWFkZXJcIj5cbiAgICAgICAgICA8IS0tIEltYWdlIHdpdGggdGV4dCBpbnB1dCAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZsZFR5cGUgPT09ICdpbWFnZXRleHQnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXRlbS5pbWFnZVNyY1wiIFthbHRdPVwiaXRlbS5hbHRUZXh0XCIgc3R5bGU9XCJ3aWR0aDogMzVweDsgaGVpZ2h0OiAzMnB4OyBtYXJnaW4tcmlnaHQ6IDVweDtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtW2hlYWRlci5maWVsZE5hbWVdXCIgXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTGFiZWwoaSwgaGVhZGVyLmZpZWxkTmFtZSwgaXRlbVtoZWFkZXIuZmllbGROYW1lXSlcIiBcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNoZS1saW5lLWlucHV0IHRhYmxlLWlucHV0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gSW1hZ2Ugb25seSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZsZFR5cGUgPT09ICdpbWFnZSdcIj5cbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtW2hlYWRlci5maWVsZE5hbWVdXCIgW2FsdF09XCJpdGVtLmFsdFRleHRcIiBzdHlsZT1cIndpZHRoOiAzNXB4OyBoZWlnaHQ6IDMycHg7XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS1WRCAyM0F1ZzI0IGhhbmRsZSByZWFkT25seSAgLS0+XG4gICAgICAgICAgPCEtLSBUZXh0IGlucHV0IC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXIuZmxkVHlwZSA9PT0gJ1RleHQnXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImhlYWRlci5yZWFkT25seVwiIFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWl0ZW0uZWRpdFwiIFxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2VkaXRJbnB1dCc6IGl0ZW0uZWRpdCAmJiAhaGVhZGVyLnJlYWRPbmx5fVwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cIicnIHwgZ2V0VmFsdWU6IGl0ZW0gOiBoZWFkZXIuYXBpTmFtZVwiIFxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMYWJlbChpLCBoZWFkZXIuYXBpTmFtZSwkZXZlbnQpXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwic2hlLWxpbmUtaW5wdXQgdGFibGUtaW5wdXRcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLVZEIDIzQXVnMjQgaGFuZGxlIE51bWJlciBUeXBlIC0tPlxuICAgICAgICA8IS0tIE51bWJlciBpbnB1dCAtLT5cbiAgICAgICAgPCEtLSBWRCAyNkp1bjI0IC0gcGlwZSBjaGFuZ2UgdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdHMtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZsZFR5cGUgPT09ICdOdW1iZXInXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiaGVhZGVyLnJlYWRPbmx5XCIgXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXRlbS5lZGl0XCIgXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZWRpdElucHV0JzogaXRlbS5lZGl0ICYmICFoZWFkZXIucmVhZE9ubHl9XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiJycgfCBnZXRWYWx1ZTogaXRlbSA6IGhlYWRlci5hcGlOYW1lXCIgXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxhYmVsKGksIGhlYWRlci5hcGlOYW1lLCRldmVudClcIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaGUtbGluZS1pbnB1dCB0YWJsZS1pbnB1dFwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBSYWRpbyBpbnB1dCAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmZsZFR5cGUgPT09ICdyYWRpbydcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBcbiAgICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5uYW1lXCIgXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0udmFsdWUgPT0gaGVhZGVyLmZpZWxkTmFtZVwiICBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVJhZGlvKGl0ZW0sIGhlYWRlci5maWVsZE5hbWUpXCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIDwhLS0gQWN0aW9ucyBjb2x1bW4gLS0+PCEtLSBSUyAwM0ZFQjIwMjUgLS0+XG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dBY3Rpb25zXCIgY2xhc3M9XCJhY3Rpb25zLWNvbHVtblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBwLTBcIiAoY2xpY2spPVwiZWRpdFJvdyhpKVwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDNBOUY0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMjBoOVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNi41IDMuNWEyLjEyMSAyLjEyMSAwIDAgMSAzIDNMNyAxOWwtNCAxIDEtNFpcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJtMTUgNSAzIDNcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHAtMFwiIChjbGljayk9XCJkZWxldGVSb3coaSlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0Y0NDMzNlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNmgxOFwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDZWNGEyIDIgMCAwIDEgMi0yaDRhMiAyIDAgMCAxIDIgMnYyXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwibTEwIDExIDEgNlwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIm0xNCAxMS0xIDZcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2bDEgMTRhMiAyIDAgMCAwIDIgMmgxMGEyIDIgMCAwIDAgMi0ybDEtMTRcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvdHI+XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48IS0tIFBhZ2luYXRpb24gLS0+PCEtLSBSUyAwM0ZFQjIwMjUgLS0+XG48ZGl2ICpuZ0lmPVwic2hvd1BhZ2luYXRpb25cIiBjbGFzcz1cInBhZ2luYXRpb24tY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXRlbXMtcGVyLXBhZ2VcIj5cbiAgICAgIDxzcGFuPkl0ZW1zIHBlciBwYWdlOjwvc3Bhbj5cbiAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJpdGVtc1BlclBhZ2VcIiAoY2hhbmdlKT1cInVwZGF0ZVBhZ2luYXRpb24oKVwiIGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIj41PC9vcHRpb24+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMFwiPjEwPC9vcHRpb24+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCIyMFwiPjIwPC9vcHRpb24+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCI1MFwiPjUwPC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFnZS1pbmZvIG1zLTMgbWUtM1wiPlxuICAgICAge3soKGN1cnJlbnRQYWdlIC0gMSkgKiBpdGVtc1BlclBhZ2UgKyAxKX19IC0ge3tNYXRoLm1pbihjdXJyZW50UGFnZSAqIGl0ZW1zUGVyUGFnZSwgdG90YWxJdGVtcyl9fSBvZiB7e3RvdGFsSXRlbXN9fVxuICAgIDwvZGl2PlxuICAgIDxuYXYgYXJpYS1sYWJlbD1cIlRhYmxlIHBhZ2luYXRpb25cIj5cbiAgICAgIDwhLS0gRmlyc3QgcGFnZSAtLT48IS0tIFJTIDAzRkVCMjAyNSAtLT5cbiAgICAgIDx1bCBjbGFzcz1cInBhZ2luYXRpb24gbWItMFwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiBbY2xhc3MuZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IDFcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJzZXRQYWdlKDEpXCI+wqs8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiIFtjbGFzcy5kaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNldFBhZ2UoY3VycmVudFBhZ2UgLSAxKVwiPuKAuTwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPCEtLSBEeW5hbWljIHBhZ2luYXRpb24gLS0+PCEtLSBSUyAwM0ZFQjIwMjUgLS0+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiICpuZ0Zvcj1cImxldCBwYWdlIG9mIHBhZ2VzXCIgW2NsYXNzLmFjdGl2ZV09XCJwYWdlID09PSBjdXJyZW50UGFnZVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNldFBhZ2UocGFnZSlcIj57e3BhZ2V9fTwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCIgW2NsYXNzLmRpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSBwYWdlcy5sZW5ndGhcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJzZXRQYWdlKGN1cnJlbnRQYWdlICsgMSlcIj7igLo8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDwhLS0gTGFzdCBwYWdlIC0tPlxuICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiBbY2xhc3MuZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IHBhZ2VzLmxlbmd0aFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNldFBhZ2UocGFnZXMubGVuZ3RoKVwiPsK7PC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L25hdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gUlMgMDNGRUIyMDI1IC0tPlxuPCEtLSBBZGQgUm93IEJ1dHRvbiAtLT5cbjxkaXYgKm5nSWY9XCJzaG93QWRkUm93XCIgIChjbGljayk9XCJhZGRSb3coKVwiIGNsYXNzPVwiYWRkUm93Q2xhc3NcIj5cbiAgPGRpdiBjbGFzcz1cImNpcmNsZS1idXR0b25cIj4rPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../i18n.service";
|
|
4
|
-
import * as i2 from "../../services/change.service";
|
|
5
|
-
import * as i3 from "@angular/common";
|
|
6
|
-
import * as i4 from "@angular/forms";
|
|
7
|
-
export class CustomTextAreaComponent {
|
|
8
|
-
i18nService;
|
|
9
|
-
changeService;
|
|
10
|
-
value; // input value
|
|
11
|
-
placeholder;
|
|
12
|
-
rows; //The number of visible text lines for the control
|
|
13
|
-
error;
|
|
14
|
-
question;
|
|
15
|
-
readOnly = false; // VD 12Jun24 - readonly change
|
|
16
|
-
textareaValueChange = new EventEmitter();
|
|
17
|
-
subscription;
|
|
18
|
-
constructor(i18nService, changeService) {
|
|
19
|
-
this.i18nService = i18nService;
|
|
20
|
-
this.changeService = changeService;
|
|
21
|
-
}
|
|
22
|
-
// RS 09DEC24 Changed keys
|
|
23
|
-
ngOnInit() {
|
|
24
|
-
// 10MAY24 - VD Dependent update
|
|
25
|
-
if (this.question.subText) {
|
|
26
|
-
let dependencyObj = JSON.parse(this.question.subText);
|
|
27
|
-
if (dependencyObj.sourceQuestionId) {
|
|
28
|
-
// Subscribe for the changes
|
|
29
|
-
this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
|
|
30
|
-
if (changeValue != undefined) {
|
|
31
|
-
if (changeValue.valueObj != undefined && changeValue.fromQuestionId == dependencyObj.sourceQuestionId) {
|
|
32
|
-
this.value = changeValue.valueObj[dependencyObj.valueField];
|
|
33
|
-
this.textareaValueChange.emit(this.value);
|
|
34
|
-
}
|
|
35
|
-
this.changeService.confirmChange(dependencyObj.sourceQuestionId);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
onTextareaChange(event) {
|
|
42
|
-
this.textareaValueChange.emit(event.target.value);
|
|
43
|
-
}
|
|
44
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomTextAreaComponent, deps: [{ token: i1.I18nService }, { token: i2.ChangeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
45
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CustomTextAreaComponent, selector: "app-custom-text-area", inputs: { value: "value", placeholder: "placeholder", rows: "rows", error: "error", question: "question", readOnly: "readOnly" }, outputs: { textareaValueChange: "textareaValueChange" }, ngImport: i0, template: "<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- RS 09DEC24 Changed keys--> \n<textarea \n [class]=\"error ? 'invalid' : ''\"\n [(ngModel)] =\"value\" \n [rows]=\"rows\" \n class=\"she-line-input form-control\" \n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n (input)=\"onTextareaChange($event)\"\n></textarea>\n<!-- HA 19DEC23 For translation -->\n<span *ngIf=\"error\" class=\"error-msg\">{{ question?.errorMessage }}</span>", styles: [".invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
46
|
-
}
|
|
47
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomTextAreaComponent, decorators: [{
|
|
48
|
-
type: Component,
|
|
49
|
-
args: [{ selector: 'app-custom-text-area', template: "<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- RS 09DEC24 Changed keys--> \n<textarea \n [class]=\"error ? 'invalid' : ''\"\n [(ngModel)] =\"value\" \n [rows]=\"rows\" \n class=\"she-line-input form-control\" \n [placeholder]=\"placeholder\"\n [readOnly]=\"readOnly\"\n (input)=\"onTextareaChange($event)\"\n></textarea>\n<!-- HA 19DEC23 For translation -->\n<span *ngIf=\"error\" class=\"error-msg\">{{ question?.errorMessage }}</span>", styles: [".invalid{border:1px solid red!important}\n"] }]
|
|
50
|
-
}], ctorParameters: () => [{ type: i1.I18nService }, { type: i2.ChangeService }], propDecorators: { value: [{
|
|
51
|
-
type: Input
|
|
52
|
-
}], placeholder: [{
|
|
53
|
-
type: Input
|
|
54
|
-
}], rows: [{
|
|
55
|
-
type: Input
|
|
56
|
-
}], error: [{
|
|
57
|
-
type: Input
|
|
58
|
-
}], question: [{
|
|
59
|
-
type: Input
|
|
60
|
-
}], readOnly: [{
|
|
61
|
-
type: Input
|
|
62
|
-
}], textareaValueChange: [{
|
|
63
|
-
type: Output
|
|
64
|
-
}] } });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXRleHQtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tdGV4dC1hcmVhL2N1c3RvbS10ZXh0LWFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLXRleHQtYXJlYS9jdXN0b20tdGV4dC1hcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVkvRSxNQUFNLE9BQU8sdUJBQXVCO0lBVWY7SUFBaUM7SUFUM0MsS0FBSyxDQUFjLENBQUMsY0FBYztJQUNsQyxXQUFXLENBQVE7SUFDbkIsSUFBSSxDQUFRLENBQUMsa0RBQWtEO0lBQy9ELEtBQUssQ0FBSztJQUNWLFFBQVEsQ0FBSztJQUNiLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQywrQkFBK0I7SUFDaEQsbUJBQW1CLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7SUFDakYsWUFBWSxDQUFlO0lBRTNCLFlBQW1CLFdBQXdCLEVBQVMsYUFBNEI7UUFBN0QsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUFJLENBQUM7SUFDckYsMEJBQTBCO0lBQzFCLFFBQVE7UUFDTixnQ0FBZ0M7UUFDOUIsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBQyxDQUFDO1lBQ3hCLElBQUksYUFBYSxHQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEUsSUFBRyxhQUFhLENBQUMsZ0JBQWdCLEVBQUMsQ0FBQztnQkFDakMsNEJBQTRCO2dCQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUMvRCxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUNkLElBQUcsV0FBVyxJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUM1QixJQUFHLFdBQVcsQ0FBQyxRQUFRLElBQUksU0FBUyxJQUFJLFdBQVcsQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7NEJBQ3JHLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQzVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUM1QyxDQUFDO3dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNuRSxDQUFDO2dCQUNILENBQUMsQ0FDRixDQUFDO1lBQ04sQ0FBQztRQUNILENBQUM7SUFFSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBUztRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQzt3R0FwQ1UsdUJBQXVCOzRGQUF2Qix1QkFBdUIsdVBDWnBDLGtmQWF5RTs7NEZERDVELHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7NEdBS3ZCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU1ldGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RlcGVuZGVuY3lNZXRhJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS10ZXh0LWFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLXRleHQtYXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS10ZXh0LWFyZWEuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVRleHRBcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdmFsdWU6IGFueSB8IGFueVtdOyAvLyBpbnB1dCB2YWx1ZVxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjpzdHJpbmc7XG4gIEBJbnB1dCgpIHJvd3M6TnVtYmVyOyAvL1RoZSBudW1iZXIgb2YgdmlzaWJsZSB0ZXh0IGxpbmVzIGZvciB0aGUgY29udHJvbFxuICBASW5wdXQoKSBlcnJvcjphbnk7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uOmFueTtcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTsgLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZVxuICBAT3V0cHV0KCkgdGV4dGFyZWFWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2UscHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlKSB7IH1cbiAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gMTBNQVkyNCAtIFZEIERlcGVuZGVudCB1cGRhdGVcbiAgICAgIGlmKHRoaXMucXVlc3Rpb24uc3ViVGV4dCl7XG4gICAgICAgIGxldCBkZXBlbmRlbmN5T2JqOiBEZXBlbmRlbmN5TWV0YSA9IEpTT04ucGFyc2UodGhpcy5xdWVzdGlvbi5zdWJUZXh0KTtcbiAgICAgICAgaWYoZGVwZW5kZW5jeU9iai5zb3VyY2VRdWVzdGlvbklkKXtcbiAgICAgICAgICAvLyBTdWJzY3JpYmUgZm9yIHRoZSBjaGFuZ2VzXG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY2hhbmdlQW5ub3VuY2VkJC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUudmFsdWVPYmogIT0gdW5kZWZpbmVkICYmIGNoYW5nZVZhbHVlLmZyb21RdWVzdGlvbklkID09IGRlcGVuZGVuY3lPYmouc291cmNlUXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNoYW5nZVZhbHVlLnZhbHVlT2JqW2RlcGVuZGVuY3lPYmoudmFsdWVGaWVsZF07XG4gICAgICAgICAgICAgICAgICB0aGlzLnRleHRhcmVhVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmNvbmZpcm1DaGFuZ2UoZGVwZW5kZW5jeU9iai5zb3VyY2VRdWVzdGlvbklkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICB9XG5cbiAgb25UZXh0YXJlYUNoYW5nZShldmVudDphbnkpOiB2b2lkIHtcbiAgICB0aGlzLnRleHRhcmVhVmFsdWVDaGFuZ2UuZW1pdChldmVudC50YXJnZXQudmFsdWUpO1xuICB9XG5cbn1cbiIsIjwhLS0gLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZS0tPlxuPCEtLSBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2UtLT5cbjwhLS0gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXMtLT4gXG48dGV4dGFyZWEgXG4gICAgW2NsYXNzXT1cImVycm9yID8gJ2ludmFsaWQnIDogJydcIlxuICAgIFsobmdNb2RlbCldID1cInZhbHVlXCIgXG4gICAgW3Jvd3NdPVwicm93c1wiIFxuICAgIGNsYXNzPVwic2hlLWxpbmUtaW5wdXQgZm9ybS1jb250cm9sXCIgXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgIChpbnB1dCk9XCJvblRleHRhcmVhQ2hhbmdlKCRldmVudClcIlxuPjwvdGV4dGFyZWE+XG48IS0tIEhBIDE5REVDMjMgRm9yIHRyYW5zbGF0aW9uIC0tPlxuPHNwYW4gKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3ItbXNnXCI+e3sgcXVlc3Rpb24/LmVycm9yTWVzc2FnZSB9fTwvc3Bhbj4iXX0=
|