@solidev/data 0.0.9 → 0.1.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/esm2022/lib/auth/auth-interceptor.service.mjs +92 -0
- package/{esm2020 → esm2022}/lib/auth/auth.service.mjs +1 -1
- package/esm2022/lib/data/data-backend.mjs +135 -0
- package/esm2022/lib/data/data-model.mjs +292 -0
- package/esm2022/lib/dispedit/choice.pipe.mjs +81 -0
- package/esm2022/lib/dispedit/dispedit/dispedit.component.mjs +481 -0
- package/esm2022/lib/dispedit/factor.pipe.mjs +83 -0
- package/esm2022/lib/dispedit/factorc.pipe.mjs +101 -0
- package/esm2022/lib/dispedit/fkselect/fkselect.component.mjs +143 -0
- package/esm2022/lib/dispedit/flags/flags.component.mjs +141 -0
- package/esm2022/lib/dispedit/m2mselect/m2mselect.component.mjs +319 -0
- package/esm2022/lib/dispedit/richedit/richedit.component.mjs +127 -0
- package/esm2022/lib/dispedit/sdelete/sdelete.component.mjs +94 -0
- package/esm2022/lib/messages/message-zone/message-zone.component.mjs +58 -0
- package/esm2022/lib/messages/message.service.mjs +152 -0
- package/esm2022/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +66 -0
- package/esm2022/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +65 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +113 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +30 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +22 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +50 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +64 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +47 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +57 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +52 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +41 -0
- package/esm2022/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +175 -0
- package/esm2022/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +51 -0
- package/esm2022/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +31 -0
- package/esm2022/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +71 -0
- package/esm2022/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +50 -0
- package/esm2022/lib/modellist/model-list.service.mjs +158 -0
- package/esm2022/lib/routing/breadcrumb/breadcrumb.component.mjs +143 -0
- package/esm2022/lib/updates/update/update.component.mjs +18 -0
- package/esm2022/lib/updates/update.service.mjs +59 -0
- package/esm2022/lib/uploader/ng-file-drop.directive.mjs +82 -0
- package/esm2022/lib/uploader/ng-file-select.directive.mjs +52 -0
- package/esm2022/lib/uploader/ngx-uploader.module.mjs +18 -0
- package/esm2022/lib/utils/tab-memory.service.mjs +81 -0
- package/{fesm2020 → fesm2022}/solidev-data.mjs +149 -149
- package/{fesm2020 → fesm2022}/solidev-data.mjs.map +1 -1
- package/lib/dispedit/dispedit/dispedit.component.d.ts +1 -1
- package/lib/dispedit/fkselect/fkselect.component.d.ts +1 -1
- package/lib/dispedit/flags/flags.component.d.ts +1 -1
- package/lib/dispedit/m2mselect/m2mselect.component.d.ts +1 -1
- package/lib/dispedit/richedit/richedit.component.d.ts +1 -1
- package/lib/dispedit/sdelete/sdelete.component.d.ts +1 -1
- package/lib/messages/message-zone/message-zone.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +1 -1
- package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +1 -1
- package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +1 -1
- package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +1 -1
- package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +1 -1
- package/lib/routing/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/lib/uploader/ng-file-drop.directive.d.ts +1 -1
- package/lib/uploader/ng-file-select.directive.d.ts +1 -1
- package/package.json +7 -13
- package/esm2020/lib/auth/auth-interceptor.service.mjs +0 -91
- package/esm2020/lib/data/data-backend.mjs +0 -134
- package/esm2020/lib/data/data-model.mjs +0 -291
- package/esm2020/lib/dispedit/choice.pipe.mjs +0 -79
- package/esm2020/lib/dispedit/dispedit/dispedit.component.mjs +0 -480
- package/esm2020/lib/dispedit/factor.pipe.mjs +0 -81
- package/esm2020/lib/dispedit/factorc.pipe.mjs +0 -99
- package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +0 -142
- package/esm2020/lib/dispedit/flags/flags.component.mjs +0 -140
- package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +0 -318
- package/esm2020/lib/dispedit/richedit/richedit.component.mjs +0 -126
- package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +0 -93
- package/esm2020/lib/messages/message-zone/message-zone.component.mjs +0 -57
- package/esm2020/lib/messages/message.service.mjs +0 -151
- package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +0 -65
- package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +0 -64
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +0 -112
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +0 -29
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +0 -21
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +0 -49
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +0 -63
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +0 -46
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +0 -56
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +0 -51
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +0 -40
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +0 -174
- package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +0 -50
- package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +0 -30
- package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +0 -70
- package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +0 -49
- package/esm2020/lib/modellist/model-list.service.mjs +0 -157
- package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +0 -142
- package/esm2020/lib/updates/update/update.component.mjs +0 -17
- package/esm2020/lib/updates/update.service.mjs +0 -58
- package/esm2020/lib/uploader/ng-file-drop.directive.mjs +0 -81
- package/esm2020/lib/uploader/ng-file-select.directive.mjs +0 -51
- package/esm2020/lib/uploader/ngx-uploader.module.mjs +0 -17
- package/esm2020/lib/utils/tab-memory.service.mjs +0 -80
- package/fesm2015/solidev-data.mjs +0 -6228
- package/fesm2015/solidev-data.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/auth/jwt.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-collection.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-collection.mock.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-parameters.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-query.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/data-query.mock.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/base.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/boolean.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/computed.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/datetime.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/numbers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/primaryfield.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/relations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/data/fields/stringfields.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/dispedit/dispedit/dispedit.constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-field-header/messages.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-fields/model-list-fields.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/filtertypes.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-filters/model-list-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-paginator/model-list-paginator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modellist/model-list-sorter/model-list-sorter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/routing/routing.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/uploader/ngx-uploader.class.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/slugify.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/template.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/solidev-data.mjs +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { debounceTime, Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "@angular/forms";
|
|
9
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
class ModelListPaginatorComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.maxPages = 200;
|
|
13
|
+
this.hide = false;
|
|
14
|
+
this.perPageControl = new FormControl(10);
|
|
15
|
+
this.showDirectAccess = false;
|
|
16
|
+
this.directAccess = new FormControl(0);
|
|
17
|
+
this.curPage = 1;
|
|
18
|
+
this._unsubscribe = new Subject();
|
|
19
|
+
}
|
|
20
|
+
onPageChange(page) {
|
|
21
|
+
if (!page) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this.list.paginator.setPage(page);
|
|
25
|
+
}
|
|
26
|
+
ngOnDestroy() {
|
|
27
|
+
this._unsubscribe.next();
|
|
28
|
+
this._unsubscribe.complete();
|
|
29
|
+
}
|
|
30
|
+
ngOnChanges() {
|
|
31
|
+
if (this.list) {
|
|
32
|
+
this.perPageControl.setValue(this.list.paginator.getPageSize(), {
|
|
33
|
+
emitEvent: false,
|
|
34
|
+
});
|
|
35
|
+
this.list.meta.pipe(takeUntil(this._unsubscribe)).subscribe((meta) => {
|
|
36
|
+
if (meta.nav) {
|
|
37
|
+
this.list.paginator.updatePage(meta.nav.page || 1);
|
|
38
|
+
this.curPage = meta.nav.page || 1;
|
|
39
|
+
this.curCount = meta.nav.count;
|
|
40
|
+
this.list.paginator.updatePageSize(meta.nav.size);
|
|
41
|
+
this.pageSize = this.list.paginator.getPageSize();
|
|
42
|
+
this.perPageControl.setValue(this.pageSize, { emitEvent: false });
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
this.perPageControl.valueChanges
|
|
46
|
+
.pipe(takeUntil(this._unsubscribe))
|
|
47
|
+
.subscribe((count) => {
|
|
48
|
+
this.list.paginator.setPageSize(count);
|
|
49
|
+
});
|
|
50
|
+
this.directAccess.valueChanges
|
|
51
|
+
.pipe(takeUntil(this._unsubscribe), debounceTime(400))
|
|
52
|
+
.subscribe((count) => {
|
|
53
|
+
this.list.paginator.setPage(+count);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
58
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: ModelListPaginatorComponent, isStandalone: true, selector: "data-model-list-paginator", inputs: { list: "list", maxPages: "maxPages", hide: "hide" }, usesOnChanges: true, ngImport: i0, template: "\n<div class=\"row\" *ngIf=\"!hide\">\n <div class=\"col-sm-4\">\n <select class=\"form-select perpage\" [formControl]=\"perPageControl\">\n <option value=\"10\" *ngIf=\"maxPages>=10\">10 / page</option>\n <option value=\"20\" *ngIf=\"maxPages>=20\">20 / page</option>\n <option value=\"50\" *ngIf=\"maxPages>=50\">50 / page</option>\n <option value=\"100\" *ngIf=\"maxPages>=100\">100 / page</option>\n <option value=\"200\" *ngIf=\"maxPages>=200\">200 / page</option>\n <option value=\"500\" *ngIf=\"maxPages>=500\">500 / page</option>\n <option value=\"1000\" *ngIf=\"maxPages>=1000\">1000 / page</option>\n <option value=\"2000\" *ngIf=\"maxPages>=2000\">2000 / page</option>\n <option value=\"5000\" *ngIf=\"maxPages>=5000\">5000 / page</option>\n <option value=\"10000\" *ngIf=\"maxPages>=10000\">10000 / page</option>\n </select>\n </div>\n <div class=\"col-sm-5 pagination\" *ngIf=\"list\">\n <div class=\"text-xs-center\">\n <ngb-pagination [pageSize]=\"pageSize\" [collectionSize]=\"curCount\" [page]=\"curPage\" (pageChange)=\"onPageChange($event)\" [maxSize]=\"5\" [rotate]=\"true\"></ngb-pagination>\n </div>\n </div>\n <div class=\"col-sm-3 results\">\n <div>{{curCount}} r\u00E9sultats -<span (click)=\"showDirectAccess=!showDirectAccess\" role=\"button\">acces direct</span></div>\n <div *ngIf=\"showDirectAccess\">\n <input class=\"form-control\" [formControl]=\"directAccess\" type=\"number\" placeholder=\"Aller \u00E0 la page\">\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbPaginationModule }, { kind: "component", type: i3.NgbPagination, selector: "ngb-pagination", inputs: ["disabled", "boundaryLinks", "directionLinks", "ellipses", "rotate", "collectionSize", "maxSize", "page", "pageSize", "size"], outputs: ["pageChange"] }] }); }
|
|
59
|
+
}
|
|
60
|
+
export { ModelListPaginatorComponent };
|
|
61
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListPaginatorComponent, decorators: [{
|
|
62
|
+
type: Component,
|
|
63
|
+
args: [{ selector: 'data-model-list-paginator', standalone: true, imports: [CommonModule, ReactiveFormsModule, NgbPaginationModule], template: "\n<div class=\"row\" *ngIf=\"!hide\">\n <div class=\"col-sm-4\">\n <select class=\"form-select perpage\" [formControl]=\"perPageControl\">\n <option value=\"10\" *ngIf=\"maxPages>=10\">10 / page</option>\n <option value=\"20\" *ngIf=\"maxPages>=20\">20 / page</option>\n <option value=\"50\" *ngIf=\"maxPages>=50\">50 / page</option>\n <option value=\"100\" *ngIf=\"maxPages>=100\">100 / page</option>\n <option value=\"200\" *ngIf=\"maxPages>=200\">200 / page</option>\n <option value=\"500\" *ngIf=\"maxPages>=500\">500 / page</option>\n <option value=\"1000\" *ngIf=\"maxPages>=1000\">1000 / page</option>\n <option value=\"2000\" *ngIf=\"maxPages>=2000\">2000 / page</option>\n <option value=\"5000\" *ngIf=\"maxPages>=5000\">5000 / page</option>\n <option value=\"10000\" *ngIf=\"maxPages>=10000\">10000 / page</option>\n </select>\n </div>\n <div class=\"col-sm-5 pagination\" *ngIf=\"list\">\n <div class=\"text-xs-center\">\n <ngb-pagination [pageSize]=\"pageSize\" [collectionSize]=\"curCount\" [page]=\"curPage\" (pageChange)=\"onPageChange($event)\" [maxSize]=\"5\" [rotate]=\"true\"></ngb-pagination>\n </div>\n </div>\n <div class=\"col-sm-3 results\">\n <div>{{curCount}} r\u00E9sultats -<span (click)=\"showDirectAccess=!showDirectAccess\" role=\"button\">acces direct</span></div>\n <div *ngIf=\"showDirectAccess\">\n <input class=\"form-control\" [formControl]=\"directAccess\" type=\"number\" placeholder=\"Aller \u00E0 la page\">\n </div>\n </div>\n</div>" }]
|
|
64
|
+
}], propDecorators: { list: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], maxPages: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], hide: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}] } });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbGlzdC1wYWdpbmF0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL21vZGVsbGlzdC9tb2RlbC1saXN0LXBhZ2luYXRvci9tb2RlbC1saXN0LXBhZ2luYXRvci9tb2RlbC1saXN0LXBhZ2luYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvbW9kZWxsaXN0L21vZGVsLWxpc3QtcGFnaW5hdG9yL21vZGVsLWxpc3QtcGFnaW5hdG9yL21vZGVsLWxpc3QtcGFnaW5hdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFHL0MsTUFPYSwyQkFBMkI7SUFQeEM7UUFXa0IsYUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNmLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFdEIsbUJBQWMsR0FBZ0IsSUFBSSxXQUFXLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGlCQUFZLEdBQWdCLElBQUksV0FBVyxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxDQUFDLENBQUM7UUFHWixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7S0EyQzNDO0lB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cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbExpc3QgfSBmcm9tICcuLi8uLi9tb2RlbC1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiUGFnaW5hdGlvbk1vZHVsZSB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9kYXRhL2RhdGEtbW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXRhLW1vZGVsLWxpc3QtcGFnaW5hdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLWxpc3QtcGFnaW5hdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtbGlzdC1wYWdpbmF0b3IuY29tcG9uZW50LnNhc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTmdiUGFnaW5hdGlvbk1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsTGlzdFBhZ2luYXRvckNvbXBvbmVudDxUIGV4dGVuZHMgRGF0YU1vZGVsPlxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gIEBJbnB1dCgpIHB1YmxpYyBsaXN0ITogTW9kZWxMaXN0PFQ+O1xuICBASW5wdXQoKSBwdWJsaWMgbWF4UGFnZXMgPSAyMDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBoaWRlID0gZmFsc2U7XG5cbiAgcHVibGljIHBlclBhZ2VDb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDEwKTtcbiAgcHVibGljIHNob3dEaXJlY3RBY2Nlc3MgPSBmYWxzZTtcbiAgcHVibGljIGRpcmVjdEFjY2VzczogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPigwKTtcbiAgcHVibGljIGN1clBhZ2UgPSAxO1xuICBwdWJsaWMgY3VyQ291bnQhOiBudW1iZXI7XG4gIHB1YmxpYyBwYWdlU2l6ZSE6IG51bWJlcjtcbiAgcHVibGljIF91bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5saXN0LnBhZ2luYXRvci5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgIHRoaXMucGVyUGFnZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5saXN0LnBhZ2luYXRvci5nZXRQYWdlU2l6ZSgpLCB7XG4gICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdC5tZXRhLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIGlmIChtZXRhLm5hdikge1xuICAgICAgICAgIHRoaXMubGlzdC5wYWdpbmF0b3IudXBkYXRlUGFnZShtZXRhLm5hdi5wYWdlIHx8IDEpO1xuICAgICAgICAgIHRoaXMuY3VyUGFnZSA9IG1ldGEubmF2LnBhZ2UgfHwgMTtcbiAgICAgICAgICB0aGlzLmN1ckNvdW50ID0gbWV0YS5uYXYuY291bnQ7XG4gICAgICAgICAgdGhpcy5saXN0LnBhZ2luYXRvci51cGRhdGVQYWdlU2l6ZShtZXRhLm5hdi5zaXplKTtcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5saXN0LnBhZ2luYXRvci5nZXRQYWdlU2l6ZSgpO1xuICAgICAgICAgIHRoaXMucGVyUGFnZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5wYWdlU2l6ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wZXJQYWdlQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY291bnQpID0+IHtcbiAgICAgICAgICB0aGlzLmxpc3QucGFnaW5hdG9yLnNldFBhZ2VTaXplKGNvdW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZGlyZWN0QWNjZXNzLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoNDAwKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY291bnQpID0+IHtcbiAgICAgICAgICB0aGlzLmxpc3QucGFnaW5hdG9yLnNldFBhZ2UoK2NvdW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJcbjxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIiFoaWRlXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBwZXJwYWdlXCIgW2Zvcm1Db250cm9sXT1cInBlclBhZ2VDb250cm9sXCI+XG4gICAgICA8b3B0aW9uIHZhbHVlPVwiMTBcIiAqbmdJZj1cIm1heFBhZ2VzJmd0Oz0xMFwiPjEwIC8gcGFnZTwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwXCIgKm5nSWY9XCJtYXhQYWdlcyZndDs9MjBcIj4yMCAvIHBhZ2U8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCI1MFwiICpuZ0lmPVwibWF4UGFnZXMmZ3Q7PTUwXCI+NTAgLyBwYWdlPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIHZhbHVlPVwiMTAwXCIgKm5nSWY9XCJtYXhQYWdlcyZndDs9MTAwXCI+MTAwIC8gcGFnZTwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwMFwiICpuZ0lmPVwibWF4UGFnZXMmZ3Q7PTIwMFwiPjIwMCAvIHBhZ2U8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCI1MDBcIiAqbmdJZj1cIm1heFBhZ2VzJmd0Oz01MDBcIj41MDAgLyBwYWdlPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIHZhbHVlPVwiMTAwMFwiICpuZ0lmPVwibWF4UGFnZXMmZ3Q7PTEwMDBcIj4xMDAwIC8gcGFnZTwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwMDBcIiAqbmdJZj1cIm1heFBhZ2VzJmd0Oz0yMDAwXCI+MjAwMCAvIHBhZ2U8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gdmFsdWU9XCI1MDAwXCIgKm5nSWY9XCJtYXhQYWdlcyZndDs9NTAwMFwiPjUwMDAgLyBwYWdlPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIHZhbHVlPVwiMTAwMDBcIiAqbmdJZj1cIm1heFBhZ2VzJmd0Oz0xMDAwMFwiPjEwMDAwIC8gcGFnZTwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHBhZ2luYXRpb25cIiAqbmdJZj1cImxpc3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC14cy1jZW50ZXJcIj5cbiAgICAgIDxuZ2ItcGFnaW5hdGlvbiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbY29sbGVjdGlvblNpemVdPVwiY3VyQ291bnRcIiBbcGFnZV09XCJjdXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiBbbWF4U2l6ZV09XCI1XCIgW3JvdGF0ZV09XCJ0cnVlXCI+PC9uZ2ItcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wtc20tMyByZXN1bHRzXCI+XG4gICAgPGRpdj57e2N1ckNvdW50fX0gcsOpc3VsdGF0cyAtPHNwYW4gKGNsaWNrKT1cInNob3dEaXJlY3RBY2Nlc3M9IXNob3dEaXJlY3RBY2Nlc3NcIiByb2xlPVwiYnV0dG9uXCI+YWNjZXMgZGlyZWN0PC9zcGFuPjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJzaG93RGlyZWN0QWNjZXNzXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZm9ybUNvbnRyb2xdPVwiZGlyZWN0QWNjZXNzXCIgdHlwZT1cIm51bWJlclwiIHBsYWNlaG9sZGVyPVwiQWxsZXIgw6AgbGEgcGFnZVwiPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
package/esm2022/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
class ModelListSorterComponent {
|
|
6
|
+
constructor() { }
|
|
7
|
+
isUp() {
|
|
8
|
+
const f = this.list.sorter.get(this.field);
|
|
9
|
+
if (f) {
|
|
10
|
+
return f.direction === 'asc';
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
isDown() {
|
|
15
|
+
const f = this.list.sorter.get(this.field);
|
|
16
|
+
if (f) {
|
|
17
|
+
return f.direction === 'desc';
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
setUp() {
|
|
22
|
+
this.list.sorter.set(this.field, 'asc');
|
|
23
|
+
}
|
|
24
|
+
setDown() {
|
|
25
|
+
this.list.sorter.set(this.field, 'desc');
|
|
26
|
+
}
|
|
27
|
+
getCount() {
|
|
28
|
+
return this.list.sorter.get(this.field)
|
|
29
|
+
? this.list.sorter.getAll().length
|
|
30
|
+
: 0;
|
|
31
|
+
}
|
|
32
|
+
getOrder() {
|
|
33
|
+
return this.list.sorter.getOrder(this.field);
|
|
34
|
+
}
|
|
35
|
+
cancel() {
|
|
36
|
+
this.list.sorter.unset(this.field);
|
|
37
|
+
}
|
|
38
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListSorterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: ModelListSorterComponent, isStandalone: true, selector: "data-model-list-sorter", inputs: { list: "list", field: "field" }, ngImport: i0, template: "<span class=\"dirs\"><span *ngIf=\"getOrder()>=0 || getCount()>1\" (click)=\"cancel()\" role=\"button\"><span class=\"count\" *ngIf=\"getCount()>1\"> {{getOrder()}}</span><span class=\"bi bi-x\"></span></span><span class=\"bi bi-sort-down-alt\" (click)=\"setUp()\" [class.active]=\"isUp()\" role=\"button\"></span><span class=\"bi bi-sort-down\" (click)=\"setDown()\" [class.active]=\"isDown()\" role=\"button\"></span> </span>\n<ng-content></ng-content>", styles: [".dirs{color:#d3d3d3}.dirs .count{font-size:.7rem;margin-right:-.1rem;vertical-align:super}.active{color:#000}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
40
|
+
}
|
|
41
|
+
export { ModelListSorterComponent };
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListSorterComponent, decorators: [{
|
|
43
|
+
type: Component,
|
|
44
|
+
args: [{ selector: 'data-model-list-sorter', standalone: true, imports: [CommonModule], template: "<span class=\"dirs\"><span *ngIf=\"getOrder()>=0 || getCount()>1\" (click)=\"cancel()\" role=\"button\"><span class=\"count\" *ngIf=\"getCount()>1\"> {{getOrder()}}</span><span class=\"bi bi-x\"></span></span><span class=\"bi bi-sort-down-alt\" (click)=\"setUp()\" [class.active]=\"isUp()\" role=\"button\"></span><span class=\"bi bi-sort-down\" (click)=\"setDown()\" [class.active]=\"isDown()\" role=\"button\"></span> </span>\n<ng-content></ng-content>", styles: [".dirs{color:#d3d3d3}.dirs .count{font-size:.7rem;margin-right:-.1rem;vertical-align:super}.active{color:#000}\n"] }]
|
|
45
|
+
}], ctorParameters: function () { return []; }, propDecorators: { list: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], field: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}] } });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbGlzdC1zb3J0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL21vZGVsbGlzdC9tb2RlbC1saXN0LXNvcnRlci9tb2RlbC1saXN0LXNvcnRlci9tb2RlbC1saXN0LXNvcnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvbW9kZWxsaXN0L21vZGVsLWxpc3Qtc29ydGVyL21vZGVsLWxpc3Qtc29ydGVyL21vZGVsLWxpc3Qtc29ydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRS9DLE1BT2Esd0JBQXdCO0lBVW5DLGdCQUFlLENBQUM7SUFFVCxJQUFJO1FBQ1QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7U0FDOUI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxNQUFNO1FBQ1gsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUM7U0FDL0I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU07WUFDbEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDOzhHQWhEVSx3QkFBd0I7a0dBQXhCLHdCQUF3Qiw0SENYckMsc2RBQ3lCLHdLRFFiLFlBQVk7O1NBRVgsd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBR3RCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQzswRUFNUCxJQUFJO3NCQUFuQixLQUFLO2dCQUlVLEtBQUs7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbExpc3QgfSBmcm9tICcuLi8uLi9tb2RlbC1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YS1tb2RlbC1saXN0LXNvcnRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RlbC1saXN0LXNvcnRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21vZGVsLWxpc3Qtc29ydGVyLmNvbXBvbmVudC5zYXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbExpc3RTb3J0ZXJDb21wb25lbnQge1xuICAvKipcbiAgICogTW9kZWxMaXN0IHJlZmVyZW5jZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBsaXN0ITogTW9kZWxMaXN0PGFueT47XG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIG5hbWUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgZmllbGQhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBpc1VwKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmxpc3Quc29ydGVyLmdldCh0aGlzLmZpZWxkKTtcbiAgICBpZiAoZikge1xuICAgICAgcmV0dXJuIGYuZGlyZWN0aW9uID09PSAnYXNjJztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRG93bigpOiBib29sZWFuIHtcbiAgICBjb25zdCBmID0gdGhpcy5saXN0LnNvcnRlci5nZXQodGhpcy5maWVsZCk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJldHVybiBmLmRpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2V0VXAoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0LnNvcnRlci5zZXQodGhpcy5maWVsZCwgJ2FzYycpO1xuICB9XG5cbiAgcHVibGljIHNldERvd24oKTogdm9pZCB7XG4gICAgdGhpcy5saXN0LnNvcnRlci5zZXQodGhpcy5maWVsZCwgJ2Rlc2MnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxpc3Quc29ydGVyLmdldCh0aGlzLmZpZWxkKVxuICAgICAgPyB0aGlzLmxpc3Quc29ydGVyLmdldEFsbCgpLmxlbmd0aFxuICAgICAgOiAwO1xuICB9XG5cbiAgcHVibGljIGdldE9yZGVyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGlzdC5zb3J0ZXIuZ2V0T3JkZXIodGhpcy5maWVsZCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdC5zb3J0ZXIudW5zZXQodGhpcy5maWVsZCk7XG4gIH1cbn1cbiIsIjxzcGFuIGNsYXNzPVwiZGlyc1wiPjxzcGFuICpuZ0lmPVwiZ2V0T3JkZXIoKSZndDs9MCB8fCBnZXRDb3VudCgpJmd0OzFcIiAoY2xpY2spPVwiY2FuY2VsKClcIiByb2xlPVwiYnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJjb3VudFwiICpuZ0lmPVwiZ2V0Q291bnQoKSZndDsxXCI+IHt7Z2V0T3JkZXIoKX19PC9zcGFuPjxzcGFuIGNsYXNzPVwiYmkgYmkteFwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJiaSBiaS1zb3J0LWRvd24tYWx0XCIgKGNsaWNrKT1cInNldFVwKClcIiBbY2xhc3MuYWN0aXZlXT1cImlzVXAoKVwiIHJvbGU9XCJidXR0b25cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJiaSBiaS1zb3J0LWRvd25cIiAoY2xpY2spPVwic2V0RG93bigpXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0Rvd24oKVwiIHJvbGU9XCJidXR0b25cIj48L3NwYW4+Jm5ic3A7PC9zcGFuPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiJdfQ==
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { combineLatest, NEVER, of, ReplaySubject, share, Subject, takeUntil, } from 'rxjs';
|
|
3
|
+
import { switchMap, tap, throttleTime } from 'rxjs/operators';
|
|
4
|
+
import { ModelListFields } from './model-list-fields/model-list-fields';
|
|
5
|
+
import { ModelListPaginator } from './model-list-paginator/model-list-paginator';
|
|
6
|
+
import { ModelListSorter } from './model-list-sorter/model-list-sorter';
|
|
7
|
+
import { ModelListFilters } from './model-list-filters/model-list-filters';
|
|
8
|
+
import { DATA_AUTH_SERVICE } from '../auth/auth-interceptor.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../auth/auth.service";
|
|
11
|
+
export class ModelList {
|
|
12
|
+
constructor(name) {
|
|
13
|
+
this.messages$ = new ReplaySubject(1);
|
|
14
|
+
this.started = false;
|
|
15
|
+
this.name = name;
|
|
16
|
+
}
|
|
17
|
+
get results() {
|
|
18
|
+
if (!this._results) {
|
|
19
|
+
this._results = this.queryset.results.pipe(
|
|
20
|
+
// tap(() => console.log('@solidev/data: modellist result')),
|
|
21
|
+
share(), takeUntil(this.unsubscribe || NEVER));
|
|
22
|
+
}
|
|
23
|
+
return this._results;
|
|
24
|
+
}
|
|
25
|
+
get meta() {
|
|
26
|
+
if (!this._meta) {
|
|
27
|
+
this._meta = this.queryset.meta.pipe(
|
|
28
|
+
// tap(() => console.log('@solidev/data: modellist meta')),
|
|
29
|
+
share(), takeUntil(this.unsubscribe || NEVER));
|
|
30
|
+
}
|
|
31
|
+
return this._meta;
|
|
32
|
+
}
|
|
33
|
+
get loading() {
|
|
34
|
+
if (!this._loading) {
|
|
35
|
+
this._loading = this.queryset.loading.pipe(
|
|
36
|
+
// tap(() => console.log('@solidev/data: modellist loading')),
|
|
37
|
+
share(), takeUntil(this.unsubscribe || NEVER));
|
|
38
|
+
}
|
|
39
|
+
return this._loading;
|
|
40
|
+
}
|
|
41
|
+
get full() {
|
|
42
|
+
if (!this._full) {
|
|
43
|
+
this._full = this.queryset.full.pipe(
|
|
44
|
+
// tap(() => console.log('@solidev/data: modellist full')),
|
|
45
|
+
share(), takeUntil(this.unsubscribe || NEVER));
|
|
46
|
+
}
|
|
47
|
+
return this._full;
|
|
48
|
+
}
|
|
49
|
+
start(params) {
|
|
50
|
+
let filter$;
|
|
51
|
+
let reloadFired = false;
|
|
52
|
+
if (params.filter && !params.filter.subscribe) {
|
|
53
|
+
filter$ = of(params.filter);
|
|
54
|
+
}
|
|
55
|
+
else if (params.filter && params.filter.subscribe) {
|
|
56
|
+
filter$ = params.filter;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
filter$ = of({});
|
|
60
|
+
}
|
|
61
|
+
combineLatest([
|
|
62
|
+
this.reload.pipe(tap((v) => (reloadFired = !!v))),
|
|
63
|
+
this.filters.output,
|
|
64
|
+
filter$,
|
|
65
|
+
this.paginator.output,
|
|
66
|
+
this.sorter.output,
|
|
67
|
+
this.fields.output,
|
|
68
|
+
])
|
|
69
|
+
.pipe(throttleTime(200), switchMap(([reload, filter, manualFilter, paginator, sorter, fields]) => {
|
|
70
|
+
this.queryset
|
|
71
|
+
.filter(filter)
|
|
72
|
+
.filter(manualFilter || {}, true)
|
|
73
|
+
.paginateBy(paginator.page_size)
|
|
74
|
+
.setPage(paginator.page)
|
|
75
|
+
.sort(...sorter)
|
|
76
|
+
.setFields(fields);
|
|
77
|
+
const dbSync = reloadFired;
|
|
78
|
+
reloadFired = false;
|
|
79
|
+
return this.queryset.get(true, dbSync);
|
|
80
|
+
}), takeUntil(this.unsubscribe || NEVER))
|
|
81
|
+
.subscribe({
|
|
82
|
+
next: (results) => {
|
|
83
|
+
// console.log('@solidev/data: modellist:get results', this.name);
|
|
84
|
+
},
|
|
85
|
+
error: (error) => {
|
|
86
|
+
console.error('@solidev/data: error while getting model list results : ', error);
|
|
87
|
+
},
|
|
88
|
+
complete: () => {
|
|
89
|
+
// console.log('@solidev/data: modellist:completed', this.name);
|
|
90
|
+
this.started = false;
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
this.reload.next();
|
|
94
|
+
this.started = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
class ModelListService {
|
|
98
|
+
constructor(_auth) {
|
|
99
|
+
this._auth = _auth;
|
|
100
|
+
this._instances = new Map();
|
|
101
|
+
this._auth.logout$.subscribe(() => this.reset());
|
|
102
|
+
}
|
|
103
|
+
reset() {
|
|
104
|
+
for (const i of this._instances.values()) {
|
|
105
|
+
if (i.unsubscribe) {
|
|
106
|
+
console.log('Clearing ', i);
|
|
107
|
+
i.unsubscribe.next();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
this._instances.clear();
|
|
111
|
+
}
|
|
112
|
+
get(name, collection, defaults) {
|
|
113
|
+
let ml;
|
|
114
|
+
if (!name || !this._instances.has(name) || !defaults.keep) {
|
|
115
|
+
ml = new ModelList(name);
|
|
116
|
+
ml.queryset = collection.queryset();
|
|
117
|
+
ml.fields = new ModelListFields(collection, defaults.fields);
|
|
118
|
+
ml.sorter = new ModelListSorter(defaults.sorter || []);
|
|
119
|
+
ml.paginator = new ModelListPaginator(defaults.paginator);
|
|
120
|
+
ml.filters = new ModelListFilters(defaults.filters);
|
|
121
|
+
if (defaults.keep) {
|
|
122
|
+
this._instances.set(name, ml);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
ml = this._instances.get(name);
|
|
127
|
+
}
|
|
128
|
+
if (!ml.started) {
|
|
129
|
+
if (defaults.reload) {
|
|
130
|
+
ml.reload = defaults.reload;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
ml.reload = new Subject();
|
|
134
|
+
}
|
|
135
|
+
if (defaults.unsubscribe) {
|
|
136
|
+
ml.unsubscribe = defaults.unsubscribe;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
ml.unsubscribe = new Subject();
|
|
140
|
+
}
|
|
141
|
+
ml.start(defaults);
|
|
142
|
+
}
|
|
143
|
+
return ml;
|
|
144
|
+
}
|
|
145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListService, deps: [{ token: DATA_AUTH_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
146
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListService, providedIn: 'root' }); }
|
|
147
|
+
}
|
|
148
|
+
export { ModelListService };
|
|
149
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ModelListService, decorators: [{
|
|
150
|
+
type: Injectable,
|
|
151
|
+
args: [{
|
|
152
|
+
providedIn: 'root',
|
|
153
|
+
}]
|
|
154
|
+
}], ctorParameters: function () { return [{ type: i1.AuthServiceBase, decorators: [{
|
|
155
|
+
type: Inject,
|
|
156
|
+
args: [DATA_AUTH_SERVICE]
|
|
157
|
+
}] }]; } });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbGlzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL21vZGVsbGlzdC9tb2RlbC1saXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUNMLGFBQWEsRUFDYixLQUFLLEVBRUwsRUFBRSxFQUNGLGFBQWEsRUFDYixLQUFLLEVBQ0wsT0FBTyxFQUNQLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQVFkLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFLM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7OztBQXlEckUsTUFBTSxPQUFPLFNBQVM7SUFZcEIsWUFBWSxJQUFZO1FBSGpCLGNBQVMsR0FBRyxJQUFJLGFBQWEsQ0FBb0IsQ0FBQyxDQUFDLENBQUM7UUFDcEQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUdyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBSUQsSUFBVyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUN4Qyw2REFBNkQ7WUFDN0QsS0FBSyxFQUFF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SSxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNuQixFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7YUFDN0I7aUJBQU07Z0JBQ0wsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQzthQUMzQztZQUNELElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRTtnQkFDeEIsRUFBRSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNMLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQzthQUN0QztZQUNELEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEI7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7OEdBckRVLGdCQUFnQixrQkFJakIsaUJBQWlCO2tIQUpoQixnQkFBZ0IsY0FGZixNQUFNOztTQUVQLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBS0ksTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3QsXG4gIE5FVkVSLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2hhcmUsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHtcbiAgSVF1ZXJ5TWV0YSxcbiAgSVF1ZXJ5TWV0YU5hdlBhcmFtcyxcbiAgSVF1ZXJ5TmF2LFxuICBRdWVyeXNldCxcbn0gZnJvbSAnLi4vZGF0YS9kYXRhLXF1ZXJ5JztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbExpc3RGaWVsZHMgfSBmcm9tICcuL21vZGVsLWxpc3QtZmllbGRzL21vZGVsLWxpc3QtZmllbGRzJztcbmltcG9ydCB7IE1vZGVsTGlzdFBhZ2luYXRvciB9IGZyb20gJy4vbW9kZWwtbGlzdC1wYWdpbmF0b3IvbW9kZWwtbGlzdC1wYWdpbmF0b3InO1xuaW1wb3J0IHsgTW9kZWxMaXN0U29ydGVyIH0gZnJvbSAnLi9tb2RlbC1saXN0LXNvcnRlci9tb2RlbC1saXN0LXNvcnRlcic7XG5pbXBvcnQgeyBNb2RlbExpc3RGaWx0ZXJzIH0gZnJvbSAnLi9tb2RlbC1saXN0LWZpbHRlcnMvbW9kZWwtbGlzdC1maWx0ZXJzJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICcuLi9kYXRhL2RhdGEtY29sbGVjdGlvbic7XG5pbXBvcnQgeyBNb2RlbExpc3RGaWx0ZXIgfSBmcm9tICcuL21vZGVsLWxpc3QtZmlsdGVycy9tb2RlbC1saXN0LWZpbHRlcic7XG5pbXBvcnQgeyBJRmllbGRIZWFkZXJNZXNzYWdlIH0gZnJvbSAnLi9tb2RlbC1saXN0LWZpZWxkcy9tb2RlbC1saXN0LWZpZWxkLWhlYWRlci9tZXNzYWdlcyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZUJhc2UgfSBmcm9tICcuLi9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBEQVRBX0FVVEhfU0VSVklDRSB9IGZyb20gJy4uL2F1dGgvYXV0aC1pbnRlcmNlcHRvci5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21GaWVsZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRGVmYXVsdHMge1xuICBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IHR5cGUgU29ydGVyRGVmYXVsdHMgPSBzdHJpbmdbXTtcblxuLyoqXG4gKiBGaWVsZHMgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZHNQYXJhbXMge1xuICAvKiogQWxsb3dlZCBmaWVsZHMsIGFsbCBtb2RlbCBmaWVsZHMgYXJlIGFsbG93ZWQgaWYgZW1wdHkgKi9cbiAgYWxsb3dlZD86IHN0cmluZ1tdO1xuICAvKiogRGVmYXVsdCBlbmFibGVkIGZpZWxkcyAqL1xuICBkZWZhdWx0cz86IHN0cmluZ1tdO1xuICAvKiogRXhjbHVkZWQgZmllbGRzICovXG4gIGV4Y2x1ZGVkPzogc3RyaW5nW107XG4gIC8qKiBDdXN0b20gZmllbGRzICovXG4gIGN1c3RvbT86IEN1c3RvbUZpZWxkW107XG59XG5cbi8qKlxuICogRmlsdGVycyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcnNQYXJhbXMge1xuICAvKiogQWxsb3dlZCBmaWx0ZXIgbmFtZXMgKi9cbiAgYWxsb3dlZD86IHN0cmluZ1tdO1xuICAvKiogRGVmYXVsdCBhY3RpdmUgZmlsdGVyIG5hbWVzICovXG4gIGRlZmF1bHRzPzogc3RyaW5nW107XG4gIC8qKiBFeGNsdWRlZCBmaWx0ZXIgbmFtZXMgKi9cbiAgZXhjbHVkZWQ/OiBzdHJpbmdbXTtcbiAgLyoqIEZpbHRlcnMgZGVmaW5pdGlvbnMgKi9cbiAgZmlsdGVycz86IE1vZGVsTGlzdEZpbHRlcltdO1xufVxuXG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uUGFyYW1zID0gSVF1ZXJ5TWV0YU5hdlBhcmFtcztcblxuZXhwb3J0IHR5cGUgSU1vZGVsTGlzdE1lc3NhZ2UgPSBJRmllbGRIZWFkZXJNZXNzYWdlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsTGlzdFBhcmFtcyB7XG4gIGZpZWxkcz86IEZpZWxkc1BhcmFtcztcbiAgZmlsdGVycz86IEZpbHRlcnNQYXJhbXM7XG4gIGZpbHRlcj86IEZpbHRlckRlZmF1bHRzIHwgT2JzZXJ2YWJsZTxGaWx0ZXJEZWZhdWx0cz47XG4gIHNvcnRlcj86IFNvcnRlckRlZmF1bHRzO1xuICBwYWdpbmF0b3I/OiBJUXVlcnlOYXY7XG4gIGtlZXA/OiBib29sZWFuO1xuICByZWxvYWQ/OiBTdWJqZWN0PHZvaWQgfCBib29sZWFuPjtcbiAgdW5zdWJzY3JpYmU/OiBTdWJqZWN0PHZvaWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgTW9kZWxMaXN0PFQgZXh0ZW5kcyBEYXRhTW9kZWw+IHtcbiAgcHVibGljIG5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBmaWx0ZXJzITogTW9kZWxMaXN0RmlsdGVycztcbiAgcHVibGljIHNvcnRlciE6IE1vZGVsTGlzdFNvcnRlcjtcbiAgcHVibGljIHBhZ2luYXRvciE6IE1vZGVsTGlzdFBhZ2luYXRvcjtcbiAgcHVibGljIHF1ZXJ5c2V0ITogUXVlcnlzZXQ8VD47XG4gIHB1YmxpYyBmaWVsZHMhOiBNb2RlbExpc3RGaWVsZHM8VD47XG4gIHB1YmxpYyByZWxvYWQhOiBTdWJqZWN0PHZvaWQgfCBib29sZWFuPjtcbiAgcHVibGljIHVuc3Vic2NyaWJlITogU3ViamVjdDx2b2lkPjtcbiAgcHVibGljIG1lc3NhZ2VzJCA9IG5ldyBSZXBsYXlTdWJqZWN0PElNb2RlbExpc3RNZXNzYWdlPigxKTtcbiAgcHVibGljIHN0YXJ0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdWx0cz86IE9ic2VydmFibGU8VFtdPjtcblxuICBwdWJsaWMgZ2V0IHJlc3VsdHMoKTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICBpZiAoIXRoaXMuX3Jlc3VsdHMpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdHMgPSB0aGlzLnF1ZXJ5c2V0LnJlc3VsdHMucGlwZShcbiAgICAgICAgLy8gdGFwKCgpID0+IGNvbnNvbGUubG9nKCdAc29saWRldi9kYXRhOiBtb2RlbGxpc3QgcmVzdWx0JykpLFxuICAgICAgICBzaGFyZSgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSB8fCBORVZFUilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWV0YT86IE9ic2VydmFibGU8SVF1ZXJ5TWV0YT47XG5cbiAgcHVibGljIGdldCBtZXRhKCk6IE9ic2VydmFibGU8SVF1ZXJ5TWV0YT4ge1xuICAgIGlmICghdGhpcy5fbWV0YSkge1xuICAgICAgdGhpcy5fbWV0YSA9IHRoaXMucXVlcnlzZXQubWV0YS5waXBlKFxuICAgICAgICAvLyB0YXAoKCkgPT4gY29uc29sZS5sb2coJ0Bzb2xpZGV2L2RhdGE6IG1vZGVsbGlzdCBtZXRhJykpLFxuICAgICAgICBzaGFyZSgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSB8fCBORVZFUilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZGluZz86IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgcHVibGljIGdldCBsb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5fbG9hZGluZykge1xuICAgICAgdGhpcy5fbG9hZGluZyA9IHRoaXMucXVlcnlzZXQubG9hZGluZy5waXBlKFxuICAgICAgICAvLyB0YXAoKCkgPT4gY29uc29sZS5sb2coJ0Bzb2xpZGV2L2RhdGE6IG1vZGVsbGlzdCBsb2FkaW5nJykpLFxuICAgICAgICBzaGFyZSgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSB8fCBORVZFUilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnVsbD86IE9ic2VydmFibGU8W1RbXSwgYm9vbGVhbiwgSVF1ZXJ5TWV0YV0+O1xuXG4gIHB1YmxpYyBnZXQgZnVsbCgpOiBPYnNlcnZhYmxlPFtUW10sIGJvb2xlYW4sIElRdWVyeU1ldGFdPiB7XG4gICAgaWYgKCF0aGlzLl9mdWxsKSB7XG4gICAgICB0aGlzLl9mdWxsID0gdGhpcy5xdWVyeXNldC5mdWxsLnBpcGUoXG4gICAgICAgIC8vIHRhcCgoKSA9PiBjb25zb2xlLmxvZygnQHNvbGlkZXYvZGF0YTogbW9kZWxsaXN0IGZ1bGwnKSksXG4gICAgICAgIHNoYXJlKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlIHx8IE5FVkVSKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQocGFyYW1zOiBNb2RlbExpc3RQYXJhbXMpIHtcbiAgICBsZXQgZmlsdGVyJDogT2JzZXJ2YWJsZTxGaWx0ZXJEZWZhdWx0cz47XG4gICAgbGV0IHJlbG9hZEZpcmVkID0gZmFsc2U7XG4gICAgaWYgKHBhcmFtcy5maWx0ZXIgJiYgIXBhcmFtcy5maWx0ZXIuc3Vic2NyaWJlKSB7XG4gICAgICBmaWx0ZXIkID0gb2YocGFyYW1zLmZpbHRlciBhcyBGaWx0ZXJEZWZhdWx0cyk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZmlsdGVyICYmIHBhcmFtcy5maWx0ZXIuc3Vic2NyaWJlKSB7XG4gICAgICBmaWx0ZXIkID0gcGFyYW1zLmZpbHRlciBhcyBPYnNlcnZhYmxlPEZpbHRlckRlZmF1bHRzPjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyJCA9IG9mKHt9KTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnJlbG9hZC5waXBlKHRhcCgodikgPT4gKHJlbG9hZEZpcmVkID0gISF2KSkpLFxuICAgICAgdGhpcy5maWx0ZXJzLm91dHB1dCxcbiAgICAgIGZpbHRlciQsXG4gICAgICB0aGlzLnBhZ2luYXRvci5vdXRwdXQsXG4gICAgICB0aGlzLnNvcnRlci5vdXRwdXQsXG4gICAgICB0aGlzLmZpZWxkcy5vdXRwdXQsXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0aHJvdHRsZVRpbWUoMjAwKSxcbiAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgIChbcmVsb2FkLCBmaWx0ZXIsIG1hbnVhbEZpbHRlciwgcGFnaW5hdG9yLCBzb3J0ZXIsIGZpZWxkc10pID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlzZXRcbiAgICAgICAgICAgICAgLmZpbHRlcihmaWx0ZXIpXG4gICAgICAgICAgICAgIC5maWx0ZXIobWFudWFsRmlsdGVyIHx8IHt9LCB0cnVlKVxuICAgICAgICAgICAgICAucGFnaW5hdGVCeShwYWdpbmF0b3IucGFnZV9zaXplKVxuICAgICAgICAgICAgICAuc2V0UGFnZShwYWdpbmF0b3IucGFnZSlcbiAgICAgICAgICAgICAgLnNvcnQoLi4uc29ydGVyKVxuICAgICAgICAgICAgICAuc2V0RmllbGRzKGZpZWxkcyk7XG4gICAgICAgICAgICBjb25zdCBkYlN5bmMgPSByZWxvYWRGaXJlZDtcbiAgICAgICAgICAgIHJlbG9hZEZpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeXNldC5nZXQodHJ1ZSwgZGJTeW5jKTtcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlIHx8IE5FVkVSKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXN1bHRzOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQHNvbGlkZXYvZGF0YTogbW9kZWxsaXN0OmdldCByZXN1bHRzJywgdGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnQHNvbGlkZXYvZGF0YTogZXJyb3Igd2hpbGUgZ2V0dGluZyBtb2RlbCBsaXN0IHJlc3VsdHMgOiAnLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdAc29saWRldi9kYXRhOiBtb2RlbGxpc3Q6Y29tcGxldGVkJywgdGhpcy5uYW1lKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbExpc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfaW5zdGFuY2VzOiBNYXA8c3RyaW5nLCBNb2RlbExpc3Q8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChEQVRBX0FVVEhfU0VSVklDRSkgcHJpdmF0ZSBfYXV0aDogQXV0aFNlcnZpY2VCYXNlPGFueSwgYW55LCBhbnk+XG4gICkge1xuICAgIHRoaXMuX2F1dGgubG9nb3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNldCgpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5faW5zdGFuY2VzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoaS51bnN1YnNjcmliZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2xlYXJpbmcgJywgaSk7XG4gICAgICAgIGkudW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbnN0YW5jZXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VCBleHRlbmRzIERhdGFNb2RlbD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgZGVmYXVsdHM6IE1vZGVsTGlzdFBhcmFtc1xuICApIHtcbiAgICBsZXQgbWw6IE1vZGVsTGlzdDxUPjtcblxuICAgIGlmICghbmFtZSB8fCAhdGhpcy5faW5zdGFuY2VzLmhhcyhuYW1lKSB8fCAhZGVmYXVsdHMua2VlcCkge1xuICAgICAgbWwgPSBuZXcgTW9kZWxMaXN0PFQ+KG5hbWUpO1xuICAgICAgbWwucXVlcnlzZXQgPSBjb2xsZWN0aW9uLnF1ZXJ5c2V0KCk7XG4gICAgICBtbC5maWVsZHMgPSBuZXcgTW9kZWxMaXN0RmllbGRzKGNvbGxlY3Rpb24sIGRlZmF1bHRzLmZpZWxkcyk7XG4gICAgICBtbC5zb3J0ZXIgPSBuZXcgTW9kZWxMaXN0U29ydGVyKGRlZmF1bHRzLnNvcnRlciB8fCBbXSk7XG4gICAgICBtbC5wYWdpbmF0b3IgPSBuZXcgTW9kZWxMaXN0UGFnaW5hdG9yKGRlZmF1bHRzLnBhZ2luYXRvcik7XG4gICAgICBtbC5maWx0ZXJzID0gbmV3IE1vZGVsTGlzdEZpbHRlcnMoZGVmYXVsdHMuZmlsdGVycyk7XG4gICAgICBpZiAoZGVmYXVsdHMua2VlcCkge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZXMuc2V0KG5hbWUsIG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWwgPSB0aGlzLl9pbnN0YW5jZXMuZ2V0KG5hbWUpITtcbiAgICB9XG4gICAgaWYgKCFtbC5zdGFydGVkKSB7XG4gICAgICBpZiAoZGVmYXVsdHMucmVsb2FkKSB7XG4gICAgICAgIG1sLnJlbG9hZCA9IGRlZmF1bHRzLnJlbG9hZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1sLnJlbG9hZCA9IG5ldyBTdWJqZWN0PHZvaWQgfCBib29sZWFuPigpO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAgIG1sLnVuc3Vic2NyaWJlID0gZGVmYXVsdHMudW5zdWJzY3JpYmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtbC51bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICB9XG4gICAgICBtbC5zdGFydChkZWZhdWx0cyk7XG4gICAgfVxuICAgIHJldHVybiBtbDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Component, Input, } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { NavigationEnd, RouterModule, } from '@angular/router';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/router";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
/**
|
|
10
|
+
* Use data from route config to create a breadcrumb for current route.
|
|
11
|
+
*
|
|
12
|
+
* Route config data is :
|
|
13
|
+
* - title : route fragment title or lodash template to build title
|
|
14
|
+
* (provided arguments for template processing : route (current segment route snapshot)
|
|
15
|
+
* and data (input argument)
|
|
16
|
+
* - icon: icon classes. Example fa fa-home for home & font awesome
|
|
17
|
+
*/
|
|
18
|
+
class BreadcrumbComponent {
|
|
19
|
+
constructor(router, route) {
|
|
20
|
+
this.router = router;
|
|
21
|
+
this.route = route;
|
|
22
|
+
/**
|
|
23
|
+
* Do we display icons ?
|
|
24
|
+
*/
|
|
25
|
+
this.icons = true;
|
|
26
|
+
this.tree = [];
|
|
27
|
+
this._subscriptions = new Subject();
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() {
|
|
30
|
+
this.getRouteTree(this.router.routerState);
|
|
31
|
+
this.router.events
|
|
32
|
+
.pipe(takeUntil(this._subscriptions), filter((event) => event instanceof NavigationEnd))
|
|
33
|
+
.subscribe(() => {
|
|
34
|
+
this.getRouteTree(this.router.routerState);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
ngOnDestroy() {
|
|
38
|
+
this._subscriptions.next();
|
|
39
|
+
this._subscriptions.complete();
|
|
40
|
+
}
|
|
41
|
+
ngOnChanges(changes) {
|
|
42
|
+
this.getRouteTree(this.router.routerState);
|
|
43
|
+
}
|
|
44
|
+
getRouteTree(current) {
|
|
45
|
+
const tree = [];
|
|
46
|
+
const url = [];
|
|
47
|
+
let p = current.root.snapshot;
|
|
48
|
+
while (p != null) {
|
|
49
|
+
let rdata = {
|
|
50
|
+
tree: false,
|
|
51
|
+
title: () => 'xxxx',
|
|
52
|
+
icon: '',
|
|
53
|
+
skip: true,
|
|
54
|
+
};
|
|
55
|
+
const data = p.data;
|
|
56
|
+
// Get route data
|
|
57
|
+
if (p.routeConfig && p.routeConfig.data) {
|
|
58
|
+
rdata = p.routeConfig.data;
|
|
59
|
+
}
|
|
60
|
+
if (rdata.tree) {
|
|
61
|
+
// Get icon
|
|
62
|
+
for (const u of p.url) {
|
|
63
|
+
url.push(u.path);
|
|
64
|
+
let rtd = {
|
|
65
|
+
icon: this.getIcon(rdata, data),
|
|
66
|
+
title: this.getTitle(rdata, data, u),
|
|
67
|
+
path: url.join('/'),
|
|
68
|
+
current: false,
|
|
69
|
+
};
|
|
70
|
+
if (rtd.path.length > 0 && rtd.path[0] !== '/') {
|
|
71
|
+
rtd.path = '/' + rtd.path;
|
|
72
|
+
}
|
|
73
|
+
if (!rdata.skip) {
|
|
74
|
+
tree.push(rtd);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
url.push(p.url.join('/'));
|
|
80
|
+
let rtd = {
|
|
81
|
+
icon: this.getIcon(rdata, data),
|
|
82
|
+
title: this.getTitle(rdata, data),
|
|
83
|
+
path: url.join('/'),
|
|
84
|
+
current: false,
|
|
85
|
+
};
|
|
86
|
+
if (rtd.path.length > 0 && rtd.path[0] !== '/') {
|
|
87
|
+
rtd.path = '/' + rtd.path;
|
|
88
|
+
}
|
|
89
|
+
if (!rdata.skip) {
|
|
90
|
+
tree.push(rtd);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
p = p.firstChild;
|
|
94
|
+
}
|
|
95
|
+
if (tree.length > 0) {
|
|
96
|
+
tree[tree.length - 1].current = true;
|
|
97
|
+
}
|
|
98
|
+
this.tree = tree;
|
|
99
|
+
}
|
|
100
|
+
getTitle(rdata, data, u) {
|
|
101
|
+
if (rdata['title']) {
|
|
102
|
+
if (typeof rdata['title'] === 'function') {
|
|
103
|
+
const tpl = rdata['title'];
|
|
104
|
+
try {
|
|
105
|
+
if (u) {
|
|
106
|
+
return tpl(data, u.path);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return tpl(data);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
console.warn('Unable to process breadcrumb function', e);
|
|
114
|
+
if (data.title != null) {
|
|
115
|
+
return 'xx';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return rdata['title'];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return 'xxx';
|
|
124
|
+
}
|
|
125
|
+
getIcon(rdata, data) {
|
|
126
|
+
if (data.icon) {
|
|
127
|
+
return data.icon;
|
|
128
|
+
}
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: BreadcrumbComponent, isStandalone: true, selector: "data-breadcrumb", inputs: { data: "data", icons: "icons" }, usesOnChanges: true, ngImport: i0, template: "\n<nav aria-label=\"breadcrumb\">\n <ol class=\"breadcrumb\">\n <ng-container *ngFor=\"let p of tree\">\n <li class=\"breadcrumb-item\" *ngIf=\"!p.current\"><a class=\"breadcrumb-item\" [routerLink]=\"p.path\">\n <ng-container *ngIf=\"icons && p.icon\"><i class=\"me-2\" [ngClass]=\"p.icon\"></i>{{p.title}}</ng-container>\n <ng-container *ngIf=\"!(icons && p.icon)\">{{p.title}}</ng-container></a></li>\n <li class=\"breadcrumb-item active\" aria-current=\"page\" *ngIf=\"p.current\">\n <ng-container *ngIf=\"icons && p.icon\"><i class=\"me-1\" [ngClass]=\"p.icon\"></i>{{p.title}}</ng-container>\n <ng-container *ngIf=\"!(icons && p.icon)\">{{p.title}}</ng-container>\n </li>\n </ng-container>\n </ol>\n</nav>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
|
|
133
|
+
}
|
|
134
|
+
export { BreadcrumbComponent };
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BreadcrumbComponent, decorators: [{
|
|
136
|
+
type: Component,
|
|
137
|
+
args: [{ selector: 'data-breadcrumb', standalone: true, imports: [CommonModule, RouterModule], template: "\n<nav aria-label=\"breadcrumb\">\n <ol class=\"breadcrumb\">\n <ng-container *ngFor=\"let p of tree\">\n <li class=\"breadcrumb-item\" *ngIf=\"!p.current\"><a class=\"breadcrumb-item\" [routerLink]=\"p.path\">\n <ng-container *ngIf=\"icons && p.icon\"><i class=\"me-2\" [ngClass]=\"p.icon\"></i>{{p.title}}</ng-container>\n <ng-container *ngIf=\"!(icons && p.icon)\">{{p.title}}</ng-container></a></li>\n <li class=\"breadcrumb-item active\" aria-current=\"page\" *ngIf=\"p.current\">\n <ng-container *ngIf=\"icons && p.icon\"><i class=\"me-1\" [ngClass]=\"p.icon\"></i>{{p.title}}</ng-container>\n <ng-container *ngIf=\"!(icons && p.icon)\">{{p.title}}</ng-container>\n </li>\n </ng-container>\n </ol>\n</nav>" }]
|
|
138
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }]; }, propDecorators: { data: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], icons: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}] } });
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvcm91dGluZy9icmVhZGNydW1iL2JyZWFkY3J1bWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL3JvdXRpbmcvYnJlYWRjcnVtYi9icmVhZGNydW1iLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxHQUtOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBRWIsWUFBWSxHQUdiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQVUvQzs7Ozs7Ozs7R0FRRztBQUNILE1BT2EsbUJBQW1CO0lBWTlCLFlBQW1CLE1BQWMsRUFBUyxLQUFxQjtRQUE1QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFQL0Q7O1dBRUc7UUFDYSxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLFNBQUksR0FBb0IsRUFBRSxDQUFDO1FBQzFCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVxQixDQUFDO0lBRW5FLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2YsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQzlCLE1BQU0sQ0FB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TCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sT0FBTyxDQUNaLEtBQStCLEVBQy9CLElBQXFCO1FBRXJCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztTQUNsQjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs4R0FsSVUsbUJBQW1CO2tHQUFuQixtQkFBbUIsMElDN0NoQyxneUJBYU0seUREOEJNLFlBQVksNlZBQUUsWUFBWTs7U0FFekIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBR2YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQzswSEFNckIsSUFBSTtzQkFBbkIsS0FBSztnQkFJVSxLQUFLO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uRW5kLFxuICBSb3V0ZXIsXG4gIFJvdXRlck1vZHVsZSxcbiAgUm91dGVyU3RhdGUsXG4gIFVybFNlZ21lbnQsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmFzZVJvdXRlUGFyYW1zLCBUcGxGbiB9IGZyb20gJy4uL3JvdXRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQYXRoVHJlZUl0ZW0ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgY3VycmVudDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2UgZGF0YSBmcm9tIHJvdXRlIGNvbmZpZyB0byBjcmVhdGUgYSBicmVhZGNydW1iIGZvciBjdXJyZW50IHJvdXRlLlxuICpcbiAqIFJvdXRlIGNvbmZpZyBkYXRhIGlzIDpcbiAqIC0gdGl0bGUgOiByb3V0ZSBmcmFnbWVudCB0aXRsZSBvciBsb2Rhc2ggdGVtcGxhdGUgdG8gYnVpbGQgdGl0bGVcbiAqICAgKHByb3ZpZGVkIGFyZ3VtZW50cyBmb3IgdGVtcGxhdGUgcHJvY2Vzc2luZyA6IHJvdXRlIChjdXJyZW50IHNlZ21lbnQgcm91dGUgc25hcHNob3QpXG4gKiAgIGFuZCBkYXRhIChpbnB1dCBhcmd1bWVudClcbiAqIC0gaWNvbjogaWNvbiBjbGFzc2VzLiBFeGFtcGxlIGZhIGZhLWhvbWUgZm9yIGhvbWUgJiBmb250IGF3ZXNvbWVcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0YS1icmVhZGNydW1iJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9icmVhZGNydW1iLmNvbXBvbmVudC5jc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUm91dGVyTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQWRkaXRpb25hbCBkYXRhIHRvIGJlIHVzZWQgaW4gdGl0bGVUZW1wbGF0ZVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGRhdGE6IGFueTtcbiAgLyoqXG4gICAqIERvIHdlIGRpc3BsYXkgaWNvbnMgP1xuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGljb25zID0gdHJ1ZTtcbiAgcHVibGljIHRyZWU6IElQYXRoVHJlZUl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHB1YmxpYyByb3V0ZTogQWN0aXZhdGVkUm91dGUpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRSb3V0ZVRyZWUodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUpO1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9zdWJzY3JpcHRpb25zKSxcbiAgICAgICAgZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Um91dGVUcmVlKHRoaXMucm91dGVyLnJvdXRlclN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMubmV4dCgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5nZXRSb3V0ZVRyZWUodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIGdldFJvdXRlVHJlZShjdXJyZW50OiBSb3V0ZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHRyZWU6IElQYXRoVHJlZUl0ZW1bXSA9IFtdO1xuICAgIGNvbnN0IHVybDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwgPSBjdXJyZW50LnJvb3Quc25hcHNob3Q7XG5cbiAgICB3aGlsZSAocCAhPSBudWxsKSB7XG4gICAgICBsZXQgcmRhdGE6IFBhcnRpYWw8QmFzZVJvdXRlUGFyYW1zPiA9IHtcbiAgICAgICAgdHJlZTogZmFsc2UsXG4gICAgICAgIHRpdGxlOiAoKSA9PiAneHh4eCcsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBza2lwOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRhdGEgPSBwLmRhdGEgYXMgQmFzZVJvdXRlUGFyYW1zO1xuXG4gICAgICAvLyBHZXQgcm91dGUgZGF0YVxuICAgICAgaWYgKHAucm91dGVDb25maWcgJiYgcC5yb3V0ZUNvbmZpZy5kYXRhKSB7XG4gICAgICAgIHJkYXRhID0gcC5yb3V0ZUNvbmZpZy5kYXRhIGFzIEJhc2VSb3V0ZVBhcmFtcztcbiAgICAgIH1cblxuICAgICAgaWYgKHJkYXRhLnRyZWUpIHtcbiAgICAgICAgLy8gR2V0IGljb25cbiAgICAgICAgZm9yIChjb25zdCB1IG9mIHAudXJsKSB7XG4gICAgICAgICAgdXJsLnB1c2godS5wYXRoKTtcbiAgICAgICAgICBsZXQgcnRkOiBJUGF0aFRyZWVJdGVtID0ge1xuICAgICAgICAgICAgaWNvbjogdGhpcy5nZXRJY29uKHJkYXRhLCBkYXRhKSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmdldFRpdGxlKHJkYXRhLCBkYXRhLCB1KSxcbiAgICAgICAgICAgIHBhdGg6IHVybC5qb2luKCcvJyksXG4gICAgICAgICAgICBjdXJyZW50OiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChydGQucGF0aC5sZW5ndGggPiAwICYmIHJ0ZC5wYXRoWzBdICE9PSAnLycpIHtcbiAgICAgICAgICAgIHJ0ZC5wYXRoID0gJy8nICsgcnRkLnBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmRhdGEuc2tpcCkge1xuICAgICAgICAgICAgdHJlZS5wdXNoKHJ0ZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwucHVzaChwLnVybC5qb2luKCcvJykpO1xuICAgICAgICBsZXQgcnRkOiBJUGF0aFRyZWVJdGVtID0ge1xuICAgICAgICAgIGljb246IHRoaXMuZ2V0SWNvbihyZGF0YSwgZGF0YSksXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUocmRhdGEsIGRhdGEpLFxuICAgICAgICAgIHBhdGg6IHVybC5qb2luKCcvJyksXG4gICAgICAgICAgY3VycmVudDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChydGQucGF0aC5sZW5ndGggPiAwICYmIHJ0ZC5wYXRoWzBdICE9PSAnLycpIHtcbiAgICAgICAgICBydGQucGF0aCA9ICcvJyArIHJ0ZC5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmRhdGEuc2tpcCkge1xuICAgICAgICAgIHRyZWUucHVzaChydGQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHAgPSBwLmZpcnN0Q2hpbGQ7XG4gICAgfVxuICAgIGlmICh0cmVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyZWVbdHJlZS5sZW5ndGggLSAxXS5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy50cmVlID0gdHJlZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUaXRsZShcbiAgICByZGF0YTogUGFydGlhbDxCYXNlUm91dGVQYXJhbXM+LFxuICAgIGRhdGE6IEJhc2VSb3V0ZVBhcmFtcyxcbiAgICB1PzogVXJsU2VnbWVudFxuICApOiBzdHJpbmcge1xuICAgIGlmIChyZGF0YVsndGl0bGUnXSkge1xuICAgICAgaWYgKHR5cGVvZiByZGF0YVsndGl0bGUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCB0cGw6IFRwbEZuPGFueT4gPSByZGF0YVsndGl0bGUnXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIHRwbChkYXRhLCB1LnBhdGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHBsKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIHByb2Nlc3MgYnJlYWRjcnVtYiBmdW5jdGlvbicsIGUpO1xuICAgICAgICAgIGlmIChkYXRhLnRpdGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAneHgnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJkYXRhWyd0aXRsZSddO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3h4eCc7XG4gIH1cblxuICBwdWJsaWMgZ2V0SWNvbihcbiAgICByZGF0YTogUGFydGlhbDxCYXNlUm91dGVQYXJhbXM+LFxuICAgIGRhdGE6IEJhc2VSb3V0ZVBhcmFtc1xuICApOiBzdHJpbmcge1xuICAgIGlmIChkYXRhLmljb24pIHtcbiAgICAgIHJldHVybiBkYXRhLmljb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuIiwiXG48bmF2IGFyaWEtbGFiZWw9XCJicmVhZGNydW1iXCI+XG4gIDxvbCBjbGFzcz1cImJyZWFkY3J1bWJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwIG9mIHRyZWVcIj5cbiAgICAgIDxsaSBjbGFzcz1cImJyZWFkY3J1bWItaXRlbVwiICpuZ0lmPVwiIXAuY3VycmVudFwiPjxhIGNsYXNzPVwiYnJlYWRjcnVtYi1pdGVtXCIgW3JvdXRlckxpbmtdPVwicC5wYXRoXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImljb25zICZhbXA7JmFtcDsgcC5pY29uXCI+PGkgY2xhc3M9XCJtZS0yXCIgW25nQ2xhc3NdPVwicC5pY29uXCI+PC9pPnt7cC50aXRsZX19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoaWNvbnMgJmFtcDsmYW1wOyBwLmljb24pXCI+e3twLnRpdGxlfX08L25nLWNvbnRhaW5lcj48L2E+PC9saT5cbiAgICAgIDxsaSBjbGFzcz1cImJyZWFkY3J1bWItaXRlbSBhY3RpdmVcIiBhcmlhLWN1cnJlbnQ9XCJwYWdlXCIgKm5nSWY9XCJwLmN1cnJlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImljb25zICZhbXA7JmFtcDsgcC5pY29uXCI+PGkgY2xhc3M9XCJtZS0xXCIgW25nQ2xhc3NdPVwicC5pY29uXCI+PC9pPnt7cC50aXRsZX19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGljb25zICZhbXA7JmFtcDsgcC5pY29uKVwiPnt7cC50aXRsZX19PC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L29sPlxuPC9uYXY+Il19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../update.service";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
class UpdateComponent {
|
|
7
|
+
constructor(update) {
|
|
8
|
+
this.update = update;
|
|
9
|
+
}
|
|
10
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: UpdateComponent, deps: [{ token: i1.UpdateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: UpdateComponent, isStandalone: true, selector: "data-update", ngImport: i0, template: "\n<div class=\"snack\" *ngIf=\"update.available$|async\">\n <p>Une nouvelle version de l'application est disponible.</p>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <button class=\"btn btn-primary btn-block w-100\" (click)=\"update.activate()\">L'ACTIVER MAINTENANT</button>\n </div>\n <div class=\"col-sm-6\">\n <button class=\"btn btn-warning btn-block w-100\" (click)=\"update.dismiss()\">Plus tard</button>\n </div>\n </div>\n</div>", styles: [".snack{position:fixed;bottom:0;margin-left:auto;margin-right:auto;left:auto;right:auto;background-color:#ff7a00cc;padding:20px;z-index:2000;border-top:1px solid rgb(255,122,0);font-size:1.5rem;font-weight:700;color:#8b0000;width:100%;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
|
|
12
|
+
}
|
|
13
|
+
export { UpdateComponent };
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: UpdateComponent, decorators: [{
|
|
15
|
+
type: Component,
|
|
16
|
+
args: [{ selector: 'data-update', standalone: true, imports: [CommonModule], template: "\n<div class=\"snack\" *ngIf=\"update.available$|async\">\n <p>Une nouvelle version de l'application est disponible.</p>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <button class=\"btn btn-primary btn-block w-100\" (click)=\"update.activate()\">L'ACTIVER MAINTENANT</button>\n </div>\n <div class=\"col-sm-6\">\n <button class=\"btn btn-warning btn-block w-100\" (click)=\"update.dismiss()\">Plus tard</button>\n </div>\n </div>\n</div>", styles: [".snack{position:fixed;bottom:0;margin-left:auto;margin-right:auto;left:auto;right:auto;background-color:#ff7a00cc;padding:20px;z-index:2000;border-top:1px solid rgb(255,122,0);font-size:1.5rem;font-weight:700;color:#8b0000;width:100%;text-align:center}\n"] }]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: i1.UpdateService }]; } });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEvc3JjL2xpYi91cGRhdGVzL3VwZGF0ZS91cGRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL3VwZGF0ZXMvdXBkYXRlL3VwZGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQUUvQyxNQU9hLGVBQWU7SUFDMUIsWUFBbUIsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUFHLENBQUM7OEdBRGpDLGVBQWU7a0dBQWYsZUFBZSx1RUNYNUIsc2RBV00sdVRERk0sWUFBWTs7U0FFWCxlQUFlOzJGQUFmLGVBQWU7a0JBUDNCLFNBQVM7K0JBQ0UsYUFBYSxjQUdYLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXBkYXRlU2VydmljZSB9IGZyb20gJy4uL3VwZGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RhdGEtdXBkYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwZGF0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwZGF0ZS5jb21wb25lbnQuc2FzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHVibGljIHVwZGF0ZTogVXBkYXRlU2VydmljZSkge31cbn1cbiIsIlxuPGRpdiBjbGFzcz1cInNuYWNrXCIgKm5nSWY9XCJ1cGRhdGUuYXZhaWxhYmxlJHxhc3luY1wiPlxuICA8cD5VbmUgbm91dmVsbGUgdmVyc2lvbiBkZSBsJ2FwcGxpY2F0aW9uIGVzdCBkaXNwb25pYmxlLjwvcD5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2sgdy0xMDBcIiAoY2xpY2spPVwidXBkYXRlLmFjdGl2YXRlKClcIj5MJ0FDVElWRVIgTUFJTlRFTkFOVDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2FybmluZyBidG4tYmxvY2sgdy0xMDBcIiAoY2xpY2spPVwidXBkYXRlLmRpc21pc3MoKVwiPlBsdXMgdGFyZDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { filter, first, map, tap } from 'rxjs/operators';
|
|
3
|
+
import { merge, ReplaySubject, timer } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/service-worker";
|
|
6
|
+
class UpdateService {
|
|
7
|
+
constructor(appRef, swUpdate) {
|
|
8
|
+
this.appRef = appRef;
|
|
9
|
+
this.swUpdate = swUpdate;
|
|
10
|
+
this.stable = false;
|
|
11
|
+
this._available$ = new ReplaySubject(1);
|
|
12
|
+
this._available$.next(false);
|
|
13
|
+
const appIsStable$ = this.appRef.isStable
|
|
14
|
+
.pipe(first((isStable) => isStable))
|
|
15
|
+
.pipe(tap(() => console.log('App is stable')));
|
|
16
|
+
const checkInterval$ = timer(10 * 1000, 5 * 60 * 1000);
|
|
17
|
+
const checkWhenStable$ = merge(appIsStable$, checkInterval$);
|
|
18
|
+
const updatesAvailable = swUpdate.versionUpdates.pipe(tap((evt) => console.log('Version updates event', evt)), filter((evt) => evt.type === 'VERSION_READY'), map((evt) => ({
|
|
19
|
+
type: 'UPDATE_AVAILABLE',
|
|
20
|
+
current: evt.currentVersion,
|
|
21
|
+
available: evt.latestVersion,
|
|
22
|
+
})));
|
|
23
|
+
updatesAvailable.subscribe(async (evt) => {
|
|
24
|
+
this._available$.next(true);
|
|
25
|
+
});
|
|
26
|
+
checkWhenStable$.subscribe(async () => {
|
|
27
|
+
this.stable = true;
|
|
28
|
+
try {
|
|
29
|
+
console.log('Checking for update');
|
|
30
|
+
const res = await swUpdate.checkForUpdate();
|
|
31
|
+
console.log('Check for update result', res);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.warn('No service worker');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
get available$() {
|
|
39
|
+
return this._available$.asObservable();
|
|
40
|
+
}
|
|
41
|
+
activate() {
|
|
42
|
+
this._available$.next(false);
|
|
43
|
+
console.log('RELOADING FULL PAGE');
|
|
44
|
+
document.location.reload();
|
|
45
|
+
}
|
|
46
|
+
dismiss() {
|
|
47
|
+
this._available$.next(false);
|
|
48
|
+
}
|
|
49
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: UpdateService, deps: [{ token: i0.ApplicationRef }, { token: i1.SwUpdate }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
50
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: UpdateService, providedIn: 'root' }); }
|
|
51
|
+
}
|
|
52
|
+
export { UpdateService };
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: UpdateService, decorators: [{
|
|
54
|
+
type: Injectable,
|
|
55
|
+
args: [{
|
|
56
|
+
providedIn: 'root',
|
|
57
|
+
}]
|
|
58
|
+
}], ctorParameters: function () { return [{ type: i0.ApplicationRef }, { type: i1.SwUpdate }]; } });
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvdXBkYXRlcy91cGRhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBYyxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFFL0QsTUFHYSxhQUFhO0lBR3hCLFlBQW9CLE1BQXNCLEVBQVUsUUFBa0I7UUFBbEQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRjlELFdBQU0sR0FBRyxLQUFLLENBQUM7UUFHckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7YUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3RCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNuRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFDdkQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUE0QixFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsRUFDdkUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1osSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixPQUFPLEVBQUUsR0FBRyxDQUFDLGNBQWM7WUFDM0IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxhQUFhO1NBQzdCLENBQUMsQ0FBQyxDQUNKLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUk7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUM3QztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNuQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBakRVLGFBQWE7a0hBQWIsYUFBYSxjQUZaLE1BQU07O1NBRVAsYUFBYTsyRkFBYixhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uUmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTd1VwZGF0ZSwgVmVyc2lvblJlYWR5RXZlbnQgfSBmcm9tICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlcic7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG1lcmdlLCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVXBkYXRlU2VydmljZSB7XG4gIHByaXZhdGUgc3RhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBwcml2YXRlIHN3VXBkYXRlOiBTd1VwZGF0ZSkge1xuICAgIHRoaXMuX2F2YWlsYWJsZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgICB0aGlzLl9hdmFpbGFibGUkLm5leHQoZmFsc2UpO1xuICAgIGNvbnN0IGFwcElzU3RhYmxlJCA9IHRoaXMuYXBwUmVmLmlzU3RhYmxlXG4gICAgICAucGlwZShmaXJzdCgoaXNTdGFibGUpID0+IGlzU3RhYmxlKSlcbiAgICAgIC5waXBlKHRhcCgoKSA9PiBjb25zb2xlLmxvZygnQXBwIGlzIHN0YWJsZScpKSk7XG4gICAgY29uc3QgY2hlY2tJbnRlcnZhbCQgPSB0aW1lcigxMCAqIDEwMDAsIDUgKiA2MCAqIDEwMDApO1xuICAgIGNvbnN0IGNoZWNrV2hlblN0YWJsZSQgPSBtZXJnZShhcHBJc1N0YWJsZSQsIGNoZWNrSW50ZXJ2YWwkKTtcbiAgICBjb25zdCB1cGRhdGVzQXZhaWxhYmxlID0gc3dVcGRhdGUudmVyc2lvblVwZGF0ZXMucGlwZShcbiAgICAgIHRhcCgoZXZ0KSA9PiBjb25zb2xlLmxvZygnVmVyc2lvbiB1cGRhdGVzIGV2ZW50JywgZXZ0KSksXG4gICAgICBmaWx0ZXIoKGV2dCk6IGV2dCBpcyBWZXJzaW9uUmVhZHlFdmVudCA9PiBldnQudHlwZSA9PT0gJ1ZFUlNJT05fUkVBRFknKSxcbiAgICAgIG1hcCgoZXZ0KSA9PiAoe1xuICAgICAgICB0eXBlOiAnVVBEQVRFX0FWQUlMQUJMRScsXG4gICAgICAgIGN1cnJlbnQ6IGV2dC5jdXJyZW50VmVyc2lvbixcbiAgICAgICAgYXZhaWxhYmxlOiBldnQubGF0ZXN0VmVyc2lvbixcbiAgICAgIH0pKVxuICAgICk7XG4gICAgdXBkYXRlc0F2YWlsYWJsZS5zdWJzY3JpYmUoYXN5bmMgKGV2dCkgPT4ge1xuICAgICAgdGhpcy5fYXZhaWxhYmxlJC5uZXh0KHRydWUpO1xuICAgIH0pO1xuICAgIGNoZWNrV2hlblN0YWJsZSQuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuc3RhYmxlID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGVja2luZyBmb3IgdXBkYXRlJyk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHN3VXBkYXRlLmNoZWNrRm9yVXBkYXRlKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGVjayBmb3IgdXBkYXRlIHJlc3VsdCcsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gc2VydmljZSB3b3JrZXInKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2F2YWlsYWJsZSQ6IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgcHVibGljIGdldCBhdmFpbGFibGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9hdmFpbGFibGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YWlsYWJsZSQubmV4dChmYWxzZSk7XG4gICAgY29uc29sZS5sb2coJ1JFTE9BRElORyBGVUxMIFBBR0UnKTtcbiAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX2F2YWlsYWJsZSQubmV4dChmYWxzZSk7XG4gIH1cbn1cbiJdfQ==
|