@rolatech/angular-course 17.3.1 → 17.3.2

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 (32) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/lib/pages/course-manage/course-manage-content/course-manage-content.component.mjs +12 -0
  3. package/esm2022/lib/pages/course-manage/course-manage-details/course-manage-details.component.mjs +159 -0
  4. package/esm2022/lib/pages/course-manage/course-manage-info/course-manage-info.component.mjs +139 -0
  5. package/esm2022/lib/pages/course-manage/course-manage-layout/course-manage-layout.component.mjs +68 -0
  6. package/esm2022/lib/pages/course-manage/course-manage-media/course-manage-media.component.mjs +137 -0
  7. package/esm2022/lib/pages/course-manage/course-manage-pricing/course-manage-pricing.component.mjs +126 -0
  8. package/esm2022/lib/pages/course-manage/course-manage-schedule/course-manage-schedule.component.mjs +126 -0
  9. package/esm2022/lib/pages/course-manage/course-manage-section/course-manage-section.component.mjs +342 -0
  10. package/esm2022/lib/pages/course-manage/course-manage.routes.mjs +40 -0
  11. package/esm2022/lib/services/booking.service.mjs +24 -0
  12. package/esm2022/lib/services/instructor.service.mjs +24 -0
  13. package/fesm2022/{rolatech-angular-course-course-index.component-Bm6Sg8zH.mjs → rolatech-angular-course-course-index.component-DmBSbnLe.mjs} +5 -4
  14. package/fesm2022/{rolatech-angular-course-course-index.component-Bm6Sg8zH.mjs.map → rolatech-angular-course-course-index.component-DmBSbnLe.mjs.map} +1 -1
  15. package/fesm2022/{rolatech-angular-course-rolatech-angular-course-D-_W2GtF.mjs → rolatech-angular-course-rolatech-angular-course-ChplliNh.mjs} +1095 -13
  16. package/fesm2022/rolatech-angular-course-rolatech-angular-course-ChplliNh.mjs.map +1 -0
  17. package/fesm2022/rolatech-angular-course.mjs +2 -1
  18. package/fesm2022/rolatech-angular-course.mjs.map +1 -1
  19. package/index.d.ts +1 -0
  20. package/lib/pages/course-manage/course-manage-content/course-manage-content.component.d.ts +5 -0
  21. package/lib/pages/course-manage/course-manage-details/course-manage-details.component.d.ts +29 -0
  22. package/lib/pages/course-manage/course-manage-info/course-manage-info.component.d.ts +36 -0
  23. package/lib/pages/course-manage/course-manage-layout/course-manage-layout.component.d.ts +26 -0
  24. package/lib/pages/course-manage/course-manage-media/course-manage-media.component.d.ts +29 -0
  25. package/lib/pages/course-manage/course-manage-pricing/course-manage-pricing.component.d.ts +27 -0
  26. package/lib/pages/course-manage/course-manage-schedule/course-manage-schedule.component.d.ts +27 -0
  27. package/lib/pages/course-manage/course-manage-section/course-manage-section.component.d.ts +37 -0
  28. package/lib/pages/course-manage/course-manage.routes.d.ts +2 -0
  29. package/lib/services/booking.service.d.ts +9 -0
  30. package/lib/services/instructor.service.d.ts +9 -0
  31. package/package.json +1 -1
  32. package/fesm2022/rolatech-angular-course-rolatech-angular-course-D-_W2GtF.mjs.map +0 -1
package/esm2022/index.mjs CHANGED
@@ -2,4 +2,5 @@ export * from './lib/interfaces';
2
2
  export * from './provider';
3
3
  export * from './lib/components';
4
4
  export { courseRoutes } from './lib/pages/course/course.routes';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMnO1xuZXhwb3J0IHsgY291cnNlUm91dGVzIH0gZnJvbSAnLi9saWIvcGFnZXMvY291cnNlL2NvdXJzZS5yb3V0ZXMnO1xuIl19
5
+ export { courseManageRoutes } from './lib/pages/course-manage/course-manage.routes';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMnO1xuZXhwb3J0IHsgY291cnNlUm91dGVzIH0gZnJvbSAnLi9saWIvcGFnZXMvY291cnNlL2NvdXJzZS5yb3V0ZXMnO1xuZXhwb3J0IHsgY291cnNlTWFuYWdlUm91dGVzIH0gZnJvbSAnLi9saWIvcGFnZXMvY291cnNlLW1hbmFnZS9jb3Vyc2UtbWFuYWdlLnJvdXRlcyc7XG4iXX0=
@@ -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 CourseManageContentComponent {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: CourseManageContentComponent, isStandalone: true, selector: "rolatech-course-manage-content", ngImport: i0, template: "<ng-content select=\"rolatech-toolbar\"></ng-content>\n<div class=\"p-3\">\n <ng-content></ng-content>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageContentComponent, decorators: [{
9
+ type: Component,
10
+ args: [{ selector: 'rolatech-course-manage-content', standalone: true, imports: [CommonModule], template: "<ng-content select=\"rolatech-toolbar\"></ng-content>\n<div class=\"p-3\">\n <ng-content></ng-content>\n</div>\n" }]
11
+ }] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UtbWFuYWdlL2NvdXJzZS1tYW5hZ2UtY29udGVudC9jb3Vyc2UtbWFuYWdlLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1jb250ZW50L2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFTL0MsTUFBTSxPQUFPLDRCQUE0Qjs4R0FBNUIsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsMEZDVnpDLG1IQUlBLHlEREVZLFlBQVk7OzJGQUlYLDRCQUE0QjtrQkFQeEMsU0FBUzsrQkFDRSxnQ0FBZ0MsY0FDOUIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb3Vyc2UtbWFuYWdlLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50IHt9XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJyb2xhdGVjaC10b29sYmFyXCI+PC9uZy1jb250ZW50PlxuPGRpdiBjbGFzcz1cInAtM1wiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,159 @@
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 } from '@angular/router';
5
+ import { findIndex, remove } from 'lodash';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { ConfirmationDialogComponent, ToolbarComponent } from '@rolatech/angular-components';
9
+ import { CourseManageContentComponent } from '../course-manage-content/course-manage-content.component';
10
+ import { DetailItemComponent } from '../../../components';
11
+ import { CourseStatus, CourseType } from '../../../interfaces';
12
+ import { CourseService } from '../../../services';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/material/button";
15
+ import * as i2 from "@angular/material/icon";
16
+ export class CourseManageDetailsComponent {
17
+ constructor() {
18
+ this.route = inject(ActivatedRoute);
19
+ this.courseService = inject(CourseService);
20
+ this.dialog = inject(MatDialog);
21
+ this.snackBar = inject(MatSnackBar);
22
+ this.isLoading = false;
23
+ this.isUploading = false;
24
+ this.details = [];
25
+ this.status = CourseStatus;
26
+ this.courseType = CourseType;
27
+ this.id = this.route.parent?.snapshot.paramMap.get('id');
28
+ }
29
+ ngOnInit() {
30
+ this.find();
31
+ }
32
+ find() {
33
+ this.courseService.findDetails(this.id).subscribe({
34
+ next: (res) => {
35
+ if (res.data) {
36
+ this.details = res.data;
37
+ }
38
+ },
39
+ });
40
+ }
41
+ addDetail() {
42
+ if (!this.details) {
43
+ this.details = [];
44
+ }
45
+ this.courseService
46
+ .addDetail(this.id, {
47
+ title: '',
48
+ description: '',
49
+ content: '',
50
+ media: [],
51
+ })
52
+ .subscribe({
53
+ next: (res) => {
54
+ const detail = res.data;
55
+ this.details.push({
56
+ id: detail.id,
57
+ title: '',
58
+ description: '',
59
+ content: '',
60
+ media: [],
61
+ });
62
+ },
63
+ error: (e) => {
64
+ this.snackBar.open(e.message);
65
+ },
66
+ });
67
+ }
68
+ onDetailMediaUpload(event) {
69
+ const detailId = event.id;
70
+ const index = findIndex(this.details, (item) => item.id === detailId);
71
+ const file = event.data.target.files[0];
72
+ if (file) {
73
+ const reader = new FileReader();
74
+ reader.readAsDataURL(file);
75
+ reader.onload = () => {
76
+ if (!this.details[index].media) {
77
+ this.details[index].media = [];
78
+ }
79
+ this.details[index].media.push({
80
+ url: reader.result,
81
+ alt: 'upload image',
82
+ });
83
+ this.details[index].isUploading = true;
84
+ const formData = new FormData();
85
+ formData.append('file', file);
86
+ this.courseService.uploadDetailMedia(this.id, detailId, formData).subscribe({
87
+ next: (res) => {
88
+ this.isUploading = false;
89
+ this.details[index].isUploading = false;
90
+ const tmp = this.details[index].media;
91
+ delete res.data.productDetail;
92
+ this.details[index].media[this.details[index].media.length - 1] = res.data;
93
+ },
94
+ error: (e) => {
95
+ this.isUploading = false;
96
+ this.snackBar.open('上传失败: ' + e.message);
97
+ },
98
+ });
99
+ };
100
+ reader.onerror = (error) => {
101
+ this.isUploading = false;
102
+ };
103
+ }
104
+ }
105
+ onDetailMediaDelete(event) {
106
+ const detailId = event.id;
107
+ const mediaId = event.media.id;
108
+ this.courseService.deleteDetailMedia(this.id, detailId, mediaId).subscribe({
109
+ next: (res) => {
110
+ const detail = this.details.find((item) => item.id === detailId);
111
+ remove(detail.media, {
112
+ id: mediaId,
113
+ });
114
+ },
115
+ });
116
+ }
117
+ onDetailSave(detail) {
118
+ delete detail.isUploading;
119
+ this.courseService.updateDetail(this.id, detail.id, detail).subscribe({
120
+ next: (res) => {
121
+ this.snackBar.open('保存成功');
122
+ },
123
+ error: (e) => {
124
+ this.snackBar.open(e.message);
125
+ },
126
+ });
127
+ }
128
+ onDetailDelete(detail) {
129
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
130
+ width: '400px',
131
+ data: {
132
+ title: '删除详情',
133
+ message: '确定删除此详情吗?',
134
+ },
135
+ });
136
+ dialogRef.afterClosed().subscribe((result) => {
137
+ if (result) {
138
+ this.courseService.deleteDetail(this.id, detail.id).subscribe({
139
+ next: (res) => {
140
+ this.snackBar.open(res.data);
141
+ remove(this.details, {
142
+ id: detail.id,
143
+ });
144
+ },
145
+ error: (e) => {
146
+ this.snackBar.open(e.message);
147
+ },
148
+ });
149
+ }
150
+ });
151
+ }
152
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
153
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: CourseManageDetailsComponent, isStandalone: true, selector: "rolatech-course-manage-details", ngImport: i0, template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u8BE6\u60C5\" class=\"hidden sm:block\" divider> </rolatech-toolbar>\n <div>\n <div>\n @for (detail of details; track detail) {\n <rolatech-detail-item\n [detail]=\"detail\"\n (upload)=\"onDetailMediaUpload($event)\"\n (deleteMedia)=\"onDetailMediaDelete($event)\"\n (save)=\"onDetailSave($event)\"\n (delete)=\"onDetailDelete($event)\"\n [actions]=\"true\"\n ></rolatech-detail-item>\n }\n </div>\n <button mat-stroked-button (click)=\"addDetail()\" class=\"mt-3\">\n <mat-icon>add</mat-icon>\n <span>\u6DFB\u52A0\u8BE6\u60C5</span>\n </button>\n </div>\n</rolatech-course-manage-content>\n", styles: [""], dependencies: [{ kind: "component", type: DetailItemComponent, selector: "rolatech-detail-item", inputs: ["isUploading", "detail", "actions", "selectMedia"], outputs: ["upload", "delete", "save", "deleteMedia"] }, { 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: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: CourseManageContentComponent, selector: "rolatech-course-manage-content" }] }); }
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageDetailsComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ selector: 'rolatech-course-manage-details', standalone: true, imports: [DetailItemComponent, MatButtonModule, MatIconModule, ToolbarComponent, CourseManageContentComponent], template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u8BE6\u60C5\" class=\"hidden sm:block\" divider> </rolatech-toolbar>\n <div>\n <div>\n @for (detail of details; track detail) {\n <rolatech-detail-item\n [detail]=\"detail\"\n (upload)=\"onDetailMediaUpload($event)\"\n (deleteMedia)=\"onDetailMediaDelete($event)\"\n (save)=\"onDetailSave($event)\"\n (delete)=\"onDetailDelete($event)\"\n [actions]=\"true\"\n ></rolatech-detail-item>\n }\n </div>\n <button mat-stroked-button (click)=\"addDetail()\" class=\"mt-3\">\n <mat-icon>add</mat-icon>\n <span>\u6DFB\u52A0\u8BE6\u60C5</span>\n </button>\n </div>\n</rolatech-course-manage-content>\n" }]
158
+ }], ctorParameters: () => [] });
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UtbWFuYWdlL2NvdXJzZS1tYW5hZ2UtZGV0YWlscy9jb3Vyc2UtbWFuYWdlLWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1kZXRhaWxzL2NvdXJzZS1tYW5hZ2UtZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFRLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBZ0IsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdFLE9BQU8s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QUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F6SVUsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsMEZDcEJ6QyxzdkJBcUJBLDBEREhZLG1CQUFtQixtTEFBRSxlQUFlLDJOQUFFLGFBQWEsb0xBQUUsZ0JBQWdCLGdJQUFFLDRCQUE0Qjs7MkZBRWxHLDRCQUE0QjtrQkFQeEMsU0FBUzsrQkFDRSxnQ0FBZ0MsY0FHOUIsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaW5kSW5kZXgsIGxhc3QsIHJlbW92ZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY291cnNlLW1hbmFnZS1jb250ZW50L2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGV0YWlsSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQ291cnNlRGV0YWlsLCBDb3Vyc2VTdGF0dXMsIENvdXJzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtbWFuYWdlLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtbWFuYWdlLWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0RldGFpbEl0ZW1Db21wb25lbnQsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgVG9vbGJhckNvbXBvbmVudCwgQ291cnNlTWFuYWdlQ29udGVudENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIENvdXJzZU1hbmFnZURldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIGRpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBzbmFja0JhciA9IGluamVjdChNYXRTbmFja0Jhcik7XG5cbiAgaWQ6IHN0cmluZztcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGlzVXBsb2FkaW5nID0gZmFsc2U7XG4gIGRldGFpbHM6IENvdXJzZURldGFpbFtdID0gW107XG4gIHN0YXR1cyA9IENvdXJzZVN0YXR1cztcbiAgY291cnNlVHlwZTogYW55ID0gQ291cnNlVHlwZTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUucGFyZW50Py5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgc3RyaW5nO1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmluZCgpO1xuICB9XG4gIGZpbmQoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmZpbmREZXRhaWxzKHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgICAgIHRoaXMuZGV0YWlscyA9IHJlcy5kYXRhO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGFkZERldGFpbCgpIHtcbiAgICBpZiAoIXRoaXMuZGV0YWlscykge1xuICAgICAgdGhpcy5kZXRhaWxzID0gW107XG4gICAgfVxuICAgIHRoaXMuY291cnNlU2VydmljZVxuICAgICAgLmFkZERldGFpbCh0aGlzLmlkLCB7XG4gICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBjb250ZW50OiAnJyxcbiAgICAgICAgbWVkaWE6IFtdLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSByZXMuZGF0YTtcbiAgICAgICAgICB0aGlzLmRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICBpZDogZGV0YWlsLmlkLFxuICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgY29udGVudDogJycsXG4gICAgICAgICAgICBtZWRpYTogW10sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlLm1lc3NhZ2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cbiAgb25EZXRhaWxNZWRpYVVwbG9hZChldmVudDogYW55KSB7XG4gICAgY29uc3QgZGV0YWlsSWQgPSBldmVudC5pZDtcbiAgICBjb25zdCBpbmRleCA9IGZpbmRJbmRleCh0aGlzLmRldGFpbHMsIChpdGVtKSA9PiBpdGVtLmlkID09PSBkZXRhaWxJZCk7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGEudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZGV0YWlsc1tpbmRleF0ubWVkaWEpIHtcbiAgICAgICAgICB0aGlzLmRldGFpbHNbaW5kZXhdLm1lZGlhID0gW107XG4gICAgICAgIH1cbiAgICAgICAgKHRoaXMuZGV0YWlsc1tpbmRleF0ubWVkaWEgYXMgYW55KS5wdXNoKHtcbiAgICAgICAgICB1cmw6IHJlYWRlci5yZXN1bHQsXG4gICAgICAgICAgYWx0OiAndXBsb2FkIGltYWdlJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGV0YWlsc1tpbmRleF0uaXNVcGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcbiAgICAgICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwbG9hZERldGFpbE1lZGlhKHRoaXMuaWQsIGRldGFpbElkLCBmb3JtRGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tpbmRleF0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHRtcCA9IHRoaXMuZGV0YWlsc1tpbmRleF0ubWVkaWEgYXMgYW55O1xuICAgICAgICAgICAgZGVsZXRlIHJlcy5kYXRhLnByb2R1Y3REZXRhaWw7XG4gICAgICAgICAgICB0aGlzLmRldGFpbHNbaW5kZXhdLm1lZGlhW3RoaXMuZGV0YWlsc1tpbmRleF0ubWVkaWEubGVuZ3RoIC0gMV0gPSByZXMuZGF0YTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCfkuIrkvKDlpLHotKU6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIG9uRGV0YWlsTWVkaWFEZWxldGUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGRldGFpbElkID0gZXZlbnQuaWQ7XG4gICAgY29uc3QgbWVkaWFJZCA9IGV2ZW50Lm1lZGlhLmlkO1xuICAgIHRoaXMuY291cnNlU2VydmljZS5kZWxldGVEZXRhaWxNZWRpYSh0aGlzLmlkLCBkZXRhaWxJZCwgbWVkaWFJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkZXRhaWw6IGFueSA9IHRoaXMuZGV0YWlscy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBkZXRhaWxJZCk7XG4gICAgICAgIHJlbW92ZShkZXRhaWwubWVkaWEsIHtcbiAgICAgICAgICBpZDogbWVkaWFJZCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIG9uRGV0YWlsU2F2ZShkZXRhaWw6IENvdXJzZURldGFpbCkge1xuICAgIGRlbGV0ZSBkZXRhaWwuaXNVcGxvYWRpbmc7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwZGF0ZURldGFpbCh0aGlzLmlkLCBkZXRhaWwuaWQsIGRldGFpbCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ+S/neWtmOaIkOWKnycpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZS5tZXNzYWdlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25EZXRhaWxEZWxldGUoZGV0YWlsOiBDb3Vyc2VEZXRhaWwpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAn5Yig6Zmk6K+m5oOFJyxcbiAgICAgICAgbWVzc2FnZTogJ+ehruWumuWIoOmZpOatpOivpuaDheWQlz8nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZGVsZXRlRGV0YWlsKHRoaXMuaWQsIGRldGFpbC5pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihyZXMuZGF0YSk7XG4gICAgICAgICAgICByZW1vdmUodGhpcy5kZXRhaWxzLCB7XG4gICAgICAgICAgICAgIGlkOiBkZXRhaWwuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGUubWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxyb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQ+XG4gIDxyb2xhdGVjaC10b29sYmFyIHRpdGxlPVwi6K+m5oOFXCIgY2xhc3M9XCJoaWRkZW4gc206YmxvY2tcIiBkaXZpZGVyPiA8L3JvbGF0ZWNoLXRvb2xiYXI+XG4gIDxkaXY+XG4gICAgPGRpdj5cbiAgICAgIEBmb3IgKGRldGFpbCBvZiBkZXRhaWxzOyB0cmFjayBkZXRhaWwpIHtcbiAgICAgICAgPHJvbGF0ZWNoLWRldGFpbC1pdGVtXG4gICAgICAgICAgW2RldGFpbF09XCJkZXRhaWxcIlxuICAgICAgICAgICh1cGxvYWQpPVwib25EZXRhaWxNZWRpYVVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAoZGVsZXRlTWVkaWEpPVwib25EZXRhaWxNZWRpYURlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2F2ZSk9XCJvbkRldGFpbFNhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgKGRlbGV0ZSk9XCJvbkRldGFpbERlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbYWN0aW9uc109XCJ0cnVlXCJcbiAgICAgICAgPjwvcm9sYXRlY2gtZGV0YWlsLWl0ZW0+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZERldGFpbCgpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPua3u+WKoOivpuaDhTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtY29udGVudD5cbiJdfQ==
@@ -0,0 +1,139 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { BaseComponent, ToolbarComponent } from '@rolatech/angular-components';
3
+ import { clone } from 'lodash';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatOptionModule } from '@angular/material/core';
6
+ import { MatSelectModule } from '@angular/material/select';
7
+ import { TextFieldModule } from '@angular/cdk/text-field';
8
+ import { MatInputModule } from '@angular/material/input';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { FormsModule } from '@angular/forms';
11
+ import { CourseManageContentComponent } from '../course-manage-content/course-manage-content.component';
12
+ import { CourseStatus } from '../../../interfaces';
13
+ import { CategoryService, CourseService } from '../../../services';
14
+ import { BookingService } from '../../../services/booking.service';
15
+ import { InstructorService } from '../../../services/instructor.service';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/forms";
18
+ import * as i2 from "@angular/material/form-field";
19
+ import * as i3 from "@angular/material/input";
20
+ import * as i4 from "@angular/cdk/text-field";
21
+ import * as i5 from "@angular/material/select";
22
+ import * as i6 from "@angular/material/core";
23
+ import * as i7 from "@angular/material/button";
24
+ export class CourseManageInfoComponent extends BaseComponent {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.courseService = inject(CourseService);
28
+ this.instructorService = inject(InstructorService);
29
+ this.categoryService = inject(CategoryService);
30
+ this.bookingService = inject(BookingService);
31
+ this.isLoading = false;
32
+ this.status = CourseStatus;
33
+ this.courseType = [
34
+ {
35
+ key: 'ONLINE',
36
+ value: '线上',
37
+ },
38
+ {
39
+ key: 'OFFLINE',
40
+ value: '线下',
41
+ },
42
+ {
43
+ key: 'MIXED',
44
+ value: '混合',
45
+ },
46
+ ];
47
+ }
48
+ ngOnInit() {
49
+ this.id = this.route.parent?.snapshot.paramMap.get('id');
50
+ this.find();
51
+ this.categoryService.find({}).subscribe({
52
+ next: (res) => {
53
+ this.categories = res.data;
54
+ },
55
+ });
56
+ this.findClassrooms();
57
+ this.findBookedClassrooms();
58
+ }
59
+ findBookedClassrooms() {
60
+ this.bookingService.items({ status: 'paid' }).subscribe({
61
+ next: (res) => {
62
+ this.bookedClassrooms = res.data;
63
+ },
64
+ });
65
+ }
66
+ findClassrooms() {
67
+ this.instructorService.findMyClassrooms({}).subscribe({
68
+ next: (res) => {
69
+ this.classrooms = res.data;
70
+ },
71
+ });
72
+ }
73
+ find() {
74
+ this.courseService.get(this.id).subscribe({
75
+ next: (res) => {
76
+ this.course = res.data;
77
+ },
78
+ });
79
+ }
80
+ compareFn(o1, o2) {
81
+ return o1.id === o2?.id;
82
+ }
83
+ compareClassroom(o1, o2) {
84
+ if (o1.room) {
85
+ return (o1.latitude === o2?.latitude &&
86
+ o1.longitude === o2?.longitude &&
87
+ o1.room === o2.room &&
88
+ o1.startAt === o2.startAt &&
89
+ o1.endAt === o2.endAt);
90
+ }
91
+ else {
92
+ return o1.latitude === o2?.latitude && o1.longitude === o2?.longitude;
93
+ }
94
+ }
95
+ onSelectionChange(event) {
96
+ this.selectedCategoyIds = event.value;
97
+ }
98
+ onClassroomSelected(event) {
99
+ this.selectedClassroom = event.value;
100
+ }
101
+ update() {
102
+ const { name, description, categories, type, classroom } = this.course;
103
+ const finalClassroom = clone(classroom);
104
+ finalClassroom.address = classroom.room ? classroom.address + ' ' + classroom.room + '室' : classroom.address;
105
+ const data = {
106
+ name,
107
+ description,
108
+ categories,
109
+ type,
110
+ classroom: finalClassroom,
111
+ };
112
+ this.courseService.update(this.id, data).subscribe({
113
+ next: (res) => {
114
+ this.snackBarService.open('保存成功');
115
+ // this.router.navigate([`../${res.data.id}`], { relativeTo: this.route });
116
+ },
117
+ error: (e) => {
118
+ this.snackBarService.open(e.message);
119
+ },
120
+ });
121
+ }
122
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
123
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: CourseManageInfoComponent, isStandalone: true, selector: "rolatech-course-manage-info", usesInheritance: true, ngImport: i0, template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u57FA\u672C\u4FE1\u606F\" class=\"hidden sm:block\" divider></rolatech-toolbar>\n @if (course) {\n <div class=\"flex flex-col\">\n <form #courseForm=\"ngForm\" (ngSubmit)=\"update()\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u8BFE\u7A0B\u540D\u79F0 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"course.name\" name=\"name\" required />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u8BFE\u7A0B\u63CF\u8FF0 </mat-label>\n <textarea\n matInput\n type=\"text\"\n [(ngModel)]=\"course.description\"\n name=\"description\"\n required\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n ></textarea>\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)]=\"course.categories\"\n #select=\"matSelect\"\n (selectionChange)=\"onSelectionChange($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>\u7C7B\u578B</mat-label>\n <mat-select name=\"type\" [(ngModel)]=\"course.type\" required>\n @for (item of courseType; track item) {\n <mat-option [value]=\"item.key\">\n {{ item.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (course.type && course.type.toString() !== 'ONLINE') {\n <mat-form-field appearance=\"fill\" ngModelGroup=\"classroom\">\n <mat-label>\u6559\u5BA4</mat-label>\n <mat-select\n name=\"id\"\n [(ngModel)]=\"course.classroom\"\n [compareWith]=\"compareClassroom\"\n (selectionChange)=\"onClassroomSelected($event)\"\n required\n >\n <mat-optgroup label=\"\u81EA\u6709\u6559\u5BA4\">\n @for (classroom of classrooms; track classroom) {\n <mat-option [value]=\"classroom\">\n <div class=\"flex gap-3\">\n <span>{{ classroom.name }}</span>\n <span> {{ classroom.address }}</span>\n </div>\n </mat-option>\n }\n </mat-optgroup>\n <mat-optgroup label=\"\u5DF2\u8D2D\u6559\u5BA4\">\n @for (item of bookedClassrooms; track item) {\n <mat-option [value]=\"item\">\n <div class=\"flex flex-col py-3\">\n <span class=\"font-bold\"> {{ item.address }} {{ item.room }}\u5BA4</span>\n <span class=\"text-md font-thin\"> {{ item.startAt }} - {{ item.endAt }}</span>\n </div>\n </mat-option>\n }\n </mat-optgroup>\n </mat-select>\n </mat-form-field>\n }\n </form>\n </div>\n <div>\n <button mat-flat-button type=\"primary\" (click)=\"update()\">\u4FDD\u5B58</button>\n </div>\n }\n</rolatech-course-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: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { 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: CourseManageContentComponent, selector: "rolatech-course-manage-content" }] }); }
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageInfoComponent, decorators: [{
126
+ type: Component,
127
+ args: [{ selector: 'rolatech-course-manage-info', standalone: true, imports: [
128
+ FormsModule,
129
+ MatFormFieldModule,
130
+ MatInputModule,
131
+ TextFieldModule,
132
+ MatSelectModule,
133
+ MatOptionModule,
134
+ MatButtonModule,
135
+ ToolbarComponent,
136
+ CourseManageContentComponent,
137
+ ], template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u57FA\u672C\u4FE1\u606F\" class=\"hidden sm:block\" divider></rolatech-toolbar>\n @if (course) {\n <div class=\"flex flex-col\">\n <form #courseForm=\"ngForm\" (ngSubmit)=\"update()\">\n <mat-form-field appearance=\"fill\">\n <mat-label> \u8BFE\u7A0B\u540D\u79F0 </mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"course.name\" name=\"name\" required />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label> \u8BFE\u7A0B\u63CF\u8FF0 </mat-label>\n <textarea\n matInput\n type=\"text\"\n [(ngModel)]=\"course.description\"\n name=\"description\"\n required\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n ></textarea>\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)]=\"course.categories\"\n #select=\"matSelect\"\n (selectionChange)=\"onSelectionChange($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>\u7C7B\u578B</mat-label>\n <mat-select name=\"type\" [(ngModel)]=\"course.type\" required>\n @for (item of courseType; track item) {\n <mat-option [value]=\"item.key\">\n {{ item.value }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (course.type && course.type.toString() !== 'ONLINE') {\n <mat-form-field appearance=\"fill\" ngModelGroup=\"classroom\">\n <mat-label>\u6559\u5BA4</mat-label>\n <mat-select\n name=\"id\"\n [(ngModel)]=\"course.classroom\"\n [compareWith]=\"compareClassroom\"\n (selectionChange)=\"onClassroomSelected($event)\"\n required\n >\n <mat-optgroup label=\"\u81EA\u6709\u6559\u5BA4\">\n @for (classroom of classrooms; track classroom) {\n <mat-option [value]=\"classroom\">\n <div class=\"flex gap-3\">\n <span>{{ classroom.name }}</span>\n <span> {{ classroom.address }}</span>\n </div>\n </mat-option>\n }\n </mat-optgroup>\n <mat-optgroup label=\"\u5DF2\u8D2D\u6559\u5BA4\">\n @for (item of bookedClassrooms; track item) {\n <mat-option [value]=\"item\">\n <div class=\"flex flex-col py-3\">\n <span class=\"font-bold\"> {{ item.address }} {{ item.room }}\u5BA4</span>\n <span class=\"text-md font-thin\"> {{ item.startAt }} - {{ item.endAt }}</span>\n </div>\n </mat-option>\n }\n </mat-optgroup>\n </mat-select>\n </mat-form-field>\n }\n </form>\n </div>\n <div>\n <button mat-flat-button type=\"primary\" (click)=\"update()\">\u4FDD\u5B58</button>\n </div>\n }\n</rolatech-course-manage-content>\n", styles: ["mat-form-field{width:100%}\n"] }]
138
+ }] });
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1pbmZvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UtbWFuYWdlL2NvdXJzZS1tYW5hZ2UtaW5mby9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1pbmZvL2NvdXJzZS1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN4RyxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7QUFtQnpFLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxhQUFhO0lBakI1RDs7UUFrQkUsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEMsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUMsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixXQUFNLEdBQUcsWUFBWSxDQUFDO1FBT3RCLGVBQVUsR0FBRztZQUNYO2dCQUNFLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRDtnQkFDRSxHQUFHLEVBQUUsU0FBUztnQkFDZCxLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0Q7Z0JBQ0UsR0FBRyxFQUFFLE9BQU87Z0JBQ1osS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLENBQUM7S0E4RUg7SUE1RUMsUUFBUTtRQUNOLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RELElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNuQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BELElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3hDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDekIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxTQUFTLENBQUMsRUFBa0IsRUFBRSxFQUFrQjtRQUM5QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBTyxFQUFFLEVBQU87UUFDL0IsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixPQUFPLENBQ0wsRUFBRSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQUUsUUFBUTtnQkFDNUIsRUFBRSxDQUFDLFNBQVMsS0FBSyxFQUFFLEVBQUUsU0FBUztnQkFDOUIsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSTtnQkFDbkIsRUFBRSxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUMsT0FBTztnQkFDekIsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsS0FBSyxDQUN0QixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEVBQUUsQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsU0FBUyxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxNQUFNO1FBQ0osTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxjQUFjLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzdHLE1BQU0sSUFBSSxHQUFHO1lBQ1gsSUFBSTtZQUNKLFdBQVc7WUFDWCxVQUFVO1lBQ1YsSUFBSTtZQUNKLFNBQVMsRUFBRSxjQUFjO1NBQzFCLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsMkVBQTJFO1lBQzdFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBekdVLHlCQUF5QjtrR0FBekIseUJBQXlCLDhHQ2pDdEMsa2lIQXdGQSxxRkRsRUksV0FBVyxvNENBQ1gsa0JBQWtCLDBTQUNsQixjQUFjLHlrQkFDZCxlQUFlLDhCQUNmLGVBQWUsb3pCQUNmLGVBQWUsOEJBQ2YsZUFBZSw0TkFDZixnQkFBZ0IsZ0lBQ2hCLDRCQUE0Qjs7MkZBR25CLHlCQUF5QjtrQkFqQnJDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBRzNCLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsNEJBQTRCO3FCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBUZXh0RmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGV4dC1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY291cnNlLW1hbmFnZS1jb250ZW50L2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlLCBDb3Vyc2VDYXRlZ29yeSwgQ291cnNlU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDYXRlZ29yeVNlcnZpY2UsIENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBCb29raW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJbnN0cnVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2luc3RydWN0b3Iuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtaW5mbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBUZXh0RmllbGRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VNYW5hZ2VJbmZvQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIGluc3RydWN0b3JTZXJ2aWNlID0gaW5qZWN0KEluc3RydWN0b3JTZXJ2aWNlKTtcbiAgY2F0ZWdvcnlTZXJ2aWNlID0gaW5qZWN0KENhdGVnb3J5U2VydmljZSk7XG4gIGJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KEJvb2tpbmdTZXJ2aWNlKTtcblxuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgY291cnNlITogQ291cnNlO1xuICBzdGF0dXMgPSBDb3Vyc2VTdGF0dXM7XG4gIC8vIGNvdXJzZVR5cGU6IGFueSA9IENvdXJzZVR5cGU7XG4gIHNlbGVjdGVkQ2F0ZWdveUlkcyE6IHN0cmluZ1tdO1xuICBzZWxlY3RlZENsYXNzcm9vbTogYW55O1xuICBjYXRlZ29yaWVzITogQ291cnNlQ2F0ZWdvcnlbXTtcbiAgY2xhc3Nyb29tczogYW55O1xuICBib29rZWRDbGFzc3Jvb21zOiBhbnk7XG4gIGNvdXJzZVR5cGUgPSBbXG4gICAge1xuICAgICAga2V5OiAnT05MSU5FJyxcbiAgICAgIHZhbHVlOiAn57q/5LiKJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ09GRkxJTkUnLFxuICAgICAgdmFsdWU6ICfnur/kuIsnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnTUlYRUQnLFxuICAgICAgdmFsdWU6ICfmt7flkIgnLFxuICAgIH0sXG4gIF07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUucGFyZW50Py5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgc3RyaW5nO1xuICAgIHRoaXMuZmluZCgpO1xuICAgIHRoaXMuY2F0ZWdvcnlTZXJ2aWNlLmZpbmQoe30pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzLmRhdGE7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuZmluZENsYXNzcm9vbXMoKTtcbiAgICB0aGlzLmZpbmRCb29rZWRDbGFzc3Jvb21zKCk7XG4gIH1cbiAgZmluZEJvb2tlZENsYXNzcm9vbXMoKSB7XG4gICAgdGhpcy5ib29raW5nU2VydmljZS5pdGVtcyh7IHN0YXR1czogJ3BhaWQnIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib29rZWRDbGFzc3Jvb21zID0gcmVzLmRhdGE7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZmluZENsYXNzcm9vbXMoKSB7XG4gICAgdGhpcy5pbnN0cnVjdG9yU2VydmljZS5maW5kTXlDbGFzc3Jvb21zKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNsYXNzcm9vbXMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZCgpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZ2V0KHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb3Vyc2UgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgY29tcGFyZUZuKG8xOiBDb3Vyc2VDYXRlZ29yeSwgbzI6IENvdXJzZUNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIG8xLmlkID09PSBvMj8uaWQ7XG4gIH1cbiAgY29tcGFyZUNsYXNzcm9vbShvMTogYW55LCBvMjogYW55KSB7XG4gICAgaWYgKG8xLnJvb20pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG8xLmxhdGl0dWRlID09PSBvMj8ubGF0aXR1ZGUgJiZcbiAgICAgICAgbzEubG9uZ2l0dWRlID09PSBvMj8ubG9uZ2l0dWRlICYmXG4gICAgICAgIG8xLnJvb20gPT09IG8yLnJvb20gJiZcbiAgICAgICAgbzEuc3RhcnRBdCA9PT0gbzIuc3RhcnRBdCAmJlxuICAgICAgICBvMS5lbmRBdCA9PT0gbzIuZW5kQXRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvMS5sYXRpdHVkZSA9PT0gbzI/LmxhdGl0dWRlICYmIG8xLmxvbmdpdHVkZSA9PT0gbzI/LmxvbmdpdHVkZTtcbiAgICB9XG4gIH1cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ295SWRzID0gZXZlbnQudmFsdWU7XG4gIH1cbiAgb25DbGFzc3Jvb21TZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZENsYXNzcm9vbSA9IGV2ZW50LnZhbHVlO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yaWVzLCB0eXBlLCBjbGFzc3Jvb20gfSA9IHRoaXMuY291cnNlO1xuICAgIGNvbnN0IGZpbmFsQ2xhc3Nyb29tID0gY2xvbmUoY2xhc3Nyb29tKTtcbiAgICBmaW5hbENsYXNzcm9vbS5hZGRyZXNzID0gY2xhc3Nyb29tLnJvb20gPyBjbGFzc3Jvb20uYWRkcmVzcyArICcgJyArIGNsYXNzcm9vbS5yb29tICsgJ+WupCcgOiBjbGFzc3Jvb20uYWRkcmVzcztcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcmllcyxcbiAgICAgIHR5cGUsXG4gICAgICBjbGFzc3Jvb206IGZpbmFsQ2xhc3Nyb29tLFxuICAgIH07XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwZGF0ZSh0aGlzLmlkLCBkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCfkv53lrZjmiJDlip8nKTtcbiAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2AuLi8ke3Jlcy5kYXRhLmlkfWBdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oZS5tZXNzYWdlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxyb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQ+XG4gIDxyb2xhdGVjaC10b29sYmFyIHRpdGxlPVwi5Z+65pys5L+h5oGvXCIgY2xhc3M9XCJoaWRkZW4gc206YmxvY2tcIiBkaXZpZGVyPjwvcm9sYXRlY2gtdG9vbGJhcj5cbiAgQGlmIChjb3Vyc2UpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGZvcm0gI2NvdXJzZUZvcm09XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwidXBkYXRlKClcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD4g6K++56iL5ZCN56ewIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY291cnNlLm5hbWVcIiBuYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOivvueoi+aPj+i/sCA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvdXJzZS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjNcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBuZ01vZGVsR3JvdXA9XCJjYXRlZ29yaWVzXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD7liIbnsbs8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY291cnNlLmNhdGVnb3JpZXNcIlxuICAgICAgICAgICAgI3NlbGVjdD1cIm1hdFNlbGVjdFwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgY2F0ZWdvcmllczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPuexu+WeizwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IG5hbWU9XCJ0eXBlXCIgWyhuZ01vZGVsKV09XCJjb3Vyc2UudHlwZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjb3Vyc2VUeXBlOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmtleVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgQGlmIChjb3Vyc2UudHlwZSAmJiBjb3Vyc2UudHlwZS50b1N0cmluZygpICE9PSAnT05MSU5FJykge1xuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIG5nTW9kZWxHcm91cD1cImNsYXNzcm9vbVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD7mlZnlrqQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY291cnNlLmNsYXNzcm9vbVwiXG4gICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlQ2xhc3Nyb29tXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNsYXNzcm9vbVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIGxhYmVsPVwi6Ieq5pyJ5pWZ5a6kXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY2xhc3Nyb29tIG9mIGNsYXNzcm9vbXM7IHRyYWNrIGNsYXNzcm9vbSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImNsYXNzcm9vbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNsYXNzcm9vbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjbGFzc3Jvb20uYWRkcmVzcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBsYWJlbD1cIuW3sui0reaVmeWupFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgYm9va2VkQ2xhc3Nyb29tczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+IHt7IGl0ZW0uYWRkcmVzcyB9fSB7eyBpdGVtLnJvb20gfX3lrqQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtdGhpblwiPiB7eyBpdGVtLnN0YXJ0QXQgfX0gLSB7eyBpdGVtLmVuZEF0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gdHlwZT1cInByaW1hcnlcIiAoY2xpY2spPVwidXBkYXRlKClcIj7kv53lrZg8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9yb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQ+XG4iXX0=
@@ -0,0 +1,68 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { MatButtonModule } from '@angular/material/button';
3
+ import { MatDialog } from '@angular/material/dialog';
4
+ import { MatSnackBar } from '@angular/material/snack-bar';
5
+ import { RouterLink, RouterLinkActive, RouterOutlet, ActivatedRoute } from '@angular/router';
6
+ import { CourseManageContentComponent } from '../course-manage-content/course-manage-content.component';
7
+ import { CourseService } from '../../../services';
8
+ import { CourseStatus } from '../../../interfaces';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/button";
11
+ export class CourseManageLayoutComponent {
12
+ constructor() {
13
+ this.submitted = false;
14
+ this.accepted = false;
15
+ this.isDraft = false;
16
+ this.route = inject(ActivatedRoute);
17
+ this.courseService = inject(CourseService);
18
+ this.dialog = inject(MatDialog);
19
+ this.snackBar = inject(MatSnackBar);
20
+ this.id = this.route.parent?.snapshot.paramMap.get('id');
21
+ }
22
+ ngOnInit() {
23
+ this.get();
24
+ }
25
+ get() {
26
+ this.courseService.get(this.id).subscribe({
27
+ next: (res) => {
28
+ this.course = res.data;
29
+ this.updateStatus();
30
+ },
31
+ });
32
+ }
33
+ updateStatus() {
34
+ this.isDraft = this.course.status.toString() === 'DRAFT' || this.course.status.toString() === 'PENDING';
35
+ this.accepted = this.course.status.toString() === 'ACCEPTED';
36
+ }
37
+ submitForReview() {
38
+ this.courseService.review(this.id).subscribe({
39
+ next: (res) => {
40
+ this.snackBar.open('提交成功, 等待审核');
41
+ this.course.status = CourseStatus['审核中'];
42
+ this.updateStatus();
43
+ },
44
+ error: (error) => {
45
+ this.snackBar.open(error.message);
46
+ },
47
+ });
48
+ }
49
+ publish() {
50
+ this.courseService.publish(this.id).subscribe({
51
+ next: (res) => {
52
+ this.snackBar.open('发布成功');
53
+ this.course.status = CourseStatus['已发布'];
54
+ this.updateStatus();
55
+ },
56
+ error: (error) => {
57
+ this.snackBar.open(error.message);
58
+ },
59
+ });
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
62
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: CourseManageLayoutComponent, isStandalone: true, selector: "rolatech-course-manage-layout", ngImport: i0, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 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\">\u8BFE\u7A0B\u4FE1\u606F</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-3\">\u57FA\u672C\u4FE1\u606F</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-3\">\u56FE\u7247</a>\n <a routerLink=\"./details\" routerLinkActive=\"manage-active\" class=\"p-3\">\u8BE6\u60C5</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\">\u8BFE\u7A0B\u5185\u5BB9</div>\n <a routerLink=\"./section\" routerLinkActive=\"manage-active\" class=\"p-3\">\u7AE0\u8282</a>\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-3\">\u8BFE\u8868</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-3\">\u4EF7\u683C</a>\n </div>\n\n @if (isDraft) {\n <div class=\"md:mt-6 ml-3 md:ml-2\">\n <!-- <button mat-stroked-button (click)=\"publish()\">\u9884\u89C8</button> -->\n <button mat-flat-button (click)=\"submitForReview()\">\u63D0\u4EA4\u5BA1\u6838</button>\n </div>\n }\n\n @if (accepted) {\n <div class=\"md:mt-6 md:ml-2\">\n <button mat-flat-button color=\"primary\" (click)=\"publish()\">\u53D1\u5E03\u8BFE\u7A0B</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:#0000000d;box-shadow:5px 0 #000 inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px #000}}\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"] }] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CourseManageLayoutComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'rolatech-course-manage-layout', standalone: true, imports: [RouterLink, RouterLinkActive, MatButtonModule, RouterOutlet, CourseManageContentComponent], template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 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\">\u8BFE\u7A0B\u4FE1\u606F</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-3\">\u57FA\u672C\u4FE1\u606F</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-3\">\u56FE\u7247</a>\n <a routerLink=\"./details\" routerLinkActive=\"manage-active\" class=\"p-3\">\u8BE6\u60C5</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\">\u8BFE\u7A0B\u5185\u5BB9</div>\n <a routerLink=\"./section\" routerLinkActive=\"manage-active\" class=\"p-3\">\u7AE0\u8282</a>\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-3\">\u8BFE\u8868</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-3\">\u4EF7\u683C</a>\n </div>\n\n @if (isDraft) {\n <div class=\"md:mt-6 ml-3 md:ml-2\">\n <!-- <button mat-stroked-button (click)=\"publish()\">\u9884\u89C8</button> -->\n <button mat-flat-button (click)=\"submitForReview()\">\u63D0\u4EA4\u5BA1\u6838</button>\n </div>\n }\n\n @if (accepted) {\n <div class=\"md:mt-6 md:ml-2\">\n <button mat-flat-button color=\"primary\" (click)=\"publish()\">\u53D1\u5E03\u8BFE\u7A0B</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:#0000000d;box-shadow:5px 0 #000 inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px #000}}\n"] }]
67
+ }], ctorParameters: () => [] });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1sYXlvdXQvY291cnNlLW1hbmFnZS1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1sYXlvdXQvY291cnNlLW1hbmFnZS1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDeEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBVSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBUzNELE1BQU0sT0FBTywyQkFBMkI7SUFXdEM7UUFSQSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFD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Q29tcG9uZW50LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rLCBSb3V0ZXJMaW5rQWN0aXZlLCBSb3V0ZXJPdXRsZXQsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvdXJzZU1hbmFnZUNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9jb3Vyc2UtbWFuYWdlLWNvbnRlbnQvY291cnNlLW1hbmFnZS1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQ291cnNlLCBDb3Vyc2VTdGF0dXMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY291cnNlLW1hbmFnZS1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vY291cnNlLW1hbmFnZS1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY291cnNlLW1hbmFnZS1sYXlvdXQuY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbUm91dGVyTGluaywgUm91dGVyTGlua0FjdGl2ZSwgTWF0QnV0dG9uTW9kdWxlLCBSb3V0ZXJPdXRsZXQsIENvdXJzZU1hbmFnZUNvbnRlbnRDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VNYW5hZ2VMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBpZDogc3RyaW5nO1xuICBjb3Vyc2UhOiBDb3Vyc2U7XG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICBhY2NlcHRlZCA9IGZhbHNlO1xuICBpc0RyYWZ0ID0gZmFsc2U7XG4gIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgY291cnNlU2VydmljZSA9IGluamVjdChDb3Vyc2VTZXJ2aWNlKTtcbiAgZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHNuYWNrQmFyID0gaW5qZWN0KE1hdFNuYWNrQmFyKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkID0gdGhpcy5yb3V0ZS5wYXJlbnQ/LnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKSBhcyBzdHJpbmc7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXQoKTtcbiAgfVxuICBnZXQoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmdldCh0aGlzLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY291cnNlID0gcmVzLmRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVN0YXR1cygpIHtcbiAgICB0aGlzLmlzRHJhZnQgPSB0aGlzLmNvdXJzZS5zdGF0dXMudG9TdHJpbmcoKSA9PT0gJ0RSQUZUJyB8fCB0aGlzLmNvdXJzZS5zdGF0dXMudG9TdHJpbmcoKSA9PT0gJ1BFTkRJTkcnO1xuICAgIHRoaXMuYWNjZXB0ZWQgPSB0aGlzLmNvdXJzZS5zdGF0dXMudG9TdHJpbmcoKSA9PT0gJ0FDQ0VQVEVEJztcbiAgfVxuICBzdWJtaXRGb3JSZXZpZXcoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnJldmlldyh0aGlzLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ+aPkOS6pOaIkOWKnywg562J5b6F5a6h5qC4Jyk7XG5cbiAgICAgICAgdGhpcy5jb3Vyc2Uuc3RhdHVzID0gQ291cnNlU3RhdHVzWyflrqHmoLjkuK0nIGFzIGtleW9mIHR5cGVvZiBDb3Vyc2VTdGF0dXNdO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBwdWJsaXNoKCkge1xuICAgIHRoaXMuY291cnNlU2VydmljZS5wdWJsaXNoKHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3Blbign5Y+R5biD5oiQ5YqfJyk7XG4gICAgICAgIHRoaXMuY291cnNlLnN0YXR1cyA9IENvdXJzZVN0YXR1c1sn5bey5Y+R5biDJyBhcyBrZXlvZiB0eXBlb2YgQ291cnNlU3RhdHVzXTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvci5tZXNzYWdlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IG0tYXV0b1wiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtaW4tdy1bMjU2cHhdIHB4LTMgZmxleCBmbGV4LXJvdyBtZDpmbGV4LWNvbCBtZDpoLWZ1bGwgaXRlbXMtY2VudGVyIG1kOml0ZW1zLXN0YXJ0IGgtMTYgb3ZlcmZsb3cteC1zY3JvbGwgb3ZlcmZsb3cteS1oaWRkZW4gc2Nyb2xsYmFyLWhpZGUgd2hpdGVzcGFjZS1wcmVcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWQ6ZmxleC1jb2wgbWQ6dy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIG1kOmZsZXggdGV4dC14bCBmb250LWJvbGQgaC0xNCBpdGVtcy1jZW50ZXIgcHgtMlwiPuivvueoi+S/oeaBrzwvZGl2PlxuICAgICAgPGEgcm91dGVyTGluaz1cIi4vaW5mb1wiIHJvdXRlckxpbmtBY3RpdmU9XCJtYW5hZ2UtYWN0aXZlXCIgY2xhc3M9XCJwLTNcIj7ln7rmnKzkv6Hmga88L2E+XG4gICAgICA8YSByb3V0ZXJMaW5rPVwiLi9tZWRpYVwiIHJvdXRlckxpbmtBY3RpdmU9XCJtYW5hZ2UtYWN0aXZlXCIgY2xhc3M9XCJwLTNcIj7lm77niYc8L2E+XG4gICAgICA8YSByb3V0ZXJMaW5rPVwiLi9kZXRhaWxzXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtM1wiPuivpuaDhTwvYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtZDpmbGV4LWNvbCBtZDp3LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6ZmxleCB0ZXh0LXhsIGZvbnQtYm9sZCBoLTE0IGl0ZW1zLWNlbnRlciBweC0yXCI+6K++56iL5YaF5a65PC9kaXY+XG4gICAgICA8YSByb3V0ZXJMaW5rPVwiLi9zZWN0aW9uXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtM1wiPueroOiKgjwvYT5cbiAgICAgIDxhIHJvdXRlckxpbms9XCIuL3NjaGVkdWxlXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtM1wiPuivvuihqDwvYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBtZDpmbGV4LWNvbCBtZDp3LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6ZmxleCB0ZXh0LXhsIGZvbnQtYm9sZCBoLTE0IGl0ZW1zLWNlbnRlciBweC0yXCI+5YW25LuW5L+h5oGvPC9kaXY+XG4gICAgICA8YSByb3V0ZXJMaW5rPVwiLi9wcmljaW5nXCIgcm91dGVyTGlua0FjdGl2ZT1cIm1hbmFnZS1hY3RpdmVcIiBjbGFzcz1cInAtM1wiPuS7t+agvDwvYT5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaXNEcmFmdCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1kOm10LTYgbWwtMyBtZDptbC0yXCI+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cInB1Ymxpc2goKVwiPumihOiniDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cInN1Ym1pdEZvclJldmlldygpXCI+5o+Q5Lqk5a6h5qC4PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGFjY2VwdGVkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWQ6bXQtNiBtZDptbC0yXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJwdWJsaXNoKClcIj7lj5HluIPor77nqIs8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=