@sumaris-net/ngx-components 18.25.20 → 18.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +4 -0
- package/esm2022/public_api.mjs +9 -3
- package/esm2022/src/app/core/core.module.mjs +5 -1
- package/esm2022/src/app/core/core.testing.module.mjs +19 -5
- package/esm2022/src/app/core/icon/icon-selector.field.mjs +94 -0
- package/esm2022/src/app/core/icon/icon-selector.modal.mjs +72 -0
- package/esm2022/src/app/core/icon/icon-selector.module.mjs +23 -0
- package/esm2022/src/app/core/icon/icon-selector.service.mjs +62 -0
- package/esm2022/src/app/core/icon/testing/icon-selector.test.mjs +44 -0
- package/esm2022/src/app/core/icon/testing/icon-selector.testing.module.mjs +30 -0
- package/fesm2022/sumaris-net.ngx-components.mjs +397 -121
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +8 -2
- package/src/app/core/core.module.d.ts +2 -1
- package/src/app/core/core.testing.module.d.ts +2 -1
- package/src/app/core/icon/icon-selector.field.d.ts +28 -0
- package/src/app/core/icon/icon-selector.modal.d.ts +23 -0
- package/src/app/core/icon/icon-selector.module.d.ts +12 -0
- package/src/app/core/icon/icon-selector.service.d.ts +40 -0
- package/src/app/core/icon/testing/icon-selector.test.d.ts +19 -0
- package/src/app/core/icon/testing/icon-selector.testing.module.d.ts +12 -0
- package/src/assets/i18n/en-US.json +9 -2
- package/src/assets/i18n/en.json +9 -2
- package/src/assets/i18n/fr.json +9 -2
- package/src/assets/icons-ref.json +21373 -0
- package/src/assets/manifest.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { ModalController } from '@ionic/angular';
|
|
4
|
+
import { Subject, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
5
|
+
import { IconSelectorService } from './icon-selector.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "@ionic/angular";
|
|
9
|
+
import * as i3 from "@ngx-translate/core";
|
|
10
|
+
import * as i4 from "@angular/forms";
|
|
11
|
+
import * as i5 from "@angular/material/form-field";
|
|
12
|
+
import * as i6 from "@angular/material/input";
|
|
13
|
+
import * as i7 from "@angular/material/icon";
|
|
14
|
+
import * as i8 from "@angular/material/button";
|
|
15
|
+
import * as i9 from "@angular/material/tabs";
|
|
16
|
+
import * as i10 from "@angular/material/badge";
|
|
17
|
+
import * as i11 from "@angular/material/tooltip";
|
|
18
|
+
import * as i12 from "../../shared/directives/autofocus.directive";
|
|
19
|
+
import * as i13 from "../../shared/form/loading-spinner";
|
|
20
|
+
import * as i14 from "../../shared/pipes/arrays.pipe";
|
|
21
|
+
import * as i15 from "../../shared/pipes/badge.pipes";
|
|
22
|
+
export class AppIconSelectorModal {
|
|
23
|
+
title = 'ICON_SELECTOR.TITLE';
|
|
24
|
+
ionicTabIndex = 0;
|
|
25
|
+
materialTabIndex = 1;
|
|
26
|
+
searchText = '';
|
|
27
|
+
ionicFiltered = [];
|
|
28
|
+
materialFiltered = [];
|
|
29
|
+
selectedIndex = 0;
|
|
30
|
+
loading = true;
|
|
31
|
+
searchSubject = new Subject();
|
|
32
|
+
iconService = inject(IconSelectorService);
|
|
33
|
+
viewCtrl = inject(ModalController);
|
|
34
|
+
cdr = inject(ChangeDetectorRef);
|
|
35
|
+
constructor() {
|
|
36
|
+
this.loadIcons();
|
|
37
|
+
this.searchSubject
|
|
38
|
+
.pipe(debounceTime(150), distinctUntilChanged(), takeUntilDestroyed())
|
|
39
|
+
.subscribe((value) => {
|
|
40
|
+
this.ionicFiltered = this.iconService.search(value, 'ionic');
|
|
41
|
+
this.materialFiltered = this.iconService.search(value, 'material');
|
|
42
|
+
this.cdr.markForCheck();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async loadIcons() {
|
|
46
|
+
await this.iconService.ready();
|
|
47
|
+
this.ionicFiltered = this.iconService.ionicIcons();
|
|
48
|
+
this.materialFiltered = this.iconService.materialIcons();
|
|
49
|
+
this.loading = false;
|
|
50
|
+
this.cdr.markForCheck();
|
|
51
|
+
}
|
|
52
|
+
onSearchChange(value) {
|
|
53
|
+
this.searchText = value;
|
|
54
|
+
this.searchSubject.next(value);
|
|
55
|
+
}
|
|
56
|
+
selectIcon(entry, origin) {
|
|
57
|
+
const ref = this.iconService.toIconRef(entry, origin);
|
|
58
|
+
this.viewCtrl.dismiss(ref);
|
|
59
|
+
}
|
|
60
|
+
cancel() {
|
|
61
|
+
this.viewCtrl.dismiss(null);
|
|
62
|
+
}
|
|
63
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModal, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
64
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AppIconSelectorModal, selector: "app-icon-selector-modal", inputs: { title: "title" }, ngImport: i0, template: "<ion-header>\n <ion-toolbar>\n <ion-title>{{ title | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Barre de recherche -->\n <div class=\"search-bar\">\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-label translate>COMMON.SEARCH</mat-label>\n <input matInput type=\"text\" [ngModel]=\"searchText\" (ngModelChange)=\"onSearchChange($event)\" [placeholder]=\"'COMMON.SEARCH_PLACEHOLDER' | translate\" autofocus>\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- Onglets Ionic / Material -->\n <mat-tab-group [(selectedIndex)]=\"selectedIndex\" *ngIf=\"!loading\">\n <mat-tab>\n <ng-template mat-tab-label>\n {{ 'ICON_SELECTOR.TAB_IONIC' | translate }}\n <span class=\"badge\" [matBadge]=\"ionicFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"primary\"></span>\n </ng-template>\n <div class=\"icon-grid\" *ngIf=\"selectedIndex === ionicTabIndex\">\n <button mat-icon-button\n *ngFor=\"let entry of ionicFiltered\"\n [matTooltip]=\"entry.label\"\n [attr.aria-label]=\"entry.label\"\n (click)=\"selectIcon(entry, 'ionic')\">\n <ion-icon [name]=\"entry.name\"></ion-icon>\n </button>\n <div *ngIf=\"ionicFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n </div>\n </mat-tab>\n\n <mat-tab>\n <ng-template mat-tab-label>\n {{ 'ICON_SELECTOR.TAB_MATERIAL' | translate }}\n <span class=\"badge\" [matBadge]=\"materialFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"accent\"></span>\n </ng-template>\n <div class=\"icon-grid\" *ngIf=\"selectedIndex === materialTabIndex\">\n <button mat-icon-button\n *ngFor=\"let entry of materialFiltered\"\n [matTooltip]=\"entry.label\"\n [attr.aria-label]=\"entry.label\"\n (click)=\"selectIcon(entry, 'material')\">\n <mat-icon>{{ entry.name }}</mat-icon>\n </button>\n <div *ngIf=\"materialFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <app-loading-spinner *ngIf=\"loading\"></app-loading-spinner>\n</ion-content>\n", styles: [".search-bar{padding:8px 16px 0}.search-field{width:100%}.icon-grid{display:flex;flex-wrap:wrap;gap:4px;padding:8px;max-height:60vh;overflow-y:auto;justify-content:center}.icon-btn{width:44px;height:44px;line-height:44px;border-radius:8px;transition:background-color .15s ease}.icon-btn:hover{background-color:rgba(var(--ion-color-primary-rgb),.12)}.icon-btn:active{background-color:rgba(var(--ion-color-primary-rgb),.24)}.no-results{width:100%;text-align:center;padding:32px 16px;color:var(--ion-color-medium);font-style:italic}.badge{margin-left:4px}\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.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i9.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i9.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i9.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i10.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i13.AppLoadingSpinner, selector: "app-loading-spinner", inputs: ["loading", "color", "name"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i15.BadgeNumberPipe, name: "badgeNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
65
|
+
}
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModal, decorators: [{
|
|
67
|
+
type: Component,
|
|
68
|
+
args: [{ selector: 'app-icon-selector-modal', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar>\n <ion-title>{{ title | translate }}</ion-title>\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <!-- Barre de recherche -->\n <div class=\"search-bar\">\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <mat-label translate>COMMON.SEARCH</mat-label>\n <input matInput type=\"text\" [ngModel]=\"searchText\" (ngModelChange)=\"onSearchChange($event)\" [placeholder]=\"'COMMON.SEARCH_PLACEHOLDER' | translate\" autofocus>\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- Onglets Ionic / Material -->\n <mat-tab-group [(selectedIndex)]=\"selectedIndex\" *ngIf=\"!loading\">\n <mat-tab>\n <ng-template mat-tab-label>\n {{ 'ICON_SELECTOR.TAB_IONIC' | translate }}\n <span class=\"badge\" [matBadge]=\"ionicFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"primary\"></span>\n </ng-template>\n <div class=\"icon-grid\" *ngIf=\"selectedIndex === ionicTabIndex\">\n <button mat-icon-button\n *ngFor=\"let entry of ionicFiltered\"\n [matTooltip]=\"entry.label\"\n [attr.aria-label]=\"entry.label\"\n (click)=\"selectIcon(entry, 'ionic')\">\n <ion-icon [name]=\"entry.name\"></ion-icon>\n </button>\n <div *ngIf=\"ionicFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n </div>\n </mat-tab>\n\n <mat-tab>\n <ng-template mat-tab-label>\n {{ 'ICON_SELECTOR.TAB_MATERIAL' | translate }}\n <span class=\"badge\" [matBadge]=\"materialFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"accent\"></span>\n </ng-template>\n <div class=\"icon-grid\" *ngIf=\"selectedIndex === materialTabIndex\">\n <button mat-icon-button\n *ngFor=\"let entry of materialFiltered\"\n [matTooltip]=\"entry.label\"\n [attr.aria-label]=\"entry.label\"\n (click)=\"selectIcon(entry, 'material')\">\n <mat-icon>{{ entry.name }}</mat-icon>\n </button>\n <div *ngIf=\"materialFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <app-loading-spinner *ngIf=\"loading\"></app-loading-spinner>\n</ion-content>\n", styles: [".search-bar{padding:8px 16px 0}.search-field{width:100%}.icon-grid{display:flex;flex-wrap:wrap;gap:4px;padding:8px;max-height:60vh;overflow-y:auto;justify-content:center}.icon-btn{width:44px;height:44px;line-height:44px;border-radius:8px;transition:background-color .15s ease}.icon-btn:hover{background-color:rgba(var(--ion-color-primary-rgb),.12)}.icon-btn:active{background-color:rgba(var(--ion-color-primary-rgb),.24)}.no-results{width:100%;text-align:center;padding:32px 16px;color:var(--ion-color-medium);font-style:italic}.badge{margin-left:4px}\n"] }]
|
|
69
|
+
}], ctorParameters: () => [], propDecorators: { title: [{
|
|
70
|
+
type: Input
|
|
71
|
+
}] } });
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci5tb2RhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9pY29uL2ljb24tc2VsZWN0b3IubW9kYWwudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaWNvbi9pY29uLXNlbGVjdG9yLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWEsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTekUsTUFBTSxPQUFPLG9CQUFvQjtJQUN0QixLQUFLLEdBQUcscUJBQXFCLENBQUM7SUFFcEIsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUNsQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFOUIsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNoQixhQUFhLEdBQWdCLEVBQUUsQ0FBQztJQUNoQyxnQkFBZ0IsR0FBZ0IsRUFBRSxDQUFDO0lBQ25DLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQztJQUVqQixhQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUV0QyxXQUFXLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDMUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFeEM7UUFDRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGFBQWE7YUFDZixJQUFJLENBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxFQUN0QixrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUztRQUNyQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBZ0IsRUFBRSxNQUE0QjtRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO3dHQXREVSxvQkFBb0I7NEZBQXBCLG9CQUFvQiwyRkNiakMsdWhGQTREQTs7NEZEL0NhLG9CQUFvQjtrQkFOaEMsU0FBUzsrQkFDRSx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU07d0RBR3RDLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JTZXJ2aWNlLCBJY29uRW50cnkgfSBmcm9tICcuL2ljb24tc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBJY29uUmVmIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWljb24tc2VsZWN0b3ItbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vaWNvbi1zZWxlY3Rvci5tb2RhbC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWNvbi1zZWxlY3Rvci5tb2RhbC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJY29uU2VsZWN0b3JNb2RhbCB7XG4gIEBJbnB1dCgpIHRpdGxlID0gJ0lDT05fU0VMRUNUT1IuVElUTEUnO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpb25pY1RhYkluZGV4ID0gMDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hdGVyaWFsVGFiSW5kZXggPSAxO1xuXG4gIHByb3RlY3RlZCBzZWFyY2hUZXh0ID0gJyc7XG4gIHByb3RlY3RlZCBpb25pY0ZpbHRlcmVkOiBJY29uRW50cnlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbWF0ZXJpYWxGaWx0ZXJlZDogSWNvbkVudHJ5W10gPSBbXTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkSW5kZXggPSAwO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHRydWU7XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgaWNvblNlcnZpY2UgPSBpbmplY3QoSWNvblNlbGVjdG9yU2VydmljZSk7XG4gIHByaXZhdGUgdmlld0N0cmwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9hZEljb25zKCk7XG5cbiAgICB0aGlzLnNlYXJjaFN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTUwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuaW9uaWNGaWx0ZXJlZCA9IHRoaXMuaWNvblNlcnZpY2Uuc2VhcmNoKHZhbHVlLCAnaW9uaWMnKTtcbiAgICAgICAgdGhpcy5tYXRlcmlhbEZpbHRlcmVkID0gdGhpcy5pY29uU2VydmljZS5zZWFyY2godmFsdWUsICdtYXRlcmlhbCcpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSWNvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pY29uU2VydmljZS5yZWFkeSgpO1xuICAgIHRoaXMuaW9uaWNGaWx0ZXJlZCA9IHRoaXMuaWNvblNlcnZpY2UuaW9uaWNJY29ucygpO1xuICAgIHRoaXMubWF0ZXJpYWxGaWx0ZXJlZCA9IHRoaXMuaWNvblNlcnZpY2UubWF0ZXJpYWxJY29ucygpO1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlO1xuICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHNlbGVjdEljb24oZW50cnk6IEljb25FbnRyeSwgb3JpZ2luOiAnaW9uaWMnIHwgJ21hdGVyaWFsJyk6IHZvaWQge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuaWNvblNlcnZpY2UudG9JY29uUmVmKGVudHJ5LCBvcmlnaW4pO1xuICAgIHRoaXMudmlld0N0cmwuZGlzbWlzcyhyZWYpO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMudmlld0N0cmwuZGlzbWlzcyhudWxsKTtcbiAgfVxufSIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi10aXRsZT57eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQ+XG4gIDwhLS0gQmFycmUgZGUgcmVjaGVyY2hlIC0tPlxuICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhclwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwic2VhcmNoLWZpZWxkXCI+XG4gICAgICA8bWF0LWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uU0VBUkNIPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJzZWFyY2hUZXh0XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiIFtwbGFjZWhvbGRlcl09XCInQ09NTU9OLlNFQVJDSF9QTEFDRUhPTERFUicgfCB0cmFuc2xhdGVcIiBhdXRvZm9jdXM+XG4gICAgICA8bWF0LWljb24gbWF0U3VmZml4PnNlYXJjaDwvbWF0LWljb24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBPbmdsZXRzIElvbmljIC8gTWF0ZXJpYWwgLS0+XG4gIDxtYXQtdGFiLWdyb3VwIFsoc2VsZWN0ZWRJbmRleCldPVwic2VsZWN0ZWRJbmRleFwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cbiAgICA8bWF0LXRhYj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICB7eyAnSUNPTl9TRUxFQ1RPUi5UQUJfSU9OSUMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbWF0QmFkZ2VdPVwiaW9uaWNGaWx0ZXJlZC5sZW5ndGggfCBiYWRnZU51bWJlclwiIG1hdEJhZGdlT3ZlcmxhcD1cImZhbHNlXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIiBtYXRCYWRnZUNvbG9yPVwicHJpbWFyeVwiPjwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1ncmlkXCIgKm5nSWY9XCJzZWxlY3RlZEluZGV4ID09PSBpb25pY1RhYkluZGV4XCI+XG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGlvbmljRmlsdGVyZWRcIlxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImVudHJ5LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImVudHJ5LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SWNvbihlbnRyeSwgJ2lvbmljJylcIj5cbiAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiZW50cnkubmFtZVwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaW9uaWNGaWx0ZXJlZCB8IGlzRW1wdHlBcnJheVwiIGNsYXNzPVwibm8tcmVzdWx0c1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC10YWI+XG5cbiAgICA8bWF0LXRhYj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICB7eyAnSUNPTl9TRUxFQ1RPUi5UQUJfTUFURVJJQUwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbWF0QmFkZ2VdPVwibWF0ZXJpYWxGaWx0ZXJlZC5sZW5ndGggfCBiYWRnZU51bWJlclwiIG1hdEJhZGdlT3ZlcmxhcD1cImZhbHNlXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIiBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCI+PC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWdyaWRcIiAqbmdJZj1cInNlbGVjdGVkSW5kZXggPT09IG1hdGVyaWFsVGFiSW5kZXhcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZW50cnkgb2YgbWF0ZXJpYWxGaWx0ZXJlZFwiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiZW50cnkubGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZW50cnkubGFiZWxcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJY29uKGVudHJ5LCAnbWF0ZXJpYWwnKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyBlbnRyeS5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtYXRlcmlhbEZpbHRlcmVkIHwgaXNFbXB0eUFycmF5XCIgY2xhc3M9XCJuby1yZXN1bHRzXCIgdHJhbnNsYXRlPkNPTU1PTi5OT19SRVNVTFQ8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LXRhYj5cbiAgPC9tYXQtdGFiLWdyb3VwPlxuXG4gIDxhcHAtbG9hZGluZy1zcGlubmVyICpuZ0lmPVwibG9hZGluZ1wiPjwvYXBwLWxvYWRpbmctc3Bpbm5lcj5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { SharedModule } from '../../shared/shared.module';
|
|
3
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
4
|
+
import { AppIconSelectorModal } from './icon-selector.modal';
|
|
5
|
+
import { AppIconSelectorField } from './icon-selector.field';
|
|
6
|
+
import { AppIconModule } from './icon.module';
|
|
7
|
+
import { FormsModule } from '@angular/forms';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@ngx-translate/core";
|
|
10
|
+
export class AppIconSelectorModule {
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModule, declarations: [AppIconSelectorModal, AppIconSelectorField], imports: [SharedModule, i1.TranslateModule, AppIconModule, FormsModule], exports: [AppIconSelectorModal, AppIconSelectorField, AppIconModule] });
|
|
13
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModule, imports: [SharedModule, TranslateModule.forChild(), AppIconModule, FormsModule, AppIconModule] });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppIconSelectorModule, decorators: [{
|
|
16
|
+
type: NgModule,
|
|
17
|
+
args: [{
|
|
18
|
+
imports: [SharedModule, TranslateModule.forChild(), AppIconModule, FormsModule],
|
|
19
|
+
declarations: [AppIconSelectorModal, AppIconSelectorField],
|
|
20
|
+
exports: [AppIconSelectorModal, AppIconSelectorField, AppIconModule],
|
|
21
|
+
}]
|
|
22
|
+
}] });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaWNvbi9pY29uLXNlbGVjdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU83QyxNQUFNLE9BQU8scUJBQXFCO3dHQUFyQixxQkFBcUI7eUdBQXJCLHFCQUFxQixpQkFIakIsb0JBQW9CLEVBQUUsb0JBQW9CLGFBRC9DLFlBQVksc0JBQThCLGFBQWEsRUFBRSxXQUFXLGFBRXBFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLGFBQWE7eUdBRXhELHFCQUFxQixZQUp0QixZQUFZLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBRXhCLGFBQWE7OzRGQUV4RCxxQkFBcUI7a0JBTGpDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDO29CQUMvRSxZQUFZLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztvQkFDMUQsT0FBTyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxDQUFDO2lCQUNyRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFwcEljb25TZWxlY3Rvck1vZGFsIH0gZnJvbSAnLi9pY29uLXNlbGVjdG9yLm1vZGFsJztcbmltcG9ydCB7IEFwcEljb25TZWxlY3RvckZpZWxkIH0gZnJvbSAnLi9pY29uLXNlbGVjdG9yLmZpZWxkJztcbmltcG9ydCB7IEFwcEljb25Nb2R1bGUgfSBmcm9tICcuL2ljb24ubW9kdWxlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbU2hhcmVkTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUuZm9yQ2hpbGQoKSwgQXBwSWNvbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtBcHBJY29uU2VsZWN0b3JNb2RhbCwgQXBwSWNvblNlbGVjdG9yRmllbGRdLFxuICBleHBvcnRzOiBbQXBwSWNvblNlbGVjdG9yTW9kYWwsIEFwcEljb25TZWxlY3RvckZpZWxkLCBBcHBJY29uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwSWNvblNlbGVjdG9yTW9kdWxlIHt9Il19
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Injectable, signal } from '@angular/core';
|
|
2
|
+
import { firstValueFrom } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common/http";
|
|
5
|
+
/**
|
|
6
|
+
* Service de chargement et de filtrage des icônes disponibles.
|
|
7
|
+
* Charge le fichier assets/icons-ref.json en lazy (une seule fois).
|
|
8
|
+
*/
|
|
9
|
+
export class IconSelectorService {
|
|
10
|
+
http;
|
|
11
|
+
_ionic = signal([]);
|
|
12
|
+
_material = signal([]);
|
|
13
|
+
_ready = false;
|
|
14
|
+
_readyPromise = null;
|
|
15
|
+
ionicIcons = this._ionic.asReadonly();
|
|
16
|
+
materialIcons = this._material.asReadonly();
|
|
17
|
+
constructor(http) {
|
|
18
|
+
this.http = http;
|
|
19
|
+
}
|
|
20
|
+
ready() {
|
|
21
|
+
if (this._ready)
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
if (this._readyPromise)
|
|
24
|
+
return this._readyPromise;
|
|
25
|
+
this._readyPromise = firstValueFrom(this.http.get('assets/icons-ref.json')).then((data) => {
|
|
26
|
+
this._ionic.set(data.ionic || []);
|
|
27
|
+
this._material.set(data.material || []);
|
|
28
|
+
this._ready = true;
|
|
29
|
+
});
|
|
30
|
+
return this._readyPromise;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convertit un IconEntry en IconRef selon son origine.
|
|
34
|
+
*/
|
|
35
|
+
toIconRef(entry, origin) {
|
|
36
|
+
if (origin === 'ionic') {
|
|
37
|
+
return { icon: entry.name };
|
|
38
|
+
}
|
|
39
|
+
return { matIcon: entry.name };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Filtre les icônes par texte de recherche.
|
|
43
|
+
* Cherche dans le nom, le label, et les mots-clés.
|
|
44
|
+
* Insensible à la casse.
|
|
45
|
+
*/
|
|
46
|
+
search(searchText, origin) {
|
|
47
|
+
const icons = origin === 'ionic' ? this._ionic() : this._material();
|
|
48
|
+
const q = (searchText || '').trim().toLowerCase();
|
|
49
|
+
if (!q)
|
|
50
|
+
return icons;
|
|
51
|
+
return icons.filter((entry) => entry.name.toLowerCase().includes(q) ||
|
|
52
|
+
entry.label.toLowerCase().includes(q) ||
|
|
53
|
+
(entry.keywords || []).some((kw) => kw.includes(q)));
|
|
54
|
+
}
|
|
55
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
56
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorService, providedIn: 'root' });
|
|
57
|
+
}
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorService, decorators: [{
|
|
59
|
+
type: Injectable,
|
|
60
|
+
args: [{ providedIn: 'root' }]
|
|
61
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2ljb24vaWNvbi1zZWxlY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQWV0Qzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sbUJBQW1CO0lBU1Y7SUFSWixNQUFNLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFNBQVMsR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLGFBQWEsR0FBeUIsSUFBSSxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRXJELFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7SUFBRyxDQUFDO0lBRXhDLEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUVsRCxJQUFJLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWUsdUJBQXVCLENBQUMsQ0FDckQsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsS0FBZ0IsRUFBRSxNQUE0QjtRQUN0RCxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBa0IsRUFBRSxNQUE0QjtRQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVsRCxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXJCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FDakIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN0RCxDQUFDO0lBQ0osQ0FBQzt3R0FyRFUsbUJBQW1COzRHQUFuQixtQkFBbUIsY0FETixNQUFNOzs0RkFDbkIsbUJBQW1CO2tCQUQvQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJY29uUmVmIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJY29uRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleXdvcmRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJY29uc1JlZkpzb24ge1xuICBnZW5lcmF0ZWRBdDogc3RyaW5nO1xuICBpb25pYzogSWNvbkVudHJ5W107XG4gIG1hdGVyaWFsOiBJY29uRW50cnlbXTtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGRlIGNoYXJnZW1lbnQgZXQgZGUgZmlsdHJhZ2UgZGVzIGljw7RuZXMgZGlzcG9uaWJsZXMuXG4gKiBDaGFyZ2UgbGUgZmljaGllciBhc3NldHMvaWNvbnMtcmVmLmpzb24gZW4gbGF6eSAodW5lIHNldWxlIGZvaXMpLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEljb25TZWxlY3RvclNlcnZpY2Uge1xuICBwcml2YXRlIF9pb25pYyA9IHNpZ25hbDxJY29uRW50cnlbXT4oW10pO1xuICBwcml2YXRlIF9tYXRlcmlhbCA9IHNpZ25hbDxJY29uRW50cnlbXT4oW10pO1xuICBwcml2YXRlIF9yZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIF9yZWFkeVByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBpb25pY0ljb25zID0gdGhpcy5faW9uaWMuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBtYXRlcmlhbEljb25zID0gdGhpcy5fbWF0ZXJpYWwuYXNSZWFkb25seSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fcmVhZHkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAodGhpcy5fcmVhZHlQcm9taXNlKSByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmh0dHAuZ2V0PEljb25zUmVmSnNvbj4oJ2Fzc2V0cy9pY29ucy1yZWYuanNvbicpXG4gICAgKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLl9pb25pYy5zZXQoZGF0YS5pb25pYyB8fCBbXSk7XG4gICAgICB0aGlzLl9tYXRlcmlhbC5zZXQoZGF0YS5tYXRlcmlhbCB8fCBbXSk7XG4gICAgICB0aGlzLl9yZWFkeSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRpdCB1biBJY29uRW50cnkgZW4gSWNvblJlZiBzZWxvbiBzb24gb3JpZ2luZS5cbiAgICovXG4gIHRvSWNvblJlZihlbnRyeTogSWNvbkVudHJ5LCBvcmlnaW46ICdpb25pYycgfCAnbWF0ZXJpYWwnKTogSWNvblJlZiB7XG4gICAgaWYgKG9yaWdpbiA9PT0gJ2lvbmljJykge1xuICAgICAgcmV0dXJuIHsgaWNvbjogZW50cnkubmFtZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBtYXRJY29uOiBlbnRyeS5uYW1lIH07XG4gIH1cblxuICAvKipcbiAgICogRmlsdHJlIGxlcyBpY8O0bmVzIHBhciB0ZXh0ZSBkZSByZWNoZXJjaGUuXG4gICAqIENoZXJjaGUgZGFucyBsZSBub20sIGxlIGxhYmVsLCBldCBsZXMgbW90cy1jbMOpcy5cbiAgICogSW5zZW5zaWJsZSDDoCBsYSBjYXNzZS5cbiAgICovXG4gIHNlYXJjaChzZWFyY2hUZXh0OiBzdHJpbmcsIG9yaWdpbjogJ2lvbmljJyB8ICdtYXRlcmlhbCcpOiBJY29uRW50cnlbXSB7XG4gICAgY29uc3QgaWNvbnMgPSBvcmlnaW4gPT09ICdpb25pYycgPyB0aGlzLl9pb25pYygpIDogdGhpcy5fbWF0ZXJpYWwoKTtcbiAgICBjb25zdCBxID0gKHNlYXJjaFRleHQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFxKSByZXR1cm4gaWNvbnM7XG5cbiAgICByZXR1cm4gaWNvbnMuZmlsdGVyKFxuICAgICAgKGVudHJ5KSA9PlxuICAgICAgICBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHxcbiAgICAgICAgZW50cnkubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fFxuICAgICAgICAoZW50cnkua2V5d29yZHMgfHwgW10pLnNvbWUoKGt3KSA9PiBrdy5pbmNsdWRlcyhxKSlcbiAgICApO1xuICB9XG59Il19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/forms";
|
|
4
|
+
import * as i2 from "@ionic/angular";
|
|
5
|
+
import * as i3 from "@angular/material/form-field";
|
|
6
|
+
import * as i4 from "@angular/material/checkbox";
|
|
7
|
+
import * as i5 from "@angular/material/icon";
|
|
8
|
+
import * as i6 from "../icon-selector.field";
|
|
9
|
+
import * as i7 from "../../../shared/pipes/form.pipes";
|
|
10
|
+
export class IconSelectorTestPage {
|
|
11
|
+
formBuilder;
|
|
12
|
+
cd;
|
|
13
|
+
form;
|
|
14
|
+
selectedIcon = null;
|
|
15
|
+
disabled = false;
|
|
16
|
+
constructor(formBuilder, cd) {
|
|
17
|
+
this.formBuilder = formBuilder;
|
|
18
|
+
this.cd = cd;
|
|
19
|
+
this.form = formBuilder.group({
|
|
20
|
+
icon: [null],
|
|
21
|
+
});
|
|
22
|
+
this.form.get('icon').valueChanges.subscribe((ref) => {
|
|
23
|
+
this.selectedIcon = ref;
|
|
24
|
+
this.cd.markForCheck();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
toggleDisabled() {
|
|
28
|
+
this.disabled = !this.disabled;
|
|
29
|
+
if (this.disabled) {
|
|
30
|
+
this.form.get('icon').disable();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.form.get('icon').enable();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
stringify = JSON.stringify;
|
|
37
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestPage, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: IconSelectorTestPage, selector: "app-icon-selector-test", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Icon Selector test page</ion-title>\n\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-grid>\n <ion-row>\n <!-- Icon selector field -->\n <ion-col size=\"12\" size-md=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Icon selector field</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(selectedIcon) }}</pre>\n </small>\n </ion-text>\n\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <app-icon-selector-field\n [formControl]=\"form | formGetControl: 'icon'\"\n [placeholder]=\"'Icon'\"\n [disabled]=\"disabled\"\n ></app-icon-selector-field>\n\n <br/>\n <mat-checkbox (change)=\"disabled = $event.checked\" [checked]=\"disabled\">\n <mat-label>Disabled ?</mat-label>\n </mat-checkbox>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Preview -->\n <ion-col size=\"12\" size-md=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Preview</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content class=\"preview-container\">\n @if (selectedIcon?.icon) {\n <ion-icon [name]=\"selectedIcon.icon\" size=\"large\"></ion-icon>\n <br/>\n <ion-text color=\"medium\">\n <small><pre>{{ selectedIcon.icon }}</pre></small>\n </ion-text>\n }\n @if (selectedIcon?.matIcon) {\n <mat-icon [fontIcon]=\"selectedIcon.matIcon\"></mat-icon>\n <br/>\n <ion-text color=\"medium\">\n <small><pre>{{ selectedIcon.matIcon }}</pre></small>\n </ion-text>\n }\n @if (!selectedIcon) {\n <ion-text color=\"medium\">No icon selected</ion-text>\n }\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n", dependencies: [{ kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.AppIconSelectorField, selector: "app-icon-selector-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing"] }, { kind: "pipe", type: i7.FormGetControlPipe, name: "formGetControl" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
39
|
+
}
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestPage, decorators: [{
|
|
41
|
+
type: Component,
|
|
42
|
+
args: [{ selector: 'app-icon-selector-test', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Icon Selector test page</ion-title>\n\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-grid>\n <ion-row>\n <!-- Icon selector field -->\n <ion-col size=\"12\" size-md=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Icon selector field</ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small>\n <pre>{{ stringify(selectedIcon) }}</pre>\n </small>\n </ion-text>\n\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <app-icon-selector-field\n [formControl]=\"form | formGetControl: 'icon'\"\n [placeholder]=\"'Icon'\"\n [disabled]=\"disabled\"\n ></app-icon-selector-field>\n\n <br/>\n <mat-checkbox (change)=\"disabled = $event.checked\" [checked]=\"disabled\">\n <mat-label>Disabled ?</mat-label>\n </mat-checkbox>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Preview -->\n <ion-col size=\"12\" size-md=\"6\">\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">Preview</ion-label>\n </ion-card-title>\n </ion-card-header>\n <ion-card-content class=\"preview-container\">\n @if (selectedIcon?.icon) {\n <ion-icon [name]=\"selectedIcon.icon\" size=\"large\"></ion-icon>\n <br/>\n <ion-text color=\"medium\">\n <small><pre>{{ selectedIcon.icon }}</pre></small>\n </ion-text>\n }\n @if (selectedIcon?.matIcon) {\n <mat-icon [fontIcon]=\"selectedIcon.matIcon\"></mat-icon>\n <br/>\n <ion-text color=\"medium\">\n <small><pre>{{ selectedIcon.matIcon }}</pre></small>\n </ion-text>\n }\n @if (!selectedIcon) {\n <ion-text color=\"medium\">No icon selected</ion-text>\n }\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-content>\n" }]
|
|
43
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }] });
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2ljb24vdGVzdGluZy9pY29uLXNlbGVjdG9yLnRlc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaWNvbi90ZXN0aW5nL2ljb24tc2VsZWN0b3IudGVzdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFTdEYsTUFBTSxPQUFPLG9CQUFvQjtJQU1uQjtJQUNBO0lBTlosSUFBSSxDQUFtQjtJQUN2QixZQUFZLEdBQW1CLElBQUksQ0FBQztJQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLFlBQ1ksV0FBK0IsRUFDL0IsRUFBcUI7UUFEckIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBRS9CLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDYixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7WUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3dHQTVCaEIsb0JBQW9COzRGQUFwQixvQkFBb0IsOERDVGpDLGs5RUE2RUE7OzRGRHBFYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usd0JBQXdCLG1CQUVqQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEljb25SZWYgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtaWNvbi1zZWxlY3Rvci10ZXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ljb24tc2VsZWN0b3IudGVzdC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEljb25TZWxlY3RvclRlc3RQYWdlIHtcbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgc2VsZWN0ZWRJY29uOiBJY29uUmVmIHwgbnVsbCA9IG51bGw7XG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBpY29uOiBbbnVsbF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm0uZ2V0KCdpY29uJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVmKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWNvbiA9IHJlZjtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVEaXNhYmxlZCgpIHtcbiAgICB0aGlzLmRpc2FibGVkID0gIXRoaXMuZGlzYWJsZWQ7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2ljb24nKS5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2ljb24nKS5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcbn0iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tYmFjay1idXR0b24+PC9pb24tYmFjay1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cblxuICAgIDxpb24tdGl0bGU+SWNvbiBTZWxlY3RvciB0ZXN0IHBhZ2U8L2lvbi10aXRsZT5cblxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICA8aW9uLWdyaWQ+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8IS0tIEljb24gc2VsZWN0b3IgZmllbGQgLS0+XG4gICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLW1kPVwiNlwiPlxuICAgICAgICA8aW9uLWNhcmQ+XG4gICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIj5JY29uIHNlbGVjdG9yIGZpZWxkPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICA8cHJlPnt7IHN0cmluZ2lmeShzZWxlY3RlZEljb24pIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9pb24tdGV4dD5cblxuICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDxhcHAtaWNvbi1zZWxlY3Rvci1maWVsZFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybSB8IGZvcm1HZXRDb250cm9sOiAnaWNvbidcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0ljb24nXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgID48L2FwcC1pY29uLXNlbGVjdG9yLWZpZWxkPlxuXG4gICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cImRpc2FibGVkID0gJGV2ZW50LmNoZWNrZWRcIiBbY2hlY2tlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPkRpc2FibGVkID88L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPCEtLSBQcmV2aWV3IC0tPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1tZD1cIjZcIj5cbiAgICAgICAgPGlvbi1jYXJkPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCI+UHJldmlldzwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCI+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGVkSWNvbj8uaWNvbikge1xuICAgICAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwic2VsZWN0ZWRJY29uLmljb25cIiBzaXplPVwibGFyZ2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8YnIvPlxuICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJtZWRpdW1cIj5cbiAgICAgICAgICAgICAgICA8c21hbGw+PHByZT57eyBzZWxlY3RlZEljb24uaWNvbiB9fTwvcHJlPjwvc21hbGw+XG4gICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGVkSWNvbj8ubWF0SWNvbikge1xuICAgICAgICAgICAgICA8bWF0LWljb24gW2ZvbnRJY29uXT1cInNlbGVjdGVkSWNvbi5tYXRJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsPjxwcmU+e3sgc2VsZWN0ZWRJY29uLm1hdEljb24gfX08L3ByZT48L3NtYWxsPlxuICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghc2VsZWN0ZWRJY29uKSB7XG4gICAgICAgICAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPk5vIGljb24gc2VsZWN0ZWQ8L2lvbi10ZXh0PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L2lvbi1jb250ZW50PlxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RouterModule } from '@angular/router';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { IconSelectorTestPage } from './icon-selector.test';
|
|
5
|
+
import { SharedModule } from '../../../shared/shared.module';
|
|
6
|
+
import { AppIconSelectorModule } from '../icon-selector.module';
|
|
7
|
+
import { IonicModule } from '@ionic/angular';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/router";
|
|
10
|
+
const routes = [
|
|
11
|
+
{
|
|
12
|
+
path: 'icon-selector',
|
|
13
|
+
pathMatch: 'full',
|
|
14
|
+
component: IconSelectorTestPage,
|
|
15
|
+
},
|
|
16
|
+
];
|
|
17
|
+
export class IconSelectorTestingModule {
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
19
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestingModule, declarations: [IconSelectorTestPage], imports: [CommonModule, IonicModule, i1.RouterModule, SharedModule, AppIconSelectorModule], exports: [RouterModule, IconSelectorTestPage] });
|
|
20
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestingModule, imports: [CommonModule, IonicModule, RouterModule.forChild(routes), SharedModule, AppIconSelectorModule, RouterModule] });
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: IconSelectorTestingModule, decorators: [{
|
|
23
|
+
type: NgModule,
|
|
24
|
+
args: [{
|
|
25
|
+
imports: [CommonModule, IonicModule, RouterModule.forChild(routes), SharedModule, AppIconSelectorModule],
|
|
26
|
+
declarations: [IconSelectorTestPage],
|
|
27
|
+
exports: [RouterModule, IconSelectorTestPage],
|
|
28
|
+
}]
|
|
29
|
+
}] });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci50ZXN0aW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9pY29uL3Rlc3RpbmcvaWNvbi1zZWxlY3Rvci50ZXN0aW5nLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRTdDLE1BQU0sTUFBTSxHQUFXO0lBQ3JCO1FBQ0UsSUFBSSxFQUFFLGVBQWU7UUFDckIsU0FBUyxFQUFFLE1BQU07UUFDakIsU0FBUyxFQUFFLG9CQUFvQjtLQUNoQztDQUNGLENBQUM7QUFPRixNQUFNLE9BQU8seUJBQXlCO3dHQUF6Qix5QkFBeUI7eUdBQXpCLHlCQUF5QixpQkFIckIsb0JBQW9CLGFBRHpCLFlBQVksRUFBRSxXQUFXLG1CQUFpQyxZQUFZLEVBQUUscUJBQXFCLGFBRTdGLFlBQVksRUFBRSxvQkFBb0I7eUdBRWpDLHlCQUF5QixZQUoxQixZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUU3RixZQUFZOzs0RkFFWCx5QkFBeUI7a0JBTHJDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsQ0FBQztvQkFDeEcsWUFBWSxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ3BDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQztpQkFDOUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZXJNb2R1bGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25TZWxlY3RvclRlc3RQYWdlIH0gZnJvbSAnLi9pY29uLXNlbGVjdG9yLnRlc3QnO1xuaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NoYXJlZC5tb2R1bGUnO1xuaW1wb3J0IHsgQXBwSWNvblNlbGVjdG9yTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi1zZWxlY3Rvci5tb2R1bGUnO1xuaW1wb3J0IHsgSW9uaWNNb2R1bGUgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICB7XG4gICAgcGF0aDogJ2ljb24tc2VsZWN0b3InLFxuICAgIHBhdGhNYXRjaDogJ2Z1bGwnLFxuICAgIGNvbXBvbmVudDogSWNvblNlbGVjdG9yVGVzdFBhZ2UsXG4gIH0sXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25pY01vZHVsZSwgUm91dGVyTW9kdWxlLmZvckNoaWxkKHJvdXRlcyksIFNoYXJlZE1vZHVsZSwgQXBwSWNvblNlbGVjdG9yTW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBbSWNvblNlbGVjdG9yVGVzdFBhZ2VdLFxuICBleHBvcnRzOiBbUm91dGVyTW9kdWxlLCBJY29uU2VsZWN0b3JUZXN0UGFnZV0sXG59KVxuZXhwb3J0IGNsYXNzIEljb25TZWxlY3RvclRlc3RpbmdNb2R1bGUge30iXX0=
|