Skip to content

Commit ecfd7b5

Browse files
committed
fix initial dashboard widget loading
1 parent ec1dfaf commit ecfd7b5

1 file changed

Lines changed: 85 additions & 43 deletions

File tree

plugins/Dashboard/javascripts/widgetMenu.js

Lines changed: 85 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ widgetsHelper.firstGetAvailableWidgetsCall = null;
2020
*/
2121
widgetsHelper.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
*/
122134
widgetsHelper.clearAvailableWidgets = function () {
123135
delete widgetsHelper.availableWidgets;
136+
widgetsHelper.firstGetAvailableWidgetsCall = null;
124137
};
125138

126139
/**
@@ -131,17 +144,25 @@ widgetsHelper.clearAvailableWidgets = function () {
131144
*/
132145
widgetsHelper.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

Comments
 (0)