@ajf/material 18.4.0 → 18.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -2
- package/audio/src/audio-module.d.ts +7 -6
- package/esm2022/audio/src/audio-module.mjs +22 -4
- package/esm2022/audio/src/audio.mjs +6 -6
- package/esm2022/barcode/barcode.mjs +3 -3
- package/esm2022/calendar/calendar.mjs +2 -2
- package/esm2022/checkbox-group/checkbox-group-item.mjs +3 -3
- package/esm2022/form-builder/form-builder-module.mjs +9 -2
- package/esm2022/form-builder/form-builder-service.mjs +63 -20
- package/esm2022/form-builder/form-builder.mjs +73 -9
- package/esm2022/form-builder/node-entry.mjs +3 -3
- package/esm2022/form-builder/node-properties.mjs +3 -13
- package/esm2022/form-builder/node-type-entry.mjs +3 -3
- package/esm2022/form-builder/node-type-groups.pipe.mjs +65 -0
- package/esm2022/form-builder/public_api.mjs +2 -1
- package/esm2022/form-builder/string-identifier-dialog.mjs +44 -60
- package/esm2022/forms/boolean-field.mjs +6 -5
- package/esm2022/forms/current-slide.mjs +92 -0
- package/esm2022/forms/date-input-field.mjs +7 -9
- package/esm2022/forms/display-field.mjs +2 -2
- package/esm2022/forms/empty-field.mjs +3 -3
- package/esm2022/forms/field-row.mjs +117 -0
- package/esm2022/forms/field.mjs +2 -2
- package/esm2022/forms/form.mjs +107 -13
- package/esm2022/forms/forms-module.mjs +26 -3
- package/esm2022/forms/input-field.mjs +6 -8
- package/esm2022/forms/multiple-choice-field.mjs +45 -10
- package/esm2022/forms/public_api.mjs +6 -1
- package/esm2022/forms/range-field.mjs +5 -6
- package/esm2022/forms/rep-strip.mjs +61 -0
- package/esm2022/forms/single-choice-field.mjs +26 -11
- package/esm2022/forms/slide-header.mjs +68 -0
- package/esm2022/forms/slide-stats.mjs +148 -0
- package/esm2022/forms/table-field.mjs +2 -2
- package/esm2022/forms/text-field.mjs +2 -2
- package/esm2022/forms/video-url-field.mjs +6 -8
- package/esm2022/geolocation/geolocation.mjs +4 -6
- package/esm2022/page-slider/page-slider.mjs +3 -3
- package/esm2022/signature/signature.mjs +5 -6
- package/esm2022/time/time-module.mjs +22 -4
- package/esm2022/time/time.mjs +4 -4
- package/fesm2022/ajf-material-audio.mjs +27 -9
- package/fesm2022/ajf-material-audio.mjs.map +1 -1
- package/fesm2022/ajf-material-barcode.mjs +2 -2
- package/fesm2022/ajf-material-barcode.mjs.map +1 -1
- package/fesm2022/ajf-material-calendar.mjs +2 -2
- package/fesm2022/ajf-material-calendar.mjs.map +1 -1
- package/fesm2022/ajf-material-checkbox-group.mjs +2 -2
- package/fesm2022/ajf-material-checkbox-group.mjs.map +1 -1
- package/fesm2022/ajf-material-form-builder.mjs +260 -108
- package/fesm2022/ajf-material-form-builder.mjs.map +1 -1
- package/fesm2022/ajf-material-forms.mjs +712 -99
- package/fesm2022/ajf-material-forms.mjs.map +1 -1
- package/fesm2022/ajf-material-geolocation.mjs +5 -7
- package/fesm2022/ajf-material-geolocation.mjs.map +1 -1
- package/fesm2022/ajf-material-page-slider.mjs +2 -2
- package/fesm2022/ajf-material-page-slider.mjs.map +1 -1
- package/fesm2022/ajf-material-signature.mjs +7 -8
- package/fesm2022/ajf-material-signature.mjs.map +1 -1
- package/fesm2022/ajf-material-time.mjs +24 -6
- package/fesm2022/ajf-material-time.mjs.map +1 -1
- package/form-builder/form-builder-module.d.ts +27 -25
- package/form-builder/form-builder-service.d.ts +25 -0
- package/form-builder/form-builder.d.ts +41 -2
- package/form-builder/node-type-groups.pipe.d.ts +45 -0
- package/form-builder/public_api.d.ts +1 -0
- package/form-builder/string-identifier-dialog.d.ts +10 -16
- package/forms/_theming.scss +142 -0
- package/forms/current-slide.d.ts +61 -0
- package/forms/field-row.d.ts +63 -0
- package/forms/form.d.ts +40 -3
- package/forms/forms-module.d.ts +57 -51
- package/forms/multiple-choice-field.d.ts +15 -1
- package/forms/public_api.d.ts +5 -0
- package/forms/rep-strip.d.ts +52 -0
- package/forms/single-choice-field.d.ts +7 -0
- package/forms/slide-header.d.ts +61 -0
- package/forms/slide-stats.d.ts +76 -0
- package/package.json +2 -2
- package/time/time-module.d.ts +4 -3
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/material/icon";
|
|
6
|
+
import * as i3 from "@ngneat/transloco";
|
|
7
|
+
import * as i4 from "@ajf/core/forms";
|
|
8
|
+
/**
|
|
9
|
+
* The pager for a repeating slide: one button per repetition plus add and remove
|
|
10
|
+
* actions. The renderer keeps one page per repetition, so picking a number here
|
|
11
|
+
* is a page change, which the renderer performs.
|
|
12
|
+
*/
|
|
13
|
+
export class AjfRepStrip {
|
|
14
|
+
constructor() {
|
|
15
|
+
/** The repetition currently on screen, zero based. */
|
|
16
|
+
this.current = 0;
|
|
17
|
+
this._readonly = false;
|
|
18
|
+
this.goTo = new EventEmitter();
|
|
19
|
+
this.add = new EventEmitter();
|
|
20
|
+
this.remove = new EventEmitter();
|
|
21
|
+
}
|
|
22
|
+
set readonly(readonly) {
|
|
23
|
+
this._readonly = coerceBooleanProperty(readonly);
|
|
24
|
+
}
|
|
25
|
+
get readonly() {
|
|
26
|
+
return this._readonly;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A repetition count driven by a formula is not the reader's to change:
|
|
30
|
+
* `AjfFormRendererService.addGroup` and `removeGroup` both refuse the call
|
|
31
|
+
* outright, so without this the buttons would sit enabled and do nothing.
|
|
32
|
+
*/
|
|
33
|
+
get manualReps() {
|
|
34
|
+
return this.slide.formulaReps == null;
|
|
35
|
+
}
|
|
36
|
+
get canAdd() {
|
|
37
|
+
return this.manualReps && !!this.slide.canAdd;
|
|
38
|
+
}
|
|
39
|
+
get canRemove() {
|
|
40
|
+
return this.manualReps && !!this.slide.canRemove;
|
|
41
|
+
}
|
|
42
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfRepStrip, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
43
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfRepStrip, selector: "ajf-rep-strip", inputs: { slide: "slide", current: "current", readonly: "readonly" }, outputs: { goTo: "goTo", add: "add", remove: "remove" }, ngImport: i0, template: "<div class=\"ajf-rep-strip\">\n <span class=\"ajf-micro-label ajf-rep-strip-label\"\n >{{ 'Number of' | transloco }} {{ slide.node.label | transloco }}</span\n >\n\n <div class=\"ajf-rep-pager\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"current === 0\"\n (click)=\"goTo.emit(current - 1)\"\n [attr.aria-label]=\"'Back' | transloco\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn ajf-rep-page\"\n *ngFor=\"let rep of (slide.reps | ajfRange); let idx = index\"\n [class.ajf-selected]=\"idx === current\"\n (click)=\"goTo.emit(idx)\"\n >\n {{ idx + 1 }}\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"current >= slide.reps - 1\"\n (click)=\"goTo.emit(current + 1)\"\n [attr.aria-label]=\"'Forward' | transloco\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <ng-container *ngIf=\"!readonly\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"!canAdd\"\n (click)=\"add.emit()\"\n [attr.aria-label]=\"'Add' | transloco\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"!canRemove\"\n (click)=\"remove.emit()\"\n [attr.aria-label]=\"'Remove' | transloco\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n </ng-container>\n </div>\n\n <span class=\"ajf-rep-strip-context\">\n <span [innerHTML]=\"slide.node.label | transloco\"></span>\n {{ current + 1 }} {{ 'of' | transloco }} {{ slide.reps }}\n </span>\n</div>\n", styles: ["ajf-rep-strip{display:block}ajf-rep-strip .ajf-rep-strip{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 20px;border-bottom:1px solid var(--ajf-border);background:var(--ajf-band);font-family:var(--ajf-font-sans)}ajf-rep-strip .ajf-rep-strip-label{flex:0 0 auto}ajf-rep-strip .ajf-rep-pager{display:flex;flex-wrap:wrap;gap:6px}ajf-rep-strip .ajf-rep-pager .ajf-btn{min-width:32px;min-height:32px;padding:0 6px;font-size:13px}ajf-rep-strip .ajf-rep-pager .ajf-btn .mat-icon{width:18px;height:18px;font-size:18px}ajf-rep-strip .ajf-rep-pager .ajf-rep-page.ajf-selected{border-color:var(--ajf-accent);background:var(--ajf-accent);color:var(--ajf-accent-fg)}ajf-rep-strip .ajf-rep-strip-context{margin-left:auto;color:var(--ajf-text-muted);font-size:13px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i4.AjfRangePipe, name: "ajfRange" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfRepStrip, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ selector: 'ajf-rep-strip', encapsulation: ViewEncapsulation.None, template: "<div class=\"ajf-rep-strip\">\n <span class=\"ajf-micro-label ajf-rep-strip-label\"\n >{{ 'Number of' | transloco }} {{ slide.node.label | transloco }}</span\n >\n\n <div class=\"ajf-rep-pager\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"current === 0\"\n (click)=\"goTo.emit(current - 1)\"\n [attr.aria-label]=\"'Back' | transloco\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn ajf-rep-page\"\n *ngFor=\"let rep of (slide.reps | ajfRange); let idx = index\"\n [class.ajf-selected]=\"idx === current\"\n (click)=\"goTo.emit(idx)\"\n >\n {{ idx + 1 }}\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"current >= slide.reps - 1\"\n (click)=\"goTo.emit(current + 1)\"\n [attr.aria-label]=\"'Forward' | transloco\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n <ng-container *ngIf=\"!readonly\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"!canAdd\"\n (click)=\"add.emit()\"\n [attr.aria-label]=\"'Add' | transloco\"\n >\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n [disabled]=\"!canRemove\"\n (click)=\"remove.emit()\"\n [attr.aria-label]=\"'Remove' | transloco\"\n >\n <mat-icon>remove</mat-icon>\n </button>\n </ng-container>\n </div>\n\n <span class=\"ajf-rep-strip-context\">\n <span [innerHTML]=\"slide.node.label | transloco\"></span>\n {{ current + 1 }} {{ 'of' | transloco }} {{ slide.reps }}\n </span>\n</div>\n", styles: ["ajf-rep-strip{display:block}ajf-rep-strip .ajf-rep-strip{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 20px;border-bottom:1px solid var(--ajf-border);background:var(--ajf-band);font-family:var(--ajf-font-sans)}ajf-rep-strip .ajf-rep-strip-label{flex:0 0 auto}ajf-rep-strip .ajf-rep-pager{display:flex;flex-wrap:wrap;gap:6px}ajf-rep-strip .ajf-rep-pager .ajf-btn{min-width:32px;min-height:32px;padding:0 6px;font-size:13px}ajf-rep-strip .ajf-rep-pager .ajf-btn .mat-icon{width:18px;height:18px;font-size:18px}ajf-rep-strip .ajf-rep-pager .ajf-rep-page.ajf-selected{border-color:var(--ajf-accent);background:var(--ajf-accent);color:var(--ajf-accent-fg)}ajf-rep-strip .ajf-rep-strip-context{margin-left:auto;color:var(--ajf-text-muted);font-size:13px}\n"] }]
|
|
48
|
+
}], propDecorators: { slide: [{
|
|
49
|
+
type: Input
|
|
50
|
+
}], current: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], readonly: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], goTo: [{
|
|
55
|
+
type: Output
|
|
56
|
+
}], add: [{
|
|
57
|
+
type: Output
|
|
58
|
+
}], remove: [{
|
|
59
|
+
type: Output
|
|
60
|
+
}] } });
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwLXN0cmlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3JlcC1zdHJpcC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9yZXAtc3RyaXAuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1QkEsT0FBTyxFQUFlLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUUsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBRXhGOzs7O0dBSUc7QUFVSCxNQUFNLE9BQU8sV0FBVztJQVR4QjtRQVlFLHNEQUFzRDtRQUM3QyxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBU2IsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVQLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2xDLFFBQUcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9CLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBb0J0RDtJQS9CQyxJQUNJLFFBQVEsQ0FBQyxRQUFpQjtRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQU9EOzs7O09BSUc7SUFDSCxJQUFZLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkQsQ0FBQzsrR0FsQ1UsV0FBVzttR0FBWCxXQUFXLG9MQ3hDeEIsaXREQTZEQTs7NEZEckJhLFdBQVc7a0JBVHZCLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJOzhCQU01QixLQUFLO3NCQUFiLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdGLFFBQVE7c0JBRFgsS0FBSztnQkFTYSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLEdBQUc7c0JBQXJCLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtBamZSZXBlYXRpbmdTbGlkZUluc3RhbmNlfSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGUgcGFnZXIgZm9yIGEgcmVwZWF0aW5nIHNsaWRlOiBvbmUgYnV0dG9uIHBlciByZXBldGl0aW9uIHBsdXMgYWRkIGFuZCByZW1vdmVcbiAqIGFjdGlvbnMuIFRoZSByZW5kZXJlciBrZWVwcyBvbmUgcGFnZSBwZXIgcmVwZXRpdGlvbiwgc28gcGlja2luZyBhIG51bWJlciBoZXJlXG4gKiBpcyBhIHBhZ2UgY2hhbmdlLCB3aGljaCB0aGUgcmVuZGVyZXIgcGVyZm9ybXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi1yZXAtc3RyaXAnLFxuICB0ZW1wbGF0ZVVybDogJ3JlcC1zdHJpcC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3JlcC1zdHJpcC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIC8vIERlbGliZXJhdGVseSBub3QgT25QdXNoOiBgcmVwc2AsIGBjYW5BZGRgIGFuZCBgY2FuUmVtb3ZlYCBhcmUgbXV0YXRlZCBpblxuICAvLyBwbGFjZSBvbiB0aGUgc2xpZGUgaW5zdGFuY2UsIHNvIHRoZSBndWFyZHMgYmVsb3cgd291bGQgZ28gc3RhbGUgdW5kZXIgYVxuICAvLyBzdHJhdGVneSB0aGF0IG9ubHkgcmUtY2hlY2tzIHdoZW4gYW4gaW5wdXQgaWRlbnRpdHkgY2hhbmdlcy5cbn0pXG5leHBvcnQgY2xhc3MgQWpmUmVwU3RyaXAge1xuICBASW5wdXQoKSBzbGlkZSE6IEFqZlJlcGVhdGluZ1NsaWRlSW5zdGFuY2U7XG5cbiAgLyoqIFRoZSByZXBldGl0aW9uIGN1cnJlbnRseSBvbiBzY3JlZW4sIHplcm8gYmFzZWQuICovXG4gIEBJbnB1dCgpIGN1cnJlbnQgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlYWRvbmx5KTtcbiAgfVxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG4gIHByaXZhdGUgX3JlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGdvVG8gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFkZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogQSByZXBldGl0aW9uIGNvdW50IGRyaXZlbiBieSBhIGZvcm11bGEgaXMgbm90IHRoZSByZWFkZXIncyB0byBjaGFuZ2U6XG4gICAqIGBBamZGb3JtUmVuZGVyZXJTZXJ2aWNlLmFkZEdyb3VwYCBhbmQgYHJlbW92ZUdyb3VwYCBib3RoIHJlZnVzZSB0aGUgY2FsbFxuICAgKiBvdXRyaWdodCwgc28gd2l0aG91dCB0aGlzIHRoZSBidXR0b25zIHdvdWxkIHNpdCBlbmFibGVkIGFuZCBkbyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgbWFudWFsUmVwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zbGlkZS5mb3JtdWxhUmVwcyA9PSBudWxsO1xuICB9XG5cbiAgZ2V0IGNhbkFkZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYW51YWxSZXBzICYmICEhdGhpcy5zbGlkZS5jYW5BZGQ7XG4gIH1cblxuICBnZXQgY2FuUmVtb3ZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hbnVhbFJlcHMgJiYgISF0aGlzLnNsaWRlLmNhblJlbW92ZTtcbiAgfVxuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZWFkb25seTogQm9vbGVhbklucHV0O1xufVxuIiwiPGRpdiBjbGFzcz1cImFqZi1yZXAtc3RyaXBcIj5cbiAgPHNwYW4gY2xhc3M9XCJhamYtbWljcm8tbGFiZWwgYWpmLXJlcC1zdHJpcC1sYWJlbFwiXG4gICAgPnt7ICdOdW1iZXIgb2YnIHwgdHJhbnNsb2NvIH19IHt7IHNsaWRlLm5vZGUubGFiZWwgfCB0cmFuc2xvY28gfX08L3NwYW5cbiAgPlxuXG4gIDxkaXYgY2xhc3M9XCJhamYtcmVwLXBhZ2VyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImFqZi1idG5cIlxuICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnQgPT09IDBcIlxuICAgICAgKGNsaWNrKT1cImdvVG8uZW1pdChjdXJyZW50IC0gMSlcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQmFjaycgfCB0cmFuc2xvY29cIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhamYtYnRuIGFqZi1yZXAtcGFnZVwiXG4gICAgICAqbmdGb3I9XCJsZXQgcmVwIG9mIChzbGlkZS5yZXBzIHwgYWpmUmFuZ2UpOyBsZXQgaWR4ID0gaW5kZXhcIlxuICAgICAgW2NsYXNzLmFqZi1zZWxlY3RlZF09XCJpZHggPT09IGN1cnJlbnRcIlxuICAgICAgKGNsaWNrKT1cImdvVG8uZW1pdChpZHgpXCJcbiAgICA+XG4gICAgICB7eyBpZHggKyAxIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImFqZi1idG5cIlxuICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnQgPj0gc2xpZGUucmVwcyAtIDFcIlxuICAgICAgKGNsaWNrKT1cImdvVG8uZW1pdChjdXJyZW50ICsgMSlcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRm9yd2FyZCcgfCB0cmFuc2xvY29cIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHlcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYWpmLWJ0blwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZC5lbWl0KClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBZGQnIHwgdHJhbnNsb2NvXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYWpmLWJ0blwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVtb3ZlXCJcbiAgICAgICAgKGNsaWNrKT1cInJlbW92ZS5lbWl0KClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUnIHwgdHJhbnNsb2NvXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHNwYW4gY2xhc3M9XCJhamYtcmVwLXN0cmlwLWNvbnRleHRcIj5cbiAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInNsaWRlLm5vZGUubGFiZWwgfCB0cmFuc2xvY29cIj48L3NwYW4+XG4gICAge3sgY3VycmVudCArIDEgfX0ge3sgJ29mJyB8IHRyYW5zbG9jbyB9fSB7eyBzbGlkZS5yZXBzIH19XG4gIDwvc3Bhbj5cbjwvZGl2PlxuIl19
|
|
@@ -27,15 +27,30 @@ import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'r
|
|
|
27
27
|
import * as i0 from "@angular/core";
|
|
28
28
|
import * as i1 from "@ajf/core/forms";
|
|
29
29
|
import * as i2 from "@angular/common";
|
|
30
|
-
import * as i3 from "@angular/material/
|
|
31
|
-
import * as i4 from "@angular/material/
|
|
32
|
-
import * as i5 from "@angular/
|
|
33
|
-
import * as i6 from "
|
|
34
|
-
import * as i7 from "
|
|
35
|
-
import * as i8 from "
|
|
36
|
-
import * as i9 from "./warning-alert-service";
|
|
30
|
+
import * as i3 from "@angular/material/select";
|
|
31
|
+
import * as i4 from "@angular/material/core";
|
|
32
|
+
import * as i5 from "@angular/forms";
|
|
33
|
+
import * as i6 from "ngx-mat-select-search";
|
|
34
|
+
import * as i7 from "@ngneat/transloco";
|
|
35
|
+
import * as i8 from "./warning-alert-service";
|
|
37
36
|
const maxChoicesInDom = 40;
|
|
38
37
|
export class AjfSingleChoiceFieldComponent extends AjfFieldWithChoicesComponent {
|
|
38
|
+
/**
|
|
39
|
+
* Whether the choices collapse into a searchable dropdown. Below the search
|
|
40
|
+
* threshold they are laid out as buttons instead, which reads faster for a
|
|
41
|
+
* short list. `forceExpanded` wins over `forceNarrow`, so a schema can pin
|
|
42
|
+
* either presentation regardless of how many choices there are.
|
|
43
|
+
*/
|
|
44
|
+
get isNarrow() {
|
|
45
|
+
const instance = this.instance;
|
|
46
|
+
if (instance == null) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (instance.node.forceExpanded) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return instance.node.forceNarrow || instance.filteredChoices.length > this.expandThreshold;
|
|
53
|
+
}
|
|
39
54
|
constructor(cdr, service, was, searchThreshold) {
|
|
40
55
|
super(cdr, service, was, searchThreshold);
|
|
41
56
|
this.expandThreshold = super.searchThreshold;
|
|
@@ -82,12 +97,12 @@ export class AjfSingleChoiceFieldComponent extends AjfFieldWithChoicesComponent
|
|
|
82
97
|
this._choicesUpdate$.complete();
|
|
83
98
|
}
|
|
84
99
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSingleChoiceFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AjfFormRendererService }, { token: AJF_WARNING_ALERT_SERVICE }, { token: AJF_SEARCH_ALERT_THRESHOLD, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
85
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AjfSingleChoiceFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "@if (instance) {\n
|
|
100
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AjfSingleChoiceFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "@if (instance) {\n<ng-container *ngIf=\"control | async as ctrl\">\n <div class=\"ajf-choice-control\">\n @if (isNarrow) {\n <mat-select [formControl]=\"ctrl!\" panelClass=\"ajf-select-panel\">\n <mat-option class=\"ajf-select-search-option\">\n <ngx-mat-select-search\n [formControl]=\"searchFilterCtrl\"\n [placeholderLabel]=\"'Search' | transloco\"\n [noEntriesFoundLabel]=\"'Nothing found' | transloco\"\n [enableClearOnEscapePressed]=\"true\"\n >\n </ngx-mat-select-search>\n </mat-option>\n <mat-option [value]=\"choice.value\" *ngFor=\"let choice of filteredChoices$ | async\">\n {{ choice.translatedLabel ?? (choice.label | transloco) }}\n </mat-option>\n </mat-select>\n } @else {\n <div\n class=\"ajf-segmented ajf-choices-container\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"instance.node.name\"\n >\n <button\n type=\"button\"\n class=\"ajf-segment\"\n role=\"radio\"\n *ngFor=\"let choice of instance.filteredChoices\"\n [attr.aria-checked]=\"ctrl.value === choice.value\"\n [class.ajf-selected]=\"ctrl.value === choice.value\"\n [disabled]=\"ctrl.disabled\"\n (click)=\"ctrl.setValue(choice.value)\"\n >\n {{ choice.translatedLabel ?? (choice.label | transloco) }}\n </button>\n </div>\n }\n\n <!-- A picked radio cannot be unpicked, so emptying the field needs its own\n action. -->\n <button\n type=\"button\"\n class=\"ajf-btn--ghost ajf-clear-value\"\n *ngIf=\"hasValue(ctrl) && !ctrl.disabled\"\n (click)=\"clearValue(ctrl, $event)\"\n >\n {{ 'Clear' | transloco }}\n </button>\n </div>\n</ng-container>\n}\n", styles: [".ajf-choice-control{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.mat-mdc-select-panel.ajf-select-panel{border:1px solid var(--ajf-border, #e6e2dc);background:var(--ajf-surface, #ffffff)}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option{font-family:var(--ajf-font-sans, sans-serif)}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option .mdc-list-item__primary-text{color:var(--ajf-text, #1c1a17);font-size:14px}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option.ajf-select-search-option{min-height:0;padding:0;border-bottom:1px solid var(--ajf-border, #e6e2dc);background:var(--ajf-surface, #ffffff);pointer-events:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.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: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "closeIcon", "closeSvgIcon", "noEntriesFoundLabel", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toggleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti", "recreateValuesArray"], outputs: ["toggleAll"] }, { kind: "pipe", type: i7.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
86
101
|
}
|
|
87
102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSingleChoiceFieldComponent, decorators: [{
|
|
88
103
|
type: Component,
|
|
89
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (instance) {\n
|
|
90
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AjfFormRendererService }, { type:
|
|
104
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (instance) {\n<ng-container *ngIf=\"control | async as ctrl\">\n <div class=\"ajf-choice-control\">\n @if (isNarrow) {\n <mat-select [formControl]=\"ctrl!\" panelClass=\"ajf-select-panel\">\n <mat-option class=\"ajf-select-search-option\">\n <ngx-mat-select-search\n [formControl]=\"searchFilterCtrl\"\n [placeholderLabel]=\"'Search' | transloco\"\n [noEntriesFoundLabel]=\"'Nothing found' | transloco\"\n [enableClearOnEscapePressed]=\"true\"\n >\n </ngx-mat-select-search>\n </mat-option>\n <mat-option [value]=\"choice.value\" *ngFor=\"let choice of filteredChoices$ | async\">\n {{ choice.translatedLabel ?? (choice.label | transloco) }}\n </mat-option>\n </mat-select>\n } @else {\n <div\n class=\"ajf-segmented ajf-choices-container\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"instance.node.name\"\n >\n <button\n type=\"button\"\n class=\"ajf-segment\"\n role=\"radio\"\n *ngFor=\"let choice of instance.filteredChoices\"\n [attr.aria-checked]=\"ctrl.value === choice.value\"\n [class.ajf-selected]=\"ctrl.value === choice.value\"\n [disabled]=\"ctrl.disabled\"\n (click)=\"ctrl.setValue(choice.value)\"\n >\n {{ choice.translatedLabel ?? (choice.label | transloco) }}\n </button>\n </div>\n }\n\n <!-- A picked radio cannot be unpicked, so emptying the field needs its own\n action. -->\n <button\n type=\"button\"\n class=\"ajf-btn--ghost ajf-clear-value\"\n *ngIf=\"hasValue(ctrl) && !ctrl.disabled\"\n (click)=\"clearValue(ctrl, $event)\"\n >\n {{ 'Clear' | transloco }}\n </button>\n </div>\n</ng-container>\n}\n", styles: [".ajf-choice-control{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0}.mat-mdc-select-panel.ajf-select-panel{border:1px solid var(--ajf-border, #e6e2dc);background:var(--ajf-surface, #ffffff)}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option{font-family:var(--ajf-font-sans, sans-serif)}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option .mdc-list-item__primary-text{color:var(--ajf-text, #1c1a17);font-size:14px}.mat-mdc-select-panel.ajf-select-panel .mat-mdc-option.ajf-select-search-option{min-height:0;padding:0;border-bottom:1px solid var(--ajf-border, #e6e2dc);background:var(--ajf-surface, #ffffff);pointer-events:auto}\n"] }]
|
|
105
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AjfFormRendererService }, { type: i8.AjfWarningAlertService, decorators: [{
|
|
91
106
|
type: Inject,
|
|
92
107
|
args: [AJF_WARNING_ALERT_SERVICE]
|
|
93
108
|
}] }, { type: undefined, decorators: [{
|
|
@@ -96,4 +111,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
96
111
|
type: Inject,
|
|
97
112
|
args: [AJF_SEARCH_ALERT_THRESHOLD]
|
|
98
113
|
}] }] });
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLWNob2ljZS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9zaW5nbGUtY2hvaWNlLWZpZWxkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3NpbmdsZS1jaG9pY2UtZmllbGQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUV6Qiw0QkFBNEIsR0FFN0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sUUFBUSxFQUNSLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQUk3RixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFRM0IsTUFBTSxPQUFPLDZCQUNYLFNBQVEsNEJBQStCO0lBV3ZDLFlBQ0UsR0FBc0IsRUFDdEIsT0FBK0IsRUFDSSxHQUEyQixFQUNkLGVBQXVCO1FBRXZFLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQWRuQyxvQkFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDeEMscUJBQWdCLEdBQUcsSUFBSSxXQUFXLENBQVMsRUFBRSxFQUFFLEVBQUMsV0FB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QztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRVEsV0FBVztRQUNsQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEMsQ0FBQzsrR0F4RVUsNkJBQTZCLHlGQWU5Qix5QkFBeUIsYUFDYiwwQkFBMEI7bUdBaEJyQyw2QkFBNkIsMkVDcEQxQyxrb0NBeUJBOzs0RkQyQmEsNkJBQTZCO2tCQU56QyxTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OzBCQWlCbEMsTUFBTTsyQkFBQyx5QkFBeUI7OzBCQUNoQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQUpGX1NFQVJDSF9BTEVSVF9USFJFU0hPTEQsXG4gIEFKRl9XQVJOSU5HX0FMRVJUX1NFUlZJQ0UsXG4gIEFqZkNob2ljZSxcbiAgQWpmRmllbGRXaXRoQ2hvaWNlc0NvbXBvbmVudCxcbiAgQWpmRm9ybVJlbmRlcmVyU2VydmljZSxcbn0gZnJvbSAnQGFqZi9jb3JlL2Zvcm1zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7QWpmV2FybmluZ0FsZXJ0U2VydmljZX0gZnJvbSAnLi93YXJuaW5nLWFsZXJ0LXNlcnZpY2UnO1xuXG5jb25zdCBtYXhDaG9pY2VzSW5Eb20gPSA0MDtcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnc2luZ2xlLWNob2ljZS1maWVsZC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3NpbmdsZS1jaG9pY2UtZmllbGQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmU2luZ2xlQ2hvaWNlRmllbGRDb21wb25lbnQ8VD5cbiAgZXh0ZW5kcyBBamZGaWVsZFdpdGhDaG9pY2VzQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25EZXN0cm95XG57XG4gIHJlYWRvbmx5IGV4cGFuZFRocmVzaG9sZCA9IHN1cGVyLnNlYXJjaFRocmVzaG9sZDtcbiAgcmVhZG9ubHkgc2VhcmNoRmlsdGVyQ3RybCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7bm9uTnVsbGFibGU6IHRydWV9KTtcblxuICBmaWx0ZXJlZENob2ljZXMkOiBPYnNlcnZhYmxlPEFqZkNob2ljZTxhbnk+W10+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nob2ljZXNVcGRhdGUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaW5zdGFuY2VVcGRhdGVGb3JDaG9pY2VzU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgc2VydmljZTogQWpmRm9ybVJlbmRlcmVyU2VydmljZSxcbiAgICBASW5qZWN0KEFKRl9XQVJOSU5HX0FMRVJUX1NFUlZJQ0UpIHdhczogQWpmV2FybmluZ0FsZXJ0U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFKRl9TRUFSQ0hfQUxFUlRfVEhSRVNIT0xEKSBzZWFyY2hUaHJlc2hvbGQ6IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoY2RyLCBzZXJ2aWNlLCB3YXMsIHNlYXJjaFRocmVzaG9sZCk7XG5cbiAgICBjb25zdCBjb250cm9sVmFsdWUkID0gdGhpcy5jb250cm9sLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoY3RybCA9PiAoY3RybCA/IGN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKGN0cmwudmFsdWUpKSA6IG9mKG51bGwpKSksXG4gICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICk7XG5cbiAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLnNlYXJjaEZpbHRlckN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDE1MCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgICB0aGlzLl9jaG9pY2VzVXBkYXRlJCxcbiAgICAgICkucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgY29udHJvbFZhbHVlJCxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbXywgc2VsZWN0ZWRWYWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hGaWx0ZXJDdHJsLnZhbHVlO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5pbnN0YW5jZT8uZmlsdGVyZWRDaG9pY2VzIHx8IFtdO1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgY29uc3QgbG93ZXJTZWFyY2ggPSBzZWFyY2gudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICByZXR1cm4gY2hvaWNlcy5maWx0ZXIoYyA9PlxuICAgICAgICAgICAgKGMudHJhbnNsYXRlZExhYmVsID8/IGMubGFiZWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJTZWFyY2gpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZXMubGVuZ3RoIDw9IG1heENob2ljZXNJbkRvbSkge1xuICAgICAgICAgIHJldHVybiBjaG9pY2VzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRydW5jYXRlZCA9IGNob2ljZXMuc2xpY2UoMCwgbWF4Q2hvaWNlc0luRG9tKTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzZWxlY3RlZCBjaG9pY2UgaXMgaW5jbHVkZWQgaW4gdHJ1bmNhdGVkXG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlICE9IG51bGwgJiYgIXRydW5jYXRlZC5zb21lKGMgPT4gYy52YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNob2ljZXMuZmluZChjID0+IGMudmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtzZWxlY3RlZCwgLi4udHJ1bmNhdGVkXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydW5jYXRlZDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX29uSW5zdGFuY2VDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2VVcGRhdGVGb3JDaG9pY2VzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fY2hvaWNlc1VwZGF0ZSQubmV4dCgpO1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZVVwZGF0ZUZvckNob2ljZXNTdWIgPSB0aGlzLmluc3RhbmNlLnVwZGF0ZWRFdnQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hvaWNlc1VwZGF0ZSQubmV4dCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLl9pbnN0YW5jZVVwZGF0ZUZvckNob2ljZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jaG9pY2VzVXBkYXRlJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCJAaWYgKGluc3RhbmNlKSB7XG4gIEBpZiAoaW5zdGFuY2Uubm9kZS5mb3JjZU5hcnJvdyB8fCBpbnN0YW5jZS5maWx0ZXJlZENob2ljZXMubGVuZ3RoID4gZXhwYW5kVGhyZXNob2xkKSB7XG4gICAgPG1hdC1zZWxlY3QgKm5nSWY9XCJjb250cm9sfGFzeW5jIGFzIGN0cmxcIiBbZm9ybUNvbnRyb2xdPVwiY3RybCFcIj5cbiAgICAgIDxtYXQtb3B0aW9uIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiJ3doaXRlJ1wiPlxuICAgICAgICA8bmd4LW1hdC1zZWxlY3Qtc2VhcmNoXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaEZpbHRlckN0cmxcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlckxhYmVsXT1cIidTZWFyY2gnfHRyYW5zbG9jb1wiXG4gICAgICAgICAgW25vRW50cmllc0ZvdW5kTGFiZWxdPVwiJ05vdGhpbmcgZm91bmQnfHRyYW5zbG9jb1wiXG4gICAgICAgICAgW2VuYWJsZUNsZWFyT25Fc2NhcGVQcmVzc2VkXT1cInRydWVcIj5cbiAgICAgICAgPC9uZ3gtbWF0LXNlbGVjdC1zZWFyY2g+XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY2hvaWNlLnZhbHVlXCIgKm5nRm9yPVwibGV0IGNob2ljZSBvZiBmaWx0ZXJlZENob2ljZXMkIHwgYXN5bmNcIj5cbiAgICAgICAge3sgY2hvaWNlLnRyYW5zbGF0ZWRMYWJlbCA/PyAoY2hvaWNlLmxhYmVsfHRyYW5zbG9jbykgfX1cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8L21hdC1zZWxlY3Q+XG4gIH0gQGVsc2Uge1xuICAgIDxtYXQtcmFkaW8tZ3JvdXAgKm5nSWY9XCJjb250cm9sfGFzeW5jIGFzIGN0cmxcIiBjbGFzcz1cImFqZi1jaG9pY2VzLWNvbnRhaW5lclwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpbnN0YW5jZS5ub2RlLm5hbWVcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY3RybCFcIj5cbiAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGluc3RhbmNlLmZpbHRlcmVkQ2hvaWNlc1wiPlxuICAgICAgICB7eyBjaG9pY2UudHJhbnNsYXRlZExhYmVsID8/IChjaG9pY2UubGFiZWx8dHJhbnNsb2NvKSB9fVxuICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICB9XG59XG4iXX0=
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLWNob2ljZS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9zaW5nbGUtY2hvaWNlLWZpZWxkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3NpbmdsZS1jaG9pY2UtZmllbGQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUV6Qiw0QkFBNEIsR0FFN0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sUUFBUSxFQUNSLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBSTdGLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQVEzQixNQUFNLE9BQU8sNkJBQ1gsU0FBUSw0QkFBK0I7SUFNdkM7Ozs7O09BS0c7SUFDSCxJQUFJLFFBQVE7UUFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FB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LENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFa0IsaUJBQWlCO1FBQ2xDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUMxRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFUSxXQUFXO1FBQ2xCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxDQUFDOytHQXpGVSw2QkFBNkIseUZBZ0M5Qix5QkFBeUIsYUFDYiwwQkFBMEI7bUdBakNyQyw2QkFBNkIsMkVDcEQxQyx5dkRBb0RBOzs0RkRBYSw2QkFBNkI7a0JBTnpDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs7MEJBa0NsQyxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQ2hDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBBSkZfU0VBUkNIX0FMRVJUX1RIUkVTSE9MRCxcbiAgQUpGX1dBUk5JTkdfQUxFUlRfU0VSVklDRSxcbiAgQWpmQ2hvaWNlLFxuICBBamZGaWVsZFdpdGhDaG9pY2VzQ29tcG9uZW50LFxuICBBamZGb3JtUmVuZGVyZXJTZXJ2aWNlLFxufSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtBamZXYXJuaW5nQWxlcnRTZXJ2aWNlfSBmcm9tICcuL3dhcm5pbmctYWxlcnQtc2VydmljZSc7XG5cbmNvbnN0IG1heENob2ljZXNJbkRvbSA9IDQwO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdzaW5nbGUtY2hvaWNlLWZpZWxkLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2luZ2xlLWNob2ljZS1maWVsZC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBamZTaW5nbGVDaG9pY2VGaWVsZENvbXBvbmVudDxUPlxuICBleHRlbmRzIEFqZkZpZWxkV2l0aENob2ljZXNDb21wb25lbnQ8VD5cbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3lcbntcbiAgcmVhZG9ubHkgZXhwYW5kVGhyZXNob2xkID0gc3VwZXIuc2VhcmNoVGhyZXNob2xkO1xuICByZWFkb25seSBzZWFyY2hGaWx0ZXJDdHJsID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHtub25OdWxsYWJsZTogdHJ1ZX0pO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjaG9pY2VzIGNvbGxhcHNlIGludG8gYSBzZWFyY2hhYmxlIGRyb3Bkb3duLiBCZWxvdyB0aGUgc2VhcmNoXG4gICAqIHRocmVzaG9sZCB0aGV5IGFyZSBsYWlkIG91dCBhcyBidXR0b25zIGluc3RlYWQsIHdoaWNoIHJlYWRzIGZhc3RlciBmb3IgYVxuICAgKiBzaG9ydCBsaXN0LiBgZm9yY2VFeHBhbmRlZGAgd2lucyBvdmVyIGBmb3JjZU5hcnJvd2AsIHNvIGEgc2NoZW1hIGNhbiBwaW5cbiAgICogZWl0aGVyIHByZXNlbnRhdGlvbiByZWdhcmRsZXNzIG9mIGhvdyBtYW55IGNob2ljZXMgdGhlcmUgYXJlLlxuICAgKi9cbiAgZ2V0IGlzTmFycm93KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcbiAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uubm9kZS5mb3JjZUV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZS5ub2RlLmZvcmNlTmFycm93IHx8IGluc3RhbmNlLmZpbHRlcmVkQ2hvaWNlcy5sZW5ndGggPiB0aGlzLmV4cGFuZFRocmVzaG9sZDtcbiAgfVxuXG4gIGZpbHRlcmVkQ2hvaWNlcyQ6IE9ic2VydmFibGU8QWpmQ2hvaWNlPGFueT5bXT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2hvaWNlc1VwZGF0ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9pbnN0YW5jZVVwZGF0ZUZvckNob2ljZXNTdWIgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBzZXJ2aWNlOiBBamZGb3JtUmVuZGVyZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoQUpGX1dBUk5JTkdfQUxFUlRfU0VSVklDRSkgd2FzOiBBamZXYXJuaW5nQWxlcnRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQUpGX1NFQVJDSF9BTEVSVF9USFJFU0hPTEQpIHNlYXJjaFRocmVzaG9sZDogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihjZHIsIHNlcnZpY2UsIHdhcywgc2VhcmNoVGhyZXNob2xkKTtcblxuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSQgPSB0aGlzLmNvbnRyb2wucGlwZShcbiAgICAgIHN3aXRjaE1hcChjdHJsID0+IChjdHJsID8gY3RybC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoY3RybC52YWx1ZSkpIDogb2YobnVsbCkpKSxcbiAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgKTtcblxuICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuc2VhcmNoRmlsdGVyQ3RybC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMTUwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgICAgIHRoaXMuX2Nob2ljZXNVcGRhdGUkLFxuICAgICAgKS5waXBlKHN0YXJ0V2l0aChudWxsKSksXG4gICAgICBjb250cm9sVmFsdWUkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtfLCBzZWxlY3RlZFZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNlYXJjaEZpbHRlckN0cmwudmFsdWU7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLmluc3RhbmNlPy5maWx0ZXJlZENob2ljZXMgfHwgW107XG4gICAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCBsb3dlclNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHJldHVybiBjaG9pY2VzLmZpbHRlcihjID0+XG4gICAgICAgICAgICAoYy50cmFuc2xhdGVkTGFiZWwgPz8gYy5sYWJlbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclNlYXJjaCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hvaWNlcy5sZW5ndGggPD0gbWF4Q2hvaWNlc0luRG9tKSB7XG4gICAgICAgICAgcmV0dXJuIGNob2ljZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkID0gY2hvaWNlcy5zbGljZSgwLCBtYXhDaG9pY2VzSW5Eb20pO1xuICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNlbGVjdGVkIGNob2ljZSBpcyBpbmNsdWRlZCBpbiB0cnVuY2F0ZWRcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWUgIT0gbnVsbCAmJiAhdHJ1bmNhdGVkLnNvbWUoYyA9PiBjLnZhbHVlID09PSBzZWxlY3RlZFZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2hvaWNlcy5maW5kKGMgPT4gYy52YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gW3NlbGVjdGVkLCAuLi50cnVuY2F0ZWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1bmNhdGVkO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfb25JbnN0YW5jZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0YW5jZVVwZGF0ZUZvckNob2ljZXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jaG9pY2VzVXBkYXRlJC5uZXh0KCk7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX2luc3RhbmNlVXBkYXRlRm9yQ2hvaWNlc1N1YiA9IHRoaXMuaW5zdGFuY2UudXBkYXRlZEV2dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jaG9pY2VzVXBkYXRlJC5uZXh0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX2luc3RhbmNlVXBkYXRlRm9yQ2hvaWNlc1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2Nob2ljZXNVcGRhdGUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIkBpZiAoaW5zdGFuY2UpIHtcbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sIHwgYXN5bmMgYXMgY3RybFwiPlxuICA8ZGl2IGNsYXNzPVwiYWpmLWNob2ljZS1jb250cm9sXCI+XG4gICAgQGlmIChpc05hcnJvdykge1xuICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJjdHJsIVwiIHBhbmVsQ2xhc3M9XCJhamYtc2VsZWN0LXBhbmVsXCI+XG4gICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImFqZi1zZWxlY3Qtc2VhcmNoLW9wdGlvblwiPlxuICAgICAgICA8bmd4LW1hdC1zZWxlY3Qtc2VhcmNoXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaEZpbHRlckN0cmxcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlckxhYmVsXT1cIidTZWFyY2gnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICBbbm9FbnRyaWVzRm91bmRMYWJlbF09XCInTm90aGluZyBmb3VuZCcgfCB0cmFuc2xvY29cIlxuICAgICAgICAgIFtlbmFibGVDbGVhck9uRXNjYXBlUHJlc3NlZF09XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICA8L25neC1tYXQtc2VsZWN0LXNlYXJjaD5cbiAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGZpbHRlcmVkQ2hvaWNlcyQgfCBhc3luY1wiPlxuICAgICAgICB7eyBjaG9pY2UudHJhbnNsYXRlZExhYmVsID8/IChjaG9pY2UubGFiZWwgfCB0cmFuc2xvY28pIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgPC9tYXQtc2VsZWN0PlxuICAgIH0gQGVsc2Uge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiYWpmLXNlZ21lbnRlZCBhamYtY2hvaWNlcy1jb250YWluZXJcIlxuICAgICAgcm9sZT1cInJhZGlvZ3JvdXBcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImluc3RhbmNlLm5vZGUubmFtZVwiXG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJhamYtc2VnbWVudFwiXG4gICAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgaW5zdGFuY2UuZmlsdGVyZWRDaG9pY2VzXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImN0cmwudmFsdWUgPT09IGNob2ljZS52YWx1ZVwiXG4gICAgICAgIFtjbGFzcy5hamYtc2VsZWN0ZWRdPVwiY3RybC52YWx1ZSA9PT0gY2hvaWNlLnZhbHVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN0cmwuZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwiY3RybC5zZXRWYWx1ZShjaG9pY2UudmFsdWUpXCJcbiAgICAgID5cbiAgICAgICAge3sgY2hvaWNlLnRyYW5zbGF0ZWRMYWJlbCA/PyAoY2hvaWNlLmxhYmVsIHwgdHJhbnNsb2NvKSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBBIHBpY2tlZCByYWRpbyBjYW5ub3QgYmUgdW5waWNrZWQsIHNvIGVtcHR5aW5nIHRoZSBmaWVsZCBuZWVkcyBpdHMgb3duXG4gICAgICAgICBhY3Rpb24uIC0tPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhamYtYnRuLS1naG9zdCBhamYtY2xlYXItdmFsdWVcIlxuICAgICAgKm5nSWY9XCJoYXNWYWx1ZShjdHJsKSAmJiAhY3RybC5kaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZShjdHJsLCAkZXZlbnQpXCJcbiAgICA+XG4gICAgICB7eyAnQ2xlYXInIHwgdHJhbnNsb2NvIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG59XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "@angular/material/icon";
|
|
5
|
+
import * as i3 from "@angular/material/menu";
|
|
6
|
+
import * as i4 from "@ngneat/transloco";
|
|
7
|
+
/**
|
|
8
|
+
* The bar at the top of every slide: its number and title, a menu to jump to any
|
|
9
|
+
* other slide, previous/next paging, and a slot for the form's own action
|
|
10
|
+
* buttons.
|
|
11
|
+
*
|
|
12
|
+
* What the form still has failing is reported by the footer alone. Naming it
|
|
13
|
+
* here too cost a phone's whole header width to repeat something already on
|
|
14
|
+
* screen.
|
|
15
|
+
*
|
|
16
|
+
* Paging belongs to the renderer, which owns the page slider, so it is raised
|
|
17
|
+
* as an event rather than handled here.
|
|
18
|
+
*/
|
|
19
|
+
export class AjfSlideHeader {
|
|
20
|
+
constructor() {
|
|
21
|
+
/** Absent while a start or end message page is on screen. */
|
|
22
|
+
this.slide = null;
|
|
23
|
+
/** The number shown in the badge, already offset by any start message. */
|
|
24
|
+
this.displayNumber = 1;
|
|
25
|
+
/** Every slide of the form, for the jump menu. */
|
|
26
|
+
this.slides = [];
|
|
27
|
+
/** How many pages the slider holds, repetitions and message pages included. */
|
|
28
|
+
this.pages = 0;
|
|
29
|
+
this.jumpTo = new EventEmitter();
|
|
30
|
+
this.prev = new EventEmitter();
|
|
31
|
+
this.next = new EventEmitter();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether the form has anywhere to page to. A single page form gets no arrows
|
|
35
|
+
* and no "slide 1 of 1": both are controls that cannot do anything.
|
|
36
|
+
*/
|
|
37
|
+
get canNavigate() {
|
|
38
|
+
return this.pages > 1;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether the jump menu is worth opening. Counted over the visible slides, the
|
|
42
|
+
* only ones the menu can actually reach.
|
|
43
|
+
*/
|
|
44
|
+
get canJump() {
|
|
45
|
+
return this.slides.filter(s => s.visible !== false).length > 1;
|
|
46
|
+
}
|
|
47
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideHeader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
48
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfSlideHeader, selector: "ajf-slide-header", inputs: { slide: "slide", displayNumber: "displayNumber", slides: "slides", pages: "pages" }, outputs: { jumpTo: "jumpTo", prev: "prev", next: "next" }, ngImport: i0, template: "<div class=\"ajf-slide-header\">\n <button\n type=\"button\"\n class=\"ajf-slide-title\"\n [class.ajf-slide-title-static]=\"!slide || !canJump\"\n [disabled]=\"!slide || !canJump\"\n [matMenuTriggerFor]=\"slideMenu\"\n [attr.aria-label]=\"'Go to slide' | transloco\"\n >\n <span class=\"ajf-slide-number\">{{ displayNumber }}</span>\n\n <!-- Every slide title is laid out in the same grid cell, so the trigger is as\n wide as the longest of them and keeps that width while paging. Only the\n current title is visible; the rest just hold the space open. -->\n <span class=\"ajf-slide-label-stack\">\n <span\n class=\"ajf-slide-label\"\n *ngFor=\"let s of slides\"\n [class.ajf-current]=\"s === slide\"\n [innerHTML]=\"s.node.label | transloco\"\n ></span>\n </span>\n <mat-icon class=\"ajf-slide-caret\" *ngIf=\"slide && canJump\">arrow_drop_down</mat-icon>\n </button>\n\n <mat-menu #slideMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let s of slides\"\n [disabled]=\"s.visible === false\"\n (click)=\"jumpTo.emit(s)\"\n >\n <mat-icon [class.ajf-invalid]=\"!s.valid\">{{ s.valid ? 'check' : 'warning' }}</mat-icon>\n <span [innerHTML]=\"s.node.label | transloco\"></span>\n </button>\n </mat-menu>\n\n <!-- Nothing to page through in a single page form. -->\n <div class=\"ajf-slide-nav\" *ngIf=\"canNavigate\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n (click)=\"prev.emit()\"\n [attr.aria-label]=\"'Back' | transloco\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n (click)=\"next.emit()\"\n [attr.aria-label]=\"'Forward' | transloco\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n <span class=\"ajf-slide-header-spacer\"></span>\n\n <ng-content></ng-content>\n</div>\n", styles: ["ajf-slide-header{display:block}ajf-slide-header .ajf-slide-header{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;background:var(--ajf-surface);font-family:var(--ajf-font-sans)}ajf-slide-header .ajf-slide-header-spacer{flex:1 1 auto}ajf-slide-header .ajf-slide-title{display:inline-flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;min-height:var(--ajf-control-h);border:1px solid var(--ajf-border-strong);border-radius:var(--ajf-radius);background:var(--ajf-surface);color:var(--ajf-text);font-family:var(--ajf-font-sans);font-size:14px;cursor:pointer;flex:0 1 auto;justify-content:flex-start;gap:10px;max-width:100%;padding:0 12px}ajf-slide-header .ajf-slide-title:hover:not(:disabled){border-color:var(--ajf-accent)}ajf-slide-header .ajf-slide-title:disabled{color:var(--ajf-text-faint);cursor:default}ajf-slide-header .ajf-slide-title .ajf-slide-number{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ajf-accent);color:var(--ajf-accent-fg);font-size:12px;font-weight:600}ajf-slide-header .ajf-slide-title .ajf-slide-label-stack{display:grid;min-width:0;max-width:340px;text-align:left}ajf-slide-header .ajf-slide-title .ajf-slide-label{grid-area:1/1;overflow:hidden;visibility:hidden;font-size:16px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}ajf-slide-header .ajf-slide-title .ajf-slide-label.ajf-current{visibility:visible}ajf-slide-header .ajf-slide-title .ajf-slide-caret{width:20px;height:20px;margin-left:auto;color:var(--ajf-text-muted);font-size:20px}ajf-slide-header .ajf-slide-title-static{cursor:default}ajf-slide-header .ajf-slide-title-static:hover{border-color:var(--ajf-border-strong)}ajf-slide-header .ajf-slide-nav{display:flex;gap:8px}ajf-slide-header .ajf-slide-nav .ajf-btn{width:var(--ajf-control-h);padding:0}.mat-mdc-menu-panel .mat-mdc-menu-item .mat-icon.ajf-invalid{color:var(--ajf-danger)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideHeader, decorators: [{
|
|
51
|
+
type: Component,
|
|
52
|
+
args: [{ selector: 'ajf-slide-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"ajf-slide-header\">\n <button\n type=\"button\"\n class=\"ajf-slide-title\"\n [class.ajf-slide-title-static]=\"!slide || !canJump\"\n [disabled]=\"!slide || !canJump\"\n [matMenuTriggerFor]=\"slideMenu\"\n [attr.aria-label]=\"'Go to slide' | transloco\"\n >\n <span class=\"ajf-slide-number\">{{ displayNumber }}</span>\n\n <!-- Every slide title is laid out in the same grid cell, so the trigger is as\n wide as the longest of them and keeps that width while paging. Only the\n current title is visible; the rest just hold the space open. -->\n <span class=\"ajf-slide-label-stack\">\n <span\n class=\"ajf-slide-label\"\n *ngFor=\"let s of slides\"\n [class.ajf-current]=\"s === slide\"\n [innerHTML]=\"s.node.label | transloco\"\n ></span>\n </span>\n <mat-icon class=\"ajf-slide-caret\" *ngIf=\"slide && canJump\">arrow_drop_down</mat-icon>\n </button>\n\n <mat-menu #slideMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let s of slides\"\n [disabled]=\"s.visible === false\"\n (click)=\"jumpTo.emit(s)\"\n >\n <mat-icon [class.ajf-invalid]=\"!s.valid\">{{ s.valid ? 'check' : 'warning' }}</mat-icon>\n <span [innerHTML]=\"s.node.label | transloco\"></span>\n </button>\n </mat-menu>\n\n <!-- Nothing to page through in a single page form. -->\n <div class=\"ajf-slide-nav\" *ngIf=\"canNavigate\">\n <button\n type=\"button\"\n class=\"ajf-btn\"\n (click)=\"prev.emit()\"\n [attr.aria-label]=\"'Back' | transloco\"\n >\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"ajf-btn\"\n (click)=\"next.emit()\"\n [attr.aria-label]=\"'Forward' | transloco\"\n >\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n\n <span class=\"ajf-slide-header-spacer\"></span>\n\n <ng-content></ng-content>\n</div>\n", styles: ["ajf-slide-header{display:block}ajf-slide-header .ajf-slide-header{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;background:var(--ajf-surface);font-family:var(--ajf-font-sans)}ajf-slide-header .ajf-slide-header-spacer{flex:1 1 auto}ajf-slide-header .ajf-slide-title{display:inline-flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;min-height:var(--ajf-control-h);border:1px solid var(--ajf-border-strong);border-radius:var(--ajf-radius);background:var(--ajf-surface);color:var(--ajf-text);font-family:var(--ajf-font-sans);font-size:14px;cursor:pointer;flex:0 1 auto;justify-content:flex-start;gap:10px;max-width:100%;padding:0 12px}ajf-slide-header .ajf-slide-title:hover:not(:disabled){border-color:var(--ajf-accent)}ajf-slide-header .ajf-slide-title:disabled{color:var(--ajf-text-faint);cursor:default}ajf-slide-header .ajf-slide-title .ajf-slide-number{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ajf-accent);color:var(--ajf-accent-fg);font-size:12px;font-weight:600}ajf-slide-header .ajf-slide-title .ajf-slide-label-stack{display:grid;min-width:0;max-width:340px;text-align:left}ajf-slide-header .ajf-slide-title .ajf-slide-label{grid-area:1/1;overflow:hidden;visibility:hidden;font-size:16px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}ajf-slide-header .ajf-slide-title .ajf-slide-label.ajf-current{visibility:visible}ajf-slide-header .ajf-slide-title .ajf-slide-caret{width:20px;height:20px;margin-left:auto;color:var(--ajf-text-muted);font-size:20px}ajf-slide-header .ajf-slide-title-static{cursor:default}ajf-slide-header .ajf-slide-title-static:hover{border-color:var(--ajf-border-strong)}ajf-slide-header .ajf-slide-nav{display:flex;gap:8px}ajf-slide-header .ajf-slide-nav .ajf-btn{width:var(--ajf-control-h);padding:0}.mat-mdc-menu-panel .mat-mdc-menu-item .mat-icon.ajf-invalid{color:var(--ajf-danger)}\n"] }]
|
|
53
|
+
}], propDecorators: { slide: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], displayNumber: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], slides: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], pages: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], jumpTo: [{
|
|
62
|
+
type: Output
|
|
63
|
+
}], prev: [{
|
|
64
|
+
type: Output
|
|
65
|
+
}], next: [{
|
|
66
|
+
type: Output
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybXMvc3JjL3NsaWRlLWhlYWRlci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm1zL3NyYy9zbGlkZS1oZWFkZXIuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1QkEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBRXhGOzs7Ozs7Ozs7OztHQVdHO0FBVUgsTUFBTSxPQUFPLGNBQWM7SUFUM0I7UUFVRSw2REFBNkQ7UUFDcEQsVUFBSyxHQUE0QixJQUFJLENBQUM7UUFFL0MsMEVBQTBFO1FBQ2pFLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLGtEQUFrRDtRQUN6QyxXQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUV6QywrRUFBK0U7UUFDdEUsVUFBSyxHQUFHLENBQUMsQ0FBQztRQWtCQSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFDOUMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDaEMsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FDcEQ7SUFuQkM7OztPQUdHO0lBQ0gsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDOytHQTNCVSxjQUFjO21HQUFkLGNBQWMsaU5DOUMzQixpN0RBNkRBOzs0RkRmYSxjQUFjO2tCQVQxQixTQUFTOytCQUNFLGtCQUFrQixpQkFHYixpQkFBaUIsQ0FBQyxJQUFJOzhCQU81QixLQUFLO3NCQUFiLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQWtCYSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLElBQUk7c0JBQXRCLE1BQU07Z0JBQ1ksSUFBSTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtBamZTbGlkZUluc3RhbmNlfSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoZSBiYXIgYXQgdGhlIHRvcCBvZiBldmVyeSBzbGlkZTogaXRzIG51bWJlciBhbmQgdGl0bGUsIGEgbWVudSB0byBqdW1wIHRvIGFueVxuICogb3RoZXIgc2xpZGUsIHByZXZpb3VzL25leHQgcGFnaW5nLCBhbmQgYSBzbG90IGZvciB0aGUgZm9ybSdzIG93biBhY3Rpb25cbiAqIGJ1dHRvbnMuXG4gKlxuICogV2hhdCB0aGUgZm9ybSBzdGlsbCBoYXMgZmFpbGluZyBpcyByZXBvcnRlZCBieSB0aGUgZm9vdGVyIGFsb25lLiBOYW1pbmcgaXRcbiAqIGhlcmUgdG9vIGNvc3QgYSBwaG9uZSdzIHdob2xlIGhlYWRlciB3aWR0aCB0byByZXBlYXQgc29tZXRoaW5nIGFscmVhZHkgb25cbiAqIHNjcmVlbi5cbiAqXG4gKiBQYWdpbmcgYmVsb25ncyB0byB0aGUgcmVuZGVyZXIsIHdoaWNoIG93bnMgdGhlIHBhZ2Ugc2xpZGVyLCBzbyBpdCBpcyByYWlzZWRcbiAqIGFzIGFuIGV2ZW50IHJhdGhlciB0aGFuIGhhbmRsZWQgaGVyZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXNsaWRlLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnc2xpZGUtaGVhZGVyLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2xpZGUtaGVhZGVyLnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBPblB1c2g6IHNsaWRlIHZpc2liaWxpdHkgYW5kIHJlcGV0aXRpb24gY291bnRzIGFyZSBtdXRhdGVkXG4gIC8vIGluIHBsYWNlLCBzbyB0aGUganVtcCBtZW51IGFuZCB0aGUgcmVwZXRpdGlvbiBwaWxsIHdvdWxkIGdvIHN0YWxlIHVuZGVyIGFcbiAgLy8gc3RyYXRlZ3kgdGhhdCBvbmx5IHJlLWNoZWNrcyB3aGVuIGFuIGlucHV0IGlkZW50aXR5IGNoYW5nZXMuXG59KVxuZXhwb3J0IGNsYXNzIEFqZlNsaWRlSGVhZGVyIHtcbiAgLyoqIEFic2VudCB3aGlsZSBhIHN0YXJ0IG9yIGVuZCBtZXNzYWdlIHBhZ2UgaXMgb24gc2NyZWVuLiAqL1xuICBASW5wdXQoKSBzbGlkZTogQWpmU2xpZGVJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUaGUgbnVtYmVyIHNob3duIGluIHRoZSBiYWRnZSwgYWxyZWFkeSBvZmZzZXQgYnkgYW55IHN0YXJ0IG1lc3NhZ2UuICovXG4gIEBJbnB1dCgpIGRpc3BsYXlOdW1iZXIgPSAxO1xuXG4gIC8qKiBFdmVyeSBzbGlkZSBvZiB0aGUgZm9ybSwgZm9yIHRoZSBqdW1wIG1lbnUuICovXG4gIEBJbnB1dCgpIHNsaWRlczogQWpmU2xpZGVJbnN0YW5jZVtdID0gW107XG5cbiAgLyoqIEhvdyBtYW55IHBhZ2VzIHRoZSBzbGlkZXIgaG9sZHMsIHJlcGV0aXRpb25zIGFuZCBtZXNzYWdlIHBhZ2VzIGluY2x1ZGVkLiAqL1xuICBASW5wdXQoKSBwYWdlcyA9IDA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvcm0gaGFzIGFueXdoZXJlIHRvIHBhZ2UgdG8uIEEgc2luZ2xlIHBhZ2UgZm9ybSBnZXRzIG5vIGFycm93c1xuICAgKiBhbmQgbm8gXCJzbGlkZSAxIG9mIDFcIjogYm90aCBhcmUgY29udHJvbHMgdGhhdCBjYW5ub3QgZG8gYW55dGhpbmcuXG4gICAqL1xuICBnZXQgY2FuTmF2aWdhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMgPiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGp1bXAgbWVudSBpcyB3b3J0aCBvcGVuaW5nLiBDb3VudGVkIG92ZXIgdGhlIHZpc2libGUgc2xpZGVzLCB0aGVcbiAgICogb25seSBvbmVzIHRoZSBtZW51IGNhbiBhY3R1YWxseSByZWFjaC5cbiAgICovXG4gIGdldCBjYW5KdW1wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNsaWRlcy5maWx0ZXIocyA9PiBzLnZpc2libGUgIT09IGZhbHNlKS5sZW5ndGggPiAxO1xuICB9XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGp1bXBUbyA9IG5ldyBFdmVudEVtaXR0ZXI8QWpmU2xpZGVJbnN0YW5jZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHByZXYgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xufVxuIiwiPGRpdiBjbGFzcz1cImFqZi1zbGlkZS1oZWFkZXJcIj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYWpmLXNsaWRlLXRpdGxlXCJcbiAgICBbY2xhc3MuYWpmLXNsaWRlLXRpdGxlLXN0YXRpY109XCIhc2xpZGUgfHwgIWNhbkp1bXBcIlxuICAgIFtkaXNhYmxlZF09XCIhc2xpZGUgfHwgIWNhbkp1bXBcIlxuICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJzbGlkZU1lbnVcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0dvIHRvIHNsaWRlJyB8IHRyYW5zbG9jb1wiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImFqZi1zbGlkZS1udW1iZXJcIj57eyBkaXNwbGF5TnVtYmVyIH19PC9zcGFuPlxuXG4gICAgPCEtLSBFdmVyeSBzbGlkZSB0aXRsZSBpcyBsYWlkIG91dCBpbiB0aGUgc2FtZSBncmlkIGNlbGwsIHNvIHRoZSB0cmlnZ2VyIGlzIGFzXG4gICAgICAgICB3aWRlIGFzIHRoZSBsb25nZXN0IG9mIHRoZW0gYW5kIGtlZXBzIHRoYXQgd2lkdGggd2hpbGUgcGFnaW5nLiBPbmx5IHRoZVxuICAgICAgICAgY3VycmVudCB0aXRsZSBpcyB2aXNpYmxlOyB0aGUgcmVzdCBqdXN0IGhvbGQgdGhlIHNwYWNlIG9wZW4uIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiYWpmLXNsaWRlLWxhYmVsLXN0YWNrXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImFqZi1zbGlkZS1sYWJlbFwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBzIG9mIHNsaWRlc1wiXG4gICAgICAgIFtjbGFzcy5hamYtY3VycmVudF09XCJzID09PSBzbGlkZVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwicy5ub2RlLmxhYmVsIHwgdHJhbnNsb2NvXCJcbiAgICAgID48L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImFqZi1zbGlkZS1jYXJldFwiICpuZ0lmPVwic2xpZGUgJiYgY2FuSnVtcFwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxtYXQtbWVudSAjc2xpZGVNZW51PVwibWF0TWVudVwiPlxuICAgIDxidXR0b25cbiAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBzIG9mIHNsaWRlc1wiXG4gICAgICBbZGlzYWJsZWRdPVwicy52aXNpYmxlID09PSBmYWxzZVwiXG4gICAgICAoY2xpY2spPVwianVtcFRvLmVtaXQocylcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBbY2xhc3MuYWpmLWludmFsaWRdPVwiIXMudmFsaWRcIj57eyBzLnZhbGlkID8gJ2NoZWNrJyA6ICd3YXJuaW5nJyB9fTwvbWF0LWljb24+XG4gICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInMubm9kZS5sYWJlbCB8IHRyYW5zbG9jb1wiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtbWVudT5cblxuICA8IS0tIE5vdGhpbmcgdG8gcGFnZSB0aHJvdWdoIGluIGEgc2luZ2xlIHBhZ2UgZm9ybS4gLS0+XG4gIDxkaXYgY2xhc3M9XCJhamYtc2xpZGUtbmF2XCIgKm5nSWY9XCJjYW5OYXZpZ2F0ZVwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJhamYtYnRuXCJcbiAgICAgIChjbGljayk9XCJwcmV2LmVtaXQoKVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCYWNrJyB8IHRyYW5zbG9jb1wiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImFqZi1idG5cIlxuICAgICAgKGNsaWNrKT1cIm5leHQuZW1pdCgpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZvcndhcmQnIHwgdHJhbnNsb2NvXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxzcGFuIGNsYXNzPVwiYWpmLXNsaWRlLWhlYWRlci1zcGFjZXJcIj48L3NwYW4+XG5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (C) Gnucoop soc. coop.
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Advanced JSON forms (ajf).
|
|
6
|
+
*
|
|
7
|
+
* Advanced JSON forms (ajf) is free software: you can redistribute it and/or
|
|
8
|
+
* modify it under the terms of the GNU Affero General Public License as
|
|
9
|
+
* published by the Free Software Foundation, either version 3 of the License,
|
|
10
|
+
* or (at your option) any later version.
|
|
11
|
+
*
|
|
12
|
+
* Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
|
|
15
|
+
* General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU Affero General Public License
|
|
18
|
+
* along with Advanced JSON forms (ajf).
|
|
19
|
+
* If not, see http://www.gnu.org/licenses/.
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
import { AjfFieldType, isFieldInstance, isRepeatingSlideInstance, nodeInstanceCompleteName, } from '@ajf/core/forms';
|
|
23
|
+
import { Pipe } from '@angular/core';
|
|
24
|
+
import * as i0 from "@angular/core";
|
|
25
|
+
/**
|
|
26
|
+
* The fields a slide header counts. `slideNodes` is indexed per repetition, and
|
|
27
|
+
* a non-repeating slide keeps its only set of nodes at index 0, so both kinds of
|
|
28
|
+
* slide are read the same way.
|
|
29
|
+
*/
|
|
30
|
+
const countableFields = (slide, idx) => {
|
|
31
|
+
const nodes = (slide.slideNodes && slide.slideNodes[idx]) || slide.flatNodes || [];
|
|
32
|
+
return nodes.filter(n => n.visible && isFieldInstance(n) && n.node.fieldType !== AjfFieldType.Empty);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Whether a field holds anything.
|
|
36
|
+
*
|
|
37
|
+
* The value is read off the form group, not off `AjfFieldInstance.value`: the
|
|
38
|
+
* instance's own `value` is only written at initialisation and by formulas, so it
|
|
39
|
+
* does not follow what the user types. The group is flat and keyed by each
|
|
40
|
+
* instance's complete name, which is how `AjfFormRendererService.getControl`
|
|
41
|
+
* resolves a control too.
|
|
42
|
+
*/
|
|
43
|
+
const isFilled = (field, formGroup) => {
|
|
44
|
+
const name = nodeInstanceCompleteName(field);
|
|
45
|
+
const control = formGroup != null && formGroup.contains(name) ? formGroup.controls[name] : null;
|
|
46
|
+
const value = control != null ? control.value : field.value;
|
|
47
|
+
if (value == null || value === '') {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
return value.length > 0;
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* How many of a slide's fields carry a value, out of how many are on it. Notes
|
|
57
|
+
* (`AjfFieldType.Empty`) hold no value and are left out of both numbers.
|
|
58
|
+
*
|
|
59
|
+
* Impure because it reads mutable instance state, in the same way as
|
|
60
|
+
* `ajfValidSlide` and `ajfAsFieldInstanceErrors`. Returns a memoized object; see
|
|
61
|
+
* the note inside.
|
|
62
|
+
*/
|
|
63
|
+
export class AjfSlideCompletionPipe {
|
|
64
|
+
constructor() {
|
|
65
|
+
this._last = null;
|
|
66
|
+
}
|
|
67
|
+
transform(slide, idx = 0, formGroup = null) {
|
|
68
|
+
const fields = countableFields(slide, idx);
|
|
69
|
+
const done = fields.filter(f => isFilled(f, formGroup)).length;
|
|
70
|
+
const total = fields.length;
|
|
71
|
+
// Hand back the same object while the counts hold, or the fresh identity on
|
|
72
|
+
// every check would trip Angular's "expression has changed" guard.
|
|
73
|
+
if (this._last != null && this._last.done === done && this._last.total === total) {
|
|
74
|
+
return this._last;
|
|
75
|
+
}
|
|
76
|
+
this._last = { done, total };
|
|
77
|
+
return this._last;
|
|
78
|
+
}
|
|
79
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideCompletionPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
80
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideCompletionPipe, name: "ajfSlideCompletion", pure: false }); }
|
|
81
|
+
}
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideCompletionPipe, decorators: [{
|
|
83
|
+
type: Pipe,
|
|
84
|
+
args: [{ name: 'ajfSlideCompletion', pure: false }]
|
|
85
|
+
}] });
|
|
86
|
+
/**
|
|
87
|
+
* How many of a slide's visible fields are failing validation.
|
|
88
|
+
*/
|
|
89
|
+
export class AjfSlideIssuesPipe {
|
|
90
|
+
transform(slide, idx = 0) {
|
|
91
|
+
return countableFields(slide, idx).filter(f => !f.valid).length;
|
|
92
|
+
}
|
|
93
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideIssuesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
94
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideIssuesPipe, name: "ajfSlideIssues", pure: false }); }
|
|
95
|
+
}
|
|
96
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfSlideIssuesPipe, decorators: [{
|
|
97
|
+
type: Pipe,
|
|
98
|
+
args: [{ name: 'ajfSlideIssues', pure: false }]
|
|
99
|
+
}] });
|
|
100
|
+
/**
|
|
101
|
+
* The form's outstanding work in one place. A per-slide count only tells the
|
|
102
|
+
* reader about the slide they are already looking at, which is the one place
|
|
103
|
+
* they can see the failing fields for themselves.
|
|
104
|
+
*
|
|
105
|
+
* Counted here rather than taken from `AjfFormRendererService.errors`, which
|
|
106
|
+
* counts invalid slide pages and says nothing about how many fields are behind
|
|
107
|
+
* them.
|
|
108
|
+
*
|
|
109
|
+
* Impure and memoized, like its neighbours above.
|
|
110
|
+
*/
|
|
111
|
+
export class AjfFormIssuesPipe {
|
|
112
|
+
constructor() {
|
|
113
|
+
this._last = { fields: 0, slides: 0 };
|
|
114
|
+
}
|
|
115
|
+
transform(slides) {
|
|
116
|
+
let fields = 0;
|
|
117
|
+
let slideCount = 0;
|
|
118
|
+
(slides || [])
|
|
119
|
+
.filter(slide => slide.visible !== false)
|
|
120
|
+
.forEach(slide => {
|
|
121
|
+
// Every repetition of a repeating slide carries its own set of fields,
|
|
122
|
+
// and any of them can be the one failing.
|
|
123
|
+
const reps = isRepeatingSlideInstance(slide)
|
|
124
|
+
? Math.max(1, slide.reps)
|
|
125
|
+
: 1;
|
|
126
|
+
let slideFields = 0;
|
|
127
|
+
for (let idx = 0; idx < reps; idx++) {
|
|
128
|
+
slideFields += countableFields(slide, idx).filter(f => !f.valid).length;
|
|
129
|
+
}
|
|
130
|
+
if (slideFields > 0) {
|
|
131
|
+
fields += slideFields;
|
|
132
|
+
slideCount++;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (this._last.fields === fields && this._last.slides === slideCount) {
|
|
136
|
+
return this._last;
|
|
137
|
+
}
|
|
138
|
+
this._last = { fields, slides: slideCount };
|
|
139
|
+
return this._last;
|
|
140
|
+
}
|
|
141
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfFormIssuesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
142
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AjfFormIssuesPipe, name: "ajfFormIssues", pure: false }); }
|
|
143
|
+
}
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfFormIssuesPipe, decorators: [{
|
|
145
|
+
type: Pipe,
|
|
146
|
+
args: [{ name: 'ajfFormIssues', pure: false }]
|
|
147
|
+
}] });
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtc3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9mb3Jtcy9zcmMvc2xpZGUtc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUdMLFlBQVksRUFJWixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLHdCQUF3QixHQUN6QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxJQUFJLEVBQWdCLE1BQU0sZUFBZSxDQUFDOztBQVNsRDs7OztHQUlHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUEyQixFQUFFLEdBQVcsRUFBc0IsRUFBRTtJQUN2RixNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ3ZFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUMxRCxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUF1QixFQUFFLFNBQWtDLEVBQVcsRUFBRTtJQUN4RixNQUFNLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUks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QyxHQUFHLENBQUMsQ0FBQyxFQUFHLEtBQW1DLENBQUMsSUFBSSxDQUFDO2dCQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ04sSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsV0FBVyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzFFLENBQUM7WUFDRCxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLFdBQVcsQ0FBQztnQkFDdEIsVUFBVSxFQUFFLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDOytHQTVCVSxpQkFBaUI7NkdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsSUFBSTttQkFBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtcbiAgQWpmQmFzZVNsaWRlSW5zdGFuY2UsXG4gIEFqZkZpZWxkSW5zdGFuY2UsXG4gIEFqZkZpZWxkVHlwZSxcbiAgQWpmTm9kZUluc3RhbmNlLFxuICBBamZSZXBlYXRpbmdTbGlkZUluc3RhbmNlLFxuICBBamZTbGlkZUluc3RhbmNlLFxuICBpc0ZpZWxkSW5zdGFuY2UsXG4gIGlzUmVwZWF0aW5nU2xpZGVJbnN0YW5jZSxcbiAgbm9kZUluc3RhbmNlQ29tcGxldGVOYW1lLFxufSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VW50eXBlZEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKiogVGhlIGZpbGxlZC90b3RhbCBjb3VudGVyIHNob3duIGFzIGEgY2hpcCBpbiB0aGUgc2xpZGUgaGVhZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBamZTbGlkZUNvbXBsZXRpb24ge1xuICBkb25lOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGZpZWxkcyBhIHNsaWRlIGhlYWRlciBjb3VudHMuIGBzbGlkZU5vZGVzYCBpcyBpbmRleGVkIHBlciByZXBldGl0aW9uLCBhbmRcbiAqIGEgbm9uLXJlcGVhdGluZyBzbGlkZSBrZWVwcyBpdHMgb25seSBzZXQgb2Ygbm9kZXMgYXQgaW5kZXggMCwgc28gYm90aCBraW5kcyBvZlxuICogc2xpZGUgYXJlIHJlYWQgdGhlIHNhbWUgd2F5LlxuICovXG5jb25zdCBjb3VudGFibGVGaWVsZHMgPSAoc2xpZGU6IEFqZkJhc2VTbGlkZUluc3RhbmNlLCBpZHg6IG51bWJlcik6IEFqZkZpZWxkSW5zdGFuY2VbXSA9PiB7XG4gIGNvbnN0IG5vZGVzOiBBamZOb2RlSW5zdGFuY2VbXSA9XG4gICAgKHNsaWRlLnNsaWRlTm9kZXMgJiYgc2xpZGUuc2xpZGVOb2Rlc1tpZHhdKSB8fCBzbGlkZS5mbGF0Tm9kZXMgfHwgW107XG4gIHJldHVybiBub2Rlcy5maWx0ZXIoXG4gICAgbiA9PiBuLnZpc2libGUgJiYgaXNGaWVsZEluc3RhbmNlKG4pICYmIG4ubm9kZS5maWVsZFR5cGUgIT09IEFqZkZpZWxkVHlwZS5FbXB0eSxcbiAgKSBhcyBBamZGaWVsZEluc3RhbmNlW107XG59O1xuXG4vKipcbiAqIFdoZXRoZXIgYSBmaWVsZCBob2xkcyBhbnl0aGluZy5cbiAqXG4gKiBUaGUgdmFsdWUgaXMgcmVhZCBvZmYgdGhlIGZvcm0gZ3JvdXAsIG5vdCBvZmYgYEFqZkZpZWxkSW5zdGFuY2UudmFsdWVgOiB0aGVcbiAqIGluc3RhbmNlJ3Mgb3duIGB2YWx1ZWAgaXMgb25seSB3cml0dGVuIGF0IGluaXRpYWxpc2F0aW9uIGFuZCBieSBmb3JtdWxhcywgc28gaXRcbiAqIGRvZXMgbm90IGZvbGxvdyB3aGF0IHRoZSB1c2VyIHR5cGVzLiBUaGUgZ3JvdXAgaXMgZmxhdCBhbmQga2V5ZWQgYnkgZWFjaFxuICogaW5zdGFuY2UncyBjb21wbGV0ZSBuYW1lLCB3aGljaCBpcyBob3cgYEFqZkZvcm1SZW5kZXJlclNlcnZpY2UuZ2V0Q29udHJvbGBcbiAqIHJlc29sdmVzIGEgY29udHJvbCB0b28uXG4gKi9cbmNvbnN0IGlzRmlsbGVkID0gKGZpZWxkOiBBamZGaWVsZEluc3RhbmNlLCBmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAgfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5hbWUgPSBub2RlSW5zdGFuY2VDb21wbGV0ZU5hbWUoZmllbGQpO1xuICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwICE9IG51bGwgJiYgZm9ybUdyb3VwLmNvbnRhaW5zKG5hbWUpID8gZm9ybUdyb3VwLmNvbnRyb2xzW25hbWVdIDogbnVsbDtcbiAgY29uc3QgdmFsdWUgPSBjb250cm9sICE9IG51bGwgPyBjb250cm9sLnZhbHVlIDogZmllbGQudmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogSG93IG1hbnkgb2YgYSBzbGlkZSdzIGZpZWxkcyBjYXJyeSBhIHZhbHVlLCBvdXQgb2YgaG93IG1hbnkgYXJlIG9uIGl0LiBOb3Rlc1xuICogKGBBamZGaWVsZFR5cGUuRW1wdHlgKSBob2xkIG5vIHZhbHVlIGFuZCBhcmUgbGVmdCBvdXQgb2YgYm90aCBudW1iZXJzLlxuICpcbiAqIEltcHVyZSBiZWNhdXNlIGl0IHJlYWRzIG11dGFibGUgaW5zdGFuY2Ugc3RhdGUsIGluIHRoZSBzYW1lIHdheSBhc1xuICogYGFqZlZhbGlkU2xpZGVgIGFuZCBgYWpmQXNGaWVsZEluc3RhbmNlRXJyb3JzYC4gUmV0dXJucyBhIG1lbW9pemVkIG9iamVjdDsgc2VlXG4gKiB0aGUgbm90ZSBpbnNpZGUuXG4gKi9cbkBQaXBlKHtuYW1lOiAnYWpmU2xpZGVDb21wbGV0aW9uJywgcHVyZTogZmFsc2V9KVxuZXhwb3J0IGNsYXNzIEFqZlNsaWRlQ29tcGxldGlvblBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSBfbGFzdDogQWpmU2xpZGVDb21wbGV0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJhbnNmb3JtKFxuICAgIHNsaWRlOiBBamZCYXNlU2xpZGVJbnN0YW5jZSxcbiAgICBpZHg6IG51bWJlciA9IDAsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwIHwgbnVsbCA9IG51bGwsXG4gICk6IEFqZlNsaWRlQ29tcGxldGlvbiB7XG4gICAgY29uc3QgZmllbGRzID0gY291bnRhYmxlRmllbGRzKHNsaWRlLCBpZHgpO1xuICAgIGNvbnN0IGRvbmUgPSBmaWVsZHMuZmlsdGVyKGYgPT4gaXNGaWxsZWQoZiwgZm9ybUdyb3VwKSkubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsID0gZmllbGRzLmxlbmd0aDtcbiAgICAvLyBIYW5kIGJhY2sgdGhlIHNhbWUgb2JqZWN0IHdoaWxlIHRoZSBjb3VudHMgaG9sZCwgb3IgdGhlIGZyZXNoIGlkZW50aXR5IG9uXG4gICAgLy8gZXZlcnkgY2hlY2sgd291bGQgdHJpcCBBbmd1bGFyJ3MgXCJleHByZXNzaW9uIGhhcyBjaGFuZ2VkXCIgZ3VhcmQuXG4gICAgaWYgKHRoaXMuX2xhc3QgIT0gbnVsbCAmJiB0aGlzLl9sYXN0LmRvbmUgPT09IGRvbmUgJiYgdGhpcy5fbGFzdC50b3RhbCA9PT0gdG90YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXN0O1xuICAgIH1cbiAgICB0aGlzLl9sYXN0ID0ge2RvbmUsIHRvdGFsfTtcbiAgICByZXR1cm4gdGhpcy5fbGFzdDtcbiAgfVxufVxuXG4vKipcbiAqIEhvdyBtYW55IG9mIGEgc2xpZGUncyB2aXNpYmxlIGZpZWxkcyBhcmUgZmFpbGluZyB2YWxpZGF0aW9uLlxuICovXG5AUGlwZSh7bmFtZTogJ2FqZlNsaWRlSXNzdWVzJywgcHVyZTogZmFsc2V9KVxuZXhwb3J0IGNsYXNzIEFqZlNsaWRlSXNzdWVzUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0oc2xpZGU6IEFqZkJhc2VTbGlkZUluc3RhbmNlLCBpZHg6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIHJldHVybiBjb3VudGFibGVGaWVsZHMoc2xpZGUsIGlkeCkuZmlsdGVyKGYgPT4gIWYudmFsaWQpLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogV2hhdCBpcyBsZWZ0IHRvIGZpeCBpbiB0aGUgd2hvbGUgZm9ybSwgZm9yIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBhbGVydHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEFqZkZvcm1Jc3N1ZXMge1xuICAvKiogVmlzaWJsZSBmaWVsZHMgZmFpbGluZyB2YWxpZGF0aW9uLCBhY3Jvc3MgZXZlcnkgc2xpZGUgYW5kIHJlcGV0aXRpb24uICovXG4gIGZpZWxkczogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgc2xpZGVzIGhvbGQgYXQgbGVhc3Qgb25lIG9mIHRoZW0uICovXG4gIHNsaWRlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBmb3JtJ3Mgb3V0c3RhbmRpbmcgd29yayBpbiBvbmUgcGxhY2UuIEEgcGVyLXNsaWRlIGNvdW50IG9ubHkgdGVsbHMgdGhlXG4gKiByZWFkZXIgYWJvdXQgdGhlIHNsaWRlIHRoZXkgYXJlIGFscmVhZHkgbG9va2luZyBhdCwgd2hpY2ggaXMgdGhlIG9uZSBwbGFjZVxuICogdGhleSBjYW4gc2VlIHRoZSBmYWlsaW5nIGZpZWxkcyBmb3IgdGhlbXNlbHZlcy5cbiAqXG4gKiBDb3VudGVkIGhlcmUgcmF0aGVyIHRoYW4gdGFrZW4gZnJvbSBgQWpmRm9ybVJlbmRlcmVyU2VydmljZS5lcnJvcnNgLCB3aGljaFxuICogY291bnRzIGludmFsaWQgc2xpZGUgcGFnZXMgYW5kIHNheXMgbm90aGluZyBhYm91dCBob3cgbWFueSBmaWVsZHMgYXJlIGJlaGluZFxuICogdGhlbS5cbiAqXG4gKiBJbXB1cmUgYW5kIG1lbW9pemVkLCBsaWtlIGl0cyBuZWlnaGJvdXJzIGFib3ZlLlxuICovXG5AUGlwZSh7bmFtZTogJ2FqZkZvcm1Jc3N1ZXMnLCBwdXJlOiBmYWxzZX0pXG5leHBvcnQgY2xhc3MgQWpmRm9ybUlzc3Vlc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSBfbGFzdDogQWpmRm9ybUlzc3VlcyA9IHtmaWVsZHM6IDAsIHNsaWRlczogMH07XG5cbiAgdHJhbnNmb3JtKHNsaWRlczogQWpmU2xpZGVJbnN0YW5jZVtdIHwgbnVsbCk6IEFqZkZvcm1Jc3N1ZXMge1xuICAgIGxldCBmaWVsZHMgPSAwO1xuICAgIGxldCBzbGlkZUNvdW50ID0gMDtcbiAgICAoc2xpZGVzIHx8IFtdKVxuICAgICAgLmZpbHRlcihzbGlkZSA9PiBzbGlkZS52aXNpYmxlICE9PSBmYWxzZSlcbiAgICAgIC5mb3JFYWNoKHNsaWRlID0+IHtcbiAgICAgICAgLy8gRXZlcnkgcmVwZXRpdGlvbiBvZiBhIHJlcGVhdGluZyBzbGlkZSBjYXJyaWVzIGl0cyBvd24gc2V0IG9mIGZpZWxkcyxcbiAgICAgICAgLy8gYW5kIGFueSBvZiB0aGVtIGNhbiBiZSB0aGUgb25lIGZhaWxpbmcuXG4gICAgICAgIGNvbnN0IHJlcHMgPSBpc1JlcGVhdGluZ1NsaWRlSW5zdGFuY2Uoc2xpZGUpXG4gICAgICAgICAgPyBNYXRoLm1heCgxLCAoc2xpZGUgYXMgQWpmUmVwZWF0aW5nU2xpZGVJbnN0YW5jZSkucmVwcylcbiAgICAgICAgICA6IDE7XG4gICAgICAgIGxldCBzbGlkZUZpZWxkcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHJlcHM7IGlkeCsrKSB7XG4gICAgICAgICAgc2xpZGVGaWVsZHMgKz0gY291bnRhYmxlRmllbGRzKHNsaWRlLCBpZHgpLmZpbHRlcihmID0+ICFmLnZhbGlkKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNsaWRlRmllbGRzID4gMCkge1xuICAgICAgICAgIGZpZWxkcyArPSBzbGlkZUZpZWxkcztcbiAgICAgICAgICBzbGlkZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLl9sYXN0LmZpZWxkcyA9PT0gZmllbGRzICYmIHRoaXMuX2xhc3Quc2xpZGVzID09PSBzbGlkZUNvdW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGFzdDtcbiAgICB9XG4gICAgdGhpcy5fbGFzdCA9IHtmaWVsZHMsIHNsaWRlczogc2xpZGVDb3VudH07XG4gICAgcmV0dXJuIHRoaXMuX2xhc3Q7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -32,11 +32,11 @@ export class AjfTableFieldComponent extends CoreTableFieldComponent {
|
|
|
32
32
|
super(cdr, service, was);
|
|
33
33
|
}
|
|
34
34
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTableFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AjfFormRendererService }, { token: AJF_WARNING_ALERT_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTableFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<table *ngIf=\"instance\" class=\"ajf-table-field\">\n <ng-container *ngIf=\"instance.node as node\">\n <ng-container *ngFor=\"let columns of instance.controls; let row = index\">\n <tr [ngClass]=\"row | ajfTableRowClass\">\n <td>\n <ng-container *ngIf=\"columns.length > 0 && columns[0]\">\n {{ columns[0] | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n </td>\n <ng-container *ngIf=\"columns.length > 1\">\n <td *ngFor=\"let c of columns[1]; let column = index\">\n <ng-container *ngIf=\"row === 0; else controlCell\">\n {{ c | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n <ng-template #controlCell>\n <ng-container *ngIf=\"c|ajfGetTableCellControl as contr\">\n <ng-container *ngIf=\"contr\">\n <ng-container *ngIf=\"contr!.show && (node.rows[row-1][column]|ajfIsCellEditable); else plainTextCell\">\n <ng-container *ngIf=\"contr.type === 'number';else genericInput\">\n <input (focusout)=\"contr!.show = false\" type=\"number\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-container>\n <ng-template #genericInput>\n <input (focusout)=\"contr!.show = false\" [type]=\"contr.type\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-template>\n </ng-container>\n\n <ng-template #plainTextCell>\n <span (click)=\"goToCell(row, column)\">{{ contr.control!.value |\n ajfTranslateIfString | ajfFormatIfNumber: '.0-2'\n }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n</table>", styles: ["table.ajf-table-field{width:100%;border-collapse:collapse;table-layout:fixed}table.ajf-table-field .ajf-header-row{font-
|
|
35
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfTableFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<table *ngIf=\"instance\" class=\"ajf-table-field\">\n <ng-container *ngIf=\"instance.node as node\">\n <ng-container *ngFor=\"let columns of instance.controls; let row = index\">\n <tr [ngClass]=\"row | ajfTableRowClass\">\n <td>\n <ng-container *ngIf=\"columns.length > 0 && columns[0]\">\n {{ columns[0] | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n </td>\n <ng-container *ngIf=\"columns.length > 1\">\n <td *ngFor=\"let c of columns[1]; let column = index\">\n <ng-container *ngIf=\"row === 0; else controlCell\">\n {{ c | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n <ng-template #controlCell>\n <ng-container *ngIf=\"c|ajfGetTableCellControl as contr\">\n <ng-container *ngIf=\"contr\">\n <ng-container *ngIf=\"contr!.show && (node.rows[row-1][column]|ajfIsCellEditable); else plainTextCell\">\n <ng-container *ngIf=\"contr.type === 'number';else genericInput\">\n <input (focusout)=\"contr!.show = false\" type=\"number\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-container>\n <ng-template #genericInput>\n <input (focusout)=\"contr!.show = false\" [type]=\"contr.type\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-template>\n </ng-container>\n\n <ng-template #plainTextCell>\n <span (click)=\"goToCell(row, column)\">{{ contr.control!.value |\n ajfTranslateIfString | ajfFormatIfNumber: '.0-2'\n }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n</table>", styles: ["table.ajf-table-field{width:100%;border:1px solid var(--ajf-border);border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:13px}table.ajf-table-field .ajf-header-row{background:var(--ajf-band)}table.ajf-table-field .ajf-header-row td,table.ajf-table-field .ajf-header-row th{color:var(--ajf-text-muted);font-family:var(--ajf-font-mono);font-size:11px;letter-spacing:.09em;text-transform:uppercase}table.ajf-table-field th,table.ajf-table-field td{position:relative;padding:9px 12px;border-right:1px solid var(--ajf-border);border-bottom:1px solid var(--ajf-border);text-align:left}table.ajf-table-field th:last-child,table.ajf-table-field td:last-child{border-right:0}table.ajf-table-field tr:last-child td{border-bottom:0}table.ajf-table-field tbody tr:hover:not(.ajf-header-row){background:var(--ajf-band)}table.ajf-table-field td span{display:block;width:100%;min-height:1.4em;box-sizing:border-box;font:inherit;cursor:text;outline:none}table.ajf-table-field td input{position:absolute;inset:0;width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--ajf-accent);background:var(--ajf-surface);color:var(--ajf-text);font:inherit;cursor:text;outline:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "pipe", type: i4.FormatIfNumber, name: "ajfFormatIfNumber" }, { kind: "pipe", type: i4.TranslateIfString, name: "ajfTranslateIfString" }, { kind: "pipe", type: i1.AjfGetTableCellControlPipe, name: "ajfGetTableCellControl" }, { kind: "pipe", type: i1.AjfIsCellEditablePipe, name: "ajfIsCellEditable" }, { kind: "pipe", type: i1.AjfTableRowClass, name: "ajfTableRowClass" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
36
36
|
}
|
|
37
37
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfTableFieldComponent, decorators: [{
|
|
38
38
|
type: Component,
|
|
39
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<table *ngIf=\"instance\" class=\"ajf-table-field\">\n <ng-container *ngIf=\"instance.node as node\">\n <ng-container *ngFor=\"let columns of instance.controls; let row = index\">\n <tr [ngClass]=\"row | ajfTableRowClass\">\n <td>\n <ng-container *ngIf=\"columns.length > 0 && columns[0]\">\n {{ columns[0] | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n </td>\n <ng-container *ngIf=\"columns.length > 1\">\n <td *ngFor=\"let c of columns[1]; let column = index\">\n <ng-container *ngIf=\"row === 0; else controlCell\">\n {{ c | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n <ng-template #controlCell>\n <ng-container *ngIf=\"c|ajfGetTableCellControl as contr\">\n <ng-container *ngIf=\"contr\">\n <ng-container *ngIf=\"contr!.show && (node.rows[row-1][column]|ajfIsCellEditable); else plainTextCell\">\n <ng-container *ngIf=\"contr.type === 'number';else genericInput\">\n <input (focusout)=\"contr!.show = false\" type=\"number\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-container>\n <ng-template #genericInput>\n <input (focusout)=\"contr!.show = false\" [type]=\"contr.type\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-template>\n </ng-container>\n\n <ng-template #plainTextCell>\n <span (click)=\"goToCell(row, column)\">{{ contr.control!.value |\n ajfTranslateIfString | ajfFormatIfNumber: '.0-2'\n }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n</table>", styles: ["table.ajf-table-field{width:100%;border-collapse:collapse;table-layout:fixed}table.ajf-table-field .ajf-header-row{font-
|
|
39
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<table *ngIf=\"instance\" class=\"ajf-table-field\">\n <ng-container *ngIf=\"instance.node as node\">\n <ng-container *ngFor=\"let columns of instance.controls; let row = index\">\n <tr [ngClass]=\"row | ajfTableRowClass\">\n <td>\n <ng-container *ngIf=\"columns.length > 0 && columns[0]\">\n {{ columns[0] | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n </td>\n <ng-container *ngIf=\"columns.length > 1\">\n <td *ngFor=\"let c of columns[1]; let column = index\">\n <ng-container *ngIf=\"row === 0; else controlCell\">\n {{ c | ajfTranslateIfString | ajfFormatIfNumber: '.0-2' }}\n </ng-container>\n <ng-template #controlCell>\n <ng-container *ngIf=\"c|ajfGetTableCellControl as contr\">\n <ng-container *ngIf=\"contr\">\n <ng-container *ngIf=\"contr!.show && (node.rows[row-1][column]|ajfIsCellEditable); else plainTextCell\">\n <ng-container *ngIf=\"contr.type === 'number';else genericInput\">\n <input (focusout)=\"contr!.show = false\" type=\"number\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-container>\n <ng-template #genericInput>\n <input (focusout)=\"contr!.show = false\" [type]=\"contr.type\" [formControl]=\"contr.control\"\n (keydown.tab)=\"goToNextCell($event, row, column)\" autofocus />\n </ng-template>\n </ng-container>\n\n <ng-template #plainTextCell>\n <span (click)=\"goToCell(row, column)\">{{ contr.control!.value |\n ajfTranslateIfString | ajfFormatIfNumber: '.0-2'\n }}</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </ng-container>\n</table>", styles: ["table.ajf-table-field{width:100%;border:1px solid var(--ajf-border);border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:13px}table.ajf-table-field .ajf-header-row{background:var(--ajf-band)}table.ajf-table-field .ajf-header-row td,table.ajf-table-field .ajf-header-row th{color:var(--ajf-text-muted);font-family:var(--ajf-font-mono);font-size:11px;letter-spacing:.09em;text-transform:uppercase}table.ajf-table-field th,table.ajf-table-field td{position:relative;padding:9px 12px;border-right:1px solid var(--ajf-border);border-bottom:1px solid var(--ajf-border);text-align:left}table.ajf-table-field th:last-child,table.ajf-table-field td:last-child{border-right:0}table.ajf-table-field tr:last-child td{border-bottom:0}table.ajf-table-field tbody tr:hover:not(.ajf-header-row){background:var(--ajf-band)}table.ajf-table-field td span{display:block;width:100%;min-height:1.4em;box-sizing:border-box;font:inherit;cursor:text;outline:none}table.ajf-table-field td input{position:absolute;inset:0;width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--ajf-accent);background:var(--ajf-surface);color:var(--ajf-text);font:inherit;cursor:text;outline:none}\n"] }]
|
|
40
40
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AjfFormRendererService }, { type: i5.AjfWarningAlertService, decorators: [{
|
|
41
41
|
type: Inject,
|
|
42
42
|
args: [AJF_WARNING_ALERT_SERVICE]
|