@ajf/material 18.1.1 → 18.1.3

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 (52) hide show
  1. package/audio/index.d.ts +22 -0
  2. package/audio/src/audio-module.d.ts +12 -0
  3. package/audio/src/audio.d.ts +41 -0
  4. package/audio/src/public_api.d.ts +23 -0
  5. package/esm2022/audio/ajf-material-audio.mjs +5 -0
  6. package/esm2022/audio/index.mjs +23 -0
  7. package/esm2022/audio/src/audio-module.mjs +43 -0
  8. package/esm2022/audio/src/audio.mjs +122 -0
  9. package/esm2022/audio/src/public_api.mjs +24 -0
  10. package/esm2022/form-builder/choices-origin-editor-dialog.mjs +29 -4
  11. package/esm2022/form-builder/choices-origin-editor.mjs +16 -3
  12. package/esm2022/form-builder/form-builder-service.mjs +6 -1
  13. package/esm2022/form-builder/form-builder.mjs +40 -7
  14. package/esm2022/form-builder/node-entry.mjs +4 -4
  15. package/esm2022/form-builder/node-properties.mjs +5 -4
  16. package/esm2022/forms/audio-field.mjs +44 -0
  17. package/esm2022/forms/display-field.mjs +49 -0
  18. package/esm2022/forms/field-service.mjs +9 -3
  19. package/esm2022/forms/form.mjs +10 -4
  20. package/esm2022/forms/forms-module.mjs +20 -6
  21. package/esm2022/forms/multiple-choice-field.mjs +41 -28
  22. package/esm2022/forms/range-field.mjs +15 -7
  23. package/esm2022/forms/single-choice-field.mjs +40 -27
  24. package/esm2022/forms/text-field.mjs +27 -9
  25. package/esm2022/signature/signature.mjs +48 -16
  26. package/esm2022/time/time-module.mjs +6 -4
  27. package/esm2022/time/time.mjs +10 -6
  28. package/fesm2022/ajf-material-audio.mjs +212 -0
  29. package/fesm2022/ajf-material-audio.mjs.map +1 -0
  30. package/fesm2022/ajf-material-form-builder.mjs +94 -17
  31. package/fesm2022/ajf-material-form-builder.mjs.map +1 -1
  32. package/fesm2022/ajf-material-forms.mjs +232 -82
  33. package/fesm2022/ajf-material-forms.mjs.map +1 -1
  34. package/fesm2022/ajf-material-signature.mjs +47 -15
  35. package/fesm2022/ajf-material-signature.mjs.map +1 -1
  36. package/fesm2022/ajf-material-time.mjs +14 -8
  37. package/fesm2022/ajf-material-time.mjs.map +1 -1
  38. package/form-builder/choices-origin-editor-dialog.d.ts +3 -0
  39. package/form-builder/choices-origin-editor.d.ts +4 -1
  40. package/form-builder/form-builder.d.ts +5 -2
  41. package/forms/audio-field.d.ts +30 -0
  42. package/forms/display-field.d.ts +35 -0
  43. package/forms/form.d.ts +2 -1
  44. package/forms/forms-module.d.ts +52 -48
  45. package/forms/multiple-choice-field.d.ts +12 -7
  46. package/forms/range-field.d.ts +1 -0
  47. package/forms/single-choice-field.d.ts +12 -7
  48. package/forms/text-field.d.ts +8 -2
  49. package/package.json +8 -2
  50. package/signature/signature.d.ts +13 -1
  51. package/time/time-module.d.ts +6 -4
  52. package/time/time.d.ts +2 -0
@@ -24,23 +24,41 @@ import { ChangeDetectionStrategy, Component, Inject, ViewEncapsulation, } from '
24
24
  import * as i0 from "@angular/core";
25
25
  import * as i1 from "@ajf/core/forms";
26
26
  import * as i2 from "@angular/common";
27
- import * as i3 from "@angular/material/form-field";
28
- import * as i4 from "@angular/material/input";
29
- import * as i5 from "@angular/cdk/text-field";
30
- import * as i6 from "@angular/forms";
31
- import * as i7 from "./warning-alert-service";
27
+ import * as i3 from "@angular/forms";
28
+ import * as i4 from "ngx-quill";
29
+ import * as i5 from "./warning-alert-service";
32
30
  export class AjfTextFieldComponent extends CoreComponent {
33
31
  constructor(cdr, service, was) {
34
32
  super(cdr, service, was);
33
+ this.quillModules = {
34
+ toolbar: [
35
+ ['bold', 'italic', 'underline'],
36
+ [{ 'list': 'ordered' }, { 'list': 'bullet' }],
37
+ ['clean'],
38
+ ],
39
+ };
40
+ }
41
+ ngOnInit() {
42
+ super.ngOnInit();
43
+ if (this.control) {
44
+ this.control.subscribe(ctrl => {
45
+ if (ctrl && typeof ctrl.value === 'string') {
46
+ const converted = ctrl.value.replace(/\r\n|\r|\n/g, '<br>');
47
+ if (converted !== ctrl.value) {
48
+ ctrl.setValue(converted, { emitEvent: false });
49
+ }
50
+ }
51
+ });
52
+ }
35
53
  }
36
54
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTextFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AjfFormRendererService }, { token: AJF_WARNING_ALERT_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
37
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTextFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<mat-form-field *ngIf=\"control|async as ctrl\">\n <textarea matInput cdkTextareaAutosize [formControl]=\"ctrl!\"></textarea>\n</mat-form-field>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], 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: "directive", type: i5.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
55
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTextFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<quill-editor *ngIf=\"control | async as ctrl\" [formControl]=\"ctrl!\" [modules]=\"quillModules\" class=\"resizable-quill\"\n placeholder=\"\">\n</quill-editor>", styles: [".resizable-quill{display:block;width:100%;max-width:800px}.resizable-quill .ql-toolbar{background-color:var(--mdc-filled-text-field-container-color, var(--mat-app-surface-variant))}.resizable-quill .ql-editor{min-height:11.36em;max-height:35.5em;overflow-y:auto;resize:vertical;font-size:var(--mat-form-field-container-text-size, var(--mat-app-body-large-size))}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.QuillEditorComponent, selector: "quill-editor" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
38
56
  }
39
57
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTextFieldComponent, decorators: [{
40
58
  type: Component,
41
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<mat-form-field *ngIf=\"control|async as ctrl\">\n <textarea matInput cdkTextareaAutosize [formControl]=\"ctrl!\"></textarea>\n</mat-form-field>\n" }]
42
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AjfFormRendererService }, { type: i7.AjfWarningAlertService, decorators: [{
59
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<quill-editor *ngIf=\"control | async as ctrl\" [formControl]=\"ctrl!\" [modules]=\"quillModules\" class=\"resizable-quill\"\n placeholder=\"\">\n</quill-editor>", styles: [".resizable-quill{display:block;width:100%;max-width:800px}.resizable-quill .ql-toolbar{background-color:var(--mdc-filled-text-field-container-color, var(--mat-app-surface-variant))}.resizable-quill .ql-editor{min-height:11.36em;max-height:35.5em;overflow-y:auto;resize:vertical;font-size:var(--mat-form-field-container-text-size, var(--mat-app-body-large-size))}\n"] }]
60
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AjfFormRendererService }, { type: i5.AjfWarningAlertService, decorators: [{
43
61
  type: Inject,
44
62
  args: [AJF_WARNING_ALERT_SERVICE]
45
63
  }] }] });
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy90ZXh0LWZpZWxkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3RleHQtZmllbGQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wseUJBQXlCLEVBRXpCLHNCQUFzQixJQUFJLGFBQWEsR0FDeEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFVdkIsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGFBQWE7SUFDdEQsWUFDRSxHQUFzQixFQUN0QixPQUErQixFQUNJLEdBQTJCO1FBRTlELEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBUFUscUJBQXFCLHlGQUl0Qix5QkFBeUI7bUdBSnhCLHFCQUFxQiwyRUMzQ2xDLHFKQUdBOzs0RkR3Q2EscUJBQXFCO2tCQU5qQyxTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OzBCQU1sQyxNQUFNOzJCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQUpGX1dBUk5JTkdfQUxFUlRfU0VSVklDRSxcbiAgQWpmRm9ybVJlbmRlcmVyU2VydmljZSxcbiAgQWpmSW5wdXRGaWVsZENvbXBvbmVudCBhcyBDb3JlQ29tcG9uZW50LFxufSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0FqZldhcm5pbmdBbGVydFNlcnZpY2V9IGZyb20gJy4vd2FybmluZy1hbGVydC1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAndGV4dC1maWVsZC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RleHQtZmllbGQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmVGV4dEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgQ29yZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgc2VydmljZTogQWpmRm9ybVJlbmRlcmVyU2VydmljZSxcbiAgICBASW5qZWN0KEFKRl9XQVJOSU5HX0FMRVJUX1NFUlZJQ0UpIHdhczogQWpmV2FybmluZ0FsZXJ0U2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoY2RyLCBzZXJ2aWNlLCB3YXMpO1xuICB9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJjb250cm9sfGFzeW5jIGFzIGN0cmxcIj5cbiAgPHRleHRhcmVhIG1hdElucHV0IGNka1RleHRhcmVhQXV0b3NpemUgW2Zvcm1Db250cm9sXT1cImN0cmwhXCI+PC90ZXh0YXJlYT5cbjwvbWF0LWZvcm0tZmllbGQ+XG4iXX0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy90ZXh0LWZpZWxkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3RleHQtZmllbGQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wseUJBQXlCLEVBRXpCLHNCQUFzQixJQUFJLGFBQWEsR0FDeEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBVXZCLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxhQUFhO0lBU3RELFlBQ0UsR0FBc0IsRUFDdEIsT0FBK0IsRUFDSSxHQUEyQjtRQUU5RCxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQWIzQixpQkFBWSxHQUFHO1lBQ2IsT0FBTyxFQUFFO2dCQUNQLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7Z0JBQy9CLENBQUMsRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUM7Z0JBQ3pDLENBQUMsT0FBTyxDQUFDO2FBQ1Y7U0FDRixDQUFDO0lBUUYsQ0FBQztJQUVRLFFBQVE7UUFDZixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUM1RCxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7b0JBQy9DLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7K0dBN0JVLHFCQUFxQix5RkFZdEIseUJBQXlCO21HQVp4QixxQkFBcUIsMkVDNUNsQyxzS0FFZTs7NEZEMENGLHFCQUFxQjtrQkFOakMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJOzswQkFjbEMsTUFBTTsyQkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7XG4gIEFKRl9XQVJOSU5HX0FMRVJUX1NFUlZJQ0UsXG4gIEFqZkZvcm1SZW5kZXJlclNlcnZpY2UsXG4gIEFqZklucHV0RmllbGRDb21wb25lbnQgYXMgQ29yZUNvbXBvbmVudCxcbn0gZnJvbSAnQGFqZi9jb3JlL2Zvcm1zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0FqZldhcm5pbmdBbGVydFNlcnZpY2V9IGZyb20gJy4vd2FybmluZy1hbGVydC1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAndGV4dC1maWVsZC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RleHQtZmllbGQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmVGV4dEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgQ29yZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHF1aWxsTW9kdWxlcyA9IHtcbiAgICB0b29sYmFyOiBbXG4gICAgICBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZSddLFxuICAgICAgW3snbGlzdCc6ICdvcmRlcmVkJ30sIHsnbGlzdCc6ICdidWxsZXQnfV0sXG4gICAgICBbJ2NsZWFuJ10sXG4gICAgXSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHNlcnZpY2U6IEFqZkZvcm1SZW5kZXJlclNlcnZpY2UsXG4gICAgQEluamVjdChBSkZfV0FSTklOR19BTEVSVF9TRVJWSUNFKSB3YXM6IEFqZldhcm5pbmdBbGVydFNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKGNkciwgc2VydmljZSwgd2FzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnN1YnNjcmliZShjdHJsID0+IHtcbiAgICAgICAgaWYgKGN0cmwgJiYgdHlwZW9mIGN0cmwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgY29udmVydGVkID0gY3RybC52YWx1ZS5yZXBsYWNlKC9cXHJcXG58XFxyfFxcbi9nLCAnPGJyPicpO1xuICAgICAgICAgIGlmIChjb252ZXJ0ZWQgIT09IGN0cmwudmFsdWUpIHtcbiAgICAgICAgICAgIGN0cmwuc2V0VmFsdWUoY29udmVydGVkLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8cXVpbGwtZWRpdG9yICpuZ0lmPVwiY29udHJvbCB8IGFzeW5jIGFzIGN0cmxcIiBbZm9ybUNvbnRyb2xdPVwiY3RybCFcIiBbbW9kdWxlc109XCJxdWlsbE1vZHVsZXNcIiBjbGFzcz1cInJlc2l6YWJsZS1xdWlsbFwiXG4gICAgcGxhY2Vob2xkZXI9XCJcIj5cbjwvcXVpbGwtZWRpdG9yPiJdfQ==
@@ -23,9 +23,10 @@ import { AjfSignature } from '@ajf/core/signature';
23
23
  import { ChangeDetectionStrategy, Component, forwardRef, ViewEncapsulation, } from '@angular/core';
24
24
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
25
25
  import * as i0 from "@angular/core";
26
- import * as i1 from "@angular/material/button";
27
- import * as i2 from "@angular/material/icon";
28
- import * as i3 from "@ngneat/transloco";
26
+ import * as i1 from "@angular/platform-browser";
27
+ import * as i2 from "@angular/material/button";
28
+ import * as i3 from "@angular/material/icon";
29
+ import * as i4 from "@ngneat/transloco";
29
30
  export const SIGNATURE_CONTROL_VALUE_ACCESSOR = {
30
31
  provide: NG_VALUE_ACCESSOR,
31
32
  useExisting: forwardRef(() => AjfSignatureComponent),
@@ -35,43 +36,74 @@ export const SIGNATURE_CONTROL_VALUE_ACCESSOR = {
35
36
  * Ajf signature component.
36
37
  */
37
38
  export class AjfSignatureComponent extends AjfSignature {
38
- constructor(cdr, renderer) {
39
+ constructor(cdr, renderer, _sanitizer) {
39
40
  super(cdr, renderer);
41
+ this._sanitizer = _sanitizer;
40
42
  }
41
43
  ngAfterViewInit() {
42
44
  this.sigPadElement = this.sigPad.nativeElement;
43
45
  this.context = this.sigPadElement?.getContext('2d') ?? null;
44
46
  }
47
+ /**
48
+ * Clears the signature value and preview (keeps the old url to delete old signature from storage)
49
+ */
45
50
  clear() {
46
51
  if (this.context != null && this.sigPadElement != null) {
47
52
  this.context.clearRect(0, 0, this.sigPadElement.width, this.sigPadElement.height);
48
53
  this.context.beginPath();
49
54
  }
50
55
  this.isDrawn = false;
51
- this.value = null;
56
+ this.value = {
57
+ name: 'signature.webp',
58
+ type: 'image/webp',
59
+ signature: true,
60
+ size: undefined,
61
+ content: undefined,
62
+ url: this.value?.url ?? undefined,
63
+ deleteUrl: true,
64
+ };
52
65
  }
66
+ /**
67
+ * Accepts the new signature from the canvas and sets it as field value (keeps the old url to delete old signature from storage)
68
+ */
53
69
  accept() {
54
70
  if (this.sigPadElement != null) {
55
- const signaturDataUrl = this.sigPadElement.toDataURL('image/png');
56
- const head = 'data:image/png;base64,';
57
- const imgFileSize = Math.round(((signaturDataUrl.length - head.length) * 3) / 4).toString();
71
+ const signatureDataUrl = this.sigPadElement.toDataURL('image/webp', 0.5);
72
+ const head = 'data:image/webp;base64,';
73
+ const imgFileSize = Math.round(((signatureDataUrl.length - head.length) * 3) / 4);
58
74
  this.value = {
59
- name: 'signature.png',
60
- type: 'image/png',
75
+ name: 'signature.webp',
76
+ type: 'image/webp',
61
77
  signature: true,
62
78
  size: imgFileSize,
63
- content: signaturDataUrl,
79
+ content: signatureDataUrl,
80
+ url: this.value?.url ?? undefined,
81
+ deleteUrl: false,
64
82
  };
65
83
  }
66
84
  }
85
+ /**
86
+ * Sanitizes signature image url
87
+ */
88
+ get safeImageSrc() {
89
+ if (!this.value)
90
+ return null;
91
+ if (!this.value.content && this.value.deleteUrl)
92
+ return null;
93
+ const rawUrl = this.value.content && this.value.content.length ? this.value.content : this.value.url;
94
+ if (!rawUrl)
95
+ return null;
96
+ const sanitizedUrl = this._sanitizer.bypassSecurityTrustUrl(rawUrl);
97
+ return sanitizedUrl;
98
+ }
67
99
  ngOnDestroy() {
68
100
  return;
69
101
  }
70
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSignatureComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfSignatureComponent, selector: "ajf-signature", providers: [SIGNATURE_CONTROL_VALUE_ACCESSOR], usesInheritance: true, ngImport: i0, template: "<div class=\"ajf-signature-container\">\n <p class=\"ajf-signature-text\">{{'Please sign here'|transloco}}</p>\n <canvas\n class=\"ajf-signature-canvas\"\n #sigPad\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\"\n (touchmove)=\"onMouseMove($event)\"\n ></canvas>\n <div class=\"ajf-signature-actions\">\n <button mat-fab (click)=\"clear()\" class=\"ajf-signature-action-clear\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-fab (click)=\"accept()\" color=\"primary\" [disabled]=\"!isDrawn\" class=\"ajf-signature-action-accept\">\n <mat-icon>check</mat-icon>\n </button>\n </div>\n\n <img class=\"ajf-signature-preview\" [src]=\"value?.content\" />\n</div>\n", styles: ["ajf-signature{display:block}ajf-signature .ajf-signature-container{width:100%;display:flex;flex-flow:column wrap;justify-content:center;align-items:center}ajf-signature .ajf-signature-container .ajf-signature-preview{max-width:200px;max-height:100px;margin:auto;padding:5px}ajf-signature .ajf-signature-container .ajf-signature-canvas{margin:auto;border-radius:10px;border:2px solid rgba(0,0,0,.4)}ajf-signature .ajf-signature-container .ajf-signature-actions{flex:1 0 auto;display:flex;flex-flow:row wrap;justify-content:space-around}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab{margin:10px}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab .mat-icon{margin-left:0!important}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-clear{background-color:#f53d3d99}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept{background-color:#32db6499}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept[disabled=true]{background-color:#0000001f;color:#00000061}\n"], dependencies: [{ kind: "component", type: i1.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
102
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSignatureComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
103
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfSignatureComponent, selector: "ajf-signature", providers: [SIGNATURE_CONTROL_VALUE_ACCESSOR], usesInheritance: true, ngImport: i0, template: "<div class=\"ajf-signature-container\">\n <p class=\"ajf-signature-text\">{{'Please sign here'|transloco}}</p>\n <canvas\n class=\"ajf-signature-canvas\"\n #sigPad\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\"\n (touchmove)=\"onMouseMove($event)\"\n ></canvas>\n <div class=\"ajf-signature-actions\">\n <button mat-fab (click)=\"clear()\" class=\"ajf-signature-action-clear\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-fab (click)=\"accept()\" color=\"primary\" [disabled]=\"!isDrawn\" class=\"ajf-signature-action-accept\">\n <mat-icon>check</mat-icon>\n </button>\n </div>\n\n <img class=\"ajf-signature-preview\" [src]=\"safeImageSrc\" />\n</div>\n", styles: ["ajf-signature{display:block}ajf-signature .ajf-signature-container{width:100%;display:flex;flex-flow:column wrap;justify-content:center;align-items:center}ajf-signature .ajf-signature-container .ajf-signature-preview{max-width:200px;max-height:100px;margin:auto;padding:5px}ajf-signature .ajf-signature-container .ajf-signature-canvas{margin:auto;border-radius:10px;border:2px solid rgba(0,0,0,.4)}ajf-signature .ajf-signature-container .ajf-signature-actions{flex:1 0 auto;display:flex;flex-flow:row wrap;justify-content:space-around}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab{margin:10px}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab .mat-icon{margin-left:0!important}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-clear{background-color:#f53d3d99}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept{background-color:#32db6499}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept[disabled=true]{background-color:#0000001f;color:#00000061}\n"], dependencies: [{ kind: "component", type: i2.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
72
104
  }
73
105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSignatureComponent, decorators: [{
74
106
  type: Component,
75
- args: [{ selector: 'ajf-signature', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [SIGNATURE_CONTROL_VALUE_ACCESSOR], template: "<div class=\"ajf-signature-container\">\n <p class=\"ajf-signature-text\">{{'Please sign here'|transloco}}</p>\n <canvas\n class=\"ajf-signature-canvas\"\n #sigPad\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\"\n (touchmove)=\"onMouseMove($event)\"\n ></canvas>\n <div class=\"ajf-signature-actions\">\n <button mat-fab (click)=\"clear()\" class=\"ajf-signature-action-clear\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-fab (click)=\"accept()\" color=\"primary\" [disabled]=\"!isDrawn\" class=\"ajf-signature-action-accept\">\n <mat-icon>check</mat-icon>\n </button>\n </div>\n\n <img class=\"ajf-signature-preview\" [src]=\"value?.content\" />\n</div>\n", styles: ["ajf-signature{display:block}ajf-signature .ajf-signature-container{width:100%;display:flex;flex-flow:column wrap;justify-content:center;align-items:center}ajf-signature .ajf-signature-container .ajf-signature-preview{max-width:200px;max-height:100px;margin:auto;padding:5px}ajf-signature .ajf-signature-container .ajf-signature-canvas{margin:auto;border-radius:10px;border:2px solid rgba(0,0,0,.4)}ajf-signature .ajf-signature-container .ajf-signature-actions{flex:1 0 auto;display:flex;flex-flow:row wrap;justify-content:space-around}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab{margin:10px}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab .mat-icon{margin-left:0!important}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-clear{background-color:#f53d3d99}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept{background-color:#32db6499}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept[disabled=true]{background-color:#0000001f;color:#00000061}\n"] }]
76
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }] });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvc2lnbmF0dXJlL3NyYy9zaWduYXR1cmUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9zaWduYXR1cmUvc3JjL3NpZ25hdHVyZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUVqRCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBUTtJQUNuRCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7SUFDcEQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUY7O0dBRUc7QUFTSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsWUFBWTtJQUNyRCxZQUFZLEdBQXNCLEVBQUUsUUFBbUI7UUFDckQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLHdCQUF3QixDQUFDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVGLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxXQUFXO2dCQUNqQixTQUFTLEVBQUUsSUFBSTtnQkFDZixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLGVBQWU7YUFDekIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU87SUFDVCxDQUFDOytHQXBDVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix3Q0FGckIsQ0FBQyxnQ0FBZ0MsQ0FBQyxpRENsRC9DLCt3QkFxQkE7OzRGRCtCYSxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7QWpmU2lnbmF0dXJlfSBmcm9tICdAYWpmL2NvcmUvc2lnbmF0dXJlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFqZlNpZ25hdHVyZUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBamYgc2lnbmF0dXJlIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXNpZ25hdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnc2lnbmF0dXJlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2lnbmF0dXJlLnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1NJR05BVFVSRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmU2lnbmF0dXJlQ29tcG9uZW50IGV4dGVuZHMgQWpmU2lnbmF0dXJlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHN1cGVyKGNkciwgcmVuZGVyZXIpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2lnUGFkRWxlbWVudCA9IHRoaXMuc2lnUGFkLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5zaWdQYWRFbGVtZW50Py5nZXRDb250ZXh0KCcyZCcpID8/IG51bGw7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jb250ZXh0ICE9IG51bGwgJiYgdGhpcy5zaWdQYWRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaWdQYWRFbGVtZW50LndpZHRoLCB0aGlzLnNpZ1BhZEVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgdGhpcy5pc0RyYXduID0gZmFsc2U7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBhY2NlcHQoKSB7XG4gICAgaWYgKHRoaXMuc2lnUGFkRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzaWduYXR1ckRhdGFVcmwgPSB0aGlzLnNpZ1BhZEVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGNvbnN0IGhlYWQgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCc7XG4gICAgICBjb25zdCBpbWdGaWxlU2l6ZSA9IE1hdGgucm91bmQoKChzaWduYXR1ckRhdGFVcmwubGVuZ3RoIC0gaGVhZC5sZW5ndGgpICogMykgLyA0KS50b1N0cmluZygpO1xuICAgICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgICAgbmFtZTogJ3NpZ25hdHVyZS5wbmcnLFxuICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgc2lnbmF0dXJlOiB0cnVlLFxuICAgICAgICBzaXplOiBpbWdGaWxlU2l6ZSxcbiAgICAgICAgY29udGVudDogc2lnbmF0dXJEYXRhVXJsLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNvbnRhaW5lclwiPlxuICA8cCBjbGFzcz1cImFqZi1zaWduYXR1cmUtdGV4dFwiPnt7J1BsZWFzZSBzaWduIGhlcmUnfHRyYW5zbG9jb319PC9wPlxuICA8Y2FudmFzXG4gICAgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNhbnZhc1wiXG4gICAgI3NpZ1BhZFxuICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAodG91Y2htb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICA+PC9jYW52YXM+XG4gIDxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIG1hdC1mYWIgKGNsaWNrKT1cImNsZWFyKClcIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWNsZWFyXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWZhYiAoY2xpY2spPVwiYWNjZXB0KClcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIWlzRHJhd25cIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWFjY2VwdFwiPlxuICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGltZyBjbGFzcz1cImFqZi1zaWduYXR1cmUtcHJldmlld1wiIFtzcmNdPVwidmFsdWU/LmNvbnRlbnRcIiAvPlxuPC9kaXY+XG4iXX0=
107
+ args: [{ selector: 'ajf-signature', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [SIGNATURE_CONTROL_VALUE_ACCESSOR], template: "<div class=\"ajf-signature-container\">\n <p class=\"ajf-signature-text\">{{'Please sign here'|transloco}}</p>\n <canvas\n class=\"ajf-signature-canvas\"\n #sigPad\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\"\n (touchmove)=\"onMouseMove($event)\"\n ></canvas>\n <div class=\"ajf-signature-actions\">\n <button mat-fab (click)=\"clear()\" class=\"ajf-signature-action-clear\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-fab (click)=\"accept()\" color=\"primary\" [disabled]=\"!isDrawn\" class=\"ajf-signature-action-accept\">\n <mat-icon>check</mat-icon>\n </button>\n </div>\n\n <img class=\"ajf-signature-preview\" [src]=\"safeImageSrc\" />\n</div>\n", styles: ["ajf-signature{display:block}ajf-signature .ajf-signature-container{width:100%;display:flex;flex-flow:column wrap;justify-content:center;align-items:center}ajf-signature .ajf-signature-container .ajf-signature-preview{max-width:200px;max-height:100px;margin:auto;padding:5px}ajf-signature .ajf-signature-container .ajf-signature-canvas{margin:auto;border-radius:10px;border:2px solid rgba(0,0,0,.4)}ajf-signature .ajf-signature-container .ajf-signature-actions{flex:1 0 auto;display:flex;flex-flow:row wrap;justify-content:space-around}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab{margin:10px}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab .mat-icon{margin-left:0!important}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-clear{background-color:#f53d3d99}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept{background-color:#32db6499}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept[disabled=true]{background-color:#0000001f;color:#00000061}\n"] }]
108
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1.DomSanitizer }] });
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvc2lnbmF0dXJlL3NyYy9zaWduYXR1cmUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9zaWduYXR1cmUvc3JjL3NpZ25hdHVyZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFHakQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQVE7SUFDbkQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGOztHQUVHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFDckQsWUFBWSxHQUFzQixFQUFFLFFBQW1CLEVBQVUsVUFBd0I7UUFDdkYsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUQwQyxlQUFVLEdBQVYsVUFBVSxDQUFjO0lBRXpGLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsSUFBSTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLFNBQVM7WUFDbEIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLFNBQVM7WUFDakMsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFekUsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVsRixJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUNYLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLElBQUksRUFBRSxZQUFZO2dCQUNsQixTQUFTLEVBQUUsSUFBSTtnQkFDZixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLFNBQVM7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTdELE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU87SUFDVCxDQUFDOytHQXJFVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix3Q0FGckIsQ0FBQyxnQ0FBZ0MsQ0FBQyxpRENuRC9DLDZ3QkFxQkE7OzRGRGdDYSxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7QWpmU2lnbmF0dXJlfSBmcm9tICdAYWpmL2NvcmUvc2lnbmF0dXJlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFqZlNpZ25hdHVyZUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBamYgc2lnbmF0dXJlIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXNpZ25hdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnc2lnbmF0dXJlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2lnbmF0dXJlLnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1NJR05BVFVSRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmU2lnbmF0dXJlQ29tcG9uZW50IGV4dGVuZHMgQWpmU2lnbmF0dXJlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICBzdXBlcihjZHIsIHJlbmRlcmVyKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNpZ1BhZEVsZW1lbnQgPSB0aGlzLnNpZ1BhZC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuc2lnUGFkRWxlbWVudD8uZ2V0Q29udGV4dCgnMmQnKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc2lnbmF0dXJlIHZhbHVlIGFuZCBwcmV2aWV3IChrZWVwcyB0aGUgb2xkIHVybCB0byBkZWxldGUgb2xkIHNpZ25hdHVyZSBmcm9tIHN0b3JhZ2UpXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jb250ZXh0ICE9IG51bGwgJiYgdGhpcy5zaWdQYWRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaWdQYWRFbGVtZW50LndpZHRoLCB0aGlzLnNpZ1BhZEVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgdGhpcy5pc0RyYXduID0gZmFsc2U7XG4gICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgIG5hbWU6ICdzaWduYXR1cmUud2VicCcsXG4gICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICBzaWduYXR1cmU6IHRydWUsXG4gICAgICBzaXplOiB1bmRlZmluZWQsXG4gICAgICBjb250ZW50OiB1bmRlZmluZWQsXG4gICAgICB1cmw6IHRoaXMudmFsdWU/LnVybCA/PyB1bmRlZmluZWQsXG4gICAgICBkZWxldGVVcmw6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHRzIHRoZSBuZXcgc2lnbmF0dXJlIGZyb20gdGhlIGNhbnZhcyBhbmQgc2V0cyBpdCBhcyBmaWVsZCB2YWx1ZSAoa2VlcHMgdGhlIG9sZCB1cmwgdG8gZGVsZXRlIG9sZCBzaWduYXR1cmUgZnJvbSBzdG9yYWdlKVxuICAgKi9cbiAgYWNjZXB0KCkge1xuICAgIGlmICh0aGlzLnNpZ1BhZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRGF0YVVybCA9IHRoaXMuc2lnUGFkRWxlbWVudC50b0RhdGFVUkwoJ2ltYWdlL3dlYnAnLCAwLjUpO1xuXG4gICAgICBjb25zdCBoZWFkID0gJ2RhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsJztcbiAgICAgIGNvbnN0IGltZ0ZpbGVTaXplID0gTWF0aC5yb3VuZCgoKHNpZ25hdHVyZURhdGFVcmwubGVuZ3RoIC0gaGVhZC5sZW5ndGgpICogMykgLyA0KTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgICAgbmFtZTogJ3NpZ25hdHVyZS53ZWJwJyxcbiAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICBzaWduYXR1cmU6IHRydWUsXG4gICAgICAgIHNpemU6IGltZ0ZpbGVTaXplLFxuICAgICAgICBjb250ZW50OiBzaWduYXR1cmVEYXRhVXJsLFxuICAgICAgICB1cmw6IHRoaXMudmFsdWU/LnVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGRlbGV0ZVVybDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgc2lnbmF0dXJlIGltYWdlIHVybFxuICAgKi9cbiAgZ2V0IHNhZmVJbWFnZVNyYygpOiBTYWZlVXJsIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWUuY29udGVudCAmJiB0aGlzLnZhbHVlLmRlbGV0ZVVybCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByYXdVcmwgPVxuICAgICAgdGhpcy52YWx1ZS5jb250ZW50ICYmIHRoaXMudmFsdWUuY29udGVudC5sZW5ndGggPyB0aGlzLnZhbHVlLmNvbnRlbnQgOiB0aGlzLnZhbHVlLnVybDtcbiAgICBpZiAoIXJhd1VybCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzYW5pdGl6ZWRVcmwgPSB0aGlzLl9zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChyYXdVcmwpO1xuICAgIHJldHVybiBzYW5pdGl6ZWRVcmw7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNvbnRhaW5lclwiPlxuICA8cCBjbGFzcz1cImFqZi1zaWduYXR1cmUtdGV4dFwiPnt7J1BsZWFzZSBzaWduIGhlcmUnfHRyYW5zbG9jb319PC9wPlxuICA8Y2FudmFzXG4gICAgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNhbnZhc1wiXG4gICAgI3NpZ1BhZFxuICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAodG91Y2htb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICA+PC9jYW52YXM+XG4gIDxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIG1hdC1mYWIgKGNsaWNrKT1cImNsZWFyKClcIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWNsZWFyXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWZhYiAoY2xpY2spPVwiYWNjZXB0KClcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIWlzRHJhd25cIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWFjY2VwdFwiPlxuICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGltZyBjbGFzcz1cImFqZi1zaWduYXR1cmUtcHJldmlld1wiIFtzcmNdPVwic2FmZUltYWdlU3JjXCIgLz5cbjwvZGl2PlxuIl19
@@ -24,18 +24,20 @@ import { FormsModule } from '@angular/forms';
24
24
  import { MatFormFieldModule } from '@angular/material/form-field';
25
25
  import { MatInputModule } from '@angular/material/input';
26
26
  import { AjfTime } from './time';
27
+ import { MatSelectModule } from '@angular/material/select';
28
+ import { CommonModule } from '@angular/common';
27
29
  import * as i0 from "@angular/core";
28
30
  export class AjfTimeModule {
29
31
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
30
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, declarations: [AjfTime], imports: [FormsModule, MatFormFieldModule, MatInputModule], exports: [AjfTime] }); }
31
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, imports: [FormsModule, MatFormFieldModule, MatInputModule] }); }
32
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, declarations: [AjfTime], imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule], exports: [AjfTime] }); }
33
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule] }); }
32
34
  }
33
35
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTimeModule, decorators: [{
34
36
  type: NgModule,
35
37
  args: [{
36
- imports: [FormsModule, MatFormFieldModule, MatInputModule],
38
+ imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule],
37
39
  declarations: [AjfTime],
38
40
  exports: [AjfTime],
39
41
  }]
40
42
  }] });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC90aW1lL3NyYy90aW1lLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFFBQVEsQ0FBQzs7QUFPL0IsTUFBTSxPQUFPLGFBQWE7K0dBQWIsYUFBYTtnSEFBYixhQUFhLGlCQUhULE9BQU8sYUFEWixXQUFXLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxhQUUvQyxPQUFPO2dIQUVOLGFBQWEsWUFKZCxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsY0FBYzs7NEZBSTlDLGFBQWE7a0JBTHpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQztvQkFDMUQsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge05nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7TWF0SW5wdXRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcblxuaW1wb3J0IHtBamZUaW1lfSBmcm9tICcuL3RpbWUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtBamZUaW1lXSxcbiAgZXhwb3J0czogW0FqZlRpbWVdLFxufSlcbmV4cG9ydCBjbGFzcyBBamZUaW1lTW9kdWxlIHt9XG4iXX0=
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC90aW1lL3NyYy90aW1lLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDOztBQU83QyxNQUFNLE9BQU8sYUFBYTsrR0FBYixhQUFhO2dIQUFiLGFBQWEsaUJBSFQsT0FBTyxhQURaLFlBQVksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGVBQWUsYUFFOUUsT0FBTztnSEFFTixhQUFhLFlBSmQsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZTs7NEZBSTdFLGFBQWE7a0JBTHpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDO29CQUN6RixZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuXG5pbXBvcnQge0FqZlRpbWV9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQge01hdFNlbGVjdE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbQWpmVGltZV0sXG4gIGV4cG9ydHM6IFtBamZUaW1lXSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmVGltZU1vZHVsZSB7fVxuIl19
@@ -23,9 +23,11 @@ import { AjfTime as Base } from '@ajf/core/time';
23
23
  import { ChangeDetectionStrategy, Component, forwardRef, ViewEncapsulation, } from '@angular/core';
24
24
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
25
25
  import * as i0 from "@angular/core";
26
- import * as i1 from "@angular/forms";
27
- import * as i2 from "@angular/material/form-field";
28
- import * as i3 from "@angular/material/input";
26
+ import * as i1 from "@angular/common";
27
+ import * as i2 from "@angular/forms";
28
+ import * as i3 from "@angular/material/form-field";
29
+ import * as i4 from "@angular/material/select";
30
+ import * as i5 from "@angular/material/core";
29
31
  export const AJF_TIME_CONTROL_VALUE_ACCESSOR = {
30
32
  provide: NG_VALUE_ACCESSOR,
31
33
  useExisting: forwardRef(() => AjfTime),
@@ -34,12 +36,14 @@ export const AJF_TIME_CONTROL_VALUE_ACCESSOR = {
34
36
  export class AjfTime extends Base {
35
37
  constructor() {
36
38
  super();
39
+ this.hoursList = Array.from({ length: 24 }, (_, i) => i);
40
+ this.minutesList = Array.from({ length: 60 }, (_, i) => i);
37
41
  }
38
42
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTime, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTime, selector: "ajf-time", providers: [AJF_TIME_CONTROL_VALUE_ACCESSOR], usesInheritance: true, ngImport: i0, template: "<div>\n <mat-form-field>\n <input\n matInput\n min=\"0\"\n max=\"23\"\n (focus)=\"focusHandler()\"\n [(ngModel)]=\"hours\"\n type=\"number\">\n </mat-form-field>\n :\n <mat-form-field>\n <input\n matInput\n min=\"0\"\n max=\"59\"\n (focus)=\"focusHandler()\"\n [(ngModel)]=\"minutes\"\n type=\"number\">\n </mat-form-field>\n</div>\n", styles: ["ajf-time .mat-mdc-form-field{width:3.5em;text-align:center}\n"], dependencies: [{ 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
43
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTime, selector: "ajf-time", providers: [AJF_TIME_CONTROL_VALUE_ACCESSOR], usesInheritance: true, ngImport: i0, template: "<div>\n <mat-form-field>\n <mat-select [(ngModel)]=\"hours\" (opened)=\"focusHandler()\" placeholder=\"HH\">\n <mat-option *ngFor=\"let h of hoursList\" [value]=\"h\">\n {{ h | number:'2.0' }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n :\n <mat-form-field>\n <mat-select [(ngModel)]=\"minutes\" (opened)=\"focusHandler()\" placeholder=\"MM\">\n <mat-option *ngFor=\"let m of minutesList\" [value]=\"m\">\n {{ m | number:'2.0' }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>", styles: ["ajf-time .mat-mdc-form-field{width:4.5em;text-align:center}ajf-time .mat-mdc-select{margin:0!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
40
44
  }
41
45
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTime, decorators: [{
42
46
  type: Component,
43
- args: [{ selector: 'ajf-time', providers: [AJF_TIME_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <mat-form-field>\n <input\n matInput\n min=\"0\"\n max=\"23\"\n (focus)=\"focusHandler()\"\n [(ngModel)]=\"hours\"\n type=\"number\">\n </mat-form-field>\n :\n <mat-form-field>\n <input\n matInput\n min=\"0\"\n max=\"59\"\n (focus)=\"focusHandler()\"\n [(ngModel)]=\"minutes\"\n type=\"number\">\n </mat-form-field>\n</div>\n", styles: ["ajf-time .mat-mdc-form-field{width:3.5em;text-align:center}\n"] }]
47
+ args: [{ selector: 'ajf-time', providers: [AJF_TIME_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <mat-form-field>\n <mat-select [(ngModel)]=\"hours\" (opened)=\"focusHandler()\" placeholder=\"HH\">\n <mat-option *ngFor=\"let h of hoursList\" [value]=\"h\">\n {{ h | number:'2.0' }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n :\n <mat-form-field>\n <mat-select [(ngModel)]=\"minutes\" (opened)=\"focusHandler()\" placeholder=\"MM\">\n <mat-option *ngFor=\"let m of minutesList\" [value]=\"m\">\n {{ m | number:'2.0' }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n</div>", styles: ["ajf-time .mat-mdc-form-field{width:4.5em;text-align:center}ajf-time .mat-mdc-select{margin:0!important}\n"] }]
44
48
  }], ctorParameters: () => [] });
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL3RpbWUvc3JjL3RpbWUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC90aW1lL3NyYy90aW1lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBRVYsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFdkUsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQVE7SUFDbEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUN0QyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFVRixNQUFNLE9BQU8sT0FBUSxTQUFRLElBQUk7SUFDL0I7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7K0dBSFUsT0FBTzttR0FBUCxPQUFPLG1DQUpQLENBQUMsK0JBQStCLENBQUMsaURDMUM5Qyw4YUFxQkE7OzRGRHlCYSxPQUFPO2tCQVJuQixTQUFTOytCQUNFLFVBQVUsYUFHVCxDQUFDLCtCQUErQixDQUFDLGlCQUM3QixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge0FqZlRpbWUgYXMgQmFzZX0gZnJvbSAnQGFqZi9jb3JlL3RpbWUnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgZm9yd2FyZFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgY29uc3QgQUpGX1RJTUVfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWpmVGltZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXRpbWUnLFxuICB0ZW1wbGF0ZVVybDogJ3RpbWUuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd0aW1lLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQUpGX1RJTUVfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBamZUaW1lIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIG1pbj1cIjBcIlxuICAgICAgICBtYXg9XCIyM1wiXG4gICAgICAgIChmb2N1cyk9XCJmb2N1c0hhbmRsZXIoKVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiaG91cnNcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCI+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDpcbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgbWF4PVwiNTlcIlxuICAgICAgICAoZm9jdXMpPVwiZm9jdXNIYW5kbGVyKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cIm1pbnV0ZXNcIlxuICAgICAgICB0eXBlPVwibnVtYmVyXCI+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL3RpbWUvc3JjL3RpbWUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC90aW1lL3NyYy90aW1lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBRVYsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQUV2RSxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBUTtJQUNsRCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3RDLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQVVGLE1BQU0sT0FBTyxPQUFRLFNBQVEsSUFBSTtJQUkvQjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBSlYsY0FBUyxHQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxnQkFBVyxHQUFhLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUk5RCxDQUFDOytHQU5VLE9BQU87bUdBQVAsT0FBTyxtQ0FKUCxDQUFDLCtCQUErQixDQUFDLGlEQzFDOUMsd2lCQWdCTTs7NEZEOEJPLE9BQU87a0JBUm5CLFNBQVM7K0JBQ0UsVUFBVSxhQUdULENBQUMsK0JBQStCLENBQUMsaUJBQzdCLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7QWpmVGltZSBhcyBCYXNlfSBmcm9tICdAYWpmL2NvcmUvdGltZSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBjb25zdCBBSkZfVElNRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBamZUaW1lKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtdGltZScsXG4gIHRlbXBsYXRlVXJsOiAndGltZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3RpbWUuc2NzcyddLFxuICBwcm92aWRlcnM6IFtBSkZfVElNRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFqZlRpbWUgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG4gIGhvdXJzTGlzdDogbnVtYmVyW10gPSBBcnJheS5mcm9tKHtsZW5ndGg6IDI0fSwgKF8sIGkpID0+IGkpO1xuICBtaW51dGVzTGlzdDogbnVtYmVyW10gPSBBcnJheS5mcm9tKHtsZW5ndGg6IDYwfSwgKF8sIGkpID0+IGkpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbiIsIjxkaXY+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImhvdXJzXCIgKG9wZW5lZCk9XCJmb2N1c0hhbmRsZXIoKVwiIHBsYWNlaG9sZGVyPVwiSEhcIj5cbiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBoIG9mIGhvdXJzTGlzdFwiIFt2YWx1ZV09XCJoXCI+XG4gICAgICAgIHt7IGggfCBudW1iZXI6JzIuMCcgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDpcbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwibWludXRlc1wiIChvcGVuZWQpPVwiZm9jdXNIYW5kbGVyKClcIiBwbGFjZWhvbGRlcj1cIk1NXCI+XG4gICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbSBvZiBtaW51dGVzTGlzdFwiIFt2YWx1ZV09XCJtXCI+XG4gICAgICAgIHt7IG0gfCBudW1iZXI6JzIuMCcgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj4iXX0=
@@ -0,0 +1,212 @@
1
+ import { AjfAudio } from '@ajf/core/audio';
2
+ import * as i0 from '@angular/core';
3
+ import { Input, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
4
+ import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
5
+ import * as i1 from '@angular/common';
6
+ import { CommonModule } from '@angular/common';
7
+ import * as i2 from '@angular/material/button';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import * as i3 from '@angular/material/icon';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import * as i4 from '@angular/material/tooltip';
12
+ import { MatTooltipModule } from '@angular/material/tooltip';
13
+
14
+ /**
15
+ * @license
16
+ * Copyright (C) Gnucoop soc. coop.
17
+ *
18
+ * This file is part of the Advanced JSON forms (ajf).
19
+ *
20
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
21
+ * modify it under the terms of the GNU Affero General Public License as
22
+ * published by the Free Software Foundation, either version 3 of the License,
23
+ * or (at your option) any later version.
24
+ *
25
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
26
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
27
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
28
+ * General Public License for more details.
29
+ *
30
+ * You should have received a copy of the GNU Affero General Public License
31
+ * along with Advanced JSON forms (ajf).
32
+ * If not, see http://www.gnu.org/licenses/.
33
+ *
34
+ */
35
+ class AjfAudioComponent extends AjfAudio {
36
+ constructor(cdr) {
37
+ super(cdr);
38
+ this.readonly = false;
39
+ this.isRecording = false;
40
+ this.audioUrl = null;
41
+ this.mediaRecorder = null;
42
+ this.audioChunks = [];
43
+ // Keep track of object URLs to revoke them
44
+ this.createdUrls = [];
45
+ }
46
+ ngOnDestroy() {
47
+ this.stopRecording();
48
+ this.revokeUrls();
49
+ }
50
+ // Override writeValue to handle audioUrl creation
51
+ writeValue(value) {
52
+ super.writeValue(value);
53
+ // If we have a value (base64) but no URL, create one for playback if needed
54
+ // However, for <audio src="data:..."> base64 works directly.
55
+ // If the value is a blob URL, we might need handling, but here we assume base64 storage.
56
+ this.audioUrl = value;
57
+ this._cdr.markForCheck();
58
+ }
59
+ async startRecording() {
60
+ try {
61
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
62
+ this.mediaRecorder = new MediaRecorder(stream);
63
+ this.audioChunks = [];
64
+ this.mediaRecorder.ondataavailable = event => {
65
+ this.audioChunks.push(event.data);
66
+ };
67
+ this.mediaRecorder.onstop = () => {
68
+ const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });
69
+ // Create a temporary URL for immediate playback if needed,
70
+ // but primarily we converts to base64 for value.
71
+ const reader = new FileReader();
72
+ reader.readAsDataURL(audioBlob);
73
+ reader.onloadend = () => {
74
+ const base64data = reader.result;
75
+ this.value = base64data;
76
+ this.audioUrl = base64data;
77
+ this._cdr.markForCheck();
78
+ };
79
+ };
80
+ this.mediaRecorder.start();
81
+ this.isRecording = true;
82
+ this._cdr.markForCheck();
83
+ }
84
+ catch (err) {
85
+ console.error('Error accessing microphone:', err);
86
+ }
87
+ }
88
+ stopRecording() {
89
+ if (this.mediaRecorder && this.isRecording) {
90
+ this.mediaRecorder.stop();
91
+ this.isRecording = false;
92
+ this.mediaRecorder.stream.getTracks().forEach(track => track.stop());
93
+ this._cdr.markForCheck();
94
+ }
95
+ }
96
+ clearRecording() {
97
+ this.audioUrl = null;
98
+ this.audioChunks = [];
99
+ this.value = null;
100
+ this._cdr.markForCheck();
101
+ }
102
+ revokeUrls() {
103
+ this.createdUrls.forEach(url => URL.revokeObjectURL(url));
104
+ this.createdUrls = [];
105
+ }
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfAudioComponent, selector: "ajf-audio", inputs: { readonly: "readonly" }, providers: [
108
+ {
109
+ provide: NG_VALUE_ACCESSOR,
110
+ useExisting: AjfAudioComponent,
111
+ multi: true,
112
+ },
113
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'ajf-audio', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
118
+ {
119
+ provide: NG_VALUE_ACCESSOR,
120
+ useExisting: AjfAudioComponent,
121
+ multi: true,
122
+ },
123
+ ], template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"] }]
124
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { readonly: [{
125
+ type: Input
126
+ }] } });
127
+
128
+ /**
129
+ * @license
130
+ * Copyright (C) Gnucoop soc. coop.
131
+ *
132
+ * This file is part of the Advanced JSON forms (ajf).
133
+ *
134
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
135
+ * modify it under the terms of the GNU Affero General Public License as
136
+ * published by the Free Software Foundation, either version 3 of the License,
137
+ * or (at your option) any later version.
138
+ *
139
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
140
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
141
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
142
+ * General Public License for more details.
143
+ *
144
+ * You should have received a copy of the GNU Affero General Public License
145
+ * along with Advanced JSON forms (ajf).
146
+ * If not, see http://www.gnu.org/licenses/.
147
+ *
148
+ */
149
+ class AjfAudioModule {
150
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
151
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioModule, declarations: [AjfAudioComponent], imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule], exports: [AjfAudioComponent] }); }
152
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioModule, imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule] }); }
153
+ }
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioModule, decorators: [{
155
+ type: NgModule,
156
+ args: [{
157
+ imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule],
158
+ declarations: [AjfAudioComponent],
159
+ exports: [AjfAudioComponent],
160
+ }]
161
+ }] });
162
+
163
+ /**
164
+ * @license
165
+ * Copyright (C) Gnucoop soc. coop.
166
+ *
167
+ * This file is part of the Advanced JSON forms (ajf).
168
+ *
169
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
170
+ * modify it under the terms of the GNU Affero General Public License as
171
+ * published by the Free Software Foundation, either version 3 of the License,
172
+ * or (at your option) any later version.
173
+ *
174
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
175
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
176
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
177
+ * General Public License for more details.
178
+ *
179
+ * You should have received a copy of the GNU Affero General Public License
180
+ * along with Advanced JSON forms (ajf).
181
+ * If not, see http://www.gnu.org/licenses/.
182
+ *
183
+ */
184
+
185
+ /**
186
+ * @license
187
+ * Copyright (C) Gnucoop soc. coop.
188
+ *
189
+ * This file is part of the Advanced JSON forms (ajf).
190
+ *
191
+ * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
192
+ * modify it under the terms of the GNU Affero General Public License as
193
+ * published by the Free Software Foundation, either version 3 of the License,
194
+ * or (at your option) any later version.
195
+ *
196
+ * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
197
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
198
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
199
+ * General Public License for more details.
200
+ *
201
+ * You should have received a copy of the GNU Affero General Public License
202
+ * along with Advanced JSON forms (ajf).
203
+ * If not, see http://www.gnu.org/licenses/.
204
+ *
205
+ */
206
+
207
+ /**
208
+ * Generated bundle index. Do not edit.
209
+ */
210
+
211
+ export { AjfAudioComponent, AjfAudioModule };
212
+ //# sourceMappingURL=ajf-material-audio.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajf-material-audio.mjs","sources":["../../../projects/material/audio/src/audio.ts","../../../projects/material/audio/src/audio.html","../../../projects/material/audio/src/audio-module.ts","../../../projects/material/audio/src/public_api.ts","../../../projects/material/audio/index.ts","../../../projects/material/audio/ajf-material-audio.ts"],"sourcesContent":["/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {AjfAudio} from '@ajf/core/audio';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n ViewEncapsulation,\n} from '@angular/core';\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\n\n@Component({\n selector: 'ajf-audio',\n templateUrl: 'audio.html',\n styleUrls: ['audio.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: AjfAudioComponent,\n multi: true,\n },\n ],\n})\nexport class AjfAudioComponent extends AjfAudio implements OnDestroy {\n @Input() readonly = false;\n\n isRecording = false;\n audioUrl: string | null = null;\n private mediaRecorder: MediaRecorder | null = null;\n private audioChunks: any[] = [];\n // Keep track of object URLs to revoke them\n private createdUrls: string[] = [];\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngOnDestroy(): void {\n this.stopRecording();\n this.revokeUrls();\n }\n\n // Override writeValue to handle audioUrl creation\n override writeValue(value: string | null): void {\n super.writeValue(value);\n // If we have a value (base64) but no URL, create one for playback if needed\n // However, for <audio src=\"data:...\"> base64 works directly.\n // If the value is a blob URL, we might need handling, but here we assume base64 storage.\n this.audioUrl = value;\n this._cdr.markForCheck();\n }\n\n async startRecording() {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({audio: true});\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n\n this.mediaRecorder.ondataavailable = event => {\n this.audioChunks.push(event.data);\n };\n\n this.mediaRecorder.onstop = () => {\n const audioBlob = new Blob(this.audioChunks, {type: 'audio/webm'});\n // Create a temporary URL for immediate playback if needed,\n // but primarily we converts to base64 for value.\n\n const reader = new FileReader();\n reader.readAsDataURL(audioBlob);\n reader.onloadend = () => {\n const base64data = reader.result as string;\n this.value = base64data;\n this.audioUrl = base64data;\n this._cdr.markForCheck();\n };\n };\n\n this.mediaRecorder.start();\n this.isRecording = true;\n this._cdr.markForCheck();\n } catch (err) {\n console.error('Error accessing microphone:', err);\n }\n }\n\n stopRecording() {\n if (this.mediaRecorder && this.isRecording) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.mediaRecorder.stream.getTracks().forEach(track => track.stop());\n this._cdr.markForCheck();\n }\n }\n\n clearRecording() {\n this.audioUrl = null;\n this.audioChunks = [];\n this.value = null;\n this._cdr.markForCheck();\n }\n\n private revokeUrls() {\n this.createdUrls.forEach(url => URL.revokeObjectURL(url));\n this.createdUrls = [];\n }\n}\n","<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatTooltipModule} from '@angular/material/tooltip';\n\nimport {AjfAudioComponent} from './audio';\nimport {FormsModule} from '@angular/forms';\n\n@NgModule({\n imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule],\n declarations: [AjfAudioComponent],\n exports: [AjfAudioComponent],\n})\nexport class AjfAudioModule {}\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './audio';\nexport * from './audio-module';\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './src/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}