| |
| |
| |
| |
| |
| |
|
|
| function widgetsHelper() { |
| } |
|
|
| |
| |
| |
| widgetsHelper.firstGetAvailableWidgetsCall = null; |
|
|
| |
| |
| |
| |
| |
| widgetsHelper.getAvailableWidgets = function (callback) { |
|
|
| function resetFirstGetAvailableWidgetsCall(promise) { |
| if (widgetsHelper.firstGetAvailableWidgetsCall === promise) { |
| widgetsHelper.firstGetAvailableWidgetsCall = null; |
| } |
| } |
|
|
| if (!widgetsHelper.availableWidgets && widgetsHelper.firstGetAvailableWidgetsCall) { |
| return widgetsHelper.firstGetAvailableWidgetsCall.then(function () { |
| if (callback) { |
| callback(widgetsHelper.availableWidgets); |
| } |
| }); |
| } |
|
|
| function mergeCategoriesAndSubCategories(availableWidgets) |
| { |
| var categorized = {}; |
|
|
| $.each(availableWidgets, function (index, widget) { |
| var category = widget.category.name; |
|
|
| if (!categorized[category]) { |
| categorized[category] = {'-': []}; |
| } |
|
|
| var subcategory = '-'; |
| if (widget.subcategory && widget.subcategory.name) { |
| subcategory = widget.subcategory.name; |
| } |
|
|
| if (!categorized[category][subcategory]) { |
| categorized[category][subcategory] = []; |
| } |
|
|
| categorized[category][subcategory].push(widget); |
| }); |
|
|
| var moved = {}; |
|
|
| $.each(categorized, function (category, widgets) { |
| $.each(widgets, function (subcategory, subwidgets) { |
| if (!subwidgets.length) { |
| return; |
| } |
|
|
| var categoryToUse = category; |
| if (subwidgets.length >= 3 && subcategory !== '-') { |
| categoryToUse = category + ' - ' + subcategory; |
| } |
|
|
| if (!moved[categoryToUse]) { |
| moved[categoryToUse] = []; |
| } |
|
|
| $.each(subwidgets, function (index, widget) { |
| moved[categoryToUse].push(widget); |
| }); |
| }); |
| }); |
|
|
| return moved; |
| } |
|
|
| var promise = new Promise(function (resolve, reject) { |
| if (!widgetsHelper.availableWidgets) { |
| var ajaxRequest = new ajaxHelper(); |
| ajaxRequest._mixinDefaultGetParams = function (params) { |
| return params; |
| }; |
| ajaxRequest.addParams({ |
| module: 'API', |
| method: 'API.getWidgetMetadata', |
| filter_limit: '-1', |
| format: 'JSON', |
| deep: '1', |
| idSite: piwik.idSite || broadcast.getValueFromUrl('idSite') |
| }, 'get'); |
| ajaxRequest.setCallback( |
| function (data) { |
| widgetsHelper.availableWidgets = mergeCategoriesAndSubCategories(data); |
|
|
| resetFirstGetAvailableWidgetsCall(promise); |
| resolve(); |
| } |
| ); |
| ajaxRequest.setErrorCallback(function (deferred, status) { |
| resetFirstGetAvailableWidgetsCall(promise); |
|
|
| if (status == 'abort') { |
| reject(new Error('Loading widget metadata was aborted')); |
| return; |
| } |
|
|
| if (!deferred || deferred.status < 400 || deferred.status >= 600) { |
| reject(new Error('Loading widget metadata failed')); |
| return; |
| } |
|
|
| $('#loadingError').show(); |
| reject(new Error('Loading widget metadata failed')); |
| }); |
| ajaxRequest.send(); |
| return; |
| } |
|
|
| resolve(); |
| }); |
|
|
| if (!widgetsHelper.firstGetAvailableWidgetsCall) { |
| widgetsHelper.firstGetAvailableWidgetsCall = promise; |
| } |
|
|
| return promise.then(function () { |
| if (callback) { |
| callback(widgetsHelper.availableWidgets); |
| } |
| }); |
| }; |
|
|
| |
| |
| |
| |
| widgetsHelper.clearAvailableWidgets = function () { |
| delete widgetsHelper.availableWidgets; |
| widgetsHelper.firstGetAvailableWidgetsCall = null; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| widgetsHelper.getWidgetObjectFromUniqueId = function (uniqueId, callback) { |
| widgetsHelper.getAvailableWidgets(function(widgets){ |
| callback(widgetsHelper.findWidgetObjectFromUniqueId(uniqueId, widgets)); |
| }); |
| }; |
|
|
| widgetsHelper.findWidgetObjectFromUniqueId = function (uniqueId, widgets) { |
| if (!widgets) { |
| return false; |
| } |
|
|
| for (var widgetCategory in widgets) { |
| var widgetInCategory = widgets[widgetCategory]; |
| for (var i in widgetInCategory) { |
| if (widgetInCategory[i]["uniqueId"] == uniqueId) { |
| return widgetInCategory[i]; |
| } |
| } |
| } |
|
|
| return false; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| widgetsHelper.getWidgetNameFromUniqueId = function (uniqueId, callback) { |
| this.getWidgetObjectFromUniqueId(uniqueId, function(widget) { |
| if (widget == false) { |
| callback(false); |
| } |
| callback(widget["name"]); |
| }); |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWidgetLoadedCallback, onWidgetErrorCallback) { |
| var disableLink = broadcast.getValueFromUrl('disableLink'); |
| widgetParameters['disableLink'] = disableLink.length || $('body#standalone').length; |
|
|
| widgetParameters['widget'] = 1; |
|
|
| var widgetRequest = { |
| aborted: false, |
| ajaxRequest: null, |
| abort: function () { |
| this.aborted = true; |
| if (this.ajaxRequest) { |
| this.ajaxRequest.abort(); |
| } |
| } |
| }; |
|
|
| function loadLegacyWidget() { |
| if (widgetRequest.aborted) { |
| return; |
| } |
|
|
| var ajaxRequest = new ajaxHelper(); |
| ajaxRequest.addParams(widgetParameters, 'get'); |
| ajaxRequest.setCallback(function () { |
| if (widgetRequest.aborted) { |
| return; |
| } |
|
|
| onWidgetLoadedCallback.apply(this, arguments); |
| }); |
| if (onWidgetErrorCallback) { |
| ajaxRequest.setErrorCallback(function () { |
| if (widgetRequest.aborted) { |
| return; |
| } |
|
|
| onWidgetErrorCallback.apply(this, arguments); |
| }); |
| } |
| ajaxRequest.setFormat('html'); |
| ajaxRequest.send(); |
| widgetRequest.ajaxRequest = ajaxRequest; |
| } |
|
|
| var metadataReady = widgetsHelper.availableWidgets |
| ? Promise.resolve() |
| : widgetsHelper.getAvailableWidgets(); |
|
|
| metadataReady.then(function () { |
| if (widgetRequest.aborted) { |
| return; |
| } |
|
|
| var clientWidget = widgetsHelper.findWidgetObjectFromUniqueId( |
| widgetUniqueId, |
| widgetsHelper.availableWidgets |
| ); |
|
|
| if (clientWidget && clientWidget.clientComponent) { |
| clientWidget = $.extend(true, {}, clientWidget); |
| clientWidget.parameters = $.extend({}, clientWidget.parameters, widgetParameters); |
|
|
| var html = '<div vue-entry="CoreHome.Widget"' |
| + ' widget="' + piwikHelper.htmlEntities(JSON.stringify(clientWidget)) + '"' |
| + ' widgetized="true"></div>'; |
| onWidgetLoadedCallback(html); |
| return; |
| } |
|
|
| loadLegacyWidget(); |
| }).catch(function () { |
| loadLegacyWidget(); |
| }); |
|
|
| return widgetRequest; |
| }; |
|
|
| (function ($, require) { |
| var exports = require('piwik/UI/Dashboard'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| var WidgetFactory = function () { |
| |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| WidgetFactory.prototype.make = function (uniqueId, widgetName) { |
| var $result = this.getWidgetTemplate().clone(); |
| $result.attr('id', uniqueId).find('.widgetName').append(widgetName); |
| return $result; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| WidgetFactory.prototype.getWidgetTemplate = function () { |
| if (!this.widgetTemplate) { |
| this.widgetTemplate = $('#widgetTemplate').find('>.widget').detach(); |
| } |
| return this.widgetTemplate; |
| }; |
|
|
| exports.WidgetFactory = new WidgetFactory(); |
| })(jQuery, require); |
|
|
| |
| |
| |
| |
| |
| |
| (function ($) { |
| $.extend({ |
| widgetPreview: new function () { |
|
|
| |
| |
| |
| |
| var defaultSettings = { |
| |
| |
| |
| |
| onPreviewLoaded: function () {}, |
| |
| |
| |
| |
| onSelect: function () {}, |
| |
| |
| |
| |
| |
| isWidgetAvailable: function (widgetUniqueId) { return true; }, |
| |
| |
| |
| |
| resetOnSelect: false, |
| |
| |
| |
| |
| baseClass: 'widgetpreview-base', |
| categorylistClass: 'widgetpreview-categorylist', |
| widgetlistClass: 'widgetpreview-widgetlist', |
| widgetpreviewClass: 'widgetpreview-preview', |
| choosenClass: 'widgetpreview-choosen', |
| unavailableClass: 'widgetpreview-unavailable' |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| function createWidgetCategoryList(widgetPreview, availableWidgets) { |
|
|
| var settings = widgetPreview.settings; |
|
|
| if (!$('.' + settings.categorylistClass, widgetPreview).length) { |
| $(widgetPreview).append('<ul class="' + settings.categorylistClass + '"></ul>'); |
| } else { |
| $('.' + settings.categorylistClass, widgetPreview).empty(); |
| } |
|
|
| for (var widgetCategory in availableWidgets) { |
| $('.' + settings.categorylistClass, widgetPreview).append($('<li>').text(widgetCategory)); |
| } |
|
|
| return $('.' + settings.categorylistClass, widgetPreview); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| function createWidgetList(widgetPreview) { |
| var settings = widgetPreview.settings; |
|
|
| if (!$('.' + settings.widgetlistClass, widgetPreview).length) { |
| $(widgetPreview).append('<ul class="' + settings.widgetlistClass + '"></ul>'); |
| } else { |
| $('.' + settings.widgetlistClass + ' li', widgetPreview).off('mouseover'); |
| $('.' + settings.widgetlistClass + ' li', widgetPreview).off('click'); |
| $('.' + settings.widgetlistClass, widgetPreview).empty(); |
| } |
|
|
| if ($('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).length) { |
| var position = $('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).position().top - |
| $('.' + settings.categorylistClass, widgetPreview).position().top; |
|
|
| $('.' + settings.widgetlistClass, widgetPreview).css({ |
| top: position, |
| marginBottom: position + 10 |
| }); |
| } |
|
|
| return $('.' + settings.widgetlistClass, widgetPreview); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| function showWidgetList(widgets, widgetPreview) { |
| var settings = widgetPreview.settings; |
|
|
| var widgetList = createWidgetList(widgetPreview), |
| widgetPreviewTimer; |
|
|
| for (var j = 0; j < widgets.length; j++) { |
| var widgetName = widgets[j]["name"]; |
| var widgetUniqueId = widgets[j]["uniqueId"]; |
| var widgetCategoryId = widgets[j].category ? widgets[j].category.id : null; |
| var widgetClass = ''; |
| if (!settings.isWidgetAvailable(widgetUniqueId) && widgetCategoryId !== 'General_KpiMetric') { |
| widgetClass += ' ' + settings.unavailableClass; |
| } |
|
|
| widgetName = piwikHelper.escape(piwikHelper.htmlEntities(widgetName)); |
|
|
| widgetList.append('<li class="' + widgetClass + '" uniqueid="' + widgetUniqueId + '">' + widgetName + '</li>'); |
| } |
|
|
| |
| $('li', widgetList).on('mouseenter', function () { |
| var that = this, |
| widgetUniqueId = $(this).attr('uniqueid'); |
| clearTimeout(widgetPreview); |
| widgetPreviewTimer = setTimeout(function () { |
| $('li', widgetList).removeClass(settings.choosenClass); |
| $(that).addClass(settings.choosenClass); |
|
|
| showPreview(widgetUniqueId, widgetPreview); |
| }, 400); |
| }); |
|
|
| |
| $('li:not(.' + settings.unavailableClass + ')', widgetList).on('mouseleave', function () { |
| clearTimeout(widgetPreview); |
| }); |
|
|
| $('li', widgetList).on('click', function () { |
| if (!$('.widgetLoading', widgetPreview).length) { |
| settings.onSelect($(this).attr('uniqueid')); |
| if (settings.resetOnSelect) { |
| resetWidgetPreview(widgetPreview); |
| } |
| } |
| return false; |
| }); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| function createPreviewElement(widgetPreview) { |
| var settings = widgetPreview.settings; |
|
|
| if (!$('.' + settings.widgetpreviewClass, widgetPreview).length) { |
| $(widgetPreview).append('<div class="' + settings.widgetpreviewClass + '"></div>'); |
| } else { |
| $('.' + settings.widgetpreviewClass + ' .widgetTop', widgetPreview).off('click'); |
| $('.' + settings.widgetpreviewClass, widgetPreview).empty(); |
| } |
|
|
| return $('.' + settings.widgetpreviewClass, widgetPreview); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| function showPreview(widgetUniqueId, widgetPreview) { |
| |
| if ($('[id="' + widgetUniqueId + '"]', widgetPreview).length) return; |
|
|
| var settings = widgetPreview.settings; |
|
|
| var previewElement = createPreviewElement(widgetPreview); |
|
|
| widgetsHelper.getWidgetObjectFromUniqueId(widgetUniqueId, function(widget) { |
| var widgetParameters = widget['parameters']; |
|
|
| var emptyWidgetHtml = require('piwik/UI/Dashboard').WidgetFactory.make( |
| widgetUniqueId, |
| $('<span/>') |
| .attr('title', _pk_translate("Dashboard_AddPreviewedWidget")) |
| .text(_pk_translate('Dashboard_WidgetPreview')) |
| ); |
| previewElement.html(emptyWidgetHtml); |
|
|
| var onWidgetLoadedCallback = function (response) { |
| var widgetElement = previewElement.children('.widget').first(); |
| $('.widgetContent', widgetElement).html($(response)); |
| piwikHelper.compileVueEntryComponents($('.widgetContent', widgetElement)); |
| |
| |
| |
| |
| $('.widgetContent', widgetElement).trigger('widget:create', [{ element: widgetElement }]); |
| settings.onPreviewLoaded(widgetUniqueId, widgetElement); |
| $('.' + settings.widgetpreviewClass + ' .widgetTop', widgetPreview).on('click', function () { |
| settings.onSelect(widgetUniqueId); |
| if (settings.resetOnSelect) { |
| resetWidgetPreview(widgetPreview); |
| } |
| return false; |
| }); |
| }; |
|
|
| |
| if (widgetPreview.widgetAjaxRequest) { |
| widgetPreview.widgetAjaxRequest.abort(); |
| } |
|
|
| widgetPreview.widgetAjaxRequest = widgetsHelper.loadWidgetAjax(widgetUniqueId, widgetParameters, onWidgetLoadedCallback); |
| }); |
| } |
|
|
| |
| |
| |
| |
| |
| function resetWidgetPreview(widgetPreview) { |
| var settings = widgetPreview.settings; |
|
|
| $('.' + settings.categorylistClass + ' li', widgetPreview).removeClass(settings.choosenClass); |
| createWidgetList(widgetPreview); |
| createPreviewElement(widgetPreview); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| this.construct = function (userSettings) { |
|
|
| if (userSettings == 'reset') { |
| resetWidgetPreview(this); |
| return; |
| } |
|
|
| this.widgetAjaxRequest = null; |
|
|
| $(this).addClass('widgetpreview-base'); |
|
|
| this.settings = jQuery.extend({}, defaultSettings, userSettings); |
|
|
| |
| if (typeof this.settings.onSelect == 'function') { |
| this.onSelect = this.settings.onSelect; |
| } |
|
|
| |
| if (typeof this.settings.onPreviewLoaded == 'function') { |
| this.onPreviewLoaded = this.settings.onPreviewLoaded; |
| } |
|
|
| var self = this; |
| widgetsHelper.getAvailableWidgets(function (availableWidgets) { |
|
|
| var categoryList = createWidgetCategoryList(self, availableWidgets); |
|
|
| $('li', categoryList).on('mouseover', function () { |
| var category = $(this).text(); |
| var widgets = availableWidgets[category]; |
| $('li', categoryList).removeClass(self.settings.choosenClass); |
| $(this).addClass(self.settings.choosenClass); |
| showWidgetList(widgets, self); |
| createPreviewElement(self); |
| }); |
| }); |
|
|
| }; |
| } |
| }); |
|
|
| |
| |
| |
| $.fn.extend({ |
| widgetPreview: $.widgetPreview.construct |
| }) |
| })(jQuery); |
|
|