From 135461b4a9dac5dbc80773da992b567395d764a5 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 16 Dec 2019 09:58:53 +0800 Subject: [PATCH 1/2] MDL-63996 behat: Fix multi-tag autocomplete usage --- lib/behat/form_field/behat_form_autocomplete.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/behat/form_field/behat_form_autocomplete.php b/lib/behat/form_field/behat_form_autocomplete.php index 4d56560560b..8b1d39080a0 100644 --- a/lib/behat/form_field/behat_form_autocomplete.php +++ b/lib/behat/form_field/behat_form_autocomplete.php @@ -86,6 +86,7 @@ class behat_form_autocomplete extends behat_form_text { $this->wait_for_pending_js(); $this->key_press(27); + $this->wait_for_pending_js(); } } } From f496b55189005e6b288b6240f5f92084b8c7f6ad Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 16 Dec 2019 10:00:28 +0800 Subject: [PATCH 2/2] MDL-63996 core/tags: Pending JS for all tag code --- lib/amd/build/notification.min.js | 2 +- lib/amd/build/tag.min.js | 2 +- lib/amd/src/notification.js | 57 ++++-- lib/amd/src/tag.js | 300 ++++++++++++++++++------------ 4 files changed, 224 insertions(+), 137 deletions(-) diff --git a/lib/amd/build/notification.min.js b/lib/amd/build/notification.min.js index 9ed5a356058..0b5d960529d 100644 --- a/lib/amd/build/notification.min.js +++ b/lib/amd/build/notification.min.js @@ -1 +1 @@ -define(["core/yui","jquery","core/log"],function(a,b,c){var d={types:{success:"core/notification_success",info:"core/notification_info",warning:"core/notification_warning",error:"core/notification_error"},fieldName:"user-notifications",fetchNotifications:function(){require(["core/ajax"],function(a){var b=a.call([{methodname:"core_fetch_notifications",args:{contextid:d.contextid}}]);b[0].done(d.addNotifications)})},addNotifications:function(a){a||(a=[]),b.each(a,function(a,b){d.renderNotification(b.template,b.variables)})},setupTargetRegion:function(){var a=b("#"+d.fieldName);if(a.length)return!1;var c=b("").attr("id",d.fieldName);return a=b("#region-main"),a.length?a.prepend(c):(a=b('[role="main"]'),a.length?a.prepend(c):(a=b("body"),a.prepend(c)))},addNotification:function(a){var c=d.types.error;return a=b.extend({closebutton:!0,announce:!0,type:"error"},a),a.template?(c=a.template,delete a.template):a.type&&("undefined"!=typeof d.types[a.type]&&(c=d.types[a.type]),delete a.type),d.renderNotification(c,a)},renderNotification:function(a,e){return"undefined"!=typeof e.message&&e.message?void require(["core/templates"],function(c){c.render(a,e).done(function(a,e){b("#"+d.fieldName).prepend(a),c.runTemplateJS(e)}).fail(d.exception)}):void c.debug("Notification received without content. Skipping.")},alert:function(b,c,d){a.use("moodle-core-notification-alert",function(){var a=new M.core.alert({title:b,message:c,yesLabel:d});a.show()})},confirm:function(b,c,d,e,f,g){a.use("moodle-core-notification-confirm",function(){var a=new M.core.confirm({title:b,question:c,yesLabel:d,noLabel:e});a.on("complete-yes",function(){f()}),g&&a.on("complete-no",function(){g()}),a.show()})},exception:function(b){if("undefined"==typeof b.stack&&(b.stack=""),b.debuginfo&&(b.stack+=b.debuginfo+"\n"),!b.backtrace&&b.stacktrace&&(b.backtrace=b.stacktrace),b.backtrace){b.stack+=b.backtrace;var c=b.backtrace.match(/line ([^ ]*) of/),d=b.backtrace.match(/ of ([^:]*): /);c&&c[1]&&(b.lineNumber=c[1]),d&&d[1]&&(b.fileName=d[1],b.fileName.length>30&&(b.fileName="..."+b.fileName.substr(b.fileName.length-27)))}"undefined"==typeof b.name&&b.errorcode&&(b.name=b.errorcode),a.use("moodle-core-notification-exception",function(){var a=new M.core.exception(b);a.show()})}};return{init:function(a,b){d.contextid=a,d.setupTargetRegion(),d.addNotifications(b),d.fetchNotifications()},fetchNotifications:d.fetchNotifications,addNotification:d.addNotification,alert:d.alert,confirm:d.confirm,exception:d.exception}}); \ No newline at end of file +define(["core/yui","jquery","core/log","core/pending"],function(a,b,c,d){var e={types:{success:"core/notification_success",info:"core/notification_info",warning:"core/notification_warning",error:"core/notification_error"},fieldName:"user-notifications",fetchNotifications:function(){var a=new d("core/notification:fetchNotifications");require(["core/ajax"],function(b){var c=b.call([{methodname:"core_fetch_notifications",args:{contextid:e.contextid}}]);c[0].then(e.addNotifications).always(a.resolve)})},addNotifications:function(a){var c=new d("core/notification:addNotifications");a||(a=[]),b.each(a,function(a,b){e.renderNotification(b.template,b.variables)}),c.resolve()},setupTargetRegion:function(){var a=b("#"+e.fieldName);if(a.length)return!1;var c=b("").attr("id",e.fieldName);return a=b("#region-main"),a.length?a.prepend(c):(a=b('[role="main"]'),a.length?a.prepend(c):(a=b("body"),a.prepend(c)))},addNotification:function(a){var c=new d("core/notification:addNotifications"),f=e.types.error;return a=b.extend({closebutton:!0,announce:!0,type:"error"},a),a.template?(f=a.template,delete a.template):a.type&&("undefined"!=typeof e.types[a.type]&&(f=e.types[a.type]),delete a.type),c.resolve(),e.renderNotification(f,a)},renderNotification:function(a,f){if("undefined"==typeof f.message||!f.message)return void c.debug("Notification received without content. Skipping.");var g=new d("core/notification:renderNotification");require(["core/templates"],function(c){c.render(a,f).then(function(a,d){b("#"+e.fieldName).prepend(a),c.runTemplateJS(d)}).then(g.resolve)["catch"](e.exception)})},alert:function(b,c,e){var f=new d("core/notification:alert");a.use("moodle-core-notification-alert",function(){var a=new M.core.alert({title:b,message:c,yesLabel:e});a.show(),f.resolve()})},confirm:function(b,c,e,f,g,h){var i=new d("core/notification:confirm");a.use("moodle-core-notification-confirm",function(){var a=new M.core.confirm({title:b,question:c,yesLabel:e,noLabel:f});a.on("complete-yes",function(){g()}),h&&a.on("complete-no",function(){h()}),a.show(),i.resolve()})},exception:function(b){var c=new d("core/notification:addNotifications");if("undefined"==typeof b.stack&&(b.stack=""),b.debuginfo&&(b.stack+=b.debuginfo+"\n"),!b.backtrace&&b.stacktrace&&(b.backtrace=b.stacktrace),b.backtrace){b.stack+=b.backtrace;var e=b.backtrace.match(/line ([^ ]*) of/),f=b.backtrace.match(/ of ([^:]*): /);e&&e[1]&&(b.lineNumber=e[1]),f&&f[1]&&(b.fileName=f[1],b.fileName.length>30&&(b.fileName="..."+b.fileName.substr(b.fileName.length-27)))}"undefined"==typeof b.name&&b.errorcode&&(b.name=b.errorcode),a.use("moodle-core-notification-exception",function(){var a=new M.core.exception(b);a.show(),c.resolve()})}};return{init:function(a,b){e.contextid=a,e.setupTargetRegion(),e.addNotifications(b),e.fetchNotifications()},fetchNotifications:e.fetchNotifications,addNotification:e.addNotification,alert:e.alert,confirm:e.confirm,exception:e.exception}}); \ No newline at end of file diff --git a/lib/amd/build/tag.min.js b/lib/amd/build/tag.min.js index ba255210c2a..99354abedbe 100644 --- a/lib/amd/build/tag.min.js +++ b/lib/amd/build/tag.min.js @@ -1 +1 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/str","core/yui"],function(a,b,c,d,e,f){return{initTagindexPage:function(){a("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",function(d){d.preventDefault();var e=a(this),f=e[0].search.replace(/^\?/,""),g=e.closest(".tagarea[data-ta]"),h=f.split("&").reduce(function(a,b){var c=b.split("=");return a[c[0]]=decodeURIComponent(c[1]),a},{}),i=b.call([{methodname:"core_tag_get_tagindex",args:{tagindex:h}}],!0);a.when.apply(a,i).done(function(a){c.render("core_tag/index",a).done(function(a){g.replaceWith(a)})})})},initManagePage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){if(e.get_string("selecttag","core_tag",b.ajaxreturn.value).then(function(c){return a('label[for="tagselect'+b.ajaxreturn.itemid+'"]').html(c)}).fail(d.exception),e.get_string("now").done(function(c){a(b.target).closest("tr").find("td.col-timemodified").html(c)}),"tagflag"===b.ajaxreturn.itemtype){var c=a(b.target).closest("tr");"0"===b.ajaxreturn.value?c.removeClass("flagged-tag"):c.addClass("flagged-tag")}}),a(".tag-management-table").delegate("a.tagdelete","click",function(b){b.preventDefault();var c=a(this).attr("href");e.get_strings([{key:"delete"},{key:"confirmdeletetag",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=c})})}),a("#tag-management-delete").click(function(b){var c=a(this).closest("form").get(0),f=a(c).find("input[type=checkbox]:checked").length;if(f){var g=a("").attr("name",this.name);b.preventDefault(),e.get_strings([{key:"delete"},{key:"confirmdeletetags",component:"tag"},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){g.appendTo(c),c.submit()})})}}),a("#tag-management-combine").click(function(b){b.preventDefault();var c=a(this).closest("form").get(0),g=a(c).find("input[type=checkbox]:checked");if(g.length<=1)return void e.get_strings([{key:"combineselected",component:"tag"},{key:"selectmultipletags",component:"tag"},{key:"ok"}]).done(function(a){d.alert(a[0],a[1],a[2])});var h=a("").attr("name",this.name);e.get_strings([{key:"combineselected",component:"tag"},{key:"selectmaintag",component:"tag"},{key:"continue"},{key:"cancel"}]).done(function(b){var d=a('
');d.find(".description").html(b[1]),d.find("#combinetags_submit").attr("value",b[2]),d.find("#combinetags_cancel").attr("value",b[3]);var e=d.find(".options");g.each(function(){var b=a(this).val(),c=a(".inplaceeditable[data-itemtype=tagname][data-itemid="+b+"]").attr("data-value"),d='
";e.append(a(d))}),f.use("moodle-core-notification-dialogue",function(){var e=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:d.html()});e.show(),a("#combinetags_form input[type=radio]").first().focus().prop("checked",!0),a("#combinetags_form #combinetags_cancel").on("click",function(){e.destroy()}),a("#combinetags_form").on("submit",function(){h.appendTo(c);var b=a("input[name=maintag]:checked","#combinetags_form").val();return a("").attr("name","maintag").attr("value",b).appendTo(c),c.submit(),!1})})})}),a("body").on("updatefailed","[data-inplaceeditable][data-itemtype=tagname]",function(b){var c=b.exception,f=b.newvalue,g=a(b.target).attr("data-itemid");"namesalreadybeeingused"===c.errorcode&&(b.preventDefault(),e.get_strings([{key:"nameuseddocombine",component:"tag"},{key:"yes"},{key:"cancel"}]).done(function(a){d.confirm(b.message,a[0],a[1],a[2],function(){window.location.href=window.location.href+"&newname="+encodeURIComponent(f)+"&tagid="+encodeURIComponent(g)+"&action=renamecombine&sesskey="+M.cfg.sesskey})}))}),a("body").on("click","a[data-action=addstandardtag]",function(b){b.preventDefault(),e.get_strings([{key:"addotags",component:"tag"},{key:"inputstandardtags",component:"tag"},{key:"continue"},{key:"cancel"}]).done(function(b){var c=a('
');c.find("#addtags_form").attr("action",window.location.href),c.find("#addtags_submit").attr("value",b[2]),c.find("#addtags_cancel").attr("value",b[3]),f.use("moodle-core-notification-dialogue",function(){var d=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:c.html()});d.show(),a("#addtags_form input[type=text]").focus(),a("#addtags_form #addtags_cancel").on("click",function(){d.destroy()})})})})},initManageCollectionsPage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){var c,d,e,f=b.ajaxreturn;"core_tag"===f.component&&"tagareaenable"===f.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").hide(),e=f.value,"1"===e?(a(this).closest("tr").removeClass("dimmed_text"),d=a(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value"),a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").show()):a(this).closest("tr").addClass("dimmed_text")),"core_tag"===f.component&&"tagareacollection"===f.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").hide(),d=a(this).attr("data-value"),e=a(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value"),"1"===e&&a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").show())}),a("body").on("click",".addtagcoll > a",function(b){b.preventDefault();var c=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"addtagcoll",component:"tag"},{key:"name"},{key:"searchable",component:"tag"},{key:"create"},{key:"cancel"}]).done(function(b){var d=a('
');d.find('label[for="addtagcoll_name"]').html(b[1]),d.find('label[for="addtagcoll_searchable"]').html(b[2]),d.find("#addtagcoll_submit").attr("value",b[3]),d.find("#addtagcoll_cancel").attr("value",b[4]),f.use("moodle-core-notification-dialogue",function(){var e=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:d.html()});e.show(),a("#addtagcoll_form #addtagcoll_name").focus(),a("#addtagcoll_form #addtagcoll_cancel").on("click",function(){e.destroy()}),a("#addtagcoll_form").on("submit",function(){var b=a("#addtagcoll_form #addtagcoll_name").val(),d=a("#addtagcoll_form #addtagcoll_searchable").prop("checked")?1:0;return String(b).length>0&&(window.location.href=c+"&name="+encodeURIComponent(b)+"&searchable="+d),!1})})})}),a("body").on("click",".tag-collections-table .action_delete",function(b){b.preventDefault();var c=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"delete"},{key:"suredeletecoll",component:"tag",param:a(this).attr("data-collname")},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=c})})})}}}); \ No newline at end of file +define(["jquery","core/ajax","core/templates","core/notification","core/str","core/yui","core/pending"],function(a,b,c,d,e,f,g){return{initTagindexPage:function(){a("body").delegate(".tagarea[data-ta] a[data-quickload=1]","click",function(e){var f=new g("core/tag:initTagindexPage");e.preventDefault();var h=a(this),i=h[0].search.replace(/^\?/,""),j=h.closest(".tagarea[data-ta]"),k=i.split("&").reduce(function(a,b){var c=b.split("=");return a[c[0]]=decodeURIComponent(c[1]),a},{});b.call([{methodname:"core_tag_get_tagindex",args:{tagindex:k}}])[0].then(function(a){return c.render("core_tag/index",a)}).then(function(a,b){c.replaceNode(j,a,b)}).always(f.resolve)["catch"](d.exception)})},initManagePage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){var c=new g("core/tag:initManagePage");if(e.get_strings([{key:"selecttag",component:"core_tag"},{key:"now",component:"core"}]).then(function(c){a('label[for="tagselect'+b.ajaxreturn.itemid+'"]').html(c[0]),a(b.target).closest("tr").find("td.col-timemodified").html(c[1])}).always(c.resolve)["catch"](d.exception),"tagflag"===b.ajaxreturn.itemtype){var f=a(b.target).closest("tr");"0"===b.ajaxreturn.value?f.removeClass("flagged-tag"):f.addClass("flagged-tag")}}),a(".tag-management-table").delegate("a.tagdelete","click",function(b){var c=new g("core/tag:tagdelete");b.preventDefault();var f=a(this).attr("href");e.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetag",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then(function(a){return d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=f})}).always(c.resolve)["catch"](d.exception)}),a("#tag-management-delete").click(function(b){var c=a(this).closest("form").get(0),f=a(c).find("input[type=checkbox]:checked").length;if(f){var h=new g("core/tag:tag-management-delete"),i=a("").attr("name",this.name);b.preventDefault(),e.get_strings([{key:"delete",component:"core"},{key:"confirmdeletetags",component:"tag"},{key:"yes",component:"core"},{key:"no",component:"core"}]).then(function(a){return d.confirm(a[0],a[1],a[2],a[3],function(){i.appendTo(c),c.submit()})}).always(h.resolve)["catch"](d.exception)}}),a("#tag-management-combine").click(function(b){var c=new g("core/tag:tag-management-combine");b.preventDefault();var h=a(this).closest("form").get(0),i=a(h).find("input[type=checkbox]:checked");if(i.length<=1)return void e.get_strings([{key:"combineselected",component:"tag"},{key:"selectmultipletags",component:"tag"},{key:"ok"}]).then(function(a){return d.alert(a[0],a[1],a[2])}).always(c.resolve)["catch"](d.exception);var j=a("").attr("name",this.name);e.get_strings([{key:"combineselected",component:"tag"},{key:"selectmaintag",component:"tag"},{key:"continue"},{key:"cancel"}]).then(function(b){var c=a('
');c.find(".description").html(b[1]),c.find("#combinetags_submit").attr("value",b[2]),c.find("#combinetags_cancel").attr("value",b[3]);var d=c.find(".options");i.each(function(){var b=a(this).val(),c=a(".inplaceeditable[data-itemtype=tagname][data-itemid="+b+"]").attr("data-value"),e='
";d.append(a(e))}),f.use("moodle-core-notification-dialogue",function(){var d=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:c.html()});d.show(),a("#combinetags_form input[type=radio]").first().focus().prop("checked",!0),a("#combinetags_form #combinetags_cancel").on("click",function(){d.destroy()}),a("#combinetags_form").on("submit",function(){j.appendTo(h);var b=a("input[name=maintag]:checked","#combinetags_form").val();return a("").attr("name","maintag").attr("value",b).appendTo(h),h.submit(),!1})})}).always(c.resolve)["catch"](d.exception)}),a("body").on("updatefailed","[data-inplaceeditable][data-itemtype=tagname]",function(b){var c=b.exception,f=b.newvalue,h=a(b.target).attr("data-itemid");if("namesalreadybeeingused"===c.errorcode){var i=new g("core/tag:tag-management-combine-exists");b.preventDefault(),e.get_strings([{key:"nameuseddocombine",component:"tag"},{key:"yes"},{key:"cancel"}]).then(function(a){return d.confirm(b.message,a[0],a[1],a[2],function(){window.location.href=window.location.href+"&newname="+encodeURIComponent(f)+"&tagid="+encodeURIComponent(h)+"&action=renamecombine&sesskey="+M.cfg.sesskey})}).always(i.resolve)["catch"](d.exception)}}),a("body").on("click","a[data-action=addstandardtag]",function(b){var c=new g("core/tag:addstandardtag");b.preventDefault(),e.get_strings([{key:"addotags",component:"tag"},{key:"inputstandardtags",component:"tag"},{key:"continue",component:"core"},{key:"cancel",component:"core"}]).then(function(b){var d=a('
');d.find("#addtags_form").attr("action",window.location.href),d.find("#addtags_submit").attr("value",b[2]),d.find("#addtags_cancel").attr("value",b[3]),f.use("moodle-core-notification-dialogue",function(){var e=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:d.html()});e.show(),a("#addtags_form input[type=text]").focus(),a("#addtags_form #addtags_cancel").on("click",function(){e.destroy()}),c.resolve()})})["catch"](d.exception)})},initManageCollectionsPage:function(){a("body").on("updated","[data-inplaceeditable]",function(b){var c,d,e,f=new g("core/tag:initManageCollectionsPage-updated"),h=b.ajaxreturn;"core_tag"===h.component&&"tagareaenable"===h.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").hide(),e=h.value,"1"===e?(a(this).closest("tr").removeClass("dimmed_text"),d=a(this).closest("tr").find('[data-itemtype="tagareacollection"]').attr("data-value"),a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").show()):a(this).closest("tr").addClass("dimmed_text")),"core_tag"===h.component&&"tagareacollection"===h.itemtype&&(c=a(this).attr("data-itemid"),a(".tag-collections-table ul[data-collectionid] li[data-areaid="+c+"]").hide(),d=a(this).attr("data-value"),e=a(this).closest("tr").find('[data-itemtype="tagareaenable"]').attr("data-value"),"1"===e&&a(".tag-collections-table ul[data-collectionid="+d+"] li[data-areaid="+c+"]").show()),f.resolve()}),a("body").on("click",".addtagcoll > a",function(b){var c=new g("core/tag:initManageCollectionsPage-addtagcoll");b.preventDefault();var h=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"addtagcoll",component:"tag"},{key:"name"},{key:"searchable",component:"tag"},{key:"create"},{key:"cancel"}]).then(function(b){var d=a('
');d.find('label[for="addtagcoll_name"]').html(b[1]),d.find('label[for="addtagcoll_searchable"]').html(b[2]),d.find("#addtagcoll_submit").attr("value",b[3]),d.find("#addtagcoll_cancel").attr("value",b[4]),f.use("moodle-core-notification-dialogue",function(){var e=new M.core.dialogue({draggable:!0,modal:!0,closeButton:!0,headerContent:b[0],bodyContent:d.html()});e.show(),a("#addtagcoll_form #addtagcoll_name").focus(),a("#addtagcoll_form #addtagcoll_cancel").on("click",function(){e.destroy()}),a("#addtagcoll_form").on("submit",function(){var b=a("#addtagcoll_form #addtagcoll_name").val(),c=a("#addtagcoll_form #addtagcoll_searchable").prop("checked")?1:0;return String(b).length>0&&(window.location.href=h+"&name="+encodeURIComponent(b)+"&searchable="+c),!1}),c.resolve()})})["catch"](d.exception)}),a("body").on("click",".tag-collections-table .action_delete",function(b){var c=new g("core/tag:initManageCollectionsPage-action_delete");b.preventDefault();var f=a(this).attr("data-url")+"&sesskey="+M.cfg.sesskey;e.get_strings([{key:"delete"},{key:"suredeletecoll",component:"tag",param:a(this).attr("data-collname")},{key:"yes"},{key:"no"}]).then(function(a){return d.confirm(a[0],a[1],a[2],a[3],function(){window.location.href=f})}).always(c.resolve)["catch"](d.exception)})}}}); \ No newline at end of file diff --git a/lib/amd/src/notification.js b/lib/amd/src/notification.js index 601e50e6c80..147b7cc1874 100644 --- a/lib/amd/src/notification.js +++ b/lib/amd/src/notification.js @@ -26,8 +26,8 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 2.9 */ -define(['core/yui', 'jquery', 'core/log'], -function(Y, $, log) { +define(['core/yui', 'jquery', 'core/log', 'core/pending'], +function(Y, $, log, Pending) { var notificationModule = { types: { 'success': 'core/notification_success', @@ -39,6 +39,8 @@ function(Y, $, log) { fieldName: 'user-notifications', fetchNotifications: function() { + var pendingPromise = new Pending('core/notification:fetchNotifications'); + require(['core/ajax'], function(ajax) { var promises = ajax.call([{ methodname: 'core_fetch_notifications', @@ -47,13 +49,17 @@ function(Y, $, log) { } }]); + // This currently fails when not logged in. + // eslint-disable-next-line promise/catch-or-return promises[0] - .done(notificationModule.addNotifications) - ; + .then(notificationModule.addNotifications) + .always(pendingPromise.resolve); }); }, addNotifications: function(notifications) { + var pendingPromise = new Pending('core/notification:addNotifications'); + if (!notifications) { notifications = []; } @@ -61,6 +67,8 @@ function(Y, $, log) { $.each(notifications, function(i, notification) { notificationModule.renderNotification(notification.template, notification.variables); }); + + pendingPromise.resolve(); }, setupTargetRegion: function() { @@ -86,13 +94,15 @@ function(Y, $, log) { }, addNotification: function(notification) { + var pendingPromise = new Pending('core/notification:addNotifications'); + var template = notificationModule.types.error; notification = $.extend({ - closebutton: true, - announce: true, - type: 'error' - }, notification); + closebutton: true, + announce: true, + type: 'error' + }, notification); if (notification.template) { template = notification.template; @@ -104,6 +114,8 @@ function(Y, $, log) { delete notification.type; } + pendingPromise.resolve(); + return notificationModule.renderNotification(template, notification); }, @@ -112,18 +124,25 @@ function(Y, $, log) { log.debug('Notification received without content. Skipping.'); return; } + + var pendingPromise = new Pending('core/notification:renderNotification'); + require(['core/templates'], function(templates) { templates.render(template, variables) - .done(function(html, js) { - $('#' + notificationModule.fieldName).prepend(html); - templates.runTemplateJS(js); - }) - .fail(notificationModule.exception) - ; + .then(function(html, js) { + $('#' + notificationModule.fieldName).prepend(html); + templates.runTemplateJS(js); + + return; + }) + .then(pendingPromise.resolve) + .catch(notificationModule.exception); }); }, alert: function(title, message, yesLabel) { + var pendingPromise = new Pending('core/notification:alert'); + // Here we are wrapping YUI. This allows us to start transitioning, but // wait for a good alternative without having inconsistent dialogues. Y.use('moodle-core-notification-alert', function() { @@ -134,10 +153,14 @@ function(Y, $, log) { }); alert.show(); + + pendingPromise.resolve(); }); }, confirm: function(title, question, yesLabel, noLabel, yesCallback, noCallback) { + var pendingPromise = new Pending('core/notification:confirm'); + // Here we are wrapping YUI. This allows us to start transitioning, but // wait for a good alternative without having inconsistent dialogues. Y.use('moodle-core-notification-confirm', function() { @@ -157,10 +180,14 @@ function(Y, $, log) { }); } modal.show(); + + pendingPromise.resolve(); }); }, exception: function(ex) { + var pendingPromise = new Pending('core/notification:addNotifications'); + // Fudge some parameters. if (typeof ex.stack == 'undefined') { ex.stack = ''; @@ -193,6 +220,8 @@ function(Y, $, log) { var modal = new M.core.exception(ex); modal.show(); + + pendingPromise.resolve(); }); } }; diff --git a/lib/amd/src/tag.js b/lib/amd/src/tag.js index 730e5cfb859..c2dd63ecaaf 100644 --- a/lib/amd/src/tag.js +++ b/lib/amd/src/tag.js @@ -22,8 +22,8 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.0 */ -define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/yui'], - function($, ajax, templates, notification, str, Y) { +define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/yui', 'core/pending'], + function($, ajax, templates, notification, str, Y, Pending) { return /** @alias module:core/tag */ { /** @@ -34,27 +34,31 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' initTagindexPage: function() { // Click handler for changing tag type. $('body').delegate('.tagarea[data-ta] a[data-quickload=1]', 'click', function(e) { + var pendingPromise = new Pending('core/tag:initTagindexPage'); + e.preventDefault(); - var target = $(this), - query = target[0].search.replace(/^\?/, ''), - tagarea = target.closest('.tagarea[data-ta]'), - args = query.split('&').reduce(function(s, c) { + var target = $(this); + var query = target[0].search.replace(/^\?/, ''); + var tagarea = target.closest('.tagarea[data-ta]'); + var args = query.split('&').reduce(function(s, c) { var t = c.split('='); s[t[0]] = decodeURIComponent(t[1]); return s; }, {}); - var promises = ajax.call([{ + ajax.call([{ methodname: 'core_tag_get_tagindex', args: {tagindex: args} - }], true); - - $.when.apply($, promises) - .done(function(data) { - templates.render('core_tag/index', data).done(function(html) { - tagarea.replaceWith(html); - }); - }); + }])[0] + .then(function(data) { + return templates.render('core_tag/index', data); + }) + .then(function(html, js) { + templates.replaceNode(tagarea, html, js); + return; + }) + .always(pendingPromise.resolve) + .catch(notification.exception); }); }, @@ -64,17 +68,29 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' * @method initManagePage */ initManagePage: function() { - // Set cell 'time modified' to 'now' when any of the element is updated in this row. $('body').on('updated', '[data-inplaceeditable]', function(e) { - str.get_string('selecttag', 'core_tag', e.ajaxreturn.value) - .then(function(s) { - return $('label[for="tagselect' + e.ajaxreturn.itemid + '"]').html(s); - }) - .fail(notification.exception); - str.get_string('now').done(function(s) { - $(e.target).closest('tr').find('td.col-timemodified').html(s); - }); + var pendingPromise = new Pending('core/tag:initManagePage'); + + str.get_strings([ + { + key: 'selecttag', + component: 'core_tag', + }, + { + key: 'now', + component: 'core', + }, + ]) + .then(function(result) { + $('label[for="tagselect' + e.ajaxreturn.itemid + '"]').html(result[0]); + $(e.target).closest('tr').find('td.col-timemodified').html(result[1]); + + return; + }) + .always(pendingPromise.resolve) + .catch(notification.exception); + if (e.ajaxreturn.itemtype === 'tagflag') { var row = $(e.target).closest('tr'); if (e.ajaxreturn.value === '0') { @@ -87,67 +103,84 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' // Confirmation for single tag delete link. $('.tag-management-table').delegate('a.tagdelete', 'click', function(e) { + var pendingPromise = new Pending('core/tag:tagdelete'); + e.preventDefault(); var href = $(this).attr('href'); str.get_strings([ - {key: 'delete'}, - {key: 'confirmdeletetag', component: 'tag'}, - {key: 'yes'}, - {key: 'no'}, - ]).done(function(s) { - notification.confirm(s[0], s[1], s[2], s[3], function() { - window.location.href = href; - }); - } - ); + {key: 'delete', component: 'core'}, + {key: 'confirmdeletetag', component: 'tag'}, + {key: 'yes', component: 'core'}, + {key: 'no', component: 'core'}, + ]) + .then(function(s) { + return notification.confirm(s[0], s[1], s[2], s[3], function() { + window.location.href = href; + }); + }) + .always(pendingPromise.resolve) + .catch(notification.exception); }); // Confirmation for bulk tag delete button. $("#tag-management-delete").click(function(e) { - var form = $(this).closest('form').get(0), - cnt = $(form).find("input[type=checkbox]:checked").length; + var form = $(this).closest('form').get(0); + + var cnt = $(form).find("input[type=checkbox]:checked").length; if (!cnt) { return; } + + var pendingPromise = new Pending('core/tag:tag-management-delete'); var tempElement = $("").attr('name', this.name); e.preventDefault(); str.get_strings([ - {key: 'delete'}, - {key: 'confirmdeletetags', component: 'tag'}, - {key: 'yes'}, - {key: 'no'}, - ]).done(function(s) { - notification.confirm(s[0], s[1], s[2], s[3], function() { - tempElement.appendTo(form); - form.submit(); - }); - } - ); + {key: 'delete', component: 'core'}, + {key: 'confirmdeletetags', component: 'tag'}, + {key: 'yes', component: 'core'}, + {key: 'no', component: 'core'}, + ]) + .then(function(s) { + return notification.confirm(s[0], s[1], s[2], s[3], function() { + tempElement.appendTo(form); + form.submit(); + }); + }) + .always(pendingPromise.resolve) + .catch(notification.exception); }); // Confirmation for bulk tag combine button. $("#tag-management-combine").click(function(e) { + var pendingPromise = new Pending('core/tag:tag-management-combine'); + e.preventDefault(); - var form = $(this).closest('form').get(0), - tags = $(form).find("input[type=checkbox]:checked"); + var form = $(this).closest('form').get(0); + var tags = $(form).find("input[type=checkbox]:checked"); + if (tags.length <= 1) { str.get_strings([ {key: 'combineselected', component: 'tag'}, {key: 'selectmultipletags', component: 'tag'}, {key: 'ok'}, - ]).done(function(s) { - notification.alert(s[0], s[1], s[2]); - } - ); + ]) + .then(function(s) { + return notification.alert(s[0], s[1], s[2]); + }) + .always(pendingPromise.resolve) + .catch(notification.exception); + return; } + var tempElement = $("").attr('name', this.name); str.get_strings([ {key: 'combineselected', component: 'tag'}, {key: 'selectmaintag', component: 'tag'}, {key: 'continue'}, {key: 'cancel'}, - ]).done(function(s) { + ]) + .then(function(s) { var el = $('
' + '
' + '
' + @@ -191,7 +224,11 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' return false; }); }); - }); + + return; + }) + .always(pendingPromise.resolve) + .catch(notification.exception); }); // When user changes tag name to some name that already exists suggest to combine the tags. @@ -200,30 +237,38 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' var newvalue = e.newvalue; // The value that user tried to udpated the element to. var tagid = $(e.target).attr('data-itemid'); if (exception.errorcode === 'namesalreadybeeingused') { + var pendingPromise = new Pending('core/tag:tag-management-combine-exists'); + e.preventDefault(); // This will prevent default error dialogue. str.get_strings([ {key: 'nameuseddocombine', component: 'tag'}, {key: 'yes'}, {key: 'cancel'}, - ]).done(function(s) { - notification.confirm(e.message, s[0], s[1], s[2], function() { + ]) + .then(function(s) { + return notification.confirm(e.message, s[0], s[1], s[2], function() { window.location.href = window.location.href + "&newname=" + encodeURIComponent(newvalue) + "&tagid=" + encodeURIComponent(tagid) + '&action=renamecombine&sesskey=' + M.cfg.sesskey; }); - }); + }) + .always(pendingPromise.resolve) + .catch(notification.exception); } }); // Form for adding standard tags. $('body').on('click', 'a[data-action=addstandardtag]', function(e) { + var pendingPromise = new Pending('core/tag:addstandardtag'); e.preventDefault(); + str.get_strings([ {key: 'addotags', component: 'tag'}, {key: 'inputstandardtags', component: 'tag'}, - {key: 'continue'}, - {key: 'cancel'}, - ]).done(function(s) { + {key: 'continue', component: 'core'}, + {key: 'cancel', component: 'core'}, + ]) + .then(function(s) { var el = $('
' + '' + '' + @@ -253,8 +298,10 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' $('#addtags_form #addtags_cancel').on('click', function() { panel.destroy(); }); + pendingPromise.resolve(); }); - }); + }) + .catch(notification.exception); }); }, @@ -265,6 +312,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' */ initManageCollectionsPage: function() { $('body').on('updated', '[data-inplaceeditable]', function(e) { + var pendingPromise = new Pending('core/tag:initManageCollectionsPage-updated'); + var ajaxreturn = e.ajaxreturn, areaid, collid, isenabled; if (ajaxreturn.component === 'core_tag' && ajaxreturn.itemtype === 'tagareaenable') { @@ -288,78 +337,87 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str' $(".tag-collections-table ul[data-collectionid=" + collid + "] li[data-areaid=" + areaid + "]").show(); } } + + pendingPromise.resolve(); }); $('body').on('click', '.addtagcoll > a', function(e) { + var pendingPromise = new Pending('core/tag:initManageCollectionsPage-addtagcoll'); + e.preventDefault(); var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey; str.get_strings([ - {key: 'addtagcoll', component: 'tag'}, - {key: 'name'}, - {key: 'searchable', component: 'tag'}, - {key: 'create'}, - {key: 'cancel'}, - ]).done(function(s) { - var el = $('
' + - '
' + - ' ' + - ' ' + - '
' + - '
' + - ' ' + - ' ' + - '
' + - '
' + - ' ' + - ' ' + - '
' + - '
'); - el.find('label[for="addtagcoll_name"]').html(s[1]); - el.find('label[for="addtagcoll_searchable"]').html(s[2]); - el.find('#addtagcoll_submit').attr('value', s[3]); - el.find('#addtagcoll_cancel').attr('value', s[4]); - // TODO: MDL-57778 Convert to core/modal. - Y.use('moodle-core-notification-dialogue', function() { - var panel = new M.core.dialogue({ - draggable: true, - modal: true, - closeButton: true, - headerContent: s[0], - bodyContent: el.html() - }); - panel.show(); - $('#addtagcoll_form #addtagcoll_name').focus(); - $('#addtagcoll_form #addtagcoll_cancel').on('click', function() { - panel.destroy(); - }); - $('#addtagcoll_form').on('submit', function() { - var name = $('#addtagcoll_form #addtagcoll_name').val(); - var searchable = $('#addtagcoll_form #addtagcoll_searchable').prop('checked') ? 1 : 0; - if (String(name).length > 0) { - window.location.href = href + "&name=" + encodeURIComponent(name) + "&searchable=" + searchable; - } - return false; - }); + {key: 'addtagcoll', component: 'tag'}, + {key: 'name'}, + {key: 'searchable', component: 'tag'}, + {key: 'create'}, + {key: 'cancel'}, + ]) + .then(function(s) { + var el = $('
' + + '
' + + ' ' + + ' ' + + '
' + + '
' + + ' ' + + ' ' + + '
' + + '
' + + ' ' + + ' ' + + '
' + + '
'); + el.find('label[for="addtagcoll_name"]').html(s[1]); + el.find('label[for="addtagcoll_searchable"]').html(s[2]); + el.find('#addtagcoll_submit').attr('value', s[3]); + el.find('#addtagcoll_cancel').attr('value', s[4]); + // TODO: MDL-57778 Convert to core/modal. + Y.use('moodle-core-notification-dialogue', function() { + var panel = new M.core.dialogue({ + draggable: true, + modal: true, + closeButton: true, + headerContent: s[0], + bodyContent: el.html() }); - } - ); - + panel.show(); + $('#addtagcoll_form #addtagcoll_name').focus(); + $('#addtagcoll_form #addtagcoll_cancel').on('click', function() { + panel.destroy(); + }); + $('#addtagcoll_form').on('submit', function() { + var name = $('#addtagcoll_form #addtagcoll_name').val(); + var searchable = $('#addtagcoll_form #addtagcoll_searchable').prop('checked') ? 1 : 0; + if (String(name).length > 0) { + window.location.href = href + "&name=" + encodeURIComponent(name) + "&searchable=" + searchable; + } + return false; + }); + pendingPromise.resolve(); + }); + }) + .catch(notification.exception); }); $('body').on('click', '.tag-collections-table .action_delete', function(e) { + var pendingPromise = new Pending('core/tag:initManageCollectionsPage-action_delete'); + e.preventDefault(); var href = $(this).attr('data-url') + '&sesskey=' + M.cfg.sesskey; str.get_strings([ - {key: 'delete'}, - {key: 'suredeletecoll', component: 'tag', param: $(this).attr('data-collname')}, - {key: 'yes'}, - {key: 'no'}, - ]).done(function(s) { - notification.confirm(s[0], s[1], s[2], s[3], function() { - window.location.href = href; - }); - } - ); + {key: 'delete'}, + {key: 'suredeletecoll', component: 'tag', param: $(this).attr('data-collname')}, + {key: 'yes'}, + {key: 'no'}, + ]) + .then(function(s) { + return notification.confirm(s[0], s[1], s[2], s[3], function() { + window.location.href = href; + }); + }) + .always(pendingPromise.resolve) + .catch(notification.exception); }); } };