diff --git a/lib/amd/build/tag.min.js b/lib/amd/build/tag.min.js index c592333a7c2..89d35609428 100644 --- a/lib/amd/build/tag.min.js +++ b/lib/amd/build/tag.min.js @@ -6,6 +6,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.0 */ -define("core/tag",["jquery","core/ajax","core/templates","core/notification","core/str","core/modal_factory","core/modal_events","core/pending"],(function($,ajax,templates,notification,str,ModalFactory,ModalEvents,Pending){return{initTagindexPage:function(){$("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",(function(e){var pendingPromise=new Pending("core/tag:initTagindexPage");e.preventDefault();var target=$(this),query=target[0].search.replace(/^\?/,""),tagarea=target.closest(".tagarea[data-ta]"),args=query.split("&").reduce((function(s,c){var t=c.split("=");return s[t[0]]=decodeURIComponent(t[1]),s}),{});ajax.call([{methodname:"core_tag_get_tagindex",args:{tagindex:args}}])[0].then((function(data){return templates.render("core_tag/index",data)})).then((function(html,js){templates.replaceNode(tagarea,html,js)})).always(pendingPromise.resolve).catch(notification.exception)}))},initManagePage:function(){$("body").on("updated","[data-inplaceeditable]",(function(e){var pendingPromise=new Pending("core/tag:initManagePage");if(str.get_strings([{key:"selecttag",component:"core_tag"},{key:"now",component:"core"}]).then((function(result){$('label[for="tagselect'+e.ajaxreturn.itemid+'"]').html(result[0]),$(e.target).closest("tr").find("td.col-timemodified").html(result[1])})).always(pendingPromise.resolve).catch(notification.exception),"tagflag"===e.ajaxreturn.itemtype){var row=$(e.target).closest("tr");"0"===e.ajaxreturn.value?row.removeClass("table-warning"):row.addClass("table-warning")}})),$(".tag-management-table").delegate("a.tagdelete","click",(function(e){var pendingPromise=new Pending("core/tag:tagdelete");e.preventDefault();var href=$(this).attr("href");str.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetag",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=href}))})).always(pendingPromise.resolve).catch(notification.exception)})),$("#tag-management-delete").click((function(e){var form=$(this).closest("form").get(0);if($(form).find("input[type=checkbox]:checked").length){var pendingPromise=new Pending("core/tag:tag-management-delete"),tempElement=$("").attr("name",this.name);e.preventDefault(),str.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetags",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){tempElement.appendTo(form),form.submit()}))})).always(pendingPromise.resolve).catch(notification.exception)}})),$("#tag-management-combine").click((function(e){var pendingPromise=new Pending("core/tag:tag-management-combine");e.preventDefault();var form=$(this).closest("form").get(0),tags=$(form).find("input[type=checkbox]:checked");if(tags.length<=1)str.get_strings([{key:"combineselected",component:"tag"},{key:"selectmultipletags",component:"tag"},{key:"ok"}]).then((function(s){return notification.alert(s[0],s[1],s[2])})).always(pendingPromise.resolve).catch(notification.exception);else{var tempElement=$("").attr("name",this.name),saveButtonText="",tagOptions=[];tags.each((function(){var tagid=$(this).val(),tagname=$(".inplaceeditable[data-itemtype=tagname][data-itemid="+tagid+"]").attr("data-value");tagOptions.push({id:tagid,name:tagname})})),str.get_strings([{key:"combineselected",component:"tag"},{key:"continue",component:"core"}]).then((function(langStrings){var modalTitle=langStrings[0];saveButtonText=langStrings[1];var templateContext={tags:tagOptions};return ModalFactory.create({title:modalTitle,body:templates.render("core_tag/combine_tags",templateContext),type:ModalFactory.types.SAVE_CANCEL})})).then((function(modal){return modal.setSaveButtonText(saveButtonText),modal})).then((function(modal){modal.getRoot().on(ModalEvents.save,(function(e){e.preventDefault(),tempElement.appendTo(form);var maintag=$("input[name=maintag]:checked","#combinetags_form").val();$("").attr("name","maintag").attr("value",maintag).appendTo(form),form.submit()})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show(),$("#combinetags_form input[type=radio]").first().focus().prop("checked",!0)})).always(pendingPromise.resolve).catch(notification.exception)}})),$("body").on("updatefailed","[data-inplaceeditable][data-itemtype=tagname]",(function(e){var exception=e.exception,newvalue=e.newvalue,tagid=$(e.target).attr("data-itemid");if("namesalreadybeeingused"===exception.errorcode){var pendingPromise=new Pending("core/tag:updatefailed");e.preventDefault(),str.get_strings([{key:"confirm",component:"core"},{key:"nameuseddocombine",component:"tag"},{key:"yes",component:"core"},{key:"cancel",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=window.location.href+"&newname="+encodeURIComponent(newvalue)+"&tagid="+encodeURIComponent(tagid)+"&action=renamecombine&sesskey="+M.cfg.sesskey}))})).always(pendingPromise.resolve).catch(notification.exception)}})),$("body").on("click","a[data-action=addstandardtag]",(function(e){var pendingPromise=new Pending("core/tag:addstandardtag");return e.preventDefault(),ModalFactory.create({title:str.get_string("addotags","tag"),body:templates.render("core_tag/add_tags",{actionurl:window.location.href,sesskey:M.cfg.sesskey}),type:ModalFactory.types.SAVE_CANCEL}).then((function(modal){modal.setSaveButtonText(str.get_string("continue","core")),modal.getRoot().on(ModalEvents.save,(function(e){var tagsInput=$(e.currentTarget).find("#id_tagslist"),name=tagsInput.val().trim();tagsInput.val(name);var tagsForm=$("#addtags_form");return tagsForm.on("submit",(function(e){var form=$("#addtags_form");!1===form[0].checkValidity()&&(e.preventDefault(),e.stopPropagation()),form.addClass("was-validated"),$('[data-region="tagslistinput"]').addClass("error");var errorMessage=$("#id_tagslist_error_message");errorMessage.removeAttr("hidden"),errorMessage.addClass("help-block")})),tagsForm.submit(),!1})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show()})).always(pendingPromise.resolve).catch(notification.exception)}))},initManageCollectionsPage:function(){$("body").on("updated","[data-inplaceeditable]",(function(e){var areaid,collid,pendingPromise=new Pending("core/tag:initManageCollectionsPage-updated"),ajaxreturn=e.ajaxreturn;"core_tag"===ajaxreturn.component&&"tagareaenable"===ajaxreturn.itemtype&&(areaid=$(this).attr("data-itemid"),$(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").hide(),"1"===ajaxreturn.value?($(this).closest("tr").removeClass("dimmed_text"),collid=$(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value"),$(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").show()):$(this).closest("tr").addClass("dimmed_text")),"core_tag"===ajaxreturn.component&&"tagareacollection"===ajaxreturn.itemtype&&(areaid=$(this).attr("data-itemid"),$(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").hide(),collid=$(this).attr("data-value"),"1"===$(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value")&&$(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").show()),pendingPromise.resolve()})),$("body").on("click",".addtagcoll > a",(function(e){var pendingPromise=new Pending("core/tag:initManageCollectionsPage-addtagcoll");e.preventDefault();var href=$(this).attr("data-url"),saveButtonText="";str.get_strings([{key:"addtagcoll",component:"tag"},{key:"create",component:"core"}]).then((function(langStrings){var modalTitle=langStrings[0];saveButtonText=langStrings[1];var templateContext={actionurl:href,sesskey:M.cfg.sesskey};return ModalFactory.create({title:modalTitle,body:templates.render("core_tag/add_tag_collection",templateContext),type:ModalFactory.types.SAVE_CANCEL})})).then((function(modal){return modal.setSaveButtonText(saveButtonText),modal.getRoot().on(ModalEvents.save,(function(e){var collectionInput=$(e.currentTarget).find("#addtagcoll_name"),name=collectionInput.val().trim();collectionInput.val(name);var form=$("#addtagcoll_form");return form.on("submit",(function(e){!1===form[0].checkValidity()&&(e.preventDefault(),e.stopPropagation()),form.addClass("was-validated"),$('[data-region="addtagcoll_nameinput"]').addClass("error");var errorMessage=$("#id_addtagcoll_name_error_message");errorMessage.removeAttr("hidden"),errorMessage.addClass("help-block")})),form.submit(),!1})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show(),modal})).always(pendingPromise.resolve).catch(notification.exception)})),$("body").on("click",".tag-collections-table .action_delete",(function(e){var pendingPromise=new Pending("core/tag:initManageCollectionsPage-action_delete");e.preventDefault();var href=$(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;str.get_strings([{key:"delete"},{key:"suredeletecoll",component:"tag",param:$(this).attr("data-collname")},{key:"yes"},{key:"no"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=href}))})).always(pendingPromise.resolve).catch(notification.exception)}))}}})); +define("core/tag",["jquery","core/ajax","core/templates","core/notification","core/str","core/modal_factory","core/modal_events","core/pending"],(function($,ajax,templates,notification,str,ModalFactory,ModalEvents,Pending){return{initTagindexPage:function(){$("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",(function(e){var pendingPromise=new Pending("core/tag:initTagindexPage");e.preventDefault();var target=$(this),query=target[0].search.replace(/^\?/,""),tagarea=target.closest(".tagarea[data-ta]"),args=query.split("&").reduce((function(s,c){var t=c.split("=");return s[t[0]]=decodeURIComponent(t[1]),s}),{});ajax.call([{methodname:"core_tag_get_tagindex",args:{tagindex:args}}])[0].then((function(data){return templates.render("core_tag/index",data)})).then((function(html,js){templates.replaceNode(tagarea,html,js)})).always(pendingPromise.resolve).catch(notification.exception)}))},initManagePage:function(){$("body").on("updated","[data-inplaceeditable]",(function(e){var pendingPromise=new Pending("core/tag:initManagePage");if(str.get_strings([{key:"selecttag",component:"core_tag"},{key:"now",component:"core"}]).then((function(result){$('label[for="tagselect'+e.ajaxreturn.itemid+'"]').html(result[0]),$(e.target).closest("tr").find("td.col-timemodified").html(result[1])})).always(pendingPromise.resolve).catch(notification.exception),"tagflag"===e.ajaxreturn.itemtype){var row=$(e.target).closest("tr");"0"===e.ajaxreturn.value?row.removeClass("table-warning"):row.addClass("table-warning")}})),$(".tag-management-table").delegate("a.tagdelete","click",(function(e){var pendingPromise=new Pending("core/tag:tagdelete");e.preventDefault();var href=$(this).attr("href");str.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetag",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=href}))})).always(pendingPromise.resolve).catch(notification.exception)})),$("#tag-management-delete").click((function(e){var form=$(this).closest("form").get(0);if($(form).find("input[data-togglegroup='tags-manage'][data-toggle='slave']:checked").length){var pendingPromise=new Pending("core/tag:tag-management-delete"),tempElement=$("").attr("name",this.name);e.preventDefault(),str.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetags",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){tempElement.appendTo(form),form.submit()}))})).always(pendingPromise.resolve).catch(notification.exception)}})),$("#tag-management-combine").click((function(e){var pendingPromise=new Pending("core/tag:tag-management-combine");e.preventDefault();var form=$(this).closest("form").get(0),tags=$(form).find("input[data-togglegroup='tags-manage'][data-toggle='slave']:checked");if(tags.length<=1)str.get_strings([{key:"combineselected",component:"tag"},{key:"selectmultipletags",component:"tag"},{key:"ok"}]).then((function(s){return notification.alert(s[0],s[1],s[2])})).always(pendingPromise.resolve).catch(notification.exception);else{var tempElement=$("").attr("name",this.name),saveButtonText="",tagOptions=[];tags.each((function(){var tagid=$(this).val(),tagname=$(".inplaceeditable[data-itemtype=tagname][data-itemid="+tagid+"]").attr("data-value");tagOptions.push({id:tagid,name:tagname})})),str.get_strings([{key:"combineselected",component:"tag"},{key:"continue",component:"core"}]).then((function(langStrings){var modalTitle=langStrings[0];saveButtonText=langStrings[1];var templateContext={tags:tagOptions};return ModalFactory.create({title:modalTitle,body:templates.render("core_tag/combine_tags",templateContext),type:ModalFactory.types.SAVE_CANCEL})})).then((function(modal){return modal.setSaveButtonText(saveButtonText),modal})).then((function(modal){modal.getRoot().on(ModalEvents.save,(function(e){e.preventDefault(),tempElement.appendTo(form);var maintag=$("input[name=maintag]:checked","#combinetags_form").val();$("").attr("name","maintag").attr("value",maintag).appendTo(form),form.submit()})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show(),$("#combinetags_form input[type=radio]").first().focus().prop("checked",!0)})).always(pendingPromise.resolve).catch(notification.exception)}})),$("body").on("updatefailed","[data-inplaceeditable][data-itemtype=tagname]",(function(e){var exception=e.exception,newvalue=e.newvalue,tagid=$(e.target).attr("data-itemid");if("namesalreadybeeingused"===exception.errorcode){var pendingPromise=new Pending("core/tag:updatefailed");e.preventDefault(),str.get_strings([{key:"confirm",component:"core"},{key:"nameuseddocombine",component:"tag"},{key:"yes",component:"core"},{key:"cancel",component:"core"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=window.location.href+"&newname="+encodeURIComponent(newvalue)+"&tagid="+encodeURIComponent(tagid)+"&action=renamecombine&sesskey="+M.cfg.sesskey}))})).always(pendingPromise.resolve).catch(notification.exception)}})),$("body").on("click","a[data-action=addstandardtag]",(function(e){var pendingPromise=new Pending("core/tag:addstandardtag");return e.preventDefault(),ModalFactory.create({title:str.get_string("addotags","tag"),body:templates.render("core_tag/add_tags",{actionurl:window.location.href,sesskey:M.cfg.sesskey}),type:ModalFactory.types.SAVE_CANCEL}).then((function(modal){modal.setSaveButtonText(str.get_string("continue","core")),modal.getRoot().on(ModalEvents.save,(function(e){var tagsInput=$(e.currentTarget).find("#id_tagslist"),name=tagsInput.val().trim();tagsInput.val(name);var tagsForm=$("#addtags_form");return tagsForm.on("submit",(function(e){var form=$("#addtags_form");!1===form[0].checkValidity()&&(e.preventDefault(),e.stopPropagation()),form.addClass("was-validated"),$('[data-region="tagslistinput"]').addClass("error");var errorMessage=$("#id_tagslist_error_message");errorMessage.removeAttr("hidden"),errorMessage.addClass("help-block")})),tagsForm.submit(),!1})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show()})).always(pendingPromise.resolve).catch(notification.exception)}))},initManageCollectionsPage:function(){$("body").on("updated","[data-inplaceeditable]",(function(e){var areaid,collid,pendingPromise=new Pending("core/tag:initManageCollectionsPage-updated"),ajaxreturn=e.ajaxreturn;"core_tag"===ajaxreturn.component&&"tagareaenable"===ajaxreturn.itemtype&&(areaid=$(this).attr("data-itemid"),$(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").hide(),"1"===ajaxreturn.value?($(this).closest("tr").removeClass("dimmed_text"),collid=$(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value"),$(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").show()):$(this).closest("tr").addClass("dimmed_text")),"core_tag"===ajaxreturn.component&&"tagareacollection"===ajaxreturn.itemtype&&(areaid=$(this).attr("data-itemid"),$(".tag-collections-table ul[data-collectionid] li[data-areaid="+areaid+"]").hide(),collid=$(this).attr("data-value"),"1"===$(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value")&&$(".tag-collections-table ul[data-collectionid="+collid+"] li[data-areaid="+areaid+"]").show()),pendingPromise.resolve()})),$("body").on("click",".addtagcoll > a",(function(e){var pendingPromise=new Pending("core/tag:initManageCollectionsPage-addtagcoll");e.preventDefault();var href=$(this).attr("data-url"),saveButtonText="";str.get_strings([{key:"addtagcoll",component:"tag"},{key:"create",component:"core"}]).then((function(langStrings){var modalTitle=langStrings[0];saveButtonText=langStrings[1];var templateContext={actionurl:href,sesskey:M.cfg.sesskey};return ModalFactory.create({title:modalTitle,body:templates.render("core_tag/add_tag_collection",templateContext),type:ModalFactory.types.SAVE_CANCEL})})).then((function(modal){return modal.setSaveButtonText(saveButtonText),modal.getRoot().on(ModalEvents.save,(function(e){var collectionInput=$(e.currentTarget).find("#addtagcoll_name"),name=collectionInput.val().trim();collectionInput.val(name);var form=$("#addtagcoll_form");return form.on("submit",(function(e){!1===form[0].checkValidity()&&(e.preventDefault(),e.stopPropagation()),form.addClass("was-validated"),$('[data-region="addtagcoll_nameinput"]').addClass("error");var errorMessage=$("#id_addtagcoll_name_error_message");errorMessage.removeAttr("hidden"),errorMessage.addClass("help-block")})),form.submit(),!1})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal.show(),modal})).always(pendingPromise.resolve).catch(notification.exception)})),$("body").on("click",".tag-collections-table .action_delete",(function(e){var pendingPromise=new Pending("core/tag:initManageCollectionsPage-action_delete");e.preventDefault();var href=$(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;str.get_strings([{key:"delete"},{key:"suredeletecoll",component:"tag",param:$(this).attr("data-collname")},{key:"yes"},{key:"no"}]).then((function(s){return notification.confirm(s[0],s[1],s[2],s[3],(function(){window.location.href=href}))})).always(pendingPromise.resolve).catch(notification.exception)}))}}})); //# sourceMappingURL=tag.min.js.map \ No newline at end of file diff --git a/lib/amd/build/tag.min.js.map b/lib/amd/build/tag.min.js.map index 559ce4af5b9..9c1771b058d 100644 --- a/lib/amd/build/tag.min.js.map +++ b/lib/amd/build/tag.min.js.map @@ -1 +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 .\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 */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/pending',\n], function(\n $,\n ajax,\n templates,\n notification,\n str,\n ModalFactory,\n ModalEvents,\n Pending\n) {\n return /** @alias module:core/tag */ {\n\n /**\n * Initialises tag index page.\n *\n * @method initTagindexPage\n */\n initTagindexPage: function() {\n // Click handler for changing tag type.\n $('body').delegate('.tagarea[data-ta] a[data-quickload=1]', 'click', function(e) {\n var pendingPromise = new Pending('core/tag:initTagindexPage');\n\n e.preventDefault();\n var target = $(this);\n var query = target[0].search.replace(/^\\?/, '');\n var tagarea = target.closest('.tagarea[data-ta]');\n var args = query.split('&').reduce(function(s, c) {\n var t = c.split('=');\n s[t[0]] = decodeURIComponent(t[1]);\n return s;\n }, {});\n\n ajax.call([{\n methodname: 'core_tag_get_tagindex',\n args: {tagindex: args}\n }])[0]\n .then(function(data) {\n return templates.render('core_tag/index', data);\n })\n .then(function(html, js) {\n templates.replaceNode(tagarea, html, js);\n return;\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n },\n\n /**\n * Initialises tag management page.\n *\n * @method initManagePage\n */\n initManagePage: function() {\n // Set cell 'time modified' to 'now' when any of the element is updated in this row.\n $('body').on('updated', '[data-inplaceeditable]', function(e) {\n var pendingPromise = new Pending('core/tag:initManagePage');\n\n str.get_strings([\n {\n key: 'selecttag',\n component: 'core_tag',\n },\n {\n key: 'now',\n component: 'core',\n },\n ])\n .then(function(result) {\n $('label[for=\"tagselect' + e.ajaxreturn.itemid + '\"]').html(result[0]);\n $(e.target).closest('tr').find('td.col-timemodified').html(result[1]);\n\n return;\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n\n if (e.ajaxreturn.itemtype === 'tagflag') {\n var row = $(e.target).closest('tr');\n if (e.ajaxreturn.value === '0') {\n row.removeClass('table-warning');\n } else {\n row.addClass('table-warning');\n }\n }\n });\n\n // Confirmation for single tag delete link.\n $('.tag-management-table').delegate('a.tagdelete', 'click', function(e) {\n var pendingPromise = new Pending('core/tag:tagdelete');\n\n e.preventDefault();\n var href = $(this).attr('href');\n str.get_strings([\n {key: 'delete', component: 'core'},\n {key: 'confirmdeletetag', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = href;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n // Confirmation for bulk tag delete button.\n $(\"#tag-management-delete\").click(function(e) {\n var form = $(this).closest('form').get(0);\n\n var cnt = $(form).find(\"input[type=checkbox]:checked\").length;\n if (!cnt) {\n return;\n }\n\n var pendingPromise = new Pending('core/tag:tag-management-delete');\n var tempElement = $(\"\").attr('name', this.name);\n e.preventDefault();\n str.get_strings([\n {key: 'delete', component: 'core'},\n {key: 'confirmdeletetags', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n tempElement.appendTo(form);\n form.submit();\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n // Confirmation for bulk tag combine button.\n $(\"#tag-management-combine\").click(function(e) {\n var pendingPromise = new Pending('core/tag:tag-management-combine');\n\n e.preventDefault();\n var form = $(this).closest('form').get(0);\n var tags = $(form).find(\"input[type=checkbox]:checked\");\n\n if (tags.length <= 1) {\n str.get_strings([\n {key: 'combineselected', component: 'tag'},\n {key: 'selectmultipletags', component: 'tag'},\n {key: 'ok'},\n ])\n .then(function(s) {\n return notification.alert(s[0], s[1], s[2]);\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n\n return;\n }\n\n var tempElement = $(\"\").attr('name', this.name);\n var saveButtonText = '';\n var tagOptions = [];\n tags.each(function() {\n var tagid = $(this).val(),\n tagname = $('.inplaceeditable[data-itemtype=tagname][data-itemid=' + tagid + ']').attr('data-value');\n tagOptions.push({\n id: tagid,\n name: tagname\n });\n });\n\n str.get_strings([\n {key: 'combineselected', component: 'tag'},\n {key: 'continue', component: 'core'}\n ])\n .then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n var templateContext = {\n tags: tagOptions\n };\n return ModalFactory.create({\n title: modalTitle,\n body: templates.render('core_tag/combine_tags', templateContext),\n type: ModalFactory.types.SAVE_CANCEL\n });\n })\n .then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n\n return modal;\n })\n .then(function(modal) {\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(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 tempElement.appendTo(form);\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 $(\"\").attr('name', 'maintag').attr('value', maintag).appendTo(form);\n // Submit the tags list form.\n form.submit();\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n // Tick the first option.\n $('#combinetags_form input[type=radio]').first().focus().prop('checked', true);\n\n return;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\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]', function(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 var pendingPromise = new Pending('core/tag:updatefailed');\n\n e.preventDefault(); // This will prevent default error dialogue.\n str.get_strings([\n {key: 'confirm', component: 'core'},\n {key: 'nameuseddocombine', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'cancel', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = window.location.href + \"&newname=\" + encodeURIComponent(newvalue) +\n \"&tagid=\" + encodeURIComponent(tagid) +\n '&action=renamecombine&sesskey=' + M.cfg.sesskey;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n }\n });\n\n // Form for adding standard tags.\n $('body').on('click', 'a[data-action=addstandardtag]', function(e) {\n var pendingPromise = new Pending('core/tag:addstandardtag');\n e.preventDefault();\n\n return ModalFactory.create({\n title: str.get_string('addotags', 'tag'),\n body: templates.render('core_tag/add_tags', {\n actionurl: window.location.href,\n sesskey: M.cfg.sesskey\n }),\n type: ModalFactory.types.SAVE_CANCEL\n })\n .then(function(modal) {\n modal.setSaveButtonText(str.get_string('continue', 'core'));\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(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 // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n },\n\n /**\n * Initialises tag collection management page.\n *\n * @method initManageCollectionsPage\n */\n initManageCollectionsPage: function() {\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 $('body').on('click', '.addtagcoll > a', function(e) {\n var pendingPromise = new Pending('core/tag:initManageCollectionsPage-addtagcoll');\n\n e.preventDefault();\n var keys = [\n {\n key: 'addtagcoll',\n component: 'tag'\n },\n {\n key: 'create',\n component: 'core'\n }\n ];\n\n var href = $(this).attr('data-url');\n var saveButtonText = '';\n str.get_strings(keys)\n .then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n var templateContext = {\n actionurl: href,\n sesskey: M.cfg.sesskey\n };\n return ModalFactory.create({\n title: modalTitle,\n body: templates.render('core_tag/add_tag_collection', templateContext),\n type: ModalFactory.types.SAVE_CANCEL\n });\n })\n .then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n var collectionInput = $(e.currentTarget).find('#addtagcoll_name');\n var 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 var 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 var 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 // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n $('body').on('click', '.tag-collections-table .action_delete', function(e) {\n var pendingPromise = new Pending('core/tag:initManageCollectionsPage-action_delete');\n\n e.preventDefault();\n var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey;\n str.get_strings([\n {key: 'delete'},\n {key: 'suredeletecoll', component: 'tag', param: $(this).attr('data-collname')},\n {key: 'yes'},\n {key: 'no'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = href;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n };\n});\n"],"names":["define","$","ajax","templates","notification","str","ModalFactory","ModalEvents","Pending","initTagindexPage","delegate","e","pendingPromise","preventDefault","target","this","query","search","replace","tagarea","closest","args","split","reduce","s","c","t","decodeURIComponent","call","methodname","tagindex","then","data","render","html","js","replaceNode","always","resolve","catch","exception","initManagePage","on","get_strings","key","component","result","ajaxreturn","itemid","find","itemtype","row","value","removeClass","addClass","href","attr","confirm","window","location","click","form","get","length","tempElement","name","appendTo","submit","tags","alert","saveButtonText","tagOptions","each","tagid","val","tagname","push","id","langStrings","modalTitle","templateContext","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","save","maintag","hidden","destroy","show","first","focus","prop","newvalue","errorcode","encodeURIComponent","M","cfg","sesskey","get_string","actionurl","tagsInput","currentTarget","trim","tagsForm","checkValidity","stopPropagation","errorMessage","removeAttr","initManageCollectionsPage","areaid","collid","hide","collectionInput","param"],"mappings":"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"} \ No newline at end of file +{"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 .\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 */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/pending',\n], function(\n $,\n ajax,\n templates,\n notification,\n str,\n ModalFactory,\n ModalEvents,\n Pending\n) {\n return /** @alias module:core/tag */ {\n\n /**\n * Initialises tag index page.\n *\n * @method initTagindexPage\n */\n initTagindexPage: function() {\n // Click handler for changing tag type.\n $('body').delegate('.tagarea[data-ta] a[data-quickload=1]', 'click', function(e) {\n var pendingPromise = new Pending('core/tag:initTagindexPage');\n\n e.preventDefault();\n var target = $(this);\n var query = target[0].search.replace(/^\\?/, '');\n var tagarea = target.closest('.tagarea[data-ta]');\n var args = query.split('&').reduce(function(s, c) {\n var t = c.split('=');\n s[t[0]] = decodeURIComponent(t[1]);\n return s;\n }, {});\n\n ajax.call([{\n methodname: 'core_tag_get_tagindex',\n args: {tagindex: args}\n }])[0]\n .then(function(data) {\n return templates.render('core_tag/index', data);\n })\n .then(function(html, js) {\n templates.replaceNode(tagarea, html, js);\n return;\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n },\n\n /**\n * Initialises tag management page.\n *\n * @method initManagePage\n */\n initManagePage: function() {\n // Set cell 'time modified' to 'now' when any of the element is updated in this row.\n $('body').on('updated', '[data-inplaceeditable]', function(e) {\n var pendingPromise = new Pending('core/tag:initManagePage');\n\n str.get_strings([\n {\n key: 'selecttag',\n component: 'core_tag',\n },\n {\n key: 'now',\n component: 'core',\n },\n ])\n .then(function(result) {\n $('label[for=\"tagselect' + e.ajaxreturn.itemid + '\"]').html(result[0]);\n $(e.target).closest('tr').find('td.col-timemodified').html(result[1]);\n\n return;\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n\n if (e.ajaxreturn.itemtype === 'tagflag') {\n var row = $(e.target).closest('tr');\n if (e.ajaxreturn.value === '0') {\n row.removeClass('table-warning');\n } else {\n row.addClass('table-warning');\n }\n }\n });\n\n // Confirmation for single tag delete link.\n $('.tag-management-table').delegate('a.tagdelete', 'click', function(e) {\n var pendingPromise = new Pending('core/tag:tagdelete');\n\n e.preventDefault();\n var href = $(this).attr('href');\n str.get_strings([\n {key: 'delete', component: 'core'},\n {key: 'confirmdeletetag', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = href;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n // Confirmation for bulk tag delete button.\n $(\"#tag-management-delete\").click(function(e) {\n var form = $(this).closest('form').get(0);\n\n var cnt = $(form).find(\"input[data-togglegroup='tags-manage'][data-toggle='slave']:checked\").length;\n if (!cnt) {\n return;\n }\n\n var pendingPromise = new Pending('core/tag:tag-management-delete');\n var tempElement = $(\"\").attr('name', this.name);\n e.preventDefault();\n str.get_strings([\n {key: 'delete', component: 'core'},\n {key: 'confirmdeletetags', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n tempElement.appendTo(form);\n form.submit();\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n // Confirmation for bulk tag combine button.\n $(\"#tag-management-combine\").click(function(e) {\n var pendingPromise = new Pending('core/tag:tag-management-combine');\n\n e.preventDefault();\n var form = $(this).closest('form').get(0);\n var tags = $(form).find(\"input[data-togglegroup='tags-manage'][data-toggle='slave']:checked\");\n\n if (tags.length <= 1) {\n str.get_strings([\n {key: 'combineselected', component: 'tag'},\n {key: 'selectmultipletags', component: 'tag'},\n {key: 'ok'},\n ])\n .then(function(s) {\n return notification.alert(s[0], s[1], s[2]);\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n\n return;\n }\n\n var tempElement = $(\"\").attr('name', this.name);\n var saveButtonText = '';\n var tagOptions = [];\n tags.each(function() {\n var tagid = $(this).val(),\n tagname = $('.inplaceeditable[data-itemtype=tagname][data-itemid=' + tagid + ']').attr('data-value');\n tagOptions.push({\n id: tagid,\n name: tagname\n });\n });\n\n str.get_strings([\n {key: 'combineselected', component: 'tag'},\n {key: 'continue', component: 'core'}\n ])\n .then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n var templateContext = {\n tags: tagOptions\n };\n return ModalFactory.create({\n title: modalTitle,\n body: templates.render('core_tag/combine_tags', templateContext),\n type: ModalFactory.types.SAVE_CANCEL\n });\n })\n .then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n\n return modal;\n })\n .then(function(modal) {\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(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 tempElement.appendTo(form);\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 $(\"\").attr('name', 'maintag').attr('value', maintag).appendTo(form);\n // Submit the tags list form.\n form.submit();\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n // Tick the first option.\n $('#combinetags_form input[type=radio]').first().focus().prop('checked', true);\n\n return;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\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]', function(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 var pendingPromise = new Pending('core/tag:updatefailed');\n\n e.preventDefault(); // This will prevent default error dialogue.\n str.get_strings([\n {key: 'confirm', component: 'core'},\n {key: 'nameuseddocombine', component: 'tag'},\n {key: 'yes', component: 'core'},\n {key: 'cancel', component: 'core'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = window.location.href + \"&newname=\" + encodeURIComponent(newvalue) +\n \"&tagid=\" + encodeURIComponent(tagid) +\n '&action=renamecombine&sesskey=' + M.cfg.sesskey;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n }\n });\n\n // Form for adding standard tags.\n $('body').on('click', 'a[data-action=addstandardtag]', function(e) {\n var pendingPromise = new Pending('core/tag:addstandardtag');\n e.preventDefault();\n\n return ModalFactory.create({\n title: str.get_string('addotags', 'tag'),\n body: templates.render('core_tag/add_tags', {\n actionurl: window.location.href,\n sesskey: M.cfg.sesskey\n }),\n type: ModalFactory.types.SAVE_CANCEL\n })\n .then(function(modal) {\n modal.setSaveButtonText(str.get_string('continue', 'core'));\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(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 // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n },\n\n /**\n * Initialises tag collection management page.\n *\n * @method initManageCollectionsPage\n */\n initManageCollectionsPage: function() {\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 $('body').on('click', '.addtagcoll > a', function(e) {\n var pendingPromise = new Pending('core/tag:initManageCollectionsPage-addtagcoll');\n\n e.preventDefault();\n var keys = [\n {\n key: 'addtagcoll',\n component: 'tag'\n },\n {\n key: 'create',\n component: 'core'\n }\n ];\n\n var href = $(this).attr('data-url');\n var saveButtonText = '';\n str.get_strings(keys)\n .then(function(langStrings) {\n var modalTitle = langStrings[0];\n saveButtonText = langStrings[1];\n var templateContext = {\n actionurl: href,\n sesskey: M.cfg.sesskey\n };\n return ModalFactory.create({\n title: modalTitle,\n body: templates.render('core_tag/add_tag_collection', templateContext),\n type: ModalFactory.types.SAVE_CANCEL\n });\n })\n .then(function(modal) {\n modal.setSaveButtonText(saveButtonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n var collectionInput = $(e.currentTarget).find('#addtagcoll_name');\n var 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 var 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 var 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 // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n\n $('body').on('click', '.tag-collections-table .action_delete', function(e) {\n var pendingPromise = new Pending('core/tag:initManageCollectionsPage-action_delete');\n\n e.preventDefault();\n var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey;\n str.get_strings([\n {key: 'delete'},\n {key: 'suredeletecoll', component: 'tag', param: $(this).attr('data-collname')},\n {key: 'yes'},\n {key: 'no'},\n ])\n .then(function(s) {\n return notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location.href = href;\n });\n })\n .always(pendingPromise.resolve)\n .catch(notification.exception);\n });\n }\n };\n});\n"],"names":["define","$","ajax","templates","notification","str","ModalFactory","ModalEvents","Pending","initTagindexPage","delegate","e","pendingPromise","preventDefault","target","this","query","search","replace","tagarea","closest","args","split","reduce","s","c","t","decodeURIComponent","call","methodname","tagindex","then","data","render","html","js","replaceNode","always","resolve","catch","exception","initManagePage","on","get_strings","key","component","result","ajaxreturn","itemid","find","itemtype","row","value","removeClass","addClass","href","attr","confirm","window","location","click","form","get","length","tempElement","name","appendTo","submit","tags","alert","saveButtonText","tagOptions","each","tagid","val","tagname","push","id","langStrings","modalTitle","templateContext","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","save","maintag","hidden","destroy","show","first","focus","prop","newvalue","errorcode","encodeURIComponent","M","cfg","sesskey","get_string","actionurl","tagsInput","currentTarget","trim","tagsForm","checkValidity","stopPropagation","errorMessage","removeAttr","initManageCollectionsPage","areaid","collid","hide","collectionInput","param"],"mappings":"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"} \ No newline at end of file diff --git a/lib/amd/src/tag.js b/lib/amd/src/tag.js index 0f4ce0b39b2..23ae3e95b0e 100644 --- a/lib/amd/src/tag.js +++ b/lib/amd/src/tag.js @@ -142,7 +142,7 @@ define([ $("#tag-management-delete").click(function(e) { var form = $(this).closest('form').get(0); - var cnt = $(form).find("input[type=checkbox]:checked").length; + var cnt = $(form).find("input[data-togglegroup='tags-manage'][data-toggle='slave']:checked").length; if (!cnt) { return; } @@ -172,7 +172,7 @@ define([ e.preventDefault(); var form = $(this).closest('form').get(0); - var tags = $(form).find("input[type=checkbox]:checked"); + var tags = $(form).find("input[data-togglegroup='tags-manage'][data-toggle='slave']:checked"); if (tags.length <= 1) { str.get_strings([ diff --git a/tag/classes/manage_table.php b/tag/classes/manage_table.php index 7587b29576e..872c09234da 100644 --- a/tag/classes/manage_table.php +++ b/tag/classes/manage_table.php @@ -14,13 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -/** - * Contains class core_tag_manage_table - * - * @package core_tag - * @copyright 2015 Marina Glancy - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ +use core\output\checkbox_toggleall; defined('MOODLE_INTERNAL') || die(); @@ -29,7 +23,7 @@ require_once($CFG->libdir . '/tablelib.php'); /** * Class core_tag_manage_table * - * @package core + * @package core_tag * @copyright 2015 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -47,7 +41,8 @@ class core_tag_manage_table extends table_sql { * @param int $tagcollid */ public function __construct($tagcollid) { - global $USER, $CFG, $PAGE; + global $USER, $PAGE, $OUTPUT; + parent::__construct('tag-management-list-'.$USER->id); $this->tagcollid = $tagcollid; @@ -58,8 +53,16 @@ class core_tag_manage_table extends table_sql { $baseurl = new moodle_url('/tag/manage.php', array('tc' => $tagcollid, 'perpage' => $perpage, 'page' => $page, 'filter' => $filter)); + $checkboxall = new checkbox_toggleall('tags-manage', true, [ + 'id' => 'select-all-tags', + 'name' => 'select-all-tags', + 'checked' => false, + 'label' => get_string('selectall'), + 'labelclasses' => 'accesshide', + ]); + $tablecolumns = array('select', 'name', 'fullname', 'count', 'flag', 'timemodified', 'isstandard', 'controls'); - $tableheaders = array(get_string('select', 'tag'), + $tableheaders = array($OUTPUT->render($checkboxall), get_string('name', 'tag'), get_string('owner', 'tag'), get_string('count', 'tag'), @@ -176,6 +179,20 @@ class core_tag_manage_table extends table_sql { } } + /** + * Override the table show_hide_link to not show for select column. + * + * @param string $column the column name, index into various names + * @param int $index numerical index of the column + * @return string HTML fragment + */ + protected function show_hide_link($column, $index) { + if ($index > 0) { + return parent::show_hide_link($column, $index); + } + return ''; + } + /** * Get any extra classes names to add to this row in the HTML * @@ -252,11 +269,18 @@ class core_tag_manage_table extends table_sql { * @return string */ public function col_select($tag) { - $id = "tagselect" . $tag->id; - return html_writer::label(get_string('selecttag', 'tag', $tag->rawname), $id, - false, array('class' => 'accesshide')). - html_writer::empty_tag('input', array('type' => 'checkbox', - 'name' => 'tagschecked[]', 'value' => $tag->id, 'id' => $id)); + global $OUTPUT; + + $checkbox = new checkbox_toggleall('tags-manage', false, [ + 'id' => 'tagselect' . $tag->id, + 'name' => 'tagschecked[]', + 'value' => $tag->id, + 'checked' => false, + 'label' => get_string('selecttag', 'tag', $tag->rawname), + 'labelclasses' => 'accesshide', + ]); + + return $OUTPUT->render($checkbox); } /** diff --git a/tag/tests/behat/delete_tag.feature b/tag/tests/behat/delete_tag.feature index b29b1469ac8..0da6773cbf2 100644 --- a/tag/tests/behat/delete_tag.feature +++ b/tag/tests/behat/delete_tag.feature @@ -104,3 +104,18 @@ Feature: Manager is able to delete tags And I should see "Cat" And I should not see "Dog" And I log out + + @javascript + Scenario: Delete all tags + When I log in as "manager1" + And I navigate to "Appearance > Manage tags" in site administration + And I follow "Default collection" + And I set the field "Select all" to "1" + And I press "Delete selected" + And I click on "Yes" "button" in the "Delete" "dialogue" + Then I should see "Tag(s) deleted" + And I should see "Nothing to display" + And I should not see "Cat" + And I should not see "Dog" + And I should not see "Turtle" + And I should not see "Neverusedtag" diff --git a/tag/tests/behat/edit_tag.feature b/tag/tests/behat/edit_tag.feature index ec68ee3da72..791ce537b8f 100644 --- a/tag/tests/behat/edit_tag.feature +++ b/tag/tests/behat/edit_tag.feature @@ -225,6 +225,21 @@ Feature: Users can edit tags to add description or rename # Even though Turtle was not standard but at least one of combined tags was (Neverusedtag). Now Turtle is also standard. And "Remove from standard tags" "link" should exist in the "Turtle" "table_row" + @javascript + Scenario: Combining all tags + When I log in as "manager1" + And I navigate to "Appearance > Manage tags" in site administration + And I follow "Default collection" + And I set the field "Select all" to "1" + And I press "Combine selected" + And I set the field "Turtle" in the "Combine selected" "dialogue" to "1" + And I click on "Continue" "button" in the "Combine selected" "dialogue" + Then I should see "Tags are combined" + And I should not see "Cat" + And I should not see "Dog" + And I should see "Turtle" + And I should not see "Neverusedtag" + Scenario: Filtering tags When I log in as "manager1" And I navigate to "Appearance > Manage tags" in site administration