@gloww/gloww 0.9.0-beta.9 → 14.0.0-beta.1

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 (98) hide show
  1. package/esm2020/lib/Components/auto-complete/auto-complete.component.mjs +152 -0
  2. package/esm2020/lib/Components/code-editor/code-editor.component.mjs +109 -13
  3. package/esm2020/lib/Components/confirmation/confirmation.component.mjs +6 -6
  4. package/esm2020/lib/Components/datetime/datetime.component.mjs +84 -0
  5. package/esm2020/lib/Components/display-objects/display-objects.component.mjs +182 -62
  6. package/esm2020/lib/Components/download-progress/download-progress.component.mjs +8 -10
  7. package/esm2020/lib/Components/dummy/dummy.component.mjs +14 -0
  8. package/esm2020/lib/Components/folders/file-edit/file-edit.component.mjs +31 -12
  9. package/esm2020/lib/Components/folders/folders/folders.component.mjs +6 -6
  10. package/esm2020/lib/Components/header/header.component.mjs +4 -4
  11. package/esm2020/lib/Components/html-editor/html-editor.component.mjs +8 -8
  12. package/esm2020/lib/Components/menu-list-item/menu-list-item.component.mjs +43 -37
  13. package/esm2020/lib/Components/prompt/prompt.component.mjs +8 -8
  14. package/esm2020/lib/Components/result-table/result-table.component.mjs +4 -4
  15. package/esm2020/lib/Components/search-form/search-form.component.mjs +4 -4
  16. package/esm2020/lib/Components/secure-a/secure-a.component.mjs +5 -5
  17. package/esm2020/lib/Components/secure-img/secure-img.component.mjs +4 -4
  18. package/esm2020/lib/Components/select/select.component.mjs +132 -0
  19. package/esm2020/lib/Components/upload-doc/upload-doc.component.mjs +8 -8
  20. package/esm2020/lib/Components/upload-file/upload-file.component.mjs +20 -12
  21. package/esm2020/lib/Directives/file-sink.directive.mjs +3 -3
  22. package/esm2020/lib/Guards/has-unsaved-data.guard.mjs +29 -0
  23. package/esm2020/lib/Guards/ihas-unsaved-data.mjs +2 -0
  24. package/esm2020/lib/Helpers/gloww-validators.mjs +116 -0
  25. package/esm2020/lib/Models/nav-item.mjs +1 -1
  26. package/esm2020/lib/Pipes/html-format.pipe.mjs +3 -3
  27. package/esm2020/lib/Pipes/safe-html.pipe.mjs +3 -3
  28. package/esm2020/lib/Pipes/secure.pipe.mjs +3 -3
  29. package/esm2020/lib/Services/dialog.service.mjs +3 -3
  30. package/esm2020/lib/Services/folder-service-config.mjs +3 -3
  31. package/esm2020/lib/Services/folder.service.mjs +8 -4
  32. package/esm2020/lib/Services/gloww.service.mjs +26 -9
  33. package/esm2020/lib/Services/nav.service.mjs +3 -3
  34. package/esm2020/lib/Services/snippets.service.mjs +25 -0
  35. package/esm2020/lib/Services/version-check.service.mjs +3 -3
  36. package/esm2020/lib/Services/voice-recognition.service.mjs +3 -3
  37. package/esm2020/lib/gloww-security/Components/change-password-dlg/change-password-dlg.component.mjs +8 -8
  38. package/esm2020/lib/gloww-security/Components/login/login.component.mjs +11 -11
  39. package/esm2020/lib/gloww-security/Components/social-network/social-network.component.mjs +5 -5
  40. package/esm2020/lib/gloww-security/Components/social-network-dlg/social-network-dlg.component.mjs +7 -7
  41. package/esm2020/lib/gloww-security/Components/user-menu/user-menu.component.mjs +3 -3
  42. package/esm2020/lib/gloww-security/Helpers/administrator.guard.mjs +3 -3
  43. package/esm2020/lib/gloww-security/Helpers/auth.guard.mjs +3 -3
  44. package/esm2020/lib/gloww-security/Helpers/error.interceptor.mjs +3 -3
  45. package/esm2020/lib/gloww-security/Helpers/jwt.interceptor.mjs +3 -3
  46. package/esm2020/lib/gloww-security/Helpers/staging.interceptor.mjs +3 -3
  47. package/esm2020/lib/gloww-security/Services/authentication-service-config.mjs +3 -3
  48. package/esm2020/lib/gloww-security/Services/authentication.service.mjs +3 -3
  49. package/esm2020/lib/gloww-security/Services/gloww-security.service.mjs +3 -3
  50. package/esm2020/lib/gloww-security/gloww-security.module.mjs +19 -21
  51. package/esm2020/lib/gloww.module.mjs +90 -31
  52. package/esm2020/public-api.mjs +9 -1
  53. package/fesm2015/gloww-gloww.mjs +1139 -307
  54. package/fesm2015/gloww-gloww.mjs.map +1 -1
  55. package/fesm2020/gloww-gloww.mjs +1117 -305
  56. package/fesm2020/gloww-gloww.mjs.map +1 -1
  57. package/gloww.theme.scss +164 -0
  58. package/{gloww-gloww.d.ts → index.d.ts} +0 -0
  59. package/lib/Components/auto-complete/auto-complete.component.d.ts +39 -0
  60. package/lib/Components/code-editor/code-editor.component.d.ts +32 -3
  61. package/lib/Components/confirmation/confirmation.component.d.ts +1 -1
  62. package/lib/Components/datetime/datetime.component.d.ts +22 -0
  63. package/lib/Components/display-objects/display-objects.component.d.ts +20 -12
  64. package/lib/Components/download-progress/download-progress.component.d.ts +1 -1
  65. package/lib/Components/dummy/dummy.component.d.ts +8 -0
  66. package/lib/Components/folders/file-edit/file-edit.component.d.ts +11 -4
  67. package/lib/Components/folders/folders/folders.component.d.ts +1 -1
  68. package/lib/Components/header/header.component.d.ts +1 -1
  69. package/lib/Components/html-editor/html-editor.component.d.ts +1 -1
  70. package/lib/Components/menu-list-item/menu-list-item.component.d.ts +12 -4
  71. package/lib/Components/prompt/prompt.component.d.ts +4 -4
  72. package/lib/Components/result-table/result-table.component.d.ts +1 -1
  73. package/lib/Components/search-form/search-form.component.d.ts +1 -1
  74. package/lib/Components/secure-a/secure-a.component.d.ts +1 -1
  75. package/lib/Components/secure-img/secure-img.component.d.ts +1 -1
  76. package/lib/Components/select/select.component.d.ts +35 -0
  77. package/lib/Components/upload-doc/upload-doc.component.d.ts +3 -3
  78. package/lib/Components/upload-file/upload-file.component.d.ts +3 -3
  79. package/lib/Directives/file-sink.directive.d.ts +1 -1
  80. package/lib/Guards/has-unsaved-data.guard.d.ts +8 -0
  81. package/lib/Guards/ihas-unsaved-data.d.ts +3 -0
  82. package/lib/Helpers/gloww-validators.d.ts +39 -0
  83. package/lib/Models/nav-item.d.ts +2 -1
  84. package/lib/Pipes/html-format.pipe.d.ts +1 -1
  85. package/lib/Pipes/safe-html.pipe.d.ts +1 -1
  86. package/lib/Pipes/secure.pipe.d.ts +1 -1
  87. package/lib/Services/folder.service.d.ts +1 -0
  88. package/lib/Services/gloww.service.d.ts +5 -0
  89. package/lib/Services/snippets.service.d.ts +16 -0
  90. package/lib/gloww-security/Components/change-password-dlg/change-password-dlg.component.d.ts +4 -4
  91. package/lib/gloww-security/Components/login/login.component.d.ts +8 -8
  92. package/lib/gloww-security/Components/social-network/social-network.component.d.ts +1 -1
  93. package/lib/gloww-security/Components/social-network-dlg/social-network-dlg.component.d.ts +1 -1
  94. package/lib/gloww-security/Components/user-menu/user-menu.component.d.ts +1 -1
  95. package/lib/gloww.module.d.ts +35 -18
  96. package/package.json +13 -9
  97. package/public-api.d.ts +8 -0
  98. package/gloww-assets/.gitkeep +0 -0
@@ -0,0 +1,152 @@
1
+ import { catchError, debounceTime, distinctUntilChanged, filter, map, switchMap, tap } from 'rxjs/operators';
2
+ import { Component, Input, Inject, forwardRef, ViewEncapsulation } from '@angular/core';
3
+ import { UntypedFormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { of } from 'rxjs';
5
+ import { TranslateDefaultParser } from '@ngx-translate/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "@angular/common";
9
+ import * as i3 from "@angular/material/form-field";
10
+ import * as i4 from "@angular/material/input";
11
+ import * as i5 from "@angular/material/core";
12
+ import * as i6 from "@angular/material/autocomplete";
13
+ import * as i7 from "../../Pipes/safe-html.pipe";
14
+ export class AutoCompleteComponent {
15
+ constructor(glowwService, formBuilder, ref) {
16
+ this.formBuilder = formBuilder;
17
+ this.ref = ref;
18
+ this._value = null;
19
+ this.objectName = null;
20
+ this.searchField = null;
21
+ this.returnField = null;
22
+ this.displayField = null;
23
+ this.displayExpr = null;
24
+ this.displayFct = null;
25
+ this.placeHolder = null;
26
+ this.data = null;
27
+ this.onChange = () => { };
28
+ this.onTouched = () => { };
29
+ this.items = [];
30
+ this.parser = new TranslateDefaultParser();
31
+ this.options = []; //Observable<unknown>;
32
+ this.propagateChange = (_) => { };
33
+ this.glowwService = glowwService;
34
+ this.resultCtrl = new UntypedFormControl();
35
+ this.form = this.formBuilder.group({
36
+ __result: this.resultCtrl
37
+ });
38
+ }
39
+ ngAfterViewInit() {
40
+ }
41
+ ngOnInit() {
42
+ //debugger;
43
+ this.searchRequest = this.glowwService[`search${this.objectName}`];
44
+ this.resultCtrl.valueChanges.pipe(filter(res => res != null && res.length > 2), distinctUntilChanged(), debounceTime(250), tap(() => { this.error = ""; this.options = []; }), switchMap(searchStr => {
45
+ let searchObj = {};
46
+ if (this.data) {
47
+ Object.keys(this.data).forEach(k => {
48
+ searchObj[k] = this.data[k];
49
+ });
50
+ }
51
+ searchObj[this.searchField] = searchStr;
52
+ return this.searchRequest.call(this.glowwService, searchObj).pipe(map(res => res), catchError(err => {
53
+ this.error = err.message;
54
+ this.ref.markForCheck();
55
+ return of([]);
56
+ }));
57
+ })).subscribe({
58
+ next: (data) => {
59
+ this.options = data;
60
+ this.ref.markForCheck();
61
+ },
62
+ error: (error) => { this.error = error; }
63
+ });
64
+ }
65
+ writeValue(val) {
66
+ val && this.form.setValue({ __result: val }, { emitEvent: false });
67
+ }
68
+ registerOnChange(fn) {
69
+ this.onChange = fn;
70
+ this.form.valueChanges.subscribe(data => {
71
+ if (this.returnField) {
72
+ this.onChange(this.form.value.__result[this.returnField]);
73
+ }
74
+ else {
75
+ this.onChange(this.form.value.__result);
76
+ }
77
+ });
78
+ }
79
+ registerOnTouched(fn) {
80
+ this.onTouched = fn;
81
+ }
82
+ setDisabledState(isDisabled) {
83
+ const status = isDisabled ? 'disable' : 'enable';
84
+ //TODO
85
+ }
86
+ displayObj(item) {
87
+ if (!item)
88
+ return null;
89
+ console.log("displayOf");
90
+ if (this.displayField) {
91
+ return item[this.displayField];
92
+ }
93
+ else if (this.displayExpr) {
94
+ return this.parser.interpolate(this.displayExpr.replace(/\\\{/g, "{").replace(/\\\}/g, "}"), item);
95
+ //return '?1' + this.parser.interpolate("{{Name}}", { Name: "test" }) + '?2' + this.parser.interpolate("{{Name}}", item)+'?3'+this.parser.interpolate(this.displayExpr.replace(/\\\{/g,"{").replace(/\\\}/g,"}"), item) +'?4'+ item;
96
+ }
97
+ else if (this.displayFct) {
98
+ return this.displayFct(item);
99
+ }
100
+ }
101
+ }
102
+ AutoCompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: AutoCompleteComponent, deps: [{ token: 'glowwService' }, { token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
103
+ AutoCompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: AutoCompleteComponent, selector: "gloww-auto-complete", inputs: { _value: ["value", "_value"], objectName: "objectName", searchField: "searchField", returnField: "returnField", displayField: "displayField", displayExpr: "displayExpr", displayFct: "displayFct", placeHolder: "placeHolder", data: "data", searchRequest: "searchRequest" }, providers: [
104
+ {
105
+ provide: NG_VALUE_ACCESSOR,
106
+ multi: true,
107
+ useExisting: forwardRef(() => AutoCompleteComponent)
108
+ }
109
+ ], ngImport: i0, template: "<div [formGroup]=\"form\" style=\"width:100%\" class=\"mainDiv\">\r\n <div style=\"color:red\">{{error}}</div>\r\n <mat-form-field style=\"width:100%\" class=\"autocff\">\r\n <input type=\"text\" matInput formControlName=\"__result\" [matAutocomplete]=\"auto\" [placeholder]=\"placeHolder\">\r\n </mat-form-field>\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayObj.bind(this)\">\r\n <mat-option *ngFor=\"let option of options\" [value]=\"option\" [innerHTML]=\"displayObj(option) | safeHtml\">\r\n </mat-option>\r\n </mat-autocomplete>\r\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: i7.SafeHtmlPipe, name: "safeHtml" }], encapsulation: i0.ViewEncapsulation.None });
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: AutoCompleteComponent, decorators: [{
111
+ type: Component,
112
+ args: [{ selector: 'gloww-auto-complete', encapsulation: ViewEncapsulation.None, providers: [
113
+ {
114
+ provide: NG_VALUE_ACCESSOR,
115
+ multi: true,
116
+ useExisting: forwardRef(() => AutoCompleteComponent)
117
+ }
118
+ ], template: "<div [formGroup]=\"form\" style=\"width:100%\" class=\"mainDiv\">\r\n <div style=\"color:red\">{{error}}</div>\r\n <mat-form-field style=\"width:100%\" class=\"autocff\">\r\n <input type=\"text\" matInput formControlName=\"__result\" [matAutocomplete]=\"auto\" [placeholder]=\"placeHolder\">\r\n </mat-form-field>\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayObj.bind(this)\">\r\n <mat-option *ngFor=\"let option of options\" [value]=\"option\" [innerHTML]=\"displayObj(option) | safeHtml\">\r\n </mat-option>\r\n </mat-autocomplete>\r\n</div>" }]
119
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
120
+ type: Inject,
121
+ args: ['glowwService']
122
+ }] }, { type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { _value: [{
123
+ type: Input,
124
+ args: ['value']
125
+ }], objectName: [{
126
+ type: Input,
127
+ args: ['objectName']
128
+ }], searchField: [{
129
+ type: Input,
130
+ args: ['searchField']
131
+ }], returnField: [{
132
+ type: Input,
133
+ args: ['returnField']
134
+ }], displayField: [{
135
+ type: Input,
136
+ args: ['displayField']
137
+ }], displayExpr: [{
138
+ type: Input,
139
+ args: ['displayExpr']
140
+ }], displayFct: [{
141
+ type: Input,
142
+ args: ['displayFct']
143
+ }], placeHolder: [{
144
+ type: Input,
145
+ args: ['placeHolder']
146
+ }], data: [{
147
+ type: Input,
148
+ args: ['data']
149
+ }], searchRequest: [{
150
+ type: Input
151
+ }] } });
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nbG93dy9zcmMvbGliL0NvbXBvbmVudHMvYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0csT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWlCLE1BQU0sRUFBcUIsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xJLE9BQU8sRUFBNEMsa0JBQWtCLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkksT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBZTdELE1BQU0sT0FBTyxxQkFBcUI7SUFzQmhDLFlBQW9DLFlBQWlCLEVBQVUsV0FBK0IsRUFBVSxHQUFzQjtRQUEvRCxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXJCOUcsV0FBTSxHQUFRLElBQUksQ0FBQztRQUNkLGVBQVUsR0FBUSxJQUFJLENBQUM7UUFDdEIsZ0JBQVcsR0FBUSxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBUSxJQUFJLENBQUM7UUFDdkIsaUJBQVksR0FBUSxJQUFJLENBQUM7UUFDMUIsZ0JBQVcsR0FB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LFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFDTCxJQUFJO3NCQUFsQixLQUFLO3VCQUFDLE1BQU07Z0JBTUosYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBBZnRlclZpZXdJbml0LCBJbmplY3QsIENoYW5nZURldGVjdG9yUmVmLCBmb3J3YXJkUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVEZWZhdWx0UGFyc2VyIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2dsb3d3LWF1dG8tY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBdXRvQ29tcGxldGVDb21wb25lbnQpXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCd2YWx1ZScpIF92YWx1ZTogYW55ID0gbnVsbDtcclxuICBASW5wdXQoJ29iamVjdE5hbWUnKSBvYmplY3ROYW1lOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgnc2VhcmNoRmllbGQnKSBzZWFyY2hGaWVsZDogYW55ID0gbnVsbDtcclxuICBASW5wdXQoJ3JldHVybkZpZWxkJykgcmV0dXJuRmllbGQ6IGFueSA9IG51bGw7XHJcbiAgQElucHV0KCdkaXNwbGF5RmllbGQnKSBkaXNwbGF5RmllbGQ6IGFueSA9IG51bGw7XHJcbiAgQElucHV0KCdkaXNwbGF5RXhwcicpIGRpc3BsYXlFeHByOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgnZGlzcGxheUZjdCcpIGRpc3BsYXlGY3Q6IGFueSA9IG51bGw7XHJcbiAgQElucHV0KCdwbGFjZUhvbGRlcicpIHBsYWNlSG9sZGVyOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgnZGF0YScpIGRhdGE6IGFueSA9IG51bGw7XHJcbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHsgfTtcclxuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHsgfTtcclxuICBwdWJsaWMgaXRlbXM6IGFueVtdID0gW107XHJcbiAgcHVibGljIGVycm9yOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHNlYXJjaFJlcXVlc3Q6IChvYmo/OiBhbnkpID0+IE9ic2VydmFibGU8W10+O1xyXG5cclxuICBwdWJsaWMgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBnbG93d1NlcnZpY2U6IGFueTtcclxuICByZXN1bHRDdHJsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIHBhcnNlciA9IG5ldyBUcmFuc2xhdGVEZWZhdWx0UGFyc2VyKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2dsb3d3U2VydmljZScpIGdsb3d3U2VydmljZTogYW55LCBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5nbG93d1NlcnZpY2UgPSBnbG93d1NlcnZpY2U7XHJcbiAgICB0aGlzLnJlc3VsdEN0cmwgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgX19yZXN1bHQ6IHRoaXMucmVzdWx0Q3RybFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wdGlvbnM6IGFueVtdID0gW107Ly9PYnNlcnZhYmxlPHVua25vd24+O1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIHRoaXMuc2VhcmNoUmVxdWVzdCA9IHRoaXMuZ2xvd3dTZXJ2aWNlW2BzZWFyY2gke3RoaXMub2JqZWN0TmFtZX1gXTtcclxuICAgIHRoaXMucmVzdWx0Q3RybC52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgZmlsdGVyKHJlcyA9PiByZXMgIT0gbnVsbCAmJiByZXMubGVuZ3RoID4gMiksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgyNTApLFxyXG4gICAgICB0YXAoKCkgPT4geyB0aGlzLmVycm9yID0gXCJcIjsgdGhpcy5vcHRpb25zID0gW107IH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoc2VhcmNoU3RyID0+IHtcclxuICAgICAgICBsZXQgc2VhcmNoT2JqID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhKS5mb3JFYWNoKGsgPT4ge1xyXG4gICAgICAgICAgICBzZWFyY2hPYmpba10gPSB0aGlzLmRhdGFba107XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VhcmNoT2JqW3RoaXMuc2VhcmNoRmllbGRdID0gc2VhcmNoU3RyO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFJlcXVlc3QuY2FsbCh0aGlzLmdsb3d3U2VydmljZSwgc2VhcmNoT2JqKS5waXBlKFxyXG4gICAgICAgICAgbWFwKHJlcyA9PiByZXMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKFxyXG4gICAgICB7XHJcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBkYXRhO1xyXG4gICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7IHRoaXMuZXJyb3IgPSBlcnJvciB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWw6IGFueSk6IHZvaWQge1xyXG4gICAgdmFsICYmIHRoaXMuZm9ybS5zZXRWYWx1ZSh7IF9fcmVzdWx0OiB2YWwgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgaWYgKHRoaXMucmV0dXJuRmllbGQpIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZm9ybS52YWx1ZS5fX3Jlc3VsdFt0aGlzLnJldHVybkZpZWxkXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmZvcm0udmFsdWUuX19yZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXR1cyA9IGlzRGlzYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJztcclxuICAgIC8vVE9ET1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheU9iaihpdGVtKSB7XHJcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xyXG4gICAgY29uc29sZS5sb2coXCJkaXNwbGF5T2ZcIik7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5kaXNwbGF5RmllbGRdO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXlFeHByKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlci5pbnRlcnBvbGF0ZSh0aGlzLmRpc3BsYXlFeHByLnJlcGxhY2UoL1xcXFxcXHsvZywgXCJ7XCIpLnJlcGxhY2UoL1xcXFxcXH0vZywgXCJ9XCIpLCBpdGVtKTtcclxuICAgICAgLy9yZXR1cm4gJz8xJyArIHRoaXMucGFyc2VyLmludGVycG9sYXRlKFwie3tOYW1lfX1cIiwgeyBOYW1lOiBcInRlc3RcIiB9KSArICc/MicgKyB0aGlzLnBhcnNlci5pbnRlcnBvbGF0ZShcInt7TmFtZX19XCIsIGl0ZW0pKyc/MycrdGhpcy5wYXJzZXIuaW50ZXJwb2xhdGUodGhpcy5kaXNwbGF5RXhwci5yZXBsYWNlKC9cXFxcXFx7L2csXCJ7XCIpLnJlcGxhY2UoL1xcXFxcXH0vZyxcIn1cIiksIGl0ZW0pICsnPzQnKyBpdGVtO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXlGY3QpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheUZjdChpdGVtKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgc3R5bGU9XCJ3aWR0aDoxMDAlXCIgY2xhc3M9XCJtYWluRGl2XCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+e3tlcnJvcn19PC9kaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDoxMDAlXCIgY2xhc3M9XCJhdXRvY2ZmXCI+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiX19yZXN1bHRcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiBbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXJcIj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5T2JqLmJpbmQodGhpcylcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCIgW2lubmVySFRNTF09XCJkaXNwbGF5T2JqKG9wdGlvbikgfCBzYWZlSHRtbFwiPlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuPC9kaXY+Il19
@@ -1,13 +1,51 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { CodemirrorComponent } from '@ctrl/ngx-codemirror';
4
+ import prettier from 'node_modules/prettier/esm/standalone.mjs';
5
+ import parserTypescript from 'node_modules/prettier/esm/parser-typescript.mjs';
6
+ import parserBabel from 'node_modules/prettier/esm/parser-babel.mjs';
3
7
  import * as i0 from "@angular/core";
4
- import * as i1 from "@ctrl/ngx-codemirror";
5
- import * as i2 from "@angular/forms";
8
+ import * as i1 from "./../../Services/snippets.service";
9
+ import * as i2 from "../../Services/gloww.service";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/forms";
12
+ import * as i5 from "@angular/material/form-field";
13
+ import * as i6 from "@angular/material/button";
14
+ import * as i7 from "@angular/material/select";
15
+ import * as i8 from "@angular/material/core";
16
+ import * as i9 from "@ctrl/ngx-codemirror";
17
+ import * as i10 from "@angular/flex-layout/flex";
6
18
  export class CodeEditorComponent {
7
- constructor() {
19
+ constructor(snippetsService, glowwService) {
20
+ this.snippetsService = snippetsService;
21
+ this.glowwService = glowwService;
8
22
  this._value = null;
23
+ this.display = null;
24
+ this.mode = "text/typescript";
25
+ this.formatterOptions = { useTabs: true, printWidth: 160 };
9
26
  this.onChange = () => { };
10
27
  this.onTouched = () => { };
28
+ this.resizable = true;
29
+ this.doc = null;
30
+ this.extraKeys = {
31
+ "Alt-K": function (cm) { alert('Alt-K'); cm.blockComment(cm.doc.getCursor('from'), cm.doc.getCursor('to')); /*cm.toggleComment();*/ },
32
+ "Shift-Alt-K": "toggleComment",
33
+ "Alt-N": this.autoFormatSelection.bind(this)
34
+ };
35
+ }
36
+ ngAfterViewInit() {
37
+ console.log(this.codeMirrorComponent);
38
+ console.log(this.codeMirrorComponent.codeMirror);
39
+ this.doc = this.codeMirrorComponent.codeMirror?.getDoc();
40
+ console.log(this.doc);
41
+ if (this.snippetsPath) {
42
+ this.snippetsService.getSnippets(this.snippetsPath.replace("/assets/", this.glowwService.baseHref + "/assets/")).subscribe((snippets) => {
43
+ if (!this.snippets) {
44
+ this.snippets = [];
45
+ }
46
+ snippets.forEach((snippet) => this.snippets.push(snippet));
47
+ });
48
+ }
11
49
  }
12
50
  get value() {
13
51
  return this._value;
@@ -18,7 +56,7 @@ export class CodeEditorComponent {
18
56
  this.onTouched();
19
57
  }
20
58
  writeValue(obj) {
21
- if (typeof (obj) === 'object') {
59
+ if (typeof (obj) === 'object' && obj != null) {
22
60
  this.value = JSON.stringify(obj);
23
61
  }
24
62
  else {
@@ -34,26 +72,84 @@ export class CodeEditorComponent {
34
72
  setDisabledState(isDisabled) {
35
73
  //throw new Error('Method not implemented.');
36
74
  }
75
+ insert() {
76
+ this.doc = this.codeMirrorComponent.codeMirror?.getDoc();
77
+ var cursor = this.doc.getCursor();
78
+ if (this.currentSnippet.code) {
79
+ this.doc.replaceRange(this.currentSnippet.code, cursor);
80
+ }
81
+ if (this.currentSnippet.externfile) {
82
+ this.snippetsService.getSnippetCode(this.currentSnippet.externfile).subscribe((code) => this.doc.replaceRange(code, cursor));
83
+ }
84
+ }
85
+ getSelectedRange(doc) {
86
+ return { from: doc.getCursor('from'), to: doc.getCursor('to') };
87
+ }
88
+ getFormatter() {
89
+ if (this.formatter)
90
+ return this.formatter;
91
+ if (this.mode.match(/typescript/)) {
92
+ return "typescript";
93
+ }
94
+ return null;
95
+ }
96
+ autoFormatSelection(cm) {
97
+ try {
98
+ const formatter = this.getFormatter();
99
+ if (!formatter) {
100
+ alert("no formatter defined for this code");
101
+ return;
102
+ }
103
+ let options = { ...this.formatterOptions };
104
+ options.parser = formatter;
105
+ options.plugins = [parserTypescript, parserBabel];
106
+ cm.doc.setValue(prettier.format(cm.doc.getValue(), options));
107
+ }
108
+ catch (ex) {
109
+ alert(`Unable to format this code, check Syntax`);
110
+ }
111
+ }
37
112
  }
38
- CodeEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: CodeEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
39
- CodeEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: CodeEditorComponent, selector: "gloww-code-editor", inputs: { _value: ["value", "_value"] }, providers: [
113
+ CodeEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: CodeEditorComponent, deps: [{ token: i1.SnippetsService }, { token: i2.GlowwService }], target: i0.ɵɵFactoryTarget.Component });
114
+ CodeEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: CodeEditorComponent, selector: "gloww-code-editor", inputs: { _value: ["value", "_value"], display: "display", mode: "mode", formatter: "formatter", formatterOptions: "formatterOptions", snippets: "snippets", snippetsPath: "snippetsPath" }, providers: [
40
115
  {
41
116
  provide: NG_VALUE_ACCESSOR,
42
117
  multi: true,
43
118
  useExisting: CodeEditorComponent
44
119
  }
45
- ], ngImport: i0, template: "<ngx-codemirror [(ngModel)]=\"value\" [options]=\"{lineNumbers: true,theme: 'eclipse', indentWithTabs:true,indentUnit: 4,matchBrackets: true, mode: 'text/typescript', fixedGutter:false}\">\r\n</ngx-codemirror>\r\n", styles: [".cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat}\n"], components: [{ type: i1.CodemirrorComponent, selector: "ngx-codemirror", inputs: ["className", "name", "autoFocus", "options", "preserveScrollPosition"], outputs: ["cursorActivity", "focusChange", "scroll", "drop"] }], directives: [{ type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: CodeEditorComponent, decorators: [{
120
+ ], viewQueries: [{ propertyName: "codeMirrorComponent", first: true, predicate: CodemirrorComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxFill fxLayoutAlign=\"strech\" class=\"mainDiv\">\r\n <mat-label>{{display}}</mat-label>\r\n <div *ngIf=\"snippets?.length\" fxLayout=\"row\">\r\n <mat-select [(ngModel)]=\"currentSnippet\" fxFlex>\r\n <mat-option *ngFor=\"let snippet of snippets\" [value]=\"snippet\">{{snippet.name}}</mat-option>\r\n </mat-select>\r\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"insert()\">Insert</button>\r\n </div>\r\n\r\n <ngx-codemirror [(ngModel)]=\"value\" [options]=\"{lineNumbers: true,theme: 'eclipse', indentWithTabs:true,indentUnit: 4,matchBrackets: true, mode: mode, fixedGutter:false, extraKeys: extraKeys}\" style=\"width:100%\">\r\n </ngx-codemirror>\r\n</div>", styles: [".CodeMirror{resize:both;padding:0;margin:0}.sameSize{padding:0;margin:0;border:1px solid}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.CodemirrorComponent, selector: "ngx-codemirror", inputs: ["className", "name", "autoFocus", "options", "preserveScrollPosition"], outputs: ["cursorActivity", "focusChange", "scroll", "drop"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i10.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], encapsulation: i0.ViewEncapsulation.None });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: CodeEditorComponent, decorators: [{
47
122
  type: Component,
48
- args: [{ selector: 'gloww-code-editor', providers: [
123
+ args: [{ selector: 'gloww-code-editor', encapsulation: ViewEncapsulation.None, providers: [
49
124
  {
50
125
  provide: NG_VALUE_ACCESSOR,
51
126
  multi: true,
52
127
  useExisting: CodeEditorComponent
53
128
  }
54
- ], template: "<ngx-codemirror [(ngModel)]=\"value\" [options]=\"{lineNumbers: true,theme: 'eclipse', indentWithTabs:true,indentUnit: 4,matchBrackets: true, mode: 'text/typescript', fixedGutter:false}\">\r\n</ngx-codemirror>\r\n", styles: [".cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat}\n"] }]
55
- }], ctorParameters: function () { return []; }, propDecorators: { _value: [{
129
+ ], template: "<div fxLayout=\"column\" fxFill fxLayoutAlign=\"strech\" class=\"mainDiv\">\r\n <mat-label>{{display}}</mat-label>\r\n <div *ngIf=\"snippets?.length\" fxLayout=\"row\">\r\n <mat-select [(ngModel)]=\"currentSnippet\" fxFlex>\r\n <mat-option *ngFor=\"let snippet of snippets\" [value]=\"snippet\">{{snippet.name}}</mat-option>\r\n </mat-select>\r\n <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"insert()\">Insert</button>\r\n </div>\r\n\r\n <ngx-codemirror [(ngModel)]=\"value\" [options]=\"{lineNumbers: true,theme: 'eclipse', indentWithTabs:true,indentUnit: 4,matchBrackets: true, mode: mode, fixedGutter:false, extraKeys: extraKeys}\" style=\"width:100%\">\r\n </ngx-codemirror>\r\n</div>", styles: [".CodeMirror{resize:both;padding:0;margin:0}.sameSize{padding:0;margin:0;border:1px solid}\n"] }]
130
+ }], ctorParameters: function () { return [{ type: i1.SnippetsService }, { type: i2.GlowwService }]; }, propDecorators: { _value: [{
56
131
  type: Input,
57
132
  args: ['value']
133
+ }], display: [{
134
+ type: Input,
135
+ args: ['display']
136
+ }], mode: [{
137
+ type: Input,
138
+ args: ['mode']
139
+ }], formatter: [{
140
+ type: Input,
141
+ args: ['formatter']
142
+ }], formatterOptions: [{
143
+ type: Input,
144
+ args: ['formatterOptions']
145
+ }], snippets: [{
146
+ type: Input,
147
+ args: ['snippets']
148
+ }], snippetsPath: [{
149
+ type: Input,
150
+ args: ['snippetsPath']
151
+ }], codeMirrorComponent: [{
152
+ type: ViewChild,
153
+ args: [CodemirrorComponent]
58
154
  }] } });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2xvd3cvc3JjL2xpYi9Db21wb25lbnRzL2NvZGUtZWRpdG9yL2NvZGUtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFjekUsTUFBTSxPQUFPLG1CQUFtQjtJQUs5QjtRQUpnQixXQUFNLEdBQVEsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVYLENBQUM7SUFHakIsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFRO1FBQ2pCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUNELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELGdCQUFnQixDQUFFLFVBQW1CO1FBQ25DLDZDQUE2QztJQUMvQyxDQUFDOztnSEFoQ1UsbUJBQW1CO29HQUFuQixtQkFBbUIscUZBUm5CO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLG1CQUFtQjtTQUNqQztLQUNGLDBCQ2JILHVOQUVBOzJGRGFhLG1CQUFtQjtrQkFaL0IsU0FBUzsrQkFDRSxtQkFBbUIsYUFHbEI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsS0FBSyxFQUFFLElBQUk7NEJBQ1gsV0FBVyxxQkFBcUI7eUJBQ2pDO3FCQUNGOzBFQUdlLE1BQU07c0JBQXJCLEtBQUs7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2dsb3d3LWNvZGUtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29kZS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvZGUtZWRpdG9yLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB1c2VFeGlzdGluZzogQ29kZUVkaXRvckNvbXBvbmVudFxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvZGVFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQElucHV0KCd2YWx1ZScpIF92YWx1ZTogYW55ID0gbnVsbDtcclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4geyB9O1xyXG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4geyB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuXHJcbiAgZ2V0IHZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWw7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIChvYmopID09PSAnb2JqZWN0Jykge1xyXG4gICAgICB0aGlzLnZhbHVlID0gSlNPTi5zdHJpbmdpZnkob2JqKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBvYmo7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvL3Rocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxuZ3gtY29kZW1pcnJvciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgW29wdGlvbnNdPVwie2xpbmVOdW1iZXJzOiB0cnVlLHRoZW1lOiAnZWNsaXBzZScsIGluZGVudFdpdGhUYWJzOnRydWUsaW5kZW50VW5pdDogNCxtYXRjaEJyYWNrZXRzOiB0cnVlLCBtb2RlOiAndGV4dC90eXBlc2NyaXB0JywgZml4ZWRHdXR0ZXI6ZmFsc2V9XCI+XHJcbjwvbmd4LWNvZGVtaXJyb3I+XHJcbiJdfQ==
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2xvd3cvc3JjL2xpYi9Db21wb25lbnRzL2NvZGUtZWRpdG9yL2NvZGUtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUczRCxPQUFPLFFBQVEsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRSxPQUFPLGdCQUFnQixNQUFNLGlEQUFpRCxDQUFBO0FBQzlFLE9BQU8sV0FBVyxNQUFNLDRDQUE0QyxDQUFBOzs7Ozs7Ozs7Ozs7QUFlcEUsTUFBTSxPQUFPLG1CQUFtQjtJQXNCOUIsWUFBb0IsZUFBZ0MsRUFBVSxZQUEwQjtRQUFwRSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXJCeEUsV0FBTSxHQUFRLElBQUksQ0FBQztRQUNqQixZQUFPLEdBQVcsSUFBSSxDQUFDO1FBQzFCLFNBQUksR0FBUSxpQkFBaUIsQ0FBQztRQUVsQixxQkFBZ0IsR0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBS3ZGLGFBQVEsR0FBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMz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QixFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBRWpELEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7O2dIQXZHVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix5T0FSbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsbUJBQW1CO1NBQ2pDO0tBQ0YsK0VBVVUsbUJBQW1CLGdEQy9CaEMsMnZCQVdNOzJGRFlPLG1CQUFtQjtrQkFiL0IsU0FBUzsrQkFDRSxtQkFBbUIsaUJBR2QsaUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixLQUFLLEVBQUUsSUFBSTs0QkFDWCxXQUFXLHFCQUFxQjt5QkFDakM7cUJBQ0Y7aUlBR2UsTUFBTTtzQkFBckIsS0FBSzt1QkFBQyxPQUFPO2dCQUNJLE9BQU87c0JBQXhCLEtBQUs7dUJBQUMsU0FBUztnQkFDRCxJQUFJO3NCQUFsQixLQUFLO3VCQUFDLE1BQU07Z0JBQ08sU0FBUztzQkFBNUIsS0FBSzt1QkFBQyxXQUFXO2dCQUNTLGdCQUFnQjtzQkFBMUMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBQ04sUUFBUTtzQkFBMUIsS0FBSzt1QkFBQyxVQUFVO2dCQUNNLFlBQVk7c0JBQWxDLEtBQUs7dUJBQUMsY0FBYztnQkFDVyxtQkFBbUI7c0JBQWxELFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU25pcHBldCwgU25pcHBldHNTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9TZXJ2aWNlcy9zbmlwcGV0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29kZW1pcnJvckNvbXBvbmVudCB9IGZyb20gJ0BjdHJsL25neC1jb2RlbWlycm9yJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgeyBHbG93d1NlcnZpY2UgfSBmcm9tICcuLi8uLi9TZXJ2aWNlcy9nbG93dy5zZXJ2aWNlJztcclxuaW1wb3J0IHByZXR0aWVyIGZyb20gJ25vZGVfbW9kdWxlcy9wcmV0dGllci9lc20vc3RhbmRhbG9uZS5tanMnO1xyXG5pbXBvcnQgcGFyc2VyVHlwZXNjcmlwdCBmcm9tICdub2RlX21vZHVsZXMvcHJldHRpZXIvZXNtL3BhcnNlci10eXBlc2NyaXB0Lm1qcydcclxuaW1wb3J0IHBhcnNlckJhYmVsIGZyb20gJ25vZGVfbW9kdWxlcy9wcmV0dGllci9lc20vcGFyc2VyLWJhYmVsLm1qcydcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ2xvd3ctY29kZS1lZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2RlLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29kZS1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBDb2RlRWRpdG9yQ29tcG9uZW50XHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29kZUVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoJ3ZhbHVlJykgX3ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgnZGlzcGxheScpIGRpc3BsYXk6IHN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCdtb2RlJykgbW9kZTogYW55ID0gXCJ0ZXh0L3R5cGVzY3JpcHRcIjtcclxuICBASW5wdXQoJ2Zvcm1hdHRlcicpIGZvcm1hdHRlcj86IHN0cmluZztcclxuICBASW5wdXQoJ2Zvcm1hdHRlck9wdGlvbnMnKSBmb3JtYXR0ZXJPcHRpb25zPzogYW55ID0geyB1c2VUYWJzOiB0cnVlLCBwcmludFdpZHRoOiAxNjAgfTtcclxuICBASW5wdXQoJ3NuaXBwZXRzJykgc25pcHBldHM/OiBTbmlwcGV0W107XHJcbiAgQElucHV0KCdzbmlwcGV0c1BhdGgnKSBzbmlwcGV0c1BhdGg/OiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZChDb2RlbWlycm9yQ29tcG9uZW50KSBjb2RlTWlycm9yQ29tcG9uZW50OiBDb2RlbWlycm9yQ29tcG9uZW50O1xyXG5cclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4geyB9O1xyXG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4geyB9O1xyXG4gIHJlc2l6YWJsZSA9IHRydWU7XHJcblxyXG4gIGN1cnJlbnRTbmlwcGV0PzogU25pcHBldDtcclxuICBkb2M6IGFueSA9IG51bGw7XHJcbiAgZXh0cmFLZXlzID0ge1xyXG4gICAgXCJBbHQtS1wiOiBmdW5jdGlvbihjbSkgeyBhbGVydCgnQWx0LUsnKTsgY20uYmxvY2tDb21tZW50KGNtLmRvYy5nZXRDdXJzb3IoJ2Zyb20nKSwgY20uZG9jLmdldEN1cnNvcigndG8nKSk7LypjbS50b2dnbGVDb21tZW50KCk7Ki8gfSxcclxuICAgIFwiU2hpZnQtQWx0LUtcIjogXCJ0b2dnbGVDb21tZW50XCIsXHJcbiAgICBcIkFsdC1OXCI6IHRoaXMuYXV0b0Zvcm1hdFNlbGVjdGlvbi5iaW5kKHRoaXMpXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzbmlwcGV0c1NlcnZpY2U6IFNuaXBwZXRzU2VydmljZSwgcHJpdmF0ZSBnbG93d1NlcnZpY2U6IEdsb3d3U2VydmljZSkge1xyXG5cclxuICB9XHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5jb2RlTWlycm9yQ29tcG9uZW50KTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY29kZU1pcnJvckNvbXBvbmVudC5jb2RlTWlycm9yKTtcclxuICAgIHRoaXMuZG9jID0gdGhpcy5jb2RlTWlycm9yQ29tcG9uZW50LmNvZGVNaXJyb3I/LmdldERvYygpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5kb2MpO1xyXG4gICAgaWYgKHRoaXMuc25pcHBldHNQYXRoKSB7XHJcbiAgICAgIHRoaXMuc25pcHBldHNTZXJ2aWNlLmdldFNuaXBwZXRzKHRoaXMuc25pcHBldHNQYXRoLnJlcGxhY2UoXCIvYXNzZXRzL1wiLCB0aGlzLmdsb3d3U2VydmljZS5iYXNlSHJlZiArIFwiL2Fzc2V0cy9cIikpLnN1YnNjcmliZSgoc25pcHBldHMpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc25pcHBldHMpIHtcclxuICAgICAgICAgIHRoaXMuc25pcHBldHMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc25pcHBldHMuZm9yRWFjaCgoc25pcHBldCkgPT4gdGhpcy5zbmlwcGV0cy5wdXNoKHNuaXBwZXQpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IHZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWw7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIChvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gSlNPTi5zdHJpbmdpZnkob2JqKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBvYmo7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvL3Rocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcclxuICB9XHJcbiAgaW5zZXJ0KCkge1xyXG4gICAgdGhpcy5kb2MgPSB0aGlzLmNvZGVNaXJyb3JDb21wb25lbnQuY29kZU1pcnJvcj8uZ2V0RG9jKCk7XHJcbiAgICB2YXIgY3Vyc29yID0gdGhpcy5kb2MuZ2V0Q3Vyc29yKCk7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U25pcHBldC5jb2RlKSB7XHJcbiAgICAgIHRoaXMuZG9jLnJlcGxhY2VSYW5nZSh0aGlzLmN1cnJlbnRTbmlwcGV0LmNvZGUsIGN1cnNvcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U25pcHBldC5leHRlcm5maWxlKSB7XHJcbiAgICAgIHRoaXMuc25pcHBldHNTZXJ2aWNlLmdldFNuaXBwZXRDb2RlKHRoaXMuY3VycmVudFNuaXBwZXQuZXh0ZXJuZmlsZSkuc3Vic2NyaWJlKChjb2RlKSA9PiB0aGlzLmRvYy5yZXBsYWNlUmFuZ2UoY29kZSwgY3Vyc29yKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFJhbmdlKGRvYykge1xyXG4gICAgcmV0dXJuIHsgZnJvbTogZG9jLmdldEN1cnNvcignZnJvbScpLCB0bzogZG9jLmdldEN1cnNvcigndG8nKSB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybWF0dGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5mb3JtYXR0ZXIpIHJldHVybiB0aGlzLmZvcm1hdHRlcjtcclxuICAgIGlmICh0aGlzLm1vZGUubWF0Y2goL3R5cGVzY3JpcHQvKSkgeyByZXR1cm4gXCJ0eXBlc2NyaXB0XCI7IH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIGF1dG9Gb3JtYXRTZWxlY3Rpb24oY20pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHRoaXMuZ2V0Rm9ybWF0dGVyKCk7XHJcbiAgICAgIGlmICghZm9ybWF0dGVyKSB7XHJcbiAgICAgICAgYWxlcnQoXCJubyBmb3JtYXR0ZXIgZGVmaW5lZCBmb3IgdGhpcyBjb2RlXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgb3B0aW9uczogYW55ID0geyAuLi50aGlzLmZvcm1hdHRlck9wdGlvbnMgfTtcclxuICAgICAgb3B0aW9ucy5wYXJzZXIgPSBmb3JtYXR0ZXI7XHJcbiAgICAgIG9wdGlvbnMucGx1Z2lucyA9IFtwYXJzZXJUeXBlc2NyaXB0LCBwYXJzZXJCYWJlbF1cclxuXHJcbiAgICAgIGNtLmRvYy5zZXRWYWx1ZShwcmV0dGllci5mb3JtYXQoY20uZG9jLmdldFZhbHVlKCksIG9wdGlvbnMpKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGFsZXJ0KGBVbmFibGUgdG8gZm9ybWF0IHRoaXMgY29kZSwgY2hlY2sgU3ludGF4YCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZpbGwgZnhMYXlvdXRBbGlnbj1cInN0cmVjaFwiIGNsYXNzPVwibWFpbkRpdlwiPlxyXG4gICAgPG1hdC1sYWJlbD57e2Rpc3BsYXl9fTwvbWF0LWxhYmVsPlxyXG4gICAgPGRpdiAqbmdJZj1cInNuaXBwZXRzPy5sZW5ndGhcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiY3VycmVudFNuaXBwZXRcIiBmeEZsZXg+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzbmlwcGV0IG9mIHNuaXBwZXRzXCIgW3ZhbHVlXT1cInNuaXBwZXRcIj57e3NuaXBwZXQubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImluc2VydCgpXCI+SW5zZXJ0PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmd4LWNvZGVtaXJyb3IgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIFtvcHRpb25zXT1cIntsaW5lTnVtYmVyczogdHJ1ZSx0aGVtZTogJ2VjbGlwc2UnLCBpbmRlbnRXaXRoVGFiczp0cnVlLGluZGVudFVuaXQ6IDQsbWF0Y2hCcmFja2V0czogdHJ1ZSwgbW9kZTogbW9kZSwgZml4ZWRHdXR0ZXI6ZmFsc2UsIGV4dHJhS2V5czogZXh0cmFLZXlzfVwiIHN0eWxlPVwid2lkdGg6MTAwJVwiPlxyXG4gICAgPC9uZ3gtY29kZW1pcnJvcj5cclxuPC9kaXY+Il19
@@ -2,8 +2,8 @@ import { Component, Inject } from '@angular/core';
2
2
  import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/material/dialog";
5
- import * as i2 from "@angular/material/button";
6
- import * as i3 from "@angular/common";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/material/button";
7
7
  import * as i4 from "../../Pipes/safe-html.pipe";
8
8
  export class ConfirmationComponent {
9
9
  constructor(dialogRef, data) {
@@ -23,11 +23,11 @@ export class ConfirmationComponent {
23
23
  this.dialogRef.close(false);
24
24
  }
25
25
  }
26
- ConfirmationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfirmationComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
27
- ConfirmationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: ConfirmationComponent, selector: "glw-confirmation", ngImport: i0, template: "<h1 mat-dialog-title>\r\n {{title}}\r\n</h1>\r\n\r\n<div mat-dialog-content>\r\n <p [innerHTML]=\"message | safeHtml\"></p>\r\n</div>\r\n\r\n<mat-dialog-actions *ngIf=\"mode==='confirmation'\">\r\n <button mat-button (click)=\"onDismiss()\">No</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">Yes</button>\r\n</mat-dialog-actions>\r\n<mat-dialog-actions *ngIf=\"mode==='alert'\">\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">OK</button>\r\n</mat-dialog-actions>\r\n", styles: [""], components: [{ type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "safeHtml": i4.SafeHtmlPipe } });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ConfirmationComponent, decorators: [{
26
+ ConfirmationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: ConfirmationComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
27
+ ConfirmationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: ConfirmationComponent, selector: "glw-confirmation", ngImport: i0, template: "<h1 mat-dialog-title>\r\n {{title}}\r\n</h1>\r\n\r\n<div mat-dialog-content>\r\n <p [innerHTML]=\"message | safeHtml\"></p>\r\n</div>\r\n\r\n<mat-dialog-actions *ngIf=\"mode==='confirmation'\">\r\n <button mat-button (click)=\"onDismiss()\">No</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">Yes</button>\r\n</mat-dialog-actions>\r\n<mat-dialog-actions *ngIf=\"mode==='alert'\">\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">OK</button>\r\n</mat-dialog-actions>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "pipe", type: i4.SafeHtmlPipe, name: "safeHtml" }] });
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: ConfirmationComponent, decorators: [{
29
29
  type: Component,
30
- args: [{ selector: 'glw-confirmation', template: "<h1 mat-dialog-title>\r\n {{title}}\r\n</h1>\r\n\r\n<div mat-dialog-content>\r\n <p [innerHTML]=\"message | safeHtml\"></p>\r\n</div>\r\n\r\n<mat-dialog-actions *ngIf=\"mode==='confirmation'\">\r\n <button mat-button (click)=\"onDismiss()\">No</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">Yes</button>\r\n</mat-dialog-actions>\r\n<mat-dialog-actions *ngIf=\"mode==='alert'\">\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">OK</button>\r\n</mat-dialog-actions>\r\n", styles: [""] }]
30
+ args: [{ selector: 'glw-confirmation', template: "<h1 mat-dialog-title>\r\n {{title}}\r\n</h1>\r\n\r\n<div mat-dialog-content>\r\n <p [innerHTML]=\"message | safeHtml\"></p>\r\n</div>\r\n\r\n<mat-dialog-actions *ngIf=\"mode==='confirmation'\">\r\n <button mat-button (click)=\"onDismiss()\">No</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">Yes</button>\r\n</mat-dialog-actions>\r\n<mat-dialog-actions *ngIf=\"mode==='alert'\">\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">OK</button>\r\n</mat-dialog-actions>\r\n" }]
31
31
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: ConfirmationModel, decorators: [{
32
32
  type: Inject,
33
33
  args: [MAT_DIALOG_DATA]
@@ -0,0 +1,84 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import * as moment from 'moment';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@angular/material/form-field";
8
+ import * as i4 from "@angular/material/input";
9
+ import * as i5 from "@angular/material/datepicker";
10
+ import * as i6 from "@angular-material-components/datetime-picker";
11
+ export class DatetimeComponent {
12
+ constructor() {
13
+ this._value = null;
14
+ this.display = null;
15
+ this.placeHolder = null;
16
+ this.mode = 'date';
17
+ this.showSpinners = true;
18
+ this.showSeconds = false;
19
+ this.disableMinute = false;
20
+ this.onChange = () => { };
21
+ this.onTouched = () => { };
22
+ }
23
+ get value() {
24
+ return this._value;
25
+ }
26
+ set value(val) {
27
+ this._value = val;
28
+ let dt = this._value;
29
+ if (typeof (this._value) === 'string') {
30
+ dt = moment(this._value).toISOString();
31
+ }
32
+ this.onChange(dt);
33
+ this.onTouched();
34
+ }
35
+ writeValue(obj) {
36
+ this.value = obj;
37
+ }
38
+ registerOnChange(fn) {
39
+ this.onChange = fn;
40
+ }
41
+ registerOnTouched(fn) {
42
+ this.onTouched = fn;
43
+ }
44
+ setDisabledState(isDisabled) {
45
+ //throw new Error('Method not implemented.');
46
+ }
47
+ }
48
+ DatetimeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: DatetimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
+ DatetimeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.2", type: DatetimeComponent, selector: "gloww-datetime", inputs: { _value: ["value", "_value"], display: "display", placeHolder: "placeHolder", mode: "mode", showSpinners: "showSpinners", showSeconds: "showSeconds", disableMinute: "disableMinute" }, providers: [
50
+ {
51
+ provide: NG_VALUE_ACCESSOR,
52
+ multi: true,
53
+ useExisting: DatetimeComponent
54
+ }
55
+ ], ngImport: i0, template: "<div style=\"width:100%\">\r\n <mat-form-field *ngIf=\"mode==='date'\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput [matDatepicker]=\"picker\" [placeholder]=\"placeHolder\" [(ngModel)]=\"value\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"mode==='datetime'\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput [ngxMatDatetimePicker]=\"pickerDT\" [placeholder]=\"placeHolder\" [(ngModel)]=\"value\">\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(pickerDT)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker #pickerDT [showSpinners]=\"showSpinners\" [showSeconds]=\"showSeconds\" [touchUi]=\"true\" [disableMinute]=\"disableMinute\">\r\n </ngx-mat-datetime-picker>\r\n </mat-form-field>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i6.NgxMatDatetimePicker, selector: "ngx-mat-datetime-picker", inputs: ["calendarHeaderComponent", "startAt", "startView", "defaultColor", "color", "touchUi", "hideTime", "disabled", "panelClass", "dateClass", "opened", "showSpinners", "showSeconds", "stepHour", "stepMinute", "stepSecond", "enableMeridian", "disableMinute", "defaultTime"], outputs: ["yearSelected", "monthSelected", "opened", "closed"], exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i6.NgxMatDatetimeInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "ngxMatDatetimePickerFilter", "value", "min", "max", "disabled"], outputs: ["dateChange", "dateInput"], exportAs: ["ngxMatDatetimePickerInput"] }] });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.2", ngImport: i0, type: DatetimeComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'gloww-datetime', providers: [
59
+ {
60
+ provide: NG_VALUE_ACCESSOR,
61
+ multi: true,
62
+ useExisting: DatetimeComponent
63
+ }
64
+ ], template: "<div style=\"width:100%\">\r\n <mat-form-field *ngIf=\"mode==='date'\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput [matDatepicker]=\"picker\" [placeholder]=\"placeHolder\" [(ngModel)]=\"value\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"mode==='datetime'\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput [ngxMatDatetimePicker]=\"pickerDT\" [placeholder]=\"placeHolder\" [(ngModel)]=\"value\">\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(pickerDT)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker #pickerDT [showSpinners]=\"showSpinners\" [showSeconds]=\"showSeconds\" [touchUi]=\"true\" [disableMinute]=\"disableMinute\">\r\n </ngx-mat-datetime-picker>\r\n </mat-form-field>\r\n</div>\r\n" }]
65
+ }], ctorParameters: function () { return []; }, propDecorators: { _value: [{
66
+ type: Input,
67
+ args: ['value']
68
+ }], display: [{
69
+ type: Input,
70
+ args: ['display']
71
+ }], placeHolder: [{
72
+ type: Input,
73
+ args: ['placeHolder']
74
+ }], mode: [{
75
+ type: Input,
76
+ args: ['mode']
77
+ }], showSpinners: [{
78
+ type: Input
79
+ }], showSeconds: [{
80
+ type: Input
81
+ }], disableMinute: [{
82
+ type: Input
83
+ }] } });
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2xvd3cvc3JjL2xpYi9Db21wb25lbnRzL2RhdGV0aW1lL2RhdGV0aW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dsb3d3L3NyYy9saWIvQ29tcG9uZW50cy9kYXRldGltZS9kYXRldGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7O0FBY2pDLE1BQU0sT0FBTyxpQkFBaUI7SUFZNUI7UUFYZ0IsV0FBTSxHQUFRLElBQUksQ0FBQztRQUNqQixZQUFPLEdBQVEsSUFBSSxDQUFDO1FBQ2hCLGdCQUFXLEdBQVEsSUFBSSxDQUFDO1FBQy9CLFNBQUksR0FBVyxNQUFNLENBQUM7UUFDNUIsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFDN0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFeEMsYUFBUSxHQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRVgsQ0FBQztJQUdqQixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEdBQUc7UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDckMsRUFBRSxHQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFRO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyw2Q0FBNkM7SUFDL0MsQ0FBQzs7OEdBeENVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBPQVJqQjtRQUNUO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxpQkFBaUI7U0FDL0I7S0FDRiwwQkNkSCxnN0JBZ0JBOzJGREFhLGlCQUFpQjtrQkFaN0IsU0FBUzsrQkFDRSxnQkFBZ0IsYUFHZjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixLQUFLLEVBQUUsSUFBSTs0QkFDWCxXQUFXLG1CQUFtQjt5QkFDL0I7cUJBQ0Y7MEVBR2UsTUFBTTtzQkFBckIsS0FBSzt1QkFBQyxPQUFPO2dCQUNJLE9BQU87c0JBQXhCLEtBQUs7dUJBQUMsU0FBUztnQkFDTSxXQUFXO3NCQUFoQyxLQUFLO3VCQUFDLGFBQWE7Z0JBQ0wsSUFBSTtzQkFBbEIsS0FBSzt1QkFBQyxNQUFNO2dCQUNKLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2dsb3d3LWRhdGV0aW1lJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXRpbWUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGV0aW1lLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgICAgdXNlRXhpc3Rpbmc6IERhdGV0aW1lQ29tcG9uZW50XHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQElucHV0KCd2YWx1ZScpIF92YWx1ZTogYW55ID0gbnVsbDtcclxuICBASW5wdXQoJ2Rpc3BsYXknKSBkaXNwbGF5OiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgncGxhY2VIb2xkZXInKSBwbGFjZUhvbGRlcjogYW55ID0gbnVsbDtcclxuICBASW5wdXQoJ21vZGUnKSBtb2RlOiBzdHJpbmcgPSAnZGF0ZSc7XHJcbiAgQElucHV0KCkgc2hvd1NwaW5uZXJzOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93U2Vjb25kczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVNaW51dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHsgfTtcclxuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHsgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcblxyXG4gIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZSh2YWwpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xyXG4gICAgbGV0IGR0ID0gdGhpcy5fdmFsdWU7XHJcbiAgICBpZiAodHlwZW9mICh0aGlzLl92YWx1ZSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGR0ID0gKG1vbWVudCh0aGlzLl92YWx1ZSkgYXMgbW9tZW50Lk1vbWVudCkudG9JU09TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMub25DaGFuZ2UoZHQpO1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvL3Rocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBzdHlsZT1cIndpZHRoOjEwMCVcIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIm1vZGU9PT0nZGF0ZSdcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7ZGlzcGxheX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlclwiIFsobmdNb2RlbCldPVwidmFsdWVcIj5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIm1vZGU9PT0nZGF0ZXRpbWUnXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD57e2Rpc3BsYXl9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbmd4TWF0RGF0ZXRpbWVQaWNrZXJdPVwicGlja2VyRFRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXJcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCI+XHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCIkYW55KHBpY2tlckRUKVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgIDxuZ3gtbWF0LWRhdGV0aW1lLXBpY2tlciAjcGlja2VyRFQgW3Nob3dTcGlubmVyc109XCJzaG93U3Bpbm5lcnNcIiBbc2hvd1NlY29uZHNdPVwic2hvd1NlY29uZHNcIiBbdG91Y2hVaV09XCJ0cnVlXCIgW2Rpc2FibGVNaW51dGVdPVwiZGlzYWJsZU1pbnV0ZVwiPlxyXG4gICAgICAgIDwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG48L2Rpdj5cclxuIl19