From 34845eaad20d3dda80c54356fe201e75a1017efa Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Tue, 11 Oct 2022 09:49:31 +0800 Subject: [PATCH] MDL-75936 core_message: Drawer must be ready before firing drawer events This commit addresses a race condition when showing the message drawer and opening the settings page from the Message preferences page. In that situation, the message/edit.php page calls the message_drawer_helper.showSettings function, which publishes a request to show the drawer. In some conditions (notably faster machines, or after MDL-66107) this event is fired before the message_drawer.init has listened to it. The solution here is to delay firing of the event until the drawer announces itself as ready. This ensures that the event is subscribed to before it is fired. Change-Id: Id90df6b90f8803e25df0be6260a435c09031cf45 --- message/amd/build/message_drawer.min.js | 2 +- message/amd/build/message_drawer.min.js.map | 2 +- .../amd/build/message_drawer_events.min.js | 2 +- .../build/message_drawer_events.min.js.map | 2 +- .../amd/build/message_drawer_helper.min.js | 2 +- .../build/message_drawer_helper.min.js.map | 2 +- message/amd/src/message_drawer.js | 5 ++ message/amd/src/message_drawer_events.js | 1 + message/amd/src/message_drawer_helper.js | 54 ++++++++++++++++--- 9 files changed, 60 insertions(+), 12 deletions(-) diff --git a/message/amd/build/message_drawer.min.js b/message/amd/build/message_drawer.min.js index 791bd88b270..fb313ba1879 100644 --- a/message/amd/build/message_drawer.min.js +++ b/message/amd/build/message_drawer.min.js @@ -5,6 +5,6 @@ * @copyright 2018 Ryan Wyllie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("core_message/message_drawer",["jquery","core/custom_interaction_events","core/pubsub","core_message/message_drawer_view_contact","core_message/message_drawer_view_contacts","core_message/message_drawer_view_conversation","core_message/message_drawer_view_group_info","core_message/message_drawer_view_overview","core_message/message_drawer_view_search","core_message/message_drawer_view_settings","core_message/message_drawer_router","core_message/message_drawer_routes","core_message/message_drawer_events","core/pending","core/drawer"],(function($,CustomEvents,PubSub,ViewContact,ViewContacts,ViewConversation,ViewGroupInfo,ViewOverview,ViewSearch,ViewSettings,Router,Routes,Events,Pending,Drawer){var SELECTORS_DRAWER='[data-region="right-hand-drawer"]',SELECTORS_JUMPTO='.popover-region [data-region="jumpto"]',SELECTORS_PANEL_BODY_CONTAINER='[data-region="panel-body-container"]',SELECTORS_PANEL_HEADER_CONTAINER='[data-region="panel-header-container"]',SELECTORS_VIEW_CONTACT='[data-region="view-contact"]',SELECTORS_VIEW_CONTACTS='[data-region="view-contacts"]',SELECTORS_VIEW_CONVERSATION='[data-region="view-conversation"]',SELECTORS_VIEW_GROUP_INFO='[data-region="view-group-info"]',SELECTORS_VIEW_OVERVIEW='[data-region="view-overview"]',SELECTORS_VIEW_SEARCH='[data-region="view-search"]',SELECTORS_VIEW_SETTINGS='[data-region="view-settings"]',SELECTORS_ROUTES="[data-route]",SELECTORS_ROUTES_BACK="[data-route-back]",SELECTORS_HEADER_CONTAINER='[data-region="header-container"]',SELECTORS_BODY_CONTAINER='[data-region="body-container"]',SELECTORS_FOOTER_CONTAINER='[data-region="footer-container"]',SELECTORS_CLOSE_BUTTON='[data-action="closedrawer"]',routes=[[Routes.VIEW_CONTACT,SELECTORS_VIEW_CONTACT,ViewContact.show,ViewContact.description],[Routes.VIEW_CONTACTS,SELECTORS_VIEW_CONTACTS,ViewContacts.show,ViewContacts.description],[Routes.VIEW_CONVERSATION,SELECTORS_VIEW_CONVERSATION,ViewConversation.show,ViewConversation.description],[Routes.VIEW_GROUP_INFO,SELECTORS_VIEW_GROUP_INFO,ViewGroupInfo.show,ViewGroupInfo.description],[Routes.VIEW_OVERVIEW,SELECTORS_VIEW_OVERVIEW,ViewOverview.show,ViewOverview.description],[Routes.VIEW_SEARCH,SELECTORS_VIEW_SEARCH,ViewSearch.show,ViewSearch.description],[Routes.VIEW_SETTINGS,SELECTORS_VIEW_SETTINGS,ViewSettings.show,ViewSettings.description]],createRoutes=function(namespace,root){routes.forEach((function(route){Router.add(namespace,route[0],function(namespace,root,selector){var header=root.find(SELECTORS_HEADER_CONTAINER).find(selector);header.length||(header=root.find(SELECTORS_PANEL_HEADER_CONTAINER).find(selector));var body=root.find(SELECTORS_BODY_CONTAINER).find(selector);body.length||(body=root.find(SELECTORS_PANEL_BODY_CONTAINER).find(selector));var footer=root.find(SELECTORS_FOOTER_CONTAINER).find(selector);return[namespace,header.length?header:null,body.length?body:null,footer.length?footer:null]}(namespace,root,route[1]),route[2],route[3])}))},show=function(namespace,root){root.attr("data-shown")||(Router.go(namespace,Routes.VIEW_OVERVIEW),root.attr("data-shown",!0));var drawerRoot=Drawer.getDrawerRoot(root);drawerRoot.length&&Drawer.show(drawerRoot)},hide=function(root){var drawerRoot=Drawer.getDrawerRoot(root);drawerRoot.length&&Drawer.hide(drawerRoot)},setJumpFrom=function(buttonid){$(SELECTORS_DRAWER).attr("data-origin",buttonid)},registerEventListeners=function(namespace,root,alwaysVisible){CustomEvents.define(root,[CustomEvents.events.activate]);var paramRegex=/^data-route-param-?(\d*)$/;root.on(CustomEvents.events.activate,SELECTORS_ROUTES,(function(e,data){for(var element=$(e.target).closest(SELECTORS_ROUTES),route=element.attr("data-route"),attributes=[],i=0;i1?aParts[1]:0,bIndex=bParts.length>1?bParts[1]:0;return aIndex1?aParts[1]:0,bIndex=bParts.length>1?bParts[1]:0;return aIndex.\n\n/**\n * Controls the message drawer.\n *\n * @module core_message/message_drawer\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'core/pubsub',\n 'core_message/message_drawer_view_contact',\n 'core_message/message_drawer_view_contacts',\n 'core_message/message_drawer_view_conversation',\n 'core_message/message_drawer_view_group_info',\n 'core_message/message_drawer_view_overview',\n 'core_message/message_drawer_view_search',\n 'core_message/message_drawer_view_settings',\n 'core_message/message_drawer_router',\n 'core_message/message_drawer_routes',\n 'core_message/message_drawer_events',\n 'core/pending',\n 'core/drawer',\n],\nfunction(\n $,\n CustomEvents,\n PubSub,\n ViewContact,\n ViewContacts,\n ViewConversation,\n ViewGroupInfo,\n ViewOverview,\n ViewSearch,\n ViewSettings,\n Router,\n Routes,\n Events,\n Pending,\n Drawer\n) {\n\n var SELECTORS = {\n DRAWER: '[data-region=\"right-hand-drawer\"]',\n JUMPTO: '.popover-region [data-region=\"jumpto\"]',\n PANEL_BODY_CONTAINER: '[data-region=\"panel-body-container\"]',\n PANEL_HEADER_CONTAINER: '[data-region=\"panel-header-container\"]',\n VIEW_CONTACT: '[data-region=\"view-contact\"]',\n VIEW_CONTACTS: '[data-region=\"view-contacts\"]',\n VIEW_CONVERSATION: '[data-region=\"view-conversation\"]',\n VIEW_GROUP_INFO: '[data-region=\"view-group-info\"]',\n VIEW_OVERVIEW: '[data-region=\"view-overview\"]',\n VIEW_SEARCH: '[data-region=\"view-search\"]',\n VIEW_SETTINGS: '[data-region=\"view-settings\"]',\n ROUTES: '[data-route]',\n ROUTES_BACK: '[data-route-back]',\n HEADER_CONTAINER: '[data-region=\"header-container\"]',\n BODY_CONTAINER: '[data-region=\"body-container\"]',\n FOOTER_CONTAINER: '[data-region=\"footer-container\"]',\n CLOSE_BUTTON: '[data-action=\"closedrawer\"]'\n };\n\n /**\n * Get elements for route.\n *\n * @param {String} namespace Unique identifier for the Routes\n * @param {Object} root The message drawer container.\n * @param {string} selector The route container.\n *\n * @return {array} elements Found route container objects.\n */\n var getParametersForRoute = function(namespace, root, selector) {\n\n var header = root.find(SELECTORS.HEADER_CONTAINER).find(selector);\n if (!header.length) {\n header = root.find(SELECTORS.PANEL_HEADER_CONTAINER).find(selector);\n }\n var body = root.find(SELECTORS.BODY_CONTAINER).find(selector);\n if (!body.length) {\n body = root.find(SELECTORS.PANEL_BODY_CONTAINER).find(selector);\n }\n var footer = root.find(SELECTORS.FOOTER_CONTAINER).find(selector);\n\n return [\n namespace,\n header.length ? header : null,\n body.length ? body : null,\n footer.length ? footer : null\n ];\n };\n\n var routes = [\n [Routes.VIEW_CONTACT, SELECTORS.VIEW_CONTACT, ViewContact.show, ViewContact.description],\n [Routes.VIEW_CONTACTS, SELECTORS.VIEW_CONTACTS, ViewContacts.show, ViewContacts.description],\n [Routes.VIEW_CONVERSATION, SELECTORS.VIEW_CONVERSATION, ViewConversation.show, ViewConversation.description],\n [Routes.VIEW_GROUP_INFO, SELECTORS.VIEW_GROUP_INFO, ViewGroupInfo.show, ViewGroupInfo.description],\n [Routes.VIEW_OVERVIEW, SELECTORS.VIEW_OVERVIEW, ViewOverview.show, ViewOverview.description],\n [Routes.VIEW_SEARCH, SELECTORS.VIEW_SEARCH, ViewSearch.show, ViewSearch.description],\n [Routes.VIEW_SETTINGS, SELECTORS.VIEW_SETTINGS, ViewSettings.show, ViewSettings.description]\n ];\n\n /**\n * Create routes.\n *\n * @param {String} namespace Unique identifier for the Routes\n * @param {Object} root The message drawer container.\n */\n var createRoutes = function(namespace, root) {\n routes.forEach(function(route) {\n Router.add(namespace, route[0], getParametersForRoute(namespace, root, route[1]), route[2], route[3]);\n });\n };\n\n /**\n * Show the message drawer.\n *\n * @param {string} namespace The route namespace.\n * @param {Object} root The message drawer container.\n */\n var show = function(namespace, root) {\n if (!root.attr('data-shown')) {\n Router.go(namespace, Routes.VIEW_OVERVIEW);\n root.attr('data-shown', true);\n }\n\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n Drawer.show(drawerRoot);\n }\n };\n\n /**\n * Hide the message drawer.\n *\n * @param {Object} root The message drawer container.\n */\n var hide = function(root) {\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n Drawer.hide(drawerRoot);\n }\n };\n\n /**\n * Check if the drawer is visible.\n *\n * @param {Object} root The message drawer container.\n * @return {boolean}\n */\n var isVisible = function(root) {\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n return Drawer.isVisible(drawerRoot);\n }\n return true;\n };\n\n /**\n * Set Jump from button\n *\n * @param {String} buttonid The originating button id\n */\n var setJumpFrom = function(buttonid) {\n $(SELECTORS.DRAWER).attr('data-origin', buttonid);\n };\n\n /**\n * Listen to and handle events for routing, showing and hiding the message drawer.\n *\n * @param {string} namespace The route namespace.\n * @param {Object} root The message drawer container.\n * @param {bool} alwaysVisible Is this messaging app always shown?\n */\n var registerEventListeners = function(namespace, root, alwaysVisible) {\n CustomEvents.define(root, [CustomEvents.events.activate]);\n var paramRegex = /^data-route-param-?(\\d*)$/;\n\n root.on(CustomEvents.events.activate, SELECTORS.ROUTES, function(e, data) {\n var element = $(e.target).closest(SELECTORS.ROUTES);\n var route = element.attr('data-route');\n var attributes = [];\n\n for (var i = 0; i < element[0].attributes.length; i++) {\n attributes.push(element[0].attributes[i]);\n }\n\n var paramAttributes = attributes.filter(function(attribute) {\n var name = attribute.nodeName;\n var match = paramRegex.test(name);\n return match;\n });\n paramAttributes.sort(function(a, b) {\n var aParts = paramRegex.exec(a.nodeName);\n var bParts = paramRegex.exec(b.nodeName);\n var aIndex = aParts.length > 1 ? aParts[1] : 0;\n var bIndex = bParts.length > 1 ? bParts[1] : 0;\n\n if (aIndex < bIndex) {\n return -1;\n } else if (bIndex < aIndex) {\n return 1;\n } else {\n return 0;\n }\n });\n\n var params = paramAttributes.map(function(attribute) {\n return attribute.nodeValue;\n });\n\n var routeParams = [namespace, route].concat(params);\n\n Router.go.apply(null, routeParams);\n\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ROUTES_BACK, function(e, data) {\n Router.back(namespace);\n\n data.originalEvent.preventDefault();\n });\n\n // These are theme-specific to help us fix random behat fails.\n // These events target those events defined in BS3 and BS4 onwards.\n root.on('hide.bs.collapse', '.collapse', function(e) {\n var pendingPromise = new Pending();\n $(e.target).one('hidden.bs.collapse', function() {\n pendingPromise.resolve();\n });\n });\n\n root.on('show.bs.collapse', '.collapse', function(e) {\n var pendingPromise = new Pending();\n $(e.target).one('shown.bs.collapse', function() {\n pendingPromise.resolve();\n });\n });\n\n $(SELECTORS.JUMPTO).focus(function() {\n var firstInput = root.find(SELECTORS.CLOSE_BUTTON);\n if (firstInput.length) {\n firstInput.focus();\n } else {\n $(SELECTORS.HEADER_CONTAINER).find(SELECTORS.ROUTES_BACK).focus();\n }\n });\n\n $(SELECTORS.DRAWER).focus(function() {\n var button = $(this).attr('data-origin');\n if (button) {\n $('#' + button).focus();\n }\n });\n\n if (!alwaysVisible) {\n PubSub.subscribe(Events.SHOW, function() {\n show(namespace, root);\n });\n\n PubSub.subscribe(Events.HIDE, function() {\n hide(root);\n });\n\n PubSub.subscribe(Events.TOGGLE_VISIBILITY, function(buttonid) {\n if (isVisible(root)) {\n hide(root);\n $(SELECTORS.JUMPTO).attr('tabindex', -1);\n } else {\n show(namespace, root);\n setJumpFrom(buttonid);\n $(SELECTORS.JUMPTO).attr('tabindex', 0);\n }\n });\n }\n\n PubSub.subscribe(Events.SHOW_CONVERSATION, function(args) {\n setJumpFrom(args.buttonid);\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_CONVERSATION, args.conversationid);\n });\n\n var closebutton = root.find(SELECTORS.CLOSE_BUTTON);\n closebutton.on(CustomEvents.events.activate, function(e, data) {\n data.originalEvent.preventDefault();\n\n var button = $(SELECTORS.DRAWER).attr('data-origin');\n if (button) {\n $('#' + button).focus();\n }\n PubSub.publish(Events.TOGGLE_VISIBILITY);\n });\n\n PubSub.subscribe(Events.CREATE_CONVERSATION_WITH_USER, function(args) {\n setJumpFrom(args.buttonid);\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_CONVERSATION, null, 'create', args.userid);\n });\n\n PubSub.subscribe(Events.SHOW_SETTINGS, function() {\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_SETTINGS);\n });\n\n PubSub.subscribe(Events.PREFERENCES_UPDATED, function(preferences) {\n var filteredPreferences = preferences.filter(function(preference) {\n return preference.type == 'message_entertosend';\n });\n var enterToSendPreference = filteredPreferences.length ? filteredPreferences[0] : null;\n\n if (enterToSendPreference) {\n var viewConversationFooter = root.find(SELECTORS.FOOTER_CONTAINER).find(SELECTORS.VIEW_CONVERSATION);\n viewConversationFooter.attr('data-enter-to-send', enterToSendPreference.value);\n }\n });\n };\n\n /**\n * Initialise the message drawer.\n *\n * @param {Object} root The message drawer container.\n * @param {String} uniqueId Unique identifier for the Routes\n * @param {bool} alwaysVisible Should we show the app now, or wait for the user?\n * @param {Object} route\n */\n var init = function(root, uniqueId, alwaysVisible, route) {\n root = $(root);\n createRoutes(uniqueId, root);\n registerEventListeners(uniqueId, root, alwaysVisible);\n\n if (alwaysVisible) {\n show(uniqueId, root);\n\n if (route) {\n var routeParams = route.params || [];\n routeParams = [uniqueId, route.path].concat(routeParams);\n Router.go.apply(null, routeParams);\n }\n }\n };\n\n return {\n init: init,\n };\n});\n"],"names":["define","$","CustomEvents","PubSub","ViewContact","ViewContacts","ViewConversation","ViewGroupInfo","ViewOverview","ViewSearch","ViewSettings","Router","Routes","Events","Pending","Drawer","SELECTORS","routes","VIEW_CONTACT","show","description","VIEW_CONTACTS","VIEW_CONVERSATION","VIEW_GROUP_INFO","VIEW_OVERVIEW","VIEW_SEARCH","VIEW_SETTINGS","createRoutes","namespace","root","forEach","route","add","selector","header","find","length","body","footer","getParametersForRoute","attr","go","drawerRoot","getDrawerRoot","hide","setJumpFrom","buttonid","registerEventListeners","alwaysVisible","events","activate","paramRegex","on","e","data","element","target","closest","attributes","i","push","paramAttributes","filter","attribute","name","nodeName","test","sort","a","b","aParts","exec","bParts","aIndex","bIndex","params","map","nodeValue","routeParams","concat","apply","originalEvent","preventDefault","back","pendingPromise","one","resolve","focus","firstInput","button","this","subscribe","SHOW","HIDE","TOGGLE_VISIBILITY","isVisible","SHOW_CONVERSATION","args","conversationid","publish","CREATE_CONVERSATION_WITH_USER","userid","SHOW_SETTINGS","PREFERENCES_UPDATED","preferences","filteredPreferences","preference","type","enterToSendPreference","value","init","uniqueId","path"],"mappings":";;;;;;;AAsBAA,qCACA,CACI,SACA,iCACA,cACA,2CACA,4CACA,gDACA,8CACA,4CACA,0CACA,4CACA,qCACA,qCACA,qCACA,eACA,gBAEJ,SACIC,EACAC,aACAC,OACAC,YACAC,aACAC,iBACAC,cACAC,aACAC,WACAC,aACAC,OACAC,OACAC,OACAC,QACAC,YAGIC,iBACQ,oCADRA,iBAEQ,yCAFRA,+BAGsB,uCAHtBA,iCAIwB,yCAJxBA,uBAKc,+BALdA,wBAMe,gCANfA,4BAOmB,oCAPnBA,0BAQiB,kCARjBA,wBASe,gCATfA,sBAUa,8BAVbA,wBAWe,gCAXfA,iBAYQ,eAZRA,sBAaa,oBAbbA,2BAckB,mCAdlBA,yBAegB,iCAfhBA,2BAgBkB,mCAhBlBA,uBAiBc,8BAgCdC,OAAS,CACT,CAACL,OAAOM,aAAcF,uBAAwBZ,YAAYe,KAAMf,YAAYgB,aAC5E,CAACR,OAAOS,cAAeL,wBAAyBX,aAAac,KAAMd,aAAae,aAChF,CAACR,OAAOU,kBAAmBN,4BAA6BV,iBAAiBa,KAAMb,iBAAiBc,aAChG,CAACR,OAAOW,gBAAiBP,0BAA2BT,cAAcY,KAAMZ,cAAca,aACtF,CAACR,OAAOY,cAAeR,wBAAyBR,aAAaW,KAAMX,aAAaY,aAChF,CAACR,OAAOa,YAAaT,sBAAuBP,WAAWU,KAAMV,WAAWW,aACxE,CAACR,OAAOc,cAAeV,wBAAyBN,aAAaS,KAAMT,aAAaU,cAShFO,aAAe,SAASC,UAAWC,MACnCZ,OAAOa,SAAQ,SAASC,OACpBpB,OAAOqB,IAAIJ,UAAWG,MAAM,GAtCR,SAASH,UAAWC,KAAMI,cAE9CC,OAASL,KAAKM,KAAKnB,4BAA4BmB,KAAKF,UACnDC,OAAOE,SACRF,OAASL,KAAKM,KAAKnB,kCAAkCmB,KAAKF,eAE1DI,KAAOR,KAAKM,KAAKnB,0BAA0BmB,KAAKF,UAC/CI,KAAKD,SACNC,KAAOR,KAAKM,KAAKnB,gCAAgCmB,KAAKF,eAEtDK,OAAST,KAAKM,KAAKnB,4BAA4BmB,KAAKF,gBAEjD,CACHL,UACAM,OAAOE,OAASF,OAAS,KACzBG,KAAKD,OAASC,KAAO,KACrBC,OAAOF,OAASE,OAAS,MAsBOC,CAAsBX,UAAWC,KAAME,MAAM,IAAKA,MAAM,GAAIA,MAAM,QAUtGZ,KAAO,SAASS,UAAWC,MACtBA,KAAKW,KAAK,gBACX7B,OAAO8B,GAAGb,UAAWhB,OAAOY,eAC5BK,KAAKW,KAAK,cAAc,QAGxBE,WAAa3B,OAAO4B,cAAcd,MAClCa,WAAWN,QACXrB,OAAOI,KAAKuB,aAShBE,KAAO,SAASf,UACZa,WAAa3B,OAAO4B,cAAcd,MAClCa,WAAWN,QACXrB,OAAO6B,KAAKF,aAuBhBG,YAAc,SAASC,UACvB7C,EAAEe,kBAAkBwB,KAAK,cAAeM,WAUxCC,uBAAyB,SAASnB,UAAWC,KAAMmB,eACnD9C,aAAaF,OAAO6B,KAAM,CAAC3B,aAAa+C,OAAOC,eAC3CC,WAAa,4BAEjBtB,KAAKuB,GAAGlD,aAAa+C,OAAOC,SAAUlC,kBAAkB,SAASqC,EAAGC,cAC5DC,QAAUtD,EAAEoD,EAAEG,QAAQC,QAAQzC,kBAC9Be,MAAQwB,QAAQf,KAAK,cACrBkB,WAAa,GAERC,EAAI,EAAGA,EAAIJ,QAAQ,GAAGG,WAAWtB,OAAQuB,IAC9CD,WAAWE,KAAKL,QAAQ,GAAGG,WAAWC,QAGtCE,gBAAkBH,WAAWI,QAAO,SAASC,eACzCC,KAAOD,UAAUE,gBACTd,WAAWe,KAAKF,SAGhCH,gBAAgBM,MAAK,SAASC,EAAGC,OACzBC,OAASnB,WAAWoB,KAAKH,EAAEH,UAC3BO,OAASrB,WAAWoB,KAAKF,EAAEJ,UAC3BQ,OAASH,OAAOlC,OAAS,EAAIkC,OAAO,GAAK,EACzCI,OAASF,OAAOpC,OAAS,EAAIoC,OAAO,GAAK,SAEzCC,OAASC,QACD,EACDA,OAASD,OACT,EAEA,SAIXE,OAASd,gBAAgBe,KAAI,SAASb,kBAC/BA,UAAUc,aAGjBC,YAAc,CAAClD,UAAWG,OAAOgD,OAAOJ,QAE5ChE,OAAO8B,GAAGuC,MAAM,KAAMF,aAEtBxB,KAAK2B,cAAcC,oBAGvBrD,KAAKuB,GAAGlD,aAAa+C,OAAOC,SAAUlC,uBAAuB,SAASqC,EAAGC,MACrE3C,OAAOwE,KAAKvD,WAEZ0B,KAAK2B,cAAcC,oBAKvBrD,KAAKuB,GAAG,mBAAoB,aAAa,SAASC,OAC1C+B,eAAiB,IAAItE,QACzBb,EAAEoD,EAAEG,QAAQ6B,IAAI,sBAAsB,WAClCD,eAAeE,gBAIvBzD,KAAKuB,GAAG,mBAAoB,aAAa,SAASC,OAC1C+B,eAAiB,IAAItE,QACzBb,EAAEoD,EAAEG,QAAQ6B,IAAI,qBAAqB,WACjCD,eAAeE,gBAIvBrF,EAAEe,kBAAkBuE,OAAM,eAClBC,WAAa3D,KAAKM,KAAKnB,wBACvBwE,WAAWpD,OACXoD,WAAWD,QAEXtF,EAAEe,4BAA4BmB,KAAKnB,uBAAuBuE,WAIlEtF,EAAEe,kBAAkBuE,OAAM,eAClBE,OAASxF,EAAEyF,MAAMlD,KAAK,eACtBiD,QACAxF,EAAE,IAAMwF,QAAQF,WAInBvC,gBACD7C,OAAOwF,UAAU9E,OAAO+E,MAAM,WAC1BzE,KAAKS,UAAWC,SAGpB1B,OAAOwF,UAAU9E,OAAOgF,MAAM,WAC1BjD,KAAKf,SAGT1B,OAAOwF,UAAU9E,OAAOiF,mBAAmB,SAAShD,WAnH5C,SAASjB,UACjBa,WAAa3B,OAAO4B,cAAcd,aAClCa,WAAWN,QACJrB,OAAOgF,UAAUrD,YAiHhBqD,CAAUlE,OAIVV,KAAKS,UAAWC,MAChBgB,YAAYC,UACZ7C,EAAEe,kBAAkBwB,KAAK,WAAY,KALrCI,KAAKf,MACL5B,EAAEe,kBAAkBwB,KAAK,YAAa,QASlDrC,OAAOwF,UAAU9E,OAAOmF,mBAAmB,SAASC,MAChDpD,YAAYoD,KAAKnD,UACjB3B,KAAKS,UAAWC,MAChBlB,OAAO8B,GAAGb,UAAWhB,OAAOU,kBAAmB2E,KAAKC,mBAGtCrE,KAAKM,KAAKnB,wBAChBoC,GAAGlD,aAAa+C,OAAOC,UAAU,SAASG,EAAGC,MACrDA,KAAK2B,cAAcC,qBAEfO,OAASxF,EAAEe,kBAAkBwB,KAAK,eAClCiD,QACAxF,EAAE,IAAMwF,QAAQF,QAEpBpF,OAAOgG,QAAQtF,OAAOiF,sBAG1B3F,OAAOwF,UAAU9E,OAAOuF,+BAA+B,SAASH,MAC5DpD,YAAYoD,KAAKnD,UACjB3B,KAAKS,UAAWC,MAChBlB,OAAO8B,GAAGb,UAAWhB,OAAOU,kBAAmB,KAAM,SAAU2E,KAAKI,WAGxElG,OAAOwF,UAAU9E,OAAOyF,eAAe,WACnCnF,KAAKS,UAAWC,MAChBlB,OAAO8B,GAAGb,UAAWhB,OAAOc,kBAGhCvB,OAAOwF,UAAU9E,OAAO0F,qBAAqB,SAASC,iBAC9CC,oBAAsBD,YAAY1C,QAAO,SAAS4C,kBACxB,uBAAnBA,WAAWC,QAElBC,sBAAwBH,oBAAoBrE,OAASqE,oBAAoB,GAAK,KAE9EG,uBAC6B/E,KAAKM,KAAKnB,4BAA4BmB,KAAKnB,6BACjDwB,KAAK,qBAAsBoE,sBAAsBC,iBA6B7E,CACHC,KAjBO,SAASjF,KAAMkF,SAAU/D,cAAejB,UAC/CF,KAAO5B,EAAE4B,MACTF,aAAaoF,SAAUlF,MACvBkB,uBAAuBgE,SAAUlF,KAAMmB,eAEnCA,gBACA7B,KAAK4F,SAAUlF,MAEXE,OAAO,KACH+C,YAAc/C,MAAM4C,QAAU,GAClCG,YAAc,CAACiC,SAAUhF,MAAMiF,MAAMjC,OAAOD,aAC5CnE,OAAO8B,GAAGuC,MAAM,KAAMF"} \ No newline at end of file +{"version":3,"file":"message_drawer.min.js","sources":["../src/message_drawer.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Controls the message drawer.\n *\n * @module core_message/message_drawer\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'core/pubsub',\n 'core_message/message_drawer_view_contact',\n 'core_message/message_drawer_view_contacts',\n 'core_message/message_drawer_view_conversation',\n 'core_message/message_drawer_view_group_info',\n 'core_message/message_drawer_view_overview',\n 'core_message/message_drawer_view_search',\n 'core_message/message_drawer_view_settings',\n 'core_message/message_drawer_router',\n 'core_message/message_drawer_routes',\n 'core_message/message_drawer_events',\n 'core_message/message_drawer_helper',\n 'core/pending',\n 'core/drawer',\n],\nfunction(\n $,\n CustomEvents,\n PubSub,\n ViewContact,\n ViewContacts,\n ViewConversation,\n ViewGroupInfo,\n ViewOverview,\n ViewSearch,\n ViewSettings,\n Router,\n Routes,\n Events,\n Helper,\n Pending,\n Drawer\n) {\n\n var SELECTORS = {\n DRAWER: '[data-region=\"right-hand-drawer\"]',\n JUMPTO: '.popover-region [data-region=\"jumpto\"]',\n PANEL_BODY_CONTAINER: '[data-region=\"panel-body-container\"]',\n PANEL_HEADER_CONTAINER: '[data-region=\"panel-header-container\"]',\n VIEW_CONTACT: '[data-region=\"view-contact\"]',\n VIEW_CONTACTS: '[data-region=\"view-contacts\"]',\n VIEW_CONVERSATION: '[data-region=\"view-conversation\"]',\n VIEW_GROUP_INFO: '[data-region=\"view-group-info\"]',\n VIEW_OVERVIEW: '[data-region=\"view-overview\"]',\n VIEW_SEARCH: '[data-region=\"view-search\"]',\n VIEW_SETTINGS: '[data-region=\"view-settings\"]',\n ROUTES: '[data-route]',\n ROUTES_BACK: '[data-route-back]',\n HEADER_CONTAINER: '[data-region=\"header-container\"]',\n BODY_CONTAINER: '[data-region=\"body-container\"]',\n FOOTER_CONTAINER: '[data-region=\"footer-container\"]',\n CLOSE_BUTTON: '[data-action=\"closedrawer\"]'\n };\n\n /**\n * Get elements for route.\n *\n * @param {String} namespace Unique identifier for the Routes\n * @param {Object} root The message drawer container.\n * @param {string} selector The route container.\n *\n * @return {array} elements Found route container objects.\n */\n var getParametersForRoute = function(namespace, root, selector) {\n\n var header = root.find(SELECTORS.HEADER_CONTAINER).find(selector);\n if (!header.length) {\n header = root.find(SELECTORS.PANEL_HEADER_CONTAINER).find(selector);\n }\n var body = root.find(SELECTORS.BODY_CONTAINER).find(selector);\n if (!body.length) {\n body = root.find(SELECTORS.PANEL_BODY_CONTAINER).find(selector);\n }\n var footer = root.find(SELECTORS.FOOTER_CONTAINER).find(selector);\n\n return [\n namespace,\n header.length ? header : null,\n body.length ? body : null,\n footer.length ? footer : null\n ];\n };\n\n var routes = [\n [Routes.VIEW_CONTACT, SELECTORS.VIEW_CONTACT, ViewContact.show, ViewContact.description],\n [Routes.VIEW_CONTACTS, SELECTORS.VIEW_CONTACTS, ViewContacts.show, ViewContacts.description],\n [Routes.VIEW_CONVERSATION, SELECTORS.VIEW_CONVERSATION, ViewConversation.show, ViewConversation.description],\n [Routes.VIEW_GROUP_INFO, SELECTORS.VIEW_GROUP_INFO, ViewGroupInfo.show, ViewGroupInfo.description],\n [Routes.VIEW_OVERVIEW, SELECTORS.VIEW_OVERVIEW, ViewOverview.show, ViewOverview.description],\n [Routes.VIEW_SEARCH, SELECTORS.VIEW_SEARCH, ViewSearch.show, ViewSearch.description],\n [Routes.VIEW_SETTINGS, SELECTORS.VIEW_SETTINGS, ViewSettings.show, ViewSettings.description]\n ];\n\n /**\n * Create routes.\n *\n * @param {String} namespace Unique identifier for the Routes\n * @param {Object} root The message drawer container.\n */\n var createRoutes = function(namespace, root) {\n routes.forEach(function(route) {\n Router.add(namespace, route[0], getParametersForRoute(namespace, root, route[1]), route[2], route[3]);\n });\n };\n\n /**\n * Show the message drawer.\n *\n * @param {string} namespace The route namespace.\n * @param {Object} root The message drawer container.\n */\n var show = function(namespace, root) {\n if (!root.attr('data-shown')) {\n Router.go(namespace, Routes.VIEW_OVERVIEW);\n root.attr('data-shown', true);\n }\n\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n Drawer.show(drawerRoot);\n }\n };\n\n /**\n * Hide the message drawer.\n *\n * @param {Object} root The message drawer container.\n */\n var hide = function(root) {\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n Drawer.hide(drawerRoot);\n }\n };\n\n /**\n * Check if the drawer is visible.\n *\n * @param {Object} root The message drawer container.\n * @return {boolean}\n */\n var isVisible = function(root) {\n var drawerRoot = Drawer.getDrawerRoot(root);\n if (drawerRoot.length) {\n return Drawer.isVisible(drawerRoot);\n }\n return true;\n };\n\n /**\n * Set Jump from button\n *\n * @param {String} buttonid The originating button id\n */\n var setJumpFrom = function(buttonid) {\n $(SELECTORS.DRAWER).attr('data-origin', buttonid);\n };\n\n /**\n * Listen to and handle events for routing, showing and hiding the message drawer.\n *\n * @param {string} namespace The route namespace.\n * @param {Object} root The message drawer container.\n * @param {bool} alwaysVisible Is this messaging app always shown?\n */\n var registerEventListeners = function(namespace, root, alwaysVisible) {\n CustomEvents.define(root, [CustomEvents.events.activate]);\n var paramRegex = /^data-route-param-?(\\d*)$/;\n\n root.on(CustomEvents.events.activate, SELECTORS.ROUTES, function(e, data) {\n var element = $(e.target).closest(SELECTORS.ROUTES);\n var route = element.attr('data-route');\n var attributes = [];\n\n for (var i = 0; i < element[0].attributes.length; i++) {\n attributes.push(element[0].attributes[i]);\n }\n\n var paramAttributes = attributes.filter(function(attribute) {\n var name = attribute.nodeName;\n var match = paramRegex.test(name);\n return match;\n });\n paramAttributes.sort(function(a, b) {\n var aParts = paramRegex.exec(a.nodeName);\n var bParts = paramRegex.exec(b.nodeName);\n var aIndex = aParts.length > 1 ? aParts[1] : 0;\n var bIndex = bParts.length > 1 ? bParts[1] : 0;\n\n if (aIndex < bIndex) {\n return -1;\n } else if (bIndex < aIndex) {\n return 1;\n } else {\n return 0;\n }\n });\n\n var params = paramAttributes.map(function(attribute) {\n return attribute.nodeValue;\n });\n\n var routeParams = [namespace, route].concat(params);\n\n Router.go.apply(null, routeParams);\n\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ROUTES_BACK, function(e, data) {\n Router.back(namespace);\n\n data.originalEvent.preventDefault();\n });\n\n // These are theme-specific to help us fix random behat fails.\n // These events target those events defined in BS3 and BS4 onwards.\n root.on('hide.bs.collapse', '.collapse', function(e) {\n var pendingPromise = new Pending();\n $(e.target).one('hidden.bs.collapse', function() {\n pendingPromise.resolve();\n });\n });\n\n root.on('show.bs.collapse', '.collapse', function(e) {\n var pendingPromise = new Pending();\n $(e.target).one('shown.bs.collapse', function() {\n pendingPromise.resolve();\n });\n });\n\n $(SELECTORS.JUMPTO).focus(function() {\n var firstInput = root.find(SELECTORS.CLOSE_BUTTON);\n if (firstInput.length) {\n firstInput.focus();\n } else {\n $(SELECTORS.HEADER_CONTAINER).find(SELECTORS.ROUTES_BACK).focus();\n }\n });\n\n $(SELECTORS.DRAWER).focus(function() {\n var button = $(this).attr('data-origin');\n if (button) {\n $('#' + button).focus();\n }\n });\n\n if (!alwaysVisible) {\n PubSub.subscribe(Events.SHOW, function() {\n show(namespace, root);\n });\n\n PubSub.subscribe(Events.HIDE, function() {\n hide(root);\n });\n\n PubSub.subscribe(Events.TOGGLE_VISIBILITY, function(buttonid) {\n if (isVisible(root)) {\n hide(root);\n $(SELECTORS.JUMPTO).attr('tabindex', -1);\n } else {\n show(namespace, root);\n setJumpFrom(buttonid);\n $(SELECTORS.JUMPTO).attr('tabindex', 0);\n }\n });\n }\n\n PubSub.subscribe(Events.SHOW_CONVERSATION, function(args) {\n setJumpFrom(args.buttonid);\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_CONVERSATION, args.conversationid);\n });\n\n var closebutton = root.find(SELECTORS.CLOSE_BUTTON);\n closebutton.on(CustomEvents.events.activate, function(e, data) {\n data.originalEvent.preventDefault();\n\n var button = $(SELECTORS.DRAWER).attr('data-origin');\n if (button) {\n $('#' + button).focus();\n }\n PubSub.publish(Events.TOGGLE_VISIBILITY);\n });\n\n PubSub.subscribe(Events.CREATE_CONVERSATION_WITH_USER, function(args) {\n setJumpFrom(args.buttonid);\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_CONVERSATION, null, 'create', args.userid);\n });\n\n PubSub.subscribe(Events.SHOW_SETTINGS, function() {\n show(namespace, root);\n Router.go(namespace, Routes.VIEW_SETTINGS);\n });\n\n PubSub.subscribe(Events.PREFERENCES_UPDATED, function(preferences) {\n var filteredPreferences = preferences.filter(function(preference) {\n return preference.type == 'message_entertosend';\n });\n var enterToSendPreference = filteredPreferences.length ? filteredPreferences[0] : null;\n\n if (enterToSendPreference) {\n var viewConversationFooter = root.find(SELECTORS.FOOTER_CONTAINER).find(SELECTORS.VIEW_CONVERSATION);\n viewConversationFooter.attr('data-enter-to-send', enterToSendPreference.value);\n }\n });\n };\n\n /**\n * Initialise the message drawer.\n *\n * @param {Object} root The message drawer container.\n * @param {String} uniqueId Unique identifier for the Routes\n * @param {bool} alwaysVisible Should we show the app now, or wait for the user?\n * @param {Object} route\n */\n var init = function(root, uniqueId, alwaysVisible, route) {\n root = $(root);\n createRoutes(uniqueId, root);\n registerEventListeners(uniqueId, root, alwaysVisible);\n\n if (alwaysVisible) {\n show(uniqueId, root);\n\n if (route) {\n var routeParams = route.params || [];\n routeParams = [uniqueId, route.path].concat(routeParams);\n Router.go.apply(null, routeParams);\n }\n }\n\n // Mark the drawer as ready.\n Helper.markDrawerReady();\n };\n\n return {\n init: init,\n };\n});\n"],"names":["define","$","CustomEvents","PubSub","ViewContact","ViewContacts","ViewConversation","ViewGroupInfo","ViewOverview","ViewSearch","ViewSettings","Router","Routes","Events","Helper","Pending","Drawer","SELECTORS","routes","VIEW_CONTACT","show","description","VIEW_CONTACTS","VIEW_CONVERSATION","VIEW_GROUP_INFO","VIEW_OVERVIEW","VIEW_SEARCH","VIEW_SETTINGS","createRoutes","namespace","root","forEach","route","add","selector","header","find","length","body","footer","getParametersForRoute","attr","go","drawerRoot","getDrawerRoot","hide","setJumpFrom","buttonid","registerEventListeners","alwaysVisible","events","activate","paramRegex","on","e","data","element","target","closest","attributes","i","push","paramAttributes","filter","attribute","name","nodeName","test","sort","a","b","aParts","exec","bParts","aIndex","bIndex","params","map","nodeValue","routeParams","concat","apply","originalEvent","preventDefault","back","pendingPromise","one","resolve","focus","firstInput","button","this","subscribe","SHOW","HIDE","TOGGLE_VISIBILITY","isVisible","SHOW_CONVERSATION","args","conversationid","publish","CREATE_CONVERSATION_WITH_USER","userid","SHOW_SETTINGS","PREFERENCES_UPDATED","preferences","filteredPreferences","preference","type","enterToSendPreference","value","init","uniqueId","path","markDrawerReady"],"mappings":"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"} \ No newline at end of file diff --git a/message/amd/build/message_drawer_events.min.js b/message/amd/build/message_drawer_events.min.js index a44d666e694..bb039b6aaf0 100644 --- a/message/amd/build/message_drawer_events.min.js +++ b/message/amd/build/message_drawer_events.min.js @@ -5,6 +5,6 @@ * @copyright 2018 Ryan Wyllie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("core_message/message_drawer_events",[],(function(){return{CREATE_CONVERSATION_WITH_USER:"message-drawer-create-conversation-with-user",CONTACT_BLOCKED:"message-drawer-contact-blocked",CONTACT_UNBLOCKED:"message-drawer-contact-unblocked",CONTACT_ADDED:"message-drawer-contact-added",CONTACT_REMOVED:"message-drawer-contact-removed",CONTACT_REQUEST_ACCEPTED:"message-drawer-contact-request-accepted",CONTACT_REQUEST_DECLINED:"message-drawer-contact-request-declined",CONVERSATION_CREATED:"message-drawer-conversation-created",CONVERSATION_NEW_LAST_MESSAGE:"message-drawer-conversation-new-last-message",CONVERSATION_DELETED:"message-drawer-conversation-deleted",CONVERSATION_READ:"message-drawer-conversation-read",CONVERSATION_SET_FAVOURITE:"message-drawer-conversation-set-favourite",CONVERSATION_SET_MUTED:"message-drawer-conversation-set-muted",CONVERSATION_UNSET_FAVOURITE:"message-drawer-conversation-unset-favourite",CONVERSATION_UNSET_MUTED:"message-drawer-conversation-unset-muted",PREFERENCES_UPDATED:"message-drawer-preferences-updated",ROUTE_CHANGED:"message-drawer-route-change",SHOW:"message-drawer-show",HIDE:"message-drawer-hide",TOGGLE_VISIBILITY:"message-drawer-toggle",SHOW_CONVERSATION:"message-drawer-show-conversation",SHOW_SETTINGS:"message-drawer-show-settings"}})); +define("core_message/message_drawer_events",[],(function(){return{CREATE_CONVERSATION_WITH_USER:"message-drawer-create-conversation-with-user",CONTACT_BLOCKED:"message-drawer-contact-blocked",CONTACT_UNBLOCKED:"message-drawer-contact-unblocked",CONTACT_ADDED:"message-drawer-contact-added",CONTACT_REMOVED:"message-drawer-contact-removed",CONTACT_REQUEST_ACCEPTED:"message-drawer-contact-request-accepted",CONTACT_REQUEST_DECLINED:"message-drawer-contact-request-declined",CONVERSATION_CREATED:"message-drawer-conversation-created",CONVERSATION_NEW_LAST_MESSAGE:"message-drawer-conversation-new-last-message",CONVERSATION_DELETED:"message-drawer-conversation-deleted",CONVERSATION_READ:"message-drawer-conversation-read",CONVERSATION_SET_FAVOURITE:"message-drawer-conversation-set-favourite",CONVERSATION_SET_MUTED:"message-drawer-conversation-set-muted",CONVERSATION_UNSET_FAVOURITE:"message-drawer-conversation-unset-favourite",CONVERSATION_UNSET_MUTED:"message-drawer-conversation-unset-muted",PREFERENCES_UPDATED:"message-drawer-preferences-updated",READY:"message-drawer-ready",ROUTE_CHANGED:"message-drawer-route-change",SHOW:"message-drawer-show",HIDE:"message-drawer-hide",TOGGLE_VISIBILITY:"message-drawer-toggle",SHOW_CONVERSATION:"message-drawer-show-conversation",SHOW_SETTINGS:"message-drawer-show-settings"}})); //# sourceMappingURL=message_drawer_events.min.js.map \ No newline at end of file diff --git a/message/amd/build/message_drawer_events.min.js.map b/message/amd/build/message_drawer_events.min.js.map index e79f0b8e7a5..de44ee61bc3 100644 --- a/message/amd/build/message_drawer_events.min.js.map +++ b/message/amd/build/message_drawer_events.min.js.map @@ -1 +1 @@ -{"version":3,"file":"message_drawer_events.min.js","sources":["../src/message_drawer_events.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Events for the message drawer.\n *\n * @module core_message/message_drawer_events\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n CREATE_CONVERSATION_WITH_USER: 'message-drawer-create-conversation-with-user',\n CONTACT_BLOCKED: 'message-drawer-contact-blocked',\n CONTACT_UNBLOCKED: 'message-drawer-contact-unblocked',\n CONTACT_ADDED: 'message-drawer-contact-added',\n CONTACT_REMOVED: 'message-drawer-contact-removed',\n CONTACT_REQUEST_ACCEPTED: 'message-drawer-contact-request-accepted',\n CONTACT_REQUEST_DECLINED: 'message-drawer-contact-request-declined',\n CONVERSATION_CREATED: 'message-drawer-conversation-created',\n CONVERSATION_NEW_LAST_MESSAGE: 'message-drawer-conversation-new-last-message',\n CONVERSATION_DELETED: 'message-drawer-conversation-deleted',\n CONVERSATION_READ: 'message-drawer-conversation-read',\n CONVERSATION_SET_FAVOURITE: 'message-drawer-conversation-set-favourite',\n CONVERSATION_SET_MUTED: 'message-drawer-conversation-set-muted',\n CONVERSATION_UNSET_FAVOURITE: 'message-drawer-conversation-unset-favourite',\n CONVERSATION_UNSET_MUTED: 'message-drawer-conversation-unset-muted',\n PREFERENCES_UPDATED: 'message-drawer-preferences-updated',\n ROUTE_CHANGED: 'message-drawer-route-change',\n SHOW: 'message-drawer-show',\n HIDE: 'message-drawer-hide',\n TOGGLE_VISIBILITY: 'message-drawer-toggle',\n SHOW_CONVERSATION: 'message-drawer-show-conversation',\n SHOW_SETTINGS: 'message-drawer-show-settings',\n };\n});\n"],"names":["define","CREATE_CONVERSATION_WITH_USER","CONTACT_BLOCKED","CONTACT_UNBLOCKED","CONTACT_ADDED","CONTACT_REMOVED","CONTACT_REQUEST_ACCEPTED","CONTACT_REQUEST_DECLINED","CONVERSATION_CREATED","CONVERSATION_NEW_LAST_MESSAGE","CONVERSATION_DELETED","CONVERSATION_READ","CONVERSATION_SET_FAVOURITE","CONVERSATION_SET_MUTED","CONVERSATION_UNSET_FAVOURITE","CONVERSATION_UNSET_MUTED","PREFERENCES_UPDATED","ROUTE_CHANGED","SHOW","HIDE","TOGGLE_VISIBILITY","SHOW_CONVERSATION","SHOW_SETTINGS"],"mappings":";;;;;;;AAsBAA,4CAAO,IAAI,iBACA,CACHC,8BAA+B,+CAC/BC,gBAAiB,iCACjBC,kBAAmB,mCACnBC,cAAe,+BACfC,gBAAiB,iCACjBC,yBAA0B,0CAC1BC,yBAA0B,0CAC1BC,qBAAsB,sCACtBC,8BAA+B,+CAC/BC,qBAAsB,sCACtBC,kBAAmB,mCACnBC,2BAA4B,4CAC5BC,uBAAwB,wCACxBC,6BAA8B,8CAC9BC,yBAA0B,0CAC1BC,oBAAqB,qCACrBC,cAAe,8BACfC,KAAM,sBACNC,KAAM,sBACNC,kBAAmB,wBACnBC,kBAAmB,mCACnBC,cAAe"} \ No newline at end of file +{"version":3,"file":"message_drawer_events.min.js","sources":["../src/message_drawer_events.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Events for the message drawer.\n *\n * @module core_message/message_drawer_events\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n CREATE_CONVERSATION_WITH_USER: 'message-drawer-create-conversation-with-user',\n CONTACT_BLOCKED: 'message-drawer-contact-blocked',\n CONTACT_UNBLOCKED: 'message-drawer-contact-unblocked',\n CONTACT_ADDED: 'message-drawer-contact-added',\n CONTACT_REMOVED: 'message-drawer-contact-removed',\n CONTACT_REQUEST_ACCEPTED: 'message-drawer-contact-request-accepted',\n CONTACT_REQUEST_DECLINED: 'message-drawer-contact-request-declined',\n CONVERSATION_CREATED: 'message-drawer-conversation-created',\n CONVERSATION_NEW_LAST_MESSAGE: 'message-drawer-conversation-new-last-message',\n CONVERSATION_DELETED: 'message-drawer-conversation-deleted',\n CONVERSATION_READ: 'message-drawer-conversation-read',\n CONVERSATION_SET_FAVOURITE: 'message-drawer-conversation-set-favourite',\n CONVERSATION_SET_MUTED: 'message-drawer-conversation-set-muted',\n CONVERSATION_UNSET_FAVOURITE: 'message-drawer-conversation-unset-favourite',\n CONVERSATION_UNSET_MUTED: 'message-drawer-conversation-unset-muted',\n PREFERENCES_UPDATED: 'message-drawer-preferences-updated',\n READY: 'message-drawer-ready',\n ROUTE_CHANGED: 'message-drawer-route-change',\n SHOW: 'message-drawer-show',\n HIDE: 'message-drawer-hide',\n TOGGLE_VISIBILITY: 'message-drawer-toggle',\n SHOW_CONVERSATION: 'message-drawer-show-conversation',\n SHOW_SETTINGS: 'message-drawer-show-settings',\n };\n});\n"],"names":["define","CREATE_CONVERSATION_WITH_USER","CONTACT_BLOCKED","CONTACT_UNBLOCKED","CONTACT_ADDED","CONTACT_REMOVED","CONTACT_REQUEST_ACCEPTED","CONTACT_REQUEST_DECLINED","CONVERSATION_CREATED","CONVERSATION_NEW_LAST_MESSAGE","CONVERSATION_DELETED","CONVERSATION_READ","CONVERSATION_SET_FAVOURITE","CONVERSATION_SET_MUTED","CONVERSATION_UNSET_FAVOURITE","CONVERSATION_UNSET_MUTED","PREFERENCES_UPDATED","READY","ROUTE_CHANGED","SHOW","HIDE","TOGGLE_VISIBILITY","SHOW_CONVERSATION","SHOW_SETTINGS"],"mappings":";;;;;;;AAsBAA,4CAAO,IAAI,iBACA,CACHC,8BAA+B,+CAC/BC,gBAAiB,iCACjBC,kBAAmB,mCACnBC,cAAe,+BACfC,gBAAiB,iCACjBC,yBAA0B,0CAC1BC,yBAA0B,0CAC1BC,qBAAsB,sCACtBC,8BAA+B,+CAC/BC,qBAAsB,sCACtBC,kBAAmB,mCACnBC,2BAA4B,4CAC5BC,uBAAwB,wCACxBC,6BAA8B,8CAC9BC,yBAA0B,0CAC1BC,oBAAqB,qCACrBC,MAAO,uBACPC,cAAe,8BACfC,KAAM,sBACNC,KAAM,sBACNC,kBAAmB,wBACnBC,kBAAmB,mCACnBC,cAAe"} \ No newline at end of file diff --git a/message/amd/build/message_drawer_helper.min.js b/message/amd/build/message_drawer_helper.min.js index 33720f65723..57b8163bf98 100644 --- a/message/amd/build/message_drawer_helper.min.js +++ b/message/amd/build/message_drawer_helper.min.js @@ -5,6 +5,6 @@ * @copyright 2018 Ryan Wyllie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("core_message/message_drawer_helper",["core/pubsub","core_message/message_drawer_events"],(function(PubSub,MessageDrawerEvents){return{createConversationWithUser:function(args){PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER,args)},hide:function(){PubSub.publish(MessageDrawerEvents.HIDE)},show:function(){PubSub.publish(MessageDrawerEvents.SHOW)},showConversation:function(args){PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION,args)},showSettings:function(){PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS)}}})); +define("core_message/message_drawer_helper",["core/pubsub","core_message/message_drawer_events"],(function(PubSub,MessageDrawerEvents){var drawerMarkedReady=!1,waitForDrawerToLoad=function(){return new Promise((function(resolve){drawerMarkedReady?resolve():PubSub.subscribe(MessageDrawerEvents.READY,resolve)}))};return{createConversationWithUser:function(args){waitForDrawerToLoad().then((function(){PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER,args)})).catch()},hide:function(){waitForDrawerToLoad().then((function(){PubSub.publish(MessageDrawerEvents.HIDE)})).catch()},show:function(){waitForDrawerToLoad().then((function(){PubSub.publish(MessageDrawerEvents.SHOW)})).catch()},showConversation:function(args){waitForDrawerToLoad().then((function(){PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION,args)})).catch()},showSettings:function(){waitForDrawerToLoad().then((function(){PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS)})).catch()},markDrawerReady:function(){drawerMarkedReady=!0,PubSub.publish(MessageDrawerEvents.READY)}}})); //# sourceMappingURL=message_drawer_helper.min.js.map \ No newline at end of file diff --git a/message/amd/build/message_drawer_helper.min.js.map b/message/amd/build/message_drawer_helper.min.js.map index 951030ffc3b..60225766576 100644 --- a/message/amd/build/message_drawer_helper.min.js.map +++ b/message/amd/build/message_drawer_helper.min.js.map @@ -1 +1 @@ -{"version":3,"file":"message_drawer_helper.min.js","sources":["../src/message_drawer_helper.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Provides some helper functions to trigger actions in the message drawer.\n *\n * @module core_message/message_drawer_helper\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'core/pubsub',\n 'core_message/message_drawer_events'\n],\nfunction(\n PubSub,\n MessageDrawerEvents\n) {\n\n /**\n * Trigger an event to create a new conversation in the message drawer.\n *\n * @param {object} args\n * @param {Number} args.userId The user id to start a conversation.\n */\n var createConversationWithUser = function(args) {\n PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER, args);\n };\n\n /**\n * Trigger an event to hide the message drawer.\n */\n var hide = function() {\n PubSub.publish(MessageDrawerEvents.HIDE);\n };\n\n /**\n * Trigger an event to show the message drawer.\n */\n var show = function() {\n PubSub.publish(MessageDrawerEvents.SHOW);\n };\n\n /**\n * Trigger an event to show the given conversation.\n *\n * @param {object} args\n * @param {int} args.conversationId Id for the conversation to show.\n */\n var showConversation = function(args) {\n PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION, args);\n };\n\n /**\n * Trigger an event to show messaging settings.\n */\n var showSettings = function() {\n PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS);\n };\n\n return {\n createConversationWithUser: createConversationWithUser,\n hide: hide,\n show: show,\n showConversation: showConversation,\n showSettings: showSettings\n };\n});\n"],"names":["define","PubSub","MessageDrawerEvents","createConversationWithUser","args","publish","CREATE_CONVERSATION_WITH_USER","hide","HIDE","show","SHOW","showConversation","SHOW_CONVERSATION","showSettings","SHOW_SETTINGS"],"mappings":";;;;;;;AAsBAA,4CACA,CACI,cACA,uCAEJ,SACIC,OACAC,2BA4CO,CACHC,2BApC6B,SAASC,MACtCH,OAAOI,QAAQH,oBAAoBI,8BAA+BF,OAoClEG,KA9BO,WACPN,OAAOI,QAAQH,oBAAoBM,OA8BnCC,KAxBO,WACPR,OAAOI,QAAQH,oBAAoBQ,OAwBnCC,iBAfmB,SAASP,MAC5BH,OAAOI,QAAQH,oBAAoBU,kBAAmBR,OAetDS,aATe,WACfZ,OAAOI,QAAQH,oBAAoBY"} \ No newline at end of file +{"version":3,"file":"message_drawer_helper.min.js","sources":["../src/message_drawer_helper.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Provides some helper functions to trigger actions in the message drawer.\n *\n * @module core_message/message_drawer_helper\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'core/pubsub',\n 'core_message/message_drawer_events'\n],\nfunction(\n PubSub,\n MessageDrawerEvents\n) {\n\n /** @property {boolean} Whether the drawer is ready or not */\n var drawerMarkedReady = false;\n\n /**\n * Trigger an event to create a new conversation in the message drawer.\n *\n * @param {object} args\n * @param {Number} args.userId The user id to start a conversation.\n */\n var createConversationWithUser = function(args) {\n waitForDrawerToLoad().then(function() {\n PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER, args);\n return;\n }).catch();\n };\n\n /**\n * Trigger an event to hide the message drawer.\n */\n var hide = function() {\n waitForDrawerToLoad().then(function() {\n PubSub.publish(MessageDrawerEvents.HIDE);\n return;\n }).catch();\n };\n\n /**\n * Trigger an event to show the message drawer.\n */\n var show = function() {\n waitForDrawerToLoad().then(function() {\n PubSub.publish(MessageDrawerEvents.SHOW);\n return;\n }).catch();\n };\n\n /**\n * Trigger an event to show the given conversation.\n *\n * @param {object} args\n * @param {int} args.conversationId Id for the conversation to show.\n */\n var showConversation = function(args) {\n waitForDrawerToLoad().then(function() {\n PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION, args);\n return;\n }).catch();\n };\n\n /**\n * Trigger an event to show messaging settings.\n */\n var showSettings = function() {\n waitForDrawerToLoad().then(function() {\n PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS);\n return;\n }).catch();\n };\n\n /**\n * Helper to wait for the drawer to be ready before performing an action.\n *\n * @returns {Promise}\n */\n var waitForDrawerToLoad = function() {\n return new Promise(function(resolve) {\n if (drawerMarkedReady) {\n resolve();\n } else {\n PubSub.subscribe(MessageDrawerEvents.READY, resolve);\n }\n });\n };\n\n /**\n * Helper to allow the drawer to mark itself as ready.\n */\n var markDrawerReady = function() {\n drawerMarkedReady = true;\n PubSub.publish(MessageDrawerEvents.READY);\n };\n\n return {\n createConversationWithUser: createConversationWithUser,\n hide: hide,\n show: show,\n showConversation: showConversation,\n showSettings: showSettings,\n markDrawerReady: markDrawerReady,\n };\n});\n"],"names":["define","PubSub","MessageDrawerEvents","drawerMarkedReady","waitForDrawerToLoad","Promise","resolve","subscribe","READY","createConversationWithUser","args","then","publish","CREATE_CONVERSATION_WITH_USER","catch","hide","HIDE","show","SHOW","showConversation","SHOW_CONVERSATION","showSettings","SHOW_SETTINGS","markDrawerReady"],"mappings":";;;;;;;AAsBAA,4CACA,CACI,cACA,uCAEJ,SACIC,OACAC,yBAIIC,mBAAoB,EA+DpBC,oBAAsB,kBACf,IAAIC,SAAQ,SAASC,SACpBH,kBACAG,UAEAL,OAAOM,UAAUL,oBAAoBM,MAAOF,mBAajD,CACHG,2BA1E6B,SAASC,MACtCN,sBAAsBO,MAAK,WACvBV,OAAOW,QAAQV,oBAAoBW,8BAA+BH,SAEnEI,SAuEHC,KAjEO,WACPX,sBAAsBO,MAAK,WACvBV,OAAOW,QAAQV,oBAAoBc,SAEpCF,SA8DHG,KAxDO,WACPb,sBAAsBO,MAAK,WACvBV,OAAOW,QAAQV,oBAAoBgB,SAEpCJ,SAqDHK,iBA5CmB,SAAST,MAC5BN,sBAAsBO,MAAK,WACvBV,OAAOW,QAAQV,oBAAoBkB,kBAAmBV,SAEvDI,SAyCHO,aAnCe,WACfjB,sBAAsBO,MAAK,WACvBV,OAAOW,QAAQV,oBAAoBoB,kBAEpCR,SAgCHS,gBAXkB,WAClBpB,mBAAoB,EACpBF,OAAOW,QAAQV,oBAAoBM"} \ No newline at end of file diff --git a/message/amd/src/message_drawer.js b/message/amd/src/message_drawer.js index 365e24e08f8..019aaf9fa1b 100644 --- a/message/amd/src/message_drawer.js +++ b/message/amd/src/message_drawer.js @@ -35,6 +35,7 @@ define( 'core_message/message_drawer_router', 'core_message/message_drawer_routes', 'core_message/message_drawer_events', + 'core_message/message_drawer_helper', 'core/pending', 'core/drawer', ], @@ -52,6 +53,7 @@ function( Router, Routes, Events, + Helper, Pending, Drawer ) { @@ -353,6 +355,9 @@ function( Router.go.apply(null, routeParams); } } + + // Mark the drawer as ready. + Helper.markDrawerReady(); }; return { diff --git a/message/amd/src/message_drawer_events.js b/message/amd/src/message_drawer_events.js index 2b76077af83..dba9a5d676b 100644 --- a/message/amd/src/message_drawer_events.js +++ b/message/amd/src/message_drawer_events.js @@ -38,6 +38,7 @@ define([], function() { CONVERSATION_UNSET_FAVOURITE: 'message-drawer-conversation-unset-favourite', CONVERSATION_UNSET_MUTED: 'message-drawer-conversation-unset-muted', PREFERENCES_UPDATED: 'message-drawer-preferences-updated', + READY: 'message-drawer-ready', ROUTE_CHANGED: 'message-drawer-route-change', SHOW: 'message-drawer-show', HIDE: 'message-drawer-hide', diff --git a/message/amd/src/message_drawer_helper.js b/message/amd/src/message_drawer_helper.js index 9720744ed85..23dbeddc308 100644 --- a/message/amd/src/message_drawer_helper.js +++ b/message/amd/src/message_drawer_helper.js @@ -30,6 +30,9 @@ function( MessageDrawerEvents ) { + /** @property {boolean} Whether the drawer is ready or not */ + var drawerMarkedReady = false; + /** * Trigger an event to create a new conversation in the message drawer. * @@ -37,21 +40,30 @@ function( * @param {Number} args.userId The user id to start a conversation. */ var createConversationWithUser = function(args) { - PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER, args); + waitForDrawerToLoad().then(function() { + PubSub.publish(MessageDrawerEvents.CREATE_CONVERSATION_WITH_USER, args); + return; + }).catch(); }; /** * Trigger an event to hide the message drawer. */ var hide = function() { - PubSub.publish(MessageDrawerEvents.HIDE); + waitForDrawerToLoad().then(function() { + PubSub.publish(MessageDrawerEvents.HIDE); + return; + }).catch(); }; /** * Trigger an event to show the message drawer. */ var show = function() { - PubSub.publish(MessageDrawerEvents.SHOW); + waitForDrawerToLoad().then(function() { + PubSub.publish(MessageDrawerEvents.SHOW); + return; + }).catch(); }; /** @@ -61,14 +73,43 @@ function( * @param {int} args.conversationId Id for the conversation to show. */ var showConversation = function(args) { - PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION, args); + waitForDrawerToLoad().then(function() { + PubSub.publish(MessageDrawerEvents.SHOW_CONVERSATION, args); + return; + }).catch(); }; /** * Trigger an event to show messaging settings. */ var showSettings = function() { - PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS); + waitForDrawerToLoad().then(function() { + PubSub.publish(MessageDrawerEvents.SHOW_SETTINGS); + return; + }).catch(); + }; + + /** + * Helper to wait for the drawer to be ready before performing an action. + * + * @returns {Promise} + */ + var waitForDrawerToLoad = function() { + return new Promise(function(resolve) { + if (drawerMarkedReady) { + resolve(); + } else { + PubSub.subscribe(MessageDrawerEvents.READY, resolve); + } + }); + }; + + /** + * Helper to allow the drawer to mark itself as ready. + */ + var markDrawerReady = function() { + drawerMarkedReady = true; + PubSub.publish(MessageDrawerEvents.READY); }; return { @@ -76,6 +117,7 @@ function( hide: hide, show: show, showConversation: showConversation, - showSettings: showSettings + showSettings: showSettings, + markDrawerReady: markDrawerReady, }; });