@skyux/forms 5.9.4 → 6.0.0-beta.10
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/documentation.json +693 -693
- package/esm2020/index.mjs +43 -0
- package/esm2020/lib/modules/character-counter/character-counter-indicator.component.mjs +32 -0
- package/esm2020/lib/modules/character-counter/character-counter.directive.mjs +84 -0
- package/esm2020/lib/modules/character-counter/character-counter.module.mjs +46 -0
- package/esm2020/lib/modules/checkbox/checkbox-change.mjs +6 -0
- package/esm2020/lib/modules/checkbox/checkbox-label.component.mjs +14 -0
- package/esm2020/lib/modules/checkbox/checkbox-required-validator.directive.mjs +30 -0
- package/esm2020/lib/modules/checkbox/checkbox.component.mjs +237 -0
- package/esm2020/lib/modules/checkbox/checkbox.module.mjs +34 -0
- package/esm2020/lib/modules/file-attachment/file-attachment-label.component.mjs +14 -0
- package/esm2020/lib/modules/file-attachment/file-attachment.component.mjs +326 -0
- package/esm2020/lib/modules/file-attachment/file-attachment.service.mjs +94 -0
- package/esm2020/lib/modules/file-attachment/file-attachments.module.mjs +68 -0
- package/esm2020/lib/modules/file-attachment/file-drop.component.mjs +216 -0
- package/esm2020/lib/modules/file-attachment/file-item-error-type.mjs +2 -0
- package/esm2020/lib/modules/file-attachment/file-item.component.mjs +112 -0
- package/esm2020/lib/modules/file-attachment/file-item.mjs +2 -0
- package/esm2020/lib/modules/file-attachment/file-item.service.mjs +70 -0
- package/esm2020/lib/modules/file-attachment/file-link.mjs +2 -0
- package/esm2020/lib/modules/file-attachment/file-size.pipe.mjs +58 -0
- package/esm2020/lib/modules/file-attachment/types/file-attachment-change.mjs +2 -0
- package/esm2020/lib/modules/file-attachment/types/file-attachment-click.mjs +2 -0
- package/esm2020/lib/modules/file-attachment/types/file-drop-change.mjs +2 -0
- package/esm2020/lib/modules/input-box/input-box-adapter.service.mjs +35 -0
- package/esm2020/lib/modules/input-box/input-box-host.service.mjs +19 -0
- package/esm2020/lib/modules/input-box/input-box-populate-args.mjs +2 -0
- package/esm2020/lib/modules/input-box/input-box.component.mjs +89 -0
- package/esm2020/lib/modules/input-box/input-box.module.mjs +19 -0
- package/esm2020/lib/modules/radio/radio-group.component.mjs +220 -0
- package/esm2020/lib/modules/radio/radio-label.component.mjs +23 -0
- package/esm2020/lib/modules/radio/radio.component.mjs +254 -0
- package/esm2020/lib/modules/radio/radio.module.mjs +28 -0
- package/esm2020/lib/modules/radio/types/radio-change.mjs +2 -0
- package/esm2020/lib/modules/selection-box/selection-box-adapter.service.mjs +123 -0
- package/esm2020/lib/modules/selection-box/selection-box-description.component.mjs +14 -0
- package/esm2020/lib/modules/selection-box/selection-box-grid.component.mjs +128 -0
- package/esm2020/lib/modules/selection-box/selection-box-header.component.mjs +14 -0
- package/esm2020/lib/modules/selection-box/selection-box.component.mjs +101 -0
- package/esm2020/lib/modules/selection-box/selection-box.module.mjs +40 -0
- package/esm2020/lib/modules/selection-box/types/selection-box-grid-align-items-type.mjs +2 -0
- package/esm2020/lib/modules/selection-box/types/selection-box-grid-align-items.mjs +2 -0
- package/esm2020/lib/modules/shared/forms-utility.mjs +26 -0
- package/esm2020/lib/modules/shared/sky-forms-resources.module.mjs +89 -0
- package/esm2020/lib/modules/toggle-switch/toggle-switch-label.component.mjs +14 -0
- package/esm2020/lib/modules/toggle-switch/toggle-switch.component.mjs +151 -0
- package/esm2020/lib/modules/toggle-switch/toggle-switch.module.mjs +20 -0
- package/esm2020/lib/modules/toggle-switch/types/toggle-switch-change.mjs +2 -0
- package/esm2020/skyux-forms.mjs +5 -0
- package/esm2020/testing/checkbox-fixture.mjs +88 -0
- package/esm2020/testing/public-api.mjs +2 -0
- package/esm2020/testing/skyux-forms-testing.mjs +5 -0
- package/fesm2015/{skyux-forms-testing.js → skyux-forms-testing.mjs} +1 -1
- package/fesm2015/skyux-forms-testing.mjs.map +1 -0
- package/fesm2015/skyux-forms.mjs +2684 -0
- package/fesm2015/skyux-forms.mjs.map +1 -0
- package/{esm2015/testing/checkbox-fixture.js → fesm2020/skyux-forms-testing.mjs} +9 -2
- package/fesm2020/skyux-forms-testing.mjs.map +1 -0
- package/fesm2020/skyux-forms.mjs +2676 -0
- package/fesm2020/skyux-forms.mjs.map +1 -0
- package/package.json +39 -15
- package/testing/package.json +5 -5
- package/bundles/skyux-forms-testing.umd.js +0 -123
- package/bundles/skyux-forms.umd.js +0 -3430
- package/esm2015/index.js +0 -43
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/character-counter/character-counter-indicator.component.js +0 -37
- package/esm2015/lib/modules/character-counter/character-counter-indicator.component.js.map +0 -1
- package/esm2015/lib/modules/character-counter/character-counter.directive.js +0 -84
- package/esm2015/lib/modules/character-counter/character-counter.directive.js.map +0 -1
- package/esm2015/lib/modules/character-counter/character-counter.module.js +0 -46
- package/esm2015/lib/modules/character-counter/character-counter.module.js.map +0 -1
- package/esm2015/lib/modules/checkbox/checkbox-change.js +0 -6
- package/esm2015/lib/modules/checkbox/checkbox-change.js.map +0 -1
- package/esm2015/lib/modules/checkbox/checkbox-label.component.js +0 -17
- package/esm2015/lib/modules/checkbox/checkbox-label.component.js.map +0 -1
- package/esm2015/lib/modules/checkbox/checkbox-required-validator.directive.js +0 -32
- package/esm2015/lib/modules/checkbox/checkbox-required-validator.directive.js.map +0 -1
- package/esm2015/lib/modules/checkbox/checkbox.component.js +0 -241
- package/esm2015/lib/modules/checkbox/checkbox.component.js.map +0 -1
- package/esm2015/lib/modules/checkbox/checkbox.module.js +0 -34
- package/esm2015/lib/modules/checkbox/checkbox.module.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-attachment-label.component.js +0 -19
- package/esm2015/lib/modules/file-attachment/file-attachment-label.component.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-attachment.component.js +0 -335
- package/esm2015/lib/modules/file-attachment/file-attachment.component.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-attachment.service.js +0 -94
- package/esm2015/lib/modules/file-attachment/file-attachment.service.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-attachments.module.js +0 -68
- package/esm2015/lib/modules/file-attachment/file-attachments.module.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-drop.component.js +0 -222
- package/esm2015/lib/modules/file-attachment/file-drop.component.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-item-error-type.js +0 -2
- package/esm2015/lib/modules/file-attachment/file-item-error-type.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-item.component.js +0 -116
- package/esm2015/lib/modules/file-attachment/file-item.component.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-item.js +0 -2
- package/esm2015/lib/modules/file-attachment/file-item.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-item.service.js +0 -72
- package/esm2015/lib/modules/file-attachment/file-item.service.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-link.js +0 -2
- package/esm2015/lib/modules/file-attachment/file-link.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/file-size.pipe.js +0 -60
- package/esm2015/lib/modules/file-attachment/file-size.pipe.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/types/file-attachment-change.js +0 -2
- package/esm2015/lib/modules/file-attachment/types/file-attachment-change.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/types/file-attachment-click.js +0 -2
- package/esm2015/lib/modules/file-attachment/types/file-attachment-click.js.map +0 -1
- package/esm2015/lib/modules/file-attachment/types/file-drop-change.js +0 -2
- package/esm2015/lib/modules/file-attachment/types/file-drop-change.js.map +0 -1
- package/esm2015/lib/modules/input-box/input-box-adapter.service.js +0 -35
- package/esm2015/lib/modules/input-box/input-box-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/input-box/input-box-host.service.js +0 -19
- package/esm2015/lib/modules/input-box/input-box-host.service.js.map +0 -1
- package/esm2015/lib/modules/input-box/input-box-populate-args.js +0 -2
- package/esm2015/lib/modules/input-box/input-box-populate-args.js.map +0 -1
- package/esm2015/lib/modules/input-box/input-box.component.js +0 -97
- package/esm2015/lib/modules/input-box/input-box.component.js.map +0 -1
- package/esm2015/lib/modules/input-box/input-box.module.js +0 -19
- package/esm2015/lib/modules/input-box/input-box.module.js.map +0 -1
- package/esm2015/lib/modules/radio/radio-group.component.js +0 -223
- package/esm2015/lib/modules/radio/radio-group.component.js.map +0 -1
- package/esm2015/lib/modules/radio/radio-label.component.js +0 -26
- package/esm2015/lib/modules/radio/radio-label.component.js.map +0 -1
- package/esm2015/lib/modules/radio/radio.component.js +0 -262
- package/esm2015/lib/modules/radio/radio.component.js.map +0 -1
- package/esm2015/lib/modules/radio/radio.module.js +0 -28
- package/esm2015/lib/modules/radio/radio.module.js.map +0 -1
- package/esm2015/lib/modules/radio/types/radio-change.js +0 -2
- package/esm2015/lib/modules/radio/types/radio-change.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box-adapter.service.js +0 -124
- package/esm2015/lib/modules/selection-box/selection-box-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box-description.component.js +0 -17
- package/esm2015/lib/modules/selection-box/selection-box-description.component.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box-grid.component.js +0 -134
- package/esm2015/lib/modules/selection-box/selection-box-grid.component.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box-header.component.js +0 -17
- package/esm2015/lib/modules/selection-box/selection-box-header.component.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box.component.js +0 -107
- package/esm2015/lib/modules/selection-box/selection-box.component.js.map +0 -1
- package/esm2015/lib/modules/selection-box/selection-box.module.js +0 -40
- package/esm2015/lib/modules/selection-box/selection-box.module.js.map +0 -1
- package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items-type.js +0 -2
- package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items-type.js.map +0 -1
- package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items.js +0 -2
- package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items.js.map +0 -1
- package/esm2015/lib/modules/shared/forms-utility.js +0 -26
- package/esm2015/lib/modules/shared/forms-utility.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-forms-resources.module.js +0 -89
- package/esm2015/lib/modules/shared/sky-forms-resources.module.js.map +0 -1
- package/esm2015/lib/modules/toggle-switch/toggle-switch-label.component.js +0 -18
- package/esm2015/lib/modules/toggle-switch/toggle-switch-label.component.js.map +0 -1
- package/esm2015/lib/modules/toggle-switch/toggle-switch.component.js +0 -159
- package/esm2015/lib/modules/toggle-switch/toggle-switch.component.js.map +0 -1
- package/esm2015/lib/modules/toggle-switch/toggle-switch.module.js +0 -20
- package/esm2015/lib/modules/toggle-switch/toggle-switch.module.js.map +0 -1
- package/esm2015/lib/modules/toggle-switch/types/toggle-switch-change.js +0 -2
- package/esm2015/lib/modules/toggle-switch/types/toggle-switch-change.js.map +0 -1
- package/esm2015/skyux-forms.js +0 -5
- package/esm2015/skyux-forms.js.map +0 -1
- package/esm2015/testing/checkbox-fixture.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -2
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-forms-testing.js +0 -5
- package/esm2015/testing/skyux-forms-testing.js.map +0 -1
- package/fesm2015/skyux-forms-testing.js.map +0 -1
- package/fesm2015/skyux-forms.js +0 -2771
- package/fesm2015/skyux-forms.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { SkyIconModule } from '@skyux/indicators';
|
|
5
|
+
import { SkyCheckboxLabelComponent } from './checkbox-label.component';
|
|
6
|
+
import { SkyCheckboxRequiredValidatorDirective } from './checkbox-required-validator.directive';
|
|
7
|
+
import { SkyCheckboxComponent } from './checkbox.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class SkyCheckboxModule {
|
|
10
|
+
}
|
|
11
|
+
SkyCheckboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyCheckboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
SkyCheckboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyCheckboxModule, declarations: [SkyCheckboxComponent,
|
|
13
|
+
SkyCheckboxLabelComponent,
|
|
14
|
+
SkyCheckboxRequiredValidatorDirective], imports: [CommonModule, FormsModule, SkyIconModule], exports: [SkyCheckboxComponent,
|
|
15
|
+
SkyCheckboxLabelComponent,
|
|
16
|
+
SkyCheckboxRequiredValidatorDirective] });
|
|
17
|
+
SkyCheckboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyCheckboxModule, imports: [[CommonModule, FormsModule, SkyIconModule]] });
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyCheckboxModule, decorators: [{
|
|
19
|
+
type: NgModule,
|
|
20
|
+
args: [{
|
|
21
|
+
declarations: [
|
|
22
|
+
SkyCheckboxComponent,
|
|
23
|
+
SkyCheckboxLabelComponent,
|
|
24
|
+
SkyCheckboxRequiredValidatorDirective,
|
|
25
|
+
],
|
|
26
|
+
imports: [CommonModule, FormsModule, SkyIconModule],
|
|
27
|
+
exports: [
|
|
28
|
+
SkyCheckboxComponent,
|
|
29
|
+
SkyCheckboxLabelComponent,
|
|
30
|
+
SkyCheckboxRequiredValidatorDirective,
|
|
31
|
+
],
|
|
32
|
+
}]
|
|
33
|
+
}] });
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2Zvcm1zL3NyYy9saWIvbW9kdWxlcy9jaGVja2JveC9jaGVja2JveC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFlNUQsTUFBTSxPQUFPLGlCQUFpQjs7OEdBQWpCLGlCQUFpQjsrR0FBakIsaUJBQWlCLGlCQVgxQixvQkFBb0I7UUFDcEIseUJBQXlCO1FBQ3pCLHFDQUFxQyxhQUU3QixZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsYUFFaEQsb0JBQW9CO1FBQ3BCLHlCQUF5QjtRQUN6QixxQ0FBcUM7K0dBRzVCLGlCQUFpQixZQVBuQixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDOzJGQU94QyxpQkFBaUI7a0JBYjdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLG9CQUFvQjt3QkFDcEIseUJBQXlCO3dCQUN6QixxQ0FBcUM7cUJBQ3RDO29CQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDO29CQUNuRCxPQUFPLEVBQUU7d0JBQ1Asb0JBQW9CO3dCQUNwQix5QkFBeUI7d0JBQ3pCLHFDQUFxQztxQkFDdEM7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2t5SWNvbk1vZHVsZSB9IGZyb20gJ0Bza3l1eC9pbmRpY2F0b3JzJztcblxuaW1wb3J0IHsgU2t5Q2hlY2tib3hMYWJlbENvbXBvbmVudCB9IGZyb20gJy4vY2hlY2tib3gtbGFiZWwuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUNoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2NoZWNrYm94LXJlcXVpcmVkLXZhbGlkYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2t5Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuL2NoZWNrYm94LmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFNreUNoZWNrYm94Q29tcG9uZW50LFxuICAgIFNreUNoZWNrYm94TGFiZWxDb21wb25lbnQsXG4gICAgU2t5Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvckRpcmVjdGl2ZSxcbiAgXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFNreUljb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbXG4gICAgU2t5Q2hlY2tib3hDb21wb25lbnQsXG4gICAgU2t5Q2hlY2tib3hMYWJlbENvbXBvbmVudCxcbiAgICBTa3lDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lDaGVja2JveE1vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Displays a label above the file attachment element.
|
|
5
|
+
*/
|
|
6
|
+
export class SkyFileAttachmentLabelComponent {
|
|
7
|
+
}
|
|
8
|
+
SkyFileAttachmentLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9
|
+
SkyFileAttachmentLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyFileAttachmentLabelComponent, selector: "sky-file-attachment-label", ngImport: i0, template: "<span class=\"sky-control-label\">\n <ng-content></ng-content>\n</span>\n", styles: [":host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentLabelComponent, decorators: [{
|
|
11
|
+
type: Component,
|
|
12
|
+
args: [{ selector: 'sky-file-attachment-label', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"sky-control-label\">\n <ng-content></ng-content>\n</span>\n", styles: [":host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}\n"] }]
|
|
13
|
+
}] });
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LWxhYmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3Jtcy9zcmMvbGliL21vZHVsZXMvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC1sYWJlbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybXMvc3JjL2xpYi9tb2R1bGVzL2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQtbGFiZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFbkU7O0dBRUc7QUFPSCxNQUFNLE9BQU8sK0JBQStCOzs0SEFBL0IsK0JBQStCO2dIQUEvQiwrQkFBK0IsaUVDWDVDLDRFQUdBOzJGRFFhLCtCQUErQjtrQkFOM0MsU0FBUzsrQkFDRSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogRGlzcGxheXMgYSBsYWJlbCBhYm92ZSB0aGUgZmlsZSBhdHRhY2htZW50IGVsZW1lbnQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1maWxlLWF0dGFjaG1lbnQtbGFiZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1hdHRhY2htZW50LWxhYmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2ZpbGUtYXR0YWNobWVudC1sYWJlbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudCB7fVxuIiwiPHNwYW4gY2xhc3M9XCJza3ktY29udHJvbC1sYWJlbFwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3NwYW4+XG4iXX0=
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Optional, Output, QueryList, Self, ViewChild, } from '@angular/core';
|
|
2
|
+
import { NgControl } from '@angular/forms';
|
|
3
|
+
import { SkyThemeService } from '@skyux/theme';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { SkyFormsUtility } from '../shared/forms-utility';
|
|
7
|
+
import { SkyFileAttachmentLabelComponent } from './file-attachment-label.component';
|
|
8
|
+
import { SkyFileAttachmentService } from './file-attachment.service';
|
|
9
|
+
import { SkyFileItemService } from './file-item.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "./file-attachment.service";
|
|
12
|
+
import * as i2 from "./file-item.service";
|
|
13
|
+
import * as i3 from "@angular/forms";
|
|
14
|
+
import * as i4 from "@skyux/theme";
|
|
15
|
+
import * as i5 from "@skyux/indicators";
|
|
16
|
+
import * as i6 from "@angular/common";
|
|
17
|
+
import * as i7 from "@skyux/i18n";
|
|
18
|
+
let uniqueId = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Provides an element to attach a single local file.
|
|
21
|
+
*/
|
|
22
|
+
export class SkyFileAttachmentComponent {
|
|
23
|
+
constructor(changeDetector, fileAttachmentService, fileItemService, ngControl, themeSvc) {
|
|
24
|
+
this.changeDetector = changeDetector;
|
|
25
|
+
this.fileAttachmentService = fileAttachmentService;
|
|
26
|
+
this.fileItemService = fileItemService;
|
|
27
|
+
this.ngControl = ngControl;
|
|
28
|
+
this.themeSvc = themeSvc;
|
|
29
|
+
/**
|
|
30
|
+
* Specifies the maximum size in bytes for valid files.
|
|
31
|
+
*/
|
|
32
|
+
this.maxFileSize = 500000;
|
|
33
|
+
/**
|
|
34
|
+
* Specifies the minimum size in bytes for valid files.
|
|
35
|
+
*/
|
|
36
|
+
this.minFileSize = 0;
|
|
37
|
+
/**
|
|
38
|
+
* Fires when users add or remove files.
|
|
39
|
+
*/
|
|
40
|
+
this.fileChange = new EventEmitter();
|
|
41
|
+
/**
|
|
42
|
+
* Fires when users select the file name link. Make sure to bind the event.
|
|
43
|
+
* If you do not, the file name link will be a dead link.
|
|
44
|
+
*/
|
|
45
|
+
this.fileClick = new EventEmitter();
|
|
46
|
+
this.acceptedOver = false;
|
|
47
|
+
this.rejectedOver = false;
|
|
48
|
+
/**
|
|
49
|
+
* Indicates whether the input is required for form validation.
|
|
50
|
+
* When you set this property to `true`, the component adds `aria-required` and `required`
|
|
51
|
+
* attributes to the input element so that forms display an invalid state until the input element
|
|
52
|
+
* is complete.
|
|
53
|
+
*/
|
|
54
|
+
this.required = false;
|
|
55
|
+
this.fileAttachmentId = uniqueId++;
|
|
56
|
+
this.ngUnsubscribe = new Subject();
|
|
57
|
+
this._disabled = false;
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
59
|
+
this._onChange = (_) => { };
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
61
|
+
this._onTouched = () => { };
|
|
62
|
+
this.labelElementId = `sky-file-attachment-label-${this.fileAttachmentId}`;
|
|
63
|
+
this.fileDropDescriptionElementId = `sky-file-attachment-drop-description-${this.fileAttachmentId}`;
|
|
64
|
+
if (this.ngControl) {
|
|
65
|
+
this.ngControl.valueAccessor = this;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Indicates whether to disable the input.
|
|
70
|
+
* @default false
|
|
71
|
+
*/
|
|
72
|
+
set disabled(value) {
|
|
73
|
+
const newDisabledState = SkyFormsUtility.coerceBooleanProperty(value);
|
|
74
|
+
if (this._disabled !== newDisabledState) {
|
|
75
|
+
this._disabled = newDisabledState;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
get disabled() {
|
|
79
|
+
return this._disabled;
|
|
80
|
+
}
|
|
81
|
+
get hasLabelComponent() {
|
|
82
|
+
return this.labelComponents.length > 0;
|
|
83
|
+
}
|
|
84
|
+
set value(value) {
|
|
85
|
+
// The null check is needed to address a bug in Angular 4.
|
|
86
|
+
// writeValue is being called twice, first time with a phantom null value
|
|
87
|
+
// See: https://github.com/angular/angular/issues/14988
|
|
88
|
+
const isNewValue = value !== this.value && value !== null;
|
|
89
|
+
if (isNewValue) {
|
|
90
|
+
this._value = value;
|
|
91
|
+
this._onChange(value);
|
|
92
|
+
this.updateFileAttachmentButton();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
get value() {
|
|
96
|
+
return this._value;
|
|
97
|
+
}
|
|
98
|
+
ngOnInit() {
|
|
99
|
+
if (this.themeSvc) {
|
|
100
|
+
this.themeSvc.settingsChange
|
|
101
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
102
|
+
.subscribe((themeSettings) => {
|
|
103
|
+
this.currentThemeName = themeSettings.currentSettings.theme.name;
|
|
104
|
+
this.updateFileAttachmentButton();
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
ngAfterViewInit() {
|
|
109
|
+
// This is needed to address a bug in Angular 7.
|
|
110
|
+
// When a control value is set intially, its value is not represented on the view.
|
|
111
|
+
// See: https://github.com/angular/angular/issues/13792
|
|
112
|
+
// Of note is the parent check which allows us to determine if the form is reactive.
|
|
113
|
+
// Without this check there is a changed before checked error
|
|
114
|
+
/* istanbul ignore else */
|
|
115
|
+
if (this.ngControl) {
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
this.ngControl.control.setValue(this.value, {
|
|
118
|
+
emitEvent: false,
|
|
119
|
+
});
|
|
120
|
+
this.changeDetector.markForCheck();
|
|
121
|
+
});
|
|
122
|
+
// Backwards compatibility support for anyone still using Validators.Required.
|
|
123
|
+
this.required =
|
|
124
|
+
this.required || SkyFormsUtility.hasRequiredValidation(this.ngControl);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
ngAfterContentInit() {
|
|
128
|
+
// Handles updating classes when label changes
|
|
129
|
+
this.labelComponents.changes
|
|
130
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
131
|
+
.subscribe(() => {
|
|
132
|
+
this.changeDetector.detectChanges();
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
isImage() {
|
|
136
|
+
return this.fileItemService.isImage(this.value);
|
|
137
|
+
}
|
|
138
|
+
onDropClicked() {
|
|
139
|
+
this._onTouched();
|
|
140
|
+
this.inputEl.nativeElement.click();
|
|
141
|
+
}
|
|
142
|
+
fileChangeEvent(fileChangeEvent) {
|
|
143
|
+
this.handleFiles(fileChangeEvent.target.files);
|
|
144
|
+
}
|
|
145
|
+
fileDragEnter(dragEnterEvent) {
|
|
146
|
+
// Save this target to know when the drag event leaves
|
|
147
|
+
this.enterEventTarget = dragEnterEvent.target;
|
|
148
|
+
dragEnterEvent.stopPropagation();
|
|
149
|
+
dragEnterEvent.preventDefault();
|
|
150
|
+
}
|
|
151
|
+
fileDragOver(dragOverEvent) {
|
|
152
|
+
const transfer = dragOverEvent.dataTransfer;
|
|
153
|
+
dragOverEvent.stopPropagation();
|
|
154
|
+
dragOverEvent.preventDefault();
|
|
155
|
+
if (transfer) {
|
|
156
|
+
if (transfer.items) {
|
|
157
|
+
const files = transfer.items;
|
|
158
|
+
for (let index = 0; index < files.length; index++) {
|
|
159
|
+
const file = files[index];
|
|
160
|
+
if (file.type &&
|
|
161
|
+
this.fileAttachmentService.fileTypeRejected(file.type, this.acceptedTypes)) {
|
|
162
|
+
this.rejectedOver = true;
|
|
163
|
+
this.acceptedOver = false;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (files.length > 0 && !this.acceptedOver) {
|
|
168
|
+
this.rejectedOver = false;
|
|
169
|
+
this.acceptedOver = true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (transfer.files) {
|
|
173
|
+
// If the browser does not support DataTransfer.items,
|
|
174
|
+
// defer file-type checking to drop handler.
|
|
175
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
|
|
176
|
+
this.rejectedOver = false;
|
|
177
|
+
this.acceptedOver = true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
fileDrop(dropEvent) {
|
|
182
|
+
dropEvent.stopPropagation();
|
|
183
|
+
dropEvent.preventDefault();
|
|
184
|
+
this.enterEventTarget = undefined;
|
|
185
|
+
this.rejectedOver = false;
|
|
186
|
+
this.acceptedOver = false;
|
|
187
|
+
if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {
|
|
188
|
+
if (dropEvent.dataTransfer.files.length > 1) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (this.fileAttachmentService.hasDirectory(dropEvent.dataTransfer.files)) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
this.handleFiles(dropEvent.dataTransfer.files);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
fileDragLeave(dragLeaveEvent) {
|
|
198
|
+
if (this.enterEventTarget === dragLeaveEvent.target) {
|
|
199
|
+
this.rejectedOver = false;
|
|
200
|
+
this.acceptedOver = false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
deleteFileAttachment() {
|
|
204
|
+
this.value = undefined;
|
|
205
|
+
this.changeDetector.markForCheck();
|
|
206
|
+
this.emitFileChangeEvent(this.value);
|
|
207
|
+
}
|
|
208
|
+
getFileName(truncate = true) {
|
|
209
|
+
if (this.value) {
|
|
210
|
+
const dropName = this.fileItemService.isFile(this.value) && this.value.file.name
|
|
211
|
+
? this.value.file.name
|
|
212
|
+
: this.value.url;
|
|
213
|
+
if (truncate && dropName.length > 26) {
|
|
214
|
+
return dropName.slice(0, 26) + '...';
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
return dropName;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
ngOnDestroy() {
|
|
225
|
+
this.fileChange.complete();
|
|
226
|
+
this.ngUnsubscribe.next();
|
|
227
|
+
this.ngUnsubscribe.complete();
|
|
228
|
+
}
|
|
229
|
+
registerOnChange(fn) {
|
|
230
|
+
this._onChange = fn;
|
|
231
|
+
}
|
|
232
|
+
registerOnTouched(fn) {
|
|
233
|
+
this._onTouched = fn;
|
|
234
|
+
}
|
|
235
|
+
writeValue(value) {
|
|
236
|
+
this.value = value;
|
|
237
|
+
this.changeDetector.markForCheck();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* @internal
|
|
241
|
+
* Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.
|
|
242
|
+
* @param isDisabled Whether the control should be disabled.
|
|
243
|
+
*/
|
|
244
|
+
setDisabledState(isDisabled) {
|
|
245
|
+
this.disabled = isDisabled;
|
|
246
|
+
this.changeDetector.markForCheck();
|
|
247
|
+
}
|
|
248
|
+
emitClick() {
|
|
249
|
+
this.fileClick.emit({
|
|
250
|
+
file: this.value,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
emitFileChangeEvent(currentFile) {
|
|
254
|
+
if (currentFile && !currentFile.errorType) {
|
|
255
|
+
this.writeValue(currentFile);
|
|
256
|
+
}
|
|
257
|
+
this.fileChange.emit({
|
|
258
|
+
file: currentFile,
|
|
259
|
+
});
|
|
260
|
+
this.inputEl.nativeElement.value = '';
|
|
261
|
+
}
|
|
262
|
+
loadFile(file) {
|
|
263
|
+
const reader = new FileReader();
|
|
264
|
+
reader.addEventListener('load', (event) => {
|
|
265
|
+
file.url = event.target.result;
|
|
266
|
+
this.emitFileChangeEvent(file);
|
|
267
|
+
});
|
|
268
|
+
reader.addEventListener('error', (event) => {
|
|
269
|
+
this.emitFileChangeEvent(file);
|
|
270
|
+
});
|
|
271
|
+
reader.addEventListener('abort', (event) => {
|
|
272
|
+
this.emitFileChangeEvent(file);
|
|
273
|
+
});
|
|
274
|
+
reader.readAsDataURL(file.file);
|
|
275
|
+
}
|
|
276
|
+
handleFiles(files) {
|
|
277
|
+
const processedFiles = this.fileAttachmentService.checkFiles(files, this.minFileSize, this.maxFileSize, this.acceptedTypes, this.validateFn);
|
|
278
|
+
for (const file of processedFiles) {
|
|
279
|
+
if (file.errorType) {
|
|
280
|
+
this.emitFileChangeEvent(file);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.loadFile(file);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
updateFileAttachmentButton() {
|
|
288
|
+
this.showFileAttachmentButton = !(this.value && this.currentThemeName === 'modern');
|
|
289
|
+
this.changeDetector.markForCheck();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
SkyFileAttachmentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyFileAttachmentService }, { token: i2.SkyFileItemService }, { token: i3.NgControl, optional: true, self: true }, { token: i4.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
293
|
+
SkyFileAttachmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SkyFileAttachmentComponent, selector: "sky-file-attachment", inputs: { acceptedTypes: "acceptedTypes", disabled: "disabled", maxFileSize: "maxFileSize", minFileSize: "minFileSize", validateFn: "validateFn", required: "required" }, outputs: { fileChange: "fileChange", fileClick: "fileClick" }, providers: [SkyFileAttachmentService], queries: [{ propertyName: "labelComponents", predicate: SkyFileAttachmentLabelComponent }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.aria-required]=\"required ? true : null\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{ 'sky-control-label-required': required && hasLabelComponent }\"\n >\n <ng-container *ngTemplateOutlet=\"labelContent\"></ng-container>\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-file-attachment-drop-description\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n [attr.aria-describedby]=\"fileDropDescriptionElementId\"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n >\n <sky-icon icon=\"folder-open-o\"></sky-icon>\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file' | skyLibResources)\n }}\n </button>\n <sky-icon\n *ngIf=\"value && !isImage() && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n >\n </sky-icon>\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"getFileName(false)\"\n (click)=\"emitClick()\"\n >\n {{ getFileName() }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_delete' | skyLibResources\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern'\n }\"\n (click)=\"deleteFileAttachment()\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\"> </sky-icon>\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage()\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\"></ng-content>\n</ng-template>\n", styles: [".sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-drop-description{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"], components: [{ type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }], pipes: { "skyLibResources": i7.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentComponent, decorators: [{
|
|
295
|
+
type: Component,
|
|
296
|
+
args: [{ selector: 'sky-file-attachment', providers: [SkyFileAttachmentService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.aria-required]=\"required ? true : null\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{ 'sky-control-label-required': required && hasLabelComponent }\"\n >\n <ng-container *ngTemplateOutlet=\"labelContent\"></ng-container>\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-file-attachment-drop-description\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n [attr.aria-describedby]=\"fileDropDescriptionElementId\"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n >\n <sky-icon icon=\"folder-open-o\"></sky-icon>\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file' | skyLibResources)\n }}\n </button>\n <sky-icon\n *ngIf=\"value && !isImage() && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n >\n </sky-icon>\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"getFileName(false)\"\n (click)=\"emitClick()\"\n >\n {{ getFileName() }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_delete' | skyLibResources\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern'\n }\"\n (click)=\"deleteFileAttachment()\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\"> </sky-icon>\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage()\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\"></ng-content>\n</ng-template>\n", styles: [".sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-drop-description{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"] }]
|
|
297
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyFileAttachmentService }, { type: i2.SkyFileItemService }, { type: i3.NgControl, decorators: [{
|
|
298
|
+
type: Self
|
|
299
|
+
}, {
|
|
300
|
+
type: Optional
|
|
301
|
+
}] }, { type: i4.SkyThemeService, decorators: [{
|
|
302
|
+
type: Optional
|
|
303
|
+
}] }]; }, propDecorators: { acceptedTypes: [{
|
|
304
|
+
type: Input
|
|
305
|
+
}], disabled: [{
|
|
306
|
+
type: Input
|
|
307
|
+
}], maxFileSize: [{
|
|
308
|
+
type: Input
|
|
309
|
+
}], minFileSize: [{
|
|
310
|
+
type: Input
|
|
311
|
+
}], validateFn: [{
|
|
312
|
+
type: Input
|
|
313
|
+
}], fileChange: [{
|
|
314
|
+
type: Output
|
|
315
|
+
}], fileClick: [{
|
|
316
|
+
type: Output
|
|
317
|
+
}], required: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}], inputEl: [{
|
|
320
|
+
type: ViewChild,
|
|
321
|
+
args: ['fileInput']
|
|
322
|
+
}], labelComponents: [{
|
|
323
|
+
type: ContentChildren,
|
|
324
|
+
args: [SkyFileAttachmentLabelComponent]
|
|
325
|
+
}] } });
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3Jtcy9zcmMvbGliL21vZHVsZXMvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybXMvc3JjL2xpYi9tb2R1bGVzL2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBSXpELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQjs7R0FFRztBQVFILE1BQU0sT0FBTywwQkFBMEI7SUFx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dUJBQXVCLENBQUMsTUFBTTs7MEJBMkg1QyxJQUFJOzswQkFBSSxRQUFROzswQkFDaEIsUUFBUTs0Q0FqSEosYUFBYTtzQkFEbkIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQWdCQyxXQUFXO3NCQURqQixLQUFLO2dCQU9DLFdBQVc7c0JBRGpCLEtBQUs7Z0JBUUMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixNQUFNO2dCQVFBLFNBQVM7c0JBRGYsTUFBTTtnQkFzQkEsUUFBUTtzQkFEZCxLQUFLO2dCQXlCRSxPQUFPO3NCQURkLFNBQVM7dUJBQUMsV0FBVztnQkFJZCxlQUFlO3NCQUR0QixlQUFlO3VCQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNlbGYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lUaGVtZVNlcnZpY2UgfSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1zVXRpbGl0eSB9IGZyb20gJy4uL3NoYXJlZC9mb3Jtcy11dGlsaXR5JztcblxuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuL2ZpbGUtYXR0YWNobWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNreUZpbGVJdGVtIH0gZnJvbSAnLi9maWxlLWl0ZW0nO1xuaW1wb3J0IHsgU2t5RmlsZUl0ZW1TZXJ2aWNlIH0gZnJvbSAnLi9maWxlLWl0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZmlsZS1hdHRhY2htZW50LWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENsaWNrIH0gZnJvbSAnLi90eXBlcy9maWxlLWF0dGFjaG1lbnQtY2xpY2snO1xuXG5sZXQgdW5pcXVlSWQgPSAwO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFuIGVsZW1lbnQgdG8gYXR0YWNoIGEgc2luZ2xlIGxvY2FsIGZpbGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1maWxlLWF0dGFjaG1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1NreUZpbGVBdHRhY2htZW50U2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lGaWxlQXR0YWNobWVudENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIGxpdGVyYWwgb2YgTUlNRSB0eXBlcyB0aGF0IHVzZXJzIGNhbiBhdHRhY2guXG4gICAqIEJ5IGRlZmF1bHQsIGFsbCBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY2NlcHRlZFR5cGVzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IG5ld0Rpc2FibGVkU3RhdGUgPSBTa3lGb3Jtc1V0aWxpdHkuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IG5ld0Rpc2FibGVkU3RhdGUpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3RGlzYWJsZWRTdGF0ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBmb3IgdmFsaWQgZmlsZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWF4RmlsZVNpemUgPSA1MDAwMDA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBzaXplIGluIGJ5dGVzIGZvciB2YWxpZCBmaWxlcy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtaW5GaWxlU2l6ZSA9IDA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUaGlzIHZhbGlkYXRpb24gcnVucyBhbG9uZ3NpZGUgdGhlIGludGVybmFsXG4gICAqIGZpbGUgdmFsaWRhdGlvbi4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBTa3lGaWxlSXRlbWAgb2JqZWN0IGFzIGEgcGFyYW1ldGVyLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZhbGlkYXRlRm46IEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGFkZCBvciByZW1vdmUgZmlsZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUZpbGVBdHRhY2htZW50Q2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgZmlsZSBuYW1lIGxpbmsuIE1ha2Ugc3VyZSB0byBiaW5kIHRoZSBldmVudC5cbiAgICogSWYgeW91IGRvIG5vdCwgdGhlIGZpbGUgbmFtZSBsaW5rIHdpbGwgYmUgYSBkZWFkIGxpbmsuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGZpbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RmlsZUF0dGFjaG1lbnRDbGljaz4oKTtcblxuICBwdWJsaWMgYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBoYXNMYWJlbENvbXBvbmVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbENvbXBvbmVudHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHB1YmxpYyBmaWxlRHJvcERlc2NyaXB0aW9uRWxlbWVudElkOiBzdHJpbmc7XG5cbiAgcHVibGljIGxhYmVsRWxlbWVudElkOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlamVjdGVkT3ZlciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5wdXQgaXMgcmVxdWlyZWQgZm9yIGZvcm0gdmFsaWRhdGlvbi5cbiAgICogV2hlbiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgLCB0aGUgY29tcG9uZW50IGFkZHMgYGFyaWEtcmVxdWlyZWRgIGFuZCBgcmVxdWlyZWRgXG4gICAqIGF0dHJpYnV0ZXMgdG8gdGhlIGlucHV0IGVsZW1lbnQgc28gdGhhdCBmb3JtcyBkaXNwbGF5IGFuIGludmFsaWQgc3RhdGUgdW50aWwgdGhlIGlucHV0IGVsZW1lbnRcbiAgICogaXMgY29tcGxldGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcmVxdWlyZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBTa3lGaWxlSXRlbSkge1xuICAgIC8vIFRoZSBudWxsIGNoZWNrIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNC5cbiAgICAvLyB3cml0ZVZhbHVlIGlzIGJlaW5nIGNhbGxlZCB0d2ljZSwgZmlyc3QgdGltZSB3aXRoIGEgcGhhbnRvbSBudWxsIHZhbHVlXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNDk4OFxuICAgIGNvbnN0IGlzTmV3VmFsdWUgPSB2YWx1ZSAhPT0gdGhpcy52YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc05ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy51cGRhdGVGaWxlQXR0YWNobWVudEJ1dHRvbigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogU2t5RmlsZUl0ZW0ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50VGhlbWVOYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIHNob3dGaWxlQXR0YWNobWVudEJ1dHRvbjogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKVxuICBwcml2YXRlIGlucHV0RWw6IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50KVxuICBwcml2YXRlIGxhYmVsQ29tcG9uZW50czogUXVlcnlMaXN0PFNreUZpbGVBdHRhY2htZW50TGFiZWxDb21wb25lbnQ+O1xuXG4gIHByaXZhdGUgZW50ZXJFdmVudFRhcmdldDogYW55O1xuXG4gIHByaXZhdGUgZmlsZUF0dGFjaG1lbnRJZCA9IHVuaXF1ZUlkKys7XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBmaWxlQXR0YWNobWVudFNlcnZpY2U6IFNreUZpbGVBdHRhY2htZW50U2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVJdGVtU2VydmljZTogU2t5RmlsZUl0ZW1TZXJ2aWNlLFxuICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBuZ0NvbnRyb2w/OiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0aGVtZVN2Yz86IFNreVRoZW1lU2VydmljZVxuICApIHtcbiAgICB0aGlzLmxhYmVsRWxlbWVudElkID0gYHNreS1maWxlLWF0dGFjaG1lbnQtbGFiZWwtJHt0aGlzLmZpbGVBdHRhY2htZW50SWR9YDtcbiAgICB0aGlzLmZpbGVEcm9wRGVzY3JpcHRpb25FbGVtZW50SWQgPSBgc2t5LWZpbGUtYXR0YWNobWVudC1kcm9wLWRlc2NyaXB0aW9uLSR7dGhpcy5maWxlQXR0YWNobWVudElkfWA7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGhlbWVTdmMpIHtcbiAgICAgIHRoaXMudGhlbWVTdmMuc2V0dGluZ3NDaGFuZ2VcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRoZW1lU2V0dGluZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRUaGVtZU5hbWUgPSB0aGVtZVNldHRpbmdzLmN1cnJlbnRTZXR0aW5ncy50aGVtZS5uYW1lO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsZUF0dGFjaG1lbnRCdXR0b24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNy5cbiAgICAvLyBXaGVuIGEgY29udHJvbCB2YWx1ZSBpcyBzZXQgaW50aWFsbHksIGl0cyB2YWx1ZSBpcyBub3QgcmVwcmVzZW50ZWQgb24gdGhlIHZpZXcuXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc5MlxuICAgIC8vIE9mIG5vdGUgaXMgdGhlIHBhcmVudCBjaGVjayB3aGljaCBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmb3JtIGlzIHJlYWN0aXZlLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBjaGVjayB0aGVyZSBpcyBhIGNoYW5nZWQgYmVmb3JlIGNoZWNrZWQgZXJyb3JcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGFueW9uZSBzdGlsbCB1c2luZyBWYWxpZGF0b3JzLlJlcXVpcmVkLlxuICAgICAgdGhpcy5yZXF1aXJlZCA9XG4gICAgICAgIHRoaXMucmVxdWlyZWQgfHwgU2t5Rm9ybXNVdGlsaXR5Lmhhc1JlcXVpcmVkVmFsaWRhdGlvbih0aGlzLm5nQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBIYW5kbGVzIHVwZGF0aW5nIGNsYXNzZXMgd2hlbiBsYWJlbCBjaGFuZ2VzXG4gICAgdGhpcy5sYWJlbENvbXBvbmVudHMuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbGVJdGVtU2VydmljZS5pc0ltYWdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9uRHJvcENsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWxlQ2hhbmdlRXZlbnQoZmlsZUNoYW5nZUV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVDaGFuZ2VFdmVudC50YXJnZXQuZmlsZXMpO1xuICB9XG5cbiAgcHVibGljIGZpbGVEcmFnRW50ZXIoZHJhZ0VudGVyRXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIC8vIFNhdmUgdGhpcyB0YXJnZXQgdG8ga25vdyB3aGVuIHRoZSBkcmFnIGV2ZW50IGxlYXZlc1xuICAgIHRoaXMuZW50ZXJFdmVudFRhcmdldCA9IGRyYWdFbnRlckV2ZW50LnRhcmdldDtcbiAgICBkcmFnRW50ZXJFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcmFnRW50ZXJFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHVibGljIGZpbGVEcmFnT3ZlcihkcmFnT3ZlckV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFuc2ZlciA9IGRyYWdPdmVyRXZlbnQuZGF0YVRyYW5zZmVyO1xuXG4gICAgZHJhZ092ZXJFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcmFnT3ZlckV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodHJhbnNmZXIpIHtcbiAgICAgIGlmICh0cmFuc2Zlci5pdGVtcykge1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRyYW5zZmVyLml0ZW1zO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWxlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBmaWxlOiBhbnkgPSBmaWxlc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWxlLnR5cGUgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsZUF0dGFjaG1lbnRTZXJ2aWNlLmZpbGVUeXBlUmVqZWN0ZWQoXG4gICAgICAgICAgICAgIGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwICYmICF0aGlzLmFjY2VwdGVkT3Zlcikge1xuICAgICAgICAgIHRoaXMucmVqZWN0ZWRPdmVyID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgRGF0YVRyYW5zZmVyLml0ZW1zLFxuICAgICAgICAvLyBkZWZlciBmaWxlLXR5cGUgY2hlY2tpbmcgdG8gZHJvcCBoYW5kbGVyLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyL2l0ZW1zI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVEcm9wKGRyb3BFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZHJvcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyb3BFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5lbnRlckV2ZW50VGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVqZWN0ZWRPdmVyID0gZmFsc2U7XG4gICAgdGhpcy5hY2NlcHRlZE92ZXIgPSBmYWxzZTtcblxuICAgIGlmIChkcm9wRXZlbnQuZGF0YVRyYW5zZmVyICYmIGRyb3BFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpIHtcbiAgICAgIGlmIChkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZmlsZUF0dGFjaG1lbnRTZXJ2aWNlLmhhc0RpcmVjdG9yeShkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVGaWxlcyhkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdMZWF2ZShkcmFnTGVhdmVFdmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW50ZXJFdmVudFRhcmdldCA9PT0gZHJhZ0xlYXZlRXZlbnQudGFyZ2V0KSB7XG4gICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlRmlsZUF0dGFjaG1lbnQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZW1pdEZpbGVDaGFuZ2VFdmVudCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWxlTmFtZSh0cnVuY2F0ZSA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBjb25zdCBkcm9wTmFtZSA9XG4gICAgICAgIHRoaXMuZmlsZUl0ZW1TZXJ2aWNlLmlzRmlsZSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmZpbGUubmFtZVxuICAgICAgICAgID8gdGhpcy52YWx1ZS5maWxlLm5hbWVcbiAgICAgICAgICA6IHRoaXMudmFsdWUudXJsO1xuXG4gICAgICBpZiAodHJ1bmNhdGUgJiYgZHJvcE5hbWUubGVuZ3RoID4gMjYpIHtcbiAgICAgICAgcmV0dXJuIGRyb3BOYW1lLnNsaWNlKDAsIDI2KSArICcuLi4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRyb3BOYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjb250cm9sLiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFdoZXRoZXIgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZUNsaWNrLmVtaXQoe1xuICAgICAgZmlsZTogdGhpcy52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEZpbGVDaGFuZ2VFdmVudChjdXJyZW50RmlsZTogU2t5RmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY3VycmVudEZpbGUgJiYgIWN1cnJlbnRGaWxlLmVycm9yVHlwZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKGN1cnJlbnRGaWxlKTtcbiAgICB9XG4gICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZTogY3VycmVudEZpbGUsXG4gICAgfSBhcyBTa3lGaWxlQXR0YWNobWVudENoYW5nZSk7XG5cbiAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRmlsZShmaWxlOiBTa3lGaWxlSXRlbSk6IHZvaWQge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICBmaWxlLnVybCA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgICB0aGlzLmVtaXRGaWxlQ2hhbmdlRXZlbnQoZmlsZSk7XG4gICAgfSk7XG5cbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5lbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgIH0pO1xuXG4gICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKGV2ZW50OiBhbnkpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICB9KTtcblxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUuZmlsZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZpbGVzKGZpbGVzOiBGaWxlTGlzdCk6IHZvaWQge1xuICAgIGNvbnN0IHByb2Nlc3NlZEZpbGVzID0gdGhpcy5maWxlQXR0YWNobWVudFNlcnZpY2UuY2hlY2tGaWxlcyhcbiAgICAgIGZpbGVzLFxuICAgICAgdGhpcy5taW5GaWxlU2l6ZSxcbiAgICAgIHRoaXMubWF4RmlsZVNpemUsXG4gICAgICB0aGlzLmFjY2VwdGVkVHlwZXMsXG4gICAgICB0aGlzLnZhbGlkYXRlRm5cbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHByb2Nlc3NlZEZpbGVzKSB7XG4gICAgICBpZiAoZmlsZS5lcnJvclR5cGUpIHtcbiAgICAgICAgdGhpcy5lbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2FkRmlsZShmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZpbGVBdHRhY2htZW50QnV0dG9uID0gIShcbiAgICAgIHRoaXMudmFsdWUgJiYgdGhpcy5jdXJyZW50VGhlbWVOYW1lID09PSAnbW9kZXJuJ1xuICAgICk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIF9vblRvdWNoZWQgPSAoKSA9PiB7fTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXdyYXBwZXJcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1sYWJlbC13cmFwcGVyXCJcbiAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkID8gdHJ1ZSA6IG51bGxcIlxuICAgIFthdHRyLmlkXT1cImxhYmVsRWxlbWVudElkXCJcbiAgICBbbmdDbGFzc109XCJ7ICdza3ktY29udHJvbC1sYWJlbC1yZXF1aXJlZCc6IHJlcXVpcmVkICYmIGhhc0xhYmVsQ29tcG9uZW50IH1cIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhYmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC11cGxvYWQgc2t5LWZpbGUtYXR0YWNobWVudCBza3ktZmlsZS1hdHRhY2htZW50LXRhcmdldFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NreS1maWxlLWF0dGFjaG1lbnQtYWNjZXB0JzogYWNjZXB0ZWRPdmVyLFxuICAgICAgJ3NreS1maWxlLWF0dGFjaG1lbnQtcmVqZWN0JzogcmVqZWN0ZWRPdmVyXG4gICAgfVwiXG4gICAgKGRyYWdlbnRlcik9XCJmaWxlRHJhZ0VudGVyKCRldmVudClcIlxuICAgIChkcmFnb3Zlcik9XCJmaWxlRHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdsZWF2ZSk9XCJmaWxlRHJhZ0xlYXZlKCRldmVudClcIlxuICAgIChkcm9wKT1cImZpbGVEcm9wKCRldmVudClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1kcm9wLWRlc2NyaXB0aW9uXCJcbiAgICAgIHJvbGU9XCJ0b29sdGlwXCJcbiAgICAgIFthdHRyLmlkXT1cImZpbGVEcm9wRGVzY3JpcHRpb25FbGVtZW50SWRcIlxuICAgID5cbiAgICAgIHt7ICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfZHJhZ19vcl9jbGljaycgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICA8L2Rpdj5cbiAgICA8aW5wdXRcbiAgICAgIGhpZGRlblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBbYXR0ci5hY2NlcHRdPVwiYWNjZXB0ZWRUeXBlcyB8fCBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgLz5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNob3dGaWxlQXR0YWNobWVudEJ1dHRvblwiXG4gICAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtYnRuIHNreS1idG4gc2t5LWJ0bi1kZWZhdWx0XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJmaWxlRHJvcERlc2NyaXB0aW9uRWxlbWVudElkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwib25Ecm9wQ2xpY2tlZCgpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb24gaWNvbj1cImZvbGRlci1vcGVuLW9cIj48L3NreS1pY29uPlxuICAgICAge3tcbiAgICAgICAgdmFsdWVcbiAgICAgICAgICA/ICgnc2t5dXhfZmlsZV9hdHRhY2htZW50X2J1dHRvbl9sYWJlbF9yZXBsYWNlX2ZpbGUnXG4gICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgICA6ICgnc2t5dXhfZmlsZV9hdHRhY2htZW50X2J1dHRvbl9sYWJlbF9jaG9vc2VfZmlsZScgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxza3ktaWNvblxuICAgICAgKm5nSWY9XCJ2YWx1ZSAmJiAhaXNJbWFnZSgpICYmIGN1cnJlbnRUaGVtZU5hbWUgPT09ICdtb2Rlcm4nXCJcbiAgICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1pY29uIHNreS1kZWVtcGhhc2l6ZWRcIlxuICAgICAgaWNvbj1cImZpbGUtb1wiXG4gICAgICBzaXplPVwiMnhcIlxuICAgID5cbiAgICA8L3NreS1pY29uPlxuICAgIDxzcGFuXG4gICAgICAqbmdJZj1cInZhbHVlIHx8IGN1cnJlbnRUaGVtZU5hbWUgPT09ICdkZWZhdWx0J1wiXG4gICAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtbmFtZVwiXG4gICAgPlxuICAgICAgPGFcbiAgICAgICAgKm5nSWY9XCJ2YWx1ZTsgZWxzZSBub0ZpbGVcIlxuICAgICAgICBbYXR0ci50aXRsZV09XCJnZXRGaWxlTmFtZShmYWxzZSlcIlxuICAgICAgICAoY2xpY2spPVwiZW1pdENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyBnZXRGaWxlTmFtZSgpIH19XG4gICAgICA8L2E+XG4gICAgPC9zcGFuPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9GaWxlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LW5vbmUgc2t5LWRlZW1waGFzaXplZFwiPlxuICAgICAgICB7eyAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2xhYmVsX25vX2ZpbGVfY2hvc2VuJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ2YWx1ZVwiXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1ib3JkZXJsZXNzIHNreS1maWxlLWF0dGFjaG1lbnQtZGVsZXRlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX2l0ZW1fZGVsZXRlJyB8IHNreUxpYlJlc291cmNlc1xuICAgICAgXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktYnRuLWljb24tYm9yZGVybGVzcyc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJkZWxldGVGaWxlQXR0YWNobWVudCgpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb24gaWNvbj1cInRyYXNoLW9cIiBzaXplPVwibWRcIj4gPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGltZ1xuICAgICpuZ0lmPVwidmFsdWUgJiYgaXNJbWFnZSgpXCJcbiAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtcHJldmlldy1pbWdcIlxuICAgIFthbHRdPVwiXG4gICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ltYWdlX3ByZXZpZXdfYWx0X3RleHQnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgXCJcbiAgICBbc3JjXT1cInZhbHVlLnVybFwiXG4gIC8+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNsYWJlbENvbnRlbnQ+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cInNreS1maWxlLWF0dGFjaG1lbnQtbGFiZWxcIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class SkyFileAttachmentService {
|
|
7
|
+
checkFiles(files, minFileSize, maxFileSize, acceptedTypes, validateFn) {
|
|
8
|
+
const fileResults = [];
|
|
9
|
+
for (let index = 0; index < files.length; index++) {
|
|
10
|
+
const fileItem = {
|
|
11
|
+
file: files.item(index),
|
|
12
|
+
};
|
|
13
|
+
if (fileItem.file.size < minFileSize) {
|
|
14
|
+
fileItem.errorType = 'minFileSize';
|
|
15
|
+
fileItem.errorParam = minFileSize.toString();
|
|
16
|
+
fileResults.push(fileItem);
|
|
17
|
+
}
|
|
18
|
+
else if (fileItem.file.size > maxFileSize) {
|
|
19
|
+
fileItem.errorType = 'maxFileSize';
|
|
20
|
+
fileItem.errorParam = maxFileSize.toString();
|
|
21
|
+
fileResults.push(fileItem);
|
|
22
|
+
}
|
|
23
|
+
else if (this.fileTypeRejected(fileItem.file.type, acceptedTypes)) {
|
|
24
|
+
fileItem.errorType = 'fileType';
|
|
25
|
+
fileItem.errorParam = acceptedTypes;
|
|
26
|
+
fileResults.push(fileItem);
|
|
27
|
+
}
|
|
28
|
+
else if (validateFn) {
|
|
29
|
+
const errorParam = validateFn(fileItem);
|
|
30
|
+
if (errorParam) {
|
|
31
|
+
fileItem.errorType = 'validate';
|
|
32
|
+
fileItem.errorParam = errorParam;
|
|
33
|
+
}
|
|
34
|
+
fileResults.push(fileItem);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
fileResults.push(fileItem);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return fileResults;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Returns `true` if a directory is found in the provided `files` parameter.
|
|
44
|
+
*/
|
|
45
|
+
hasDirectory(files) {
|
|
46
|
+
for (let index = 0; index < files.length; index++) {
|
|
47
|
+
const file = files.item(index);
|
|
48
|
+
if (file.webkitGetAsEntry &&
|
|
49
|
+
file.webkitGetAsEntry() &&
|
|
50
|
+
file.webkitGetAsEntry().isDirectory) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
fileTypeRejected(fileType, acceptedTypes) {
|
|
57
|
+
if (!acceptedTypes) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (!fileType) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const acceptedTypesUpper = acceptedTypes.toUpperCase();
|
|
64
|
+
const typeArray = acceptedTypesUpper.split(',');
|
|
65
|
+
return !this.fileTypeInArray(typeArray, fileType.toUpperCase());
|
|
66
|
+
}
|
|
67
|
+
fileTypeInArray(typeArray, fileType) {
|
|
68
|
+
if (typeArray.indexOf(fileType) !== -1) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
for (let index = 0; index < typeArray.length; index++) {
|
|
72
|
+
const type = typeArray[index];
|
|
73
|
+
const validSubtype = this.getMimeSubtype(type);
|
|
74
|
+
if (validSubtype === '*') {
|
|
75
|
+
if (this.getMimeMainType(type) === this.getMimeMainType(fileType)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
getMimeSubtype(type) {
|
|
83
|
+
return type.substr(type.indexOf('/') + 1, type.length);
|
|
84
|
+
}
|
|
85
|
+
getMimeMainType(type) {
|
|
86
|
+
return type.substr(0, type.indexOf('/'));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
SkyFileAttachmentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
90
|
+
SkyFileAttachmentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentService });
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyFileAttachmentService, decorators: [{
|
|
92
|
+
type: Injectable
|
|
93
|
+
}] });
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybXMvc3JjL2xpYi9tb2R1bGVzL2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUkzQzs7R0FFRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFDNUIsVUFBVSxDQUNmLEtBQWUsRUFDZixXQUFtQixFQUNuQixXQUFtQixFQUNuQixhQUFxQixFQUNyQixVQUFvQjtRQUVwQixNQUFNLFdBQVcsR0FBa0IsRUFBRSxDQUFDO1FBRXRDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pELE1BQU0sUUFBUSxHQUFHO2dCQUNmLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNULENBQUM7WUFFakIsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLEVBQUU7Z0JBQ3BDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDN0MsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM1QjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsRUFBRTtnQkFDM0MsUUFBUSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEs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ZUFBZSxDQUFDLElBQVk7UUFDbEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7cUhBcEdVLHdCQUF3Qjt5SEFBeEIsd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNreUZpbGVJdGVtIH0gZnJvbSAnLi9maWxlLWl0ZW0nO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5RmlsZUF0dGFjaG1lbnRTZXJ2aWNlIHtcbiAgcHVibGljIGNoZWNrRmlsZXMoXG4gICAgZmlsZXM6IEZpbGVMaXN0LFxuICAgIG1pbkZpbGVTaXplOiBudW1iZXIsXG4gICAgbWF4RmlsZVNpemU6IG51bWJlcixcbiAgICBhY2NlcHRlZFR5cGVzOiBzdHJpbmcsXG4gICAgdmFsaWRhdGVGbjogRnVuY3Rpb25cbiAgKTogU2t5RmlsZUl0ZW1bXSB7XG4gICAgY29uc3QgZmlsZVJlc3VsdHM6IFNreUZpbGVJdGVtW10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWxlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpbGVJdGVtID0ge1xuICAgICAgICBmaWxlOiBmaWxlcy5pdGVtKGluZGV4KSxcbiAgICAgIH0gYXMgU2t5RmlsZUl0ZW07XG5cbiAgICAgIGlmIChmaWxlSXRlbS5maWxlLnNpemUgPCBtaW5GaWxlU2l6ZSkge1xuICAgICAgICBmaWxlSXRlbS5lcnJvclR5cGUgPSAnbWluRmlsZVNpemUnO1xuICAgICAgICBmaWxlSXRlbS5lcnJvclBhcmFtID0gbWluRmlsZVNpemUudG9TdHJpbmcoKTtcbiAgICAgICAgZmlsZVJlc3VsdHMucHVzaChmaWxlSXRlbSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVJdGVtLmZpbGUuc2l6ZSA+IG1heEZpbGVTaXplKSB7XG4gICAgICAgIGZpbGVJdGVtLmVycm9yVHlwZSA9ICdtYXhGaWxlU2l6ZSc7XG4gICAgICAgIGZpbGVJdGVtLmVycm9yUGFyYW0gPSBtYXhGaWxlU2l6ZS50b1N0cmluZygpO1xuICAgICAgICBmaWxlUmVzdWx0cy5wdXNoKGZpbGVJdGVtKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlVHlwZVJlamVjdGVkKGZpbGVJdGVtLmZpbGUudHlwZSwgYWNjZXB0ZWRUeXBlcykpIHtcbiAgICAgICAgZmlsZUl0ZW0uZXJyb3JUeXBlID0gJ2ZpbGVUeXBlJztcbiAgICAgICAgZmlsZUl0ZW0uZXJyb3JQYXJhbSA9IGFjY2VwdGVkVHlwZXM7XG4gICAgICAgIGZpbGVSZXN1bHRzLnB1c2goZmlsZUl0ZW0pO1xuICAgICAgfSBlbHNlIGlmICh2YWxpZGF0ZUZuKSB7XG4gICAgICAgIGNvbnN0IGVycm9yUGFyYW0gPSB2YWxpZGF0ZUZuKGZpbGVJdGVtKTtcblxuICAgICAgICBpZiAoZXJyb3JQYXJhbSkge1xuICAgICAgICAgIGZpbGVJdGVtLmVycm9yVHlwZSA9ICd2YWxpZGF0ZSc7XG4gICAgICAgICAgZmlsZUl0ZW0uZXJyb3JQYXJhbSA9IGVycm9yUGFyYW07XG4gICAgICAgIH1cbiAgICAgICAgZmlsZVJlc3VsdHMucHVzaChmaWxlSXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlUmVzdWx0cy5wdXNoKGZpbGVJdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGVSZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgZGlyZWN0b3J5IGlzIGZvdW5kIGluIHRoZSBwcm92aWRlZCBgZmlsZXNgIHBhcmFtZXRlci5cbiAgICovXG4gIHB1YmxpYyBoYXNEaXJlY3RvcnkoZmlsZXM6IEZpbGVMaXN0KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZmlsZTogYW55ID0gZmlsZXMuaXRlbShpbmRleCk7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGUud2Via2l0R2V0QXNFbnRyeSAmJlxuICAgICAgICBmaWxlLndlYmtpdEdldEFzRW50cnkoKSAmJlxuICAgICAgICBmaWxlLndlYmtpdEdldEFzRW50cnkoKS5pc0RpcmVjdG9yeVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmaWxlVHlwZVJlamVjdGVkKGZpbGVUeXBlOiBzdHJpbmcsIGFjY2VwdGVkVHlwZXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghYWNjZXB0ZWRUeXBlcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZmlsZVR5cGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGFjY2VwdGVkVHlwZXNVcHBlciA9IGFjY2VwdGVkVHlwZXMudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCB0eXBlQXJyYXkgPSBhY2NlcHRlZFR5cGVzVXBwZXIuc3BsaXQoJywnKTtcblxuICAgIHJldHVybiAhdGhpcy5maWxlVHlwZUluQXJyYXkodHlwZUFycmF5LCBmaWxlVHlwZS50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsZVR5cGVJbkFycmF5KHR5cGVBcnJheTogc3RyaW5nW10sIGZpbGVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZUFycmF5LmluZGV4T2YoZmlsZVR5cGUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlQXJyYXlbaW5kZXhdO1xuICAgICAgY29uc3QgdmFsaWRTdWJ0eXBlID0gdGhpcy5nZXRNaW1lU3VidHlwZSh0eXBlKTtcblxuICAgICAgaWYgKHZhbGlkU3VidHlwZSA9PT0gJyonKSB7XG4gICAgICAgIGlmICh0aGlzLmdldE1pbWVNYWluVHlwZSh0eXBlKSA9PT0gdGhpcy5nZXRNaW1lTWFpblR5cGUoZmlsZVR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldE1pbWVTdWJ0eXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGUuc3Vic3RyKHR5cGUuaW5kZXhPZignLycpICsgMSwgdHlwZS5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNaW1lTWFpblR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZS5zdWJzdHIoMCwgdHlwZS5pbmRleE9mKCcvJykpO1xuICB9XG59XG4iXX0=
|