Proyectos de Subversion Moodle

Rev

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

{"version":3,"file":"rating.min.js","sources":["../src/rating.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 * Manage the courses view for the overview block.\n *\n * @module     tool_courserating/rating\n * @copyright  2022 Marina Glancy <marina.glancy@gmail.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport ModalForm from \"core_form/modalform\";\nimport ModalFactory from \"core/modal_factory\";\nimport Fragment from \"core/fragment\";\nimport Templates from \"core/templates\";\nimport ModalEvents from 'core/modal_events';\nimport ajax from 'core/ajax';\n\nconst SELECTORS = {\n    COURSERATING: '.customfield_tool_courserating',\n    COURSEWIDGET: '.tool_courserating-widget',\n    ADD_RATING: '[data-action=tool_courserating-addrating][data-courseid]',\n    VIEW_RATINGS_CFIELD: '.tool_courserating-cfield .tool_courserating-ratings',\n    VIEW_RATINGS_LINK: '[data-action=\"tool_courserating-viewratings\"]',\n    FLAG_RATING: '[data-action=tool_courserating-toggleflag]',\n    DELETE_RATING: `[data-action='tool_courserating-delete-rating']`,\n    USER_RATING: `[data-for='tool_courserating-user-rating']`,\n    CFIELD_WRAPPER: `[data-for='tool_courserating-cfield-wrapper'][data-courseid]`,\n    USER_RATING_FLAG: `[data-for='tool_courserating-user-flag']`,\n    RATING_POPUP: `.tool_courserating-reviews-popup`,\n    REVIEWS_LIST: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-reviews\"]`,\n    SHOWMORE_WRAPPER: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-reviews\"] ` +\n        `[data-for=\"tool_courserating-showmore\"]`,\n    SHOWMORE_BUTTON: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-reviews\"] ` +\n        `[data-for=\"tool_courserating-showmore\"] [data-action=\"showmore\"]`,\n    RESET_WITHRATINGS: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-reviews\"] ` +\n        `[data-for=\"tool_courserating-resetwithrating\"]`,\n    POPUP_SUMMARY: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-summary\"]`,\n    SET_WITHRATINGS: `.tool_courserating-reviews-popup [data-for=\"tool_courserating-summary\"] ` +\n        `[data-for=\"tool_courserating_setwithrating\"]`,\n    RBCELL: `[data-for=\"tool_courserating-rbcell\"][data-ratingid]`,\n};\n\nlet systemContextId;\nlet viewRatingsModal;\nlet addRatingModal;\n\n/**\n * Initialise listeners\n *\n * @param {Number} systemContextIdParam\n * @param {Boolean} useJQuery\n */\nexport const init = (systemContextIdParam, useJQuery = false) => {\n    systemContextId = systemContextIdParam;\n\n    document.addEventListener('click', e => {\n        if (!e || !e.target || (typeof e.target.closest === \"undefined\")) {\n            return;\n        }\n\n        const addRatingElement = e.target.closest(SELECTORS.ADD_RATING),\n            viewRatingsElement = e.target.closest(SELECTORS.VIEW_RATINGS_CFIELD),\n            deleteRatingElement = e.target.closest(SELECTORS.DELETE_RATING);\n\n        if (addRatingElement) {\n            e.preventDefault();\n            const courseid = addRatingElement.getAttribute('data-courseid');\n            if (viewRatingsModal) {\n                viewRatingsModal.destroy();\n            }\n            addRating(courseid);\n        } else if (viewRatingsElement) {\n            e.preventDefault();\n            const classes = (' ' + viewRatingsElement.getAttribute('class') + ' '),\n                matches = classes.match(/ tool_courserating-ratings-courseid-(\\d+) /);\n            if (matches) {\n                const widget = viewRatingsElement.closest(SELECTORS.COURSEWIDGET);\n                if (widget && widget.querySelector(SELECTORS.ADD_RATING)) {\n                    addRating(matches[1]);\n                } else {\n                    viewRatings(matches[1]);\n                }\n            }\n        } else if (deleteRatingElement) {\n            e.preventDefault();\n            const ratingid = deleteRatingElement.getAttribute('data-ratingid');\n            deleteRating(ratingid);\n        }\n    });\n\n    if (useJQuery) {\n        require(['jquery'], function($) {\n            $('body').on('updated', '[data-inplaceeditable]', e => reloadFlag(e.target));\n        });\n    } else {\n        document.addEventListener('core/inplace_editable:updated', e => reloadFlag(e.target));\n    }\n};\n\n/**\n * Update the rating flag fragment\n *\n * @param {Element} inplaceEditable\n */\nconst reloadFlag = (inplaceEditable) => {\n    if (inplaceEditable.dataset.component === 'tool_courserating' && inplaceEditable.dataset.itemtype === 'flag') {\n        const ratingid = inplaceEditable.dataset.itemid;\n        const node = document.querySelector(`${SELECTORS.USER_RATING_FLAG}[data-ratingid='${ratingid}']`);\n        if (node) {\n            Fragment.loadFragment('tool_courserating', 'rating_flag', systemContextId, {ratingid}).done((html, js) => {\n                Templates.replaceNode(node, html, js);\n            });\n        }\n    }\n};\n\n/**\n * Add ratings dialogue\n *\n * @param {Number} courseid\n */\nconst addRating = (courseid) => {\n    addRatingModal = new ModalForm({\n        formClass: 'tool_courserating\\\\form\\\\addrating',\n        args: {courseid},\n        modalConfig: {\n            title: getString('addrating', 'tool_courserating'),\n        },\n    });\n\n    // When form is saved, refresh it to remove validation errors, if any:\n    addRatingModal.addEventListener(addRatingModal.events.FORM_SUBMITTED, () => {\n        getString('changessaved')\n            .then(addToast)\n            .catch(null);\n        refreshRating(courseid);\n    });\n\n    addRatingModal.show();\n};\n\n/**\n * View ratings dialogue\n *\n * @param {Number} courseid\n */\nconst viewRatings = (courseid) => {\n    ModalFactory.create({\n        type: ModalFactory.types.CANCEL,\n        title: getString('coursereviews', 'tool_courserating'),\n        large: true,\n        buttons: {\n            cancel: getString('closebuttontitle', 'core'),\n        },\n        removeOnClose: true,\n    })\n        .then(modal => {\n            modal.setLarge();\n            loadCourseRatingPopupContents({courseid})\n            .done(({html, js}) => {\n                modal.setBody(html);\n                Templates.runTemplateJS(js);\n            });\n            // Handle hidden event.\n            modal.getRoot().on(ModalEvents.hidden, function() {\n                // Destroy when hidden.\n                modal.destroy();\n            });\n            modal.show();\n            viewRatingsModal = modal;\n            return modal;\n        })\n        .fail(() => null);\n};\n\n/**\n * Delete rating with specified id\n *\n * @param {Number} ratingid\n */\nconst deleteRating = (ratingid) => {\n    const form = new ModalForm({\n        formClass: 'tool_courserating\\\\form\\\\deleterating',\n        args: {ratingid},\n        modalConfig: {\n            title: getString('deleterating', 'tool_courserating'),\n        },\n    });\n\n    // When form is saved, rating should be deleted.\n    form.addEventListener(form.events.FORM_SUBMITTED, async e => {\n        const el = document.querySelector(SELECTORS.USER_RATING + `[data-ratingid='${e.detail.ratingid}'`);\n        if (el) {\n            el.remove();\n        }\n        refreshRating(e.detail.courseid);\n        if (!el) {\n            const rbcell = document.querySelector(SELECTORS.RBCELL + `[data-ratingid='${e.detail.ratingid}'`);\n            if (rbcell) {\n                rbcell.innerHTML = await getString('ratingdeleted', 'tool_courserating');\n            }\n        }\n    });\n\n    form.show();\n};\n\n/**\n * Refresh course rating summary\n *\n * @param {Number} courseid\n */\nconst refreshRating = (courseid) => {\n    let el1 = document.getElementsByClassName('tool_courserating-ratings-courseid-' + courseid);\n    if (el1 && el1.length) {\n        const cfield = el1[0].closest(SELECTORS.COURSERATING);\n        Fragment.loadFragment('tool_courserating', 'cfield', systemContextId, {courseid}).done((html, js) => {\n            Templates.replaceNode(cfield, html, js);\n        });\n    }\n\n    const el2 = document.querySelector(SELECTORS.CFIELD_WRAPPER + `[data-courseid='${courseid}']`);\n    if (el2) {\n        Fragment.loadFragment('tool_courserating', 'cfield', systemContextId, {courseid}).done((html, js) => {\n            el2.innerHTML = '';\n            Templates.appendNodeContents(el2, html, js);\n        });\n    }\n\n    const el3 = document.querySelector(`[data-for='tool_courserating-summary'][data-courseid='${courseid}']`);\n    if (el3) {\n        Fragment.loadFragment('tool_courserating', 'course_ratings_summary', systemContextId, {courseid}).done((html, js) => {\n            el3.innerHTML = '';\n            Templates.appendNodeContents(el3, html, js);\n        });\n    }\n};\n\n/**\n * Adds or removes CSS class to/from an element\n *\n * @param {Element} ratingFormGroup\n * @param {String} value\n */\nconst setFormGroupClasses = (ratingFormGroup, value) => {\n    const addRemoveClass = (className, add) => {\n        if (add && !ratingFormGroup.classList.contains(className)) {\n            ratingFormGroup.classList.add(className);\n        } else if (!add && ratingFormGroup.classList.contains(className)) {\n            ratingFormGroup.classList.remove(className);\n        }\n    };\n    for (let i = 1; i <= 5; i++) {\n        addRemoveClass('s-' + i, i <= parseInt(value));\n    }\n    addRemoveClass('tool_courserating-norating', parseInt(value) === 0);\n};\n\n/**\n * Sets up listeneres for the addRating modal form\n *\n * @param {String} grpId\n */\nexport const setupAddRatingForm = (grpId) => {\n    const ratingFormGroup = document.getElementById(grpId);\n    const curchecked = ratingFormGroup.querySelector('input:checked');\n    setFormGroupClasses(ratingFormGroup, curchecked ? curchecked.value : 0);\n\n    let els = ratingFormGroup.querySelectorAll('input');\n    for (let i = 0; i < els.length; i++) {\n        els[i].addEventListener('change', e => setFormGroupClasses(ratingFormGroup, e.target.value));\n    }\n\n    let labels = ratingFormGroup.querySelectorAll('label');\n    for (let i = 0; i < labels.length; i++) {\n        labels[i].addEventListener(\"mouseover\", e => {\n            const el = e.target.closest('label').querySelector('input');\n            setFormGroupClasses(ratingFormGroup, el.value);\n        });\n        labels[i].addEventListener(\"mouseleave\", () => {\n            const el = ratingFormGroup.querySelector('input:checked');\n            setFormGroupClasses(ratingFormGroup, el ? el.value : 0);\n        });\n    }\n\n    const form = ratingFormGroup.closest('form');\n    const viewratingsLink = form.querySelector(SELECTORS.VIEW_RATINGS_LINK);\n    if (viewratingsLink) {\n        viewratingsLink.addEventListener('click', e => {\n            e.preventDefault();\n            addRatingModal.modal.destroy();\n            viewRatings(e.target.dataset.courseid);\n        });\n    }\n};\n\n/**\n * Sets up the \"View course ratings\" popup\n */\nexport const setupViewRatingsPopup = () => {\n    const el = document.querySelector(SELECTORS.REVIEWS_LIST);\n    const reloadReviews = (offset = 0) => {\n        const params = {\n            courseid: el.dataset.courseid,\n            offset,\n            withrating: el.dataset.withrating\n        };\n        return Fragment.loadFragment('tool_courserating', 'course_reviews', el.dataset.systemcontextid, params);\n    };\n\n    el.addEventListener('click', e => {\n        const button = e.target.closest(SELECTORS.SHOWMORE_BUTTON);\n        if (button) {\n            const wrapper = button.closest(SELECTORS.SHOWMORE_WRAPPER);\n            e.preventDefault();\n            reloadReviews(button.dataset.nextoffset).done((html, js) => Templates.replaceNode(wrapper, html, js));\n        }\n        const resetLink = e.target.closest(SELECTORS.RESET_WITHRATINGS);\n        if (resetLink) {\n            e.preventDefault();\n            el.dataset.withrating = 0;\n            reloadReviews(0).done((html, js) => Templates.replaceNodeContents(el, html, js));\n        }\n    });\n\n    const elSummary = document.querySelector(SELECTORS.POPUP_SUMMARY);\n    elSummary.addEventListener('click', e => {\n        const withRatingButton = e.target.closest(SELECTORS.SET_WITHRATINGS);\n        if (withRatingButton) {\n            el.dataset.withrating = (el.dataset.withrating === withRatingButton.dataset.withrating) ?\n                0 : withRatingButton.dataset.withrating;\n            reloadReviews(0).done((html, js) => Templates.replaceNodeContents(el, html, js));\n        }\n    });\n};\n\n/**\n * Hide the custom field editor on the course edit page\n *\n * @param {String} fieldname\n */\nexport const hideEditField = (fieldname) => {\n    const s = '#fitem_id_customfield_' + fieldname;\n    let el = document.querySelector(s + '_editor');\n    if (el) {\n        el.style.display = 'none';\n        el = document.querySelector(s + '_static');\n        if (el) {\n            el.style.display = 'none';\n        }\n    }\n};\n\n\n/**\n * Loads Course Rating popup contents. Allows both loggedin and nonloggedin requests.\n *\n * @param {object} args Parameters for the callback.\n * @return {Promise} JQuery promise object resolved when the fragment has been loaded.\n */\nconst loadCourseRatingPopupContents = function(args) {\n    const isloggedin = !document.body.classList.contains('notloggedin');\n\n    if (isloggedin) {\n        return Fragment.loadFragment('tool_courserating', 'course_ratings_popup', systemContextId, args)\n            .then((html, js) => ({html, js}));\n    }\n\n    return ajax.call([{\n        methodname: 'tool_courserating_course_rating_popup',\n        args\n    }], undefined, false)[0]\n    .then(function(data) {\n        return {html: data.html, js: Fragment.processCollectedJavascript(data.javascript)};\n    });\n};\n"],"names":["SELECTORS","systemContextId","viewRatingsModal","addRatingModal","systemContextIdParam","useJQuery","document","addEventListener","e","target","closest","addRatingElement","viewRatingsElement","deleteRatingElement","preventDefault","courseid","getAttribute","destroy","addRating","matches","match","widget","querySelector","viewRatings","ratingid","deleteRating","require","$","on","reloadFlag","inplaceEditable","dataset","component","itemtype","itemid","node","loadFragment","done","html","js","replaceNode","ModalForm","formClass","args","modalConfig","title","events","FORM_SUBMITTED","then","addToast","catch","refreshRating","show","create","type","ModalFactory","types","CANCEL","large","buttons","cancel","removeOnClose","modal","setLarge","loadCourseRatingPopupContents","_ref","setBody","runTemplateJS","getRoot","ModalEvents","hidden","fail","form","async","el","detail","remove","rbcell","innerHTML","el1","getElementsByClassName","length","cfield","el2","appendNodeContents","el3","setFormGroupClasses","ratingFormGroup","value","addRemoveClass","className","add","classList","contains","i","parseInt","grpId","getElementById","curchecked","els","querySelectorAll","labels","viewratingsLink","reloadReviews","offset","params","withrating","Fragment","systemcontextid","button","wrapper","nextoffset","Templates","replaceNodeContents","withRatingButton","fieldname","s","style","display","body","ajax","call","methodname","undefined","data","processCollectedJavascript","javascript"],"mappings":"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"}