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.
Files changed (76) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/@shared/file-upload-button/file-upload-button.component.mjs +50 -0
  3. package/esm2022/lib/@shared/index.mjs +2 -0
  4. package/esm2022/lib/@shared/material.module.mjs +171 -0
  5. package/esm2022/lib/@shared/shared.module.mjs +54 -0
  6. package/esm2022/lib/checksheet/checksheet-form/checksheet-form.component.mjs +161 -0
  7. package/esm2022/lib/checksheet/checksheet-form-button/checksheet-form-button.component.mjs +58 -0
  8. package/esm2022/lib/checksheet/checksheet-format-list/checksheet-format-list.component.mjs +123 -0
  9. package/esm2022/lib/checksheet/checksheet-format-question.service.mjs +18 -0
  10. package/esm2022/lib/checksheet/checksheet-format.service.mjs +24 -0
  11. package/esm2022/lib/checksheet/checksheet-list/checksheet-list.component.mjs +138 -0
  12. package/esm2022/lib/checksheet/checksheet-node-view/checksheet-node-view.component.mjs +59 -0
  13. package/esm2022/lib/checksheet/checksheet-question/checksheet-question.component.mjs +174 -0
  14. package/esm2022/lib/checksheet/checksheet-question-form/checksheet-question-form.component.mjs +148 -0
  15. package/esm2022/lib/checksheet/checksheet-question-list/checksheet-question-list.component.mjs +161 -0
  16. package/esm2022/lib/checksheet/checksheet-report/checksheet-report.component.mjs +242 -0
  17. package/esm2022/lib/checksheet/checksheet-review-button/checksheet-review-button.component.mjs +68 -0
  18. package/esm2022/lib/checksheet/checksheet-routing.module.mjs +44 -0
  19. package/esm2022/lib/checksheet/checksheet-submission-answer.service.mjs +18 -0
  20. package/esm2022/lib/checksheet/checksheet-submission-delete-button/checksheet-submission-delete-button.component.mjs +52 -0
  21. package/esm2022/lib/checksheet/checksheet-submission-file/checksheet-submission-file-delete-button/checksheet-submission-file-delete-button.component.mjs +55 -0
  22. package/esm2022/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.mjs +67 -0
  23. package/esm2022/lib/checksheet/checksheet-submission-file-upload/checksheet-submisison-file-upload.component.mjs +46 -0
  24. package/esm2022/lib/checksheet/checksheet-submission-file.service.mjs +18 -0
  25. package/esm2022/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.mjs +131 -0
  26. package/esm2022/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.mjs +58 -0
  27. package/esm2022/lib/checksheet/checksheet-submission-list/checksheet-submission-list.component.mjs +107 -0
  28. package/esm2022/lib/checksheet/checksheet-submission-review-button/checksheet-submission-review-button.component.mjs +68 -0
  29. package/esm2022/lib/checksheet/checksheet-submission-view/checksheet-submission-view.component.mjs +142 -0
  30. package/esm2022/lib/checksheet/checksheet-submission.service.mjs +36 -0
  31. package/esm2022/lib/checksheet/checksheet-submittable.type.mjs +2 -0
  32. package/esm2022/lib/checksheet/checksheet-view/checksheet-view.component.mjs +140 -0
  33. package/esm2022/lib/checksheet/checksheet.module.mjs +131 -0
  34. package/esm2022/lib/checksheet/checksheet.service.mjs +44 -0
  35. package/esm2022/lib/checksheet/mechanical-issue-form/mechanical-issue-form.component.mjs +73 -0
  36. package/esm2022/ngx-techlify-checksheet.mjs +5 -0
  37. package/esm2022/public-api.mjs +9 -0
  38. package/fesm2022/ngx-techlify-checksheet.mjs +2550 -0
  39. package/fesm2022/ngx-techlify-checksheet.mjs.map +1 -0
  40. package/index.d.ts +5 -0
  41. package/lib/@shared/file-upload-button/file-upload-button.component.d.ts +20 -0
  42. package/lib/@shared/index.d.ts +1 -0
  43. package/lib/@shared/material.module.d.ts +40 -0
  44. package/lib/@shared/shared.module.d.ts +14 -0
  45. package/lib/checksheet/checksheet-form/checksheet-form.component.d.ts +45 -0
  46. package/lib/checksheet/checksheet-form-button/checksheet-form-button.component.d.ts +29 -0
  47. package/lib/checksheet/checksheet-format-list/checksheet-format-list.component.d.ts +19 -0
  48. package/lib/checksheet/checksheet-format-question.service.d.ts +7 -0
  49. package/lib/checksheet/checksheet-format.service.d.ts +10 -0
  50. package/lib/checksheet/checksheet-list/checksheet-list.component.d.ts +31 -0
  51. package/lib/checksheet/checksheet-node-view/checksheet-node-view.component.d.ts +25 -0
  52. package/lib/checksheet/checksheet-question/checksheet-question.component.d.ts +34 -0
  53. package/lib/checksheet/checksheet-question-form/checksheet-question-form.component.d.ts +38 -0
  54. package/lib/checksheet/checksheet-question-list/checksheet-question-list.component.d.ts +26 -0
  55. package/lib/checksheet/checksheet-report/checksheet-report.component.d.ts +47 -0
  56. package/lib/checksheet/checksheet-review-button/checksheet-review-button.component.d.ts +32 -0
  57. package/lib/checksheet/checksheet-routing.module.d.ts +7 -0
  58. package/lib/checksheet/checksheet-submission-answer.service.d.ts +7 -0
  59. package/lib/checksheet/checksheet-submission-delete-button/checksheet-submission-delete-button.component.d.ts +24 -0
  60. package/lib/checksheet/checksheet-submission-file/checksheet-submission-file-delete-button/checksheet-submission-file-delete-button.component.d.ts +24 -0
  61. package/lib/checksheet/checksheet-submission-file/checksheet-submission-files/checksheet-submission-files.component.d.ts +17 -0
  62. package/lib/checksheet/checksheet-submission-file-upload/checksheet-submisison-file-upload.component.d.ts +13 -0
  63. package/lib/checksheet/checksheet-submission-file.service.d.ts +7 -0
  64. package/lib/checksheet/checksheet-submission-form/checksheet-submission-form.component.d.ts +27 -0
  65. package/lib/checksheet/checksheet-submission-form-button/checksheet-submission-form-button.component.d.ts +29 -0
  66. package/lib/checksheet/checksheet-submission-list/checksheet-submission-list.component.d.ts +24 -0
  67. package/lib/checksheet/checksheet-submission-review-button/checksheet-submission-review-button.component.d.ts +32 -0
  68. package/lib/checksheet/checksheet-submission-view/checksheet-submission-view.component.d.ts +37 -0
  69. package/lib/checksheet/checksheet-submission.service.d.ts +22 -0
  70. package/lib/checksheet/checksheet-submittable.type.d.ts +1 -0
  71. package/lib/checksheet/checksheet-view/checksheet-view.component.d.ts +37 -0
  72. package/lib/checksheet/checksheet.module.d.ts +34 -0
  73. package/lib/checksheet/checksheet.service.d.ts +25 -0
  74. package/lib/checksheet/mechanical-issue-form/mechanical-issue-form.component.d.ts +21 -0
  75. package/package.json +45 -0
  76. package/public-api.d.ts +5 -0
@@ -0,0 +1,131 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { DateValidator, TechlifyFormComponentInterface, ActionPopupComponent } 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 "../checksheet.service";
8
+ import * as i4 from "@angular/material/dialog";
9
+ import * as i5 from "@angular/common";
10
+ import * as i6 from "@angular/flex-layout/flex";
11
+ import * as i7 from "@angular/material/core";
12
+ import * as i8 from "@angular/material/button";
13
+ import * as i9 from "@angular/material/datepicker";
14
+ import * as i10 from "@angular/material/form-field";
15
+ import * as i11 from "@angular/material/input";
16
+ import * as i12 from "@angular/material/select";
17
+ export class ChecksheetSubmissionFormComponent extends TechlifyFormComponentInterface {
18
+ fb;
19
+ checksheetSubmissionService;
20
+ alertService;
21
+ dialog;
22
+ submittableType;
23
+ submittableId;
24
+ cancelled = new EventEmitter();
25
+ saved = new EventEmitter();
26
+ updateMode;
27
+ checksheetSubmission;
28
+ isSaving = false;
29
+ constructor(formValidatorService, fb, checksheetSubmissionService, alertService, dialog) {
30
+ super(formValidatorService);
31
+ this.fb = fb;
32
+ this.checksheetSubmissionService = checksheetSubmissionService;
33
+ this.alertService = alertService;
34
+ this.dialog = dialog;
35
+ this.errorMessages = {
36
+ date: {
37
+ required: 'The date field is required.'
38
+ },
39
+ format_id: {
40
+ required: 'The checksheet format is required.'
41
+ }
42
+ };
43
+ this.createForm();
44
+ }
45
+ createForm() {
46
+ this.form = this.fb.group({
47
+ id: [''],
48
+ date: ['', Validators.compose([Validators.required, DateValidator()])],
49
+ format_id: ['', Validators.required],
50
+ submittable_type: ['fixed-asset'],
51
+ submittable_id: ['', Validators.required],
52
+ details: ['']
53
+ });
54
+ }
55
+ ngOnInit() {
56
+ // Set the submittable type and id and make it readonly
57
+ if (this.submittableType && this.submittableId) {
58
+ this.form.patchValue({
59
+ submittable_type: this.submittableType,
60
+ submittable_id: this.submittableId
61
+ });
62
+ }
63
+ // Set the Checksheet to form
64
+ if (this.checksheetSubmission) {
65
+ this.updateMode = true;
66
+ this.form.patchValue({
67
+ ...this.checksheetSubmission,
68
+ date: new Date(this.checksheetSubmission?.date)
69
+ });
70
+ }
71
+ }
72
+ submit() {
73
+ if (this.form.invalid) {
74
+ this.alertService.addAlert('Please check the form for errors', 'error');
75
+ }
76
+ const data = { ...this.form.value };
77
+ const request = this.updateMode
78
+ ? this.checksheetSubmissionService.update(data)
79
+ : this.checksheetSubmissionService.store(data);
80
+ this.isSaving = true;
81
+ request.subscribe({
82
+ next: (response) => {
83
+ this.isSaving = false;
84
+ this.saved.emit(response?.item);
85
+ },
86
+ error: () => {
87
+ this.isSaving = false;
88
+ }
89
+ });
90
+ }
91
+ submitChecksheet() {
92
+ const dialogRef = this.dialog.open(ActionPopupComponent, {
93
+ width: '400px',
94
+ data: {
95
+ title: 'Submit Checksheet',
96
+ message: `Review the checksheet completely before submitting, you cannot alter once it is submitted. Are you sure to submit the Checksheet?`
97
+ },
98
+ autoFocus: false
99
+ });
100
+ dialogRef.afterClosed().subscribe(async (result) => {
101
+ if (result) {
102
+ // Action confirmed
103
+ this.checksheetSubmissionService
104
+ .submit(this.checksheetSubmission?.id)
105
+ .subscribe({
106
+ next: (response) => {
107
+ this.alertService.addAlert('The Checksheet submitted!', 'success');
108
+ this.saved.emit(response?.item);
109
+ }
110
+ });
111
+ }
112
+ });
113
+ }
114
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionFormComponent, deps: [{ token: i1.FormValidatorService }, { token: i2.UntypedFormBuilder }, { token: i3.ChecksheetService }, { token: i1.AlertService }, { token: i4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetSubmissionFormComponent, selector: "app-checksheet-submission-form", inputs: { submittableType: "submittableType", submittableId: "submittableId", checksheetSubmission: "checksheetSubmission" }, outputs: { cancelled: "cancelled", saved: "saved" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <h3>Checksheet</h3>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"picker\"\n placeholder=\"Date (MM/DD/YYYY)\"\n formControlName=\"date\"\n autocomplete=\"off\"\n required\n (focus)=\"picker.open()\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\"\n >{{ getErrorMessage('date') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet Format</mat-label>\n <app-searchable-selector\n formControlName=\"format_id\"\n apiUrl=\"api/checksheet-formats?is_published=1\"\n [enableSearch]=\"true\"\n >\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('format_id')\"\n >{{ getErrorMessage('format_id') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet For</mat-label>\n <mat-select formControlName=\"submittable_type\">\n <mat-option value=\"fixed-asset\">Fixed Asset</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"form.get('submittable_type')?.value === 'fixed-asset'\"\n >\n <mat-label>Fixed Asset</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-assets\"\n titleField=\"name\"\n formControlName=\"submittable_id\"\n ></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Details</mat-label>\n <textarea\n matInput\n placeholder=\"Details\"\n formControlName=\"details\"\n ></textarea>\n </mat-form-field>\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <button\n [disabled]=\"isSaving\"\n mat-flat-button\n type=\"button\"\n (click)=\"cancelled.emit()\"\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 <button\n *ngIf=\"checksheetSubmission?.id\"\n [disabled]=\"isSaving\"\n mat-raised-button\n (click)=\"submitChecksheet()\"\n type=\"button\"\n color=\"accent\"\n >\n Submit\n </button>\n </div>\n </div>\n</form>\n", styles: [""], dependencies: [{ 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: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i11.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: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { 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.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"] }] });
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionFormComponent, decorators: [{
118
+ type: Component,
119
+ args: [{ selector: 'app-checksheet-submission-form', template: "<form [formGroup]=\"form\" (submit)=\"submit()\">\n <div fxLayout=\"column\" class=\"mat-typography\">\n <h3>Checksheet</h3>\n\n <mat-form-field>\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"picker\"\n placeholder=\"Date (MM/DD/YYYY)\"\n formControlName=\"date\"\n autocomplete=\"off\"\n required\n (focus)=\"picker.open()\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('date')\"\n >{{ getErrorMessage('date') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet Format</mat-label>\n <app-searchable-selector\n formControlName=\"format_id\"\n apiUrl=\"api/checksheet-formats?is_published=1\"\n [enableSearch]=\"true\"\n >\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('format_id')\"\n >{{ getErrorMessage('format_id') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet For</mat-label>\n <mat-select formControlName=\"submittable_type\">\n <mat-option value=\"fixed-asset\">Fixed Asset</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field\n *ngIf=\"form.get('submittable_type')?.value === 'fixed-asset'\"\n >\n <mat-label>Fixed Asset</mat-label>\n <app-searchable-selector\n apiUrl=\"api/accounting-plus/fixed-assets\"\n titleField=\"name\"\n formControlName=\"submittable_id\"\n ></app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Details</mat-label>\n <textarea\n matInput\n placeholder=\"Details\"\n formControlName=\"details\"\n ></textarea>\n </mat-form-field>\n <div class=\"d-flex justify-content-end align-items-center gap-2\">\n <button\n [disabled]=\"isSaving\"\n mat-flat-button\n type=\"button\"\n (click)=\"cancelled.emit()\"\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 <button\n *ngIf=\"checksheetSubmission?.id\"\n [disabled]=\"isSaving\"\n mat-raised-button\n (click)=\"submitChecksheet()\"\n type=\"button\"\n color=\"accent\"\n >\n Submit\n </button>\n </div>\n </div>\n</form>\n" }]
120
+ }], ctorParameters: () => [{ type: i1.FormValidatorService }, { type: i2.UntypedFormBuilder }, { type: i3.ChecksheetService }, { type: i1.AlertService }, { type: i4.MatDialog }], propDecorators: { submittableType: [{
121
+ type: Input
122
+ }], submittableId: [{
123
+ type: Input
124
+ }], cancelled: [{
125
+ type: Output
126
+ }], saved: [{
127
+ type: Output
128
+ }], checksheetSubmission: [{
129
+ type: Input
130
+ }] } });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXQvc3JjL2xpYi9jaGVja3NoZWV0L2NoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybS9jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBc0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUVMLGFBQWEsRUFDYiw4QkFBOEIsRUFFOUIsb0JBQW9CLEVBRXJCLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBVzNCLE1BQU0sT0FBTyxpQ0FDWCxTQUFRLDhCQUE4QjtJQWE1QjtJQUNBO0lBQ0E7SUFDQTtJQWJELGVBQWUsQ0FBNkI7SUFDNUMsYUFBYSxDQUFVO0lBQ3RCLFNBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNsRCxLQUFLLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDeEQsVUFBVSxDQUFXO0lBQ1osb0JBQW9CLENBQU07SUFDbkMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNFLG9CQUEwQyxFQUNsQyxFQUFzQixFQUN0QiwyQkFBOEMsRUFDOUMsWUFBMEIsRUFDMUIsTUFBaUI7UUFFekIsS0FBSyxDQUFDLG9CQUFvQixD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O1FBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDdkQsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQWU7Z0JBQ2pCLEtBQUssRUFBRSxtQkFBbUI7Z0JBQzFCLE9BQU8sRUFBRSxtSUFBbUk7YUFDN0k7WUFDRCxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNqRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLG1CQUFtQjtnQkFDbkIsSUFBSSxDQUFDLDJCQUEyQjtxQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7cUJBQ3JDLFNBQVMsQ0FBQztvQkFDVCxJQUFJLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTt3QkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLDJCQUEyQixFQUMzQixTQUFTLENBQ1YsQ0FBQzt3QkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ2xDLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0E1R1UsaUNBQWlDOzRGQUFqQyxpQ0FBaUMsZ1JDcEI5QywyakZBMkZBOzs0RkR2RWEsaUNBQWlDO2tCQUw3QyxTQUFTOytCQUNFLGdDQUFnQzs2TUFRakMsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUVFLG9CQUFvQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICBEYXRlVmFsaWRhdG9yLFxuICBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2UsXG4gIEFsZXJ0U2VydmljZSxcbiAgQWN0aW9uUG9wdXBDb21wb25lbnQsXG4gIEFjdGlvblBvcHVwXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IENoZWNrc2hlZXRTZXJ2aWNlIH0gZnJvbSAnLi4vY2hlY2tzaGVldC5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoZWNrc2hlZXRTdWJtaXR0YWJsZVR5cGUgfSBmcm9tICcuLi9jaGVja3NoZWV0LXN1Ym1pdHRhYmxlLnR5cGUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0U3VibWlzc2lvbkZvcm1Db21wb25lbnRcbiAgZXh0ZW5kcyBUZWNobGlmeUZvcm1Db21wb25lbnRJbnRlcmZhY2VcbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgQElucHV0KCkgc3VibWl0dGFibGVUeXBlITogQ2hlY2tzaGVldFN1Ym1pdHRhYmxlVHlwZTtcbiAgQElucHV0KCkgc3VibWl0dGFibGVJZCE6IG51bWJlcjtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHVwZGF0ZU1vZGUhOiBib29sZWFuO1xuICBASW5wdXQoKSBjaGVja3NoZWV0U3VibWlzc2lvbjogYW55O1xuICBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZvcm1WYWxpZGF0b3JTZXJ2aWNlOiBGb3JtVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjaGVja3NoZWV0U3VibWlzc2lvblNlcnZpY2U6IENoZWNrc2hlZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZ1xuICApIHtcbiAgICBzdXBlcihmb3JtVmFsaWRhdG9yU2VydmljZSk7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0ge1xuICAgICAgZGF0ZToge1xuICAgICAgICByZXF1aXJlZDogJ1RoZSBkYXRlIGZpZWxkIGlzIHJlcXVpcmVkLidcbiAgICAgIH0sXG4gICAgICBmb3JtYXRfaWQ6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdUaGUgY2hlY2tzaGVldCBmb3JtYXQgaXMgcmVxdWlyZWQuJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbJyddLFxuICAgICAgZGF0ZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIERhdGVWYWxpZGF0b3IoKV0pXSxcbiAgICAgIGZvcm1hdF9pZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHN1Ym1pdHRhYmxlX3R5cGU6IFsnZml4ZWQtYXNzZXQnXSxcbiAgICAgIHN1Ym1pdHRhYmxlX2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZGV0YWlsczogWycnXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gU2V0IHRoZSBzdWJtaXR0YWJsZSB0eXBlIGFuZCBpZCBhbmQgbWFrZSBpdCByZWFkb25seVxuICAgIGlmICh0aGlzLnN1Ym1pdHRhYmxlVHlwZSAmJiB0aGlzLnN1Ym1pdHRhYmxlSWQpIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgc3VibWl0dGFibGVfdHlwZTogdGhpcy5zdWJtaXR0YWJsZVR5cGUsXG4gICAgICAgIHN1Ym1pdHRhYmxlX2lkOiB0aGlzLnN1Ym1pdHRhYmxlSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTZXQgdGhlIENoZWNrc2hlZXQgdG8gZm9ybVxuICAgIGlmICh0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGUgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi50aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSh0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uPy5kYXRlKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoJ1BsZWFzZSBjaGVjayB0aGUgZm9ybSBmb3IgZXJyb3JzJywgJ2Vycm9yJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGE6IGFueSA9IHsgLi4udGhpcy5mb3JtLnZhbHVlIH07XG4gICAgY29uc3QgcmVxdWVzdDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy51cGRhdGVNb2RlXG4gICAgICA/IHRoaXMuY2hlY2tzaGVldFN1Ym1pc3Npb25TZXJ2aWNlLnVwZGF0ZShkYXRhKVxuICAgICAgOiB0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZS5zdG9yZShkYXRhKTtcblxuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIHJlcXVlc3Quc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlZC5lbWl0KHJlc3BvbnNlPy5pdGVtKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdWJtaXRDaGVja3NoZWV0KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uUG9wdXBDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNDAwcHgnLFxuICAgICAgZGF0YTogPEFjdGlvblBvcHVwPntcbiAgICAgICAgdGl0bGU6ICdTdWJtaXQgQ2hlY2tzaGVldCcsXG4gICAgICAgIG1lc3NhZ2U6IGBSZXZpZXcgdGhlIGNoZWNrc2hlZXQgY29tcGxldGVseSBiZWZvcmUgc3VibWl0dGluZywgeW91IGNhbm5vdCBhbHRlciBvbmNlIGl0IGlzIHN1Ym1pdHRlZC4gQXJlIHlvdSBzdXJlIHRvIHN1Ym1pdCB0aGUgQ2hlY2tzaGVldD9gXG4gICAgICB9LFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gQWN0aW9uIGNvbmZpcm1lZFxuICAgICAgICB0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZVxuICAgICAgICAgIC5zdWJtaXQodGhpcy5jaGVja3NoZWV0U3VibWlzc2lvbj8uaWQpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICAgICAgICAgICAnVGhlIENoZWNrc2hlZXQgc3VibWl0dGVkIScsXG4gICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuc2F2ZWQuZW1pdChyZXNwb25zZT8uaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic3VibWl0KClcIj5cbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwibWF0LXR5cG9ncmFwaHlcIj5cbiAgICA8aDM+Q2hlY2tzaGVldDwvaDM+XG5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkRhdGUgKE1NL0REL1lZWVkpXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIHJlcXVpcmVkXG4gICAgICAgIChmb2N1cyk9XCJwaWNrZXIub3BlbigpXCJcbiAgICAgIC8+XG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2RhdGUnKVwiXG4gICAgICAgID57eyBnZXRFcnJvck1lc3NhZ2UoJ2RhdGUnKSB9fVxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWw+Q2hlY2tzaGVldCBGb3JtYXQ8L21hdC1sYWJlbD5cbiAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRfaWRcIlxuICAgICAgICBhcGlVcmw9XCJhcGkvY2hlY2tzaGVldC1mb3JtYXRzP2lzX3B1Ymxpc2hlZD0xXCJcbiAgICAgICAgW2VuYWJsZVNlYXJjaF09XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdmb3JtYXRfaWQnKVwiXG4gICAgICAgID57eyBnZXRFcnJvck1lc3NhZ2UoJ2Zvcm1hdF9pZCcpIH19XG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD5DaGVja3NoZWV0IEZvcjwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic3VibWl0dGFibGVfdHlwZVwiPlxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImZpeGVkLWFzc2V0XCI+Rml4ZWQgQXNzZXQ8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgKm5nSWY9XCJmb3JtLmdldCgnc3VibWl0dGFibGVfdHlwZScpPy52YWx1ZSA9PT0gJ2ZpeGVkLWFzc2V0J1wiXG4gICAgPlxuICAgICAgPG1hdC1sYWJlbD5GaXhlZCBBc3NldDwvbWF0LWxhYmVsPlxuICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgIGFwaVVybD1cImFwaS9hY2NvdW50aW5nLXBsdXMvZml4ZWQtYXNzZXRzXCJcbiAgICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdWJtaXR0YWJsZV9pZFwiXG4gICAgICA+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbD5EZXRhaWxzPC9tYXQtbGFiZWw+XG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJEZXRhaWxzXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiXG4gICAgICA+PC90ZXh0YXJlYT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2aW5nXCJcbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiY2FuY2VsbGVkLmVtaXQoKVwiXG4gICAgICA+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgPlxuICAgICAgICBTYXZlXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJjaGVja3NoZWV0U3VibWlzc2lvbj8uaWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZpbmdcIlxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic3VibWl0Q2hlY2tzaGVldCgpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgID5cbiAgICAgICAgU3VibWl0XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
@@ -0,0 +1,58 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/dialog";
4
+ import * as i2 from "ngx-techlify-core";
5
+ import * as i3 from "@angular/router";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "@angular/material/icon";
8
+ import * as i6 from "@angular/material/tooltip";
9
+ import * as i7 from "../checksheet-submission-form/checksheet-submission-form.component";
10
+ export class ChecksheetSubmissionFormButtonComponent {
11
+ matDialog;
12
+ alertService;
13
+ router;
14
+ submittableType = 'fixed-asset';
15
+ submittableId;
16
+ saved = new EventEmitter();
17
+ constructor(matDialog, alertService, router) {
18
+ this.matDialog = matDialog;
19
+ this.alertService = alertService;
20
+ this.router = router;
21
+ }
22
+ /**
23
+ * Open checksheet submission form.
24
+ *
25
+ * @param templateRef
26
+ */
27
+ openForm(templateRef) {
28
+ this.matDialog.open(templateRef, { width: '500px' });
29
+ }
30
+ /**
31
+ * Handle checksheet submission save event.
32
+ *
33
+ * @param checksheetSubmission
34
+ */
35
+ onSaved(checksheetSubmission) {
36
+ this.saved.emit(checksheetSubmission);
37
+ this.matDialog.closeAll();
38
+ this.alertService.addAlert('The checksheet submission is saved successfully!', 'success');
39
+ this.router.navigate([
40
+ 'fixed-assets/checksheets/checksheet-submissions',
41
+ checksheetSubmission?.id,
42
+ 'view'
43
+ ]);
44
+ }
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionFormButtonComponent, deps: [{ token: i1.MatDialog }, { token: i2.AlertService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
46
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetSubmissionFormButtonComponent, selector: "app-checksheet-submission-form-button", inputs: { submittableType: "submittableType", submittableId: "submittableId" }, outputs: { saved: "saved" }, ngImport: i0, template: "<span\n *ngIf=\"submittableId\"\n class=\"material-symbols-outlined text-secondary\"\n matTooltip=\"Add Checksheet Submission\"\n (click)=\"openForm(formTemplate)\"\n>\n assignment_turned_in\n</span>\n<mat-icon\n *ngIf=\"!submittableId\"\n class=\"cursor-pointer text-secondary\"\n (click)=\"openForm(formTemplate)\"\n>\n add\n</mat-icon>\n\n<ng-template #formTemplate>\n <app-checksheet-submission-form\n mat-dialog-content\n (cancelled)=\"matDialog.closeAll()\"\n (saved)=\"onSaved($event)\"\n [submittableType]=\"submittableType\"\n [submittableId]=\"submittableId\"\n ></app-checksheet-submission-form>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i7.ChecksheetSubmissionFormComponent, selector: "app-checksheet-submission-form", inputs: ["submittableType", "submittableId", "checksheetSubmission"], outputs: ["cancelled", "saved"] }] });
47
+ }
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionFormButtonComponent, decorators: [{
49
+ type: Component,
50
+ args: [{ selector: 'app-checksheet-submission-form-button', template: "<span\n *ngIf=\"submittableId\"\n class=\"material-symbols-outlined text-secondary\"\n matTooltip=\"Add Checksheet Submission\"\n (click)=\"openForm(formTemplate)\"\n>\n assignment_turned_in\n</span>\n<mat-icon\n *ngIf=\"!submittableId\"\n class=\"cursor-pointer text-secondary\"\n (click)=\"openForm(formTemplate)\"\n>\n add\n</mat-icon>\n\n<ng-template #formTemplate>\n <app-checksheet-submission-form\n mat-dialog-content\n (cancelled)=\"matDialog.closeAll()\"\n (saved)=\"onSaved($event)\"\n [submittableType]=\"submittableType\"\n [submittableId]=\"submittableId\"\n ></app-checksheet-submission-form>\n</ng-template>\n" }]
51
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.AlertService }, { type: i3.Router }], propDecorators: { submittableType: [{
52
+ type: Input
53
+ }], submittableId: [{
54
+ type: Input
55
+ }], saved: [{
56
+ type: Output
57
+ }] } });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybS1idXR0b24vY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybS1idXR0b24vY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0tYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVd2QixNQUFNLE9BQU8sdUNBQXVDO0lBTXpDO0lBQ0M7SUFDQTtJQVBELGVBQWUsR0FBOEIsYUFBYSxDQUFDO0lBQzNELGFBQWEsQ0FBVTtJQUN0QixLQUFLLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFFN0QsWUFDUyxTQUFvQixFQUNuQixZQUEwQixFQUMxQixNQUFjO1FBRmYsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNuQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSjs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFdBQTZCO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLG9CQUF5QjtRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLGtEQUFrRCxFQUNsRCxTQUFTLENBQ1YsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ25CLGlEQUFpRDtZQUNqRCxvQkFBb0IsRUFBRSxFQUFFO1lBQ3hCLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXRDVSx1Q0FBdUM7NEZBQXZDLHVDQUF1QywwTENqQnBELDRvQkF5QkE7OzRGRFJhLHVDQUF1QztrQkFMbkQsU0FBUzsrQkFDRSx1Q0FBdUM7OEhBS3hDLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENoZWNrc2hlZXRTdWJtaXR0YWJsZVR5cGUgfSBmcm9tICcuLi9jaGVja3NoZWV0LXN1Ym1pdHRhYmxlLnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm0tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrc2hlZXRTdWJtaXNzaW9uRm9ybUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHN1Ym1pdHRhYmxlVHlwZTogQ2hlY2tzaGVldFN1Ym1pdHRhYmxlVHlwZSA9ICdmaXhlZC1hc3NldCc7XG4gIEBJbnB1dCgpIHN1Ym1pdHRhYmxlSWQhOiBudW1iZXI7XG4gIEBPdXRwdXQoKSBzYXZlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge31cblxuICAvKipcbiAgICogT3BlbiBjaGVja3NoZWV0IHN1Ym1pc3Npb24gZm9ybS5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlUmVmXG4gICAqL1xuICBvcGVuRm9ybSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGVSZWYsIHsgd2lkdGg6ICc1MDBweCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNoZWNrc2hlZXQgc3VibWlzc2lvbiBzYXZlIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY2hlY2tzaGVldFN1Ym1pc3Npb25cbiAgICovXG4gIG9uU2F2ZWQoY2hlY2tzaGVldFN1Ym1pc3Npb246IGFueSkge1xuICAgIHRoaXMuc2F2ZWQuZW1pdChjaGVja3NoZWV0U3VibWlzc2lvbik7XG4gICAgdGhpcy5tYXREaWFsb2cuY2xvc2VBbGwoKTtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICdUaGUgY2hlY2tzaGVldCBzdWJtaXNzaW9uIGlzIHNhdmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgJ3N1Y2Nlc3MnXG4gICAgKTtcblxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcbiAgICAgICdmaXhlZC1hc3NldHMvY2hlY2tzaGVldHMvY2hlY2tzaGVldC1zdWJtaXNzaW9ucycsXG4gICAgICBjaGVja3NoZWV0U3VibWlzc2lvbj8uaWQsXG4gICAgICAndmlldydcbiAgICBdKTtcbiAgfVxufVxuIiwiPHNwYW5cbiAgKm5nSWY9XCJzdWJtaXR0YWJsZUlkXCJcbiAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHRleHQtc2Vjb25kYXJ5XCJcbiAgbWF0VG9vbHRpcD1cIkFkZCBDaGVja3NoZWV0IFN1Ym1pc3Npb25cIlxuICAoY2xpY2spPVwib3BlbkZvcm0oZm9ybVRlbXBsYXRlKVwiXG4+XG4gIGFzc2lnbm1lbnRfdHVybmVkX2luXG48L3NwYW4+XG48bWF0LWljb25cbiAgKm5nSWY9XCIhc3VibWl0dGFibGVJZFwiXG4gIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1zZWNvbmRhcnlcIlxuICAoY2xpY2spPVwib3BlbkZvcm0oZm9ybVRlbXBsYXRlKVwiXG4+XG4gIGFkZFxuPC9tYXQtaWNvbj5cblxuPG5nLXRlbXBsYXRlICNmb3JtVGVtcGxhdGU+XG4gIDxhcHAtY2hlY2tzaGVldC1zdWJtaXNzaW9uLWZvcm1cbiAgICBtYXQtZGlhbG9nLWNvbnRlbnRcbiAgICAoY2FuY2VsbGVkKT1cIm1hdERpYWxvZy5jbG9zZUFsbCgpXCJcbiAgICAoc2F2ZWQpPVwib25TYXZlZCgkZXZlbnQpXCJcbiAgICBbc3VibWl0dGFibGVUeXBlXT1cInN1Ym1pdHRhYmxlVHlwZVwiXG4gICAgW3N1Ym1pdHRhYmxlSWRdPVwic3VibWl0dGFibGVJZFwiXG4gID48L2FwcC1jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,107 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component } from '@angular/core';
3
+ import { TechlifyListingControllerInterface, Timeline } from 'ngx-techlify-core';
4
+ import { UntilDestroy } from '@ngneat/until-destroy';
5
+ import { debounceTime } from 'rxjs';
6
+ import moment from 'moment';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "ngx-techlify-core";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "../checksheet-submission.service";
11
+ import * as i4 from "@angular/common";
12
+ import * as i5 from "@angular/router";
13
+ import * as i6 from "@angular/flex-layout/flex";
14
+ import * as i7 from "@angular/material/card";
15
+ import * as i8 from "@angular/material/form-field";
16
+ import * as i9 from "@angular/material/icon";
17
+ import * as i10 from "@angular/material/progress-bar";
18
+ import * as i11 from "@angular/material/table";
19
+ import * as i12 from "ngx-permissions";
20
+ import * as i13 from "ngx-infinite-scroll";
21
+ import * as i14 from "../checksheet-submission-delete-button/checksheet-submission-delete-button.component";
22
+ import * as i15 from "../checksheet-submission-form-button/checksheet-submission-form-button.component";
23
+ import * as i16 from "../checksheet-submission-review-button/checksheet-submission-review-button.component";
24
+ let ChecksheetSubmissionListComponent = class ChecksheetSubmissionListComponent extends TechlifyListingControllerInterface {
25
+ alertService;
26
+ fb;
27
+ checksheetSubmissionService;
28
+ requestHelperService;
29
+ displayedColumns = [
30
+ 'index',
31
+ 'date',
32
+ 'format.title',
33
+ 'creator.name',
34
+ 'reviewer.name',
35
+ 'status.title',
36
+ 'actions'
37
+ ];
38
+ with = 'format,creator,reviewer,status';
39
+ constructor(alertService, fb, checksheetSubmissionService, requestHelperService) {
40
+ super();
41
+ this.alertService = alertService;
42
+ this.fb = fb;
43
+ this.checksheetSubmissionService = checksheetSubmissionService;
44
+ this.requestHelperService = requestHelperService;
45
+ this.createForm();
46
+ }
47
+ ngOnInit() {
48
+ this.loadData();
49
+ this.filterForm.valueChanges
50
+ .pipe(debounceTime(800))
51
+ .subscribe(() => this.reload());
52
+ }
53
+ createForm() {
54
+ this.filterForm = this.fb.group({
55
+ duration: [Timeline.ALL],
56
+ date_from: [''],
57
+ date_to: [''],
58
+ status_ids: [''],
59
+ creator_ids: [''],
60
+ reviewer_ids: [''],
61
+ format_ids: [''],
62
+ sort_by: ['created_at|DESC'],
63
+ with: [this.with]
64
+ });
65
+ }
66
+ loadData() {
67
+ this.isWorking = true;
68
+ const params = {
69
+ ...this.requestHelperService.convertToFormData(this.filterForm.value),
70
+ perPage: this.perPage,
71
+ page: this.page
72
+ };
73
+ this.checksheetSubmissionService.index(params).subscribe({
74
+ next: (response) => {
75
+ this.models = this.models.concat(response?.data);
76
+ this.lastPage = response?.last_page;
77
+ this.isWorking = false;
78
+ },
79
+ error: () => (this.isWorking = false)
80
+ });
81
+ }
82
+ onDurationChange(timelineValue) {
83
+ let { date_to, date_from } = timelineValue;
84
+ this.filterForm.patchValue({
85
+ date_from: date_from ? moment(date_from).format('YYYY-MM-DD') : '',
86
+ date_to: date_to ? moment(date_to).format('YYYY-MM-DD') : ''
87
+ });
88
+ }
89
+ /**
90
+ * Handle checksheet submission delete event.
91
+ */
92
+ onDeleted() {
93
+ this.alertService.addAlert('Checksheet submission deleted successfully!', 'success');
94
+ this.reload();
95
+ }
96
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionListComponent, deps: [{ token: i1.AlertService }, { token: i2.UntypedFormBuilder }, { token: i3.ChecksheetSubmissionService }, { token: i1.RequestHelperService }], target: i0.ɵɵFactoryTarget.Component });
97
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetSubmissionListComponent, selector: "app-checksheet-submission-list", usesInheritance: true, ngImport: i0, template: "<div class=\"d-flex justify-content-center align-items-center gap-3\">\n <h3 class=\"m-0 font-weight-bold\">Checksheet Submissions</h3>\n <app-checksheet-submission-form-button></app-checksheet-submission-form-button>\n</div>\n\n<mat-card class=\"mt-3\">\n <mat-card-content>\n <form fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" [formGroup]=\"filterForm\">\n <app-timeline-filter\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n appearance=\"fill\"\n ></app-timeline-filter>\n\n <mat-form-field>\n <mat-label>Status</mat-label>\n <app-searchable-selector\n formControlName=\"status_ids\"\n apiUrl=\"api/checksheet-submission-statuses\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngxPermissionsOnly=\"['user_read']\">\n <mat-label>Creator</mat-label>\n <app-searchable-selector\n formControlName=\"creator_ids\"\n apiUrl=\"api/users\"\n [enableSearch]=\"true\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngxPermissionsOnly=\"['user_read']\">\n <mat-label>Reviewer</mat-label>\n <app-searchable-selector\n formControlName=\"reviewer_ids\"\n apiUrl=\"api/users\"\n [enableSearch]=\"true\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet Format</mat-label>\n <app-searchable-selector\n formControlName=\"format_ids\"\n apiUrl=\"api/checksheet-formats?is_published=1\"\n [enableSearch]=\"true\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card\n class=\"p-0 mt-3\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n>\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n multiTemplateDataRows\n aria-describedby=\"Checksheet Submissions\"\n >\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\">\n {{ i + 1 }}\n </td>\n </ng-container>\n\n <!-- Checksheet Format Column -->\n <ng-container matColumnDef=\"format.title\">\n <th mat-header-cell *matHeaderCellDef>Checksheet Format</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.format?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator.name\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.creator?.name }}\n </td>\n </ng-container>\n\n <!-- Reviewer Column -->\n <ng-container matColumnDef=\"reviewer.name\">\n <th mat-header-cell *matHeaderCellDef>Reviewer</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.reviewer?.name }}\n </td>\n </ng-container>\n\n <!-- Status Column -->\n <ng-container matColumnDef=\"status.title\">\n <th mat-header-cell *matHeaderCellDef>Status</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.status?.title }}\n </td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef>Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.date | date }}\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element;\">\n <div class=\"d-flex gap-2\">\n <mat-icon\n [routerLink]=\"['../checksheet-submissions-view', element?.id]\"\n class=\"cursor-pointer\"\n >\n visibility\n </mat-icon>\n\n <mat-icon\n *ngIf=\"element.status_id === 1\"\n [routerLink]=\"[element?.id, 'view']\"\n class=\"cursor-pointer\"\n >\n edit\n </mat-icon>\n <app-checksheet-submission-review-button\n [submission]=\"element\"\n [requestParams]=\"{ with: this.with }\"\n (reviewed)=\"reload()\"\n ></app-checksheet-submission-review-button>\n <app-checksheet-submission-delete-button\n [checksheetSubmission]=\"element\"\n (deleted)=\"onDeleted()\"\n ></app-checksheet-submission-delete-button>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n</mat-card>\n", styles: [".scroll-container{max-height:800px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { 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: "component", type: i7.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7.MatCardContent, selector: "mat-card-content" }, { 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: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i12.NgxPermissionsDirective, selector: "[ngxPermissionsOnly],[ngxPermissionsExcept]", inputs: ["ngxPermissionsOnly", "ngxPermissionsOnlyThen", "ngxPermissionsOnlyElse", "ngxPermissionsExcept", "ngxPermissionsExceptElse", "ngxPermissionsExceptThen", "ngxPermissionsThen", "ngxPermissionsElse", "ngxPermissionsOnlyAuthorisedStrategy", "ngxPermissionsOnlyUnauthorisedStrategy", "ngxPermissionsExceptUnauthorisedStrategy", "ngxPermissionsExceptAuthorisedStrategy", "ngxPermissionsUnauthorisedStrategy", "ngxPermissionsAuthorisedStrategy"], outputs: ["permissionsAuthorized", "permissionsUnauthorized"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.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: i13.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i1.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: i1.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { kind: "component", type: i14.ChecksheetSubmissionDeleteButtonComponent, selector: "app-checksheet-submission-delete-button", inputs: ["checksheetSubmission"], outputs: ["deleted"] }, { kind: "component", type: i15.ChecksheetSubmissionFormButtonComponent, selector: "app-checksheet-submission-form-button", inputs: ["submittableType", "submittableId"], outputs: ["saved"] }, { kind: "component", type: i16.ChecksheetSubmissionReviewButtonComponent, selector: "app-checksheet-submission-review-button", inputs: ["submission", "viewType", "requestParams"], outputs: ["reviewed"] }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
98
+ };
99
+ ChecksheetSubmissionListComponent = __decorate([
100
+ UntilDestroy()
101
+ ], ChecksheetSubmissionListComponent);
102
+ export { ChecksheetSubmissionListComponent };
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionListComponent, decorators: [{
104
+ type: Component,
105
+ args: [{ selector: 'app-checksheet-submission-list', template: "<div class=\"d-flex justify-content-center align-items-center gap-3\">\n <h3 class=\"m-0 font-weight-bold\">Checksheet Submissions</h3>\n <app-checksheet-submission-form-button></app-checksheet-submission-form-button>\n</div>\n\n<mat-card class=\"mt-3\">\n <mat-card-content>\n <form fxLayout=\"row wrap\" fxLayoutGap=\"1rem\" [formGroup]=\"filterForm\">\n <app-timeline-filter\n formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\"\n [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"\n appearance=\"fill\"\n ></app-timeline-filter>\n\n <mat-form-field>\n <mat-label>Status</mat-label>\n <app-searchable-selector\n formControlName=\"status_ids\"\n apiUrl=\"api/checksheet-submission-statuses\"\n [enableSearch]=\"false\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngxPermissionsOnly=\"['user_read']\">\n <mat-label>Creator</mat-label>\n <app-searchable-selector\n formControlName=\"creator_ids\"\n apiUrl=\"api/users\"\n [enableSearch]=\"true\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field *ngxPermissionsOnly=\"['user_read']\">\n <mat-label>Reviewer</mat-label>\n <app-searchable-selector\n formControlName=\"reviewer_ids\"\n apiUrl=\"api/users\"\n [enableSearch]=\"true\"\n titleField=\"name\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Checksheet Format</mat-label>\n <app-searchable-selector\n formControlName=\"format_ids\"\n apiUrl=\"api/checksheet-formats?is_published=1\"\n [enableSearch]=\"true\"\n [multiple]=\"true\"\n >\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card\n class=\"p-0 mt-3\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n>\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n multiTemplateDataRows\n aria-describedby=\"Checksheet Submissions\"\n >\n <!-- Index Column -->\n <ng-container matColumnDef=\"index\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = dataIndex\">\n {{ i + 1 }}\n </td>\n </ng-container>\n\n <!-- Checksheet Format Column -->\n <ng-container matColumnDef=\"format.title\">\n <th mat-header-cell *matHeaderCellDef>Checksheet Format</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.format?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator.name\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.creator?.name }}\n </td>\n </ng-container>\n\n <!-- Reviewer Column -->\n <ng-container matColumnDef=\"reviewer.name\">\n <th mat-header-cell *matHeaderCellDef>Reviewer</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.reviewer?.name }}\n </td>\n </ng-container>\n\n <!-- Status Column -->\n <ng-container matColumnDef=\"status.title\">\n <th mat-header-cell *matHeaderCellDef>Status</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.status?.title }}\n </td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef>Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.date | date }}\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element;\">\n <div class=\"d-flex gap-2\">\n <mat-icon\n [routerLink]=\"['../checksheet-submissions-view', element?.id]\"\n class=\"cursor-pointer\"\n >\n visibility\n </mat-icon>\n\n <mat-icon\n *ngIf=\"element.status_id === 1\"\n [routerLink]=\"[element?.id, 'view']\"\n class=\"cursor-pointer\"\n >\n edit\n </mat-icon>\n <app-checksheet-submission-review-button\n [submission]=\"element\"\n [requestParams]=\"{ with: this.with }\"\n (reviewed)=\"reload()\"\n ></app-checksheet-submission-review-button>\n <app-checksheet-submission-delete-button\n [checksheetSubmission]=\"element\"\n (deleted)=\"onDeleted()\"\n ></app-checksheet-submission-delete-button>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <mat-progress-bar *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n</mat-card>\n", styles: [".scroll-container{max-height:800px;overflow-y:auto}\n"] }]
106
+ }], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.UntypedFormBuilder }, { type: i3.ChecksheetSubmissionService }, { type: i1.RequestHelperService }] });
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1zdWJtaXNzaW9uLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXQvc3JjL2xpYi9jaGVja3NoZWV0L2NoZWNrc2hlZXQtc3VibWlzc2lvbi1saXN0L2NoZWNrc2hlZXQtc3VibWlzc2lvbi1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tbGlzdC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBRUwsa0NBQWtDLEVBQ2xDLFFBQVEsRUFHVCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXJCLElBQU0saUNBQWlDLEdBQXZDLE1BQU0saUNBQ1gsU0FBUSxrQ0FBa0M7SUFlaEM7SUFDQTtJQUNBO0lBQ0E7SUFmVixnQkFBZ0IsR0FBVTtRQUN4QixPQUFPO1FBQ1AsTUFBTTtRQUNOLGNBQWM7UUFDZCxjQUFjO1FBQ2QsZUFBZTtRQUNmLGNBQWM7UUFDZCxTQUFTO0tBQ1YsQ0FBQztJQUNGLElBQUksR0FBVyxnQ0FBZ0MsQ0FBQztJQUVoRCxZQUNVLFlBQTBCLEVBQzFCLEVBQXNCLEVBQ3RCLDJCQUF3RCxFQUN4RCxvQkFBMEM7UUFFbEQsS0FBSyxFQUFFLENBQUM7UUFMQSxpQkFB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cEI5QyxpeEtBb0tBOztBRGhKYSxpQ0FBaUM7SUFON0MsWUFBWSxFQUFFO0dBTUYsaUNBQWlDLENBaUY3Qzs7NEZBakZZLGlDQUFpQztrQkFMN0MsU0FBUzsrQkFDRSxnQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgUmVxdWVzdEhlbHBlclNlcnZpY2UsXG4gIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UsXG4gIFRpbWVsaW5lLFxuICBUaW1lbGluZVZhbHVlLFxuICBBbGVydFNlcnZpY2Vcbn0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95IH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IENoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uL2NoZWNrc2hlZXQtc3VibWlzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jaGVja3NoZWV0LXN1Ym1pc3Npb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja3NoZWV0LXN1Ym1pc3Npb24tbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1saXN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tzaGVldFN1Ym1pc3Npb25MaXN0Q29tcG9uZW50XG4gIGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZVxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBhbnlbXSA9IFtcbiAgICAnaW5kZXgnLFxuICAgICdkYXRlJyxcbiAgICAnZm9ybWF0LnRpdGxlJyxcbiAgICAnY3JlYXRvci5uYW1lJyxcbiAgICAncmV2aWV3ZXIubmFtZScsXG4gICAgJ3N0YXR1cy50aXRsZScsXG4gICAgJ2FjdGlvbnMnXG4gIF07XG4gIHdpdGg6IHN0cmluZyA9ICdmb3JtYXQsY3JlYXRvcixyZXZpZXdlcixzdGF0dXMnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2hlY2tzaGVldFN1Ym1pc3Npb25TZXJ2aWNlOiBDaGVja3NoZWV0U3VibWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXF1ZXN0SGVscGVyU2VydmljZTogUmVxdWVzdEhlbHBlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoODAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWxvYWQoKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBkdXJhdGlvbjogW1RpbWVsaW5lLkFMTF0sXG4gICAgICBkYXRlX2Zyb206IFsnJ10sXG4gICAgICBkYXRlX3RvOiBbJyddLFxuICAgICAgc3RhdHVzX2lkczogWycnXSxcbiAgICAgIGNyZWF0b3JfaWRzOiBbJyddLFxuICAgICAgcmV2aWV3ZXJfaWRzOiBbJyddLFxuICAgICAgZm9ybWF0X2lkczogWycnXSxcbiAgICAgIHNvcnRfYnk6IFsnY3JlYXRlZF9hdHxERVNDJ10sXG4gICAgICB3aXRoOiBbdGhpcy53aXRoXVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZERhdGEoKSB7XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpLFxuICAgICAgcGVyUGFnZTogdGhpcy5wZXJQYWdlLFxuICAgICAgcGFnZTogdGhpcy5wYWdlXG4gICAgfTtcbiAgICB0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZS5pbmRleChwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1vZGVscyA9IHRoaXMubW9kZWxzLmNvbmNhdChyZXNwb25zZT8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXNwb25zZT8ubGFzdF9wYWdlO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc1dvcmtpbmcgPSBmYWxzZSlcbiAgICB9KTtcbiAgfVxuXG4gIG9uRHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBkYXRlX2Zyb206IGRhdGVfZnJvbSA/IG1vbWVudChkYXRlX2Zyb20pLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogJycsXG4gICAgICBkYXRlX3RvOiBkYXRlX3RvID8gbW9tZW50KGRhdGVfdG8pLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogJydcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2hlY2tzaGVldCBzdWJtaXNzaW9uIGRlbGV0ZSBldmVudC5cbiAgICovXG4gIG9uRGVsZXRlZCgpIHtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICdDaGVja3NoZWV0IHN1Ym1pc3Npb24gZGVsZXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICAgICdzdWNjZXNzJ1xuICAgICk7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICA8aDMgY2xhc3M9XCJtLTAgZm9udC13ZWlnaHQtYm9sZFwiPkNoZWNrc2hlZXQgU3VibWlzc2lvbnM8L2gzPlxuICA8YXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1mb3JtLWJ1dHRvbj48L2FwcC1jaGVja3NoZWV0LXN1Ym1pc3Npb24tZm9ybS1idXR0b24+XG48L2Rpdj5cblxuPG1hdC1jYXJkIGNsYXNzPVwibXQtM1wiPlxuICA8bWF0LWNhcmQtY29udGVudD5cbiAgICA8Zm9ybSBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXRHYXA9XCIxcmVtXCIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICA8YXBwLXRpbWVsaW5lLWZpbHRlclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25EdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgW2RhdGVGcm9tXT1cImZpbHRlckZvcm0udmFsdWU/LmRhdGVfZnJvbVwiXG4gICAgICAgIFtkYXRlVG9dPVwiZmlsdGVyRm9ybS52YWx1ZT8uZGF0ZV90b1wiXG4gICAgICAgIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgID48L2FwcC10aW1lbGluZS1maWx0ZXI+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbD5TdGF0dXM8L21hdC1sYWJlbD5cbiAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzX2lkc1wiXG4gICAgICAgICAgYXBpVXJsPVwiYXBpL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1zdGF0dXNlc1wiXG4gICAgICAgICAgW2VuYWJsZVNlYXJjaF09XCJmYWxzZVwiXG4gICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5neFBlcm1pc3Npb25zT25seT1cIlsndXNlcl9yZWFkJ11cIj5cbiAgICAgICAgPG1hdC1sYWJlbD5DcmVhdG9yPC9tYXQtbGFiZWw+XG4gICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNyZWF0b3JfaWRzXCJcbiAgICAgICAgICBhcGlVcmw9XCJhcGkvdXNlcnNcIlxuICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ3hQZXJtaXNzaW9uc09ubHk9XCJbJ3VzZXJfcmVhZCddXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+UmV2aWV3ZXI8L21hdC1sYWJlbD5cbiAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJfaWRzXCJcbiAgICAgICAgICBhcGlVcmw9XCJhcGkvdXNlcnNcIlxuICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgdGl0bGVGaWVsZD1cIm5hbWVcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPkNoZWNrc2hlZXQgRm9ybWF0PC9tYXQtbGFiZWw+XG4gICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZvcm1hdF9pZHNcIlxuICAgICAgICAgIGFwaVVybD1cImFwaS9jaGVja3NoZWV0LWZvcm1hdHM/aXNfcHVibGlzaGVkPTFcIlxuICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZm9ybT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cblxuPG1hdC1jYXJkXG4gIGNsYXNzPVwicC0wIG10LTNcIlxuICBpbmZpbml0ZVNjcm9sbFxuICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIlxuICAoc2Nyb2xsZWQpPVwib25TY3JvbGwoKVwiXG4gIFtmcm9tUm9vdF09XCJ0cnVlXCJcbj5cbiAgPHRhYmxlXG4gICAgbWF0LXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwibW9kZWxzXCJcbiAgICBjbGFzcz1cInctMTAwXCJcbiAgICBtdWx0aVRlbXBsYXRlRGF0YVJvd3NcbiAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiQ2hlY2tzaGVldCBTdWJtaXNzaW9uc1wiXG4gID5cbiAgICA8IS0tIEluZGV4IENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiM8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gZGF0YUluZGV4XCI+XG4gICAgICAgIHt7IGkgKyAxIH19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBDaGVja3NoZWV0IEZvcm1hdCBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJmb3JtYXQudGl0bGVcIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Q2hlY2tzaGVldCBGb3JtYXQ8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAge3sgZWxlbWVudD8uZm9ybWF0Py50aXRsZSB9fVxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gQ3JlYXRvciBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjcmVhdG9yLm5hbWVcIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Q3JlYXRvcjwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICB7eyBlbGVtZW50Py5jcmVhdG9yPy5uYW1lIH19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBSZXZpZXdlciBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXZpZXdlci5uYW1lXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlJldmlld2VyPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgIHt7IGVsZW1lbnQ/LnJldmlld2VyPy5uYW1lIH19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBTdGF0dXMgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RhdHVzLnRpdGxlXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlN0YXR1czwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICB7eyBlbGVtZW50Py5zdGF0dXM/LnRpdGxlIH19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBEYXRlIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRhdGVcIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGF0ZTwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICB7eyBlbGVtZW50LmRhdGUgfCBkYXRlIH19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+QWN0aW9uczwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycuLi9jaGVja3NoZWV0LXN1Ym1pc3Npb25zLXZpZXcnLCBlbGVtZW50Py5pZF1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgdmlzaWJpbGl0eVxuICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudC5zdGF0dXNfaWQgPT09IDFcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW2VsZW1lbnQ/LmlkLCAndmlldyddXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIGVkaXRcbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxhcHAtY2hlY2tzaGVldC1zdWJtaXNzaW9uLXJldmlldy1idXR0b25cbiAgICAgICAgICAgIFtzdWJtaXNzaW9uXT1cImVsZW1lbnRcIlxuICAgICAgICAgICAgW3JlcXVlc3RQYXJhbXNdPVwieyB3aXRoOiB0aGlzLndpdGggfVwiXG4gICAgICAgICAgICAocmV2aWV3ZWQpPVwicmVsb2FkKClcIlxuICAgICAgICAgID48L2FwcC1jaGVja3NoZWV0LXN1Ym1pc3Npb24tcmV2aWV3LWJ1dHRvbj5cbiAgICAgICAgICA8YXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1kZWxldGUtYnV0dG9uXG4gICAgICAgICAgICBbY2hlY2tzaGVldFN1Ym1pc3Npb25dPVwiZWxlbWVudFwiXG4gICAgICAgICAgICAoZGVsZXRlZCk9XCJvbkRlbGV0ZWQoKVwiXG4gICAgICAgICAgPjwvYXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1kZWxldGUtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gIDwvdGFibGU+XG4gIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNXb3JraW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG48L21hdC1jYXJkPlxuIl19
@@ -0,0 +1,68 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/dialog";
4
+ import * as i2 from "ngx-techlify-core";
5
+ import * as i3 from "../checksheet-submission.service";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "@angular/material/button";
8
+ import * as i6 from "@angular/material/icon";
9
+ import * as i7 from "@angular/material/tooltip";
10
+ export class ChecksheetSubmissionReviewButtonComponent {
11
+ matDialog;
12
+ credentialsService;
13
+ checksheetSubmissionService;
14
+ alertService;
15
+ submission;
16
+ viewType = 'icon';
17
+ requestParams;
18
+ reviewed = new EventEmitter();
19
+ user;
20
+ isWorking = false;
21
+ constructor(matDialog, credentialsService, checksheetSubmissionService, alertService) {
22
+ this.matDialog = matDialog;
23
+ this.credentialsService = credentialsService;
24
+ this.checksheetSubmissionService = checksheetSubmissionService;
25
+ this.alertService = alertService;
26
+ this.user = this.credentialsService.credentials?.user;
27
+ }
28
+ /**
29
+ * Show the review dialog.
30
+ *
31
+ * @param templateRef
32
+ */
33
+ openDialog(templateRef) {
34
+ this.matDialog.open(templateRef, { width: '400px' });
35
+ }
36
+ /**
37
+ * Review checksheet.
38
+ */
39
+ reviewChecksheet() {
40
+ this.isWorking = true;
41
+ this.checksheetSubmissionService
42
+ .review(this.submission?.id, this.requestParams)
43
+ .subscribe({
44
+ next: (response) => {
45
+ this.matDialog.closeAll();
46
+ this.isWorking = false;
47
+ this.reviewed.next(response?.item);
48
+ this.alertService.addAlert('The checksheet submission marked as reviewed.', 'success');
49
+ },
50
+ error: () => (this.isWorking = false)
51
+ });
52
+ }
53
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionReviewButtonComponent, deps: [{ token: i1.MatDialog }, { token: i2.CredentialsService }, { token: i3.ChecksheetSubmissionService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ChecksheetSubmissionReviewButtonComponent, selector: "app-checksheet-submission-review-button", inputs: { submission: "submission", viewType: "viewType", requestParams: "requestParams" }, outputs: { reviewed: "reviewed" }, ngImport: i0, template: "<ng-container\n *ngIf=\"submission?.status_id === 2 && submission?.creator_id !== user?.id\"\n>\n <button\n *ngIf=\"viewType === 'button'\"\n mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"openDialog(reviewTemplate)\"\n >\n Review\n </button>\n\n <mat-icon\n *ngIf=\"viewType === 'icon'\"\n class=\"cursor-pointer\"\n matTooltip=\"Review\"\n (click)=\"openDialog(reviewTemplate)\"\n >\n rate_review\n </mat-icon>\n</ng-container>\n\n<ng-template #reviewTemplate>\n <h3 mat-dialog-title>Review Checksheet Submission</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to mark the checksheet submission as Reviewed?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end align-items-center\">\n <button [disabled]=\"isWorking\" mat-flat-button mat-dialog-close>\n Cancel\n </button>\n <button\n [disabled]=\"isWorking\"\n mat-raised-button\n color=\"primary\"\n (click)=\"reviewChecksheet()\"\n >\n Review\n </button>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ChecksheetSubmissionReviewButtonComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'app-checksheet-submission-review-button', template: "<ng-container\n *ngIf=\"submission?.status_id === 2 && submission?.creator_id !== user?.id\"\n>\n <button\n *ngIf=\"viewType === 'button'\"\n mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"openDialog(reviewTemplate)\"\n >\n Review\n </button>\n\n <mat-icon\n *ngIf=\"viewType === 'icon'\"\n class=\"cursor-pointer\"\n matTooltip=\"Review\"\n (click)=\"openDialog(reviewTemplate)\"\n >\n rate_review\n </mat-icon>\n</ng-container>\n\n<ng-template #reviewTemplate>\n <h3 mat-dialog-title>Review Checksheet Submission</h3>\n <div mat-dialog-content>\n <p>Are you sure you want to mark the checksheet submission as Reviewed?</p>\n </div>\n <div mat-dialog-actions class=\"d-flex justify-content-end align-items-center\">\n <button [disabled]=\"isWorking\" mat-flat-button mat-dialog-close>\n Cancel\n </button>\n <button\n [disabled]=\"isWorking\"\n mat-raised-button\n color=\"primary\"\n (click)=\"reviewChecksheet()\"\n >\n Review\n </button>\n </div>\n</ng-template>\n" }]
59
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.CredentialsService }, { type: i3.ChecksheetSubmissionService }, { type: i2.AlertService }], propDecorators: { submission: [{
60
+ type: Input
61
+ }], viewType: [{
62
+ type: Input
63
+ }], requestParams: [{
64
+ type: Input
65
+ }], reviewed: [{
66
+ type: Output
67
+ }] } });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzaGVldC1zdWJtaXNzaW9uLXJldmlldy1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNoZWNrc2hlZXQvc3JjL2xpYi9jaGVja3NoZWV0L2NoZWNrc2hlZXQtc3VibWlzc2lvbi1yZXZpZXctYnV0dG9uL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1yZXZpZXctYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZWNobGlmeS1jaGVja3NoZWV0L3NyYy9saWIvY2hlY2tzaGVldC9jaGVja3NoZWV0LXN1Ym1pc3Npb24tcmV2aWV3LWJ1dHRvbi9jaGVja3NoZWV0LXN1Ym1pc3Npb24tcmV2aWV3LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFVdkIsTUFBTSxPQUFPLHlDQUF5QztJQVMxQztJQUNBO0lBQ0E7SUFDQTtJQVhELFVBQVUsQ0FBTTtJQUNoQixRQUFRLEdBQXNCLE1BQU0sQ0FBQztJQUNyQyxhQUFhLENBQW9CO0lBQ2hDLFFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNoRSxJQUFJLENBQU87SUFDWCxTQUFTLEdBQVksS0FBSyxDQUFDO0lBRTNCLFlBQ1UsU0FBb0IsRUFDcEIsa0JBQXNDLEVBQ3RDLDJCQUF3RCxFQUN4RCxZQUEwQjtRQUgxQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZ0NBQTJCLEdBQTNCLDJCQUEyQixDQUE2QjtRQUN4RCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUVsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLFdBQTZCO1FBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQywyQkFBMkI7YUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDL0MsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUN4QiwrQ0FBK0MsRUFDL0MsU0FBUyxDQUNWLENBQUM7WUFDSixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDdEMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0E3Q1UseUNBQXlDOzRGQUF6Qyx5Q0FBeUMsOE1DaEJ0RCw0akNBMENBOzs0RkQxQmEseUNBQXlDO2tCQUxyRCxTQUFTOytCQUNFLHlDQUF5QztvTEFLMUMsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ3JlZGVudGlhbHNTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uL2NoZWNrc2hlZXQtc3VibWlzc2lvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoZWNrc2hlZXQtc3VibWlzc2lvbi1yZXZpZXctYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrc2hlZXQtc3VibWlzc2lvbi1yZXZpZXctYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hlY2tzaGVldC1zdWJtaXNzaW9uLXJldmlldy1idXR0b24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja3NoZWV0U3VibWlzc2lvblJldmlld0J1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHN1Ym1pc3Npb246IGFueTtcbiAgQElucHV0KCkgdmlld1R5cGU6ICdpY29uJyB8ICdidXR0b24nID0gJ2ljb24nO1xuICBASW5wdXQoKSByZXF1ZXN0UGFyYW1zITogeyB3aXRoOiBzdHJpbmcgfTtcbiAgQE91dHB1dCgpIHJldmlld2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICB1c2VyOiBVc2VyO1xuICBpc1dvcmtpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgY3JlZGVudGlhbHNTZXJ2aWNlOiBDcmVkZW50aWFsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGVja3NoZWV0U3VibWlzc2lvblNlcnZpY2U6IENoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudXNlciA9IHRoaXMuY3JlZGVudGlhbHNTZXJ2aWNlLmNyZWRlbnRpYWxzPy51c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHJldmlldyBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZVJlZlxuICAgKi9cbiAgb3BlbkRpYWxvZyh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMubWF0RGlhbG9nLm9wZW4odGVtcGxhdGVSZWYsIHsgd2lkdGg6ICc0MDBweCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2aWV3IGNoZWNrc2hlZXQuXG4gICAqL1xuICByZXZpZXdDaGVja3NoZWV0KCkge1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNoZWNrc2hlZXRTdWJtaXNzaW9uU2VydmljZVxuICAgICAgLnJldmlldyh0aGlzLnN1Ym1pc3Npb24/LmlkLCB0aGlzLnJlcXVlc3RQYXJhbXMpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLm1hdERpYWxvZy5jbG9zZUFsbCgpO1xuICAgICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZXZpZXdlZC5uZXh0KHJlc3BvbnNlPy5pdGVtKTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcbiAgICAgICAgICAgICdUaGUgY2hlY2tzaGVldCBzdWJtaXNzaW9uIG1hcmtlZCBhcyByZXZpZXdlZC4nLFxuICAgICAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKVxuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJzdWJtaXNzaW9uPy5zdGF0dXNfaWQgPT09IDIgJiYgc3VibWlzc2lvbj8uY3JlYXRvcl9pZCAhPT0gdXNlcj8uaWRcIlxuPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJ2aWV3VHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwib3BlbkRpYWxvZyhyZXZpZXdUZW1wbGF0ZSlcIlxuICA+XG4gICAgUmV2aWV3XG4gIDwvYnV0dG9uPlxuXG4gIDxtYXQtaWNvblxuICAgICpuZ0lmPVwidmlld1R5cGUgPT09ICdpY29uJ1wiXG4gICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgbWF0VG9vbHRpcD1cIlJldmlld1wiXG4gICAgKGNsaWNrKT1cIm9wZW5EaWFsb2cocmV2aWV3VGVtcGxhdGUpXCJcbiAgPlxuICAgIHJhdGVfcmV2aWV3XG4gIDwvbWF0LWljb24+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNyZXZpZXdUZW1wbGF0ZT5cbiAgPGgzIG1hdC1kaWFsb2ctdGl0bGU+UmV2aWV3IENoZWNrc2hlZXQgU3VibWlzc2lvbjwvaDM+XG4gIDxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBtYXJrIHRoZSBjaGVja3NoZWV0IHN1Ym1pc3Npb24gYXMgUmV2aWV3ZWQ/PC9wPlxuICA8L2Rpdj5cbiAgPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnMgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtZmxhdC1idXR0b24gbWF0LWRpYWxvZy1jbG9zZT5cbiAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIlxuICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAoY2xpY2spPVwicmV2aWV3Q2hlY2tzaGVldCgpXCJcbiAgICA+XG4gICAgICBSZXZpZXdcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19