AutorÃa | Ultima modificación | Ver Log |
{"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';\nimpor
t {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 opti
on.\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\n
const 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 = li
nk.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.c
losest('#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 ca
llback.\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 win
dow.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","t
ag","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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"}