ms-data-grid 0.0.91 → 0.0.93
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/esm2022/lib/data-grid/data-grid.component.mjs +42 -17
- package/esm2022/lib/services/row-action.service.mjs +145 -0
- package/fesm2022/ms-data-grid.mjs +181 -14
- package/fesm2022/ms-data-grid.mjs.map +1 -1
- package/lib/data-grid/data-grid.component.d.ts +9 -2
- package/lib/services/row-action.service.d.ts +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class RowActionService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.STATUS_SETS = {
|
|
6
|
+
EDIT_BLOCKED: [
|
|
7
|
+
'expired', 'closed', 'Assigning Stop', 'Evaluation Start',
|
|
8
|
+
'Evaluation Stop', 'Completed', 'approved', 'rejected',
|
|
9
|
+
'partially', 'accepted'
|
|
10
|
+
],
|
|
11
|
+
ARCHIVE_BLOCKED: [
|
|
12
|
+
'approved', 'partially', 'Assigning Start',
|
|
13
|
+
'Completed', 'Evaluation Start'
|
|
14
|
+
],
|
|
15
|
+
DISPOSED: ['scrap', 'trashed', 'disposed'],
|
|
16
|
+
SEPARATED: ['termination', 'resignation', 'retirement', 'separated'],
|
|
17
|
+
UNAVAILABLE: ['unavailable', 'unAvailable']
|
|
18
|
+
};
|
|
19
|
+
this.ACTION_ALIASES = {
|
|
20
|
+
accept: 'view',
|
|
21
|
+
achive: 'unactive'
|
|
22
|
+
};
|
|
23
|
+
this.rules = {
|
|
24
|
+
assigningstart: (r) => r.status === 'To be start Assigning' && !r.isDeleted,
|
|
25
|
+
assigningstop: (r) => r.status === 'Assigning Start' && !r.isDeleted,
|
|
26
|
+
evaluationstart: (r) => r.status === 'Assigning Stop' && !r.isDeleted,
|
|
27
|
+
completed: (r) => r.status === 'Evaluation Start' && !r.isDeleted,
|
|
28
|
+
archive: (r) => this.canArchiveOrDelete(r),
|
|
29
|
+
unactive: (r) => this.canArchiveOrDelete(r),
|
|
30
|
+
delete: (r) => this.canArchiveOrDelete(r),
|
|
31
|
+
unarchive: (r) => r.isDeleted && r.availStatus !== 'disposed',
|
|
32
|
+
active: (r) => r.isDeleted && r.availStatus !== 'disposed',
|
|
33
|
+
link: (r) => !this.STATUS_SETS.UNAVAILABLE.includes(r.status) &&
|
|
34
|
+
!r.isDeleted &&
|
|
35
|
+
r.availStatus !== 'disposed' &&
|
|
36
|
+
r.status !== 'linked',
|
|
37
|
+
unlink: (r, ctx) => ctx.showUnLink === true && r.status === 'linked',
|
|
38
|
+
rejoin: (r) => this.STATUS_SETS.SEPARATED.includes(r.accountStatus),
|
|
39
|
+
settlementinfo: (r) => this.STATUS_SETS.SEPARATED.includes(r.accountStatus),
|
|
40
|
+
assign: (r) => r.status !== 'assigned',
|
|
41
|
+
edit: (r, ctx) => this.canEdit(r, ctx),
|
|
42
|
+
trash: (r) => !this.STATUS_SETS.DISPOSED.includes(r.availStatus),
|
|
43
|
+
scrap: (r) => !this.STATUS_SETS.DISPOSED.includes(r.availStatus),
|
|
44
|
+
retain: (r) => !this.STATUS_SETS.DISPOSED.includes(r.availStatus),
|
|
45
|
+
defaultgrade: (r) => r.isCustomGrade !== 'Active',
|
|
46
|
+
subscribe: (r, ctx) => !r.assignedToIds.includes(ctx.currentUserId),
|
|
47
|
+
unsubscribe: (r, ctx) => r.assignedToIds.includes(ctx.currentUserId),
|
|
48
|
+
changestatus: (r) => !r.isDeleted,
|
|
49
|
+
download: (r) => r.offerLetter !== null,
|
|
50
|
+
view: (r) => r.offerLetter !== null
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
normalizeRow(element) {
|
|
54
|
+
return {
|
|
55
|
+
isDeleted: element.is_deleted === true || element.is_deleted === 'true',
|
|
56
|
+
status: element.status || '',
|
|
57
|
+
availStatus: element.availStatus || '',
|
|
58
|
+
accountStatus: (element.account_status || '').toLowerCase(),
|
|
59
|
+
assigneeCount: element.assignee?.length ?? 0,
|
|
60
|
+
assignedToIds: element.assigned_to?.map((x) => x.id) ?? [],
|
|
61
|
+
settlementCompleted: element.settlement_completed === true,
|
|
62
|
+
finalSettlementCompleted: element.final_settlement_completed === true,
|
|
63
|
+
storeEdit: element.store_edit !== false,
|
|
64
|
+
isOwner: element.is_owner ?? true,
|
|
65
|
+
isCustomGrade: element.is_custom_grade || '',
|
|
66
|
+
parent: element.parent,
|
|
67
|
+
offerLetter: element.offer_letter,
|
|
68
|
+
typename: element.__typename || ''
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
normalizeAction(action, ctx) {
|
|
72
|
+
let normalized = this.ACTION_ALIASES[action] || action;
|
|
73
|
+
if (ctx.packageData) {
|
|
74
|
+
if (action === 'unarchive')
|
|
75
|
+
return 'active';
|
|
76
|
+
if (action === 'archive')
|
|
77
|
+
return 'unactive';
|
|
78
|
+
}
|
|
79
|
+
return normalized.toLowerCase();
|
|
80
|
+
}
|
|
81
|
+
canArchiveOrDelete(r) {
|
|
82
|
+
return (!r.isDeleted &&
|
|
83
|
+
!r.settlementCompleted &&
|
|
84
|
+
!r.finalSettlementCompleted &&
|
|
85
|
+
r.availStatus !== 'reserved' &&
|
|
86
|
+
r.assigneeCount === 0 &&
|
|
87
|
+
r.availStatus !== 'disposed' &&
|
|
88
|
+
r.availStatus !== 'maintenance' &&
|
|
89
|
+
r.availStatus !== 'assigned' &&
|
|
90
|
+
!this.STATUS_SETS.ARCHIVE_BLOCKED.includes(r.status) &&
|
|
91
|
+
r.parent !== null);
|
|
92
|
+
}
|
|
93
|
+
canEdit(r, ctx) {
|
|
94
|
+
const isBlocked = this.STATUS_SETS.EDIT_BLOCKED.includes(r.status) ||
|
|
95
|
+
r.isDeleted ||
|
|
96
|
+
!r.storeEdit ||
|
|
97
|
+
r.availStatus === 'disposed' ||
|
|
98
|
+
r.settlementCompleted ||
|
|
99
|
+
r.finalSettlementCompleted;
|
|
100
|
+
if (isBlocked)
|
|
101
|
+
return false;
|
|
102
|
+
if (ctx.tableType === 'BusinessExpenseListing') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return r.status !== 'accepted' && r.isOwner;
|
|
106
|
+
}
|
|
107
|
+
isActionValid(action, element, ctx = {}) {
|
|
108
|
+
const row = this.normalizeRow(element);
|
|
109
|
+
const normalizedAction = this.normalizeAction(action, ctx);
|
|
110
|
+
const rule = this.rules[normalizedAction];
|
|
111
|
+
if (rule) {
|
|
112
|
+
return rule(row, ctx);
|
|
113
|
+
}
|
|
114
|
+
return row.availStatus !== 'disposed' || row.typename === 'Alert';
|
|
115
|
+
}
|
|
116
|
+
getValidActions(actions, element, ctx = {}) {
|
|
117
|
+
if (!actions?.length)
|
|
118
|
+
return [];
|
|
119
|
+
let validActions = actions.filter(action => this.isActionValid(action, element, ctx));
|
|
120
|
+
if (ctx.tableType === 'recruitmentListing') {
|
|
121
|
+
validActions = this.applyRecruitmentFilters(validActions, element);
|
|
122
|
+
}
|
|
123
|
+
return validActions;
|
|
124
|
+
}
|
|
125
|
+
applyRecruitmentFilters(actions, element) {
|
|
126
|
+
let filtered = [...actions];
|
|
127
|
+
if (element?.status === 'hired' && !element?.is_deleted) {
|
|
128
|
+
filtered = filtered.filter(action => !['changestatus', 'unarchive', 'archive', 'edit'].includes(action));
|
|
129
|
+
}
|
|
130
|
+
if (element?.is_deleted) {
|
|
131
|
+
filtered = filtered.filter(action => action !== 'changestatus');
|
|
132
|
+
}
|
|
133
|
+
if (element?.offer_letter === null) {
|
|
134
|
+
filtered = filtered.filter(action => !['download', 'view'].includes(action));
|
|
135
|
+
}
|
|
136
|
+
return filtered;
|
|
137
|
+
}
|
|
138
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RowActionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
139
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RowActionService, providedIn: 'root' }); }
|
|
140
|
+
}
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RowActionService, decorators: [{
|
|
142
|
+
type: Injectable,
|
|
143
|
+
args: [{ providedIn: 'root' }]
|
|
144
|
+
}] });
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LWFjdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS1ncmlkL3NyYy9saWIvc2VydmljZXMvcm93LWFjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBNkIzQyxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBR21CLGdCQUFXLEdBQUc7WUFDN0IsWUFBWSxFQUFFO2dCQUNaLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCO2dCQUN6RCxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RELFdBQVcsRUFBRSxVQUFVO2FBQ3hCO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLFVBQVUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCO2dCQUMxQyxXQUFXLEVBQUUsa0JBQWtCO2FBQ2hDO1lBQ0QsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDMUMsU0FBUyxFQUFFLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDO1lBQ3BFLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUM7U0FDbkMsQ0FBQztRQUVNLG1CQUFjLEdBQTJCO1lBQ3hELE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQztRQUVlLFVBQUssR0FBK0I7WUFDbkQsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLHVCQUF1QixJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0UsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDLFNB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SyxvQkFBb0IsRUFBRTtZQUMxQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNwRTtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxPQUFpQixFQUFFLE9BQVk7UUFDN0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFO1lBQ3ZELFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ2xDLENBQUMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ25FLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUN2QixRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQztTQUNqRTtRQUVELElBQUksT0FBTyxFQUFFLFlBQVksS0FBSyxJQUFJLEVBQUU7WUFDbEMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDbEMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ3ZDLENBQUM7U0FDSDtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7K0dBNUtVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNvbnRleHQge1xyXG4gIHRhYmxlVHlwZT86IHN0cmluZztcclxuICBwYWNrYWdlRGF0YT86IGJvb2xlYW47XHJcbiAgc2hvd1VuTGluaz86IGJvb2xlYW47XHJcbiAgY3VycmVudFVzZXJJZD86IHN0cmluZyB8IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRSb3cge1xyXG4gIGlzRGVsZXRlZDogYm9vbGVhbjtcclxuICBzdGF0dXM6IHN0cmluZztcclxuICBhdmFpbFN0YXR1czogc3RyaW5nO1xyXG4gIGFjY291bnRTdGF0dXM6IHN0cmluZztcclxuICBhc3NpZ25lZUNvdW50OiBudW1iZXI7XHJcbiAgYXNzaWduZWRUb0lkczogKHN0cmluZyB8IG51bWJlcilbXTtcclxuICBzZXR0bGVtZW50Q29tcGxldGVkOiBib29sZWFuO1xyXG4gIGZpbmFsU2V0dGxlbWVudENvbXBsZXRlZDogYm9vbGVhbjtcclxuICBzdG9yZUVkaXQ6IGJvb2xlYW47XHJcbiAgaXNPd25lcjogYm9vbGVhbjtcclxuICBpc0N1c3RvbUdyYWRlOiBzdHJpbmc7XHJcbiAgcGFyZW50OiBhbnk7XHJcbiAgb2ZmZXJMZXR0ZXI6IGFueTtcclxuICB0eXBlbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIEFjdGlvblJ1bGUgPSAocm93OiBOb3JtYWxpemVkUm93LCBjdHg6IEFjdGlvbkNvbnRleHQpID0+IGJvb2xlYW47XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgUm93QWN0aW9uU2VydmljZSB7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX1NFVFMgPSB7XHJcbiAgICBFRElUX0JMT0NLRUQ6IFtcclxuICAgICAgJ2V4cGlyZWQnLCAnY2xvc2VkJywgJ0Fzc2lnbmluZyBTdG9wJywgJ0V2YWx1YXRpb24gU3RhcnQnLFxyXG4gICAgICAnRXZhbHVhdGlvbiBTdG9wJywgJ0NvbXBsZXRlZCcsICdhcHByb3ZlZCcsICdyZWplY3RlZCcsXHJcbiAgICAgICdwYXJ0aWFsbHknLCAnYWNjZXB0ZWQnXHJcbiAgICBdLFxyXG4gICAgQVJDSElWRV9CTE9DS0VEOiBbXHJcbiAgICAgICdhcHByb3ZlZCcsICdwYXJ0aWFsbHknLCAnQXNzaWduaW5nIFN0YXJ0JyxcclxuICAgICAgJ0NvbXBsZXRlZCcsICdFdmFsdWF0aW9uIFN0YXJ0J1xyXG4gICAgXSxcclxuICAgIERJU1BPU0VEOiBbJ3NjcmFwJywgJ3RyYXNoZWQnLCAnZGlzcG9zZWQnXSxcclxuICAgIFNFUEFSQVRFRDogWyd0ZXJtaW5hdGlvbicsICdyZXNpZ25hdGlvbicsICdyZXRpcmVtZW50JywgJ3NlcGFyYXRlZCddLFxyXG4gICAgVU5BVkFJTEFCTEU6IFsndW5hdmFpbGFibGUnLCAndW5BdmFpbGFibGUnXVxyXG4gIH0gYXMgY29uc3Q7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQUNUSU9OX0FMSUFTRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICBhY2NlcHQ6ICd2aWV3JyxcclxuICAgIGFjaGl2ZTogJ3VuYWN0aXZlJ1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEFjdGlvblJ1bGU+ID0ge1xyXG4gICAgYXNzaWduaW5nc3RhcnQ6IChyKSA9PiByLnN0YXR1cyA9PT0gJ1RvIGJlIHN0YXJ0IEFzc2lnbmluZycgJiYgIXIuaXNEZWxldGVkLFxyXG4gICAgYXNzaWduaW5nc3RvcDogKHIpID0+IHIuc3RhdHVzID09PSAnQXNzaWduaW5nIFN0YXJ0JyAmJiAhci5pc0RlbGV0ZWQsXHJcbiAgICBldmFsdWF0aW9uc3RhcnQ6IChyKSA9PiByLnN0YXR1cyA9PT0gJ0Fzc2lnbmluZyBTdG9wJyAmJiAhci5pc0RlbGV0ZWQsXHJcbiAgICBjb21wbGV0ZWQ6IChyKSA9PiByLnN0YXR1cyA9PT0gJ0V2YWx1YXRpb24gU3RhcnQnICYmICFyLmlzRGVsZXRlZCxcclxuXHJcbiAgICBhcmNoaXZlOiAocikgPT4gdGhpcy5jYW5BcmNoaXZlT3JEZWxldGUociksXHJcbiAgICB1bmFjdGl2ZTogKHIpID0+IHRoaXMuY2FuQXJjaGl2ZU9yRGVsZXRlKHIpLFxyXG4gICAgZGVsZXRlOiAocikgPT4gdGhpcy5jYW5BcmNoaXZlT3JEZWxldGUociksXHJcblxyXG4gICAgdW5hcmNoaXZlOiAocikgPT4gci5pc0RlbGV0ZWQgJiYgci5hdmFpbFN0YXR1cyAhPT0gJ2Rpc3Bvc2VkJyxcclxuICAgIGFjdGl2ZTogKHIpID0+IHIuaXNEZWxldGVkICYmIHIuYXZhaWxTdGF0dXMgIT09ICdkaXNwb3NlZCcsXHJcblxyXG4gICAgbGluazogKHIpID0+IFxyXG4gICAgICAhdGhpcy5TVEFUVVNfU0VUUy5VTkFWQUlMQUJMRS5pbmNsdWRlcygoci5zdGF0dXMgYXMgYW55KSkgJiZcclxuICAgICAgIXIuaXNEZWxldGVkICYmXHJcbiAgICAgIHIuYXZhaWxTdGF0dXMgIT09ICdkaXNwb3NlZCcgJiZcclxuICAgICAgci5zdGF0dXMgIT09ICdsaW5rZWQnLFxyXG4gICAgdW5saW5rOiAociwgY3R4KSA9PiBjdHguc2hvd1VuTGluayA9PT0gdHJ1ZSAmJiByLnN0YXR1cyA9PT0gJ2xpbmtlZCcsXHJcblxyXG4gICAgcmVqb2luOiAocikgPT4gdGhpcy5TVEFUVVNfU0VUUy5TRVBBUkFURUQuaW5jbHVkZXMoKHIuYWNjb3VudFN0YXR1cyBhcyBhbnkpKSxcclxuICAgIHNldHRsZW1lbnRpbmZvOiAocikgPT4gdGhpcy5TVEFUVVNfU0VUUy5TRVBBUkFURUQuaW5jbHVkZXMoKHIuYWNjb3VudFN0YXR1cyBhcyBhbnkpKSxcclxuXHJcbiAgICBhc3NpZ246IChyKSA9PiByLnN0YXR1cyAhPT0gJ2Fzc2lnbmVkJyxcclxuICAgIGVkaXQ6IChyLCBjdHgpID0+IHRoaXMuY2FuRWRpdChyLCBjdHgpLFxyXG5cclxuICAgIHRyYXNoOiAocikgPT4gIXRoaXMuU1RBVFVTX1NFVFMuRElTUE9TRUQuaW5jbHVkZXMoKHIuYXZhaWxTdGF0dXMgYXMgYW55KSksXHJcbiAgICBzY3JhcDogKHIpID0+ICF0aGlzLlNUQVRVU19TRVRTLkRJU1BPU0VELmluY2x1ZGVzKChyLmF2YWlsU3RhdHVzIGFzIGFueSkpLFxyXG4gICAgcmV0YWluOiAocikgPT4gIXRoaXMuU1RBVFVTX1NFVFMuRElTUE9TRUQuaW5jbHVkZXMoKHIuYXZhaWxTdGF0dXMgYXMgYW55KSksXHJcblxyXG4gICAgZGVmYXVsdGdyYWRlOiAocikgPT4gci5pc0N1c3RvbUdyYWRlICE9PSAnQWN0aXZlJyxcclxuXHJcbiAgICBzdWJzY3JpYmU6IChyLCBjdHgpID0+ICFyLmFzc2lnbmVkVG9JZHMuaW5jbHVkZXMoKGN0eC5jdXJyZW50VXNlcklkIGFzIGFueSkpLFxyXG4gICAgdW5zdWJzY3JpYmU6IChyLCBjdHgpID0+IHIuYXNzaWduZWRUb0lkcy5pbmNsdWRlcygoY3R4LmN1cnJlbnRVc2VySWQgYXMgYW55KSksXHJcblxyXG4gICAgY2hhbmdlc3RhdHVzOiAocikgPT4gIXIuaXNEZWxldGVkLFxyXG5cclxuICAgIGRvd25sb2FkOiAocikgPT4gci5vZmZlckxldHRlciAhPT0gbnVsbCxcclxuICAgIHZpZXc6IChyKSA9PiByLm9mZmVyTGV0dGVyICE9PSBudWxsXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVSb3coZWxlbWVudDogYW55KTogTm9ybWFsaXplZFJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpc0RlbGV0ZWQ6IGVsZW1lbnQuaXNfZGVsZXRlZCA9PT0gdHJ1ZSB8fCBlbGVtZW50LmlzX2RlbGV0ZWQgPT09ICd0cnVlJyxcclxuICAgICAgc3RhdHVzOiBlbGVtZW50LnN0YXR1cyB8fCAnJyxcclxuICAgICAgYXZhaWxTdGF0dXM6IGVsZW1lbnQuYXZhaWxTdGF0dXMgfHwgJycsXHJcbiAgICAgIGFjY291bnRTdGF0dXM6IChlbGVtZW50LmFjY291bnRfc3RhdHVzIHx8ICcnKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBhc3NpZ25lZUNvdW50OiBlbGVtZW50LmFzc2lnbmVlPy5sZW5ndGggPz8gMCxcclxuICAgICAgYXNzaWduZWRUb0lkczogZWxlbWVudC5hc3NpZ25lZF90bz8ubWFwKCh4OiBhbnkpID0+IHguaWQpID8/IFtdLFxyXG4gICAgICBzZXR0bGVtZW50Q29tcGxldGVkOiBlbGVtZW50LnNldHRsZW1lbnRfY29tcGxldGVkID09PSB0cnVlLFxyXG4gICAgICBmaW5hbFNldHRsZW1lbnRDb21wbGV0ZWQ6IGVsZW1lbnQuZmluYWxfc2V0dGxlbWVudF9jb21wbGV0ZWQgPT09IHRydWUsXHJcbiAgICAgIHN0b3JlRWRpdDogZWxlbWVudC5zdG9yZV9lZGl0ICE9PSBmYWxzZSxcclxuICAgICAgaXNPd25lcjogZWxlbWVudC5pc19vd25lciA/PyB0cnVlLFxyXG4gICAgICBpc0N1c3RvbUdyYWRlOiBlbGVtZW50LmlzX2N1c3RvbV9ncmFkZSB8fCAnJyxcclxuICAgICAgcGFyZW50OiBlbGVtZW50LnBhcmVudCxcclxuICAgICAgb2ZmZXJMZXR0ZXI6IGVsZW1lbnQub2ZmZXJfbGV0dGVyLFxyXG4gICAgICB0eXBlbmFtZTogZWxlbWVudC5fX3R5cGVuYW1lIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIGN0eDogQWN0aW9uQ29udGV4dCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMuQUNUSU9OX0FMSUFTRVNbYWN0aW9uXSB8fCBhY3Rpb247XHJcblxyXG4gICAgaWYgKGN0eC5wYWNrYWdlRGF0YSkge1xyXG4gICAgICBpZiAoYWN0aW9uID09PSAndW5hcmNoaXZlJykgcmV0dXJuICdhY3RpdmUnO1xyXG4gICAgICBpZiAoYWN0aW9uID09PSAnYXJjaGl2ZScpIHJldHVybiAndW5hY3RpdmUnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub3JtYWxpemVkLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbkFyY2hpdmVPckRlbGV0ZShyOiBOb3JtYWxpemVkUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhci5pc0RlbGV0ZWQgJiZcclxuICAgICAgIXIuc2V0dGxlbWVudENvbXBsZXRlZCAmJlxyXG4gICAgICAhci5maW5hbFNldHRsZW1lbnRDb21wbGV0ZWQgJiZcclxuICAgICAgci5hdmFpbFN0YXR1cyAhPT0gJ3Jlc2VydmVkJyAmJlxyXG4gICAgICByLmFzc2lnbmVlQ291bnQgPT09IDAgJiZcclxuICAgICAgci5hdmFpbFN0YXR1cyAhPT0gJ2Rpc3Bvc2VkJyAmJlxyXG4gICAgICByLmF2YWlsU3RhdHVzICE9PSAnbWFpbnRlbmFuY2UnICYmXHJcbiAgICAgIHIuYXZhaWxTdGF0dXMgIT09ICdhc3NpZ25lZCcgJiZcclxuICAgICAgIXRoaXMuU1RBVFVTX1NFVFMuQVJDSElWRV9CTE9DS0VELmluY2x1ZGVzKChyLnN0YXR1cyBhcyBhbnkpKSAmJlxyXG4gICAgICByLnBhcmVudCAhPT0gbnVsbFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FuRWRpdChyOiBOb3JtYWxpemVkUm93LCBjdHg6IEFjdGlvbkNvbnRleHQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzQmxvY2tlZCA9IFxyXG4gICAgICB0aGlzLlNUQVRVU19TRVRTLkVESVRfQkxPQ0tFRC5pbmNsdWRlcygoci5zdGF0dXMgYXMgYW55KSkgfHxcclxuICAgICAgci5pc0RlbGV0ZWQgfHxcclxuICAgICAgIXIuc3RvcmVFZGl0IHx8XHJcbiAgICAgIHIuYXZhaWxTdGF0dXMgPT09ICdkaXNwb3NlZCcgfHxcclxuICAgICAgci5zZXR0bGVtZW50Q29tcGxldGVkIHx8XHJcbiAgICAgIHIuZmluYWxTZXR0bGVtZW50Q29tcGxldGVkO1xyXG5cclxuICAgIGlmIChpc0Jsb2NrZWQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY3R4LnRhYmxlVHlwZSA9PT0gJ0J1c2luZXNzRXhwZW5zZUxpc3RpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByLnN0YXR1cyAhPT0gJ2FjY2VwdGVkJyAmJiByLmlzT3duZXI7XHJcbiAgfVxyXG5cclxuICBpc0FjdGlvblZhbGlkKGFjdGlvbjogc3RyaW5nLCBlbGVtZW50OiBhbnksIGN0eDogQWN0aW9uQ29udGV4dCA9IHt9KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByb3cgPSB0aGlzLm5vcm1hbGl6ZVJvdyhlbGVtZW50KTtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRBY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZUFjdGlvbihhY3Rpb24sIGN0eCk7XHJcbiAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlc1tub3JtYWxpemVkQWN0aW9uXTtcclxuXHJcbiAgICBpZiAocnVsZSkge1xyXG4gICAgICByZXR1cm4gcnVsZShyb3csIGN0eCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvdy5hdmFpbFN0YXR1cyAhPT0gJ2Rpc3Bvc2VkJyB8fCByb3cudHlwZW5hbWUgPT09ICdBbGVydCc7XHJcbiAgfVxyXG5cclxuICBnZXRWYWxpZEFjdGlvbnMoYWN0aW9uczogc3RyaW5nW10sIGVsZW1lbnQ6IGFueSwgY3R4OiBBY3Rpb25Db250ZXh0ID0ge30pOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWFjdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xyXG4gICAgXHJcbiAgICBsZXQgdmFsaWRBY3Rpb25zID0gYWN0aW9ucy5maWx0ZXIoYWN0aW9uID0+IFxyXG4gICAgICB0aGlzLmlzQWN0aW9uVmFsaWQoYWN0aW9uLCBlbGVtZW50LCBjdHgpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjdHgudGFibGVUeXBlID09PSAncmVjcnVpdG1lbnRMaXN0aW5nJykge1xyXG4gICAgICB2YWxpZEFjdGlvbnMgPSB0aGlzLmFwcGx5UmVjcnVpdG1lbnRGaWx0ZXJzKHZhbGlkQWN0aW9ucywgZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkQWN0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlSZWNydWl0bWVudEZpbHRlcnMoYWN0aW9uczogc3RyaW5nW10sIGVsZW1lbnQ6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCBmaWx0ZXJlZCA9IFsuLi5hY3Rpb25zXTtcclxuXHJcbiAgICBpZiAoZWxlbWVudD8uc3RhdHVzID09PSAnaGlyZWQnICYmICFlbGVtZW50Py5pc19kZWxldGVkKSB7XHJcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGFjdGlvbiA9PiBcclxuICAgICAgICAhWydjaGFuZ2VzdGF0dXMnLCAndW5hcmNoaXZlJywgJ2FyY2hpdmUnLCAnZWRpdCddLmluY2x1ZGVzKGFjdGlvbilcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWxlbWVudD8uaXNfZGVsZXRlZCkge1xyXG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihhY3Rpb24gPT4gYWN0aW9uICE9PSAnY2hhbmdlc3RhdHVzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVsZW1lbnQ/Lm9mZmVyX2xldHRlciA9PT0gbnVsbCkge1xyXG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihhY3Rpb24gPT4gXHJcbiAgICAgICAgIVsnZG93bmxvYWQnLCAndmlldyddLmluY2x1ZGVzKGFjdGlvbilcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG59Il19
|