@cuby-ui/core 0.0.575 → 0.0.576
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/widgets/ui/categories-tree/components/category-tree-item/category-tree-item.component.mjs +44 -30
- package/fesm2022/cuby-ui-core.mjs +40 -27
- package/fesm2022/cuby-ui-core.mjs.map +1 -1
- package/package.json +4 -4
- package/widgets/ui/categories-tree/components/category-tree-item/category-tree-item.component.d.ts +2 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, forwardRef, inject, input, output, signal } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, forwardRef, inject, input, output, signal, untracked } from '@angular/core';
|
|
2
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { CuiLetDirective } from '@cuby-ui/cdk';
|
|
4
4
|
import { finalize } from 'rxjs';
|
|
5
|
-
import { CuiButtonModule, CuiIconButtonModule, CuiSvgModule } from '../../../../../components';
|
|
5
|
+
import { CuiButtonModule, CuiDialogService, CuiIconButtonModule, CuiSvgModule } from '../../../../../components';
|
|
6
|
+
import { CuiDeleteModalComponent } from '../../../delete-modal';
|
|
6
7
|
import { CUI_CATEGORIES_TREE_DATA_SOURCE_SERVICE_TOKEN } from '../../models';
|
|
7
8
|
import { CuiCategoryTreeStateService } from '../../services';
|
|
8
9
|
import { CuiCategoriesTreeListComponent } from '../categories-tree-list';
|
|
@@ -16,12 +17,12 @@ export class CuiCategoryTreeItemComponent {
|
|
|
16
17
|
this.destroyRef = inject(DestroyRef);
|
|
17
18
|
this.categoriesDataSourceService = inject(CUI_CATEGORIES_TREE_DATA_SOURCE_SERVICE_TOKEN);
|
|
18
19
|
this.categoryTreeStateService = inject(CuiCategoryTreeStateService);
|
|
20
|
+
this.cuiDialogService = inject(CuiDialogService);
|
|
19
21
|
this.isDeleteSupported = !!this.categoriesDataSourceService.delete;
|
|
20
22
|
this.storageChildren = signal([]);
|
|
21
23
|
this.areChildrenOpened = signal(false);
|
|
22
24
|
this.isSubcategoryCreating = signal(false);
|
|
23
25
|
this.isSubcategoryCreationLoading = signal(false);
|
|
24
|
-
this.isDeleting = signal(false);
|
|
25
26
|
this.openCloseButtonIcon = computed(() => this.areChildrenOpened() ? 'cuiIconChevronDown' : 'cuiIconChevronRight');
|
|
26
27
|
this.doChildrenExist = computed(() => this.storage().children.length || this.storageChildren().length);
|
|
27
28
|
this.isOpenCloseButtonHidden = computed(() => !this.doChildrenExist());
|
|
@@ -30,7 +31,8 @@ export class CuiCategoryTreeItemComponent {
|
|
|
30
31
|
this.isTitleEdit = computed(() => this.categoryTreeStateService.editingId() === this.storage().id);
|
|
31
32
|
this.isCreateCategoryControlVisible = computed(() => (this.categoryTreeStateService.creatingParentId() === this.storage().id && this.isSubcategoryCreating()) ||
|
|
32
33
|
this.isSubcategoryCreationLoading());
|
|
33
|
-
this.isEmpty = computed(() => !this.storage().elements.length &&
|
|
34
|
+
this.isEmpty = computed(() => !this.storage().elements.length &&
|
|
35
|
+
(this.areChildrenOpened() ? !this.storageChildren().length : !this.storage().children.length));
|
|
34
36
|
this.categoryTitle = signal('');
|
|
35
37
|
this.category = computed(() => ({
|
|
36
38
|
...this.storage(),
|
|
@@ -97,42 +99,54 @@ export class CuiCategoryTreeItemComponent {
|
|
|
97
99
|
onDelete(event) {
|
|
98
100
|
event.stopPropagation();
|
|
99
101
|
const deleteRequest = this.categoriesDataSourceService.delete;
|
|
100
|
-
if (!deleteRequest
|
|
102
|
+
if (!deleteRequest) {
|
|
101
103
|
return;
|
|
102
104
|
}
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
this.cuiDialogService
|
|
106
|
+
.open(CuiDeleteModalComponent, {
|
|
107
|
+
data: {
|
|
108
|
+
title: 'DELETE_CATEGORY_QUESTION',
|
|
109
|
+
content: ['ACTION_WILL_DELETE_CATEGORY'],
|
|
110
|
+
delete: () => deleteRequest.call(this.categoriesDataSourceService, this.storage().id)
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
114
|
+
.subscribe((data) => {
|
|
115
|
+
if (data?.canceled) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.deleted.emit(this.storage().id);
|
|
119
|
+
});
|
|
108
120
|
}
|
|
109
121
|
onChildDeleted(id) {
|
|
110
122
|
this.storageChildren.update((children) => children.filter((child) => child.id !== id));
|
|
111
123
|
}
|
|
112
124
|
initStorageChildren() {
|
|
113
|
-
effect(() => {
|
|
114
|
-
if (!this.areChildrenOpened()
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const storage = this.storage();
|
|
118
|
-
const children = storage.children;
|
|
119
|
-
if (!children.length) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (typeof children[0] !== 'string') {
|
|
123
|
-
this.storageChildren.set(children);
|
|
125
|
+
const effectRef = effect(() => {
|
|
126
|
+
if (!this.areChildrenOpened()) {
|
|
124
127
|
return;
|
|
125
128
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
129
|
-
.subscribe((storages) => {
|
|
130
|
-
this.storageChildren.set(storages);
|
|
131
|
-
});
|
|
129
|
+
effectRef.destroy();
|
|
130
|
+
untracked(() => this.loadChildren());
|
|
132
131
|
}, { allowSignalWrites: true });
|
|
133
132
|
}
|
|
133
|
+
loadChildren() {
|
|
134
|
+
const storage = this.storage();
|
|
135
|
+
const children = storage.children;
|
|
136
|
+
if (!children.length) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (typeof children[0] !== 'string') {
|
|
140
|
+
this.storageChildren.set(children);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this.categoriesDataSourceService
|
|
144
|
+
.loadChildren(storage.id)
|
|
145
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
146
|
+
.subscribe((storages) => this.storageChildren.set(storages));
|
|
147
|
+
}
|
|
134
148
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCategoryTreeItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
135
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCategoryTreeItemComponent, isStandalone: true, selector: "cui-category-tree-item", inputs: { storage: { classPropertyName: "storage", publicName: "storage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"
|
|
149
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCategoryTreeItemComponent, isStandalone: true, selector: "cui-category-tree-item", inputs: { storage: { classPropertyName: "storage", publicName: "storage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"toggle-button\"\n [class.toggle-button_hidden]=\"isOpenCloseButtonHidden()\"\n (click)=\"onToggleChildren($event)\"\n >\n <cui-svg\n [icon]=\"openCloseButtonIcon()\"\n color=\"var(--cui-base-500)\"\n />\n </button>\n <cui-svg\n [icon]=\"storageIcon()\"\n color=\"var(--cui-base-500)\"\n class=\"icon\"\n />\n @if (isTitleEdit()) {\n <cui-category-tree-form\n [defaultTitle]=\"stage.title\"\n (created)=\"onTitleChanged($event)\"\n (canceled)=\"onCancelTitleEdit()\"\n />\n } @else {\n <span class=\"title\">{{ stage.title }}</span>\n\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconEdit\"\n class=\"button edit-button\"\n (click)=\"onStartTitleEdit($event)\"\n ></button>\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconPlus\"\n class=\"button add-button\"\n (click)=\"onStartCreatingSubcategory($event)\"\n ></button>\n @if (isDeleteSupported) {\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconTrash\"\n class=\"button delete-button\"\n (click)=\"onDelete($event)\"\n ></button>\n }\n }\n </button>\n <div\n [hidden]=\"!areChildrenOpened()\"\n class=\"list-wrapper\"\n >\n <cui-categories-tree-list\n [storages]=\"storageChildren()\"\n (deleted)=\"onChildDeleted($event)\"\n />\n @if (isCreateCategoryControlVisible()) {\n <cui-create-category-tree-item\n class=\"create-category\"\n [isDisabled]=\"isSubcategoryCreationLoading()\"\n (created)=\"onCreateNewSubcategory($event)\"\n (canceled)=\"onCreatingSubcategoryCanceled()\"\n />\n }\n </div>\n</ng-container>\n", styles: [".category{display:flex;flex-direction:row;gap:4px;padding:2px 4px;width:100%;min-height:32px;border-radius:8px}@media (hover: hover){.category:hover{background:var(--cui-base-10)}.category:hover .delete-button{display:inline-block}}.category:active{background:var(--cui-base-10)}.toggle-button{display:flex;flex-direction:row;gap:0;padding:2px;border-radius:4px;margin:4px 0}@media (hover: hover){.toggle-button:hover{background:var(--cui-base-100)}}.toggle-button:active{background:var(--cui-base-100)}.toggle-button_hidden{visibility:hidden}.title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:start}.button{--cui-base-50: var(--cui-base-200)}@media (hover: hover){.delete-button{display:none}}.list-wrapper{padding-left:8px}.create-category{margin-left:24px}.icon{padding-right:2px;padding-left:2px;height:28px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CuiButtonModule) }, { kind: "component", type: i0.forwardRef(() => i1.CuiButtonComponent), selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }, { kind: "ngmodule", type: i0.forwardRef(() => CuiIconButtonModule) }, { kind: "directive", type: i0.forwardRef(() => CuiLetDirective), selector: "[cuiLet]", inputs: ["cuiLet"] }, { kind: "ngmodule", type: i0.forwardRef(() => CuiSvgModule) }, { kind: "component", type: i0.forwardRef(() => i2.CuiSvgComponent), selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "component", type: i0.forwardRef(() => CuiCategoryTreeFormComponent), selector: "cui-category-tree-form", inputs: ["isDisabled", "defaultTitle"], outputs: ["created", "canceled"] }, { kind: "component", type: i0.forwardRef(() => CuiCreateCategoryTreeItemComponent), selector: "cui-create-category-tree-item", inputs: ["isDisabled"], outputs: ["created", "canceled"] }, { kind: "component", type: i0.forwardRef(() => CuiCategoriesTreeListComponent), selector: "cui-categories-tree-list", inputs: ["storages"], outputs: ["deleted"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
136
150
|
}
|
|
137
151
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCategoryTreeItemComponent, decorators: [{
|
|
138
152
|
type: Component,
|
|
@@ -144,6 +158,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
144
158
|
CuiCategoryTreeFormComponent,
|
|
145
159
|
CuiCreateCategoryTreeItemComponent,
|
|
146
160
|
forwardRef(() => CuiCategoriesTreeListComponent)
|
|
147
|
-
], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"
|
|
161
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"toggle-button\"\n [class.toggle-button_hidden]=\"isOpenCloseButtonHidden()\"\n (click)=\"onToggleChildren($event)\"\n >\n <cui-svg\n [icon]=\"openCloseButtonIcon()\"\n color=\"var(--cui-base-500)\"\n />\n </button>\n <cui-svg\n [icon]=\"storageIcon()\"\n color=\"var(--cui-base-500)\"\n class=\"icon\"\n />\n @if (isTitleEdit()) {\n <cui-category-tree-form\n [defaultTitle]=\"stage.title\"\n (created)=\"onTitleChanged($event)\"\n (canceled)=\"onCancelTitleEdit()\"\n />\n } @else {\n <span class=\"title\">{{ stage.title }}</span>\n\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconEdit\"\n class=\"button edit-button\"\n (click)=\"onStartTitleEdit($event)\"\n ></button>\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconPlus\"\n class=\"button add-button\"\n (click)=\"onStartCreatingSubcategory($event)\"\n ></button>\n @if (isDeleteSupported) {\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconTrash\"\n class=\"button delete-button\"\n (click)=\"onDelete($event)\"\n ></button>\n }\n }\n </button>\n <div\n [hidden]=\"!areChildrenOpened()\"\n class=\"list-wrapper\"\n >\n <cui-categories-tree-list\n [storages]=\"storageChildren()\"\n (deleted)=\"onChildDeleted($event)\"\n />\n @if (isCreateCategoryControlVisible()) {\n <cui-create-category-tree-item\n class=\"create-category\"\n [isDisabled]=\"isSubcategoryCreationLoading()\"\n (created)=\"onCreateNewSubcategory($event)\"\n (canceled)=\"onCreatingSubcategoryCanceled()\"\n />\n }\n </div>\n</ng-container>\n", styles: [".category{display:flex;flex-direction:row;gap:4px;padding:2px 4px;width:100%;min-height:32px;border-radius:8px}@media (hover: hover){.category:hover{background:var(--cui-base-10)}.category:hover .delete-button{display:inline-block}}.category:active{background:var(--cui-base-10)}.toggle-button{display:flex;flex-direction:row;gap:0;padding:2px;border-radius:4px;margin:4px 0}@media (hover: hover){.toggle-button:hover{background:var(--cui-base-100)}}.toggle-button:active{background:var(--cui-base-100)}.toggle-button_hidden{visibility:hidden}.title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:start}.button{--cui-base-50: var(--cui-base-200)}@media (hover: hover){.delete-button{display:none}}.list-wrapper{padding-left:8px}.create-category{margin-left:24px}.icon{padding-right:2px;padding-left:2px;height:28px}\n"] }]
|
|
148
162
|
}], ctorParameters: () => [] });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy91aS9jYXRlZ29yaWVzLXRyZWUvY29tcG9uZW50cy9jYXRlZ29yeS10cmVlLWl0ZW0vY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy91aS9jYXRlZ29yaWVzLXRyZWUvY29tcG9uZW50cy9jYXRlZ29yeS10cmVlLWl0ZW0vY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUcvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0YsT0FBTyxFQUFFLDZDQUE2QyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFN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QTRCLDRQQ3pDekMsbXlGQWtGQSxnNUJEdERRLGVBQWUsNlFBQ2YsbUJBQW1CLG9EQUNuQixlQUFlLDZGQUNmLFlBQVksa05BQ1osNEJBQTRCLGtLQUM1QixrQ0FBa0MseUpBQ2pCLDhCQUE4Qjs7NEZBTzFDLDRCQUE0QjtrQkFoQnhDLFNBQVM7K0JBQ0ksd0JBQXdCLFdBQ3pCO3dCQUNMLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osNEJBQTRCO3dCQUM1QixrQ0FBa0M7d0JBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztxQkFDbkQsY0FDVyxJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIGVmZmVjdCxcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ3VpTGV0RGlyZWN0aXZlIH0gZnJvbSAnQGN1YnktdWkvY2RrJztcbmltcG9ydCB0eXBlIHsgVHJlZVN0cnVjdCB9IGZyb20gJ0BjdWJ5LXVpL2FwaSc7XG5pbXBvcnQgdHlwZSB7IEN1aUljb24gfSBmcm9tICdAY3VieS11aS9pY29ucyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDdWlCdXR0b25Nb2R1bGUsIEN1aUljb25CdXR0b25Nb2R1bGUsIEN1aVN2Z01vZHVsZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQ1VJX0NBVEVHT1JJRVNfVFJFRV9EQVRBX1NPVVJDRV9TRVJWSUNFX1RPS0VOIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEN1aUNhdGVnb3J5VHJlZVN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEN1aUNhdGVnb3JpZXNUcmVlTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL2NhdGVnb3JpZXMtdHJlZS1saXN0JztcbmltcG9ydCB7IEN1aUNhdGVnb3J5VHJlZUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9jYXRlZ29yeS10cmVlLWZvcm0nO1xuaW1wb3J0IHsgQ3VpQ3JlYXRlQ2F0ZWdvcnlUcmVlSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS1jYXRlZ29yeS10cmVlLWl0ZW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2N1aS1jYXRlZ29yeS10cmVlLWl0ZW0nLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ3VpQnV0dG9uTW9kdWxlLFxuICAgICAgICBDdWlJY29uQnV0dG9uTW9kdWxlLFxuICAgICAgICBDdWlMZXREaXJlY3RpdmUsXG4gICAgICAgIEN1aVN2Z01vZHVsZSxcbiAgICAgICAgQ3VpQ2F0ZWdvcnlUcmVlRm9ybUNvbXBvbmVudCxcbiAgICAgICAgQ3VpQ3JlYXRlQ2F0ZWdvcnlUcmVlSXRlbUNvbXBvbmVudCxcbiAgICAgICAgZm9yd2FyZFJlZigoKSA9PiBDdWlDYXRlZ29yaWVzVHJlZUxpc3RDb21wb25lbnQpXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXRlZ29yeS10cmVlLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYXRlZ29yeS10cmVlLWl0ZW0uY29tcG9uZW50LnNjc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1aUNhdGVnb3J5VHJlZUl0ZW1Db21wb25lbnQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGVnb3JpZXNEYXRhU291cmNlU2VydmljZSA9IGluamVjdChDVUlfQ0FURUdPUklFU19UUkVFX0RBVEFfU09VUkNFX1NFUlZJQ0VfVE9LRU4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlID0gaW5qZWN0KEN1aUNhdGVnb3J5VHJlZVN0YXRlU2VydmljZSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNEZWxldGVTdXBwb3J0ZWQgPSAhIXRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlLmRlbGV0ZTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlQ2hpbGRyZW4gPSBzaWduYWw8VHJlZVN0cnVjdFtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFyZUNoaWxkcmVuT3BlbmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTdWJjYXRlZ29yeUNyZWF0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRGVsZXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcGVuQ2xvc2VCdXR0b25JY29uID0gY29tcHV0ZWQ8Q3VpSWNvbj4oKCkgPT5cbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZCgpID8gJ2N1aUljb25DaGV2cm9uRG93bicgOiAnY3VpSWNvbkNoZXZyb25SaWdodCdcbiAgICApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkb0NoaWxkcmVuRXhpc3QgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5zdG9yYWdlKCkuY2hpbGRyZW4ubGVuZ3RoIHx8IHRoaXMuc3RvcmFnZUNoaWxkcmVuKCkubGVuZ3RoXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuQ2xvc2VCdXR0b25IaWRkZW4gPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5kb0NoaWxkcmVuRXhpc3QoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VJY29uID0gY29tcHV0ZWQ8Q3VpSWNvbj4oKCkgPT5cbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZCgpICYmIHRoaXMuZG9DaGlsZHJlbkV4aXN0KCkgPyAnY3VpSWNvbkZvbGRlck9wZW4nIDogJ2N1aUljb25Gb2xkZXInXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxpZ25JdGVtcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzVGl0bGVFZGl0KCkgPyAnZmxleC1zdGFydCcgOiAnY2VudGVyJykpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RpdGxlRWRpdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmVkaXRpbmdJZCgpID09PSB0aGlzLnN0b3JhZ2UoKS5pZCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQ3JlYXRlQ2F0ZWdvcnlDb250cm9sVmlzaWJsZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgKHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNyZWF0aW5nUGFyZW50SWQoKSA9PT0gdGhpcy5zdG9yYWdlKCkuaWQgJiYgdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpbmcoKSkgfHxcbiAgICAgICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZygpXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbXB0eSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiAhdGhpcy5zdG9yYWdlKCkuZWxlbWVudHMubGVuZ3RoICYmICF0aGlzLnN0b3JhZ2UoKS5jaGlsZHJlbi5sZW5ndGggJiYgIXRoaXMuc3RvcmFnZUNoaWxkcmVuKCkubGVuZ3RoXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2F0ZWdvcnlUaXRsZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2F0ZWdvcnkgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAuLi50aGlzLnN0b3JhZ2UoKSxcbiAgICAgICAgdGl0bGU6IHRoaXMuY2F0ZWdvcnlUaXRsZSgpIHx8IHRoaXMuc3RvcmFnZSgpLnRpdGxlXG4gICAgfSkpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2UgPSBpbnB1dC5yZXF1aXJlZDxUcmVlU3RydWN0PigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JhZ2VDaGlsZHJlbigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblNlbGVjdENhdGVnb3J5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhdGVnb3J5VHJlZVN0YXRlU2VydmljZS5zZXRDdXJyZW50Q2F0ZWdvcnkodGhpcy5jYXRlZ29yeSgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Ub2dnbGVDaGlsZHJlbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLmFyZUNoaWxkcmVuT3BlbmVkLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJlQ2hpbGRyZW5PcGVuZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25UaXRsZUNoYW5nZWQodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2FuY2VsVGl0bGVFZGl0KCk7XG5cbiAgICAgICAgaWYgKHRpdGxlID09PSB0aGlzLmNhdGVnb3J5KCkudGl0bGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlVGl0bGUodGhpcy5zdG9yYWdlKCkuaWQsIHRpdGxlKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5VGl0bGUuc2V0KHRpdGxlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhdGVnb3J5KCkuaWQgPT09IHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNhdGVnb3J5KCk/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnNldEN1cnJlbnRDYXRlZ29yeSh0aGlzLmNhdGVnb3J5KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblN0YXJ0VGl0bGVFZGl0KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnNldEVkaXRpbmdJZCh0aGlzLnN0b3JhZ2UoKS5pZCk7XG4gICAgICAgIHRoaXMub25DcmVhdGluZ1N1YmNhdGVnb3J5Q2FuY2VsZWQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DYW5jZWxUaXRsZUVkaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNsZWFyRWRpdGluZ0lkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhcnRDcmVhdGluZ1N1YmNhdGVnb3J5KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnN0YXJ0Q3JlYXRpbmdDaGlsZE9mKHRoaXMuc3RvcmFnZSgpLmlkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DcmVhdGVOZXdTdWJjYXRlZ29yeSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgICAgICAuY3JlYXRlQ2hpbGQodGhpcy5zdG9yYWdlKCkuaWQsIHRpdGxlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpb25Mb2FkaW5nLnNldChmYWxzZSkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzdG9yYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlQ2hpbGRyZW4udXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBzdG9yYWdlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DcmVhdGluZ1N1YmNhdGVnb3J5Q2FuY2VsZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNsZWFyQ3JlYXRpbmcoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EZWxldGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlLmRlbGV0ZTtcblxuICAgICAgICBpZiAoIWRlbGV0ZVJlcXVlc3QgfHwgIXRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuaXNEZWxldGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRGVsZXRpbmcuc2V0KHRydWUpO1xuICAgICAgICBkZWxldGVSZXF1ZXN0XG4gICAgICAgICAgICAuY2FsbCh0aGlzLmNhdGVnb3JpZXNEYXRhU291cmNlU2VydmljZSwgdGhpcy5zdG9yYWdlKCkuaWQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzRGVsZXRpbmcuc2V0KGZhbHNlKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kZWxldGVkLmVtaXQodGhpcy5zdG9yYWdlKCkuaWQpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DaGlsZERlbGV0ZWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JhZ2VDaGlsZHJlbi51cGRhdGUoKGNoaWxkcmVuKSA9PiBjaGlsZHJlbi5maWx0ZXIoKGNoaWxkKSA9PiBjaGlsZC5pZCAhPT0gaWQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTdG9yYWdlQ2hpbGRyZW4oKTogdm9pZCB7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXJlQ2hpbGRyZW5PcGVuZWQoKSB8fCB0aGlzLnN0b3JhZ2VDaGlsZHJlbigpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc3RvcmFnZS5jaGlsZHJlbjtcblxuICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuWzBdICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2VDaGlsZHJlbi5zZXQoY2hpbGRyZW4gYXMgVHJlZVN0cnVjdFtdKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yaWVzRGF0YVNvdXJjZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmxvYWRDaGlsZHJlbihzdG9yYWdlLmlkKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RvcmFnZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZUNoaWxkcmVuLnNldChzdG9yYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKmN1aUxldD1cImNhdGVnb3J5KCkgYXMgc3RhZ2VcIj5cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbc3R5bGUuYWxpZ24taXRlbXNdPVwiYWxpZ25JdGVtcygpXCJcbiAgICAgICAgY2xhc3M9XCJjYXRlZ29yeVwiXG4gICAgICAgIChjbGljayk9XCJvblNlbGVjdENhdGVnb3J5KClcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5X19vcGVuLWNsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICBbY2xhc3MuY2F0ZWdvcnlfX29wZW4tY2xvc2UtYnV0dG9uX2hpZGRlbl09XCJpc09wZW5DbG9zZUJ1dHRvbkhpZGRlbigpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZUNoaWxkcmVuKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8Y3VpLXN2Z1xuICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wZW5DbG9zZUJ1dHRvbkljb24oKVwiXG4gICAgICAgICAgICAgICAgY29sb3I9XCJ2YXIoLS1jdWktYmFzZS01MDApXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8Y3VpLXN2Z1xuICAgICAgICAgICAgW2ljb25dPVwic3RvcmFnZUljb24oKVwiXG4gICAgICAgICAgICBjb2xvcj1cInZhcigtLWN1aS1iYXNlLTUwMClcIlxuICAgICAgICAgICAgY2xhc3M9XCJpY29uXCJcbiAgICAgICAgLz5cbiAgICAgICAgQGlmIChpc1RpdGxlRWRpdCgpKSB7XG4gICAgICAgICAgICA8Y3VpLWNhdGVnb3J5LXRyZWUtZm9ybVxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGl0bGVdPVwic3RhZ2UudGl0bGVcIlxuICAgICAgICAgICAgICAgIChjcmVhdGVkKT1cIm9uVGl0bGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjYW5jZWxlZCk9XCJvbkNhbmNlbFRpdGxlRWRpdCgpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeV9fdGl0bGVcIj57eyBzdGFnZS50aXRsZSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGN1aUJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInh4c1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cImN1aUljb25FZGl0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5X19hZGQtc3ViY2F0ZWdvcnktYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdGFydFRpdGxlRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjdWlCdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4eHNcIlxuICAgICAgICAgICAgICAgIGljb249XCJjdWlJY29uUGx1c1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeV9fYWRkLXN1YmNhdGVnb3J5LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3RhcnRDcmVhdGluZ1N1YmNhdGVnb3J5KCRldmVudClcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmIChpc0RlbGV0ZVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY3VpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwieHhzXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImN1aUljb25UcmFzaFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFbXB0eSgpIHx8IGlzRGVsZXRpbmcoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnlfX2FkZC1zdWJjYXRlZ29yeS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9idXR0b24+XG4gICAgPGRpdlxuICAgICAgICBbaGlkZGVuXT1cIiFhcmVDaGlsZHJlbk9wZW5lZCgpXCJcbiAgICAgICAgY2xhc3M9XCJsaXN0LXdyYXBwZXJcIlxuICAgID5cbiAgICAgICAgPGN1aS1jYXRlZ29yaWVzLXRyZWUtbGlzdFxuICAgICAgICAgICAgW3N0b3JhZ2VzXT1cInN0b3JhZ2VDaGlsZHJlbigpXCJcbiAgICAgICAgICAgIChkZWxldGVkKT1cIm9uQ2hpbGREZWxldGVkKCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKGlzQ3JlYXRlQ2F0ZWdvcnlDb250cm9sVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICA8Y3VpLWNyZWF0ZS1jYXRlZ29yeS10cmVlLWl0ZW1cbiAgICAgICAgICAgICAgICBjbGFzcz1cImNyZWF0ZS1jYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgW2lzRGlzYWJsZWRdPVwiaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAoY3JlYXRlZCk9XCJvbkNyZWF0ZU5ld1N1YmNhdGVnb3J5KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjYW5jZWxlZCk9XCJvbkNyZWF0aW5nU3ViY2F0ZWdvcnlDYW5jZWxlZCgpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy91aS9jYXRlZ29yaWVzLXRyZWUvY29tcG9uZW50cy9jYXRlZ29yeS10cmVlLWl0ZW0vY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvd2lkZ2V0cy91aS9jYXRlZ29yaWVzLXRyZWUvY29tcG9uZW50cy9jYXRlZ29yeS10cmVlLWl0ZW0vY2F0ZWdvcnktdHJlZS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSw2Q0FBNkMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RSxPQUFP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QUMsQ0FBQztZQUVuRCxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQywyQkFBMkI7YUFDM0IsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7YUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQzsrR0F4TFEsNEJBQTRCO21HQUE1Qiw0QkFBNEIsNFBDM0N6QyxxcEZBaUZBLDI1QkRuRFEsZUFBZSw2UUFDZixtQkFBbUIsb0RBQ25CLGVBQWUsNkZBQ2YsWUFBWSxrTkFDWiw0QkFBNEIsa0tBQzVCLGtDQUFrQyx5SkFDakIsOEJBQThCOzs0RkFPMUMsNEJBQTRCO2tCQWhCeEMsU0FBUzsrQkFDSSx3QkFBd0IsV0FDekI7d0JBQ0wsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWiw0QkFBNEI7d0JBQzVCLGtDQUFrQzt3QkFDbEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUE4QixDQUFDO3FCQUNuRCxjQUNXLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgZWZmZWN0LFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdW50cmFja2VkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ3VpTGV0RGlyZWN0aXZlIH0gZnJvbSAnQGN1YnktdWkvY2RrJztcbmltcG9ydCB0eXBlIHsgVHJlZVN0cnVjdCB9IGZyb20gJ0BjdWJ5LXVpL2FwaSc7XG5pbXBvcnQgdHlwZSB7IEN1aUljb24gfSBmcm9tICdAY3VieS11aS9pY29ucyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDdWlCdXR0b25Nb2R1bGUsIEN1aURpYWxvZ1NlcnZpY2UsIEN1aUljb25CdXR0b25Nb2R1bGUsIEN1aVN2Z01vZHVsZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQ3VpRGVsZXRlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kZWxldGUtbW9kYWwnO1xuaW1wb3J0IHsgQ1VJX0NBVEVHT1JJRVNfVFJFRV9EQVRBX1NPVVJDRV9TRVJWSUNFX1RPS0VOIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEN1aUNhdGVnb3J5VHJlZVN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEN1aUNhdGVnb3JpZXNUcmVlTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL2NhdGVnb3JpZXMtdHJlZS1saXN0JztcbmltcG9ydCB7IEN1aUNhdGVnb3J5VHJlZUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9jYXRlZ29yeS10cmVlLWZvcm0nO1xuaW1wb3J0IHsgQ3VpQ3JlYXRlQ2F0ZWdvcnlUcmVlSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS1jYXRlZ29yeS10cmVlLWl0ZW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2N1aS1jYXRlZ29yeS10cmVlLWl0ZW0nLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ3VpQnV0dG9uTW9kdWxlLFxuICAgICAgICBDdWlJY29uQnV0dG9uTW9kdWxlLFxuICAgICAgICBDdWlMZXREaXJlY3RpdmUsXG4gICAgICAgIEN1aVN2Z01vZHVsZSxcbiAgICAgICAgQ3VpQ2F0ZWdvcnlUcmVlRm9ybUNvbXBvbmVudCxcbiAgICAgICAgQ3VpQ3JlYXRlQ2F0ZWdvcnlUcmVlSXRlbUNvbXBvbmVudCxcbiAgICAgICAgZm9yd2FyZFJlZigoKSA9PiBDdWlDYXRlZ29yaWVzVHJlZUxpc3RDb21wb25lbnQpXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXRlZ29yeS10cmVlLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYXRlZ29yeS10cmVlLWl0ZW0uY29tcG9uZW50LnNjc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEN1aUNhdGVnb3J5VHJlZUl0ZW1Db21wb25lbnQge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGVnb3JpZXNEYXRhU291cmNlU2VydmljZSA9IGluamVjdChDVUlfQ0FURUdPUklFU19UUkVFX0RBVEFfU09VUkNFX1NFUlZJQ0VfVE9LRU4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlID0gaW5qZWN0KEN1aUNhdGVnb3J5VHJlZVN0YXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdWlEaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEN1aURpYWxvZ1NlcnZpY2UpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRGVsZXRlU3VwcG9ydGVkID0gISF0aGlzLmNhdGVnb3JpZXNEYXRhU291cmNlU2VydmljZS5kZWxldGU7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZUNoaWxkcmVuID0gc2lnbmFsPFRyZWVTdHJ1Y3RbXT4oW10pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhcmVDaGlsZHJlbk9wZW5lZCA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU3ViY2F0ZWdvcnlDcmVhdGluZyA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU3ViY2F0ZWdvcnlDcmVhdGlvbkxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcGVuQ2xvc2VCdXR0b25JY29uID0gY29tcHV0ZWQ8Q3VpSWNvbj4oKCkgPT5cbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZCgpID8gJ2N1aUljb25DaGV2cm9uRG93bicgOiAnY3VpSWNvbkNoZXZyb25SaWdodCdcbiAgICApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkb0NoaWxkcmVuRXhpc3QgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5zdG9yYWdlKCkuY2hpbGRyZW4ubGVuZ3RoIHx8IHRoaXMuc3RvcmFnZUNoaWxkcmVuKCkubGVuZ3RoXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuQ2xvc2VCdXR0b25IaWRkZW4gPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5kb0NoaWxkcmVuRXhpc3QoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VJY29uID0gY29tcHV0ZWQ8Q3VpSWNvbj4oKCkgPT5cbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZCgpICYmIHRoaXMuZG9DaGlsZHJlbkV4aXN0KCkgPyAnY3VpSWNvbkZvbGRlck9wZW4nIDogJ2N1aUljb25Gb2xkZXInXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxpZ25JdGVtcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzVGl0bGVFZGl0KCkgPyAnZmxleC1zdGFydCcgOiAnY2VudGVyJykpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RpdGxlRWRpdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmVkaXRpbmdJZCgpID09PSB0aGlzLnN0b3JhZ2UoKS5pZCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQ3JlYXRlQ2F0ZWdvcnlDb250cm9sVmlzaWJsZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgKHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNyZWF0aW5nUGFyZW50SWQoKSA9PT0gdGhpcy5zdG9yYWdlKCkuaWQgJiYgdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpbmcoKSkgfHxcbiAgICAgICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZygpXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbXB0eSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgIXRoaXMuc3RvcmFnZSgpLmVsZW1lbnRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgKHRoaXMuYXJlQ2hpbGRyZW5PcGVuZWQoKSA/ICF0aGlzLnN0b3JhZ2VDaGlsZHJlbigpLmxlbmd0aCA6ICF0aGlzLnN0b3JhZ2UoKS5jaGlsZHJlbi5sZW5ndGgpXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2F0ZWdvcnlUaXRsZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2F0ZWdvcnkgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAuLi50aGlzLnN0b3JhZ2UoKSxcbiAgICAgICAgdGl0bGU6IHRoaXMuY2F0ZWdvcnlUaXRsZSgpIHx8IHRoaXMuc3RvcmFnZSgpLnRpdGxlXG4gICAgfSkpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2UgPSBpbnB1dC5yZXF1aXJlZDxUcmVlU3RydWN0PigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5pdFN0b3JhZ2VDaGlsZHJlbigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblNlbGVjdENhdGVnb3J5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhdGVnb3J5VHJlZVN0YXRlU2VydmljZS5zZXRDdXJyZW50Q2F0ZWdvcnkodGhpcy5jYXRlZ29yeSgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Ub2dnbGVDaGlsZHJlbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLmFyZUNoaWxkcmVuT3BlbmVkLnVwZGF0ZSgodmFsdWUpID0+ICF2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJlQ2hpbGRyZW5PcGVuZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25UaXRsZUNoYW5nZWQodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2FuY2VsVGl0bGVFZGl0KCk7XG5cbiAgICAgICAgaWYgKHRpdGxlID09PSB0aGlzLmNhdGVnb3J5KCkudGl0bGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlVGl0bGUodGhpcy5zdG9yYWdlKCkuaWQsIHRpdGxlKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5VGl0bGUuc2V0KHRpdGxlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhdGVnb3J5KCkuaWQgPT09IHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNhdGVnb3J5KCk/LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnNldEN1cnJlbnRDYXRlZ29yeSh0aGlzLmNhdGVnb3J5KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblN0YXJ0VGl0bGVFZGl0KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnNldEVkaXRpbmdJZCh0aGlzLnN0b3JhZ2UoKS5pZCk7XG4gICAgICAgIHRoaXMub25DcmVhdGluZ1N1YmNhdGVnb3J5Q2FuY2VsZWQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DYW5jZWxUaXRsZUVkaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNsZWFyRWRpdGluZ0lkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhcnRDcmVhdGluZ1N1YmNhdGVnb3J5KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5hcmVDaGlsZHJlbk9wZW5lZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLnN0YXJ0Q3JlYXRpbmdDaGlsZE9mKHRoaXMuc3RvcmFnZSgpLmlkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DcmVhdGVOZXdTdWJjYXRlZ29yeSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW9uTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlXG4gICAgICAgICAgICAuY3JlYXRlQ2hpbGQodGhpcy5zdG9yYWdlKCkuaWQsIHRpdGxlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc1N1YmNhdGVnb3J5Q3JlYXRpb25Mb2FkaW5nLnNldChmYWxzZSkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzdG9yYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlQ2hpbGRyZW4udXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBzdG9yYWdlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25DcmVhdGluZ1N1YmNhdGVnb3J5Q2FuY2VsZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTdWJjYXRlZ29yeUNyZWF0aW5nLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlUcmVlU3RhdGVTZXJ2aWNlLmNsZWFyQ3JlYXRpbmcoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EZWxldGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IHRoaXMuY2F0ZWdvcmllc0RhdGFTb3VyY2VTZXJ2aWNlLmRlbGV0ZTtcblxuICAgICAgICBpZiAoIWRlbGV0ZVJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VpRGlhbG9nU2VydmljZVxuICAgICAgICAgICAgLm9wZW4oQ3VpRGVsZXRlTW9kYWxDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnREVMRVRFX0NBVEVHT1JZX1FVRVNUSU9OJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogWydBQ1RJT05fV0lMTF9ERUxFVEVfQ0FURUdPUlknXSxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlOiAoKSA9PiBkZWxldGVSZXF1ZXN0LmNhbGwodGhpcy5jYXRlZ29yaWVzRGF0YVNvdXJjZVNlcnZpY2UsIHRoaXMuc3RvcmFnZSgpLmlkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YT8uY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZC5lbWl0KHRoaXMuc3RvcmFnZSgpLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkNoaWxkRGVsZXRlZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNoaWxkcmVuLnVwZGF0ZSgoY2hpbGRyZW4pID0+IGNoaWxkcmVuLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkLmlkICE9PSBpZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFN0b3JhZ2VDaGlsZHJlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWZmZWN0UmVmID0gZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hcmVDaGlsZHJlbk9wZW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlZmZlY3RSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmxvYWRDaGlsZHJlbigpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRDaGlsZHJlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuc3RvcmFnZSgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHN0b3JhZ2UuY2hpbGRyZW47XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW5bMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VDaGlsZHJlbi5zZXQoY2hpbGRyZW4gYXMgVHJlZVN0cnVjdFtdKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzRGF0YVNvdXJjZVNlcnZpY2VcbiAgICAgICAgICAgIC5sb2FkQ2hpbGRyZW4oc3RvcmFnZS5pZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc3RvcmFnZXMpID0+IHRoaXMuc3RvcmFnZUNoaWxkcmVuLnNldChzdG9yYWdlcykpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKmN1aUxldD1cImNhdGVnb3J5KCkgYXMgc3RhZ2VcIj5cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbc3R5bGUuYWxpZ24taXRlbXNdPVwiYWxpZ25JdGVtcygpXCJcbiAgICAgICAgY2xhc3M9XCJjYXRlZ29yeVwiXG4gICAgICAgIChjbGljayk9XCJvblNlbGVjdENhdGVnb3J5KClcIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzLnRvZ2dsZS1idXR0b25faGlkZGVuXT1cImlzT3BlbkNsb3NlQnV0dG9uSGlkZGVuKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlQ2hpbGRyZW4oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxjdWktc3ZnXG4gICAgICAgICAgICAgICAgW2ljb25dPVwib3BlbkNsb3NlQnV0dG9uSWNvbigpXCJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInZhcigtLWN1aS1iYXNlLTUwMClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxjdWktc3ZnXG4gICAgICAgICAgICBbaWNvbl09XCJzdG9yYWdlSWNvbigpXCJcbiAgICAgICAgICAgIGNvbG9yPVwidmFyKC0tY3VpLWJhc2UtNTAwKVwiXG4gICAgICAgICAgICBjbGFzcz1cImljb25cIlxuICAgICAgICAvPlxuICAgICAgICBAaWYgKGlzVGl0bGVFZGl0KCkpIHtcbiAgICAgICAgICAgIDxjdWktY2F0ZWdvcnktdHJlZS1mb3JtXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRUaXRsZV09XCJzdGFnZS50aXRsZVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZWQpPVwib25UaXRsZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNhbmNlbGVkKT1cIm9uQ2FuY2VsVGl0bGVFZGl0KClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sgc3RhZ2UudGl0bGUgfX08L3NwYW4+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjdWlCdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4eHNcIlxuICAgICAgICAgICAgICAgIGljb249XCJjdWlJY29uRWRpdFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gZWRpdC1idXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN0YXJ0VGl0bGVFZGl0KCRldmVudClcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGN1aUJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInh4c1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cImN1aUljb25QbHVzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBhZGQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdGFydENyZWF0aW5nU3ViY2F0ZWdvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKGlzRGVsZXRlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjdWlCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJ4eHNcIlxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiY3VpSWNvblRyYXNoXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gZGVsZXRlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2XG4gICAgICAgIFtoaWRkZW5dPVwiIWFyZUNoaWxkcmVuT3BlbmVkKClcIlxuICAgICAgICBjbGFzcz1cImxpc3Qtd3JhcHBlclwiXG4gICAgPlxuICAgICAgICA8Y3VpLWNhdGVnb3JpZXMtdHJlZS1saXN0XG4gICAgICAgICAgICBbc3RvcmFnZXNdPVwic3RvcmFnZUNoaWxkcmVuKClcIlxuICAgICAgICAgICAgKGRlbGV0ZWQpPVwib25DaGlsZERlbGV0ZWQoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIEBpZiAoaXNDcmVhdGVDYXRlZ29yeUNvbnRyb2xWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgIDxjdWktY3JlYXRlLWNhdGVnb3J5LXRyZWUtaXRlbVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3JlYXRlLWNhdGVnb3J5XCJcbiAgICAgICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJpc1N1YmNhdGVnb3J5Q3JlYXRpb25Mb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIChjcmVhdGVkKT1cIm9uQ3JlYXRlTmV3U3ViY2F0ZWdvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNhbmNlbGVkKT1cIm9uQ3JlYXRpbmdTdWJjYXRlZ29yeUNhbmNlbGVkKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
@@ -9876,12 +9876,12 @@ class CuiCategoryTreeItemComponent {
|
|
|
9876
9876
|
this.destroyRef = inject(DestroyRef);
|
|
9877
9877
|
this.categoriesDataSourceService = inject(CUI_CATEGORIES_TREE_DATA_SOURCE_SERVICE_TOKEN);
|
|
9878
9878
|
this.categoryTreeStateService = inject(CuiCategoryTreeStateService);
|
|
9879
|
+
this.cuiDialogService = inject(CuiDialogService);
|
|
9879
9880
|
this.isDeleteSupported = !!this.categoriesDataSourceService.delete;
|
|
9880
9881
|
this.storageChildren = signal([]);
|
|
9881
9882
|
this.areChildrenOpened = signal(false);
|
|
9882
9883
|
this.isSubcategoryCreating = signal(false);
|
|
9883
9884
|
this.isSubcategoryCreationLoading = signal(false);
|
|
9884
|
-
this.isDeleting = signal(false);
|
|
9885
9885
|
this.openCloseButtonIcon = computed(() => this.areChildrenOpened() ? 'cuiIconChevronDown' : 'cuiIconChevronRight');
|
|
9886
9886
|
this.doChildrenExist = computed(() => this.storage().children.length || this.storageChildren().length);
|
|
9887
9887
|
this.isOpenCloseButtonHidden = computed(() => !this.doChildrenExist());
|
|
@@ -9890,7 +9890,8 @@ class CuiCategoryTreeItemComponent {
|
|
|
9890
9890
|
this.isTitleEdit = computed(() => this.categoryTreeStateService.editingId() === this.storage().id);
|
|
9891
9891
|
this.isCreateCategoryControlVisible = computed(() => (this.categoryTreeStateService.creatingParentId() === this.storage().id && this.isSubcategoryCreating()) ||
|
|
9892
9892
|
this.isSubcategoryCreationLoading());
|
|
9893
|
-
this.isEmpty = computed(() => !this.storage().elements.length &&
|
|
9893
|
+
this.isEmpty = computed(() => !this.storage().elements.length &&
|
|
9894
|
+
(this.areChildrenOpened() ? !this.storageChildren().length : !this.storage().children.length));
|
|
9894
9895
|
this.categoryTitle = signal('');
|
|
9895
9896
|
this.category = computed(() => ({
|
|
9896
9897
|
...this.storage(),
|
|
@@ -9957,42 +9958,54 @@ class CuiCategoryTreeItemComponent {
|
|
|
9957
9958
|
onDelete(event) {
|
|
9958
9959
|
event.stopPropagation();
|
|
9959
9960
|
const deleteRequest = this.categoriesDataSourceService.delete;
|
|
9960
|
-
if (!deleteRequest
|
|
9961
|
+
if (!deleteRequest) {
|
|
9961
9962
|
return;
|
|
9962
9963
|
}
|
|
9963
|
-
this.
|
|
9964
|
-
|
|
9965
|
-
|
|
9966
|
-
|
|
9967
|
-
|
|
9964
|
+
this.cuiDialogService
|
|
9965
|
+
.open(CuiDeleteModalComponent, {
|
|
9966
|
+
data: {
|
|
9967
|
+
title: 'DELETE_CATEGORY_QUESTION',
|
|
9968
|
+
content: ['ACTION_WILL_DELETE_CATEGORY'],
|
|
9969
|
+
delete: () => deleteRequest.call(this.categoriesDataSourceService, this.storage().id)
|
|
9970
|
+
}
|
|
9971
|
+
})
|
|
9972
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
9973
|
+
.subscribe((data) => {
|
|
9974
|
+
if (data?.canceled) {
|
|
9975
|
+
return;
|
|
9976
|
+
}
|
|
9977
|
+
this.deleted.emit(this.storage().id);
|
|
9978
|
+
});
|
|
9968
9979
|
}
|
|
9969
9980
|
onChildDeleted(id) {
|
|
9970
9981
|
this.storageChildren.update((children) => children.filter((child) => child.id !== id));
|
|
9971
9982
|
}
|
|
9972
9983
|
initStorageChildren() {
|
|
9973
|
-
effect(() => {
|
|
9974
|
-
if (!this.areChildrenOpened()
|
|
9975
|
-
return;
|
|
9976
|
-
}
|
|
9977
|
-
const storage = this.storage();
|
|
9978
|
-
const children = storage.children;
|
|
9979
|
-
if (!children.length) {
|
|
9980
|
-
return;
|
|
9981
|
-
}
|
|
9982
|
-
if (typeof children[0] !== 'string') {
|
|
9983
|
-
this.storageChildren.set(children);
|
|
9984
|
+
const effectRef = effect(() => {
|
|
9985
|
+
if (!this.areChildrenOpened()) {
|
|
9984
9986
|
return;
|
|
9985
9987
|
}
|
|
9986
|
-
|
|
9987
|
-
|
|
9988
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
9989
|
-
.subscribe((storages) => {
|
|
9990
|
-
this.storageChildren.set(storages);
|
|
9991
|
-
});
|
|
9988
|
+
effectRef.destroy();
|
|
9989
|
+
untracked(() => this.loadChildren());
|
|
9992
9990
|
}, { allowSignalWrites: true });
|
|
9993
9991
|
}
|
|
9992
|
+
loadChildren() {
|
|
9993
|
+
const storage = this.storage();
|
|
9994
|
+
const children = storage.children;
|
|
9995
|
+
if (!children.length) {
|
|
9996
|
+
return;
|
|
9997
|
+
}
|
|
9998
|
+
if (typeof children[0] !== 'string') {
|
|
9999
|
+
this.storageChildren.set(children);
|
|
10000
|
+
return;
|
|
10001
|
+
}
|
|
10002
|
+
this.categoriesDataSourceService
|
|
10003
|
+
.loadChildren(storage.id)
|
|
10004
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
10005
|
+
.subscribe((storages) => this.storageChildren.set(storages));
|
|
10006
|
+
}
|
|
9994
10007
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCategoryTreeItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9995
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCategoryTreeItemComponent, isStandalone: true, selector: "cui-category-tree-item", inputs: { storage: { classPropertyName: "storage", publicName: "storage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"
|
|
10008
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CuiCategoryTreeItemComponent, isStandalone: true, selector: "cui-category-tree-item", inputs: { storage: { classPropertyName: "storage", publicName: "storage", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { deleted: "deleted" }, ngImport: i0, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"toggle-button\"\n [class.toggle-button_hidden]=\"isOpenCloseButtonHidden()\"\n (click)=\"onToggleChildren($event)\"\n >\n <cui-svg\n [icon]=\"openCloseButtonIcon()\"\n color=\"var(--cui-base-500)\"\n />\n </button>\n <cui-svg\n [icon]=\"storageIcon()\"\n color=\"var(--cui-base-500)\"\n class=\"icon\"\n />\n @if (isTitleEdit()) {\n <cui-category-tree-form\n [defaultTitle]=\"stage.title\"\n (created)=\"onTitleChanged($event)\"\n (canceled)=\"onCancelTitleEdit()\"\n />\n } @else {\n <span class=\"title\">{{ stage.title }}</span>\n\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconEdit\"\n class=\"button edit-button\"\n (click)=\"onStartTitleEdit($event)\"\n ></button>\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconPlus\"\n class=\"button add-button\"\n (click)=\"onStartCreatingSubcategory($event)\"\n ></button>\n @if (isDeleteSupported) {\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconTrash\"\n class=\"button delete-button\"\n (click)=\"onDelete($event)\"\n ></button>\n }\n }\n </button>\n <div\n [hidden]=\"!areChildrenOpened()\"\n class=\"list-wrapper\"\n >\n <cui-categories-tree-list\n [storages]=\"storageChildren()\"\n (deleted)=\"onChildDeleted($event)\"\n />\n @if (isCreateCategoryControlVisible()) {\n <cui-create-category-tree-item\n class=\"create-category\"\n [isDisabled]=\"isSubcategoryCreationLoading()\"\n (created)=\"onCreateNewSubcategory($event)\"\n (canceled)=\"onCreatingSubcategoryCanceled()\"\n />\n }\n </div>\n</ng-container>\n", styles: [".category{display:flex;flex-direction:row;gap:4px;padding:2px 4px;width:100%;min-height:32px;border-radius:8px}@media (hover: hover){.category:hover{background:var(--cui-base-10)}.category:hover .delete-button{display:inline-block}}.category:active{background:var(--cui-base-10)}.toggle-button{display:flex;flex-direction:row;gap:0;padding:2px;border-radius:4px;margin:4px 0}@media (hover: hover){.toggle-button:hover{background:var(--cui-base-100)}}.toggle-button:active{background:var(--cui-base-100)}.toggle-button_hidden{visibility:hidden}.title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:start}.button{--cui-base-50: var(--cui-base-200)}@media (hover: hover){.delete-button{display:none}}.list-wrapper{padding-left:8px}.create-category{margin-left:24px}.icon{padding-right:2px;padding-left:2px;height:28px}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CuiButtonModule) }, { kind: "component", type: i0.forwardRef(() => CuiButtonComponent), selector: "button[cuiButton], a[cuiButton]", inputs: ["shape", "disabled", "isLoaderShown", "icon", "iconRight", "appearance", "theme", "size"] }, { kind: "ngmodule", type: i0.forwardRef(() => CuiIconButtonModule) }, { kind: "directive", type: i0.forwardRef(() => CuiLetDirective), selector: "[cuiLet]", inputs: ["cuiLet"] }, { kind: "ngmodule", type: i0.forwardRef(() => CuiSvgModule) }, { kind: "component", type: i0.forwardRef(() => CuiSvgComponent), selector: "cui-svg[icon]", inputs: ["width", "height", "strokeWidth", "color", "icon"] }, { kind: "component", type: i0.forwardRef(() => CuiCategoryTreeFormComponent), selector: "cui-category-tree-form", inputs: ["isDisabled", "defaultTitle"], outputs: ["created", "canceled"] }, { kind: "component", type: i0.forwardRef(() => CuiCreateCategoryTreeItemComponent), selector: "cui-create-category-tree-item", inputs: ["isDisabled"], outputs: ["created", "canceled"] }, { kind: "component", type: i0.forwardRef(() => CuiCategoriesTreeListComponent), selector: "cui-categories-tree-list", inputs: ["storages"], outputs: ["deleted"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9996
10009
|
}
|
|
9997
10010
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CuiCategoryTreeItemComponent, decorators: [{
|
|
9998
10011
|
type: Component,
|
|
@@ -10004,7 +10017,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
10004
10017
|
CuiCategoryTreeFormComponent,
|
|
10005
10018
|
CuiCreateCategoryTreeItemComponent,
|
|
10006
10019
|
forwardRef(() => CuiCategoriesTreeListComponent)
|
|
10007
|
-
], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"
|
|
10020
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *cuiLet=\"category() as stage\">\n <button\n type=\"button\"\n [style.align-items]=\"alignItems()\"\n class=\"category\"\n (click)=\"onSelectCategory()\"\n >\n <button\n type=\"button\"\n class=\"toggle-button\"\n [class.toggle-button_hidden]=\"isOpenCloseButtonHidden()\"\n (click)=\"onToggleChildren($event)\"\n >\n <cui-svg\n [icon]=\"openCloseButtonIcon()\"\n color=\"var(--cui-base-500)\"\n />\n </button>\n <cui-svg\n [icon]=\"storageIcon()\"\n color=\"var(--cui-base-500)\"\n class=\"icon\"\n />\n @if (isTitleEdit()) {\n <cui-category-tree-form\n [defaultTitle]=\"stage.title\"\n (created)=\"onTitleChanged($event)\"\n (canceled)=\"onCancelTitleEdit()\"\n />\n } @else {\n <span class=\"title\">{{ stage.title }}</span>\n\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconEdit\"\n class=\"button edit-button\"\n (click)=\"onStartTitleEdit($event)\"\n ></button>\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconPlus\"\n class=\"button add-button\"\n (click)=\"onStartCreatingSubcategory($event)\"\n ></button>\n @if (isDeleteSupported) {\n <button\n cuiButton\n type=\"button\"\n appearance=\"ghost\"\n size=\"xxs\"\n icon=\"cuiIconTrash\"\n class=\"button delete-button\"\n (click)=\"onDelete($event)\"\n ></button>\n }\n }\n </button>\n <div\n [hidden]=\"!areChildrenOpened()\"\n class=\"list-wrapper\"\n >\n <cui-categories-tree-list\n [storages]=\"storageChildren()\"\n (deleted)=\"onChildDeleted($event)\"\n />\n @if (isCreateCategoryControlVisible()) {\n <cui-create-category-tree-item\n class=\"create-category\"\n [isDisabled]=\"isSubcategoryCreationLoading()\"\n (created)=\"onCreateNewSubcategory($event)\"\n (canceled)=\"onCreatingSubcategoryCanceled()\"\n />\n }\n </div>\n</ng-container>\n", styles: [".category{display:flex;flex-direction:row;gap:4px;padding:2px 4px;width:100%;min-height:32px;border-radius:8px}@media (hover: hover){.category:hover{background:var(--cui-base-10)}.category:hover .delete-button{display:inline-block}}.category:active{background:var(--cui-base-10)}.toggle-button{display:flex;flex-direction:row;gap:0;padding:2px;border-radius:4px;margin:4px 0}@media (hover: hover){.toggle-button:hover{background:var(--cui-base-100)}}.toggle-button:active{background:var(--cui-base-100)}.toggle-button_hidden{visibility:hidden}.title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:start}.button{--cui-base-50: var(--cui-base-200)}@media (hover: hover){.delete-button{display:none}}.list-wrapper{padding-left:8px}.create-category{margin-left:24px}.icon{padding-right:2px;padding-left:2px;height:28px}\n"] }]
|
|
10008
10021
|
}], ctorParameters: () => [] });
|
|
10009
10022
|
|
|
10010
10023
|
class CuiCategoriesTreeComponent {
|