@rolatech/angular-course 17.6.3 → 19.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/fesm2022/rolatech-angular-course-course-index.component-Ba8BsDP1.mjs +55 -0
  2. package/fesm2022/rolatech-angular-course-course-index.component-Ba8BsDP1.mjs.map +1 -0
  3. package/fesm2022/rolatech-angular-course.mjs +276 -301
  4. package/fesm2022/rolatech-angular-course.mjs.map +1 -1
  5. package/lib/components/index.d.ts +0 -1
  6. package/package.json +8 -6
  7. package/themes/_default.scss +1 -1
  8. package/esm2022/index.mjs +0 -7
  9. package/esm2022/lib/components/course-action/course-action.component.mjs +0 -29
  10. package/esm2022/lib/components/course-details/course-details.component.mjs +0 -28
  11. package/esm2022/lib/components/course-details-dialog/course-details-dialog.component.mjs +0 -92
  12. package/esm2022/lib/components/course-edit-dialog/course-edit-dialog.component.mjs +0 -233
  13. package/esm2022/lib/components/course-info/course-info.component.mjs +0 -23
  14. package/esm2022/lib/components/course-item/course-item.component.mjs +0 -18
  15. package/esm2022/lib/components/course-media/course-media.component.mjs +0 -34
  16. package/esm2022/lib/components/course-media-owner-renderer/course-media-owner-renderer.component.mjs +0 -20
  17. package/esm2022/lib/components/course-preview/course-preview.component.mjs +0 -11
  18. package/esm2022/lib/components/course-pricing/course-pricing.component.mjs +0 -14
  19. package/esm2022/lib/components/course-pricing-add-dialog/course-pricing-add-dialog.component.mjs +0 -25
  20. package/esm2022/lib/components/course-pricing-dialog/course-pricing-dialog.component.mjs +0 -59
  21. package/esm2022/lib/components/course-schedule/course-schedule.component.mjs +0 -20
  22. package/esm2022/lib/components/course-schedule-add-dialog/course-schedule-add-dialog.component.mjs +0 -26
  23. package/esm2022/lib/components/course-schedule-dialog/course-schedule-dialog.component.mjs +0 -56
  24. package/esm2022/lib/components/course-section-item/course-section-item.component.mjs +0 -52
  25. package/esm2022/lib/components/course-section-lecture-item/course-section-lecture-item.component.mjs +0 -112
  26. package/esm2022/lib/components/course-section-lecture-video-dialog/course-section-lecture-video-dialog.component.mjs +0 -111
  27. package/esm2022/lib/components/course-section-lecture-video-item/course-section-lecture-video-item.component.mjs +0 -11
  28. package/esm2022/lib/components/course-sections/course-sections.component.mjs +0 -28
  29. package/esm2022/lib/components/detail-item/detail-item.component.mjs +0 -72
  30. package/esm2022/lib/components/index.mjs +0 -24
  31. package/esm2022/lib/components/pricing-item/pricing-item.component.mjs +0 -44
  32. package/esm2022/lib/components/schedule-item/schedule-item.component.mjs +0 -127
  33. package/esm2022/lib/interfaces/category.mjs +0 -2
  34. package/esm2022/lib/interfaces/course.mjs +0 -146
  35. package/esm2022/lib/interfaces/index.mjs +0 -2
  36. package/esm2022/lib/interfaces/media.mjs +0 -2
  37. package/esm2022/lib/pages/course/course-category/course-category.component.mjs +0 -74
  38. package/esm2022/lib/pages/course/course-detail/course-detail.component.mjs +0 -148
  39. package/esm2022/lib/pages/course/course-index/course-index.component.mjs +0 -53
  40. package/esm2022/lib/pages/course/course-layout/course-layout.component.mjs +0 -49
  41. package/esm2022/lib/pages/course/course-section-content/course-section-content.component.mjs +0 -133
  42. package/esm2022/lib/pages/course/course.routes.mjs +0 -33
  43. package/esm2022/lib/pages/course-manage/course-manage-content/course-manage-content.component.mjs +0 -12
  44. package/esm2022/lib/pages/course-manage/course-manage-details/course-manage-details.component.mjs +0 -159
  45. package/esm2022/lib/pages/course-manage/course-manage-info/course-manage-info.component.mjs +0 -139
  46. package/esm2022/lib/pages/course-manage/course-manage-layout/course-manage-layout.component.mjs +0 -68
  47. package/esm2022/lib/pages/course-manage/course-manage-media/course-manage-media.component.mjs +0 -137
  48. package/esm2022/lib/pages/course-manage/course-manage-pricing/course-manage-pricing.component.mjs +0 -127
  49. package/esm2022/lib/pages/course-manage/course-manage-schedule/course-manage-schedule.component.mjs +0 -131
  50. package/esm2022/lib/pages/course-manage/course-manage-section/course-manage-section.component.mjs +0 -341
  51. package/esm2022/lib/pages/course-manage/course-manage.routes.mjs +0 -40
  52. package/esm2022/lib/services/booking.service.mjs +0 -24
  53. package/esm2022/lib/services/category.service.mjs +0 -38
  54. package/esm2022/lib/services/course-section.service.mjs +0 -26
  55. package/esm2022/lib/services/course.service.mjs +0 -280
  56. package/esm2022/lib/services/index.mjs +0 -6
  57. package/esm2022/lib/services/instructor.service.mjs +0 -24
  58. package/esm2022/provider.mjs +0 -13
  59. package/esm2022/rolatech-angular-course.mjs +0 -5
  60. package/fesm2022/rolatech-angular-course-course-index.component-Cy7RMzDZ.mjs +0 -78
  61. package/fesm2022/rolatech-angular-course-course-index.component-Cy7RMzDZ.mjs.map +0 -1
  62. package/lib/components/course-item/course-item.component.d.ts +0 -9
@@ -1,133 +0,0 @@
1
- import { isPlatformBrowser } from '@angular/common';
2
- import { Component, ElementRef, PLATFORM_ID, effect, inject } from '@angular/core';
3
- import { ActivatedRoute, Router } from '@angular/router';
4
- import { CourseSectionService, CourseService } from '../../../services';
5
- import { AuthService, AuthUserService } from '@rolatech/angular-auth';
6
- import { AngularCommonModule } from '@rolatech/angular-common';
7
- import { AngularComponentsModule } from '@rolatech/angular-components';
8
- import { CommentsComponent } from '@rolatech/angular-comment';
9
- import { CourseMediaOwnerRendererComponent } from '../../../components/course-media-owner-renderer/course-media-owner-renderer.component';
10
- import { CourseSectionsComponent } from '../../../components/course-sections/course-sections.component';
11
- import * as i0 from "@angular/core";
12
- export class CourseSectionContentComponent {
13
- constructor() {
14
- this.route = inject(ActivatedRoute);
15
- this.router = inject(Router);
16
- this.courseSectionService = inject(CourseSectionService);
17
- this.courseService = inject(CourseService);
18
- this.authService = inject(AuthService);
19
- this.authUserService = inject(AuthUserService);
20
- this.el = inject(ElementRef);
21
- this.platformId = inject(PLATFORM_ID);
22
- this.authenticated = this.authService.authenticated;
23
- this.sections = [];
24
- this.courseId = '';
25
- this.sectionId = '';
26
- this.lectureId = '';
27
- this.videoUrl = '';
28
- this.instructorName = '';
29
- this.instructorAvatar = '';
30
- this.instructorUsername = '';
31
- this.purchased = false;
32
- effect(() => {
33
- if (this.authenticated()) {
34
- this.findPurchasedByCourseId();
35
- }
36
- });
37
- }
38
- ngOnInit() {
39
- this.route.params.subscribe((params) => {
40
- this.courseId = params['id'];
41
- this.sectionId = params['sectionId'];
42
- this.lectureId = params['lectureId'];
43
- this.findCourse(this.courseId);
44
- this.findSections(this.courseId);
45
- });
46
- }
47
- ngOnDestroy() {
48
- if (this.player) {
49
- this.player.destroy();
50
- }
51
- }
52
- ngAfterViewInit() { }
53
- initPlayer(url, thumbnail) {
54
- if (!isPlatformBrowser(this.platformId)) {
55
- return;
56
- }
57
- // 'https://cos-video-1258344699.cos.ap-guangzhou.tencentcos.cn/test.mp4',
58
- if (!this.player) {
59
- const playerContainer = this.el.nativeElement.querySelector('#dplayer');
60
- this.player = new DPlayer({
61
- container: playerContainer,
62
- screenshot: true,
63
- preload: 'metadata',
64
- video: {
65
- url: url,
66
- pic: thumbnail,
67
- },
68
- });
69
- }
70
- else {
71
- this.player.switchVideo({
72
- url: url,
73
- pic: thumbnail,
74
- });
75
- }
76
- }
77
- findSections(courseId) {
78
- this.courseSectionService.findSections(courseId).subscribe({
79
- next: (res) => {
80
- this.sections = res.data;
81
- const section = this.sections.find((item) => item.id === this.sectionId);
82
- const letcture = section?.lectures.find((item) => item.id === this.lectureId);
83
- this.videoUrl = letcture?.item.url;
84
- const thumbnail = letcture?.item.thumbnail;
85
- this.initPlayer(this.videoUrl, thumbnail);
86
- },
87
- });
88
- }
89
- findCourse(courseId) {
90
- this.courseService.get(courseId).subscribe({
91
- next: (res) => {
92
- this.course = res.data;
93
- this.findUserBaseInfo(this.course.instructorId);
94
- },
95
- });
96
- }
97
- findUserBaseInfo(userId) {
98
- this.authUserService.getPublicUserInfo(userId).subscribe({
99
- next: (res) => {
100
- this.instructorName = res.name;
101
- this.instructorAvatar = res.avatar;
102
- this.instructorUsername = res.username;
103
- },
104
- });
105
- }
106
- findPurchasedByCourseId() {
107
- this.courseService.findPurchasedByCourseId(this.courseId).subscribe({
108
- next: (res) => {
109
- this.purchased = res.data ? true : false;
110
- },
111
- });
112
- }
113
- onSection(event) {
114
- const { section, lecture } = event;
115
- this.router.navigate(['/courses', this.courseId, 'sections', section.id, 'lectures', lecture.id]);
116
- }
117
- checkout(e) {
118
- this.router.navigateByUrl(`/cart/checkout/courses/${this.courseId}`);
119
- }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseSectionContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: CourseSectionContentComponent, isStandalone: true, selector: "rolatech-course-section-content", ngImport: i0, template: "<div class=\"flex lg:flex-row flex-col justify-between w-full mt-2 lg:mt-4\">\n <div class=\"lg:w-[70%] flex flex-col items-start justify-center px-4 lg:px-6 h-fit\">\n <div id=\"dplayer\" class=\"w-full h-auto aspect-video rounded-xl\"></div>\n <div class=\"py-3 w-full\">\n @if (course) {\n <div class=\"text-xl font-medium py-3\">\n {{ course.name }}\n </div>\n <div>\n <rolatech-course-media-owner-renderer\n [name]=\"instructorName\"\n [avatar]=\"instructorAvatar\"\n [username]=\"instructorUsername\"\n ></rolatech-course-media-owner-renderer>\n </div>\n <div class=\"hidden lg:block\">\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n }\n </div>\n </div>\n <div class=\"lg:w-[30%] px-4 lg:px-0 lg:pr-6\">\n <rolatech-course-sections\n [sections]=\"sections\"\n [purchased]=\"purchased\"\n (section)=\"onSection($event)\"\n (checkout)=\"checkout($event)\"\n ></rolatech-course-sections>\n </div>\n <div class=\"lg:hidden block px-4 lg:px-6\">\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: CourseSectionsComponent, selector: "rolatech-course-sections", inputs: ["purchased", "sections"], outputs: ["section", "checkout"] }, { kind: "component", type: CourseMediaOwnerRendererComponent, selector: "rolatech-course-media-owner-renderer", inputs: ["name", "avatar", "username"] }, { kind: "component", type: CommentsComponent, selector: "rolatech-comments", inputs: ["itemId"] }] }); }
122
- }
123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: CourseSectionContentComponent, decorators: [{
124
- type: Component,
125
- args: [{ standalone: true, imports: [
126
- AngularCommonModule,
127
- AngularComponentsModule,
128
- CourseSectionsComponent,
129
- CourseMediaOwnerRendererComponent,
130
- CommentsComponent,
131
- ], selector: 'rolatech-course-section-content', template: "<div class=\"flex lg:flex-row flex-col justify-between w-full mt-2 lg:mt-4\">\n <div class=\"lg:w-[70%] flex flex-col items-start justify-center px-4 lg:px-6 h-fit\">\n <div id=\"dplayer\" class=\"w-full h-auto aspect-video rounded-xl\"></div>\n <div class=\"py-3 w-full\">\n @if (course) {\n <div class=\"text-xl font-medium py-3\">\n {{ course.name }}\n </div>\n <div>\n <rolatech-course-media-owner-renderer\n [name]=\"instructorName\"\n [avatar]=\"instructorAvatar\"\n [username]=\"instructorUsername\"\n ></rolatech-course-media-owner-renderer>\n </div>\n <div class=\"hidden lg:block\">\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n }\n </div>\n </div>\n <div class=\"lg:w-[30%] px-4 lg:px-0 lg:pr-6\">\n <rolatech-course-sections\n [sections]=\"sections\"\n [purchased]=\"purchased\"\n (section)=\"onSection($event)\"\n (checkout)=\"checkout($event)\"\n ></rolatech-course-sections>\n </div>\n <div class=\"lg:hidden block px-4 lg:px-6\">\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n</div>\n" }]
132
- }], ctorParameters: () => [] });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQvY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQvY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUZBQXVGLENBQUM7QUFDMUksT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0RBQStELENBQUM7O0FBa0J4RyxNQUFNLE9BQU8sNkJBQTZC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QjFDLDBzQ0FpQ0EseUREZkksbUJBQW1CLDhCQUNuQix1QkFBdUIsK0JBQ3ZCLHVCQUF1QiwwSUFDdkIsaUNBQWlDLHlIQUNqQyxpQkFBaUI7OzJGQU1SLDZCQUE2QjtrQkFiekMsU0FBUztpQ0FDSSxJQUFJLFdBQ1A7d0JBQ1AsbUJBQW1CO3dCQUNuQix1QkFBdUI7d0JBQ3ZCLHVCQUF1Qjt3QkFDdkIsaUNBQWlDO3dCQUNqQyxpQkFBaUI7cUJBQ2xCLFlBQ1MsaUNBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUExBVEZPUk1fSUQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvdXJzZVNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvdXJzZVNlY3Rpb25TZXJ2aWNlLCBDb3Vyc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIEF1dGhVc2VyU2VydmljZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWF1dGgnO1xuaW1wb3J0IHsgQW5ndWxhckNvbW1vbk1vZHVsZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbW1vbic7XG5pbXBvcnQgeyBBbmd1bGFyQ29tcG9uZW50c01vZHVsZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQ29tbWVudHNDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tZW50JztcbmltcG9ydCB7IENvdXJzZU1lZGlhT3duZXJSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY291cnNlLW1lZGlhLW93bmVyLXJlbmRlcmVyL2NvdXJzZS1tZWRpYS1vd25lci1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlU2VjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvdXJzZS1zZWN0aW9ucy9jb3Vyc2Utc2VjdGlvbnMuY29tcG9uZW50JztcblxuLy8gaW1wb3J0IERQbGF5ZXIgZnJvbSAnRFBsYXllcic7XG5kZWNsYXJlIGNvbnN0IERQbGF5ZXI6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBbmd1bGFyQ29tbW9uTW9kdWxlLFxuICAgIEFuZ3VsYXJDb21wb25lbnRzTW9kdWxlLFxuICAgIENvdXJzZVNlY3Rpb25zQ29tcG9uZW50LFxuICAgIENvdXJzZU1lZGlhT3duZXJSZW5kZXJlckNvbXBvbmVudCxcbiAgICBDb21tZW50c0NvbXBvbmVudCxcbiAgXSxcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbi1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2Utc2VjdGlvbi1jb250ZW50LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvdXJzZVNlY3Rpb25Db250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBjb3Vyc2VTZWN0aW9uU2VydmljZSA9IGluamVjdChDb3Vyc2VTZWN0aW9uU2VydmljZSk7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgYXV0aFVzZXJTZXJ2aWNlID0gaW5qZWN0KEF1dGhVc2VyU2VydmljZSk7XG4gIGVsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcbiAgYXV0aGVudGljYXRlZCA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aGVudGljYXRlZDtcbiAgcGxheWVyOiBhbnk7XG4gIHNlY3Rpb25zOiBDb3Vyc2VTZWN0aW9uW10gPSBbXTtcbiAgY291cnNlSWQgPSAnJztcbiAgc2VjdGlvbklkID0gJyc7XG4gIGxlY3R1cmVJZCA9ICcnO1xuICB2aWRlb1VybDogYW55ID0gJyc7XG4gIGluc3RydWN0b3JOYW1lID0gJyc7XG4gIGluc3RydWN0b3JBdmF0YXIgPSAnJztcbiAgaW5zdHJ1Y3RvclVzZXJuYW1lID0gJyc7XG4gIGNvdXJzZTogYW55O1xuICBwdXJjaGFzZWQgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICB0aGlzLmZpbmRQdXJjaGFzZWRCeUNvdXJzZUlkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIHRoaXMuY291cnNlSWQgPSBwYXJhbXNbJ2lkJ107XG4gICAgICB0aGlzLnNlY3Rpb25JZCA9IHBhcmFtc1snc2VjdGlvbklkJ107XG4gICAgICB0aGlzLmxlY3R1cmVJZCA9IHBhcmFtc1snbGVjdHVyZUlkJ107XG4gICAgICB0aGlzLmZpbmRDb3Vyc2UodGhpcy5jb3Vyc2VJZCk7XG4gICAgICB0aGlzLmZpbmRTZWN0aW9ucyh0aGlzLmNvdXJzZUlkKTtcbiAgICB9KTtcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgIHRoaXMucGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cbiAgaW5pdFBsYXllcih1cmw6IHN0cmluZywgdGh1bWJuYWlsPzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vICdodHRwczovL2Nvcy12aWRlby0xMjU4MzQ0Njk5LmNvcy5hcC1ndWFuZ3pob3UudGVuY2VudGNvcy5jbi90ZXN0Lm1wNCcsXG4gICAgaWYgKCF0aGlzLnBsYXllcikge1xuICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkcGxheWVyJyk7XG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHtcbiAgICAgICAgY29udGFpbmVyOiBwbGF5ZXJDb250YWluZXIsXG4gICAgICAgIHNjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIHByZWxvYWQ6ICdtZXRhZGF0YScsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgcGljOiB0aHVtYm5haWwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXIuc3dpdGNoVmlkZW8oe1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgcGljOiB0aHVtYm5haWwsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZmluZFNlY3Rpb25zKGNvdXJzZUlkOiBhbnkpIHtcbiAgICB0aGlzLmNvdXJzZVNlY3Rpb25TZXJ2aWNlLmZpbmRTZWN0aW9ucyhjb3Vyc2VJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHJlcy5kYXRhO1xuICAgICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5zZWN0aW9ucy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IHRoaXMuc2VjdGlvbklkKTtcbiAgICAgICAgY29uc3QgbGV0Y3R1cmUgPSBzZWN0aW9uPy5sZWN0dXJlcy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgPT09IHRoaXMubGVjdHVyZUlkKTtcbiAgICAgICAgdGhpcy52aWRlb1VybCA9IGxldGN0dXJlPy5pdGVtLnVybDtcbiAgICAgICAgY29uc3QgdGh1bWJuYWlsID0gbGV0Y3R1cmU/Lml0ZW0udGh1bWJuYWlsO1xuXG4gICAgICAgIHRoaXMuaW5pdFBsYXllcih0aGlzLnZpZGVvVXJsLCB0aHVtYm5haWwpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kQ291cnNlKGNvdXJzZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZ2V0KGNvdXJzZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY291cnNlID0gcmVzLmRhdGE7XG4gICAgICAgIHRoaXMuZmluZFVzZXJCYXNlSW5mbyh0aGlzLmNvdXJzZS5pbnN0cnVjdG9ySWQpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kVXNlckJhc2VJbmZvKHVzZXJJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hdXRoVXNlclNlcnZpY2UuZ2V0UHVibGljVXNlckluZm8odXNlcklkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmluc3RydWN0b3JOYW1lID0gcmVzLm5hbWU7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3RvckF2YXRhciA9IHJlcy5hdmF0YXI7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3RvclVzZXJuYW1lID0gcmVzLnVzZXJuYW1lO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kUHVyY2hhc2VkQnlDb3Vyc2VJZCgpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZmluZFB1cmNoYXNlZEJ5Q291cnNlSWQodGhpcy5jb3Vyc2VJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnB1cmNoYXNlZCA9IHJlcy5kYXRhID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvblNlY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHsgc2VjdGlvbiwgbGVjdHVyZSB9ID0gZXZlbnQ7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY291cnNlcycsIHRoaXMuY291cnNlSWQsICdzZWN0aW9ucycsIHNlY3Rpb24uaWQsICdsZWN0dXJlcycsIGxlY3R1cmUuaWRdKTtcbiAgfVxuICBjaGVja291dChlOiBhbnkpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGAvY2FydC9jaGVja291dC9jb3Vyc2VzLyR7dGhpcy5jb3Vyc2VJZH1gKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggbGc6ZmxleC1yb3cgZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBtdC0yIGxnOm10LTRcIj5cbiAgPGRpdiBjbGFzcz1cImxnOnctWzcwJV0gZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWNlbnRlciBweC00IGxnOnB4LTYgaC1maXRcIj5cbiAgICA8ZGl2IGlkPVwiZHBsYXllclwiIGNsYXNzPVwidy1mdWxsIGgtYXV0byBhc3BlY3QtdmlkZW8gcm91bmRlZC14bFwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJweS0zIHctZnVsbFwiPlxuICAgICAgQGlmIChjb3Vyc2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteGwgZm9udC1tZWRpdW0gcHktM1wiPlxuICAgICAgICAgIHt7IGNvdXJzZS5uYW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxyb2xhdGVjaC1jb3Vyc2UtbWVkaWEtb3duZXItcmVuZGVyZXJcbiAgICAgICAgICAgIFtuYW1lXT1cImluc3RydWN0b3JOYW1lXCJcbiAgICAgICAgICAgIFthdmF0YXJdPVwiaW5zdHJ1Y3RvckF2YXRhclwiXG4gICAgICAgICAgICBbdXNlcm5hbWVdPVwiaW5zdHJ1Y3RvclVzZXJuYW1lXCJcbiAgICAgICAgICA+PC9yb2xhdGVjaC1jb3Vyc2UtbWVkaWEtb3duZXItcmVuZGVyZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIGxnOmJsb2NrXCI+XG4gICAgICAgICAgPHJvbGF0ZWNoLWNvbW1lbnRzIFtpdGVtSWRdPVwibGVjdHVyZUlkXCI+PC9yb2xhdGVjaC1jb21tZW50cz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGc6dy1bMzAlXSBweC00IGxnOnB4LTAgbGc6cHItNlwiPlxuICAgIDxyb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbnNcbiAgICAgIFtzZWN0aW9uc109XCJzZWN0aW9uc1wiXG4gICAgICBbcHVyY2hhc2VkXT1cInB1cmNoYXNlZFwiXG4gICAgICAoc2VjdGlvbik9XCJvblNlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAoY2hlY2tvdXQpPVwiY2hlY2tvdXQoJGV2ZW50KVwiXG4gICAgPjwvcm9sYXRlY2gtY291cnNlLXNlY3Rpb25zPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImxnOmhpZGRlbiBibG9jayBweC00IGxnOnB4LTZcIj5cbiAgICA8cm9sYXRlY2gtY29tbWVudHMgW2l0ZW1JZF09XCJsZWN0dXJlSWRcIj48L3JvbGF0ZWNoLWNvbW1lbnRzPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,33 +0,0 @@
1
- import { CourseCategoryComponent } from './course-category/course-category.component';
2
- import { CourseDetailComponent } from './course-detail/course-detail.component';
3
- import { CourseLayoutComponent } from './course-layout/course-layout.component';
4
- import { CourseSectionContentComponent } from './course-section-content/course-section-content.component';
5
- export const courseRoutes = [
6
- {
7
- path: '',
8
- component: CourseLayoutComponent,
9
- children: [
10
- {
11
- path: '',
12
- loadComponent: () => import('./course-index/course-index.component').then((x) => x.CourseIndexComponent),
13
- },
14
- {
15
- path: 'categories/:id',
16
- component: CourseCategoryComponent,
17
- },
18
- ],
19
- },
20
- {
21
- path: ':id',
22
- component: CourseDetailComponent,
23
- },
24
- {
25
- path: ':id/sections/:sectionId/lectures/:lectureId',
26
- component: CourseSectionContentComponent,
27
- },
28
- {
29
- path: 'my-courses',
30
- component: CourseDetailComponent,
31
- },
32
- ];
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLnJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UvY291cnNlLnJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUUxRyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVc7SUFDbEM7UUFDRSxJQUFJLEVBQUUsRUFBRTtRQUNSLFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO2FBQ3pHO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsU0FBUyxFQUFFLHVCQUF1QjthQUNuQztTQUNGO0tBQ0Y7SUFDRDtRQUNFLElBQUksRUFBRSxLQUFLO1FBQ1gsU0FBUyxFQUFFLHFCQUFxQjtLQUNqQztJQUNEO1FBQ0UsSUFBSSxFQUFFLDZDQUE2QztRQUNuRCxTQUFTLEVBQUUsNkJBQTZCO0tBQ3pDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsWUFBWTtRQUNsQixTQUFTLEVBQUUscUJBQXFCO0tBQ2pDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb3Vyc2VDYXRlZ29yeUNvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLWNhdGVnb3J5L2NvdXJzZS1jYXRlZ29yeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlRGV0YWlsQ29tcG9uZW50IH0gZnJvbSAnLi9jb3Vyc2UtZGV0YWlsL2NvdXJzZS1kZXRhaWwuY29tcG9uZW50JztcbmltcG9ydCB7IENvdXJzZUxheW91dENvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLWxheW91dC9jb3Vyc2UtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VTZWN0aW9uQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vY291cnNlLXNlY3Rpb24tY29udGVudC9jb3Vyc2Utc2VjdGlvbi1jb250ZW50LmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBjb3Vyc2VSb3V0ZXM6IFJvdXRlcyA9IFtcbiAge1xuICAgIHBhdGg6ICcnLFxuICAgIGNvbXBvbmVudDogQ291cnNlTGF5b3V0Q29tcG9uZW50LFxuICAgIGNoaWxkcmVuOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgICBsb2FkQ29tcG9uZW50OiAoKSA9PiBpbXBvcnQoJy4vY291cnNlLWluZGV4L2NvdXJzZS1pbmRleC5jb21wb25lbnQnKS50aGVuKCh4KSA9PiB4LkNvdXJzZUluZGV4Q29tcG9uZW50KSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdjYXRlZ29yaWVzLzppZCcsXG4gICAgICAgIGNvbXBvbmVudDogQ291cnNlQ2F0ZWdvcnlDb21wb25lbnQsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBwYXRoOiAnOmlkJyxcbiAgICBjb21wb25lbnQ6IENvdXJzZURldGFpbENvbXBvbmVudCxcbiAgfSxcbiAge1xuICAgIHBhdGg6ICc6aWQvc2VjdGlvbnMvOnNlY3Rpb25JZC9sZWN0dXJlcy86bGVjdHVyZUlkJyxcbiAgICBjb21wb25lbnQ6IENvdXJzZVNlY3Rpb25Db250ZW50Q29tcG9uZW50LFxuICB9LFxuICB7XG4gICAgcGF0aDogJ215LWNvdXJzZXMnLFxuICAgIGNvbXBvbmVudDogQ291cnNlRGV0YWlsQ29tcG9uZW50LFxuICB9LFxuXTtcbiJdfQ==
@@ -1,12 +0,0 @@
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.2.0", ngImport: i0, type: CourseManageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", 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.2.0", 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==
@@ -1,159 +0,0 @@
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.2.0", ngImport: i0, type: CourseManageDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
153
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: CourseManageDetailsComponent, isStandalone: true, selector: "rolatech-course-manage-details", ngImport: i0, template: "<rolatech-course-manage-content>\n <rolatech-toolbar title=\"\u8BE6\u60C5\" class=\"hidden md: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.2.0", 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 md: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+m5oOFXCIgY2xhc3M9XCJoaWRkZW4gbWQ6YmxvY2tcIiBkaXZpZGVyPiA8L3JvbGF0ZWNoLXRvb2xiYXI+XG4gIDxkaXY+XG4gICAgPGRpdj5cbiAgICAgIEBmb3IgKGRldGFpbCBvZiBkZXRhaWxzOyB0cmFjayBkZXRhaWwpIHtcbiAgICAgICAgPHJvbGF0ZWNoLWRldGFpbC1pdGVtXG4gICAgICAgICAgW2RldGFpbF09XCJkZXRhaWxcIlxuICAgICAgICAgICh1cGxvYWQpPVwib25EZXRhaWxNZWRpYVVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAoZGVsZXRlTWVkaWEpPVwib25EZXRhaWxNZWRpYURlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2F2ZSk9XCJvbkRldGFpbFNhdmUoJGV2ZW50KVwiXG4gICAgICAgICAgKGRlbGV0ZSk9XCJvbkRldGFpbERlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbYWN0aW9uc109XCJ0cnVlXCJcbiAgICAgICAgPjwvcm9sYXRlY2gtZGV0YWlsLWl0ZW0+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZERldGFpbCgpXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPua3u+WKoOivpuaDhTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtY29udGVudD5cbiJdfQ==
@@ -1,139 +0,0 @@
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.categoryService = inject(CategoryService);
29
- this.instructorService = inject(InstructorService);
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.2.0", ngImport: i0, type: CourseManageInfoComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
123
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", 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 md: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\"> {{ 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.2.0", 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 md: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\"> {{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLW1hbmFnZS1pbmZvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UtbWFuYWdlL2NvdXJzZS1tYW5hZ2UtaW5mby9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvdXJzZS9zcmMvbGliL3BhZ2VzL2NvdXJzZS1tYW5hZ2UvY291cnNlLW1hbmFnZS1pbmZvL2NvdXJzZS1tYW5hZ2UtaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN4RyxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNF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RUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsMkVBQTJFO1lBQzdFLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBekdVLHlCQUF5QjtrR0FBekIseUJBQXlCLDhHQ2pDdEMsd2hIQXdGQSxxRkRsRUksV0FBVyxvNENBQ1gsa0JBQWtCLDBTQUNsQixjQUFjLHlrQkFDZCxlQUFlLDhCQUNmLGVBQWUsb3pCQUNmLGVBQWUsOEJBQ2YsZUFBZSw0TkFDZixnQkFBZ0IsZ0lBQ2hCLDRCQUE0Qjs7MkZBR25CLHlCQUF5QjtrQkFqQnJDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBRzNCLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsNEJBQTRCO3FCQUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBUZXh0RmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGV4dC1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY291cnNlLW1hbmFnZS1jb250ZW50L2NvdXJzZS1tYW5hZ2UtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlLCBDb3Vyc2VDYXRlZ29yeSwgQ291cnNlU3RhdHVzIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDYXRlZ29yeVNlcnZpY2UsIENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBCb29raW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJbnN0cnVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2luc3RydWN0b3Iuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtaW5mbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtbWFuYWdlLWluZm8uY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBUZXh0RmllbGRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgVG9vbGJhckNvbXBvbmVudCxcbiAgICBDb3Vyc2VNYW5hZ2VDb250ZW50Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VNYW5hZ2VJbmZvQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIGNhdGVnb3J5U2VydmljZSA9IGluamVjdChDYXRlZ29yeVNlcnZpY2UpO1xuICBpbnN0cnVjdG9yU2VydmljZSA9IGluamVjdChJbnN0cnVjdG9yU2VydmljZSk7XG4gIGJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KEJvb2tpbmdTZXJ2aWNlKTtcblxuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgY291cnNlITogQ291cnNlO1xuICBzdGF0dXMgPSBDb3Vyc2VTdGF0dXM7XG4gIC8vIGNvdXJzZVR5cGU6IGFueSA9IENvdXJzZVR5cGU7XG4gIHNlbGVjdGVkQ2F0ZWdveUlkcyE6IHN0cmluZ1tdO1xuICBzZWxlY3RlZENsYXNzcm9vbTogYW55O1xuICBjYXRlZ29yaWVzITogQ291cnNlQ2F0ZWdvcnlbXTtcbiAgY2xhc3Nyb29tczogYW55O1xuICBib29rZWRDbGFzc3Jvb21zOiBhbnk7XG4gIGNvdXJzZVR5cGUgPSBbXG4gICAge1xuICAgICAga2V5OiAnT05MSU5FJyxcbiAgICAgIHZhbHVlOiAn57q/5LiKJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ09GRkxJTkUnLFxuICAgICAgdmFsdWU6ICfnur/kuIsnLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnTUlYRUQnLFxuICAgICAgdmFsdWU6ICfmt7flkIgnLFxuICAgIH0sXG4gIF07XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZCA9IHRoaXMucm91dGUucGFyZW50Py5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgc3RyaW5nO1xuICAgIHRoaXMuZmluZCgpO1xuICAgIHRoaXMuY2F0ZWdvcnlTZXJ2aWNlLmZpbmQoe30pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gcmVzLmRhdGE7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuZmluZENsYXNzcm9vbXMoKTtcbiAgICB0aGlzLmZpbmRCb29rZWRDbGFzc3Jvb21zKCk7XG4gIH1cbiAgZmluZEJvb2tlZENsYXNzcm9vbXMoKSB7XG4gICAgdGhpcy5ib29raW5nU2VydmljZS5pdGVtcyh7IHN0YXR1czogJ3BhaWQnIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib29rZWRDbGFzc3Jvb21zID0gcmVzLmRhdGE7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZmluZENsYXNzcm9vbXMoKSB7XG4gICAgdGhpcy5pbnN0cnVjdG9yU2VydmljZS5maW5kTXlDbGFzc3Jvb21zKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNsYXNzcm9vbXMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZCgpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZ2V0KHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb3Vyc2UgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgY29tcGFyZUZuKG8xOiBDb3Vyc2VDYXRlZ29yeSwgbzI6IENvdXJzZUNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIG8xLmlkID09PSBvMj8uaWQ7XG4gIH1cbiAgY29tcGFyZUNsYXNzcm9vbShvMTogYW55LCBvMjogYW55KSB7XG4gICAgaWYgKG8xLnJvb20pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG8xLmxhdGl0dWRlID09PSBvMj8ubGF0aXR1ZGUgJiZcbiAgICAgICAgbzEubG9uZ2l0dWRlID09PSBvMj8ubG9uZ2l0dWRlICYmXG4gICAgICAgIG8xLnJvb20gPT09IG8yLnJvb20gJiZcbiAgICAgICAgbzEuc3RhcnRBdCA9PT0gbzIuc3RhcnRBdCAmJlxuICAgICAgICBvMS5lbmRBdCA9PT0gbzIuZW5kQXRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvMS5sYXRpdHVkZSA9PT0gbzI/LmxhdGl0dWRlICYmIG8xLmxvbmdpdHVkZSA9PT0gbzI/LmxvbmdpdHVkZTtcbiAgICB9XG4gIH1cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ295SWRzID0gZXZlbnQudmFsdWU7XG4gIH1cbiAgb25DbGFzc3Jvb21TZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZENsYXNzcm9vbSA9IGV2ZW50LnZhbHVlO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uLCBjYXRlZ29yaWVzLCB0eXBlLCBjbGFzc3Jvb20gfSA9IHRoaXMuY291cnNlO1xuICAgIGNvbnN0IGZpbmFsQ2xhc3Nyb29tID0gY2xvbmUoY2xhc3Nyb29tKTtcbiAgICBmaW5hbENsYXNzcm9vbS5hZGRyZXNzID0gY2xhc3Nyb29tLnJvb20gPyBjbGFzc3Jvb20uYWRkcmVzcyArICcgJyArIGNsYXNzcm9vbS5yb29tICsgJ+WupCcgOiBjbGFzc3Jvb20uYWRkcmVzcztcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY2F0ZWdvcmllcyxcbiAgICAgIHR5cGUsXG4gICAgICBjbGFzc3Jvb206IGZpbmFsQ2xhc3Nyb29tLFxuICAgIH07XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLnVwZGF0ZSh0aGlzLmlkLCBkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCfkv53lrZjmiJDlip8nKTtcbiAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2AuLi8ke3Jlcy5kYXRhLmlkfWBdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oZS5tZXNzYWdlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxyb2xhdGVjaC1jb3Vyc2UtbWFuYWdlLWNvbnRlbnQ+XG4gIDxyb2xhdGVjaC10b29sYmFyIHRpdGxlPVwi5Z+65pys5L+h5oGvXCIgY2xhc3M9XCJoaWRkZW4gbWQ6YmxvY2tcIiBkaXZpZGVyPjwvcm9sYXRlY2gtdG9vbGJhcj5cbiAgQGlmIChjb3Vyc2UpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGZvcm0gI2NvdXJzZUZvcm09XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwidXBkYXRlKClcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD4g6K++56iL5ZCN56ewIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY291cnNlLm5hbWVcIiBuYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+IOivvueoi+aPj+i/sCA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvdXJzZS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBuYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjNcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBuZ01vZGVsR3JvdXA9XCJjYXRlZ29yaWVzXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD7liIbnsbs8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY291cnNlLmNhdGVnb3JpZXNcIlxuICAgICAgICAgICAgI3NlbGVjdD1cIm1hdFNlbGVjdFwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgY2F0ZWdvcmllczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPuexu+WeizwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0IG5hbWU9XCJ0eXBlXCIgWyhuZ01vZGVsKV09XCJjb3Vyc2UudHlwZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjb3Vyc2VUeXBlOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLmtleVwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgQGlmIChjb3Vyc2UudHlwZSAmJiBjb3Vyc2UudHlwZS50b1N0cmluZygpICE9PSAnT05MSU5FJykge1xuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIG5nTW9kZWxHcm91cD1cImNsYXNzcm9vbVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD7mlZnlrqQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY291cnNlLmNsYXNzcm9vbVwiXG4gICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlQ2xhc3Nyb29tXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNsYXNzcm9vbVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwIGxhYmVsPVwi6Ieq5pyJ5pWZ5a6kXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY2xhc3Nyb29tIG9mIGNsYXNzcm9vbXM7IHRyYWNrIGNsYXNzcm9vbSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImNsYXNzcm9vbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNsYXNzcm9vbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjbGFzc3Jvb20uYWRkcmVzcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCBsYWJlbD1cIuW3sui0reaVmeWupFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgYm9va2VkQ2xhc3Nyb29tczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+IHt7IGl0ZW0uYWRkcmVzcyB9fSB7eyBpdGVtLnJvb20gfX3lrqQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kXCI+IHt7IGl0ZW0uc3RhcnRBdCB9fSAtIHt7IGl0ZW0uZW5kQXQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgfVxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIChjbGljayk9XCJ1cGRhdGUoKVwiPuS/neWtmDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG48L3JvbGF0ZWNoLWNvdXJzZS1tYW5hZ2UtY29udGVudD5cbiJdfQ==