{"version":3,"file":"manual_completion_toggle.min.js","sources":["https:\/\/uciliste.zastitanaradu.hr\/course\/amd\/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 .\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 \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}\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"}