imm-element-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/imm-element-ui.mjs +5 -0
- package/esm2022/lib/am/am.component.mjs +502 -0
- package/esm2022/lib/crumb-action/crumb-action.component.mjs +127 -0
- package/esm2022/lib/form/form/form.component.mjs +217 -0
- package/esm2022/lib/form/form-field/field-control.mjs +19 -0
- package/esm2022/lib/form/form-field/field-utils.mjs +227 -0
- package/esm2022/lib/form/form-field/form-field.mjs +129 -0
- package/esm2022/lib/form/form-field/form-type.mjs +123 -0
- package/esm2022/lib/form/form-field/label.directive.mjs +62 -0
- package/esm2022/lib/form/form-type/autocomplete.type.mjs +200 -0
- package/esm2022/lib/form/form-type/codemirror.type.mjs +167 -0
- package/esm2022/lib/form/form-type/datepicker.type.mjs +212 -0
- package/esm2022/lib/form/form-type/image.type.mjs +225 -0
- package/esm2022/lib/form/form-type/inputnumber.type.mjs +144 -0
- package/esm2022/lib/form/form-type/inputtext.type.mjs +69 -0
- package/esm2022/lib/form/form-type/multiselect.type.mjs +219 -0
- package/esm2022/lib/form/form-type/radio.type.mjs +167 -0
- package/esm2022/lib/form/form-type/select.type.mjs +196 -0
- package/esm2022/lib/form/form-type/textarea.type.mjs +75 -0
- package/esm2022/lib/form/form-type/treeselect.type.mjs +174 -0
- package/esm2022/lib/form/form-type/upload.type.mjs +228 -0
- package/esm2022/lib/grid/actions/actions.component.mjs +30 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-autoComplete.component.mjs +89 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-datePicker.compoent.mjs +182 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-inputNumber.component.mjs +107 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-inputText.compoent.mjs +46 -0
- package/esm2022/lib/grid/cell-edit/cell-edit-select.component.mjs +148 -0
- package/esm2022/lib/grid/cell-edit/index.mjs +7 -0
- package/esm2022/lib/grid/cell-render/async-renderer.mjs +29 -0
- package/esm2022/lib/grid/cell-render/link-render.mjs +42 -0
- package/esm2022/lib/grid/grid/grid.component.mjs +373 -0
- package/esm2022/lib/grid/grid-utils.mjs +103 -0
- package/esm2022/lib/grid/mock-data.mjs +14 -0
- package/esm2022/lib/grid/pager/pager.component.mjs +19 -0
- package/esm2022/lib/head/head.component.mjs +43 -0
- package/esm2022/lib/import/import.component.mjs +68 -0
- package/esm2022/lib/log/log.component.mjs +37 -0
- package/esm2022/lib/page-form/page-form.component.mjs +167 -0
- package/esm2022/lib/page-form/page-form.interface.mjs +2 -0
- package/esm2022/lib/page-grid-list/page-grid-list.component.mjs +60 -0
- package/esm2022/lib/row-selector/row-selector.component.mjs +58 -0
- package/esm2022/lib/search/mock-data.mjs +40 -0
- package/esm2022/lib/search/pop-date/pop-date.component.mjs +106 -0
- package/esm2022/lib/search/pop-list/pop-list.component.mjs +32 -0
- package/esm2022/lib/search/pop-panel/pop-panel.component.mjs +44 -0
- package/esm2022/lib/search/pop-select/pop-select.component.mjs +45 -0
- package/esm2022/lib/search/pop-self/pop-self.component.mjs +132 -0
- package/esm2022/lib/search/pop-tree/pop-tree.component.mjs +50 -0
- package/esm2022/lib/search/search/search.component.mjs +138 -0
- package/esm2022/lib/search/search-tip/search-tip.component.mjs +54 -0
- package/esm2022/lib/search/search-utils.mjs +165 -0
- package/esm2022/lib/search/text-panel/text-panel.component.mjs +41 -0
- package/esm2022/lib/service/action.service.mjs +115 -0
- package/esm2022/lib/service/i18n.service.mjs +79 -0
- package/esm2022/lib/service/themeConfig.service.mjs +82 -0
- package/esm2022/lib/service/userHistory.service.mjs +106 -0
- package/esm2022/lib/share/utils.mjs +150 -0
- package/esm2022/lib/steps/steps.component.mjs +31 -0
- package/esm2022/lib/theme-config/theme-config-panel.compoent.mjs +141 -0
- package/esm2022/lib/theme-config/theme-config.compoent.mjs +45 -0
- package/esm2022/public-api.mjs +26 -0
- package/fesm2022/imm-element-ui.mjs +6382 -0
- package/fesm2022/imm-element-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/am/am.component.d.ts +191 -0
- package/lib/crumb-action/crumb-action.component.d.ts +40 -0
- package/lib/form/form/form.component.d.ts +53 -0
- package/lib/form/form-field/field-control.d.ts +13 -0
- package/lib/form/form-field/field-utils.d.ts +12 -0
- package/lib/form/form-field/form-field.d.ts +86 -0
- package/lib/form/form-field/form-type.d.ts +22 -0
- package/lib/form/form-field/label.directive.d.ts +14 -0
- package/lib/form/form-type/autocomplete.type.d.ts +77 -0
- package/lib/form/form-type/codemirror.type.d.ts +31 -0
- package/lib/form/form-type/datepicker.type.d.ts +83 -0
- package/lib/form/form-type/image.type.d.ts +49 -0
- package/lib/form/form-type/inputnumber.type.d.ts +49 -0
- package/lib/form/form-type/inputtext.type.d.ts +17 -0
- package/lib/form/form-type/multiselect.type.d.ts +85 -0
- package/lib/form/form-type/radio.type.d.ts +31 -0
- package/lib/form/form-type/select.type.d.ts +73 -0
- package/lib/form/form-type/textarea.type.d.ts +19 -0
- package/lib/form/form-type/treeselect.type.d.ts +62 -0
- package/lib/form/form-type/upload.type.d.ts +51 -0
- package/lib/grid/actions/actions.component.d.ts +14 -0
- package/lib/grid/cell-edit/cell-edit-autoComplete.component.d.ts +18 -0
- package/lib/grid/cell-edit/cell-edit-datePicker.compoent.d.ts +16 -0
- package/lib/grid/cell-edit/cell-edit-inputNumber.component.d.ts +15 -0
- package/lib/grid/cell-edit/cell-edit-inputText.compoent.d.ts +16 -0
- package/lib/grid/cell-edit/cell-edit-select.component.d.ts +12 -0
- package/lib/grid/cell-edit/index.d.ts +6 -0
- package/lib/grid/cell-render/async-renderer.d.ts +10 -0
- package/lib/grid/cell-render/link-render.d.ts +14 -0
- package/lib/grid/grid/grid.component.d.ts +272 -0
- package/lib/grid/grid-utils.d.ts +751 -0
- package/lib/grid/mock-data.d.ts +12 -0
- package/lib/grid/pager/pager.component.d.ts +15 -0
- package/lib/head/head.component.d.ts +17 -0
- package/lib/import/import.component.d.ts +22 -0
- package/lib/log/log.component.d.ts +14 -0
- package/lib/page-form/page-form.component.d.ts +46 -0
- package/lib/page-form/page-form.interface.d.ts +27 -0
- package/lib/page-grid-list/page-grid-list.component.d.ts +18 -0
- package/lib/row-selector/row-selector.component.d.ts +21 -0
- package/lib/search/mock-data.d.ts +20 -0
- package/lib/search/pop-date/pop-date.component.d.ts +26 -0
- package/lib/search/pop-list/pop-list.component.d.ts +12 -0
- package/lib/search/pop-panel/pop-panel.component.d.ts +15 -0
- package/lib/search/pop-select/pop-select.component.d.ts +13 -0
- package/lib/search/pop-self/pop-self.component.d.ts +31 -0
- package/lib/search/pop-tree/pop-tree.component.d.ts +22 -0
- package/lib/search/search/search.component.d.ts +60 -0
- package/lib/search/search-tip/search-tip.component.d.ts +22 -0
- package/lib/search/search-utils.d.ts +10 -0
- package/lib/search/text-panel/text-panel.component.d.ts +21 -0
- package/lib/service/action.service.d.ts +54 -0
- package/lib/service/i18n.service.d.ts +93 -0
- package/lib/service/themeConfig.service.d.ts +24 -0
- package/lib/service/userHistory.service.d.ts +26 -0
- package/lib/share/utils.d.ts +16 -0
- package/lib/steps/steps.component.d.ts +16 -0
- package/lib/theme-config/theme-config-panel.compoent.d.ts +78 -0
- package/lib/theme-config/theme-config.compoent.d.ts +6 -0
- package/package.json +28 -0
- package/public-api.d.ts +20 -0
- package/src/lib/crumb-action/crumb-action.component.scss +51 -0
- package/src/lib/form/form/form.component.scss +0 -0
- package/src/lib/grid/actions/actions.component.scss +0 -0
- package/src/lib/grid/grid/grid.component.scss +0 -0
- package/src/lib/grid/pager/pager.component.scss +13 -0
- package/src/lib/head/head.component.scss +3 -0
- package/src/lib/import/import.component.scss +10 -0
- package/src/lib/log/log.component.scss +21 -0
- package/src/lib/page-form/page-form.component.scss +14 -0
- package/src/lib/page-grid-list/page-grid-list.component.scss +14 -0
- package/src/lib/row-selector/row-selector.component.scss +1 -0
- package/src/lib/search/dynamic-search/dynamic-search.component.scss +70 -0
- package/src/lib/search/pop-date/pop-date.component.scss +47 -0
- package/src/lib/search/pop-list/pop-list.component.scss +23 -0
- package/src/lib/search/pop-panel/pop-panel.component.scss +49 -0
- package/src/lib/search/pop-select/pop-select.component.scss +29 -0
- package/src/lib/search/pop-self/pop-self.component.scss +60 -0
- package/src/lib/search/pop-tree/pop-tree.component.scss +34 -0
- package/src/lib/search/search/search.component.scss +70 -0
- package/src/lib/search/search-tip/search-tip.component.scss +47 -0
- package/src/lib/search/text-panel/text-panel.component.scss +16 -0
- package/src/lib/steps/steps.component.scss +52 -0
- package/src/lib/styles/styles.scss +232 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Component, computed, ContentChild, effect, inject, input, output, signal, ViewChild } from '@angular/core';
|
|
2
|
+
import { UserHistoryService } from '../service/userHistory.service';
|
|
3
|
+
import { ButtonModule } from 'primeng/button';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
5
|
+
import { TranslatePipe } from '@ngx-translate/core';
|
|
6
|
+
import { Popover } from 'primeng/popover';
|
|
7
|
+
import { CommonModule } from '@angular/common';
|
|
8
|
+
import { TieredMenu } from 'primeng/tieredmenu';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "primeng/button";
|
|
11
|
+
import * as i2 from "@angular/common";
|
|
12
|
+
export class CrumbActionComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.userHistoryService = inject(UserHistoryService);
|
|
15
|
+
this.crumbList = computed(() => {
|
|
16
|
+
// console.log('this.userHistoryService.historyList()',this.userHistoryService.historyList())
|
|
17
|
+
return this.userHistoryService.historyList().map(v => v);
|
|
18
|
+
});
|
|
19
|
+
this.crumbTitle = signal({});
|
|
20
|
+
this.route = inject(Router);
|
|
21
|
+
this.isNew = false;
|
|
22
|
+
this.isShowCog = input(false);
|
|
23
|
+
this.crumbFront = [];
|
|
24
|
+
this.crumbEnd = [];
|
|
25
|
+
this.saveEvent = output();
|
|
26
|
+
// 新建按钮
|
|
27
|
+
this.newUrl = input('');
|
|
28
|
+
// 新建按钮outline
|
|
29
|
+
this.outlined = input(false);
|
|
30
|
+
// 是否是列表页面
|
|
31
|
+
this.isList = input(false);
|
|
32
|
+
this.cancelEvent = output();
|
|
33
|
+
this.listActEvent = output();
|
|
34
|
+
this.listOpItems = [
|
|
35
|
+
{
|
|
36
|
+
label: 'app.tableAcImport',
|
|
37
|
+
type: 'import',
|
|
38
|
+
icon: 'pi pi-upload',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: 'app.tableAcExport',
|
|
42
|
+
type: 'export',
|
|
43
|
+
icon: 'pi pi-download'
|
|
44
|
+
},
|
|
45
|
+
// {
|
|
46
|
+
// label: 'app.tableAcDel',
|
|
47
|
+
// type: 'delete',
|
|
48
|
+
// icon: 'pi pi-trash'
|
|
49
|
+
// }
|
|
50
|
+
];
|
|
51
|
+
effect(() => {
|
|
52
|
+
let last = this.crumbList().pop();
|
|
53
|
+
if (last?.url) {
|
|
54
|
+
this.isNew = last.url?.indexOf('new') > -1 ? true : false;
|
|
55
|
+
}
|
|
56
|
+
if (last?.title) {
|
|
57
|
+
this.crumbTitle.set(last);
|
|
58
|
+
}
|
|
59
|
+
console.log('curmbnm---', this.crumbList());
|
|
60
|
+
const length = this.crumbList().length;
|
|
61
|
+
if (length > 2) {
|
|
62
|
+
this.crumbFront = this.crumbList().map((v) => {
|
|
63
|
+
v.label = v.title;
|
|
64
|
+
return v;
|
|
65
|
+
}).filter((v, index) => index <= length - 1 - 2);
|
|
66
|
+
console.log('cur-----', this.crumbFront);
|
|
67
|
+
this.crumbEnd = [this.crumbList()[length - 2], this.crumbList()[length - 1]];
|
|
68
|
+
}
|
|
69
|
+
console.log('last-----', this.crumbTitle());
|
|
70
|
+
}, { allowSignalWrites: true });
|
|
71
|
+
}
|
|
72
|
+
ngOnInit() {
|
|
73
|
+
}
|
|
74
|
+
goNew() {
|
|
75
|
+
// this.userHistoryService.detailName = 'New'
|
|
76
|
+
if (this.newUrl() == '')
|
|
77
|
+
return;
|
|
78
|
+
this.route.navigate([this.newUrl()]).then(res => {
|
|
79
|
+
this.userHistoryService.setLastTitle('New');
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
closeNew() {
|
|
83
|
+
let length = this.crumbList().length;
|
|
84
|
+
let last = this.crumbList()[length - 1];
|
|
85
|
+
if (last) {
|
|
86
|
+
this.route.navigate([last.url]);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.cancelEvent.emit();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
handleSave() {
|
|
93
|
+
this.saveEvent.emit();
|
|
94
|
+
}
|
|
95
|
+
back(item) {
|
|
96
|
+
// this.userHistoryService.detailName = item.title
|
|
97
|
+
this.route.navigate([item.url]);
|
|
98
|
+
}
|
|
99
|
+
toggle(event) {
|
|
100
|
+
this.op.toggle(event);
|
|
101
|
+
}
|
|
102
|
+
toggleListOp(event) {
|
|
103
|
+
if (!this.isList())
|
|
104
|
+
return;
|
|
105
|
+
this.listOp.toggle(event);
|
|
106
|
+
}
|
|
107
|
+
listAct(name) {
|
|
108
|
+
console.log('name----', name);
|
|
109
|
+
this.listActEvent.emit(name);
|
|
110
|
+
}
|
|
111
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrumbActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
112
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrumbActionComponent, isStandalone: true, selector: "app-crumb-action", inputs: { isShowCog: { classPropertyName: "isShowCog", publicName: "isShowCog", isSignal: true, isRequired: false, transformFunction: null }, newUrl: { classPropertyName: "newUrl", publicName: "newUrl", isSignal: true, isRequired: false, transformFunction: null }, outlined: { classPropertyName: "outlined", publicName: "outlined", isSignal: true, isRequired: false, transformFunction: null }, isList: { classPropertyName: "isList", publicName: "isList", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saveEvent: "saveEvent", cancelEvent: "cancelEvent", listActEvent: "listActEvent" }, queries: [{ propertyName: "newBtnTemplateRef", first: true, predicate: ["newBtn"] }], viewQueries: [{ propertyName: "op", first: true, predicate: ["op"], descendants: true }, { propertyName: "listOp", first: true, predicate: ["listOp"], descendants: true }], ngImport: i0, template: "<div class=\"flex items-center gap-1\">\r\n <div class=\"left-btn flex gap-1 min-w-[51px]\">\r\n <!-- TODO \u6743\u9650\u6570\u636E\u63A5\u5165 -->\r\n @if(!newBtnTemplateRef){\r\n <p-button (click)=\"goNew()\" [outlined]=\"outlined()\">{{'app.create' | translate}}</p-button>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"newBtnTemplateRef\"></ng-container>\r\n }\r\n </div>\r\n @if(crumbList().length > 0){\r\n <div class=\"flex flex-col\">\r\n <div class=\"hidden md:flex\">\r\n @if(crumbList().length <= 2){\r\n @for(fchild of crumbList(); track fchild.url){\r\n <div class=\"crumb-title cursor-pointer text-[12px] max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\" (click)=\"back(fchild)\">\r\n @if(fchild.i18nKey!= ''){\r\n {{ fchild!.i18nKey | translate}}\r\n } @else {\r\n {{fchild.title}}\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex\">\r\n <div class=\"crumb-title cursor-pointer select-crumb\">\r\n <div class=\"w-[17px] h-[17px] flex items-center font-bold text-[13px]\" (click)=\"toggle($event)\">\r\n ...\r\n </div>\r\n <p-tieredmenu #op [model]=\"crumbFront\" [popup]=\"true\" [style]=\"{position:'absolute'}\">\r\n <ng-template #item let-item let-hasSubmenu=\"hasSubmenu\">\r\n <a pRipple class=\"flex items-center p-tieredmenu-item-link\">\r\n <span class=\"ml-2 w-full\" (click)=\"back(item)\">\r\n @if(item.i18nKey!= ''){\r\n {{ item!.i18nKey | translate}}\r\n } @else {\r\n {{item.title}}\r\n }\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-tieredmenu>\r\n </div>\r\n @for(item of crumbEnd;track item.url){\r\n <div class=\"crumb-title cursor-pointer text-[12px] max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\" (click)=\"back(item)\">\r\n @if(item.i18nKey!= ''){\r\n {{ item!.i18nKey | translate}}\r\n } @else {\r\n {{item.title}}\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n \r\n </div>\r\n @if(isNew){\r\n <div class=\"min-w-0 text-text-color text-[12px] flex items-center new-action\" >\r\n <span class=\"hidden md:inline-block whitespace-nowrap\">New</span>\r\n @if(isShowCog()){\r\n <p-button variant=\"text\" severity=\"secondary\" icon=\"pi pi-cog\" aria-label=\"\u64CD\u4F5C\" />\r\n }\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n </div>\r\n } @else {\r\n <div class=\"min-w-0 text-text-color text-[12px] title-action\">\r\n <span class=\"hidden md:inline-block whitespace-nowrap\">{{crumbTitle().title}}</span>\r\n @if(isShowCog()){\r\n <p-button variant=\"text\" severity=\"secondary\" icon=\"pi pi-cog\" aria-label=\"\u64CD\u4F5C\" />\r\n }\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n </div>\r\n }\r\n \r\n </div>\r\n } @else {\r\n <!-- \u521D\u59CB\u8282\u70B9 -->\r\n <div class=\"min-w-0 flex items-center text-[14px] text-text-color\">\r\n <span class=\"hidden md:inline-block max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\">\r\n @if(crumbTitle().i18nKey != ''){\r\n {{crumbTitle().i18nKey | translate}}\r\n } @else {\r\n {{crumbTitle().title}}\r\n }\r\n </span>\r\n @if(isShowCog()){\r\n <p-button \r\n variant=\"text\"\r\n severity=\"secondary\" \r\n icon=\"pi pi-cog\" \r\n aria-label=\"\u64CD\u4F5C\" \r\n (onClick)=\"toggleListOp($event)\"/>\r\n <p-tieredmenu #listOp [model]=\"listOpItems\" [popup]=\"true\" [style]=\"{position:'absolute'}\">\r\n <ng-template #item let-item let-hasSubmenu=\"hasSubmenu\">\r\n <a pRipple class=\"flex items-center p-tieredmenu-item-link\" (click)=\"listAct(item.type)\">\r\n <span [class]=\"item.icon\" class=\"p-tieredmenu-item-icon\"></span>\r\n <span class=\"ml-2\">{{ item.label | translate }}</span>\r\n <!-- <p-badge *ngIf=\"item.badge\" class=\"ml-auto\" [value]=\"item.badge\" /> -->\r\n <span *ngIf=\"item.shortcut\" class=\"ml-auto border border-surface rounded bg-emphasis text-muted-color text-xs p-1\">\r\n {{ item.shortcut }}\r\n </span>\r\n <i *ngIf=\"hasSubmenu\" class=\"pi pi-angle-right ml-auto\"></i>\r\n </a>\r\n </ng-template>\r\n </p-tieredmenu>\r\n }\r\n @if(!isList()){\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n }\r\n </div>\r\n }\r\n \r\n</div>\r\n", styles: [":host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:1}:host ::ng-deep .p-inputtext{border-width:0;border-radius:0;box-shadow:none;background:#fff;padding:0}:host ::ng-deep .p-inputtext:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-inputtext:not(:disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-inputtext:not(:disabled).ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-inputtext:focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered .p-autocomplete-input:not(.p-disabled){border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select-label{padding:0}:host ::ng-deep .p-select{border-width:0;border-radius:0;box-shadow:none;background:#fff}:host ::ng-deep .p-select .p-select-dropdown{display:none}:host ::ng-deep .p-select .p-select-clear-icon{display:none}:host ::ng-deep .p-select:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-select-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select-open .p-select-dropdown{display:flex}:host ::ng-deep .p-select-open .p-select-clear-icon{display:flex}:host ::ng-deep .p-select:hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select:hover .p-select-dropdown{display:flex}:host ::ng-deep .p-select:hover .p-select-clear-icon{display:flex}:host ::ng-deep .p-select.ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select.ng-hovered .p-select-dropdown{display:flex}:host ::ng-deep .p-select.ng-hovered .p-select-clear-icon{display:flex}:host ::ng-deep .p-multiselect-label{padding:0}:host ::ng-deep .p-multiselect{border-width:0;border-radius:0;background:#fff;box-shadow:none}:host ::ng-deep .p-multiselect .p-multiselect-dropdown{display:none}:host ::ng-deep .p-multiselect:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-multiselect-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect-open .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled).p-focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled).p-focus .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled):hover .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled).ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled).ng-hovered .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-textarea{border-radius:0;box-shadow:none;padding:0;background:#fff;resize:none}:host ::ng-deep .p-textarea:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border:1px solid var(--p-red-500)!important}:host ::ng-deep .p-textarea:not(:disabled):hover{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-textarea:not(:disabled).ng-hovered{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-textarea:focus{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-treeselect-label{padding:0}:host ::ng-deep .p-treeselect{border-width:0;border-radius:0;box-shadow:none;background:#fff}:host ::ng-deep .p-treeselect .p-treeselect-dropdown{display:none}:host ::ng-deep .ng-invalid.ng-dirty>.p-treeselect{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-treeselect-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect-open .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-treeselect:not(.p-disabled).p-focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect:not(.p-disabled).p-focus .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-treeselect:not(.p-disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect:not(.p-disabled):hover .p-treeselect-dropdown{display:flex}:host ::ng-deep .ng-hovered>.p-treeselect:not(.p-disabled){border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered>.p-treeselect:not(.p-disabled) .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-menubar{border-width:0;padding:0}:host ::ng-deep .p-menubar-submenu{z-index:3}:host ::ng-deep .p-fileupload-advanced{border-width:0;border-radius:0;background-color:#fff}:host ::ng-deep .p-fileupload-header{padding:0}:host ::ng-deep .p-fileupload-content{padding:0;display:block;border-width:0}:host ::ng-deep .p-inputnumber:not(.ng-valid).ng-dirty>.p-inputtext{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-inputnumber.ng-hovered:not(.p-disabled)>.p-inputtext{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered>.p-datepicker:not(.p-disabled) .p-inputtext{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor{border:1px solid #cbd5e1}:host ::ng-deep .cm-editor.cm-focused{outline:none!important;border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor:hover{border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor.ng-hovered{border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-gutters{background-color:#fff;border:\"none\"}:host ::ng-deep .cm-activeLineGutter{background-color:#fff}.crumb-title{color:var(--p-primary-color)}.crumb-title+.crumb-title{padding-left:.5rem}.crumb-title+.crumb-title:before{padding-right:.5rem;content:var(--breadcrumb-divider, \"/\")}:host::ng-deep .p-button-text.p-button-secondary{color:var(--p-surface-700)}:host::ng-deep .title-action .p-button{padding:0}:host::ng-deep .new-action .p-button{padding:0}:host::ng-deep .new-action .p-button button{padding-top:2px;height:100%;align-items:center}:host::ng-deep .select-crumb .p-button{padding:0;background-color:#fff;line-height:1}:host::ng-deep .select-crumb .p-button button{padding:0;width:17px;height:17px}:host::ng-deep .p-popover-content{padding:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TieredMenu, selector: "p-tieredMenu, p-tieredmenu, p-tiered-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "breakpoint", "autoZIndex", "baseZIndex", "autoDisplay", "showTransitionOptions", "hideTransitionOptions", "id", "ariaLabel", "ariaLabelledBy", "disabled", "tabindex"], outputs: ["onShow", "onHide"] }] }); }
|
|
113
|
+
}
|
|
114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrumbActionComponent, decorators: [{
|
|
115
|
+
type: Component,
|
|
116
|
+
args: [{ selector: 'app-crumb-action', standalone: true, imports: [ButtonModule, TranslatePipe, Popover, CommonModule, TieredMenu], template: "<div class=\"flex items-center gap-1\">\r\n <div class=\"left-btn flex gap-1 min-w-[51px]\">\r\n <!-- TODO \u6743\u9650\u6570\u636E\u63A5\u5165 -->\r\n @if(!newBtnTemplateRef){\r\n <p-button (click)=\"goNew()\" [outlined]=\"outlined()\">{{'app.create' | translate}}</p-button>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"newBtnTemplateRef\"></ng-container>\r\n }\r\n </div>\r\n @if(crumbList().length > 0){\r\n <div class=\"flex flex-col\">\r\n <div class=\"hidden md:flex\">\r\n @if(crumbList().length <= 2){\r\n @for(fchild of crumbList(); track fchild.url){\r\n <div class=\"crumb-title cursor-pointer text-[12px] max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\" (click)=\"back(fchild)\">\r\n @if(fchild.i18nKey!= ''){\r\n {{ fchild!.i18nKey | translate}}\r\n } @else {\r\n {{fchild.title}}\r\n }\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"flex\">\r\n <div class=\"crumb-title cursor-pointer select-crumb\">\r\n <div class=\"w-[17px] h-[17px] flex items-center font-bold text-[13px]\" (click)=\"toggle($event)\">\r\n ...\r\n </div>\r\n <p-tieredmenu #op [model]=\"crumbFront\" [popup]=\"true\" [style]=\"{position:'absolute'}\">\r\n <ng-template #item let-item let-hasSubmenu=\"hasSubmenu\">\r\n <a pRipple class=\"flex items-center p-tieredmenu-item-link\">\r\n <span class=\"ml-2 w-full\" (click)=\"back(item)\">\r\n @if(item.i18nKey!= ''){\r\n {{ item!.i18nKey | translate}}\r\n } @else {\r\n {{item.title}}\r\n }\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-tieredmenu>\r\n </div>\r\n @for(item of crumbEnd;track item.url){\r\n <div class=\"crumb-title cursor-pointer text-[12px] max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\" (click)=\"back(item)\">\r\n @if(item.i18nKey!= ''){\r\n {{ item!.i18nKey | translate}}\r\n } @else {\r\n {{item.title}}\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n \r\n </div>\r\n @if(isNew){\r\n <div class=\"min-w-0 text-text-color text-[12px] flex items-center new-action\" >\r\n <span class=\"hidden md:inline-block whitespace-nowrap\">New</span>\r\n @if(isShowCog()){\r\n <p-button variant=\"text\" severity=\"secondary\" icon=\"pi pi-cog\" aria-label=\"\u64CD\u4F5C\" />\r\n }\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n </div>\r\n } @else {\r\n <div class=\"min-w-0 text-text-color text-[12px] title-action\">\r\n <span class=\"hidden md:inline-block whitespace-nowrap\">{{crumbTitle().title}}</span>\r\n @if(isShowCog()){\r\n <p-button variant=\"text\" severity=\"secondary\" icon=\"pi pi-cog\" aria-label=\"\u64CD\u4F5C\" />\r\n }\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n </div>\r\n }\r\n \r\n </div>\r\n } @else {\r\n <!-- \u521D\u59CB\u8282\u70B9 -->\r\n <div class=\"min-w-0 flex items-center text-[14px] text-text-color\">\r\n <span class=\"hidden md:inline-block max-w-[120px] overflow-hidden whitespace-nowrap text-ellipsis\">\r\n @if(crumbTitle().i18nKey != ''){\r\n {{crumbTitle().i18nKey | translate}}\r\n } @else {\r\n {{crumbTitle().title}}\r\n }\r\n </span>\r\n @if(isShowCog()){\r\n <p-button \r\n variant=\"text\"\r\n severity=\"secondary\" \r\n icon=\"pi pi-cog\" \r\n aria-label=\"\u64CD\u4F5C\" \r\n (onClick)=\"toggleListOp($event)\"/>\r\n <p-tieredmenu #listOp [model]=\"listOpItems\" [popup]=\"true\" [style]=\"{position:'absolute'}\">\r\n <ng-template #item let-item let-hasSubmenu=\"hasSubmenu\">\r\n <a pRipple class=\"flex items-center p-tieredmenu-item-link\" (click)=\"listAct(item.type)\">\r\n <span [class]=\"item.icon\" class=\"p-tieredmenu-item-icon\"></span>\r\n <span class=\"ml-2\">{{ item.label | translate }}</span>\r\n <!-- <p-badge *ngIf=\"item.badge\" class=\"ml-auto\" [value]=\"item.badge\" /> -->\r\n <span *ngIf=\"item.shortcut\" class=\"ml-auto border border-surface rounded bg-emphasis text-muted-color text-xs p-1\">\r\n {{ item.shortcut }}\r\n </span>\r\n <i *ngIf=\"hasSubmenu\" class=\"pi pi-angle-right ml-auto\"></i>\r\n </a>\r\n </ng-template>\r\n </p-tieredmenu>\r\n }\r\n @if(!isList()){\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-cloud-upload\" \r\n aria-label=\"\u624B\u52A8\u4FDD\u5B58\" \r\n class=\"p-0\"\r\n (click)=\"handleSave()\">\r\n </p-button>\r\n <p-button \r\n variant=\"text\" \r\n severity=\"secondary\" \r\n icon=\"pi pi-times\" \r\n aria-label=\"\u5173\u95ED\" \r\n class=\"p-0\"\r\n (click)=\"closeNew()\">\r\n </p-button>\r\n }\r\n </div>\r\n }\r\n \r\n</div>\r\n", styles: [":host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:1}:host ::ng-deep .p-inputtext{border-width:0;border-radius:0;box-shadow:none;background:#fff;padding:0}:host ::ng-deep .p-inputtext:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-inputtext:not(:disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-inputtext:not(:disabled).ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-inputtext:focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered .p-autocomplete-input:not(.p-disabled){border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select-label{padding:0}:host ::ng-deep .p-select{border-width:0;border-radius:0;box-shadow:none;background:#fff}:host ::ng-deep .p-select .p-select-dropdown{display:none}:host ::ng-deep .p-select .p-select-clear-icon{display:none}:host ::ng-deep .p-select:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-select-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select-open .p-select-dropdown{display:flex}:host ::ng-deep .p-select-open .p-select-clear-icon{display:flex}:host ::ng-deep .p-select:hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select:hover .p-select-dropdown{display:flex}:host ::ng-deep .p-select:hover .p-select-clear-icon{display:flex}:host ::ng-deep .p-select.ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-select.ng-hovered .p-select-dropdown{display:flex}:host ::ng-deep .p-select.ng-hovered .p-select-clear-icon{display:flex}:host ::ng-deep .p-multiselect-label{padding:0}:host ::ng-deep .p-multiselect{border-width:0;border-radius:0;background:#fff;box-shadow:none}:host ::ng-deep .p-multiselect .p-multiselect-dropdown{display:none}:host ::ng-deep .p-multiselect:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-multiselect-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect-open .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled).p-focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled).p-focus .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled):hover .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-multiselect:not(.p-disabled).ng-hovered{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-multiselect:not(.p-disabled).ng-hovered .p-multiselect-dropdown{display:flex}:host ::ng-deep .p-textarea{border-radius:0;box-shadow:none;padding:0;background:#fff;resize:none}:host ::ng-deep .p-textarea:not(.ng-valid).ng-dirty{background:var(--p-red-200)!important;border:1px solid var(--p-red-500)!important}:host ::ng-deep .p-textarea:not(:disabled):hover{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-textarea:not(:disabled).ng-hovered{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-textarea:focus{border:1px solid var(--p-primary-color);resize:vertical}:host ::ng-deep .p-treeselect-label{padding:0}:host ::ng-deep .p-treeselect{border-width:0;border-radius:0;box-shadow:none;background:#fff}:host ::ng-deep .p-treeselect .p-treeselect-dropdown{display:none}:host ::ng-deep .ng-invalid.ng-dirty>.p-treeselect{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-treeselect-open{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect-open .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-treeselect:not(.p-disabled).p-focus{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect:not(.p-disabled).p-focus .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-treeselect:not(.p-disabled):hover{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .p-treeselect:not(.p-disabled):hover .p-treeselect-dropdown{display:flex}:host ::ng-deep .ng-hovered>.p-treeselect:not(.p-disabled){border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered>.p-treeselect:not(.p-disabled) .p-treeselect-dropdown{display:flex}:host ::ng-deep .p-menubar{border-width:0;padding:0}:host ::ng-deep .p-menubar-submenu{z-index:3}:host ::ng-deep .p-fileupload-advanced{border-width:0;border-radius:0;background-color:#fff}:host ::ng-deep .p-fileupload-header{padding:0}:host ::ng-deep .p-fileupload-content{padding:0;display:block;border-width:0}:host ::ng-deep .p-inputnumber:not(.ng-valid).ng-dirty>.p-inputtext{background:var(--p-red-200)!important;border-bottom:1px solid var(--p-red-500)!important}:host ::ng-deep .p-inputnumber.ng-hovered:not(.p-disabled)>.p-inputtext{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .ng-hovered>.p-datepicker:not(.p-disabled) .p-inputtext{border-bottom:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor{border:1px solid #cbd5e1}:host ::ng-deep .cm-editor.cm-focused{outline:none!important;border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor:hover{border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-editor.ng-hovered{border:1px solid var(--p-primary-color)}:host ::ng-deep .cm-gutters{background-color:#fff;border:\"none\"}:host ::ng-deep .cm-activeLineGutter{background-color:#fff}.crumb-title{color:var(--p-primary-color)}.crumb-title+.crumb-title{padding-left:.5rem}.crumb-title+.crumb-title:before{padding-right:.5rem;content:var(--breadcrumb-divider, \"/\")}:host::ng-deep .p-button-text.p-button-secondary{color:var(--p-surface-700)}:host::ng-deep .title-action .p-button{padding:0}:host::ng-deep .new-action .p-button{padding:0}:host::ng-deep .new-action .p-button button{padding-top:2px;height:100%;align-items:center}:host::ng-deep .select-crumb .p-button{padding:0;background-color:#fff;line-height:1}:host::ng-deep .select-crumb .p-button button{padding:0;width:17px;height:17px}:host::ng-deep .p-popover-content{padding:.5rem}\n"] }]
|
|
117
|
+
}], ctorParameters: () => [], propDecorators: { op: [{
|
|
118
|
+
type: ViewChild,
|
|
119
|
+
args: ['op']
|
|
120
|
+
}], listOp: [{
|
|
121
|
+
type: ViewChild,
|
|
122
|
+
args: ['listOp']
|
|
123
|
+
}], newBtnTemplateRef: [{
|
|
124
|
+
type: ContentChild,
|
|
125
|
+
args: ['newBtn', { descendants: false }]
|
|
126
|
+
}] } });
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1bWItYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltbS11aS9zcmMvbGliL2NydW1iLWFjdGlvbi9jcnVtYi1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1tLXVpL3NyYy9saWIvY3J1bWItYWN0aW9uL2NydW1iLWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFVLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakosT0FBTyxFQUFFLGtCQUFrQixFQUFjLE1BQU0sZ0NBQWdDLENBQUE7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFRaEQsTUFBTSxPQUFPLG9CQUFvQjtJQTBDL0I7UUF6Q0EsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDL0MsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsNkZBQTZGO1lBQzdGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxD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QixJQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU07UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0IsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFXO1FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlCLENBQUM7K0dBMUdVLG9CQUFvQjttR0FBcEIsb0JBQW9CLHE3QkNmakMsMjlNQTZKQSx1cU1EbEpZLFlBQVksNmFBQUMsYUFBYSxpREFBUyxZQUFZLDBTQUFDLFVBQVU7OzRGQUl6RCxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBQyxhQUFhLEVBQUMsT0FBTyxFQUFDLFlBQVksRUFBQyxVQUFVLENBQUM7d0RBZ0JwRCxFQUFFO3NCQUFsQixTQUFTO3VCQUFDLElBQUk7Z0JBQ00sTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQVU2QixpQkFBaUI7c0JBQWhFLFlBQVk7dUJBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIENvbnRlbnRDaGlsZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBPbkluaXQsIG91dHB1dCwgT3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVXNlckhpc3RvcnlTZXJ2aWNlLEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vc2VydmljZS91c2VySGlzdG9yeS5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgUG9wb3ZlciB9IGZyb20gJ3ByaW1lbmcvcG9wb3Zlcic7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFRpZXJlZE1lbnUgfSBmcm9tICdwcmltZW5nL3RpZXJlZG1lbnUnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1jcnVtYi1hY3Rpb24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0J1dHRvbk1vZHVsZSxUcmFuc2xhdGVQaXBlLFBvcG92ZXIsQ29tbW9uTW9kdWxlLFRpZXJlZE1lbnVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jcnVtYi1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcnVtYi1hY3Rpb24uY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3J1bWJBY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXR7XHJcbiAgdXNlckhpc3RvcnlTZXJ2aWNlID0gaW5qZWN0KFVzZXJIaXN0b3J5U2VydmljZSlcclxuICBjcnVtYkxpc3QgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcy51c2VySGlzdG9yeVNlcnZpY2UuaGlzdG9yeUxpc3QoKScsdGhpcy51c2VySGlzdG9yeVNlcnZpY2UuaGlzdG9yeUxpc3QoKSlcclxuICAgIHJldHVybiB0aGlzLnVzZXJIaXN0b3J5U2VydmljZS5oaXN0b3J5TGlzdCgpLm1hcCh2ID0+dilcclxuICB9KVxyXG4gIGNydW1iVGl0bGUgPSBzaWduYWw8YW55Pih7fSlcclxuICByb3V0ZSA9IGluamVjdChSb3V0ZXIpXHJcbiAgaXNOZXcgPSBmYWxzZVxyXG4gIGlzU2hvd0NvZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKVxyXG4gIGNydW1iRnJvbnQgOkhpc3RvcnlJdGVtW109IFtdXHJcbiAgY3J1bWJFbmQ6IEhpc3RvcnlJdGVtW10gPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ29wJykgb3AhOiBQb3BvdmVyO1xyXG4gIEBWaWV3Q2hpbGQoJ2xpc3RPcCcpIGxpc3RPcCE6IFBvcG92ZXI7XHJcbiAgc2F2ZUV2ZW50ID0gb3V0cHV0KClcclxuICAvLyDmlrDlu7rmjInpkq5cclxuICBuZXdVcmwgPSBpbnB1dDxzdHJpbmc+KCcnKVxyXG4gIC8vIOaWsOW7uuaMiemSrm91dGxpbmVcclxuICBvdXRsaW5lZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKVxyXG4gIC8vIOaYr+WQpuaYr+WIl+ihqOmhtemdolxyXG4gIGlzTGlzdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKVxyXG5cclxuICBjYW5jZWxFdmVudCA9IG91dHB1dCgpXHJcbiAgQENvbnRlbnRDaGlsZCgnbmV3QnRuJywgeyBkZXNjZW5kYW50czogZmFsc2UgfSkgbmV3QnRuVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgbGlzdEFjdEV2ZW50ID0gb3V0cHV0PHN0cmluZz4oKVxyXG4gIGxpc3RPcEl0ZW1zID0gW1xyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ2FwcC50YWJsZUFjSW1wb3J0JyxcclxuICAgICAgdHlwZTogJ2ltcG9ydCcsXHJcbiAgICAgIGljb246ICdwaSBwaS11cGxvYWQnLFxyXG4gICAgfSxcclxuICAgIHsgXHJcbiAgICAgIGxhYmVsOiAnYXBwLnRhYmxlQWNFeHBvcnQnLFxyXG4gICAgICB0eXBlOiAnZXhwb3J0JyxcclxuICAgICAgaWNvbjogJ3BpIHBpLWRvd25sb2FkJ1xyXG4gICAgfSxcclxuICAgIC8vIHtcclxuICAgIC8vICAgbGFiZWw6ICdhcHAudGFibGVBY0RlbCcsXHJcbiAgICAvLyAgIHR5cGU6ICdkZWxldGUnLFxyXG4gICAgLy8gICBpY29uOiAncGkgcGktdHJhc2gnXHJcbiAgICAvLyB9XHJcbiAgXVxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBsZXQgbGFzdCA9IHRoaXMuY3J1bWJMaXN0KCkucG9wKClcclxuICAgICAgaWYobGFzdD8udXJsKXtcclxuICAgICAgICB0aGlzLmlzTmV3ID0gbGFzdC51cmw/LmluZGV4T2YoJ25ldycpID4gLTEgPyB0cnVlIDogZmFsc2VcclxuICAgICAgfVxyXG4gICAgICBpZihsYXN0Py50aXRsZSl7XHJcbiAgICAgICAgdGhpcy5jcnVtYlRpdGxlLnNldChsYXN0KVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKCdjdXJtYm5tLS0tJyx0aGlzLmNydW1iTGlzdCgpKTtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuY3J1bWJMaXN0KCkubGVuZ3RoXHJcbiAgICAgIGlmKCBsZW5ndGggPiAyKXtcclxuICAgICAgICB0aGlzLmNydW1iRnJvbnQgPSB0aGlzLmNydW1iTGlzdCgpLm1hcCgodjphbnkpPT4ge1xyXG4gICAgICAgICAgdi5sYWJlbCA9IHYudGl0bGVcclxuICAgICAgICAgIHJldHVybiB2XHJcbiAgICAgICAgfSkuZmlsdGVyKCh2Okhpc3RvcnlJdGVtLGluZGV4Om51bWJlcikgPT4gaW5kZXggPD0gbGVuZ3RoIC0gMSAtMilcclxuICAgICAgICBjb25zb2xlLmxvZygnY3VyLS0tLS0nLHRoaXMuY3J1bWJGcm9udClcclxuICAgICAgICB0aGlzLmNydW1iRW5kID0gW3RoaXMuY3J1bWJMaXN0KClbbGVuZ3RoIC0yXSx0aGlzLmNydW1iTGlzdCgpW2xlbmd0aCAtMV1dXHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coJ2xhc3QtLS0tLScsdGhpcy5jcnVtYlRpdGxlKCkpXHJcbiAgICB9LHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX0pXHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgXHJcbiAgfVxyXG5cclxuICBnb05ldygpe1xyXG4gICAgLy8gdGhpcy51c2VySGlzdG9yeVNlcnZpY2UuZGV0YWlsTmFtZSA9ICdOZXcnXHJcbiAgICBpZih0aGlzLm5ld1VybCgpID09ICcnKSByZXR1cm4gXHJcbiAgICB0aGlzLnJvdXRlLm5hdmlnYXRlKFt0aGlzLm5ld1VybCgpXSkudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJIaXN0b3J5U2VydmljZS5zZXRMYXN0VGl0bGUoJ05ldycpXHJcbiAgICB9KVxyXG4gIH1cclxuICBcclxuICBjbG9zZU5ldygpe1xyXG4gICAgbGV0IGxlbmd0aCA9IHRoaXMuY3J1bWJMaXN0KCkubGVuZ3RoXHJcbiAgICBsZXQgbGFzdCA9IHRoaXMuY3J1bWJMaXN0KClbbGVuZ3RoIC0xXVxyXG4gICAgaWYobGFzdCl7IFxyXG4gICAgICB0aGlzLnJvdXRlLm5hdmlnYXRlKFtsYXN0LnVybF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbmNlbEV2ZW50LmVtaXQoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2F2ZSgpe1xyXG4gICAgdGhpcy5zYXZlRXZlbnQuZW1pdCgpXHJcbiAgfVxyXG4gIGJhY2soaXRlbTphbnkpe1xyXG4gICAgLy8gdGhpcy51c2VySGlzdG9yeVNlcnZpY2UuZGV0YWlsTmFtZSA9IGl0ZW0udGl0bGVcclxuICAgIHRoaXMucm91dGUubmF2aWdhdGUoW2l0ZW0udXJsXSlcclxuICB9XHJcblxyXG4gIHRvZ2dsZShldmVudDphbnkpIHtcclxuICAgIHRoaXMub3AudG9nZ2xlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUxpc3RPcChldmVudDphbnkpe1xyXG4gICAgaWYoIXRoaXMuaXNMaXN0KCkpIHJldHVyblxyXG4gICAgdGhpcy5saXN0T3AudG9nZ2xlKGV2ZW50KVxyXG4gIH1cclxuICBsaXN0QWN0KG5hbWU6c3RyaW5nKSB7XHJcbiAgICBjb25zb2xlLmxvZygnbmFtZS0tLS0nLG5hbWUpXHJcbiAgICB0aGlzLmxpc3RBY3RFdmVudC5lbWl0KG5hbWUpXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJsZWZ0LWJ0biBmbGV4IGdhcC0xIG1pbi13LVs1MXB4XVwiPlxyXG4gICAgPCEtLSBUT0RPIOadg+mZkOaVsOaNruaOpeWFpSAtLT5cclxuICAgIEBpZighbmV3QnRuVGVtcGxhdGVSZWYpe1xyXG4gICAgICA8cC1idXR0b24gKGNsaWNrKT1cImdvTmV3KClcIiBbb3V0bGluZWRdPVwib3V0bGluZWQoKVwiPnt7J2FwcC5jcmVhdGUnIHwgdHJhbnNsYXRlfX08L3AtYnV0dG9uPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuZXdCdG5UZW1wbGF0ZVJlZlwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIEBpZihjcnVtYkxpc3QoKS5sZW5ndGggPiAwKXtcclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6ZmxleFwiPlxyXG4gICAgICAgIEBpZihjcnVtYkxpc3QoKS5sZW5ndGggPD0gMil7XHJcbiAgICAgICAgICBAZm9yKGZjaGlsZCBvZiBjcnVtYkxpc3QoKTsgdHJhY2sgZmNoaWxkLnVybCl7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcnVtYi10aXRsZSBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxMnB4XSBtYXgtdy1bMTIwcHhdIG92ZXJmbG93LWhpZGRlbiB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWVsbGlwc2lzXCIgKGNsaWNrKT1cImJhY2soZmNoaWxkKVwiPlxyXG4gICAgICAgICAgICAgICBAaWYoZmNoaWxkLmkxOG5LZXkhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICB7eyBmY2hpbGQhLmkxOG5LZXkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHt7ZmNoaWxkLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcnVtYi10aXRsZSBjdXJzb3ItcG9pbnRlciBzZWxlY3QtY3J1bWJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1bMTdweF0gaC1bMTdweF0gZmxleCBpdGVtcy1jZW50ZXIgZm9udC1ib2xkIHRleHQtWzEzcHhdXCIgKGNsaWNrKT1cInRvZ2dsZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAuLi5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8cC10aWVyZWRtZW51ICNvcCBbbW9kZWxdPVwiY3J1bWJGcm9udFwiIFtwb3B1cF09XCJ0cnVlXCIgW3N0eWxlXT1cIntwb3NpdGlvbjonYWJzb2x1dGUnfVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpdGVtIGxldC1pdGVtIGxldC1oYXNTdWJtZW51PVwiaGFzU3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YSBwUmlwcGxlIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcC10aWVyZWRtZW51LWl0ZW0tbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yIHctZnVsbFwiIChjbGljayk9XCJiYWNrKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLmkxOG5LZXkhPSAnJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbSEuaTE4bktleSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvcC10aWVyZWRtZW51PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGZvcihpdGVtIG9mIGNydW1iRW5kO3RyYWNrIGl0ZW0udXJsKXtcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3J1bWItdGl0bGUgY3Vyc29yLXBvaW50ZXIgdGV4dC1bMTJweF0gbWF4LXctWzEyMHB4XSBvdmVyZmxvdy1oaWRkZW4gd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1lbGxpcHNpc1wiIChjbGljayk9XCJiYWNrKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoaXRlbS5pMThuS2V5IT0gJycpe1xyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtIS5pMThuS2V5IHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAge3tpdGVtLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZihpc05ldyl7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTAgdGV4dC10ZXh0LWNvbG9yIHRleHQtWzEycHhdIGZsZXggaXRlbXMtY2VudGVyIG5ldy1hY3Rpb25cIiA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGRlbiBtZDppbmxpbmUtYmxvY2sgd2hpdGVzcGFjZS1ub3dyYXBcIj5OZXc8L3NwYW4+XHJcbiAgICAgICAgICBAaWYoaXNTaG93Q29nKCkpe1xyXG4gICAgICAgICAgICA8cC1idXR0b24gdmFyaWFudD1cInRleHRcIiBzZXZlcml0eT1cInNlY29uZGFyeVwiIGljb249XCJwaSAgcGktY29nXCIgYXJpYS1sYWJlbD1cIuaTjeS9nFwiIC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCIgXHJcbiAgICAgICAgICAgIGljb249XCJwaSAgcGktY2xvdWQtdXBsb2FkXCIgXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCLmiYvliqjkv53lrZhcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJwLTBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU2F2ZSgpXCI+XHJcbiAgICAgICAgICA8L3AtYnV0dG9uPlxyXG4gICAgICAgICAgPHAtYnV0dG9uIFxyXG4gICAgICAgICAgICB2YXJpYW50PVwidGV4dFwiIFxyXG4gICAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiIFxyXG4gICAgICAgICAgICBpY29uPVwicGkgIHBpLXRpbWVzXCIgXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCLlhbPpl61cIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJwLTBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VOZXcoKVwiPlxyXG4gICAgICAgICAgPC9wLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTAgdGV4dC10ZXh0LWNvbG9yIHRleHQtWzEycHhdIHRpdGxlLWFjdGlvblwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4gbWQ6aW5saW5lLWJsb2NrIHdoaXRlc3BhY2Utbm93cmFwXCI+e3tjcnVtYlRpdGxlKCkudGl0bGV9fTwvc3Bhbj5cclxuICAgICAgICAgIEBpZihpc1Nob3dDb2coKSl7XHJcbiAgICAgICAgICAgIDxwLWJ1dHRvbiB2YXJpYW50PVwidGV4dFwiIHNldmVyaXR5PVwic2Vjb25kYXJ5XCIgaWNvbj1cInBpICBwaS1jb2dcIiBhcmlhLWxhYmVsPVwi5pON5L2cXCIgLz5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxwLWJ1dHRvbiBcclxuICAgICAgICAgICAgdmFyaWFudD1cInRleHRcIiBcclxuICAgICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIiBcclxuICAgICAgICAgICAgaWNvbj1cInBpICBwaS1jbG91ZC11cGxvYWRcIiBcclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIuaJi+WKqOS/neWtmFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cInAtMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTYXZlKClcIj5cclxuICAgICAgICAgIDwvcC1idXR0b24+XHJcbiAgICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCIgXHJcbiAgICAgICAgICAgIGljb249XCJwaSAgcGktdGltZXNcIiBcclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIuWFs+mXrVwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cInAtMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjbG9zZU5ldygpXCI+XHJcbiAgICAgICAgICA8L3AtYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgPC9kaXY+XHJcbiAgfSBAZWxzZSB7XHJcbiAgICA8IS0tIOWIneWni+iKgueCuSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtaW4tdy0wIGZsZXggaXRlbXMtY2VudGVyIHRleHQtWzE0cHhdIHRleHQtdGV4dC1jb2xvclwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImhpZGRlbiBtZDppbmxpbmUtYmxvY2sgbWF4LXctWzEyMHB4XSBvdmVyZmxvdy1oaWRkZW4gd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgIEBpZihjcnVtYlRpdGxlKCkuaTE4bktleSAhPSAnJyl7XHJcbiAgICAgICAgICB7e2NydW1iVGl0bGUoKS5pMThuS2V5IHwgdHJhbnNsYXRlfX1cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIHt7Y3J1bWJUaXRsZSgpLnRpdGxlfX1cclxuICAgICAgICB9XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgQGlmKGlzU2hvd0NvZygpKXtcclxuICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICB2YXJpYW50PVwidGV4dFwiXHJcbiAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiIFxyXG4gICAgICAgICAgaWNvbj1cInBpICBwaS1jb2dcIiBcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCLmk43kvZxcIiBcclxuICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUxpc3RPcCgkZXZlbnQpXCIvPlxyXG4gICAgICAgIDxwLXRpZXJlZG1lbnUgI2xpc3RPcCBbbW9kZWxdPVwibGlzdE9wSXRlbXNcIiBbcG9wdXBdPVwidHJ1ZVwiIFtzdHlsZV09XCJ7cG9zaXRpb246J2Fic29sdXRlJ31cIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaXRlbSBsZXQtaXRlbSBsZXQtaGFzU3VibWVudT1cImhhc1N1Ym1lbnVcIj5cclxuICAgICAgICAgICAgPGEgcFJpcHBsZSBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHAtdGllcmVkbWVudS1pdGVtLWxpbmtcIiAoY2xpY2spPVwibGlzdEFjdChpdGVtLnR5cGUpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJwLXRpZXJlZG1lbnUtaXRlbS1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+e3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPHAtYmFkZ2UgKm5nSWY9XCJpdGVtLmJhZGdlXCIgY2xhc3M9XCJtbC1hdXRvXCIgW3ZhbHVlXT1cIml0ZW0uYmFkZ2VcIiAvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5zaG9ydGN1dFwiIGNsYXNzPVwibWwtYXV0byBib3JkZXIgYm9yZGVyLXN1cmZhY2Ugcm91bmRlZCBiZy1lbXBoYXNpcyB0ZXh0LW11dGVkLWNvbG9yIHRleHQteHMgcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5zaG9ydGN1dCB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJoYXNTdWJtZW51XCIgY2xhc3M9XCJwaSBwaS1hbmdsZS1yaWdodCBtbC1hdXRvXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGllcmVkbWVudT5cclxuICAgICAgfVxyXG4gICAgICBAaWYoIWlzTGlzdCgpKXtcclxuICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICB2YXJpYW50PVwidGV4dFwiIFxyXG4gICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIiBcclxuICAgICAgICAgIGljb249XCJwaSAgcGktY2xvdWQtdXBsb2FkXCIgXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwi5omL5Yqo5L+d5a2YXCIgXHJcbiAgICAgICAgICBjbGFzcz1cInAtMFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU2F2ZSgpXCI+XHJcbiAgICAgICAgPC9wLWJ1dHRvbj5cclxuICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICB2YXJpYW50PVwidGV4dFwiIFxyXG4gICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIiBcclxuICAgICAgICAgIGljb249XCJwaSAgcGktdGltZXNcIiBcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCLlhbPpl61cIiBcclxuICAgICAgICAgIGNsYXNzPVwicC0wXCJcclxuICAgICAgICAgIChjbGljayk9XCJjbG9zZU5ldygpXCI+XHJcbiAgICAgICAgPC9wLWJ1dHRvbj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG4gIFxyXG48L2Rpdj5cclxuIl19
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Component, effect, input, computed, ViewChildren, inject, HostListener, untracked, signal, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { FieldControl } from '../form-field/field-control';
|
|
5
|
+
import { FormFieldComponent } from '../form-field/form-field';
|
|
6
|
+
import { DatePipe } from '@angular/common';
|
|
7
|
+
import { I18nService } from '../../service/i18n.service';
|
|
8
|
+
import { fieldUtils } from '../form-field/field-utils';
|
|
9
|
+
import { generateUniqueId } from '../..//share/utils';
|
|
10
|
+
import { Router } from '@angular/router';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
export class FormComponent {
|
|
14
|
+
onResize() {
|
|
15
|
+
this.reCalcLabelSize();
|
|
16
|
+
}
|
|
17
|
+
constructor(cdr, datePipe) {
|
|
18
|
+
this.cdr = cdr;
|
|
19
|
+
this.datePipe = datePipe;
|
|
20
|
+
this.router = inject(Router);
|
|
21
|
+
this.isNew = false;
|
|
22
|
+
this.options = input({});
|
|
23
|
+
this.fields = computed(() => {
|
|
24
|
+
untracked(() => {
|
|
25
|
+
this.initForm();
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
this.reCalcLabelSize();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
return this.options().fields;
|
|
31
|
+
});
|
|
32
|
+
this.i18nService = inject(I18nService);
|
|
33
|
+
this.model = input();
|
|
34
|
+
this.upsert = input();
|
|
35
|
+
this.rawModel = {};
|
|
36
|
+
this.changedModel = {};
|
|
37
|
+
this.hookObservers = [];
|
|
38
|
+
this.labelMinWidth = signal(undefined);
|
|
39
|
+
this.router.url.split('/').pop() == 'new' && (this.isNew = true);
|
|
40
|
+
effect(() => {
|
|
41
|
+
console.log("model-----", this.model());
|
|
42
|
+
if (!this.model()) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// 默认值仅在表单新建时生效
|
|
46
|
+
if (this.isNew) {
|
|
47
|
+
this.fieldList.forEach((field) => {
|
|
48
|
+
if (!field.default)
|
|
49
|
+
return;
|
|
50
|
+
if (this.model()[field.key] !== undefined)
|
|
51
|
+
return;
|
|
52
|
+
untracked(() => {
|
|
53
|
+
this.handleValueChange(field.default, field);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
this.rawModel = { ...this.model() };
|
|
58
|
+
console.log("model-----raw", this.model());
|
|
59
|
+
this.changedModel = {};
|
|
60
|
+
untracked(() => this.triggerHook());
|
|
61
|
+
}, { allowSignalWrites: true });
|
|
62
|
+
}
|
|
63
|
+
ngAfterViewInit() {
|
|
64
|
+
setTimeout(() => {
|
|
65
|
+
this.reCalcLabelSize();
|
|
66
|
+
});
|
|
67
|
+
this.i18nService.change.subscribe((res) => {
|
|
68
|
+
this.reCalcLabelSize();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
ngOnDestroy() {
|
|
72
|
+
this.hookObservers.forEach((unsubscribe) => unsubscribe());
|
|
73
|
+
}
|
|
74
|
+
initForm() {
|
|
75
|
+
if (!this.options().extra) {
|
|
76
|
+
this.options().extra = {};
|
|
77
|
+
}
|
|
78
|
+
if (!this.options().form) {
|
|
79
|
+
this.options().form = new FormGroup({});
|
|
80
|
+
}
|
|
81
|
+
this.fieldList = [];
|
|
82
|
+
this.parseFields(this.options().fields || []);
|
|
83
|
+
this.fieldList.forEach((field) => {
|
|
84
|
+
field.uuid = generateUniqueId();
|
|
85
|
+
field.labelMinWidth = this.labelMinWidth;
|
|
86
|
+
field.interactiveLabel = this.options().interactiveLabel ?? true;
|
|
87
|
+
field.form = this;
|
|
88
|
+
this.handleFieldControl(field);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
getField(key) {
|
|
92
|
+
return this.fieldList.find((field) => field.key === key);
|
|
93
|
+
}
|
|
94
|
+
parseFields(fields) {
|
|
95
|
+
fields.forEach((field) => {
|
|
96
|
+
if (field.group) {
|
|
97
|
+
this.parseFields(field.group);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.fieldList.push(field);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
handleFieldControl(field) {
|
|
105
|
+
const fieldControl = fieldUtils.props(field).required
|
|
106
|
+
? new FieldControl(null, field.validators ? field.validators : Validators.required)
|
|
107
|
+
: new FieldControl(null);
|
|
108
|
+
this.options().form?.addControl(field.key || '', fieldControl);
|
|
109
|
+
field.fieldControl = fieldControl;
|
|
110
|
+
field.fieldControl?.valueChanges.subscribe((value) => {
|
|
111
|
+
const targetValue = fieldUtils.fromFieldValue(field, value, this.datePipe);
|
|
112
|
+
if (fieldUtils.isFakedChange(targetValue, this.model()[field.key], field)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this.handleValueChange(targetValue, field);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
handleValueChange(value, field) {
|
|
119
|
+
this.model()[field.key] = value;
|
|
120
|
+
this.changedModel[field.key] = { name: fieldUtils.label(field, this.i18nService), value: value, type: field.type };
|
|
121
|
+
this.handleUpsert(field.key, value);
|
|
122
|
+
console.log('-----handleValueChange', this.upsert());
|
|
123
|
+
this.handleHideExpression();
|
|
124
|
+
}
|
|
125
|
+
handleUpsert(key, value) {
|
|
126
|
+
if (this.isNew) {
|
|
127
|
+
this.upsert().addData[key] = value;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.upsert().updData[key] = value;
|
|
131
|
+
}
|
|
132
|
+
this.upsert().log.content = fieldUtils.transLog(this.rawModel, this.changedModel, this.model()[this.options().mainField], this.isNew);
|
|
133
|
+
}
|
|
134
|
+
handleHideExpression() {
|
|
135
|
+
this.fieldList.forEach((field) => {
|
|
136
|
+
if (field.hideExpression) {
|
|
137
|
+
field.hide = field.hideExpression(this.model(), field);
|
|
138
|
+
if (field.hide) {
|
|
139
|
+
this.options().form?.controls[field.key].disable({ emitEvent: false });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.options().form?.controls[field.key].enable({ emitEvent: false });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
validate() {
|
|
148
|
+
for (let key in this.options().form?.controls) {
|
|
149
|
+
!this.options().form?.controls[key]['disabled'] && this.options().form?.controls[key].markAsDirty();
|
|
150
|
+
}
|
|
151
|
+
return this.options().form?.valid;
|
|
152
|
+
}
|
|
153
|
+
triggerHook() {
|
|
154
|
+
this.fieldList.forEach((field) => {
|
|
155
|
+
console.log('field----', field);
|
|
156
|
+
fieldUtils.triggerHookAndSetValue(field, this.model()?.[field.key], ['upload', 'image', 'codemirror', 'radio', 'select'].includes(field.type), this.hookObservers, () => {
|
|
157
|
+
this.handleHideExpression();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
reCalcLabelSize() {
|
|
162
|
+
if (this.options().labelWidth) {
|
|
163
|
+
this.labelMinWidth.set(this.options().labelWidth);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.labelMinWidth.set(undefined);
|
|
167
|
+
this.cdr.detectChanges();
|
|
168
|
+
this.handleFieldLabels();
|
|
169
|
+
this.cdr.detectChanges();
|
|
170
|
+
}
|
|
171
|
+
handleFieldLabels() {
|
|
172
|
+
const fieldLabels = [];
|
|
173
|
+
this.getFieldLabels(this.fieldComponents, fieldLabels);
|
|
174
|
+
const offsetWidths = fieldLabels.map((fieldLabel) => fieldLabel.nativeElement.offsetWidth);
|
|
175
|
+
this.labelMinWidth.set(Math.max(...offsetWidths) + 18 + 'px');
|
|
176
|
+
}
|
|
177
|
+
getFieldLabels(fieldComponents, fieldLabels) {
|
|
178
|
+
if (!fieldComponents) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
fieldComponents?.forEach((component) => {
|
|
182
|
+
const fieldLabel = component.getFieldLabel();
|
|
183
|
+
if (fieldLabel) {
|
|
184
|
+
fieldLabels.push(fieldLabel);
|
|
185
|
+
}
|
|
186
|
+
this.getFieldLabels(component.getFieldComponents(), fieldLabels);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
triggerModelEffect(model) {
|
|
190
|
+
Object.keys(model).forEach((key) => {
|
|
191
|
+
const field = this.getField(key);
|
|
192
|
+
fieldUtils.triggerHookAndSetValue(field, model[key], ['upload', 'image', 'codemirror', 'radio', 'select'].includes(field.type), this.hookObservers, () => {
|
|
193
|
+
this.handleHideExpression();
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
finalize() {
|
|
198
|
+
this.fieldList.forEach((field) => {
|
|
199
|
+
if (['image', 'upload'].includes(field.type)) {
|
|
200
|
+
field.fieldControl?.afterSubmit();
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
205
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FormComponent, isStandalone: true, selector: "custom-form", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, upsert: { classPropertyName: "upsert", publicName: "upsert", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize($event)" } }, providers: [DatePipe], viewQueries: [{ propertyName: "fieldComponents", predicate: FormFieldComponent, descendants: true }], ngImport: i0, template: "@for (field of fields(); track field) {\r\n\t<form-field\r\n\t\tclass=\"w-full\"\r\n\t\t[field]=\"field\">\r\n\t</form-field>\r\n}\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: FormFieldComponent, selector: "form-field", inputs: ["field"] }] }); }
|
|
206
|
+
}
|
|
207
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormComponent, decorators: [{
|
|
208
|
+
type: Component,
|
|
209
|
+
args: [{ selector: 'custom-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormFieldComponent], providers: [DatePipe], template: "@for (field of fields(); track field) {\r\n\t<form-field\r\n\t\tclass=\"w-full\"\r\n\t\t[field]=\"field\">\r\n\t</form-field>\r\n}\r\n" }]
|
|
210
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DatePipe }], propDecorators: { fieldComponents: [{
|
|
211
|
+
type: ViewChildren,
|
|
212
|
+
args: [FormFieldComponent]
|
|
213
|
+
}], onResize: [{
|
|
214
|
+
type: HostListener,
|
|
215
|
+
args: ['window:resize', ['$event']]
|
|
216
|
+
}] } });
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbW0tdWkvc3JjL2xpYi9mb3JtL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbW0tdWkvc3JjL2xpYi9mb3JtL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFJWixNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFDVCxNQUFNLEdBQ04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFzQixNQUFNLGdCQUFnQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQWEsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQWtCekMsTUFBTSxPQUFPLGFBQWE7SUF5QnpCLFFBQVE7UUFDUCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQ1MsR0FBc0IsRUFDdEIsUUFBa0I7UUFEbEIsUUFBRyxHQUFILEdBQUcsQ0FB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QUFDLEtBQUssQ0FBQyxJQUFLLENBQUMsRUFDMUUsSUFBSSxDQUFDLGFBQWEsRUFDbEIsR0FBRyxFQUFFO2dCQUNKLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FDRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLEtBQUssQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDbkMsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzsrR0FwT1csYUFBYTttR0FBYixhQUFhLHFmQUpkLENBQUMsUUFBUSxDQUFDLDhEQUtQLGtCQUFrQixnREMxQ2pDLHdJQU1BLHlERDhCVyxZQUFZLDhCQUFFLG1CQUFtQiwrQkFBRSxrQkFBa0I7OzRGQUtuRCxhQUFhO2tCQVJ6QixTQUFTOytCQUNDLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsYUFDckQsQ0FBQyxRQUFRLENBQUM7NkdBS2EsZUFBZTtzQkFBaEQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBd0JoQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuXHRDb21wb25lbnQsXHJcblx0ZWZmZWN0LFxyXG5cdGlucHV0LFxyXG5cdGNvbXB1dGVkLFxyXG5cdFZpZXdDaGlsZHJlbixcclxuXHRRdWVyeUxpc3QsXHJcblx0RWxlbWVudFJlZixcclxuXHRDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRpbmplY3QsXHJcblx0SG9zdExpc3RlbmVyLFxyXG5cdHVudHJhY2tlZCxcclxuXHRzaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybVN1Ym1pdHRlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGaWVsZENvbnRyb2wgfSBmcm9tICcuLi9mb3JtLWZpZWxkL2ZpZWxkLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBGb3JtRmllbGQsIEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tZmllbGQvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2kxOG4uc2VydmljZSc7XHJcbmltcG9ydCB7IGZpZWxkVXRpbHMgfSBmcm9tICcuLi9mb3JtLWZpZWxkL2ZpZWxkLXV0aWxzJztcclxuaW1wb3J0IHsgVXBzZXJ0IH0gZnJvbSAnLi4vLi4vYW0vYW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uLy9zaGFyZS91dGlscyc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU9wdGlvbnMge1xyXG5cdGZpZWxkcz86IEZvcm1GaWVsZFtdO1xyXG5cdGZvcm0/OiBGb3JtR3JvdXA7XHJcblx0bWFpbkZpZWxkPzogc3RyaW5nO1xyXG5cdGxhYmVsV2lkdGg/OiBzdHJpbmc7XHJcblx0aW50ZXJhY3RpdmVMYWJlbD86IGJvb2xlYW47XHJcblx0ZXh0cmE/OiBhbnk7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY3VzdG9tLWZvcm0nLFxyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0aW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUZpZWxkQ29tcG9uZW50XSxcclxuXHRwcm92aWRlcnM6IFtEYXRlUGlwZV0sXHJcblx0dGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQge1xyXG5cdEBWaWV3Q2hpbGRyZW4oRm9ybUZpZWxkQ29tcG9uZW50KSBmaWVsZENvbXBvbmVudHM/OiBRdWVyeUxpc3Q8Rm9ybUZpZWxkQ29tcG9uZW50PjtcclxuXHRyb3V0ZXI6IFJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG5cdGlzTmV3OiBib29sZWFuID0gZmFsc2U7XHJcblx0b3B0aW9ucyA9IGlucHV0PEZvcm1PcHRpb25zPih7fSk7XHJcblx0ZmllbGRzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG5cdFx0dW50cmFja2VkKCgpID0+IHtcclxuXHRcdFx0dGhpcy5pbml0Rm9ybSgpO1xyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlQ2FsY0xhYmVsU2l6ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHRoaXMub3B0aW9ucygpLmZpZWxkcztcclxuXHR9KTtcclxuXHJcblx0aTE4blNlcnZpY2UgPSBpbmplY3QoSTE4blNlcnZpY2UpO1xyXG5cdG1vZGVsID0gaW5wdXQ8YW55PigpO1xyXG5cdHVwc2VydCA9IGlucHV0PFVwc2VydD4oKTtcclxuXHRyYXdNb2RlbDogYW55ID0ge307XHJcblx0Y2hhbmdlZE1vZGVsOiBhbnkgPSB7fTtcclxuXHRmaWVsZExpc3QhOiBGb3JtRmllbGRbXTtcclxuXHRob29rT2JzZXJ2ZXJzOiBGdW5jdGlvbltdID0gW107XHJcblx0bGFiZWxNaW5XaWR0aCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcblxyXG5cdEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG5cdG9uUmVzaXplKCkge1xyXG5cdFx0dGhpcy5yZUNhbGNMYWJlbFNpemUoKTtcclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0cHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcblx0KSB7XHJcblx0XHR0aGlzLnJvdXRlci51cmwuc3BsaXQoJy8nKS5wb3AoKSA9PSAnbmV3JyAmJiAodGhpcy5pc05ldyA9IHRydWUpO1xyXG5cdFx0ZWZmZWN0KFxyXG5cdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coXCJtb2RlbC0tLS0tXCIsdGhpcy5tb2RlbCgpKVxyXG5cdFx0XHRcdGlmICghdGhpcy5tb2RlbCgpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIOm7mOiupOWAvOS7heWcqOihqOWNleaWsOW7uuaXtueUn+aViFxyXG5cdFx0XHRcdGlmICh0aGlzLmlzTmV3KSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkTGlzdC5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoIWZpZWxkLmRlZmF1bHQpIHJldHVybjtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMubW9kZWwoKVtmaWVsZC5rZXkhXSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblx0XHRcdFx0XHRcdHVudHJhY2tlZCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWx1ZUNoYW5nZShmaWVsZC5kZWZhdWx0LCBmaWVsZCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMucmF3TW9kZWwgPSB7IC4uLnRoaXMubW9kZWwoKSB9O1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKFwibW9kZWwtLS0tLXJhd1wiLHRoaXMubW9kZWwoKSlcclxuXHRcdFx0XHR0aGlzLmNoYW5nZWRNb2RlbCA9IHt9O1xyXG5cdFx0XHRcdHVudHJhY2tlZCgoKSA9PiB0aGlzLnRyaWdnZXJIb29rKCkpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVDYWxjTGFiZWxTaXplKCk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuaTE4blNlcnZpY2UuY2hhbmdlLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcblx0XHRcdHRoaXMucmVDYWxjTGFiZWxTaXplKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0dGhpcy5ob29rT2JzZXJ2ZXJzLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB1bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcblxyXG5cdGluaXRGb3JtKCkge1xyXG5cdFx0aWYgKCF0aGlzLm9wdGlvbnMoKS5leHRyYSkge1xyXG5cdFx0XHR0aGlzLm9wdGlvbnMoKS5leHRyYSA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0aWYgKCF0aGlzLm9wdGlvbnMoKS5mb3JtKSB7XHJcblx0XHRcdHRoaXMub3B0aW9ucygpLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZmllbGRMaXN0ID0gW107XHJcblx0XHR0aGlzLnBhcnNlRmllbGRzKHRoaXMub3B0aW9ucygpLmZpZWxkcyB8fCBbXSk7XHJcblx0XHR0aGlzLmZpZWxkTGlzdC5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cdFx0XHRmaWVsZC51dWlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG5cdFx0XHRmaWVsZC5sYWJlbE1pbldpZHRoID0gdGhpcy5sYWJlbE1pbldpZHRoO1xyXG5cdFx0XHRmaWVsZC5pbnRlcmFjdGl2ZUxhYmVsID0gdGhpcy5vcHRpb25zKCkuaW50ZXJhY3RpdmVMYWJlbCA/PyB0cnVlO1xyXG5cdFx0XHRmaWVsZC5mb3JtID0gdGhpc1xyXG5cdFx0XHR0aGlzLmhhbmRsZUZpZWxkQ29udHJvbChmaWVsZCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZpZWxkKGtleTogc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5maWVsZExpc3QuZmluZCgoZmllbGQpID0+IGZpZWxkLmtleSA9PT0ga2V5KTtcclxuXHR9XHJcblxyXG5cdHBhcnNlRmllbGRzKGZpZWxkczogRm9ybUZpZWxkW10pIHtcclxuXHRcdGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cdFx0XHRpZiAoZmllbGQuZ3JvdXApIHtcclxuXHRcdFx0XHR0aGlzLnBhcnNlRmllbGRzKGZpZWxkLmdyb3VwKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmZpZWxkTGlzdC5wdXNoKGZpZWxkKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRoYW5kbGVGaWVsZENvbnRyb2woZmllbGQ6IEZvcm1GaWVsZCkge1xyXG5cdFx0Y29uc3QgZmllbGRDb250cm9sID0gZmllbGRVdGlscy5wcm9wcyhmaWVsZCkucmVxdWlyZWRcclxuXHRcdFx0PyBuZXcgRmllbGRDb250cm9sKG51bGwsIGZpZWxkLnZhbGlkYXRvcnMgPyBmaWVsZC52YWxpZGF0b3JzIDogVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuXHRcdFx0OiBuZXcgRmllbGRDb250cm9sKG51bGwpO1xyXG5cdFx0dGhpcy5vcHRpb25zKCkuZm9ybT8uYWRkQ29udHJvbChmaWVsZC5rZXkgfHwgJycsIGZpZWxkQ29udHJvbCk7XHJcblx0XHRmaWVsZC5maWVsZENvbnRyb2wgPSBmaWVsZENvbnRyb2w7XHJcblx0XHRmaWVsZC5maWVsZENvbnRyb2w/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcblx0XHRcdGNvbnN0IHRhcmdldFZhbHVlID0gZmllbGRVdGlscy5mcm9tRmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIHRoaXMuZGF0ZVBpcGUpO1xyXG5cdFx0XHRpZiAoZmllbGRVdGlscy5pc0Zha2VkQ2hhbmdlKHRhcmdldFZhbHVlLCB0aGlzLm1vZGVsKClbZmllbGQua2V5IV0sIGZpZWxkKSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlKHRhcmdldFZhbHVlLCBmaWVsZCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVZhbHVlQ2hhbmdlKHZhbHVlOiBhbnksIGZpZWxkOiBGb3JtRmllbGQpIHtcclxuXHRcdHRoaXMubW9kZWwoKVtmaWVsZC5rZXkhXSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5jaGFuZ2VkTW9kZWxbZmllbGQua2V5IV0gPSB7IG5hbWU6IGZpZWxkVXRpbHMubGFiZWwoZmllbGQsIHRoaXMuaTE4blNlcnZpY2UpLCB2YWx1ZTogdmFsdWUsIHR5cGU6IGZpZWxkLnR5cGUgfTtcclxuXHRcdHRoaXMuaGFuZGxlVXBzZXJ0KGZpZWxkLmtleSEsIHZhbHVlKTtcclxuXHRcdGNvbnNvbGUubG9nKCctLS0tLWhhbmRsZVZhbHVlQ2hhbmdlJywgdGhpcy51cHNlcnQoKSk7XHJcblx0XHR0aGlzLmhhbmRsZUhpZGVFeHByZXNzaW9uKCk7XHJcblx0fVxyXG5cclxuXHRoYW5kbGVVcHNlcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuXHRcdGlmICh0aGlzLmlzTmV3KSB7XHJcblx0XHRcdHRoaXMudXBzZXJ0KCkhLmFkZERhdGEhW2tleV0gPSB2YWx1ZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMudXBzZXJ0KCkhLnVwZERhdGEhW2tleV0gPSB2YWx1ZTtcclxuXHRcdH1cclxuXHRcdHRoaXMudXBzZXJ0KCkhLmxvZyEuY29udGVudCA9IGZpZWxkVXRpbHMudHJhbnNMb2coXHJcblx0XHRcdHRoaXMucmF3TW9kZWwsXHJcblx0XHRcdHRoaXMuY2hhbmdlZE1vZGVsLFxyXG5cdFx0XHR0aGlzLm1vZGVsKClbdGhpcy5vcHRpb25zKCkubWFpbkZpZWxkIV0sXHJcblx0XHRcdHRoaXMuaXNOZXcsXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0aGFuZGxlSGlkZUV4cHJlc3Npb24oKSB7XHJcblx0XHR0aGlzLmZpZWxkTGlzdC5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cdFx0XHRpZiAoZmllbGQuaGlkZUV4cHJlc3Npb24pIHtcclxuXHRcdFx0XHRmaWVsZC5oaWRlID0gZmllbGQuaGlkZUV4cHJlc3Npb24odGhpcy5tb2RlbCgpLCBmaWVsZCk7XHJcblx0XHRcdFx0aWYgKGZpZWxkLmhpZGUpIHtcclxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucygpLmZvcm0/LmNvbnRyb2xzW2ZpZWxkLmtleSFdLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMoKS5mb3JtPy5jb250cm9sc1tmaWVsZC5rZXkhXS5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHR2YWxpZGF0ZSgpIHtcclxuXHRcdGZvciAobGV0IGtleSBpbiB0aGlzLm9wdGlvbnMoKS5mb3JtPy5jb250cm9scykge1xyXG5cdFx0XHQhdGhpcy5vcHRpb25zKCkuZm9ybT8uY29udHJvbHNba2V5XVsnZGlzYWJsZWQnXSAmJiB0aGlzLm9wdGlvbnMoKS5mb3JtPy5jb250cm9sc1trZXldLm1hcmtBc0RpcnR5KCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zKCkuZm9ybT8udmFsaWQ7XHJcblx0fVxyXG5cclxuXHR0cmlnZ2VySG9vaygpIHtcclxuXHRcdHRoaXMuZmllbGRMaXN0LmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdmaWVsZC0tLS0nLGZpZWxkKVxyXG5cdFx0XHRmaWVsZFV0aWxzLnRyaWdnZXJIb29rQW5kU2V0VmFsdWUoXHJcblx0XHRcdFx0ZmllbGQsXHJcblx0XHRcdFx0dGhpcy5tb2RlbCgpPy5bZmllbGQua2V5IV0sXHJcblx0XHRcdFx0Wyd1cGxvYWQnLCAnaW1hZ2UnLCAnY29kZW1pcnJvcicsICdyYWRpbycsICdzZWxlY3QnXS5pbmNsdWRlcyhmaWVsZC50eXBlISksXHJcblx0XHRcdFx0dGhpcy5ob29rT2JzZXJ2ZXJzLFxyXG5cdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuaGFuZGxlSGlkZUV4cHJlc3Npb24oKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRyZUNhbGNMYWJlbFNpemUoKSB7XHJcblx0XHRpZiAodGhpcy5vcHRpb25zKCkubGFiZWxXaWR0aCkge1xyXG5cdFx0XHR0aGlzLmxhYmVsTWluV2lkdGguc2V0KHRoaXMub3B0aW9ucygpLmxhYmVsV2lkdGgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLmxhYmVsTWluV2lkdGguc2V0KHVuZGVmaW5lZCk7XHJcblx0XHR0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHR0aGlzLmhhbmRsZUZpZWxkTGFiZWxzKCk7XHJcblx0XHR0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG5cclxuXHRoYW5kbGVGaWVsZExhYmVscygpIHtcclxuXHRcdGNvbnN0IGZpZWxkTGFiZWxzOiBFbGVtZW50UmVmW10gPSBbXTtcclxuXHRcdHRoaXMuZ2V0RmllbGRMYWJlbHModGhpcy5maWVsZENvbXBvbmVudHMsIGZpZWxkTGFiZWxzKTtcclxuXHRcdGNvbnN0IG9mZnNldFdpZHRocyA9IGZpZWxkTGFiZWxzLm1hcCgoZmllbGRMYWJlbCkgPT4gZmllbGRMYWJlbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKTtcclxuXHRcdHRoaXMubGFiZWxNaW5XaWR0aC5zZXQoTWF0aC5tYXgoLi4ub2Zmc2V0V2lkdGhzKSArIDE4ICsgJ3B4Jyk7XHJcblx0fVxyXG5cclxuXHRnZXRGaWVsZExhYmVscyhmaWVsZENvbXBvbmVudHM6IFF1ZXJ5TGlzdDxGb3JtRmllbGRDb21wb25lbnQ+IHwgdW5kZWZpbmVkLCBmaWVsZExhYmVsczogRWxlbWVudFJlZltdKSB7XHJcblx0XHRpZiAoIWZpZWxkQ29tcG9uZW50cykge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRmaWVsZENvbXBvbmVudHM/LmZvckVhY2goKGNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRjb25zdCBmaWVsZExhYmVsID0gY29tcG9uZW50LmdldEZpZWxkTGFiZWwoKTtcclxuXHRcdFx0aWYgKGZpZWxkTGFiZWwpIHtcclxuXHRcdFx0XHRmaWVsZExhYmVscy5wdXNoKGZpZWxkTGFiZWwpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuZ2V0RmllbGRMYWJlbHMoY29tcG9uZW50LmdldEZpZWxkQ29tcG9uZW50cygpLCBmaWVsZExhYmVscyk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHRyaWdnZXJNb2RlbEVmZmVjdChtb2RlbDogYW55KSB7XHJcblx0XHRPYmplY3Qua2V5cyhtb2RlbCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcblx0XHRcdGNvbnN0IGZpZWxkID0gdGhpcy5nZXRGaWVsZChrZXkpITtcclxuXHRcdFx0ZmllbGRVdGlscy50cmlnZ2VySG9va0FuZFNldFZhbHVlKFxyXG5cdFx0XHRcdGZpZWxkLFxyXG5cdFx0XHRcdG1vZGVsW2tleV0sXHJcblx0XHRcdFx0Wyd1cGxvYWQnLCAnaW1hZ2UnLCAnY29kZW1pcnJvcicsICdyYWRpbycsICdzZWxlY3QnXS5pbmNsdWRlcyhmaWVsZC50eXBlISksXHJcblx0XHRcdFx0dGhpcy5ob29rT2JzZXJ2ZXJzLFxyXG5cdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuaGFuZGxlSGlkZUV4cHJlc3Npb24oKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRmaW5hbGl6ZSgpIHtcclxuXHRcdHRoaXMuZmllbGRMaXN0LmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblx0XHRcdGlmIChbJ2ltYWdlJywgJ3VwbG9hZCddLmluY2x1ZGVzKGZpZWxkLnR5cGUhKSkge1xyXG5cdFx0XHRcdGZpZWxkLmZpZWxkQ29udHJvbD8uYWZ0ZXJTdWJtaXQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiIsIkBmb3IgKGZpZWxkIG9mIGZpZWxkcygpOyB0cmFjayBmaWVsZCkge1xyXG5cdDxmb3JtLWZpZWxkXHJcblx0XHRjbGFzcz1cInctZnVsbFwiXHJcblx0XHRbZmllbGRdPVwiZmllbGRcIj5cclxuXHQ8L2Zvcm0tZmllbGQ+XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FormControl } from '@angular/forms';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
export class FieldControl extends FormControl {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.modelChange = new BehaviorSubject(null);
|
|
7
|
+
this.submitChange = new BehaviorSubject(false);
|
|
8
|
+
}
|
|
9
|
+
setValue(value, options = {}, detectModelChange = false) {
|
|
10
|
+
super.setValue(value, options);
|
|
11
|
+
if (detectModelChange) {
|
|
12
|
+
this.modelChange.next(value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
afterSubmit() {
|
|
16
|
+
this.submitChange.next(true);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltbS11aS9zcmMvbGliL2Zvcm0vZm9ybS1maWVsZC9maWVsZC1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE1BQU0sT0FBTyxZQUFhLFNBQVEsV0FBVztJQUE3Qzs7UUFDUSxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFtQjNELENBQUM7SUFsQlMsUUFBUSxDQUNoQixLQUFVLEVBQ1YsVUFLSSxFQUFFLEVBQ04sb0JBQTZCLEtBQUs7UUFFbEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDRixDQUFDO0lBQ0QsV0FBVztRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWVsZENvbnRyb2wgZXh0ZW5kcyBGb3JtQ29udHJvbCB7XHJcblx0cHVibGljIG1vZGVsQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG5cdHB1YmxpYyBzdWJtaXRDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJvb2xlYW4+KGZhbHNlKTtcclxuXHRvdmVycmlkZSBzZXRWYWx1ZShcclxuXHRcdHZhbHVlOiBhbnksXHJcblx0XHRvcHRpb25zOiB7XHJcblx0XHRcdG9ubHlTZWxmPzogYm9vbGVhbjtcclxuXHRcdFx0ZW1pdEV2ZW50PzogYm9vbGVhbjtcclxuXHRcdFx0ZW1pdE1vZGVsVG9WaWV3Q2hhbmdlPzogYm9vbGVhbjtcclxuXHRcdFx0ZW1pdFZpZXdUb01vZGVsQ2hhbmdlPzogYm9vbGVhbjtcclxuXHRcdH0gPSB7fSxcclxuXHRcdGRldGVjdE1vZGVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2UsXHJcblx0KTogdm9pZCB7XHJcblx0XHRzdXBlci5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XHJcblx0XHRpZiAoZGV0ZWN0TW9kZWxDaGFuZ2UpIHtcclxuXHRcdFx0dGhpcy5tb2RlbENoYW5nZS5uZXh0KHZhbHVlKTtcclxuXHRcdH1cclxuXHR9XHJcblx0YWZ0ZXJTdWJtaXQoKSB7XHJcblx0XHR0aGlzLnN1Ym1pdENoYW5nZS5uZXh0KHRydWUpO1xyXG5cdH1cclxufVxyXG4iXX0=
|