@rolatech/angular-course 17.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/index.mjs +4 -0
- package/esm2022/lib/components/course-action/course-action.component.mjs +27 -0
- package/esm2022/lib/components/course-details/course-details.component.mjs +27 -0
- package/esm2022/lib/components/course-info/course-info.component.mjs +19 -0
- package/esm2022/lib/components/course-item/course-item.component.mjs +15 -0
- package/esm2022/lib/components/course-media/course-media.component.mjs +34 -0
- package/esm2022/lib/components/course-media-owner-renderer/course-media-owner-renderer.component.mjs +20 -0
- package/esm2022/lib/components/course-pricing/course-pricing.component.mjs +14 -0
- package/esm2022/lib/components/course-schedule/course-schedule.component.mjs +22 -0
- package/esm2022/lib/components/course-sections/course-sections.component.mjs +30 -0
- package/esm2022/lib/interfaces/category.mjs +2 -0
- package/esm2022/lib/interfaces/course.mjs +146 -0
- package/esm2022/lib/interfaces/index.mjs +2 -0
- package/esm2022/lib/interfaces/media.mjs +2 -0
- package/esm2022/lib/pages/course/course-category/course-category.component.mjs +74 -0
- package/esm2022/lib/pages/course/course-detail/course-detail.component.mjs +157 -0
- package/esm2022/lib/pages/course/course-index/course-index.component.mjs +53 -0
- package/esm2022/lib/pages/course/course-layout/course-layout.component.mjs +49 -0
- package/esm2022/lib/pages/course/course-section-content/course-section-content.component.mjs +140 -0
- package/esm2022/lib/pages/course/course.routes.mjs +34 -0
- package/esm2022/lib/services/category.service.mjs +38 -0
- package/esm2022/lib/services/course-section.service.mjs +26 -0
- package/esm2022/lib/services/course.service.mjs +280 -0
- package/esm2022/lib/services/index.mjs +6 -0
- package/esm2022/provider.mjs +13 -0
- package/esm2022/rolatech-angular-course.mjs +5 -0
- package/fesm2022/rolatech-angular-course.mjs +1139 -0
- package/fesm2022/rolatech-angular-course.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/lib/components/course-action/course-action.component.d.ts +14 -0
- package/lib/components/course-details/course-details.component.d.ts +20 -0
- package/lib/components/course-info/course-info.component.d.ts +9 -0
- package/lib/components/course-item/course-item.component.d.ts +8 -0
- package/lib/components/course-media/course-media.component.d.ts +12 -0
- package/lib/components/course-media-owner-renderer/course-media-owner-renderer.component.d.ts +8 -0
- package/lib/components/course-pricing/course-pricing.component.d.ts +7 -0
- package/lib/components/course-schedule/course-schedule.component.d.ts +10 -0
- package/lib/components/course-sections/course-sections.component.d.ts +19 -0
- package/lib/interfaces/category.d.ts +16 -0
- package/lib/interfaces/course.d.ts +143 -0
- package/lib/interfaces/index.d.ts +3 -0
- package/lib/interfaces/media.d.ts +9 -0
- package/lib/pages/course/course-category/course-category.component.d.ts +21 -0
- package/lib/pages/course/course-detail/course-detail.component.d.ts +36 -0
- package/lib/pages/course/course-index/course-index.component.d.ts +18 -0
- package/lib/pages/course/course-layout/course-layout.component.d.ts +17 -0
- package/lib/pages/course/course-section-content/course-section-content.component.d.ts +40 -0
- package/lib/pages/course/course.routes.d.ts +2 -0
- package/lib/services/category.service.d.ts +12 -0
- package/lib/services/course-section.service.d.ts +10 -0
- package/lib/services/course.service.d.ts +65 -0
- package/lib/services/index.d.ts +5 -0
- package/package.json +31 -0
- package/provider.d.ts +2 -0
- package/themes/_default.scss +1 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { CategoryService, CourseService } from '../../../services';
|
|
3
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
4
|
+
import { AngularComponentsModule, BaseComponent } from '@rolatech/angular-components';
|
|
5
|
+
import { CourseItemComponent } from '../../../components/course-item/course-item.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/router";
|
|
8
|
+
export class CourseCategoryComponent extends BaseComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.categoryService = inject(CategoryService);
|
|
12
|
+
this.courseService = inject(CourseService);
|
|
13
|
+
this.courses = [];
|
|
14
|
+
this.categories = [];
|
|
15
|
+
this.loading = false;
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this.findAllCategories();
|
|
19
|
+
this.route.paramMap.subscribe((params) => {
|
|
20
|
+
const id = params.get('id');
|
|
21
|
+
this.findCategoryById(id);
|
|
22
|
+
this.findCoursesByCategoryId(id);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
findAllCategories() {
|
|
26
|
+
this.categoryService.find({}).subscribe({
|
|
27
|
+
next: (res) => {
|
|
28
|
+
this.categories = res.data;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
findCategoryById(id) {
|
|
33
|
+
this.categoryService.get(id).subscribe({
|
|
34
|
+
next: (res) => {
|
|
35
|
+
this.category = res.data;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
findAllCourses() {
|
|
40
|
+
this.courseService.find({}).subscribe({
|
|
41
|
+
next: (res) => {
|
|
42
|
+
this.courses = res.data;
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
findCoursesByCategoryId(id) {
|
|
47
|
+
this.loading = true;
|
|
48
|
+
const options = {
|
|
49
|
+
filter: `categories:${id},published:true`,
|
|
50
|
+
};
|
|
51
|
+
this.courseService.find(options).subscribe({
|
|
52
|
+
next: (res) => {
|
|
53
|
+
this.courses = res.data;
|
|
54
|
+
this.loading = false;
|
|
55
|
+
},
|
|
56
|
+
error: (error) => {
|
|
57
|
+
this.loading = false;
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
loadCoursesByCategory(item) {
|
|
62
|
+
// [routerLink] = "['../../', item.id]";
|
|
63
|
+
this.router.navigate([`../../${item.id}`], {
|
|
64
|
+
relativeTo: this.route,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseCategoryComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
68
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: CourseCategoryComponent, isStandalone: true, selector: "rolatech-course-category", usesInheritance: true, ngImport: i0, template: "<div>\n @if (category) {\n <div class=\"p-3 hidden sm:block text-2xl font-medium\">{{ category.name }}</div>\n } @else {\n <div class=\"flex flex-row animate-pulse w-full\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n </div>\n }\n @if (loading) {\n @for (number of [0, 1, 2, 3, 4, 5]; track number) {\n <div class=\"flex flex-row animate-pulse mt-3 mr-4 cursor-pointer w-full\">\n <div class=\"h-fit w-2/5 sm:w-1/4 aspect-video bg-gray-200 rounded-lg\"></div>\n <div class=\"w-3/5 sm:w-3/4 ml-3 py-1 flex flex-col justify-between\">\n <div class=\"space-y-3\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1 py-1\"></div>\n </div>\n <div>\n <div class=\"h-2 bg-slate-200 rounded col-span-2 py-1\"></div>\n </div>\n </div>\n </div>\n }\n } @else {\n @for (item of courses; track item) {\n <div\n class=\"py-2 cursor-pointer min-w-[80%] md:min-w-[25%] sm:min-w-[33%] hover:bg-gray-100\"\n [routerLink]=\"['../../', item.id]\"\n >\n <rolatech-course-item [course]=\"item\"></rolatech-course-item>\n </div>\n }\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: CourseItemComponent, selector: "rolatech-course-item", inputs: ["course", "row"] }] }); }
|
|
69
|
+
}
|
|
70
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseCategoryComponent, decorators: [{
|
|
71
|
+
type: Component,
|
|
72
|
+
args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule, CourseItemComponent], selector: 'rolatech-course-category', template: "<div>\n @if (category) {\n <div class=\"p-3 hidden sm:block text-2xl font-medium\">{{ category.name }}</div>\n } @else {\n <div class=\"flex flex-row animate-pulse w-full\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n </div>\n }\n @if (loading) {\n @for (number of [0, 1, 2, 3, 4, 5]; track number) {\n <div class=\"flex flex-row animate-pulse mt-3 mr-4 cursor-pointer w-full\">\n <div class=\"h-fit w-2/5 sm:w-1/4 aspect-video bg-gray-200 rounded-lg\"></div>\n <div class=\"w-3/5 sm:w-3/4 ml-3 py-1 flex flex-col justify-between\">\n <div class=\"space-y-3\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1 py-1\"></div>\n </div>\n <div>\n <div class=\"h-2 bg-slate-200 rounded col-span-2 py-1\"></div>\n </div>\n </div>\n </div>\n }\n } @else {\n @for (item of courses; track item) {\n <div\n class=\"py-2 cursor-pointer min-w-[80%] md:min-w-[25%] sm:min-w-[33%] hover:bg-gray-100\"\n [routerLink]=\"['../../', item.id]\"\n >\n <rolatech-course-item [course]=\"item\"></rolatech-course-item>\n </div>\n }\n }\n</div>\n" }]
|
|
73
|
+
}] });
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLWNhdGVnb3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UvY291cnNlLWNhdGVnb3J5L2NvdXJzZS1jYXRlZ29yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1jYXRlZ29yeS9jb3Vyc2UtY2F0ZWdvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdURBQXVELENBQUM7OztBQVM1RixNQUFNLE9BQU8sdUJBQXdCLFNBQVEsYUFBYTtJQVAxRDs7UUFRRSxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0QyxZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBQ2xDLFlBQU8sR0FBRyxLQUFLLENBQUM7S0FxRGpCO0lBbkRDLFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFnQixFQUFFLEVBQUU7WUFDakQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQVcsQ0FBQztZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0QyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBVTtRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDckMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELHVCQUF1QixDQUFDLEVBQVU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxPQUFPLEdBQUc7WUFDZCxNQUFNLEVBQUUsY0FBYyxFQUFFLGlCQUFpQjtTQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQVM7UUFDN0IseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0ExRFUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsMkdDZnBDLCt6Q0FtQ0EseUREekJZLG1CQUFtQiwrUUFBRSx1QkFBdUIsK0JBQUUsbUJBQW1COzsyRkFLaEUsdUJBQXVCO2tCQVBuQyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixDQUFDLFlBQ2xFLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhcmFtTWFwIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvdXJzZUNhdGVnb3J5LCBDb3Vyc2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENhdGVnb3J5U2VydmljZSwgQ291cnNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEFuZ3VsYXJDb21tb25Nb2R1bGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIEJhc2VDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IENvdXJzZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvdXJzZS1pdGVtL2NvdXJzZS1pdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQW5ndWxhckNvbW1vbk1vZHVsZSwgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIENvdXJzZUl0ZW1Db21wb25lbnRdLFxuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1jYXRlZ29yeScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtY2F0ZWdvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtY2F0ZWdvcnkuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ291cnNlQ2F0ZWdvcnlDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2F0ZWdvcnlTZXJ2aWNlID0gaW5qZWN0KENhdGVnb3J5U2VydmljZSk7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIGNhdGVnb3J5ITogQ291cnNlQ2F0ZWdvcnk7XG4gIGNvdXJzZXM6IENvdXJzZVtdID0gW107XG4gIGNhdGVnb3JpZXM6IENvdXJzZUNhdGVnb3J5W10gPSBbXTtcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmluZEFsbENhdGVnb3JpZXMoKTtcbiAgICB0aGlzLnJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbU1hcCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBwYXJhbXMuZ2V0KCdpZCcpIGFzIHN0cmluZztcbiAgICAgIHRoaXMuZmluZENhdGVnb3J5QnlJZChpZCk7XG4gICAgICB0aGlzLmZpbmRDb3Vyc2VzQnlDYXRlZ29yeUlkKGlkKTtcbiAgICB9KTtcbiAgfVxuICBmaW5kQWxsQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZS5maW5kKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kQ2F0ZWdvcnlCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZS5nZXQoaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jYXRlZ29yeSA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kQWxsQ291cnNlcygpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZmluZCh7fSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvdXJzZXMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZENvdXJzZXNCeUNhdGVnb3J5SWQoaWQ6IHN0cmluZykge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGZpbHRlcjogYGNhdGVnb3JpZXM6JHtpZH0scHVibGlzaGVkOnRydWVgLFxuICAgIH07XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmZpbmQob3B0aW9ucykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvdXJzZXMgPSByZXMuZGF0YTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBsb2FkQ291cnNlc0J5Q2F0ZWdvcnkoaXRlbTogYW55KSB7XG4gICAgLy8gIFtyb3V0ZXJMaW5rXSA9IFwiWycuLi8uLi8nLCBpdGVtLmlkXVwiO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgLi4vLi4vJHtpdGVtLmlkfWBdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2PlxuICBAaWYgKGNhdGVnb3J5KSB7XG4gICAgPGRpdiBjbGFzcz1cInAtMyBoaWRkZW4gc206YmxvY2sgdGV4dC0yeGwgZm9udC1tZWRpdW1cIj57eyBjYXRlZ29yeS5uYW1lIH19PC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFuaW1hdGUtcHVsc2Ugdy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaC00IGJnLXNsYXRlLTIwMCByb3VuZGVkIGNvbC1zcGFuLTJcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGxvYWRpbmcpIHtcbiAgICBAZm9yIChudW1iZXIgb2YgWzAsIDEsIDIsIDMsIDQsIDVdOyB0cmFjayBudW1iZXIpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGFuaW1hdGUtcHVsc2UgbXQtMyBtci00IGN1cnNvci1wb2ludGVyIHctZnVsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaC1maXQgdy0yLzUgc206dy0xLzQgYXNwZWN0LXZpZGVvIGJnLWdyYXktMjAwIHJvdW5kZWQtbGdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctMy81IHNtOnctMy80IG1sLTMgcHktMSBmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTQgYmctc2xhdGUtMjAwIHJvdW5kZWQgY29sLXNwYW4tMlwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMiBiZy1zbGF0ZS0yMDAgcm91bmRlZCBjb2wtc3Bhbi0xXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0yIGJnLXNsYXRlLTIwMCByb3VuZGVkIGNvbC1zcGFuLTEgcHktMVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0yIGJnLXNsYXRlLTIwMCByb3VuZGVkIGNvbC1zcGFuLTIgcHktMVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGZvciAoaXRlbSBvZiBjb3Vyc2VzOyB0cmFjayBpdGVtKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicHktMiBjdXJzb3ItcG9pbnRlciBtaW4tdy1bODAlXSBtZDptaW4tdy1bMjUlXSBzbTptaW4tdy1bMzMlXSBob3ZlcjpiZy1ncmF5LTEwMFwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnLi4vLi4vJywgaXRlbS5pZF1cIlxuICAgICAgPlxuICAgICAgICA8cm9sYXRlY2gtY291cnNlLWl0ZW0gW2NvdXJzZV09XCJpdGVtXCI+PC9yb2xhdGVjaC1jb3Vyc2UtaXRlbT5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { CourseSectionLectureContentType, CourseStatus } from '../../../interfaces';
|
|
3
|
+
import { CourseSectionService, CourseService } from '../../../services';
|
|
4
|
+
import { AuthService, AuthUserService } from '@rolatech/angular-auth';
|
|
5
|
+
import { AngularComponentsModule, AppContainerComponent, BaseComponent } from '@rolatech/angular-components';
|
|
6
|
+
import { ViewportScroller } from '@angular/common';
|
|
7
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
8
|
+
import { CommentsComponent } from '@rolatech/angular-comment';
|
|
9
|
+
import { CourseActionComponent } from '../../../components/course-action/course-action.component';
|
|
10
|
+
import { CourseDetailsComponent } from '../../../components/course-details/course-details.component';
|
|
11
|
+
import { CourseInfoComponent } from '../../../components/course-info/course-info.component';
|
|
12
|
+
import { CourseMediaComponent } from '../../../components/course-media/course-media.component';
|
|
13
|
+
import { CoursePricingComponent } from '../../../components/course-pricing/course-pricing.component';
|
|
14
|
+
import { CourseScheduleComponent } from '../../../components/course-schedule/course-schedule.component';
|
|
15
|
+
import { CourseSectionsComponent } from '../../../components/course-sections/course-sections.component';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
export class CourseDetailComponent extends BaseComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this.status = CourseStatus;
|
|
21
|
+
this.authService = inject(AuthService);
|
|
22
|
+
this.authUserService = inject(AuthUserService);
|
|
23
|
+
this.courseService = inject(CourseService);
|
|
24
|
+
this.viewportScroller = inject(ViewportScroller);
|
|
25
|
+
this.courseSectionService = inject(CourseSectionService);
|
|
26
|
+
this.instructorName = '';
|
|
27
|
+
this.username = '';
|
|
28
|
+
this.inWishList = false;
|
|
29
|
+
this.purchased = false;
|
|
30
|
+
this.sections = [];
|
|
31
|
+
this.type = CourseSectionLectureContentType;
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
this.findOne();
|
|
35
|
+
this.findSections();
|
|
36
|
+
this.authService.introspect().subscribe({
|
|
37
|
+
next: (res) => {
|
|
38
|
+
if (res.authenticated) {
|
|
39
|
+
this.findPurchasedByCourseId();
|
|
40
|
+
this.findWishlistBy();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
scrollToAnchor(anchorId) {
|
|
46
|
+
// this.viewportScroller.setOffset([100, 100]);
|
|
47
|
+
document.getElementById(anchorId)?.scrollIntoView({
|
|
48
|
+
behavior: 'smooth',
|
|
49
|
+
block: 'start',
|
|
50
|
+
inline: 'nearest',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
findOne() {
|
|
54
|
+
this.courseService.get(this.id).subscribe({
|
|
55
|
+
next: (res) => {
|
|
56
|
+
this.course = res.data;
|
|
57
|
+
this.findUserBaseInfo(this.course.instructorId);
|
|
58
|
+
this.titleService.setTitle(`${this.course.name} - 拼小课`);
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
findSections() {
|
|
63
|
+
this.courseSectionService.findSections(this.id).subscribe({
|
|
64
|
+
next: (res) => {
|
|
65
|
+
this.sections = res.data;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
findUserBaseInfo(userId) {
|
|
70
|
+
this.authUserService.getPublicUserInfo(userId).subscribe({
|
|
71
|
+
next: (res) => {
|
|
72
|
+
this.instructorName = res.name;
|
|
73
|
+
this.username = res.username;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
onWish(e) {
|
|
78
|
+
this.authService.introspect().subscribe({
|
|
79
|
+
next: (res) => {
|
|
80
|
+
if (res.authenticated) {
|
|
81
|
+
if (this.inWishList) {
|
|
82
|
+
this.removeFromWishlist();
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.addToWishlist();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.snackBarService.open('请先登录');
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
error: (error) => {
|
|
93
|
+
this.snackBarService.open(error.message);
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
checkout(e) {
|
|
98
|
+
this.router.navigateByUrl(`/carts/checkout/express/courses/${this.id}`);
|
|
99
|
+
}
|
|
100
|
+
removeFromWishlist() {
|
|
101
|
+
this.courseService.removeFromWishlist(this.id).subscribe({
|
|
102
|
+
next: (res) => {
|
|
103
|
+
this.inWishList = false;
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
addToWishlist() {
|
|
108
|
+
this.courseService.addToWishlist(this.id).subscribe({
|
|
109
|
+
next: (res) => {
|
|
110
|
+
this.inWishList = true;
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
onSection(event) {
|
|
115
|
+
const { section, lecture } = event;
|
|
116
|
+
this.router.navigate(['/courses', this.course.id, 'sections', section.id, 'lectures', lecture.id]);
|
|
117
|
+
}
|
|
118
|
+
findWishlistBy() {
|
|
119
|
+
this.authService.introspect().subscribe({
|
|
120
|
+
next: (res) => {
|
|
121
|
+
if (res.authenticated) {
|
|
122
|
+
this.courseService.findWishlistBy(this.id).subscribe({
|
|
123
|
+
next: (res) => {
|
|
124
|
+
this.inWishList = res.data;
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
findPurchasedByCourseId() {
|
|
132
|
+
this.courseService.findPurchasedByCourseId(this.id).subscribe({
|
|
133
|
+
next: (res) => {
|
|
134
|
+
this.purchased = res.data ? true : false;
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseDetailComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
139
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: CourseDetailComponent, isStandalone: true, selector: "rolatech-course-detail", usesInheritance: true, ngImport: i0, template: "@if (course) {\n <rolatech-app-container>\n <div class=\"flex flex-col-reverse gap-2 sm:flex-row md:flex-row w-full justify-between\">\n <div class=\"sm:w-3/4\">\n <rolatech-course-info [course]=\"course\" [instructor]=\"instructorName\" [username]=\"username\"> </rolatech-course-info>\n <rolatech-course-sections\n [sections]=\"sections\"\n (section)=\"onSection($event)\"\n (checkout)=\"checkout($event)\"\n [purchased]=\"purchased\"\n ></rolatech-course-sections>\n <rolatech-course-schedule [schedule]=\"course.schedule\"></rolatech-course-schedule>\n <rolatech-course-details [details]=\"course.details\"></rolatech-course-details>\n <rolatech-comments [itemId]=\"course.id\"></rolatech-comments>\n </div>\n <div>\n <!-- <rolatech-course-media [min]=\"!purchased\" [media]=\"course.media\" [min]=\"true\"></rolatech-course-media> -->\n <rolatech-course-media [media]=\"course.media\" [min]=\"true\"></rolatech-course-media>\n @if (!purchased) {\n <rolatech-course-pricing [pricing]=\"course.pricing\"></rolatech-course-pricing>\n <rolatech-course-action\n [course]=\"course\"\n (checkout)=\"checkout($event)\"\n (wish)=\"onWish($event)\"\n [inWishList]=\"inWishList\"\n ></rolatech-course-action>\n }\n </div>\n </div>\n </rolatech-app-container>\n}\n", styles: ["mat-expansion-panel mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: CourseInfoComponent, selector: "rolatech-course-info", inputs: ["course", "instructor", "username"] }, { kind: "component", type: CourseSectionsComponent, selector: "rolatech-course-sections", inputs: ["purchased", "sections"], outputs: ["section", "checkout"] }, { kind: "component", type: CourseScheduleComponent, selector: "rolatech-course-schedule", inputs: ["schedule"] }, { kind: "component", type: CourseDetailsComponent, selector: "rolatech-course-details", inputs: ["details", "instructor", "username"] }, { kind: "component", type: CourseMediaComponent, selector: "rolatech-course-media", inputs: ["media", "min"] }, { kind: "component", type: CoursePricingComponent, selector: "rolatech-course-pricing", inputs: ["pricing"] }, { kind: "component", type: CourseActionComponent, selector: "rolatech-course-action", inputs: ["course", "inWishList"], outputs: ["cart", "wish", "checkout"] }, { kind: "component", type: CommentsComponent, selector: "rolatech-comments", inputs: ["itemId"] }, { kind: "component", type: AppContainerComponent, selector: "rolatech-app-container" }] }); }
|
|
140
|
+
}
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseDetailComponent, decorators: [{
|
|
142
|
+
type: Component,
|
|
143
|
+
args: [{ standalone: true, imports: [
|
|
144
|
+
AngularCommonModule,
|
|
145
|
+
AngularComponentsModule,
|
|
146
|
+
CourseInfoComponent,
|
|
147
|
+
CourseSectionsComponent,
|
|
148
|
+
CourseScheduleComponent,
|
|
149
|
+
CourseDetailsComponent,
|
|
150
|
+
CourseMediaComponent,
|
|
151
|
+
CoursePricingComponent,
|
|
152
|
+
CourseActionComponent,
|
|
153
|
+
CommentsComponent,
|
|
154
|
+
AppContainerComponent,
|
|
155
|
+
], selector: 'rolatech-course-detail', template: "@if (course) {\n <rolatech-app-container>\n <div class=\"flex flex-col-reverse gap-2 sm:flex-row md:flex-row w-full justify-between\">\n <div class=\"sm:w-3/4\">\n <rolatech-course-info [course]=\"course\" [instructor]=\"instructorName\" [username]=\"username\"> </rolatech-course-info>\n <rolatech-course-sections\n [sections]=\"sections\"\n (section)=\"onSection($event)\"\n (checkout)=\"checkout($event)\"\n [purchased]=\"purchased\"\n ></rolatech-course-sections>\n <rolatech-course-schedule [schedule]=\"course.schedule\"></rolatech-course-schedule>\n <rolatech-course-details [details]=\"course.details\"></rolatech-course-details>\n <rolatech-comments [itemId]=\"course.id\"></rolatech-comments>\n </div>\n <div>\n <!-- <rolatech-course-media [min]=\"!purchased\" [media]=\"course.media\" [min]=\"true\"></rolatech-course-media> -->\n <rolatech-course-media [media]=\"course.media\" [min]=\"true\"></rolatech-course-media>\n @if (!purchased) {\n <rolatech-course-pricing [pricing]=\"course.pricing\"></rolatech-course-pricing>\n <rolatech-course-action\n [course]=\"course\"\n (checkout)=\"checkout($event)\"\n (wish)=\"onWish($event)\"\n [inWishList]=\"inWishList\"\n ></rolatech-course-action>\n }\n </div>\n </div>\n </rolatech-app-container>\n}\n", styles: ["mat-expansion-panel mat-icon{transform:scale(.8)}\n"] }]
|
|
156
|
+
}] });
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1kZXRhaWwvY291cnNlLWRldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1kZXRhaWwvY291cnNlLWRldGFpbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQWlCLCtCQUErQixFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFB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U0FBUyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzNDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXJIVSxxQkFBcUI7a0dBQXJCLHFCQUFxQix5R0NsQ2xDLHc3Q0ErQkEsNEdEYkksbUJBQW1CLDhCQUNuQix1QkFBdUIsK0JBQ3ZCLG1CQUFtQiwrR0FDbkIsdUJBQXVCLDBJQUN2Qix1QkFBdUIsMkZBQ3ZCLHNCQUFzQixtSEFDdEIsb0JBQW9CLDRGQUNwQixzQkFBc0IseUZBQ3RCLHFCQUFxQiw0SUFDckIsaUJBQWlCLGtGQUNqQixxQkFBcUI7OzJGQU1aLHFCQUFxQjtrQkFuQmpDLFNBQVM7aUNBQ0ksSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLG9CQUFvQjt3QkFDcEIsc0JBQXNCO3dCQUN0QixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIscUJBQXFCO3FCQUN0QixZQUNTLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvdXJzZVNlY3Rpb24sIENvdXJzZVNlY3Rpb25MZWN0dXJlQ29udGVudFR5cGUsIENvdXJzZVN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ291cnNlU2VjdGlvblNlcnZpY2UsIENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQXV0aFVzZXJTZXJ2aWNlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItYXV0aCc7XG5pbXBvcnQgeyBBbmd1bGFyQ29tcG9uZW50c01vZHVsZSwgQXBwQ29udGFpbmVyQ29tcG9uZW50LCBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBWaWV3cG9ydFNjcm9sbGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFuZ3VsYXJDb21tb25Nb2R1bGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgQ29tbWVudHNDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tZW50JztcbmltcG9ydCB7IENvdXJzZUFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY291cnNlLWFjdGlvbi9jb3Vyc2UtYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VEZXRhaWxzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb3Vyc2UtZGV0YWlscy9jb3Vyc2UtZGV0YWlscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlSW5mb0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY291cnNlLWluZm8vY291cnNlLWluZm8uY29tcG9uZW50JztcbmltcG9ydCB7IENvdXJzZU1lZGlhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb3Vyc2UtbWVkaWEvY291cnNlLW1lZGlhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VQcmljaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb3Vyc2UtcHJpY2luZy9jb3Vyc2UtcHJpY2luZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291cnNlU2NoZWR1bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvdXJzZS1zY2hlZHVsZS9jb3Vyc2Utc2NoZWR1bGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvdXJzZVNlY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb3Vyc2Utc2VjdGlvbnMvY291cnNlLXNlY3Rpb25zLmNvbXBvbmVudCc7XG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEFuZ3VsYXJDb21tb25Nb2R1bGUsXG4gICAgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsXG4gICAgQ291cnNlSW5mb0NvbXBvbmVudCxcbiAgICBDb3Vyc2VTZWN0aW9uc0NvbXBvbmVudCxcbiAgICBDb3Vyc2VTY2hlZHVsZUNvbXBvbmVudCxcbiAgICBDb3Vyc2VEZXRhaWxzQ29tcG9uZW50LFxuICAgIENvdXJzZU1lZGlhQ29tcG9uZW50LFxuICAgIENvdXJzZVByaWNpbmdDb21wb25lbnQsXG4gICAgQ291cnNlQWN0aW9uQ29tcG9uZW50LFxuICAgIENvbW1lbnRzQ29tcG9uZW50LFxuICAgIEFwcENvbnRhaW5lckNvbXBvbmVudCxcbiAgXSxcbiAgc2VsZWN0b3I6ICdyb2xhdGVjaC1jb3Vyc2UtZGV0YWlsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvdXJzZS1kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtZGV0YWlsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvdXJzZURldGFpbENvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb3Vyc2U6IGFueTtcbiAgc3RhdHVzOiBhbnkgPSBDb3Vyc2VTdGF0dXM7XG4gIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgYXV0aFVzZXJTZXJ2aWNlID0gaW5qZWN0KEF1dGhVc2VyU2VydmljZSk7XG4gIGNvdXJzZVNlcnZpY2UgPSBpbmplY3QoQ291cnNlU2VydmljZSk7XG4gIHZpZXdwb3J0U2Nyb2xsZXIgPSBpbmplY3QoVmlld3BvcnRTY3JvbGxlcik7XG4gIGNvdXJzZVNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KENvdXJzZVNlY3Rpb25TZXJ2aWNlKTtcbiAgaW5zdHJ1Y3Rvck5hbWUgPSAnJztcbiAgdXNlcm5hbWUgPSAnJztcbiAgaW5XaXNoTGlzdCA9IGZhbHNlO1xuICBwdXJjaGFzZWQgPSBmYWxzZTtcbiAgc2VjdGlvbnM6IENvdXJzZVNlY3Rpb25bXSA9IFtdO1xuICB0eXBlID0gQ291cnNlU2VjdGlvbkxlY3R1cmVDb250ZW50VHlwZTtcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maW5kT25lKCk7XG4gICAgdGhpcy5maW5kU2VjdGlvbnMoKTtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmludHJvc3BlY3QoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICB0aGlzLmZpbmRQdXJjaGFzZWRCeUNvdXJzZUlkKCk7XG4gICAgICAgICAgdGhpcy5maW5kV2lzaGxpc3RCeSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIHNjcm9sbFRvQW5jaG9yKGFuY2hvcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyB0aGlzLnZpZXdwb3J0U2Nyb2xsZXIuc2V0T2Zmc2V0KFsxMDAsIDEwMF0pO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcklkKT8uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgYmxvY2s6ICdzdGFydCcsXG4gICAgICBpbmxpbmU6ICduZWFyZXN0JyxcbiAgICB9KTtcbiAgfVxuICBmaW5kT25lKCkge1xuICAgIHRoaXMuY291cnNlU2VydmljZS5nZXQodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvdXJzZSA9IHJlcy5kYXRhO1xuICAgICAgICB0aGlzLmZpbmRVc2VyQmFzZUluZm8odGhpcy5jb3Vyc2UuaW5zdHJ1Y3RvcklkKTtcbiAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUoYCR7dGhpcy5jb3Vyc2UubmFtZX0gLSDmi7zlsI/or75gKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZFNlY3Rpb25zKCkge1xuICAgIHRoaXMuY291cnNlU2VjdGlvblNlcnZpY2UuZmluZFNlY3Rpb25zKHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZFVzZXJCYXNlSW5mbyh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuYXV0aFVzZXJTZXJ2aWNlLmdldFB1YmxpY1VzZXJJbmZvKHVzZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdG9yTmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gcmVzLnVzZXJuYW1lO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvbldpc2goZTogYW55KSB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5pbnRyb3NwZWN0KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5XaXNoTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tV2lzaGxpc3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRUb1dpc2hsaXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ+ivt+WFiOeZu+W9lScpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBjaGVja291dChlOiBhbnkpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGAvY2FydHMvY2hlY2tvdXQvZXhwcmVzcy9jb3Vyc2VzLyR7dGhpcy5pZH1gKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZUZyb21XaXNobGlzdCgpIHtcbiAgICB0aGlzLmNvdXJzZVNlcnZpY2UucmVtb3ZlRnJvbVdpc2hsaXN0KHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuaW5XaXNoTGlzdCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGFkZFRvV2lzaGxpc3QoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmFkZFRvV2lzaGxpc3QodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5pbldpc2hMaXN0ID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25TZWN0aW9uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHNlY3Rpb24sIGxlY3R1cmUgfSA9IGV2ZW50O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvdXJzZXMnLCB0aGlzLmNvdXJzZS5pZCwgJ3NlY3Rpb25zJywgc2VjdGlvbi5pZCwgJ2xlY3R1cmVzJywgbGVjdHVyZS5pZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kV2lzaGxpc3RCeSgpIHtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmludHJvc3BlY3QoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNvdXJzZVNlcnZpY2UuZmluZFdpc2hsaXN0QnkodGhpcy5pZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmluV2lzaExpc3QgPSByZXMuZGF0YTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmluZFB1cmNoYXNlZEJ5Q291cnNlSWQoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmZpbmRQdXJjaGFzZWRCeUNvdXJzZUlkKHRoaXMuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wdXJjaGFzZWQgPSByZXMuZGF0YSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIkBpZiAoY291cnNlKSB7XG4gIDxyb2xhdGVjaC1hcHAtY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sLXJldmVyc2UgZ2FwLTIgc206ZmxleC1yb3cgbWQ6ZmxleC1yb3cgdy1mdWxsIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNtOnctMy80XCI+XG4gICAgICAgIDxyb2xhdGVjaC1jb3Vyc2UtaW5mbyBbY291cnNlXT1cImNvdXJzZVwiIFtpbnN0cnVjdG9yXT1cImluc3RydWN0b3JOYW1lXCIgW3VzZXJuYW1lXT1cInVzZXJuYW1lXCI+IDwvcm9sYXRlY2gtY291cnNlLWluZm8+XG4gICAgICAgIDxyb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbnNcbiAgICAgICAgICBbc2VjdGlvbnNdPVwic2VjdGlvbnNcIlxuICAgICAgICAgIChzZWN0aW9uKT1cIm9uU2VjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAoY2hlY2tvdXQpPVwiY2hlY2tvdXQoJGV2ZW50KVwiXG4gICAgICAgICAgW3B1cmNoYXNlZF09XCJwdXJjaGFzZWRcIlxuICAgICAgICA+PC9yb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbnM+XG4gICAgICAgIDxyb2xhdGVjaC1jb3Vyc2Utc2NoZWR1bGUgW3NjaGVkdWxlXT1cImNvdXJzZS5zY2hlZHVsZVwiPjwvcm9sYXRlY2gtY291cnNlLXNjaGVkdWxlPlxuICAgICAgICA8cm9sYXRlY2gtY291cnNlLWRldGFpbHMgW2RldGFpbHNdPVwiY291cnNlLmRldGFpbHNcIj48L3JvbGF0ZWNoLWNvdXJzZS1kZXRhaWxzPlxuICAgICAgICA8cm9sYXRlY2gtY29tbWVudHMgW2l0ZW1JZF09XCJjb3Vyc2UuaWRcIj48L3JvbGF0ZWNoLWNvbW1lbnRzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8IS0tIDxyb2xhdGVjaC1jb3Vyc2UtbWVkaWEgW21pbl09XCIhcHVyY2hhc2VkXCIgW21lZGlhXT1cImNvdXJzZS5tZWRpYVwiIFttaW5dPVwidHJ1ZVwiPjwvcm9sYXRlY2gtY291cnNlLW1lZGlhPiAtLT5cbiAgICAgICAgPHJvbGF0ZWNoLWNvdXJzZS1tZWRpYSBbbWVkaWFdPVwiY291cnNlLm1lZGlhXCIgW21pbl09XCJ0cnVlXCI+PC9yb2xhdGVjaC1jb3Vyc2UtbWVkaWE+XG4gICAgICAgIEBpZiAoIXB1cmNoYXNlZCkge1xuICAgICAgICAgIDxyb2xhdGVjaC1jb3Vyc2UtcHJpY2luZyBbcHJpY2luZ109XCJjb3Vyc2UucHJpY2luZ1wiPjwvcm9sYXRlY2gtY291cnNlLXByaWNpbmc+XG4gICAgICAgICAgPHJvbGF0ZWNoLWNvdXJzZS1hY3Rpb25cbiAgICAgICAgICAgIFtjb3Vyc2VdPVwiY291cnNlXCJcbiAgICAgICAgICAgIChjaGVja291dCk9XCJjaGVja291dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICh3aXNoKT1cIm9uV2lzaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtpbldpc2hMaXN0XT1cImluV2lzaExpc3RcIlxuICAgICAgICAgID48L3JvbGF0ZWNoLWNvdXJzZS1hY3Rpb24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3JvbGF0ZWNoLWFwcC1jb250YWluZXI+XG59XG4iXX0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { CategoryService, CourseService } from '../../../services';
|
|
3
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
4
|
+
import { AngularComponentsModule, BaseComponent } from '@rolatech/angular-components';
|
|
5
|
+
import { CourseItemComponent } from '../../../components/course-item/course-item.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/router";
|
|
8
|
+
export class CourseIndexComponent extends BaseComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.courses = [];
|
|
12
|
+
this.categories = [];
|
|
13
|
+
this.courseService = inject(CourseService);
|
|
14
|
+
this.categoryService = inject(CategoryService);
|
|
15
|
+
this.loading = false;
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
this.findCategories();
|
|
19
|
+
this.findCourses();
|
|
20
|
+
this.titleService.setTitle('课程 - 拼小课');
|
|
21
|
+
}
|
|
22
|
+
findCourses() {
|
|
23
|
+
this.loading = true;
|
|
24
|
+
const options = {
|
|
25
|
+
sort: 'updatedAt desc',
|
|
26
|
+
filter: 'published:true',
|
|
27
|
+
};
|
|
28
|
+
this.courseService.find(options).subscribe({
|
|
29
|
+
next: (res) => {
|
|
30
|
+
this.courses = res.data;
|
|
31
|
+
this.meta = res.meta;
|
|
32
|
+
this.loading = false;
|
|
33
|
+
},
|
|
34
|
+
error: (error) => {
|
|
35
|
+
this.loading = false;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
findCategories() {
|
|
40
|
+
this.categoryService.find({}).subscribe({
|
|
41
|
+
next: (res) => {
|
|
42
|
+
this.categories = res.data;
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseIndexComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
47
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: CourseIndexComponent, isStandalone: true, selector: "rolatech-course-index", usesInheritance: true, ngImport: i0, template: "<div class=\"min-w-[320px] max-w-[1120px] m-auto\">\n <div class=\"p-3 hidden sm:block text-2xl font-medium\">\u5168\u90E8\u8BFE\u7A0B</div>\n @if (loading) {\n @for (number of [0, 1, 2, 3, 4, 5]; track number) {\n <div class=\"flex flex-row animate-pulse mt-3 mr-4 cursor-pointer w-full\">\n <div class=\"h-fit w-2/5 sm:w-1/4 aspect-video bg-gray-200 rounded-lg\"></div>\n <div class=\"w-3/5 sm:w-3/4 ml-3 py-1 flex flex-col justify-between\">\n <div class=\"space-y-3\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1 py-1\"></div>\n </div>\n <div>\n <div class=\"h-2 bg-slate-200 rounded col-span-2 py-1\"></div>\n </div>\n </div>\n </div>\n }\n } @else {\n @for (item of courses; track $index) {\n <div\n class=\"py-2 cursor-pointer min-w-[80%] md:min-w-[25%] sm:min-w-[33%] hover:bg-gray-100\"\n [routerLink]=\"['./', item.id]\"\n >\n <rolatech-course-item [course]=\"item\"></rolatech-course-item>\n </div>\n }\n }\n</div>\n", styles: ["img:before{border-radius:12px}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: CourseItemComponent, selector: "rolatech-course-item", inputs: ["course", "row"] }] }); }
|
|
48
|
+
}
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseIndexComponent, decorators: [{
|
|
50
|
+
type: Component,
|
|
51
|
+
args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule, CourseItemComponent], selector: 'rolatech-course-index', template: "<div class=\"min-w-[320px] max-w-[1120px] m-auto\">\n <div class=\"p-3 hidden sm:block text-2xl font-medium\">\u5168\u90E8\u8BFE\u7A0B</div>\n @if (loading) {\n @for (number of [0, 1, 2, 3, 4, 5]; track number) {\n <div class=\"flex flex-row animate-pulse mt-3 mr-4 cursor-pointer w-full\">\n <div class=\"h-fit w-2/5 sm:w-1/4 aspect-video bg-gray-200 rounded-lg\"></div>\n <div class=\"w-3/5 sm:w-3/4 ml-3 py-1 flex flex-col justify-between\">\n <div class=\"space-y-3\">\n <div class=\"h-4 bg-slate-200 rounded col-span-2\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1\"></div>\n <div class=\"h-2 bg-slate-200 rounded col-span-1 py-1\"></div>\n </div>\n <div>\n <div class=\"h-2 bg-slate-200 rounded col-span-2 py-1\"></div>\n </div>\n </div>\n </div>\n }\n } @else {\n @for (item of courses; track $index) {\n <div\n class=\"py-2 cursor-pointer min-w-[80%] md:min-w-[25%] sm:min-w-[33%] hover:bg-gray-100\"\n [routerLink]=\"['./', item.id]\"\n >\n <rolatech-course-item [course]=\"item\"></rolatech-course-item>\n </div>\n }\n }\n</div>\n", styles: ["img:before{border-radius:12px}\n"] }]
|
|
52
|
+
}] });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLWluZGV4LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb3Vyc2Uvc3JjL2xpYi9wYWdlcy9jb3Vyc2UvY291cnNlLWluZGV4L2NvdXJzZS1pbmRleC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1pbmRleC9jb3Vyc2UtaW5kZXguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdURBQXVELENBQUM7OztBQVM1RixNQUFNLE9BQU8sb0JBQXFCLFNBQVEsYUFBYTtJQVB2RDs7UUFRRSxZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBQ2xDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTFDLFlBQU8sR0FBRyxLQUFLLENBQUM7S0ErQmpCO0lBN0JDLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxPQUFPLEdBQUc7WUFDZCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLE1BQU0sRUFBRSxnQkFBZ0I7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FwQ1Usb0JBQW9CO2tHQUFwQixvQkFBb0Isd0dDZGpDLG1zQ0E2QkEseUZEcEJZLG1CQUFtQiwrUUFBRSx1QkFBdUIsK0JBQUUsbUJBQW1COzsyRkFLaEUsb0JBQW9CO2tCQVBoQyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixDQUFDLFlBQ2xFLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvdXJzZUNhdGVnb3J5LCBDb3Vyc2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENhdGVnb3J5U2VydmljZSwgQ291cnNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IEFuZ3VsYXJDb21tb25Nb2R1bGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIEJhc2VDb21wb25lbnQgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7IENvdXJzZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvdXJzZS1pdGVtL2NvdXJzZS1pdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQW5ndWxhckNvbW1vbk1vZHVsZSwgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIENvdXJzZUl0ZW1Db21wb25lbnRdLFxuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1pbmRleCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtaW5kZXguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb3Vyc2UtaW5kZXguY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ291cnNlSW5kZXhDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY291cnNlczogQ291cnNlW10gPSBbXTtcbiAgY2F0ZWdvcmllczogQ291cnNlQ2F0ZWdvcnlbXSA9IFtdO1xuICBjb3Vyc2VTZXJ2aWNlID0gaW5qZWN0KENvdXJzZVNlcnZpY2UpO1xuICBjYXRlZ29yeVNlcnZpY2UgPSBpbmplY3QoQ2F0ZWdvcnlTZXJ2aWNlKTtcbiAgbWV0YTogYW55O1xuICBsb2FkaW5nID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maW5kQ2F0ZWdvcmllcygpO1xuICAgIHRoaXMuZmluZENvdXJzZXMoKTtcbiAgICB0aGlzLnRpdGxlU2VydmljZS5zZXRUaXRsZSgn6K++56iLIC0g5ou85bCP6K++Jyk7XG4gIH1cbiAgZmluZENvdXJzZXMoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgc29ydDogJ3VwZGF0ZWRBdCBkZXNjJyxcbiAgICAgIGZpbHRlcjogJ3B1Ymxpc2hlZDp0cnVlJyxcbiAgICB9O1xuICAgIHRoaXMuY291cnNlU2VydmljZS5maW5kKG9wdGlvbnMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb3Vyc2VzID0gcmVzLmRhdGE7XG4gICAgICAgIHRoaXMubWV0YSA9IHJlcy5tZXRhO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBmaW5kQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZS5maW5kKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1pbi13LVszMjBweF0gbWF4LXctWzExMjBweF0gbS1hdXRvXCI+XG4gIDxkaXYgY2xhc3M9XCJwLTMgaGlkZGVuIHNtOmJsb2NrIHRleHQtMnhsIGZvbnQtbWVkaXVtXCI+5YWo6YOo6K++56iLPC9kaXY+XG4gIEBpZiAobG9hZGluZykge1xuICAgIEBmb3IgKG51bWJlciBvZiBbMCwgMSwgMiwgMywgNCwgNV07IHRyYWNrIG51bWJlcikge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYW5pbWF0ZS1wdWxzZSBtdC0zIG1yLTQgY3Vyc29yLXBvaW50ZXIgdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLWZpdCB3LTIvNSBzbTp3LTEvNCBhc3BlY3QtdmlkZW8gYmctZ3JheS0yMDAgcm91bmRlZC1sZ1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzUgc206dy0zLzQgbWwtMyBweS0xIGZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCBiZy1zbGF0ZS0yMDAgcm91bmRlZCBjb2wtc3Bhbi0yXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0yIGJnLXNsYXRlLTIwMCByb3VuZGVkIGNvbC1zcGFuLTFcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTIgYmctc2xhdGUtMjAwIHJvdW5kZWQgY29sLXNwYW4tMSBweS0xXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTIgYmctc2xhdGUtMjAwIHJvdW5kZWQgY29sLXNwYW4tMiBweS0xXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAZm9yIChpdGVtIG9mIGNvdXJzZXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInB5LTIgY3Vyc29yLXBvaW50ZXIgbWluLXctWzgwJV0gbWQ6bWluLXctWzI1JV0gc206bWluLXctWzMzJV0gaG92ZXI6YmctZ3JheS0xMDBcIlxuICAgICAgICBbcm91dGVyTGlua109XCJbJy4vJywgaXRlbS5pZF1cIlxuICAgICAgPlxuICAgICAgICA8cm9sYXRlY2gtY291cnNlLWl0ZW0gW2NvdXJzZV09XCJpdGVtXCI+PC9yb2xhdGVjaC1jb3Vyc2UtaXRlbT5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { CategoryService, CourseService } from '../../../services';
|
|
3
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
4
|
+
import { AngularComponentsModule, AppContainerComponent, BaseComponent } from '@rolatech/angular-components';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/router";
|
|
7
|
+
export class CourseLayoutComponent extends BaseComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.categories = [];
|
|
11
|
+
this.categoryService = inject(CategoryService);
|
|
12
|
+
this.courseService = inject(CourseService);
|
|
13
|
+
this.selectIndex = 0;
|
|
14
|
+
}
|
|
15
|
+
ngOnInit() {
|
|
16
|
+
this.findCategories();
|
|
17
|
+
}
|
|
18
|
+
findCategories() {
|
|
19
|
+
this.categoryService.find({}).subscribe({
|
|
20
|
+
next: (res) => {
|
|
21
|
+
this.categories = res.data;
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
loadCourseByCategoryIndex(index) {
|
|
26
|
+
this.selectIndex = index;
|
|
27
|
+
const id = this.categories[index].id;
|
|
28
|
+
if (index === 0) {
|
|
29
|
+
this.router.navigate([`/courses`]);
|
|
30
|
+
// this.courseService.find({}).subscribe({
|
|
31
|
+
// next: res => {
|
|
32
|
+
// }
|
|
33
|
+
// })
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.router.navigate([`../courses/categories/${id}`], {
|
|
37
|
+
relativeTo: this.route,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
nextCategory() { }
|
|
42
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseLayoutComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
43
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: CourseLayoutComponent, isStandalone: true, selector: "rolatech-course-layout", usesInheritance: true, ngImport: i0, template: "@if (categories) {\n <rolatech-app-container>\n <div class=\"flex flex-col sm:flex-row min-w-[320px] max-w-[1280px] m-auto\">\n <div class=\"h-14 sm:h-auto min-w-[256px] sm:py-3\">\n <div class=\"hidden sm:block text-2xl font-medium p-3\">\u5206\u7C7B</div>\n <div\n class=\"flex flex-row sm:flex-col sm:h-full items-center sm:items-start h-14 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <a\n class=\"cursor-pointer h-8 sm:hover:bg-gray-200 hover:rounded flex items-center sm:mb-1\"\n routerLinkActive=\"active\"\n routerLink=\"/courses\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <span class=\"px-3 text-md sm:text-lg\">\u5168\u90E8</span>\n </a>\n @for (category of categories; track category; let index = $index) {\n <a\n class=\"cursor-pointer h-8 sm:hover:bg-gray-200 hover:rounded flex items-center sm:mb-1\"\n routerLinkActive=\"active\"\n [routerLink]=\"['../courses/categories/', category.id]\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <span class=\"px-3 text-md sm:text-lg\">{{ category.name }}</span>\n </a>\n }\n </div>\n </div>\n <div class=\"w-full sm:py-3\">\n <router-outlet></router-outlet>\n </div>\n </div>\n </rolatech-app-container>\n}\n", styles: [".active{border-radius:8px;color:#ff4500}@media (max-width: 600px){.active{border-radius:8px;background-color:#303030;color:#fff}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: AppContainerComponent, selector: "rolatech-app-container" }] }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseLayoutComponent, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ standalone: true, imports: [AngularCommonModule, AngularComponentsModule, AppContainerComponent], selector: 'rolatech-course-layout', template: "@if (categories) {\n <rolatech-app-container>\n <div class=\"flex flex-col sm:flex-row min-w-[320px] max-w-[1280px] m-auto\">\n <div class=\"h-14 sm:h-auto min-w-[256px] sm:py-3\">\n <div class=\"hidden sm:block text-2xl font-medium p-3\">\u5206\u7C7B</div>\n <div\n class=\"flex flex-row sm:flex-col sm:h-full items-center sm:items-start h-14 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <a\n class=\"cursor-pointer h-8 sm:hover:bg-gray-200 hover:rounded flex items-center sm:mb-1\"\n routerLinkActive=\"active\"\n routerLink=\"/courses\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <span class=\"px-3 text-md sm:text-lg\">\u5168\u90E8</span>\n </a>\n @for (category of categories; track category; let index = $index) {\n <a\n class=\"cursor-pointer h-8 sm:hover:bg-gray-200 hover:rounded flex items-center sm:mb-1\"\n routerLinkActive=\"active\"\n [routerLink]=\"['../courses/categories/', category.id]\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n >\n <span class=\"px-3 text-md sm:text-lg\">{{ category.name }}</span>\n </a>\n }\n </div>\n </div>\n <div class=\"w-full sm:py-3\">\n <router-outlet></router-outlet>\n </div>\n </div>\n </rolatech-app-container>\n}\n", styles: [".active{border-radius:8px;color:#ff4500}@media (max-width: 600px){.active{border-radius:8px;background-color:#303030;color:#fff}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"] }]
|
|
48
|
+
}] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1sYXlvdXQvY291cnNlLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1sYXlvdXQvY291cnNlLWxheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBUzdHLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxhQUFhO0lBUHhEOztRQVFFLGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO0tBNEJqQjtJQTFCQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCx5QkFBeUIsQ0FBQyxLQUFhO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQywwQ0FBMEM7WUFDMUMsbUJBQW1CO1lBQ25CLE1BQU07WUFDTixLQUFLO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNwRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxZQUFZLEtBQUksQ0FBQzs4R0EvQk4scUJBQXFCO2tHQUFyQixxQkFBcUIseUdDYmxDLDY4Q0FrQ0EseVNEMUJZLG1CQUFtQiwwcEJBQUUsdUJBQXVCLCtCQUFFLHFCQUFxQjs7MkZBS2xFLHFCQUFxQjtrQkFQakMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsQ0FBQyxZQUNwRSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3Vyc2VDYXRlZ29yeSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ2F0ZWdvcnlTZXJ2aWNlLCBDb3Vyc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQW5ndWxhckNvbW1vbk1vZHVsZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbW1vbic7XG5pbXBvcnQgeyBBbmd1bGFyQ29tcG9uZW50c01vZHVsZSwgQXBwQ29udGFpbmVyQ29tcG9uZW50LCBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQW5ndWxhckNvbW1vbk1vZHVsZSwgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsIEFwcENvbnRhaW5lckNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY291cnNlLWxheW91dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3Vyc2UtbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY291cnNlLWxheW91dC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb3Vyc2VMYXlvdXRDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2F0ZWdvcmllczogQ291cnNlQ2F0ZWdvcnlbXSA9IFtdO1xuICBjYXRlZ29yeVNlcnZpY2UgPSBpbmplY3QoQ2F0ZWdvcnlTZXJ2aWNlKTtcbiAgY291cnNlU2VydmljZSA9IGluamVjdChDb3Vyc2VTZXJ2aWNlKTtcbiAgc2VsZWN0SW5kZXggPSAwO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmluZENhdGVnb3JpZXMoKTtcbiAgfVxuICBmaW5kQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZS5maW5kKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IHJlcy5kYXRhO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBsb2FkQ291cnNlQnlDYXRlZ29yeUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnNlbGVjdEluZGV4ID0gaW5kZXg7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNhdGVnb3JpZXNbaW5kZXhdLmlkO1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2AvY291cnNlc2BdKTtcbiAgICAgIC8vIHRoaXMuY291cnNlU2VydmljZS5maW5kKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgLy8gICBuZXh0OiByZXMgPT4ge1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYC4uL2NvdXJzZXMvY2F0ZWdvcmllcy8ke2lkfWBdLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgbmV4dENhdGVnb3J5KCkge31cbn1cbiIsIkBpZiAoY2F0ZWdvcmllcykge1xuICA8cm9sYXRlY2gtYXBwLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBtaW4tdy1bMzIwcHhdIG1heC13LVsxMjgwcHhdIG0tYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImgtMTQgc206aC1hdXRvIG1pbi13LVsyNTZweF0gc206cHktM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIHNtOmJsb2NrIHRleHQtMnhsIGZvbnQtbWVkaXVtIHAtM1wiPuWIhuexuzwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHNtOmZsZXgtY29sIHNtOmgtZnVsbCBpdGVtcy1jZW50ZXIgc206aXRlbXMtc3RhcnQgaC0xNCBvdmVyZmxvdy14LXNjcm9sbCBvdmVyZmxvdy15LWhpZGRlbiBzY3JvbGxiYXItaGlkZSB3aGl0ZXNwYWNlLXByZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBoLTggc206aG92ZXI6YmctZ3JheS0yMDAgaG92ZXI6cm91bmRlZCBmbGV4IGl0ZW1zLWNlbnRlciBzbTptYi0xXCJcbiAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIlxuICAgICAgICAgICAgcm91dGVyTGluaz1cIi9jb3Vyc2VzXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7IGV4YWN0OiB0cnVlIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHgtMyB0ZXh0LW1kIHNtOnRleHQtbGdcIj7lhajpg6g8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGNhdGVnb3JpZXM7IHRyYWNrIGNhdGVnb3J5OyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgaC04IHNtOmhvdmVyOmJnLWdyYXktMjAwIGhvdmVyOnJvdW5kZWQgZmxleCBpdGVtcy1jZW50ZXIgc206bWItMVwiXG4gICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy4uL2NvdXJzZXMvY2F0ZWdvcmllcy8nLCBjYXRlZ29yeS5pZF1cIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZU9wdGlvbnNdPVwieyBleGFjdDogdHJ1ZSB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJweC0zIHRleHQtbWQgc206dGV4dC1sZ1wiPnt7IGNhdGVnb3J5Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBzbTpweS0zXCI+XG4gICAgICAgIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3JvbGF0ZWNoLWFwcC1jb250YWluZXI+XG59XG4iXX0=
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
2
|
+
import { Component, ElementRef, PLATFORM_ID, 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.sections = [];
|
|
23
|
+
this.courseId = '';
|
|
24
|
+
this.sectionId = '';
|
|
25
|
+
this.lectureId = '';
|
|
26
|
+
this.videoUrl = '';
|
|
27
|
+
this.instructorName = '';
|
|
28
|
+
this.instructorAvatar = '';
|
|
29
|
+
this.instructorUsername = '';
|
|
30
|
+
this.purchased = false;
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
this.route.params.subscribe((params) => {
|
|
34
|
+
this.courseId = params['id'];
|
|
35
|
+
this.sectionId = params['sectionId'];
|
|
36
|
+
this.lectureId = params['lectureId'];
|
|
37
|
+
this.findCourse(this.courseId);
|
|
38
|
+
this.findSections(this.courseId);
|
|
39
|
+
this.introspect();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
ngOnDestroy() {
|
|
43
|
+
if (this.player) {
|
|
44
|
+
this.player.destroy();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
ngAfterViewInit() { }
|
|
48
|
+
initPlayer(url, thumbnail) {
|
|
49
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// 'https://cos-video-1258344699.cos.ap-guangzhou.tencentcos.cn/test.mp4',
|
|
53
|
+
if (!this.player) {
|
|
54
|
+
const playerContainer = this.el.nativeElement.querySelector('#dplayer');
|
|
55
|
+
this.player = new DPlayer({
|
|
56
|
+
container: playerContainer,
|
|
57
|
+
screenshot: true,
|
|
58
|
+
preload: 'metadata',
|
|
59
|
+
video: {
|
|
60
|
+
url: url,
|
|
61
|
+
pic: thumbnail,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
// this.player.on('loadedmetadata', () => {
|
|
65
|
+
// console.log('Video duration:', this.player.video.duration);
|
|
66
|
+
// });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.player.switchVideo({
|
|
70
|
+
url: url,
|
|
71
|
+
pic: thumbnail,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
findSections(courseId) {
|
|
76
|
+
this.courseSectionService.findSections(courseId).subscribe({
|
|
77
|
+
next: (res) => {
|
|
78
|
+
this.sections = res.data;
|
|
79
|
+
const section = this.sections.find((item) => item.id === this.sectionId);
|
|
80
|
+
const letcture = section?.lectures.find((item) => item.id === this.lectureId);
|
|
81
|
+
this.videoUrl = letcture?.item.url;
|
|
82
|
+
const thumbnail = letcture?.item.thumbnail;
|
|
83
|
+
this.initPlayer(this.videoUrl, thumbnail);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
findCourse(courseId) {
|
|
88
|
+
this.courseService.get(courseId).subscribe({
|
|
89
|
+
next: (res) => {
|
|
90
|
+
this.course = res.data;
|
|
91
|
+
this.findUserBaseInfo(this.course.instructorId);
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
findUserBaseInfo(userId) {
|
|
96
|
+
this.authUserService.getPublicUserInfo(userId).subscribe({
|
|
97
|
+
next: (res) => {
|
|
98
|
+
this.instructorName = res.name;
|
|
99
|
+
this.instructorAvatar = res.avatar;
|
|
100
|
+
this.instructorUsername = res.username;
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
introspect() {
|
|
105
|
+
this.authService.introspect().subscribe({
|
|
106
|
+
next: (res) => {
|
|
107
|
+
if (res.authenticated) {
|
|
108
|
+
this.findPurchasedByCourseId();
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
findPurchasedByCourseId() {
|
|
114
|
+
this.courseService.findPurchasedByCourseId(this.courseId).subscribe({
|
|
115
|
+
next: (res) => {
|
|
116
|
+
this.purchased = res.data ? true : false;
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
onSection(event) {
|
|
121
|
+
const { section, lecture } = event;
|
|
122
|
+
this.router.navigate(['/courses', this.courseId, 'sections', section.id, 'lectures', lecture.id]);
|
|
123
|
+
}
|
|
124
|
+
checkout(e) {
|
|
125
|
+
this.router.navigateByUrl(`/carts/checkout/express/courses/${this.courseId}`);
|
|
126
|
+
}
|
|
127
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseSectionContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
128
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: CourseSectionContentComponent, isStandalone: true, selector: "rolatech-course-section-content", ngImport: i0, template: "<div class=\"flex sm:flex-row flex-col justify-between w-full mt-2 sm:mt-4\">\n <div class=\"sm:w-[70%] flex flex-col items-start justify-center px-4 sm: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>\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n }\n </div>\n </div>\n <div class=\"sm:w-[30%] px-4 sm:px-0 sm: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>\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"] }] }); }
|
|
129
|
+
}
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: CourseSectionContentComponent, decorators: [{
|
|
131
|
+
type: Component,
|
|
132
|
+
args: [{ standalone: true, imports: [
|
|
133
|
+
AngularCommonModule,
|
|
134
|
+
AngularComponentsModule,
|
|
135
|
+
CourseSectionsComponent,
|
|
136
|
+
CourseMediaOwnerRendererComponent,
|
|
137
|
+
CommentsComponent,
|
|
138
|
+
], selector: 'rolatech-course-section-content', template: "<div class=\"flex sm:flex-row flex-col justify-between w-full mt-2 sm:mt-4\">\n <div class=\"sm:w-[70%] flex flex-col items-start justify-center px-4 sm: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>\n <rolatech-comments [itemId]=\"lectureId\"></rolatech-comments>\n </div>\n }\n </div>\n </div>\n <div class=\"sm:w-[30%] px-4 sm:px-0 sm: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>\n" }]
|
|
139
|
+
}] });
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQvY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY291cnNlL3NyYy9saWIvcGFnZXMvY291cnNlL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQvY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx1RkFBdUYsQ0FBQztBQUMxSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQzs7QUFrQnhHLE1BQU0sT0FBTyw2QkFBNkI7SUFiMUM7UUFj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QWEsQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEYsQ0FBQzs4R0FwSFUsNkJBQTZCO2tHQUE3Qiw2QkFBNkIsMkZDNUIxQyxrakNBOEJBLHlERFpJLG1CQUFtQiw4QkFDbkIsdUJBQXVCLCtCQUN2Qix1QkFBdUIsMElBQ3ZCLGlDQUFpQyx5SEFDakMsaUJBQWlCOzsyRkFNUiw2QkFBNkI7a0JBYnpDLFNBQVM7aUNBQ0ksSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2Qix1QkFBdUI7d0JBQ3ZCLGlDQUFpQzt3QkFDakMsaUJBQWlCO3FCQUNsQixZQUNTLGlDQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBPbkluaXQsIFBMQVRGT1JNX0lELCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ291cnNlU2VjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ291cnNlU2VjdGlvblNlcnZpY2UsIENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQXV0aFVzZXJTZXJ2aWNlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItYXV0aCc7XG5pbXBvcnQgeyBBbmd1bGFyQ29tbW9uTW9kdWxlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IEFuZ3VsYXJDb21wb25lbnRzTW9kdWxlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBDb21tZW50c0NvbXBvbmVudCB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbW1lbnQnO1xuaW1wb3J0IHsgQ291cnNlTWVkaWFPd25lclJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb3Vyc2UtbWVkaWEtb3duZXItcmVuZGVyZXIvY291cnNlLW1lZGlhLW93bmVyLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3Vyc2VTZWN0aW9uc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvY291cnNlLXNlY3Rpb25zL2NvdXJzZS1zZWN0aW9ucy5jb21wb25lbnQnO1xuXG4vLyBpbXBvcnQgRFBsYXllciBmcm9tICdEUGxheWVyJztcbmRlY2xhcmUgY29uc3QgRFBsYXllcjogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEFuZ3VsYXJDb21tb25Nb2R1bGUsXG4gICAgQW5ndWxhckNvbXBvbmVudHNNb2R1bGUsXG4gICAgQ291cnNlU2VjdGlvbnNDb21wb25lbnQsXG4gICAgQ291cnNlTWVkaWFPd25lclJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENvbW1lbnRzQ29tcG9uZW50LFxuICBdLFxuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvdXJzZS1zZWN0aW9uLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY291cnNlLXNlY3Rpb24tY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvdXJzZS1zZWN0aW9uLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ291cnNlU2VjdGlvbkNvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIGNvdXJzZVNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KENvdXJzZVNlY3Rpb25TZXJ2aWNlKTtcbiAgY291cnNlU2VydmljZSA9IGluamVjdChDb3Vyc2VTZXJ2aWNlKTtcbiAgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBhdXRoVXNlclNlcnZpY2UgPSBpbmplY3QoQXV0aFVzZXJTZXJ2aWNlKTtcbiAgZWwgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwbGF5ZXI6IGFueTtcbiAgc2VjdGlvbnM6IENvdXJzZVNlY3Rpb25bXSA9IFtdO1xuICBjb3Vyc2VJZCA9ICcnO1xuICBzZWN0aW9uSWQgPSAnJztcbiAgbGVjdHVyZUlkID0gJyc7XG4gIHZpZGVvVXJsOiBhbnkgPSAnJztcbiAgaW5zdHJ1Y3Rvck5hbWUgPSAnJztcbiAgaW5zdHJ1Y3RvckF2YXRhciA9ICcnO1xuICBpbnN0cnVjdG9yVXNlcm5hbWUgPSAnJztcbiAgY291cnNlOiBhbnk7XG4gIHB1cmNoYXNlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLmNvdXJzZUlkID0gcGFyYW1zWydpZCddO1xuICAgICAgdGhpcy5zZWN0aW9uSWQgPSBwYXJhbXNbJ3NlY3Rpb25JZCddO1xuICAgICAgdGhpcy5sZWN0dXJlSWQgPSBwYXJhbXNbJ2xlY3R1cmVJZCddO1xuICAgICAgdGhpcy5maW5kQ291cnNlKHRoaXMuY291cnNlSWQpO1xuICAgICAgdGhpcy5maW5kU2VjdGlvbnModGhpcy5jb3Vyc2VJZCk7XG4gICAgICB0aGlzLmludHJvc3BlY3QoKTtcbiAgICB9KTtcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgIHRoaXMucGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cbiAgaW5pdFBsYXllcih1cmw6IHN0cmluZywgdGh1bWJuYWlsPzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vICdodHRwczovL2Nvcy12aWRlby0xMjU4MzQ0Njk5LmNvcy5hcC1ndWFuZ3pob3UudGVuY2VudGNvcy5jbi90ZXN0Lm1wNCcsXG4gICAgaWYgKCF0aGlzLnBsYXllcikge1xuICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVyID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkcGxheWVyJyk7XG4gICAgICB0aGlzLnBsYXllciA9IG5ldyBEUGxheWVyKHtcbiAgICAgICAgY29udGFpbmVyOiBwbGF5ZXJDb250YWluZXIsXG4gICAgICAgIHNjcmVlbnNob3Q6IHRydWUsXG4gICAgICAgIHByZWxvYWQ6ICdtZXRhZGF0YScsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgcGljOiB0aHVtYm5haWwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMucGxheWVyLm9uKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coJ1ZpZGVvIGR1cmF0aW9uOicsIHRoaXMucGxheWVyLnZpZGVvLmR1cmF0aW9uKTtcbiAgICAgIC8vIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllci5zd2l0Y2hWaWRlbyh7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBwaWM6IHRodW1ibmFpbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmaW5kU2VjdGlvbnMoY291cnNlSWQ6IGFueSkge1xuICAgIHRoaXMuY291cnNlU2VjdGlvblNlcnZpY2UuZmluZFNlY3Rpb25zKGNvdXJzZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gcmVzLmRhdGE7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNlY3Rpb25zLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gdGhpcy5zZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBsZXRjdHVyZSA9IHNlY3Rpb24/LmxlY3R1cmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gdGhpcy5sZWN0dXJlSWQpO1xuICAgICAgICB0aGlzLnZpZGVvVXJsID0gbGV0Y3R1cmU/Lml0ZW0udXJsO1xuICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBsZXRjdHVyZT8uaXRlbS50aHVtYm5haWw7XG5cbiAgICAgICAgdGhpcy5pbml0UGxheWVyKHRoaXMudmlkZW9VcmwsIHRodW1ibmFpbCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGZpbmRDb3Vyc2UoY291cnNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuY291cnNlU2VydmljZS5nZXQoY291cnNlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb3Vyc2UgPSByZXMuZGF0YTtcbiAgICAgICAgdGhpcy5maW5kVXNlckJhc2VJbmZvKHRoaXMuY291cnNlLmluc3RydWN0b3JJZCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGZpbmRVc2VyQmFzZUluZm8odXNlcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmF1dGhVc2VyU2VydmljZS5nZXRQdWJsaWNVc2VySW5mbyh1c2VySWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3Rvck5hbWUgPSByZXMubmFtZTtcbiAgICAgICAgdGhpcy5pbnN0cnVjdG9yQXZhdGFyID0gcmVzLmF2YXRhcjtcbiAgICAgICAgdGhpcy5pbnN0cnVjdG9yVXNlcm5hbWUgPSByZXMudXNlcm5hbWU7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGludHJvc3BlY3QoKSB7XG4gICAgdGhpcy5hdXRoU2VydmljZS5pbnRyb3NwZWN0KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgdGhpcy5maW5kUHVyY2hhc2VkQnlDb3Vyc2VJZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZmluZFB1cmNoYXNlZEJ5Q291cnNlSWQoKSB7XG4gICAgdGhpcy5jb3Vyc2VTZXJ2aWNlLmZpbmRQdXJjaGFzZWRCeUNvdXJzZUlkKHRoaXMuY291cnNlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wdXJjaGFzZWQgPSByZXMuZGF0YSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25TZWN0aW9uKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IHNlY3Rpb24sIGxlY3R1cmUgfSA9IGV2ZW50O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvdXJzZXMnLCB0aGlzLmNvdXJzZUlkLCAnc2VjdGlvbnMnLCBzZWN0aW9uLmlkLCAnbGVjdHVyZXMnLCBsZWN0dXJlLmlkXSk7XG4gIH1cbiAgY2hlY2tvdXQoZTogYW55KSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChgL2NhcnRzL2NoZWNrb3V0L2V4cHJlc3MvY291cnNlcy8ke3RoaXMuY291cnNlSWR9YCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IHNtOmZsZXgtcm93IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB3LWZ1bGwgbXQtMiBzbTptdC00XCI+XG4gIDxkaXYgY2xhc3M9XCJzbTp3LVs3MCVdIGZsZXggZmxleC1jb2wgaXRlbXMtc3RhcnQganVzdGlmeS1jZW50ZXIgcHgtNCBzbTpweC02IGgtZml0XCI+XG4gICAgPGRpdiBpZD1cImRwbGF5ZXJcIiBjbGFzcz1cInctZnVsbCBoLWF1dG8gYXNwZWN0LXZpZGVvIHJvdW5kZWQteGxcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHktMyB3LWZ1bGxcIj5cbiAgICAgIEBpZiAoY291cnNlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtbWVkaXVtIHB5LTNcIj5cbiAgICAgICAgICB7eyBjb3Vyc2UubmFtZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cm9sYXRlY2gtY291cnNlLW1lZGlhLW93bmVyLXJlbmRlcmVyXG4gICAgICAgICAgICBbbmFtZV09XCJpbnN0cnVjdG9yTmFtZVwiXG4gICAgICAgICAgICBbYXZhdGFyXT1cImluc3RydWN0b3JBdmF0YXJcIlxuICAgICAgICAgICAgW3VzZXJuYW1lXT1cImluc3RydWN0b3JVc2VybmFtZVwiXG4gICAgICAgICAgPjwvcm9sYXRlY2gtY291cnNlLW1lZGlhLW93bmVyLXJlbmRlcmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cm9sYXRlY2gtY29tbWVudHMgW2l0ZW1JZF09XCJsZWN0dXJlSWRcIj48L3JvbGF0ZWNoLWNvbW1lbnRzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzbTp3LVszMCVdIHB4LTQgc206cHgtMCBzbTpwci02XCI+XG4gICAgPHJvbGF0ZWNoLWNvdXJzZS1zZWN0aW9uc1xuICAgICAgW3NlY3Rpb25zXT1cInNlY3Rpb25zXCJcbiAgICAgIFtwdXJjaGFzZWRdPVwicHVyY2hhc2VkXCJcbiAgICAgIChzZWN0aW9uKT1cIm9uU2VjdGlvbigkZXZlbnQpXCJcbiAgICAgIChjaGVja291dCk9XCJjaGVja291dCgkZXZlbnQpXCJcbiAgICA+PC9yb2xhdGVjaC1jb3Vyc2Utc2VjdGlvbnM+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|