ngx-techlify-checksheet 18.0.0
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/README.md +24 -0
- package/esm2022/lib/@shared/file-upload-button/file-upload-button.component.mjs +50 -0
- package/esm2022/lib/@shared/index.mjs +2 -0
- package/esm2022/lib/@shared/material.module.mjs +171 -0
- package/esm2022/lib/@shared/shared.module.mjs +54 -0
- package/esm2022/lib/checksheet/checksheet-form/checksheet-form.component.mjs +161 -0
- package/esm2022/lib/checksheet/checksheet-form-button/checksheet-form-button.component.mjs +58 -0
- package/esm2022/lib/checksheet/checksheet-format-list/checksheet-format-list.component.mjs +123 -0
- package/esm2022/lib/checksheet/checksheet-format-question.service.mjs +18 -0
- package/esm2022/lib/checksheet/checksheet-format.service.mjs +24 -0
- package/esm2022/lib/checksheet/checksheet-list/checksheet-list.component.mjs +138 -0
- package/esm2022/lib/checksheet/checksheet-node-view/checksheet-node-view.component.mjs +59 -0
- package/esm2022/lib/checksheet/checksheet-question/checksheet-question.component.mjs +174 -0
- package/esm2022/lib/checksheet/checksheet-question-form/checksheet-question-form.component.mjs +148 -0
- package/esm2022/lib/checksheet/checksheet-question-list/checksheet-question-list.component.mjs +161 -0
- package/esm2022/lib/checksheet/checksheet-report/checksheet-report.component.mjs +242 -0
- package/esm2022/lib/checksheet/checksheet-review-button/checksheet-review-button.component.mjs +68 -0
- package/esm2022/lib/checksheet/checksheet-routing.module.mjs +44 -0
- package/esm2022/lib/checksheet/checksheet-submission-answer.service.mjs +18 -0
- package/esm2022/lib/checksheet/checksheet-submission-delete-button/checksheet-submission-delete-button.component.mjs +52 -0
- package/esm2022/lib/checksheet/checksheet-submission-file/checksheet-submission-file-delete-button/checksheet-submission-file-delete-button.component.mjs +55 -0
- package/esm2022/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.mjs +67 -0
- package/esm2022/lib/checksheet/checksheet-submission-file-upload/checksheet-submisison-file-upload.component.mjs +46 -0
- package/esm2022/lib/checksheet/checksheet-submission-file.service.mjs +18 -0
- package/esm2022/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.mjs +131 -0
- package/esm2022/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.mjs +58 -0
- package/esm2022/lib/checksheet/checksheet-submission-list/checksheet-submission-list.component.mjs +107 -0
- package/esm2022/lib/checksheet/checksheet-submission-review-button/checksheet-submission-review-button.component.mjs +68 -0
- package/esm2022/lib/checksheet/checksheet-submission-view/checksheet-submission-view.component.mjs +142 -0
- package/esm2022/lib/checksheet/checksheet-submission.service.mjs +36 -0
- package/esm2022/lib/checksheet/checksheet-submittable.type.mjs +2 -0
- package/esm2022/lib/checksheet/checksheet-view/checksheet-view.component.mjs +140 -0
- package/esm2022/lib/checksheet/checksheet.module.mjs +131 -0
- package/esm2022/lib/checksheet/checksheet.service.mjs +44 -0
- package/esm2022/lib/checksheet/mechanical-issue-form/mechanical-issue-form.component.mjs +73 -0
- package/esm2022/ngx-techlify-checksheet.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/ngx-techlify-checksheet.mjs +2550 -0
- package/fesm2022/ngx-techlify-checksheet.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/@shared/file-upload-button/file-upload-button.component.d.ts +20 -0
- package/lib/@shared/index.d.ts +1 -0
- package/lib/@shared/material.module.d.ts +40 -0
- package/lib/@shared/shared.module.d.ts +14 -0
- package/lib/checksheet/checksheet-form/checksheet-form.component.d.ts +45 -0
- package/lib/checksheet/checksheet-form-button/checksheet-form-button.component.d.ts +29 -0
- package/lib/checksheet/checksheet-format-list/checksheet-format-list.component.d.ts +19 -0
- package/lib/checksheet/checksheet-format-question.service.d.ts +7 -0
- package/lib/checksheet/checksheet-format.service.d.ts +10 -0
- package/lib/checksheet/checksheet-list/checksheet-list.component.d.ts +31 -0
- package/lib/checksheet/checksheet-node-view/checksheet-node-view.component.d.ts +25 -0
- package/lib/checksheet/checksheet-question/checksheet-question.component.d.ts +34 -0
- package/lib/checksheet/checksheet-question-form/checksheet-question-form.component.d.ts +38 -0
- package/lib/checksheet/checksheet-question-list/checksheet-question-list.component.d.ts +26 -0
- package/lib/checksheet/checksheet-report/checksheet-report.component.d.ts +47 -0
- package/lib/checksheet/checksheet-review-button/checksheet-review-button.component.d.ts +32 -0
- package/lib/checksheet/checksheet-routing.module.d.ts +7 -0
- package/lib/checksheet/checksheet-submission-answer.service.d.ts +7 -0
- package/lib/checksheet/checksheet-submission-delete-button/checksheet-submission-delete-button.component.d.ts +24 -0
- package/lib/checksheet/checksheet-submission-file/checksheet-submission-file-delete-button/checksheet-submission-file-delete-button.component.d.ts +24 -0
- package/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.d.ts +17 -0
- package/lib/checksheet/checksheet-submission-file-upload/checksheet-submisison-file-upload.component.d.ts +13 -0
- package/lib/checksheet/checksheet-submission-file.service.d.ts +7 -0
- package/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.d.ts +27 -0
- package/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.d.ts +29 -0
- package/lib/checksheet/checksheet-submission-list/checksheet-submission-list.component.d.ts +24 -0
- package/lib/checksheet/checksheet-submission-review-button/checksheet-submission-review-button.component.d.ts +32 -0
- package/lib/checksheet/checksheet-submission-view/checksheet-submission-view.component.d.ts +37 -0
- package/lib/checksheet/checksheet-submission.service.d.ts +22 -0
- package/lib/checksheet/checksheet-submittable.type.d.ts +1 -0
- package/lib/checksheet/checksheet-view/checksheet-view.component.d.ts +37 -0
- package/lib/checksheet/checksheet.module.d.ts +34 -0
- package/lib/checksheet/checksheet.service.d.ts +25 -0
- package/lib/checksheet/mechanical-issue-form/mechanical-issue-form.component.d.ts +21 -0
- package/package.json +45 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { debounceTime } from 'rxjs/operators';
|
|
4
|
+
import { UntilDestroy } from '@ngneat/until-destroy';
|
|
5
|
+
import { Editor } from 'ngx-editor';
|
|
6
|
+
import { FormControl } from '@angular/forms';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../checksheet-submission-answer.service";
|
|
9
|
+
import * as i2 from "@angular/common";
|
|
10
|
+
import * as i3 from "@angular/flex-layout/flex";
|
|
11
|
+
import * as i4 from "@angular/material/checkbox";
|
|
12
|
+
import * as i5 from "@angular/material/datepicker";
|
|
13
|
+
import * as i6 from "@angular/material/form-field";
|
|
14
|
+
import * as i7 from "@angular/material/input";
|
|
15
|
+
import * as i8 from "@angular/material/progress-bar";
|
|
16
|
+
import * as i9 from "@angular/material/radio";
|
|
17
|
+
import * as i10 from "@angular/forms";
|
|
18
|
+
import * as i11 from "ngx-editor";
|
|
19
|
+
import * as i12 from "../checksheet-submission-file-upload/checksheet-submisison-file-upload.component";
|
|
20
|
+
import * as i13 from "../checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component";
|
|
21
|
+
let ChecksheetQuestionComponent = class ChecksheetQuestionComponent {
|
|
22
|
+
checksheetSubmissionAnswerService;
|
|
23
|
+
questionInfo;
|
|
24
|
+
index;
|
|
25
|
+
submissionView;
|
|
26
|
+
submissionId;
|
|
27
|
+
disableInput;
|
|
28
|
+
fileEntityId;
|
|
29
|
+
editor;
|
|
30
|
+
isWorking = false;
|
|
31
|
+
isWorkingChange = new EventEmitter();
|
|
32
|
+
submittedAnswer = new FormControl('');
|
|
33
|
+
constructor(checksheetSubmissionAnswerService) {
|
|
34
|
+
this.checksheetSubmissionAnswerService = checksheetSubmissionAnswerService;
|
|
35
|
+
}
|
|
36
|
+
ngOnInit() {
|
|
37
|
+
console.log(this.disableInput, this.submissionView);
|
|
38
|
+
this.editor = new Editor();
|
|
39
|
+
this.submittedAnswer.valueChanges
|
|
40
|
+
.pipe(debounceTime(1000))
|
|
41
|
+
.subscribe((val) => {
|
|
42
|
+
if (this.questionInfo?.type_id === 1) {
|
|
43
|
+
this.saveAnswer({ answer_id: val });
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.saveAnswer({ details: val });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
if (this.submissionView) {
|
|
50
|
+
// load the answer for current submission question
|
|
51
|
+
this.loadAnswer();
|
|
52
|
+
}
|
|
53
|
+
this.fileEntityId = this.questionInfo.id;
|
|
54
|
+
}
|
|
55
|
+
onMultiSelectAnswerChange() {
|
|
56
|
+
const answerIds = this.questionInfo.answers
|
|
57
|
+
.filter((item) => item.isChecked)
|
|
58
|
+
.map((item) => item.id);
|
|
59
|
+
this.saveAnswer({ answer_ids: answerIds });
|
|
60
|
+
}
|
|
61
|
+
onMultiSelectYesNoAnswerChange(event, answer) {
|
|
62
|
+
this.saveAnswer({ answer_id: answer?.id, details: event.value });
|
|
63
|
+
}
|
|
64
|
+
getSubmittedMCQAnswer(answers = [], answer_id = null) {
|
|
65
|
+
if (answer_id) {
|
|
66
|
+
const submittedAnswer = answers.find((x) => x.id === answer_id);
|
|
67
|
+
if (submittedAnswer) {
|
|
68
|
+
return submittedAnswer?.value || '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
getSubmittedMSQAnswer() {
|
|
74
|
+
return (this.questionInfo?.answers)
|
|
75
|
+
.filter((answer) => answer?.isChecked)
|
|
76
|
+
?.map((answer) => answer.value)
|
|
77
|
+
?.join(', ');
|
|
78
|
+
}
|
|
79
|
+
loadAnswer() {
|
|
80
|
+
const params = {
|
|
81
|
+
submission_ids: this.submissionId,
|
|
82
|
+
question_ids: this.questionInfo?.id
|
|
83
|
+
};
|
|
84
|
+
this.isWorking = true;
|
|
85
|
+
this.checksheetSubmissionAnswerService.index(params).subscribe({
|
|
86
|
+
next: (response) => {
|
|
87
|
+
this.isWorking = false;
|
|
88
|
+
const answers = response?.data;
|
|
89
|
+
if (this.questionInfo?.type_id === 1 && answers?.length > 0) {
|
|
90
|
+
this.submittedAnswer.setValue(answers[0]?.answer_id, {
|
|
91
|
+
emitEvent: false
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else if (this.questionInfo?.type_id === 2) {
|
|
95
|
+
this.submittedAnswer.setValue(answers, { emitEvent: false });
|
|
96
|
+
this.questionInfo.answers = (this.questionInfo?.answers).map((answer) => {
|
|
97
|
+
return {
|
|
98
|
+
...answer,
|
|
99
|
+
isChecked: answers.some((item) => item.answer_id === answer.id)
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else if ((this.questionInfo?.type_id === 3 ||
|
|
104
|
+
this.questionInfo?.type_id === 4 ||
|
|
105
|
+
this.questionInfo?.type_id === 5 ||
|
|
106
|
+
this.questionInfo?.type_id === 6) &&
|
|
107
|
+
answers?.length > 0) {
|
|
108
|
+
this.submittedAnswer.setValue(answers[0].details || '', {
|
|
109
|
+
emitEvent: false
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else if (this.questionInfo?.type_id === 7) {
|
|
113
|
+
this.submittedAnswer.setValue(answers, { emitEvent: false });
|
|
114
|
+
this.questionInfo.answers = (this.questionInfo?.answers).map((answer) => {
|
|
115
|
+
const result = answers.find((item) => item.answer_id === answer.id);
|
|
116
|
+
return {
|
|
117
|
+
...answer,
|
|
118
|
+
selectedValue: result ? Boolean(Number(result?.details)) : null
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
error: () => (this.isWorking = false)
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Send request to save the question answers.
|
|
128
|
+
*
|
|
129
|
+
* @param answerData
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
saveAnswer(answerData) {
|
|
133
|
+
const data = {
|
|
134
|
+
question_id: this.questionInfo?.id,
|
|
135
|
+
submission_id: this.submissionId,
|
|
136
|
+
answer_id: answerData?.answer_id,
|
|
137
|
+
answer_ids: answerData?.answer_ids,
|
|
138
|
+
question_type_id: this.questionInfo?.type_id,
|
|
139
|
+
details: answerData?.details
|
|
140
|
+
};
|
|
141
|
+
this.isWorking = true;
|
|
142
|
+
this.checksheetSubmissionAnswerService.store(data).subscribe({
|
|
143
|
+
next: () => {
|
|
144
|
+
this.isWorking = false;
|
|
145
|
+
},
|
|
146
|
+
error: () => (this.isWorking = false)
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetQuestionComponent, deps: [{ token: i1.ChecksheetSubmissionAnswerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetQuestionComponent, selector: "app-checksheet-question", inputs: { questionInfo: "questionInfo", index: "index", submissionView: "submissionView", submissionId: "submissionId", disableInput: "disableInput", isWorking: "isWorking" }, outputs: { isWorkingChange: "isWorkingChange" }, ngImport: i0, template: "<div\n fxLayout=\"column\"\n fxLayoutGap=\"0.5rem\"\n class=\"mat-typography\"\n *ngIf=\"!submissionView\"\n>\n <div fxLayout=\"row\" fxLayoutGap=\"0.5rem\" class=\"font-weight-bold\">\n <div>{{ index + 1 }}.</div>\n <div [innerHTML]=\"questionInfo?.label\"></div>\n </div>\n <div fxLayout=\"row\" fxLayoutGap=\"0.5rem\">\n <small>{{ questionInfo?.type?.title }}</small>\n </div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 1\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <mat-radio-group class=\"answer-radio-group\" [disabled]=\"true\">\n <mat-radio-button\n class=\"answer-radio-button\"\n *ngFor=\"let answer of questionInfo?.answers\"\n [value]=\"answer.id\"\n >\n {{ answer.value }}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 2\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <div\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n *ngFor=\"let answer of questionInfo?.answers; let i = index\"\n >\n <mat-checkbox [disabled]=\"true\" fxFlex=\"80%\"\n >{{ i + 1 }} ) {{ answer.value }}</mat-checkbox\n >\n </div>\n </div>\n\n <div\n *ngIf=\"\n questionInfo?.type_id === 3 ||\n questionInfo?.type_id === 5 ||\n questionInfo?.type_id === 6\n \"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3 w-50 border short-answer\"\n ></div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 4\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3 w-50 border long-answer\"\n ></div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 7\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <ol>\n <li *ngFor=\"let answer of questionInfo?.answers\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div>{{ answer?.value }} -</div>\n <mat-radio-group [disabled]=\"true\" fxLayout=\"row\">\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" value=\"1\"\n >Yes\n </mat-radio-button>\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" value=\"0\"\n >No\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </li>\n </ol>\n </div>\n</div>\n\n<div *ngIf=\"submissionView\">\n <div class=\"d-flex justify-content-between align-items-center gap-3 mb-2\">\n <div class=\"d-flex align-items-center gap-2\">\n <strong>{{ index + 1 }}.</strong>\n <strong [innerHTML]=\"questionInfo?.label\"></strong>\n <app-checksheet-submission-file-upload\n [submissionId]=\"submissionId\"\n [questionId]=\"questionInfo?.id\"\n (uploaded)=\"checksheetSubmissionFilesComponent.reload()\"\n class=\"ml-3\"\n ></app-checksheet-submission-file-upload>\n </div>\n <span class=\"badge badge-primary\">{{ questionInfo?.type?.title }}</span>\n </div>\n <div class=\"d-flex justify-content-between align-items-start gap-1\">\n <div *ngIf=\"questionInfo?.type_id === 1\" class=\"d-flex flex-column gap-2\">\n <mat-radio-group\n class=\"answer-radio-group\"\n [disabled]=\"disableInput\"\n *ngIf=\"!disableInput\"\n [formControl]=\"submittedAnswer\"\n >\n <mat-radio-button\n class=\"answer-radio-button\"\n *ngFor=\"let answer of questionInfo?.answers\"\n [value]=\"answer.id\"\n >\n {{ answer.value }}\n </mat-radio-button>\n </mat-radio-group>\n <span *ngIf=\"disableInput\">\n <b>Answer:</b>\n {{\n getSubmittedMCQAnswer(\n questionInfo?.answers,\n this.submittedAnswer.value\n )\n }}\n </span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 2\" class=\"d-flex flex-column gap-2\">\n <ng-container *ngIf=\"!disableInput\">\n <div\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n *ngFor=\"let answer of questionInfo?.answers; let i = index\"\n >\n <mat-checkbox\n (change)=\"onMultiSelectAnswerChange()\"\n [disabled]=\"disableInput\"\n [(ngModel)]=\"answer.isChecked\"\n fxFlex=\"80%\"\n >\n {{ i + 1 }}\n )\n {{ answer.value }}\n </mat-checkbox>\n </div>\n </ng-container>\n\n <span *ngIf=\"disableInput\">\n <b>Answers:</b>\n {{ getSubmittedMSQAnswer() }}\n </span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 3 || questionInfo?.type_id === 4\">\n <div class=\"NgxEditor__Wrapper mb-2\" *ngIf=\"!disableInput\">\n <ngx-editor-menu [editor]=\"editor\"> </ngx-editor-menu>\n <ngx-editor\n [editor]=\"editor\"\n [formControl]=\"submittedAnswer\"\n ></ngx-editor>\n </div>\n <div *ngIf=\"disableInput\" [innerHtml]=\"submittedAnswer.value\"></div>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 5\">\n <mat-form-field *ngIf=\"!disableInput\">\n <mat-label>Answer</mat-label>\n <input\n matInput\n type=\"number\"\n size=\"10\"\n [formControl]=\"submittedAnswer\"\n />\n </mat-form-field>\n <span *ngIf=\"disableInput\">{{ submittedAnswer.value }}</span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 6\">\n <mat-form-field *ngIf=\"!disableInput\">\n <input\n matInput\n [matDatepicker]=\"picker\"\n placeholder=\"Date\"\n [formControl]=\"submittedAnswer\"\n (focus)=\"picker.open()\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n <span *ngIf=\"disableInput\">{{ submittedAnswer.value | date }}</span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 7 && !disableInput\">\n <ol>\n <li *ngFor=\"let answer of questionInfo?.answers\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div>{{ answer?.value }} -</div>\n <mat-radio-group\n fxLayout=\"row\"\n (change)=\"onMultiSelectYesNoAnswerChange($event, answer)\"\n [disabled]=\"disableInput\"\n [value]=\"answer.selectedValue\"\n >\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" [value]=\"true\">\n Yes\n </mat-radio-button>\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" [value]=\"false\">\n No\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </li>\n </ol>\n </div>\n\n <app-checksheet-submission-files\n class=\"w-50\"\n #checksheetSubmissionFilesComponent\n [submissionId]=\"submissionId\"\n [questionId]=\"questionInfo?.id\"\n ></app-checksheet-submission-files>\n </div>\n\n <ng-container *ngIf=\"questionInfo?.type_id === 7 && disableInput\">\n <div *ngFor=\"let answer of questionInfo?.answers\">\n {{ answer?.value }} - {{ answer?.selectedValue ? 'Yes' : 'No' }}\n </div>\n </ng-container>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n", styles: [".answer-radio-group{display:flex;flex-direction:column;margin:15px 0}.answer-radio-button{margin:5px}:host ::ng-deep .short-answer .ck.ck-content{min-height:100px!important}:host ::ng-deep .long-answer .ck.ck-content{min-height:200px!important}.scroll-container{max-height:650px;overflow-y:auto}.small-margin{margin-top:2px}:host ::ng-deep .yes-no .mat-radio-label-content{padding-left:3px}.main{display:block;position:relative;padding-left:24px;margin-bottom:15px;cursor:pointer}input[type=checkbox]{visibility:hidden}.geekmark{position:absolute;top:2px;left:0;height:15px;width:15px;background-color:#fff}.main input:checked~.geekmark{background-color:green}.geekmark:after{content:\"\";position:absolute;display:none}.main input:checked~.geekmark:after{display:block}.main .geekmark:after{left:5px;bottom:3px;width:6px;height:10px;border:solid white;border-width:0 4px 4px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}img{max-width:500px!important;max-height:500px!important}p{margin-bottom:0!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i9.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i9.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i10.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: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i11.NgxEditorComponent, selector: "ngx-editor", inputs: ["editor", "outputFormat", "placeholder"], outputs: ["focusOut", "focusIn"] }, { kind: "component", type: i11.MenuComponent, selector: "ngx-editor-menu", inputs: ["toolbar", "colorPresets", "disabled", "editor", "customMenuRef", "dropdownPlacement"] }, { kind: "component", type: i12.ChecksheetSubmissionFileUploadComponent, selector: "app-checksheet-submission-file-upload", inputs: ["submissionId", "questionId"], outputs: ["uploaded"] }, { kind: "component", type: i13.ChecksheetSubmissionFilesComponent, selector: "app-checksheet-submission-files", inputs: ["submissionId", "questionId"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], encapsulation: i0.ViewEncapsulation.None });
|
|
151
|
+
};
|
|
152
|
+
ChecksheetQuestionComponent = __decorate([
|
|
153
|
+
UntilDestroy()
|
|
154
|
+
], ChecksheetQuestionComponent);
|
|
155
|
+
export { ChecksheetQuestionComponent };
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetQuestionComponent, decorators: [{
|
|
157
|
+
type: Component,
|
|
158
|
+
args: [{ selector: 'app-checksheet-question', encapsulation: ViewEncapsulation.None, template: "<div\n fxLayout=\"column\"\n fxLayoutGap=\"0.5rem\"\n class=\"mat-typography\"\n *ngIf=\"!submissionView\"\n>\n <div fxLayout=\"row\" fxLayoutGap=\"0.5rem\" class=\"font-weight-bold\">\n <div>{{ index + 1 }}.</div>\n <div [innerHTML]=\"questionInfo?.label\"></div>\n </div>\n <div fxLayout=\"row\" fxLayoutGap=\"0.5rem\">\n <small>{{ questionInfo?.type?.title }}</small>\n </div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 1\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <mat-radio-group class=\"answer-radio-group\" [disabled]=\"true\">\n <mat-radio-button\n class=\"answer-radio-button\"\n *ngFor=\"let answer of questionInfo?.answers\"\n [value]=\"answer.id\"\n >\n {{ answer.value }}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 2\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <div\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n *ngFor=\"let answer of questionInfo?.answers; let i = index\"\n >\n <mat-checkbox [disabled]=\"true\" fxFlex=\"80%\"\n >{{ i + 1 }} ) {{ answer.value }}</mat-checkbox\n >\n </div>\n </div>\n\n <div\n *ngIf=\"\n questionInfo?.type_id === 3 ||\n questionInfo?.type_id === 5 ||\n questionInfo?.type_id === 6\n \"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3 w-50 border short-answer\"\n ></div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 4\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3 w-50 border long-answer\"\n ></div>\n\n <div\n *ngIf=\"questionInfo?.type_id === 7\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n class=\"mr-3\"\n >\n <ol>\n <li *ngFor=\"let answer of questionInfo?.answers\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div>{{ answer?.value }} -</div>\n <mat-radio-group [disabled]=\"true\" fxLayout=\"row\">\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" value=\"1\"\n >Yes\n </mat-radio-button>\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" value=\"0\"\n >No\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </li>\n </ol>\n </div>\n</div>\n\n<div *ngIf=\"submissionView\">\n <div class=\"d-flex justify-content-between align-items-center gap-3 mb-2\">\n <div class=\"d-flex align-items-center gap-2\">\n <strong>{{ index + 1 }}.</strong>\n <strong [innerHTML]=\"questionInfo?.label\"></strong>\n <app-checksheet-submission-file-upload\n [submissionId]=\"submissionId\"\n [questionId]=\"questionInfo?.id\"\n (uploaded)=\"checksheetSubmissionFilesComponent.reload()\"\n class=\"ml-3\"\n ></app-checksheet-submission-file-upload>\n </div>\n <span class=\"badge badge-primary\">{{ questionInfo?.type?.title }}</span>\n </div>\n <div class=\"d-flex justify-content-between align-items-start gap-1\">\n <div *ngIf=\"questionInfo?.type_id === 1\" class=\"d-flex flex-column gap-2\">\n <mat-radio-group\n class=\"answer-radio-group\"\n [disabled]=\"disableInput\"\n *ngIf=\"!disableInput\"\n [formControl]=\"submittedAnswer\"\n >\n <mat-radio-button\n class=\"answer-radio-button\"\n *ngFor=\"let answer of questionInfo?.answers\"\n [value]=\"answer.id\"\n >\n {{ answer.value }}\n </mat-radio-button>\n </mat-radio-group>\n <span *ngIf=\"disableInput\">\n <b>Answer:</b>\n {{\n getSubmittedMCQAnswer(\n questionInfo?.answers,\n this.submittedAnswer.value\n )\n }}\n </span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 2\" class=\"d-flex flex-column gap-2\">\n <ng-container *ngIf=\"!disableInput\">\n <div\n fxLayout=\"row\"\n fxLayoutAlign=\"start center\"\n *ngFor=\"let answer of questionInfo?.answers; let i = index\"\n >\n <mat-checkbox\n (change)=\"onMultiSelectAnswerChange()\"\n [disabled]=\"disableInput\"\n [(ngModel)]=\"answer.isChecked\"\n fxFlex=\"80%\"\n >\n {{ i + 1 }}\n )\n {{ answer.value }}\n </mat-checkbox>\n </div>\n </ng-container>\n\n <span *ngIf=\"disableInput\">\n <b>Answers:</b>\n {{ getSubmittedMSQAnswer() }}\n </span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 3 || questionInfo?.type_id === 4\">\n <div class=\"NgxEditor__Wrapper mb-2\" *ngIf=\"!disableInput\">\n <ngx-editor-menu [editor]=\"editor\"> </ngx-editor-menu>\n <ngx-editor\n [editor]=\"editor\"\n [formControl]=\"submittedAnswer\"\n ></ngx-editor>\n </div>\n <div *ngIf=\"disableInput\" [innerHtml]=\"submittedAnswer.value\"></div>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 5\">\n <mat-form-field *ngIf=\"!disableInput\">\n <mat-label>Answer</mat-label>\n <input\n matInput\n type=\"number\"\n size=\"10\"\n [formControl]=\"submittedAnswer\"\n />\n </mat-form-field>\n <span *ngIf=\"disableInput\">{{ submittedAnswer.value }}</span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 6\">\n <mat-form-field *ngIf=\"!disableInput\">\n <input\n matInput\n [matDatepicker]=\"picker\"\n placeholder=\"Date\"\n [formControl]=\"submittedAnswer\"\n (focus)=\"picker.open()\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n <span *ngIf=\"disableInput\">{{ submittedAnswer.value | date }}</span>\n </div>\n\n <div *ngIf=\"questionInfo?.type_id === 7 && !disableInput\">\n <ol>\n <li *ngFor=\"let answer of questionInfo?.answers\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div>{{ answer?.value }} -</div>\n <mat-radio-group\n fxLayout=\"row\"\n (change)=\"onMultiSelectYesNoAnswerChange($event, answer)\"\n [disabled]=\"disableInput\"\n [value]=\"answer.selectedValue\"\n >\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" [value]=\"true\">\n Yes\n </mat-radio-button>\n <mat-radio-button class=\"mt-1 ml-2 yes-no\" [value]=\"false\">\n No\n </mat-radio-button>\n </mat-radio-group>\n </div>\n </li>\n </ol>\n </div>\n\n <app-checksheet-submission-files\n class=\"w-50\"\n #checksheetSubmissionFilesComponent\n [submissionId]=\"submissionId\"\n [questionId]=\"questionInfo?.id\"\n ></app-checksheet-submission-files>\n </div>\n\n <ng-container *ngIf=\"questionInfo?.type_id === 7 && disableInput\">\n <div *ngFor=\"let answer of questionInfo?.answers\">\n {{ answer?.value }} - {{ answer?.selectedValue ? 'Yes' : 'No' }}\n </div>\n </ng-container>\n\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n", styles: [".answer-radio-group{display:flex;flex-direction:column;margin:15px 0}.answer-radio-button{margin:5px}:host ::ng-deep .short-answer .ck.ck-content{min-height:100px!important}:host ::ng-deep .long-answer .ck.ck-content{min-height:200px!important}.scroll-container{max-height:650px;overflow-y:auto}.small-margin{margin-top:2px}:host ::ng-deep .yes-no .mat-radio-label-content{padding-left:3px}.main{display:block;position:relative;padding-left:24px;margin-bottom:15px;cursor:pointer}input[type=checkbox]{visibility:hidden}.geekmark{position:absolute;top:2px;left:0;height:15px;width:15px;background-color:#fff}.main input:checked~.geekmark{background-color:green}.geekmark:after{content:\"\";position:absolute;display:none}.main input:checked~.geekmark:after{display:block}.main .geekmark:after{left:5px;bottom:3px;width:6px;height:10px;border:solid white;border-width:0 4px 4px 0;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}img{max-width:500px!important;max-height:500px!important}p{margin-bottom:0!important}\n"] }]
|
|
159
|
+
}], ctorParameters: () => [{ type: i1.ChecksheetSubmissionAnswerService }], propDecorators: { questionInfo: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], index: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], submissionView: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], submissionId: [{
|
|
166
|
+
type: Input
|
|
167
|
+
}], disableInput: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], isWorking: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], isWorkingChange: [{
|
|
172
|
+
type: Output
|
|
173
|
+
}] } });
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1xdWVzdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY2hlY2tzaGVldC9zcmMvbGliL2NoZWNrc2hlZXQvY2hlY2tzaGVldC1xdWVzdGlvbi9jaGVja3NoZWV0LXF1ZXN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXF1ZXN0aW9uL2NoZWNrc2hlZXQtcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVN0QyxJQUFNLDJCQUEyQixHQUFqQyxNQUFNLDJCQUEyQjtJQW1CNUI7SUFsQkQsWUFBWSxDQUFNO0lBRWxCLEtBQUssQ0FBTztJQUVaLGNBQWMsQ0FBVztJQUV6QixZQUFZLENBQVU7SUFFdEIsWUFBWSxDQUFXO0lBRWhDLFlBQVksQ0FBVTtJQUN0QixNQUFNLENBQVU7SUFFUCxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzFCLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQ3hELGVBQWUsR0FBZ0IsSUFBSSxXQUFXLENBQU0sRUFBRSxDQUFDLENBQUM7SUFFeEQsWUFDVSxp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VyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNsQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDaEMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtZQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU87WUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPO1NBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMzRCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTFKVSwyQkFBMkI7NEZBQTNCLDJCQUEyQixnU0NyQnhDLDB4T0EyT0E7O0FEdE5hLDJCQUEyQjtJQVB2QyxZQUFZLEVBQUU7R0FPRiwyQkFBMkIsQ0EySnZDOzs0RkEzSlksMkJBQTJCO2tCQU52QyxTQUFTOytCQUNFLHlCQUF5QixpQkFFcEIsaUJBQWlCLENBQUMsSUFBSTtzR0FJNUIsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3kgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnbmd4LWVkaXRvcic7XG5pbXBvcnQgeyBDaGVja3NoZWV0U3VibWlzc2lvbkFuc3dlclNlcnZpY2UgfSBmcm9tICcuLi9jaGVja3NoZWV0LXN1Ym1pc3Npb24tYW5zd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtcXVlc3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tzaGVldC1xdWVzdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsIC8vIExldHMgdXMgc3R5bGUgdGhlIGlubmVySFRNTCBjb2RlXG4gIHN0eWxlVXJsczogWycuL2NoZWNrc2hlZXQtcXVlc3Rpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0UXVlc3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBxdWVzdGlvbkluZm86IGFueTtcblxuICBASW5wdXQoKSBpbmRleCE6IGFueTtcblxuICBASW5wdXQoKSBzdWJtaXNzaW9uVmlldyE6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgc3VibWlzc2lvbklkITogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVJbnB1dCE6IGJvb2xlYW47XG5cbiAgZmlsZUVudGl0eUlkITogbnVtYmVyO1xuICBlZGl0b3IhOiBFZGl0b3I7XG5cbiAgQElucHV0KCkgaXNXb3JraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBpc1dvcmtpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHN1Ym1pdHRlZEFuc3dlcjogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8YW55PignJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGVja3NoZWV0U3VibWlzc2lvbkFuc3dlclNlcnZpY2U6IENoZWNrc2hlZXRTdWJtaXNzaW9uQW5zd2VyU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2codGhpcy5kaXNhYmxlSW5wdXQsIHRoaXMuc3VibWlzc2lvblZpZXcpO1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcigpO1xuXG4gICAgdGhpcy5zdWJtaXR0ZWRBbnN3ZXIudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLnNhdmVBbnN3ZXIoeyBhbnN3ZXJfaWQ6IHZhbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNhdmVBbnN3ZXIoeyBkZXRhaWxzOiB2YWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc3VibWlzc2lvblZpZXcpIHtcbiAgICAgIC8vIGxvYWQgdGhlIGFuc3dlciBmb3IgY3VycmVudCBzdWJtaXNzaW9uIHF1ZXN0aW9uXG4gICAgICB0aGlzLmxvYWRBbnN3ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbGVFbnRpdHlJZCA9IHRoaXMucXVlc3Rpb25JbmZvLmlkO1xuICB9XG5cbiAgb25NdWx0aVNlbGVjdEFuc3dlckNoYW5nZSgpIHtcbiAgICBjb25zdCBhbnN3ZXJJZHM6IG51bWJlcltdID0gKHRoaXMucXVlc3Rpb25JbmZvLmFuc3dlcnMgYXMgW10pXG4gICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0uaXNDaGVja2VkKVxuICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKTtcblxuICAgIHRoaXMuc2F2ZUFuc3dlcih7IGFuc3dlcl9pZHM6IGFuc3dlcklkcyB9KTtcbiAgfVxuXG4gIG9uTXVsdGlTZWxlY3RZZXNOb0Fuc3dlckNoYW5nZShldmVudDogYW55LCBhbnN3ZXI6IGFueSkge1xuICAgIHRoaXMuc2F2ZUFuc3dlcih7IGFuc3dlcl9pZDogYW5zd2VyPy5pZCwgZGV0YWlsczogZXZlbnQudmFsdWUgfSk7XG4gIH1cblxuICBnZXRTdWJtaXR0ZWRNQ1FBbnN3ZXIoYW5zd2VyczogYW55W10gPSBbXSwgYW5zd2VyX2lkOiBhbnkgPSBudWxsKSB7XG4gICAgaWYgKGFuc3dlcl9pZCkge1xuICAgICAgY29uc3Qgc3VibWl0dGVkQW5zd2VyID0gYW5zd2Vycy5maW5kKCh4KSA9PiB4LmlkID09PSBhbnN3ZXJfaWQpO1xuICAgICAgaWYgKHN1Ym1pdHRlZEFuc3dlcikge1xuICAgICAgICByZXR1cm4gc3VibWl0dGVkQW5zd2VyPy52YWx1ZSB8fCAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0U3VibWl0dGVkTVNRQW5zd2VyKCkge1xuICAgIHJldHVybiAodGhpcy5xdWVzdGlvbkluZm8/LmFuc3dlcnMgYXMgW10pXG4gICAgICAuZmlsdGVyKChhbnN3ZXI6IGFueSkgPT4gYW5zd2VyPy5pc0NoZWNrZWQpXG4gICAgICA/Lm1hcCgoYW5zd2VyOiBhbnkpID0+IGFuc3dlci52YWx1ZSlcbiAgICAgID8uam9pbignLCAnKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEFuc3dlcigpIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIHN1Ym1pc3Npb25faWRzOiB0aGlzLnN1Ym1pc3Npb25JZCxcbiAgICAgIHF1ZXN0aW9uX2lkczogdGhpcy5xdWVzdGlvbkluZm8/LmlkXG4gICAgfTtcbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgdGhpcy5jaGVja3NoZWV0U3VibWlzc2lvbkFuc3dlclNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgYW5zd2VyczogYW55W10gPSByZXNwb25zZT8uZGF0YTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSAxICYmIGFuc3dlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdHRlZEFuc3dlci5zZXRWYWx1ZShhbnN3ZXJzWzBdPy5hbnN3ZXJfaWQsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gMikge1xuICAgICAgICAgIHRoaXMuc3VibWl0dGVkQW5zd2VyLnNldFZhbHVlKGFuc3dlcnMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uSW5mby5hbnN3ZXJzID0gKHRoaXMucXVlc3Rpb25JbmZvPy5hbnN3ZXJzIGFzIFtdKS5tYXAoXG4gICAgICAgICAgICAoYW5zd2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5hbnN3ZXIsXG4gICAgICAgICAgICAgICAgaXNDaGVja2VkOiBhbnN3ZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAoaXRlbTogYW55KSA9PiBpdGVtLmFuc3dlcl9pZCA9PT0gYW5zd2VyLmlkXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMucXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSAzIHx8XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gNCB8fFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDUgfHxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA2KSAmJlxuICAgICAgICAgIGFuc3dlcnM/Lmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdWJtaXR0ZWRBbnN3ZXIuc2V0VmFsdWUoYW5zd2Vyc1swXS5kZXRhaWxzIHx8ICcnLCB7XG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5xdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDcpIHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdHRlZEFuc3dlci5zZXRWYWx1ZShhbnN3ZXJzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbkluZm8uYW5zd2VycyA9ICh0aGlzLnF1ZXN0aW9uSW5mbz8uYW5zd2VycyBhcyBbXSkubWFwKFxuICAgICAgICAgICAgKGFuc3dlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gYW5zd2Vycy5maW5kKFxuICAgICAgICAgICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0uYW5zd2VyX2lkID09PSBhbnN3ZXIuaWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5hbnN3ZXIsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZTogcmVzdWx0ID8gQm9vbGVhbihOdW1iZXIocmVzdWx0Py5kZXRhaWxzKSkgOiBudWxsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc1dvcmtpbmcgPSBmYWxzZSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHJlcXVlc3QgdG8gc2F2ZSB0aGUgcXVlc3Rpb24gYW5zd2Vycy5cbiAgICpcbiAgICogQHBhcmFtIGFuc3dlckRhdGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2F2ZUFuc3dlcihhbnN3ZXJEYXRhOiB7XG4gICAgYW5zd2VyX2lkPzogbnVtYmVyO1xuICAgIGFuc3dlcl9pZHM/OiBudW1iZXJbXTtcbiAgICBkZXRhaWxzPzogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgcXVlc3Rpb25faWQ6IHRoaXMucXVlc3Rpb25JbmZvPy5pZCxcbiAgICAgIHN1Ym1pc3Npb25faWQ6IHRoaXMuc3VibWlzc2lvbklkLFxuICAgICAgYW5zd2VyX2lkOiBhbnN3ZXJEYXRhPy5hbnN3ZXJfaWQsXG4gICAgICBhbnN3ZXJfaWRzOiBhbnN3ZXJEYXRhPy5hbnN3ZXJfaWRzLFxuICAgICAgcXVlc3Rpb25fdHlwZV9pZDogdGhpcy5xdWVzdGlvbkluZm8/LnR5cGVfaWQsXG4gICAgICBkZXRhaWxzOiBhbnN3ZXJEYXRhPy5kZXRhaWxzXG4gICAgfTtcbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgdGhpcy5jaGVja3NoZWV0U3VibWlzc2lvbkFuc3dlclNlcnZpY2Uuc3RvcmUoZGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgZnhMYXlvdXQ9XCJjb2x1bW5cIlxuICBmeExheW91dEdhcD1cIjAuNXJlbVwiXG4gIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIlxuICAqbmdJZj1cIiFzdWJtaXNzaW9uVmlld1wiXG4+XG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjAuNXJlbVwiIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZFwiPlxuICAgIDxkaXY+e3sgaW5kZXggKyAxIH19LjwvZGl2PlxuICAgIDxkaXYgW2lubmVySFRNTF09XCJxdWVzdGlvbkluZm8/LmxhYmVsXCI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIwLjVyZW1cIj5cbiAgICA8c21hbGw+e3sgcXVlc3Rpb25JbmZvPy50eXBlPy50aXRsZSB9fTwvc21hbGw+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gMVwiXG4gICAgZnhMYXlvdXQ9XCJjb2x1bW5cIlxuICAgIGZ4TGF5b3V0R2FwPVwiMC4yNXJlbVwiXG4gICAgY2xhc3M9XCJtci0zXCJcbiAgPlxuICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJhbnN3ZXItcmFkaW8tZ3JvdXBcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgY2xhc3M9XCJhbnN3ZXItcmFkaW8tYnV0dG9uXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGFuc3dlciBvZiBxdWVzdGlvbkluZm8/LmFuc3dlcnNcIlxuICAgICAgICBbdmFsdWVdPVwiYW5zd2VyLmlkXCJcbiAgICAgID5cbiAgICAgICAge3sgYW5zd2VyLnZhbHVlIH19XG4gICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gMlwiXG4gICAgZnhMYXlvdXQ9XCJjb2x1bW5cIlxuICAgIGZ4TGF5b3V0R2FwPVwiMC4yNXJlbVwiXG4gICAgY2xhc3M9XCJtci0zXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGZ4TGF5b3V0PVwicm93XCJcbiAgICAgIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIlxuICAgICAgKm5nRm9yPVwibGV0IGFuc3dlciBvZiBxdWVzdGlvbkluZm8/LmFuc3dlcnM7IGxldCBpID0gaW5kZXhcIlxuICAgID5cbiAgICAgIDxtYXQtY2hlY2tib3ggW2Rpc2FibGVkXT1cInRydWVcIiBmeEZsZXg9XCI4MCVcIlxuICAgICAgICA+e3sgaSArIDEgfX0gKSB7eyBhbnN3ZXIudmFsdWUgfX08L21hdC1jaGVja2JveFxuICAgICAgPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIHF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gMyB8fFxuICAgICAgcXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA1IHx8XG4gICAgICBxdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDZcbiAgICBcIlxuICAgIGZ4TGF5b3V0PVwiY29sdW1uXCJcbiAgICBmeExheW91dEdhcD1cIjAuMjVyZW1cIlxuICAgIGNsYXNzPVwibXItMyB3LTUwIGJvcmRlciBzaG9ydC1hbnN3ZXJcIlxuICA+PC9kaXY+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwicXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA0XCJcbiAgICBmeExheW91dD1cImNvbHVtblwiXG4gICAgZnhMYXlvdXRHYXA9XCIwLjI1cmVtXCJcbiAgICBjbGFzcz1cIm1yLTMgdy01MCBib3JkZXIgbG9uZy1hbnN3ZXJcIlxuICA+PC9kaXY+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwicXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA3XCJcbiAgICBmeExheW91dD1cImNvbHVtblwiXG4gICAgZnhMYXlvdXRHYXA9XCIwLjI1cmVtXCJcbiAgICBjbGFzcz1cIm1yLTNcIlxuICA+XG4gICAgPG9sPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBhbnN3ZXIgb2YgcXVlc3Rpb25JbmZvPy5hbnN3ZXJzXCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XG4gICAgICAgICAgPGRpdj57eyBhbnN3ZXI/LnZhbHVlIH19IC08L2Rpdj5cbiAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIFtkaXNhYmxlZF09XCJ0cnVlXCIgZnhMYXlvdXQ9XCJyb3dcIj5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibXQtMSBtbC0yIHllcy1ub1wiIHZhbHVlPVwiMVwiXG4gICAgICAgICAgICAgID5ZZXNcbiAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwibXQtMSBtbC0yIHllcy1ub1wiIHZhbHVlPVwiMFwiXG4gICAgICAgICAgICAgID5Ob1xuICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGk+XG4gICAgPC9vbD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cInN1Ym1pc3Npb25WaWV3XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zIG1iLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPHN0cm9uZz57eyBpbmRleCArIDEgfX0uPC9zdHJvbmc+XG4gICAgICA8c3Ryb25nIFtpbm5lckhUTUxdPVwicXVlc3Rpb25JbmZvPy5sYWJlbFwiPjwvc3Ryb25nPlxuICAgICAgPGFwcC1jaGVja3NoZWV0LXN1Ym1pc3Npb24tZmlsZS11cGxvYWRcbiAgICAgICAgW3N1Ym1pc3Npb25JZF09XCJzdWJtaXNzaW9uSWRcIlxuICAgICAgICBbcXVlc3Rpb25JZF09XCJxdWVzdGlvbkluZm8/LmlkXCJcbiAgICAgICAgKHVwbG9hZGVkKT1cImNoZWNrc2hlZXRTdWJtaXNzaW9uRmlsZXNDb21wb25lbnQucmVsb2FkKClcIlxuICAgICAgICBjbGFzcz1cIm1sLTNcIlxuICAgICAgPjwvYXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1maWxlLXVwbG9hZD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXByaW1hcnlcIj57eyBxdWVzdGlvbkluZm8/LnR5cGU/LnRpdGxlIH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMVwiPlxuICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDFcIiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiPlxuICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICBjbGFzcz1cImFuc3dlci1yYWRpby1ncm91cFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlSW5wdXRcIlxuICAgICAgICAqbmdJZj1cIiFkaXNhYmxlSW5wdXRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwic3VibWl0dGVkQW5zd2VyXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICBjbGFzcz1cImFuc3dlci1yYWRpby1idXR0b25cIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBhbnN3ZXIgb2YgcXVlc3Rpb25JbmZvPy5hbnN3ZXJzXCJcbiAgICAgICAgICBbdmFsdWVdPVwiYW5zd2VyLmlkXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGFuc3dlci52YWx1ZSB9fVxuICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxiPkFuc3dlcjo8L2I+XG4gICAgICAgIHt7XG4gICAgICAgICAgZ2V0U3VibWl0dGVkTUNRQW5zd2VyKFxuICAgICAgICAgICAgcXVlc3Rpb25JbmZvPy5hbnN3ZXJzLFxuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWRBbnN3ZXIudmFsdWVcbiAgICAgICAgICApXG4gICAgICAgIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSAyXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBmeExheW91dD1cInJvd1wiXG4gICAgICAgICAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGFuc3dlciBvZiBxdWVzdGlvbkluZm8/LmFuc3dlcnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbk11bHRpU2VsZWN0QW5zd2VyQ2hhbmdlKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFuc3dlci5pc0NoZWNrZWRcIlxuICAgICAgICAgICAgZnhGbGV4PVwiODAlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAge3sgYW5zd2VyLnZhbHVlIH19XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxiPkFuc3dlcnM6PC9iPlxuICAgICAgICB7eyBnZXRTdWJtaXR0ZWRNU1FBbnN3ZXIoKSB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uSW5mbz8udHlwZV9pZCA9PT0gMyB8fCBxdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJOZ3hFZGl0b3JfX1dyYXBwZXIgbWItMlwiICpuZ0lmPVwiIWRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8bmd4LWVkaXRvci1tZW51IFtlZGl0b3JdPVwiZWRpdG9yXCI+IDwvbmd4LWVkaXRvci1tZW51PlxuICAgICAgICA8bmd4LWVkaXRvclxuICAgICAgICAgIFtlZGl0b3JdPVwiZWRpdG9yXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic3VibWl0dGVkQW5zd2VyXCJcbiAgICAgICAgPjwvbmd4LWVkaXRvcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImRpc2FibGVJbnB1dFwiIFtpbm5lckh0bWxdPVwic3VibWl0dGVkQW5zd2VyLnZhbHVlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA1XCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxtYXQtbGFiZWw+QW5zd2VyPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgc2l6ZT1cIjEwXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic3VibWl0dGVkQW5zd2VyXCJcbiAgICAgICAgLz5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8c3BhbiAqbmdJZj1cImRpc2FibGVJbnB1dFwiPnt7IHN1Ym1pdHRlZEFuc3dlci52YWx1ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDZcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFkaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGF0ZVwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cInN1Ym1pdHRlZEFuc3dlclwiXG4gICAgICAgICAgKGZvY3VzKT1cInBpY2tlci5vcGVuKClcIlxuICAgICAgICAvPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZGlzYWJsZUlucHV0XCI+e3sgc3VibWl0dGVkQW5zd2VyLnZhbHVlIHwgZGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbkluZm8/LnR5cGVfaWQgPT09IDcgJiYgIWRpc2FibGVJbnB1dFwiPlxuICAgICAgPG9sPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGFuc3dlciBvZiBxdWVzdGlvbkluZm8/LmFuc3dlcnNcIj5cbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdj57eyBhbnN3ZXI/LnZhbHVlIH19IC08L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgICAgICAgZnhMYXlvdXQ9XCJyb3dcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uTXVsdGlTZWxlY3RZZXNOb0Fuc3dlckNoYW5nZSgkZXZlbnQsIGFuc3dlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImFuc3dlci5zZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJtdC0xIG1sLTIgeWVzLW5vXCIgW3ZhbHVlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBZZXNcbiAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm10LTEgbWwtMiB5ZXMtbm9cIiBbdmFsdWVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICBOb1xuICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvb2w+XG4gICAgPC9kaXY+XG5cbiAgICA8YXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1maWxlc1xuICAgICAgY2xhc3M9XCJ3LTUwXCJcbiAgICAgICNjaGVja3NoZWV0U3VibWlzc2lvbkZpbGVzQ29tcG9uZW50XG4gICAgICBbc3VibWlzc2lvbklkXT1cInN1Ym1pc3Npb25JZFwiXG4gICAgICBbcXVlc3Rpb25JZF09XCJxdWVzdGlvbkluZm8/LmlkXCJcbiAgICA+PC9hcHAtY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZpbGVzPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlc3Rpb25JbmZvPy50eXBlX2lkID09PSA3ICYmIGRpc2FibGVJbnB1dFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGFuc3dlciBvZiBxdWVzdGlvbkluZm8/LmFuc3dlcnNcIj5cbiAgICAgIHt7IGFuc3dlcj8udmFsdWUgfX0gLSB7eyBhbnN3ZXI/LnNlbGVjdGVkVmFsdWUgPyAnWWVzJyA6ICdObycgfX1cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJpc1dvcmtpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbjwvZGl2PlxuIl19
|
package/esm2022/lib/checksheet/checksheet-question-form/checksheet-question-form.component.mjs
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import { Editor } from 'ngx-editor';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/material/dialog";
|
|
7
|
+
import * as i2 from "@angular/forms";
|
|
8
|
+
import * as i3 from "ngx-techlify-core";
|
|
9
|
+
import * as i4 from "../checksheet-format-question.service";
|
|
10
|
+
import * as i5 from "@angular/common";
|
|
11
|
+
import * as i6 from "@angular/flex-layout/flex";
|
|
12
|
+
import * as i7 from "@angular/material/button";
|
|
13
|
+
import * as i8 from "@angular/material/form-field";
|
|
14
|
+
import * as i9 from "@angular/material/icon";
|
|
15
|
+
import * as i10 from "@angular/material/input";
|
|
16
|
+
import * as i11 from "ngx-editor";
|
|
17
|
+
const errorMessages = {
|
|
18
|
+
label: {
|
|
19
|
+
required: 'Question is required'
|
|
20
|
+
},
|
|
21
|
+
type_id: {
|
|
22
|
+
required: 'Question Type is required'
|
|
23
|
+
},
|
|
24
|
+
value: {
|
|
25
|
+
required: 'Answer is required'
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export class ChecksheetQuestionFormComponent {
|
|
29
|
+
dialogRef;
|
|
30
|
+
data;
|
|
31
|
+
fb;
|
|
32
|
+
formValidatorService;
|
|
33
|
+
alertService;
|
|
34
|
+
checksheetFormatQuestionService;
|
|
35
|
+
updateMode;
|
|
36
|
+
questionFormGroup;
|
|
37
|
+
questionFormFirstAttempt;
|
|
38
|
+
editor;
|
|
39
|
+
isSaving = false;
|
|
40
|
+
constructor(dialogRef, data, fb, formValidatorService, alertService, checksheetFormatQuestionService) {
|
|
41
|
+
this.dialogRef = dialogRef;
|
|
42
|
+
this.data = data;
|
|
43
|
+
this.fb = fb;
|
|
44
|
+
this.formValidatorService = formValidatorService;
|
|
45
|
+
this.alertService = alertService;
|
|
46
|
+
this.checksheetFormatQuestionService = checksheetFormatQuestionService;
|
|
47
|
+
this.createForm();
|
|
48
|
+
}
|
|
49
|
+
/** Method to create a form **/
|
|
50
|
+
createForm() {
|
|
51
|
+
this.questionFormGroup = this.fb.group({
|
|
52
|
+
id: [''],
|
|
53
|
+
label: ['', Validators.compose([Validators.required])],
|
|
54
|
+
type_id: ['', Validators.required],
|
|
55
|
+
format_id: ['', Validators.required],
|
|
56
|
+
answers: this.fb.array([]),
|
|
57
|
+
rank: [1]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
createAnswer() {
|
|
61
|
+
return this.fb.group({
|
|
62
|
+
id: '',
|
|
63
|
+
question_id: '',
|
|
64
|
+
value: ['', Validators.required],
|
|
65
|
+
rank: [1]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
ngOnDestroy() {
|
|
69
|
+
this.editor.destroy();
|
|
70
|
+
}
|
|
71
|
+
ngOnInit() {
|
|
72
|
+
this.editor = new Editor();
|
|
73
|
+
if (this.data.update) {
|
|
74
|
+
this.updateMode = true;
|
|
75
|
+
}
|
|
76
|
+
this.questionFormGroup.patchValue(this.data.question);
|
|
77
|
+
if (this.data.question.type_id === 1 ||
|
|
78
|
+
this.data.question.type_id === 2 ||
|
|
79
|
+
this.data.question.type_id === 7) {
|
|
80
|
+
this.data.question.answers.forEach((answer) => {
|
|
81
|
+
const form = this.createAnswer();
|
|
82
|
+
form.patchValue(answer);
|
|
83
|
+
this.answerFormArray.push(form);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
submit() {
|
|
88
|
+
this.questionFormFirstAttempt = true;
|
|
89
|
+
this.answerFormArray.controls.forEach((fb) => {
|
|
90
|
+
fb.markAllAsTouched();
|
|
91
|
+
});
|
|
92
|
+
if (this.questionFormGroup.valid) {
|
|
93
|
+
const model = this.questionFormGroup.value;
|
|
94
|
+
const params = { with: 'answers,type' };
|
|
95
|
+
this.isSaving = true;
|
|
96
|
+
let request = this.updateMode
|
|
97
|
+
? this.checksheetFormatQuestionService.update(model, params)
|
|
98
|
+
: this.checksheetFormatQuestionService.store(model, params);
|
|
99
|
+
request.subscribe({
|
|
100
|
+
next: (result) => {
|
|
101
|
+
this.isSaving = false;
|
|
102
|
+
this.dialogRef.close(result?.item);
|
|
103
|
+
this.alertService.addAlert('Question saved successfully!', 'success');
|
|
104
|
+
},
|
|
105
|
+
error: () => { this.isSaving = false; }
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
cancel() {
|
|
110
|
+
this.dialogRef.close();
|
|
111
|
+
}
|
|
112
|
+
get isChoiceTypeSelected() {
|
|
113
|
+
return (this.questionFormGroup.get('type_id')?.value === 1 ||
|
|
114
|
+
this.questionFormGroup.get('type_id')?.value === 2 ||
|
|
115
|
+
this.questionFormGroup.get('type_id')?.value === 7);
|
|
116
|
+
}
|
|
117
|
+
get answerFormArray() {
|
|
118
|
+
return this.questionFormGroup.get('answers');
|
|
119
|
+
}
|
|
120
|
+
addAnswer() {
|
|
121
|
+
this.answerFormArray.push(this.createAnswer());
|
|
122
|
+
}
|
|
123
|
+
questionChange(value) {
|
|
124
|
+
this.answerFormArray.clear();
|
|
125
|
+
if (value === 1 || value === 2 || value === 7) {
|
|
126
|
+
this.addAnswer();
|
|
127
|
+
this.addAnswer();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**Method to evaluate form fields*/
|
|
131
|
+
isFieldValid(field, formGroup = this.questionFormGroup) {
|
|
132
|
+
return this.formValidatorService.isFieldValid(field, formGroup, this.questionFormFirstAttempt);
|
|
133
|
+
}
|
|
134
|
+
/**Method to find error in form fields*/
|
|
135
|
+
getErrorMessage(field, formGroup = this.questionFormGroup) {
|
|
136
|
+
return this.formValidatorService.getErrorMessage(field, formGroup, errorMessages);
|
|
137
|
+
}
|
|
138
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetQuestionFormComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.UntypedFormBuilder }, { token: i3.FormValidatorService }, { token: i3.AlertService }, { token: i4.ChecksheetFormatQuestionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetQuestionFormComponent, selector: "app-checksheet-question-form", ngImport: i0, template: "<form [formGroup]=\"questionFormGroup\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Checksheet Question</div>\n </div>\n\n <div mat-dialog-content fxLayout=\"row wrap\" fxLayoutAlign=\"space-between\">\n <div fxFlex=\"100%\" class=\"mt-2\">Question</div>\n <div fxFlex=\"100%\" class=\"mt-3 border\">\n <div class=\"NgxEditor__Wrapper\">\n <ngx-editor-menu [editor]=\"editor\"> </ngx-editor-menu>\n <ngx-editor [editor]=\"editor\" formControlName=\"label\"></ngx-editor>\n </div>\n </div>\n <div class=\"text-danger my-1\" fxFlex=\"100%\" *ngIf=\"isFieldValid('label')\">\n {{ getErrorMessage('label') }}\n </div>\n\n <mat-form-field fxFlex=\"100%\" class=\"mt-2\">\n <mat-label>Question Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/checksheet-question-types\"\n [enableSearch]=\"false\"\n formControlName=\"type_id\"\n (selectionChange)=\"questionChange($event)\"\n ></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">\n {{ getErrorMessage('type_id') }}\n </mat-error>\n </mat-form-field>\n\n <div\n fxFlex=\"100%\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n *ngIf=\"isChoiceTypeSelected\"\n >\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <h3 class=\"m-0\">Answers</h3>\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"addAnswer()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n <ng-container\n formArrayName=\"answers\"\n *ngFor=\"let answer of answerFormArray.controls; let i = index\"\n >\n <form\n [formGroupName]=\"i\"\n fxLayout=\"row\"\n fxLayoutAlign=\"center center\"\n fxLayoutGap=\"0.5rem\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"value\"\n placeholder=\"Answer\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"isFieldValid('value', answer)\"\n >{{ getErrorMessage('value', answer) }}\n </mat-error>\n </mat-form-field>\n\n <button\n [disabled]=\"questionFormGroup.get('answers')?.value?.length <= 2\"\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"answerFormArray.removeAt(i)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </form>\n </ng-container>\n </div>\n\n <div\n class=\"my-2\"\n fxLayout=\"row\"\n fxLayoutGap=\"30px\"\n fxLayoutAlign=\"end\"\n fxFlex=\"100%\"\n >\n <button\n [disabled]=\"isSaving\"\n mat-raised-button\n type=\"button\"\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n <button\n [disabled]=\"isSaving\"\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n >\n Save\n </button>\n </div>\n </div>\n </div>\n</form>\n", styles: [":host ::ng-deep .ck.ck-content{min-height:200px!important}::ng-deep .ck.ck-balloon-panel{z-index:10000!important}\n"], dependencies: [{ 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.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i6.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i6.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i11.NgxEditorComponent, selector: "ngx-editor", inputs: ["editor", "outputFormat", "placeholder"], outputs: ["focusOut", "focusIn"] }, { kind: "component", type: i11.MenuComponent, selector: "ngx-editor-menu", inputs: ["toolbar", "colorPresets", "disabled", "editor", "customMenuRef", "dropdownPlacement"] }] });
|
|
140
|
+
}
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetQuestionFormComponent, decorators: [{
|
|
142
|
+
type: Component,
|
|
143
|
+
args: [{ selector: 'app-checksheet-question-form', template: "<form [formGroup]=\"questionFormGroup\" (ngSubmit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Checksheet Question</div>\n </div>\n\n <div mat-dialog-content fxLayout=\"row wrap\" fxLayoutAlign=\"space-between\">\n <div fxFlex=\"100%\" class=\"mt-2\">Question</div>\n <div fxFlex=\"100%\" class=\"mt-3 border\">\n <div class=\"NgxEditor__Wrapper\">\n <ngx-editor-menu [editor]=\"editor\"> </ngx-editor-menu>\n <ngx-editor [editor]=\"editor\" formControlName=\"label\"></ngx-editor>\n </div>\n </div>\n <div class=\"text-danger my-1\" fxFlex=\"100%\" *ngIf=\"isFieldValid('label')\">\n {{ getErrorMessage('label') }}\n </div>\n\n <mat-form-field fxFlex=\"100%\" class=\"mt-2\">\n <mat-label>Question Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/checksheet-question-types\"\n [enableSearch]=\"false\"\n formControlName=\"type_id\"\n (selectionChange)=\"questionChange($event)\"\n ></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">\n {{ getErrorMessage('type_id') }}\n </mat-error>\n </mat-form-field>\n\n <div\n fxFlex=\"100%\"\n fxLayout=\"column\"\n fxLayoutGap=\"0.25rem\"\n *ngIf=\"isChoiceTypeSelected\"\n >\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <h3 class=\"m-0\">Answers</h3>\n <button\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"addAnswer()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n <ng-container\n formArrayName=\"answers\"\n *ngFor=\"let answer of answerFormArray.controls; let i = index\"\n >\n <form\n [formGroupName]=\"i\"\n fxLayout=\"row\"\n fxLayoutAlign=\"center center\"\n fxLayoutGap=\"0.5rem\"\n >\n <mat-form-field>\n <input\n matInput\n formControlName=\"value\"\n placeholder=\"Answer\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"isFieldValid('value', answer)\"\n >{{ getErrorMessage('value', answer) }}\n </mat-error>\n </mat-form-field>\n\n <button\n [disabled]=\"questionFormGroup.get('answers')?.value?.length <= 2\"\n mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"answerFormArray.removeAt(i)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </form>\n </ng-container>\n </div>\n\n <div\n class=\"my-2\"\n fxLayout=\"row\"\n fxLayoutGap=\"30px\"\n fxLayoutAlign=\"end\"\n fxFlex=\"100%\"\n >\n <button\n [disabled]=\"isSaving\"\n mat-raised-button\n type=\"button\"\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n <button\n [disabled]=\"isSaving\"\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n >\n Save\n </button>\n </div>\n </div>\n </div>\n</form>\n", styles: [":host ::ng-deep .ck.ck-content{min-height:200px!important}::ng-deep .ck.ck-balloon-panel{z-index:10000!important}\n"] }]
|
|
144
|
+
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
145
|
+
type: Inject,
|
|
146
|
+
args: [MAT_DIALOG_DATA]
|
|
147
|
+
}] }, { type: i2.UntypedFormBuilder }, { type: i3.FormValidatorService }, { type: i3.AlertService }, { type: i4.ChecksheetFormatQuestionService }] });
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1xdWVzdGlvbi1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXF1ZXN0aW9uLWZvcm0vY2hlY2tzaGVldC1xdWVzdGlvbi1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXF1ZXN0aW9uLWZvcm0vY2hlY2tzaGVldC1xdWVzdGlvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQXlELFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxlQUFlLEVBQWUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSWxDLE1BQU0sYUFBYSxHQUFRO0lBQ3pCLEtBQUssRUFBRTtRQUNMLFFBQVEsRUFBRSxzQkFBc0I7S0FDakM7SUFDRCxPQUFPLEVBQUU7UUFDUCxRQUFRLEVBQUUsMkJBQTJCO0tBQ3RDO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsUUFBUSxFQUFFLG9CQUFvQjtLQUMvQjtDQUNGLENBQUM7QUFNRixNQUFNLE9BQU8sK0JBQStCO0lBUWpDO0lBQ3lCO0lBQ3hCO0lBQ0E7SUFDQTtJQUNBO0lBWlYsVUFBVSxDQUFXO0lBQ3JCLGlCQUFpQixDQUFvQjtJQUNyQyx3QkFBd0IsQ0FBVztJQUNuQyxNQUFNLENBQVU7SUFDaEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNTLFNBQXdE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LGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7QWxlcnRTZXJ2aWNlLCBGb3JtVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHtFZGl0b3J9IGZyb20gJ25neC1lZGl0b3InO1xuaW1wb3J0IHtDaGVja3NoZWV0Rm9ybWF0UXVlc3Rpb25TZXJ2aWNlfSBmcm9tICcuLi9jaGVja3NoZWV0LWZvcm1hdC1xdWVzdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IGVycm9yTWVzc2FnZXM6IGFueSA9IHtcbiAgbGFiZWw6IHtcbiAgICByZXF1aXJlZDogJ1F1ZXN0aW9uIGlzIHJlcXVpcmVkJ1xuICB9LFxuICB0eXBlX2lkOiB7XG4gICAgcmVxdWlyZWQ6ICdRdWVzdGlvbiBUeXBlIGlzIHJlcXVpcmVkJ1xuICB9LFxuICB2YWx1ZToge1xuICAgIHJlcXVpcmVkOiAnQW5zd2VyIGlzIHJlcXVpcmVkJ1xuICB9XG59O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtcXVlc3Rpb24tZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja3NoZWV0LXF1ZXN0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGVja3NoZWV0LXF1ZXN0aW9uLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0UXVlc3Rpb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICB1cGRhdGVNb2RlITogYm9vbGVhbjtcbiAgcXVlc3Rpb25Gb3JtR3JvdXAhOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBxdWVzdGlvbkZvcm1GaXJzdEF0dGVtcHQhOiBib29sZWFuO1xuICBlZGl0b3IhOiBFZGl0b3I7XG4gIGlzU2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENoZWNrc2hlZXRRdWVzdGlvbkZvcm1Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hlY2tzaGVldEZvcm1hdFF1ZXN0aW9uU2VydmljZTogQ2hlY2tzaGVldEZvcm1hdFF1ZXN0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIC8qKiBNZXRob2QgdG8gY3JlYXRlIGEgZm9ybSAqKi9cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMucXVlc3Rpb25Gb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbJyddLFxuICAgICAgbGFiZWw6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgdHlwZV9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGZvcm1hdF9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGFuc3dlcnM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgcmFuazogWzFdXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVBbnN3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgaWQ6ICcnLFxuICAgICAgcXVlc3Rpb25faWQ6ICcnLFxuICAgICAgdmFsdWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICByYW5rOiBbMV1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcigpO1xuXG4gICAgaWYgKHRoaXMuZGF0YS51cGRhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb25Gb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmRhdGEucXVlc3Rpb24pO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5xdWVzdGlvbi50eXBlX2lkID09PSAxIHx8XG4gICAgICB0aGlzLmRhdGEucXVlc3Rpb24udHlwZV9pZCA9PT0gMiB8fFxuICAgICAgdGhpcy5kYXRhLnF1ZXN0aW9uLnR5cGVfaWQgPT09IDdcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5xdWVzdGlvbi5hbnN3ZXJzLmZvckVhY2goKGFuc3dlcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZUFuc3dlcigpO1xuICAgICAgICBmb3JtLnBhdGNoVmFsdWUoYW5zd2VyKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJGb3JtQXJyYXkucHVzaChmb3JtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uRm9ybUZpcnN0QXR0ZW1wdCA9IHRydWU7XG4gICAgdGhpcy5hbnN3ZXJGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoZmI6IGFueSkgPT4ge1xuICAgICAgZmIubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uRm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMucXVlc3Rpb25Gb3JtR3JvdXAudmFsdWU7XG4gICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHsgd2l0aDogJ2Fuc3dlcnMsdHlwZScgfTtcbiAgICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgICAgbGV0IHJlcXVlc3Q6IE9ic2VydmFibGU8YW55PiA9IHRoaXMudXBkYXRlTW9kZVxuICAgICAgICA/IHRoaXMuY2hlY2tzaGVldEZvcm1hdFF1ZXN0aW9uU2VydmljZS51cGRhdGUobW9kZWwsIHBhcmFtcylcbiAgICAgICAgOiB0aGlzLmNoZWNrc2hlZXRGb3JtYXRRdWVzdGlvblNlcnZpY2Uuc3RvcmUobW9kZWwsIHBhcmFtcyk7XG5cbiAgICAgIHJlcXVlc3Quc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3VsdD8uaXRlbSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoJ1F1ZXN0aW9uIHNhdmVkIHN1Y2Nlc3NmdWxseSEnLCAnc3VjY2VzcycpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmlzU2F2aW5nID0gZmFsc2UgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gIH1cblxuICBnZXQgaXNDaG9pY2VUeXBlU2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVlc3Rpb25Gb3JtR3JvdXAuZ2V0KCd0eXBlX2lkJyk/LnZhbHVlID09PSAxIHx8XG4gICAgICB0aGlzLnF1ZXN0aW9uRm9ybUdyb3VwLmdldCgndHlwZV9pZCcpPy52YWx1ZSA9PT0gMiB8fFxuICAgICAgdGhpcy5xdWVzdGlvbkZvcm1Hcm91cC5nZXQoJ3R5cGVfaWQnKT8udmFsdWUgPT09IDdcbiAgICApO1xuICB9XG5cbiAgZ2V0IGFuc3dlckZvcm1BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkZvcm1Hcm91cC5nZXQoJ2Fuc3dlcnMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgYWRkQW5zd2VyKCkge1xuICAgIHRoaXMuYW5zd2VyRm9ybUFycmF5LnB1c2godGhpcy5jcmVhdGVBbnN3ZXIoKSk7XG4gIH1cblxuICBxdWVzdGlvbkNoYW5nZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5hbnN3ZXJGb3JtQXJyYXkuY2xlYXIoKTtcbiAgICBpZiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDIgfHwgdmFsdWUgPT09IDcpIHtcbiAgICAgIHRoaXMuYWRkQW5zd2VyKCk7XG4gICAgICB0aGlzLmFkZEFuc3dlcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKk1ldGhvZCB0byBldmFsdWF0ZSBmb3JtIGZpZWxkcyovXG4gIGlzRmllbGRWYWxpZChmaWVsZDogc3RyaW5nLCBmb3JtR3JvdXA6IGFueSA9IHRoaXMucXVlc3Rpb25Gb3JtR3JvdXApIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoXG4gICAgICBmaWVsZCxcbiAgICAgIGZvcm1Hcm91cCxcbiAgICAgIHRoaXMucXVlc3Rpb25Gb3JtRmlyc3RBdHRlbXB0XG4gICAgKTtcbiAgfVxuXG4gIC8qKk1ldGhvZCB0byBmaW5kIGVycm9yIGluIGZvcm0gZmllbGRzKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcsIGZvcm1Hcm91cDogYW55ID0gdGhpcy5xdWVzdGlvbkZvcm1Hcm91cCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZGF0b3JTZXJ2aWNlLmdldEVycm9yTWVzc2FnZShcbiAgICAgIGZpZWxkLFxuICAgICAgZm9ybUdyb3VwLFxuICAgICAgZXJyb3JNZXNzYWdlc1xuICAgICk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwicXVlc3Rpb25Gb3JtR3JvdXBcIiAobmdTdWJtaXQpPVwic3VibWl0KClcIj5cbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIj5cbiAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgPGRpdj5DaGVja3NoZWV0IFF1ZXN0aW9uPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudCBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW5cIj5cbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwJVwiIGNsYXNzPVwibXQtMlwiPlF1ZXN0aW9uPC9kaXY+XG4gICAgICA8ZGl2IGZ4RmxleD1cIjEwMCVcIiBjbGFzcz1cIm10LTMgYm9yZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJOZ3hFZGl0b3JfX1dyYXBwZXJcIj5cbiAgICAgICAgICA8bmd4LWVkaXRvci1tZW51IFtlZGl0b3JdPVwiZWRpdG9yXCI+IDwvbmd4LWVkaXRvci1tZW51PlxuICAgICAgICAgIDxuZ3gtZWRpdG9yIFtlZGl0b3JdPVwiZWRpdG9yXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIj48L25neC1lZGl0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXIgbXktMVwiIGZ4RmxleD1cIjEwMCVcIiAqbmdJZj1cImlzRmllbGRWYWxpZCgnbGFiZWwnKVwiPlxuICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoJ2xhYmVsJykgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiMTAwJVwiIGNsYXNzPVwibXQtMlwiPlxuICAgICAgICA8bWF0LWxhYmVsPlF1ZXN0aW9uIFR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgICAgYXBpVXJsPVwiYXBpL2NoZWNrc2hlZXQtcXVlc3Rpb24tdHlwZXNcIlxuICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwiZmFsc2VcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVfaWRcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwicXVlc3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCd0eXBlX2lkJylcIj5cbiAgICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoJ3R5cGVfaWQnKSB9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgZnhGbGV4PVwiMTAwJVwiXG4gICAgICAgIGZ4TGF5b3V0PVwiY29sdW1uXCJcbiAgICAgICAgZnhMYXlvdXRHYXA9XCIwLjI1cmVtXCJcbiAgICAgICAgKm5nSWY9XCJpc0Nob2ljZVR5cGVTZWxlY3RlZFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cIm0tMFwiPkFuc3dlcnM8L2gzPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFuc3dlcigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJhbnN3ZXJzXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGFuc3dlckZvcm1BcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICBmeExheW91dD1cInJvd1wiXG4gICAgICAgICAgICBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiXG4gICAgICAgICAgICBmeExheW91dEdhcD1cIjAuNXJlbVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFuc3dlclwiXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCd2YWx1ZScsIGFuc3dlcilcIlxuICAgICAgICAgICAgICAgID57eyBnZXRFcnJvck1lc3NhZ2UoJ3ZhbHVlJywgYW5zd2VyKSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInF1ZXN0aW9uRm9ybUdyb3VwLmdldCgnYW5zd2VycycpPy52YWx1ZT8ubGVuZ3RoIDw9IDJcIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhbnN3ZXJGb3JtQXJyYXkucmVtb3ZlQXQoaSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm15LTJcIlxuICAgICAgICBmeExheW91dD1cInJvd1wiXG4gICAgICAgIGZ4TGF5b3V0R2FwPVwiMzBweFwiXG4gICAgICAgIGZ4TGF5b3V0QWxpZ249XCJlbmRcIlxuICAgICAgICBmeEZsZXg9XCIxMDAlXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICA+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nXCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgID5cbiAgICAgICAgICBTYXZlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
|