Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
{"version":3,"file":"tag.min.js","sources":["../src/tag.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 * AJAX helper for the tag management page.\n *\n * @module     core/tag\n * @copyright  2015 Marina Glancy\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since      3.0\n */\n\nimport $ from 'jquery';\nimport {call as fetchMany} from 'core/ajax';\nimport * as Notification from 'core/notification';\nimport * as Templates from 'core/templates';\nimport {getString} from 'core/str';\nimport * as ModalEvents from 'core/modal_events';\nimport Pending from 'core/pending';\nimport SaveCancelModal from 'core/modal_save_cancel';\nimport Config from 'core/config';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\n\nconst getTagIndex = (tagindex) => fetchMany([{\n    methodname: 'core_tag_get_tagindex',\n    args: {tagindex}\n}])[0];\n\nconst getCheckedTags = (root) => root.querySelectorAll('[data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]:checked');\n\nconst handleCombineRequest = async(tagManagementCombine) => {\n    const pendingPromise = new Pending('core/tag:tag-management-combine');\n    const form = tagManagementCombine.closest('form');\n\n    const reportElement = document.querySelector(reportSelectors.regions.report);\n    const checkedTags = getCheckedTags(reportElement);\n\n    if (checkedTags.length <= 1) {\n        // We need at least 2 tags to combine them.\n        Notification.alert(\n            getString('combineselected', 'tag'),\n            getString('selectmultipletags', 'tag'),\n            getString('ok'),\n        );\n\n        return;\n    }\n\n    const tags = Array.from(checkedTags.values()).map((tag) => {\n        const namedElement = document.querySelector(`.inplaceeditable[data-itemtype=tagname][data-itemid=\"${tag.value}\"]`);\n        return {\n            id: tag.value,\n            name: namedElement.dataset.value,\n        };\n    });\n\n    const modal = await SaveCancelModal.create({\n        title: getString('combineselected', 'tag'),\n        buttons: {\n            save: getString('continue', 'core'),\n        },\n        body: Templates.render('core_tag/combine_tags', {tags}),\n        show: true,\n        removeOnClose: true,\n    });\n\n    // Handle save event.\n    modal.getRoot().on(ModalEvents.save, (e) => {\n        e.preventDefault();\n\n        // Append this temp element in the form in the tags list, not the form in the modal. Confusing, right?!?\n        const tempElement = document.createElement('input');\n        tempElement.hidden = true;\n        tempElement.name = tagManagementCombine.name;\n        form.append(tempElement);\n\n        // Append selected tags element.\n        const tagsElement = document.createElement('input');\n        tagsElement.hidden = true;\n        tagsElement.name = 'tagschecked';\n        tagsElement.value = [...checkedTags].map(check => check.value).join(',');\n        form.append(tagsElement);\n\n        // Get the selected tag from the modal.\n        var maintag = $('input[name=maintag]:checked', '#combinetags_form').val();\n        // Append this in the tags list form.\n        $(\"<input type='hidden'/>\").attr('name', 'maintag').attr('value', maintag).appendTo(form);\n        // Submit the tags list form.\n        form.submit();\n    });\n\n    await modal.getBodyPromise();\n    // Tick the first option.\n    const firstOption = document.querySelector('#combinetags_form input[type=radio]');\n    firstOption.focus();\n    firstOption.checked = true;\n\n    pendingPromise.resolve();\n\n    return;\n};\n\nconst addStandardTags = async() => {\n    var pendingPromise = new Pending('core/tag:addstandardtag');\n\n    const modal = await SaveCancelModal.create({\n        title: getString('addotags', 'tag'),\n        body: Templates.render('core_tag/add_tags', {\n            actionurl: window.location.href,\n            sesskey: M.cfg.sesskey,\n        }),\n        buttons: {\n            save: getString('continue', 'core'),\n        },\n        removeOnClose: true,\n        show: true,\n    });\n\n    // Handle save event.\n    modal.getRoot().on(ModalEvents.save, (e) => {\n        var tagsInput = $(e.currentTarget).find('#id_tagslist');\n        var name = tagsInput.val().trim();\n\n        // Set the text field's value to the trimmed value.\n        tagsInput.val(name);\n\n        // Add submit event listener to the form.\n        var tagsForm = $('#addtags_form');\n        tagsForm.on('submit', function(e) {\n            // Validate the form.\n            var form = $('#addtags_form');\n            if (form[0].checkValidity() === false) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n            form.addClass('was-validated');\n\n            // BS2 compatibility.\n            $('[data-region=\"tagslistinput\"]').addClass('error');\n            var errorMessage = $('#id_tagslist_error_message');\n            errorMessage.removeAttr('hidden');\n            errorMessage.addClass('help-block');\n        });\n\n        // Try to submit the form.\n        tagsForm.submit();\n\n        return false;\n    });\n\n    await modal.getBodyPromise();\n    pendingPromise.resolve();\n};\n\nconst deleteSelectedTags = async(bulkActionDeleteButton) => {\n    const form = bulkActionDeleteButton.closest('form');\n\n    const reportElement = document.querySelector(reportSelectors.regions.report);\n    const checkedTags = getCheckedTags(reportElement);\n\n    if (!checkedTags.length) {\n        return;\n    }\n\n    try {\n        await Notification.saveCancelPromise(\n            getString('delete'),\n            getString('confirmdeletetags', 'tag'),\n            getString('yes'),\n            getString('no'),\n        );\n\n        // Append this temp element in the form in the tags list, not the form in the modal. Confusing, right?!?\n        const tempElement = document.createElement('input');\n        tempElement.hidden = true;\n        tempElement.name = bulkActionDeleteButton.name;\n        form.append(tempElement);\n\n        // Append selected tags element.\n        const tagsElement = document.createElement('input');\n        tagsElement.hidden = true;\n        tagsElement.name = 'tagschecked';\n        tagsElement.value = [...checkedTags].map(check => check.value).join(',');\n        form.append(tagsElement);\n\n        form.submit();\n    } catch {\n        return;\n    }\n};\n\nconst deleteSelectedTag = async(button) => {\n    try {\n        await Notification.saveCancelPromise(\n            getString('delete'),\n            getString('confirmdeletetag', 'tag'),\n            getString('yes'),\n            getString('no'),\n        );\n\n        window.location.href = button.href;\n    } catch {\n        return;\n    }\n};\n\nconst deleteSelectedCollection = async(button) => {\n    try {\n        await Notification.saveCancelPromise(\n            getString('delete'),\n            getString('suredeletecoll', 'tag', button.dataset.collname),\n            getString('yes'),\n            getString('no'),\n        );\n\n        const redirectTarget = new URL(button.dataset.url);\n        redirectTarget.searchParams.set('sesskey', Config.sesskey);\n        window.location.href = redirectTarget;\n    } catch {\n        return;\n    }\n};\n\nconst addTagCollection = async(link) => {\n    const pendingPromise = new Pending('core/tag:initManageCollectionsPage-addtagcoll');\n    const href = link.dataset.url;\n\n    const modal = await SaveCancelModal.create({\n        title: getString('addtagcoll', 'tag'),\n        buttons: {\n            save: getString('create', 'core'),\n        },\n        body: Templates.render('core_tag/add_tag_collection', {\n            actionurl: href,\n            sesskey: M.cfg.sesskey,\n        }),\n        removeOnClose: true,\n        show: true,\n    });\n\n    // Handle save event.\n    modal.getRoot().on(ModalEvents.save, (e) => {\n        const collectionInput = $(e.currentTarget).find('#addtagcoll_name');\n        const name = collectionInput.val().trim();\n        // Set the text field's value to the trimmed value.\n        collectionInput.val(name);\n\n        // Add submit event listener to the form.\n        const form = $('#addtagcoll_form');\n        form.on('submit', function(e) {\n            // Validate the form.\n            if (form[0].checkValidity() === false) {\n                e.preventDefault();\n                e.stopPropagation();\n            }\n            form.addClass('was-validated');\n\n            // BS2 compatibility.\n            $('[data-region=\"addtagcoll_nameinput\"]').addClass('error');\n            const errorMessage = $('#id_addtagcoll_name_error_message');\n            errorMessage.removeAttr('hidden');\n            errorMessage.addClass('help-block');\n        });\n\n        // Try to submit the form.\n        form.submit();\n\n        return false;\n    });\n\n    pendingPromise.resolve();\n};\n\n/**\n * Initialises tag index page.\n *\n * @method initTagindexPage\n */\nexport const initTagindexPage = async() => {\n    document.addEventListener('click', async(e) => {\n        const targetArea = e.target.closest('a[data-quickload=\"1\"]');\n        if (!targetArea) {\n            return;\n        }\n        const tagArea = targetArea.closest('.tagarea[data-ta]');\n        if (!tagArea) {\n            return;\n        }\n\n        e.preventDefault();\n        const pendingPromise = new Pending('core/tag:initTagindexPage');\n\n        const query = targetArea.search.replace(/^\\?/, '');\n        const params = Object.fromEntries((new URLSearchParams(query)).entries());\n\n        try {\n            const data = await getTagIndex(params);\n            const {html, js} = await Templates.renderForPromise('core_tag/index', data);\n            Templates.replaceNode(tagArea, html, js);\n        } catch (error) {\n            Notification.exception(error);\n        }\n        pendingPromise.resolve();\n    });\n};\n\n/**\n * Initialises tag management page.\n *\n * @method initManagePage\n */\nexport const initManagePage = () => {\n    // Toggle row class when updating flag.\n    $('body').on('updated', '[data-inplaceeditable][data-itemtype=tagflag]', function(e) {\n        var row = $(e.target).closest('tr');\n        row.toggleClass('table-warning', e.ajaxreturn.value === '1');\n    });\n\n    // Confirmation for bulk tag combine button.\n    document.addEventListener('click', async(e) => {\n        const tagManagementCombine = e.target.closest('#tag-management-combine');\n        if (tagManagementCombine) {\n            e.preventDefault();\n            handleCombineRequest(tagManagementCombine);\n        }\n\n        if (e.target.closest('[data-action=\"addstandardtag\"]')) {\n            e.preventDefault();\n            addStandardTags();\n        }\n\n        const bulkActionDeleteButton = e.target.closest('#tag-management-delete');\n        if (bulkActionDeleteButton) {\n            e.preventDefault();\n            deleteSelectedTags(bulkActionDeleteButton);\n        }\n\n        const rowDeleteButton = e.target.closest('.tagdelete');\n        if (rowDeleteButton) {\n            e.preventDefault();\n            deleteSelectedTag(rowDeleteButton);\n        }\n    });\n\n    // When user changes tag name to some name that already exists suggest to combine the tags.\n    $('body').on('updatefailed', '[data-inplaceeditable][data-itemtype=tagname]', async(e) => {\n        var exception = e.exception; // The exception object returned by the callback.\n        var newvalue = e.newvalue; // The value that user tried to udpated the element to.\n        var tagid = $(e.target).attr('data-itemid');\n        if (exception.errorcode !== 'namesalreadybeeingused') {\n            return;\n        }\n        e.preventDefault(); // This will prevent default error dialogue.\n\n        try {\n            await Notification.saveCancelPromise(\n                getString('confirm'),\n                getString('nameuseddocombine', 'tag'),\n                getString('yes'),\n                getString('cancel'),\n            );\n\n            // The Promise will resolve on 'Yes' button, and reject on 'Cancel' button.\n            const redirectTarget = new URL(window.location);\n            redirectTarget.searchParams.set('newname', newvalue);\n            redirectTarget.searchParams.set('tagid', tagid);\n            redirectTarget.searchParams.set('action', 'renamecombine');\n            redirectTarget.searchParams.set('sesskey', Config.sesskey);\n\n            window.location.href = redirectTarget;\n        } catch {\n            return;\n        }\n    });\n};\n\n/**\n * Initialises tag collection management page.\n *\n * @method initManageCollectionsPage\n */\nexport const initManageCollectionsPage = () => {\n    $('body').on('updated', '[data-inplaceeditable]', function(e) {\n        var pendingPromise = new Pending('core/tag:initManageCollectionsPage-updated');\n\n        var ajaxreturn = e.ajaxreturn,\n            areaid, collid, isenabled;\n        if (ajaxreturn.component === 'core_tag' && ajaxreturn.itemtype === 'tagareaenable') {\n            areaid = $(this).attr('data-itemid');\n            $(\".tag-collections-table ul[data-collectionid] li[data-areaid=\" + areaid + \"]\").hide();\n            isenabled = ajaxreturn.value;\n            if (isenabled === '1') {\n                $(this).closest('tr').removeClass('dimmed_text');\n                collid = $(this).closest('tr').find('[data-itemtype=\"tagareacollection\"]').attr(\"data-value\");\n                $(\".tag-collections-table ul[data-collectionid=\" + collid + \"] li[data-areaid=\" + areaid + \"]\").show();\n            } else {\n                $(this).closest('tr').addClass('dimmed_text');\n            }\n        }\n        if (ajaxreturn.component === 'core_tag' && ajaxreturn.itemtype === 'tagareacollection') {\n            areaid = $(this).attr('data-itemid');\n            $(\".tag-collections-table ul[data-collectionid] li[data-areaid=\" + areaid + \"]\").hide();\n            collid = $(this).attr('data-value');\n            isenabled = $(this).closest('tr').find('[data-itemtype=\"tagareaenable\"]').attr(\"data-value\");\n            if (isenabled === \"1\") {\n                $(\".tag-collections-table ul[data-collectionid=\" + collid + \"] li[data-areaid=\" + areaid + \"]\").show();\n            }\n        }\n\n        pendingPromise.resolve();\n    });\n\n    document.addEventListener('click', async(e) => {\n        const addTagCollectionNode = e.target.closest('.addtagcoll > a');\n        if (addTagCollectionNode) {\n            e.preventDefault();\n            addTagCollection(addTagCollectionNode);\n            return;\n        }\n\n        const deleteCollectionButton = e.target.closest('.tag-collections-table .action_delete');\n        if (deleteCollectionButton) {\n            e.preventDefault();\n            deleteSelectedCollection(deleteCollectionButton);\n        }\n    });\n};\n"],"names":["getCheckedTags","root","querySelectorAll","async","document","addEventListener","targetArea","e","target","closest","tagArea","preventDefault","pendingPromise","Pending","query","search","replace","params","Object","fromEntries","URLSearchParams","entries","data","tagindex","methodname","args","html","js","Templates","renderForPromise","replaceNode","error","Notification","exception","resolve","on","toggleClass","ajaxreturn","value","tagManagementCombine","form","reportElement","querySelector","reportSelectors","regions","report","checkedTags","length","alert","tags","Array","from","values","map","tag","namedElement","id","name","dataset","modal","SaveCancelModal","create","title","buttons","save","body","render","show","removeOnClose","getRoot","ModalEvents","tempElement","createElement","hidden","append","tagsElement","check","join","maintag","val","attr","appendTo","submit","getBodyPromise","firstOption","focus","checked","handleCombineRequest","actionurl","window","location","href","sesskey","M","cfg","tagsInput","currentTarget","find","trim","tagsForm","checkValidity","stopPropagation","addClass","errorMessage","removeAttr","addStandardTags","bulkActionDeleteButton","saveCancelPromise","deleteSelectedTags","rowDeleteButton","button","deleteSelectedTag","newvalue","tagid","errorcode","redirectTarget","URL","searchParams","set","Config","areaid","collid","component","itemtype","this","hide","removeClass","addTagCollectionNode","link","url","collectionInput","addTagCollection","deleteCollectionButton","collname","deleteSelectedCollection"],"mappings":"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"}