Sindbad~EG File Manager
{"version":3,"file":"section_asset_management.min.js","sources":["../src/section_asset_management.js"],"sourcesContent":["/**\n * 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 <http://www.gnu.org/licenses/>.\n *\n * @package\n * @copyright Copyright (c) 2015 Open LMS (https://www.openlms.net)\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/log', 'core/ajax', 'core/str', 'core/templates', 'core/notification',\n 'theme_snap/util', 'theme_snap/ajax_notification', 'theme_snap/footer_alert',\n 'core_filters/events', 'core/fragment'],\n function($, log, ajax, str, templates, notification, util, ajaxNotify, footerAlert, Event, fragment) {\n\n var self = this;\n\n /**\n * Items being moved - actual dom elements.\n * @type {array}\n */\n var movingObjects = [];\n\n /**\n * Item being moved - actual dom element.\n * @type {object}\n */\n var movingObject;\n\n /**\n * @type {boolean}\n */\n var ajaxing = false;\n\n var ajaxTracker;\n\n /**\n * Sections that are being retrieved by the API.\n * @type {Array}\n */\n var sectionsProcess = [];\n\n /**\n * Module html caching.\n * @type {object|null}\n */\n var moduleCache = null;\n\n /**\n * Progress caching.\n * @type {Array|null}\n */\n var progressCache = null;\n\n /**\n * Sets observers for the TOC elements.\n */\n var setTocObservers = function () {\n if (self.courseConfig.format == 'weeks' || self.courseConfig.format == 'topics') {\n $('#course-toc .chapter-title').click(function(e) {\n var link = $(e.target);\n var section = link.attr('href');\n if (typeof section != 'undefined' && section.length > 0) {\n getSection(section.split('#section-')[1], 0);\n }\n });\n\n $('#toc-searchables li a').click(function(e) {\n var link = $(e.target);\n var urlParams = link.attr('href').split(\"&\"),\n section = urlParams[0],\n mod = urlParams[1] || null;\n section = section.split('#section-')[1];\n getSection(section, mod);\n });\n }\n };\n\n /**\n * Sets observers for the navigation arrows.\n */\n var setNavigationFooterObservers = function () {\n if (self.courseConfig.format == 'weeks' || self.courseConfig.format == 'topics') {\n $('.section_footer .next_section, .section_footer .icon-arrow-right, ' +\n '.section_footer .previous_section, .section_footer .icon-arrow-left').click(function(e) {\n var link = $(e.target);\n var section = link.attr('section-number');\n if(typeof section !== 'undefined' && section.length > 0) {\n getSection(section, 0);\n }\n });\n\n $('.section_footer .text').click(function (e) {\n var node = $(e.target);\n var section = node.find('.nav_guide').attr('section-number');\n if(typeof section !== 'undefined' && section.length > 0) {\n getSection(section, 0);\n }\n });\n }\n };\n\n /**\n * Scroll to a mod via search.\n * @param {string} modid\n */\n var scrollToModule = function(modid) {\n // Sometimes we have a hash, sometimes we don't.\n // Strip hash then add just in case.\n $('#toc-search-results').html('');\n var targmod = $(\"#\" + modid.replace('#', ''));\n // http://stackoverflow.com/questions/6677035/jquery-scroll-to-element\n util.scrollToElement(targmod);\n\n var searchpin = $(\"#searchpin\");\n if (!searchpin.length) {\n searchpin = $('<i id=\"searchpin\"></i>');\n }\n\n $(targmod).find('.instancename').prepend(searchpin);\n $(targmod).attr('tabindex', '-1').focus();\n $('#course-toc').removeClass('state-visible');\n };\n\n /**\n * Update moving message.\n */\n var updateMovingMessage = function() {\n var title;\n if (movingObjects.length === 1) {\n var assetname = $(movingObjects[0]).find('.snap-asset-link .instancename').html();\n assetname = assetname || M.util.get_string('pluginname', 'label', assetname);\n title = M.util.get_string('moving', 'theme_snap', assetname);\n } else {\n title = M.util.get_string('movingcount', 'theme_snap', movingObjects.length);\n }\n footerAlert.setTitle(title);\n };\n\n /**\n * Updates the drop zone with a descriptive text.\n * @param {string} sectionName\n */\n var updateSectionDropMsg = function (sectionName) {\n if (typeof movingObjects !== 'undefined' && movingObjects.length > 0) {\n $('.section-drop').each(function() {\n var sectionDropMsg = M.util.get_string('movingdropsectionhelp', 'theme_snap',\n {moving: sectionName, before: $(this).data('title')}\n );\n $(this).html(sectionDropMsg);\n });\n footerAlert.setSrNotice(M.util.get_string('movingstartedhelp', 'theme_snap', sectionName));\n\n }\n };\n\n /**\n * Gets a specific section for the current course and if an activity module is passed sets focus on it.\n * @param {string} section\n * @param {string} mod\n */\n var getSection = function (section, mod) {\n var node = $('#section-' + section);\n if (node.length == 0 && sectionsProcess.indexOf(section) == -1) {\n sectionsProcess.push(section);\n var params = {courseid: self.courseConfig.id, section: section};\n $('.sk-fading-circle').show();\n // We need to prevent the DOM to show the default section.\n $('.course-content .' + self.courseConfig.format + ' li[id^=\"section-\"]').hide();\n fragment.loadFragment('theme_snap', 'section', self.courseConfig.contextid, params).done(function(html, js) {\n var node = $(html);\n renderSection(section, node, mod, js);\n\n var folders = node.find('li.snap-activity.modtype_folder');\n $.each(folders, function (index, folder) {\n var content = $(folder).find('div.contentwithoutlink div.snap-assettype');\n if (content.length > 0) {\n if ($(folder).find('div.activityinstance div.snap-header-card .asset-type').length == 0) {\n var folderAssetTypeHeader = $(folder).find('div.activityinstance div.snap-header-card');\n content.prependTo(folderAssetTypeHeader);\n }\n }\n });\n });\n }\n };\n\n /**\n * This functions inserts a section node to the DOM.\n * @param {string} section\n * @param {node} html\n * @param {string} mod\n * @param {string} js\n */\n var renderSection = function(section, html, mod, js) {\n var anchor = $('.course-content');\n var existingSections = [];\n anchor.find('li[id^=section-]').each(function() {\n existingSections.push(parseInt($(this).attr('id').split('section-')[1]));\n });\n var tempnode = $('<div></div>');\n templates.replaceNodeContents(tempnode, html, '');\n\n // Remove from Dom the completion tracking when it is disabled for an activity.\n tempnode.find('.snap-header-card .snap-header-card-icons .disabled-snap-asset-completion-tracking').remove();\n if (existingSections.length > 0) {\n var closest = existingSections.reduce(function(prev, curr) {\n return (Math.abs(curr - section) < Math.abs(prev - section) ? curr : prev);\n });\n\n if (closest > section) {\n anchor.find('#section-' + closest).before(tempnode.find('li[id^=\"section-\"]'));\n\n } else {\n anchor.find('#section-' + closest).after(tempnode.find('li[id^=\"section-\"]'));\n\n }\n } else {\n $('.sk-fading-circle').after(tempnode);\n }\n templates.runTemplateJS(js);\n\n // Hide loading animation.\n $('.sk-fading-circle').hide();\n // Notify filters about the new section.\n Event.notifyFilterContentUpdated($('.course-content .' + self.courseConfig.format));\n var sections = anchor.find('li[id^=\"section-\"]');\n // When not present the section, the first one will be shown as default, remove all classes to prevent that.\n sections.removeClass('state-visible');\n var id = '#section-' + section;\n $(id).addClass('state-visible');\n if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && section > 0) {\n var title = $(id).find('.sectionname').html();\n var elements = $('.chapter-title');\n var tmpid = 0;\n // Find the right toc element.\n $.each(elements, function(key, element) {\n if ($(element).attr('href').split('#section-')[1] == section) {\n tmpid = key;\n }\n });\n $(id).find('.sectionname').html(title);\n $(id).find('.sectionnumber').html(tmpid + '.');\n }\n // Leave all course sections as they were.\n sections.show();\n $(id).find('.section_footer .next_section, .section_footer .icon-arrow-right, ' +\n '.section_footer .previous_section, .section_footer .icon-arrow-left').click(function(e) {\n var link = $(e.target);\n var section = link.attr('section-number');\n if(typeof section !== 'undefined' && section.length > 0) {\n getSection(section, 0);\n }\n });\n\n $(id).find('.section_footer .text').click(function (e) {\n var node = $(e.target);\n var section = node.find('.nav_guide').attr('section-number');\n if(typeof section !== 'undefined' && section.length > 0) {\n getSection(section, 0);\n }\n });\n\n // Set observer for mod chooser.\n $(id + ' .section-modchooser-link').click(function() {\n // Grab the section number from the button.\n var sectionNum = $(this).attr('data-sectionid');\n $('.snap-modchooser-addlink').each(function() {\n // Update section in mod link to current section.\n var newLink = this.href.replace(/(section=)[0-9]+/ig, '$1' + sectionNum);\n $(this).attr('href', newLink);\n });\n });\n\n // If a module id has been passed as parameter, set focus.\n if (mod != 0 && typeof mod !== 'undefined') {\n scrollToModule(mod);\n }\n var sectionName = $('#region-main .section-moving').find('.sectionname').text();\n if (typeof sectionName !== 'undefined' && sectionName.length > 0) {\n updateSectionDropMsg(sectionName);\n }\n\n var movingId = $('#region-main .section-moving').attr('id');\n if (typeof movingId !== 'undefined' && movingId.length > 0) {\n $('#section-' + (parseInt(movingId.split('section-')[1]) + 1) +\n ' .snap-drop.section-drop').removeClass('partial-render');\n }\n\n $('#course-toc #chapters li').removeClass('snap-visible-section');\n // Set link as current.\n $('#course-toc .chapter-title[href=\"#section-'+ section +'\"]').parent('li').addClass('snap-visible-section');\n $(id).find('ul.section').append(\n '<li class=\"snap-drop asset-drop\">' +\n '<div class=\"asset-wrapper\">' +\n '<a href=\"#\">' +\n M.util.get_string('movehere', 'theme_snap') +\n '</a>' +\n '</div>' +\n '</li>');\n };\n\n\n\n return {\n init: function(courseLib) {\n\n self.courseConfig = courseLib.courseConfig;\n\n /**\n * AJAX tracker class - for tracking chained AJAX requests (prevents behat intermittent faults).\n * Also, sets and unsets ajax classes on trigger element / child of trigger if specified.\n */\n var AjaxTracker = function() {\n\n var triggersByKey = {};\n\n /**\n * Starts tracking.\n * @param {string} jsPendingKey\n * @param {domElement} trigger\n * @param {string} subSelector\n * @returns {boolean}\n */\n this.start = function(jsPendingKey, trigger, subSelector) {\n if (this.ajaxing(jsPendingKey)) {\n log.debug('Skipping ajax request for ' + jsPendingKey + ', AJAX already in progress');\n return false;\n }\n M.util.js_pending(jsPendingKey);\n triggersByKey[jsPendingKey] = {trigger: trigger, subSelector: subSelector};\n if (trigger) {\n if (subSelector) {\n $(trigger).find(subSelector).addClass('ajaxing');\n } else {\n $(trigger).addClass('ajaxing');\n }\n }\n return true;\n };\n\n /**\n * Is there an AJAX request in progress.\n * @param {string} jsPendingKey\n * @returns {boolean}\n */\n this.ajaxing = function(jsPendingKey) {\n return M.util.pending_js.indexOf(jsPendingKey) > -1;\n };\n\n /**\n * Completes tracking.\n * @param {string} jsPendingKey\n */\n this.complete = function(jsPendingKey) {\n var trigger, subSelector;\n if (triggersByKey[jsPendingKey]) {\n trigger = triggersByKey[jsPendingKey].trigger;\n subSelector = triggersByKey[jsPendingKey].subSelector;\n }\n if (trigger) {\n if (subSelector) {\n $(trigger).find(subSelector).removeClass('ajaxing');\n } else {\n $(trigger).removeClass('ajaxing');\n }\n }\n delete triggersByKey[jsPendingKey];\n M.util.js_complete(jsPendingKey);\n };\n };\n\n ajaxTracker = new AjaxTracker();\n\n /**\n * Get the section number from a section element.\n * @param {jQuery|object} el\n * @returns {number}\n */\n var sectionNumber = function(el) {\n if (self.courseConfig.partialrender) {\n return (parseInt($(el).attr('id').split('section-')[1]));\n } else {\n return (parseInt($(el).attr('id').replace('section-', '')));\n }\n };\n\n /**\n * Get the section number for an element within a section.\n * @param {object} el\n * @returns {number}\n */\n var parentSectionNumber = function(el) {\n return sectionNumber($(el).parents('li.section.main')[0]);\n };\n\n /**\n * Moving has stopped, clean up.\n */\n var stopMoving = function() {\n $('body').removeClass('snap-move-inprogress');\n $('body').removeClass('snap-move-section');\n $('body').removeClass('snap-move-asset');\n footerAlert.hideAndReset();\n $('.section-moving').removeClass('section-moving');\n $('.asset-moving').removeClass('asset-moving');\n $('.snap-asset a').removeAttr('tabindex');\n $('.snap-asset button').removeAttr('disabled');\n $('.js-snap-asset-move').removeAttr('checked');\n movingObjects = [];\n if (self.courseConfig.partialrender) {\n $('.snap-drop.section-drop').addClass('partial-render');\n }\n };\n\n /**\n * Move fail - sad face :(.\n */\n var moveFailed = function() {\n var actname = $(movingObject).find('.instancename').html();\n\n footerAlert.removeAjaxLoading();\n footerAlert.setTitle(M.util.get_string('movefailed', 'theme_snap', actname));\n // Stop moving in 2 seconds so that the user has time to see the failed moving notice.\n window.setTimeout(function() {\n // Don't pass in target, we want to abort the move!\n stopMoving(false);\n }, 2000);\n };\n\n /**\n * Remove moving object from moving objects array.\n * @param {object} obj\n */\n var removeMovingObject = function(obj) {\n var index = movingObjects.indexOf(obj);\n if (index > -1) {\n movingObjects.splice(index, 1);\n }\n updateMovingMessage();\n };\n\n /**\n * General move request\n *\n * @param {object} params\n * @param {function} onSuccess\n * @param {bool} finalItem\n */\n var ajaxReqMoveGeneral = function(params, onSuccess, finalItem) {\n if (ajaxing) {\n // Request already made.\n log.debug('Skipping ajax request, one already in progress');\n return;\n }\n\n // Add spinner.\n footerAlert.addAjaxLoading();\n\n // Set common params.\n params.sesskey = M.cfg.sesskey;\n params.courseId = courseLib.courseConfig.id;\n params.field = 'move';\n\n log.debug('Making course/rest.php request', params);\n var req = $.ajax({\n type: \"POST\",\n async: true,\n data: params,\n url: M.cfg.wwwroot + courseLib.courseConfig.ajaxurl\n });\n req.done(function(data) {\n ajaxNotify.ifErrorShowBestMsg(data).done(function(errorShown) {\n if (errorShown) {\n log.debug('Ajax request fail');\n moveFailed();\n return;\n } else {\n // No errors, call success callback and stop moving if necessary.\n log.debug('Ajax request successful');\n if (onSuccess) {\n onSuccess();\n }\n if (finalItem) {\n if (params.class === 'resource') {\n // Only stop moving for resources, sections handle this later once the TOC is reloaded.\n stopMoving();\n $(movingObject).find('label.snap-asset-move > input.js-snap-asset-move').focus();\n }\n }\n }\n });\n });\n req.fail(function() {\n moveFailed();\n });\n\n if (finalItem) {\n req.always(function() {\n ajaxing = false;\n footerAlert.removeAjaxLoading();\n });\n }\n };\n\n /**\n * Get section title.\n * @param {integer} section\n * @returns {*|jQuery}\n */\n var getSectionTitle = function(section) {\n // Get title from TOC.\n if (self.courseConfig.partialrender) {\n return $('#course-toc #chapters > h3 li a[href=\"#section-' + section + '\"]').text();\n } else {\n return $('#chapters h3:nth-of-type(' + (section + 1) + ') .chapter-title').html();\n }\n };\n\n /**\n * Update next / previous links.\n * @param {string} selector\n * @return {promise}\n */\n var updateSectionNavigation = function(selector) {\n var dfd = $.Deferred();\n var sections, totalSectionCount;\n if (!selector) {\n if (self.courseConfig.partialrender) {\n selector = '#course-toc #chapters > h3 li a';\n } else {\n selector = '#region-main .course-content > ul li.section';\n }\n sections = $(selector);\n totalSectionCount = sections.length;\n } else {\n sections = $(selector);\n if (self.courseConfig.partialrender) {\n var allSections = $('#course-toc #chapters > h3 li a');\n } else {\n var allSections = $('#region-main .course-content > ul li.section');\n }\n totalSectionCount = allSections.length;\n }\n\n var completed = 0;\n $.each(sections, function(idx, el) {\n if (self.courseConfig.partialrender) {\n var href = $(el).attr('href');\n var sectionNum;\n if (typeof href !== typeof undefined && href !== false) {\n sectionNum = parseInt($(el).attr('href').split('#section-')[1]);\n } else {\n sectionNum = parseInt($(el).attr('id').split('section-')[1]);\n }\n } else {\n var sectionNum = sectionNumber(el);\n }\n var previousSection = sectionNum - 1;\n var nextSection = sectionNum + 1;\n var previous = false;\n var next = false;\n var hidden, extraclasses;\n if (previousSection > -1) {\n if (self.courseConfig.partialrender) {\n hidden = $('#section-' + previousSection).hasClass('draft');\n } else {\n hidden = $('#section-' + previousSection).hasClass('hidden');\n }\n extraclasses = hidden ? ' dimmed_text' : '';\n previous = {\n section: previousSection,\n title: getSectionTitle(previousSection),\n classes: extraclasses\n };\n }\n if (nextSection < totalSectionCount) {\n if (self.courseConfig.partialrender) {\n hidden = $('#section-' + nextSection).hasClass('draft');\n } else {\n hidden = $('#section-' + nextSection).hasClass('hidden');\n }\n extraclasses = hidden ? ' dimmed_text' : '';\n next = {\n section: nextSection,\n title: getSectionTitle(nextSection),\n classes: extraclasses\n };\n }\n var navigation = {\n previous: previous,\n next: next\n };\n templates.render('theme_snap/course_section_navigation', navigation)\n .done(function(result) {\n var target = $('#section-' + sectionNum + ' .section_footer');\n if (target.length > 0) {\n target.replaceWith(result);\n }\n completed++;\n if (completed === sections.length) {\n dfd.resolve();\n }\n });\n\n });\n return dfd.promise();\n };\n\n /**\n * Calculates how the sections are ordered after moving.\n * @param {array} sections\n * @param {int} oldIndex\n * @param {int} newIndex\n * @returns {array}\n */\n var calculateSections = function (sections, oldIndex, newIndex) {\n if (newIndex >= sections.length) {\n var k = newIndex - sections.length + 1;\n while (k--) {\n sections.push(undefined);\n }\n }\n sections.splice(newIndex, 0, sections.splice(oldIndex, 1)[0]);\n return sections;\n };\n\n /**\n * Update sections.\n * @param {int} current\n * @param {int} target\n * @param {array} predeleteSections\n * @param {string} deletedSection\n */\n var updateSections = function(current, target, predeleteSections, deletedSection) {\n if (courseLib.courseConfig.partialrender) {\n var loadedSections = [];\n var sections = [];\n if (current != 0 && target != 0) {\n $.each($('#course-toc #chapters > li a'), function (idx, obj) {\n sections.push($(obj).attr('href').split('#section-')[1]);\n });\n var newOrder = calculateSections(sections, current, target);\n } else {\n sections = predeleteSections;\n predeleteSections.splice(deletedSection, 1);\n var newOrder = predeleteSections;\n }\n $.each($('#region-main .course-content > ul li.section'), function(idx, obj) {\n var value = $(obj).attr('id').split('section-')[1];\n var key = newOrder.indexOf(value);\n var chapterTitle = getSectionTitle(key);\n var fullTitle = chapterTitle;\n $(obj).attr('id', 'section-' + key);\n if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && key > 0) {\n fullTitle = `<span class='sectionnumber'> ${key}.</span>${chapterTitle}`;\n }\n $('#section-' + key + ' .content .sectionname').html(fullTitle);\n loadedSections.push(key);\n // Update the attribute.\n $(obj).find('.section-modchooser-link').attr('data-sectionid', key);\n });\n sectionsProcess = loadedSections;\n } else {\n // Renumber section ids, rename section titles.\n $.each($('#region-main .course-content > ul li.section'), function(idx, obj) {\n $(obj).attr('id', 'section-' + idx);\n // Get title from TOC (note that its idx + 1 because first entry is\n // introduction.\n var chapterTitle = getSectionTitle(idx);\n // Update section title with corresponding TOC title - this is necessary\n // for weekly topic courses where the section title needs to stay the\n // same as the TOC.\n var fullTitle = chapterTitle;\n if (self.courseConfig.toctype == 'top' && self.courseConfig.format == 'topics' && idx > 0) {\n fullTitle = `<span class='sectionnumber'></span>${chapterTitle}`;\n }\n $('#section-' + idx + ' .content .sectionname').html(fullTitle);\n // Update section data attribute to reflect new section idx.\n $(this).find('.section-modchooser-link').attr('data-sectionid', idx);\n });\n }\n\n updateSectionNavigation().done(function() {\n if (courseLib.courseConfig.partialrender) {\n setCourseSectionObervers();\n }\n });\n };\n\n /**\n * Delete section dialog and confirm function.\n * @param {object} e\n * @param {object} el\n */\n var sectionDelete = function(e, el) {\n e.preventDefault();\n var sectionNum = parentSectionNumber(el);\n var section = $('#section-' + sectionNum);\n var sectionName = section.find('.sectionname').text();\n\n /**\n * Delete section.\n */\n var doDelete = function() {\n\n if (!ajaxTracker.start('section_delete', el)) {\n // Already in progress.\n return;\n }\n\n var delProgress = M.util.get_string('deletingsection', 'theme_snap', sectionName);\n\n footerAlert.addAjaxLoading('');\n footerAlert.show();\n footerAlert.setTitle(delProgress);\n\n var params = {\n courseshortname: courseLib.courseConfig.shortname,\n action: 'delete',\n sectionnumber: sectionNum,\n value: 1,\n loadmodules: true,\n };\n\n log.debug('Making course/rest.php section delete request', params);\n\n // Make ajax call.\n var ajaxPromises = ajax.call([\n {\n methodname: 'theme_snap_course_sections',\n args: params\n }\n ], true, true);\n var sections = [];\n $.each($('#course-toc #chapters > li a'), function (idx, obj) {\n sections.push($(obj).attr('href').split('#section-')[1]);\n });\n // Handle ajax promises.\n ajaxPromises[0]\n .done(function(response) {\n // Update TOC.\n templates.render('theme_snap/course_toc', response.toc)\n .done(function(result) {\n $('#course-toc').html($(result).html());\n $(document).trigger('snapTOCReplaced');\n // Remove section from DOM.\n section.remove();\n updateSections(0, 0, sections, sectionNum);\n // Current section no longer exists so change location to previous section.\n if (self.courseConfig.partialrender) {\n var chapters = $('.chapter-title');\n var ids = [];\n $.each(chapters, function (key, element) {\n ids.push($(element).attr('href').split('#section-')[1]);\n });\n var closest = ids.reduce(function(prev, curr) {\n return (Math.abs(curr - sectionNum) < Math.abs(prev - sectionNum) ? curr : prev);\n });\n location.hash = 'section-' + closest;\n if ($('li#section-' + closest).length == 1) {\n courseLib.showSection();\n } else {\n getSection(closest, 0);\n }\n } else {\n if (sectionNum >= $('.course-content > ul li.section').length) {\n location.hash = 'section-' + (sectionNum - 1);\n }\n courseLib.showSection();\n }\n // We can't complete the action in the 'always' section because we want it to\n // definitely be called after the section is removed from the DOM.\n ajaxTracker.complete('section_delete');\n })\n .always(function() {\n // Allow another request now this has finished.\n footerAlert.hideAndReset();\n })\n .fail(function() {\n ajaxTracker.complete('section_delete');\n });\n })\n .fail(function(response) {\n ajaxNotify.ifErrorShowBestMsg(response);\n footerAlert.hideAndReset();\n // Allow another request now this has finished.\n ajaxTracker.complete('section_delete');\n });\n };\n\n var delTitle = M.util.get_string('confirm', 'moodle');\n var delConf = M.util.get_string('confirmdeletesection', 'moodle', sectionName);\n var ok = M.util.get_string('deletesectionconfirm', 'theme_snap');\n var cancel = M.util.get_string('cancel', 'moodle');\n notification.confirm(delTitle, delConf, ok, cancel, doDelete);\n };\n\n /**\n * Generic action handler for all asset actions.\n * @param {event} e\n * @param {domNode} triggerEl\n */\n var assetAction = function(e, triggerEl) {\n e.preventDefault();\n\n var assetEl = $($(triggerEl).parents('.snap-asset')[0]),\n cmid = Number(assetEl[0].id.replace('module-', '')),\n instanceName = assetEl.find('.instancename').text().trim(),\n action = $(triggerEl).data('action'),\n errActionKey = '',\n errMessageKey = '',\n errAction = '',\n errMessage = '',\n jsPendingKey = 'asset_' + action;\n\n if (ajaxTracker.ajaxing(jsPendingKey)) {\n // Already in progress.\n // We check this because we don't want to show the confirmation dialog when in progress.\n return;\n }\n\n var actionAJAX = function() {\n if (!ajaxTracker.start(jsPendingKey, assetEl, '.snap-edit-asset-more')) {\n // Request already made.\n return;\n }\n\n var params = {\n 'action': action,\n 'sectionreturn': 0,\n 'id': cmid\n };\n\n ajax.call([\n {\n methodname: 'core_course_edit_module',\n args: params\n }\n ], true, true)[0]\n .done(function(response) {\n ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function(errorShown) {\n ajaxTracker.complete(jsPendingKey);\n if (errorShown) {\n log.debug('Ajax request fail');\n return;\n } else {\n log.debug('Ajax request successful');\n\n // Reset module cache.\n moduleCache = null;\n progressCache = null;\n if (action === 'delete') {\n // Remove asset from DOM.\n assetEl.remove();\n // Remove asset searchable.\n $('#toc-searchables li[data-id=\"' + cmid + '\"]').remove();\n } else if (action === 'show') {\n assetEl.removeClass('draft');\n assetEl.removeClass('stealth');\n } else if (action === 'hide') {\n assetEl.removeClass('stealth');\n assetEl.addClass('draft');\n } else if (action === 'duplicate') {\n assetEl.replaceWith(response);\n } else if (action === 'stealth') {\n assetEl.addClass('stealth');\n assetEl.removeClass('draft');\n }\n }\n });\n })\n .fail(function(response) {\n ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n ajaxTracker.complete(jsPendingKey);\n });\n })\n .always(function() {\n footerAlert.hideAndReset();\n });\n };\n\n /**\n * Get error strings incase of AJAX failure.\n * @returns {*|Promise}\n */\n var getErrorStrings = function() {\n if (action === 'duplicate') {\n errActionKey = 'action:duplicateasset';\n errMessageKey = 'error:failedtoduplicateasset';\n } else if (action === 'show' || action === 'hide') {\n errActionKey = 'action:changeassetvisibility';\n errMessageKey = 'error:failedtochangeassetvisibility';\n } else if (action === 'delete') {\n errActionKey = 'action:deleteasset';\n errMessageKey = 'error:failedtodeleteasset';\n }\n return str.get_strings([\n {key: errActionKey, component: 'theme_snap'},\n {key: errMessageKey, component: 'theme_snap'}\n ]);\n };\n\n getErrorStrings().then(function(strings) {\n errAction = strings[0];\n errMessage = strings[0];\n if (action === 'delete') {\n // Create confirmation strings.\n var delConf = '',\n plugindata = {\n type: M.util.get_string('pluginname', assetEl.attr('class').match(/modtype_([^\\s]*)/)[1])\n };\n if (instanceName !== '') {\n plugindata.name = instanceName;\n delConf = M.util.get_string('deletechecktypename', 'moodle', plugindata);\n } else {\n delConf = M.util.get_string('deletechecktype', 'moodle', plugindata);\n }\n\n var delTitle = M.util.get_string('confirm', 'moodle');\n var ok = M.util.get_string('deleteassetconfirm', 'theme_snap', plugindata.type);\n var cancel = M.util.get_string('cancel', 'moodle');\n notification.confirm(delTitle, delConf, ok, cancel, actionAJAX);\n } else {\n actionAJAX();\n }\n });\n };\n\n /**\n * Ajax request to move asset to target.\n * @param {object} target\n */\n var ajaxReqMoveAsset = function(target) {\n var params = {};\n\n log.debug('Move objects', movingObjects);\n\n // Prepare request parameters\n params.class = 'resource';\n\n updateMovingMessage();\n\n movingObject = movingObjects.shift();\n\n params.id = Number(movingObject.id.replace('module-', ''));\n\n if (target && !$(target).hasClass('snap-drop')) {\n params.beforeId = Number($(target)[0].id.replace('module-', ''));\n } else {\n params.beforeId = 0;\n }\n\n if (document.body.id === \"page-site-index\") {\n params.sectionId = 1;\n } else {\n if (target) {\n params.sectionId = parentSectionNumber(target);\n } else {\n params.sectionId = parentSectionNumber(movingObject);\n }\n }\n\n if (movingObjects.length > 0) {\n ajaxReqMoveGeneral(params, function() {\n $(target).before($(movingObject));\n // recurse\n ajaxReqMoveAsset(target);\n }, false);\n } else {\n ajaxReqMoveGeneral(params, function() {\n $(target).before($(movingObject));\n }, true);\n }\n\n };\n\n /**\n * Ajax request to move section to target.\n * @param {str|object} dropzone\n */\n var ajaxReqMoveSection = function(dropzone) {\n var domTargetSection = parentSectionNumber(dropzone);\n var currentSection = sectionNumber(movingObjects[0]);\n var targetSection = currentSection < domTargetSection ?\n domTargetSection - 1 :\n domTargetSection;\n\n var params = {\n \"class\": 'section',\n id: currentSection,\n value: targetSection\n };\n\n ajaxReqMoveGeneral(params, function() {\n\n // Update TOC chapters.\n ajax.call([\n {\n methodname: 'theme_snap_course_toc_chapters',\n args: {\n courseshortname: courseLib.courseConfig.shortname\n },\n done: function(response) {\n // Update TOC.\n templates.render('theme_snap/course_toc_chapters', response.chapters)\n .done(function(result) {\n // Update chapters.\n $('#chapters').replaceWith(result);\n\n // Move current section before target section.\n $('#section-' + domTargetSection).before($('#section-' + currentSection));\n\n // Update section ids, next previous links, etc.\n updateSections(currentSection, targetSection, [], null);\n\n // Navigate to section in its new location.\n location.hash = 'section-' + targetSection;\n courseLib.showSection();\n\n // Finally, we have finished moving the section!\n stopMoving();\n });\n },\n fail: function(response) {\n ajaxNotify.ifErrorShowBestMsg(response);\n stopMoving();\n }\n }\n ], true, true);\n\n }, true);\n };\n\n /**\n * Listen for edit action clicks, hide, show, duplicate, etc..\n */\n var assetEditListeners = function() {\n var actionSelectors = '.snap-asset-actions .js_snap_hide, ';\n actionSelectors += '.snap-asset-actions .js_snap_show, ';\n actionSelectors += '.snap-asset-actions .js_snap_delete, ';\n actionSelectors += '.snap-asset-actions .js_snap_duplicate,';\n actionSelectors += '.snap-asset-actions .js_snap_stealth';\n\n $(document).on('click', actionSelectors, function(e) {\n assetAction(e, this);\n });\n };\n\n /**\n * Generic section action handler.\n *\n * @param {string} action visibility, highlight\n * @param {null|function} onComplete for when completed.\n */\n var sectionActionListener = function(action, onComplete) {\n\n $('#region-main').on('click', '.snap-section-editing.actions .snap-' + action, function(e) {\n\n e.stopPropagation();\n e.preventDefault();\n\n var trigger = this;\n\n /**\n * Invalid section action exception.\n *\n * @param {string} action\n */\n var InvalidActionException = function(action) {\n this.message = 'Invalid section action: ' + action;\n this.name = 'invalidActionException';\n };\n\n // Check action is valid.\n var validactions = ['visibility', 'highlight'];\n if (validactions.indexOf(action) === -1) {\n throw new InvalidActionException(action);\n }\n\n if (!ajaxTracker.start('section_' + action, trigger)) {\n // Request already in progress.\n return;\n }\n\n // For toggling visibility.\n var toggle, loadModules = true;\n if (action === 'visibility') {\n toggle = $(this).hasClass('snap-hide') ? 0 : 1;\n if (moduleCache && moduleCache.length > 0 && progressCache && progressCache.length > 0) {\n loadModules = false;\n }\n } else {\n // For toggling highlight/mark as current.\n toggle = $(this).attr('aria-pressed') === 'true' ? 0 : 1;\n }\n var sectionNumber = parentSectionNumber(this);\n var sectionActionsSelector = '#section-' + sectionNumber + ' .snap-section-editing';\n var actionSelector = sectionActionsSelector + ' .snap-' + action;\n\n // Make ajax call.\n var ajaxPromises = ajax.call([\n {\n methodname: 'theme_snap_course_sections',\n args : {\n courseshortname: courseLib.courseConfig.shortname,\n action: action,\n sectionnumber: sectionNumber,\n value: toggle,\n loadmodules: loadModules,\n }\n }\n ], true, true);\n\n // Handle ajax promises.\n ajaxPromises[0]\n .fail(function(response) {\n var errMessage, errAction;\n if (action === 'visibility') {\n errMessage = M.util.get_string('error:failedtochangesectionvisibility', 'theme_snap');\n errAction = M.util.get_string('action:changesectionvisibility', 'theme_snap');\n } else {\n errMessage = M.util.get_string('error:failedtohighlightsection', 'theme_snap');\n errAction = M.util.get_string('action:highlightsectionvisibility', 'theme_snap');\n }\n ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n // Allow another request now this has finished.\n ajaxTracker.complete('section_' + action);\n });\n }).always(function() {\n $(trigger).removeClass('ajaxing');\n }).done(function(response) {\n // Update section action and then reload TOC.\n return templates.render('theme_snap/course_action_section', response.actionmodel)\n .then(function(result) {\n $(actionSelector).replaceWith(result);\n $(actionSelector).focus();\n // Update TOC.\n if (!loadModules) {\n if (moduleCache && moduleCache.length > 0 && response.toc.modules.length === 0) {\n // Modules not loaded on request. Replacing them on the toc.\n response.toc.modules = moduleCache;\n }\n\n if (progressCache && progressCache.length > 0) {\n var progressCacheCopy = progressCache.slice(0);\n $.each(response.toc.chapters.chapters, function(index) {\n response.toc.chapters.chapters[index].progress = progressCacheCopy.shift();\n });\n }\n }\n\n if (loadModules) {\n // Caching modules for future use.\n moduleCache = response.toc.modules;\n\n // Caching progress for future use.\n progressCache = [];\n $.each(response.toc.chapters.chapters, function(index, value) {\n progressCache.push(value.progress);\n });\n }\n\n return templates.render('theme_snap/course_toc', response.toc);\n }).then(function(result) {\n $('#course-toc').html($(result).html());\n $(document).trigger('snapTOCReplaced');\n if (onComplete && typeof (onComplete) === 'function') {\n var completion = onComplete(sectionNumber, toggle);\n if (self.courseConfig.partialrender) {\n if (typeof onComplete === 'function') {\n ajaxTracker.complete('section_' + action);\n }\n } else {\n if (completion && typeof (completion.always) === 'function') {\n // Callback returns a promise, js no longer running.\n completion.always(\n function() {\n // Allow another request now this has finished.\n ajaxTracker.complete('section_' + action);\n }\n );\n } else {\n // Callback does not return a promise, js no longer running.\n // Allow another request now this has finished.\n ajaxTracker.complete('section_' + action);\n }\n }\n } else {\n // Allow another request now this has finished.\n ajaxTracker.complete('section_' + action);\n }\n });\n });\n });\n };\n\n /**\n * Highlight section on click.\n */\n var highlightSectionListener = function() {\n sectionActionListener('highlight', function(sectionNumber) {\n $('#section-' + sectionNumber).toggleClass('current');\n\n // Reset sections which are not highlighted.\n var $notCurrent = $('li.section.main')\n .not('#section-' + sectionNumber)\n .not('#section-0').removeClass(\"current\");\n\n $notCurrent.each(function() {\n var highlighter = $(this).find('.snap-highlight');\n var sectionNumber = parentSectionNumber(highlighter);\n var newLink = $(highlighter).attr('href').replace(/(marker=)[0-9]+/ig, '$1' + sectionNumber);\n $(highlighter).attr('href', newLink).attr('aria-pressed', 'false');\n });\n });\n };\n\n /**\n * Delete section on click.\n */\n var deleteSectionListener = function() {\n $(document).on('click', '.snap-section-editing.actions .snap-delete', function(e) {\n sectionDelete(e, this);\n });\n };\n\n /**\n * Toggle section visibility on click.\n */\n var toggleSectionListener = function() {\n /**\n * Toggle hidden class and update section navigation.\n * @param {number} sectionNumber\n * @param {boolean} toggle\n * @returns {Promise}\n */\n var manageHiddenClass = function(sectionNumber, toggle) {\n if (toggle === 0) {\n $('#section-' + sectionNumber).addClass('hidden');\n } else {\n $('#section-' + sectionNumber).removeClass('hidden');\n $('#section-' + sectionNumber + ' .stealth-section-hidden').removeClass('stealth');\n $('#section-' + sectionNumber + ' .stealth-section-hidden').removeClass('stealth-section-hidden');\n }\n\n // Update the section navigation either side of the current section.\n var selectors = [\n '#section-' + (sectionNumber - 1),\n '#section-' + (sectionNumber + 1)\n ];\n var selector = selectors.join(',');\n return updateSectionNavigation(selector);\n };\n sectionActionListener('visibility', manageHiddenClass);\n };\n\n /**\n * Show footer alert for moving.\n *\n * @param {domNode} focusEl The element to be focused after this callback.\n */\n var footerAlertShowMove = function(focusEl = null) {\n footerAlert.show(function(e) {\n e.preventDefault();\n stopMoving();\n if (focusEl !== null) {\n focusEl.focus();\n }\n });\n };\n\n /**\n * When section move link is clicked, get the data we need and start the move.\n */\n var moveSectionListener = function() {\n // Listen clicks on move links.\n $(\"#region-main\").on('click', '.snap-section-editing.actions .snap-move', function(e) {\n e.stopPropagation();\n e.preventDefault();\n\n $('body').addClass('snap-move-inprogress');\n footerAlertShowMove();\n\n // Moving a section.\n var sectionNumber = parentSectionNumber(this);\n log.debug('Section is', sectionNumber);\n var section = $('#section-' + sectionNumber);\n var sectionName = section.find('.sectionname').text();\n\n log.debug('Moving this section', sectionName);\n movingObjects = [section];\n // This should never happen, but just in case...\n $('.section-moving').removeClass('section-moving');\n section.addClass('section-moving');\n $('a[href=\"#section-' + sectionNumber + '\"]').parent('li').addClass('section-moving');\n $('body').addClass('snap-move-section');\n if (self.courseConfig.partialrender) {\n $('#section-' + (sectionNumber + 1) + ' .snap-drop.section-drop').removeClass('partial-render');\n }\n var title = M.util.get_string('moving', 'theme_snap', sectionName);\n footerAlert.setTitle(title);\n updateSectionDropMsg(sectionName);\n });\n };\n\n /**\n * Add drop zones at the end of sections.\n */\n var addAfterDrops = function() {\n if (document.body.id === \"page-site-index\") {\n $('#region-main .sitetopic ul.section').append(\n '<li class=\"snap-drop asset-drop\">' +\n '<div class=\"asset-wrapper\">' +\n '<a href=\"#\">' +\n M.util.get_string('movehere', 'theme_snap') +\n '</a>' +\n '</div>' +\n '</li>');\n } else {\n $('li.section .content ul.section').append(\n '<li class=\"snap-drop asset-drop\">' +\n '<div class=\"asset-wrapper\">' +\n '<a href=\"#\">' +\n M.util.get_string('movehere', 'theme_snap') +\n '</a>' +\n '</div>' +\n '</li>');\n }\n };\n\n /**\n * Add listener for move checkbox.\n */\n var assetMoveListener = function() {\n $(\"#region-main\").on('change', '.js-snap-asset-move', function(e) {\n e.stopPropagation();\n\n var asset = $(this).parents('.snap-asset')[0];\n\n // Make sure after drop is at the end of section.\n var section = $(asset).parents('ul.section')[0];\n var afterdrop = $(section).find('li.snap-drop.asset-drop');\n $(section).append(afterdrop);\n\n if (movingObjects.length === 0) {\n // Moving asset - activity or resource.\n // Initiate move.\n var assetname = $(asset).find('.snap-asset-link .instancename').html();\n\n log.debug('Moving this asset', assetname);\n\n var classes = $(asset).attr('class'),\n regex = /(?=snap-mime)([a-z0-9\\-]*)/;\n var assetclasses = regex.exec(classes);\n classes = '';\n if (assetclasses) {\n classes = assetclasses.join(' ');\n }\n log.debug('Moving this class', classes);\n $(asset).addClass('asset-moving');\n $('.snap-asset button').attr('disabled','disabled');\n $(asset).find('button').removeAttr('disabled');\n $('.snap-asset .snap-asset-content a').attr('tabindex','-1');\n $(asset).find('a').removeAttr('tabindex');\n\n $(asset).find('.js-snap-asset-move').prop('checked', 'checked');\n\n $('body').addClass('snap-move-inprogress');\n $('body').addClass('snap-move-asset');\n\n }\n\n if ($(this).prop('checked')) {\n // Add asset to moving array.\n movingObjects.push(asset);\n $(asset).find('a').removeAttr('tabindex');\n $(asset).find('button').removeAttr('disabled');\n $(asset).addClass('asset-moving');\n } else {\n // Remove from moving array.\n removeMovingObject(asset);\n // Remove moving class\n $(asset).find('.snap-asset-content a').attr('tabindex','-1');\n $(asset).find('button').attr('disabled','disabled');\n $(asset).removeClass('asset-moving');\n if (movingObjects.length === 0) {\n // Nothing is ticked for moving, cancel the move.\n stopMoving();\n }\n }\n footerAlertShowMove($(this));\n updateMovingMessage();\n });\n };\n\n /**\n * When an asset or drop zone is clicked, execute move.\n */\n var movePlaceListener = function() {\n $(document).on('click', '.snap-move-note, .snap-drop', function(e) {\n log.debug('Snap drop clicked', e);\n if (movingObjects) {\n e.stopPropagation();\n e.preventDefault();\n if ($('body').hasClass('snap-move-section')) {\n ajaxReqMoveSection(this);\n } else {\n var target;\n if ($(this).hasClass('snap-drop')) {\n target = this;\n } else {\n target = $(this).closest('.snap-asset');\n }\n ajaxReqMoveAsset(target);\n }\n }\n });\n };\n\n /**\n * Set observers for TOC and navigation buttons in the footer.\n */\n var setCourseSectionObervers = function () {\n setTocObservers();\n setNavigationFooterObservers();\n };\n\n /**\n * Add listeners.\n */\n var addListeners = function() {\n moveSectionListener();\n toggleSectionListener();\n highlightSectionListener();\n deleteSectionListener();\n assetMoveListener();\n movePlaceListener();\n assetEditListeners();\n addAfterDrops();\n if (courseLib.courseConfig.partialrender) {\n setCourseSectionObervers();\n }\n $('body').addClass('snap-course-listening');\n };\n\n /**\n * Override core functions.\n */\n var overrideCore = function() {\n // Check M.course exists (doesn't exist in social format).\n if (M.course && M.course.resource_toolbox) {\n /* eslint-disable camelcase */\n M.course.resource_toolbox.handle_resource_dim = function(button, activity, action) {\n return (action === 'hide') ? 0 : 1;\n };\n /* eslint-enable camelcase */\n }\n };\n\n /**\n * Make an Ajax request for caching the TOC so it's not so expensive to hide and show sections.\n */\n var cacheTOC = function() {\n if ($('.snap-section-editing.actions').length === 0) {\n // Only cache the TOC if there are sections.\n return;\n }\n\n var action = 'toc';\n\n var trigger = $('#region-main');\n\n if (!ajaxTracker.start('section_' + action, trigger)) {\n // Request already in progress.\n return;\n }\n\n // Make ajax call.\n var ajaxPromises = ajax.call([\n {\n methodname: 'theme_snap_course_sections',\n args : {\n courseshortname: courseLib.courseConfig.shortname,\n action: action,\n sectionnumber: 0,\n value: 0,\n loadmodules: 0,\n }\n }\n ], true, true);\n\n // Handle ajax promises.\n ajaxPromises[0]\n .fail(function(response) {\n var errMessage, errAction;\n errMessage = M.util.get_string('error:failedtotoc', 'theme_snap');\n errAction = M.util.get_string('action:sectiontoc', 'theme_snap');\n ajaxNotify.ifErrorShowBestMsg(response, errAction, errMessage).done(function() {\n // Allow another request now this has finished.\n ajaxTracker.complete('section_' + action);\n });\n }).always(function() {\n $(trigger).removeClass('ajaxing');\n }).done(function(response) {\n // Caching modules for future use.\n moduleCache = response.toc.modules;\n\n // Caching progress for future use.\n progressCache = [];\n $.each(response.toc.chapters.chapters, function(index, value) {\n progressCache.push(value.progress);\n });\n\n ajaxTracker.complete('section_' + action);\n });\n };\n\n /**\n * Initialise script.\n */\n var initialise = function() {\n // Add listeners.\n addListeners();\n\n // Cache TOC.\n cacheTOC();\n\n // Override core functions\n util.whenTrue(function() {\n return M.course && M.course.init_section_toolbox;\n }, function() {\noverrideCore();\n}, true);\n\n };\n initialise();\n },\n\n /**\n * Exposed function that renders a specific course section and sets focus on an activity module.\n * @param {string} section\n * @param {string} mod\n */\n renderAndFocusSection: function(section, mod) {\n getSection(section, mod);\n },\n\n setTocObserver: function() {\n setTocObservers();\n }\n };\n\n});\n"],"names":["define","$","log","ajax","str","templates","notification","util","ajaxNotify","footerAlert","Event","fragment","movingObject","ajaxTracker","self","this","movingObjects","ajaxing","sectionsProcess","moduleCache","progressCache","setTocObservers","courseConfig","format","click","e","section","target","attr","length","getSection","split","urlParams","mod","updateMovingMessage","title","assetname","find","html","M","get_string","setTitle","updateSectionDropMsg","sectionName","each","sectionDropMsg","moving","before","data","setSrNotice","indexOf","push","params","courseid","id","show","hide","loadFragment","contextid","done","js","node","renderSection","folders","index","folder","content","folderAssetTypeHeader","prependTo","anchor","existingSections","parseInt","tempnode","replaceNodeContents","remove","closest","reduce","prev","curr","Math","abs","after","runTemplateJS","notifyFilterContentUpdated","sections","removeClass","addClass","toctype","elements","tmpid","key","element","sectionNum","newLink","href","replace","modid","targmod","scrollToElement","searchpin","prepend","focus","scrollToModule","text","movingId","parent","append","init","courseLib","triggersByKey","start","jsPendingKey","trigger","subSelector","debug","js_pending","pending_js","complete","js_complete","sectionNumber","el","partialrender","parentSectionNumber","parents","stopMoving","hideAndReset","removeAttr","moveFailed","actname","removeAjaxLoading","window","setTimeout","ajaxReqMoveGeneral","onSuccess","finalItem","addAjaxLoading","sesskey","cfg","courseId","field","req","type","async","url","wwwroot","ajaxurl","ifErrorShowBestMsg","errorShown","class","fail","always","getSectionTitle","updateSectionNavigation","selector","totalSectionCount","dfd","Deferred","allSections","completed","idx","extraclasses","previousSection","nextSection","previous","next","hasClass","classes","navigation","render","result","replaceWith","resolve","promise","updateSections","current","predeleteSections","deletedSection","loadedSections","obj","newOrder","oldIndex","newIndex","k","undefined","splice","calculateSections","value","chapterTitle","fullTitle","setCourseSectionObervers","ajaxReqMoveAsset","shift","Number","beforeId","document","body","sectionId","assetEditListeners","on","actionSelectors","triggerEl","preventDefault","assetEl","cmid","instanceName","trim","action","errActionKey","errMessageKey","errAction","errMessage","actionAJAX","call","methodname","args","response","get_strings","component","then","strings","delConf","plugindata","match","name","delTitle","ok","cancel","confirm","assetAction","sectionActionListener","onComplete","stopPropagation","message","toggle","loadModules","actionSelector","courseshortname","shortname","sectionnumber","loadmodules","actionmodel","toc","modules","progressCacheCopy","slice","chapters","progress","completion","deleteSectionListener","delProgress","ajaxPromises","ids","location","hash","showSection","sectionDelete","footerAlertShowMove","focusEl","assetMoveListener","asset","afterdrop","assetclasses","exec","join","prop","movePlaceListener","domTargetSection","currentSection","targetSection","addListeners","toggleClass","not","highlighter","cacheTOC","whenTrue","course","init_section_toolbox","resource_toolbox","handle_resource_dim","button","activity","renderAndFocusSection","setTocObserver"],"mappings":"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"}
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists