@@ -20,6 +20,16 @@ widgetsHelper.firstGetAvailableWidgetsCall = null;
2020 */
2121widgetsHelper . getAvailableWidgets = function ( callback ) {
2222
23+ if ( ! widgetsHelper . availableWidgets && widgetsHelper . firstGetAvailableWidgetsCall ) {
24+ widgetsHelper . firstGetAvailableWidgetsCall . then ( function ( ) {
25+ if ( callback ) {
26+ callback ( widgetsHelper . availableWidgets ) ;
27+ }
28+ } ) ;
29+
30+ return widgetsHelper . firstGetAvailableWidgetsCall ;
31+ }
32+
2333 function mergeCategoriesAndSubCategories ( availableWidgets )
2434 {
2535 var categorized = { } ;
@@ -113,6 +123,8 @@ widgetsHelper.getAvailableWidgets = function (callback) {
113123 callback ( widgetsHelper . availableWidgets ) ;
114124 }
115125 } ) ;
126+
127+ return promise ;
116128} ;
117129
118130/**
@@ -121,6 +133,7 @@ widgetsHelper.getAvailableWidgets = function (callback) {
121133 */
122134widgetsHelper . clearAvailableWidgets = function ( ) {
123135 delete widgetsHelper . availableWidgets ;
136+ widgetsHelper . firstGetAvailableWidgetsCall = null ;
124137} ;
125138
126139/**
@@ -131,17 +144,25 @@ widgetsHelper.clearAvailableWidgets = function () {
131144 */
132145widgetsHelper . getWidgetObjectFromUniqueId = function ( uniqueId , callback ) {
133146 widgetsHelper . getAvailableWidgets ( function ( widgets ) {
134- for ( var widgetCategory in widgets ) {
135- var widgetInCategory = widgets [ widgetCategory ] ;
136- for ( var i in widgetInCategory ) {
137- if ( widgetInCategory [ i ] [ "uniqueId" ] == uniqueId ) {
138- callback ( widgetInCategory [ i ] ) ;
139- return ;
140- }
147+ callback ( widgetsHelper . findWidgetObjectFromUniqueId ( uniqueId , widgets ) ) ;
148+ } ) ;
149+ } ;
150+
151+ widgetsHelper . findWidgetObjectFromUniqueId = function ( uniqueId , widgets ) {
152+ if ( ! widgets ) {
153+ return false ;
154+ }
155+
156+ for ( var widgetCategory in widgets ) {
157+ var widgetInCategory = widgets [ widgetCategory ] ;
158+ for ( var i in widgetInCategory ) {
159+ if ( widgetInCategory [ i ] [ "uniqueId" ] == uniqueId ) {
160+ return widgetInCategory [ i ] ;
141161 }
142162 }
143- callback ( false ) ;
144- } ) ;
163+ }
164+
165+ return false ;
145166} ;
146167
147168/**
@@ -174,51 +195,72 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid
174195
175196 widgetParameters [ 'widget' ] = 1 ;
176197
177- var clientWidgetRequest = {
178- abort : function ( ) { }
198+ var widgetRequest = {
199+ aborted : false ,
200+ ajaxRequest : null ,
201+ abort : function ( ) {
202+ this . aborted = true ;
203+ if ( this . ajaxRequest ) {
204+ this . ajaxRequest . abort ( ) ;
205+ }
206+ }
179207 } ;
180208
181- var clientWidget = null ;
182- if ( widgetsHelper . availableWidgets ) {
183- for ( var widgetCategory in widgetsHelper . availableWidgets ) {
184- if ( ! widgetsHelper . availableWidgets . hasOwnProperty ( widgetCategory ) ) {
185- continue ;
209+ function loadLegacyWidget ( ) {
210+ if ( widgetRequest . aborted ) {
211+ return ;
212+ }
213+
214+ var ajaxRequest = new ajaxHelper ( ) ;
215+ ajaxRequest . addParams ( widgetParameters , 'get' ) ;
216+ ajaxRequest . setCallback ( function ( ) {
217+ if ( widgetRequest . aborted ) {
218+ return ;
186219 }
187220
188- var widgets = widgetsHelper . availableWidgets [ widgetCategory ] ;
189- for ( var index in widgets ) {
190- if ( widgets . hasOwnProperty ( index ) && widgets [ index ] [ "uniqueId" ] == widgetUniqueId ) {
191- clientWidget = widgets [ index ] ;
192- break ;
221+ onWidgetLoadedCallback . apply ( this , arguments ) ;
222+ } ) ;
223+ if ( onWidgetErrorCallback ) {
224+ ajaxRequest . setErrorCallback ( function ( ) {
225+ if ( widgetRequest . aborted ) {
226+ return ;
193227 }
194- }
195228
196- if ( clientWidget ) {
197- break ;
198- }
229+ onWidgetErrorCallback . apply ( this , arguments ) ;
230+ } ) ;
199231 }
232+ ajaxRequest . setFormat ( 'html' ) ;
233+ ajaxRequest . send ( ) ;
234+ widgetRequest . ajaxRequest = ajaxRequest ;
200235 }
201236
202- if ( clientWidget && clientWidget . clientComponent ) {
203- clientWidget = $ . extend ( true , { } , clientWidget ) ;
204- clientWidget . parameters = $ . extend ( { } , clientWidget . parameters , widgetParameters ) ;
237+ widgetsHelper . getAvailableWidgets ( ) . then ( function ( ) {
238+ if ( widgetRequest . aborted ) {
239+ return ;
240+ }
205241
206- var html = '<div vue-entry="CoreHome.Widget"'
207- + ' widget="' + piwikHelper . htmlEntities ( JSON . stringify ( clientWidget ) ) + '"'
208- + ' widgetized="true"></div>' ;
209- onWidgetLoadedCallback ( html ) ;
210- return clientWidgetRequest ;
211- }
242+ var clientWidget = widgetsHelper . findWidgetObjectFromUniqueId (
243+ widgetUniqueId ,
244+ widgetsHelper . availableWidgets
245+ ) ;
212246
213- var ajaxRequest = new ajaxHelper ( ) ;
214- ajaxRequest . addParams ( widgetParameters , 'get' ) ;
215- ajaxRequest . setCallback ( onWidgetLoadedCallback ) ;
216- if ( onWidgetErrorCallback ) {
217- ajaxRequest . setErrorCallback ( onWidgetErrorCallback ) ;
218- }
219- ajaxRequest . setFormat ( 'html' ) ;
220- ajaxRequest . send ( ) ;
221- return ajaxRequest ;
247+ if ( clientWidget && clientWidget . clientComponent ) {
248+ clientWidget = $ . extend ( true , { } , clientWidget ) ;
249+ clientWidget . parameters = $ . extend ( { } , clientWidget . parameters , widgetParameters ) ;
250+
251+ var html = '<div vue-entry="CoreHome.Widget"'
252+ + ' widget="' + piwikHelper . htmlEntities ( JSON . stringify ( clientWidget ) ) + '"'
253+ + ' widgetized="true"></div>' ;
254+ onWidgetLoadedCallback ( html ) ;
255+ return ;
256+ }
257+
258+ loadLegacyWidget ( ) ;
259+ } ) . catch ( function ( ) {
260+ loadLegacyWidget ( ) ;
261+ } ) ;
262+
263+ return widgetRequest ;
222264} ;
223265
224266( function ( $ , require ) {
0 commit comments