@ecodev/natural 47.2.0 → 47.3.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/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +1 -1
- package/esm2020/lib/modules/relations/relations.component.mjs +1 -1
- package/esm2020/lib/modules/select/select/select.component.mjs +48 -16
- package/fesm2015/ecodev-natural.mjs +50 -17
- package/fesm2015/ecodev-natural.mjs.map +1 -1
- package/fesm2020/ecodev-natural.mjs +49 -17
- package/fesm2020/ecodev-natural.mjs.map +1 -1
- package/lib/modules/select/select/select.component.d.ts +25 -9
- package/package.json +1 -1
|
@@ -30,7 +30,7 @@ export class TypeNaturalSelectComponent extends AbstractAssociationSelectCompone
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
TypeNaturalSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TypeNaturalSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
-
TypeNaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: TypeNaturalSelectComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "filter", "disabled"] }] });
|
|
33
|
+
TypeNaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: TypeNaturalSelectComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "searchOperator", "filter", "disabled"] }] });
|
|
34
34
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TypeNaturalSelectComponent, decorators: [{
|
|
35
35
|
type: Component,
|
|
36
36
|
args: [{ template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n" }]
|
|
@@ -170,7 +170,7 @@ export class NaturalRelationsComponent extends NaturalAbstractController {
|
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
NaturalRelationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalRelationsComponent, deps: [{ token: i1.NaturalLinkMutationService }, { token: i2.NaturalHierarchicSelectorDialogService }], target: i0.ɵɵFactoryTarget.Component });
|
|
173
|
-
NaturalRelationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalRelationsComponent, selector: "natural-relations", inputs: { service: "service", placeholder: "placeholder", autocompleteSelectorFilter: "autocompleteSelectorFilter", displayWith: "displayWith", disabled: "disabled", main: "main", hierarchicSelectorFilters: "hierarchicSelectorFilters", hierarchicSelectorConfig: "hierarchicSelectorConfig", otherName: "otherName", filter: "filter" }, outputs: { selectionChange: "selectionChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "select", first: true, predicate: NaturalSelectComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i6.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "component", type: i7.MatLegacyTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatLegacyHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatLegacyHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatLegacyColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatLegacyCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatLegacyRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatLegacyHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatLegacyCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatLegacyHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatLegacyRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i8.NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "filter", "disabled"] }, { kind: "component", type: i9.MatLegacyPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i10.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
173
|
+
NaturalRelationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalRelationsComponent, selector: "natural-relations", inputs: { service: "service", placeholder: "placeholder", autocompleteSelectorFilter: "autocompleteSelectorFilter", displayWith: "displayWith", disabled: "disabled", main: "main", hierarchicSelectorFilters: "hierarchicSelectorFilters", hierarchicSelectorConfig: "hierarchicSelectorConfig", otherName: "otherName", filter: "filter" }, outputs: { selectionChange: "selectionChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "select", first: true, predicate: NaturalSelectComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i6.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "component", type: i7.MatLegacyTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatLegacyHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatLegacyHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatLegacyColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatLegacyCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatLegacyRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatLegacyHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatLegacyCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatLegacyHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatLegacyRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i8.NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "searchOperator", "filter", "disabled"] }, { kind: "component", type: i9.MatLegacyPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i10.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
174
174
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalRelationsComponent, decorators: [{
|
|
175
175
|
type: Component,
|
|
176
176
|
args: [{ selector: 'natural-relations', template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"] }]
|
|
@@ -18,28 +18,40 @@ import * as i10 from "@angular/forms";
|
|
|
18
18
|
import * as i11 from "@angular/router";
|
|
19
19
|
/**
|
|
20
20
|
* Default usage:
|
|
21
|
-
*
|
|
21
|
+
* ```html
|
|
22
|
+
* <natural-select [service]="myServiceInstance" [(model)]="myModel" (modelChange)=myChangeFn($event)></natural-select>
|
|
23
|
+
* ```
|
|
22
24
|
*
|
|
23
25
|
* Custom template usage :
|
|
26
|
+
* ```html
|
|
24
27
|
* <natural-select [service]="svc" [(ngModel)]="model">
|
|
25
28
|
* <ng-template let-item="item">
|
|
26
29
|
* <span>{{ item.xxx }}</span>
|
|
27
30
|
* </ng-template>
|
|
28
31
|
* </natural-select>
|
|
32
|
+
* ```
|
|
29
33
|
*
|
|
30
|
-
* [(ngModel)] and (ngModelChange) are optional
|
|
34
|
+
* `[(ngModel)]` and `(ngModelChange)` are optional.
|
|
31
35
|
*
|
|
32
36
|
* Placeholder :
|
|
33
|
-
*
|
|
37
|
+
* ```html
|
|
38
|
+
* <natural-select placeholder="my placeholder"></natural-select>
|
|
39
|
+
* ```
|
|
34
40
|
*
|
|
35
41
|
* Never float placeholder :
|
|
36
|
-
*
|
|
42
|
+
* ```html
|
|
43
|
+
* <natural-select placeholder="my placeholder" floatPlaceholder="never"></natural-select>
|
|
44
|
+
* ```
|
|
37
45
|
*
|
|
38
|
-
* Search with like %xxx% on specified
|
|
39
|
-
*
|
|
46
|
+
* Search with like %xxx% on specified field `name` instead of custom filter on whole object
|
|
47
|
+
* ```html
|
|
48
|
+
* <natural-select searchField="name"></natural-select>
|
|
49
|
+
* ```
|
|
40
50
|
*
|
|
41
51
|
* Allows to input free string without selecting an option from autocomplete suggestions
|
|
42
|
-
*
|
|
52
|
+
* ```html
|
|
53
|
+
* <natural-select [optionRequired]="false"></natural-select>
|
|
54
|
+
* ```
|
|
43
55
|
*/
|
|
44
56
|
export class NaturalSelectComponent extends AbstractSelect {
|
|
45
57
|
constructor() {
|
|
@@ -49,9 +61,13 @@ export class NaturalSelectComponent extends AbstractSelect {
|
|
|
49
61
|
*/
|
|
50
62
|
this.optionRequired = true;
|
|
51
63
|
/**
|
|
52
|
-
* The
|
|
64
|
+
* The field on which to search for, default to 'custom'.
|
|
53
65
|
*/
|
|
54
66
|
this.searchField = 'custom';
|
|
67
|
+
/**
|
|
68
|
+
* The operator with which to search for, default to 'search' if `searchField` is 'custom', else 'like'.
|
|
69
|
+
*/
|
|
70
|
+
this.searchOperator = null;
|
|
55
71
|
/**
|
|
56
72
|
* Items returned by server to show in listing
|
|
57
73
|
*/
|
|
@@ -172,18 +188,32 @@ export class NaturalSelectComponent extends AbstractSelect {
|
|
|
172
188
|
return this.internalCtrl?.enabled && !!this.clearLabel && !!this.internalCtrl.value;
|
|
173
189
|
}
|
|
174
190
|
getSearchFilter(term) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
field = { custom: term ? { search: { value: term } } : null };
|
|
191
|
+
if (!term) {
|
|
192
|
+
return {};
|
|
178
193
|
}
|
|
179
|
-
|
|
180
|
-
|
|
194
|
+
const searchOperator = this.searchOperator ?? (this.searchField === 'custom' ? 'search' : 'like');
|
|
195
|
+
if (searchOperator === 'like') {
|
|
196
|
+
term = '%' + term + '%';
|
|
181
197
|
}
|
|
182
|
-
return {
|
|
198
|
+
return {
|
|
199
|
+
filter: {
|
|
200
|
+
groups: [
|
|
201
|
+
{
|
|
202
|
+
conditions: [
|
|
203
|
+
{
|
|
204
|
+
[this.searchField]: {
|
|
205
|
+
[searchOperator]: { value: term },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
};
|
|
183
213
|
}
|
|
184
214
|
}
|
|
185
215
|
NaturalSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
186
|
-
NaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalSelectComponent, selector: "natural-select", inputs: { service: "service", optionRequired: "optionRequired", searchField: "searchField", filter: "filter", disabled: "disabled" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "autoTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i2.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i3.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i5.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i7.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i11.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
216
|
+
NaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalSelectComponent, selector: "natural-select", inputs: { service: "service", optionRequired: "optionRequired", searchField: "searchField", searchOperator: "searchOperator", filter: "filter", disabled: "disabled" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "autoTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i2.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i3.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i5.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i7.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i11.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
187
217
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalSelectComponent, decorators: [{
|
|
188
218
|
type: Component,
|
|
189
219
|
args: [{ selector: 'natural-select', template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"] }]
|
|
@@ -199,9 +229,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImpor
|
|
|
199
229
|
type: Input
|
|
200
230
|
}], searchField: [{
|
|
201
231
|
type: Input
|
|
232
|
+
}], searchOperator: [{
|
|
233
|
+
type: Input
|
|
202
234
|
}], filter: [{
|
|
203
235
|
type: Input
|
|
204
236
|
}], disabled: [{
|
|
205
237
|
type: Input
|
|
206
238
|
}] } });
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkgsT0FBTyxFQUFDLDRCQUE0QixJQUFJLHNCQUFzQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDN0csT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVoQyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFDLDRCQUE0QixFQUFpQixNQUFNLHlDQUF5QyxDQUFDO0FBR3JHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUk1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBTUgsTUFBTSxPQUFPLHNCQWNULFNBQVEsY0FBd0M7SUFuQnBEOztRQThCSTs7V0FFRztRQUNhLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRXRDOztXQUVHO1FBQ2EsZ0JBQVcsR0FBc0IsUUFBUSxDQUFDO1FBVTFEOztXQUVHO1FBQ0ksVUFBSyxHQUFzQyxJQUFJLENBQUM7UUFFdkQ7O1dBRUc7UUFDSSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXZCOzs7V0FHRztRQUNJLGdCQUFXLEdBQUcsQ0FB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QkFBQyxzQkFBc0I7Z0JBQ0MsWUFBWTtzQkFBN0MsWUFBWTt1QkFBQyxXQUFXO2dCQUtULE9BQU87c0JBQXRCLEtBQUs7Z0JBS1UsY0FBYztzQkFBN0IsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQU1LLE1BQU07c0JBRGhCLEtBQUs7Z0JBbUNjLFFBQVE7c0JBRDNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNYXRMZWdhY3lBdXRvY29tcGxldGVUcmlnZ2VyIGFzIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGUnO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbmFsaXplLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtQYWdpbmF0ZWREYXRhfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2RhdGEtc291cmNlJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge05hdHVyYWxBYnN0cmFjdE1vZGVsU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWJzdHJhY3QtbW9kZWwuc2VydmljZSc7XG5pbXBvcnQge0V4dHJhY3RUYWxsT25lLCBFeHRyYWN0VmFsbCwgTGl0ZXJhbH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHtBYnN0cmFjdFNlbGVjdH0gZnJvbSAnLi4vYWJzdHJhY3Qtc2VsZWN0LmNvbXBvbmVudCc7XG5cbnR5cGUgVjxUU2VydmljZT4gPSBzdHJpbmcgfCBFeHRyYWN0VGFsbE9uZTxUU2VydmljZT47XG5cbi8qKlxuICogRGVmYXVsdCB1c2FnZTpcbiAqIDxuYXR1cmFsLXNlbGVjdCBbc2VydmljZV09XCJhbWF6aW5nU2VydmljZUluc3RhbmNlXCIgWyhtb2RlbCldPVwiYW1hemluZ01vZGVsXCIgKG1vZGVsQ2hhbmdlKT1hbWF6aW5nQ2hhbmdlRm4oJGV2ZW50KT48L25hdHVyYWwtc2VsZWN0PlxuICpcbiAqIEN1c3RvbSB0ZW1wbGF0ZSB1c2FnZSA6XG4gKiA8bmF0dXJhbC1zZWxlY3QgW3NlcnZpY2VdPVwic3ZjXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiPlxuICogICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAqICAgICAgICAgPHNwYW4+e3sgaXRlbS54eHggfX08L3NwYW4+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqIDwvbmF0dXJhbC1zZWxlY3Q+XG4gKlxuICogWyhuZ01vZGVsKV0gYW5kIChuZ01vZGVsQ2hhbmdlKSBhcmUgb3B0aW9uYWxcbiAqXG4gKiBQbGFjZWhvbGRlciA6XG4gKiA8bmF0dXJhbC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJhbWF6aW5nIHBsYWNlaG9sZGVyXCI+XG4gKlxuICogTmV2ZXIgZmxvYXQgcGxhY2Vob2xkZXIgOlxuICogPG5hdHVyYWwtc2VsZWN0IHBsYWNlaG9sZGVyPVwiYW1hemluZyBwbGFjZWhvbGRlclwiIGZsb2F0UGxhY2Vob2xkZXI9XCJuZXZlclwiPlxuICpcbiAqIFNlYXJjaCB3aXRoIGxpa2UgJXh4eCUgb24gc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lIGluc3RlYWQgb2YgY3VzdG9tIGZpbHRlciBvbiB3aG9sZSBvYmplY3RcbiAqIDxuYXR1cmFsLXNlbGVjdCBbc2VhcmNoRmllbGRdPVwic3RyaW5nXCI+XG4gKlxuICogQWxsb3dzIHRvIGlucHV0IGZyZWUgc3RyaW5nIHdpdGhvdXQgc2VsZWN0aW5nIGFuIG9wdGlvbiBmcm9tIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICogPG5hdHVyYWwtc2VsZWN0IFtvcHRpb25SZXF1aXJlZF09XCJmYWxzZVwiPlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25hdHVyYWwtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFNlbGVjdENvbXBvbmVudDxcbiAgICAgICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgICAgICAgICAgUXVlcnlWYXJpYWJsZXMsXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnlcbiAgICAgICAgPixcbiAgICA+XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdDxWPFRTZXJ2aWNlPiwgVjxUU2VydmljZT4+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXRcbntcbiAgICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIHB1YmxpYyBhdXRvVHJpZ2dlciE6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XG4gICAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgcHVibGljIGl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIHdpdGggd2F0Y2hBbGwgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHF1ZXJ5VmFyaWFibGVzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZXJ2aWNlITogVFNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBJZiBmYWxzZSwgYWxsb3dzIHRvIGlucHV0IGZyZWUgc3RyaW5nIHdpdGhvdXQgc2VsZWN0aW5nIGFuIG9wdGlvbiBmcm9tIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25SZXF1aXJlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlsdGVyIGF0dHJpYnV0ZSB0byBiaW5kIHdoZW4gc2VhcmNoaW5nIGZvciBhIHRlcm1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoRmllbGQ6ICdjdXN0b20nIHwgc3RyaW5nID0gJ2N1c3RvbSc7XG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGZpbHRlciBmb3IgcXVlcnlcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmlsdGVyKGZpbHRlcjogRXh0cmFjdFZhbGw8VFNlcnZpY2U+WydmaWx0ZXInXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLnNldCgnYWRkaXRpb25hbC1maWx0ZXInLCB7ZmlsdGVyOiBmaWx0ZXJ9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVtcyByZXR1cm5lZCBieSBzZXJ2ZXIgdG8gc2hvdyBpbiBsaXN0aW5nXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1zOiBudWxsIHwgT2JzZXJ2YWJsZTxyZWFkb25seSBhbnlbXT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBhIHdlIGFyZSBzZWFyY2hpbmcgc29tZXRoaW5nXG4gICAgICovXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpdGVtcyBub3Qgc2hvd24gaW4gcmVzdWx0IGxpc3RcbiAgICAgKiBTaG93cyBhIG1lc3NhZ2UgYWZ0ZXIgbGlzdCBpZiBwb3NpdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBtb3JlTmJJdGVtcyA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHBhZ2Ugc2l6ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFnZVNpemUgPSAxMDtcblxuICAgIC8qKlxuICAgICAqIEluaXQgc2VhcmNoIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwcml2YXRlIHZhcmlhYmxlc01hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxRdWVyeVZhcmlhYmxlcz4oKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHZhbHVlIGNhbiBiZSBjaGFuZ2VkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICAgIGRpc2FibGVkID8gdGhpcy5pbnRlcm5hbEN0cmwuZGlzYWJsZSgpIDogdGhpcy5pbnRlcm5hbEN0cmwuZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEN0cmwudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB0aGlzLnNlYXJjaCh2YWwpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnRlcm5hbEZvcm1DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIC8vIElmIHdlIGFsbG93IGZyZWUgc3RyaW5nIHR5cGluZywgdGhlbiB3ZSBwcm9wYWdhdGUgaXQgYXMgaXQgaXMgYmVpbmcgdHlwZWRcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvblJlcXVpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVZhbHVlKHRoaXMuaW50ZXJuYWxDdHJsLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5pbml0U2VydmljZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIC8vIEFzc2VydCBnaXZlbiBzZXJ2aWNlIGhhcyBhIHdhdGNoQWxsIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXJ2aWNlLndhdGNoQWxsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm92aWRlZCBzZXJ2aWNlIGRvZXMgbm90IGNvbnRhaW4gd2F0Y2hBbGwgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQYWdpbmF0aW9uID0ge1xuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoZGVmYXVsdFBhZ2luYXRpb24sIHRoaXMuZ2V0U2VhcmNoRmlsdGVyKG51bGwpKTtcbiAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLnNldCgndmFyaWFibGVzJywgdmFyaWFibGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnRTZWFyY2goKTogdm9pZCB7XG4gICAgICAgIC8vIFN0YXJ0IHNlYXJjaCBvbmx5IG9uY2VcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXQgcXVlcnksIGFuZCB3aGVuIHF1ZXJ5IHJlc3VsdHMgYXJyaXZlLCBmaW5pc2ggbG9hZGluZywgYW5kIGNvdW50IGl0ZW1zXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLnNlcnZpY2Uud2F0Y2hBbGwodGhpcy52YXJpYWJsZXNNYW5hZ2VyKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSxcbiAgICAgICAgICAgIG1hcChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYlRvdGFsID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJMaXN0ZWQgPSBNYXRoLm1pbihkYXRhLmxlbmd0aCwgdGhpcy5wYWdlU2l6ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3JlTmJJdGVtcyA9IG5iVG90YWwgLSBuYkxpc3RlZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLml0ZW1zO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pdGVtcy5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgcHJvcGFnYXRlVmFsdWUodmFsdWU6IFY8VFNlcnZpY2U+IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAvLyBJZiB3ZSBjbGVhcmVkIHZhbHVlIHZpYSBidXR0b24sIGJ1dCB3ZSBhbGxvdyBmcmVlIHN0cmluZyB0eXBpbmcsIHRoZW4gZm9yY2UgdG8gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25SZXF1aXJlZCAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLnByb3BhZ2F0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJ5IGltcG9ydGFudCB0byByZXR1cm4gc29tZXRoaW5nLCBhYm92ZSBhbGwgaWYgW3NlbGVjdF09J2Rpc3BsYXllZFZhbHVlJyBhdHRyaWJ1dGUgdmFsdWUgaXMgdXNlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREaXNwbGF5Rm4oKTogKGl0ZW06IFY8VFNlcnZpY2U+IHwgbnVsbCkgPT4gc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbS5mdWxsTmFtZSB8fCBpdGVtLm5hbWUgfHwgaXRlbS5pYmFuIHx8IGl0ZW1bdGhpcy5zZWFyY2hGaWVsZF0gfHwgaXRlbS5pZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY2xlYXIoZW1pdEV2ZW50ID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaChudWxsKTtcbiAgICAgICAgc3VwZXIuY2xlYXIoZW1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKHRlcm06IFY8VFNlcnZpY2U+IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIHRlcm0gPT09ICdzdHJpbmcnIHx8IHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0ZXJtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gISF0aGlzLml0ZW1zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlc01hbmFnZXIubWVyZ2UoJ3ZhcmlhYmxlcycsIHRoaXMuZ2V0U2VhcmNoRmlsdGVyKHRlcm0gYXMgc3RyaW5nIHwgbnVsbCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDdHJsPy5lbmFibGVkICYmICEhdGhpcy5jbGVhckxhYmVsICYmICEhdGhpcy5pbnRlcm5hbEN0cmwudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWFyY2hGaWx0ZXIodGVybTogc3RyaW5nIHwgbnVsbCk6IFF1ZXJ5VmFyaWFibGVzIHtcbiAgICAgICAgbGV0IGZpZWxkOiBMaXRlcmFsID0ge307XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRmllbGQgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHtjdXN0b206IHRlcm0gPyB7c2VhcmNoOiB7dmFsdWU6IHRlcm19fSA6IG51bGx9O1xuICAgICAgICB9IGVsc2UgaWYgKHRlcm0pIHtcbiAgICAgICAgICAgIGZpZWxkW3RoaXMuc2VhcmNoRmllbGRdID0ge2xpa2U6IHt2YWx1ZTogJyUnICsgdGVybSArICclJ319O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6IHtncm91cHM6IFt7Y29uZGl0aW9uczogW2ZpZWxkXX1dfX07XG4gICAgfVxufVxuIiwiPCEtLSBBdXRvY29tcGxldGUgbWVudSAtLT5cbjxtYXQtYXV0b2NvbXBsZXRlXG4gICAgI2FjPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAob3B0aW9uU2VsZWN0ZWQpPVwicHJvcGFnYXRlVmFsdWUoJGV2ZW50Lm9wdGlvbi52YWx1ZSlcIlxuICAgIFtkaXNwbGF5V2l0aF09XCJnZXREaXNwbGF5Rm4oKVwiXG4gICAgcGFuZWxXaWR0aD1cImF1dG8gIWltcG9ydGFudFwiXG4+XG4gICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXMgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBpdGVtfVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGUgPyBpdGVtVGVtcGxhdGUgOiBkZWZhdWx0QUNJdGVtXCJcbiAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtb3B0aW9uPlxuICAgIDxkaXYgKm5nSWY9XCJtb3JlTmJJdGVtcyA+IDBcIiBjbGFzcz1cIm1hdC1jYXB0aW9uXCIgaTE4biBzdHlsZT1cInBhZGRpbmc6IDVweCAxMHB4XCJcbiAgICAgICAgPnt7IG1vcmVOYkl0ZW1zIH19IMOpbMOpbWVudChzKSBzdXBwbMOpbWVudGFpcmUocyk8L2RpdlxuICAgID5cbjwvbWF0LWF1dG9jb21wbGV0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QUNJdGVtIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgIDxzcGFuPnt7IGdldERpc3BsYXlGbigpKGl0ZW0pIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBJbnB1dCBmb3IgYXV0b2NvbXBsZXRlIC0tPlxuPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cImZsb2F0UGxhY2Vob2xkZXJcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG5cbiAgICA8aW5wdXRcbiAgICAgICAgKGJsdXIpPVwidG91Y2goKTsgYmx1ci5lbWl0KClcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uSW50ZXJuYWxGb3JtQ2hhbmdlKClcIlxuICAgICAgICAoY2xpY2spPVwiYXV0b1RyaWdnZXIub3BlblBhbmVsKClcIlxuICAgICAgICAoZm9jdXMpPVwic3RhcnRTZWFyY2goKVwiXG4gICAgICAgIChrZXlkb3duLmVzYyk9XCJjbGVhcigpXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImludGVybmFsQ3RybFwiXG4gICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYWNcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiUmVjaGVyY2hlIGV0IHPDqWxlY3Rpb25cIlxuICAgICAgICBpMThuLWFyaWEtbGFiZWxcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgW2Vycm9yU3RhdGVNYXRjaGVyXT1cIm1hdGNoZXJcIlxuICAgIC8+XG5cbiAgICA8IS0tIE1ldGEgZGF0YSAtLT5cbiAgICA8bmF0dXJhbC1pY29uICpuZ0lmPVwiIWxvYWRpbmcgJiYgc2hvd0ljb25cIiBbbmFtZV09XCJpY29uXCIgbWF0UHJlZml4PjwvbmF0dXJhbC1pY29uPlxuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAqbmdJZj1cImxvYWRpbmdcIlxuICAgICAgICBbZGlhbWV0ZXJdPVwiMjFcIlxuICAgICAgICBbc3Ryb2tlV2lkdGhdPVwiNVwiXG4gICAgICAgIG1hdFByZWZpeFxuICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG5cbiAgICA8IS0tIENsZWFyIGJ1dHRvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3VmZml4LWJ1dHRvbnNcIiBtYXRTdWZmaXg+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgKm5nSWY9XCJpbnRlcm5hbEN0cmwudmFsdWUgJiYgaW50ZXJuYWxDdHJsLmVuYWJsZWQgJiYgIWNsZWFyTGFiZWxcIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEw6lzw6lsZWN0aW9ubmVyXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5hdHVyYWwtaWNvbiBuYW1lPVwiY2xvc2VcIj48L25hdHVyYWwtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaW50ZXJuYWxDdHJsLnZhbHVlICYmIG5hdmlnYXRlVG9cIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwibmF2aWdhdGVUb1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmF2aWd1ZXIgdmVyc1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuYXR1cmFsLWljb24gbmFtZT1cIm9wZW5faW5fYnJvd3NlclwiPjwvbmF0dXJhbC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJoYXNSZXF1aXJlZEVycm9yKClcIiBpMThuPkNlIGNoYW1wIGVzdCByZXF1aXM8L21hdC1lcnJvcj5cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjwhLS0gQWRkaXRpb25hbCAodW4pc2VsZWN0Lyh1bilsaW5rIGJ1dHRvbnMgZm9yIG1vcmUgdmlzdWFsIGNvaGVzaW9uIHdpdGggbmF0dXJhbC1yZWxhdGlvbnMgLS0+PCEtLSBbY2xlYXJMYWJlbF0gYW5kL29yIFtzZWxlY3RMYWJlbF0gaGFzIHRvIGJlIGdpdmVuIGFzIGF0dHJpYnV0ZSBpbnB1dCAtLT5cbjxkaXYgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b24oKVwiIGNsYXNzPVwiZXh0ZXJuYWwtYnV0dG9uc1wiPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNsZWFyKClcIiAqbmdJZj1cInNob3dDbGVhckJ1dHRvbigpXCIgY29sb3I9XCJ3YXJuXCIgbWF0LWJ1dHRvbj57eyBjbGVhckxhYmVsIH19PC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3NlbGVjdC9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkgsT0FBTyxFQUFDLDRCQUE0QixJQUFJLHNCQUFzQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDN0csT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVoQyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFDLDRCQUE0QixFQUFpQixNQUFNLHlDQUF5QyxDQUFDO0FBR3JHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUk1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NHO0FBTUgsTUFBTSxPQUFPLHNCQWNULFNBQVEsY0FBd0M7SUFuQnBEOztRQThCSTs7V0FFRztRQUNhLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRXRDOztXQUVHO1FBQ2EsZ0JBQVcsR0FBc0IsUUFBUSxDQUFDO1FBRTFEOztXQUVHO1FBQ2EsbUJBQWMsR0FBNkIsSUFBSSxDQUFDO1FBVWhFOztXQUVHO1FBQ0ksVUFBSyxHQUFzQyxJQUFJLENBQUM7UUFFdkQ7O1dBRUc7UUFDSSxZ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OzJGRHpCYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0ksZ0JBQWdCOzhCQXFCZ0IsV0FBVztzQkFBcEQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBQ0MsWUFBWTtzQkFBN0MsWUFBWTt1QkFBQyxXQUFXO2dCQUtULE9BQU87c0JBQXRCLEtBQUs7Z0JBS1UsY0FBYztzQkFBN0IsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBTUssTUFBTTtzQkFEaEIsS0FBSztnQkFtQ2MsUUFBUTtzQkFEM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge01hdExlZ2FjeUF1dG9jb21wbGV0ZVRyaWdnZXIgYXMgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWF1dG9jb21wbGV0ZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmluYWxpemUsIG1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1BhZ2luYXRlZERhdGF9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyLCBRdWVyeVZhcmlhYmxlc30gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9xdWVyeS12YXJpYWJsZS1tYW5hZ2VyJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0TW9kZWxTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlJztcbmltcG9ydCB7RXh0cmFjdFRhbGxPbmUsIEV4dHJhY3RWYWxsLCBMaXRlcmFsfSBmcm9tICcuLi8uLi8uLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge0Fic3RyYWN0U2VsZWN0fSBmcm9tICcuLi9hYnN0cmFjdC1zZWxlY3QuY29tcG9uZW50JztcblxudHlwZSBWPFRTZXJ2aWNlPiA9IHN0cmluZyB8IEV4dHJhY3RUYWxsT25lPFRTZXJ2aWNlPjtcblxuLyoqXG4gKiBEZWZhdWx0IHVzYWdlOlxuICogYGBgaHRtbFxuICogPG5hdHVyYWwtc2VsZWN0IFtzZXJ2aWNlXT1cIm15U2VydmljZUluc3RhbmNlXCIgWyhtb2RlbCldPVwibXlNb2RlbFwiIChtb2RlbENoYW5nZSk9bXlDaGFuZ2VGbigkZXZlbnQpPjwvbmF0dXJhbC1zZWxlY3Q+XG4gKiBgYGBcbiAqXG4gKiBDdXN0b20gdGVtcGxhdGUgdXNhZ2UgOlxuICogYGBgaHRtbFxuICogPG5hdHVyYWwtc2VsZWN0IFtzZXJ2aWNlXT1cInN2Y1wiIFsobmdNb2RlbCldPVwibW9kZWxcIj5cbiAqICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XG4gKiAgICAgICAgIDxzcGFuPnt7IGl0ZW0ueHh4IH19PC9zcGFuPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiA8L25hdHVyYWwtc2VsZWN0PlxuICogYGBgXG4gKlxuICogYFsobmdNb2RlbCldYCBhbmQgYChuZ01vZGVsQ2hhbmdlKWAgYXJlIG9wdGlvbmFsLlxuICpcbiAqIFBsYWNlaG9sZGVyIDpcbiAqIGBgYGh0bWxcbiAqIDxuYXR1cmFsLXNlbGVjdCBwbGFjZWhvbGRlcj1cIm15IHBsYWNlaG9sZGVyXCI+PC9uYXR1cmFsLXNlbGVjdD5cbiAqIGBgYFxuICpcbiAqIE5ldmVyIGZsb2F0IHBsYWNlaG9sZGVyIDpcbiAqIGBgYGh0bWxcbiAqIDxuYXR1cmFsLXNlbGVjdCBwbGFjZWhvbGRlcj1cIm15IHBsYWNlaG9sZGVyXCIgZmxvYXRQbGFjZWhvbGRlcj1cIm5ldmVyXCI+PC9uYXR1cmFsLXNlbGVjdD5cbiAqIGBgYFxuICpcbiAqIFNlYXJjaCB3aXRoIGxpa2UgJXh4eCUgb24gc3BlY2lmaWVkIGZpZWxkIGBuYW1lYCBpbnN0ZWFkIG9mIGN1c3RvbSBmaWx0ZXIgb24gd2hvbGUgb2JqZWN0XG4gKiBgYGBodG1sXG4gKiA8bmF0dXJhbC1zZWxlY3Qgc2VhcmNoRmllbGQ9XCJuYW1lXCI+PC9uYXR1cmFsLXNlbGVjdD5cbiAqIGBgYFxuICpcbiAqIEFsbG93cyB0byBpbnB1dCBmcmVlIHN0cmluZyB3aXRob3V0IHNlbGVjdGluZyBhbiBvcHRpb24gZnJvbSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbnNcbiAqIGBgYGh0bWxcbiAqIDxuYXR1cmFsLXNlbGVjdCBbb3B0aW9uUmVxdWlyZWRdPVwiZmFsc2VcIj48L25hdHVyYWwtc2VsZWN0PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmF0dXJhbC1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsU2VsZWN0Q29tcG9uZW50PFxuICAgICAgICBUU2VydmljZSBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdE1vZGVsU2VydmljZTxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIFBhZ2luYXRlZERhdGE8TGl0ZXJhbD4sXG4gICAgICAgICAgICBRdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIGFueVxuICAgICAgICA+LFxuICAgID5cbiAgICBleHRlbmRzIEFic3RyYWN0U2VsZWN0PFY8VFNlcnZpY2U+LCBWPFRTZXJ2aWNlPj5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdFxue1xuICAgIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikgcHVibGljIGF1dG9UcmlnZ2VyITogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcbiAgICBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKSBwdWJsaWMgaXRlbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIFNlcnZpY2Ugd2l0aCB3YXRjaEFsbCBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgcXVlcnlWYXJpYWJsZXMuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNlcnZpY2UhOiBUU2VydmljZTtcblxuICAgIC8qKlxuICAgICAqIElmIGZhbHNlLCBhbGxvd3MgdG8gaW5wdXQgZnJlZSBzdHJpbmcgd2l0aG91dCBzZWxlY3RpbmcgYW4gb3B0aW9uIGZyb20gYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG9wdGlvblJlcXVpcmVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBvbiB3aGljaCB0byBzZWFyY2ggZm9yLCBkZWZhdWx0IHRvICdjdXN0b20nLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hGaWVsZDogJ2N1c3RvbScgfCBzdHJpbmcgPSAnY3VzdG9tJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRvciB3aXRoIHdoaWNoIHRvIHNlYXJjaCBmb3IsIGRlZmF1bHQgdG8gJ3NlYXJjaCcgaWYgYHNlYXJjaEZpZWxkYCBpcyAnY3VzdG9tJywgZWxzZSAnbGlrZScuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaE9wZXJhdG9yOiAnc2VhcmNoJyB8IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBmaWx0ZXIgZm9yIHF1ZXJ5XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGZpbHRlcihmaWx0ZXI6IEV4dHJhY3RWYWxsPFRTZXJ2aWNlPlsnZmlsdGVyJ10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVzTWFuYWdlci5zZXQoJ2FkZGl0aW9uYWwtZmlsdGVyJywge2ZpbHRlcjogZmlsdGVyfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlbXMgcmV0dXJuZWQgYnkgc2VydmVyIHRvIHNob3cgaW4gbGlzdGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtczogbnVsbCB8IE9ic2VydmFibGU8cmVhZG9ubHkgYW55W10+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSB3ZSBhcmUgc2VhcmNoaW5nIHNvbWV0aGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaXRlbXMgbm90IHNob3duIGluIHJlc3VsdCBsaXN0XG4gICAgICogU2hvd3MgYSBtZXNzYWdlIGFmdGVyIGxpc3QgaWYgcG9zaXRpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgbW9yZU5iSXRlbXMgPSAwO1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBwYWdlIHNpemVcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhZ2VTaXplID0gMTA7XG5cbiAgICAvKipcbiAgICAgKiBJbml0IHNlYXJjaCBvcHRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSB2YXJpYWJsZXNNYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8UXVlcnlWYXJpYWJsZXM+KCk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICBkaXNhYmxlZCA/IHRoaXMuaW50ZXJuYWxDdHJsLmRpc2FibGUoKSA6IHRoaXMuaW50ZXJuYWxDdHJsLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxDdHJsLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWwgPT4gdGhpcy5zZWFyY2godmFsKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW50ZXJuYWxGb3JtQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBJZiB3ZSBhbGxvdyBmcmVlIHN0cmluZyB0eXBpbmcsIHRoZW4gd2UgcHJvcGFnYXRlIGl0IGFzIGl0IGlzIGJlaW5nIHR5cGVkXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25SZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVWYWx1ZSh0aGlzLmludGVybmFsQ3RybC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuaW5pdFNlcnZpY2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICAvLyBBc3NlcnQgZ2l2ZW4gc2VydmljZSBoYXMgYSB3YXRjaEFsbCBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VydmljZS53YXRjaEFsbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvdmlkZWQgc2VydmljZSBkb2VzIG5vdCBjb250YWluIHdhdGNoQWxsIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UGFnaW5hdGlvbiA9IHtcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKGRlZmF1bHRQYWdpbmF0aW9uLCB0aGlzLmdldFNlYXJjaEZpbHRlcihudWxsKSk7XG4gICAgICAgIHRoaXMudmFyaWFibGVzTWFuYWdlci5zZXQoJ3ZhcmlhYmxlcycsIHZhcmlhYmxlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0U2VhcmNoKCk6IHZvaWQge1xuICAgICAgICAvLyBTdGFydCBzZWFyY2ggb25seSBvbmNlXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0IHF1ZXJ5LCBhbmQgd2hlbiBxdWVyeSByZXN1bHRzIGFycml2ZSwgZmluaXNoIGxvYWRpbmcsIGFuZCBjb3VudCBpdGVtc1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5zZXJ2aWNlLndhdGNoQWxsKHRoaXMudmFyaWFibGVzTWFuYWdlcikucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSksXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbmJUb3RhbCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5iTGlzdGVkID0gTWF0aC5taW4oZGF0YS5sZW5ndGgsIHRoaXMucGFnZVNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9yZU5iSXRlbXMgPSBuYlRvdGFsIC0gbmJMaXN0ZWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5pdGVtcztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXRlbXMuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHByb3BhZ2F0ZVZhbHVlKHZhbHVlOiBWPFRTZXJ2aWNlPiB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSWYgd2UgY2xlYXJlZCB2YWx1ZSB2aWEgYnV0dG9uLCBidXQgd2UgYWxsb3cgZnJlZSBzdHJpbmcgdHlwaW5nLCB0aGVuIGZvcmNlIHRvIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uUmVxdWlyZWQgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5wcm9wYWdhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyeSBpbXBvcnRhbnQgdG8gcmV0dXJuIHNvbWV0aGluZywgYWJvdmUgYWxsIGlmIFtzZWxlY3RdPSdkaXNwbGF5ZWRWYWx1ZScgYXR0cmlidXRlIHZhbHVlIGlzIHVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGlzcGxheUZuKCk6IChpdGVtOiBWPFRTZXJ2aWNlPiB8IG51bGwpID0+IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlXaXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5V2l0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZnVsbE5hbWUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0uaWJhbiB8fCBpdGVtW3RoaXMuc2VhcmNoRmllbGRdIHx8IGl0ZW0uaWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNsZWFyKGVtaXRFdmVudCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2gobnVsbCk7XG4gICAgICAgIHN1cGVyLmNsZWFyKGVtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlYXJjaCh0ZXJtOiBWPFRTZXJ2aWNlPiB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyB8fCB0ZXJtID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGVybSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9ICEhdGhpcy5pdGVtcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLm1lcmdlKCd2YXJpYWJsZXMnLCB0aGlzLmdldFNlYXJjaEZpbHRlcih0ZXJtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEN0cmw/LmVuYWJsZWQgJiYgISF0aGlzLmNsZWFyTGFiZWwgJiYgISF0aGlzLmludGVybmFsQ3RybC52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlYXJjaEZpbHRlcih0ZXJtOiBzdHJpbmcgfCBudWxsKTogUXVlcnlWYXJpYWJsZXMge1xuICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlYXJjaE9wZXJhdG9yID0gdGhpcy5zZWFyY2hPcGVyYXRvciA/PyAodGhpcy5zZWFyY2hGaWVsZCA9PT0gJ2N1c3RvbScgPyAnc2VhcmNoJyA6ICdsaWtlJyk7XG4gICAgICAgIGlmIChzZWFyY2hPcGVyYXRvciA9PT0gJ2xpa2UnKSB7XG4gICAgICAgICAgICB0ZXJtID0gJyUnICsgdGVybSArICclJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBncm91cHM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMuc2VhcmNoRmllbGRdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoT3BlcmF0b3JdOiB7dmFsdWU6IHRlcm19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIjwhLS0gQXV0b2NvbXBsZXRlIG1lbnUgLS0+XG48bWF0LWF1dG9jb21wbGV0ZVxuICAgICNhYz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgKG9wdGlvblNlbGVjdGVkKT1cInByb3BhZ2F0ZVZhbHVlKCRldmVudC5vcHRpb24udmFsdWUpXCJcbiAgICBbZGlzcGxheVdpdGhdPVwiZ2V0RGlzcGxheUZuKClcIlxuICAgIHBhbmVsV2lkdGg9XCJhdXRvICFpbXBvcnRhbnRcIlxuPlxuICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogaXRlbX1cIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlID8gaXRlbVRlbXBsYXRlIDogZGVmYXVsdEFDSXRlbVwiXG4gICAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvbWF0LW9wdGlvbj5cbiAgICA8ZGl2ICpuZ0lmPVwibW9yZU5iSXRlbXMgPiAwXCIgY2xhc3M9XCJtYXQtY2FwdGlvblwiIGkxOG4gc3R5bGU9XCJwYWRkaW5nOiA1cHggMTBweFwiXG4gICAgICAgID57eyBtb3JlTmJJdGVtcyB9fSDDqWzDqW1lbnQocykgc3VwcGzDqW1lbnRhaXJlKHMpPC9kaXZcbiAgICA+XG48L21hdC1hdXRvY29tcGxldGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEFDSXRlbSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgICA8c3Bhbj57eyBnZXREaXNwbGF5Rm4oKShpdGVtKSB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gSW5wdXQgZm9yIGF1dG9jb21wbGV0ZSAtLT5cbjxtYXQtZm9ybS1maWVsZCBbZmxvYXRMYWJlbF09XCJmbG9hdFBsYWNlaG9sZGVyXCI+XG4gICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuXG4gICAgPGlucHV0XG4gICAgICAgIChibHVyKT1cInRvdWNoKCk7IGJsdXIuZW1pdCgpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkludGVybmFsRm9ybUNoYW5nZSgpXCJcbiAgICAgICAgKGNsaWNrKT1cImF1dG9UcmlnZ2VyLm9wZW5QYW5lbCgpXCJcbiAgICAgICAgKGZvY3VzKT1cInN0YXJ0U2VhcmNoKClcIlxuICAgICAgICAoa2V5ZG93bi5lc2MpPVwiY2xlYXIoKVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnRlcm5hbEN0cmxcIlxuICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImFjXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlJlY2hlcmNoZSBldCBzw6lsZWN0aW9uXCJcbiAgICAgICAgaTE4bi1hcmlhLWxhYmVsXG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIFtlcnJvclN0YXRlTWF0Y2hlcl09XCJtYXRjaGVyXCJcbiAgICAvPlxuXG4gICAgPCEtLSBNZXRhIGRhdGEgLS0+XG4gICAgPG5hdHVyYWwtaWNvbiAqbmdJZj1cIiFsb2FkaW5nICYmIHNob3dJY29uXCIgW25hbWVdPVwiaWNvblwiIG1hdFByZWZpeD48L25hdHVyYWwtaWNvbj5cbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgKm5nSWY9XCJsb2FkaW5nXCJcbiAgICAgICAgW2RpYW1ldGVyXT1cIjIxXCJcbiAgICAgICAgW3N0cm9rZVdpZHRoXT1cIjVcIlxuICAgICAgICBtYXRQcmVmaXhcbiAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuXG4gICAgPCEtLSBDbGVhciBidXR0b24gLS0+XG4gICAgPGRpdiBjbGFzcz1cInN1ZmZpeC1idXR0b25zXCIgbWF0U3VmZml4PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaW50ZXJuYWxDdHJsLnZhbHVlICYmIGludGVybmFsQ3RybC5lbmFibGVkICYmICFjbGVhckxhYmVsXCJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRMOpc8OpbGVjdGlvbm5lclwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuYXR1cmFsLWljb24gbmFtZT1cImNsb3NlXCI+PC9uYXR1cmFsLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImludGVybmFsQ3RybC52YWx1ZSAmJiBuYXZpZ2F0ZVRvXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIm5hdmlnYXRlVG9cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5hdmlndWVyIHZlcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmF0dXJhbC1pY29uIG5hbWU9XCJvcGVuX2luX2Jyb3dzZXJcIj48L25hdHVyYWwtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiaGFzUmVxdWlyZWRFcnJvcigpXCIgaTE4bj5DZSBjaGFtcCBlc3QgcmVxdWlzPC9tYXQtZXJyb3I+XG48L21hdC1mb3JtLWZpZWxkPlxuXG48IS0tIEFkZGl0aW9uYWwgKHVuKXNlbGVjdC8odW4pbGluayBidXR0b25zIGZvciBtb3JlIHZpc3VhbCBjb2hlc2lvbiB3aXRoIG5hdHVyYWwtcmVsYXRpb25zIC0tPjwhLS0gW2NsZWFyTGFiZWxdIGFuZC9vciBbc2VsZWN0TGFiZWxdIGhhcyB0byBiZSBnaXZlbiBhcyBhdHRyaWJ1dGUgaW5wdXQgLS0+XG48ZGl2ICpuZ0lmPVwic2hvd0NsZWFyQnV0dG9uKClcIiBjbGFzcz1cImV4dGVybmFsLWJ1dHRvbnNcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhcigpXCIgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b24oKVwiIGNvbG9yPVwid2FyblwiIG1hdC1idXR0b24+e3sgY2xlYXJMYWJlbCB9fTwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
@@ -6495,28 +6495,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImpor
|
|
|
6495
6495
|
|
|
6496
6496
|
/**
|
|
6497
6497
|
* Default usage:
|
|
6498
|
-
*
|
|
6498
|
+
* ```html
|
|
6499
|
+
* <natural-select [service]="myServiceInstance" [(model)]="myModel" (modelChange)=myChangeFn($event)></natural-select>
|
|
6500
|
+
* ```
|
|
6499
6501
|
*
|
|
6500
6502
|
* Custom template usage :
|
|
6503
|
+
* ```html
|
|
6501
6504
|
* <natural-select [service]="svc" [(ngModel)]="model">
|
|
6502
6505
|
* <ng-template let-item="item">
|
|
6503
6506
|
* <span>{{ item.xxx }}</span>
|
|
6504
6507
|
* </ng-template>
|
|
6505
6508
|
* </natural-select>
|
|
6509
|
+
* ```
|
|
6506
6510
|
*
|
|
6507
|
-
* [(ngModel)] and (ngModelChange) are optional
|
|
6511
|
+
* `[(ngModel)]` and `(ngModelChange)` are optional.
|
|
6508
6512
|
*
|
|
6509
6513
|
* Placeholder :
|
|
6510
|
-
*
|
|
6514
|
+
* ```html
|
|
6515
|
+
* <natural-select placeholder="my placeholder"></natural-select>
|
|
6516
|
+
* ```
|
|
6511
6517
|
*
|
|
6512
6518
|
* Never float placeholder :
|
|
6513
|
-
*
|
|
6519
|
+
* ```html
|
|
6520
|
+
* <natural-select placeholder="my placeholder" floatPlaceholder="never"></natural-select>
|
|
6521
|
+
* ```
|
|
6514
6522
|
*
|
|
6515
|
-
* Search with like %xxx% on specified
|
|
6516
|
-
*
|
|
6523
|
+
* Search with like %xxx% on specified field `name` instead of custom filter on whole object
|
|
6524
|
+
* ```html
|
|
6525
|
+
* <natural-select searchField="name"></natural-select>
|
|
6526
|
+
* ```
|
|
6517
6527
|
*
|
|
6518
6528
|
* Allows to input free string without selecting an option from autocomplete suggestions
|
|
6519
|
-
*
|
|
6529
|
+
* ```html
|
|
6530
|
+
* <natural-select [optionRequired]="false"></natural-select>
|
|
6531
|
+
* ```
|
|
6520
6532
|
*/
|
|
6521
6533
|
class NaturalSelectComponent extends AbstractSelect {
|
|
6522
6534
|
constructor() {
|
|
@@ -6526,9 +6538,13 @@ class NaturalSelectComponent extends AbstractSelect {
|
|
|
6526
6538
|
*/
|
|
6527
6539
|
this.optionRequired = true;
|
|
6528
6540
|
/**
|
|
6529
|
-
* The
|
|
6541
|
+
* The field on which to search for, default to 'custom'.
|
|
6530
6542
|
*/
|
|
6531
6543
|
this.searchField = 'custom';
|
|
6544
|
+
/**
|
|
6545
|
+
* The operator with which to search for, default to 'search' if `searchField` is 'custom', else 'like'.
|
|
6546
|
+
*/
|
|
6547
|
+
this.searchOperator = null;
|
|
6532
6548
|
/**
|
|
6533
6549
|
* Items returned by server to show in listing
|
|
6534
6550
|
*/
|
|
@@ -6650,18 +6666,33 @@ class NaturalSelectComponent extends AbstractSelect {
|
|
|
6650
6666
|
return ((_a = this.internalCtrl) === null || _a === void 0 ? void 0 : _a.enabled) && !!this.clearLabel && !!this.internalCtrl.value;
|
|
6651
6667
|
}
|
|
6652
6668
|
getSearchFilter(term) {
|
|
6653
|
-
|
|
6654
|
-
if (
|
|
6655
|
-
|
|
6669
|
+
var _a;
|
|
6670
|
+
if (!term) {
|
|
6671
|
+
return {};
|
|
6656
6672
|
}
|
|
6657
|
-
|
|
6658
|
-
|
|
6673
|
+
const searchOperator = (_a = this.searchOperator) !== null && _a !== void 0 ? _a : (this.searchField === 'custom' ? 'search' : 'like');
|
|
6674
|
+
if (searchOperator === 'like') {
|
|
6675
|
+
term = '%' + term + '%';
|
|
6659
6676
|
}
|
|
6660
|
-
return {
|
|
6677
|
+
return {
|
|
6678
|
+
filter: {
|
|
6679
|
+
groups: [
|
|
6680
|
+
{
|
|
6681
|
+
conditions: [
|
|
6682
|
+
{
|
|
6683
|
+
[this.searchField]: {
|
|
6684
|
+
[searchOperator]: { value: term },
|
|
6685
|
+
},
|
|
6686
|
+
},
|
|
6687
|
+
],
|
|
6688
|
+
},
|
|
6689
|
+
],
|
|
6690
|
+
},
|
|
6691
|
+
};
|
|
6661
6692
|
}
|
|
6662
6693
|
}
|
|
6663
6694
|
NaturalSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
6664
|
-
NaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalSelectComponent, selector: "natural-select", inputs: { service: "service", optionRequired: "optionRequired", searchField: "searchField", filter: "filter", disabled: "disabled" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "autoTrigger", first: true, predicate: MatLegacyAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$3.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i2$3.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i5$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$2.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4$2.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i4$2.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i7$2.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7$1.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] });
|
|
6695
|
+
NaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalSelectComponent, selector: "natural-select", inputs: { service: "service", optionRequired: "optionRequired", searchField: "searchField", searchOperator: "searchOperator", filter: "filter", disabled: "disabled" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "autoTrigger", first: true, predicate: MatLegacyAutocompleteTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$3.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i2$3.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i5$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$2.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4$2.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatLegacyPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i4$2.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i7$2.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7$1.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }] });
|
|
6665
6696
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalSelectComponent, decorators: [{
|
|
6666
6697
|
type: Component,
|
|
6667
6698
|
args: [{ selector: 'natural-select', template: "<!-- Autocomplete menu -->\n<mat-autocomplete\n #ac=\"matAutocomplete\"\n (optionSelected)=\"propagateValue($event.option.value)\"\n [displayWith]=\"getDisplayFn()\"\n panelWidth=\"auto !important\"\n>\n <mat-option *ngFor=\"let item of items | async\" [value]=\"item\">\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultACItem\"\n ></ng-template>\n </mat-option>\n <div *ngIf=\"moreNbItems > 0\" class=\"mat-caption\" i18n style=\"padding: 5px 10px\"\n >{{ moreNbItems }} \u00E9l\u00E9ment(s) suppl\u00E9mentaire(s)</div\n >\n</mat-autocomplete>\n\n<ng-template #defaultACItem let-item=\"item\">\n <span>{{ getDisplayFn()(item) }}</span>\n</ng-template>\n\n<!-- Input for autocomplete -->\n<mat-form-field [floatLabel]=\"floatPlaceholder\">\n <mat-label>{{ placeholder }}</mat-label>\n\n <input\n (blur)=\"touch(); blur.emit()\"\n (change)=\"onInternalFormChange()\"\n (click)=\"autoTrigger.openPanel()\"\n (focus)=\"startSearch()\"\n (keydown.esc)=\"clear()\"\n [formControl]=\"internalCtrl\"\n [matAutocomplete]=\"ac\"\n aria-label=\"Recherche et s\u00E9lection\"\n i18n-aria-label\n matInput\n [errorStateMatcher]=\"matcher\"\n />\n\n <!-- Meta data -->\n <natural-icon *ngIf=\"!loading && showIcon\" [name]=\"icon\" matPrefix></natural-icon>\n <mat-progress-spinner\n *ngIf=\"loading\"\n [diameter]=\"21\"\n [strokeWidth]=\"5\"\n matPrefix\n mode=\"indeterminate\"\n ></mat-progress-spinner>\n\n <!-- Clear button -->\n <div class=\"suffix-buttons\" matSuffix>\n <button\n (click)=\"clear(); $event.stopPropagation()\"\n *ngIf=\"internalCtrl.value && internalCtrl.enabled && !clearLabel\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"D\u00E9s\u00E9lectionner\"\n >\n <natural-icon name=\"close\"></natural-icon>\n </button>\n <button\n *ngIf=\"internalCtrl.value && navigateTo\"\n [routerLink]=\"navigateTo\"\n (click)=\"$event.stopPropagation()\"\n mat-button\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Naviguer vers\"\n >\n <natural-icon name=\"open_in_browser\"></natural-icon>\n </button>\n </div>\n\n <mat-error *ngIf=\"hasRequiredError()\" i18n>Ce champ est requis</mat-error>\n</mat-form-field>\n\n<!-- Additional (un)select/(un)link buttons for more visual cohesion with natural-relations --><!-- [clearLabel] and/or [selectLabel] has to be given as attribute input -->\n<div *ngIf=\"showClearButton()\" class=\"external-buttons\">\n <button (click)=\"clear()\" *ngIf=\"showClearButton()\" color=\"warn\" mat-button>{{ clearLabel }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host>mat-autocomplete{margin-bottom:0!important}:host .suffix-buttons,:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons{display:flex;flex-direction:row}:host .external-buttons>*:not(:last-child){margin-right:10px}\n"] }]
|
|
@@ -6677,6 +6708,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImpor
|
|
|
6677
6708
|
type: Input
|
|
6678
6709
|
}], searchField: [{
|
|
6679
6710
|
type: Input
|
|
6711
|
+
}], searchOperator: [{
|
|
6712
|
+
type: Input
|
|
6680
6713
|
}], filter: [{
|
|
6681
6714
|
type: Input
|
|
6682
6715
|
}], disabled: [{
|
|
@@ -6706,7 +6739,7 @@ class TypeNaturalSelectComponent extends AbstractAssociationSelectComponent {
|
|
|
6706
6739
|
}
|
|
6707
6740
|
}
|
|
6708
6741
|
TypeNaturalSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TypeNaturalSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
6709
|
-
TypeNaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: TypeNaturalSelectComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n", dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "component", type: i4$2.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4$3.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i5$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "filter", "disabled"] }] });
|
|
6742
|
+
TypeNaturalSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: TypeNaturalSelectComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n", dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "component", type: i4$2.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4$3.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i5$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "searchOperator", "filter", "disabled"] }] });
|
|
6710
6743
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: TypeNaturalSelectComponent, decorators: [{
|
|
6711
6744
|
type: Component,
|
|
6712
6745
|
args: [{ template: "<form [formGroup]=\"form\">\n <mat-form-field style=\"max-width: 7em; margin-right: 1em\">\n <mat-label i18n=\"Mathematical operator < > =\">Op\u00E9rateur</mat-label>\n <mat-select [formControl]=\"operatorCtrl\" [required]=\"true\">\n <mat-option *ngFor=\"let item of operators\" [value]=\"item.key\">\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <natural-select\n style=\"display: inline\"\n *ngIf=\"configuration && requireValueCtrl\"\n [formControl]=\"valueCtrl\"\n [placeholder]=\"configuration.placeholder\"\n [service]=\"configuration.service\"\n [filter]=\"configuration.filter\"\n ></natural-select>\n</form>\n" }]
|
|
@@ -9983,7 +10016,7 @@ class NaturalRelationsComponent extends NaturalAbstractController {
|
|
|
9983
10016
|
}
|
|
9984
10017
|
}
|
|
9985
10018
|
NaturalRelationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalRelationsComponent, deps: [{ token: NaturalLinkMutationService }, { token: NaturalHierarchicSelectorDialogService }], target: i0.ɵɵFactoryTarget.Component });
|
|
9986
|
-
NaturalRelationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalRelationsComponent, selector: "natural-relations", inputs: { service: "service", placeholder: "placeholder", autocompleteSelectorFilter: "autocompleteSelectorFilter", displayWith: "displayWith", disabled: "disabled", main: "main", hierarchicSelectorFilters: "hierarchicSelectorFilters", hierarchicSelectorConfig: "hierarchicSelectorConfig", otherName: "otherName", filter: "filter" }, outputs: { selectionChange: "selectionChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "select", first: true, predicate: NaturalSelectComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "component", type: i7$3.MatLegacyTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7$3.MatLegacyHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7$3.MatLegacyHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7$3.MatLegacyColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7$3.MatLegacyCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7$3.MatLegacyRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7$3.MatLegacyHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7$3.MatLegacyCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7$3.MatLegacyHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7$3.MatLegacyRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "filter", "disabled"] }, { kind: "component", type: i9.MatLegacyPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i7$1.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
10019
|
+
NaturalRelationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: NaturalRelationsComponent, selector: "natural-relations", inputs: { service: "service", placeholder: "placeholder", autocompleteSelectorFilter: "autocompleteSelectorFilter", displayWith: "displayWith", disabled: "disabled", main: "main", hierarchicSelectorFilters: "hierarchicSelectorFilters", hierarchicSelectorConfig: "hierarchicSelectorConfig", otherName: "otherName", filter: "filter" }, outputs: { selectionChange: "selectionChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "select", first: true, predicate: NaturalSelectComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7$2.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: NaturalIconComponent, selector: "natural-icon", inputs: ["label", "labelColor", "labelPosition", "name", "size"] }, { kind: "component", type: i7$3.MatLegacyTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7$3.MatLegacyHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7$3.MatLegacyHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7$3.MatLegacyColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7$3.MatLegacyCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7$3.MatLegacyRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7$3.MatLegacyHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7$3.MatLegacyCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7$3.MatLegacyHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7$3.MatLegacyRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: NaturalSelectComponent, selector: "natural-select", inputs: ["service", "optionRequired", "searchField", "searchOperator", "filter", "disabled"] }, { kind: "component", type: i9.MatLegacyPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i7$1.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
9987
10020
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: NaturalRelationsComponent, decorators: [{
|
|
9988
10021
|
type: Component,
|
|
9989
10022
|
args: [{ selector: 'natural-relations', template: "<div class=\"body\">\n <ng-template #defaultNameCell let-item=\"item\">\n {{ getDisplayFn()(item) }}\n </ng-template>\n\n <table *ngIf=\"dataSource\" [dataSource]=\"dataSource\" class=\"natural-row-click\" mat-table>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row style=\"display: none\"></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns\" mat-row></tr>\n\n <ng-container matColumnDef=\"name\">\n <th *matHeaderCellDef i18n mat-header-cell>Titre</th>\n <td *matCellDef=\"let item\" mat-cell>\n <ng-template\n [ngTemplateOutletContext]=\"{item: item}\"\n [ngTemplateOutlet]=\"itemTemplate ? itemTemplate : defaultNameCell\"\n ></ng-template>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"unlink\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <button\n *ngIf=\"!disabled\"\n (click)=\"removeRelation(element)\"\n [disabled]=\"removing.has(element)\"\n color=\"warn\"\n mat-icon-button\n i18n-matTooltip\n matTooltip=\"Dissocier\"\n >\n <natural-icon name=\"link_off\"></natural-icon>\n </button>\n </td>\n </ng-container>\n </table>\n\n <mat-paginator\n (page)=\"pagination($event)\"\n *ngIf=\"dataSource?.data && (dataSource?.data?.length || 0) > (dataSource?.data?.pageSize || 0)\"\n [length]=\"dataSource?.data?.length || 0\"\n [pageIndex]=\"dataSource?.data?.pageIndex || 0\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"dataSource?.data?.pageSize || 0\"\n ></mat-paginator>\n\n <div *ngIf=\"!loading && dataSource?.data?.length === 0\" class=\"margin-v mat-body\">\n <span i18n>Aucun r\u00E9sultat</span>\n </div>\n\n <mat-progress-spinner *ngIf=\"loading\" [diameter]=\"40\" class=\"loading\" mode=\"indeterminate\"></mat-progress-spinner>\n</div>\n\n<natural-select\n #select\n (selectionChange)=\"addRelations([$any($event)])\"\n *ngIf=\"!hierarchicSelectorConfig && service && !disabled\"\n [displayWith]=\"getDisplayFn()\"\n [filter]=\"autocompleteSelectorFilter\"\n [placeholder]=\"placeholder\"\n [service]=\"service\"\n [showIcon]=\"false\"\n></natural-select>\n\n<div *ngIf=\"hierarchicSelectorConfig && !disabled\">\n <button (click)=\"openNaturalHierarchicSelector()\" color=\"primary\" mat-flat-button>{{ placeholder }}</button>\n</div>\n", styles: [":host{display:flex;flex-direction:column}:host>*:not(:last-child){margin-bottom:20px}:host .body{display:flex;flex-direction:column}:host .loading{margin:20px auto}:host .mat-column-unlink{width:2.5em}\n"] }]
|