@rolatech/angular-product 17.2.0 → 19.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{rolatech-angular-product-product-index.component-DEoLkyVK.mjs → rolatech-angular-product-product-index.component-Dy6tCxJf.mjs} +6 -7
- package/fesm2022/rolatech-angular-product-product-index.component-Dy6tCxJf.mjs.map +1 -0
- package/fesm2022/rolatech-angular-product.mjs +128 -171
- package/fesm2022/rolatech-angular-product.mjs.map +1 -1
- package/package.json +8 -6
- package/themes/_default.scss +1 -1
- package/esm2022/index.mjs +0 -7
- package/esm2022/lib/components/index.mjs +0 -12
- package/esm2022/lib/components/product-action/product-action.component.mjs +0 -32
- package/esm2022/lib/components/product-info/product-info.component.mjs +0 -19
- package/esm2022/lib/components/product-item/product-item.component.mjs +0 -17
- package/esm2022/lib/components/product-manage-option-add/product-manage-option-add.component.mjs +0 -68
- package/esm2022/lib/components/product-manage-option-item/product-manage-option-item.component.mjs +0 -49
- package/esm2022/lib/components/product-manage-variant/product-manage-variant.component.mjs +0 -127
- package/esm2022/lib/components/product-mange-option-action/product-manage-option-action.component.mjs +0 -22
- package/esm2022/lib/components/product-mange-section-item/product-mange-section-item.component.mjs +0 -89
- package/esm2022/lib/components/product-media/product-media.component.mjs +0 -34
- package/esm2022/lib/components/product-option/product-option.component.mjs +0 -23
- package/esm2022/lib/components/product-owner-renderer/product-owner-renderer.component.mjs +0 -20
- package/esm2022/lib/components/product-pricing/product-pricing.component.mjs +0 -31
- package/esm2022/lib/components/product-section/product-section.component.mjs +0 -26
- package/esm2022/lib/interfaces/category.mjs +0 -2
- package/esm2022/lib/interfaces/index.mjs +0 -2
- package/esm2022/lib/interfaces/product.mjs +0 -36
- package/esm2022/lib/pages/product/product-category/product-category.component.mjs +0 -73
- package/esm2022/lib/pages/product/product-details/product-details.component.mjs +0 -185
- package/esm2022/lib/pages/product/product-details/selected.pipe.mjs +0 -18
- package/esm2022/lib/pages/product/product-index/product-index.component.mjs +0 -43
- package/esm2022/lib/pages/product/product-layout/product-layout.component.mjs +0 -49
- package/esm2022/lib/pages/product/product.routes.mjs +0 -24
- package/esm2022/lib/pages/product-manage/product-manage-content/product-manage-content.component.mjs +0 -12
- package/esm2022/lib/pages/product-manage/product-manage-create/product-manage-create.component.mjs +0 -61
- package/esm2022/lib/pages/product-manage/product-manage-index/product-manage-index.component.mjs +0 -155
- package/esm2022/lib/pages/product-manage/product-manage-info/product-manage-info.component.mjs +0 -111
- package/esm2022/lib/pages/product-manage/product-manage-inventory/product-manage-inventory.component.mjs +0 -153
- package/esm2022/lib/pages/product-manage/product-manage-item/product-manage-item.component.mjs +0 -28
- package/esm2022/lib/pages/product-manage/product-manage-item-header/product-manage-item-header.component.mjs +0 -12
- package/esm2022/lib/pages/product-manage/product-manage-layout/product-manage-layout.component.mjs +0 -55
- package/esm2022/lib/pages/product-manage/product-manage-media/product-manage-media.component.mjs +0 -137
- package/esm2022/lib/pages/product-manage/product-manage-options/product-manage-options.component.mjs +0 -102
- package/esm2022/lib/pages/product-manage/product-manage-pricing/product-manage-pricing.component.mjs +0 -12
- package/esm2022/lib/pages/product-manage/product-manage-schedule/product-manage-schedule.component.mjs +0 -14
- package/esm2022/lib/pages/product-manage/product-manage-sections/product-manage-sections.component.mjs +0 -171
- package/esm2022/lib/pages/product-manage/product-manage-variants/product-manage-variants.component.mjs +0 -130
- package/esm2022/lib/pages/product-manage/product-manage.routes.mjs +0 -60
- package/esm2022/lib/services/index.mjs +0 -2
- package/esm2022/provider.mjs +0 -11
- package/esm2022/rolatech-angular-product.mjs +0 -5
- package/fesm2022/rolatech-angular-product-product-index.component-DEoLkyVK.mjs.map +0 -1
- package/lib/components/product-mange-option-action/product-manage-option-action.component.d.ts +0 -10
package/esm2022/lib/pages/product-manage/product-manage-index/product-manage-index.component.mjs
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Component, inject, viewChild } from '@angular/core';
|
|
2
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
3
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
4
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
6
|
-
import { MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
|
|
7
|
-
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
8
|
-
import { MatTableModule, MatTableDataSource } from '@angular/material/table';
|
|
9
|
-
import { RouterLink } from '@angular/router';
|
|
10
|
-
import { ToolbarComponent, SpinnerComponent, ConfirmationDialogComponent } from '@rolatech/angular-components';
|
|
11
|
-
import { ProductService } from '@rolatech/angular-services';
|
|
12
|
-
import { ProductStatus } from '../../../interfaces';
|
|
13
|
-
import { ProductManageItemComponent } from '../product-manage-item/product-manage-item.component';
|
|
14
|
-
import { ProductManageItemHeaderComponent } from '../product-manage-item-header/product-manage-item-header.component';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/material/button";
|
|
17
|
-
import * as i2 from "@angular/material/icon";
|
|
18
|
-
import * as i3 from "@angular/material/paginator";
|
|
19
|
-
export class ProductManageIndexComponent {
|
|
20
|
-
constructor() {
|
|
21
|
-
this.paginator = viewChild(MatPaginator);
|
|
22
|
-
this.dialog = inject(MatDialog);
|
|
23
|
-
this.snackBar = inject(MatSnackBar);
|
|
24
|
-
this.productService = inject(ProductService);
|
|
25
|
-
this.isLoading = false;
|
|
26
|
-
this.isSearch = false;
|
|
27
|
-
this.length = 100;
|
|
28
|
-
this.pageSize = 15;
|
|
29
|
-
this.pageSizeOptions = [5, 10, 25, 100];
|
|
30
|
-
this.dataSource = new MatTableDataSource();
|
|
31
|
-
this.products = [];
|
|
32
|
-
this.displayedColumns = ['name', 'status', 'createdAt', 'actions'];
|
|
33
|
-
this.orderOptions = [
|
|
34
|
-
{
|
|
35
|
-
key: 'createdAt',
|
|
36
|
-
value: '创建时间',
|
|
37
|
-
icon: 'arrow_upward',
|
|
38
|
-
sort: 'asc',
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
key: 'createdAt',
|
|
42
|
-
value: '创建时间',
|
|
43
|
-
icon: 'arrow_downward',
|
|
44
|
-
sort: 'desc',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
key: 'status',
|
|
48
|
-
value: '状态',
|
|
49
|
-
icon: 'arrow_upward',
|
|
50
|
-
sort: 'asc',
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
key: 'status',
|
|
54
|
-
value: '状态',
|
|
55
|
-
icon: 'arrow_downward',
|
|
56
|
-
sort: 'desc',
|
|
57
|
-
},
|
|
58
|
-
];
|
|
59
|
-
this.status = ProductStatus;
|
|
60
|
-
this.orderString = 'createdAt desc';
|
|
61
|
-
}
|
|
62
|
-
ngOnInit() {
|
|
63
|
-
this.find(null);
|
|
64
|
-
}
|
|
65
|
-
find(event) {
|
|
66
|
-
this.isLoading = true;
|
|
67
|
-
const page = event ? event.pageIndex + 1 : 1;
|
|
68
|
-
const limit = event ? event.pageSize : 15;
|
|
69
|
-
const sort = this.orderString;
|
|
70
|
-
const options = {
|
|
71
|
-
page,
|
|
72
|
-
limit,
|
|
73
|
-
sort,
|
|
74
|
-
};
|
|
75
|
-
this.productService.me(options).subscribe({
|
|
76
|
-
next: (res) => {
|
|
77
|
-
this.products = res.data;
|
|
78
|
-
// this.dataSource.data = this.products;
|
|
79
|
-
this.length = res.meta.pagination.count;
|
|
80
|
-
this.isLoading = false;
|
|
81
|
-
},
|
|
82
|
-
error: (e) => {
|
|
83
|
-
this.isLoading = false;
|
|
84
|
-
this.snackBar.open(e.message);
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
archived(product) {
|
|
89
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
90
|
-
width: '400px',
|
|
91
|
-
data: {
|
|
92
|
-
title: '商品下架',
|
|
93
|
-
message: `确定下架 ${product.name} 吗?`,
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
97
|
-
if (result) {
|
|
98
|
-
this.productService.archived(product.id).subscribe({
|
|
99
|
-
next: (res) => {
|
|
100
|
-
const index = this.products.findIndex((item) => item.id === product.id);
|
|
101
|
-
const status = ProductStatus[ProductStatus.ARCHIVED];
|
|
102
|
-
this.products[index].status = status;
|
|
103
|
-
this.snackBar.open('结束成功');
|
|
104
|
-
},
|
|
105
|
-
error: (e) => {
|
|
106
|
-
this.snackBar.open(e.message);
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
delete(product) {
|
|
113
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
114
|
-
width: '400px',
|
|
115
|
-
data: {
|
|
116
|
-
title: '删除商品',
|
|
117
|
-
message: `确定删除 ${product.name} 吗?`,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
121
|
-
if (result) {
|
|
122
|
-
this.productService.delete(product.id).subscribe({
|
|
123
|
-
next: (res) => {
|
|
124
|
-
const index = this.products.findIndex((item) => item.id === product.id);
|
|
125
|
-
this.products.splice(index, 1);
|
|
126
|
-
this.dataSource.data = this.products;
|
|
127
|
-
this.length--;
|
|
128
|
-
this.snackBar.open('删除成功');
|
|
129
|
-
},
|
|
130
|
-
error: (e) => {
|
|
131
|
-
this.snackBar.open(e.message);
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageIndexComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
138
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: ProductManageIndexComponent, isStandalone: true, selector: "rolatech-product-manage-index", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, isSignal: true }], ngImport: i0, template: "<rolatech-toolbar title=\"\u5546\u54C1\">\n <div class=\"flex items-center gap-2\">\n <button mat-button routerLink=\"./create\">\n <mat-icon>add</mat-icon>\n \u521B\u5EFA\u5546\u54C1\n </button>\n </div>\n</rolatech-toolbar>\n@if (isLoading) {\n <div class=\"flex justify-center items-center\">\n <rolatech-spinner></rolatech-spinner>\n </div>\n} @else {\n <rolatech-product-manage-item-header></rolatech-product-manage-item-header>\n @for (item of products; track $index) {\n <rolatech-product-manage-item [product]=\"item\" routerLink=\"./{{ item.id }}/manage/info\"></rolatech-product-manage-item>\n }\n <mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"pageEvent = find($event)\"\n hidePageSize\n showFirstLastButtons\n >\n </mat-paginator>\n}\n", styles: ["mat-form-field{width:100%}table{width:100%}td.mat-column-actions{text-align:right;max-width:64px;font-size:.8rem;padding:0 8px}.mat-mdc-header-cell.actions{text-align:right;max-width:64px;width:64px}.mat-mdc-cell:nth-last-child(2),.mat-mdc-header-cell:nth-last-child(2),.mat-mdc-footer-cell:nth-last-child(2){text-align:right;max-width:180px;width:180px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{text-align:right;padding-right:8px!important}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i3.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: SpinnerComponent, selector: "rolatech-spinner", inputs: ["title"] }, { kind: "component", type: ProductManageItemComponent, selector: "rolatech-product-manage-item", inputs: ["product", "thumbnail"] }, { kind: "component", type: ProductManageItemHeaderComponent, selector: "rolatech-product-manage-item-header" }] }); }
|
|
139
|
-
}
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageIndexComponent, decorators: [{
|
|
141
|
-
type: Component,
|
|
142
|
-
args: [{ selector: 'rolatech-product-manage-index', standalone: true, imports: [
|
|
143
|
-
MatButtonModule,
|
|
144
|
-
RouterLink,
|
|
145
|
-
MatIconModule,
|
|
146
|
-
MatTableModule,
|
|
147
|
-
MatMenuModule,
|
|
148
|
-
MatPaginatorModule,
|
|
149
|
-
ToolbarComponent,
|
|
150
|
-
SpinnerComponent,
|
|
151
|
-
ProductManageItemComponent,
|
|
152
|
-
ProductManageItemHeaderComponent,
|
|
153
|
-
], template: "<rolatech-toolbar title=\"\u5546\u54C1\">\n <div class=\"flex items-center gap-2\">\n <button mat-button routerLink=\"./create\">\n <mat-icon>add</mat-icon>\n \u521B\u5EFA\u5546\u54C1\n </button>\n </div>\n</rolatech-toolbar>\n@if (isLoading) {\n <div class=\"flex justify-center items-center\">\n <rolatech-spinner></rolatech-spinner>\n </div>\n} @else {\n <rolatech-product-manage-item-header></rolatech-product-manage-item-header>\n @for (item of products; track $index) {\n <rolatech-product-manage-item [product]=\"item\" routerLink=\"./{{ item.id }}/manage/info\"></rolatech-product-manage-item>\n }\n <mat-paginator\n #paginator\n [length]=\"length\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"pageEvent = find($event)\"\n hidePageSize\n showFirstLastButtons\n >\n </mat-paginator>\n}\n", styles: ["mat-form-field{width:100%}table{width:100%}td.mat-column-actions{text-align:right;max-width:64px;font-size:.8rem;padding:0 8px}.mat-mdc-header-cell.actions{text-align:right;max-width:64px;width:64px}.mat-mdc-cell:nth-last-child(2),.mat-mdc-header-cell:nth-last-child(2),.mat-mdc-footer-cell:nth-last-child(2){text-align:right;max-width:180px;width:180px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{text-align:right;padding-right:8px!important}\n"] }]
|
|
154
|
-
}] });
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXByb2R1Y3Qvc3JjL2xpYi9wYWdlcy9wcm9kdWN0LW1hbmFnZS9wcm9kdWN0LW1hbmFnZS1pbmRleC9wcm9kdWN0LW1hbmFnZS1pbmRleC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZGV4L3Byb2R1Y3QtbWFuYWdlLWluZGV4LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBYSxNQUFNLDZCQUE2QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0VBQW9FLENBQUM7Ozs7O0FBb0J0SCxNQUFNLE9BQU8sMkJBQTJCO0lBbEJ4QztRQW1CRSxjQUFTLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLFdBQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0IsYUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsV0FBTSxHQUFHLEdBQUcsQ0FBQztRQUNiLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxvQkFBZSxHQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksa0JBQWtCLEVBQU8sQ0FBQztRQUMzQyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBQ3pCLHFCQUFnQixHQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEUsaUJBQVksR0FBRztZQUNiO2dCQUNFLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsTUFBTTtnQkFDYixJQUFJLEVBQUUsY0FBYztnQkFDcEIsSUFBSSxFQUFFLEtBQUs7YUFDWjtZQUNEO2dCQUNFLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsTUFBTTtnQkFDYixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixJQUFJLEVBQUUsTUFBTTthQUNiO1lBQ0Q7Z0JBQ0UsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLElBQUksRUFBRSxLQUFLO2FBQ1o7WUFDRDtnQkFDRSxHQUFHLEVBQUUsUUFBUTtnQkFDYixLQUFLLEVBQUUsSUFBSTtnQkFDWCxJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixJQUFJLEVBQUUsTUFBTTthQUNiO1NBQ0YsQ0FBQztRQUNGLFdBQU0sR0FBUSxhQUFhLENBQUM7UUFDNUIsZ0JBQVcsR0FBRyxnQkFBZ0IsQ0FBQztLQWlGaEM7SUE5RUMsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQUksQ0FBQyxLQUF3QjtRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRztZQUNkLElBQUk7WUFDSixLQUFLO1lBQ0wsSUFBSTtTQUNMLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDeEMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDekIsd0NBQXdDO2dCQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBWTtRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUM5RCxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsTUFBTTtnQkFDYixPQUFPLEVBQUUsUUFBUSxPQUFPLENBQUMsSUFBSSxLQUFLO2FBQ25DO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzNDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDakQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN4RSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLE9BQWdCO1FBQ3JCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQzlELEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxNQUFNO2dCQUNiLE9BQU8sRUFBRSxRQUFRLE9BQU8sQ0FBQyxJQUFJLEtBQUs7YUFDbkM7U0FDRixDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO29CQUMvQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXpIVSwyQkFBMkI7a0dBQTNCLDJCQUEyQixvSUFDaEIsWUFBWSxnRUNsQ3BDLGszQkE0QkEsMGhCRFRJLGVBQWUsNE5BQ2YsVUFBVSxtT0FDVixhQUFhLG1MQUNiLGNBQWMsOEJBQ2QsYUFBYSw4QkFDYixrQkFBa0Isb1NBQ2xCLGdCQUFnQixnSUFDaEIsZ0JBQWdCLGdGQUNoQiwwQkFBMEIsMkdBQzFCLGdDQUFnQzs7MkZBS3ZCLDJCQUEyQjtrQkFsQnZDLFNBQVM7K0JBQ0UsK0JBQStCLGNBQzdCLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLFVBQVU7d0JBQ1YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsMEJBQTBCO3dCQUMxQixnQ0FBZ0M7cUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0VGFibGVNb2R1bGUsIE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9vbGJhckNvbXBvbmVudCwgU3Bpbm5lckNvbXBvbmVudCwgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLXNlcnZpY2VzJztcbmltcG9ydCB7IFByb2R1Y3QsIFByb2R1Y3RTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFByb2R1Y3RNYW5hZ2VJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vcHJvZHVjdC1tYW5hZ2UtaXRlbS9wcm9kdWN0LW1hbmFnZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TWFuYWdlSXRlbUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWluZGV4JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBTcGlubmVyQ29tcG9uZW50LFxuICAgIFByb2R1Y3RNYW5hZ2VJdGVtQ29tcG9uZW50LFxuICAgIFByb2R1Y3RNYW5hZ2VJdGVtSGVhZGVyQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TWFuYWdlSW5kZXhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwYWdpbmF0b3IgPSB2aWV3Q2hpbGQoTWF0UGFnaW5hdG9yKTtcbiAgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHNuYWNrQmFyID0gaW5qZWN0KE1hdFNuYWNrQmFyKTtcbiAgcHJvZHVjdFNlcnZpY2UgPSBpbmplY3QoUHJvZHVjdFNlcnZpY2UpO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgaXNTZWFyY2ggPSBmYWxzZTtcbiAgcGFnZUV2ZW50ITogUGFnZUV2ZW50O1xuICBsZW5ndGggPSAxMDA7XG4gIHBhZ2VTaXplID0gMTU7XG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDI1LCAxMDBdO1xuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KCk7XG4gIHByb2R1Y3RzOiBQcm9kdWN0W10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ25hbWUnLCAnc3RhdHVzJywgJ2NyZWF0ZWRBdCcsICdhY3Rpb25zJ107XG4gIG9yZGVyT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdjcmVhdGVkQXQnLFxuICAgICAgdmFsdWU6ICfliJvlu7rml7bpl7QnLFxuICAgICAgaWNvbjogJ2Fycm93X3Vwd2FyZCcsXG4gICAgICBzb3J0OiAnYXNjJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2NyZWF0ZWRBdCcsXG4gICAgICB2YWx1ZTogJ+WIm+W7uuaXtumXtCcsXG4gICAgICBpY29uOiAnYXJyb3dfZG93bndhcmQnLFxuICAgICAgc29ydDogJ2Rlc2MnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnc3RhdHVzJyxcbiAgICAgIHZhbHVlOiAn54q25oCBJyxcbiAgICAgIGljb246ICdhcnJvd191cHdhcmQnLFxuICAgICAgc29ydDogJ2FzYycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgdmFsdWU6ICfnirbmgIEnLFxuICAgICAgaWNvbjogJ2Fycm93X2Rvd253YXJkJyxcbiAgICAgIHNvcnQ6ICdkZXNjJyxcbiAgICB9LFxuICBdO1xuICBzdGF0dXM6IGFueSA9IFByb2R1Y3RTdGF0dXM7XG4gIG9yZGVyU3RyaW5nID0gJ2NyZWF0ZWRBdCBkZXNjJztcbiAgY2xhc3Nyb29tczogYW55O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmluZChudWxsKTtcbiAgfVxuICBmaW5kKGV2ZW50PzogUGFnZUV2ZW50IHwgbnVsbCk6IGFueSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudCA/IGV2ZW50LnBhZ2VJbmRleCArIDEgOiAxO1xuICAgIGNvbnN0IGxpbWl0ID0gZXZlbnQgPyBldmVudC5wYWdlU2l6ZSA6IDE1O1xuICAgIGNvbnN0IHNvcnQgPSB0aGlzLm9yZGVyU3RyaW5nO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBwYWdlLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgIH07XG4gICAgdGhpcy5wcm9kdWN0U2VydmljZS5tZShvcHRpb25zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdHMgPSByZXMuZGF0YTtcbiAgICAgICAgLy8gdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnByb2R1Y3RzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHJlcy5tZXRhLnBhZ2luYXRpb24uY291bnQ7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFyY2hpdmVkKHByb2R1Y3Q6IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICfllYblk4HkuIvmnrYnLFxuICAgICAgICBtZXNzYWdlOiBg56Gu5a6a5LiL5p62ICR7cHJvZHVjdC5uYW1lfSDlkJc/YCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmFyY2hpdmVkKHByb2R1Y3QuaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnByb2R1Y3RzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gcHJvZHVjdC5pZCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBQcm9kdWN0U3RhdHVzW1Byb2R1Y3RTdGF0dXMuQVJDSElWRURdO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1tpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCfnu5PmnZ/miJDlip8nKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGUubWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZGVsZXRlKHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAn5Yig6Zmk5ZWG5ZOBJyxcbiAgICAgICAgbWVzc2FnZTogYOehruWumuWIoOmZpCAke3Byb2R1Y3QubmFtZX0g5ZCXP2AsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS5kZWxldGUocHJvZHVjdC5pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucHJvZHVjdHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBwcm9kdWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5wcm9kdWN0cztcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ+WIoOmZpOaIkOWKnycpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZS5tZXNzYWdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPHJvbGF0ZWNoLXRvb2xiYXIgdGl0bGU9XCLllYblk4FcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHJvdXRlckxpbms9XCIuL2NyZWF0ZVwiPlxuICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICDliJvlu7rllYblk4FcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3JvbGF0ZWNoLXRvb2xiYXI+XG5AaWYgKGlzTG9hZGluZykge1xuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICA8cm9sYXRlY2gtc3Bpbm5lcj48L3JvbGF0ZWNoLXNwaW5uZXI+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlcj48L3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyPlxuICBAZm9yIChpdGVtIG9mIHByb2R1Y3RzOyB0cmFjayAkaW5kZXgpIHtcbiAgICA8cm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtaXRlbSBbcHJvZHVjdF09XCJpdGVtXCIgcm91dGVyTGluaz1cIi4ve3sgaXRlbS5pZCB9fS9tYW5hZ2UvaW5mb1wiPjwvcm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtaXRlbT5cbiAgfVxuICA8bWF0LXBhZ2luYXRvclxuICAgICNwYWdpbmF0b3JcbiAgICBbbGVuZ3RoXT1cImxlbmd0aFwiXG4gICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgKHBhZ2UpPVwicGFnZUV2ZW50ID0gZmluZCgkZXZlbnQpXCJcbiAgICBoaWRlUGFnZVNpemVcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+XG4gIDwvbWF0LXBhZ2luYXRvcj5cbn1cbiJdfQ==
|
package/esm2022/lib/pages/product-manage/product-manage-info/product-manage-info.component.mjs
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { Component, inject, model } from '@angular/core';
|
|
2
|
-
import { ProductManageContentComponent } from '../product-manage-content/product-manage-content.component';
|
|
3
|
-
import { TextFieldModule } from '@angular/cdk/text-field';
|
|
4
|
-
import { FormsModule } from '@angular/forms';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatOptionModule } from '@angular/material/core';
|
|
7
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
-
import { MatInputModule } from '@angular/material/input';
|
|
9
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
10
|
-
import { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';
|
|
11
|
-
import { ProductCategoryService, ProductService } from '@rolatech/angular-services';
|
|
12
|
-
import { ProductPriceType, ProductStatus, ProductType } from '../../../interfaces';
|
|
13
|
-
import { DecimalDirective } from '@rolatech/angular-common';
|
|
14
|
-
import { KeyValuePipe } from '@angular/common';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/forms";
|
|
17
|
-
import * as i2 from "@angular/material/form-field";
|
|
18
|
-
import * as i3 from "@angular/material/input";
|
|
19
|
-
import * as i4 from "@angular/cdk/text-field";
|
|
20
|
-
import * as i5 from "@angular/material/select";
|
|
21
|
-
import * as i6 from "@angular/material/core";
|
|
22
|
-
import * as i7 from "@angular/material/button";
|
|
23
|
-
export class ProductManageInfoComponent extends BaseComponent {
|
|
24
|
-
constructor() {
|
|
25
|
-
super(...arguments);
|
|
26
|
-
this.productService = inject(ProductService);
|
|
27
|
-
this.categoryService = inject(ProductCategoryService);
|
|
28
|
-
this.status = ProductStatus;
|
|
29
|
-
this.productType = ProductType;
|
|
30
|
-
this.priceType = ProductPriceType;
|
|
31
|
-
this.price = model();
|
|
32
|
-
this.deposit = model('');
|
|
33
|
-
}
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
this.id = this.route.parent?.snapshot.paramMap.get('id');
|
|
36
|
-
this.find();
|
|
37
|
-
this.categoryService.find({}).subscribe({
|
|
38
|
-
next: (res) => {
|
|
39
|
-
this.categories = res.data;
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
find() {
|
|
44
|
-
this.productService.get(this.id).subscribe({
|
|
45
|
-
next: (res) => {
|
|
46
|
-
this.product = res.data;
|
|
47
|
-
const price = (this.product.price / 100).toFixed(2);
|
|
48
|
-
this.price.set(price);
|
|
49
|
-
if (this.product.priceType.toString() === 'PARTIAL') {
|
|
50
|
-
const deposit = (this.product.deposit / 100).toFixed(2);
|
|
51
|
-
this.deposit.set(deposit);
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
typeCompareFn(t1, t2) {
|
|
57
|
-
return t1 === t2;
|
|
58
|
-
}
|
|
59
|
-
priceTypeCompareFn(t1, t2) {
|
|
60
|
-
return t1 === t2;
|
|
61
|
-
}
|
|
62
|
-
compareFn(o1, o2) {
|
|
63
|
-
return o1.id === o2?.id;
|
|
64
|
-
}
|
|
65
|
-
onTypeChange(event) {
|
|
66
|
-
this.product.type = Object.keys(this.productType).find((key) => this.productType[key] === event.value);
|
|
67
|
-
}
|
|
68
|
-
onCategoryChange(event) {
|
|
69
|
-
this.selectedCategoyIds = event.value;
|
|
70
|
-
}
|
|
71
|
-
update() {
|
|
72
|
-
const { name, description, categories, priceType } = this.product;
|
|
73
|
-
const data = {
|
|
74
|
-
name,
|
|
75
|
-
description,
|
|
76
|
-
categories,
|
|
77
|
-
price: Number(this.price()) * 100,
|
|
78
|
-
type: this.product.type,
|
|
79
|
-
priceType,
|
|
80
|
-
deposit: Number(this.deposit()) * 100,
|
|
81
|
-
};
|
|
82
|
-
this.productService.update(this.id, data).subscribe({
|
|
83
|
-
next: (res) => {
|
|
84
|
-
this.snackBarService.open('保存成功');
|
|
85
|
-
},
|
|
86
|
-
error: (e) => {
|
|
87
|
-
this.snackBarService.open(e.message);
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
92
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: ProductManageInfoComponent, isStandalone: true, selector: "rolatech-product-manage-info", inputs: { price: { classPropertyName: "price", publicName: "price", isSignal: true, isRequired: false, transformFunction: null }, deposit: { classPropertyName: "deposit", publicName: "deposit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { price: "priceChange", deposit: "depositChange" }, usesInheritance: true, ngImport: i0, template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u57FA\u672C\u4FE1\u606F\" class=\"hidden md:block\" divider></rolatech-toolbar>\n @if (product) {\n <div class=\"flex flex-col\">\n <form #productForm=\"ngForm\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5546\u54C1\u540D\u79F0 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"product.name\" name=\"name\" required />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5546\u54C1\u63CF\u8FF0 </mat-label>\n <textarea\n matInput\n type=\"text\"\n [(ngModel)]=\"product.description\"\n name=\"description\"\n required\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n ></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" required>\n <mat-label>\u7C7B\u578B</mat-label>\n <mat-select\n name=\"type\"\n [compareWith]=\"typeCompareFn\"\n (selectionChange)=\"onTypeChange($event)\"\n [(ngModel)]=\"product.type\"\n >\n @for (type of productType | keyvalue; track type) {\n <mat-option [value]=\"type.key\">\n {{ type.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" ngModelGroup=\"categories\" required>\n <mat-label>\u5206\u7C7B</mat-label>\n <mat-select\n multiple\n name=\"id\"\n [compareWith]=\"compareFn\"\n [(ngModel)]=\"product.categories\"\n #select=\"matSelect\"\n (selectionChange)=\"onCategoryChange($event)\"\n >\n @for (item of categories; track item) {\n <mat-option [value]=\"item\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" required>\n <mat-label>\u4EF7\u683C\u7C7B\u578B</mat-label>\n <mat-select name=\"priceType\" [compareWith]=\"priceTypeCompareFn\" [(ngModel)]=\"product.priceType\">\n @for (type of priceType | keyvalue; track type) {\n <mat-option [value]=\"type.key\">\n {{ type.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u4EF7\u683C </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"price\" name=\"price\" required rolatechDecimal />\n </mat-form-field>\n @if (product.priceType && product.priceType.toString() === 'PARTIAL') {\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5B9A\u91D1 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"deposit\" name=\"deposit\" required rolatechDecimal />\n </mat-form-field>\n }\n </form>\n </div>\n <div>\n <button mat-flat-button type=\"primary\" (click)=\"update()\">\u4FDD\u5B58</button>\n </div>\n }\n</rolatech-product-manage-content>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgModelGroup, selector: "[ngModelGroup]", inputs: ["ngModelGroup"], exportAs: ["ngModelGroup"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i4.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: ProductManageContentComponent, selector: "rolatech-product-manage-content" }, { kind: "directive", type: DecimalDirective, selector: "[rolatechDecimal]" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
|
|
93
|
-
}
|
|
94
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageInfoComponent, decorators: [{
|
|
95
|
-
type: Component,
|
|
96
|
-
args: [{ selector: 'rolatech-product-manage-info', standalone: true, imports: [
|
|
97
|
-
FormsModule,
|
|
98
|
-
MatFormFieldModule,
|
|
99
|
-
MatInputModule,
|
|
100
|
-
TextFieldModule,
|
|
101
|
-
MatSelectModule,
|
|
102
|
-
MatOptionModule,
|
|
103
|
-
MatButtonModule,
|
|
104
|
-
ToolbarComponent,
|
|
105
|
-
ProductManageContentComponent,
|
|
106
|
-
DecimalDirective,
|
|
107
|
-
MatSelectModule,
|
|
108
|
-
KeyValuePipe,
|
|
109
|
-
], template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u57FA\u672C\u4FE1\u606F\" class=\"hidden md:block\" divider></rolatech-toolbar>\n @if (product) {\n <div class=\"flex flex-col\">\n <form #productForm=\"ngForm\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5546\u54C1\u540D\u79F0 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"product.name\" name=\"name\" required />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5546\u54C1\u63CF\u8FF0 </mat-label>\n <textarea\n matInput\n type=\"text\"\n [(ngModel)]=\"product.description\"\n name=\"description\"\n required\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n ></textarea>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" required>\n <mat-label>\u7C7B\u578B</mat-label>\n <mat-select\n name=\"type\"\n [compareWith]=\"typeCompareFn\"\n (selectionChange)=\"onTypeChange($event)\"\n [(ngModel)]=\"product.type\"\n >\n @for (type of productType | keyvalue; track type) {\n <mat-option [value]=\"type.key\">\n {{ type.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" ngModelGroup=\"categories\" required>\n <mat-label>\u5206\u7C7B</mat-label>\n <mat-select\n multiple\n name=\"id\"\n [compareWith]=\"compareFn\"\n [(ngModel)]=\"product.categories\"\n #select=\"matSelect\"\n (selectionChange)=\"onCategoryChange($event)\"\n >\n @for (item of categories; track item) {\n <mat-option [value]=\"item\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" required>\n <mat-label>\u4EF7\u683C\u7C7B\u578B</mat-label>\n <mat-select name=\"priceType\" [compareWith]=\"priceTypeCompareFn\" [(ngModel)]=\"product.priceType\">\n @for (type of priceType | keyvalue; track type) {\n <mat-option [value]=\"type.key\">\n {{ type.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u4EF7\u683C </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"price\" name=\"price\" required rolatechDecimal />\n </mat-form-field>\n @if (product.priceType && product.priceType.toString() === 'PARTIAL') {\n <mat-form-field appearance=\"fill\">\n <mat-label> \u5B9A\u91D1 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"deposit\" name=\"deposit\" required rolatechDecimal />\n </mat-form-field>\n }\n </form>\n </div>\n <div>\n <button mat-flat-button type=\"primary\" (click)=\"update()\">\u4FDD\u5B58</button>\n </div>\n }\n</rolatech-product-manage-content>\n", styles: ["mat-form-field{width:100%}\n"] }]
|
|
110
|
-
}] });
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDM0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEYsT0FBTyxFQUE0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QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLDZCQUE2Qjt3QkFDN0IsZ0JBQWdCO3dCQUNoQixlQUFlO3dCQUNmLFlBQVk7cUJBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgbW9kZWwsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdE1hbmFnZUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9wcm9kdWN0LW1hbmFnZS1jb250ZW50L3Byb2R1Y3QtbWFuYWdlLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRGaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90ZXh0LWZpZWxkJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSwgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IFByb2R1Y3RDYXRlZ29yeVNlcnZpY2UsIFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItc2VydmljZXMnO1xuaW1wb3J0IHsgUHJvZHVjdCwgUHJvZHVjdENhdGVnb3J5LCBQcm9kdWN0UHJpY2VUeXBlLCBQcm9kdWN0U3RhdHVzLCBQcm9kdWN0VHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGVjaW1hbERpcmVjdGl2ZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbW1vbic7XG5pbXBvcnQgeyBLZXlWYWx1ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1pbmZvJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBUZXh0RmllbGRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBQcm9kdWN0TWFuYWdlQ29udGVudENvbXBvbmVudCxcbiAgICBEZWNpbWFsRGlyZWN0aXZlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pbmZvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWluZm8uY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TWFuYWdlSW5mb0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm9kdWN0U2VydmljZSA9IGluamVjdChQcm9kdWN0U2VydmljZSk7XG4gIGNhdGVnb3J5U2VydmljZSA9IGluamVjdChQcm9kdWN0Q2F0ZWdvcnlTZXJ2aWNlKTtcbiAgcHJvZHVjdCE6IFByb2R1Y3Q7XG4gIHN0YXR1cyA9IFByb2R1Y3RTdGF0dXM7XG4gIGNhdGVnb3JpZXMhOiBQcm9kdWN0Q2F0ZWdvcnlbXTtcbiAgc2VsZWN0ZWRDYXRlZ295SWRzITogc3RyaW5nW107XG4gIHByb2R1Y3RUeXBlID0gUHJvZHVjdFR5cGU7XG4gIHByaWNlVHlwZSA9IFByb2R1Y3RQcmljZVR5cGU7XG4gIHByaWNlID0gbW9kZWw8c3RyaW5nPigpO1xuICBkZXBvc2l0ID0gbW9kZWw8c3RyaW5nPignJyk7XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaWQgPSB0aGlzLnJvdXRlLnBhcmVudD8uc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpIGFzIHN0cmluZztcbiAgICB0aGlzLmZpbmQoKTtcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZS5maW5kKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kKCkge1xuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuZ2V0KHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0ID0gcmVzLmRhdGE7XG4gICAgICAgIGNvbnN0IHByaWNlID0gKHRoaXMucHJvZHVjdC5wcmljZSAvIDEwMCkudG9GaXhlZCgyKTtcbiAgICAgICAgdGhpcy5wcmljZS5zZXQocHJpY2UpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb2R1Y3QucHJpY2VUeXBlLnRvU3RyaW5nKCkgPT09ICdQQVJUSUFMJykge1xuICAgICAgICAgIGNvbnN0IGRlcG9zaXQgPSAodGhpcy5wcm9kdWN0LmRlcG9zaXQgLyAxMDApLnRvRml4ZWQoMik7XG4gICAgICAgICAgdGhpcy5kZXBvc2l0LnNldChkZXBvc2l0KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICB0eXBlQ29tcGFyZUZuKHQxOiBhbnksIHQyOiBhbnkpIHtcbiAgICByZXR1cm4gdDEgPT09IHQyO1xuICB9XG4gIHByaWNlVHlwZUNvbXBhcmVGbih0MTogYW55LCB0MjogYW55KSB7XG4gICAgcmV0dXJuIHQxID09PSB0MjtcbiAgfVxuICBjb21wYXJlRm4obzE6IFByb2R1Y3RDYXRlZ29yeSwgbzI6IFByb2R1Y3RDYXRlZ29yeSkge1xuICAgIHJldHVybiBvMS5pZCA9PT0gbzI/LmlkO1xuICB9XG4gIG9uVHlwZUNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgdGhpcy5wcm9kdWN0LnR5cGUgPSBPYmplY3Qua2V5cyh0aGlzLnByb2R1Y3RUeXBlKS5maW5kKChrZXkpID0+IHRoaXMucHJvZHVjdFR5cGVba2V5XSA9PT0gZXZlbnQudmFsdWUpITtcbiAgfVxuICBvbkNhdGVnb3J5Q2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdveUlkcyA9IGV2ZW50LnZhbHVlO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yaWVzLCBwcmljZVR5cGUgfSA9IHRoaXMucHJvZHVjdDtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcmllcyxcbiAgICAgIHByaWNlOiBOdW1iZXIodGhpcy5wcmljZSgpKSAqIDEwMCxcbiAgICAgIHR5cGU6IHRoaXMucHJvZHVjdC50eXBlLFxuICAgICAgcHJpY2VUeXBlLFxuICAgICAgZGVwb3NpdDogTnVtYmVyKHRoaXMuZGVwb3NpdCgpKSAqIDEwMCxcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UudXBkYXRlKHRoaXMuaWQsIGRhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ+S/neWtmOaIkOWKnycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKGUubWVzc2FnZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iLCI8cm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtY29udGVudD5cbiAgPHJvbGF0ZWNoLXRvb2xiYXIgdGl0bGU9XCLln7rmnKzkv6Hmga9cIiBjbGFzcz1cImhpZGRlbiBtZDpibG9ja1wiIGRpdmlkZXI+PC9yb2xhdGVjaC10b29sYmFyPlxuICBAaWYgKHByb2R1Y3QpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGZvcm0gI3Byb2R1Y3RGb3JtPVwibmdGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOWVhuWTgeWQjeensCA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInByb2R1Y3QubmFtZVwiIG5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD4g5ZWG5ZOB5o+P6L+wIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvZHVjdC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjNcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiByZXF1aXJlZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPuexu+WeizwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBuYW1lPVwidHlwZVwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwidHlwZUNvbXBhcmVGblwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvZHVjdC50eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yICh0eXBlIG9mIHByb2R1Y3RUeXBlIHwga2V5dmFsdWU7IHRyYWNrIHR5cGUpIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInR5cGUua2V5XCI+XG4gICAgICAgICAgICAgICAge3sgdHlwZS52YWx1ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBuZ01vZGVsR3JvdXA9XCJjYXRlZ29yaWVzXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD7liIbnsbs8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvZHVjdC5jYXRlZ29yaWVzXCJcbiAgICAgICAgICAgICNzZWxlY3Q9XCJtYXRTZWxlY3RcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNhdGVnb3J5Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgY2F0ZWdvcmllczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiByZXF1aXJlZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPuS7t+agvOexu+WeizwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IG5hbWU9XCJwcmljZVR5cGVcIiBbY29tcGFyZVdpdGhdPVwicHJpY2VUeXBlQ29tcGFyZUZuXCIgWyhuZ01vZGVsKV09XCJwcm9kdWN0LnByaWNlVHlwZVwiPlxuICAgICAgICAgICAgQGZvciAodHlwZSBvZiBwcmljZVR5cGUgfCBrZXl2YWx1ZTsgdHJhY2sgdHlwZSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidHlwZS5rZXlcIj5cbiAgICAgICAgICAgICAgICB7eyB0eXBlLnZhbHVlIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOS7t+agvCA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInByaWNlXCIgbmFtZT1cInByaWNlXCIgcmVxdWlyZWQgcm9sYXRlY2hEZWNpbWFsIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIEBpZiAocHJvZHVjdC5wcmljZVR5cGUgJiYgcHJvZHVjdC5wcmljZVR5cGUudG9TdHJpbmcoKSA9PT0gJ1BBUlRJQUwnKSB7XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPiDlrprph5EgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImRlcG9zaXRcIiBuYW1lPVwiZGVwb3NpdFwiIHJlcXVpcmVkIHJvbGF0ZWNoRGVjaW1hbCAvPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cInByaW1hcnlcIiAoY2xpY2spPVwidXBkYXRlKClcIj7kv53lrZg8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9yb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1jb250ZW50PlxuIl19
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { Component, inject, model } from '@angular/core';
|
|
2
|
-
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
3
|
-
import { AngularComponentsModule, BaseComponent, ToolbarComponent } from '@rolatech/angular-components';
|
|
4
|
-
import { ProductManageContentComponent } from '../product-manage-content/product-manage-content.component';
|
|
5
|
-
import { InventoryService, ProductService } from '@rolatech/angular-services';
|
|
6
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/forms";
|
|
10
|
-
import * as i2 from "@angular/material/core";
|
|
11
|
-
import * as i3 from "@angular/material/button";
|
|
12
|
-
import * as i4 from "@angular/material/form-field";
|
|
13
|
-
import * as i5 from "@angular/material/input";
|
|
14
|
-
import * as i6 from "@angular/material/select";
|
|
15
|
-
import * as i7 from "@angular/material/slide-toggle";
|
|
16
|
-
export class ProductManageInventoryComponent extends BaseComponent {
|
|
17
|
-
constructor() {
|
|
18
|
-
super(...arguments);
|
|
19
|
-
this.productService = inject(ProductService);
|
|
20
|
-
this.inventoryService = inject(InventoryService);
|
|
21
|
-
this.inventoryEnabled = false;
|
|
22
|
-
this.loading = false;
|
|
23
|
-
this.locations = model();
|
|
24
|
-
this.amount = 0;
|
|
25
|
-
this.inventoryItem = {
|
|
26
|
-
levels: [],
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
ngOnInit() {
|
|
30
|
-
this.id = this.route.parent?.snapshot.paramMap.get('id');
|
|
31
|
-
this.getProduct();
|
|
32
|
-
this.findInventoryLocations();
|
|
33
|
-
this.findInventoryItemsByProductId();
|
|
34
|
-
}
|
|
35
|
-
getProduct() {
|
|
36
|
-
this.loading = true;
|
|
37
|
-
this.productService.get(this.id).subscribe({
|
|
38
|
-
next: (res) => {
|
|
39
|
-
this.product = res.data;
|
|
40
|
-
this.loading = false;
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
findInventoryItemsByProductId() {
|
|
45
|
-
this.inventoryService.findInventoryItemByProductId(this.id).subscribe({
|
|
46
|
-
next: (res) => {
|
|
47
|
-
if (res.data) {
|
|
48
|
-
this.inventoryEnabled = true;
|
|
49
|
-
this.inventoryItem = res.data;
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
findInventoryLocations() {
|
|
55
|
-
this.inventoryService.findLocations({}).subscribe({
|
|
56
|
-
next: (res) => {
|
|
57
|
-
this.locations.set(res.data);
|
|
58
|
-
this.selectedLocation = res.data[0];
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
onInventorySlideToggle(event) {
|
|
63
|
-
const newState = event.checked;
|
|
64
|
-
this.inventoryEnabled = newState;
|
|
65
|
-
if (!newState) {
|
|
66
|
-
const options = {
|
|
67
|
-
title: '取消库存策略吗',
|
|
68
|
-
message: '这会删除现有策略, 确定吗?',
|
|
69
|
-
cancelText: '取消',
|
|
70
|
-
confirmText: '确认',
|
|
71
|
-
};
|
|
72
|
-
this.dialogService.open(options);
|
|
73
|
-
this.dialogService.confirmed().subscribe({
|
|
74
|
-
next: (res) => {
|
|
75
|
-
if (res) {
|
|
76
|
-
this.inventoryService.deleteInventoryItemsByProductId(this.id).subscribe({
|
|
77
|
-
next: (res) => {
|
|
78
|
-
this.inventoryEnabled = false;
|
|
79
|
-
this.inventoryItem = {};
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
event.source.checked = !newState;
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
onSelectionChange(item, event) {
|
|
91
|
-
item.locationId = event.value.id;
|
|
92
|
-
}
|
|
93
|
-
compareFn(o1, o2) {
|
|
94
|
-
return o1.id === o2.id;
|
|
95
|
-
}
|
|
96
|
-
add() {
|
|
97
|
-
const level = {
|
|
98
|
-
location: {},
|
|
99
|
-
amount: 0,
|
|
100
|
-
};
|
|
101
|
-
this.inventoryItem.levels.push(level);
|
|
102
|
-
}
|
|
103
|
-
save() {
|
|
104
|
-
const locationIds = _.map(this.inventoryItem.levels, 'location.id');
|
|
105
|
-
const duplicated = new Set(locationIds).size !== locationIds.length;
|
|
106
|
-
if (duplicated) {
|
|
107
|
-
this.snackBarService.open('仓库重复');
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const data = {
|
|
111
|
-
productId: this.id,
|
|
112
|
-
levels: [],
|
|
113
|
-
};
|
|
114
|
-
this.inventoryItem.levels.forEach((item) => {
|
|
115
|
-
data.levels.push({
|
|
116
|
-
locationId: item.location.id,
|
|
117
|
-
amount: item.amount,
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
this.inventoryService.addInventoryItem(data).subscribe({
|
|
121
|
-
next: (res) => {
|
|
122
|
-
this.snackBarService.open('保存成功');
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
deleteLevel(index, level) {
|
|
127
|
-
const options = {
|
|
128
|
-
title: '确定删除吗',
|
|
129
|
-
message: `这会删除现有仓库${level.location.name}商品库存数据, 确定吗?`,
|
|
130
|
-
cancelText: '取消',
|
|
131
|
-
confirmText: '确认',
|
|
132
|
-
};
|
|
133
|
-
this.dialogService.open(options);
|
|
134
|
-
this.dialogService.confirmed().subscribe({
|
|
135
|
-
next: (res) => {
|
|
136
|
-
if (res) {
|
|
137
|
-
this.inventoryService.deleteInventoryLevel(level.id).subscribe({
|
|
138
|
-
next: (res) => {
|
|
139
|
-
this.inventoryItem.levels.splice(index, 1);
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageInventoryComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
147
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: ProductManageInventoryComponent, isStandalone: true, selector: "rolatech-product-manage-inventory", inputs: { locations: { classPropertyName: "locations", publicName: "locations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { locations: "locationsChange" }, usesInheritance: true, ngImport: i0, template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u5E93\u5B58\u8BBE\u7F6E\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div class=\"flex items-center\">\n <mat-slide-toggle\n color=\"primary\"\n #inventorySlide\n [checked]=\"inventoryEnabled\"\n (change)=\"onInventorySlideToggle($event)\"\n ></mat-slide-toggle>\n <div>\u8DDF\u8E2A\u5E93\u5B58</div>\n </div>\n @if (inventoryEnabled) {\n @for (item of inventoryItem.levels; track $index) {\n <div class=\"flex gap-3 items-center py-2\">\n <mat-form-field appearance=\"fill\" subscriptSizing=\"dynamic\">\n <mat-label>\u4ED3\u5E93</mat-label>\n <mat-select [compareWith]=\"compareFn\" (selectionChange)=\"onSelectionChange(item, $event)\" [(ngModel)]=\"item.location\">\n @for (item of locations(); track item) {\n <mat-option [value]=\"item\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" subscriptSizing=\"dynamic\">\n <mat-label> \u6570\u91CF </mat-label>\n <input matInput [(ngModel)]=\"item.amount\" required />\n </mat-form-field>\n <button mat-button (click)=\"deleteLevel($index, item)\">\u5220\u9664</button>\n </div>\n }\n }\n <div class=\"flex gap-3\">\n <button mat-stroked-button (click)=\"add()\">\u6DFB\u52A0</button>\n <button mat-flat-button (click)=\"save()\">\u4FDD\u5B58</button>\n </div>\n</rolatech-product-manage-content>\n", styles: ["mat-slide-toggle{scale:.8}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: ProductManageContentComponent, selector: "rolatech-product-manage-content" }, { kind: "ngmodule", type: MatSelectModule }] }); }
|
|
148
|
-
}
|
|
149
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageInventoryComponent, decorators: [{
|
|
150
|
-
type: Component,
|
|
151
|
-
args: [{ selector: 'rolatech-product-manage-inventory', standalone: true, imports: [AngularCommonModule, AngularComponentsModule, ToolbarComponent, ProductManageContentComponent, MatSelectModule], template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u5E93\u5B58\u8BBE\u7F6E\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div class=\"flex items-center\">\n <mat-slide-toggle\n color=\"primary\"\n #inventorySlide\n [checked]=\"inventoryEnabled\"\n (change)=\"onInventorySlideToggle($event)\"\n ></mat-slide-toggle>\n <div>\u8DDF\u8E2A\u5E93\u5B58</div>\n </div>\n @if (inventoryEnabled) {\n @for (item of inventoryItem.levels; track $index) {\n <div class=\"flex gap-3 items-center py-2\">\n <mat-form-field appearance=\"fill\" subscriptSizing=\"dynamic\">\n <mat-label>\u4ED3\u5E93</mat-label>\n <mat-select [compareWith]=\"compareFn\" (selectionChange)=\"onSelectionChange(item, $event)\" [(ngModel)]=\"item.location\">\n @for (item of locations(); track item) {\n <mat-option [value]=\"item\">\n {{ item.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\" subscriptSizing=\"dynamic\">\n <mat-label> \u6570\u91CF </mat-label>\n <input matInput [(ngModel)]=\"item.amount\" required />\n </mat-form-field>\n <button mat-button (click)=\"deleteLevel($index, item)\">\u5220\u9664</button>\n </div>\n }\n }\n <div class=\"flex gap-3\">\n <button mat-stroked-button (click)=\"add()\">\u6DFB\u52A0</button>\n <button mat-flat-button (click)=\"save()\">\u4FDD\u5B58</button>\n </div>\n</rolatech-product-manage-content>\n", styles: ["mat-slide-toggle{scale:.8}\n"] }]
|
|
152
|
-
}] });
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1wcm9kdWN0L3NyYy9saWIvcGFnZXMvcHJvZHVjdC1tYW5hZ2UvcHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5L3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS9wcm9kdWN0LW1hbmFnZS1pbnZlbnRvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUUzRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7O0FBU3ZCLE1BQU0sT0FBTywrQkFBZ0MsU0FBUSxhQUFhO0lBUGxFOztRQVFFLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztR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Q0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQWxJVSwrQkFBK0I7a0dBQS9CLCtCQUErQiwrU0NqQjVDLHdqREFxQ0EscUZEeEJZLG1CQUFtQiwyMEJBQUUsdUJBQXVCLG95REFBRSxnQkFBZ0IsZ0lBQUUsNkJBQTZCLDJFQUFFLGVBQWU7OzJGQUk3RywrQkFBK0I7a0JBUDNDLFNBQVM7K0JBQ0UsbUNBQW1DLGNBQ2pDLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLDZCQUE2QixFQUFFLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBtb2RlbCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmd1bGFyQ29tbW9uTW9kdWxlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IEFuZ3VsYXJDb21wb25lbnRzTW9kdWxlLCBCYXNlQ29tcG9uZW50LCBUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQcm9kdWN0TWFuYWdlQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtbWFuYWdlLWNvbnRlbnQvcHJvZHVjdC1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgSW52ZW50b3J5U2VydmljZSwgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0FuZ3VsYXJDb21tb25Nb2R1bGUsIEFuZ3VsYXJDb21wb25lbnRzTW9kdWxlLCBUb29sYmFyQ29tcG9uZW50LCBQcm9kdWN0TWFuYWdlQ29udGVudENvbXBvbmVudCwgTWF0U2VsZWN0TW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pbnZlbnRvcnkuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TWFuYWdlSW52ZW50b3J5Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByb2R1Y3RTZXJ2aWNlID0gaW5qZWN0KFByb2R1Y3RTZXJ2aWNlKTtcbiAgaW52ZW50b3J5U2VydmljZSA9IGluamVjdChJbnZlbnRvcnlTZXJ2aWNlKTtcblxuICBpbnZlbnRvcnlFbmFibGVkID0gZmFsc2U7XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgcHJvZHVjdCE6IFByb2R1Y3Q7XG4gIGxvY2F0aW9ucyA9IG1vZGVsPGFueT4oKTtcbiAgc2VsZWN0ZWRMb2NhdGlvbjogYW55O1xuICBhbW91bnQgPSAwO1xuICBpbnZlbnRvcnlJdGVtOiBhbnkgPSB7XG4gICAgbGV2ZWxzOiBbXSxcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlkID0gdGhpcy5yb3V0ZS5wYXJlbnQ/LnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKSBhcyBzdHJpbmc7XG4gICAgdGhpcy5nZXRQcm9kdWN0KCk7XG4gICAgdGhpcy5maW5kSW52ZW50b3J5TG9jYXRpb25zKCk7XG4gICAgdGhpcy5maW5kSW52ZW50b3J5SXRlbXNCeVByb2R1Y3RJZCgpO1xuICB9XG4gIGdldFByb2R1Y3QoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldCh0aGlzLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdCA9IHJlcy5kYXRhO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZEludmVudG9yeUl0ZW1zQnlQcm9kdWN0SWQoKSB7XG4gICAgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmZpbmRJbnZlbnRvcnlJdGVtQnlQcm9kdWN0SWQodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5pbnZlbnRvcnlFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmludmVudG9yeUl0ZW0gPSByZXMuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kSW52ZW50b3J5TG9jYXRpb25zKCkge1xuICAgIHRoaXMuaW52ZW50b3J5U2VydmljZS5maW5kTG9jYXRpb25zKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvY2F0aW9ucy5zZXQocmVzLmRhdGEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSByZXMuZGF0YVswXTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25JbnZlbnRvcnlTbGlkZVRvZ2dsZShldmVudDogTWF0U2xpZGVUb2dnbGVDaGFuZ2UpIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IGV2ZW50LmNoZWNrZWQ7XG4gICAgdGhpcy5pbnZlbnRvcnlFbmFibGVkID0gbmV3U3RhdGU7XG4gICAgaWYgKCFuZXdTdGF0ZSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgdGl0bGU6ICflj5bmtojlupPlrZjnrZbnlaXlkJcnLFxuICAgICAgICBtZXNzYWdlOiAn6L+Z5Lya5Yig6Zmk546w5pyJ562W55WlLCDnoa7lrprlkJc/JyxcbiAgICAgICAgY2FuY2VsVGV4dDogJ+WPlua2iCcsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAn56Gu6K6kJyxcbiAgICAgIH07XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihvcHRpb25zKTtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jb25maXJtZWQoKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRlbGV0ZUludmVudG9yeUl0ZW1zQnlQcm9kdWN0SWQodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52ZW50b3J5RW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52ZW50b3J5SXRlbSA9IHt9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5jaGVja2VkID0gIW5ld1N0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBvblNlbGVjdGlvbkNoYW5nZShpdGVtLCBldmVudDogYW55KSB7XG4gICAgaXRlbS5sb2NhdGlvbklkID0gZXZlbnQudmFsdWUuaWQ7XG4gIH1cbiAgY29tcGFyZUZuKG8xOiBhbnksIG8yOiBhbnkpIHtcbiAgICByZXR1cm4gbzEuaWQgPT09IG8yLmlkO1xuICB9XG4gIGFkZCgpIHtcbiAgICBjb25zdCBsZXZlbCA9IHtcbiAgICAgIGxvY2F0aW9uOiB7fSxcbiAgICAgIGFtb3VudDogMCxcbiAgICB9O1xuICAgIHRoaXMuaW52ZW50b3J5SXRlbS5sZXZlbHMucHVzaChsZXZlbCk7XG4gIH1cbiAgc2F2ZSgpIHtcbiAgICBjb25zdCBsb2NhdGlvbklkcyA9IF8ubWFwKHRoaXMuaW52ZW50b3J5SXRlbS5sZXZlbHMsICdsb2NhdGlvbi5pZCcpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZWQgPSBuZXcgU2V0KGxvY2F0aW9uSWRzKS5zaXplICE9PSBsb2NhdGlvbklkcy5sZW5ndGg7XG4gICAgaWYgKGR1cGxpY2F0ZWQpIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ+S7k+W6k+mHjeWkjScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgIHByb2R1Y3RJZDogdGhpcy5pZCxcbiAgICAgIGxldmVsczogW10sXG4gICAgfTtcbiAgICB0aGlzLmludmVudG9yeUl0ZW0ubGV2ZWxzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGRhdGEubGV2ZWxzLnB1c2goe1xuICAgICAgICBsb2NhdGlvbklkOiBpdGVtLmxvY2F0aW9uLmlkLFxuICAgICAgICBhbW91bnQ6IGl0ZW0uYW1vdW50LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmFkZEludmVudG9yeUl0ZW0oZGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbign5L+d5a2Y5oiQ5YqfJyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZUxldmVsKGluZGV4LCBsZXZlbDogYW55KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHRpdGxlOiAn56Gu5a6a5Yig6Zmk5ZCXJyxcbiAgICAgIG1lc3NhZ2U6IGDov5nkvJrliKDpmaTnjrDmnInku5PlupMke2xldmVsLmxvY2F0aW9uLm5hbWV95ZWG5ZOB5bqT5a2Y5pWw5o2uLCDnoa7lrprlkJc/YCxcbiAgICAgIGNhbmNlbFRleHQ6ICflj5bmtognLFxuICAgICAgY29uZmlybVRleHQ6ICfnoa7orqQnLFxuICAgIH07XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4ob3B0aW9ucyk7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm1lZCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLmludmVudG9yeVNlcnZpY2UuZGVsZXRlSW52ZW50b3J5TGV2ZWwobGV2ZWwuaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaW52ZW50b3J5SXRlbS5sZXZlbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1jb250ZW50PlxuICA8cm9sYXRlY2gtdG9vbGJhciB0aXRsZT1cIuW6k+WtmOiuvue9rlwiIGNsYXNzPVwiaGlkZGVuIG1kOmJsb2NrXCIgZGl2aWRlcj48L3JvbGF0ZWNoLXRvb2xiYXI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgI2ludmVudG9yeVNsaWRlXG4gICAgICBbY2hlY2tlZF09XCJpbnZlbnRvcnlFbmFibGVkXCJcbiAgICAgIChjaGFuZ2UpPVwib25JbnZlbnRvcnlTbGlkZVRvZ2dsZSgkZXZlbnQpXCJcbiAgICA+PC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDxkaXY+6Lef6Liq5bqT5a2YPC9kaXY+XG4gIDwvZGl2PlxuICBAaWYgKGludmVudG9yeUVuYWJsZWQpIHtcbiAgICBAZm9yIChpdGVtIG9mIGludmVudG9yeUl0ZW0ubGV2ZWxzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0zIGl0ZW1zLWNlbnRlciBweS0yXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPuS7k+W6kzwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IFtjb21wYXJlV2l0aF09XCJjb21wYXJlRm5cIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKGl0ZW0sICRldmVudClcIiBbKG5nTW9kZWwpXT1cIml0ZW0ubG9jYXRpb25cIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgbG9jYXRpb25zKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOaVsOmHjyA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJpdGVtLmFtb3VudFwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlTGV2ZWwoJGluZGV4LCBpdGVtKVwiPuWIoOmZpDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0zXCI+XG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZCgpXCI+5re75YqgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cInNhdmUoKVwiPuS/neWtmDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvcm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtY29udGVudD5cbiJdfQ==
|
package/esm2022/lib/pages/product-manage/product-manage-item/product-manage-item.component.mjs
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Component, input, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { ProductStatus } from '../../../interfaces';
|
|
4
|
-
import { ImagePlaceholderComponent, ThumbnailComponent } from '@rolatech/angular-components';
|
|
5
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
7
|
-
import { MatIcon } from '@angular/material/icon';
|
|
8
|
-
import { FixedPipe } from '@rolatech/angular-common';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/material/button";
|
|
11
|
-
import * as i2 from "@angular/material/menu";
|
|
12
|
-
export class ProductManageItemComponent {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.product = input.required();
|
|
15
|
-
this.thumbnail = input();
|
|
16
|
-
this.status = ProductStatus;
|
|
17
|
-
}
|
|
18
|
-
publish() { }
|
|
19
|
-
archived() { }
|
|
20
|
-
delete() { }
|
|
21
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: ProductManageItemComponent, isStandalone: true, selector: "rolatech-product-manage-item", inputs: { product: { classPropertyName: "product", publicName: "product", isSignal: true, isRequired: true, transformFunction: null }, thumbnail: { classPropertyName: "thumbnail", publicName: "thumbnail", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"flex p-3 items-center hover:bg-[--rt-raised-background] cursor-pointer\">\n <div>\n @if (product().media) {\n <div class=\"min-w-24 w-36 object-cover aspect-video rounded-lg mr-3\">\n @defer (on viewport()) {\n <rolatech-thumbnail [src]=\"product().media[0].url + '!w400'\" size=\"medium\"> </rolatech-thumbnail>\n } @placeholder {\n <div class=\"bg-[--rt-raised-background] h-full w-full object-cover aspect-video rounded-lg\"></div>\n }\n </div>\n } @else {\n <div class=\"min-w-24 w-36 object-cover aspect-video rounded-lg mr-3\">\n <rolatech-image-placeholder></rolatech-image-placeholder>\n </div>\n }\n </div>\n <div class=\"px-3\">\n {{ product().name }}\n </div>\n <div class=\"flex-1\"></div>\n <div class=\"px-3 min-w-28 w-28\">\n {{ status[product().status] }}\n </div>\n <div class=\"px-3 min-w-28 w-28\">\u00A5{{ product().price | fixed }}</div>\n <div class=\"pr-4\">\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n @if (product().status === 'DRAFT') {\n <button mat-menu-item (click)=\"publish()\">\n <span> \u4E0A\u67B6 </span>\n </button>\n }\n @if (product().status === 'STARTED') {\n <button mat-menu-item (click)=\"archived()\">\n <span> \u7ED3\u675F </span>\n </button>\n }\n @if (product().status !== 'ACTIVE') {\n <button mat-menu-item (click)=\"delete()\">\n <span> \u5220\u9664 </span>\n </button>\n }\n </mat-menu>\n </div>\n</div>\n<div class=\"h-[1px] px-3 bg-[--rt-raised-background]\"></div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ImagePlaceholderComponent, selector: "rolatech-image-placeholder" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: FixedPipe, name: "fixed" }], encapsulation: i0.ViewEncapsulation.None, deferBlockDependencies: [() => [ThumbnailComponent]] }); }
|
|
23
|
-
}
|
|
24
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ProductManageItemComponent, decorators: [{
|
|
25
|
-
type: Component,
|
|
26
|
-
args: [{ selector: 'rolatech-product-manage-item', standalone: true, imports: [CommonModule, ThumbnailComponent, ImagePlaceholderComponent, MatButtonModule, MatMenuModule, MatIcon, FixedPipe], encapsulation: ViewEncapsulation.None, template: "<div class=\"flex p-3 items-center hover:bg-[--rt-raised-background] cursor-pointer\">\n <div>\n @if (product().media) {\n <div class=\"min-w-24 w-36 object-cover aspect-video rounded-lg mr-3\">\n @defer (on viewport()) {\n <rolatech-thumbnail [src]=\"product().media[0].url + '!w400'\" size=\"medium\"> </rolatech-thumbnail>\n } @placeholder {\n <div class=\"bg-[--rt-raised-background] h-full w-full object-cover aspect-video rounded-lg\"></div>\n }\n </div>\n } @else {\n <div class=\"min-w-24 w-36 object-cover aspect-video rounded-lg mr-3\">\n <rolatech-image-placeholder></rolatech-image-placeholder>\n </div>\n }\n </div>\n <div class=\"px-3\">\n {{ product().name }}\n </div>\n <div class=\"flex-1\"></div>\n <div class=\"px-3 min-w-28 w-28\">\n {{ status[product().status] }}\n </div>\n <div class=\"px-3 min-w-28 w-28\">\u00A5{{ product().price | fixed }}</div>\n <div class=\"pr-4\">\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n @if (product().status === 'DRAFT') {\n <button mat-menu-item (click)=\"publish()\">\n <span> \u4E0A\u67B6 </span>\n </button>\n }\n @if (product().status === 'STARTED') {\n <button mat-menu-item (click)=\"archived()\">\n <span> \u7ED3\u675F </span>\n </button>\n }\n @if (product().status !== 'ACTIVE') {\n <button mat-menu-item (click)=\"delete()\">\n <span> \u5220\u9664 </span>\n </button>\n }\n </mat-menu>\n </div>\n</div>\n<div class=\"h-[1px] px-3 bg-[--rt-raised-background]\"></div>\n" }]
|
|
27
|
-
}] });
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWl0ZW0vcHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWl0ZW0vcHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFXLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQVVyRCxNQUFNLE9BQU8sMEJBQTBCO0lBUnZDO1FBU0UsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVcsQ0FBQztRQUNwQyxjQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDcEIsV0FBTSxHQUFHLGFBQWEsQ0FBQztLQUl4QjtJQUhDLE9BQU8sS0FBSSxDQUFDO0lBQ1osUUFBUSxLQUFJLENBQUM7SUFDYixNQUFNLEtBQUksQ0FBQzs4R0FOQSwwQkFBMEI7a0dBQTFCLDBCQUEwQixxV0NqQnZDLDgwREFxREEseUREekNZLFlBQVksK0JBQXNCLHlCQUF5QixzRUFBRSxlQUFlLDJJQUFFLGFBQWEsOHZCQUFFLE9BQU8sc0lBQUUsU0FBUyw4RkFBakcsa0JBQWtCOzsyRkFLL0IsMEJBQTBCO2tCQVJ0QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLGlCQUczRyxpQkFBaUIsQ0FBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQcm9kdWN0LCBQcm9kdWN0U3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJbWFnZVBsYWNlaG9sZGVyQ29tcG9uZW50LCBUaHVtYm5haWxDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBGaXhlZFBpcGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVGh1bWJuYWlsQ29tcG9uZW50LCBJbWFnZVBsYWNlaG9sZGVyQ29tcG9uZW50LCBNYXRCdXR0b25Nb2R1bGUsIE1hdE1lbnVNb2R1bGUsIE1hdEljb24sIEZpeGVkUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWl0ZW0uY29tcG9uZW50LnNjc3MnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TWFuYWdlSXRlbUNvbXBvbmVudCB7XG4gIHByb2R1Y3QgPSBpbnB1dC5yZXF1aXJlZDxQcm9kdWN0PigpO1xuICB0aHVtYm5haWwgPSBpbnB1dCgpO1xuICBzdGF0dXMgPSBQcm9kdWN0U3RhdHVzO1xuICBwdWJsaXNoKCkge31cbiAgYXJjaGl2ZWQoKSB7fVxuICBkZWxldGUoKSB7fVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggcC0zIGl0ZW1zLWNlbnRlciBob3ZlcjpiZy1bLS1ydC1yYWlzZWQtYmFja2dyb3VuZF0gY3Vyc29yLXBvaW50ZXJcIj5cbiAgPGRpdj5cbiAgICBAaWYgKHByb2R1Y3QoKS5tZWRpYSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTI0IHctMzYgb2JqZWN0LWNvdmVyIGFzcGVjdC12aWRlbyByb3VuZGVkLWxnIG1yLTNcIj5cbiAgICAgICAgQGRlZmVyIChvbiB2aWV3cG9ydCgpKSB7XG4gICAgICAgICAgPHJvbGF0ZWNoLXRodW1ibmFpbCBbc3JjXT1cInByb2R1Y3QoKS5tZWRpYVswXS51cmwgKyAnIXc0MDAnXCIgc2l6ZT1cIm1lZGl1bVwiPiA8L3JvbGF0ZWNoLXRodW1ibmFpbD5cbiAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1bLS1ydC1yYWlzZWQtYmFja2dyb3VuZF0gaC1mdWxsIHctZnVsbCBvYmplY3QtY292ZXIgYXNwZWN0LXZpZGVvIHJvdW5kZWQtbGdcIj48L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWluLXctMjQgdy0zNiBvYmplY3QtY292ZXIgYXNwZWN0LXZpZGVvIHJvdW5kZWQtbGcgbXItM1wiPlxuICAgICAgICA8cm9sYXRlY2gtaW1hZ2UtcGxhY2Vob2xkZXI+PC9yb2xhdGVjaC1pbWFnZS1wbGFjZWhvbGRlcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJweC0zXCI+XG4gICAge3sgcHJvZHVjdCgpLm5hbWUgfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInB4LTMgbWluLXctMjggdy0yOFwiPlxuICAgIHt7IHN0YXR1c1twcm9kdWN0KCkuc3RhdHVzXSB9fVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInB4LTMgbWluLXctMjggdy0yOFwiPsKle3sgcHJvZHVjdCgpLnByaWNlIHwgZml4ZWQgfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInByLTRcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJFeGFtcGxlIGljb24tYnV0dG9uIHdpdGggYSBtZW51XCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyA9PT0gJ0RSQUZUJykge1xuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInB1Ymxpc2goKVwiPlxuICAgICAgICAgIDxzcGFuPiDkuIrmnrYgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyA9PT0gJ1NUQVJURUQnKSB7XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXJjaGl2ZWQoKVwiPlxuICAgICAgICAgIDxzcGFuPiDnu5PmnZ8gPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyAhPT0gJ0FDVElWRScpIHtcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIDxzcGFuPiDliKDpmaQgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L21hdC1tZW51PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImgtWzFweF0gcHgtMyBiZy1bLS1ydC1yYWlzZWQtYmFja2dyb3VuZF1cIj48L2Rpdj5cbiJdfQ==
|