ngx-techlify-checksheet 18.0.0 → 18.1.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.
Files changed (44) hide show
  1. package/esm2022/lib/checksheet/checksheet-form/checksheet-form.component.mjs +88 -116
  2. package/esm2022/lib/checksheet/checksheet-form-button/checksheet-form-button.component.mjs +10 -12
  3. package/esm2022/lib/checksheet/checksheet-format/checksheet-format-copy-button/checksheet-format-copy-button.component.mjs +56 -0
  4. package/esm2022/lib/checksheet/checksheet-format/checksheet-format-delete-button/checksheet-format-delete-button.component.mjs +54 -0
  5. package/esm2022/lib/checksheet/checksheet-format/checksheet-format-publish-button/checksheet-format-publish-button.component.mjs +68 -0
  6. package/esm2022/lib/checksheet/checksheet-format/checksheet-format-unpublish-button/checksheet-format-unpublish-button.component.mjs +57 -0
  7. package/esm2022/lib/checksheet/checksheet-format/checksheet-format-view/checksheet-format-view.component.mjs +140 -0
  8. package/esm2022/lib/checksheet/checksheet-format-form/checksheet-format-form.component.mjs +136 -0
  9. package/esm2022/lib/checksheet/checksheet-format-list/checksheet-format-list.component.mjs +9 -67
  10. package/esm2022/lib/checksheet/checksheet-list/checksheet-list.component.mjs +28 -11
  11. package/esm2022/lib/checksheet/checksheet-list-widget/checksheet-list-widget.component.mjs +59 -0
  12. package/esm2022/lib/checksheet/checksheet-node-view/checksheet-node-view.component.mjs +24 -24
  13. package/esm2022/lib/checksheet/checksheet-question/checksheet-question.component.mjs +12 -13
  14. package/esm2022/lib/checksheet/checksheet-question-list/checksheet-question-list.component.mjs +7 -9
  15. package/esm2022/lib/checksheet/checksheet-report/checksheet-report.component.mjs +3 -3
  16. package/esm2022/lib/checksheet/checksheet-routing.module.mjs +6 -6
  17. package/esm2022/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.mjs +83 -17
  18. package/esm2022/lib/checksheet/checksheet-submission-list/checksheet-submission-list.component.mjs +5 -5
  19. package/esm2022/lib/checksheet/checksheet-submission-view/checksheet-submission-view.component.mjs +4 -4
  20. package/esm2022/lib/checksheet/checksheet.module.mjs +42 -20
  21. package/esm2022/public-api.mjs +2 -2
  22. package/fesm2022/ngx-techlify-checksheet.mjs +570 -359
  23. package/fesm2022/ngx-techlify-checksheet.mjs.map +1 -1
  24. package/lib/checksheet/checksheet-form/checksheet-form.component.d.ts +15 -34
  25. package/lib/checksheet/checksheet-form-button/checksheet-form-button.component.d.ts +3 -4
  26. package/lib/checksheet/checksheet-format/checksheet-format-copy-button/checksheet-format-copy-button.component.d.ts +16 -0
  27. package/lib/checksheet/checksheet-format/checksheet-format-delete-button/checksheet-format-delete-button.component.d.ts +16 -0
  28. package/lib/checksheet/checksheet-format/checksheet-format-publish-button/checksheet-format-publish-button.component.d.ts +18 -0
  29. package/lib/checksheet/checksheet-format/checksheet-format-unpublish-button/checksheet-format-unpublish-button.component.d.ts +16 -0
  30. package/lib/checksheet/{checksheet-view/checksheet-view.component.d.ts → checksheet-format/checksheet-format-view/checksheet-format-view.component.d.ts} +4 -4
  31. package/lib/checksheet/checksheet-format-form/checksheet-format-form.component.d.ts +45 -0
  32. package/lib/checksheet/checksheet-format-list/checksheet-format-list.component.d.ts +0 -3
  33. package/lib/checksheet/checksheet-list/checksheet-list.component.d.ts +5 -3
  34. package/lib/checksheet/checksheet-list-widget/checksheet-list-widget.component.d.ts +17 -0
  35. package/lib/checksheet/checksheet-node-view/checksheet-node-view.component.d.ts +2 -4
  36. package/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.d.ts +14 -4
  37. package/lib/checksheet/checksheet.module.d.ts +12 -7
  38. package/package.json +1 -1
  39. package/public-api.d.ts +1 -1
  40. package/esm2022/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.mjs +0 -131
  41. package/esm2022/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.mjs +0 -58
  42. package/esm2022/lib/checksheet/checksheet-view/checksheet-view.component.mjs +0 -140
  43. package/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.d.ts +0 -27
  44. package/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.d.ts +0 -29
@@ -0,0 +1,68 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { ActionPopupComponent } from 'ngx-techlify-core';
3
+ import { MatButton } from '@angular/material/button';
4
+ import { NgIf } from '@angular/common';
5
+ import { MatIcon } from '@angular/material/icon';
6
+ import { MatTooltip } from '@angular/material/tooltip';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/material/dialog";
9
+ import * as i2 from "ngx-techlify-core";
10
+ import * as i3 from "../../checksheet-format.service";
11
+ export class ChecksheetFormatPublishButtonComponent {
12
+ dialog;
13
+ alertService;
14
+ service;
15
+ checksheetFormat;
16
+ changed = new EventEmitter();
17
+ viewMode = 'button';
18
+ isSaving = false;
19
+ constructor(dialog, alertService, service) {
20
+ this.dialog = dialog;
21
+ this.alertService = alertService;
22
+ this.service = service;
23
+ }
24
+ publishChecksheet() {
25
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
26
+ width: '400px',
27
+ data: {
28
+ title: 'Publish Checksheet Format',
29
+ message: `Review the checksheet format completely before publishing, you cannot alter once it is published.
30
+ Are you sure to publish the Checksheet format?`
31
+ },
32
+ autoFocus: false
33
+ });
34
+ dialogRef.afterClosed().subscribe(async (result) => {
35
+ if (result) {
36
+ const model = { ...this.checksheetFormat };
37
+ model.is_published = true;
38
+ this.isSaving = true;
39
+ this.service.update(model).subscribe({
40
+ next: (response) => {
41
+ this.alertService.addAlert('Checksheet format published successfully.', 'success');
42
+ this.changed.emit(response?.item);
43
+ this.isSaving = false;
44
+ },
45
+ error: () => { this.isSaving = false; }
46
+ });
47
+ }
48
+ });
49
+ }
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatPublishButtonComponent, deps: [{ token: i1.MatDialog }, { token: i2.AlertService }, { token: i3.ChecksheetFormatService }], target: i0.ɵɵFactoryTarget.Component });
51
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetFormatPublishButtonComponent, isStandalone: true, selector: "app-checksheet-format-publish-button", inputs: { checksheetFormat: "checksheetFormat", viewMode: "viewMode" }, outputs: { changed: "changed" }, ngImport: i0, template: "<button mat-raised-button [disabled]=\"isSaving\" color=\"accent\" type=\"button\" (click)=\"publishChecksheet()\"\n *ngIf=\"viewMode === 'button' && !checksheetFormat?.is_published\">\n Publish\n</button>\n<span matTooltip=\"Publish\" class=\"material-symbols-outlined cursor-pointer\" (click)=\"publishChecksheet()\"\n *ngIf=\"viewMode === 'icon' && !checksheetFormat?.is_published\">\n published_with_changes\n</span>\n", styles: [""], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatPublishButtonComponent, decorators: [{
54
+ type: Component,
55
+ args: [{ selector: 'app-checksheet-format-publish-button', standalone: true, imports: [
56
+ MatButton,
57
+ NgIf,
58
+ MatIcon,
59
+ MatTooltip
60
+ ], template: "<button mat-raised-button [disabled]=\"isSaving\" color=\"accent\" type=\"button\" (click)=\"publishChecksheet()\"\n *ngIf=\"viewMode === 'button' && !checksheetFormat?.is_published\">\n Publish\n</button>\n<span matTooltip=\"Publish\" class=\"material-symbols-outlined cursor-pointer\" (click)=\"publishChecksheet()\"\n *ngIf=\"viewMode === 'icon' && !checksheetFormat?.is_published\">\n published_with_changes\n</span>\n" }]
61
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.AlertService }, { type: i3.ChecksheetFormatService }], propDecorators: { checksheetFormat: [{
62
+ type: Input
63
+ }], changed: [{
64
+ type: Output
65
+ }], viewMode: [{
66
+ type: Input
67
+ }] } });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1mb3JtYXQtcHVibGlzaC1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXQvc3JjL2xpYi9jaGVja3NoZWV0L2NoZWNrc2hlZXQtZm9ybWF0L2NoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uL2NoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LWZvcm1hdC9jaGVja3NoZWV0LWZvcm1hdC1wdWJsaXNoLWJ1dHRvbi9jaGVja3NoZWV0LWZvcm1hdC1wdWJsaXNoLWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXJFLE9BQU8sRUFBYyxvQkFBb0IsRUFBZSxNQUFNLG1CQUFtQixDQUFDO0FBRWxGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7QUFjckQsTUFBTSxPQUFPLHNDQUFzQztJQU92QztJQUNBO0lBQ0E7SUFSRCxnQkFBZ0IsQ0FBTTtJQUNyQixPQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDakQsUUFBUSxHQUF1QixRQUFRLENBQUM7SUFDakQsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNVLE1BQWlCLEVBQ2pCLFlBQTBCLEVBQzFCLE9BQWdDO1FBRmhDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFDdkMsQ0FBQztJQUVKLGlCQUFpQjtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3ZELEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFlO2dCQUNqQixLQUFLLEVBQUUsMkJBQTJCO2dCQUNsQyxPQUFPLEVBQUU7dURBQ3NDO2FBQ2hEO1lBQ0QsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUNuQyxJQUFJLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTt3QkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLDJDQUEyQyxFQUMzQyxTQUFTLENBQ1YsQ0FBQzt3QkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUN4QixDQUFDO29CQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ3hDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBekNVLHNDQUFzQzs0RkFBdEMsc0NBQXNDLHlNQ3JCbkQsdWJBUUEsMERES0ksU0FBUyxpTEFDVCxJQUFJLDZGQUVKLFVBQVU7OzRGQUtELHNDQUFzQztrQkFabEQsU0FBUzsrQkFDRSxzQ0FBc0MsY0FDcEMsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1QsSUFBSTt3QkFDSixPQUFPO3dCQUNQLFVBQVU7cUJBQ1g7K0lBS1EsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge0FjdGlvblBvcHVwLCBBY3Rpb25Qb3B1cENvbXBvbmVudCwgQWxlcnRTZXJ2aWNlfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQge0NoZWNrc2hlZXRGb3JtYXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9jaGVja3NoZWV0LWZvcm1hdC5zZXJ2aWNlJztcbmltcG9ydCB7TWF0QnV0dG9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtOZ0lmfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtNYXRJY29ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jaGVja3NoZWV0LWZvcm1hdC1wdWJsaXNoLWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTmdJZixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRvb2x0aXBcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrc2hlZXRGb3JtYXRQdWJsaXNoQnV0dG9uQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2hlY2tzaGVldEZvcm1hdDogYW55O1xuICBAT3V0cHV0KCkgY2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHZpZXdNb2RlIDogJ2J1dHRvbicgfCAnaWNvbicgPSAnYnV0dG9uJztcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBDaGVja3NoZWV0Rm9ybWF0U2VydmljZVxuICApIHt9XG5cbiAgcHVibGlzaENoZWNrc2hlZXQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiA8QWN0aW9uUG9wdXA+e1xuICAgICAgICB0aXRsZTogJ1B1Ymxpc2ggQ2hlY2tzaGVldCBGb3JtYXQnLFxuICAgICAgICBtZXNzYWdlOiBgUmV2aWV3IHRoZSBjaGVja3NoZWV0IGZvcm1hdCBjb21wbGV0ZWx5IGJlZm9yZSBwdWJsaXNoaW5nLCB5b3UgY2Fubm90IGFsdGVyIG9uY2UgaXQgaXMgcHVibGlzaGVkLlxuICAgICAgICBBcmUgeW91IHN1cmUgdG8gcHVibGlzaCB0aGUgQ2hlY2tzaGVldCBmb3JtYXQ/YFxuICAgICAgfSxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0geyAuLi50aGlzLmNoZWNrc2hlZXRGb3JtYXQgfTtcbiAgICAgICAgbW9kZWwuaXNfcHVibGlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VydmljZS51cGRhdGUobW9kZWwpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KFxuICAgICAgICAgICAgICAnQ2hlY2tzaGVldCBmb3JtYXQgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAnc3VjY2VzcydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdChyZXNwb25zZT8uaXRlbSk7XG4gICAgICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmlzU2F2aW5nID0gZmFsc2U7IH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImlzU2F2aW5nXCIgY29sb3I9XCJhY2NlbnRcIiAgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwdWJsaXNoQ2hlY2tzaGVldCgpXCJcbiAgICAgICAgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2J1dHRvbicgJiYgIWNoZWNrc2hlZXRGb3JtYXQ/LmlzX3B1Ymxpc2hlZFwiPlxuICBQdWJsaXNoXG48L2J1dHRvbj5cbjxzcGFuIG1hdFRvb2x0aXA9XCJQdWJsaXNoXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInB1Ymxpc2hDaGVja3NoZWV0KClcIlxuICAgICAgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2ljb24nICYmICFjaGVja3NoZWV0Rm9ybWF0Py5pc19wdWJsaXNoZWRcIj5cbiAgcHVibGlzaGVkX3dpdGhfY2hhbmdlc1xuPC9zcGFuPlxuIl19
@@ -0,0 +1,57 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { ActionPopupComponent } from 'ngx-techlify-core';
3
+ import { MatIcon } from '@angular/material/icon';
4
+ import { MatTooltip } from '@angular/material/tooltip';
5
+ import { NgIf } from '@angular/common';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/dialog";
8
+ import * as i2 from "ngx-techlify-core";
9
+ import * as i3 from "../../checksheet-format.service";
10
+ export class ChecksheetFormatUnpublishButtonComponent {
11
+ dialog;
12
+ alertService;
13
+ service;
14
+ checksheetFormat;
15
+ changed = new EventEmitter();
16
+ constructor(dialog, alertService, service) {
17
+ this.dialog = dialog;
18
+ this.alertService = alertService;
19
+ this.service = service;
20
+ }
21
+ unpublishChecksheet() {
22
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
23
+ width: '400px',
24
+ data: {
25
+ title: 'Unpublish Checksheet Format',
26
+ message: `Are you sure to unpublish the format ${this.checksheetFormat.title}?
27
+ This checksheet format would no longer be available to team members to create submissions for. `
28
+ },
29
+ autoFocus: false
30
+ });
31
+ dialogRef.afterClosed().subscribe(async (result) => {
32
+ if (result) {
33
+ this.service.unpublish(this.checksheetFormat).subscribe({
34
+ next: () => {
35
+ this.alertService.addAlert('Checksheet Format unpublished successfully!', 'success');
36
+ this.changed.emit();
37
+ }
38
+ });
39
+ }
40
+ });
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatUnpublishButtonComponent, deps: [{ token: i1.MatDialog }, { token: i2.AlertService }, { token: i3.ChecksheetFormatService }], target: i0.ɵɵFactoryTarget.Component });
43
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetFormatUnpublishButtonComponent, isStandalone: true, selector: "app-checksheet-format-unpublish-button", inputs: { checksheetFormat: "checksheetFormat" }, outputs: { changed: "changed" }, ngImport: i0, template: "<mat-icon class=\"cursor-pointer\" *ngIf=\"checksheetFormat?.is_published\" matTooltip=\"Unpublish\"\n (click)=\"unpublishChecksheet()\">\n unpublished\n</mat-icon>\n", styles: [""], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatUnpublishButtonComponent, decorators: [{
46
+ type: Component,
47
+ args: [{ selector: 'app-checksheet-format-unpublish-button', standalone: true, imports: [
48
+ MatIcon,
49
+ MatTooltip,
50
+ NgIf
51
+ ], template: "<mat-icon class=\"cursor-pointer\" *ngIf=\"checksheetFormat?.is_published\" matTooltip=\"Unpublish\"\n (click)=\"unpublishChecksheet()\">\n unpublished\n</mat-icon>\n" }]
52
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.AlertService }, { type: i3.ChecksheetFormatService }], propDecorators: { checksheetFormat: [{
53
+ type: Input
54
+ }], changed: [{
55
+ type: Output
56
+ }] } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1mb3JtYXQtdW5wdWJsaXNoLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY2hlY2tzaGVldC9zcmMvbGliL2NoZWNrc2hlZXQvY2hlY2tzaGVldC1mb3JtYXQvY2hlY2tzaGVldC1mb3JtYXQtdW5wdWJsaXNoLWJ1dHRvbi9jaGVja3NoZWV0LWZvcm1hdC11bnB1Ymxpc2gtYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LWZvcm1hdC9jaGVja3NoZWV0LWZvcm1hdC11bnB1Ymxpc2gtYnV0dG9uL2NoZWNrc2hlZXQtZm9ybWF0LXVucHVibGlzaC1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQWMsb0JBQW9CLEVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFhckMsTUFBTSxPQUFPLHdDQUF3QztJQUt6QztJQUNBO0lBQ0E7SUFORCxnQkFBZ0IsQ0FBTTtJQUNyQixPQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFMUQsWUFDVSxNQUFpQixFQUNqQixZQUEwQixFQUMxQixPQUFnQztRQUZoQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ3ZDLENBQUM7SUFFSixtQkFBbUI7UUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDdkQsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQWU7Z0JBQ2pCLEtBQUssRUFBRSw2QkFBNkI7Z0JBQ3BDLE9BQU8sRUFBRSx3Q0FBd0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUs7Z0hBQzRCO2FBQ3pHO1lBQ0QsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3RELElBQUksRUFBRSxHQUFHLEVBQUU7d0JBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsNkNBQTZDLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQ3JGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0EvQlUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0MscUxDbkJyRCxrTEFJQSwwRERRSSxPQUFPLDJJQUNQLFVBQVUsaVJBQ1YsSUFBSTs7NEZBS0ssd0NBQXdDO2tCQVhwRCxTQUFTOytCQUNFLHdDQUF3QyxjQUN0QyxJQUFJLFdBQ1A7d0JBQ1AsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLElBQUk7cUJBQ0w7K0lBS1EsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtBY3Rpb25Qb3B1cCwgQWN0aW9uUG9wdXBDb21wb25lbnQsIEFsZXJ0U2VydmljZX0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHtDaGVja3NoZWV0Rm9ybWF0U2VydmljZX0gZnJvbSAnLi4vLi4vY2hlY2tzaGVldC1mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQge01hdEljb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRUb29sdGlwfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7TmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtZm9ybWF0LXVucHVibGlzaC1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0SWNvbixcbiAgICBNYXRUb29sdGlwLFxuICAgIE5nSWZcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtZm9ybWF0LXVucHVibGlzaC1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY2hlY2tzaGVldC1mb3JtYXQtdW5wdWJsaXNoLWJ1dHRvbi5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0Rm9ybWF0VW5wdWJsaXNoQnV0dG9uQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2hlY2tzaGVldEZvcm1hdDogYW55O1xuICBAT3V0cHV0KCkgY2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZTogQ2hlY2tzaGVldEZvcm1hdFNlcnZpY2VcbiAgKSB7fVxuXG4gIHVucHVibGlzaENoZWNrc2hlZXQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Qb3B1cENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiA8QWN0aW9uUG9wdXA+e1xuICAgICAgICB0aXRsZTogJ1VucHVibGlzaCBDaGVja3NoZWV0IEZvcm1hdCcsXG4gICAgICAgIG1lc3NhZ2U6IGBBcmUgeW91IHN1cmUgdG8gdW5wdWJsaXNoIHRoZSBmb3JtYXQgJHt0aGlzLmNoZWNrc2hlZXRGb3JtYXQudGl0bGV9P1xuICAgICAgICAgICAgICAgIFRoaXMgY2hlY2tzaGVldCBmb3JtYXQgd291bGQgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSB0byB0ZWFtIG1lbWJlcnMgdG8gY3JlYXRlIHN1Ym1pc3Npb25zIGZvci4gYFxuICAgICAgfSxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2VcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2VydmljZS51bnB1Ymxpc2godGhpcy5jaGVja3NoZWV0Rm9ybWF0KS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdDaGVja3NoZWV0IEZvcm1hdCB1bnB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPG1hdC1pY29uIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImNoZWNrc2hlZXRGb3JtYXQ/LmlzX3B1Ymxpc2hlZFwiIG1hdFRvb2x0aXA9XCJVbnB1Ymxpc2hcIlxuICAgICAgICAgIChjbGljayk9XCJ1bnB1Ymxpc2hDaGVja3NoZWV0KClcIj5cbiAgdW5wdWJsaXNoZWRcbjwvbWF0LWljb24+XG4iXX0=
@@ -0,0 +1,140 @@
1
+ import { Component } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { DateValidator } from 'ngx-techlify-core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-techlify-core";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "ngx-spinner";
8
+ import * as i4 from "@angular/common";
9
+ import * as i5 from "@angular/material/dialog";
10
+ import * as i6 from "@angular/router";
11
+ import * as i7 from "../../checksheet.service";
12
+ import * as i8 from "../../checksheet-format-form/checksheet-format-form.component";
13
+ const errorMessages = {
14
+ date: {
15
+ required: 'Date is required',
16
+ invalid: 'Invalid date'
17
+ },
18
+ model_id: {
19
+ required: 'Vehicle is required'
20
+ },
21
+ checksheet_format_id: {
22
+ required: 'Checksheet Format is required'
23
+ },
24
+ status_id: {
25
+ required: 'Status is required'
26
+ }
27
+ };
28
+ export class ChecksheetFormatViewComponent {
29
+ formValidatorService;
30
+ fb;
31
+ spinnerService;
32
+ alertService;
33
+ location;
34
+ errorHandler;
35
+ dataManager;
36
+ dialog;
37
+ route;
38
+ checksheetSubmissionService;
39
+ checksheetSubmissionForm;
40
+ submission;
41
+ selectedFormat;
42
+ submissionId;
43
+ constructor(formValidatorService, fb, spinnerService, alertService, location, errorHandler, dataManager, dialog, route, checksheetSubmissionService) {
44
+ this.formValidatorService = formValidatorService;
45
+ this.fb = fb;
46
+ this.spinnerService = spinnerService;
47
+ this.alertService = alertService;
48
+ this.location = location;
49
+ this.errorHandler = errorHandler;
50
+ this.dataManager = dataManager;
51
+ this.dialog = dialog;
52
+ this.route = route;
53
+ this.checksheetSubmissionService = checksheetSubmissionService;
54
+ this.submissionId = parseInt(this.route.snapshot.params['submissionId']);
55
+ this.createForm();
56
+ }
57
+ ngOnInit() {
58
+ if (this.submissionId) {
59
+ const params = {
60
+ with: 'format.questions.type,format.questions.answers'
61
+ };
62
+ this.checksheetSubmissionService
63
+ .show(this.submissionId, params)
64
+ .subscribe({
65
+ next: (response) => {
66
+ this.submission = response?.item;
67
+ this.selectedFormat = this.submission?.format;
68
+ }
69
+ });
70
+ }
71
+ }
72
+ createForm() {
73
+ this.checksheetSubmissionForm = this.fb.group({
74
+ id: [''],
75
+ date: ['', Validators.compose([Validators.required, DateValidator()])],
76
+ reviewer_id: [''],
77
+ model_id: ['', Validators.required],
78
+ model: ['vehicle'],
79
+ status_id: [''],
80
+ comments: [''],
81
+ checksheet_format_id: ['', Validators.required]
82
+ });
83
+ }
84
+ redirectBack() {
85
+ this.location.back();
86
+ }
87
+ /**Method to evaluate form fields*/
88
+ isFieldValid(field) {
89
+ return this.formValidatorService.isFieldValid(field, this.checksheetSubmissionForm);
90
+ }
91
+ /**Method to find error in form fields*/
92
+ getErrorMessage(field) {
93
+ return this.formValidatorService.getErrorMessage(field, this.checksheetSubmissionForm, errorMessages);
94
+ }
95
+ async submit() {
96
+ if (this.checksheetSubmissionForm.valid) {
97
+ this.spinnerService.show();
98
+ let result;
99
+ const model = this.checksheetSubmissionForm.value;
100
+ const submission = (await this.dataManager.GET(`api/checksheets/${this.submission.id}`)).item;
101
+ //Submission Validation for MSQYN
102
+ let validSubmission = true;
103
+ (submission.format.questions || [])
104
+ .filter((question) => question.type_id === 7)
105
+ .forEach((question) => {
106
+ if (question?.submitted_answers == null ||
107
+ (question?.answers || []).length >
108
+ (question?.submitted_answer?.msq_answer || []).length) {
109
+ this.alertService.addAlert(`Answer all the required Yes/No Question`, 'warn');
110
+ validSubmission = false;
111
+ return;
112
+ }
113
+ });
114
+ if (!validSubmission) {
115
+ return;
116
+ }
117
+ try {
118
+ result = await this.dataManager.PUT(`api/checksheets/${model.id}`, model);
119
+ this.alertService.addAlert('Checksheet saved successfully', 'success');
120
+ }
121
+ catch (error) {
122
+ this.errorHandler.handleError(error, 'Unable to save Checksheet, try later');
123
+ }
124
+ finally {
125
+ this.spinnerService.hide();
126
+ }
127
+ }
128
+ }
129
+ onSaved() {
130
+ this.alertService.addAlert('Checksheet saved successfully!', 'success');
131
+ this.redirectBack();
132
+ }
133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatViewComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.UntypedFormBuilder }, { token: i3.NgxSpinnerService }, { token: i1.AlertService }, { token: i4.Location }, { token: i1.ErrorHandlerService }, { token: i1.DataManager }, { token: i5.MatDialog }, { token: i6.ActivatedRoute }, { token: i7.ChecksheetService }], target: i0.ɵɵFactoryTarget.Component });
134
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetFormatViewComponent, selector: "app-checksheet-format-view", ngImport: i0, template: "<app-checksheet-format-form [disableInput]=\"false\"></app-checksheet-format-form>\n", styles: [""], dependencies: [{ kind: "component", type: i8.ChecksheetFormatFormComponent, selector: "app-checksheet-format-form", inputs: ["disableInput"] }] });
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatViewComponent, decorators: [{
137
+ type: Component,
138
+ args: [{ selector: 'app-checksheet-format-view', template: "<app-checksheet-format-form [disableInput]=\"false\"></app-checksheet-format-form>\n" }]
139
+ }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.UntypedFormBuilder }, { type: i3.NgxSpinnerService }, { type: i1.AlertService }, { type: i4.Location }, { type: i1.ErrorHandlerService }, { type: i1.DataManager }, { type: i5.MatDialog }, { type: i6.ActivatedRoute }, { type: i7.ChecksheetService }] });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1mb3JtYXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY2hlY2tzaGVldC9zcmMvbGliL2NoZWNrc2hlZXQvY2hlY2tzaGVldC1mb3JtYXQvY2hlY2tzaGVldC1mb3JtYXQtdmlldy9jaGVja3NoZWV0LWZvcm1hdC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LWZvcm1hdC9jaGVja3NoZWV0LWZvcm1hdC12aWV3L2NoZWNrc2hlZXQtZm9ybWF0LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBR0wsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FBWWxELE1BQU0sYUFBYSxHQUFRO0lBQ3pCLElBQUksRUFBRTtRQUNKLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsT0FBTyxFQUFFLGNBQWM7S0FDeEI7SUFDRCxRQUFRLEVBQUU7UUFDUixRQUFRLEVBQUUscUJBQXFCO0tBQ2hDO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsUUFBUSxFQUFFLCtCQUErQjtLQUMxQztJQUNELFNBQVMsRUFBRTtRQUNULFFBQVEsRUFBRSxvQkFBb0I7S0FDL0I7Q0FDRixDQUFDO0FBT0YsTUFBTSxPQUFPLDZCQUE2QjtJQU85QjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWZWLHdCQUF3QixDQUFvQjtJQUM1QyxVQUFVLENBQU07SUFDaEIsY0FBYyxDQUFN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QUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLCtCQUErQixFQUMvQixTQUFTLENBQ1YsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUMzQixLQUFLLEVBQ0wsc0NBQXNDLENBQ3ZDLENBQUM7WUFDSixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLGdDQUFnQyxFQUNoQyxTQUFTLENBQ1YsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQWpJVSw2QkFBNkI7NEZBQTdCLDZCQUE2QixrRUMxQzFDLHNGQUNBOzs0RkR5Q2EsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVZhbGlkYXRvciB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IE5neFNwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXNwaW5uZXInO1xuaW1wb3J0IHtcbiAgQWN0aW9uUG9wdXAsXG4gIEFjdGlvblBvcHVwQ29tcG9uZW50LFxuICBBbGVydFNlcnZpY2UsXG4gIERhdGFNYW5hZ2VyLFxuICBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgRXJyb3JIYW5kbGVyU2VydmljZVxufSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBDaGVja3NoZWV0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoZWNrc2hlZXQuc2VydmljZSc7XG5cbmNvbnN0IGVycm9yTWVzc2FnZXM6IGFueSA9IHtcbiAgZGF0ZToge1xuICAgIHJlcXVpcmVkOiAnRGF0ZSBpcyByZXF1aXJlZCcsXG4gICAgaW52YWxpZDogJ0ludmFsaWQgZGF0ZSdcbiAgfSxcbiAgbW9kZWxfaWQ6IHtcbiAgICByZXF1aXJlZDogJ1ZlaGljbGUgaXMgcmVxdWlyZWQnXG4gIH0sXG4gIGNoZWNrc2hlZXRfZm9ybWF0X2lkOiB7XG4gICAgcmVxdWlyZWQ6ICdDaGVja3NoZWV0IEZvcm1hdCBpcyByZXF1aXJlZCdcbiAgfSxcbiAgc3RhdHVzX2lkOiB7XG4gICAgcmVxdWlyZWQ6ICdTdGF0dXMgaXMgcmVxdWlyZWQnXG4gIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jaGVja3NoZWV0LWZvcm1hdC12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtZm9ybWF0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGVja3NoZWV0LWZvcm1hdC12aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tzaGVldEZvcm1hdFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjaGVja3NoZWV0U3VibWlzc2lvbkZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBzdWJtaXNzaW9uOiBhbnk7XG4gIHNlbGVjdGVkRm9ybWF0OiBhbnk7XG4gIHN1Ym1pc3Npb25JZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZ3hTcGlubmVyU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhTWFuYWdlcjogRGF0YU1hbmFnZXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGNoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZTogQ2hlY2tzaGVldFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJtaXNzaW9uSWQgPSBwYXJzZUludCh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snc3VibWlzc2lvbklkJ10pO1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3VibWlzc2lvbklkKSB7XG4gICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgICAgd2l0aDogJ2Zvcm1hdC5xdWVzdGlvbnMudHlwZSxmb3JtYXQucXVlc3Rpb25zLmFuc3dlcnMnXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGVja3NoZWV0U3VibWlzc2lvblNlcnZpY2VcbiAgICAgICAgLnNob3codGhpcy5zdWJtaXNzaW9uSWQsIHBhcmFtcylcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbiA9IHJlc3BvbnNlPy5pdGVtO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvcm1hdCA9IHRoaXMuc3VibWlzc2lvbj8uZm9ybWF0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMuY2hlY2tzaGVldFN1Ym1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBpZDogWycnXSxcbiAgICAgIGRhdGU6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBEYXRlVmFsaWRhdG9yKCldKV0sXG4gICAgICByZXZpZXdlcl9pZDogWycnXSxcbiAgICAgIG1vZGVsX2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgbW9kZWw6IFsndmVoaWNsZSddLFxuICAgICAgc3RhdHVzX2lkOiBbJyddLFxuICAgICAgY29tbWVudHM6IFsnJ10sXG4gICAgICBjaGVja3NoZWV0X2Zvcm1hdF9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pO1xuICB9XG5cbiAgcmVkaXJlY3RCYWNrKCkge1xuICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICB9XG5cbiAgLyoqTWV0aG9kIHRvIGV2YWx1YXRlIGZvcm0gZmllbGRzKi9cbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoXG4gICAgICBmaWVsZCxcbiAgICAgIHRoaXMuY2hlY2tzaGVldFN1Ym1pc3Npb25Gb3JtXG4gICAgKTtcbiAgfVxuXG4gIC8qKk1ldGhvZCB0byBmaW5kIGVycm9yIGluIGZvcm0gZmllbGRzKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5nZXRFcnJvck1lc3NhZ2UoXG4gICAgICBmaWVsZCxcbiAgICAgIHRoaXMuY2hlY2tzaGVldFN1Ym1pc3Npb25Gb3JtLFxuICAgICAgZXJyb3JNZXNzYWdlc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tzaGVldFN1Ym1pc3Npb25Gb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcbiAgICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5jaGVja3NoZWV0U3VibWlzc2lvbkZvcm0udmFsdWU7XG4gICAgICBjb25zdCBzdWJtaXNzaW9uID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFNYW5hZ2VyLkdFVChcbiAgICAgICAgICBgYXBpL2NoZWNrc2hlZXRzLyR7dGhpcy5zdWJtaXNzaW9uLmlkfWBcbiAgICAgICAgKVxuICAgICAgKS5pdGVtO1xuICAgICAgLy9TdWJtaXNzaW9uIFZhbGlkYXRpb24gZm9yIE1TUVlOXG4gICAgICBsZXQgdmFsaWRTdWJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICgoc3VibWlzc2lvbi5mb3JtYXQucXVlc3Rpb25zIGFzIFtdKSB8fCBbXSlcbiAgICAgICAgLmZpbHRlcigocXVlc3Rpb246IGFueSkgPT4gcXVlc3Rpb24udHlwZV9pZCA9PT0gNylcbiAgICAgICAgLmZvckVhY2goKHF1ZXN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBxdWVzdGlvbj8uc3VibWl0dGVkX2Fuc3dlcnMgPT0gbnVsbCB8fFxuICAgICAgICAgICAgKChxdWVzdGlvbj8uYW5zd2VycyBhcyBbXSkgfHwgW10pLmxlbmd0aCA+XG4gICAgICAgICAgICAgICgocXVlc3Rpb24/LnN1Ym1pdHRlZF9hbnN3ZXI/Lm1zcV9hbnN3ZXIgYXMgW10pIHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KFxuICAgICAgICAgICAgICBgQW5zd2VyIGFsbCB0aGUgcmVxdWlyZWQgWWVzL05vIFF1ZXN0aW9uYCxcbiAgICAgICAgICAgICAgJ3dhcm4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdmFsaWRTdWJtaXNzaW9uID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGlmICghdmFsaWRTdWJtaXNzaW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YU1hbmFnZXIuUFVUKFxuICAgICAgICAgIGBhcGkvY2hlY2tzaGVldHMvJHttb2RlbC5pZH1gLFxuICAgICAgICAgIG1vZGVsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KFxuICAgICAgICAgICdDaGVja3NoZWV0IHNhdmVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAnVW5hYmxlIHRvIHNhdmUgQ2hlY2tzaGVldCwgdHJ5IGxhdGVyJ1xuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TYXZlZCgpIHtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICdDaGVja3NoZWV0IHNhdmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgJ3N1Y2Nlc3MnXG4gICAgKTtcbiAgICB0aGlzLnJlZGlyZWN0QmFjaygpO1xuICB9XG59XG4iLCI8YXBwLWNoZWNrc2hlZXQtZm9ybWF0LWZvcm0gW2Rpc2FibGVJbnB1dF09XCJmYWxzZVwiPjwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LWZvcm0+XG4iXX0=
@@ -0,0 +1,136 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "ngx-techlify-core";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "ngx-spinner";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/material/dialog";
9
+ import * as i6 from "@angular/router";
10
+ import * as i7 from "../checksheet-format.service";
11
+ import * as i8 from "@angular/flex-layout/flex";
12
+ import * as i9 from "@angular/material/button";
13
+ import * as i10 from "@angular/material/card";
14
+ import * as i11 from "@angular/material/form-field";
15
+ import * as i12 from "@angular/material/icon";
16
+ import * as i13 from "@angular/material/input";
17
+ import * as i14 from "@angular/material/progress-bar";
18
+ import * as i15 from "../checksheet-format/checksheet-format-copy-button/checksheet-format-copy-button.component";
19
+ import * as i16 from "../checksheet-format/checksheet-format-delete-button/checksheet-format-delete-button.component";
20
+ import * as i17 from "../checksheet-format/checksheet-format-unpublish-button/checksheet-format-unpublish-button.component";
21
+ import * as i18 from "../checksheet-format/checksheet-format-publish-button/checksheet-format-publish-button.component";
22
+ import * as i19 from "../checksheet-question-list/checksheet-question-list.component";
23
+ const errorMessages = {
24
+ title: {
25
+ required: 'The title is required.'
26
+ }
27
+ };
28
+ export class ChecksheetFormatFormComponent {
29
+ formValidatorService;
30
+ fb;
31
+ spinnerService;
32
+ alertService;
33
+ location;
34
+ errorHandler;
35
+ dataManager;
36
+ dialog;
37
+ route;
38
+ checksheetFormatService;
39
+ checksheetForm;
40
+ updateMode;
41
+ checksheetFormat;
42
+ isSaving = false;
43
+ id;
44
+ disableInput;
45
+ isLoading = false;
46
+ showChecksheetInfo = false;
47
+ constructor(formValidatorService, fb, spinnerService, alertService, location, errorHandler, dataManager, dialog, route, checksheetFormatService) {
48
+ this.formValidatorService = formValidatorService;
49
+ this.fb = fb;
50
+ this.spinnerService = spinnerService;
51
+ this.alertService = alertService;
52
+ this.location = location;
53
+ this.errorHandler = errorHandler;
54
+ this.dataManager = dataManager;
55
+ this.dialog = dialog;
56
+ this.route = route;
57
+ this.checksheetFormatService = checksheetFormatService;
58
+ this.id = parseInt(this.route.snapshot.params?.['checksheetId']);
59
+ this.createForm();
60
+ }
61
+ ngOnInit() {
62
+ if (this.disableInput) {
63
+ this.checksheetForm.disable();
64
+ }
65
+ if (this.id) {
66
+ this.updateMode = true;
67
+ this.loadChecksheetFormat();
68
+ }
69
+ }
70
+ /**
71
+ * Create a check-sheet form.
72
+ * @private
73
+ */
74
+ createForm() {
75
+ this.checksheetForm = this.fb.group({
76
+ id: [''],
77
+ title: ['', Validators.required]
78
+ });
79
+ }
80
+ /**Method to evaluate form fields*/
81
+ isFieldValid(field) {
82
+ return this.formValidatorService.isFieldValid(field, this.checksheetForm);
83
+ }
84
+ /**Method to find error in form fields*/
85
+ getErrorMessage(field) {
86
+ return this.formValidatorService.getErrorMessage(field, this.checksheetForm, errorMessages);
87
+ }
88
+ submit() {
89
+ this.checksheetForm.markAllAsTouched();
90
+ if (this.checksheetForm.invalid) {
91
+ this.alertService.addAlert('Please check the form for errors.', 'error');
92
+ return;
93
+ }
94
+ const model = { ...this.checksheetForm.value };
95
+ this.isSaving = true;
96
+ let request = this.updateMode
97
+ ? this.checksheetFormatService.update(model)
98
+ : this.checksheetFormatService.store(model);
99
+ request.subscribe({
100
+ next: (result) => {
101
+ this.isSaving = false;
102
+ this.checksheetFormat = result?.item;
103
+ this.checksheetForm.patchValue({ ...this.checksheetFormat });
104
+ this.updateMode = true;
105
+ this.showChecksheetInfo = false;
106
+ this.alertService.addAlert('Checksheet format saved successfully', 'success');
107
+ },
108
+ error: () => {
109
+ this.isSaving = false;
110
+ }
111
+ });
112
+ }
113
+ loadChecksheetFormat() {
114
+ this.isLoading = true;
115
+ const params = { with: 'questions.answers,questions.type' };
116
+ this.checksheetFormatService.show(this.id, params).subscribe({
117
+ next: (result) => {
118
+ this.isLoading = false;
119
+ this.checksheetForm.patchValue(result?.item);
120
+ this.checksheetFormat = result?.item;
121
+ },
122
+ error: () => {
123
+ this.isLoading = false;
124
+ }
125
+ });
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.UntypedFormBuilder }, { token: i3.NgxSpinnerService }, { token: i1.AlertService }, { token: i4.Location }, { token: i1.ErrorHandlerService }, { token: i1.DataManager }, { token: i5.MatDialog }, { token: i6.ActivatedRoute }, { token: i7.ChecksheetFormatService }], target: i0.ɵɵFactoryTarget.Component });
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetFormatFormComponent, selector: "app-checksheet-format-form", inputs: { disableInput: "disableInput" }, ngImport: i0, template: "<div class=\"d-flex justify-content-start align-items-start gap-3 w-100\" *ngIf=\"!isLoading\">\n <div class=\"d-flex flex-column gap-3\" style=\"width: 80%\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <span class=\"material-symbols-outlined fs-1\">\n list_alt_check\n </span>\n <h2 class=\"mb-0\">{{ checksheetFormat ? 'Update' : 'Create' }} Checksheet Format</h2>\n </div>\n <span class=\"badge bg-secondary\" *ngIf=\"checksheetFormat?.questions\">\n {{ checksheetFormat?.questions?.length }} Questions\n </span>\n </mat-card-content>\n </mat-card>\n\n <app-checksheet-question-list class=\"w-100\" [(checksheet)]=\"checksheetFormat\" [disableInput]=\"disableInput\">\n </app-checksheet-question-list>\n </div>\n <div style=\"width: calc(20% - 1rem)\" class=\"d-flex flex-column gap-3\">\n <mat-card *ngIf=\"!checksheetFormat || showChecksheetInfo\">\n <mat-card-content>\n <h3>Checksheet Format Information</h3>\n <form [formGroup]=\"checksheetForm\" (submit)=\"submit()\" fxLayout=\"column\" fxLayoutGap=\"0.25rem\">\n <mat-form-field>\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" required/>\n <mat-error *ngIf=\"isFieldValid('title')\">\n {{ getErrorMessage('title') }}\n </mat-error>\n </mat-form-field>\n\n <div class=\"my-2\" fxLayout=\"row\" fxLayoutGap=\"15px\" fxLayoutAlign=\"end\" *ngIf=\"!disableInput\">\n <button [disabled]=\"isSaving\" mat-flat-button type=\"button\" (click)=\"showChecksheetInfo = false\">\n Cancel\n </button>\n <button [disabled]=\"isSaving\" mat-raised-button type=\"submit\" color=\"primary\">\n Save\n </button>\n\n <app-checksheet-format-publish-button [checksheetFormat]=\"checksheetFormat\" *ngIf=\"updateMode\"\n (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-publish-button>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"checksheetFormat && !showChecksheetInfo\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <h3 class=\"mb-0\">Information</h3>\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-icon class=\"cursor-pointer\" (click)=\"showChecksheetInfo = true\">edit</mat-icon>\n <app-checksheet-format-delete-button [checksheetFormat]=\"checksheetFormat\" (deleted)=\"loadChecksheetFormat()\">\n </app-checksheet-format-delete-button>\n\n <app-checksheet-format-copy-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-copy-button>\n\n <app-checksheet-format-unpublish-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-unpublish-button>\n\n <app-checksheet-format-publish-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\" viewMode=\"icon\">\n </app-checksheet-format-publish-button>\n </div>\n </div>\n </mat-card-content>\n <mat-card-content class=\"mt-3 d-flex flex-column justify-content-center align-items-center gap-2\">\n <h2 class=\"mb-0\">{{ checksheetFormat?.title }}</h2>\n <span class=\"badge bg-secondary\">{{ checksheetFormat?.submissions_count }} Checksheet Submissions</span>\n <small class=\"text-secondary\">\n By {{ checksheetFormat?.creator?.name }} on {{ checksheetFormat?.created_at| date }}\n </small>\n </mat-card-content>\n </mat-card>\n\n <app-note-list *ngIf=\"checksheetFormat\" viewMode=\"timeline\" [relatedModelId]=\"checksheetFormat?.id\"\n modelType=\"ChecksheetFormat\"></app-note-list>\n </div>\n</div>\n\n<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.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: i8.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: i8.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: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i10.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i10.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.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: i14.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.NoteListComponent, selector: "app-note-list", inputs: ["relatedModelId", "modelType", "readonly", "labelText", "commentsView", "viewMode"] }, { kind: "component", type: i15.ChecksheetFormatCopyButtonComponent, selector: "app-checksheet-format-copy-button", inputs: ["checksheetFormat"], outputs: ["changed"] }, { kind: "component", type: i16.ChecksheetFormatDeleteButtonComponent, selector: "app-checksheet-format-delete-button", inputs: ["checksheetFormat"], outputs: ["deleted"] }, { kind: "component", type: i17.ChecksheetFormatUnpublishButtonComponent, selector: "app-checksheet-format-unpublish-button", inputs: ["checksheetFormat"], outputs: ["changed"] }, { kind: "component", type: i18.ChecksheetFormatPublishButtonComponent, selector: "app-checksheet-format-publish-button", inputs: ["checksheetFormat", "viewMode"], outputs: ["changed"] }, { kind: "component", type: i19.ChecksheetQuestionListComponent, selector: "app-checksheet-question-list", inputs: ["checksheet", "submission", "disableInput"], outputs: ["checksheetChange"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetFormatFormComponent, decorators: [{
131
+ type: Component,
132
+ args: [{ selector: 'app-checksheet-format-form', template: "<div class=\"d-flex justify-content-start align-items-start gap-3 w-100\" *ngIf=\"!isLoading\">\n <div class=\"d-flex flex-column gap-3\" style=\"width: 80%\">\n <mat-card>\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <span class=\"material-symbols-outlined fs-1\">\n list_alt_check\n </span>\n <h2 class=\"mb-0\">{{ checksheetFormat ? 'Update' : 'Create' }} Checksheet Format</h2>\n </div>\n <span class=\"badge bg-secondary\" *ngIf=\"checksheetFormat?.questions\">\n {{ checksheetFormat?.questions?.length }} Questions\n </span>\n </mat-card-content>\n </mat-card>\n\n <app-checksheet-question-list class=\"w-100\" [(checksheet)]=\"checksheetFormat\" [disableInput]=\"disableInput\">\n </app-checksheet-question-list>\n </div>\n <div style=\"width: calc(20% - 1rem)\" class=\"d-flex flex-column gap-3\">\n <mat-card *ngIf=\"!checksheetFormat || showChecksheetInfo\">\n <mat-card-content>\n <h3>Checksheet Format Information</h3>\n <form [formGroup]=\"checksheetForm\" (submit)=\"submit()\" fxLayout=\"column\" fxLayoutGap=\"0.25rem\">\n <mat-form-field>\n <input matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\" required/>\n <mat-error *ngIf=\"isFieldValid('title')\">\n {{ getErrorMessage('title') }}\n </mat-error>\n </mat-form-field>\n\n <div class=\"my-2\" fxLayout=\"row\" fxLayoutGap=\"15px\" fxLayoutAlign=\"end\" *ngIf=\"!disableInput\">\n <button [disabled]=\"isSaving\" mat-flat-button type=\"button\" (click)=\"showChecksheetInfo = false\">\n Cancel\n </button>\n <button [disabled]=\"isSaving\" mat-raised-button type=\"submit\" color=\"primary\">\n Save\n </button>\n\n <app-checksheet-format-publish-button [checksheetFormat]=\"checksheetFormat\" *ngIf=\"updateMode\"\n (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-publish-button>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n\n <mat-card *ngIf=\"checksheetFormat && !showChecksheetInfo\">\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <h3 class=\"mb-0\">Information</h3>\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <mat-icon class=\"cursor-pointer\" (click)=\"showChecksheetInfo = true\">edit</mat-icon>\n <app-checksheet-format-delete-button [checksheetFormat]=\"checksheetFormat\" (deleted)=\"loadChecksheetFormat()\">\n </app-checksheet-format-delete-button>\n\n <app-checksheet-format-copy-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-copy-button>\n\n <app-checksheet-format-unpublish-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\">\n </app-checksheet-format-unpublish-button>\n\n <app-checksheet-format-publish-button [checksheetFormat]=\"checksheetFormat\" (changed)=\"loadChecksheetFormat()\" viewMode=\"icon\">\n </app-checksheet-format-publish-button>\n </div>\n </div>\n </mat-card-content>\n <mat-card-content class=\"mt-3 d-flex flex-column justify-content-center align-items-center gap-2\">\n <h2 class=\"mb-0\">{{ checksheetFormat?.title }}</h2>\n <span class=\"badge bg-secondary\">{{ checksheetFormat?.submissions_count }} Checksheet Submissions</span>\n <small class=\"text-secondary\">\n By {{ checksheetFormat?.creator?.name }} on {{ checksheetFormat?.created_at| date }}\n </small>\n </mat-card-content>\n </mat-card>\n\n <app-note-list *ngIf=\"checksheetFormat\" viewMode=\"timeline\" [relatedModelId]=\"checksheetFormat?.id\"\n modelType=\"ChecksheetFormat\"></app-note-list>\n </div>\n</div>\n\n<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n" }]
133
+ }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.UntypedFormBuilder }, { type: i3.NgxSpinnerService }, { type: i1.AlertService }, { type: i4.Location }, { type: i1.ErrorHandlerService }, { type: i1.DataManager }, { type: i5.MatDialog }, { type: i6.ActivatedRoute }, { type: i7.ChecksheetFormatService }], propDecorators: { disableInput: [{
134
+ type: Input
135
+ }] } });
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1mb3JtYXQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY2hlY2tzaGVldC9zcmMvbGliL2NoZWNrc2hlZXQvY2hlY2tzaGVldC1mb3JtYXQtZm9ybS9jaGVja3NoZWV0LWZvcm1hdC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LWZvcm1hdC1mb3JtL2NoZWNrc2hlZXQtZm9ybWF0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUdMLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQnhCLE1BQU0sYUFBYSxHQUFRO0lBQ3pCLEtBQUssRUFBRTtRQUNMLFFBQVEsRUFBRSx3QkFBd0I7S0FDbkM7Q0FDRixDQUFDO0FBT0YsTUFBTSxPQUFPLDZCQUE2QjtJQVk5QjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXBCVixjQUFjLENBQW9CO0lBQ2xDLFVBQVUsQ0FBVztJQUNyQixnQkFBZ0IsQ0FBTTtJQUN0QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLEVBQUUsQ0FBVTtJQUVILFlBQVksQ0FBVztJQUNoQyxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQzNCLGtCQUFrQixHQUFZLEtBQUssQ0FBQztJQUVwQyxZQUNVLG9CQUEwQyxFQUMxQyxFQUFzQixFQUN0QixjQUFpQyxFQUNqQyxZQUEwQixFQUMzQixRQUFrQixFQUNqQixZQUFpQyxFQUNqQyxXQUF3QixFQUN4QixNQUFpQixF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QUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN4QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLE1BQU0sR0FBUSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0QsSUFBSSxFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXZHVSw2QkFBNkI7NEZBQTdCLDZCQUE2Qiw0R0NoQzFDLHV0SUFrRkE7OzRGRGxEYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsNEJBQTRCO21XQVc3QixZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBOZ3hTcGlubmVyU2VydmljZSB9IGZyb20gJ25neC1zcGlubmVyJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQWN0aW9uUG9wdXBDb21wb25lbnQsXG4gIEFjdGlvblBvcHVwLFxuICBFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICBEYXRhTWFuYWdlclxufSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQ2hlY2tzaGVldEZvcm1hdFNlcnZpY2UgfSBmcm9tICcuLi9jaGVja3NoZWV0LWZvcm1hdC5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuY29uc3QgZXJyb3JNZXNzYWdlczogYW55ID0ge1xuICB0aXRsZToge1xuICAgIHJlcXVpcmVkOiAnVGhlIHRpdGxlIGlzIHJlcXVpcmVkLidcbiAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtZm9ybWF0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tzaGVldC1mb3JtYXQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoZWNrc2hlZXQtZm9ybWF0LWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0Rm9ybWF0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNoZWNrc2hlZXRGb3JtITogVW50eXBlZEZvcm1Hcm91cDtcbiAgdXBkYXRlTW9kZSE6IGJvb2xlYW47XG4gIGNoZWNrc2hlZXRGb3JtYXQ6IGFueTtcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaWQhOiBudW1iZXI7XG5cbiAgQElucHV0KCkgZGlzYWJsZUlucHV0ITogYm9vbGVhbjtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dDaGVja3NoZWV0SW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZ3hTcGlubmVyU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhTWFuYWdlcjogRGF0YU1hbmFnZXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGNoZWNrc2hlZXRGb3JtYXRTZXJ2aWNlOiBDaGVja3NoZWV0Rm9ybWF0U2VydmljZVxuICApIHtcbiAgICB0aGlzLmlkID0gcGFyc2VJbnQodGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXM/LlsnY2hlY2tzaGVldElkJ10pO1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZUlucHV0KSB7XG4gICAgICB0aGlzLmNoZWNrc2hlZXRGb3JtLmRpc2FibGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgIHRoaXMudXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRDaGVja3NoZWV0Rm9ybWF0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNoZWNrLXNoZWV0IGZvcm0uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5jaGVja3NoZWV0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgaWQ6IFsnJ10sXG4gICAgICB0aXRsZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pO1xuICB9XG5cbiAgLyoqTWV0aG9kIHRvIGV2YWx1YXRlIGZvcm0gZmllbGRzKi9cbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoZmllbGQsIHRoaXMuY2hlY2tzaGVldEZvcm0pO1xuICB9XG5cbiAgLyoqTWV0aG9kIHRvIGZpbmQgZXJyb3IgaW4gZm9ybSBmaWVsZHMqL1xuICBnZXRFcnJvck1lc3NhZ2UoZmllbGQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZGF0b3JTZXJ2aWNlLmdldEVycm9yTWVzc2FnZShcbiAgICAgIGZpZWxkLFxuICAgICAgdGhpcy5jaGVja3NoZWV0Rm9ybSxcbiAgICAgIGVycm9yTWVzc2FnZXNcbiAgICApO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIHRoaXMuY2hlY2tzaGVldEZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICh0aGlzLmNoZWNrc2hlZXRGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgY2hlY2sgdGhlIGZvcm0gZm9yIGVycm9ycy4nLCAnZXJyb3InKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IHsgLi4udGhpcy5jaGVja3NoZWV0Rm9ybS52YWx1ZSB9O1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIGxldCByZXF1ZXN0OiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLnVwZGF0ZU1vZGVcbiAgICAgID8gdGhpcy5jaGVja3NoZWV0Rm9ybWF0U2VydmljZS51cGRhdGUobW9kZWwpXG4gICAgICA6IHRoaXMuY2hlY2tzaGVldEZvcm1hdFNlcnZpY2Uuc3RvcmUobW9kZWwpO1xuXG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGVja3NoZWV0Rm9ybWF0ID0gcmVzdWx0Py5pdGVtO1xuICAgICAgICB0aGlzLmNoZWNrc2hlZXRGb3JtLnBhdGNoVmFsdWUoeyAuLi50aGlzLmNoZWNrc2hlZXRGb3JtYXQgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0NoZWNrc2hlZXRJbmZvID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdDaGVja3NoZWV0IGZvcm1hdCBzYXZlZCBzdWNjZXNzZnVsbHknLCAnc3VjY2VzcycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRDaGVja3NoZWV0Rm9ybWF0KCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHsgd2l0aDogJ3F1ZXN0aW9ucy5hbnN3ZXJzLHF1ZXN0aW9ucy50eXBlJyB9O1xuICAgIHRoaXMuY2hlY2tzaGVldEZvcm1hdFNlcnZpY2Uuc2hvdyh0aGlzLmlkLCBwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGVja3NoZWV0Rm9ybS5wYXRjaFZhbHVlKHJlc3VsdD8uaXRlbSk7XG4gICAgICAgIHRoaXMuY2hlY2tzaGVldEZvcm1hdCA9IHJlc3VsdD8uaXRlbTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMyB3LTEwMFwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+XG4gICAgPG1hdC1jYXJkPlxuICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBmcy0xXCI+XG4gICAgICAgICAgICBsaXN0X2FsdF9jaGVja1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJtYi0wXCI+e3sgY2hlY2tzaGVldEZvcm1hdCA/ICdVcGRhdGUnIDogJ0NyZWF0ZScgfX0gQ2hlY2tzaGVldCBGb3JtYXQ8L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIiAqbmdJZj1cImNoZWNrc2hlZXRGb3JtYXQ/LnF1ZXN0aW9uc1wiPlxuICAgICAgICAgIHt7IGNoZWNrc2hlZXRGb3JtYXQ/LnF1ZXN0aW9ucz8ubGVuZ3RoIH19IFF1ZXN0aW9uc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPC9tYXQtY2FyZD5cblxuICAgIDxhcHAtY2hlY2tzaGVldC1xdWVzdGlvbi1saXN0IGNsYXNzPVwidy0xMDBcIiBbKGNoZWNrc2hlZXQpXT1cImNoZWNrc2hlZXRGb3JtYXRcIiBbZGlzYWJsZUlucHV0XT1cImRpc2FibGVJbnB1dFwiPlxuICAgIDwvYXBwLWNoZWNrc2hlZXQtcXVlc3Rpb24tbGlzdD5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJ3aWR0aDogY2FsYygyMCUgLSAxcmVtKVwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCI+XG4gICAgPG1hdC1jYXJkICpuZ0lmPVwiIWNoZWNrc2hlZXRGb3JtYXQgfHwgc2hvd0NoZWNrc2hlZXRJbmZvXCI+XG4gICAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgPGgzPkNoZWNrc2hlZXQgRm9ybWF0IEluZm9ybWF0aW9uPC9oMz5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGVja3NoZWV0Rm9ybVwiIChzdWJtaXQpPVwic3VibWl0KClcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMC4yNXJlbVwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIHBsYWNlaG9sZGVyPVwiVGl0bGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiByZXF1aXJlZC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCd0aXRsZScpXCI+XG4gICAgICAgICAgICAgIHt7IGdldEVycm9yTWVzc2FnZSgndGl0bGUnKSB9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjE1cHhcIiBmeExheW91dEFsaWduPVwiZW5kXCIgKm5nSWY9XCIhZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiIG1hdC1mbGF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNob3dDaGVja3NoZWV0SW5mbyA9IGZhbHNlXCI+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgU2F2ZVxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxhcHAtY2hlY2tzaGVldC1mb3JtYXQtcHVibGlzaC1idXR0b24gW2NoZWNrc2hlZXRGb3JtYXRdPVwiY2hlY2tzaGVldEZvcm1hdFwiICpuZ0lmPVwidXBkYXRlTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VkKT1cImxvYWRDaGVja3NoZWV0Rm9ybWF0KClcIj5cbiAgICAgICAgICAgIDwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPC9tYXQtY2FyZD5cblxuICAgIDxtYXQtY2FyZCAqbmdJZj1cImNoZWNrc2hlZXRGb3JtYXQgJiYgIXNob3dDaGVja3NoZWV0SW5mb1wiPlxuICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgPGgzIGNsYXNzPVwibWItMFwiPkluZm9ybWF0aW9uPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzaG93Q2hlY2tzaGVldEluZm8gPSB0cnVlXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICA8YXBwLWNoZWNrc2hlZXQtZm9ybWF0LWRlbGV0ZS1idXR0b24gW2NoZWNrc2hlZXRGb3JtYXRdPVwiY2hlY2tzaGVldEZvcm1hdFwiIChkZWxldGVkKT1cImxvYWRDaGVja3NoZWV0Rm9ybWF0KClcIj5cbiAgICAgICAgICAgIDwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LWRlbGV0ZS1idXR0b24+XG5cbiAgICAgICAgICAgIDxhcHAtY2hlY2tzaGVldC1mb3JtYXQtY29weS1idXR0b24gW2NoZWNrc2hlZXRGb3JtYXRdPVwiY2hlY2tzaGVldEZvcm1hdFwiIChjaGFuZ2VkKT1cImxvYWRDaGVja3NoZWV0Rm9ybWF0KClcIj5cbiAgICAgICAgICAgIDwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LWNvcHktYnV0dG9uPlxuXG4gICAgICAgICAgICA8YXBwLWNoZWNrc2hlZXQtZm9ybWF0LXVucHVibGlzaC1idXR0b24gW2NoZWNrc2hlZXRGb3JtYXRdPVwiY2hlY2tzaGVldEZvcm1hdFwiIChjaGFuZ2VkKT1cImxvYWRDaGVja3NoZWV0Rm9ybWF0KClcIj5cbiAgICAgICAgICAgIDwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LXVucHVibGlzaC1idXR0b24+XG5cbiAgICAgICAgICAgIDxhcHAtY2hlY2tzaGVldC1mb3JtYXQtcHVibGlzaC1idXR0b24gW2NoZWNrc2hlZXRGb3JtYXRdPVwiY2hlY2tzaGVldEZvcm1hdFwiIChjaGFuZ2VkKT1cImxvYWRDaGVja3NoZWV0Rm9ybWF0KClcIiB2aWV3TW9kZT1cImljb25cIj5cbiAgICAgICAgICAgIDwvYXBwLWNoZWNrc2hlZXQtZm9ybWF0LXB1Ymxpc2gtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwibXQtMyBkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwibWItMFwiPnt7IGNoZWNrc2hlZXRGb3JtYXQ/LnRpdGxlIH19PC9oMj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIj57eyBjaGVja3NoZWV0Rm9ybWF0Py5zdWJtaXNzaW9uc19jb3VudCB9fSBDaGVja3NoZWV0IFN1Ym1pc3Npb25zPC9zcGFuPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgIEJ5IHt7IGNoZWNrc2hlZXRGb3JtYXQ/LmNyZWF0b3I/Lm5hbWUgfX0gb24ge3sgY2hlY2tzaGVldEZvcm1hdD8uY3JlYXRlZF9hdHwgZGF0ZSB9fVxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgIDwvbWF0LWNhcmQ+XG5cbiAgICA8YXBwLW5vdGUtbGlzdCAqbmdJZj1cImNoZWNrc2hlZXRGb3JtYXRcIiB2aWV3TW9kZT1cInRpbWVsaW5lXCIgW3JlbGF0ZWRNb2RlbElkXT1cImNoZWNrc2hlZXRGb3JtYXQ/LmlkXCJcbiAgICAgICAgICAgICAgICAgICBtb2RlbFR5cGU9XCJDaGVja3NoZWV0Rm9ybWF0XCI+PC9hcHAtbm90ZS1saXN0PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuIl19