Merge branch 'MDL-72310-master' of git://github.com/aanabit/moodle
[moodle.git] / course / format / amd / src / local / courseeditor / exporter.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * Module to export parts of the state and transform them to be used in templates
18  * and as draggable data.
19  *
20  * @module     core_courseformat/local/courseeditor/exporter
21  * @class      core_courseformat/local/courseeditor/exporter
22  * @copyright  2021 Ferran Recio <ferran@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
25 export default class {
27     /**
28      * Class constructor.
29      *
30      * @param {CourseEditor} reactive the course editor object
31      */
32     constructor(reactive) {
33         this.reactive = reactive;
34     }
36     /**
37      * Generate the course export data from the state.
38      *
39      * @param {Object} state the current state.
40      * @returns {Object}
41      */
42     course(state) {
43         // Collect section information from the state.
44         const data = {
45             sections: [],
46             editmode: this.reactive.isEditing,
47         };
48         const sectionlist = state.course.sectionlist ?? [];
49         sectionlist.forEach(sectionid => {
50             const sectioninfo = state.section.get(sectionid) ?? {};
51             const section = this.section(state, sectioninfo);
52             data.sections.push(section);
53         });
54         data.hassections = (data.sections.length != 0);
56         return data;
57     }
59     /**
60      * Generate a section export data from the state.
61      *
62      * @param {Object} state the current state.
63      * @param {Object} sectioninfo the section state data.
64      * @returns {Object}
65      */
66     section(state, sectioninfo) {
67         const section = {
68             ...sectioninfo,
69             cms: [],
70             isactive: true,
71         };
72         const cmlist = sectioninfo.cmlist ?? [];
73         cmlist.forEach(cmid => {
74             const cminfo = state.cm.get(cmid);
75             const cm = this.cm(state, cminfo);
76             section.cms.push(cm);
77         });
78         section.hascms = (section.cms.length != 0);
80         return section;
81     }
83     /**
84      * Generate a cm export data from the state.
85      *
86      * @param {Object} state the current state.
87      * @param {Object} cminfo the course module state data.
88      * @returns {Object}
89      */
90     cm(state, cminfo) {
91         const cm = {
92             ...cminfo,
93             isactive: false,
94         };
95         return cm;
96     }
98     /**
99      * Generate a dragable cm data structure.
100      *
101      * This method is used by any draggable course module element to generate drop data
102      * for its reactive/dragdrop instance.
103      *
104      * @param {*} state the state object
105      * @param {*} cmid the cours emodule id
106      * @returns {Object|null}
107      */
108     cmDraggableData(state, cmid) {
109         const cminfo = state.cm.get(cmid);
110         if (!cminfo) {
111             return null;
112         }
114         // Drop an activity over the next activity is the same as doing anything.
115         let nextcmid;
116         const section = state.section.get(cminfo.sectionid);
117         const currentindex = section?.cmlist.indexOf(cminfo.id);
118         if (currentindex !== undefined) {
119             nextcmid = section?.cmlist[currentindex + 1];
120         }
122         return {
123             type: 'cm',
124             id: cminfo.id,
125             name: cminfo.name,
126             nextcmid,
127         };
128     }
130     /**
131      * Generate a dragable cm data structure.
132      *
133      * This method is used by any draggable section element to generate drop data
134      * for its reactive/dragdrop instance.
135      *
136      * @param {*} state the state object
137      * @param {*} sectionid the cours section id
138      * @returns {Object|null}
139      */
140     sectionDraggableData(state, sectionid) {
141         const sectioninfo = state.section.get(sectionid);
142         if (!sectioninfo) {
143             return null;
144         }
145         return {
146             type: 'section',
147             id: sectioninfo.id,
148             name: sectioninfo.name,
149             number: sectioninfo.number,
150         };
151     }