{"version":3,"file":"section.min.js","sources":["https:\/\/moodle.tau.ac.il\/2023\/course\/format\/multitopic\/amd\/src\/courseformat\/courseindex\/section.js"],"sourcesContent":["\/\/ This file is part of Moodle - http:\/\/moodle.org\/\n\/\/\n\/\/ Moodle is free software: you can redistribute it and\/or modify\n\/\/ it under the terms of the GNU General Public License as published by\n\/\/ the Free Software Foundation, either version 3 of the License, or\n\/\/ (at your option) any later version.\n\/\/\n\/\/ Moodle is distributed in the hope that it will be useful,\n\/\/ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\/\/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\/\/ GNU General Public License for more details.\n\/\/\n\/\/ You should have received a copy of the GNU General Public License\n\/\/ along with Moodle. If not, see .\n\n\/**\n * Course index section component.\n *\n * This component is used to control specific course section interactions like drag and drop.\n *\n * @module format_multitopic\/courseformat\/courseindex\/section\n * @class format_multitopic\/courseformat\/courseindex\/section\n * @copyright 2022 onwards James Calder and Otago Polytechnic\n * @copyright based on work by 2021 Ferran Recio \n * @license http:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later\n *\/\n\nimport ComponentBase from 'core_courseformat\/local\/courseindex\/section';\n\nexport default class Component extends ComponentBase {\n\n \/**\n * Static method to create a component instance form the mustahce template.\n *\n * @param {string} target the DOM main element or its ID\n * @param {object} selectors optional css selector overrides\n * @return {Component}\n *\/\n static init(target, selectors) {\n return new this({\n element: document.getElementById(target),\n selectors,\n });\n }\n\n \/**\n * Validate if the drop data can be dropped over the component.\n *\n * @param {Object} dropdata the exported drop data.\n * @returns {boolean}\n *\/\n validateDropData(dropdata) {\n \/\/ We accept a section that fits\n if (dropdata?.type === 'section') {\n const sectionzeroid = this.course.sectionlist[0];\n const origin = this.reactive.get(\"section\", dropdata.id);\n let target = this.section;\n return target.levelsan <= origin.levelsan && origin.id != sectionzeroid && target.id != sectionzeroid;\n } else {\n return super.validateDropData(dropdata);\n }\n }\n\n\n \/**\n * Display the component dropzone.\n *\n * @param {Object} dropdata the accepted drop data\n *\/\n showDropZone(dropdata) {\n if (dropdata.type == 'section') {\n const origin = this.reactive.get(\"section\", dropdata.id);\n let target = this.section;\n while (target.levelsan > origin.levelsan) {\n target = this.reactive.get(\"section\", this.course.sectionlist[target.number - 1]);\n }\n const moveDirection = Math.sign(target.number - origin.number);\n let targetShow = target;\n let targetShowBorder = moveDirection;\n if (moveDirection > 0 && !target.indexcollapsed) {\n let targetChild = target;\n while (this.course.sectionlist.length > targetChild.number + 1\n && this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]).levelsan > target.levelsan) {\n targetChild = this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]);\n if (targetChild.levelsan <= origin.levelsan) {\n targetShow = targetChild;\n targetShowBorder = -1;\n break;\n }\n }\n }\n const targetDom = document.querySelector(\n \".courseindex-section[data-id='\" + targetShow.id + \"']\");\n \/\/ The relative move of section depends on the section number.\n if (targetShowBorder > 0) {\n targetDom.classList.add(this.classes.DROPDOWN);\n } else if (targetShowBorder < 0) {\n targetDom.classList.add(this.classes.DROPUP);\n }\n } else {\n super.showDropZone(dropdata);\n }\n }\n\n \/**\n * Hide the component dropzone.\n *\n * @param {Object} dropdata the accepted drop data\n *\/\n hideDropZone(dropdata) {\n if (dropdata.type == 'section') {\n const origin = this.reactive.get(\"section\", dropdata.id);\n let target = this.section;\n while (target.levelsan > origin.levelsan) {\n target = this.reactive.get(\"section\", this.course.sectionlist[target.number - 1]);\n }\n const moveDirection = Math.sign(target.number - origin.number);\n let targetShow = target;\n let targetShowBorder = moveDirection;\n if (moveDirection > 0 && !target.indexcollapsed) {\n let targetChild = target;\n while (this.course.sectionlist.length > targetChild.number + 1\n && this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]).levelsan > target.levelsan) {\n targetChild = this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]);\n if (targetChild.levelsan <= origin.levelsan) {\n targetShow = targetChild;\n targetShowBorder = -1;\n break;\n }\n }\n }\n const targetDom = document.querySelector(\n \".courseindex-section[data-id='\" + targetShow.id + \"']\");\n if (targetShowBorder > 0) {\n targetDom.classList.remove(this.classes.DROPDOWN);\n } else if (targetShowBorder < 0) {\n targetDom.classList.remove(this.classes.DROPUP);\n }\n } else {\n super.hideDropZone(dropdata);\n }\n }\n\n \/**\n * Drop event handler.\n *\n * @param {Object} dropdata the accepted drop data\n * @param {Event} event the drop event\n *\/\n drop(dropdata, event) {\n \/\/ Call the move mutation.\n if (dropdata.type == 'section') {\n const origin = this.reactive.get(\"section\", dropdata.id);\n let target = this.section;\n while (target.levelsan > origin.levelsan) {\n target = this.reactive.get(\"section\", this.course.sectionlist[target.number - 1]);\n }\n const moveDirection = Math.sign(target.number - origin.number);\n let targetCall = target;\n if (moveDirection > 0 && target.indexcollapsed) {\n let targetChild = target;\n while (this.course.sectionlist.length > targetChild.number + 1\n && this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]).levelsan > target.levelsan) {\n targetChild = this.reactive.get(\"section\", this.course.sectionlist[targetChild.number + 1]);\n if (targetChild.levelsan <= origin.levelsan) {\n targetCall = targetChild;\n }\n }\n }\n if (moveDirection != 0) {\n this.reactive.dispatch('sectionMove', [origin.id], targetCall.id);\n }\n } else {\n super.drop(dropdata, event);\n }\n }\n\n}"],"names":["Component","ComponentBase","target","selectors","this","element","document","getElementById","validateDropData","dropdata","type","sectionzeroid","course","sectionlist","origin","reactive","get","id","section","levelsan","super","showDropZone","number","moveDirection","Math","sign","targetShow","targetShowBorder","indexcollapsed","targetChild","length","targetDom","querySelector","classList","add","classes","DROPDOWN","DROPUP","hideDropZone","remove","drop","event","targetCall","dispatch"],"mappings":"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\/B,SAAUgC"}