@acrodata/gui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +66 -0
  2. package/_index.scss +19 -0
  3. package/button-toggle/button-toggle.d.ts +20 -0
  4. package/button-toggle/button-toggle.scss +21 -0
  5. package/button-toggle/icon.d.ts +7 -0
  6. package/button-toggle/icon.scss +11 -0
  7. package/esm2022/acrodata-gui.mjs +5 -0
  8. package/esm2022/button-toggle/button-toggle.mjs +62 -0
  9. package/esm2022/button-toggle/icon.mjs +28 -0
  10. package/esm2022/field-group/field-group.mjs +31 -0
  11. package/esm2022/field-label/field-label.mjs +32 -0
  12. package/esm2022/file-uploader/file-uploader-config.mjs +35 -0
  13. package/esm2022/file-uploader/file-uploader.mjs +125 -0
  14. package/esm2022/fill/fill.mjs +61 -0
  15. package/esm2022/gui-form.mjs +223 -0
  16. package/esm2022/gui-icons.mjs +33 -0
  17. package/esm2022/gui-module.mjs +172 -0
  18. package/esm2022/gui-utils.mjs +75 -0
  19. package/esm2022/image-select/image-select.mjs +60 -0
  20. package/esm2022/inline-group/inline-group.mjs +19 -0
  21. package/esm2022/input-number/input-number.mjs +59 -0
  22. package/esm2022/input-text/input-text.mjs +60 -0
  23. package/esm2022/interface.mjs +2 -0
  24. package/esm2022/public-api.mjs +23 -0
  25. package/esm2022/select/select.mjs +61 -0
  26. package/esm2022/slider/slider.mjs +75 -0
  27. package/esm2022/switch/switch.mjs +60 -0
  28. package/esm2022/textarea/textarea.mjs +60 -0
  29. package/fesm2022/acrodata-gui.mjs +1209 -0
  30. package/fesm2022/acrodata-gui.mjs.map +1 -0
  31. package/field-group/field-group.d.ts +14 -0
  32. package/field-group/field-group.scss +16 -0
  33. package/field-label/field-label.d.ts +12 -0
  34. package/field-label/field-label.scss +15 -0
  35. package/file-uploader/file-uploader-config.d.ts +23 -0
  36. package/file-uploader/file-uploader.d.ts +37 -0
  37. package/file-uploader/file-uploader.scss +43 -0
  38. package/fill/fill.d.ts +20 -0
  39. package/fill/fill.scss +30 -0
  40. package/gui-form.d.ts +69 -0
  41. package/gui-form.scss +110 -0
  42. package/gui-icons.d.ts +3 -0
  43. package/gui-module.d.ts +40 -0
  44. package/gui-utils.d.ts +33 -0
  45. package/image-select/image-select.d.ts +21 -0
  46. package/image-select/image-select.scss +48 -0
  47. package/index.d.ts +5 -0
  48. package/inline-group/inline-group.d.ts +7 -0
  49. package/inline-group/inline-group.scss +19 -0
  50. package/input-number/input-number.d.ts +20 -0
  51. package/input-number/input-number.scss +5 -0
  52. package/input-text/input-text.d.ts +20 -0
  53. package/input-text/input-text.scss +0 -0
  54. package/interface.d.ts +53 -0
  55. package/package.json +47 -0
  56. package/public-api.d.ts +19 -0
  57. package/select/select.d.ts +20 -0
  58. package/select/select.scss +18 -0
  59. package/slider/slider.d.ts +25 -0
  60. package/slider/slider.scss +49 -0
  61. package/switch/switch.d.ts +20 -0
  62. package/switch/switch.scss +8 -0
  63. package/textarea/textarea.d.ts +19 -0
  64. package/textarea/textarea.scss +0 -0
package/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # GUI
2
+
3
+ [![npm](https://img.shields.io/npm/v/@acrodata/gui.svg)](https://www.npmjs.com/package/@acrodata/gui)
4
+ [![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/acrodata/gui/blob/main/LICENSE)
5
+
6
+ A lightweight GUI library for Angular.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @angular/material @ng-matero/extensions @acrodata/gui --save
12
+ ```
13
+
14
+ ## Setup
15
+
16
+ ```ts
17
+ import { GuiModule } from '@acrodata/gui';
18
+
19
+ @NgModule({
20
+ ...
21
+ imports: [GuiModule, ...],
22
+ ...
23
+ })
24
+ export class YourAppModule {
25
+ }
26
+ ```
27
+
28
+ Define a theme with Angular Material's theming system. [More about theming](https://material.angular.io/guide/theming).
29
+
30
+ ```scss
31
+ @use '@angular/material' as mat;
32
+ @use '@acrodata/gui' as gui;
33
+
34
+ @include mat.core();
35
+
36
+ $theme: mat.define-light-theme(...);
37
+
38
+ @include gui.all-control-themes($theme);
39
+ ```
40
+
41
+ ## Usage
42
+
43
+ ```ts
44
+ import { Component } from '@angular/core';
45
+ import { GuiFields } from '@acrodata/gui';
46
+
47
+ @Component({
48
+ selector: 'your-app',
49
+ template: `<gui-form [config]="config" [model]="model" [form]="form"></gui-form>`,
50
+ })
51
+ export class YourAppComponent {
52
+ config: GuiFields = {
53
+ title: {
54
+ type: 'text',
55
+ name: 'Title',
56
+ default: 'I am title',
57
+ },
58
+ };
59
+ model = {};
60
+ form = new FormGroup({});
61
+ }
62
+ ```
63
+
64
+ ## License
65
+
66
+ MIT
package/_index.scss ADDED
@@ -0,0 +1,19 @@
1
+ @use '@angular/material' as mat;
2
+ @use '@ng-matero/extensions' as mtx;
3
+
4
+ @mixin all-control-themes($theme) {
5
+ @include mat.core-theme($theme);
6
+ @include mat.form-field-theme($theme);
7
+ @include mat.input-theme($theme);
8
+ @include mat.button-toggle-theme($theme);
9
+ @include mat.slide-toggle-theme($theme);
10
+ @include mat.select-theme($theme);
11
+ @include mat.slider-theme($theme);
12
+ @include mat.icon-theme($theme);
13
+ @include mat.icon-button-theme($theme);
14
+ @include mat.tabs-theme($theme);
15
+ @include mat.expansion-theme($theme);
16
+ @include mat.tooltip-theme($theme);
17
+ @include mtx.colorpicker-theme($theme);
18
+ @include mtx.select-theme($theme);
19
+ }
@@ -0,0 +1,20 @@
1
+ import { ChangeDetectorRef } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import { GuiBasicValue, GuiControl } from '../interface';
4
+ import * as i0 from "@angular/core";
5
+ export declare class GuiButtonToggle implements ControlValueAccessor {
6
+ private cdr;
7
+ config: Partial<GuiControl>;
8
+ disabled: boolean;
9
+ value: GuiBasicValue;
10
+ private onChange;
11
+ private onTouched;
12
+ constructor(cdr: ChangeDetectorRef);
13
+ writeValue(value: GuiBasicValue): void;
14
+ registerOnChange(fn: (value: GuiBasicValue) => void): void;
15
+ registerOnTouched(fn: () => void): void;
16
+ setDisabledState(isDisabled: boolean): void;
17
+ onValueChange(): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<GuiButtonToggle, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<GuiButtonToggle, "gui-button-toggle", never, { "config": { "alias": "config"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, false, never>;
20
+ }
@@ -0,0 +1,21 @@
1
+ .gui-button-toggle {
2
+ --mat-standard-button-toggle-height: 22px;
3
+
4
+ .mat-button-toggle-group {
5
+ flex-wrap: wrap;
6
+ }
7
+ }
8
+
9
+ .gui-icon-toggle {
10
+ &.mat-button-toggle {
11
+ .mat-button-toggle-label-content {
12
+ padding: 0;
13
+ line-height: normal;
14
+ }
15
+ }
16
+
17
+ // 图片图标选中时的样式
18
+ &.mat-button-toggle-checked img {
19
+ opacity: .64;
20
+ }
21
+ }
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class GuiIcon {
3
+ src: string;
4
+ isUrl(): boolean;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<GuiIcon, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<GuiIcon, "gui-icon", never, { "src": { "alias": "src"; "required": false; }; }, {}, never, never, false, never>;
7
+ }
@@ -0,0 +1,11 @@
1
+ .gui-icon {
2
+ display: inline-flex;
3
+
4
+ img,
5
+ i {
6
+ display: block;
7
+ width: 22px;
8
+ height: 22px;
9
+ line-height: 22px;
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNyb2RhdGEtZ3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2Fjcm9kYXRhLWd1aS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,62 @@
1
+ import { ChangeDetectionStrategy, Component, forwardRef, Input, ViewEncapsulation, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "@angular/material/form-field";
7
+ import * as i4 from "@angular/material/button-toggle";
8
+ import * as i5 from "./icon";
9
+ import * as i6 from "../field-label/field-label";
10
+ import * as i7 from "../gui-utils";
11
+ export class GuiButtonToggle {
12
+ constructor(cdr) {
13
+ this.cdr = cdr;
14
+ this.config = {};
15
+ this.disabled = false;
16
+ this.value = '';
17
+ this.onChange = () => { };
18
+ this.onTouched = () => { };
19
+ }
20
+ writeValue(value) {
21
+ this.value = value;
22
+ this.cdr.markForCheck();
23
+ }
24
+ registerOnChange(fn) {
25
+ this.onChange = fn;
26
+ }
27
+ registerOnTouched(fn) {
28
+ this.onTouched = fn;
29
+ }
30
+ setDisabledState(isDisabled) {
31
+ this.disabled = isDisabled;
32
+ this.cdr.markForCheck();
33
+ }
34
+ onValueChange() {
35
+ this.onChange(this.value);
36
+ }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiButtonToggle, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
38
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiButtonToggle, selector: "gui-button-toggle", inputs: { config: "config", disabled: "disabled" }, host: { classAttribute: "gui-field gui-button-toggle" }, providers: [
39
+ {
40
+ provide: NG_VALUE_ACCESSOR,
41
+ useExisting: forwardRef(() => GuiButtonToggle),
42
+ multi: true,
43
+ },
44
+ ], ngImport: i0, template: "<mat-button-toggle-group [(ngModel)]=\"value\" [disabled]=\"disabled\" [multiple]=\"config.multiple\"\n (change)=\"onValueChange()\">\n <mat-button-toggle *ngFor=\"let opt of config.options\" disableRipple\n [class]=\"{'gui-icon-toggle': config.useIcon}\"\n [flex]=\"opt.col\"\n [value]=\"opt.value\"\n [disabled]=\"opt.disabled\"\n [title]=\"config.useIcon ? opt.label : ''\">\n <gui-icon *ngIf=\"config.useIcon; else textLabel\" [src]=\"opt.src!\"></gui-icon>\n <ng-template #textLabel>{{opt.label}}</ng-template>\n </mat-button-toggle>\n</mat-button-toggle-group>\n<mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n</mat-hint>\n", styles: [".gui-button-toggle{--mat-standard-button-toggle-height: 22px}.gui-button-toggle .mat-button-toggle-group{flex-wrap:wrap}.gui-icon-toggle.mat-button-toggle .mat-button-toggle-label-content{padding:0;line-height:normal}.gui-icon-toggle.mat-button-toggle-checked img{opacity:.64}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i5.GuiIcon, selector: "gui-icon", inputs: ["src"] }, { kind: "component", type: i6.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "directive", type: i7.GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiButtonToggle, decorators: [{
47
+ type: Component,
48
+ args: [{ selector: 'gui-button-toggle', host: {
49
+ class: 'gui-field gui-button-toggle',
50
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
51
+ {
52
+ provide: NG_VALUE_ACCESSOR,
53
+ useExisting: forwardRef(() => GuiButtonToggle),
54
+ multi: true,
55
+ },
56
+ ], template: "<mat-button-toggle-group [(ngModel)]=\"value\" [disabled]=\"disabled\" [multiple]=\"config.multiple\"\n (change)=\"onValueChange()\">\n <mat-button-toggle *ngFor=\"let opt of config.options\" disableRipple\n [class]=\"{'gui-icon-toggle': config.useIcon}\"\n [flex]=\"opt.col\"\n [value]=\"opt.value\"\n [disabled]=\"opt.disabled\"\n [title]=\"config.useIcon ? opt.label : ''\">\n <gui-icon *ngIf=\"config.useIcon; else textLabel\" [src]=\"opt.src!\"></gui-icon>\n <ng-template #textLabel>{{opt.label}}</ng-template>\n </mat-button-toggle>\n</mat-button-toggle-group>\n<mat-hint *ngIf=\"config.parentType==='inline'\">\n <gui-field-label [config]=\"config\"></gui-field-label>\n</mat-hint>\n", styles: [".gui-button-toggle{--mat-standard-button-toggle-height: 22px}.gui-button-toggle .mat-button-toggle-group{flex-wrap:wrap}.gui-icon-toggle.mat-button-toggle .mat-button-toggle-label-content{padding:0;line-height:normal}.gui-icon-toggle.mat-button-toggle-checked img{opacity:.64}\n"] }]
57
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
58
+ type: Input
59
+ }], disabled: [{
60
+ type: Input
61
+ }] } });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLXRvZ2dsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9idXR0b24tdG9nZ2xlL2J1dHRvbi10b2dnbGUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvYnV0dG9uLXRvZ2dsZS9idXR0b24tdG9nZ2xlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFvQnpFLE1BQU0sT0FBTyxlQUFlO0lBUzFCLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUmpDLFdBQU0sR0FBd0IsRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUIsVUFBSyxHQUFrQixFQUFFLENBQUM7UUFFbEIsYUFBUSxHQUFtQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDcEQsY0FBUyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUVJLENBQUM7SUFFOUMsVUFBVSxDQUFDLEtBQW9CO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQWtDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFjO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQzs4R0EvQlUsZUFBZTtrR0FBZixlQUFlLHlKQVJmO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkMxQkgseXpCQWVBOzsyRkRhYSxlQUFlO2tCQWpCM0IsU0FBUzsrQkFDRSxtQkFBbUIsUUFHdkI7d0JBQ0osS0FBSyxFQUFFLDZCQUE2QjtxQkFDckMsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7d0dBR1EsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEd1aUJhc2ljVmFsdWUsIEd1aUNvbnRyb2wgfSBmcm9tICcuLi9pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdndWktYnV0dG9uLXRvZ2dsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9idXR0b24tdG9nZ2xlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9idXR0b24tdG9nZ2xlLnNjc3MnXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZ3VpLWZpZWxkIGd1aS1idXR0b24tdG9nZ2xlJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR3VpQnV0dG9uVG9nZ2xlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEd1aUJ1dHRvblRvZ2dsZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY29uZmlnOiBQYXJ0aWFsPEd1aUNvbnRyb2w+ID0ge307XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgdmFsdWU6IEd1aUJhc2ljVmFsdWUgPSAnJztcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IEd1aUJhc2ljVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogR3VpQmFzaWNWYWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogR3VpQmFzaWNWYWx1ZSkgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25WYWx1ZUNoYW5nZSgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG59XG4iLCI8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFttdWx0aXBsZV09XCJjb25maWcubXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgpXCI+XG4gIDxtYXQtYnV0dG9uLXRvZ2dsZSAqbmdGb3I9XCJsZXQgb3B0IG9mIGNvbmZpZy5vcHRpb25zXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInsnZ3VpLWljb24tdG9nZ2xlJzogY29uZmlnLnVzZUljb259XCJcbiAgICAgICAgICAgICAgICAgICAgIFtmbGV4XT1cIm9wdC5jb2xcIlxuICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJjb25maWcudXNlSWNvbiA/IG9wdC5sYWJlbCA6ICcnXCI+XG4gICAgPGd1aS1pY29uICpuZ0lmPVwiY29uZmlnLnVzZUljb247IGVsc2UgdGV4dExhYmVsXCIgW3NyY109XCJvcHQuc3JjIVwiPjwvZ3VpLWljb24+XG4gICAgPG5nLXRlbXBsYXRlICN0ZXh0TGFiZWw+e3tvcHQubGFiZWx9fTwvbmctdGVtcGxhdGU+XG4gIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG48L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuPG1hdC1oaW50ICpuZ0lmPVwiY29uZmlnLnBhcmVudFR5cGU9PT0naW5saW5lJ1wiPlxuICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiY29uZmlnXCI+PC9ndWktZmllbGQtbGFiZWw+XG48L21hdC1oaW50PlxuIl19
@@ -0,0 +1,28 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class GuiIcon {
5
+ constructor() {
6
+ this.src = '';
7
+ }
8
+ isUrl() {
9
+ return /https?:\/\/.+/.test(this.src);
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiIcon, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiIcon, selector: "gui-icon", inputs: { src: "src" }, host: { classAttribute: "gui-icon" }, ngImport: i0, template: `
13
+ <img *ngIf="isUrl()" [src]="src" />
14
+ <i *ngIf="!isUrl()" [ngClass]="src"></i>
15
+ `, isInline: true, styles: [".gui-icon{display:inline-flex}.gui-icon img,.gui-icon i{display:block;width:22px;height:22px;line-height:22px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiIcon, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: 'gui-icon', template: `
20
+ <img *ngIf="isUrl()" [src]="src" />
21
+ <i *ngIf="!isUrl()" [ngClass]="src"></i>
22
+ `, host: {
23
+ class: 'gui-icon',
24
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".gui-icon{display:inline-flex}.gui-icon img,.gui-icon i{display:block;width:22px;height:22px;line-height:22px}\n"] }]
25
+ }], propDecorators: { src: [{
26
+ type: Input
27
+ }] } });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9idXR0b24tdG9nZ2xlL2ljb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQWU3RixNQUFNLE9BQU8sT0FBTztJQWJwQjtRQWNXLFFBQUcsR0FBRyxFQUFFLENBQUM7S0FLbkI7SUFIQyxLQUFLO1FBQ0gsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDOzhHQUxVLE9BQU87a0dBQVAsT0FBTyw4R0FWUjs7O0dBR1Q7OzJGQU9VLE9BQU87a0JBYm5CLFNBQVM7K0JBQ0UsVUFBVSxZQUVWOzs7R0FHVCxRQUNLO3dCQUNKLEtBQUssRUFBRSxVQUFVO3FCQUNsQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxHQUFHO3NCQUFYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWljb24nLFxuICBzdHlsZVVybHM6IFsnLi9pY29uLnNjc3MnXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW1nICpuZ0lmPVwiaXNVcmwoKVwiIFtzcmNdPVwic3JjXCIgLz5cbiAgICA8aSAqbmdJZj1cIiFpc1VybCgpXCIgW25nQ2xhc3NdPVwic3JjXCI+PC9pPlxuICBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktaWNvbicsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlJY29uIHtcbiAgQElucHV0KCkgc3JjID0gJyc7XG5cbiAgaXNVcmwoKSB7XG4gICAgcmV0dXJuIC9odHRwcz86XFwvXFwvLisvLnRlc3QodGhpcy5zcmMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../field-label/field-label";
5
+ export class GuiFieldGroup {
6
+ constructor(differs, cdr) {
7
+ this.differs = differs;
8
+ this.cdr = cdr;
9
+ this.config = {};
10
+ }
11
+ ngOnInit() {
12
+ this.configDiffer = this.differs.find(this.config).create();
13
+ }
14
+ ngDoCheck() {
15
+ const changes = this.configDiffer?.diff(this.config);
16
+ changes?.forEachChangedItem(record => {
17
+ this.cdr.markForCheck();
18
+ });
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFieldGroup, deps: [{ token: i0.KeyValueDiffers }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiFieldGroup, selector: "gui-field-group", inputs: { config: "config" }, host: { classAttribute: "gui-field-group" }, ngImport: i0, template: "<gui-field-label *ngIf=\"config.parentType !== 'inline' && config.name\"\n [config]=\"config\" [index]=\"config.index\">\n</gui-field-label>\n<ng-content></ng-content>\n", styles: [".gui-field-group{display:flex;padding:4px 8px}.gui-field{display:inline-flex;flex:1;flex-wrap:wrap}.gui-field>.mat-mdc-form-field{flex:1;width:0;max-width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFieldGroup, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'gui-field-group', host: {
26
+ class: 'gui-field-group',
27
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<gui-field-label *ngIf=\"config.parentType !== 'inline' && config.name\"\n [config]=\"config\" [index]=\"config.index\">\n</gui-field-label>\n<ng-content></ng-content>\n", styles: [".gui-field-group{display:flex;padding:4px 8px}.gui-field{display:inline-flex;flex:1;flex-wrap:wrap}.gui-field>.mat-mdc-form-field{flex:1;width:0;max-width:100%}\n"] }]
28
+ }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
29
+ type: Input
30
+ }] } });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmllbGQtZ3JvdXAvZmllbGQtZ3JvdXAudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmllbGQtZ3JvdXAvZmllbGQtZ3JvdXAuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxLQUFLLEVBSUwsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7O0FBYXZCLE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQ1UsT0FBd0IsRUFDeEIsR0FBc0I7UUFEdEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFOdkIsV0FBTSxHQUF3QixFQUFFLENBQUM7SUFPdkMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBbkJVLGFBQWE7a0dBQWIsYUFBYSxrSUN2QjFCLDJMQUlBOzsyRkRtQmEsYUFBYTtrQkFWekIsU0FBUzsrQkFDRSxpQkFBaUIsUUFHckI7d0JBQ0osS0FBSyxFQUFFLGlCQUFpQjtxQkFDekIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTtzSUFHdEMsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIElucHV0LFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEd1aUNvbnRyb2wgfSBmcm9tICcuLi9pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdndWktZmllbGQtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmllbGQtZ3JvdXAuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkLWdyb3VwLnNjc3MnXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZ3VpLWZpZWxkLWdyb3VwJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEd1aUZpZWxkR3JvdXAgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2sge1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcblxuICBwcml2YXRlIGNvbmZpZ0RpZmZlcj86IEtleVZhbHVlRGlmZmVyPHN0cmluZywgYW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnRGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQodGhpcy5jb25maWcpLmNyZWF0ZSgpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbmZpZ0RpZmZlcj8uZGlmZih0aGlzLmNvbmZpZyk7XG4gICAgY2hhbmdlcz8uZm9yRWFjaENoYW5nZWRJdGVtKHJlY29yZCA9PiB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGd1aS1maWVsZC1sYWJlbCAqbmdJZj1cImNvbmZpZy5wYXJlbnRUeXBlICE9PSAnaW5saW5lJyAmJiBjb25maWcubmFtZVwiXG4gICAgICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnXCIgW2luZGV4XT1cImNvbmZpZy5pbmRleFwiPlxuPC9ndWktZmllbGQtbGFiZWw+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=
@@ -0,0 +1,32 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, } from '@angular/core';
2
+ import { ejsTmpl } from '../gui-utils';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/material/tooltip";
6
+ export class GuiFieldLabel {
7
+ constructor() {
8
+ this.config = {};
9
+ this.title = '';
10
+ this.styless = false;
11
+ }
12
+ ngOnChanges() {
13
+ const { index, name, parentType, type } = this.config;
14
+ this.title = index != null && !isNaN(index) ? ejsTmpl(name || '', { i: index }) : name;
15
+ this.styless =
16
+ (parentType === 'inline' && type !== 'inline') || type === 'group' || type === 'tabs';
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFieldLabel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiFieldLabel, selector: "gui-field-label", inputs: { config: "config", index: "index" }, host: { properties: { "class.gui-field-label": "!styless", "title": "title" } }, usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"!config.description\">{{title}}</span>\n<span *ngIf=\"config.description\"\n [class.gui-field-label-with-description]=\"config.description\"\n [matTooltip]=\"config.description\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"gui-field-label-tooltip\">{{title}}</span>\n", styles: [".gui-field-label{display:inline-block;width:64px;height:24px;padding:0 4px;line-height:24px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-field-label-with-description{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFieldLabel, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'gui-field-label', host: {
24
+ '[class.gui-field-label]': '!styless',
25
+ '[title]': 'title',
26
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<span *ngIf=\"!config.description\">{{title}}</span>\n<span *ngIf=\"config.description\"\n [class.gui-field-label-with-description]=\"config.description\"\n [matTooltip]=\"config.description\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"gui-field-label-tooltip\">{{title}}</span>\n", styles: [".gui-field-label{display:inline-block;width:64px;height:24px;padding:0 4px;line-height:24px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-field-label-with-description{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help}\n"] }]
27
+ }], propDecorators: { config: [{
28
+ type: Input
29
+ }], index: [{
30
+ type: Input
31
+ }] } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtbGFiZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmllbGQtbGFiZWwvZmllbGQtbGFiZWwudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmllbGQtbGFiZWwvZmllbGQtbGFiZWwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEVBRUwsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFjdkMsTUFBTSxPQUFPLGFBQWE7SUFYMUI7UUFZVyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUkxQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsWUFBTyxHQUFHLEtBQUssQ0FBQztLQVFqQjtJQU5DLFdBQVc7UUFDVCxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RixJQUFJLENBQUMsT0FBTztZQUNWLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDO0lBQzFGLENBQUM7OEdBZFUsYUFBYTtrR0FBYixhQUFhLDJNQ3JCMUIsc1RBTUE7OzJGRGVhLGFBQWE7a0JBWHpCLFNBQVM7K0JBQ0UsaUJBQWlCLFFBR3JCO3dCQUNKLHlCQUF5QixFQUFFLFVBQVU7d0JBQ3JDLFNBQVMsRUFBRSxPQUFPO3FCQUNuQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZWpzVG1wbCB9IGZyb20gJy4uL2d1aS11dGlscyc7XG5pbXBvcnQgeyBHdWlDb250cm9sIH0gZnJvbSAnLi4vaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZpZWxkLWxhYmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpZWxkLWxhYmVsLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWVsZC1sYWJlbC5zY3NzJ10sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmd1aS1maWVsZC1sYWJlbF0nOiAnIXN0eWxlc3MnLFxuICAgICdbdGl0bGVdJzogJ3RpdGxlJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEd1aUZpZWxkTGFiZWwgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcblxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcblxuICB0aXRsZSA9ICcnO1xuXG4gIHN0eWxlc3MgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCB7IGluZGV4LCBuYW1lLCBwYXJlbnRUeXBlLCB0eXBlIH0gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnRpdGxlID0gaW5kZXggIT0gbnVsbCAmJiAhaXNOYU4oaW5kZXgpID8gZWpzVG1wbChuYW1lIHx8ICcnLCB7IGk6IGluZGV4IH0pIDogbmFtZTtcbiAgICB0aGlzLnN0eWxlc3MgPVxuICAgICAgKHBhcmVudFR5cGUgPT09ICdpbmxpbmUnICYmIHR5cGUgIT09ICdpbmxpbmUnKSB8fCB0eXBlID09PSAnZ3JvdXAnIHx8IHR5cGUgPT09ICd0YWJzJztcbiAgfVxufVxuIiwiPHNwYW4gKm5nSWY9XCIhY29uZmlnLmRlc2NyaXB0aW9uXCI+e3t0aXRsZX19PC9zcGFuPlxuPHNwYW4gKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgW2NsYXNzLmd1aS1maWVsZC1sYWJlbC13aXRoLWRlc2NyaXB0aW9uXT1cImNvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICBbbWF0VG9vbHRpcF09XCJjb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgbWF0VG9vbHRpcENsYXNzPVwiZ3VpLWZpZWxkLWxhYmVsLXRvb2x0aXBcIj57e3RpdGxlfX08L3NwYW4+XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common/http";
4
+ export class GuiFileUploaderConfig {
5
+ constructor(http) {
6
+ this.http = http;
7
+ /**
8
+ * The file upload URL
9
+ */
10
+ this.url = '';
11
+ /**
12
+ * The file upload params
13
+ */
14
+ this.params = {};
15
+ }
16
+ /**
17
+ * The File upload API
18
+ *
19
+ * @param file file data
20
+ * @returns
21
+ */
22
+ upload(file) {
23
+ return this.http.post(this.url, file, {
24
+ reportProgress: true,
25
+ observe: 'events',
26
+ params: this.params,
27
+ });
28
+ }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFileUploaderConfig, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
30
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFileUploaderConfig }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFileUploaderConfig, decorators: [{
33
+ type: Injectable
34
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFHM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBRXBDOztXQUVHO1FBQ0gsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUVUOztXQUVHO1FBQ0gsV0FBTSxHQUFRLEVBQUUsQ0FBQztJQVZzQixDQUFDO0lBWXhDOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtZQUN6QyxjQUFjLEVBQUUsSUFBSTtZQUNwQixPQUFPLEVBQUUsUUFBUTtZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F6QlUscUJBQXFCO2tIQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3VpRmlsZVVwbG9hZGVyQ29uZmlnIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7fVxuXG4gIC8qKlxuICAgKiAgVGhlIGZpbGUgdXBsb2FkIFVSTFxuICAgKi9cbiAgdXJsID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHVwbG9hZCBwYXJhbXNcbiAgICovXG4gIHBhcmFtczogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBGaWxlIHVwbG9hZCBBUElcbiAgICpcbiAgICogQHBhcmFtIGZpbGUgZmlsZSBkYXRhXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB1cGxvYWQoZmlsZTogRm9ybURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLnVybCwgZmlsZSwge1xuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICBvYnNlcnZlOiAnZXZlbnRzJyxcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,125 @@
1
+ import { HttpResponse } from '@angular/common/http';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, forwardRef, } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { of } from 'rxjs';
5
+ import { catchError, finalize } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./file-uploader-config";
8
+ import * as i2 from "@angular/common";
9
+ import * as i3 from "@angular/forms";
10
+ import * as i4 from "@angular/material/form-field";
11
+ import * as i5 from "@angular/material/input";
12
+ import * as i6 from "@angular/material/icon";
13
+ import * as i7 from "@angular/material/button";
14
+ export class GuiFileUploader {
15
+ constructor(fileUploaderCfg, cdr) {
16
+ this.fileUploaderCfg = fileUploaderCfg;
17
+ this.cdr = cdr;
18
+ this.type = '*';
19
+ this.name = '';
20
+ this.accept = '';
21
+ this.disabled = false;
22
+ this.fileChange = new EventEmitter();
23
+ // media src
24
+ this.url = '';
25
+ this.onChange = () => { };
26
+ this.onTouched = () => { };
27
+ }
28
+ ngOnChanges(changes) {
29
+ if (changes['type']) {
30
+ this.accept = this.type + '/*';
31
+ }
32
+ }
33
+ writeValue(value) {
34
+ this.url = value;
35
+ this.cdr.markForCheck();
36
+ }
37
+ registerOnChange(fn) {
38
+ this.onChange = fn;
39
+ }
40
+ registerOnTouched(fn) {
41
+ this.onTouched = fn;
42
+ }
43
+ setDisabledState(isDisabled) {
44
+ this.disabled = isDisabled;
45
+ this.cdr.markForCheck();
46
+ }
47
+ upload(file) {
48
+ const formData = new FormData();
49
+ formData.append('file', file.data || '');
50
+ file.inProgress = true;
51
+ this.fileUploaderCfg
52
+ .upload(formData)
53
+ .pipe(catchError((error) => {
54
+ file.inProgress = false;
55
+ return of(`${file.data?.name || 'File'} upload failed.`);
56
+ }), finalize(() => { }))
57
+ .subscribe(res => {
58
+ if (res instanceof HttpResponse && res.body) {
59
+ this.url = res.body.data;
60
+ this.onChange(this.url);
61
+ this.onTouched();
62
+ this.fileChange.emit(this.url);
63
+ }
64
+ this.cdr.detectChanges();
65
+ });
66
+ }
67
+ onUrlChange(e) {
68
+ this.url = e.target.value;
69
+ this.onChange(this.url);
70
+ this.fileChange.emit(this.url);
71
+ }
72
+ onFileChange(e) {
73
+ this.file = {
74
+ data: e.target.files[0],
75
+ inProgress: false,
76
+ progress: 0,
77
+ };
78
+ this.upload(this.file);
79
+ // reset input value
80
+ e.target.value = '';
81
+ }
82
+ onBlur() {
83
+ this.onTouched();
84
+ }
85
+ onClear() {
86
+ this.url = '';
87
+ this.onChange(this.url);
88
+ this.onTouched();
89
+ this.fileChange.emit(this.url);
90
+ }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFileUploader, deps: [{ token: i1.GuiFileUploaderConfig }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiFileUploader, selector: "gui-file-uploader", inputs: { type: "type", name: "name", accept: "accept", disabled: "disabled" }, outputs: { fileChange: "fileChange" }, host: { classAttribute: "gui-file-uploader" }, providers: [
93
+ {
94
+ provide: NG_VALUE_ACCESSOR,
95
+ useExisting: forwardRef(() => GuiFileUploader),
96
+ multi: true,
97
+ },
98
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field>\n <mat-icon matPrefix svgIcon=\"link\"></mat-icon>\n\n <input matInput type=\"text\" [ngModel]=\"url\" [disabled]=\"disabled\"\n (change)=\"onUrlChange($event)\" (blur)=\"onBlur()\">\n\n <button *ngIf=\"url\" matSuffix mat-icon-button color=\"warn\"\n [disabled]=\"disabled\" (click)=\"onClear()\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</mat-form-field>\n\n<figure class=\"gui-file-content\">\n <ng-container *ngIf=\"url\" [ngSwitch]=\"type\">\n <img *ngSwitchCase=\"'image'\" [src]=\"url\">\n\n <video *ngSwitchCase=\"'video'\" [src]=\"url\"></video>\n\n <audio *ngSwitchCase=\"'audio'\" [src]=\"url\" controls></audio>\n\n <svg *ngSwitchDefault\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z\">\n </path>\n </svg>\n </ng-container>\n\n <div *ngIf=\"!url\" class=\"gui-file-placeholder\">\u9009\u62E9\u4E0A\u4F20\u6587\u4EF6</div>\n\n <input #fileInput type=\"file\" [accept]=\"accept\" [name]=\"name\" tabindex=\"-1\"\n [disabled]=\"disabled\" (change)=\"onFileChange($event)\">\n</figure>\n", styles: [".gui-file-uploader{display:block;overflow:auto;flex:1}.gui-file-uploader .mat-mdc-form-field{width:100%}.gui-file-uploader .gui-file-content{position:relative;display:flex;align-items:center;justify-content:center;height:120px;margin:4px 0 0;padding:4px;background-color:var(--mdc-filled-text-field-container-color);border:1px solid transparent;border-radius:4px}.gui-file-uploader .gui-file-content:hover{border-color:currentColor}.gui-file-uploader .gui-file-content img,.gui-file-uploader .gui-file-content video{width:100%;height:100%;object-fit:contain}.gui-file-uploader .gui-file-content input[type=file]{position:absolute;top:0;left:0;width:100%;height:100%;text-indent:9999px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImport: i0, type: GuiFileUploader, decorators: [{
101
+ type: Component,
102
+ args: [{ selector: 'gui-file-uploader', host: {
103
+ class: 'gui-file-uploader',
104
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
105
+ {
106
+ provide: NG_VALUE_ACCESSOR,
107
+ useExisting: forwardRef(() => GuiFileUploader),
108
+ multi: true,
109
+ },
110
+ ], template: "<mat-form-field>\n <mat-icon matPrefix svgIcon=\"link\"></mat-icon>\n\n <input matInput type=\"text\" [ngModel]=\"url\" [disabled]=\"disabled\"\n (change)=\"onUrlChange($event)\" (blur)=\"onBlur()\">\n\n <button *ngIf=\"url\" matSuffix mat-icon-button color=\"warn\"\n [disabled]=\"disabled\" (click)=\"onClear()\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</mat-form-field>\n\n<figure class=\"gui-file-content\">\n <ng-container *ngIf=\"url\" [ngSwitch]=\"type\">\n <img *ngSwitchCase=\"'image'\" [src]=\"url\">\n\n <video *ngSwitchCase=\"'video'\" [src]=\"url\"></video>\n\n <audio *ngSwitchCase=\"'audio'\" [src]=\"url\" controls></audio>\n\n <svg *ngSwitchDefault\n viewBox=\"0 0 24 24\" width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path\n d=\"M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z\">\n </path>\n </svg>\n </ng-container>\n\n <div *ngIf=\"!url\" class=\"gui-file-placeholder\">\u9009\u62E9\u4E0A\u4F20\u6587\u4EF6</div>\n\n <input #fileInput type=\"file\" [accept]=\"accept\" [name]=\"name\" tabindex=\"-1\"\n [disabled]=\"disabled\" (change)=\"onFileChange($event)\">\n</figure>\n", styles: [".gui-file-uploader{display:block;overflow:auto;flex:1}.gui-file-uploader .mat-mdc-form-field{width:100%}.gui-file-uploader .gui-file-content{position:relative;display:flex;align-items:center;justify-content:center;height:120px;margin:4px 0 0;padding:4px;background-color:var(--mdc-filled-text-field-container-color);border:1px solid transparent;border-radius:4px}.gui-file-uploader .gui-file-content:hover{border-color:currentColor}.gui-file-uploader .gui-file-content img,.gui-file-uploader .gui-file-content video{width:100%;height:100%;object-fit:contain}.gui-file-uploader .gui-file-content input[type=file]{position:absolute;top:0;left:0;width:100%;height:100%;text-indent:9999px;cursor:pointer}\n"] }]
111
+ }], ctorParameters: function () { return [{ type: i1.GuiFileUploaderConfig }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { fileInput: [{
112
+ type: ViewChild,
113
+ args: ['fileInput']
114
+ }], type: [{
115
+ type: Input
116
+ }], name: [{
117
+ type: Input
118
+ }], accept: [{
119
+ type: Input
120
+ }], disabled: [{
121
+ type: Input
122
+ }], fileChange: [{
123
+ type: Output
124
+ }] } });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkZXIudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUE0QnRELE1BQU0sT0FBTyxlQUFlO0lBbUIxQixZQUNVLGVBQXNDLEVBQ3RDLEdBQXNCO1FBRHRCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUN0QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWxCdkIsU0FBSSxHQUFtQixHQUFHLENBQUM7UUFDM0IsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxELFlBQVk7UUFDWixRQUFHLEdBQUcsRUFBRSxDQUFDO1FBS0QsYUFBUSxHQUE0QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDN0MsY0FBUyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUt0QyxDQUFDO0lBRUosV0FB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QUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDOzhHQTdHVSxlQUFlO2tHQUFmLGVBQWUsa05BUmY7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLHVKQzNDSCwrdUNBaUNBOzsyRkRZYSxlQUFlO2tCQWpCM0IsU0FBUzsrQkFDRSxtQkFBbUIsUUFHdkI7d0JBQ0osS0FBSyxFQUFFLG1CQUFtQjtxQkFDM0IsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7NElBR3VCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFFYixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEd1aUZpbGVVcGxvYWRlckNvbmZpZyB9IGZyb20gJy4vZmlsZS11cGxvYWRlci1jb25maWcnO1xuXG5leHBvcnQgdHlwZSBGaWxlVXBsb2FkVHlwZSA9ICdpbWFnZScgfCAndmlkZW8nIHwgJ2F1ZGlvJyB8ICcqJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlVXBsb2FkQ29udGVudCB7XG4gIGRhdGE6IEZpbGU7XG4gIHByb2dyZXNzOiBudW1iZXI7XG4gIGluUHJvZ3Jlc3M6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1maWxlLXVwbG9hZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXBsb2FkZXIuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkZXIuc2NzcyddLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktZmlsZS11cGxvYWRlcicsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEd1aUZpbGVVcGxvYWRlciksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlGaWxlVXBsb2FkZXIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBASW5wdXQoKSB0eXBlOiBGaWxlVXBsb2FkVHlwZSA9ICcqJztcbiAgQElucHV0KCkgbmFtZSA9ICcnO1xuICBASW5wdXQoKSBhY2NlcHQgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIG1lZGlhIHNyY1xuICB1cmwgPSAnJztcblxuICAvLyBmaWxlIHRvIHVwbG9hZFxuICBmaWxlITogRmlsZVVwbG9hZENvbnRlbnQ7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZpbGVVcGxvYWRlckNmZzogR3VpRmlsZVVwbG9hZGVyQ29uZmlnLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0eXBlJ10pIHtcbiAgICAgIHRoaXMuYWNjZXB0ID0gdGhpcy50eXBlICsgJy8qJztcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHVwbG9hZChmaWxlOiBGaWxlVXBsb2FkQ29udGVudCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZS5kYXRhIHx8ICcnKTtcblxuICAgIGZpbGUuaW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICB0aGlzLmZpbGVVcGxvYWRlckNmZ1xuICAgICAgLnVwbG9hZChmb3JtRGF0YSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBmaWxlLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gb2YoYCR7ZmlsZS5kYXRhPy5uYW1lIHx8ICdGaWxlJ30gdXBsb2FkIGZhaWxlZC5gKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHt9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlICYmIHJlcy5ib2R5KSB7XG4gICAgICAgICAgdGhpcy51cmwgPSByZXMuYm9keS5kYXRhO1xuXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnVybCk7XG4gICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgICAgICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25VcmxDaGFuZ2UoZTogRXZlbnQpIHtcbiAgICB0aGlzLnVybCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIHRoaXMub25DaGFuZ2UodGhpcy51cmwpO1xuXG4gICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQodGhpcy51cmwpO1xuICB9XG5cbiAgb25GaWxlQ2hhbmdlKGU6IEV2ZW50KSB7XG4gICAgdGhpcy5maWxlID0ge1xuICAgICAgZGF0YTogKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzIVswXSxcbiAgICAgIGluUHJvZ3Jlc3M6IGZhbHNlLFxuICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgfTtcblxuICAgIHRoaXMudXBsb2FkKHRoaXMuZmlsZSk7XG5cbiAgICAvLyByZXNldCBpbnB1dCB2YWx1ZVxuICAgIChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9ICcnO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBvbkNsZWFyKCkge1xuICAgIHRoaXMudXJsID0gJyc7XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudXJsKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQodGhpcy51cmwpO1xuICB9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtaWNvbiBtYXRQcmVmaXggc3ZnSWNvbj1cImxpbmtcIj48L21hdC1pY29uPlxuXG4gIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cInVybFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAoY2hhbmdlKT1cIm9uVXJsQ2hhbmdlKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoKVwiPlxuXG4gIDxidXR0b24gKm5nSWY9XCJ1cmxcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2xlYXIoKVwiPlxuICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY2xvc2VcIj48L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjxmaWd1cmUgY2xhc3M9XCJndWktZmlsZS1jb250ZW50XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1cmxcIiBbbmdTd2l0Y2hdPVwidHlwZVwiPlxuICAgIDxpbWcgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIiBbc3JjXT1cInVybFwiPlxuXG4gICAgPHZpZGVvICpuZ1N3aXRjaENhc2U9XCIndmlkZW8nXCIgW3NyY109XCJ1cmxcIj48L3ZpZGVvPlxuXG4gICAgPGF1ZGlvICpuZ1N3aXRjaENhc2U9XCInYXVkaW8nXCIgW3NyY109XCJ1cmxcIiBjb250cm9scz48L2F1ZGlvPlxuXG4gICAgPHN2ZyAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxuICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTQsMkg2QTIsMiAwIDAsMCA0LDRWMjBBMiwyIDAgMCwwIDYsMjJIMThBMiwyIDAgMCwwIDIwLDIwVjhMMTQsMk0xOCwyMEg2VjRIMTNWOUgxOFYyMFpcIj5cbiAgICAgIDwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiAqbmdJZj1cIiF1cmxcIiBjbGFzcz1cImd1aS1maWxlLXBsYWNlaG9sZGVyXCI+6YCJ5oup5LiK5Lyg5paH5Lu2PC9kaXY+XG5cbiAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBbYWNjZXB0XT1cImFjY2VwdFwiIFtuYW1lXT1cIm5hbWVcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj5cbjwvZmlndXJlPlxuIl19