@rolatech/angular-product 17.0.0 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/esm2022/index.mjs +5 -12
  2. package/esm2022/lib/components/index.mjs +12 -0
  3. package/esm2022/lib/components/product-action/product-action.component.mjs +25 -0
  4. package/esm2022/lib/components/product-info/product-info.component.mjs +17 -0
  5. package/esm2022/lib/components/product-item/product-item.component.mjs +17 -0
  6. package/esm2022/lib/components/product-manage-option-add/product-manage-option-add.component.mjs +68 -0
  7. package/esm2022/lib/components/product-manage-option-item/product-manage-option-item.component.mjs +49 -0
  8. package/esm2022/lib/components/product-manage-variant/product-manage-variant.component.mjs +115 -0
  9. package/esm2022/lib/components/product-mange-option-action/product-manage-option-action.component.mjs +22 -0
  10. package/esm2022/lib/components/product-mange-section-item/product-mange-section-item.component.mjs +89 -0
  11. package/esm2022/lib/components/product-media/product-media.component.mjs +34 -0
  12. package/esm2022/lib/components/product-option/product-option.component.mjs +23 -0
  13. package/esm2022/lib/components/product-owner-renderer/product-owner-renderer.component.mjs +20 -0
  14. package/esm2022/lib/components/product-pricing/product-pricing.component.mjs +31 -0
  15. package/esm2022/lib/components/product-section/product-section.component.mjs +26 -0
  16. package/esm2022/lib/interfaces/category.mjs +2 -0
  17. package/esm2022/lib/interfaces/index.mjs +2 -0
  18. package/esm2022/lib/interfaces/product.mjs +32 -0
  19. package/esm2022/lib/pages/product/product-category/product-category.component.mjs +70 -8
  20. package/esm2022/lib/pages/product/product-details/product-details.component.mjs +193 -0
  21. package/esm2022/lib/pages/product/product-details/selected.pipe.mjs +18 -0
  22. package/esm2022/lib/pages/product/product-index/product-index.component.mjs +39 -8
  23. package/esm2022/lib/pages/product/product-layout/product-layout.component.mjs +46 -8
  24. package/esm2022/lib/pages/product/product.routes.mjs +3 -3
  25. package/esm2022/lib/pages/product-manage/product-manage-content/product-manage-content.component.mjs +5 -5
  26. package/esm2022/lib/pages/product-manage/product-manage-create/product-manage-create.component.mjs +61 -0
  27. package/esm2022/lib/pages/product-manage/product-manage-index/product-manage-index.component.mjs +155 -0
  28. package/esm2022/lib/pages/product-manage/product-manage-info/product-manage-info.component.mjs +98 -8
  29. package/esm2022/lib/pages/product-manage/product-manage-inventory/product-manage-inventory.component.mjs +14 -0
  30. package/esm2022/lib/pages/product-manage/product-manage-item/product-manage-item.component.mjs +27 -0
  31. package/esm2022/lib/pages/product-manage/product-manage-item-header/product-manage-item-header.component.mjs +12 -0
  32. package/esm2022/lib/pages/product-manage/product-manage-layout/product-manage-layout.component.mjs +51 -8
  33. package/esm2022/lib/pages/product-manage/product-manage-media/product-manage-media.component.mjs +133 -8
  34. package/esm2022/lib/pages/product-manage/product-manage-options/product-manage-options.component.mjs +102 -0
  35. package/esm2022/lib/pages/product-manage/product-manage-pricing/product-manage-pricing.component.mjs +5 -5
  36. package/esm2022/lib/pages/product-manage/product-manage-schedule/product-manage-schedule.component.mjs +14 -0
  37. package/esm2022/lib/pages/product-manage/product-manage-sections/product-manage-sections.component.mjs +170 -0
  38. package/esm2022/lib/pages/product-manage/product-manage-variants/product-manage-variants.component.mjs +133 -0
  39. package/esm2022/lib/pages/product-manage/product-manage.routes.mjs +34 -4
  40. package/esm2022/lib/services/index.mjs +4 -0
  41. package/esm2022/lib/services/product-category.service.mjs +38 -0
  42. package/esm2022/provider.mjs +13 -0
  43. package/fesm2022/rolatech-angular-product-product-index.component-C_cbg95R.mjs +70 -0
  44. package/fesm2022/rolatech-angular-product-product-index.component-C_cbg95R.mjs.map +1 -0
  45. package/fesm2022/rolatech-angular-product.mjs +1697 -76
  46. package/fesm2022/rolatech-angular-product.mjs.map +1 -1
  47. package/index.d.ts +4 -11
  48. package/lib/components/index.d.ts +11 -0
  49. package/lib/components/product-action/product-action.component.d.ts +11 -0
  50. package/lib/components/product-info/product-info.component.d.ts +7 -0
  51. package/lib/components/product-item/product-item.component.d.ts +7 -0
  52. package/lib/components/product-manage-option-add/product-manage-option-add.component.d.ts +20 -0
  53. package/lib/components/product-manage-option-item/product-manage-option-item.component.d.ts +14 -0
  54. package/lib/components/product-manage-variant/product-manage-variant.component.d.ts +18 -0
  55. package/lib/components/product-mange-option-action/product-manage-option-action.component.d.ts +10 -0
  56. package/lib/components/product-mange-section-item/product-mange-section-item.component.d.ts +33 -0
  57. package/lib/components/product-media/product-media.component.d.ts +12 -0
  58. package/lib/components/product-option/product-option.component.d.ts +14 -0
  59. package/lib/components/product-owner-renderer/product-owner-renderer.component.d.ts +8 -0
  60. package/lib/components/product-pricing/product-pricing.component.d.ts +12 -0
  61. package/lib/components/product-section/product-section.component.d.ts +16 -0
  62. package/lib/interfaces/category.d.ts +16 -0
  63. package/lib/interfaces/index.d.ts +2 -0
  64. package/lib/interfaces/product.d.ts +91 -0
  65. package/lib/pages/product/product-category/product-category.component.d.ts +19 -2
  66. package/lib/pages/product/product-details/product-details.component.d.ts +39 -0
  67. package/lib/pages/product/product-details/selected.pipe.d.ts +8 -0
  68. package/lib/pages/product/product-index/product-index.component.d.ts +12 -2
  69. package/lib/pages/product/product-layout/product-layout.component.d.ts +15 -2
  70. package/lib/pages/product-manage/product-manage-content/product-manage-content.component.d.ts +1 -1
  71. package/lib/pages/product-manage/product-manage-create/product-manage-create.component.d.ts +11 -0
  72. package/lib/pages/product-manage/product-manage-index/product-manage-index.component.d.ts +38 -0
  73. package/lib/pages/product-manage/product-manage-info/product-manage-info.component.d.ts +26 -2
  74. package/lib/pages/product-manage/product-manage-inventory/product-manage-inventory.component.d.ts +5 -0
  75. package/lib/pages/product-manage/product-manage-item/product-manage-item.component.d.ts +12 -0
  76. package/lib/pages/product-manage/product-manage-item-header/product-manage-item-header.component.d.ts +5 -0
  77. package/lib/pages/product-manage/product-manage-layout/product-manage-layout.component.d.ts +22 -2
  78. package/lib/pages/product-manage/product-manage-media/product-manage-media.component.d.ts +26 -2
  79. package/lib/pages/product-manage/product-manage-options/product-manage-options.component.d.ts +17 -0
  80. package/lib/pages/product-manage/product-manage-pricing/product-manage-pricing.component.d.ts +1 -1
  81. package/lib/pages/product-manage/product-manage-schedule/product-manage-schedule.component.d.ts +5 -0
  82. package/lib/pages/product-manage/product-manage-sections/product-manage-sections.component.d.ts +29 -0
  83. package/lib/pages/product-manage/product-manage-variants/product-manage-variants.component.d.ts +27 -0
  84. package/lib/services/index.d.ts +3 -0
  85. package/lib/services/product-category.service.d.ts +12 -0
  86. package/package.json +1 -1
  87. package/provider.d.ts +2 -0
  88. package/themes/_default.scss +1 -1
  89. package/esm2022/lib/angular-product/angular-product.component.mjs +0 -12
  90. package/esm2022/lib/pages/product/product-detail/product-detail.component.mjs +0 -12
  91. package/esm2022/lib/pages/product-manage/product-manage-details/product-manage-details.component.mjs +0 -12
  92. package/lib/angular-product/angular-product.component.d.ts +0 -5
  93. package/lib/pages/product/product-detail/product-detail.component.d.ts +0 -5
  94. package/lib/pages/product-manage/product-manage-details/product-manage-details.component.d.ts +0 -5
@@ -0,0 +1,155 @@
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.1.4", ngImport: i0, type: ProductManageIndexComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
138
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.4", 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\n [product]=\"item\"\n routerLink=\"/products/{{ item.id }}/manage/info\"\n ></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.1.4", 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\n [product]=\"item\"\n routerLink=\"/products/{{ item.id }}/manage/info\"\n ></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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXByb2R1Y3Qvc3JjL2xpYi9wYWdlcy9wcm9kdWN0LW1hbmFnZS9wcm9kdWN0LW1hbmFnZS1pbmRleC9wcm9kdWN0LW1hbmFnZS1pbmRleC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZGV4L3Byb2R1Y3QtbWFuYWdlLWluZGV4LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBYSxNQUFNLDZCQUE2QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0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QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXpIVSwyQkFBMkI7a0dBQTNCLDJCQUEyQixvSUFDaEIsWUFBWSxnRUNsQ3BDLDg0QkErQkEsMGhCRFpJLGVBQWUsNE5BQ2YsVUFBVSxtT0FDVixhQUFhLG1MQUNiLGNBQWMsOEJBQ2QsYUFBYSw4QkFDYixrQkFBa0Isb1NBQ2xCLGdCQUFnQixnSUFDaEIsZ0JBQWdCLGdGQUNoQiwwQkFBMEIsMkdBQzFCLGdDQUFnQzs7MkZBS3ZCLDJCQUEyQjtrQkFsQnZDLFNBQVM7K0JBQ0UsK0JBQStCLGNBQzdCLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLFVBQVU7d0JBQ1YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsMEJBQTBCO3dCQUMxQixnQ0FBZ0M7cUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFBhZ2luYXRvck1vZHVsZSwgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0VGFibGVNb2R1bGUsIE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVG9vbGJhckNvbXBvbmVudCwgU3Bpbm5lckNvbXBvbmVudCwgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLXNlcnZpY2VzJztcbmltcG9ydCB7IFByb2R1Y3QsIFByb2R1Y3RTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFByb2R1Y3RNYW5hZ2VJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vcHJvZHVjdC1tYW5hZ2UtaXRlbS9wcm9kdWN0LW1hbmFnZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TWFuYWdlSXRlbUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWluZGV4JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBTcGlubmVyQ29tcG9uZW50LFxuICAgIFByb2R1Y3RNYW5hZ2VJdGVtQ29tcG9uZW50LFxuICAgIFByb2R1Y3RNYW5hZ2VJdGVtSGVhZGVyQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5kZXguY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TWFuYWdlSW5kZXhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwYWdpbmF0b3IgPSB2aWV3Q2hpbGQoTWF0UGFnaW5hdG9yKTtcbiAgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHNuYWNrQmFyID0gaW5qZWN0KE1hdFNuYWNrQmFyKTtcbiAgcHJvZHVjdFNlcnZpY2UgPSBpbmplY3QoUHJvZHVjdFNlcnZpY2UpO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgaXNTZWFyY2ggPSBmYWxzZTtcbiAgcGFnZUV2ZW50ITogUGFnZUV2ZW50O1xuICBsZW5ndGggPSAxMDA7XG4gIHBhZ2VTaXplID0gMTU7XG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDI1LCAxMDBdO1xuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KCk7XG4gIHByb2R1Y3RzOiBQcm9kdWN0W10gPSBbXTtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ25hbWUnLCAnc3RhdHVzJywgJ2NyZWF0ZWRBdCcsICdhY3Rpb25zJ107XG4gIG9yZGVyT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdjcmVhdGVkQXQnLFxuICAgICAgdmFsdWU6ICfliJvlu7rml7bpl7QnLFxuICAgICAgaWNvbjogJ2Fycm93X3Vwd2FyZCcsXG4gICAgICBzb3J0OiAnYXNjJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2NyZWF0ZWRBdCcsXG4gICAgICB2YWx1ZTogJ+WIm+W7uuaXtumXtCcsXG4gICAgICBpY29uOiAnYXJyb3dfZG93bndhcmQnLFxuICAgICAgc29ydDogJ2Rlc2MnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnc3RhdHVzJyxcbiAgICAgIHZhbHVlOiAn54q25oCBJyxcbiAgICAgIGljb246ICdhcnJvd191cHdhcmQnLFxuICAgICAgc29ydDogJ2FzYycsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgdmFsdWU6ICfnirbmgIEnLFxuICAgICAgaWNvbjogJ2Fycm93X2Rvd253YXJkJyxcbiAgICAgIHNvcnQ6ICdkZXNjJyxcbiAgICB9LFxuICBdO1xuICBzdGF0dXM6IGFueSA9IFByb2R1Y3RTdGF0dXM7XG4gIG9yZGVyU3RyaW5nID0gJ2NyZWF0ZWRBdCBkZXNjJztcbiAgY2xhc3Nyb29tczogYW55O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmluZChudWxsKTtcbiAgfVxuICBmaW5kKGV2ZW50PzogUGFnZUV2ZW50IHwgbnVsbCk6IGFueSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudCA/IGV2ZW50LnBhZ2VJbmRleCArIDEgOiAxO1xuICAgIGNvbnN0IGxpbWl0ID0gZXZlbnQgPyBldmVudC5wYWdlU2l6ZSA6IDE1O1xuICAgIGNvbnN0IHNvcnQgPSB0aGlzLm9yZGVyU3RyaW5nO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBwYWdlLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgIH07XG4gICAgdGhpcy5wcm9kdWN0U2VydmljZS5tZShvcHRpb25zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdHMgPSByZXMuZGF0YTtcbiAgICAgICAgLy8gdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnByb2R1Y3RzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHJlcy5tZXRhLnBhZ2luYXRpb24uY291bnQ7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFyY2hpdmVkKHByb2R1Y3Q6IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICfllYblk4HkuIvmnrYnLFxuICAgICAgICBtZXNzYWdlOiBg56Gu5a6a5LiL5p62ICR7cHJvZHVjdC5uYW1lfSDlkJc/YCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmFyY2hpdmVkKHByb2R1Y3QuaWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnByb2R1Y3RzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gcHJvZHVjdC5pZCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBQcm9kdWN0U3RhdHVzW1Byb2R1Y3RTdGF0dXMuQVJDSElWRURdO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1tpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCfnu5PmnZ/miJDlip8nKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGUubWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZGVsZXRlKHByb2R1Y3Q6IFByb2R1Y3QpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAn5Yig6Zmk5ZWG5ZOBJyxcbiAgICAgICAgbWVzc2FnZTogYOehruWumuWIoOmZpCAke3Byb2R1Y3QubmFtZX0g5ZCXP2AsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS5kZWxldGUocHJvZHVjdC5pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucHJvZHVjdHMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBwcm9kdWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5wcm9kdWN0cztcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ+WIoOmZpOaIkOWKnycpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZS5tZXNzYWdlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPHJvbGF0ZWNoLXRvb2xiYXIgdGl0bGU9XCLllYblk4FcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHJvdXRlckxpbms9XCIuL2NyZWF0ZVwiPlxuICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICDliJvlu7rllYblk4FcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3JvbGF0ZWNoLXRvb2xiYXI+XG5AaWYgKGlzTG9hZGluZykge1xuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICA8cm9sYXRlY2gtc3Bpbm5lcj48L3JvbGF0ZWNoLXNwaW5uZXI+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlcj48L3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyPlxuICBAZm9yIChpdGVtIG9mIHByb2R1Y3RzOyB0cmFjayAkaW5kZXgpIHtcbiAgICA8cm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtaXRlbVxuICAgICAgW3Byb2R1Y3RdPVwiaXRlbVwiXG4gICAgICByb3V0ZXJMaW5rPVwiL3Byb2R1Y3RzL3t7IGl0ZW0uaWQgfX0vbWFuYWdlL2luZm9cIlxuICAgID48L3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWl0ZW0+XG4gIH1cbiAgPG1hdC1wYWdpbmF0b3JcbiAgICAjcGFnaW5hdG9yXG4gICAgW2xlbmd0aF09XCJsZW5ndGhcIlxuICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgIChwYWdlKT1cInBhZ2VFdmVudCA9IGZpbmQoJGV2ZW50KVwiXG4gICAgaGlkZVBhZ2VTaXplXG4gICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcbiAgPlxuICA8L21hdC1wYWdpbmF0b3I+XG59XG4iXX0=
@@ -1,12 +1,102 @@
1
- import { Component } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
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 { ProductService } from '@rolatech/angular-services';
12
+ import { ProductStatus, ProductType } from '../../../interfaces';
13
+ import { DecimalDirective } from '@rolatech/angular-common';
14
+ import { ProductCategoryService } from '../../../services';
3
15
  import * as i0 from "@angular/core";
4
- export class ProductManageInfoComponent {
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ProductManageInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: ProductManageInfoComponent, isStandalone: true, selector: "lib-product-manage-info", ngImport: i0, template: "<p class=\"text-lg\">product-manage-info works!</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
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.selectedType = '';
31
+ this.enumKeys = Object.keys(this.productType).filter((key) => isNaN(Number(key)));
32
+ this.enumValues = Object.values(this.productType);
33
+ this.price = model();
34
+ }
35
+ ngOnInit() {
36
+ this.id = this.route.parent?.snapshot.paramMap.get('id');
37
+ this.find();
38
+ this.categoryService.find({}).subscribe({
39
+ next: (res) => {
40
+ this.categories = res.data;
41
+ },
42
+ });
43
+ }
44
+ find() {
45
+ this.productService.get(this.id).subscribe({
46
+ next: (res) => {
47
+ this.product = res.data;
48
+ let price = (this.product.price / 100).toFixed(2);
49
+ this.price.set(price);
50
+ },
51
+ });
52
+ }
53
+ typeCompareFn(t1, t2) {
54
+ return t1 === ProductType[t2];
55
+ }
56
+ compareFn(o1, o2) {
57
+ return o1.id === o2?.id;
58
+ }
59
+ onTypeChange(event) {
60
+ this.product.type = Object.keys(this.productType).find((key) => this.productType[key] === event.value);
61
+ }
62
+ onCategoryChange(event) {
63
+ this.selectedCategoyIds = event.value;
64
+ }
65
+ update() {
66
+ const { name, description, categories } = this.product;
67
+ const data = {
68
+ name,
69
+ description,
70
+ categories,
71
+ price: Number(this.price()) * 100,
72
+ type: this.product.type,
73
+ };
74
+ this.productService.update(this.id, data).subscribe({
75
+ next: (res) => {
76
+ this.snackBarService.open('保存成功');
77
+ },
78
+ error: (e) => {
79
+ this.snackBarService.open(e.message);
80
+ },
81
+ });
82
+ }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.4", type: ProductManageInfoComponent, isStandalone: true, selector: "rolatech-product-manage-info", inputs: { price: { classPropertyName: "price", publicName: "price", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { price: "priceChange" }, 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 (key of enumKeys; track key) {\n <mat-option [value]=\"productType[key]\">\n {{ productType[key] }}\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\">\n <mat-label> \u4EF7\u683C </mat-label>\n <input matInput rolatechDecimal type=\"text\" [(ngModel)]=\"price\" name=\"price\" required />\n </mat-form-field>\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]" }] }); }
7
85
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ProductManageInfoComponent, decorators: [{
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageInfoComponent, decorators: [{
9
87
  type: Component,
10
- args: [{ selector: 'lib-product-manage-info', standalone: true, imports: [CommonModule], template: "<p class=\"text-lg\">product-manage-info works!</p>\n" }]
88
+ args: [{ selector: 'rolatech-product-manage-info', standalone: true, imports: [
89
+ FormsModule,
90
+ MatFormFieldModule,
91
+ MatInputModule,
92
+ TextFieldModule,
93
+ MatSelectModule,
94
+ MatOptionModule,
95
+ MatButtonModule,
96
+ ToolbarComponent,
97
+ ProductManageContentComponent,
98
+ DecimalDirective,
99
+ MatSelectModule,
100
+ ], 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 (key of enumKeys; track key) {\n <mat-option [value]=\"productType[key]\">\n {{ productType[key] }}\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\">\n <mat-label> \u4EF7\u683C </mat-label>\n <input matInput rolatechDecimal type=\"text\" [(ngModel)]=\"price\" name=\"price\" required />\n </mat-form-field>\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"] }]
11
101
  }] });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFTL0MsTUFBTSxPQUFPLDBCQUEwQjs4R0FBMUIsMEJBQTBCO2tHQUExQiwwQkFBMEIsbUZDVnZDLHVEQUNBLHlEREtZLFlBQVk7OzJGQUlYLDBCQUEwQjtrQkFQdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcHJvZHVjdC1tYW5hZ2UtaW5mbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pbmZvLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdE1hbmFnZUluZm9Db21wb25lbnQge31cbiIsIjxwIGNsYXNzPVwidGV4dC1sZ1wiPnByb2R1Y3QtbWFuYWdlLWluZm8gd29ya3MhPC9wPlxuIl19
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWluZm8vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDM0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUE0QixhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7OztBQXFCM0QsTUFBTSxPQUFPLDBCQUEyQixTQUFRLGFBQWE7SUFuQjdEOztRQW9CRSxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRWpELFdBQU0sR0FBRyxhQUFhLENBQUM7UUFHdkIsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFDMUIsaUJBQVksR0FBSSxFQUFFLENBQUM7UUFDbkIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsZUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLFVBQUssR0FBRyxLQUFLLEVBQVUsQ0FBQztLQWlEekI7SUFoREMsUUFBUTtRQUNOLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxhQUFhLENBQUMsRUFBTyxFQUFFLEVBQU87UUFDNUIsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxTQUFTLENBQUMsRUFBbUIsRUFBRSxFQUFtQjtRQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsWUFBWSxDQUFDLEtBQXNCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFFLENBQUM7SUFDMUcsQ0FBQztJQUNELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUNELE1BQU07UUFDSixNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxHQUFHO1lBQ1gsSUFBSTtZQUNKLFdBQVc7WUFDWCxVQUFVO1lBQ1YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHO1lBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2xELElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBM0RVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLHNSQ2xDdkMseTVFQWdFQSxxRkQ3Q0ksV0FBVyxvNENBQ1gsa0JBQWtCLDBTQUNsQixjQUFjLHlrQkFDZCxlQUFlLDhCQUNmLGVBQWUsbXJCQUNmLGVBQWUsOEJBQ2YsZUFBZSw0TkFDZixnQkFBZ0IsZ0lBQ2hCLDZCQUE2Qiw0RUFDN0IsZ0JBQWdCOzsyRkFNUCwwQkFBMEI7a0JBbkJ0QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLDZCQUE2Qjt3QkFDN0IsZ0JBQWdCO3dCQUNoQixlQUFlO3FCQUNoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBtb2RlbCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0TWFuYWdlQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtbWFuYWdlLWNvbnRlbnQvcHJvZHVjdC1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dEZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RleHQtZmllbGQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0U2VsZWN0Q2hhbmdlLCBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBQcm9kdWN0LCBQcm9kdWN0Q2F0ZWdvcnksIFByb2R1Y3RTdGF0dXMsIFByb2R1Y3RUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZWNpbWFsRGlyZWN0aXZlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IFByb2R1Y3RDYXRlZ29yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWluZm8nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIFRleHRGaWVsZE1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBUb29sYmFyQ29tcG9uZW50LFxuICAgIFByb2R1Y3RNYW5hZ2VDb250ZW50Q29tcG9uZW50LFxuICAgIERlY2ltYWxEaXJlY3RpdmUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pbmZvLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdE1hbmFnZUluZm9Db21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvZHVjdFNlcnZpY2UgPSBpbmplY3QoUHJvZHVjdFNlcnZpY2UpO1xuICBjYXRlZ29yeVNlcnZpY2UgPSBpbmplY3QoUHJvZHVjdENhdGVnb3J5U2VydmljZSk7XG4gIHByb2R1Y3QhOiBQcm9kdWN0O1xuICBzdGF0dXMgPSBQcm9kdWN0U3RhdHVzO1xuICBjYXRlZ29yaWVzITogUHJvZHVjdENhdGVnb3J5W107XG4gIHNlbGVjdGVkQ2F0ZWdveUlkcyE6IHN0cmluZ1tdO1xuICBwcm9kdWN0VHlwZSA9IFByb2R1Y3RUeXBlO1xuICBzZWxlY3RlZFR5cGU/ID0gJyc7XG4gIGVudW1LZXlzID0gT2JqZWN0LmtleXModGhpcy5wcm9kdWN0VHlwZSkuZmlsdGVyKChrZXkpID0+IGlzTmFOKE51bWJlcihrZXkpKSk7XG4gIGVudW1WYWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMucHJvZHVjdFR5cGUpO1xuICBwcmljZSA9IG1vZGVsPHN0cmluZz4oKTtcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUucGFyZW50Py5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgc3RyaW5nO1xuICAgIHRoaXMuZmluZCgpO1xuICAgIHRoaXMuY2F0ZWdvcnlTZXJ2aWNlLmZpbmQoe30pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzLmRhdGE7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGZpbmQoKSB7XG4gICAgdGhpcy5wcm9kdWN0U2VydmljZS5nZXQodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3QgPSByZXMuZGF0YTtcbiAgICAgICAgbGV0IHByaWNlID0gKHRoaXMucHJvZHVjdC5wcmljZSAvIDEwMCkudG9GaXhlZCgyKTtcbiAgICAgICAgdGhpcy5wcmljZS5zZXQocHJpY2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICB0eXBlQ29tcGFyZUZuKHQxOiBhbnksIHQyOiBhbnkpIHtcbiAgICByZXR1cm4gdDEgPT09IFByb2R1Y3RUeXBlW3QyXTtcbiAgfVxuICBjb21wYXJlRm4obzE6IFByb2R1Y3RDYXRlZ29yeSwgbzI6IFByb2R1Y3RDYXRlZ29yeSkge1xuICAgIHJldHVybiBvMS5pZCA9PT0gbzI/LmlkO1xuICB9XG4gIG9uVHlwZUNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgdGhpcy5wcm9kdWN0LnR5cGUgPSBPYmplY3Qua2V5cyh0aGlzLnByb2R1Y3RUeXBlKS5maW5kKChrZXkpID0+IHRoaXMucHJvZHVjdFR5cGVba2V5XSA9PT0gZXZlbnQudmFsdWUpITtcbiAgfVxuICBvbkNhdGVnb3J5Q2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdveUlkcyA9IGV2ZW50LnZhbHVlO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yaWVzIH0gPSB0aGlzLnByb2R1Y3Q7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGNhdGVnb3JpZXMsXG4gICAgICBwcmljZTogTnVtYmVyKHRoaXMucHJpY2UoKSkgKiAxMDAsXG4gICAgICB0eXBlOiB0aGlzLnByb2R1Y3QudHlwZSxcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UudXBkYXRlKHRoaXMuaWQsIGRhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ+S/neWtmOaIkOWKnycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKGUubWVzc2FnZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iLCI8cm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtY29udGVudD5cbiAgPHJvbGF0ZWNoLXRvb2xiYXIgdGl0bGU9XCLln7rmnKzkv6Hmga9cIiBjbGFzcz1cImhpZGRlbiBtZDpibG9ja1wiIGRpdmlkZXI+PC9yb2xhdGVjaC10b29sYmFyPlxuICBAaWYgKHByb2R1Y3QpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGZvcm0gI3Byb2R1Y3RGb3JtPVwibmdGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOWVhuWTgeWQjeensCA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInByb2R1Y3QubmFtZVwiIG5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD4g5ZWG5ZOB5o+P6L+wIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvZHVjdC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjNcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiByZXF1aXJlZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPuexu+WeizwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBuYW1lPVwidHlwZVwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwidHlwZUNvbXBhcmVGblwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvZHVjdC50eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2YgZW51bUtleXM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwicHJvZHVjdFR5cGVba2V5XVwiPlxuICAgICAgICAgICAgICAgIHt7IHByb2R1Y3RUeXBlW2tleV0gfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgbmdNb2RlbEdyb3VwPVwiY2F0ZWdvcmllc1wiIHJlcXVpcmVkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+5YiG57G7PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICBuYW1lPVwiaWRcIlxuICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb2R1Y3QuY2F0ZWdvcmllc1wiXG4gICAgICAgICAgICAjc2VsZWN0PVwibWF0U2VsZWN0XCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25DYXRlZ29yeUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGNhdGVnb3JpZXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD4g5Lu35qC8IDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCByb2xhdGVjaERlY2ltYWwgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInByaWNlXCIgbmFtZT1cInByaWNlXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cInByaW1hcnlcIiAoY2xpY2spPVwidXBkYXRlKClcIj7kv53lrZg8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9yb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1jb250ZW50PlxuIl19
@@ -0,0 +1,14 @@
1
+ import { Component } from '@angular/core';
2
+ import { AngularCommonModule } from '@rolatech/angular-common';
3
+ import { AngularComponentsModule, ToolbarComponent } from '@rolatech/angular-components';
4
+ import { ProductManageContentComponent } from '../product-manage-content/product-manage-content.component';
5
+ import * as i0 from "@angular/core";
6
+ export class ProductManageInventoryComponent {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageInventoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductManageInventoryComponent, isStandalone: true, selector: "rolatech-product-manage-inventory", ngImport: i0, template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u5E93\u5B58\u8BBE\u7F6E\" class=\"hidden md:block\" divider></rolatech-toolbar>\n</rolatech-product-manage-content>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: ProductManageContentComponent, selector: "rolatech-product-manage-content" }] }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageInventoryComponent, decorators: [{
11
+ type: Component,
12
+ args: [{ selector: 'rolatech-product-manage-inventory', standalone: true, imports: [AngularCommonModule, AngularComponentsModule, ToolbarComponent, ProductManageContentComponent], template: "<rolatech-product-manage-content>\n <rolatech-toolbar title=\"\u5E93\u5B58\u8BBE\u7F6E\" class=\"hidden md:block\" divider></rolatech-toolbar>\n</rolatech-product-manage-content>\n" }]
13
+ }] });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1wcm9kdWN0L3NyYy9saWIvcGFnZXMvcHJvZHVjdC1tYW5hZ2UvcHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5L3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS9wcm9kdWN0LW1hbmFnZS1pbnZlbnRvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7QUFTM0csTUFBTSxPQUFPLCtCQUErQjs4R0FBL0IsK0JBQStCO2tHQUEvQiwrQkFBK0IsNkZDWjVDLHVMQUdBLHlEREtZLG1CQUFtQiw4QkFBRSx1QkFBdUIsK0JBQUUsZ0JBQWdCLGdJQUFFLDZCQUE2Qjs7MkZBSTVGLCtCQUErQjtrQkFQM0MsU0FBUzsrQkFDRSxtQ0FBbUMsY0FDakMsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJDb21tb25Nb2R1bGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IFByb2R1Y3RNYW5hZ2VDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vcHJvZHVjdC1tYW5hZ2UtY29udGVudC9wcm9kdWN0LW1hbmFnZS1jb250ZW50LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWludmVudG9yeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtBbmd1bGFyQ29tbW9uTW9kdWxlLCBBbmd1bGFyQ29tcG9uZW50c01vZHVsZSwgVG9vbGJhckNvbXBvbmVudCwgUHJvZHVjdE1hbmFnZUNvbnRlbnRDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaW52ZW50b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWludmVudG9yeS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RNYW5hZ2VJbnZlbnRvcnlDb21wb25lbnQge31cbiIsIjxyb2xhdGVjaC1wcm9kdWN0LW1hbmFnZS1jb250ZW50PlxuICA8cm9sYXRlY2gtdG9vbGJhciB0aXRsZT1cIuW6k+WtmOiuvue9rlwiIGNsYXNzPVwiaGlkZGVuIG1kOmJsb2NrXCIgZGl2aWRlcj48L3JvbGF0ZWNoLXRvb2xiYXI+XG48L3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWNvbnRlbnQ+XG4iXX0=
@@ -0,0 +1,27 @@
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 * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/material/button";
10
+ import * as i2 from "@angular/material/menu";
11
+ export class ProductManageItemComponent {
12
+ constructor() {
13
+ this.product = input.required();
14
+ this.thumbnail = input();
15
+ this.status = ProductStatus;
16
+ }
17
+ publish() { }
18
+ archived() { }
19
+ delete() { }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.4", 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-gray-200 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=\"px-3\">\n {{ status[product().status] }}\n </div>\n <div class=\"px-3\">\n {{ product().price }}\n </div>\n <div class=\"flex-1\"></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"] }], encapsulation: i0.ViewEncapsulation.None, deferBlockDependencies: [() => [ThumbnailComponent]] }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageItemComponent, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'rolatech-product-manage-item', standalone: true, imports: [CommonModule, ThumbnailComponent, ImagePlaceholderComponent, MatButtonModule, MatMenuModule, MatIcon], 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-gray-200 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=\"px-3\">\n {{ status[product().status] }}\n </div>\n <div class=\"px-3\">\n {{ product().price }}\n </div>\n <div class=\"flex-1\"></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" }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWl0ZW0vcHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWl0ZW0vcHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFXLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBVWpELE1BQU0sT0FBTywwQkFBMEI7SUFSdkM7UUFTRSxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUNwQixXQUFNLEdBQUcsYUFBYSxDQUFDO0tBSXhCO0lBSEMsT0FBTyxLQUFJLENBQUM7SUFDWixRQUFRLEtBQUksQ0FBQztJQUNiLE1BQU0sS0FBSSxDQUFDOzhHQU5BLDBCQUEwQjtrR0FBMUIsMEJBQTBCLHFXQ2hCdkMsOHhEQXVEQSx5REQ1Q1ksWUFBWSwrQkFBc0IseUJBQXlCLHNFQUFFLGVBQWUsMklBQUUsYUFBYSw4dkJBQUUsT0FBTywyTEFBdEYsa0JBQWtCOzsyRkFLL0IsMEJBQTBCO2tCQVJ0QyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsaUJBR2hHLGlCQUFpQixDQUFDLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFByb2R1Y3QsIFByb2R1Y3RTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEltYWdlUGxhY2Vob2xkZXJDb21wb25lbnQsIFRodW1ibmFpbENvbXBvbmVudCB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtaXRlbScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRodW1ibmFpbENvbXBvbmVudCwgSW1hZ2VQbGFjZWhvbGRlckNvbXBvbmVudCwgTWF0QnV0dG9uTW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXRJY29uXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtaXRlbS5jb21wb25lbnQuc2NzcycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RNYW5hZ2VJdGVtQ29tcG9uZW50IHtcbiAgcHJvZHVjdCA9IGlucHV0LnJlcXVpcmVkPFByb2R1Y3Q+KCk7XG4gIHRodW1ibmFpbCA9IGlucHV0KCk7XG4gIHN0YXR1cyA9IFByb2R1Y3RTdGF0dXM7XG4gIHB1Ymxpc2goKSB7fVxuICBhcmNoaXZlZCgpIHt9XG4gIGRlbGV0ZSgpIHt9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBwLTMgaXRlbXMtY2VudGVyIGhvdmVyOmJnLVstLXJ0LXJhaXNlZC1iYWNrZ3JvdW5kXSBjdXJzb3ItcG9pbnRlclwiPlxuICA8ZGl2PlxuICAgIEBpZiAocHJvZHVjdCgpLm1lZGlhKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWluLXctMjQgdy0zNiBvYmplY3QtY292ZXIgYXNwZWN0LXZpZGVvIHJvdW5kZWQtbGcgbXItM1wiPlxuICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KCkpIHtcbiAgICAgICAgICA8cm9sYXRlY2gtdGh1bWJuYWlsIFtzcmNdPVwicHJvZHVjdCgpLm1lZGlhWzBdLnVybCArICchdzQwMCdcIiBzaXplPVwibWVkaXVtXCI+IDwvcm9sYXRlY2gtdGh1bWJuYWlsPlxuICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJnLWdyYXktMjAwIGgtZnVsbCB3LWZ1bGwgb2JqZWN0LWNvdmVyIGFzcGVjdC12aWRlbyByb3VuZGVkLWxnXCI+PC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LTI0IHctMzYgb2JqZWN0LWNvdmVyIGFzcGVjdC12aWRlbyByb3VuZGVkLWxnIG1yLTNcIj5cbiAgICAgICAgPHJvbGF0ZWNoLWltYWdlLXBsYWNlaG9sZGVyPjwvcm9sYXRlY2gtaW1hZ2UtcGxhY2Vob2xkZXI+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHgtM1wiPlxuICAgIHt7IHByb2R1Y3QoKS5uYW1lIH19XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHgtM1wiPlxuICAgIHt7IHN0YXR1c1twcm9kdWN0KCkuc3RhdHVzXSB9fVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInB4LTNcIj5cbiAgICB7eyBwcm9kdWN0KCkucHJpY2UgfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInByLTRcIj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgIGFyaWEtbGFiZWw9XCJFeGFtcGxlIGljb24tYnV0dG9uIHdpdGggYSBtZW51XCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyA9PT0gJ0RSQUZUJykge1xuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInB1Ymxpc2goKVwiPlxuICAgICAgICAgIDxzcGFuPiDkuIrmnrYgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyA9PT0gJ1NUQVJURUQnKSB7XG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYXJjaGl2ZWQoKVwiPlxuICAgICAgICAgIDxzcGFuPiDnu5PmnZ8gPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAocHJvZHVjdCgpLnN0YXR1cyAhPT0gJ0FDVElWRScpIHtcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIDxzcGFuPiDliKDpmaQgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L21hdC1tZW51PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImgtWzFweF0gcHgtMyBiZy1bLS1ydC1yYWlzZWQtYmFja2dyb3VuZF1cIj48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class ProductManageItemHeaderComponent {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageItemHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductManageItemHeaderComponent, isStandalone: true, selector: "rolatech-product-manage-item-header", ngImport: i0, template: "<div class=\"flex h-11 items-center\">\n <div class=\"w-36 mr-3 px-3 min-w-[320px]\">\u5546\u54C1</div>\n <div class=\"text-md font-bold px-3\">Status</div>\n <div class=\"flex-1\"></div>\n <div class=\"text-md px-3\"></div>\n</div>\n<div class=\"h-[1px] px-3 bg-[--rt-raised-background]\"></div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageItemHeaderComponent, decorators: [{
9
+ type: Component,
10
+ args: [{ selector: 'rolatech-product-manage-item-header', standalone: true, imports: [CommonModule], template: "<div class=\"flex h-11 items-center\">\n <div class=\"w-36 mr-3 px-3 min-w-[320px]\">\u5546\u54C1</div>\n <div class=\"text-md font-bold px-3\">Status</div>\n <div class=\"flex-1\"></div>\n <div class=\"text-md px-3\"></div>\n</div>\n<div class=\"h-[1px] px-3 bg-[--rt-raised-background]\"></div>\n" }]
11
+ }] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtaXRlbS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXByb2R1Y3Qvc3JjL2xpYi9wYWdlcy9wcm9kdWN0LW1hbmFnZS9wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlci9wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyL3Byb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQVMvQyxNQUFNLE9BQU8sZ0NBQWdDOzhHQUFoQyxnQ0FBZ0M7a0dBQWhDLGdDQUFnQywrRkNWN0MsZ1RBT0EseURERFksWUFBWTs7MkZBSVgsZ0NBQWdDO2tCQVA1QyxTQUFTOytCQUNFLHFDQUFxQyxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXByb2R1Y3QtbWFuYWdlLWl0ZW0taGVhZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1pdGVtLWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RNYW5hZ2VJdGVtSGVhZGVyQ29tcG9uZW50IHt9XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBoLTExIGl0ZW1zLWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwidy0zNiBtci0zIHB4LTMgbWluLXctWzMyMHB4XVwiPuWVhuWTgTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgcHgtM1wiPlN0YXR1czwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB4LTNcIj48L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImgtWzFweF0gcHgtMyBiZy1bLS1ydC1yYWlzZWQtYmFja2dyb3VuZF1cIj48L2Rpdj5cbiJdfQ==
@@ -1,12 +1,55 @@
1
- import { Component } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
1
+ import { Component, inject } from '@angular/core';
2
+ import { MatDialog } from '@angular/material/dialog';
3
+ import { MatSnackBar } from '@angular/material/snack-bar';
4
+ import { ActivatedRoute, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';
5
+ import { ProductStatus } from '../../../interfaces/product';
6
+ import { ProductService } from '@rolatech/angular-services';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { ProductManageContentComponent } from '../product-manage-content/product-manage-content.component';
3
9
  import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/button";
4
11
  export class ProductManageLayoutComponent {
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ProductManageLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: ProductManageLayoutComponent, isStandalone: true, selector: "lib-product-manage-layout", ngImport: i0, template: "<p>product-manage-layout works!</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
12
+ constructor() {
13
+ this.submitted = false;
14
+ this.accepted = false;
15
+ this.isDraft = false;
16
+ this.route = inject(ActivatedRoute);
17
+ this.productService = inject(ProductService);
18
+ this.dialog = inject(MatDialog);
19
+ this.snackBar = inject(MatSnackBar);
20
+ this.id = this.route.snapshot.paramMap.get('id');
21
+ }
22
+ ngOnInit() {
23
+ this.get();
24
+ }
25
+ get() {
26
+ this.productService.get(this.id).subscribe({
27
+ next: (res) => {
28
+ this.product = res.data;
29
+ },
30
+ });
31
+ }
32
+ updateStatus() {
33
+ this.isDraft = this.product.status.toString() === 'DRAFT' || this.product.status.toString() === 'PENDING';
34
+ this.accepted = this.product.status.toString() === 'ACCEPTED';
35
+ }
36
+ publish() {
37
+ this.productService.publish(this.id).subscribe({
38
+ next: (res) => {
39
+ this.snackBar.open('发布成功');
40
+ this.product.status = ProductStatus['已发布'];
41
+ this.updateStatus();
42
+ },
43
+ error: (error) => {
44
+ this.snackBar.open(error.message);
45
+ },
46
+ });
47
+ }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
49
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.4", type: ProductManageLayoutComponent, isStandalone: true, selector: "rolatech-product-manage-layout", ngImport: i0, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5546\u54C1\u4FE1\u606F</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\">\u57FA\u672C\u4FE1\u606F</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\">\u56FE\u7247</a>\n <a routerLink=\"./sections\" routerLinkActive=\"manage-active\" class=\"p-2\">\u8BE6\u60C5</a>\n <a routerLink=\"./options\" routerLinkActive=\"manage-active\" class=\"p-2\">\u9009\u9879</a>\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5546\u54C1\u8BBE\u7F6E</div>\n <a routerLink=\"./variants\" routerLinkActive=\"manage-active\" class=\"p-2\">\u4EF7\u683C\u7B56\u7565</a>\n <a routerLink=\"./inventory\" routerLinkActive=\"manage-active\" class=\"p-2\">\u5E93\u5B58\u8BBE\u7F6E</a>\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-2\">\u53D1\u5E03\u8BBE\u7F6E</a>\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5176\u4ED6\u4FE1\u606F</div>\n <a routerLink=\"./pricing\" routerLinkActive=\"manage-active\" class=\"p-2\">\u4EF7\u683C</a>\n </div>\n\n @if (isDraft) {\n <div class=\"md:mt-6 md:ml-2\">\n <button mat-flat-button color=\"primary\" (click)=\"publish()\">\u53D1\u5E03\u5546\u54C1</button>\n </div>\n }\n </div>\n <div class=\"w-full\">\n <router-outlet></router-outlet>\n </div>\n</div>\n", styles: [".manage-active{background-color:var(--rt-10-percent-layer, rgba(0, 0, 0, .05));box-shadow:4px 0 var(--rt-base-background-inverse, #000) inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px 0 0 var(--rt-base-background-inverse, #000)}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { 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: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
7
50
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: ProductManageLayoutComponent, decorators: [{
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductManageLayoutComponent, decorators: [{
9
52
  type: Component,
10
- args: [{ selector: 'lib-product-manage-layout', standalone: true, imports: [CommonModule], template: "<p>product-manage-layout works!</p>\n" }]
11
- }] });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1wcm9kdWN0L3NyYy9saWIvcGFnZXMvcHJvZHVjdC1tYW5hZ2UvcHJvZHVjdC1tYW5hZ2UtbGF5b3V0L3Byb2R1Y3QtbWFuYWdlLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWxheW91dC9wcm9kdWN0LW1hbmFnZS1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBUy9DLE1BQU0sT0FBTyw0QkFBNEI7OEdBQTVCLDRCQUE0QjtrR0FBNUIsNEJBQTRCLHFGQ1Z6Qyx1Q0FDQSx5RERLWSxZQUFZOzsyRkFJWCw0QkFBNEI7a0JBUHhDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXByb2R1Y3QtbWFuYWdlLWxheW91dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtbWFuYWdlLWxheW91dC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RNYW5hZ2VMYXlvdXRDb21wb25lbnQge31cbiIsIjxwPnByb2R1Y3QtbWFuYWdlLWxheW91dCB3b3JrcyE8L3A+XG4iXX0=
53
+ args: [{ selector: 'rolatech-product-manage-layout', standalone: true, imports: [RouterLink, RouterLinkActive, MatButtonModule, RouterOutlet, ProductManageContentComponent], template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5546\u54C1\u4FE1\u606F</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\">\u57FA\u672C\u4FE1\u606F</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\">\u56FE\u7247</a>\n <a routerLink=\"./sections\" routerLinkActive=\"manage-active\" class=\"p-2\">\u8BE6\u60C5</a>\n <a routerLink=\"./options\" routerLinkActive=\"manage-active\" class=\"p-2\">\u9009\u9879</a>\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5546\u54C1\u8BBE\u7F6E</div>\n <a routerLink=\"./variants\" routerLinkActive=\"manage-active\" class=\"p-2\">\u4EF7\u683C\u7B56\u7565</a>\n <a routerLink=\"./inventory\" routerLinkActive=\"manage-active\" class=\"p-2\">\u5E93\u5B58\u8BBE\u7F6E</a>\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-2\">\u53D1\u5E03\u8BBE\u7F6E</a>\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\">\u5176\u4ED6\u4FE1\u606F</div>\n <a routerLink=\"./pricing\" routerLinkActive=\"manage-active\" class=\"p-2\">\u4EF7\u683C</a>\n </div>\n\n @if (isDraft) {\n <div class=\"md:mt-6 md:ml-2\">\n <button mat-flat-button color=\"primary\" (click)=\"publish()\">\u53D1\u5E03\u5546\u54C1</button>\n </div>\n }\n </div>\n <div class=\"w-full\">\n <router-outlet></router-outlet>\n </div>\n</div>\n", styles: [".manage-active{background-color:var(--rt-10-percent-layer, rgba(0, 0, 0, .05));box-shadow:4px 0 var(--rt-base-background-inverse, #000) inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px 0 0 var(--rt-base-background-inverse, #000)}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"] }]
54
+ }], ctorParameters: () => [] });
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tYW5hZ2UtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1wcm9kdWN0L3NyYy9saWIvcGFnZXMvcHJvZHVjdC1tYW5hZ2UvcHJvZHVjdC1tYW5hZ2UtbGF5b3V0L3Byb2R1Y3QtbWFuYWdlLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItcHJvZHVjdC9zcmMvbGliL3BhZ2VzL3Byb2R1Y3QtbWFuYWdlL3Byb2R1Y3QtbWFuYWdlLWxheW91dC9wcm9kdWN0LW1hbmFnZS1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RixPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7O0FBUzNHLE1BQU0sT0FBTyw0QkFBNEI7SUFVdkM7UUFQQSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0IsYUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUM7SUFDN0QsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixDQUFDO0lBQ0QsR0FBRztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxTQUFTLENBQUM7UUFDMUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxVQUFVLENBQUM7SUFDaEUsQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBbUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F0Q1UsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsMEZDakJ6Qyx5M0RBZ0NBLHFiRG5CWSxVQUFVLG9PQUFFLGdCQUFnQiw2TUFBRSxlQUFlLDROQUFFLFlBQVk7OzJGQUkxRCw0QkFBNEI7a0JBUHhDLFNBQVM7K0JBQ0UsZ0NBQWdDLGNBQzlCLElBQUksV0FDUCxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyTGluaywgUm91dGVyTGlua0FjdGl2ZSwgUm91dGVyT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFByb2R1Y3QsIFByb2R1Y3RTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgUHJvZHVjdE1hbmFnZUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9wcm9kdWN0LW1hbmFnZS1jb250ZW50L3Byb2R1Y3QtbWFuYWdlLWNvbnRlbnQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtcHJvZHVjdC1tYW5hZ2UtbGF5b3V0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JvdXRlckxpbmssIFJvdXRlckxpbmtBY3RpdmUsIE1hdEJ1dHRvbk1vZHVsZSwgUm91dGVyT3V0bGV0LCBQcm9kdWN0TWFuYWdlQ29udGVudENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LW1hbmFnZS1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1tYW5hZ2UtbGF5b3V0LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdE1hbmFnZUxheW91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2R1Y3QhOiBQcm9kdWN0O1xuICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgYWNjZXB0ZWQgPSBmYWxzZTtcbiAgaXNEcmFmdCA9IGZhbHNlO1xuICByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHByb2R1Y3RTZXJ2aWNlID0gaW5qZWN0KFByb2R1Y3RTZXJ2aWNlKTtcbiAgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHNuYWNrQmFyID0gaW5qZWN0KE1hdFNuYWNrQmFyKTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpIGFzIHN0cmluZztcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldCgpO1xuICB9XG4gIGdldCgpIHtcbiAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldCh0aGlzLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdCA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVTdGF0dXMoKSB7XG4gICAgdGhpcy5pc0RyYWZ0ID0gdGhpcy5wcm9kdWN0LnN0YXR1cy50b1N0cmluZygpID09PSAnRFJBRlQnIHx8IHRoaXMucHJvZHVjdC5zdGF0dXMudG9TdHJpbmcoKSA9PT0gJ1BFTkRJTkcnO1xuICAgIHRoaXMuYWNjZXB0ZWQgPSB0aGlzLnByb2R1Y3Quc3RhdHVzLnRvU3RyaW5nKCkgPT09ICdBQ0NFUFRFRCc7XG4gIH1cbiAgcHVibGlzaCgpIHtcbiAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLnB1Ymxpc2godGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCflj5HluIPmiJDlip8nKTtcbiAgICAgICAgdGhpcy5wcm9kdWN0LnN0YXR1cyA9IFByb2R1Y3RTdGF0dXNbJ+W3suWPkeW4gycgYXMga2V5b2YgdHlwZW9mIFByb2R1Y3RTdGF0dXNdO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgbS1hdXRvXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1pbi13LVsyNTZweF0gcHgtMyBtZDpweC0wIGZsZXggZmxleC1yb3cgbWQ6ZmxleC1jb2wgbWQ6aC1mdWxsIGl0ZW1zLWNlbnRlciBtZDppdGVtcy1zdGFydCBoLTE2IG92ZXJmbG93LXgtc2Nyb2xsIG92ZXJmbG93LXktaGlkZGVuIHNjcm9sbGJhci1oaWRlIHdoaXRlc3BhY2UtcHJlXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1kOmZsZXgtY29sIG1kOnctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbiBtZDpmbGV4IHRleHQteGwgZm9udC1ib2xkIGgtMTQgaXRlbXMtY2VudGVyIHB4LTJcIj7llYblk4Hkv6Hmga88L2Rpdj5cbiAgICAgIDxhIHJvdXRlckxpbms9XCIuL2luZm9cIiByb3V0ZXJMaW5rQWN0aXZlPVwibWFuYWdlLWFjdGl2ZVwiIGNsYXNzPVwicC0yXCI+5Z+65pys5L+h5oGvPC9hPlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vbWVkaWFcIiByb3V0ZXJMaW5rQWN0aXZlPVwibWFuYWdlLWFjdGl2ZVwiIGNsYXNzPVwicC0yXCI+5Zu+54mHPC9hPlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vc2VjdGlvbnNcIiByb3V0ZXJMaW5rQWN0aXZlPVwibWFuYWdlLWFjdGl2ZVwiIGNsYXNzPVwicC0yXCI+6K+m5oOFPC9hPlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vb3B0aW9uc1wiIHJvdXRlckxpbmtBY3RpdmU9XCJtYW5hZ2UtYWN0aXZlXCIgY2xhc3M9XCJwLTJcIj7pgInpobk8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWQ6ZmxleC1jb2wgbWQ6dy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIG1kOmZsZXggdGV4dC14bCBmb250LWJvbGQgaC0xNCBpdGVtcy1jZW50ZXIgcHgtMlwiPuWVhuWTgeiuvue9rjwvZGl2PlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vdmFyaWFudHNcIiByb3V0ZXJMaW5rQWN0aXZlPVwibWFuYWdlLWFjdGl2ZVwiIGNsYXNzPVwicC0yXCI+5Lu35qC8562W55WlPC9hPlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vaW52ZW50b3J5XCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtMlwiPuW6k+WtmOiuvue9rjwvYT5cbiAgICAgIDxhIHJvdXRlckxpbms9XCIuL3NjaGVkdWxlXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtMlwiPuWPkeW4g+iuvue9rjwvYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtZDpmbGV4LWNvbCBtZDp3LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6ZmxleCB0ZXh0LXhsIGZvbnQtYm9sZCBoLTE0IGl0ZW1zLWNlbnRlciBweC0yXCI+5YW25LuW5L+h5oGvPC9kaXY+XG4gICAgICA8YSByb3V0ZXJMaW5rPVwiLi9wcmljaW5nXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtMlwiPuS7t+agvDwvYT5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaXNEcmFmdCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1kOm10LTYgbWQ6bWwtMlwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwicHVibGlzaCgpXCI+5Y+R5biD5ZWG5ZOBPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19