import { DefaultValueAccessor, FormsModule, NgControlStatus, NgModel } from "./chunk-VD6QIYHN.js"; import { getErrorMessage } from "./chunk-QDZ3GX5R.js"; import { CourseService } from "./chunk-6K3TDILH.js"; import { NzMessageService } from "./chunk-GJYGTZ7J.js"; import { ActivatedRoute, ApiService, AuthService, NzIconDirective, NzIconModule, Router } from "./chunk-2TRRHRR7.js"; import "./chunk-EDRPZB37.js"; import { Component, Injectable, forkJoin, inject, map, setClassMetadata, signal, ɵsetClassDebugInfo, ɵɵProvidersFeature, ɵɵadvance, ɵɵclassProp, ɵɵconditional, ɵɵconditionalCreate, ɵɵdefineComponent, ɵɵdefineInjectable, ɵɵelement, ɵɵelementEnd, ɵɵelementStart, ɵɵgetCurrentView, ɵɵlistener, ɵɵnextContext, ɵɵproperty, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵresetView, ɵɵrestoreView, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1 } from "./chunk-WI7WFVZR.js"; import { __spreadProps, __spreadValues } from "./chunk-WDMUDEB6.js"; // src/app/services/topic.service.ts var TopicService = class _TopicService { api = inject(ApiService); createTopic(courseId, title, description, position) { return this.api.post("/api/topics", { courseId, title, description, position }); } updateTopic(id, title, description, position) { return this.api.put(`/api/topics/${id}`, { id, title, description, position }); } deleteTopic(id) { return this.api.delete(`/api/topics/${id}`); } linkResource(topicId, resourceId, position) { return this.api.post(`/api/topics/${topicId}/resources/${resourceId}`, { position }); } unlinkResource(topicId, resourceId) { return this.api.delete(`/api/topics/${topicId}/resources/${resourceId}`); } static \u0275fac = function TopicService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || _TopicService)(); }; static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ token: _TopicService, factory: _TopicService.\u0275fac, providedIn: "root" }); }; (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(TopicService, [{ type: Injectable, args: [{ providedIn: "root" }] }], null, null); })(); // src/app/services/resource.service.ts var TYPE_TO_INT = { "Url": 0, "Video": 1, "Text": 2, "File": 3 }; var INT_TO_TYPE = { 0: "Url", 1: "Video", 2: "Text", 3: "File" }; function normalizeResource(r) { return __spreadProps(__spreadValues({}, r), { type: typeof r.type === "number" ? INT_TO_TYPE[r.type] ?? "Url" : r.type }); } var ResourceService = class _ResourceService { api = inject(ApiService); getResources() { return this.api.get("/api/resources").pipe(map((list) => list.map(normalizeResource))); } createResource(type, title, content) { return this.api.post("/api/resources", { type: TYPE_TO_INT[type], title, content }).pipe(map(normalizeResource)); } updateResource(id, type, title, content) { return this.api.put(`/api/resources/${id}`, { id, type: TYPE_TO_INT[type], title, content }).pipe(map(normalizeResource)); } deleteResource(id) { return this.api.delete(`/api/resources/${id}`); } static \u0275fac = function ResourceService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || _ResourceService)(); }; static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ token: _ResourceService, factory: _ResourceService.\u0275fac, providedIn: "root" }); }; (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ResourceService, [{ type: Injectable, args: [{ providedIn: "root" }] }], null, null); })(); // src/app/pages/course-editor/course-editor.ts var _forTrack0 = ($index, $item) => $item.id; function CourseEditorPage_Conditional_1_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 1); \u0275\u0275element(1, "span", 2); \u0275\u0275elementEnd(); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_20_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Enregistrement... "); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_21_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275textInterpolate1(" ", ctx_r1.isEditMode() ? "Enregistrer les modifications" : "Cr\xE9er le cours", " "); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_7_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "p", 19); \u0275\u0275text(1, "Aucun sujet. Commencez par en ajouter un."); \u0275\u0275elementEnd(); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Conditional_16_For_2_Template(rf, ctx) { if (rf & 1) { const _r6 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 38); \u0275\u0275element(1, "span", 39); \u0275\u0275elementStart(2, "span", 40); \u0275\u0275text(3); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "button", 41); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Conditional_16_For_2_Template_button_click_4_listener($event) { const resource_r7 = \u0275\u0275restoreView(_r6).$implicit; const topic_r5 = \u0275\u0275nextContext(2).$implicit; const ctx_r1 = \u0275\u0275nextContext(5); return \u0275\u0275resetView(ctx_r1.unlinkResource(topic_r5, resource_r7, $event)); }); \u0275\u0275element(5, "span", 42); \u0275\u0275elementEnd()(); } if (rf & 2) { const resource_r7 = ctx.$implicit; const ctx_r1 = \u0275\u0275nextContext(7); \u0275\u0275advance(); \u0275\u0275property("nzType", ctx_r1.getResourceIcon(resource_r7.type)); \u0275\u0275advance(2); \u0275\u0275textInterpolate(resource_r7.title); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 37); \u0275\u0275repeaterCreate(1, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Conditional_16_For_2_Template, 6, 2, "div", 38, _forTrack0); \u0275\u0275elementEnd(); } if (rf & 2) { const topic_r5 = \u0275\u0275nextContext().$implicit; \u0275\u0275advance(); \u0275\u0275repeater(topic_r5.resources); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Template(rf, ctx) { if (rf & 1) { const _r4 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 25)(1, "div", 26)(2, "div", 27); \u0275\u0275text(3); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "div", 28)(5, "p", 29); \u0275\u0275text(6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(7, "span", 30); \u0275\u0275text(8); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(9, "div", 31)(10, "button", 32); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Template_button_click_10_listener($event) { const topic_r5 = \u0275\u0275restoreView(_r4).$implicit; const ctx_r1 = \u0275\u0275nextContext(5); return \u0275\u0275resetView(ctx_r1.openLinkResource(topic_r5, $event)); }); \u0275\u0275element(11, "span", 33); \u0275\u0275elementEnd(); \u0275\u0275elementStart(12, "button", 34); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Template_button_click_12_listener($event) { const topic_r5 = \u0275\u0275restoreView(_r4).$implicit; const ctx_r1 = \u0275\u0275nextContext(5); return \u0275\u0275resetView(ctx_r1.openEditTopic(topic_r5, $event)); }); \u0275\u0275element(13, "span", 35); \u0275\u0275elementEnd(); \u0275\u0275elementStart(14, "button", 36); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Template_button_click_14_listener($event) { const topic_r5 = \u0275\u0275restoreView(_r4).$implicit; const ctx_r1 = \u0275\u0275nextContext(5); return \u0275\u0275resetView(ctx_r1.deleteTopic(topic_r5, $event)); }); \u0275\u0275element(15, "span", 24); \u0275\u0275elementEnd()()(); \u0275\u0275conditionalCreate(16, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Conditional_16_Template, 3, 0, "div", 37); \u0275\u0275elementEnd(); } if (rf & 2) { const topic_r5 = ctx.$implicit; \u0275\u0275advance(3); \u0275\u0275textInterpolate(topic_r5.position); \u0275\u0275advance(3); \u0275\u0275textInterpolate(topic_r5.title); \u0275\u0275advance(2); \u0275\u0275textInterpolate1("", topic_r5.resources.length, " ressource(s)"); \u0275\u0275advance(8); \u0275\u0275conditional(topic_r5.resources.length > 0 ? 16 : -1); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_Template(rf, ctx) { if (rf & 1) { \u0275\u0275repeaterCreate(0, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_For_1_Template, 17, 4, "div", 25, _forTrack0); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(4); \u0275\u0275repeater(ctx_r1.course().topics); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_16_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "p", 19); \u0275\u0275text(1, "Cr\xE9ez des ressources pour les lier aux sujets."); \u0275\u0275elementEnd(); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_17_For_1_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 25)(1, "div", 26)(2, "div", 43); \u0275\u0275element(3, "span", 39); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "div", 28)(5, "p", 29); \u0275\u0275text(6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(7, "span", 30); \u0275\u0275text(8); \u0275\u0275elementEnd()()()(); } if (rf & 2) { const resource_r8 = ctx.$implicit; const ctx_r1 = \u0275\u0275nextContext(5); \u0275\u0275advance(3); \u0275\u0275property("nzType", ctx_r1.getResourceIcon(resource_r8.type)); \u0275\u0275advance(3); \u0275\u0275textInterpolate(resource_r8.title); \u0275\u0275advance(2); \u0275\u0275textInterpolate(resource_r8.type); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_17_Template(rf, ctx) { if (rf & 1) { \u0275\u0275repeaterCreate(0, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_17_For_1_Template, 9, 3, "div", 25, _forTrack0); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(4); \u0275\u0275repeater(ctx_r1.allResources()); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Publication... "); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Publier le cours "); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Template(rf, ctx) { if (rf & 1) { const _r9 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "button", 44); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Template_button_click_0_listener() { \u0275\u0275restoreView(_r9); const ctx_r1 = \u0275\u0275nextContext(4); return \u0275\u0275resetView(ctx_r1.publishCourse()); }); \u0275\u0275conditionalCreate(1, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Conditional_1_Template, 1, 0)(2, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Conditional_2_Template, 1, 0); \u0275\u0275elementEnd(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(4); \u0275\u0275property("disabled", ctx_r1.publishing()); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.publishing() ? 1 : 2); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_20_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 22); \u0275\u0275text(1, "Cours publi\xE9"); \u0275\u0275elementEnd(); } } function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Template(rf, ctx) { if (rf & 1) { const _r3 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 9)(1, "div", 16)(2, "h2", 10); \u0275\u0275text(3); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "button", 17); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Template_button_click_4_listener() { \u0275\u0275restoreView(_r3); const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.openAddTopic()); }); \u0275\u0275element(5, "span", 18); \u0275\u0275text(6, " Ajouter "); \u0275\u0275elementEnd()(); \u0275\u0275conditionalCreate(7, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_7_Template, 2, 0, "p", 19)(8, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_8_Template, 2, 0); \u0275\u0275elementEnd(); \u0275\u0275elementStart(9, "div", 9)(10, "div", 16)(11, "h2", 10); \u0275\u0275text(12); \u0275\u0275elementEnd(); \u0275\u0275elementStart(13, "button", 17); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Template_button_click_13_listener() { \u0275\u0275restoreView(_r3); const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.openAddResource()); }); \u0275\u0275element(14, "span", 18); \u0275\u0275text(15, " Nouvelle "); \u0275\u0275elementEnd()(); \u0275\u0275conditionalCreate(16, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_16_Template, 2, 0, "p", 19)(17, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_17_Template, 2, 0); \u0275\u0275elementEnd(); \u0275\u0275elementStart(18, "div", 20); \u0275\u0275conditionalCreate(19, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_19_Template, 3, 2, "button", 21)(20, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Conditional_20_Template, 2, 0, "div", 22); \u0275\u0275elementStart(21, "button", 23); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Template_button_click_21_listener() { \u0275\u0275restoreView(_r3); const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.deleteCourse()); }); \u0275\u0275element(22, "span", 24); \u0275\u0275text(23, " Supprimer le cours "); \u0275\u0275elementEnd()(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275advance(3); \u0275\u0275textInterpolate1("Sujets (", ctx_r1.course().topics.length, ")"); \u0275\u0275advance(4); \u0275\u0275conditional(ctx_r1.course().topics.length === 0 ? 7 : 8); \u0275\u0275advance(5); \u0275\u0275textInterpolate1("Ressources (", ctx_r1.allResources().length, ")"); \u0275\u0275advance(4); \u0275\u0275conditional(ctx_r1.allResources().length === 0 ? 16 : 17); \u0275\u0275advance(3); \u0275\u0275conditional(ctx_r1.course().status === "Draft" ? 19 : 20); } } function CourseEditorPage_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) { const _r1 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 3)(1, "div", 4)(2, "button", 5); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Template_button_click_2_listener() { \u0275\u0275restoreView(_r1); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.goBack()); }); \u0275\u0275element(3, "span", 6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "h1", 7); \u0275\u0275text(5); \u0275\u0275elementEnd(); \u0275\u0275element(6, "div"); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(7, "div", 8)(8, "div", 9)(9, "h2", 10); \u0275\u0275text(10, "Informations"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(11, "div", 11)(12, "label", 12); \u0275\u0275text(13, "Titre du cours"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(14, "input", 13); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_0_Template_input_ngModelChange_14_listener($event) { \u0275\u0275restoreView(_r1); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.courseTitle.set($event)); }); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(15, "div", 11)(16, "label", 12); \u0275\u0275text(17, "Description"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(18, "textarea", 14); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_0_Template_textarea_ngModelChange_18_listener($event) { \u0275\u0275restoreView(_r1); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.courseDescription.set($event)); }); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(19, "button", 15); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_0_Template_button_click_19_listener() { \u0275\u0275restoreView(_r1); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.saveCourse()); }); \u0275\u0275conditionalCreate(20, CourseEditorPage_Conditional_2_Conditional_0_Conditional_20_Template, 1, 0)(21, CourseEditorPage_Conditional_2_Conditional_0_Conditional_21_Template, 1, 1); \u0275\u0275elementEnd()(); \u0275\u0275conditionalCreate(22, CourseEditorPage_Conditional_2_Conditional_0_Conditional_22_Template, 24, 5); \u0275\u0275elementEnd(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(2); \u0275\u0275advance(5); \u0275\u0275textInterpolate1(" ", ctx_r1.isEditMode() ? "Modifier le cours" : "Nouveau cours", " "); \u0275\u0275advance(9); \u0275\u0275property("ngModel", ctx_r1.courseTitle()); \u0275\u0275advance(4); \u0275\u0275property("ngModel", ctx_r1.courseDescription()); \u0275\u0275advance(); \u0275\u0275property("disabled", ctx_r1.saving()); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.saving() ? 20 : 21); \u0275\u0275advance(2); \u0275\u0275conditional(ctx_r1.isEditMode() && ctx_r1.course() ? 22 : -1); } } function CourseEditorPage_Conditional_2_Conditional_1_Conditional_18_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Enregistrement... "); } } function CourseEditorPage_Conditional_2_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275textInterpolate1(" ", ctx_r1.editingTopicId() ? "Mettre \xE0 jour" : "Ajouter le sujet", " "); } } function CourseEditorPage_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) { const _r10 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 3)(1, "div", 4)(2, "button", 5); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_1_Template_button_click_2_listener() { \u0275\u0275restoreView(_r10); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.cancelMode()); }); \u0275\u0275element(3, "span", 6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "h1", 7); \u0275\u0275text(5); \u0275\u0275elementEnd(); \u0275\u0275element(6, "div"); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(7, "div", 8)(8, "div", 9)(9, "div", 11)(10, "label", 12); \u0275\u0275text(11, "Titre du sujet"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(12, "input", 45); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_1_Template_input_ngModelChange_12_listener($event) { \u0275\u0275restoreView(_r10); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.topicTitle.set($event)); }); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(13, "div", 11)(14, "label", 12); \u0275\u0275text(15, "Description (optionnel)"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(16, "textarea", 46); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_1_Template_textarea_ngModelChange_16_listener($event) { \u0275\u0275restoreView(_r10); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.topicDescription.set($event)); }); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(17, "button", 15); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_1_Template_button_click_17_listener() { \u0275\u0275restoreView(_r10); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.saveTopic()); }); \u0275\u0275conditionalCreate(18, CourseEditorPage_Conditional_2_Conditional_1_Conditional_18_Template, 1, 0)(19, CourseEditorPage_Conditional_2_Conditional_1_Conditional_19_Template, 1, 1); \u0275\u0275elementEnd()()(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(2); \u0275\u0275advance(5); \u0275\u0275textInterpolate1(" ", ctx_r1.editingTopicId() ? "Modifier le sujet" : "Nouveau sujet", " "); \u0275\u0275advance(7); \u0275\u0275property("ngModel", ctx_r1.topicTitle()); \u0275\u0275advance(4); \u0275\u0275property("ngModel", ctx_r1.topicDescription()); \u0275\u0275advance(); \u0275\u0275property("disabled", ctx_r1.saving()); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.saving() ? 18 : 19); } } function CourseEditorPage_Conditional_2_Conditional_2_For_14_Template(rf, ctx) { if (rf & 1) { const _r12 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "button", 52); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_2_For_14_Template_button_click_0_listener() { const type_r13 = \u0275\u0275restoreView(_r12).$implicit; const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.resourceType.set(type_r13)); }); \u0275\u0275element(1, "span", 39); \u0275\u0275text(2); \u0275\u0275elementEnd(); } if (rf & 2) { const type_r13 = ctx.$implicit; const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275classProp("active", ctx_r1.resourceType() === type_r13); \u0275\u0275advance(); \u0275\u0275property("nzType", ctx_r1.getResourceIcon(type_r13)); \u0275\u0275advance(); \u0275\u0275textInterpolate1(" ", type_r13, " "); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Contenu (texte/markdown) "); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Chemin ou URL du fichier "); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " URL "); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) { const _r14 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "textarea", 53); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_2_Conditional_24_Template_textarea_ngModelChange_0_listener($event) { \u0275\u0275restoreView(_r14); const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.resourceContent.set($event)); }); \u0275\u0275elementEnd(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275property("ngModel", ctx_r1.resourceContent()); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_25_Template(rf, ctx) { if (rf & 1) { const _r15 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "input", 54); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_2_Conditional_25_Template_input_ngModelChange_0_listener($event) { \u0275\u0275restoreView(_r15); const ctx_r1 = \u0275\u0275nextContext(3); return \u0275\u0275resetView(ctx_r1.resourceContent.set($event)); }); \u0275\u0275elementEnd(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275property("ngModel", ctx_r1.resourceContent()); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_27_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Enregistrement... "); } } function CourseEditorPage_Conditional_2_Conditional_2_Conditional_28_Template(rf, ctx) { if (rf & 1) { \u0275\u0275text(0, " Cr\xE9er la ressource "); } } function CourseEditorPage_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) { const _r11 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 3)(1, "div", 4)(2, "button", 5); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_2_Template_button_click_2_listener() { \u0275\u0275restoreView(_r11); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.cancelMode()); }); \u0275\u0275element(3, "span", 6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "h1", 7); \u0275\u0275text(5, "Nouvelle ressource"); \u0275\u0275elementEnd(); \u0275\u0275element(6, "div"); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(7, "div", 8)(8, "div", 9)(9, "div", 11)(10, "label", 12); \u0275\u0275text(11, "Type"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(12, "div", 47); \u0275\u0275repeaterCreate(13, CourseEditorPage_Conditional_2_Conditional_2_For_14_Template, 3, 4, "button", 48, \u0275\u0275repeaterTrackByIdentity); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(15, "div", 11)(16, "label", 12); \u0275\u0275text(17, "Titre"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(18, "input", 49); \u0275\u0275listener("ngModelChange", function CourseEditorPage_Conditional_2_Conditional_2_Template_input_ngModelChange_18_listener($event) { \u0275\u0275restoreView(_r11); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.resourceTitle.set($event)); }); \u0275\u0275elementEnd()(); \u0275\u0275elementStart(19, "div", 11)(20, "label", 12); \u0275\u0275conditionalCreate(21, CourseEditorPage_Conditional_2_Conditional_2_Conditional_21_Template, 1, 0)(22, CourseEditorPage_Conditional_2_Conditional_2_Conditional_22_Template, 1, 0)(23, CourseEditorPage_Conditional_2_Conditional_2_Conditional_23_Template, 1, 0); \u0275\u0275elementEnd(); \u0275\u0275conditionalCreate(24, CourseEditorPage_Conditional_2_Conditional_2_Conditional_24_Template, 1, 1, "textarea", 50)(25, CourseEditorPage_Conditional_2_Conditional_2_Conditional_25_Template, 1, 1, "input", 51); \u0275\u0275elementEnd(); \u0275\u0275elementStart(26, "button", 15); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_2_Template_button_click_26_listener() { \u0275\u0275restoreView(_r11); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.saveResource()); }); \u0275\u0275conditionalCreate(27, CourseEditorPage_Conditional_2_Conditional_2_Conditional_27_Template, 1, 0)(28, CourseEditorPage_Conditional_2_Conditional_2_Conditional_28_Template, 1, 0); \u0275\u0275elementEnd()()(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(2); \u0275\u0275advance(13); \u0275\u0275repeater(ctx_r1.resourceTypes); \u0275\u0275advance(5); \u0275\u0275property("ngModel", ctx_r1.resourceTitle()); \u0275\u0275advance(3); \u0275\u0275conditional(ctx_r1.resourceType() === "Text" ? 21 : ctx_r1.resourceType() === "File" ? 22 : 23); \u0275\u0275advance(3); \u0275\u0275conditional(ctx_r1.resourceType() === "Text" ? 24 : 25); \u0275\u0275advance(2); \u0275\u0275property("disabled", ctx_r1.saving()); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.saving() ? 27 : 28); } } function CourseEditorPage_Conditional_2_Conditional_3_Conditional_12_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 9)(1, "p", 19); \u0275\u0275text(2, "Aucune ressource disponible. Cr\xE9ez-en une d'abord."); \u0275\u0275elementEnd()(); } } function CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) { \u0275\u0275element(0, "span", 62); } } function CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) { const _r17 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 58); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_For_2_Template_div_click_0_listener() { const resource_r18 = \u0275\u0275restoreView(_r17).$implicit; const ctx_r1 = \u0275\u0275nextContext(4); return \u0275\u0275resetView(!ctx_r1.isResourceLinked(resource_r18) && ctx_r1.linkResource(resource_r18)); }); \u0275\u0275elementStart(1, "div", 43); \u0275\u0275element(2, "span", 39); \u0275\u0275elementEnd(); \u0275\u0275elementStart(3, "div", 59)(4, "p", 60); \u0275\u0275text(5); \u0275\u0275elementEnd(); \u0275\u0275elementStart(6, "span", 61); \u0275\u0275text(7); \u0275\u0275elementEnd()(); \u0275\u0275conditionalCreate(8, CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_For_2_Conditional_8_Template, 1, 0, "span", 62); \u0275\u0275elementEnd(); } if (rf & 2) { const resource_r18 = ctx.$implicit; const ctx_r1 = \u0275\u0275nextContext(4); \u0275\u0275classProp("linked", ctx_r1.isResourceLinked(resource_r18)); \u0275\u0275advance(2); \u0275\u0275property("nzType", ctx_r1.getResourceIcon(resource_r18.type)); \u0275\u0275advance(3); \u0275\u0275textInterpolate(resource_r18.title); \u0275\u0275advance(2); \u0275\u0275textInterpolate(resource_r18.type); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.isResourceLinked(resource_r18) ? 8 : -1); } } function CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 56); \u0275\u0275repeaterCreate(1, CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_For_2_Template, 9, 6, "div", 57, _forTrack0); \u0275\u0275elementEnd(); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(3); \u0275\u0275advance(); \u0275\u0275repeater(ctx_r1.allResources()); } } function CourseEditorPage_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) { const _r16 = \u0275\u0275getCurrentView(); \u0275\u0275elementStart(0, "div", 3)(1, "div", 4)(2, "button", 5); \u0275\u0275listener("click", function CourseEditorPage_Conditional_2_Conditional_3_Template_button_click_2_listener() { \u0275\u0275restoreView(_r16); const ctx_r1 = \u0275\u0275nextContext(2); return \u0275\u0275resetView(ctx_r1.cancelMode()); }); \u0275\u0275element(3, "span", 6); \u0275\u0275elementEnd(); \u0275\u0275elementStart(4, "h1", 7); \u0275\u0275text(5, "Lier une ressource"); \u0275\u0275elementEnd(); \u0275\u0275element(6, "div"); \u0275\u0275elementEnd(); \u0275\u0275elementStart(7, "p", 55); \u0275\u0275text(8, "Sujet : "); \u0275\u0275elementStart(9, "strong"); \u0275\u0275text(10); \u0275\u0275elementEnd()()(); \u0275\u0275elementStart(11, "div", 8); \u0275\u0275conditionalCreate(12, CourseEditorPage_Conditional_2_Conditional_3_Conditional_12_Template, 3, 0, "div", 9)(13, CourseEditorPage_Conditional_2_Conditional_3_Conditional_13_Template, 3, 0, "div", 56); \u0275\u0275elementEnd(); } if (rf & 2) { let tmp_2_0; const ctx_r1 = \u0275\u0275nextContext(2); \u0275\u0275advance(10); \u0275\u0275textInterpolate((tmp_2_0 = ctx_r1.selectedTopic()) == null ? null : tmp_2_0.title); \u0275\u0275advance(2); \u0275\u0275conditional(ctx_r1.allResources().length === 0 ? 12 : 13); } } function CourseEditorPage_Conditional_2_Template(rf, ctx) { if (rf & 1) { \u0275\u0275conditionalCreate(0, CourseEditorPage_Conditional_2_Conditional_0_Template, 23, 6); \u0275\u0275conditionalCreate(1, CourseEditorPage_Conditional_2_Conditional_1_Template, 20, 5); \u0275\u0275conditionalCreate(2, CourseEditorPage_Conditional_2_Conditional_2_Template, 29, 5); \u0275\u0275conditionalCreate(3, CourseEditorPage_Conditional_2_Conditional_3_Template, 14, 2); } if (rf & 2) { const ctx_r1 = \u0275\u0275nextContext(); \u0275\u0275conditional(ctx_r1.mode() === "course" ? 0 : -1); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.mode() === "topic" ? 1 : -1); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.mode() === "resource" ? 2 : -1); \u0275\u0275advance(); \u0275\u0275conditional(ctx_r1.mode() === "link-resource" ? 3 : -1); } } var CourseEditorPage = class _CourseEditorPage { route = inject(ActivatedRoute); router = inject(Router); courseService = inject(CourseService); topicService = inject(TopicService); resourceService = inject(ResourceService); authService = inject(AuthService); message = inject(NzMessageService); // State isEditMode = signal(false, ...ngDevMode ? [{ debugName: "isEditMode" }] : []); loading = signal(true, ...ngDevMode ? [{ debugName: "loading" }] : []); saving = signal(false, ...ngDevMode ? [{ debugName: "saving" }] : []); publishing = signal(false, ...ngDevMode ? [{ debugName: "publishing" }] : []); mode = signal("course", ...ngDevMode ? [{ debugName: "mode" }] : []); course = signal(null, ...ngDevMode ? [{ debugName: "course" }] : []); allResources = signal([], ...ngDevMode ? [{ debugName: "allResources" }] : []); selectedTopic = signal(null, ...ngDevMode ? [{ debugName: "selectedTopic" }] : []); // Course form courseTitle = signal("", ...ngDevMode ? [{ debugName: "courseTitle" }] : []); courseDescription = signal("", ...ngDevMode ? [{ debugName: "courseDescription" }] : []); // Topic form topicTitle = signal("", ...ngDevMode ? [{ debugName: "topicTitle" }] : []); topicDescription = signal("", ...ngDevMode ? [{ debugName: "topicDescription" }] : []); editingTopicId = signal(null, ...ngDevMode ? [{ debugName: "editingTopicId" }] : []); // Resource form resourceType = signal("Url", ...ngDevMode ? [{ debugName: "resourceType" }] : []); resourceTitle = signal("", ...ngDevMode ? [{ debugName: "resourceTitle" }] : []); resourceContent = signal("", ...ngDevMode ? [{ debugName: "resourceContent" }] : []); editingResourceId = signal(null, ...ngDevMode ? [{ debugName: "editingResourceId" }] : []); resourceTypes = ["Url", "Video", "Text", "File"]; get currentUser() { return this.authService.currentUser(); } ngOnInit() { const id = this.route.snapshot.paramMap.get("id"); if (id) { this.isEditMode.set(true); this.loadCourse(id); } else { this.loading.set(false); } } loadCourse(id) { this.loading.set(true); forkJoin([ this.courseService.getCourseById(id), this.resourceService.getResources() ]).subscribe({ next: ([course, resources]) => { this.course.set(course); this.courseTitle.set(course.title); this.courseDescription.set(course.description); this.allResources.set(resources); this.loading.set(false); }, error: () => { this.loading.set(false); this.message.error("Cours introuvable"); this.router.navigate(["/catalog"]); } }); } // -- Course actions -- saveCourse() { if (!this.courseTitle().trim()) { this.message.warning("Le titre est requis"); return; } this.saving.set(true); const user = this.currentUser; if (this.isEditMode()) { const id = this.course().id; this.courseService.updateCourse(id, this.courseTitle(), this.courseDescription()).subscribe({ next: (updated) => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { title: updated.title, description: updated.description }) : c); this.saving.set(false); this.message.success("Cours mis \xE0 jour"); }, error: () => { this.saving.set(false); this.message.error("Erreur lors de la mise \xE0 jour"); } }); } else { if (!user) return; this.courseService.createCourse(this.courseTitle(), this.courseDescription(), user.userId).subscribe({ next: (created) => { this.saving.set(false); this.message.success("Cours cr\xE9\xE9 !"); this.router.navigate(["/courses", created.id, "edit"]); }, error: (err) => { this.saving.set(false); this.message.error(getErrorMessage(err, "Erreur lors de la cr\xE9ation")); } }); } } publishCourse() { const course = this.course(); if (!course) return; this.publishing.set(true); this.courseService.publishCourse(course.id).subscribe({ next: (updated) => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { status: updated.status }) : c); this.publishing.set(false); this.message.success("Cours publi\xE9 !"); }, error: (err) => { this.publishing.set(false); this.message.error(getErrorMessage(err, "Impossible de publier le cours")); } }); } deleteCourse() { const course = this.course(); if (!course) return; this.courseService.deleteCourse(course.id).subscribe({ next: () => { this.message.success("Cours supprim\xE9"); this.router.navigate(["/catalog"]); }, error: (err) => { this.message.error(getErrorMessage(err, "Impossible de supprimer le cours")); } }); } // -- Topic actions -- openAddTopic() { this.topicTitle.set(""); this.topicDescription.set(""); this.editingTopicId.set(null); this.mode.set("topic"); } openEditTopic(topic, event) { event.stopPropagation(); this.topicTitle.set(topic.title); this.topicDescription.set(topic.description ?? ""); this.editingTopicId.set(topic.id); this.mode.set("topic"); } saveTopic() { if (!this.topicTitle().trim()) { this.message.warning("Le titre du sujet est requis"); return; } const course = this.course(); if (!course) return; this.saving.set(true); const editId = this.editingTopicId(); if (editId) { const existing = course.topics.find((t) => t.id === editId); this.topicService.updateTopic(editId, this.topicTitle(), this.topicDescription(), existing.position).subscribe({ next: (updated) => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { topics: c.topics.map((t) => t.id === editId ? __spreadValues(__spreadValues({}, t), updated) : t) }) : c); this.saving.set(false); this.mode.set("course"); this.message.success("Sujet mis \xE0 jour"); }, error: () => { this.saving.set(false); this.message.error("Erreur lors de la mise \xE0 jour"); } }); } else { const position = course.topics.length + 1; const desc = this.topicDescription().trim() || null; this.topicService.createTopic(course.id, this.topicTitle(), desc, position).subscribe({ next: (created) => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { topics: [...c.topics, __spreadProps(__spreadValues({}, created), { resources: [] })], topicCount: c.topicCount + 1 }) : c); this.saving.set(false); this.mode.set("course"); this.message.success("Sujet ajout\xE9"); }, error: (err) => { this.saving.set(false); this.message.error(getErrorMessage(err, "Erreur lors de la cr\xE9ation du sujet")); } }); } } deleteTopic(topic, event) { event.stopPropagation(); this.topicService.deleteTopic(topic.id).subscribe({ next: () => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { topics: c.topics.filter((t) => t.id !== topic.id), topicCount: c.topicCount - 1 }) : c); this.message.success("Sujet supprim\xE9"); }, error: () => this.message.error("Impossible de supprimer ce sujet") }); } // -- Resource actions -- openAddResource() { this.resourceType.set("Url"); this.resourceTitle.set(""); this.resourceContent.set(""); this.editingResourceId.set(null); this.mode.set("resource"); } openLinkResource(topic, event) { event.stopPropagation(); this.selectedTopic.set(topic); this.resourceService.getResources().subscribe({ next: (resources) => { this.allResources.set(resources); this.mode.set("link-resource"); }, error: () => this.message.error("Impossible de charger les ressources") }); } saveResource() { if (!this.resourceTitle().trim() || !this.resourceContent().trim()) { this.message.warning("Titre et contenu sont requis"); return; } this.saving.set(true); this.resourceService.createResource(this.resourceType(), this.resourceTitle(), this.resourceContent()).subscribe({ next: (created) => { this.allResources.update((list) => [...list, created]); this.saving.set(false); this.mode.set("course"); this.message.success("Ressource cr\xE9\xE9e"); }, error: (err) => { this.saving.set(false); this.message.error(getErrorMessage(err, "Erreur lors de la cr\xE9ation de la ressource")); } }); } linkResource(resource) { const topic = this.selectedTopic(); if (!topic) return; const position = topic.resources.length + 1; this.topicService.linkResource(topic.id, resource.id, position).subscribe({ next: () => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { topics: c.topics.map((t) => t.id === topic.id ? __spreadProps(__spreadValues({}, t), { resources: [...t.resources, resource] }) : t) }) : c); this.selectedTopic.update((t) => t ? __spreadProps(__spreadValues({}, t), { resources: [...t.resources, resource] }) : t); this.message.success("Ressource li\xE9e"); }, error: () => this.message.error("Erreur lors de la liaison") }); } unlinkResource(topic, resource, event) { event.stopPropagation(); this.topicService.unlinkResource(topic.id, resource.id).subscribe({ next: () => { this.course.update((c) => c ? __spreadProps(__spreadValues({}, c), { topics: c.topics.map((t) => t.id === topic.id ? __spreadProps(__spreadValues({}, t), { resources: t.resources.filter((r) => r.id !== resource.id) }) : t) }) : c); this.message.success("Ressource retir\xE9e"); }, error: () => this.message.error("Erreur lors du retrait") }); } isResourceLinked(resource) { return this.selectedTopic()?.resources.some((r) => r.id === resource.id) ?? false; } getResourceIcon(type) { switch (type) { case "Video": return "video-camera"; case "Text": return "file-text"; case "File": return "file"; default: return "link"; } } cancelMode() { this.mode.set("course"); } goBack() { this.router.navigate(["/catalog"]); } static \u0275fac = function CourseEditorPage_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || _CourseEditorPage)(); }; static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _CourseEditorPage, selectors: [["app-course-editor"]], features: [\u0275\u0275ProvidersFeature([NzMessageService])], decls: 3, vars: 1, consts: [[1, "page-container", "editor-page"], [1, "loading-screen"], ["nz-icon", "", "nzType", "loading", "nzTheme", "outline", 1, "loading-spin"], [1, "editor-header"], [1, "header-row"], [1, "back-btn", 3, "click"], ["nz-icon", "", "nzType", "arrow-left", "nzTheme", "outline"], [1, "page-title"], [1, "editor-content"], [1, "section-card"], [1, "section-label"], [1, "field-group"], [1, "field-label"], ["type", "text", "placeholder", "Ex: Introduction \xE0 Angular", 1, "mc-input", 3, "ngModelChange", "ngModel"], ["placeholder", "D\xE9crivez votre cours...", "rows", "4", 1, "mc-input", "mc-textarea", 3, "ngModelChange", "ngModel"], [1, "mc-btn-primary", 3, "click", "disabled"], [1, "section-header"], [1, "add-btn", 3, "click"], ["nz-icon", "", "nzType", "plus", "nzTheme", "outline"], [1, "empty-hint"], [1, "section-card", "danger-zone"], [1, "publish-btn", 3, "disabled"], [1, "status-badge", "published"], [1, "delete-btn", 3, "click"], ["nz-icon", "", "nzType", "delete", "nzTheme", "outline"], [1, "topic-item"], [1, "topic-item-header"], [1, "topic-position"], [1, "topic-item-info"], [1, "topic-item-title"], [1, "topic-item-resources"], [1, "topic-item-actions"], ["title", "Lier une ressource", 1, "icon-action", 3, "click"], ["nz-icon", "", "nzType", "link", "nzTheme", "outline"], ["title", "Modifier", 1, "icon-action", 3, "click"], ["nz-icon", "", "nzType", "edit", "nzTheme", "outline"], ["title", "Supprimer", 1, "icon-action", "danger", 3, "click"], [1, "topic-resources"], [1, "resource-chip"], ["nz-icon", "", "nzTheme", "outline", 3, "nzType"], [1, "chip-title"], [1, "chip-remove", 3, "click"], ["nz-icon", "", "nzType", "close", "nzTheme", "outline"], [1, "resource-icon-sm"], [1, "publish-btn", 3, "click", "disabled"], ["type", "text", "placeholder", "Ex: Introduction aux composants", 1, "mc-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Description du sujet...", "rows", "3", 1, "mc-input", "mc-textarea", 3, "ngModelChange", "ngModel"], [1, "type-pills"], [1, "type-pill", 3, "active"], ["type", "text", "placeholder", "Ex: Documentation Angular", 1, "mc-input", 3, "ngModelChange", "ngModel"], ["placeholder", "R\xE9digez le contenu...", "rows", "6", 1, "mc-input", "mc-textarea", 3, "ngModel"], ["type", "url", "placeholder", "https://...", 1, "mc-input", 3, "ngModel"], [1, "type-pill", 3, "click"], ["placeholder", "R\xE9digez le contenu...", "rows", "6", 1, "mc-input", "mc-textarea", 3, "ngModelChange", "ngModel"], ["type", "url", "placeholder", "https://...", 1, "mc-input", 3, "ngModelChange", "ngModel"], [1, "mode-subtitle"], [1, "resources-picker"], [1, "picker-item", 3, "linked"], [1, "picker-item", 3, "click"], [1, "picker-info"], [1, "picker-title"], [1, "picker-type"], ["nz-icon", "", "nzType", "check-circle", "nzTheme", "outline", 1, "linked-icon"]], template: function CourseEditorPage_Template(rf, ctx) { if (rf & 1) { \u0275\u0275elementStart(0, "div", 0); \u0275\u0275conditionalCreate(1, CourseEditorPage_Conditional_1_Template, 2, 0, "div", 1)(2, CourseEditorPage_Conditional_2_Template, 4, 4); \u0275\u0275elementEnd(); } if (rf & 2) { \u0275\u0275advance(); \u0275\u0275conditional(ctx.loading() ? 1 : 2); } }, dependencies: [FormsModule, DefaultValueAccessor, NgControlStatus, NgModel, NzIconModule, NzIconDirective], styles: ["\n\n.editor-page[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding-bottom: 100px;\n}\n.loading-screen[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: #1abc9c;\n}\n.loading-spin[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n}\n@keyframes _ngcontent-%COMP%_spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.editor-header[_ngcontent-%COMP%] {\n padding: 16px 20px 0;\n border-bottom: 1px solid var(--border);\n padding-bottom: 16px;\n margin-bottom: 0;\n}\n.header-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0;\n}\n.back-btn[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n color: var(--text);\n}\n.page-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--text);\n margin: 0;\n}\n.mode-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-muted);\n margin: 8px 0 0;\n}\n.editor-content[_ngcontent-%COMP%] {\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.section-card[_ngcontent-%COMP%] {\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 16px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.section-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 700;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n}\n.add-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text);\n cursor: pointer;\n}\n.field-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--text);\n}\n.mc-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 80px;\n line-height: 1.5;\n}\n.topic-item[_ngcontent-%COMP%] {\n border: 1px solid var(--border);\n border-radius: 12px;\n overflow: hidden;\n}\n.topic-item-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background: var(--bg);\n}\n.topic-position[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n color: var(--text-muted);\n flex-shrink: 0;\n}\n.topic-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.topic-item-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text);\n margin: 0 0 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.topic-item-resources[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--text-muted);\n}\n.topic-item-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n.icon-action[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 14px;\n color: var(--text-muted);\n}\n.icon-action.danger[_ngcontent-%COMP%] {\n color: #ff4d4f;\n}\n.topic-resources[_ngcontent-%COMP%] {\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n border-top: 1px solid var(--border);\n}\n.resource-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 20px;\n padding: 4px 10px;\n font-size: 12px;\n color: var(--text);\n}\n.chip-title[_ngcontent-%COMP%] {\n max-width: 120px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.chip-remove[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--text-muted);\n font-size: 11px;\n padding: 0;\n display: flex;\n align-items: center;\n margin-left: 2px;\n}\n.danger-zone[_ngcontent-%COMP%] {\n gap: 10px;\n}\n.publish-btn[_ngcontent-%COMP%] {\n width: 100%;\n background-color: #1abc9c;\n color: #fff;\n border: none;\n border-radius: 12px;\n padding: 14px;\n font-size: 15px;\n font-weight: 700;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n.publish-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 0.85;\n}\n.publish-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.status-badge.published[_ngcontent-%COMP%] {\n text-align: center;\n font-size: 13px;\n font-weight: 700;\n color: #1abc9c;\n background: rgba(26, 188, 156, 0.1);\n border: 1px solid rgba(26, 188, 156, 0.3);\n border-radius: 10px;\n padding: 10px;\n}\n.delete-btn[_ngcontent-%COMP%] {\n width: 100%;\n background: none;\n border: 1px solid #ff4d4f;\n color: #ff4d4f;\n border-radius: 12px;\n padding: 12px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: background 0.2s;\n}\n.delete-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 77, 79, 0.08);\n}\n.type-pills[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n.type-pill[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--bg);\n border: 1.5px solid var(--border);\n border-radius: 20px;\n padding: 6px 14px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-muted);\n cursor: pointer;\n transition: all 0.15s;\n}\n.type-pill.active[_ngcontent-%COMP%] {\n background: var(--primary);\n color: var(--primary-fg);\n border-color: var(--primary);\n}\n.resources-picker[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 20px;\n}\n.picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n cursor: pointer;\n transition: border-color 0.15s;\n}\n.picker-item.linked[_ngcontent-%COMP%] {\n border-color: #1abc9c;\n background: rgba(26, 188, 156, 0.05);\n cursor: default;\n}\n.resource-icon-sm[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--text-muted);\n flex-shrink: 0;\n}\n.picker-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.picker-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text);\n margin: 0 0 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.picker-type[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--text-muted);\n}\n.linked-icon[_ngcontent-%COMP%] {\n font-size: 18px;\n color: #1abc9c;\n}\n.empty-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-muted);\n margin: 0;\n text-align: center;\n}\n/*# sourceMappingURL=course-editor.css.map */"] }); }; (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(CourseEditorPage, [{ type: Component, args: [{ selector: "app-course-editor", imports: [FormsModule, NzIconModule], providers: [NzMessageService], template: `
@if (loading()) {
} @else { @if (mode() === 'course') {

{{ isEditMode() ? 'Modifier le cours' : 'Nouveau cours' }}

@if (isEditMode() && course()) {
@if (course()!.topics.length === 0) {

Aucun sujet. Commencez par en ajouter un.

} @else { @for (topic of course()!.topics; track topic.id) {
{{ topic.position }}

{{ topic.title }}

{{ topic.resources.length }} ressource(s)
@if (topic.resources.length > 0) {
@for (resource of topic.resources; track resource.id) {
{{ resource.title }}
}
}
} }
@if (allResources().length === 0) {

Cr\xE9ez des ressources pour les lier aux sujets.

} @else { @for (resource of allResources(); track resource.id) {

{{ resource.title }}

{{ resource.type }}
} }
@if (course()!.status === 'Draft') { } @else {
Cours publi\xE9
}
}
} @if (mode() === 'topic') {

{{ editingTopicId() ? 'Modifier le sujet' : 'Nouveau sujet' }}

} @if (mode() === 'resource') {

Nouvelle ressource

@for (type of resourceTypes; track type) { }
@if (resourceType() === 'Text') { } @else { }
} @if (mode() === 'link-resource') {

Lier une ressource

Sujet : {{ selectedTopic()?.title }}

@if (allResources().length === 0) {

Aucune ressource disponible. Cr\xE9ez-en une d'abord.

} @else {
@for (resource of allResources(); track resource.id) {

{{ resource.title }}

{{ resource.type }}
@if (isResourceLinked(resource)) { }
}
}
} }
`, styles: ["/* src/app/pages/course-editor/course-editor.css */\n.editor-page {\n display: flex;\n flex-direction: column;\n padding-bottom: 100px;\n}\n.loading-screen {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: #1abc9c;\n}\n.loading-spin {\n animation: spin 1s linear infinite;\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.editor-header {\n padding: 16px 20px 0;\n border-bottom: 1px solid var(--border);\n padding-bottom: 16px;\n margin-bottom: 0;\n}\n.header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0;\n}\n.back-btn {\n width: 40px;\n height: 40px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n color: var(--text);\n}\n.page-title {\n font-size: 18px;\n font-weight: 700;\n color: var(--text);\n margin: 0;\n}\n.mode-subtitle {\n font-size: 13px;\n color: var(--text-muted);\n margin: 8px 0 0;\n}\n.editor-content {\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n.section-card {\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 16px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.section-label {\n font-size: 13px;\n font-weight: 700;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0;\n}\n.add-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text);\n cursor: pointer;\n}\n.field-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.field-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--text);\n}\n.mc-textarea {\n resize: vertical;\n min-height: 80px;\n line-height: 1.5;\n}\n.topic-item {\n border: 1px solid var(--border);\n border-radius: 12px;\n overflow: hidden;\n}\n.topic-item-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px;\n background: var(--bg);\n}\n.topic-position {\n width: 26px;\n height: 26px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 700;\n color: var(--text-muted);\n flex-shrink: 0;\n}\n.topic-item-info {\n flex: 1;\n min-width: 0;\n}\n.topic-item-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text);\n margin: 0 0 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.topic-item-resources {\n font-size: 11px;\n color: var(--text-muted);\n}\n.topic-item-actions {\n display: flex;\n gap: 4px;\n}\n.icon-action {\n width: 30px;\n height: 30px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 14px;\n color: var(--text-muted);\n}\n.icon-action.danger {\n color: #ff4d4f;\n}\n.topic-resources {\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n border-top: 1px solid var(--border);\n}\n.resource-chip {\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 20px;\n padding: 4px 10px;\n font-size: 12px;\n color: var(--text);\n}\n.chip-title {\n max-width: 120px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.chip-remove {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--text-muted);\n font-size: 11px;\n padding: 0;\n display: flex;\n align-items: center;\n margin-left: 2px;\n}\n.danger-zone {\n gap: 10px;\n}\n.publish-btn {\n width: 100%;\n background-color: #1abc9c;\n color: #fff;\n border: none;\n border-radius: 12px;\n padding: 14px;\n font-size: 15px;\n font-weight: 700;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n.publish-btn:hover:not(:disabled) {\n opacity: 0.85;\n}\n.publish-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.status-badge.published {\n text-align: center;\n font-size: 13px;\n font-weight: 700;\n color: #1abc9c;\n background: rgba(26, 188, 156, 0.1);\n border: 1px solid rgba(26, 188, 156, 0.3);\n border-radius: 10px;\n padding: 10px;\n}\n.delete-btn {\n width: 100%;\n background: none;\n border: 1px solid #ff4d4f;\n color: #ff4d4f;\n border-radius: 12px;\n padding: 12px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: background 0.2s;\n}\n.delete-btn:hover {\n background: rgba(255, 77, 79, 0.08);\n}\n.type-pills {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n.type-pill {\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--bg);\n border: 1.5px solid var(--border);\n border-radius: 20px;\n padding: 6px 14px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-muted);\n cursor: pointer;\n transition: all 0.15s;\n}\n.type-pill.active {\n background: var(--primary);\n color: var(--primary-fg);\n border-color: var(--primary);\n}\n.resources-picker {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 20px;\n}\n.picker-item {\n display: flex;\n align-items: center;\n gap: 10px;\n background: var(--card);\n border: 1px solid var(--border);\n border-radius: 12px;\n padding: 12px;\n cursor: pointer;\n transition: border-color 0.15s;\n}\n.picker-item.linked {\n border-color: #1abc9c;\n background: rgba(26, 188, 156, 0.05);\n cursor: default;\n}\n.resource-icon-sm {\n width: 36px;\n height: 36px;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--text-muted);\n flex-shrink: 0;\n}\n.picker-info {\n flex: 1;\n min-width: 0;\n}\n.picker-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--text);\n margin: 0 0 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.picker-type {\n font-size: 11px;\n color: var(--text-muted);\n}\n.linked-icon {\n font-size: 18px;\n color: #1abc9c;\n}\n.empty-hint {\n font-size: 13px;\n color: var(--text-muted);\n margin: 0;\n text-align: center;\n}\n/*# sourceMappingURL=course-editor.css.map */\n"] }] }], null, null); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(CourseEditorPage, { className: "CourseEditorPage", filePath: "src/app/pages/course-editor/course-editor.ts", lineNumber: 23 }); })(); // src/app/pages/course-editor/course-editor.routes.ts var COURSE_EDITOR_ROUTES = [ { path: "", component: CourseEditorPage } ]; export { COURSE_EDITOR_ROUTES }; //# sourceMappingURL=chunk-OVXDZVBT.js.map