diff --git a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js
index b255da72bc2..0a642f0c6b4 100644
--- a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js
+++ b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js
@@ -1,2 +1,2 @@
-define ("tool_policy/acceptances_filter_datasource",["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function list(b,c){var d=[],e=a(b),f=a(b).data("originaloptionsjson"),g=e.val();a.each(f,function(b,e){if(""!==a.trim(c)&&-1===e.label.toLocaleLowerCase().indexOf(c.toLocaleLowerCase())){return!0}if(-1.\n\n/**\n * Datasource for the tool_policy/acceptances_filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package tool_policy\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_policy/acceptances_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if ($.trim(query) !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"acceptances_filter_datasource.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/acceptances_filter_datasource.js"],"names":["define","$","Ajax","Notification","list","selector","query","filteredOptions","el","originalOptions","data","selectedFilters","val","each","index","option","trim","label","toLocaleLowerCase","indexOf","inArray","value","push","deferred","Deferred","resolve","promise","processResults","results","options","transport","callback","then","catch","exception"],"mappings":"AAyBAA,OAAM,6CAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CAA+C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CAEjF,MAAsE,CAQlEC,IAAI,CAAE,cAASC,CAAT,CAAmBC,CAAnB,CAA0B,IACxBC,CAAAA,CAAe,CAAG,EADM,CAGxBC,CAAE,CAAGP,CAAC,CAACI,CAAD,CAHkB,CAIxBI,CAAe,CAAGR,CAAC,CAACI,CAAD,CAAD,CAAYK,IAAZ,CAAiB,qBAAjB,CAJM,CAKxBC,CAAe,CAAGH,CAAE,CAACI,GAAH,EALM,CAM5BX,CAAC,CAACY,IAAF,CAAOJ,CAAP,CAAwB,SAASK,CAAT,CAAgBC,CAAhB,CAAwB,CAE5C,GAAqB,EAAjB,GAAAT,CAAK,CAACU,IAAN,IAA+F,CAAC,CAAzE,GAAAD,CAAM,CAACE,KAAP,CAAaC,iBAAb,GAAiCC,OAAjC,CAAyCb,CAAK,CAACY,iBAAN,EAAzC,CAA3B,CAAuG,CACnG,QACH,CAED,GAA+C,CAAC,CAA5C,CAAAjB,CAAC,CAACmB,OAAF,CAAUL,CAAM,CAACM,KAAjB,CAAwBV,CAAxB,CAAJ,CAAmD,CAC/C,QACH,CAEDJ,CAAe,CAACe,IAAhB,CAAqBP,CAArB,EACA,QACH,CAZD,EAcA,GAAIQ,CAAAA,CAAQ,CAAG,GAAItB,CAAAA,CAAC,CAACuB,QAArB,CACAD,CAAQ,CAACE,OAAT,CAAiBlB,CAAjB,EAEA,MAAOgB,CAAAA,CAAQ,CAACG,OAAT,EACV,CAhCiE,CAyClEC,cAAc,CAAE,wBAAStB,CAAT,CAAmBuB,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAO,CAAG,EAAd,CACA5B,CAAC,CAACY,IAAF,CAAOe,CAAP,CAAgB,SAASd,CAAT,CAAgBJ,CAAhB,CAAsB,CAClCmB,CAAO,CAACP,IAAR,CAAa,CACTD,KAAK,CAAEX,CAAI,CAACW,KADH,CAETJ,KAAK,CAAEP,CAAI,CAACO,KAFH,CAAb,CAIH,CALD,EAMA,MAAOY,CAAAA,CACV,CAlDiE,CA4DlEC,SAAS,CAAE,mBAASzB,CAAT,CAAmBC,CAAnB,CAA0ByB,CAA1B,CAAoC,CAC3C,KAAK3B,IAAL,CAAUC,CAAV,CAAoBC,CAApB,EAA2B0B,IAA3B,CAAgCD,CAAhC,EAA0CE,KAA1C,CAAgD9B,CAAY,CAAC+B,SAA7D,CACH,CA9DiE,CAiEzE,CAnEK,CAAN","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 * Datasource for the tool_policy/acceptances_filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package tool_policy\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_policy/acceptances_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"acceptances_filter_datasource.min.js"}
\ No newline at end of file
diff --git a/admin/tool/policy/amd/src/acceptances_filter_datasource.js b/admin/tool/policy/amd/src/acceptances_filter_datasource.js
index 7b1f98e2b4c..94ad9d95b1c 100644
--- a/admin/tool/policy/amd/src/acceptances_filter_datasource.js
+++ b/admin/tool/policy/amd/src/acceptances_filter_datasource.js
@@ -41,7 +41,7 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat
var selectedFilters = el.val();
$.each(originalOptions, function(index, option) {
// Skip option if it does not contain the query string.
- if ($.trim(query) !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {
+ if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {
return true;
}
// Skip filters that have already been selected.
diff --git a/grade/grading/form/guide/amd/build/comment_chooser.min.js b/grade/grading/form/guide/amd/build/comment_chooser.min.js
index 2d0d019e994..69f6230e868 100644
--- a/grade/grading/form/guide/amd/build/comment_chooser.min.js
+++ b/grade/grading/form/guide/amd/build/comment_chooser.min.js
@@ -1,2 +1,2 @@
-define ("gradingform_guide/comment_chooser",["jquery","core/templates","core/notification","core/yui"],function(a,b,c){return{initialise:function initialise(d,e,f,g){function h(b,c){var e="",g="comment-chooser-"+d+"-cancel",h="",i=new M.core.dialogue({modal:!0,headerContent:e,bodyContent:b,footerContent:h,focusAfterHide:"#"+f,id:"comments-chooser-dialog-"+d});a("#"+g).click(function(){i.hide()});a.each(c,function(b,c){var e="#comment-option-"+d+"-"+c.id;a(e).click(function(){var b=a("#"+f),d=b.val();if(""!==a.trim(d)){d+="\n"}d+=c.description;b.val(d);i.hide()});a(document).off("keypress",e).on("keypress",e,function(){var b=event.which||event.keyCode;if(13==b||32==b){a(e).click()}})});i.after("visibleChange",function(a){if(a.prevVal&&!a.newVal){this.destroy()}},i);i.show()}function i(){b.render("gradingform_guide/comment_chooser",{criterionId:d,comments:g}).done(function(a){h(a,g)}).fail(c.exception)}a("#"+e).click(function(a){a.preventDefault();i()})}}});
+define ("gradingform_guide/comment_chooser",["jquery","core/templates","core/notification","core/yui"],function(a,b,c){return{initialise:function initialise(d,e,f,g){function h(b,c){var e="",g="comment-chooser-"+d+"-cancel",h="",i=new M.core.dialogue({modal:!0,headerContent:e,bodyContent:b,footerContent:h,focusAfterHide:"#"+f,id:"comments-chooser-dialog-"+d});a("#"+g).click(function(){i.hide()});a.each(c,function(b,c){var e="#comment-option-"+d+"-"+c.id;a(e).click(function(){var b=a("#"+f),d=b.val();if(""!==d.trim()){d+="\n"}d+=c.description;b.val(d);i.hide()});a(document).off("keypress",e).on("keypress",e,function(){var b=event.which||event.keyCode;if(13==b||32==b){a(e).click()}})});i.after("visibleChange",function(a){if(a.prevVal&&!a.newVal){this.destroy()}},i);i.show()}function i(){b.render("gradingform_guide/comment_chooser",{criterionId:d,comments:g}).done(function(a){h(a,g)}).fail(c.exception)}a("#"+e).click(function(a){a.preventDefault();i()})}}});
//# sourceMappingURL=comment_chooser.min.js.map
diff --git a/grade/grading/form/guide/amd/build/comment_chooser.min.js.map b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map
index 15f5ce1c466..9c907aff0b4 100644
--- a/grade/grading/form/guide/amd/build/comment_chooser.min.js.map
+++ b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/comment_chooser.js"],"names":["define","$","templates","notification","initialise","criterionId","buttonId","remarkId","commentOptions","displayChooserDialog","compiledSource","comments","titleLabel","M","util","get_string","cancelButtonId","cancelButton","chooserDialog","core","dialogue","modal","headerContent","bodyContent","footerContent","focusAfterHide","id","click","hide","each","index","comment","commentOptionId","remarkTextArea","remarkText","val","trim","description","document","off","on","keyCode","event","which","after","e","prevVal","newVal","destroy","show","generateCommentsChooser","render","done","fail","exception","preventDefault"],"mappings":"AAwBAA,OAAM,qCAAC,CAAC,QAAD,CAAW,gBAAX,CAA6B,mBAA7B,CAAkD,UAAlD,CAAD,CAAgE,SAASC,CAAT,CAAYC,CAAZ,CAAuBC,CAAvB,CAAqC,CAIvG,MAA8D,CAa1DC,UAAU,CAAE,oBAASC,CAAT,CAAsBC,CAAtB,CAAgCC,CAAhC,CAA0CC,CAA1C,CAA0D,CAQlE,QAASC,CAAAA,CAAT,CAA8BC,CAA9B,CAA8CC,CAA9C,CAAwD,IAChDC,CAAAA,CAAU,CAAG,UAAYC,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkB,eAAlB,CAAmC,mBAAnC,CAAZ,CAAsE,UADnC,CAEhDC,CAAc,CAAG,mBAAqBX,CAArB,CAAmC,SAFJ,CAGhDY,CAAY,CAAG,gBAAiBD,CAAjB,CAAkC,KAAlC,CAAyCH,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkB,QAAlB,CAA4B,QAA5B,CAAzC,CAAiF,WAHhD,CAMhDG,CAAa,CAAG,GAAIL,CAAAA,CAAC,CAACM,IAAF,CAAOC,QAAX,CAAoB,CACpCC,KAAK,GAD+B,CAEpCC,aAAa,CAAEV,CAFqB,CAGpCW,WAAW,CAAEb,CAHuB,CAIpCc,aAAa,CAAEP,CAJqB,CAKpCQ,cAAc,CAAE,IAAMlB,CALc,CAMpCmB,EAAE,CAAE,2BAA6BrB,CANG,CAApB,CANgC,CAgBpDJ,CAAC,CAAC,IAAMe,CAAP,CAAD,CAAwBW,KAAxB,CAA8B,UAAW,CACrCT,CAAa,CAACU,IAAd,EACH,CAFD,EAKA3B,CAAC,CAAC4B,IAAF,CAAOlB,CAAP,CAAiB,SAASmB,CAAT,CAAgBC,CAAhB,CAAyB,CACtC,GAAIC,CAAAA,CAAe,CAAG,mBAAqB3B,CAArB,CAAmC,GAAnC,CAAyC0B,CAAO,CAACL,EAAvE,CAGAzB,CAAC,CAAC+B,CAAD,CAAD,CAAmBL,KAAnB,CAAyB,UAAW,IAC5BM,CAAAA,CAAc,CAAGhC,CAAC,CAAC,IAAMM,CAAP,CADU,CAE5B2B,CAAU,CAAGD,CAAc,CAACE,GAAf,EAFe,CAKhC,GAA2B,EAAvB,GAAAlC,CAAC,CAACmC,IAAF,CAAOF,CAAP,CAAJ,CAA+B,CAC3BA,CAAU,EAAI,IACjB,CACDA,CAAU,EAAIH,CAAO,CAACM,WAAtB,CAEAJ,CAAc,CAACE,GAAf,CAAmBD,CAAnB,EAEAhB,CAAa,CAACU,IAAd,EACH,CAbD,EAgBA3B,CAAC,CAACqC,QAAD,CAAD,CAAYC,GAAZ,CAAgB,UAAhB,CAA4BP,CAA5B,EAA6CQ,EAA7C,CAAgD,UAAhD,CAA4DR,CAA5D,CAA6E,UAAW,CACpF,GAAIS,CAAAA,CAAO,CAAGC,KAAK,CAACC,KAAN,EAAeD,KAAK,CAACD,OAAnC,CAGA,GAAe,EAAX,EAAAA,CAAO,EAAqB,EAAX,EAAAA,CAArB,CAAoC,CAEhCxC,CAAC,CAAC+B,CAAD,CAAD,CAAmBL,KAAnB,EACH,CACJ,CARD,CASH,CA7BD,EAiCAT,CAAa,CAAC0B,KAAd,CAAoB,eAApB,CAAqC,SAASC,CAAT,CAAY,CAE7C,GAAIA,CAAC,CAACC,OAAF,EAAa,CAACD,CAAC,CAACE,MAApB,CAA4B,CACxB,KAAKC,OAAL,EACH,CACJ,CALD,CAKG9B,CALH,EAQAA,CAAa,CAAC+B,IAAd,EACH,CAKD,QAASC,CAAAA,CAAT,EAAmC,CAQ/BhD,CAAS,CAACiD,MAAV,CAAiB,mCAAjB,CANc,CACV9C,WAAW,CAAEA,CADH,CAEVM,QAAQ,CAAEH,CAFA,CAMd,EACK4C,IADL,CACU,SAAS1C,CAAT,CAAyB,CAC3BD,CAAoB,CAACC,CAAD,CAAiBF,CAAjB,CACvB,CAHL,EAIK6C,IAJL,CAIUlD,CAAY,CAACmD,SAJvB,CAKH,CAGDrD,CAAC,CAAC,IAAMK,CAAP,CAAD,CAAkBqB,KAAlB,CAAwB,SAASkB,CAAT,CAAY,CAChCA,CAAC,CAACU,cAAF,GACAL,CAAuB,EAC1B,CAHD,CAIH,CA7GyD,CA+GjE,CAnHK,CAAN","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 * AMD code for the frequently used comments chooser for the marking guide grading form.\n *\n * @module gradingform_guide/comment_chooser\n * @class comment_chooser\n * @package core\n * @copyright 2015 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($, templates, notification) {\n\n // Private variables and functions.\n\n return /** @alias module:gradingform_guide/comment_chooser */ {\n // Public variables and functions.\n /**\n * Initialises the module.\n *\n * Basically, it performs the binding and handling of the button click event for\n * the 'Insert frequently used comment' button.\n *\n * @param {Integer} criterionId The criterion ID.\n * @param {String} buttonId The element ID of the button which the handler will be bound to.\n * @param {String} remarkId The element ID of the remark text area where the text of the selected comment will be copied to.\n * @param {Array} commentOptions The array of frequently used comments to be used as options.\n */\n initialise: function(criterionId, buttonId, remarkId, commentOptions) {\n /**\n * Display the chooser dialog using the compiled HTML from the mustache template\n * and binds onclick events for the generated comment options.\n *\n * @param {String} compiledSource The compiled HTML from the mustache template\n * @param {Array} comments Array containing comments.\n */\n function displayChooserDialog(compiledSource, comments) {\n var titleLabel = '';\n var cancelButtonId = 'comment-chooser-' + criterionId + '-cancel';\n var cancelButton = '';\n\n // Set dialog's body content.\n var chooserDialog = new M.core.dialogue({\n modal: true,\n headerContent: titleLabel,\n bodyContent: compiledSource,\n footerContent: cancelButton,\n focusAfterHide: '#' + remarkId,\n id: \"comments-chooser-dialog-\" + criterionId\n });\n\n // Bind click event to the cancel button.\n $(\"#\" + cancelButtonId).click(function() {\n chooserDialog.hide();\n });\n\n // Loop over each comment item and bind click events.\n $.each(comments, function(index, comment) {\n var commentOptionId = '#comment-option-' + criterionId + '-' + comment.id;\n\n // Delegate click event for the generated option link.\n $(commentOptionId).click(function() {\n var remarkTextArea = $('#' + remarkId);\n var remarkText = remarkTextArea.val();\n\n // Add line break if the current value of the remark text is not empty.\n if ($.trim(remarkText) !== '') {\n remarkText += '\\n';\n }\n remarkText += comment.description;\n\n remarkTextArea.val(remarkText);\n\n chooserDialog.hide();\n });\n\n // Handle keypress on list items.\n $(document).off('keypress', commentOptionId).on('keypress', commentOptionId, function() {\n var keyCode = event.which || event.keyCode;\n\n // Enter or space key.\n if (keyCode == 13 || keyCode == 32) {\n // Trigger click event.\n $(commentOptionId).click();\n }\n });\n });\n\n // Destroy the dialog when it is hidden to allow the grading section to\n // be loaded as a fragment multiple times within the same page.\n chooserDialog.after('visibleChange', function(e) {\n // Going from visible to hidden.\n if (e.prevVal && !e.newVal) {\n this.destroy();\n }\n }, chooserDialog);\n\n // Show dialog.\n chooserDialog.show();\n }\n\n /**\n * Generates the comments chooser dialog from the grading_form/comment_chooser mustache template.\n */\n function generateCommentsChooser() {\n // Template context.\n var context = {\n criterionId: criterionId,\n comments: commentOptions\n };\n\n // Render the template and display the comment chooser dialog.\n templates.render('gradingform_guide/comment_chooser', context)\n .done(function(compiledSource) {\n displayChooserDialog(compiledSource, commentOptions);\n })\n .fail(notification.exception);\n }\n\n // Bind click event for the comments chooser button.\n $(\"#\" + buttonId).click(function(e) {\n e.preventDefault();\n generateCommentsChooser();\n });\n }\n };\n});\n"],"file":"comment_chooser.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/comment_chooser.js"],"names":["define","$","templates","notification","initialise","criterionId","buttonId","remarkId","commentOptions","displayChooserDialog","compiledSource","comments","titleLabel","M","util","get_string","cancelButtonId","cancelButton","chooserDialog","core","dialogue","modal","headerContent","bodyContent","footerContent","focusAfterHide","id","click","hide","each","index","comment","commentOptionId","remarkTextArea","remarkText","val","trim","description","document","off","on","keyCode","event","which","after","e","prevVal","newVal","destroy","show","generateCommentsChooser","render","done","fail","exception","preventDefault"],"mappings":"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","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 * AMD code for the frequently used comments chooser for the marking guide grading form.\n *\n * @module gradingform_guide/comment_chooser\n * @class comment_chooser\n * @package core\n * @copyright 2015 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($, templates, notification) {\n\n // Private variables and functions.\n\n return /** @alias module:gradingform_guide/comment_chooser */ {\n // Public variables and functions.\n /**\n * Initialises the module.\n *\n * Basically, it performs the binding and handling of the button click event for\n * the 'Insert frequently used comment' button.\n *\n * @param {Integer} criterionId The criterion ID.\n * @param {String} buttonId The element ID of the button which the handler will be bound to.\n * @param {String} remarkId The element ID of the remark text area where the text of the selected comment will be copied to.\n * @param {Array} commentOptions The array of frequently used comments to be used as options.\n */\n initialise: function(criterionId, buttonId, remarkId, commentOptions) {\n /**\n * Display the chooser dialog using the compiled HTML from the mustache template\n * and binds onclick events for the generated comment options.\n *\n * @param {String} compiledSource The compiled HTML from the mustache template\n * @param {Array} comments Array containing comments.\n */\n function displayChooserDialog(compiledSource, comments) {\n var titleLabel = '';\n var cancelButtonId = 'comment-chooser-' + criterionId + '-cancel';\n var cancelButton = '';\n\n // Set dialog's body content.\n var chooserDialog = new M.core.dialogue({\n modal: true,\n headerContent: titleLabel,\n bodyContent: compiledSource,\n footerContent: cancelButton,\n focusAfterHide: '#' + remarkId,\n id: \"comments-chooser-dialog-\" + criterionId\n });\n\n // Bind click event to the cancel button.\n $(\"#\" + cancelButtonId).click(function() {\n chooserDialog.hide();\n });\n\n // Loop over each comment item and bind click events.\n $.each(comments, function(index, comment) {\n var commentOptionId = '#comment-option-' + criterionId + '-' + comment.id;\n\n // Delegate click event for the generated option link.\n $(commentOptionId).click(function() {\n var remarkTextArea = $('#' + remarkId);\n var remarkText = remarkTextArea.val();\n\n // Add line break if the current value of the remark text is not empty.\n if (remarkText.trim() !== '') {\n remarkText += '\\n';\n }\n remarkText += comment.description;\n\n remarkTextArea.val(remarkText);\n\n chooserDialog.hide();\n });\n\n // Handle keypress on list items.\n $(document).off('keypress', commentOptionId).on('keypress', commentOptionId, function() {\n var keyCode = event.which || event.keyCode;\n\n // Enter or space key.\n if (keyCode == 13 || keyCode == 32) {\n // Trigger click event.\n $(commentOptionId).click();\n }\n });\n });\n\n // Destroy the dialog when it is hidden to allow the grading section to\n // be loaded as a fragment multiple times within the same page.\n chooserDialog.after('visibleChange', function(e) {\n // Going from visible to hidden.\n if (e.prevVal && !e.newVal) {\n this.destroy();\n }\n }, chooserDialog);\n\n // Show dialog.\n chooserDialog.show();\n }\n\n /**\n * Generates the comments chooser dialog from the grading_form/comment_chooser mustache template.\n */\n function generateCommentsChooser() {\n // Template context.\n var context = {\n criterionId: criterionId,\n comments: commentOptions\n };\n\n // Render the template and display the comment chooser dialog.\n templates.render('gradingform_guide/comment_chooser', context)\n .done(function(compiledSource) {\n displayChooserDialog(compiledSource, commentOptions);\n })\n .fail(notification.exception);\n }\n\n // Bind click event for the comments chooser button.\n $(\"#\" + buttonId).click(function(e) {\n e.preventDefault();\n generateCommentsChooser();\n });\n }\n };\n});\n"],"file":"comment_chooser.min.js"}
\ No newline at end of file
diff --git a/grade/grading/form/guide/amd/src/comment_chooser.js b/grade/grading/form/guide/amd/src/comment_chooser.js
index 09ffb0cf4fb..b7a48311a96 100644
--- a/grade/grading/form/guide/amd/src/comment_chooser.js
+++ b/grade/grading/form/guide/amd/src/comment_chooser.js
@@ -77,7 +77,7 @@ define(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($
var remarkText = remarkTextArea.val();
// Add line break if the current value of the remark text is not empty.
- if ($.trim(remarkText) !== '') {
+ if (remarkText.trim() !== '') {
remarkText += '\n';
}
remarkText += comment.description;
diff --git a/lib/amd/build/permissionmanager.min.js b/lib/amd/build/permissionmanager.min.js
index 3e200156772..c31b82dc31e 100644
--- a/lib/amd/build/permissionmanager.min.js
+++ b/lib/amd/build/permissionmanager.min.js
@@ -1,2 +1,2 @@
-define ("core/permissionmanager",["jquery","core/config","core/notification","core/templates","core/yui"],function(a,b,c,d,e){var f={ADDROLE:"a.allowlink, a.prohibitlink",REMOVEROLE:"a.preventlink, a.unprohibitlink",UNPROHIBIT:"a.unprohibitlink"},g=a.Event("rolesloaded"),h,j,k,l,m=null,n=function loadOverideableRoles(){var d={contextid:h,getroles:1,sesskey:b.sesskey};a.post(k+"roles/ajax.php",d,null,"json").done(function(b){try{l=b;n=function loadOverideableRoles(){a("body").trigger(g)};n()}catch(a){c.exception(a)}}).fail(function(a,b,d){c.exception(d)})},o=function(b,e,f){var g={contextid:h,roleid:e,sesskey:M.cfg.sesskey,action:f,capability:b.data("name")};a.post(k+"roles/ajax.php",g,null,"json").done(function(f){var g=f;try{var h={rolename:l[e],roleid:e,adminurl:k,imageurl:M.util.image_url("t/delete","moodle")};switch(g){case"allow":h.spanclass="allowed";h.linkclass="preventlink";h.action="prevent";h.icon="t/delete";h.iconalt=M.util.get_string("deletexrole","core_role",l[e]);break;case"prohibit":h.spanclass="forbidden";h.linkclass="unprohibitlink";h.action="unprohibit";h.icon="t/delete";h.iconalt=M.util.get_string("deletexrole","core_role",l[e]);break;case"prevent":b.find("a[data-role-id=\""+e+"\"]").first().closest(".allowed").remove();return;case"unprohibit":b.find("a[data-role-id=\""+e+"\"]").first().closest(".forbidden").remove();return;default:return;}d.render("core/permissionmanager_role",h).done(function(c){if("allow"==g){a(c).insertBefore(b.find(".allowmore:first"))}else if("prohibit"==g){a(c).insertBefore(b.find(".prohibitmore:first"));var d=b.find(".allowedroles").first().find("a[data-role-id=\""+e+"\"]");if(d){d.first().closest(".allowed").remove()}}m.hide()}).fail(c.exception)}catch(a){c.exception(a)}}).fail(function(a,b,d){c.exception(d)})},p=function(b){b.preventDefault();var g=a(b.currentTarget);a("body").one("rolesloaded",function(){e.use("moodle-core-notification-dialogue",function(){var b=g.data("action"),h=g.closest("tr.rolecap"),k={cap:h.data("humanname"),context:j},n=M.util.get_string("role"+b+"info","core_role",k);if(null===m){m=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,width:"450px"})}m.set("headerContent",M.util.get_string("role"+b+"header","core_role"));var p,e,q=[];switch(b){case"allow":e=h.find(f.REMOVEROLE);break;case"prohibit":e=h.find(f.UNPROHIBIT);break;}for(p in l){var r="",s=e.filter("[data-role-id='"+p+"']").length;if(s){r="disabled"}var t={roleid:p,rolename:l[p],disabled:r};q.push(t)}d.render("core/permissionmanager_panelcontent",{message:n,roles:q}).done(function(c){m.set("bodyContent",c);m.show();a("div.role_buttons").on("click","button",function(c){var d=a(c.currentTarget).data("role-id");o(h,d,b)})}).fail(c.exception)})});n()},q=function(b){b.preventDefault();var d=a(b.currentTarget);a("body").one("rolesloaded",function(){var a=d.data("action"),b=d.data("role-id"),e=d.closest("tr.rolecap"),f={role:l[b],cap:e.data("humanname"),context:j};c.confirm(M.util.get_string("confirmunassigntitle","core_role"),M.util.get_string("confirmrole"+a,"core_role",f),M.util.get_string("confirmunassignyes","core_role"),M.util.get_string("confirmunassignno","core_role"),function(){o(e,b,a)})});n()};return{initialize:function initialize(b){h=b.contextid;j=b.contextname;k=b.adminurl;var c=a("body");c.on("click",f.ADDROLE,p);c.on("click",f.REMOVEROLE,q)}}});
+define ("core/permissionmanager",["jquery","core/config","core/notification","core/templates","core/yui"],function(a,b,c,d,e){var f={ADDROLE:"a.allowlink, a.prohibitlink",REMOVEROLE:"a.preventlink, a.unprohibitlink",UNPROHIBIT:"a.unprohibitlink"},g=a.Event("rolesloaded"),h,j,k,l,m=null,n=function loadOverideableRoles(){var d={contextid:h,getroles:1,sesskey:b.sesskey};a.post(k+"roles/ajax.php",d,null,"json").done(function(b){try{l=b;n=function loadOverideableRoles(){a("body").trigger(g)};n()}catch(a){c.exception(a)}}).fail(function(a,b,d){c.exception(d)})},o=function(b,e,f){var g={contextid:h,roleid:e,sesskey:M.cfg.sesskey,action:f,capability:b.data("name")};a.post(k+"roles/ajax.php",g,null,"json").done(function(f){var g=f;try{var h={rolename:l[e],roleid:e,adminurl:k,imageurl:M.util.image_url("t/delete","moodle")};switch(g){case"allow":h.spanclass="allowed";h.linkclass="preventlink";h.action="prevent";h.icon="t/delete";h.iconalt=M.util.get_string("deletexrole","core_role",l[e]);break;case"prohibit":h.spanclass="forbidden";h.linkclass="unprohibitlink";h.action="unprohibit";h.icon="t/delete";h.iconalt=M.util.get_string("deletexrole","core_role",l[e]);break;case"prevent":b.find("a[data-role-id=\""+e+"\"]").first().closest(".allowed").remove();return;case"unprohibit":b.find("a[data-role-id=\""+e+"\"]").first().closest(".forbidden").remove();return;default:return;}d.render("core/permissionmanager_role",h).done(function(c){if("allow"==g){a(c).insertBefore(b.find(".allowmore").first())}else if("prohibit"==g){a(c).insertBefore(b.find(".prohibitmore").first());var d=b.find(".allowedroles").first().find("a[data-role-id=\""+e+"\"]");if(d){d.first().closest(".allowed").remove()}}m.hide()}).fail(c.exception)}catch(a){c.exception(a)}}).fail(function(a,b,d){c.exception(d)})},p=function(b){b.preventDefault();var g=a(b.currentTarget);a("body").one("rolesloaded",function(){e.use("moodle-core-notification-dialogue",function(){var b=g.data("action"),h=g.closest("tr.rolecap"),k={cap:h.data("humanname"),context:j},n=M.util.get_string("role"+b+"info","core_role",k);if(null===m){m=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,width:"450px"})}m.set("headerContent",M.util.get_string("role"+b+"header","core_role"));var p,e,q=[];switch(b){case"allow":e=h.find(f.REMOVEROLE);break;case"prohibit":e=h.find(f.UNPROHIBIT);break;}for(p in l){var r="",s=e.filter("[data-role-id='"+p+"']").length;if(s){r="disabled"}var t={roleid:p,rolename:l[p],disabled:r};q.push(t)}d.render("core/permissionmanager_panelcontent",{message:n,roles:q}).done(function(c){m.set("bodyContent",c);m.show();a("div.role_buttons").on("click","button",function(c){var d=a(c.currentTarget).data("role-id");o(h,d,b)})}).fail(c.exception)})});n()},q=function(b){b.preventDefault();var d=a(b.currentTarget);a("body").one("rolesloaded",function(){var a=d.data("action"),b=d.data("role-id"),e=d.closest("tr.rolecap"),f={role:l[b],cap:e.data("humanname"),context:j};c.confirm(M.util.get_string("confirmunassigntitle","core_role"),M.util.get_string("confirmrole"+a,"core_role",f),M.util.get_string("confirmunassignyes","core_role"),M.util.get_string("confirmunassignno","core_role"),function(){o(e,b,a)})});n()};return{initialize:function initialize(b){h=b.contextid;j=b.contextname;k=b.adminurl;var c=a("body");c.on("click",f.ADDROLE,p);c.on("click",f.REMOVEROLE,q)}}});
//# sourceMappingURL=permissionmanager.min.js.map
diff --git a/lib/amd/build/permissionmanager.min.js.map b/lib/amd/build/permissionmanager.min.js.map
index 63e284bc594..342ae467b36 100644
--- a/lib/amd/build/permissionmanager.min.js.map
+++ b/lib/amd/build/permissionmanager.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/permissionmanager.js"],"names":["define","$","config","notification","templates","Y","SELECTORS","ADDROLE","REMOVEROLE","UNPROHIBIT","rolesloadedevent","Event","contextid","contextname","adminurl","overideableroles","panel","loadOverideableRoles","params","getroles","sesskey","post","done","data","trigger","err","exception","fail","jqXHR","status","error","changePermissions","row","roleid","action","M","cfg","capability","templatedata","rolename","imageurl","util","image_url","spanclass","linkclass","icon","iconalt","get_string","find","first","closest","remove","render","content","insertBefore","allowedLink","hide","handleAddRole","e","preventDefault","link","currentTarget","one","use","confirmationDetails","cap","context","message","core","dialogue","draggable","modal","closeButton","width","set","i","existingrolelinks","roles","disabled","disable","filter","length","roledetails","push","show","on","handleRemoveRole","questionDetails","role","confirm","initialize","args","body"],"mappings":"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","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 * @package core\n * @class permissionmanager\n * @copyright 2015 Martin Mastny \n * @since 3.0\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * @module admin/permissionmanager\n */\ndefine(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],\n function($, config, notification, templates, Y) {\n\n /**\n * Used CSS selectors\n * @access private\n */\n var SELECTORS = {\n ADDROLE: 'a.allowlink, a.prohibitlink',\n REMOVEROLE: 'a.preventlink, a.unprohibitlink',\n UNPROHIBIT: 'a.unprohibitlink'\n };\n var rolesloadedevent = $.Event('rolesloaded');\n var contextid;\n var contextname;\n var adminurl;\n var overideableroles;\n var panel = null;\n\n /**\n * Load all possible roles, which could be assigned from server\n *\n * @access private\n * @method loadOverideableRoles\n */\n var loadOverideableRoles = function() {\n var params = {\n contextid: contextid,\n getroles: 1,\n sesskey: config.sesskey\n };\n\n // Need to tell jQuery to expect JSON as the content type may not be correct (MDL-55041).\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n try {\n overideableroles = data;\n loadOverideableRoles = function() {\n $('body').trigger(rolesloadedevent);\n };\n loadOverideableRoles();\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Perform the UI changes after server change\n *\n * @access private\n * @method changePermissions\n * @param {JQuery} row\n * @param {int} roleid\n * @param {string} action\n */\n var changePermissions = function(row, roleid, action) {\n var params = {\n contextid: contextid,\n roleid: roleid,\n sesskey: M.cfg.sesskey,\n action: action,\n capability: row.data('name')\n };\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n var action = data;\n try {\n var templatedata = {rolename: overideableroles[roleid],\n roleid: roleid,\n adminurl: adminurl,\n imageurl: M.util.image_url('t/delete', 'moodle')\n };\n switch (action) {\n case 'allow':\n templatedata.spanclass = 'allowed';\n templatedata.linkclass = 'preventlink';\n templatedata.action = 'prevent';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prohibit':\n templatedata.spanclass = 'forbidden';\n templatedata.linkclass = 'unprohibitlink';\n templatedata.action = 'unprohibit';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prevent':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.allowed').remove();\n return;\n case 'unprohibit':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.forbidden').remove();\n return;\n default:\n return;\n }\n templates.render('core/permissionmanager_role', templatedata)\n .done(function(content) {\n if (action == 'allow') {\n $(content).insertBefore(row.find('.allowmore:first'));\n } else if (action == 'prohibit') {\n $(content).insertBefore(row.find('.prohibitmore:first'));\n // Remove allowed link\n var allowedLink = row.find('.allowedroles').first().find('a[data-role-id=\"' + roleid + '\"]');\n if (allowedLink) {\n allowedLink.first().closest('.allowed').remove();\n }\n }\n panel.hide();\n })\n .fail(notification.exception);\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Prompts user for selecting a role which is permitted\n *\n * @access private\n * @method handleAddRole\n * @param {event} e\n */\n var handleAddRole = function(e) {\n e.preventDefault();\n\n var link = $(e.currentTarget);\n\n // TODO: MDL-57778 Convert to core/modal.\n $('body').one('rolesloaded', function() {\n Y.use('moodle-core-notification-dialogue', function() {\n var action = link.data('action');\n var row = link.closest('tr.rolecap');\n var confirmationDetails = {\n cap: row.data('humanname'),\n context: contextname\n };\n var message = M.util.get_string('role' + action + 'info', 'core_role', confirmationDetails);\n if (panel === null) {\n panel = new M.core.dialogue({\n draggable: true,\n modal: true,\n closeButton: true,\n width: '450px'\n });\n }\n panel.set('headerContent', M.util.get_string('role' + action + 'header', 'core_role'));\n\n var i, existingrolelinks;\n\n var roles = [];\n switch (action) {\n case 'allow':\n existingrolelinks = row.find(SELECTORS.REMOVEROLE);\n break;\n case 'prohibit':\n existingrolelinks = row.find(SELECTORS.UNPROHIBIT);\n break;\n }\n for (i in overideableroles) {\n var disabled = '';\n var disable = existingrolelinks.filter(\"[data-role-id='\" + i + \"']\").length;\n if (disable) {\n disabled = 'disabled';\n }\n var roledetails = {roleid: i, rolename: overideableroles[i], disabled: disabled};\n roles.push(roledetails);\n }\n\n templates.render('core/permissionmanager_panelcontent', {message: message, roles: roles})\n .done(function(content) {\n panel.set('bodyContent', content);\n panel.show();\n $('div.role_buttons').on('click', 'button', function(e) {\n var roleid = $(e.currentTarget).data('role-id');\n changePermissions(row, roleid, action);\n });\n })\n .fail(notification.exception);\n\n });\n });\n loadOverideableRoles();\n };\n\n /**\n * Prompts user when removing permission\n *\n * @access private\n * @method handleRemoveRole\n * @param {event} e\n */\n var handleRemoveRole = function(e) {\n e.preventDefault();\n var link = $(e.currentTarget);\n $('body').one('rolesloaded', function() {\n var action = link.data('action');\n var roleid = link.data('role-id');\n var row = link.closest('tr.rolecap');\n var questionDetails = {\n role: overideableroles[roleid],\n cap: row.data('humanname'),\n context: contextname\n };\n\n notification.confirm(M.util.get_string('confirmunassigntitle', 'core_role'),\n M.util.get_string('confirmrole' + action, 'core_role', questionDetails),\n M.util.get_string('confirmunassignyes', 'core_role'),\n M.util.get_string('confirmunassignno', 'core_role'),\n function() {\n changePermissions(row, roleid, action);\n }\n );\n });\n loadOverideableRoles();\n };\n\n return /** @alias module:core/permissionmanager */ {\n /**\n * Initialize permissionmanager\n * @access public\n * @param {Object} args\n */\n initialize: function(args) {\n contextid = args.contextid;\n contextname = args.contextname;\n adminurl = args.adminurl;\n var body = $('body');\n body.on('click', SELECTORS.ADDROLE, handleAddRole);\n body.on('click', SELECTORS.REMOVEROLE, handleRemoveRole);\n }\n };\n});\n"],"file":"permissionmanager.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/permissionmanager.js"],"names":["define","$","config","notification","templates","Y","SELECTORS","ADDROLE","REMOVEROLE","UNPROHIBIT","rolesloadedevent","Event","contextid","contextname","adminurl","overideableroles","panel","loadOverideableRoles","params","getroles","sesskey","post","done","data","trigger","err","exception","fail","jqXHR","status","error","changePermissions","row","roleid","action","M","cfg","capability","templatedata","rolename","imageurl","util","image_url","spanclass","linkclass","icon","iconalt","get_string","find","first","closest","remove","render","content","insertBefore","allowedLink","hide","handleAddRole","e","preventDefault","link","currentTarget","one","use","confirmationDetails","cap","context","message","core","dialogue","draggable","modal","closeButton","width","set","i","existingrolelinks","roles","disabled","disable","filter","length","roledetails","push","show","on","handleRemoveRole","questionDetails","role","confirm","initialize","args","body"],"mappings":"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","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 * @package core\n * @class permissionmanager\n * @copyright 2015 Martin Mastny \n * @since 3.0\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n /**\n * @module admin/permissionmanager\n */\ndefine(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yui'],\n function($, config, notification, templates, Y) {\n\n /**\n * Used CSS selectors\n * @access private\n */\n var SELECTORS = {\n ADDROLE: 'a.allowlink, a.prohibitlink',\n REMOVEROLE: 'a.preventlink, a.unprohibitlink',\n UNPROHIBIT: 'a.unprohibitlink'\n };\n var rolesloadedevent = $.Event('rolesloaded');\n var contextid;\n var contextname;\n var adminurl;\n var overideableroles;\n var panel = null;\n\n /**\n * Load all possible roles, which could be assigned from server\n *\n * @access private\n * @method loadOverideableRoles\n */\n var loadOverideableRoles = function() {\n var params = {\n contextid: contextid,\n getroles: 1,\n sesskey: config.sesskey\n };\n\n // Need to tell jQuery to expect JSON as the content type may not be correct (MDL-55041).\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n try {\n overideableroles = data;\n loadOverideableRoles = function() {\n $('body').trigger(rolesloadedevent);\n };\n loadOverideableRoles();\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Perform the UI changes after server change\n *\n * @access private\n * @method changePermissions\n * @param {JQuery} row\n * @param {int} roleid\n * @param {string} action\n */\n var changePermissions = function(row, roleid, action) {\n var params = {\n contextid: contextid,\n roleid: roleid,\n sesskey: M.cfg.sesskey,\n action: action,\n capability: row.data('name')\n };\n $.post(adminurl + 'roles/ajax.php', params, null, 'json')\n .done(function(data) {\n var action = data;\n try {\n var templatedata = {rolename: overideableroles[roleid],\n roleid: roleid,\n adminurl: adminurl,\n imageurl: M.util.image_url('t/delete', 'moodle')\n };\n switch (action) {\n case 'allow':\n templatedata.spanclass = 'allowed';\n templatedata.linkclass = 'preventlink';\n templatedata.action = 'prevent';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prohibit':\n templatedata.spanclass = 'forbidden';\n templatedata.linkclass = 'unprohibitlink';\n templatedata.action = 'unprohibit';\n templatedata.icon = 't/delete';\n templatedata.iconalt = M.util.get_string('deletexrole', 'core_role', overideableroles[roleid]);\n break;\n case 'prevent':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.allowed').remove();\n return;\n case 'unprohibit':\n row.find('a[data-role-id=\"' + roleid + '\"]').first().closest('.forbidden').remove();\n return;\n default:\n return;\n }\n templates.render('core/permissionmanager_role', templatedata)\n .done(function(content) {\n if (action == 'allow') {\n $(content).insertBefore(row.find('.allowmore').first());\n } else if (action == 'prohibit') {\n $(content).insertBefore(row.find('.prohibitmore').first());\n // Remove allowed link\n var allowedLink = row.find('.allowedroles').first().find('a[data-role-id=\"' + roleid + '\"]');\n if (allowedLink) {\n allowedLink.first().closest('.allowed').remove();\n }\n }\n panel.hide();\n })\n .fail(notification.exception);\n } catch (err) {\n notification.exception(err);\n }\n })\n .fail(function(jqXHR, status, error) {\n notification.exception(error);\n });\n };\n\n /**\n * Prompts user for selecting a role which is permitted\n *\n * @access private\n * @method handleAddRole\n * @param {event} e\n */\n var handleAddRole = function(e) {\n e.preventDefault();\n\n var link = $(e.currentTarget);\n\n // TODO: MDL-57778 Convert to core/modal.\n $('body').one('rolesloaded', function() {\n Y.use('moodle-core-notification-dialogue', function() {\n var action = link.data('action');\n var row = link.closest('tr.rolecap');\n var confirmationDetails = {\n cap: row.data('humanname'),\n context: contextname\n };\n var message = M.util.get_string('role' + action + 'info', 'core_role', confirmationDetails);\n if (panel === null) {\n panel = new M.core.dialogue({\n draggable: true,\n modal: true,\n closeButton: true,\n width: '450px'\n });\n }\n panel.set('headerContent', M.util.get_string('role' + action + 'header', 'core_role'));\n\n var i, existingrolelinks;\n\n var roles = [];\n switch (action) {\n case 'allow':\n existingrolelinks = row.find(SELECTORS.REMOVEROLE);\n break;\n case 'prohibit':\n existingrolelinks = row.find(SELECTORS.UNPROHIBIT);\n break;\n }\n for (i in overideableroles) {\n var disabled = '';\n var disable = existingrolelinks.filter(\"[data-role-id='\" + i + \"']\").length;\n if (disable) {\n disabled = 'disabled';\n }\n var roledetails = {roleid: i, rolename: overideableroles[i], disabled: disabled};\n roles.push(roledetails);\n }\n\n templates.render('core/permissionmanager_panelcontent', {message: message, roles: roles})\n .done(function(content) {\n panel.set('bodyContent', content);\n panel.show();\n $('div.role_buttons').on('click', 'button', function(e) {\n var roleid = $(e.currentTarget).data('role-id');\n changePermissions(row, roleid, action);\n });\n })\n .fail(notification.exception);\n\n });\n });\n loadOverideableRoles();\n };\n\n /**\n * Prompts user when removing permission\n *\n * @access private\n * @method handleRemoveRole\n * @param {event} e\n */\n var handleRemoveRole = function(e) {\n e.preventDefault();\n var link = $(e.currentTarget);\n $('body').one('rolesloaded', function() {\n var action = link.data('action');\n var roleid = link.data('role-id');\n var row = link.closest('tr.rolecap');\n var questionDetails = {\n role: overideableroles[roleid],\n cap: row.data('humanname'),\n context: contextname\n };\n\n notification.confirm(M.util.get_string('confirmunassigntitle', 'core_role'),\n M.util.get_string('confirmrole' + action, 'core_role', questionDetails),\n M.util.get_string('confirmunassignyes', 'core_role'),\n M.util.get_string('confirmunassignno', 'core_role'),\n function() {\n changePermissions(row, roleid, action);\n }\n );\n });\n loadOverideableRoles();\n };\n\n return /** @alias module:core/permissionmanager */ {\n /**\n * Initialize permissionmanager\n * @access public\n * @param {Object} args\n */\n initialize: function(args) {\n contextid = args.contextid;\n contextname = args.contextname;\n adminurl = args.adminurl;\n var body = $('body');\n body.on('click', SELECTORS.ADDROLE, handleAddRole);\n body.on('click', SELECTORS.REMOVEROLE, handleRemoveRole);\n }\n };\n});\n"],"file":"permissionmanager.min.js"}
\ No newline at end of file
diff --git a/lib/amd/src/permissionmanager.js b/lib/amd/src/permissionmanager.js
index 3f350d30fce..4ae64a3ec8e 100644
--- a/lib/amd/src/permissionmanager.js
+++ b/lib/amd/src/permissionmanager.js
@@ -126,9 +126,9 @@ define(['jquery', 'core/config', 'core/notification', 'core/templates', 'core/yu
templates.render('core/permissionmanager_role', templatedata)
.done(function(content) {
if (action == 'allow') {
- $(content).insertBefore(row.find('.allowmore:first'));
+ $(content).insertBefore(row.find('.allowmore').first());
} else if (action == 'prohibit') {
- $(content).insertBefore(row.find('.prohibitmore:first'));
+ $(content).insertBefore(row.find('.prohibitmore').first());
// Remove allowed link
var allowedLink = row.find('.allowedroles').first().find('a[data-role-id="' + roleid + '"]');
if (allowedLink) {
diff --git a/lib/form/amd/build/filetypes.min.js b/lib/form/amd/build/filetypes.min.js
index 4f591355bc6..037519ceb44 100644
--- a/lib/form/amd/build/filetypes.min.js
+++ b/lib/form/amd/build/filetypes.min.js
@@ -1,2 +1,2 @@
-define ("core_form/filetypes",["jquery","core/log","core/str","core/modal_factory","core/modal_events","core/ajax","core/templates","core/tree"],function(a,b,c,d,e,f,g,h){"use strict";var i=function(c,d,e,f){this.elementId=c;this.elementLabel=d;this.onlyTypes=e;this.allowAll=f;this.inputField=a("#"+c);this.wrapperBrowserTrigger=a("[data-filetypesbrowser=\""+c+"\"]");this.wrapperDescriptions=a("[data-filetypesdescriptions=\""+c+"\"]");if(!this.wrapperBrowserTrigger.length){return}if(!this.inputField.length||!this.wrapperDescriptions.length){b.error("core_form/filetypes: Unexpected DOM structure, unable to enhance filetypes field "+c);return}this.prepareBrowserTrigger().then(function(){return this.prepareBrowserModal()}.bind(this)).then(function(){return this.prepareBrowserTree()}.bind(this))};i.prototype.prepareBrowserTrigger=function(){return g.render("core_form/filetypes-trigger",{}).then(function(a){this.wrapperBrowserTrigger.html(a);this.browserTrigger=this.wrapperBrowserTrigger.find("[data-filetypeswidget=\"browsertrigger\"]")}.bind(this))};i.prototype.prepareBrowserModal=function(){return d.create({type:d.types.SAVE_CANCEL,title:this.elementLabel}).then(function(a){this.browserModal=a}.bind(this)).then(function(){this.browserModal.getRoot().on(e.hidden,function(){this.browserTrigger.focus()}.bind(this));this.browserModal.getRoot().on(e.save,function(){this.saveBrowserModal()}.bind(this))}.bind(this))};i.prototype.prepareBrowserTree=function(){this.browserTrigger.on("click",function(b){b.preventDefault();if(this.inputField.is("[disabled]")){return}var c=this.loadBrowserModalBody();c.then(function(){this.browserTree=new h(this.browserModal.getBody());this.browserTree.handleKeyDown=function(a,b){if(b.keyCode==this.browserTree.keys.enter||b.keyCode==this.browserTree.keys.space){b.preventDefault();b.stopPropagation();this.toggleCheckbox(a.attr("data-filetypesbrowserkey"))}else{h.prototype.handleKeyDown.call(this.browserTree,a,b)}}.bind(this);if(this.allowAll){this.hideOrShowItemsDependingOnAllowAll(this.browserModal.getRoot().find("input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]:first"));this.browserModal.getRoot().on("change","input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]",function(b){this.hideOrShowItemsDependingOnAllowAll(a(b.currentTarget))}.bind(this))}this.browserModal.getRoot().on("change","input[type=\"checkbox\"][data-filetypesbrowserkey]",function(b){var c=a(b.currentTarget),d=c.attr("data-filetypesbrowserkey");this.browserModal.getRoot().find("input[type=\"checkbox\"][data-filetypesbrowserkey=\""+d+"\"]").prop("checked",c.prop("checked"))}.bind(this))}.bind(this)).then(function(){this.browserModal.show()}.bind(this));this.browserModal.setBody(c)}.bind(this));return a.when()};i.prototype.loadBrowserModalBody=function(){var a={onlytypes:this.onlyTypes.join(),allowall:this.allowAll,current:this.inputField.val()};return f.call([{methodname:"core_form_get_filetypes_browser_data",args:a}])[0].then(function(a){return g.render("core_form/filetypes-browser",{elementid:this.elementId,groups:a.groups})}.bind(this))};i.prototype.toggleCheckbox=function(a){var b=this.browserModal.getRoot().find("input[type=\"checkbox\"][data-filetypesbrowserkey=\""+a+"\"]:first");b.prop("checked",!b.prop("checked"))};i.prototype.saveBrowserModal=function(){if(this.allowAll){var b=this.browserModal.getRoot().find("input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]");if(b.length&&b.prop("checked")){this.inputField.val("*");this.updateDescriptions(["*"]);return}}var c=[];this.browserModal.getRoot().find("input[type=\"checkbox\"]").each(function(){var b=a(this),d=b.attr("data-filetypesbrowserkey");if(b.prop("checked")){c.push(d)}});c=c.filter(function(b,c,d){return d.indexOf(b)==c});this.inputField.val(c.join(" "));this.updateDescriptions(c)};i.prototype.updateDescriptions=function(a){var b=[];a.forEach(function(a){b.push({description:this.browserModal.getRoot().find("[data-filetypesname=\""+a+"\"]:first").text().trim(),extensions:this.browserModal.getRoot().find("[data-filetypesextensions=\""+a+"\"]:first").text().trim()})}.bind(this));var c={hasdescriptions:0.\n\n/**\n * This module allows to enhance the form elements MoodleQuickForm_filetypes\n *\n * @module core_form/filetypes\n * @package core_form\n * @copyright 2017 David Mudrak \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/log', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/ajax',\n 'core/templates', 'core/tree'],\n function($, Log, Str, ModalFactory, ModalEvents, Ajax, Templates, Tree) {\n\n \"use strict\";\n\n /**\n * Constructor of the FileTypes instances.\n *\n * @constructor\n * @param {String} elementId The id of the form element to enhance\n * @param {String} elementLabel The label of the form element used as the modal selector title\n * @param {String} onlyTypes Limit the list of offered types to this\n * @param {Bool} allowAll Allow presence of the \"All file types\" item\n */\n var FileTypes = function(elementId, elementLabel, onlyTypes, allowAll) {\n\n this.elementId = elementId;\n this.elementLabel = elementLabel;\n this.onlyTypes = onlyTypes;\n this.allowAll = allowAll;\n\n this.inputField = $('#' + elementId);\n this.wrapperBrowserTrigger = $('[data-filetypesbrowser=\"' + elementId + '\"]');\n this.wrapperDescriptions = $('[data-filetypesdescriptions=\"' + elementId + '\"]');\n\n if (!this.wrapperBrowserTrigger.length) {\n // This is a valid case. Most probably the element is frozen and\n // the filetypes browser should not be available.\n return;\n }\n\n if (!this.inputField.length || !this.wrapperDescriptions.length) {\n Log.error('core_form/filetypes: Unexpected DOM structure, unable to enhance filetypes field ' + elementId);\n return;\n }\n\n this.prepareBrowserTrigger()\n .then(function() {\n return this.prepareBrowserModal();\n }.bind(this))\n\n .then(function() {\n return this.prepareBrowserTree();\n }.bind(this));\n };\n\n /**\n * Create and set the browser trigger widget (this.browserTrigger).\n *\n * @method prepareBrowserTrigger\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserTrigger = function() {\n return Templates.render('core_form/filetypes-trigger', {})\n .then(function(html) {\n this.wrapperBrowserTrigger.html(html);\n this.browserTrigger = this.wrapperBrowserTrigger.find('[data-filetypeswidget=\"browsertrigger\"]');\n }.bind(this));\n };\n\n /**\n * Create and set the modal for displaying the browser (this.browserModal).\n *\n * @method prepareBrowserModal\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserModal = function() {\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: this.elementLabel\n\n }).then(function(modal) {\n this.browserModal = modal;\n }.bind(this))\n\n .then(function() {\n // Because we have custom conditional modal trigger, we need to\n // handle the focus after closing ourselves, too.\n this.browserModal.getRoot().on(ModalEvents.hidden, function() {\n this.browserTrigger.focus();\n }.bind(this));\n\n this.browserModal.getRoot().on(ModalEvents.save, function() {\n this.saveBrowserModal();\n }.bind(this));\n }.bind(this));\n\n };\n\n /**\n * Create and set the tree in the browser modal's body.\n *\n * @method prepareBrowserTree\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserTree = function() {\n\n this.browserTrigger.on('click', function(e) {\n e.preventDefault();\n\n // We want to display the browser modal only when the associated input\n // field is not frozen (disabled).\n if (this.inputField.is('[disabled]')) {\n return;\n }\n\n var bodyContent = this.loadBrowserModalBody();\n\n bodyContent.then(function() {\n\n // Turn the list of groups and extensions into the tree.\n this.browserTree = new Tree(this.browserModal.getBody());\n\n // Override the behaviour of the Enter and Space keys to toggle our checkbox,\n // rather than toggle the tree node expansion status.\n this.browserTree.handleKeyDown = function(item, e) {\n if (e.keyCode == this.browserTree.keys.enter || e.keyCode == this.browserTree.keys.space) {\n e.preventDefault();\n e.stopPropagation();\n this.toggleCheckbox(item.attr('data-filetypesbrowserkey'));\n } else {\n Tree.prototype.handleKeyDown.call(this.browserTree, item, e);\n }\n }.bind(this);\n\n if (this.allowAll) {\n // Hide all other items if \"All file types\" is enabled.\n this.hideOrShowItemsDependingOnAllowAll(this.browserModal.getRoot()\n .find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]:first'));\n // And do the same whenever we click that checkbox.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]', function(e) {\n this.hideOrShowItemsDependingOnAllowAll($(e.currentTarget));\n }.bind(this));\n }\n\n // Synchronize checked status if the file extension is present in multiple groups.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey]', function(e) {\n var checkbox = $(e.currentTarget);\n var key = checkbox.attr('data-filetypesbrowserkey');\n this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]')\n .prop('checked', checkbox.prop('checked'));\n }.bind(this));\n\n }.bind(this))\n\n .then(function() {\n this.browserModal.show();\n }.bind(this));\n\n this.browserModal.setBody(bodyContent);\n\n }.bind(this));\n\n // Return a resolved promise.\n return $.when();\n };\n\n /**\n * Load the browser modal body contents.\n *\n * @returns {Promise}\n */\n FileTypes.prototype.loadBrowserModalBody = function() {\n\n var args = {\n onlytypes: this.onlyTypes.join(),\n allowall: this.allowAll,\n current: this.inputField.val()\n };\n\n return Ajax.call([{\n methodname: 'core_form_get_filetypes_browser_data',\n args: args\n\n }])[0].then(function(browserData) {\n return Templates.render('core_form/filetypes-browser', {\n elementid: this.elementId,\n groups: browserData.groups\n });\n }.bind(this));\n };\n\n /**\n * Change the checked status of the given file type (group or extension).\n *\n * @method toggleCheckbox\n * @param {String} key\n */\n FileTypes.prototype.toggleCheckbox = function(key) {\n\n var checkbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]:first');\n\n checkbox.prop('checked', !checkbox.prop('checked'));\n };\n\n /**\n * Update the associated input field with selected file types.\n *\n * @method saveBrowserModal\n */\n FileTypes.prototype.saveBrowserModal = function() {\n\n // Check the \"All file types\" first.\n if (this.allowAll) {\n var allcheckbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]');\n if (allcheckbox.length && allcheckbox.prop('checked')) {\n this.inputField.val('*');\n this.updateDescriptions(['*']);\n return;\n }\n }\n\n // Iterate over all checked boxes and populate the list.\n var newvalue = [];\n\n this.browserModal.getRoot().find('input[type=\"checkbox\"]').each(/** @this represents the checkbox */ function() {\n var checkbox = $(this);\n var key = checkbox.attr('data-filetypesbrowserkey');\n\n if (checkbox.prop('checked')) {\n newvalue.push(key);\n }\n });\n\n // Remove duplicates (e.g. file types present in multiple groups).\n newvalue = newvalue.filter(function(x, i, a) {\n return a.indexOf(x) == i;\n });\n\n this.inputField.val(newvalue.join(' '));\n this.updateDescriptions(newvalue);\n };\n\n /**\n * Describe the selected filetypes in the form when saving the browser.\n *\n * @param {Array} keys List of keys to describe\n * @returns {Promise}\n */\n FileTypes.prototype.updateDescriptions = function(keys) {\n\n var descriptions = [];\n\n keys.forEach(function(key) {\n descriptions.push({\n description: this.browserModal.getRoot().find('[data-filetypesname=\"' + key + '\"]:first').text().trim(),\n extensions: this.browserModal.getRoot().find('[data-filetypesextensions=\"' + key + '\"]:first').text().trim()\n });\n }.bind(this));\n\n var templatedata = {\n hasdescriptions: (descriptions.length > 0),\n descriptions: descriptions\n };\n\n return Templates.render('core_form/filetypes-descriptions', templatedata)\n .then(function(html) {\n this.wrapperDescriptions.html(html);\n }.bind(this));\n };\n\n /**\n * If \"All file types\" is checked, all other browser items are made hidden, and vice versa.\n *\n * @param {jQuery} allcheckbox The \"All file types\" checkbox.\n */\n FileTypes.prototype.hideOrShowItemsDependingOnAllowAll = function(allcheckbox) {\n var others = this.browserModal.getRoot().find('[role=\"treeitem\"][data-filetypesbrowserkey!=\"*\"]');\n if (allcheckbox.prop('checked')) {\n others.hide();\n } else {\n others.show();\n }\n };\n\n return {\n init: function(elementId, elementLabel, onlyTypes, allowAll) {\n new FileTypes(elementId, elementLabel, onlyTypes, allowAll);\n }\n };\n});\n"],"file":"filetypes.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/filetypes.js"],"names":["define","$","Log","Str","ModalFactory","ModalEvents","Ajax","Templates","Tree","FileTypes","elementId","elementLabel","onlyTypes","allowAll","inputField","wrapperBrowserTrigger","wrapperDescriptions","length","error","prepareBrowserTrigger","then","prepareBrowserModal","bind","prepareBrowserTree","prototype","render","html","browserTrigger","find","create","type","types","SAVE_CANCEL","title","modal","browserModal","getRoot","on","hidden","focus","save","saveBrowserModal","e","preventDefault","is","bodyContent","loadBrowserModalBody","browserTree","getBody","handleKeyDown","item","keyCode","keys","enter","space","stopPropagation","toggleCheckbox","attr","call","hideOrShowItemsDependingOnAllowAll","first","currentTarget","checkbox","key","prop","show","setBody","when","args","onlytypes","join","allowall","current","val","methodname","browserData","elementid","groups","allcheckbox","updateDescriptions","newvalue","each","push","filter","x","i","a","indexOf","descriptions","forEach","description","text","trim","extensions","templatedata","hasdescriptions","others","hide","init"],"mappings":"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","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 * This module allows to enhance the form elements MoodleQuickForm_filetypes\n *\n * @module core_form/filetypes\n * @package core_form\n * @copyright 2017 David Mudrak \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/log', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/ajax',\n 'core/templates', 'core/tree'],\n function($, Log, Str, ModalFactory, ModalEvents, Ajax, Templates, Tree) {\n\n \"use strict\";\n\n /**\n * Constructor of the FileTypes instances.\n *\n * @constructor\n * @param {String} elementId The id of the form element to enhance\n * @param {String} elementLabel The label of the form element used as the modal selector title\n * @param {String} onlyTypes Limit the list of offered types to this\n * @param {Bool} allowAll Allow presence of the \"All file types\" item\n */\n var FileTypes = function(elementId, elementLabel, onlyTypes, allowAll) {\n\n this.elementId = elementId;\n this.elementLabel = elementLabel;\n this.onlyTypes = onlyTypes;\n this.allowAll = allowAll;\n\n this.inputField = $('#' + elementId);\n this.wrapperBrowserTrigger = $('[data-filetypesbrowser=\"' + elementId + '\"]');\n this.wrapperDescriptions = $('[data-filetypesdescriptions=\"' + elementId + '\"]');\n\n if (!this.wrapperBrowserTrigger.length) {\n // This is a valid case. Most probably the element is frozen and\n // the filetypes browser should not be available.\n return;\n }\n\n if (!this.inputField.length || !this.wrapperDescriptions.length) {\n Log.error('core_form/filetypes: Unexpected DOM structure, unable to enhance filetypes field ' + elementId);\n return;\n }\n\n this.prepareBrowserTrigger()\n .then(function() {\n return this.prepareBrowserModal();\n }.bind(this))\n\n .then(function() {\n return this.prepareBrowserTree();\n }.bind(this));\n };\n\n /**\n * Create and set the browser trigger widget (this.browserTrigger).\n *\n * @method prepareBrowserTrigger\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserTrigger = function() {\n return Templates.render('core_form/filetypes-trigger', {})\n .then(function(html) {\n this.wrapperBrowserTrigger.html(html);\n this.browserTrigger = this.wrapperBrowserTrigger.find('[data-filetypeswidget=\"browsertrigger\"]');\n }.bind(this));\n };\n\n /**\n * Create and set the modal for displaying the browser (this.browserModal).\n *\n * @method prepareBrowserModal\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserModal = function() {\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: this.elementLabel\n\n }).then(function(modal) {\n this.browserModal = modal;\n }.bind(this))\n\n .then(function() {\n // Because we have custom conditional modal trigger, we need to\n // handle the focus after closing ourselves, too.\n this.browserModal.getRoot().on(ModalEvents.hidden, function() {\n this.browserTrigger.focus();\n }.bind(this));\n\n this.browserModal.getRoot().on(ModalEvents.save, function() {\n this.saveBrowserModal();\n }.bind(this));\n }.bind(this));\n\n };\n\n /**\n * Create and set the tree in the browser modal's body.\n *\n * @method prepareBrowserTree\n * @returns {Promise}\n */\n FileTypes.prototype.prepareBrowserTree = function() {\n\n this.browserTrigger.on('click', function(e) {\n e.preventDefault();\n\n // We want to display the browser modal only when the associated input\n // field is not frozen (disabled).\n if (this.inputField.is('[disabled]')) {\n return;\n }\n\n var bodyContent = this.loadBrowserModalBody();\n\n bodyContent.then(function() {\n\n // Turn the list of groups and extensions into the tree.\n this.browserTree = new Tree(this.browserModal.getBody());\n\n // Override the behaviour of the Enter and Space keys to toggle our checkbox,\n // rather than toggle the tree node expansion status.\n this.browserTree.handleKeyDown = function(item, e) {\n if (e.keyCode == this.browserTree.keys.enter || e.keyCode == this.browserTree.keys.space) {\n e.preventDefault();\n e.stopPropagation();\n this.toggleCheckbox(item.attr('data-filetypesbrowserkey'));\n } else {\n Tree.prototype.handleKeyDown.call(this.browserTree, item, e);\n }\n }.bind(this);\n\n if (this.allowAll) {\n // Hide all other items if \"All file types\" is enabled.\n this.hideOrShowItemsDependingOnAllowAll(this.browserModal.getRoot()\n .find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]').first());\n // And do the same whenever we click that checkbox.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]', function(e) {\n this.hideOrShowItemsDependingOnAllowAll($(e.currentTarget));\n }.bind(this));\n }\n\n // Synchronize checked status if the file extension is present in multiple groups.\n this.browserModal.getRoot().on('change', 'input[type=\"checkbox\"][data-filetypesbrowserkey]', function(e) {\n var checkbox = $(e.currentTarget);\n var key = checkbox.attr('data-filetypesbrowserkey');\n this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]')\n .prop('checked', checkbox.prop('checked'));\n }.bind(this));\n\n }.bind(this))\n\n .then(function() {\n this.browserModal.show();\n }.bind(this));\n\n this.browserModal.setBody(bodyContent);\n\n }.bind(this));\n\n // Return a resolved promise.\n return $.when();\n };\n\n /**\n * Load the browser modal body contents.\n *\n * @returns {Promise}\n */\n FileTypes.prototype.loadBrowserModalBody = function() {\n\n var args = {\n onlytypes: this.onlyTypes.join(),\n allowall: this.allowAll,\n current: this.inputField.val()\n };\n\n return Ajax.call([{\n methodname: 'core_form_get_filetypes_browser_data',\n args: args\n\n }])[0].then(function(browserData) {\n return Templates.render('core_form/filetypes-browser', {\n elementid: this.elementId,\n groups: browserData.groups\n });\n }.bind(this));\n };\n\n /**\n * Change the checked status of the given file type (group or extension).\n *\n * @method toggleCheckbox\n * @param {String} key\n */\n FileTypes.prototype.toggleCheckbox = function(key) {\n\n var checkbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"' + key + '\"]').first();\n\n checkbox.prop('checked', !checkbox.prop('checked'));\n };\n\n /**\n * Update the associated input field with selected file types.\n *\n * @method saveBrowserModal\n */\n FileTypes.prototype.saveBrowserModal = function() {\n\n // Check the \"All file types\" first.\n if (this.allowAll) {\n var allcheckbox = this.browserModal.getRoot().find('input[type=\"checkbox\"][data-filetypesbrowserkey=\"*\"]');\n if (allcheckbox.length && allcheckbox.prop('checked')) {\n this.inputField.val('*');\n this.updateDescriptions(['*']);\n return;\n }\n }\n\n // Iterate over all checked boxes and populate the list.\n var newvalue = [];\n\n this.browserModal.getRoot().find('input[type=\"checkbox\"]').each(/** @this represents the checkbox */ function() {\n var checkbox = $(this);\n var key = checkbox.attr('data-filetypesbrowserkey');\n\n if (checkbox.prop('checked')) {\n newvalue.push(key);\n }\n });\n\n // Remove duplicates (e.g. file types present in multiple groups).\n newvalue = newvalue.filter(function(x, i, a) {\n return a.indexOf(x) == i;\n });\n\n this.inputField.val(newvalue.join(' '));\n this.updateDescriptions(newvalue);\n };\n\n /**\n * Describe the selected filetypes in the form when saving the browser.\n *\n * @param {Array} keys List of keys to describe\n * @returns {Promise}\n */\n FileTypes.prototype.updateDescriptions = function(keys) {\n\n var descriptions = [];\n\n keys.forEach(function(key) {\n descriptions.push({\n description: this.browserModal.getRoot().find('[data-filetypesname=\"' + key + '\"]').first().text().trim(),\n extensions: this.browserModal.getRoot().find('[data-filetypesextensions=\"' + key + '\"]').first().text().trim()\n });\n }.bind(this));\n\n var templatedata = {\n hasdescriptions: (descriptions.length > 0),\n descriptions: descriptions\n };\n\n return Templates.render('core_form/filetypes-descriptions', templatedata)\n .then(function(html) {\n this.wrapperDescriptions.html(html);\n }.bind(this));\n };\n\n /**\n * If \"All file types\" is checked, all other browser items are made hidden, and vice versa.\n *\n * @param {jQuery} allcheckbox The \"All file types\" checkbox.\n */\n FileTypes.prototype.hideOrShowItemsDependingOnAllowAll = function(allcheckbox) {\n var others = this.browserModal.getRoot().find('[role=\"treeitem\"][data-filetypesbrowserkey!=\"*\"]');\n if (allcheckbox.prop('checked')) {\n others.hide();\n } else {\n others.show();\n }\n };\n\n return {\n init: function(elementId, elementLabel, onlyTypes, allowAll) {\n new FileTypes(elementId, elementLabel, onlyTypes, allowAll);\n }\n };\n});\n"],"file":"filetypes.min.js"}
\ No newline at end of file
diff --git a/lib/form/amd/src/filetypes.js b/lib/form/amd/src/filetypes.js
index 049214c276e..a746b96f280 100644
--- a/lib/form/amd/src/filetypes.js
+++ b/lib/form/amd/src/filetypes.js
@@ -151,7 +151,7 @@ define(['jquery', 'core/log', 'core/str', 'core/modal_factory', 'core/modal_even
if (this.allowAll) {
// Hide all other items if "All file types" is enabled.
this.hideOrShowItemsDependingOnAllowAll(this.browserModal.getRoot()
- .find('input[type="checkbox"][data-filetypesbrowserkey="*"]:first'));
+ .find('input[type="checkbox"][data-filetypesbrowserkey="*"]').first());
// And do the same whenever we click that checkbox.
this.browserModal.getRoot().on('change', 'input[type="checkbox"][data-filetypesbrowserkey="*"]', function(e) {
this.hideOrShowItemsDependingOnAllowAll($(e.currentTarget));
@@ -213,7 +213,7 @@ define(['jquery', 'core/log', 'core/str', 'core/modal_factory', 'core/modal_even
*/
FileTypes.prototype.toggleCheckbox = function(key) {
- var checkbox = this.browserModal.getRoot().find('input[type="checkbox"][data-filetypesbrowserkey="' + key + '"]:first');
+ var checkbox = this.browserModal.getRoot().find('input[type="checkbox"][data-filetypesbrowserkey="' + key + '"]').first();
checkbox.prop('checked', !checkbox.prop('checked'));
};
@@ -268,8 +268,8 @@ define(['jquery', 'core/log', 'core/str', 'core/modal_factory', 'core/modal_even
keys.forEach(function(key) {
descriptions.push({
- description: this.browserModal.getRoot().find('[data-filetypesname="' + key + '"]:first').text().trim(),
- extensions: this.browserModal.getRoot().find('[data-filetypesextensions="' + key + '"]:first').text().trim()
+ description: this.browserModal.getRoot().find('[data-filetypesname="' + key + '"]').first().text().trim(),
+ extensions: this.browserModal.getRoot().find('[data-filetypesextensions="' + key + '"]').first().text().trim()
});
}.bind(this));
diff --git a/lib/jquery/readme_moodle.txt b/lib/jquery/readme_moodle.txt
index e339c5c317e..f2dd7eae310 100644
--- a/lib/jquery/readme_moodle.txt
+++ b/lib/jquery/readme_moodle.txt
@@ -16,3 +16,7 @@ Description of import of various jQuery libraries into Moodle:
6/ Update the version of jquery in core_privacy\local\request\moodle_content_writer::write_html_data()
Petr Skoda
+
+Note: jQuery.trim() function and :first pseudo-class are deprecated. We use String.prototype.trim() and .first()
+in Moodle code instead. Please note that in third party libraries there are still usages of jQuery.trim
+for example xhprof and jQuery UI.
diff --git a/mod/lti/amd/build/tool_configure_controller.min.js b/mod/lti/amd/build/tool_configure_controller.min.js
index 94998c34f15..cf707f9a49a 100644
--- a/mod/lti/amd/build/tool_configure_controller.min.js
+++ b/mod/lti/amd/build/tool_configure_controller.min.js
@@ -1,2 +1,2 @@
-define ("mod_lti/tool_configure_controller",["jquery","core/ajax","core/notification","core/templates","mod_lti/events","mod_lti/keys","mod_lti/tool_type","mod_lti/tool_proxy","core/str"],function(a,b,c,d,e,f,g,h,i){var j={EXTERNAL_REGISTRATION_CONTAINER:"#external-registration-container",EXTERNAL_REGISTRATION_PAGE_CONTAINER:"#external-registration-page-container",EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER:"#external-registration-template-container",CARTRIDGE_REGISTRATION_CONTAINER:"#cartridge-registration-container",CARTRIDGE_REGISTRATION_FORM:"#cartridge-registration-form",ADD_TOOL_FORM:"#add-tool-form",TOOL_LIST_CONTAINER:"#tool-list-container",TOOL_CREATE_BUTTON:"#tool-create-button",TOOL_CREATE_LTILEGACY_BUTTON:"#tool-createltilegacy-button",REGISTRATION_CHOICE_CONTAINER:"#registration-choice-container",TOOL_URL:"#tool-url"},k=function(){return a(j.TOOL_LIST_CONTAINER)},l=function(){return a(j.EXTERNAL_REGISTRATION_CONTAINER)},m=function(){return a(j.CARTRIDGE_REGISTRATION_CONTAINER)},n=function(){return a(j.REGISTRATION_CHOICE_CONTAINER)},o=function(b){if(b.data&&"org.imsglobal.lti.close"===b.data.subject){a(j.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER).empty();r();w();z();w();D()}},p=function(b){a(j.EXTERNAL_REGISTRATION_PAGE_CONTAINER).removeClass("hidden");var c=a(j.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER);c.append(a(""));u();window.addEventListener("message",o,!1)},q=function(){return a(j.TOOL_URL).val()},r=function(){l().addClass("hidden")},s=function(){m().addClass("hidden")},t=function(){n().addClass("hidden")},u=function(){s();t();l().removeClass("hidden");x(l())},v=function(a){r();t();var b=m();b.find("input").val("");b.removeClass("hidden");b.find(j.CARTRIDGE_REGISTRATION_FORM).attr("data-cartridge-url",a);x(b)},w=function(){r();s();n().removeClass("hidden");x(n())},x=function(a){var b=a.children().detach();b.appendTo(a)},y=function(){k().addClass("hidden")},z=function(){k().removeClass("hidden")},A=function(a){var b=a.error?"error":"success";c.addNotification({message:a.message,type:b})},B=function(a){a.addClass("loading")},C=function(a){a.removeClass("loading")},D=function(){var b=a.Deferred(),e=k();B(e);a.when(g.query(),h.query({orphanedonly:!0})).done(function(a,c){d.render("mod_lti/tool_list",{tools:a,proxies:c}).done(function(a,c){e.empty();e.append(a);d.runTemplateJS(c);b.resolve()}).fail(b.reject)}).fail(b.reject);b.fail(c.exception).always(function(){C(e)})},E=function(){var b=a.trim(q());if(b){a(j.TOOL_URL).val("");y();p(b)}},F=function(){var b=a.trim(q());if(""===b){return a.Deferred().resolve()}var d=a(j.TOOL_CREATE_LTILEGACY_BUTTON);B(d);var f=g.isCartridge(b);f.always(function(){C(d)});f.done(function(c){if(c.iscartridge){a(j.TOOL_URL).val("");a(document).trigger(e.START_CARTRIDGE_REGISTRATION,b)}else{a(document).trigger(e.START_EXTERNAL_REGISTRATION,{url:b})}});f.fail(function(){i.get_string("errorbadurl","mod_lti").done(function(b){a(document).trigger(e.REGISTRATION_FEEDBACK,{message:b,error:!0})}).fail(c.exception)});return f},G=function(){a(document).on(e.NEW_TOOL_TYPE,function(){D()});a(document).on(e.START_EXTERNAL_REGISTRATION,function(){u();a(j.TOOL_URL).val("");y()});a(document).on(e.STOP_EXTERNAL_REGISTRATION,function(){z();w()});a(document).on(e.START_CARTRIDGE_REGISTRATION,function(a,b){v(b)});a(document).on(e.STOP_CARTRIDGE_REGISTRATION,function(){m().find(j.CARTRIDGE_REGISTRATION_FORM).removeAttr("data-cartridge-url");w()});a(document).on(e.REGISTRATION_FEEDBACK,function(a,b){A(b)});var b=a(j.TOOL_CREATE_LTILEGACY_BUTTON);b.click(function(a){a.preventDefault();F()});var c=a(j.TOOL_CREATE_BUTTON);c.click(function(a){a.preventDefault();E()})};return{init:function init(){G();D()}}});
+define ("mod_lti/tool_configure_controller",["jquery","core/ajax","core/notification","core/templates","mod_lti/events","mod_lti/keys","mod_lti/tool_type","mod_lti/tool_proxy","core/str"],function(a,b,c,d,e,f,g,h,i){var j={EXTERNAL_REGISTRATION_CONTAINER:"#external-registration-container",EXTERNAL_REGISTRATION_PAGE_CONTAINER:"#external-registration-page-container",EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER:"#external-registration-template-container",CARTRIDGE_REGISTRATION_CONTAINER:"#cartridge-registration-container",CARTRIDGE_REGISTRATION_FORM:"#cartridge-registration-form",ADD_TOOL_FORM:"#add-tool-form",TOOL_LIST_CONTAINER:"#tool-list-container",TOOL_CREATE_BUTTON:"#tool-create-button",TOOL_CREATE_LTILEGACY_BUTTON:"#tool-createltilegacy-button",REGISTRATION_CHOICE_CONTAINER:"#registration-choice-container",TOOL_URL:"#tool-url"},k=function(){return a(j.TOOL_LIST_CONTAINER)},l=function(){return a(j.EXTERNAL_REGISTRATION_CONTAINER)},m=function(){return a(j.CARTRIDGE_REGISTRATION_CONTAINER)},n=function(){return a(j.REGISTRATION_CHOICE_CONTAINER)},o=function(b){if(b.data&&"org.imsglobal.lti.close"===b.data.subject){a(j.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER).empty();r();w();z();w();D()}},p=function(b){a(j.EXTERNAL_REGISTRATION_PAGE_CONTAINER).removeClass("hidden");var c=a(j.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER);c.append(a(""));u();window.addEventListener("message",o,!1)},q=function(){return a(j.TOOL_URL).val()},r=function(){l().addClass("hidden")},s=function(){m().addClass("hidden")},t=function(){n().addClass("hidden")},u=function(){s();t();l().removeClass("hidden");x(l())},v=function(a){r();t();var b=m();b.find("input").val("");b.removeClass("hidden");b.find(j.CARTRIDGE_REGISTRATION_FORM).attr("data-cartridge-url",a);x(b)},w=function(){r();s();n().removeClass("hidden");x(n())},x=function(a){var b=a.children().detach();b.appendTo(a)},y=function(){k().addClass("hidden")},z=function(){k().removeClass("hidden")},A=function(a){var b=a.error?"error":"success";c.addNotification({message:a.message,type:b})},B=function(a){a.addClass("loading")},C=function(a){a.removeClass("loading")},D=function(){var b=a.Deferred(),e=k();B(e);a.when(g.query(),h.query({orphanedonly:!0})).done(function(a,c){d.render("mod_lti/tool_list",{tools:a,proxies:c}).done(function(a,c){e.empty();e.append(a);d.runTemplateJS(c);b.resolve()}).fail(b.reject)}).fail(b.reject);b.fail(c.exception).always(function(){C(e)})},E=function(){var b=q().trim();if(b){a(j.TOOL_URL).val("");y();p(b)}},F=function(){var b=q().trim();if(""===b){return a.Deferred().resolve()}var d=a(j.TOOL_CREATE_LTILEGACY_BUTTON);B(d);var f=g.isCartridge(b);f.always(function(){C(d)});f.done(function(c){if(c.iscartridge){a(j.TOOL_URL).val("");a(document).trigger(e.START_CARTRIDGE_REGISTRATION,b)}else{a(document).trigger(e.START_EXTERNAL_REGISTRATION,{url:b})}});f.fail(function(){i.get_string("errorbadurl","mod_lti").done(function(b){a(document).trigger(e.REGISTRATION_FEEDBACK,{message:b,error:!0})}).fail(c.exception)});return f},G=function(){a(document).on(e.NEW_TOOL_TYPE,function(){D()});a(document).on(e.START_EXTERNAL_REGISTRATION,function(){u();a(j.TOOL_URL).val("");y()});a(document).on(e.STOP_EXTERNAL_REGISTRATION,function(){z();w()});a(document).on(e.START_CARTRIDGE_REGISTRATION,function(a,b){v(b)});a(document).on(e.STOP_CARTRIDGE_REGISTRATION,function(){m().find(j.CARTRIDGE_REGISTRATION_FORM).removeAttr("data-cartridge-url");w()});a(document).on(e.REGISTRATION_FEEDBACK,function(a,b){A(b)});var b=a(j.TOOL_CREATE_LTILEGACY_BUTTON);b.click(function(a){a.preventDefault();F()});var c=a(j.TOOL_CREATE_BUTTON);c.click(function(a){a.preventDefault();E()})};return{init:function init(){G();D()}}});
//# sourceMappingURL=tool_configure_controller.min.js.map
diff --git a/mod/lti/amd/build/tool_configure_controller.min.js.map b/mod/lti/amd/build/tool_configure_controller.min.js.map
index df0e78cb2d8..d2b2ba4d226 100644
--- a/mod/lti/amd/build/tool_configure_controller.min.js.map
+++ b/mod/lti/amd/build/tool_configure_controller.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/tool_configure_controller.js"],"names":["define","$","ajax","notification","templates","ltiEvents","KEYS","toolType","toolProxy","str","SELECTORS","EXTERNAL_REGISTRATION_CONTAINER","EXTERNAL_REGISTRATION_PAGE_CONTAINER","EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER","CARTRIDGE_REGISTRATION_CONTAINER","CARTRIDGE_REGISTRATION_FORM","ADD_TOOL_FORM","TOOL_LIST_CONTAINER","TOOL_CREATE_BUTTON","TOOL_CREATE_LTILEGACY_BUTTON","REGISTRATION_CHOICE_CONTAINER","TOOL_URL","getToolListContainer","getExternalRegistrationContainer","getCartridgeRegistrationContainer","getRegistrationChoiceContainer","closeLTIAdvRegistration","e","data","subject","empty","hideExternalRegistration","showRegistrationChoices","showToolList","reloadToolList","initiateRegistration","url","removeClass","container","append","encodeURIComponent","showExternalRegistration","window","addEventListener","getToolURL","val","addClass","hideCartridgeRegistration","hideRegistrationChoices","screenReaderAnnounce","showCartridgeRegistration","find","attr","element","children","detach","appendTo","hideToolList","showRegistrationFeedback","type","error","addNotification","message","startLoading","stopLoading","promise","Deferred","when","query","done","types","proxies","render","tools","html","js","runTemplateJS","resolve","fail","reject","exception","always","addLTIAdvTool","trim","addLTILegacyTool","toolButton","isCartridge","result","iscartridge","document","trigger","START_CARTRIDGE_REGISTRATION","START_EXTERNAL_REGISTRATION","get_string","s","REGISTRATION_FEEDBACK","registerEventListeners","on","NEW_TOOL_TYPE","STOP_EXTERNAL_REGISTRATION","event","STOP_CARTRIDGE_REGISTRATION","removeAttr","addLegacyButton","click","preventDefault","addLTIButton","init"],"mappings":"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","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 * Standard Ajax wrapper for Moodle. It calls the central Ajax script,\n * which can call any existing webservice using the current session.\n * In addition, it can batch multiple requests and return multiple responses.\n *\n * @module mod_lti/tool_configure_controller\n * @class tool_configure_controller\n * @package mod_lti\n * @copyright 2015 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['jquery', 'core/ajax', 'core/notification', 'core/templates', 'mod_lti/events', 'mod_lti/keys', 'mod_lti/tool_type',\n 'mod_lti/tool_proxy', 'core/str'],\n function($, ajax, notification, templates, ltiEvents, KEYS, toolType, toolProxy, str) {\n\n var SELECTORS = {\n EXTERNAL_REGISTRATION_CONTAINER: '#external-registration-container',\n EXTERNAL_REGISTRATION_PAGE_CONTAINER: '#external-registration-page-container',\n EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER: '#external-registration-template-container',\n CARTRIDGE_REGISTRATION_CONTAINER: '#cartridge-registration-container',\n CARTRIDGE_REGISTRATION_FORM: '#cartridge-registration-form',\n ADD_TOOL_FORM: '#add-tool-form',\n TOOL_LIST_CONTAINER: '#tool-list-container',\n TOOL_CREATE_BUTTON: '#tool-create-button',\n TOOL_CREATE_LTILEGACY_BUTTON: '#tool-createltilegacy-button',\n REGISTRATION_CHOICE_CONTAINER: '#registration-choice-container',\n TOOL_URL: '#tool-url'\n };\n\n /**\n * Get the tool list container element.\n *\n * @method getToolListContainer\n * @private\n * @return {Object} jQuery object\n */\n var getToolListContainer = function() {\n return $(SELECTORS.TOOL_LIST_CONTAINER);\n };\n\n /**\n * Get the external registration container element.\n *\n * @method getExternalRegistrationContainer\n * @private\n * @return {Object} jQuery object\n */\n var getExternalRegistrationContainer = function() {\n return $(SELECTORS.EXTERNAL_REGISTRATION_CONTAINER);\n };\n\n /**\n * Get the cartridge registration container element.\n *\n * @method getCartridgeRegistrationContainer\n * @private\n * @return {Object} jQuery object\n */\n var getCartridgeRegistrationContainer = function() {\n return $(SELECTORS.CARTRIDGE_REGISTRATION_CONTAINER);\n };\n\n /**\n * Get the registration choice container element.\n *\n * @method getRegistrationChoiceContainer\n * @private\n * @return {Object} jQuery object\n */\n var getRegistrationChoiceContainer = function() {\n return $(SELECTORS.REGISTRATION_CHOICE_CONTAINER);\n };\n\n /**\n * Close the LTI Advantage Registration IFrame.\n *\n * @private\n * @param {Object} e post message event sent from the registration frame.\n */\n var closeLTIAdvRegistration = function(e) {\n if (e.data && 'org.imsglobal.lti.close' === e.data.subject) {\n $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER).empty();\n hideExternalRegistration();\n showRegistrationChoices();\n showToolList();\n showRegistrationChoices();\n reloadToolList();\n }\n };\n\n /**\n * Load the external registration template and render it in the DOM and display it.\n *\n * @method initiateRegistration\n * @private\n * @param {String} url where to send the registration request\n */\n var initiateRegistration = function(url) {\n // Show the external registration page in an iframe.\n $(SELECTORS.EXTERNAL_REGISTRATION_PAGE_CONTAINER).removeClass('hidden');\n var container = $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER);\n container.append($(\"\"));\n showExternalRegistration();\n window.addEventListener(\"message\", closeLTIAdvRegistration, false);\n };\n\n /**\n * Get the tool type URL.\n *\n * @method getToolURL\n * @private\n * @return {String} the tool type url\n */\n var getToolURL = function() {\n return $(SELECTORS.TOOL_URL).val();\n };\n\n /**\n * Hide the external registration container.\n *\n * @method hideExternalRegistration\n * @private\n */\n var hideExternalRegistration = function() {\n getExternalRegistrationContainer().addClass('hidden');\n };\n\n /**\n * Hide the cartridge registration container.\n *\n * @method hideCartridgeRegistration\n * @private\n */\n var hideCartridgeRegistration = function() {\n getCartridgeRegistrationContainer().addClass('hidden');\n };\n\n /**\n * Hide the registration choice container.\n *\n * @method hideRegistrationChoices\n * @private\n */\n var hideRegistrationChoices = function() {\n getRegistrationChoiceContainer().addClass('hidden');\n };\n\n /**\n * Display the external registration panel and hides the other\n * panels.\n *\n * @method showExternalRegistration\n * @private\n */\n var showExternalRegistration = function() {\n hideCartridgeRegistration();\n hideRegistrationChoices();\n getExternalRegistrationContainer().removeClass('hidden');\n screenReaderAnnounce(getExternalRegistrationContainer());\n };\n\n /**\n * Display the cartridge registration panel and hides the other\n * panels.\n *\n * @method showCartridgeRegistration\n * @param {String} url\n * @private\n */\n var showCartridgeRegistration = function(url) {\n hideExternalRegistration();\n hideRegistrationChoices();\n // Don't save the key and secret from the last tool.\n var container = getCartridgeRegistrationContainer();\n container.find('input').val('');\n container.removeClass('hidden');\n container.find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).attr('data-cartridge-url', url);\n screenReaderAnnounce(container);\n };\n\n /**\n * Display the registration choices panel and hides the other\n * panels.\n *\n * @method showRegistrationChoices\n * @private\n */\n var showRegistrationChoices = function() {\n hideExternalRegistration();\n hideCartridgeRegistration();\n getRegistrationChoiceContainer().removeClass('hidden');\n screenReaderAnnounce(getRegistrationChoiceContainer());\n };\n\n /**\n * JAWS does not notice visibility changes with aria-live.\n * Remove and add the content back to force it to read it out.\n * This function can be removed once JAWS supports visibility.\n *\n * @method screenReaderAnnounce\n * @param {Object} element\n * @private\n */\n var screenReaderAnnounce = function(element) {\n var children = element.children().detach();\n children.appendTo(element);\n };\n\n /**\n * Hides the list of tool types.\n *\n * @method hideToolList\n * @private\n */\n var hideToolList = function() {\n getToolListContainer().addClass('hidden');\n };\n\n /**\n * Display the list of tool types.\n *\n * @method hideToolList\n * @private\n */\n var showToolList = function() {\n getToolListContainer().removeClass('hidden');\n };\n\n /**\n * Display the registration feedback alert and hide the other panels.\n *\n * @method showRegistrationFeedback\n * @param {Object} data\n * @private\n */\n var showRegistrationFeedback = function(data) {\n var type = data.error ? 'error' : 'success';\n notification.addNotification({\n message: data.message,\n type: type\n });\n };\n\n /**\n * Show the loading animation\n *\n * @method startLoading\n * @private\n * @param {Object} element jQuery object\n */\n var startLoading = function(element) {\n element.addClass(\"loading\");\n };\n\n /**\n * Hide the loading animation\n *\n * @method stopLoading\n * @private\n * @param {Object} element jQuery object\n */\n var stopLoading = function(element) {\n element.removeClass(\"loading\");\n };\n\n /**\n * Refresh the list of tool types and render the new ones.\n *\n * @method reloadToolList\n * @private\n */\n var reloadToolList = function() {\n var promise = $.Deferred();\n var container = getToolListContainer();\n startLoading(container);\n\n $.when(\n toolType.query(),\n toolProxy.query({'orphanedonly': true})\n )\n .done(function(types, proxies) {\n templates.render('mod_lti/tool_list', {tools: types, proxies: proxies})\n .done(function(html, js) {\n container.empty();\n container.append(html);\n templates.runTemplateJS(js);\n promise.resolve();\n }).fail(promise.reject);\n })\n .fail(promise.reject);\n\n promise.fail(notification.exception)\n .always(function() {\n stopLoading(container);\n });\n };\n\n /**\n * Start the LTI Advantage registration.\n *\n * @method addLTIAdvTool\n * @private\n */\n var addLTIAdvTool = function() {\n var url = $.trim(getToolURL());\n\n if (url) {\n $(SELECTORS.TOOL_URL).val('');\n hideToolList();\n initiateRegistration(url);\n }\n\n };\n\n /**\n * Trigger appropriate registration process process for the user input\n * URL. It can either be a cartridge or a registration url.\n *\n * @method addLTILegacyTool\n * @private\n * @return {Promise} jQuery Deferred object\n */\n var addLTILegacyTool = function() {\n var url = $.trim(getToolURL());\n\n if (url === \"\") {\n return $.Deferred().resolve();\n }\n var toolButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON);\n startLoading(toolButton);\n\n var promise = toolType.isCartridge(url);\n\n promise.always(function() {\n stopLoading(toolButton);\n });\n\n promise.done(function(result) {\n if (result.iscartridge) {\n $(SELECTORS.TOOL_URL).val('');\n $(document).trigger(ltiEvents.START_CARTRIDGE_REGISTRATION, url);\n } else {\n $(document).trigger(ltiEvents.START_EXTERNAL_REGISTRATION, {url: url});\n }\n });\n\n promise.fail(function() {\n str.get_string('errorbadurl', 'mod_lti')\n .done(function(s) {\n $(document).trigger(ltiEvents.REGISTRATION_FEEDBACK, {\n message: s,\n error: true\n });\n })\n .fail(notification.exception);\n });\n\n return promise;\n };\n\n /**\n * Sets up the listeners for user interaction on the page.\n *\n * @method registerEventListeners\n * @private\n */\n var registerEventListeners = function() {\n\n // These are events fired by the registration processes. Either\n // the cartridge registration or the external registration url.\n $(document).on(ltiEvents.NEW_TOOL_TYPE, function() {\n reloadToolList();\n });\n\n $(document).on(ltiEvents.START_EXTERNAL_REGISTRATION, function() {\n showExternalRegistration();\n $(SELECTORS.TOOL_URL).val('');\n hideToolList();\n });\n\n $(document).on(ltiEvents.STOP_EXTERNAL_REGISTRATION, function() {\n showToolList();\n showRegistrationChoices();\n });\n\n $(document).on(ltiEvents.START_CARTRIDGE_REGISTRATION, function(event, url) {\n showCartridgeRegistration(url);\n });\n\n $(document).on(ltiEvents.STOP_CARTRIDGE_REGISTRATION, function() {\n getCartridgeRegistrationContainer().find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).removeAttr('data-cartridge-url');\n showRegistrationChoices();\n });\n\n $(document).on(ltiEvents.REGISTRATION_FEEDBACK, function(event, data) {\n showRegistrationFeedback(data);\n });\n\n var addLegacyButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON);\n addLegacyButton.click(function(e) {\n e.preventDefault();\n addLTILegacyTool();\n });\n\n var addLTIButton = $(SELECTORS.TOOL_CREATE_BUTTON);\n addLTIButton.click(function(e) {\n e.preventDefault();\n addLTIAdvTool();\n });\n\n };\n\n return /** @alias module:mod_lti/cartridge_registration_form */ {\n\n /**\n * Initialise this module.\n */\n init: function() {\n registerEventListeners();\n reloadToolList();\n }\n };\n});\n"],"file":"tool_configure_controller.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/tool_configure_controller.js"],"names":["define","$","ajax","notification","templates","ltiEvents","KEYS","toolType","toolProxy","str","SELECTORS","EXTERNAL_REGISTRATION_CONTAINER","EXTERNAL_REGISTRATION_PAGE_CONTAINER","EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER","CARTRIDGE_REGISTRATION_CONTAINER","CARTRIDGE_REGISTRATION_FORM","ADD_TOOL_FORM","TOOL_LIST_CONTAINER","TOOL_CREATE_BUTTON","TOOL_CREATE_LTILEGACY_BUTTON","REGISTRATION_CHOICE_CONTAINER","TOOL_URL","getToolListContainer","getExternalRegistrationContainer","getCartridgeRegistrationContainer","getRegistrationChoiceContainer","closeLTIAdvRegistration","e","data","subject","empty","hideExternalRegistration","showRegistrationChoices","showToolList","reloadToolList","initiateRegistration","url","removeClass","container","append","encodeURIComponent","showExternalRegistration","window","addEventListener","getToolURL","val","addClass","hideCartridgeRegistration","hideRegistrationChoices","screenReaderAnnounce","showCartridgeRegistration","find","attr","element","children","detach","appendTo","hideToolList","showRegistrationFeedback","type","error","addNotification","message","startLoading","stopLoading","promise","Deferred","when","query","done","types","proxies","render","tools","html","js","runTemplateJS","resolve","fail","reject","exception","always","addLTIAdvTool","trim","addLTILegacyTool","toolButton","isCartridge","result","iscartridge","document","trigger","START_CARTRIDGE_REGISTRATION","START_EXTERNAL_REGISTRATION","get_string","s","REGISTRATION_FEEDBACK","registerEventListeners","on","NEW_TOOL_TYPE","STOP_EXTERNAL_REGISTRATION","event","STOP_CARTRIDGE_REGISTRATION","removeAttr","addLegacyButton","click","preventDefault","addLTIButton","init"],"mappings":"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","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 * Standard Ajax wrapper for Moodle. It calls the central Ajax script,\n * which can call any existing webservice using the current session.\n * In addition, it can batch multiple requests and return multiple responses.\n *\n * @module mod_lti/tool_configure_controller\n * @class tool_configure_controller\n * @package mod_lti\n * @copyright 2015 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.1\n */\ndefine(['jquery', 'core/ajax', 'core/notification', 'core/templates', 'mod_lti/events', 'mod_lti/keys', 'mod_lti/tool_type',\n 'mod_lti/tool_proxy', 'core/str'],\n function($, ajax, notification, templates, ltiEvents, KEYS, toolType, toolProxy, str) {\n\n var SELECTORS = {\n EXTERNAL_REGISTRATION_CONTAINER: '#external-registration-container',\n EXTERNAL_REGISTRATION_PAGE_CONTAINER: '#external-registration-page-container',\n EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER: '#external-registration-template-container',\n CARTRIDGE_REGISTRATION_CONTAINER: '#cartridge-registration-container',\n CARTRIDGE_REGISTRATION_FORM: '#cartridge-registration-form',\n ADD_TOOL_FORM: '#add-tool-form',\n TOOL_LIST_CONTAINER: '#tool-list-container',\n TOOL_CREATE_BUTTON: '#tool-create-button',\n TOOL_CREATE_LTILEGACY_BUTTON: '#tool-createltilegacy-button',\n REGISTRATION_CHOICE_CONTAINER: '#registration-choice-container',\n TOOL_URL: '#tool-url'\n };\n\n /**\n * Get the tool list container element.\n *\n * @method getToolListContainer\n * @private\n * @return {Object} jQuery object\n */\n var getToolListContainer = function() {\n return $(SELECTORS.TOOL_LIST_CONTAINER);\n };\n\n /**\n * Get the external registration container element.\n *\n * @method getExternalRegistrationContainer\n * @private\n * @return {Object} jQuery object\n */\n var getExternalRegistrationContainer = function() {\n return $(SELECTORS.EXTERNAL_REGISTRATION_CONTAINER);\n };\n\n /**\n * Get the cartridge registration container element.\n *\n * @method getCartridgeRegistrationContainer\n * @private\n * @return {Object} jQuery object\n */\n var getCartridgeRegistrationContainer = function() {\n return $(SELECTORS.CARTRIDGE_REGISTRATION_CONTAINER);\n };\n\n /**\n * Get the registration choice container element.\n *\n * @method getRegistrationChoiceContainer\n * @private\n * @return {Object} jQuery object\n */\n var getRegistrationChoiceContainer = function() {\n return $(SELECTORS.REGISTRATION_CHOICE_CONTAINER);\n };\n\n /**\n * Close the LTI Advantage Registration IFrame.\n *\n * @private\n * @param {Object} e post message event sent from the registration frame.\n */\n var closeLTIAdvRegistration = function(e) {\n if (e.data && 'org.imsglobal.lti.close' === e.data.subject) {\n $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER).empty();\n hideExternalRegistration();\n showRegistrationChoices();\n showToolList();\n showRegistrationChoices();\n reloadToolList();\n }\n };\n\n /**\n * Load the external registration template and render it in the DOM and display it.\n *\n * @method initiateRegistration\n * @private\n * @param {String} url where to send the registration request\n */\n var initiateRegistration = function(url) {\n // Show the external registration page in an iframe.\n $(SELECTORS.EXTERNAL_REGISTRATION_PAGE_CONTAINER).removeClass('hidden');\n var container = $(SELECTORS.EXTERNAL_REGISTRATION_TEMPLATE_CONTAINER);\n container.append($(\"\"));\n showExternalRegistration();\n window.addEventListener(\"message\", closeLTIAdvRegistration, false);\n };\n\n /**\n * Get the tool type URL.\n *\n * @method getToolURL\n * @private\n * @return {String} the tool type url\n */\n var getToolURL = function() {\n return $(SELECTORS.TOOL_URL).val();\n };\n\n /**\n * Hide the external registration container.\n *\n * @method hideExternalRegistration\n * @private\n */\n var hideExternalRegistration = function() {\n getExternalRegistrationContainer().addClass('hidden');\n };\n\n /**\n * Hide the cartridge registration container.\n *\n * @method hideCartridgeRegistration\n * @private\n */\n var hideCartridgeRegistration = function() {\n getCartridgeRegistrationContainer().addClass('hidden');\n };\n\n /**\n * Hide the registration choice container.\n *\n * @method hideRegistrationChoices\n * @private\n */\n var hideRegistrationChoices = function() {\n getRegistrationChoiceContainer().addClass('hidden');\n };\n\n /**\n * Display the external registration panel and hides the other\n * panels.\n *\n * @method showExternalRegistration\n * @private\n */\n var showExternalRegistration = function() {\n hideCartridgeRegistration();\n hideRegistrationChoices();\n getExternalRegistrationContainer().removeClass('hidden');\n screenReaderAnnounce(getExternalRegistrationContainer());\n };\n\n /**\n * Display the cartridge registration panel and hides the other\n * panels.\n *\n * @method showCartridgeRegistration\n * @param {String} url\n * @private\n */\n var showCartridgeRegistration = function(url) {\n hideExternalRegistration();\n hideRegistrationChoices();\n // Don't save the key and secret from the last tool.\n var container = getCartridgeRegistrationContainer();\n container.find('input').val('');\n container.removeClass('hidden');\n container.find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).attr('data-cartridge-url', url);\n screenReaderAnnounce(container);\n };\n\n /**\n * Display the registration choices panel and hides the other\n * panels.\n *\n * @method showRegistrationChoices\n * @private\n */\n var showRegistrationChoices = function() {\n hideExternalRegistration();\n hideCartridgeRegistration();\n getRegistrationChoiceContainer().removeClass('hidden');\n screenReaderAnnounce(getRegistrationChoiceContainer());\n };\n\n /**\n * JAWS does not notice visibility changes with aria-live.\n * Remove and add the content back to force it to read it out.\n * This function can be removed once JAWS supports visibility.\n *\n * @method screenReaderAnnounce\n * @param {Object} element\n * @private\n */\n var screenReaderAnnounce = function(element) {\n var children = element.children().detach();\n children.appendTo(element);\n };\n\n /**\n * Hides the list of tool types.\n *\n * @method hideToolList\n * @private\n */\n var hideToolList = function() {\n getToolListContainer().addClass('hidden');\n };\n\n /**\n * Display the list of tool types.\n *\n * @method hideToolList\n * @private\n */\n var showToolList = function() {\n getToolListContainer().removeClass('hidden');\n };\n\n /**\n * Display the registration feedback alert and hide the other panels.\n *\n * @method showRegistrationFeedback\n * @param {Object} data\n * @private\n */\n var showRegistrationFeedback = function(data) {\n var type = data.error ? 'error' : 'success';\n notification.addNotification({\n message: data.message,\n type: type\n });\n };\n\n /**\n * Show the loading animation\n *\n * @method startLoading\n * @private\n * @param {Object} element jQuery object\n */\n var startLoading = function(element) {\n element.addClass(\"loading\");\n };\n\n /**\n * Hide the loading animation\n *\n * @method stopLoading\n * @private\n * @param {Object} element jQuery object\n */\n var stopLoading = function(element) {\n element.removeClass(\"loading\");\n };\n\n /**\n * Refresh the list of tool types and render the new ones.\n *\n * @method reloadToolList\n * @private\n */\n var reloadToolList = function() {\n var promise = $.Deferred();\n var container = getToolListContainer();\n startLoading(container);\n\n $.when(\n toolType.query(),\n toolProxy.query({'orphanedonly': true})\n )\n .done(function(types, proxies) {\n templates.render('mod_lti/tool_list', {tools: types, proxies: proxies})\n .done(function(html, js) {\n container.empty();\n container.append(html);\n templates.runTemplateJS(js);\n promise.resolve();\n }).fail(promise.reject);\n })\n .fail(promise.reject);\n\n promise.fail(notification.exception)\n .always(function() {\n stopLoading(container);\n });\n };\n\n /**\n * Start the LTI Advantage registration.\n *\n * @method addLTIAdvTool\n * @private\n */\n var addLTIAdvTool = function() {\n var url = getToolURL().trim();\n\n if (url) {\n $(SELECTORS.TOOL_URL).val('');\n hideToolList();\n initiateRegistration(url);\n }\n\n };\n\n /**\n * Trigger appropriate registration process process for the user input\n * URL. It can either be a cartridge or a registration url.\n *\n * @method addLTILegacyTool\n * @private\n * @return {Promise} jQuery Deferred object\n */\n var addLTILegacyTool = function() {\n var url = getToolURL().trim();\n\n if (url === \"\") {\n return $.Deferred().resolve();\n }\n var toolButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON);\n startLoading(toolButton);\n\n var promise = toolType.isCartridge(url);\n\n promise.always(function() {\n stopLoading(toolButton);\n });\n\n promise.done(function(result) {\n if (result.iscartridge) {\n $(SELECTORS.TOOL_URL).val('');\n $(document).trigger(ltiEvents.START_CARTRIDGE_REGISTRATION, url);\n } else {\n $(document).trigger(ltiEvents.START_EXTERNAL_REGISTRATION, {url: url});\n }\n });\n\n promise.fail(function() {\n str.get_string('errorbadurl', 'mod_lti')\n .done(function(s) {\n $(document).trigger(ltiEvents.REGISTRATION_FEEDBACK, {\n message: s,\n error: true\n });\n })\n .fail(notification.exception);\n });\n\n return promise;\n };\n\n /**\n * Sets up the listeners for user interaction on the page.\n *\n * @method registerEventListeners\n * @private\n */\n var registerEventListeners = function() {\n\n // These are events fired by the registration processes. Either\n // the cartridge registration or the external registration url.\n $(document).on(ltiEvents.NEW_TOOL_TYPE, function() {\n reloadToolList();\n });\n\n $(document).on(ltiEvents.START_EXTERNAL_REGISTRATION, function() {\n showExternalRegistration();\n $(SELECTORS.TOOL_URL).val('');\n hideToolList();\n });\n\n $(document).on(ltiEvents.STOP_EXTERNAL_REGISTRATION, function() {\n showToolList();\n showRegistrationChoices();\n });\n\n $(document).on(ltiEvents.START_CARTRIDGE_REGISTRATION, function(event, url) {\n showCartridgeRegistration(url);\n });\n\n $(document).on(ltiEvents.STOP_CARTRIDGE_REGISTRATION, function() {\n getCartridgeRegistrationContainer().find(SELECTORS.CARTRIDGE_REGISTRATION_FORM).removeAttr('data-cartridge-url');\n showRegistrationChoices();\n });\n\n $(document).on(ltiEvents.REGISTRATION_FEEDBACK, function(event, data) {\n showRegistrationFeedback(data);\n });\n\n var addLegacyButton = $(SELECTORS.TOOL_CREATE_LTILEGACY_BUTTON);\n addLegacyButton.click(function(e) {\n e.preventDefault();\n addLTILegacyTool();\n });\n\n var addLTIButton = $(SELECTORS.TOOL_CREATE_BUTTON);\n addLTIButton.click(function(e) {\n e.preventDefault();\n addLTIAdvTool();\n });\n\n };\n\n return /** @alias module:mod_lti/cartridge_registration_form */ {\n\n /**\n * Initialise this module.\n */\n init: function() {\n registerEventListeners();\n reloadToolList();\n }\n };\n});\n"],"file":"tool_configure_controller.min.js"}
\ No newline at end of file
diff --git a/mod/lti/amd/src/tool_configure_controller.js b/mod/lti/amd/src/tool_configure_controller.js
index 6a38f598e87..1ca2fd36361 100644
--- a/mod/lti/amd/src/tool_configure_controller.js
+++ b/mod/lti/amd/src/tool_configure_controller.js
@@ -319,7 +319,7 @@ define(['jquery', 'core/ajax', 'core/notification', 'core/templates', 'mod_lti/e
* @private
*/
var addLTIAdvTool = function() {
- var url = $.trim(getToolURL());
+ var url = getToolURL().trim();
if (url) {
$(SELECTORS.TOOL_URL).val('');
@@ -338,7 +338,7 @@ define(['jquery', 'core/ajax', 'core/notification', 'core/templates', 'mod_lti/e
* @return {Promise} jQuery Deferred object
*/
var addLTILegacyTool = function() {
- var url = $.trim(getToolURL());
+ var url = getToolURL().trim();
if (url === "") {
return $.Deferred().resolve();
diff --git a/user/amd/build/unified_filter_datasource.min.js b/user/amd/build/unified_filter_datasource.min.js
index 08fb4f0cf7a..5b1e3ad2aff 100644
--- a/user/amd/build/unified_filter_datasource.min.js
+++ b/user/amd/build/unified_filter_datasource.min.js
@@ -1,2 +1,2 @@
-define ("core_user/unified_filter_datasource",["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function list(b,c){var d=[],e=a(b),f=a(b).data("originaloptionsjson"),g=e.val();a.each(f,function(b,e){if(""!==a.trim(c)&&-1===e.label.toLocaleLowerCase().indexOf(c.toLocaleLowerCase())){return!0}if(-1.\n\n/**\n * Datasource for the core_user/unified_filter.\n * @deprecated since Moodle 3.9 MDL-68612 - user unified filter replaced by participants filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package core_user\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:core_user/unified_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if ($.trim(query) !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"unified_filter_datasource.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/unified_filter_datasource.js"],"names":["define","$","Ajax","Notification","list","selector","query","filteredOptions","el","originalOptions","data","selectedFilters","val","each","index","option","trim","label","toLocaleLowerCase","indexOf","inArray","value","push","deferred","Deferred","resolve","promise","processResults","results","options","transport","callback","then","catch","exception"],"mappings":"AA0BAA,OAAM,uCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CAA+C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CAEjF,MAAgE,CAQ5DC,IAAI,CAAE,cAASC,CAAT,CAAmBC,CAAnB,CAA0B,IACxBC,CAAAA,CAAe,CAAG,EADM,CAGxBC,CAAE,CAAGP,CAAC,CAACI,CAAD,CAHkB,CAIxBI,CAAe,CAAGR,CAAC,CAACI,CAAD,CAAD,CAAYK,IAAZ,CAAiB,qBAAjB,CAJM,CAKxBC,CAAe,CAAGH,CAAE,CAACI,GAAH,EALM,CAM5BX,CAAC,CAACY,IAAF,CAAOJ,CAAP,CAAwB,SAASK,CAAT,CAAgBC,CAAhB,CAAwB,CAE5C,GAAqB,EAAjB,GAAAT,CAAK,CAACU,IAAN,IAA+F,CAAC,CAAzE,GAAAD,CAAM,CAACE,KAAP,CAAaC,iBAAb,GAAiCC,OAAjC,CAAyCb,CAAK,CAACY,iBAAN,EAAzC,CAA3B,CAAuG,CACnG,QACH,CAED,GAA+C,CAAC,CAA5C,CAAAjB,CAAC,CAACmB,OAAF,CAAUL,CAAM,CAACM,KAAjB,CAAwBV,CAAxB,CAAJ,CAAmD,CAC/C,QACH,CAEDJ,CAAe,CAACe,IAAhB,CAAqBP,CAArB,EACA,QACH,CAZD,EAcA,GAAIQ,CAAAA,CAAQ,CAAG,GAAItB,CAAAA,CAAC,CAACuB,QAArB,CACAD,CAAQ,CAACE,OAAT,CAAiBlB,CAAjB,EAEA,MAAOgB,CAAAA,CAAQ,CAACG,OAAT,EACV,CAhC2D,CAyC5DC,cAAc,CAAE,wBAAStB,CAAT,CAAmBuB,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAO,CAAG,EAAd,CACA5B,CAAC,CAACY,IAAF,CAAOe,CAAP,CAAgB,SAASd,CAAT,CAAgBJ,CAAhB,CAAsB,CAClCmB,CAAO,CAACP,IAAR,CAAa,CACTD,KAAK,CAAEX,CAAI,CAACW,KADH,CAETJ,KAAK,CAAEP,CAAI,CAACO,KAFH,CAAb,CAIH,CALD,EAMA,MAAOY,CAAAA,CACV,CAlD2D,CA4D5DC,SAAS,CAAE,mBAASzB,CAAT,CAAmBC,CAAnB,CAA0ByB,CAA1B,CAAoC,CAC3C,KAAK3B,IAAL,CAAUC,CAAV,CAAoBC,CAApB,EAA2B0B,IAA3B,CAAgCD,CAAhC,EAA0CE,KAA1C,CAAgD9B,CAAY,CAAC+B,SAA7D,CACH,CA9D2D,CAiEnE,CAnEK,CAAN","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 * Datasource for the core_user/unified_filter.\n * @deprecated since Moodle 3.9 MDL-68612 - user unified filter replaced by participants filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package core_user\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:core_user/unified_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"unified_filter_datasource.min.js"}
\ No newline at end of file
diff --git a/user/amd/src/unified_filter_datasource.js b/user/amd/src/unified_filter_datasource.js
index fdbb2064138..ef0a502efd4 100644
--- a/user/amd/src/unified_filter_datasource.js
+++ b/user/amd/src/unified_filter_datasource.js
@@ -42,7 +42,7 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat
var selectedFilters = el.val();
$.each(originalOptions, function(index, option) {
// Skip option if it does not contain the query string.
- if ($.trim(query) !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {
+ if (query.trim() !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {
return true;
}
// Skip filters that have already been selected.