@arsedizioni/ars-utils 18.1.54 → 18.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/directives/autoFocusDirective.d.ts +2 -3
- package/core/directives/validators.d.ts +0 -8
- package/core/pipes/format.pipe.d.ts +0 -1
- package/core/pipes/replace.pipe.d.ts +0 -2
- package/core/pipes/safe-html.pipe.d.ts +1 -2
- package/core/pipes/safe-url.pipe.d.ts +1 -2
- package/esm2022/core/directives/autoFocusDirective.mjs +7 -7
- package/esm2022/core/directives/validators.mjs +9 -16
- package/esm2022/core/pipes/format.pipe.mjs +2 -3
- package/esm2022/core/pipes/replace.pipe.mjs +7 -7
- package/esm2022/core/pipes/safe-html.pipe.mjs +7 -7
- package/esm2022/core/pipes/safe-url.pipe.mjs +7 -7
- package/esm2022/core/system.mjs +2 -2
- package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
- package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +4 -4
- package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +18 -22
- package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +18 -19
- package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +60 -60
- package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +30 -28
- package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +8 -8
- package/esm2022/ui.oauth/public_api.mjs +2 -2
- package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +194 -0
- package/fesm2022/arsedizioni-ars-utils-core.mjs +29 -37
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +122 -120
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +2 -2
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +36 -40
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/package.json +7 -7
- package/ui.application/ui/dialogs/select/select-dialog.component.d.ts +6 -6
- package/ui.application/ui/dialogs/select-file/select-file-dialog.component.d.ts +3 -6
- package/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.d.ts +4 -6
- package/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.d.ts +23 -27
- package/ui.application/ui/dialogs/send-to/send-to-dialog.component.d.ts +7 -7
- package/ui.application/ui/directives/resize-table-column.directive.d.ts +3 -4
- package/ui.oauth/public_api.d.ts +1 -1
- package/ui.oauth/ui/components/login/login-oauth.component.d.ts +38 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { TextFieldModule } from "@angular/cdk/text-field";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Output, inject } from "@angular/core";
|
|
3
|
+
import { FormsModule } from "@angular/forms";
|
|
4
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
4
5
|
import { MatCheckboxModule } from "@angular/material/checkbox";
|
|
5
|
-
import {
|
|
6
|
+
import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from "@angular/material/dialog";
|
|
7
|
+
import { MatFormFieldModule } from "@angular/material/form-field";
|
|
6
8
|
import { MatIconModule } from "@angular/material/icon";
|
|
7
|
-
import { MatButtonModule } from "@angular/material/button";
|
|
8
|
-
import { TextFieldModule } from "@angular/cdk/text-field";
|
|
9
9
|
import { MatInputModule } from "@angular/material/input";
|
|
10
|
-
import {
|
|
10
|
+
import { MatTooltipModule } from "@angular/material/tooltip";
|
|
11
|
+
import { EmailsValidatorDirective, SystemUtils } from '@arsedizioni/ars-utils/core';
|
|
11
12
|
import { FlexModule } from "@ngbracket/ngx-layout/flex";
|
|
12
|
-
import { FormsModule } from "@angular/forms";
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "@angular/forms";
|
|
15
15
|
import * as i2 from "@ngbracket/ngx-layout/flex";
|
|
@@ -21,25 +21,30 @@ import * as i7 from "@angular/material/icon";
|
|
|
21
21
|
import * as i8 from "@angular/material/tooltip";
|
|
22
22
|
import * as i9 from "@angular/material/checkbox";
|
|
23
23
|
export class SendToDialogComponent {
|
|
24
|
-
constructor(
|
|
24
|
+
constructor() {
|
|
25
25
|
this.done = new EventEmitter();
|
|
26
26
|
this.populate = new EventEmitter();
|
|
27
|
+
this.dialogData = inject(MAT_DIALOG_DATA);
|
|
27
28
|
this.item = {
|
|
28
29
|
recipients: null,
|
|
29
30
|
subject: null,
|
|
30
31
|
text: null,
|
|
31
32
|
options: null
|
|
32
33
|
};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (!this.
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
}
|
|
35
|
+
ngOnInit() {
|
|
36
|
+
this.dialogData = this.dialogData || { count: 0, appearance: 'fill' };
|
|
37
|
+
if (!this.dialogData.appearance) {
|
|
38
|
+
this.dialogData.appearance = 'fill';
|
|
39
|
+
}
|
|
40
|
+
if (!this.dialogData.count) {
|
|
41
|
+
this.dialogData.count = 0;
|
|
42
|
+
}
|
|
43
|
+
if (!this.dialogData.title && this.dialogData.count) {
|
|
44
|
+
this.dialogData.title =
|
|
45
|
+
this.dialogData.count === 1
|
|
41
46
|
? "Invia documento a..."
|
|
42
|
-
: "Invia " + this.
|
|
47
|
+
: "Invia " + this.dialogData.count + " documenti a...";
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
/**
|
|
@@ -47,7 +52,7 @@ export class SendToDialogComponent {
|
|
|
47
52
|
*/
|
|
48
53
|
ok() {
|
|
49
54
|
// Add selected options
|
|
50
|
-
this.item.options = this.
|
|
55
|
+
this.item.options = this.dialogData.options;
|
|
51
56
|
this.done.emit(this.item);
|
|
52
57
|
}
|
|
53
58
|
/**
|
|
@@ -56,12 +61,12 @@ export class SendToDialogComponent {
|
|
|
56
61
|
populateRecipients() {
|
|
57
62
|
this.populate.emit(this.item);
|
|
58
63
|
}
|
|
59
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SendToDialogComponent, deps: [
|
|
60
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: SendToDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done", populate: "populate" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, ngImport: i0, template: "<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n<span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n}\r\n @if (!f.form.invalid) {\r\n<span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n}\r\n</div>\r\n<h2 mat-dialog-title>{{data.title}}</h2>\r\n<div mat-dialog-content>\r\n <p>{{data.info}}</p>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <mat-form-field [appearance]=\"data.appearance\">\r\n <mat-label >Destinatari</mat-label>\r\n <textarea matInput\r\n [(ngModel)]=\"item.recipients\" name=\"recipients\" maxlength=\"1024\" #recipients=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" emails required></textarea>\r\n @if (item.recipients) {\r\n<button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix\r\n aria-label=\"Azzera\" (click)=\"item.recipients = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n}\r\n @if (data.allowPopulate) {\r\n<button type=\"button\" type=\"button\" tabindex=\"-1\" mat-icon-button\r\n matSuffix aria-label=\"Popola\" (click)=\"populateRecipients()\" matTooltip=\"Popola\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n}\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{recipients.value?.length || 0}}/1024 </mat-hint>\r\n @if (recipients.invalid) {\r\n<mat-error>Non valido.</mat-error>\r\n}\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"data.appearance\">\r\n <mat-label >Oggetto</mat-label>\r\n <input matInput\r\n name=\"subject\" [(ngModel)]=\"item.subject\" #subject=\"ngModel\" maxlength=\"200\" required />\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n <mat-hint align=\"end\">{{subject.value?.length || 0}}/200 </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"data.appearance\">\r\n <mat-label >Testo</mat-label>\r\n <textarea matInput \r\n [(ngModel)]=\"item.text\" name=\"text\" maxlength=\"1000\" #text=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" required></textarea>\r\n <mat-hint align=\"end\">{{text.value?.length || 0}}/1024 </mat-hint>\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n </mat-form-field>\r\n </div>\r\n @if (data.options) {\r\n<div>\r\n @for (o of data.options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n}\r\n </div>\r\n}\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill >\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" (click)=\"ok()\">INVIA</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">ANNULLA</button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":root{--ars-dialog-info-ok: #388E3C;--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-ok: #4CAF50;--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.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: i2.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: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i5.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: EmailsValidatorDirective, selector: "[emails]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] }); }
|
|
64
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SendToDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
65
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.3", type: SendToDialogComponent, isStandalone: true, selector: "ng-component", outputs: { done: "done", populate: "populate" }, host: { attributes: { "Bind": SystemUtils.generateUUID() } }, ngImport: i0, template: "<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n<span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n}\r\n @if (!f.form.invalid) {\r\n<span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n}\r\n</div>\r\n<h2 mat-dialog-title>{{dialogData.title}}</h2>\r\n<div mat-dialog-content>\r\n <p>{{dialogData.info}}</p>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Destinatari</mat-label>\r\n <textarea matInput\r\n [(ngModel)]=\"item.recipients\" name=\"recipients\" maxlength=\"1024\" #recipients=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" emails required></textarea>\r\n @if (item.recipients) {\r\n<button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix\r\n aria-label=\"Azzera\" (click)=\"item.recipients = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n}\r\n @if (dialogData.allowPopulate) {\r\n<button type=\"button\" type=\"button\" tabindex=\"-1\" mat-icon-button\r\n matSuffix aria-label=\"Popola\" (click)=\"populateRecipients()\" matTooltip=\"Popola\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n}\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{recipients.value?.length || 0}}/1024 </mat-hint>\r\n @if (recipients.invalid) {\r\n<mat-error>Non valido.</mat-error>\r\n}\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Oggetto</mat-label>\r\n <input matInput\r\n name=\"subject\" [(ngModel)]=\"item.subject\" #subject=\"ngModel\" maxlength=\"200\" required />\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n <mat-hint align=\"end\">{{subject.value?.length || 0}}/200 </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Testo</mat-label>\r\n <textarea matInput \r\n [(ngModel)]=\"item.text\" name=\"text\" maxlength=\"1000\" #text=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" required></textarea>\r\n <mat-hint align=\"end\">{{text.value?.length || 0}}/1024 </mat-hint>\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n </mat-form-field>\r\n </div>\r\n @if (dialogData.options) {\r\n<div>\r\n @for (o of dialogData.options; track $index; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n}\r\n </div>\r\n}\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill >\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" (click)=\"ok()\">INVIA</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">ANNULLA</button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":root{--ars-dialog-info-ok: #388E3C;--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-ok: #4CAF50;--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}\n"], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i2.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: i2.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: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i5.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: EmailsValidatorDirective, selector: "[emails]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
61
66
|
}
|
|
62
67
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SendToDialogComponent, decorators: [{
|
|
63
68
|
type: Component,
|
|
64
|
-
args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, imports: [
|
|
69
|
+
args: [{ host: { 'Bind': SystemUtils.generateUUID() }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
65
70
|
MatDialogTitle,
|
|
66
71
|
MatDialogContent,
|
|
67
72
|
FormsModule,
|
|
@@ -76,13 +81,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
|
|
|
76
81
|
MatCheckboxModule,
|
|
77
82
|
MatDialogActions,
|
|
78
83
|
MatDialogClose,
|
|
79
|
-
], template: "<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n<span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n}\r\n @if (!f.form.invalid) {\r\n<span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n}\r\n</div>\r\n<h2 mat-dialog-title>{{
|
|
80
|
-
}],
|
|
81
|
-
type: Inject,
|
|
82
|
-
args: [MAT_DIALOG_DATA]
|
|
83
|
-
}] }], propDecorators: { done: [{
|
|
84
|
+
], template: "<div class=\"dialog-info\">\r\n @if (f.form.invalid) {\r\n<span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n}\r\n @if (!f.form.invalid) {\r\n<span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n}\r\n</div>\r\n<h2 mat-dialog-title>{{dialogData.title}}</h2>\r\n<div mat-dialog-content>\r\n <p>{{dialogData.info}}</p>\r\n <form name=\"form\" #f=\"ngForm\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Destinatari</mat-label>\r\n <textarea matInput\r\n [(ngModel)]=\"item.recipients\" name=\"recipients\" maxlength=\"1024\" #recipients=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" emails required></textarea>\r\n @if (item.recipients) {\r\n<button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix\r\n aria-label=\"Azzera\" (click)=\"item.recipients = null;\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n}\r\n @if (dialogData.allowPopulate) {\r\n<button type=\"button\" type=\"button\" tabindex=\"-1\" mat-icon-button\r\n matSuffix aria-label=\"Popola\" (click)=\"populateRecipients()\" matTooltip=\"Popola\">\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n}\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{recipients.value?.length || 0}}/1024 </mat-hint>\r\n @if (recipients.invalid) {\r\n<mat-error>Non valido.</mat-error>\r\n}\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Oggetto</mat-label>\r\n <input matInput\r\n name=\"subject\" [(ngModel)]=\"item.subject\" #subject=\"ngModel\" maxlength=\"200\" required />\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n <mat-hint align=\"end\">{{subject.value?.length || 0}}/200 </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData.appearance\">\r\n <mat-label >Testo</mat-label>\r\n <textarea matInput \r\n [(ngModel)]=\"item.text\" name=\"text\" maxlength=\"1000\" #text=\"ngModel\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\" required></textarea>\r\n <mat-hint align=\"end\">{{text.value?.length || 0}}/1024 </mat-hint>\r\n @if (subject.invalid) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n </mat-form-field>\r\n </div>\r\n @if (dialogData.options) {\r\n<div>\r\n @for (o of dialogData.options; track $index; let i = $index) {\r\n <div>\r\n <mat-checkbox color=\"primary\" [(ngModel)]=\"o.value\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n}\r\n </div>\r\n}\r\n </div>\r\n </form>\r\n</div>\r\n<div mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill >\r\n <button mat-flat-button color=\"primary\" [disabled]=\"f.form.invalid\" (click)=\"ok()\">INVIA</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">ANNULLA</button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":root{--ars-dialog-info-ok: #388E3C;--ars-filterbox-filtered-background-color: #f9fbe7}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}b{font-weight:700}.large{font-size:large!important}.small{font-size:small!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (prefers-color-scheme: dark){:root{--ars-dialog-info-ok: #4CAF50;--ars-filterbox-filtered-background-color: #c6c7b8}.dialog-info-green,.dialog-info-ok{color:var(--ars-dialog-info-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b{font-weight:600}}\n"] }]
|
|
85
|
+
}], propDecorators: { done: [{
|
|
84
86
|
type: Output
|
|
85
87
|
}], populate: [{
|
|
86
88
|
type: Output
|
|
87
89
|
}] } });
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC10by1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uL3VpL2RpYWxvZ3Mvc2VuZC10by9zZW5kLXRvLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZW5kLXRvL3NlbmQtdG8tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQW1DN0MsTUFBTSxPQUFPLHFCQUFxQjtJQVloQyxZQUMyQixLQUF1QjtRQVp4QyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDOUMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRzVELFNBQUksR0FBdUI7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLElBQUk7WUFDYixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztRQUtBLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO29CQUNuQixDQUFDLENBQUMsc0JBQXNCO29CQUN4QixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxFQUFFO1FBQ0EsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OEdBeENVLHFCQUFxQixrQkFhdEIsZUFBZTtrR0FiZCxxQkFBcUIsK0hBdkJoQixXQUFXLENBQUMsWUFBWSxFQUFFLDhCQ3hCNUMsdzNHQStFQSw0MkNEakRJLGNBQWMsK0hBQ2QsZ0JBQWdCLHdHQUNoQixXQUFXLHU2Q0FDWCxVQUFVLHU2RUFDVixrQkFBa0IsZ21CQUNsQixjQUFjLHlrQkFDZCxlQUFlLCtCQUNmLHdCQUF3QixvREFDeEIsZUFBZSx3VUFDZixhQUFhLG1MQUNiLGdCQUFnQiw0VEFFaEIsaUJBQWlCLDhXQUNqQixnQkFBZ0IsNEhBQ2hCLGNBQWM7OzJGQUdMLHFCQUFxQjtrQkF4QmpDLFNBQVM7MkJBQ0YsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUFFLGNBR2hDLElBQUksV0FDUDt3QkFFUCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLHdCQUF3Qjt3QkFDeEIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFFaEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGNBQWM7cUJBQ2Y7OzBCQWVFLE1BQU07MkJBQUMsZUFBZTt5Q0FaZixJQUFJO3NCQUFiLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIE91dHB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nVGl0bGUsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBTZW5kVG9EaWFsb2dSZXN1bHQgfSBmcm9tIFwiLi4vLi4vZGVmaW5pdGlvbnNcIjtcclxuaW1wb3J0IHsgRW1haWxzVmFsaWRhdG9yRGlyZWN0aXZlLCBTeXN0ZW1VdGlscyB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY29yZSc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94XCI7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcFwiO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQgeyBUZXh0RmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3RleHQtZmllbGRcIjtcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXRcIjtcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gXCJAbmdicmFja2V0L25neC1sYXlvdXQvZmxleFwiO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZW5kVG9EaWFsb2dEYXRhIHtcclxuICBjb3VudDogbnVtYmVyO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIGluZm8/OiBzdHJpbmc7XHJcbiAgYXBwZWFyYW5jZT86IHN0cmluZztcclxuICBhbGxvd1BvcHVsYXRlPzogYm9vbGVhbjtcclxuICBvcHRpb25zPzogYW55XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGhvc3Q6IHsgJ0JpbmQnOiBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSB9LFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2VuZC10by1kaWFsb2cuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vc2VuZC10by1kaWFsb2cuY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBcclxuICAgIE1hdERpYWxvZ1RpdGxlLFxyXG4gICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgRmxleE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgVGV4dEZpZWxkTW9kdWxlLFxyXG4gICAgRW1haWxzVmFsaWRhdG9yRGlyZWN0aXZlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcclxuICAgIE1hdERpYWxvZ0Nsb3NlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZW5kVG9EaWFsb2dDb21wb25lbnQge1xyXG4gIEBPdXRwdXQoKSBkb25lID0gbmV3IEV2ZW50RW1pdHRlcjxTZW5kVG9EaWFsb2dSZXN1bHQ+KCk7XHJcbiAgQE91dHB1dCgpIHBvcHVsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTZW5kVG9EaWFsb2dSZXN1bHQ+KCk7XHJcblxyXG4gIGRhdGE6IFNlbmRUb0RpYWxvZ0RhdGE7XHJcbiAgaXRlbTogU2VuZFRvRGlhbG9nUmVzdWx0ID0ge1xyXG4gICAgcmVjaXBpZW50czogbnVsbCxcclxuICAgIHN1YmplY3Q6IG51bGwsXHJcbiAgICB0ZXh0OiBudWxsLFxyXG4gICAgb3B0aW9uczogbnVsbFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIF9kYXRhOiBTZW5kVG9EaWFsb2dEYXRhXHJcbiAgKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBfZGF0YSB8fCB7IGNvdW50OiAwLCBhcHBlYXJhbmNlOiAnZmlsbCcgfTtcclxuICAgIGlmICghdGhpcy5kYXRhLmFwcGVhcmFuY2UpIHRoaXMuZGF0YS5hcHBlYXJhbmNlID0gJ2ZpbGwnO1xyXG4gICAgaWYgKCF0aGlzLmRhdGEuY291bnQpIHRoaXMuZGF0YS5jb3VudCA9IDA7XHJcbiAgICBpZiAoIXRoaXMuZGF0YS50aXRsZSAmJiB0aGlzLmRhdGEuY291bnQpIHtcclxuICAgICAgdGhpcy5kYXRhLnRpdGxlID1cclxuICAgICAgICB0aGlzLmRhdGEuY291bnQgPT09IDFcclxuICAgICAgICAgID8gXCJJbnZpYSBkb2N1bWVudG8gYS4uLlwiXHJcbiAgICAgICAgICA6IFwiSW52aWEgXCIgKyB0aGlzLmRhdGEuY291bnQgKyBcIiBkb2N1bWVudGkgYS4uLlwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0XHJcbiAgICovXHJcbiAgb2soKSB7XHJcbiAgICAvLyBBZGQgc2VsZWN0ZWQgb3B0aW9uc1xyXG4gICAgdGhpcy5pdGVtLm9wdGlvbnMgPSB0aGlzLmRhdGEub3B0aW9ucztcclxuICAgIHRoaXMuZG9uZS5lbWl0KHRoaXMuaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3B1bGF0ZSByZWNpcGllbnRzXHJcbiAgICovXHJcbiAgcG9wdWxhdGVSZWNpcGllbnRzKCkge1xyXG4gICAgdGhpcy5wb3B1bGF0ZS5lbWl0KHRoaXMuaXRlbSk7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImRpYWxvZy1pbmZvXCI+XHJcbiAgQGlmIChmLmZvcm0uaW52YWxpZCkge1xyXG48c3BhbiBjbGFzcz1cImRpYWxvZy1pbmZvLWVycm9yXCI+Q2kgc29ubyBhbmNvcmEgZGVpIGNhbXBpIG9iYmxpZ2F0b3JpICgqKSBub24gY29tcGlsYXRpLjwvc3Bhbj5cclxufVxyXG4gIEBpZiAoIWYuZm9ybS5pbnZhbGlkKSB7XHJcbjxzcGFuIGNsYXNzPVwiZGlhbG9nLWluZm8tb2tcIj5UdXR0aSBpIGNhbXBpIG9iYmxpZ2F0b3JpICgqKSBzb25vIGNvbXBpbGF0aS48L3NwYW4+XHJcbn1cclxuPC9kaXY+XHJcbjxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS50aXRsZX19PC9oMj5cclxuPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPHA+e3tkYXRhLmluZm99fTwvcD5cclxuICA8Zm9ybSBuYW1lPVwiZm9ybVwiICNmPVwibmdGb3JtXCIgbm92YWxpZGF0ZT5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjMycHhcIiBmeEZpbGw+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiKlwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGaWxsPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAgW2FwcGVhcmFuY2VdPVwiZGF0YS5hcHBlYXJhbmNlXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsID5EZXN0aW5hdGFyaTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0XHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5yZWNpcGllbnRzXCIgbmFtZT1cInJlY2lwaWVudHNcIiBtYXhsZW5ndGg9XCIxMDI0XCIgI3JlY2lwaWVudHM9XCJuZ01vZGVsXCIgY2RrVGV4dGFyZWFBdXRvc2l6ZVxyXG4gICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIxXCIgY2RrQXV0b3NpemVNYXhSb3dzPVwiMTBcIiBlbWFpbHMgcmVxdWlyZWQ+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIEBpZiAoaXRlbS5yZWNpcGllbnRzKSB7XHJcbjxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXQtaWNvbi1idXR0b24gIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQXp6ZXJhXCIgKGNsaWNrKT1cIml0ZW0ucmVjaXBpZW50cyA9IG51bGw7XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxufVxyXG4gICAgICAgICAgQGlmIChkYXRhLmFsbG93UG9wdWxhdGUpIHtcclxuPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgIG1hdFN1ZmZpeCBhcmlhLWxhYmVsPVwiUG9wb2xhXCIgKGNsaWNrKT1cInBvcHVsYXRlUmVjaXBpZW50cygpXCIgbWF0VG9vbHRpcD1cIlBvcG9sYVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG59XHJcbiAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJzdGFydFwiPlNlcGFyYXRpIGRhIHB1bnRvIGUgdmlyZ29sYTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIj57e3JlY2lwaWVudHMudmFsdWU/Lmxlbmd0aCB8fCAwfX0vMTAyNCA8L21hdC1oaW50PlxyXG4gICAgICAgICAgQGlmIChyZWNpcGllbnRzLmludmFsaWQpIHtcclxuPG1hdC1lcnJvcj5Ob24gdmFsaWRvLjwvbWF0LWVycm9yPlxyXG59XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgIFthcHBlYXJhbmNlXT1cImRhdGEuYXBwZWFyYW5jZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbCA+T2dnZXR0bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgIG5hbWU9XCJzdWJqZWN0XCIgWyhuZ01vZGVsKV09XCJpdGVtLnN1YmplY3RcIiAjc3ViamVjdD1cIm5nTW9kZWxcIiBtYXhsZW5ndGg9XCIyMDBcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgQGlmIChzdWJqZWN0LmludmFsaWQpIHtcclxuPG1hdC1lcnJvcj5PYmJsaWdhdG9yaW8uPC9tYXQtZXJyb3I+XHJcbn1cclxuICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cImVuZFwiPnt7c3ViamVjdC52YWx1ZT8ubGVuZ3RoIHx8IDB9fS8yMDAgPC9tYXQtaGludD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJkYXRhLmFwcGVhcmFuY2VcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgPlRlc3RvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS50ZXh0XCIgbmFtZT1cInRleHRcIiBtYXhsZW5ndGg9XCIxMDAwXCIgI3RleHQ9XCJuZ01vZGVsXCIgY2RrVGV4dGFyZWFBdXRvc2l6ZVxyXG4gICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIxXCIgY2RrQXV0b3NpemVNYXhSb3dzPVwiMTBcIiByZXF1aXJlZD48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCI+e3t0ZXh0LnZhbHVlPy5sZW5ndGggfHwgMH19LzEwMjQgPC9tYXQtaGludD5cclxuICAgICAgICAgIEBpZiAoc3ViamVjdC5pbnZhbGlkKSB7XHJcbjxtYXQtZXJyb3I+T2JibGlnYXRvcmlvLjwvbWF0LWVycm9yPlxyXG59XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAoZGF0YS5vcHRpb25zKSB7XHJcbjxkaXY+XHJcbiAgICAgICAgQGZvciAobyBvZiBkYXRhLm9wdGlvbnM7IHRyYWNrIG87IGxldCBpID0gJGluZGV4KSB7XHJcbiAgPGRpdj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggY29sb3I9XCJwcmltYXJ5XCIgWyhuZ01vZGVsKV09XCJvLnZhbHVlXCIgbmFtZT1cIm9wdF97e2l9fVwiPlxyXG4gICAgICAgICAgICB7e28uZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbn1cclxuICAgICAgPC9kaXY+XHJcbn1cclxuICAgIDwvZGl2PlxyXG4gIDwvZm9ybT5cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjEwcHhcIiBmeEZpbGw+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeEZpbGwgPlxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiZi5mb3JtLmludmFsaWRcIiAoY2xpY2spPVwib2soKVwiPklOVklBPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+QU5OVUxMQTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC10by1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uL3VpL2RpYWxvZ3Mvc2VuZC10by9zZW5kLXRvLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlhbG9ncy9zZW5kLXRvL3NlbmQtdG8tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEYsT0FBTyxFQUFF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YXIvY2RrL3RleHQtZmllbGRcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE91dHB1dCwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dUaXRsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcFwiO1xyXG5pbXBvcnQgeyBFbWFpbHNWYWxpZGF0b3JEaXJlY3RpdmUsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgRmxleE1vZHVsZSB9IGZyb20gXCJAbmdicmFja2V0L25neC1sYXlvdXQvZmxleFwiO1xyXG5pbXBvcnQgeyBTZW5kVG9EaWFsb2dSZXN1bHQgfSBmcm9tIFwiLi4vLi4vZGVmaW5pdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFRvRGlhbG9nRGF0YSB7XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBpbmZvPzogc3RyaW5nO1xyXG4gIGFwcGVhcmFuY2U/OiBzdHJpbmc7XHJcbiAgYWxsb3dQb3B1bGF0ZT86IGJvb2xlYW47XHJcbiAgb3B0aW9ucz86IGFueVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBob3N0OiB7ICdCaW5kJzogU3lzdGVtVXRpbHMuZ2VuZXJhdGVVVUlEKCkgfSxcclxuICB0ZW1wbGF0ZVVybDogXCIuL3NlbmQtdG8tZGlhbG9nLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3NlbmQtdG8tZGlhbG9nLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0RGlhbG9nVGl0bGUsXHJcbiAgICBNYXREaWFsb2dDb250ZW50LFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBGbGV4TW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBUZXh0RmllbGRNb2R1bGUsXHJcbiAgICBFbWFpbHNWYWxpZGF0b3JEaXJlY3RpdmUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcclxuICAgIE1hdERpYWxvZ0Nsb3NlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZW5kVG9EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBPdXRwdXQoKSBkb25lID0gbmV3IEV2ZW50RW1pdHRlcjxTZW5kVG9EaWFsb2dSZXN1bHQ+KCk7XHJcbiAgQE91dHB1dCgpIHBvcHVsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxTZW5kVG9EaWFsb2dSZXN1bHQ+KCk7XHJcblxyXG4gIHByb3RlY3RlZCBkaWFsb2dEYXRhOiBTZW5kVG9EaWFsb2dEYXRhID0gaW5qZWN0KE1BVF9ESUFMT0dfREFUQSk7XHJcbiAgcHJvdGVjdGVkIGl0ZW06IFNlbmRUb0RpYWxvZ1Jlc3VsdCA9IHtcclxuICAgIHJlY2lwaWVudHM6IG51bGwsXHJcbiAgICBzdWJqZWN0OiBudWxsLFxyXG4gICAgdGV4dDogbnVsbCxcclxuICAgIG9wdGlvbnM6IG51bGxcclxuICB9O1xyXG5cclxuIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIHRoaXMuZGlhbG9nRGF0YSA9IHRoaXMuZGlhbG9nRGF0YSB8fCB7IGNvdW50OiAwLCBhcHBlYXJhbmNlOiAnZmlsbCcgfTtcclxuICBpZiAoIXRoaXMuZGlhbG9nRGF0YS5hcHBlYXJhbmNlKSB7XHJcbiAgICB0aGlzLmRpYWxvZ0RhdGEuYXBwZWFyYW5jZSA9ICdmaWxsJztcclxuICB9XHJcbiAgaWYgKCF0aGlzLmRpYWxvZ0RhdGEuY291bnQpIHtcclxuICAgIHRoaXMuZGlhbG9nRGF0YS5jb3VudCA9IDA7XHJcbiAgfVxyXG4gIGlmICghdGhpcy5kaWFsb2dEYXRhLnRpdGxlICYmIHRoaXMuZGlhbG9nRGF0YS5jb3VudCkge1xyXG4gICAgdGhpcy5kaWFsb2dEYXRhLnRpdGxlID1cclxuICAgICAgdGhpcy5kaWFsb2dEYXRhLmNvdW50ID09PSAxXHJcbiAgICAgICAgPyBcIkludmlhIGRvY3VtZW50byBhLi4uXCJcclxuICAgICAgICA6IFwiSW52aWEgXCIgKyB0aGlzLmRpYWxvZ0RhdGEuY291bnQgKyBcIiBkb2N1bWVudGkgYS4uLlwiO1xyXG4gIH1cclxuIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9rKCkge1xyXG4gICAgLy8gQWRkIHNlbGVjdGVkIG9wdGlvbnNcclxuICAgIHRoaXMuaXRlbS5vcHRpb25zID0gdGhpcy5kaWFsb2dEYXRhLm9wdGlvbnM7XHJcbiAgICB0aGlzLmRvbmUuZW1pdCh0aGlzLml0ZW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9wdWxhdGUgcmVjaXBpZW50c1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVJlY2lwaWVudHMoKSB7XHJcbiAgICB0aGlzLnBvcHVsYXRlLmVtaXQodGhpcy5pdGVtKTtcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nLWluZm9cIj5cclxuICBAaWYgKGYuZm9ybS5pbnZhbGlkKSB7XHJcbjxzcGFuIGNsYXNzPVwiZGlhbG9nLWluZm8tZXJyb3JcIj5DaSBzb25vIGFuY29yYSBkZWkgY2FtcGkgb2JibGlnYXRvcmkgKCopIG5vbiBjb21waWxhdGkuPC9zcGFuPlxyXG59XHJcbiAgQGlmICghZi5mb3JtLmludmFsaWQpIHtcclxuPHNwYW4gY2xhc3M9XCJkaWFsb2ctaW5mby1va1wiPlR1dHRpIGkgY2FtcGkgb2JibGlnYXRvcmkgKCopIHNvbm8gY29tcGlsYXRpLjwvc3Bhbj5cclxufVxyXG48L2Rpdj5cclxuPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3tkaWFsb2dEYXRhLnRpdGxlfX08L2gyPlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICA8cD57e2RpYWxvZ0RhdGEuaW5mb319PC9wPlxyXG4gIDxmb3JtIG5hbWU9XCJmb3JtXCIgI2Y9XCJuZ0Zvcm1cIiBub3ZhbGlkYXRlPlxyXG4gICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMzJweFwiIGZ4RmlsbD5cclxuICAgICAgPGRpdiBmeEZsZXg9XCIqXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGw+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICBbYXBwZWFyYW5jZV09XCJkaWFsb2dEYXRhLmFwcGVhcmFuY2VcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgPkRlc3RpbmF0YXJpPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXRcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnJlY2lwaWVudHNcIiBuYW1lPVwicmVjaXBpZW50c1wiIG1heGxlbmd0aD1cIjEwMjRcIiAjcmVjaXBpZW50cz1cIm5nTW9kZWxcIiBjZGtUZXh0YXJlYUF1dG9zaXplXHJcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjFcIiBjZGtBdXRvc2l6ZU1heFJvd3M9XCIxMFwiIGVtYWlscyByZXF1aXJlZD48L3RleHRhcmVhPlxyXG4gICAgICAgICAgQGlmIChpdGVtLnJlY2lwaWVudHMpIHtcclxuPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBenplcmFcIiAoY2xpY2spPVwiaXRlbS5yZWNpcGllbnRzID0gbnVsbDtcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG59XHJcbiAgICAgICAgICBAaWYgKGRpYWxvZ0RhdGEuYWxsb3dQb3B1bGF0ZSkge1xyXG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgbWF0U3VmZml4IGFyaWEtbGFiZWw9XCJQb3BvbGFcIiAoY2xpY2spPVwicG9wdWxhdGVSZWNpcGllbnRzKClcIiBtYXRUb29sdGlwPVwiUG9wb2xhXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbn1cclxuICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cInN0YXJ0XCI+U2VwYXJhdGkgZGEgcHVudG8gZSB2aXJnb2xhPC9tYXQtaGludD5cclxuICAgICAgICAgIDxtYXQtaGludCBhbGlnbj1cImVuZFwiPnt7cmVjaXBpZW50cy52YWx1ZT8ubGVuZ3RoIHx8IDB9fS8xMDI0IDwvbWF0LWhpbnQ+XHJcbiAgICAgICAgICBAaWYgKHJlY2lwaWVudHMuaW52YWxpZCkge1xyXG48bWF0LWVycm9yPk5vbiB2YWxpZG8uPC9tYXQtZXJyb3I+XHJcbn1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAgW2FwcGVhcmFuY2VdPVwiZGlhbG9nRGF0YS5hcHBlYXJhbmNlXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsID5PZ2dldHRvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgbmFtZT1cInN1YmplY3RcIiBbKG5nTW9kZWwpXT1cIml0ZW0uc3ViamVjdFwiICNzdWJqZWN0PVwibmdNb2RlbFwiIG1heGxlbmd0aD1cIjIwMFwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICBAaWYgKHN1YmplY3QuaW52YWxpZCkge1xyXG48bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxufVxyXG4gICAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCI+e3tzdWJqZWN0LnZhbHVlPy5sZW5ndGggfHwgMH19LzIwMCA8L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImRpYWxvZ0RhdGEuYXBwZWFyYW5jZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbCA+VGVzdG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnRleHRcIiBuYW1lPVwidGV4dFwiIG1heGxlbmd0aD1cIjEwMDBcIiAjdGV4dD1cIm5nTW9kZWxcIiBjZGtUZXh0YXJlYUF1dG9zaXplXHJcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjFcIiBjZGtBdXRvc2l6ZU1heFJvd3M9XCIxMFwiIHJlcXVpcmVkPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIj57e3RleHQudmFsdWU/Lmxlbmd0aCB8fCAwfX0vMTAyNCA8L21hdC1oaW50PlxyXG4gICAgICAgICAgQGlmIChzdWJqZWN0LmludmFsaWQpIHtcclxuPG1hdC1lcnJvcj5PYmJsaWdhdG9yaW8uPC9tYXQtZXJyb3I+XHJcbn1cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgQGlmIChkaWFsb2dEYXRhLm9wdGlvbnMpIHtcclxuPGRpdj5cclxuICAgICAgICBAZm9yIChvIG9mIGRpYWxvZ0RhdGEub3B0aW9uczsgdHJhY2sgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xyXG4gIDxkaXY+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNvbG9yPVwicHJpbWFyeVwiIFsobmdNb2RlbCldPVwiby52YWx1ZVwiIG5hbWU9XCJvcHRfe3tpfX1cIj5cclxuICAgICAgICAgICAge3tvLmRlc2NyaXB0aW9ufX1cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG59XHJcbiAgICAgIDwvZGl2PlxyXG59XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG48ZGl2IG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIxMHB4XCIgZnhGaWxsPlxyXG4gICAgPGRpdiBmeExheW91dEFsaWduPVwiZW5kXCIgZnhGaWxsID5cclxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImYuZm9ybS5pbnZhbGlkXCIgKGNsaWNrKT1cIm9rKClcIj5JTlZJQTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiPkFOTlVMTEE8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Directive, Input } from "@angular/core";
|
|
1
|
+
import { Directive, Renderer2, Input, ElementRef, inject } from "@angular/core";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
export class ResizeTableColumnDirective {
|
|
4
|
-
constructor(
|
|
5
|
-
this.renderer =
|
|
6
|
-
this.
|
|
4
|
+
constructor() {
|
|
5
|
+
this.renderer = inject(Renderer2);
|
|
6
|
+
this.elementRef = inject(ElementRef);
|
|
7
|
+
this.column = this.elementRef.nativeElement;
|
|
7
8
|
this.onMouseDown = (event) => {
|
|
8
9
|
this.pressed = true;
|
|
9
10
|
this.startX = event.pageX;
|
|
@@ -30,7 +31,6 @@ export class ResizeTableColumnDirective {
|
|
|
30
31
|
this.renderer.removeClass(this.table, "resizing");
|
|
31
32
|
}
|
|
32
33
|
};
|
|
33
|
-
this.column = this.el.nativeElement;
|
|
34
34
|
}
|
|
35
35
|
ngOnInit() {
|
|
36
36
|
if (this.resizable) {
|
|
@@ -45,7 +45,7 @@ export class ResizeTableColumnDirective {
|
|
|
45
45
|
this.renderer.listen("document", "mouseup", this.onMouseUp);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ResizeTableColumnDirective, deps: [
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ResizeTableColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
49
49
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.3", type: ResizeTableColumnDirective, isStandalone: true, selector: "[resizeColumn]", inputs: { resizable: ["resizeColumn", "resizable"], index: "index" }, ngImport: i0 }); }
|
|
50
50
|
}
|
|
51
51
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ResizeTableColumnDirective, decorators: [{
|
|
@@ -54,10 +54,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
|
|
|
54
54
|
selector: "[resizeColumn]",
|
|
55
55
|
standalone: true
|
|
56
56
|
}]
|
|
57
|
-
}],
|
|
57
|
+
}], propDecorators: { resizable: [{
|
|
58
58
|
type: Input,
|
|
59
59
|
args: ["resizeColumn"]
|
|
60
60
|
}], index: [{
|
|
61
61
|
type: Input
|
|
62
62
|
}] } });
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLXRhYmxlLWNvbHVtbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvZGlyZWN0aXZlcy9yZXNpemUtdGFibGUtY29sdW1uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNeEYsTUFBTSxPQUFPLDBCQUEwQjtJQUp2QztRQU9VLGFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUdoQyxXQUFNLEdBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBbUI1RCxnQkFBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzVDLENBQUMsQ0FBQztRQUVGLGdCQUFXLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDbEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBRS9DLDRCQUE0QjtnQkFDNUIsSUFBSSxLQUFLLEdBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFFekQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUN4RSxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ2pFLENBQUM7Z0JBRUYseUJBQXlCO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBRTNELHdCQUF3QjtnQkFDeEIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsY0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNmLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO0tBQ0g7SUFqREMsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQzs4R0F4QlUsMEJBQTBCO2tHQUExQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBSnRDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsVUFBVSxFQUFFLElBQUk7aUJBQ25COzhCQUV3QixTQUFTO3NCQUEvQixLQUFLO3VCQUFDLGNBQWM7Z0JBQ1osS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIFJlbmRlcmVyMiwgSW5wdXQsIEVsZW1lbnRSZWYsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiBcIltyZXNpemVDb2x1bW5dXCIsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZXNpemVUYWJsZUNvbHVtbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KFwicmVzaXplQ29sdW1uXCIpIHJlc2l6YWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBpbmRleDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcclxuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XHJcbiAgcHJpdmF0ZSBzdGFydFg6IG51bWJlcjtcclxuICBwcml2YXRlIHN0YXJ0V2lkdGg6IG51bWJlcjtcclxuICBwcml2YXRlIGNvbHVtbjogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICBwcml2YXRlIHRhYmxlOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHByZXNzZWQ6IGJvb2xlYW47XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnJlc2l6YWJsZSkge1xyXG4gICAgICBjb25zdCByb3cgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5jb2x1bW4pO1xyXG4gICAgICBjb25zdCB0aGVhZCA9IHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZShyb3cpO1xyXG4gICAgICB0aGlzLnRhYmxlID0gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoZWFkKTtcclxuICAgICAgY29uc3QgcmVzaXplciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MocmVzaXplciwgXCJyZXNpemUtaG9sZGVyXCIpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuY29sdW1uLCByZXNpemVyKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4ocmVzaXplciwgXCJtb3VzZWRvd25cIiwgdGhpcy5vbk1vdXNlRG93bik7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMudGFibGUsIFwibW91c2Vtb3ZlXCIsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihcImRvY3VtZW50XCIsIFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5wcmVzc2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQucGFnZVg7XHJcbiAgICB0aGlzLnN0YXJ0V2lkdGggPSB0aGlzLmNvbHVtbi5vZmZzZXRXaWR0aDtcclxuICB9O1xyXG5cclxuICBvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0gMzU7XHJcbiAgICBpZiAodGhpcy5wcmVzc2VkICYmIGV2ZW50LmJ1dHRvbnMpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRhYmxlLCBcInJlc2l6aW5nXCIpO1xyXG5cclxuICAgICAgLy8gQ2FsY3VsYXRlIHdpZHRoIG9mIGNvbHVtblxyXG4gICAgICBsZXQgd2lkdGggPVxyXG4gICAgICAgIHRoaXMuc3RhcnRXaWR0aCArIChldmVudC5wYWdlWCAtIHRoaXMuc3RhcnRYIC0gb2Zmc2V0KTtcclxuXHJcbiAgICAgIGNvbnN0IHRhYmxlQ2VsbHMgPSBBcnJheS5mcm9tKHRoaXMudGFibGUucXVlcnlTZWxlY3RvckFsbChcIi5tYXQtcm93XCIpKS5tYXAoXHJcbiAgICAgICAgKHJvdzogYW55KSA9PiByb3cucXVlcnlTZWxlY3RvckFsbChcIi5tYXQtY2VsbFwiKS5pdGVtKHRoaXMuaW5kZXgpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBTZXQgdGFibGUgaGVhZGVyIHdpZHRoXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb2x1bW4sIFwid2lkdGhcIiwgYCR7d2lkdGh9cHhgKTtcclxuXHJcbiAgICAgIC8vIFNldCB0YWJsZSBjZWxscyB3aWR0aFxyXG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGFibGVDZWxscykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY2VsbCwgXCJ3aWR0aFwiLCBgJHt3aWR0aH1weGApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMucHJlc3NlZCkge1xyXG4gICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLnRhYmxlLCBcInJlc2l6aW5nXCIpO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuIl19
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Public API Surface of ars-utils
|
|
3
3
|
*/
|
|
4
4
|
export * from './ui/ui.module';
|
|
5
|
-
export * from './ui/components/login/
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export * from './ui/components/login/login-oauth.component';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy91aS5vYXV0aC9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLDZDQUE2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFycy11dGlsc1xyXG4gKi9cclxuZXhwb3J0ICogZnJvbSAnLi91aS91aS5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL3VpL2NvbXBvbmVudHMvbG9naW4vbG9naW4tb2F1dGguY29tcG9uZW50JztcclxuXHJcblxyXG4iXX0=
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, NgZone, Output, inject, input, signal } from '@angular/core';
|
|
2
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
3
|
+
import { EnvironmentService } from '@arsedizioni/ars-utils/core';
|
|
4
|
+
import { MSAL_GUARD_CONFIG, MSAL_INSTANCE, MSAL_INTERCEPTOR_CONFIG, MsalBroadcastService, MsalService } from '@azure/msal-angular';
|
|
5
|
+
import { BrowserCacheLocation, EventType, InteractionType, PublicClientApplication } from '@azure/msal-browser';
|
|
6
|
+
import { Subject, filter, takeUntil } from 'rxjs';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/material/button";
|
|
9
|
+
export function MSALInstanceFactory(environment) {
|
|
10
|
+
return new PublicClientApplication({
|
|
11
|
+
auth: {
|
|
12
|
+
clientId: "6b2c080f-6ab0-4511-a9df-0bce69db5833",
|
|
13
|
+
authority: "https://login.microsoftonline.com/common",
|
|
14
|
+
redirectUri: environment.appUri, // This is your redir
|
|
15
|
+
},
|
|
16
|
+
cache: {
|
|
17
|
+
cacheLocation: BrowserCacheLocation.LocalStorage
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function MSALInterceptorConfigFactory(environment) {
|
|
22
|
+
return {
|
|
23
|
+
interactionType: InteractionType.Popup,
|
|
24
|
+
protectedResourceMap: new Map([
|
|
25
|
+
[environment.appServiceUri + '/login', ["api://6b2c080f-6ab0-4511-a9df-0bce69db5833/AngularSPAAuthScope"]],
|
|
26
|
+
["https://graph.microsoft.com/v2.0/me", ["user.read"]],
|
|
27
|
+
])
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function MSALGuardConfigFactory() {
|
|
31
|
+
return {
|
|
32
|
+
interactionType: InteractionType.Popup,
|
|
33
|
+
authRequest: {
|
|
34
|
+
scopes: ["user.read"]
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export class LoginOAuthComponent {
|
|
39
|
+
constructor() {
|
|
40
|
+
this.unsubscribe = new Subject();
|
|
41
|
+
this.msalBroadcastService = inject(MsalBroadcastService);
|
|
42
|
+
this.msaLService = inject(MsalService);
|
|
43
|
+
this.ngZone = inject(NgZone);
|
|
44
|
+
this.success = new EventEmitter();
|
|
45
|
+
this.appName = input();
|
|
46
|
+
this.autoInitialize = input(false);
|
|
47
|
+
this.oauthReady = signal(false);
|
|
48
|
+
this.oauthMicrosoftReady = signal(false);
|
|
49
|
+
this.oauthGoogleReady = signal(false);
|
|
50
|
+
}
|
|
51
|
+
ngOnInit() {
|
|
52
|
+
if (this.autoInitialize()) {
|
|
53
|
+
this.initialize();
|
|
54
|
+
}
|
|
55
|
+
this.msalBroadcastService.msalSubject$
|
|
56
|
+
.pipe(filter((msg) => msg.eventType === EventType.ACQUIRE_TOKEN_SUCCESS), takeUntil(this.unsubscribe))
|
|
57
|
+
.subscribe((r) => {
|
|
58
|
+
if (r) {
|
|
59
|
+
this.success.emit({ type: 1, token: r.payload.accessToken });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
ngOnDestroy() {
|
|
64
|
+
this.unsubscribe.next();
|
|
65
|
+
this.unsubscribe.complete();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Initialize open authentication
|
|
69
|
+
* Must be a public method
|
|
70
|
+
*/
|
|
71
|
+
initialize() {
|
|
72
|
+
if (this.oauthReady()) {
|
|
73
|
+
return; // Already done
|
|
74
|
+
}
|
|
75
|
+
this.oauthReady.set(true);
|
|
76
|
+
// Load MS stack
|
|
77
|
+
this.msaLService.initialize()
|
|
78
|
+
.pipe(takeUntil(this.unsubscribe))
|
|
79
|
+
.subscribe(() => {
|
|
80
|
+
this.oauthMicrosoftReady.set(true);
|
|
81
|
+
});
|
|
82
|
+
// Load google maps script after view init
|
|
83
|
+
const DSLScript = document.createElement('script');
|
|
84
|
+
DSLScript.src = 'https://accounts.google.com/gsi/client';
|
|
85
|
+
DSLScript.type = 'text/javascript';
|
|
86
|
+
document.body.appendChild(DSLScript);
|
|
87
|
+
document.body.removeChild(DSLScript);
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
window.onGoogleLibraryLoad = () => {
|
|
90
|
+
// initialize google account
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
google.accounts.id.initialize({
|
|
93
|
+
client_id: '71204983077-ag31h3bgt2udcbfr9nn84r9rni2k3snp.apps.googleusercontent.com',
|
|
94
|
+
cancel_on_tap_outside: true,
|
|
95
|
+
auto_select: false,
|
|
96
|
+
callback: (r) => {
|
|
97
|
+
this.ngZone.run(() => {
|
|
98
|
+
this.success.emit({ type: 2, token: r.credential });
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
googleButtonWrapper = createFakeGoogleWrapper();
|
|
103
|
+
this.oauthGoogleReady.set(true);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Perform login using MSAL
|
|
108
|
+
*/
|
|
109
|
+
loginMSAL() {
|
|
110
|
+
this.msaLService.loginPopup()
|
|
111
|
+
.subscribe({
|
|
112
|
+
next: (r) => {
|
|
113
|
+
this.msaLService.instance.setActiveAccount(r.account);
|
|
114
|
+
this.msaLService.acquireTokenSilent({
|
|
115
|
+
scopes: [
|
|
116
|
+
"api://6b2c080f-6ab0-4511-a9df-0bce69db5833/AngularSPAAuthScope"
|
|
117
|
+
],
|
|
118
|
+
account: r.account
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Perform login using Google
|
|
125
|
+
*/
|
|
126
|
+
loginGoogle() {
|
|
127
|
+
// Use wrapper click to prevent Illegal invocation exception
|
|
128
|
+
googleButtonWrapper.click();
|
|
129
|
+
}
|
|
130
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: LoginOAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
131
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.3", type: LoginOAuthComponent, isStandalone: true, selector: "login-oauth", inputs: { appName: { classPropertyName: "appName", publicName: "appName", isSignal: true, isRequired: false, transformFunction: null }, autoInitialize: { classPropertyName: "autoInitialize", publicName: "autoInitialize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { success: "success" }, providers: [{
|
|
132
|
+
provide: MSAL_INSTANCE,
|
|
133
|
+
deps: [EnvironmentService],
|
|
134
|
+
useFactory: MSALInstanceFactory
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
provide: MSAL_GUARD_CONFIG,
|
|
138
|
+
useFactory: MSALGuardConfigFactory
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
provide: MSAL_INTERCEPTOR_CONFIG,
|
|
142
|
+
deps: [EnvironmentService],
|
|
143
|
+
useFactory: MSALInterceptorConfigFactory
|
|
144
|
+
},
|
|
145
|
+
MsalService,
|
|
146
|
+
MsalBroadcastService], ngImport: i0, template: "<div class=\"login-oauth\">\r\n <div class=\"message\">\r\n <p>Questa sezione consente di accedere al servizio utilizzando un provider OAuth2.</p>\r\n <p>La email utilizzata deve essere collegata ad un utente valido di {{appName()}} e dei servizi ad esso connessi.</p>\r\n </div>\r\n <div class=\"button\">\r\n <button mat-flat-button color=\"primary\" (click)=\"loginMSAL()\" [attr.aria-label]=\"'Effettua accesso'\"\r\n [disabled]=\"!oauthMicrosoftReady()\" style=\"width: 100%;\">\r\n Accedi con Microsoft</button>\r\n </div>\r\n <div class=\"button\">\r\n <button mat-flat-button color=\"primary\" (click)=\"loginGoogle()\" style=\"width: 100%;\"\r\n [attr.aria-label]=\"'Effettua accesso'\" [disabled]=\"!oauthGoogleReady()\">\r\n Accedi con Google</button>\r\n </div>\r\n</div>", styles: [".login-oauth{text-align:center}.login-oauth .button{padding:10px 0;width:100%}.login-oauth .message{padding-bottom:10px;font-size:small}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
147
|
+
}
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: LoginOAuthComponent, decorators: [{
|
|
149
|
+
type: Component,
|
|
150
|
+
args: [{ selector: 'login-oauth', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{
|
|
151
|
+
provide: MSAL_INSTANCE,
|
|
152
|
+
deps: [EnvironmentService],
|
|
153
|
+
useFactory: MSALInstanceFactory
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
provide: MSAL_GUARD_CONFIG,
|
|
157
|
+
useFactory: MSALGuardConfigFactory
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
provide: MSAL_INTERCEPTOR_CONFIG,
|
|
161
|
+
deps: [EnvironmentService],
|
|
162
|
+
useFactory: MSALInterceptorConfigFactory
|
|
163
|
+
},
|
|
164
|
+
MsalService,
|
|
165
|
+
MsalBroadcastService], imports: [
|
|
166
|
+
MatButtonModule
|
|
167
|
+
], template: "<div class=\"login-oauth\">\r\n <div class=\"message\">\r\n <p>Questa sezione consente di accedere al servizio utilizzando un provider OAuth2.</p>\r\n <p>La email utilizzata deve essere collegata ad un utente valido di {{appName()}} e dei servizi ad esso connessi.</p>\r\n </div>\r\n <div class=\"button\">\r\n <button mat-flat-button color=\"primary\" (click)=\"loginMSAL()\" [attr.aria-label]=\"'Effettua accesso'\"\r\n [disabled]=\"!oauthMicrosoftReady()\" style=\"width: 100%;\">\r\n Accedi con Microsoft</button>\r\n </div>\r\n <div class=\"button\">\r\n <button mat-flat-button color=\"primary\" (click)=\"loginGoogle()\" style=\"width: 100%;\"\r\n [attr.aria-label]=\"'Effettua accesso'\" [disabled]=\"!oauthGoogleReady()\">\r\n Accedi con Google</button>\r\n </div>\r\n</div>", styles: [".login-oauth{text-align:center}.login-oauth .button{padding:10px 0;width:100%}.login-oauth .message{padding-bottom:10px;font-size:small}\n"] }]
|
|
168
|
+
}], propDecorators: { success: [{
|
|
169
|
+
type: Output
|
|
170
|
+
}] } });
|
|
171
|
+
const createFakeGoogleWrapper = () => {
|
|
172
|
+
const googleLoginWrapper = document.createElement("div");
|
|
173
|
+
// Or you can simple hide it in CSS rule for custom-google-button
|
|
174
|
+
googleLoginWrapper.style.display = "none";
|
|
175
|
+
googleLoginWrapper.classList.add("custom-google-button");
|
|
176
|
+
// Add the wrapper to body
|
|
177
|
+
document.body.appendChild(googleLoginWrapper);
|
|
178
|
+
// Use GSI javascript api to render the button inside our wrapper
|
|
179
|
+
// You can ignore the properties because this button will not appear
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
window.google.accounts.id.renderButton(googleLoginWrapper, {
|
|
182
|
+
type: "icon",
|
|
183
|
+
width: "200",
|
|
184
|
+
});
|
|
185
|
+
const googleLoginWrapperButton = googleLoginWrapper.querySelector("div[role=button]");
|
|
186
|
+
return {
|
|
187
|
+
click: () => {
|
|
188
|
+
// @ts-ignore
|
|
189
|
+
googleLoginWrapperButton.click();
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
var googleButtonWrapper = null;
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tb2F1dGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLm9hdXRoL3VpL2NvbXBvbmVudHMvbG9naW4vbG9naW4tb2F1dGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLm9hdXRoL3VpL2NvbXBvbmVudHMvbG9naW4vbG9naW4tb2F1dGguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQXdELFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pMLE9BQU8sRUFBd0Isb0JBQW9CLEVBQWdCLFNBQVMsRUFBNEIsZUFBZSxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFHbEQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFdBQStCO0lBQ2pFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztRQUNqQyxJQUFJLEVBQUU7WUFDSixRQUFRLEVBQUUsc0NBQXNDO1lBQ2hELFNBQVMsRUFBRSwwQ0FBMEM7WUFDckQsV0FBVyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUscUJBQXFCO1NBQ3ZEO1FB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dUI7NEJBQ2hDLElBQUksRUFBQyxDQUFDLGtCQUFrQixDQUFDOzRCQUN6QixVQUFVLEVBQUUsNEJBQTRCO3lCQUN6Qzt3QkFDQyxXQUFXO3dCQUNYLG9CQUFvQixDQUFDLFdBQ2Q7d0JBQ1AsZUFBZTtxQkFDaEI7OEJBUVMsT0FBTztzQkFBaEIsTUFBTTs7QUEwR1QsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUU7SUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELGlFQUFpRTtJQUNqRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUMxQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFekQsMEJBQTBCO0lBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFOUMsaUVBQWlFO0lBQ2pFLG9FQUFvRTtJQUNwRSxhQUFhO0lBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtRQUN6RCxJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUssRUFBRSxLQUFLO0tBQ2IsQ0FBQyxDQUFDO0lBRUgsTUFBTSx3QkFBd0IsR0FDNUIsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFdkQsT0FBTztRQUNMLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDVixhQUFhO1lBQ2Isd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFDRixJQUFJLG1CQUFtQixHQUFRLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgTVNBTF9HVUFSRF9DT05GSUcsIE1TQUxfSU5TVEFOQ0UsIE1TQUxfSU5URVJDRVBUT1JfQ09ORklHLCBNc2FsQnJvYWRjYXN0U2VydmljZSwgTXNhbEd1YXJkQ29uZmlndXJhdGlvbiwgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiwgTXNhbFNlcnZpY2UgfSBmcm9tICdAYXp1cmUvbXNhbC1hbmd1bGFyJztcclxuaW1wb3J0IHsgQXV0aGVudGljYXRpb25SZXN1bHQsIEJyb3dzZXJDYWNoZUxvY2F0aW9uLCBFdmVudE1lc3NhZ2UsIEV2ZW50VHlwZSwgSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLCBJbnRlcmFjdGlvblR5cGUsIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIH0gZnJvbSAnQGF6dXJlL21zYWwtYnJvd3Nlcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvZ2luT0F1dGhSZXN1bHQgfSBmcm9tICcuLi8uLi9kZWZpbml0aW9ucyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTVNBTEluc3RhbmNlRmFjdG9yeShlbnZpcm9ubWVudDogRW52aXJvbm1lbnRTZXJ2aWNlKTogSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIHtcclxuICByZXR1cm4gbmV3IFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uKHtcclxuICAgIGF1dGg6IHtcclxuICAgICAgY2xpZW50SWQ6IFwiNmIyYzA4MGYtNmFiMC00NTExLWE5ZGYtMGJjZTY5ZGI1ODMzXCIsXHJcbiAgICAgIGF1dGhvcml0eTogXCJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uXCIsXHJcbiAgICAgIHJlZGlyZWN0VXJpOiBlbnZpcm9ubWVudC5hcHBVcmksIC8vIFRoaXMgaXMgeW91ciByZWRpclxyXG4gICAgfSxcclxuICAgIGNhY2hlOiB7XHJcbiAgICAgIGNhY2hlTG9jYXRpb246IEJyb3dzZXJDYWNoZUxvY2F0aW9uLkxvY2FsU3RvcmFnZVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTVNBTEludGVyY2VwdG9yQ29uZmlnRmFjdG9yeShlbnZpcm9ubWVudDogRW52aXJvbm1lbnRTZXJ2aWNlKTogTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiB7XHJcbiAgXHJcbiAgcmV0dXJuIHtcclxuICAgIGludGVyYWN0aW9uVHlwZTogSW50ZXJhY3Rpb25UeXBlLlBvcHVwLFxyXG4gICAgcHJvdGVjdGVkUmVzb3VyY2VNYXA6IG5ldyBNYXAoW1xyXG4gICAgICBbZW52aXJvbm1lbnQuYXBwU2VydmljZVVyaSArICcvbG9naW4nLCBbXCJhcGk6Ly82YjJjMDgwZi02YWIwLTQ1MTEtYTlkZi0wYmNlNjlkYjU4MzMvQW5ndWxhclNQQUF1dGhTY29wZVwiXV0sXHJcbiAgICAgIFtcImh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92Mi4wL21lXCIsIFtcInVzZXIucmVhZFwiXV0sXHJcbiAgICBdKVxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBNU0FMR3VhcmRDb25maWdGYWN0b3J5KCk6IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xyXG4gIHJldHVybiB7XHJcbiAgICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCxcclxuICAgIGF1dGhSZXF1ZXN0OiB7XHJcbiAgICAgIHNjb3BlczogW1widXNlci5yZWFkXCJdXHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsb2dpbi1vYXV0aCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xvZ2luLW9hdXRoLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9sb2dpbi1vYXV0aC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTVNBTF9JTlNUQU5DRSxcclxuICAgIGRlcHM6W0Vudmlyb25tZW50U2VydmljZV0sXHJcbiAgICB1c2VGYWN0b3J5OiBNU0FMSW5zdGFuY2VGYWN0b3J5XHJcbiAgfSxcclxuICB7XHJcbiAgICBwcm92aWRlOiBNU0FMX0dVQVJEX0NPTkZJRyxcclxuICAgIHVzZUZhY3Rvcnk6IE1TQUxHdWFyZENvbmZpZ0ZhY3RvcnlcclxuICB9LFxyXG4gIHtcclxuICAgIHByb3ZpZGU6IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHLFxyXG4gICAgZGVwczpbRW52aXJvbm1lbnRTZXJ2aWNlXSxcclxuICAgIHVzZUZhY3Rvcnk6IE1TQUxJbnRlcmNlcHRvckNvbmZpZ0ZhY3RvcnlcclxuICB9LFxyXG4gICAgTXNhbFNlcnZpY2UsXHJcbiAgICBNc2FsQnJvYWRjYXN0U2VydmljZV0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0QnV0dG9uTW9kdWxlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9naW5PQXV0aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHVuc3Vic2NyaWJlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIG1zYWxCcm9hZGNhc3RTZXJ2aWNlID0gaW5qZWN0KE1zYWxCcm9hZGNhc3RTZXJ2aWNlKTtcclxuICBwcml2YXRlIG1zYUxTZXJ2aWNlID0gaW5qZWN0KE1zYWxTZXJ2aWNlKTtcclxuICBwcml2YXRlIG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xyXG5cclxuICBAT3V0cHV0KCkgc3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8TG9naW5PQXV0aFJlc3VsdD4oKTtcclxuXHJcbiAgYXBwTmFtZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KCk7XHJcbiAgYXV0b0luaXRpYWxpemUgPSBpbnB1dDxib29sZWFuIHwgbnVsbD4oZmFsc2UpO1xyXG5cclxuXHJcbiAgcHJvdGVjdGVkIG9hdXRoUmVhZHkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByb3RlY3RlZCBvYXV0aE1pY3Jvc29mdFJlYWR5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcm90ZWN0ZWQgb2F1dGhHb29nbGVSZWFkeSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLm1zYWxTdWJqZWN0JFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKG1zZzogRXZlbnRNZXNzYWdlKSA9PiBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9TVUNDRVNTKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyOiBhbnkpID0+IHsgICAgICAgIFxyXG4gICAgICAgIGlmIChyKSB7XHJcbiAgICAgICAgICB0aGlzLnN1Y2Nlc3MuZW1pdCh7IHR5cGU6IDEsIHRva2VuOiByLnBheWxvYWQuYWNjZXNzVG9rZW4gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUubmV4dCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBvcGVuIGF1dGhlbnRpY2F0aW9uICBcclxuICAgKiBNdXN0IGJlIGEgcHVibGljIG1ldGhvZCBcclxuICAgKi9cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgaWYgKHRoaXMub2F1dGhSZWFkeSgpKSB7XHJcbiAgICAgIHJldHVybjsgLy8gQWxyZWFkeSBkb25lXHJcbiAgICB9XHJcbiAgICB0aGlzLm9hdXRoUmVhZHkuc2V0KHRydWUpO1xyXG5cclxuICAgIC8vIExvYWQgTVMgc3RhY2tcclxuICAgIHRoaXMubXNhTFNlcnZpY2UuaW5pdGlhbGl6ZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vYXV0aE1pY3Jvc29mdFJlYWR5LnNldCh0cnVlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gTG9hZCBnb29nbGUgbWFwcyBzY3JpcHQgYWZ0ZXIgdmlldyBpbml0XHJcbiAgICBjb25zdCBEU0xTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgIERTTFNjcmlwdC5zcmMgPSAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL2dzaS9jbGllbnQnO1xyXG4gICAgRFNMU2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRFNMU2NyaXB0KTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRFNMU2NyaXB0KTtcclxuXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICB3aW5kb3cub25Hb29nbGVMaWJyYXJ5TG9hZCA9ICgpID0+IHtcclxuICAgICAgLy8gaW5pdGlhbGl6ZSBnb29nbGUgYWNjb3VudFxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGdvb2dsZS5hY2NvdW50cy5pZC5pbml0aWFsaXplKHtcclxuICAgICAgICBjbGllbnRfaWQ6ICc3MTIwNDk4MzA3Ny1hZzMxaDNiZ3QydWRjYmZyOW5uODRyOXJuaTJrM3NucC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbScsXHJcbiAgICAgICAgY2FuY2VsX29uX3RhcF9vdXRzaWRlOiB0cnVlLFxyXG4gICAgICAgIGF1dG9fc2VsZWN0OiBmYWxzZSxcclxuICAgICAgICBjYWxsYmFjazogKHI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdWNjZXNzLmVtaXQoeyB0eXBlOiAyLCB0b2tlbjogci5jcmVkZW50aWFsIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGdvb2dsZUJ1dHRvbldyYXBwZXIgPSBjcmVhdGVGYWtlR29vZ2xlV3JhcHBlcigpO1xyXG5cclxuICAgICAgdGhpcy5vYXV0aEdvb2dsZVJlYWR5LnNldCh0cnVlKTtcclxuICAgIH07XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBQZXJmb3JtIGxvZ2luIHVzaW5nIE1TQUxcclxuICAqL1xyXG4gIHByb3RlY3RlZCBsb2dpbk1TQUwoKSB7XHJcbiAgICB0aGlzLm1zYUxTZXJ2aWNlLmxvZ2luUG9wdXAoKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocjogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcclxuICAgICAgICAgIHRoaXMubXNhTFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChyLmFjY291bnQpO1xyXG4gICAgICAgICAgdGhpcy5tc2FMU2VydmljZS5hY3F1aXJlVG9rZW5TaWxlbnQoe1xyXG4gICAgICAgICAgICBzY29wZXM6IFtcclxuICAgICAgICAgICAgICBcImFwaTovLzZiMmMwODBmLTZhYjAtNDUxMS1hOWRmLTBiY2U2OWRiNTgzMy9Bbmd1bGFyU1BBQXV0aFNjb3BlXCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgYWNjb3VudDogci5hY2NvdW50XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuKiBQZXJmb3JtIGxvZ2luIHVzaW5nIEdvb2dsZVxyXG4qL1xyXG4gIHByb3RlY3RlZCBsb2dpbkdvb2dsZSgpIHtcclxuICAgIC8vIFVzZSB3cmFwcGVyIGNsaWNrIHRvIHByZXZlbnQgSWxsZWdhbCBpbnZvY2F0aW9uIGV4Y2VwdGlvblxyXG4gICAgZ29vZ2xlQnV0dG9uV3JhcHBlci5jbGljaygpO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY3JlYXRlRmFrZUdvb2dsZVdyYXBwZXIgPSAoKSA9PiB7XHJcbiAgY29uc3QgZ29vZ2xlTG9naW5XcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAvLyBPciB5b3UgY2FuIHNpbXBsZSBoaWRlIGl0IGluIENTUyBydWxlIGZvciBjdXN0b20tZ29vZ2xlLWJ1dHRvblxyXG4gIGdvb2dsZUxvZ2luV3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgZ29vZ2xlTG9naW5XcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJjdXN0b20tZ29vZ2xlLWJ1dHRvblwiKTtcclxuXHJcbiAgLy8gQWRkIHRoZSB3cmFwcGVyIHRvIGJvZHlcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGdvb2dsZUxvZ2luV3JhcHBlcik7XHJcblxyXG4gIC8vIFVzZSBHU0kgamF2YXNjcmlwdCBhcGkgdG8gcmVuZGVyIHRoZSBidXR0b24gaW5zaWRlIG91ciB3cmFwcGVyXHJcbiAgLy8gWW91IGNhbiBpZ25vcmUgdGhlIHByb3BlcnRpZXMgYmVjYXVzZSB0aGlzIGJ1dHRvbiB3aWxsIG5vdCBhcHBlYXJcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgd2luZG93Lmdvb2dsZS5hY2NvdW50cy5pZC5yZW5kZXJCdXR0b24oZ29vZ2xlTG9naW5XcmFwcGVyLCB7XHJcbiAgICB0eXBlOiBcImljb25cIixcclxuICAgIHdpZHRoOiBcIjIwMFwiLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBnb29nbGVMb2dpbldyYXBwZXJCdXR0b24gPVxyXG4gICAgZ29vZ2xlTG9naW5XcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoXCJkaXZbcm9sZT1idXR0b25dXCIpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgY2xpY2s6ICgpID0+IHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBnb29nbGVMb2dpbldyYXBwZXJCdXR0b24uY2xpY2soKTtcclxuICAgIH0sXHJcbiAgfTtcclxufTtcclxudmFyIGdvb2dsZUJ1dHRvbldyYXBwZXI6IGFueSA9IG51bGw7XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwibG9naW4tb2F1dGhcIj5cclxuICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxyXG4gICAgPHA+UXVlc3RhIHNlemlvbmUgY29uc2VudGUgZGkgYWNjZWRlcmUgYWwgc2Vydml6aW8gdXRpbGl6emFuZG8gdW4gcHJvdmlkZXIgT0F1dGgyLjwvcD5cclxuICAgIDxwPkxhIGVtYWlsIHV0aWxpenphdGEgZGV2ZSBlc3NlcmUgY29sbGVnYXRhIGFkIHVuIHV0ZW50ZSB2YWxpZG8gZGkge3thcHBOYW1lKCl9fSBlIGRlaSBzZXJ2aXppIGFkIGVzc28gY29ubmVzc2kuPC9wPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJidXR0b25cIj5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJsb2dpbk1TQUwoKVwiICBbYXR0ci5hcmlhLWxhYmVsXT1cIidFZmZldHR1YSBhY2Nlc3NvJ1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCIhb2F1dGhNaWNyb3NvZnRSZWFkeSgpXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgQWNjZWRpIGNvbiBNaWNyb3NvZnQ8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibG9naW5Hb29nbGUoKVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWZmZXR0dWEgYWNjZXNzbydcIiBbZGlzYWJsZWRdPVwiIW9hdXRoR29vZ2xlUmVhZHkoKVwiPlxyXG4gICAgICBBY2NlZGkgY29uIEdvb2dsZTwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|