Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"manual_completion_toggle.min.js","sources":["../src/manual_completion_toggle.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 <http://www.gnu.org/licenses/>.\n\n/**\n * Provides the functionality for toggling the manual completion state of a course module through\n * the manual completion button.\n *\n * @module      core_course/manual_completion_toggle\n * @copyright   2021 Jun Pataleta <jun@moodle.com>\n * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Templates from 'core/templates';\nimport Notification from 'core/notification';\nimport {toggleManualCompletion} from 'core_course/repository';\nimport * as CourseEvents from 'core_course/events';\nimport Pending from 'core/pending';\n\n/**\n * Selectors in the manual completion template.\n *\n * @type {{MANUAL_TOGGLE: string}}\n */\nconst SELECTORS = {\n    MANUAL_TOGGLE: 'button[data-action=toggle-manual-completion]',\n};\n\n/**\n * Toggle type values for the data-toggletype attribute in the core_course/completion_manual template.\n *\n * @type {{TOGGLE_UNDO: string, TOGGLE_MARK_DONE: string}}\n */\nconst TOGGLE_TYPES = {\n    TOGGLE_MARK_DONE: 'manual:mark-done',\n    TOGGLE_UNDO: 'manual:undo',\n};\n\n/**\n * Whether the event listener has already been registered for this module.\n *\n * @type {boolean}\n */\nlet registered = false;\n\n/**\n * Registers the click event listener for the manual completion toggle button.\n */\nexport const init = () => {\n    if (registered) {\n        return;\n    }\n    document.addEventListener('click', (e) => {\n        const toggleButton = e.target.closest(SELECTORS.MANUAL_TOGGLE);\n        if (toggleButton) {\n            e.preventDefault();\n            toggleManualCompletionState(toggleButton).catch(Notification.exception);\n        }\n    });\n    registered = true;\n};\n\n/**\n * Toggles the manual completion state of the module for the given user.\n *\n * @param {HTMLElement} toggleButton\n * @returns {Promise<void>}\n */\nconst toggleManualCompletionState = async(toggleButton) => {\n    const pendingPromise = new Pending('core_course:toggleManualCompletionState');\n    // Make a copy of the original content of the button.\n    const originalInnerHtml = toggleButton.innerHTML;\n\n    // Disable the button to prevent double clicks.\n    toggleButton.setAttribute('disabled', 'disabled');\n\n    // Get button data.\n    const toggleType = toggleButton.getAttribute('data-toggletype');\n    const cmid = toggleButton.getAttribute('data-cmid');\n    const activityname = toggleButton.getAttribute('data-activityname');\n    // Get the target completion state.\n    const completed = toggleType === TOGGLE_TYPES.TOGGLE_MARK_DONE;\n\n    // Replace the button contents with the loading icon.\n    Templates.renderForPromise('core/loading', {})\n    .then((loadingHtml) => {\n        Templates.replaceNodeContents(toggleButton, loadingHtml, '');\n        return;\n    }).catch(() => {});\n\n    try {\n        // Call the webservice to update the manual completion status.\n        await toggleManualCompletion(cmid, completed);\n\n        // All good so far. Refresh the manual completion button to reflect its new state by re-rendering the template.\n        const templateContext = {\n            cmid: cmid,\n            activityname: activityname,\n            overallcomplete: completed,\n            overallincomplete: !completed,\n            istrackeduser: true, // We know that we're tracking completion for this user given the presence of this button.\n        };\n        const renderObject = await Templates.renderForPromise('core_course/completion_manual', templateContext);\n\n        // Replace the toggle button with the newly loaded template.\n        const replacedNode = await Templates.replaceNode(toggleButton, renderObject.html, renderObject.js);\n        const newToggleButton = replacedNode.pop();\n\n        // Build manualCompletionToggled custom event.\n        const withAvailability = toggleButton.getAttribute('data-withavailability');\n        const toggledEvent = new CustomEvent(CourseEvents.manualCompletionToggled, {\n            bubbles: true,\n            detail: {\n                cmid,\n                activityname,\n                completed,\n                withAvailability,\n            }\n        });\n        // Dispatch the manualCompletionToggled custom event.\n        newToggleButton.dispatchEvent(toggledEvent);\n\n    } catch (exception) {\n        // In case of an error, revert the original state and appearance of the button.\n        toggleButton.removeAttribute('disabled');\n        toggleButton.innerHTML = originalInnerHtml;\n\n        // Show the exception.\n        Notification.exception(exception);\n    }\n    pendingPromise.resolve();\n};\n"],"names":["SELECTORS","TOGGLE_TYPES","registered","document","addEventListener","e","toggleButton","target","closest","preventDefault","toggleManualCompletionState","catch","Notification","exception","async","pendingPromise","Pending","originalInnerHtml","innerHTML","setAttribute","toggleType","getAttribute","cmid","activityname","completed","renderForPromise","then","loadingHtml","replaceNodeContents","templateContext","overallcomplete","overallincomplete","istrackeduser","renderObject","Templates","newToggleButton","replaceNode","html","js","pop","withAvailability","toggledEvent","CustomEvent","CourseEvents","manualCompletionToggled","bubbles","detail","dispatchEvent","removeAttribute","resolve"],"mappings":";;;;;;;;44BAmCMA,wBACa,+CAQbC,8BACgB,uBASlBC,YAAa,gBAKG,KACZA,aAGJC,SAASC,iBAAiB,SAAUC,UAC1BC,aAAeD,EAAEE,OAAOC,QAAQR,yBAClCM,eACAD,EAAEI,iBACFC,4BAA4BJ,cAAcK,MAAMC,sBAAaC,eAGrEX,YAAa,UASXQ,4BAA8BI,MAAAA,qBAC1BC,eAAiB,IAAIC,iBAAQ,2CAE7BC,kBAAoBX,aAAaY,UAGvCZ,aAAaa,aAAa,WAAY,kBAGhCC,WAAad,aAAae,aAAa,mBACvCC,KAAOhB,aAAae,aAAa,aACjCE,aAAejB,aAAae,aAAa,qBAEzCG,UAAYJ,aAAenB,iDAGvBwB,iBAAiB,eAAgB,IAC1CC,MAAMC,iCACOC,oBAAoBtB,aAAcqB,YAAa,OAE1DhB,OAAM,mBAIC,sCAAuBW,KAAME,iBAG7BK,gBAAkB,CACpBP,KAAMA,KACNC,aAAcA,aACdO,gBAAiBN,UACjBO,mBAAoBP,UACpBQ,eAAe,GAEbC,mBAAqBC,mBAAUT,iBAAiB,gCAAiCI,iBAIjFM,uBADqBD,mBAAUE,YAAY9B,aAAc2B,aAAaI,KAAMJ,aAAaK,KAC1DC,MAG/BC,iBAAmBlC,aAAae,aAAa,yBAC7CoB,aAAe,IAAIC,YAAYC,aAAaC,wBAAyB,CACvEC,SAAS,EACTC,OAAQ,CACJxB,KAAAA,KACAC,aAAAA,aACAC,UAAAA,UACAgB,iBAAAA,oBAIRL,gBAAgBY,cAAcN,cAEhC,MAAO5B,WAELP,aAAa0C,gBAAgB,YAC7B1C,aAAaY,UAAYD,wCAGZJ,UAAUA,WAE3BE,eAAekC"}