Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordizzy <diosmosis@users.noreply.github.com>2022-03-21 03:56:59 +0300
committerGitHub <noreply@github.com>2022-03-21 03:56:59 +0300
commitcd541083f351a2712e58fa83a2c54861a92c120e (patch)
tree77565759a0ca8cad23422c645a76c4a7a6b3cf57 /plugins
parent53b56ded3e575a23bf42d17b867d934945c0e3d1 (diff)
[Vue] migrate multisites plugin components to vue (#18939)
* migrate multisites site directive to vue * migrate multisites dashboard service to store * migrate evolution filter and migrate multisites dashboard directive to vue * get to work in UI w/o error * remove todo * fixing UI tests * add some spacing * fix css tweak * update expected screenshots * correct href binding * apply review feedback * rebuild MultiSites
Diffstat (limited to 'plugins')
-rw-r--r--plugins/CoreHome/angularjs/common/filters/evolution.js36
-rw-r--r--plugins/CoreHome/vue/dist/CoreHome.umd.js35
-rw-r--r--plugins/CoreHome/vue/dist/CoreHome.umd.min.js13
-rw-r--r--plugins/CoreHome/vue/src/SiteSelector/Site.ts1
-rw-r--r--plugins/CoreHome/vue/src/getFormattedEvolution.ts37
-rw-r--r--plugins/CoreHome/vue/src/index.ts1
-rw-r--r--plugins/CoreVue/types/index.d.ts8
-rw-r--r--plugins/MultiSites/MultiSites.php12
-rw-r--r--plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js227
-rw-r--r--plugins/MultiSites/angularjs/site/site.controller.js51
-rw-r--r--plugins/MultiSites/angularjs/site/site.directive.html40
-rw-r--r--plugins/MultiSites/angularjs/site/site.directive.js42
-rw-r--r--plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites.png4
-rw-r--r--plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_changed_sort_order.png4
-rw-r--r--plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_page_1.png4
-rw-r--r--plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_range.png4
-rw-r--r--plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_search.png4
-rw-r--r--plugins/MultiSites/vue/dist/MultiSites.umd.js1140
-rw-r--r--plugins/MultiSites/vue/dist/MultiSites.umd.min.js20
-rw-r--r--plugins/MultiSites/vue/dist/umd.metadata.json5
-rw-r--r--plugins/MultiSites/vue/src/Dashboard/Dashboard.adapter.ts39
-rw-r--r--plugins/MultiSites/vue/src/Dashboard/Dashboard.less (renamed from plugins/MultiSites/angularjs/dashboard/dashboard.directive.less)4
-rw-r--r--plugins/MultiSites/vue/src/Dashboard/Dashboard.store.ts359
-rw-r--r--plugins/MultiSites/vue/src/Dashboard/Dashboard.vue407
-rw-r--r--plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.adapter.ts34
-rw-r--r--plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue172
-rw-r--r--plugins/MultiSites/vue/src/index.ts13
27 files changed, 2297 insertions, 419 deletions
diff --git a/plugins/CoreHome/angularjs/common/filters/evolution.js b/plugins/CoreHome/angularjs/common/filters/evolution.js
index d3ba61259b..14adb00db1 100644
--- a/plugins/CoreHome/angularjs/common/filters/evolution.js
+++ b/plugins/CoreHome/angularjs/common/filters/evolution.js
@@ -8,42 +8,8 @@
angular.module('piwikApp.filter').filter('evolution', evolutionFilter);
function evolutionFilter() {
-
- function calculateEvolution(currentValue, pastValue)
- {
- pastValue = parseInt(pastValue, 10);
- currentValue = parseInt(currentValue, 10) - pastValue;
-
- var evolution;
-
- if (currentValue === 0 || isNaN(currentValue)) {
- evolution = 0;
- } else if (pastValue === 0 || isNaN(pastValue)) {
- evolution = 100;
- } else {
- evolution = (currentValue / pastValue) * 100;
- }
-
- return evolution;
- }
-
- function formatEvolution(evolution)
- {
- evolution = Math.round(evolution);
-
- if (evolution > 0) {
- evolution = '+' + evolution;
- }
-
- evolution += '%';
-
- return evolution;
- }
-
return function(currentValue, pastValue) {
- var evolution = calculateEvolution(currentValue, pastValue);
-
- return formatEvolution(evolution);
+ return window.CoreHome.getFormattedEvolution(currentValue, pastValue);
};
}
})();
diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.js b/plugins/CoreHome/vue/dist/CoreHome.umd.js
index c2b128d0f7..e0eb58fd6d 100644
--- a/plugins/CoreHome/vue/dist/CoreHome.umd.js
+++ b/plugins/CoreHome/vue/dist/CoreHome.umd.js
@@ -132,6 +132,7 @@ __webpack_require__.d(__webpack_exports__, "createVueApp", function() { return /
__webpack_require__.d(__webpack_exports__, "useExternalPluginComponent", function() { return /* reexport */ useExternalPluginComponent; });
__webpack_require__.d(__webpack_exports__, "DirectiveUtilities", function() { return /* reexport */ directiveUtilities; });
__webpack_require__.d(__webpack_exports__, "debounce", function() { return /* reexport */ debounce; });
+__webpack_require__.d(__webpack_exports__, "getFormattedEvolution", function() { return /* reexport */ getFormattedEvolution; });
__webpack_require__.d(__webpack_exports__, "createAngularJsAdapter", function() { return /* reexport */ createAngularJsAdapter; });
__webpack_require__.d(__webpack_exports__, "transformAngularJsBoolAttr", function() { return /* reexport */ transformAngularJsBoolAttr; });
__webpack_require__.d(__webpack_exports__, "transformAngularJsIntAttr", function() { return /* reexport */ transformAngularJsIntAttr; });
@@ -11990,6 +11991,39 @@ function piwikAjaxForm($parse) {
piwikAjaxForm.$inject = ['$parse'];
window.angular.module('piwikApp').directive('piwikAjaxForm', piwikAjaxForm);
+// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/getFormattedEvolution.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+function calculateEvolution(currentValue, pastValue) {
+ var pastValueParsed = parseInt(pastValue, 10);
+ var currentValueParsed = parseInt(currentValue, 10) - pastValueParsed;
+ var evolution;
+
+ if (currentValueParsed === 0 || Number.isNaN(currentValueParsed)) {
+ evolution = 0;
+ } else if (pastValueParsed === 0 || Number.isNaN(pastValueParsed)) {
+ evolution = 100;
+ } else {
+ evolution = currentValueParsed / pastValueParsed * 100;
+ }
+
+ return evolution;
+}
+
+function formatEvolution(evolution) {
+ return "".concat(evolution > 0 ? Matomo_Matomo.numbers.symbolPlus : '').concat(Math.round(evolution), "}%");
+}
+
+function getFormattedEvolution(currentValue, pastValue) {
+ var evolution = calculateEvolution(currentValue, pastValue);
+ return formatEvolution(evolution);
+}
// CONCATENATED MODULE: ./plugins/CoreHome/vue/src/ActivityIndicator/ActivityIndicator.adapter.ts
/*!
* Matomo - free/libre analytics platform
@@ -12174,6 +12208,7 @@ function deleteCookie(name) {
+
// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js
diff --git a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
index bb1c87e53f..4365bf08ec 100644
--- a/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
+++ b/plugins/CoreHome/vue/dist/CoreHome.umd.min.js
@@ -4,7 +4,7 @@
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createVueApp",(function(){return ut})),n.d(t,"useExternalPluginComponent",(function(){return _n})),n.d(t,"DirectiveUtilities",(function(){return _t})),n.d(t,"debounce",(function(){return Ji})),n.d(t,"createAngularJsAdapter",(function(){return jt})),n.d(t,"transformAngularJsBoolAttr",(function(){return kt})),n.d(t,"transformAngularJsIntAttr",(function(){return St})),n.d(t,"removeAngularJsSpecificProperties",(function(){return Ot})),n.d(t,"clone",(function(){return Ct})),n.d(t,"cloneThenApply",(function(){return Et})),n.d(t,"activityIndicatorAdapter",(function(){return ku})),n.d(t,"ActivityIndicator",(function(){return ho})),n.d(t,"translate",(function(){return C})),n.d(t,"Alert",(function(){return st})),n.d(t,"AjaxHelper",(function(){return Xe})),n.d(t,"setCookie",(function(){return Su})),n.d(t,"getCookie",(function(){return Cu})),n.d(t,"deleteCookie",(function(){return Eu})),n.d(t,"MatomoUrl",(function(){return Ce})),n.d(t,"Matomo",(function(){return S})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return G})),n.d(t,"Week",(function(){return X})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return ce})),n.d(t,"Range",(function(){return _})),n.d(t,"format",(function(){return E})),n.d(t,"getToday",(function(){return D})),n.d(t,"parseDate",(function(){return P})),n.d(t,"todayIsInRange",(function(){return V})),n.d(t,"DropdownMenu",(function(){return Dt})),n.d(t,"FocusAnywhereButHere",(function(){return xt})),n.d(t,"FocusIf",(function(){return Lt})),n.d(t,"Tooltips",(function(){return Lr})),n.d(t,"MatomoDialog",(function(){return Sn})),n.d(t,"ExpandOnClick",(function(){return Yt})),n.d(t,"ExpandOnHover",(function(){return nn})),n.d(t,"ShowSensitiveData",(function(){return ln})),n.d(t,"DropdownButton",(function(){return dn})),n.d(t,"SelectOnFocus",(function(){return gn})),n.d(t,"SideNav",(function(){return yn})),n.d(t,"EnrichedHeadline",(function(){return Un})),n.d(t,"ContentBlock",(function(){return er})),n.d(t,"Comparisons",(function(){return Rr})),n.d(t,"MenuDropdown",(function(){return ei})),n.d(t,"DatePicker",(function(){return li})),n.d(t,"DateRangePicker",(function(){return mi})),n.d(t,"PeriodDatePicker",(function(){return bi})),n.d(t,"Notification",(function(){return al})),n.d(t,"NotificationGroup",(function(){return yl})),n.d(t,"NotificationsStore",(function(){return fl})),n.d(t,"SitesStore",(function(){return qi})),n.d(t,"SiteSelector",(function(){return zi})),n.d(t,"QuickAccess",(function(){return da})),n.d(t,"FieldArray",(function(){return Ca})),n.d(t,"MultiPairField",(function(){return Ha})),n.d(t,"PeriodSelector",(function(){return Vo})),n.d(t,"ReportingMenu",(function(){return Xl})),n.d(t,"ReportingMenuStore",(function(){return $l})),n.d(t,"ReportingPagesStore",(function(){return Cl})),n.d(t,"ReportMetadataStore",(function(){return lc})),n.d(t,"WidgetsStore",(function(){return Yl})),n.d(t,"WidgetLoader",(function(){return fc})),n.d(t,"WidgetContainer",(function(){return Pc})),n.d(t,"WidgetByDimensionContainer",(function(){return qc})),n.d(t,"Widget",(function(){return Kc})),n.d(t,"ReportingPage",(function(){return ys})),n.d(t,"ReportExport",(function(){return Ks})),n.d(t,"Sparkline",(function(){return nu})),n.d(t,"Progressbar",(function(){return su})),n.d(t,"ContentIntro",(function(){return uu})),n.d(t,"ContentTable",(function(){return pu})),n.d(t,"AjaxForm",(function(){return yu})),"undefined"!==typeof window){var r=window.document.currentScript,i=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);i&&(n.p=i[1])}n("2342");var a=n("8bbf");function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+ */window.hasBlockedContent=!1},"8bbf":function(t,n){t.exports=e},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"createVueApp",(function(){return ut})),n.d(t,"useExternalPluginComponent",(function(){return _n})),n.d(t,"DirectiveUtilities",(function(){return _t})),n.d(t,"debounce",(function(){return Ji})),n.d(t,"getFormattedEvolution",(function(){return Cu})),n.d(t,"createAngularJsAdapter",(function(){return jt})),n.d(t,"transformAngularJsBoolAttr",(function(){return kt})),n.d(t,"transformAngularJsIntAttr",(function(){return St})),n.d(t,"removeAngularJsSpecificProperties",(function(){return Ot})),n.d(t,"clone",(function(){return Ct})),n.d(t,"cloneThenApply",(function(){return Et})),n.d(t,"activityIndicatorAdapter",(function(){return Eu})),n.d(t,"ActivityIndicator",(function(){return ho})),n.d(t,"translate",(function(){return C})),n.d(t,"Alert",(function(){return st})),n.d(t,"AjaxHelper",(function(){return Xe})),n.d(t,"setCookie",(function(){return Du})),n.d(t,"getCookie",(function(){return Pu})),n.d(t,"deleteCookie",(function(){return Vu})),n.d(t,"MatomoUrl",(function(){return Ce})),n.d(t,"Matomo",(function(){return S})),n.d(t,"Periods",(function(){return p})),n.d(t,"Day",(function(){return G})),n.d(t,"Week",(function(){return X})),n.d(t,"Month",(function(){return re})),n.d(t,"Year",(function(){return ce})),n.d(t,"Range",(function(){return _})),n.d(t,"format",(function(){return E})),n.d(t,"getToday",(function(){return D})),n.d(t,"parseDate",(function(){return P})),n.d(t,"todayIsInRange",(function(){return V})),n.d(t,"DropdownMenu",(function(){return Dt})),n.d(t,"FocusAnywhereButHere",(function(){return xt})),n.d(t,"FocusIf",(function(){return Lt})),n.d(t,"Tooltips",(function(){return Lr})),n.d(t,"MatomoDialog",(function(){return Sn})),n.d(t,"ExpandOnClick",(function(){return Yt})),n.d(t,"ExpandOnHover",(function(){return nn})),n.d(t,"ShowSensitiveData",(function(){return ln})),n.d(t,"DropdownButton",(function(){return dn})),n.d(t,"SelectOnFocus",(function(){return gn})),n.d(t,"SideNav",(function(){return yn})),n.d(t,"EnrichedHeadline",(function(){return Un})),n.d(t,"ContentBlock",(function(){return er})),n.d(t,"Comparisons",(function(){return Rr})),n.d(t,"MenuDropdown",(function(){return ei})),n.d(t,"DatePicker",(function(){return li})),n.d(t,"DateRangePicker",(function(){return mi})),n.d(t,"PeriodDatePicker",(function(){return bi})),n.d(t,"Notification",(function(){return al})),n.d(t,"NotificationGroup",(function(){return yl})),n.d(t,"NotificationsStore",(function(){return fl})),n.d(t,"SitesStore",(function(){return qi})),n.d(t,"SiteSelector",(function(){return zi})),n.d(t,"QuickAccess",(function(){return da})),n.d(t,"FieldArray",(function(){return Ca})),n.d(t,"MultiPairField",(function(){return Ha})),n.d(t,"PeriodSelector",(function(){return Vo})),n.d(t,"ReportingMenu",(function(){return Xl})),n.d(t,"ReportingMenuStore",(function(){return $l})),n.d(t,"ReportingPagesStore",(function(){return Cl})),n.d(t,"ReportMetadataStore",(function(){return lc})),n.d(t,"WidgetsStore",(function(){return Yl})),n.d(t,"WidgetLoader",(function(){return fc})),n.d(t,"WidgetContainer",(function(){return Pc})),n.d(t,"WidgetByDimensionContainer",(function(){return qc})),n.d(t,"Widget",(function(){return Kc})),n.d(t,"ReportingPage",(function(){return ys})),n.d(t,"ReportExport",(function(){return Ks})),n.d(t,"Sparkline",(function(){return nu})),n.d(t,"Progressbar",(function(){return su})),n.d(t,"ContentIntro",(function(){return uu})),n.d(t,"ContentTable",(function(){return pu})),n.d(t,"AjaxForm",(function(){return yu})),"undefined"!==typeof window){var r=window.document.currentScript,i=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);i&&(n.p=i[1])}n("2342");var a=n("8bbf");function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function c(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),e}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
/*!
* Matomo - free/libre analytics platform
*
@@ -547,13 +547,20 @@ function du(){return{restrict:"A",link:function(e,t){uu.mounted(t[0])}}}window.a
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */function ju(e){return{restrict:"A",scope:{submitApiMethod:"=",sendJsonPayload:"=",noErrorNotification:"=",noSuccessNotification:"=",useCustomDataBinding:"="},require:"?ngModel",transclude:!0,compile:function(t,n){return n.noErrorNotification=!!n.noErrorNotification,function(t,n,r,i,o){if(!t.submitApiMethod)throw new Error("submitApiMethod is required");if(t.ajaxForm={},t.ajaxForm.submitApiMethod=t.submitApiMethod,t.ajaxForm.sendJsonPayload=t.sendJsonPayload,t.ajaxForm.noErrorNotification=t.noErrorNotification,t.ajaxForm.noSuccessNotification=t.noSuccessNotification,t.ajaxForm.data={},i){var l=e(r.ngModel);t.ajaxForm.data=l(t.$parent)}var c={mounted:function(e,n){t.ajaxForm.submitForm=n.value.submitForm}},s='\n <AjaxForm\n :form-data="data"\n :submit-api-method="submitApiMethod"\n :send-json-payload="sendJsonPayload"\n :no-error-notification="noErrorNotification"\n :no-success-notification="noSuccessNotification"\n >\n <template v-slot:default="ajaxFormVue">\n <div\n ref="transcludeTarget"\n v-special-bind-directive="{ submitForm: ajaxFormVue.submitForm }"\n />\n </template>\n </AjaxForm>',u=ut({template:s,data:function(){return t.ajaxForm},setup:function(){var e=Object(a["ref"])(null);return{transcludeTarget:e}}});u.component("AjaxForm",yu),u.directive("SpecialBindDirective",c);var d=u.mount(n[0]);function p(e,n){var r,i=Ou(e).attr("name");r="checkbox"===Ou(e).attr("type")?Ou(e).is(":checked"):Ou(e).val(),t.ajaxForm.data[i]=r,n||setTimeout((function(){t.$apply()}),0)}n.on("$destroy",(function(){u.unmount()})),t.useCustomDataBinding||n.on("change","input,select",(function(e){p(e.target)})),o(t,(function(e,t){if(!t.useCustomDataBinding){var n=e.find("input,select").not("[type=submit]");n.each((function(){p(this,!0)}))}Ou(d.transcludeTarget).append(e)}))}}}}ju.$inject=["$parse"],window.angular.module("piwikApp").directive("piwikAjaxForm",ju);
+ */function ju(e){return{restrict:"A",scope:{submitApiMethod:"=",sendJsonPayload:"=",noErrorNotification:"=",noSuccessNotification:"=",useCustomDataBinding:"="},require:"?ngModel",transclude:!0,compile:function(t,n){return n.noErrorNotification=!!n.noErrorNotification,function(t,n,r,i,o){if(!t.submitApiMethod)throw new Error("submitApiMethod is required");if(t.ajaxForm={},t.ajaxForm.submitApiMethod=t.submitApiMethod,t.ajaxForm.sendJsonPayload=t.sendJsonPayload,t.ajaxForm.noErrorNotification=t.noErrorNotification,t.ajaxForm.noSuccessNotification=t.noSuccessNotification,t.ajaxForm.data={},i){var l=e(r.ngModel);t.ajaxForm.data=l(t.$parent)}var c={mounted:function(e,n){t.ajaxForm.submitForm=n.value.submitForm}},s='\n <AjaxForm\n :form-data="data"\n :submit-api-method="submitApiMethod"\n :send-json-payload="sendJsonPayload"\n :no-error-notification="noErrorNotification"\n :no-success-notification="noSuccessNotification"\n >\n <template v-slot:default="ajaxFormVue">\n <div\n ref="transcludeTarget"\n v-special-bind-directive="{ submitForm: ajaxFormVue.submitForm }"\n />\n </template>\n </AjaxForm>',u=ut({template:s,data:function(){return t.ajaxForm},setup:function(){var e=Object(a["ref"])(null);return{transcludeTarget:e}}});u.component("AjaxForm",yu),u.directive("SpecialBindDirective",c);var d=u.mount(n[0]);function p(e,n){var r,i=Ou(e).attr("name");r="checkbox"===Ou(e).attr("type")?Ou(e).is(":checked"):Ou(e).val(),t.ajaxForm.data[i]=r,n||setTimeout((function(){t.$apply()}),0)}n.on("$destroy",(function(){u.unmount()})),t.useCustomDataBinding||n.on("change","input,select",(function(e){p(e.target)})),o(t,(function(e,t){if(!t.useCustomDataBinding){var n=e.find("input,select").not("[type=submit]");n.each((function(){p(this,!0)}))}Ou(d.transcludeTarget).append(e)}))}}}}
/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */var ku=jt({component:ho,scope:{loading:{vue:"loading",angularJsBind:"<"},loadingMessage:{vue:"loadingMessage",angularJsBind:"<",default:function(){return C("General_LoadingData")}}},$inject:[],directiveName:"piwikActivityIndicator"});function Su(e,t,n){var r=new Date;n||(n=432e4),r.setTime(r.getTime()+n),document.cookie="".concat(e,"=").concat(t,"; expires=").concat(r.toUTCString(),"; path=/")}function Cu(e){var t="; ".concat(document.cookie),n=t.split("; ".concat(e,"="));if(2==n.length){var r=n.pop().split(";").shift();if("undefined"!==typeof r)return r}return null}function Eu(e){var t=new Date;t.setTime(t.getTime()+-864e5),document.cookie="".concat(e,"=; expires=").concat(t.toUTCString(),"; path=/")}
+ */
+function ku(e,t){var n,r=parseInt(t,10),i=parseInt(e,10)-r;return n=0===i||Number.isNaN(i)?0:0===r||Number.isNaN(r)?100:i/r*100,n}function Su(e){return"".concat(e>0?S.numbers.symbolPlus:"").concat(Math.round(e),"}%")}function Cu(e,t){var n=ku(e,t);return Su(n)}
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */ju.$inject=["$parse"],window.angular.module("piwikApp").directive("piwikAjaxForm",ju);var Eu=jt({component:ho,scope:{loading:{vue:"loading",angularJsBind:"<"},loadingMessage:{vue:"loadingMessage",angularJsBind:"<",default:function(){return C("General_LoadingData")}}},$inject:[],directiveName:"piwikActivityIndicator"});function Du(e,t,n){var r=new Date;n||(n=432e4),r.setTime(r.getTime()+n),document.cookie="".concat(e,"=").concat(t,"; expires=").concat(r.toUTCString(),"; path=/")}function Pu(e){var t="; ".concat(document.cookie),n=t.split("; ".concat(e,"="));if(2==n.length){var r=n.pop().split(";").shift();if("undefined"!==typeof r)return r}return null}function Vu(e){var t=new Date;t.setTime(t.getTime()+-864e5),document.cookie="".concat(e,"=; expires=").concat(t.toUTCString(),"; path=/")}
/*!
* Matomo - free/libre analytics platform
*
diff --git a/plugins/CoreHome/vue/src/SiteSelector/Site.ts b/plugins/CoreHome/vue/src/SiteSelector/Site.ts
index ec30bb5885..ee3d818dbd 100644
--- a/plugins/CoreHome/vue/src/SiteSelector/Site.ts
+++ b/plugins/CoreHome/vue/src/SiteSelector/Site.ts
@@ -14,6 +14,7 @@ interface Site {
currency?: string;
timezone_name: string;
currency_name?: string;
+ main_url: string;
alias_urls: string[];
excluded_ips: string;
excluded_parameters: string;
diff --git a/plugins/CoreHome/vue/src/getFormattedEvolution.ts b/plugins/CoreHome/vue/src/getFormattedEvolution.ts
new file mode 100644
index 0000000000..84b8e57dec
--- /dev/null
+++ b/plugins/CoreHome/vue/src/getFormattedEvolution.ts
@@ -0,0 +1,37 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import Matomo from './Matomo/Matomo';
+
+function calculateEvolution(currentValue: string|number, pastValue: string|number) {
+ const pastValueParsed = parseInt(pastValue as string, 10);
+ const currentValueParsed = parseInt(currentValue as string, 10) - pastValueParsed;
+
+ let evolution: number;
+
+ if (currentValueParsed === 0 || Number.isNaN(currentValueParsed)) {
+ evolution = 0;
+ } else if (pastValueParsed === 0 || Number.isNaN(pastValueParsed)) {
+ evolution = 100;
+ } else {
+ evolution = (currentValueParsed / pastValueParsed) * 100;
+ }
+
+ return evolution;
+}
+
+function formatEvolution(evolution: number) {
+ return `${evolution > 0 ? Matomo.numbers.symbolPlus : ''}${Math.round(evolution)}}%`;
+}
+
+export default function getFormattedEvolution(
+ currentValue: string|number,
+ pastValue: string|number,
+): string {
+ const evolution = calculateEvolution(currentValue, pastValue);
+ return formatEvolution(evolution);
+}
diff --git a/plugins/CoreHome/vue/src/index.ts b/plugins/CoreHome/vue/src/index.ts
index 384ad5b484..3080549c03 100644
--- a/plugins/CoreHome/vue/src/index.ts
+++ b/plugins/CoreHome/vue/src/index.ts
@@ -60,6 +60,7 @@ export { default as createVueApp } from './createVueApp';
export { default as useExternalPluginComponent } from './useExternalPluginComponent';
export { default as DirectiveUtilities } from './directiveUtilities';
export { default as debounce } from './debounce';
+export { default as getFormattedEvolution } from './getFormattedEvolution';
export {
default as createAngularJsAdapter,
transformAngularJsBoolAttr,
diff --git a/plugins/CoreVue/types/index.d.ts b/plugins/CoreVue/types/index.d.ts
index 784ee26969..abef59d415 100644
--- a/plugins/CoreVue/types/index.d.ts
+++ b/plugins/CoreVue/types/index.d.ts
@@ -147,6 +147,7 @@ declare global {
hasSuperUserAccess: boolean;
language: string;
cacheBuster: string;
+ numbers: Record<string, string>;
updatePeriodParamsFromUrl(): void;
updateDateInTitle(date: string, period: string): void;
@@ -176,6 +177,12 @@ declare global {
scrollToAnchorInUrl(): void;
}
+ interface NumberFormatter {
+ formatNumber(value?: number|string): string;
+ formatPercent(value?: number|string): string;
+ formatCurrency(value?: number|string, currency: string): string;
+ }
+
interface Window {
angular: IAngularStatic;
globalAjaxQueue: GlobalAjaxQueue;
@@ -189,6 +196,7 @@ declare global {
anchorLinkFix: AnchorLinkFix;
$: JQueryStatic;
Piwik_Popover: PiwikPopoverGlobal;
+ NumberFormatter: NumberFormatter;
_pk_translate(translationStringId: string, values: string[]): string;
require(p: string): any;
diff --git a/plugins/MultiSites/MultiSites.php b/plugins/MultiSites/MultiSites.php
index 27bf465763..7b54b59178 100644
--- a/plugins/MultiSites/MultiSites.php
+++ b/plugins/MultiSites/MultiSites.php
@@ -19,7 +19,6 @@ class MultiSites extends \Piwik\Plugin
{
return array(
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
- 'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
'API.getPagesComparisonsDisabledFor' => 'getPagesComparisonsDisabledFor',
@@ -80,17 +79,8 @@ class MultiSites extends \Piwik\Plugin
$translations[] = 'MultiSites_EvolutionComparisonYear';
}
- public function getJsFiles(&$jsFiles)
- {
- $jsFiles[] = "plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js";
- $jsFiles[] = "plugins/MultiSites/angularjs/dashboard/dashboard.controller.js";
- $jsFiles[] = "plugins/MultiSites/angularjs/dashboard/dashboard.directive.js";
- $jsFiles[] = "plugins/MultiSites/angularjs/site/site.controller.js";
- $jsFiles[] = "plugins/MultiSites/angularjs/site/site.directive.js";
- }
-
public function getStylesheetFiles(&$stylesheets)
{
- $stylesheets[] = "plugins/MultiSites/angularjs/dashboard/dashboard.directive.less";
+ $stylesheets[] = "plugins/MultiSites/vue/src/Dashboard/Dashboard.less";
}
}
diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js b/plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js
deleted file mode 100644
index 32c2f404ca..0000000000
--- a/plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * Model for Multisites Dashboard aka All Websites Dashboard.
- */
-(function () {
- angular.module('piwikApp').factory('multisitesDashboardModel', multisitesDashboardModel);
-
- multisitesDashboardModel.$inject = ['piwikApi', '$filter', '$timeout'];
-
- function multisitesDashboardModel(piwikApi, $filter, $timeout) {
-
- var refreshPromise = null;
-
- // those sites are going to be displayed
- var model = {
- sites : [],
- isLoading : false,
- pageSize : 25,
- currentPage : 0,
- totalVisits : '?',
- totalPageviews : '?',
- totalActions : '?',
- totalRevenue : '?',
- searchTerm : '',
- lastVisits : '?',
- lastVisitsDate : '?',
- numberOfSites : 0,
- loadingMessage: _pk_translate('MultiSites_LoadingWebsites'),
- updateWebsitesList: updateWebsitesList,
- getNumberOfFilteredSites: getNumberOfFilteredSites,
- getNumberOfPages: getNumberOfPages,
- getPaginationLowerBound: getPaginationLowerBound,
- getPaginationUpperBound: getPaginationUpperBound,
- previousPage: previousPage,
- nextPage: nextPage,
- searchSite: searchSite,
- sortBy: sortBy,
- reverse: true,
- sortColumn: 'nb_visits',
- fetchAllSites: fetchAllSites,
- refreshInterval: 0
- };
-
- return model;
-
- function cancelRefereshInterval()
- {
- if (refreshPromise) {
- $timeout.cancel(refreshPromise);
- refreshPromise = null;
- };
- }
-
- function onError () {
- model.errorLoadingSites = true;
- model.sites = [];
- }
-
- function updateWebsitesList(report) {
- if (!report) {
- onError();
- return;
- }
-
- var allSites = report.sites;
- angular.forEach(allSites, function (site, index) {
-
- if (site.hasOwnProperty('ratio') && site.ratio != 1) {
- var percent = NumberFormatter.formatPercent(Math.round((site.ratio * 100)));
- var metricName = null;
- var previousTotal = 0;
- var currentTotal = 0;
- var evolution = 0;
- var previousTotalAdjusted = 0;
- if (model.sortColumn == 'nb_visits' || model.sortColumn == 'visits_evolution') {
- previousTotal = NumberFormatter.formatNumber(site.previous_nb_visits);
- currentTotal = NumberFormatter.formatNumber(site.nb_visits);
- evolution = NumberFormatter.formatPercent(site.visits_evolution);
- metricName = _pk_translate("General_ColumnNbVisits");
- previousTotalAdjusted = NumberFormatter.formatNumber(Math.round(site.previous_nb_visits * site.ratio));
- }
- if (model.sortColumn == 'pageviews_evolution') {
- previousTotal = site.previous_Actions_nb_pageviews;
- currentTotal = site.nb_pageviews;
- evolution = NumberFormatter.formatPercent(site.pageviews_evolution);
- metricName = _pk_translate("General_ColumnPageviews");
- previousTotalAdjusted = NumberFormatter.formatNumber(Math.round(site.previous_Actions_nb_pageviews * site.ratio));
- }
- if (model.sortColumn == 'revenue_evolution') {
- previousTotal = NumberFormatter.formatCurrency(site.previous_Goal_revenue, site.currencySymbol);
- currentTotal = NumberFormatter.formatCurrency(site.revenue, site.currencySymbol);
- evolution = NumberFormatter.formatPercent(site.revenue_evolution);
- metricName = _pk_translate("General_ColumnRevenue");
- previousTotalAdjusted = NumberFormatter.formatCurrency(Math.round(site.previous_Goal_revenue * site.ratio), site.currencySymbol);
- }
-
- if (metricName) {
- site.tooltip = _pk_translate("MultiSites_EvolutionComparisonIncomplete", [percent]) + "\n";
- site.tooltip += _pk_translate("MultiSites_EvolutionComparisonProportional", [percent, previousTotalAdjusted, metricName, previousTotal]) + "\n";
-
- switch (site.periodName) {
- case 'day':
- site.tooltip += _pk_translate("MultiSites_EvolutionComparisonDay", [currentTotal, metricName, previousTotalAdjusted, site.previousRange, evolution]);
- break;
- case 'week':
- site.tooltip += _pk_translate("MultiSites_EvolutionComparisonWeek", [currentTotal, metricName, previousTotalAdjusted, site.previousRange, evolution]);
- break;
- case 'month':
- site.tooltip += _pk_translate("MultiSites_EvolutionComparisonMonth", [currentTotal, metricName, previousTotalAdjusted, site.previousRange, evolution]);
- break;
- case 'year':
- site.tooltip += _pk_translate("MultiSites_EvolutionComparisonYear", [currentTotal, metricName, previousTotalAdjusted, site.previousRange, evolution]);
- break;
- }
- }
-
- }
- });
-
- model.totalVisits = report.totals.nb_visits;
- model.totalPageviews = report.totals.nb_pageviews;
- model.totalActions = report.totals.nb_actions;
- model.totalRevenue = report.totals.revenue;
- model.lastVisits = report.totals.nb_visits_lastdate;
- model.sites = allSites;
- model.numberOfSites = report.numSites;
- model.lastVisitsDate = report.lastDate;
- }
-
- function getNumberOfFilteredSites () {
- return model.numberOfSites;
- }
-
- function getNumberOfPages() {
- return Math.ceil(getNumberOfFilteredSites() / model.pageSize - 1);
- }
-
- function getCurrentPagingOffset() {
- return Math.ceil(model.currentPage * model.pageSize);
- }
-
- function getPaginationLowerBound() {
- return getCurrentPagingOffset() + 1;
- }
-
- function getPaginationUpperBound() {
- var end = getCurrentPagingOffset() + parseInt(model.pageSize, 10);
- var max = getNumberOfFilteredSites();
- if (end > max) {
- end = max;
- }
- return parseInt(end, 10);
- }
-
- function sortBy(metric) {
- if (model.sortColumn == metric) {
- model.reverse = !model.reverse;
- }
-
- model.sortColumn = metric;
- fetchAllSites();
- }
-
- function previousPage() {
- model.currentPage = model.currentPage - 1;
- fetchAllSites();
- }
-
- function nextPage() {
- model.currentPage = model.currentPage + 1;
- fetchAllSites();
- }
-
- function searchSite (term) {
- model.searchTerm = term;
- model.currentPage = 0;
- fetchAllSites();
- }
-
- function fetchAllSites() {
-
- if (model.isLoading) {
- piwikApi.abort();
- cancelRefereshInterval();
- }
-
- model.isLoading = true;
- model.errorLoadingSites = false;
-
- var params = {
- module: 'MultiSites',
- action: 'getAllWithGroups',
- hideMetricsDoc: '1',
- filter_sort_order: 'asc',
- filter_limit: model.pageSize,
- filter_offset: getCurrentPagingOffset(),
- showColumns: 'label,nb_visits,nb_pageviews,visits_evolution,visits_evolution_trend,pageviews_evolution,pageviews_evolution_trend,revenue_evolution,revenue_evolution_trend,nb_actions,revenue'
- };
-
- if (model.searchTerm) {
- params.pattern = model.searchTerm;
- }
-
- if (model.sortColumn) {
- params.filter_sort_column = model.sortColumn;
- }
-
- if (model.reverse) {
- params.filter_sort_order = 'desc';
- }
-
- return piwikApi.fetch(params).then(function (response) {
- updateWebsitesList(response);
- }, onError).finally(function () {
- model.isLoading = false;
-
- if (model.refreshInterval && model.refreshInterval > 0) {
- cancelRefereshInterval();
-
- refreshPromise = $timeout(function () {
- refreshPromise = null;
- fetchAllSites(model.refreshInterval);
- }, model.refreshInterval * 1000);
- }
- });
- }
- }
-})();
diff --git a/plugins/MultiSites/angularjs/site/site.controller.js b/plugins/MultiSites/angularjs/site/site.controller.js
deleted file mode 100644
index 9237ec25a3..0000000000
--- a/plugins/MultiSites/angularjs/site/site.controller.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-(function () {
- angular.module('piwikApp').controller('MultiSitesSiteController', MultiSitesSiteController);
-
- MultiSitesSiteController.$inject = ['$scope', 'piwik'];
-
- function MultiSitesSiteController($scope, piwik){
-
- $scope.period = piwik.period;
- $scope.date = piwik.broadcast.getValueFromUrl('date');
- $scope.dashboardUrl = dashboardUrl;
- $scope.sparklineImage = sparklineImage;
- $scope.website.label = piwik.helper.htmlDecode($scope.website.label);
-
- this.getWebsite = function () {
- return $scope.website;
- };
-
- function tokenParam() {
- var token_auth = piwik.broadcast.getValueFromUrl('token_auth');
- return token_auth.length ? '&token_auth=' + token_auth : '';
- }
-
- function dashboardUrl(website){
- return 'index.php?module=CoreHome&action=index&date=' + $scope.date + '&period=' + $scope.period + '&idSite=' + website.idsite + tokenParam();
- }
-
- function sparklineImage(website){
- var metric = $scope.metric;
-
- switch ($scope.evolutionMetric) {
- case 'visits_evolution':
- metric = 'nb_visits';
- break;
- case 'pageviews_evolution':
- metric = 'nb_pageviews';
- break;
- case 'revenue_evolution':
- metric = 'revenue';
- break;
- }
-
- return 'index.php?module=MultiSites&action=getEvolutionGraph&period=' + $scope.period + '&date=' + $scope.dateSparkline + '&evolutionBy=' + metric + '&columns=' + metric + '&idSite=' + website.idsite + '&idsite=' + website.idsite + '&viewDataTable=sparkline' + tokenParam() + '&colors=' + encodeURIComponent(JSON.stringify(piwik.getSparklineColors()));
- }
- }
-})();
diff --git a/plugins/MultiSites/angularjs/site/site.directive.html b/plugins/MultiSites/angularjs/site/site.directive.html
deleted file mode 100644
index a013bae07e..0000000000
--- a/plugins/MultiSites/angularjs/site/site.directive.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<tr ng-class="{'groupedWebsite': website.group, 'website': !website.group, 'group': website.isGroup}">
- <td ng-if="!website.isGroup" class="multisites-label label">
- <a title="View reports" ng-href="{{ dashboardUrl(website) }}" class="value truncated-text-line">{{ website.label }}</a>
-
- <span>
- <a rel="noreferrer noopener" target="_blank" title="{{ 'General_GoTo'|translate:website.main_url }}" ng-href="{{ website.main_url }}">
- <span class="icon icon-outlink"></span></a>
- </span>
- </td>
- <td ng-if="website.isGroup" class="multisites-label label">
- <span class="value">{{ website.label }}</span>
- </td>
- <td class="multisites-column">
- <span class="value">{{ website.nb_visits }}</span>
- </td>
- <td class="multisites-column">
- <span class="value">{{ website.nb_pageviews }}</span>
- </td>
- <td ng-if="displayRevenueColumn" class="multisites-column">
- <span class="value">{{ website.revenue }}</span>
- </td>
-
- <td ng-if="period != 'range'" class="multisites-evolution" title="{{ website.tooltip }}">
- <div class="visits value" ng-if="!website.isGroup">
- <span ng-show="website[evolutionMetric+'_trend'] == 1"><img class="multisites_icon" src="plugins/MultiSites/images/arrow_up.png" alt="" /> <span style="color: green;">{{ website[evolutionMetric] }}</span></span>
- <span ng-show="website[evolutionMetric+'_trend'] == 0"><img class="multisites_icon" src="plugins/MultiSites/images/stop.png" alt="" /> <span>{{ website[evolutionMetric] }}</span></span>
- <span ng-show="website[evolutionMetric+'_trend'] == -1"><img class="multisites_icon" src="plugins/MultiSites/images/arrow_down.png" alt="" /> <span style="color: red;">{{ website[evolutionMetric] }}</span></span>
- </div>
- </td>
-
- <td ng-if="showSparklines" style="width:180px;">
- <div ng-if="!website.isGroup" class="sparkline" style="width: 100px; margin: auto;">
- <a rel="noreferrer noopener" target="_blank" ng-href="{{ dashboardUrl(website) }}"
- title="{{ 'General_GoTo'|translate:('Dashboard_DashboardOf'|translate:website.label) }}">
- <img alt="" ng-src="{{ sparklineImage(website) }}" width="100" height="25" />
- </a>
- </div>
- </td>
-</tr>
-
diff --git a/plugins/MultiSites/angularjs/site/site.directive.js b/plugins/MultiSites/angularjs/site/site.directive.js
deleted file mode 100644
index 77fd683185..0000000000
--- a/plugins/MultiSites/angularjs/site/site.directive.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*!
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Renders a single website row, for instance to be used within the MultiSites Dashboard.
- *
- * Usage:
- * <div piwik-multisites-site>
- * website="{label: 'Name', main_url: 'http://...', idsite: '...'}"
- * evolution-metric="visits_evolution"
- * show-sparklines="true"
- * date-sparkline="2014-01-01,2014-02-02"
- * display-revenue-column="true"
- * </div>
- */
-(function () {
- angular.module('piwikApp').directive('piwikMultisitesSite', piwikMultisitesSite);
-
- piwikMultisitesSite.$inject = ['piwik'];
-
- function piwikMultisitesSite(piwik){
-
- return {
- restrict: 'AC',
- replace: true,
- scope: {
- website: '=',
- evolutionMetric: '=',
- showSparklines: '=',
- dateSparkline: '=',
- displayRevenueColumn: '=',
- metric: '='
- },
- templateUrl: 'plugins/MultiSites/angularjs/site/site.directive.html?cb=' + piwik.cacheBuster,
- controller: 'MultiSitesSiteController'
- };
- }
-})(); \ No newline at end of file
diff --git a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites.png b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites.png
index 5fa5c07d42..4664788cdd 100644
--- a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites.png
+++ b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:10628683cd359569c35511396c326065e971e93693e6b8a3a747d2b7deb9d1bb
-size 282157
+oid sha256:5ae87d5a3294e50aad3d9901c35134cdc6875e4ddd826c661656be29a4523790
+size 281871
diff --git a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_changed_sort_order.png b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_changed_sort_order.png
index c6d2572126..d76e603796 100644
--- a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_changed_sort_order.png
+++ b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_changed_sort_order.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4c40a6f0595736de832b0f5443c5cc6ba962a0dbf8da686ef3ca60f513763c5d
-size 56157
+oid sha256:0433d72ccf6e4d9adcc3889d5de2d971371b7d2751e5e18cd8c18be88babd576
+size 56026
diff --git a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_page_1.png b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_page_1.png
index b58f3c9426..e554392cf2 100644
--- a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_page_1.png
+++ b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_page_1.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8b3f3dcc869143f0cde259da590f424f2c2383b592518112938ac7db9527633b
-size 73017
+oid sha256:ebb8da5af6638c76f19f30ab9b5b8883d5c82a228d80897ec19ad75b1f5340d3
+size 72797
diff --git a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_range.png b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_range.png
index c735b5fe75..23ef1613c8 100644
--- a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_range.png
+++ b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_range.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ca5cdfdbcc53b91c26c0d2a5fadd06857dedbd0b4dc608b865c5aa62a7b0d2ff
-size 245998
+oid sha256:635c97270639541031b26d277eb5f90e3ed6cba2089b7fb4dd93758ba1753c53
+size 245690
diff --git a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_search.png b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_search.png
index 031adb7170..9773098ffd 100644
--- a/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_search.png
+++ b/plugins/MultiSites/tests/UI/expected-screenshots/MultiSitesTest_all_websites_search.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c1d370fdaff480f0b81da0f8fd994dffce5cb1bb7b4ba37076b1b888c3c46705
-size 56187
+oid sha256:658d929e130416681ac6c0062a632516f4f0dd5b9047d8e9ba1488ef5dfc7fa3
+size 56062
diff --git a/plugins/MultiSites/vue/dist/MultiSites.umd.js b/plugins/MultiSites/vue/dist/MultiSites.umd.js
new file mode 100644
index 0000000000..abc2461684
--- /dev/null
+++ b/plugins/MultiSites/vue/dist/MultiSites.umd.js
@@ -0,0 +1,1140 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory(require("CoreHome"), require("vue"));
+ else if(typeof define === 'function' && define.amd)
+ define(["CoreHome", ], factory);
+ else if(typeof exports === 'object')
+ exports["MultiSites"] = factory(require("CoreHome"), require("vue"));
+ else
+ root["MultiSites"] = factory(root["CoreHome"], root["Vue"]);
+})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__19dc__, __WEBPACK_EXTERNAL_MODULE__8bbf__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "plugins/MultiSites/vue/dist/";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "fae3");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "19dc":
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__19dc__;
+
+/***/ }),
+
+/***/ "8bbf":
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__;
+
+/***/ }),
+
+/***/ "fae3":
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, "MultisitesSite", function() { return /* reexport */ MultisitesSite; });
+__webpack_require__.d(__webpack_exports__, "DashboadStore", function() { return /* reexport */ Dashboard_store; });
+__webpack_require__.d(__webpack_exports__, "Dashboard", function() { return /* reexport */ Dashboard; });
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
+// This file is imported into lib/wc client bundles.
+
+if (typeof window !== 'undefined') {
+ var currentScript = window.document.currentScript
+ if (false) { var getCurrentScript; }
+
+ var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/)
+ if (src) {
+ __webpack_require__.p = src[1] // eslint-disable-line
+ }
+}
+
+// Indicate to webpack that this file can be concatenated
+/* harmony default export */ var setPublicPath = (null);
+
+// EXTERNAL MODULE: external "CoreHome"
+var external_CoreHome_ = __webpack_require__("19dc");
+
+// EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"}
+var external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__("8bbf");
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue?vue&type=template&id=96049642
+
+var _hoisted_1 = {
+ key: 0,
+ class: "multisites-label label"
+};
+var _hoisted_2 = ["href"];
+var _hoisted_3 = ["href", "title"];
+
+var _hoisted_4 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: "icon icon-outlink"
+}, null, -1);
+
+var _hoisted_5 = [_hoisted_4];
+var _hoisted_6 = {
+ key: 1,
+ class: "multisites-label label"
+};
+var _hoisted_7 = {
+ class: "value"
+};
+var _hoisted_8 = {
+ class: "multisites-column"
+};
+var _hoisted_9 = {
+ class: "value"
+};
+var _hoisted_10 = {
+ class: "multisites-column"
+};
+var _hoisted_11 = {
+ class: "value"
+};
+var _hoisted_12 = {
+ key: 2,
+ class: "multisites-column"
+};
+var _hoisted_13 = {
+ class: "value"
+};
+var _hoisted_14 = ["title"];
+var _hoisted_15 = {
+ key: 0,
+ class: "visits value"
+};
+
+var _hoisted_16 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", {
+ class: "multisites_icon",
+ src: "plugins/MultiSites/images/arrow_up.png",
+ alt: ""
+}, null, -1);
+
+var _hoisted_17 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])();
+
+var _hoisted_18 = {
+ style: {
+ "color": "green"
+ }
+};
+
+var _hoisted_19 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", {
+ class: "multisites_icon",
+ src: "plugins/MultiSites/images/stop.png",
+ alt: ""
+}, null, -1);
+
+var _hoisted_20 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])();
+
+var _hoisted_21 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", {
+ class: "multisites_icon",
+ src: "plugins/MultiSites/images/arrow_down.png",
+ alt: ""
+}, null, -1);
+
+var _hoisted_22 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])();
+
+var _hoisted_23 = {
+ style: {
+ "color": "red"
+ }
+};
+var _hoisted_24 = {
+ key: 4,
+ style: {
+ "width": "180px"
+ }
+};
+var _hoisted_25 = {
+ key: 0,
+ class: "sparkline",
+ style: {
+ "width": "100px",
+ "margin": "auto"
+ }
+};
+var _hoisted_26 = ["href", "title"];
+var _hoisted_27 = ["src"];
+function render(_ctx, _cache, $props, $setup, $data, $options) {
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])({
+ 'groupedWebsite': _ctx.website.group,
+ 'website': !_ctx.website.group,
+ 'group': _ctx.website.isGroup
+ })
+ }, [!_ctx.website.isGroup ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", {
+ title: "View reports",
+ class: "value truncated-text-line",
+ href: _ctx.dashboardUrl(_ctx.website)
+ }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.websiteLabel), 9, _hoisted_2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", {
+ rel: "noreferrer noopener",
+ target: "_blank",
+ href: _ctx.website.main_url,
+ title: _ctx.translate('General_GoTo', _ctx.website.main_url)
+ }, _hoisted_5, 8, _hoisted_3)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.website.isGroup ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_6, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_7, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.websiteLabel), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_8, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_9, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website.nb_visits), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_10, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_11, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website.nb_pageviews), 1)]), _ctx.displayRevenueColumn ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_13, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website.revenue), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.period !== 'range' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", {
+ key: 3,
+ class: "multisites-evolution",
+ title: _ctx.website.tooltip
+ }, [!_ctx.website.isGroup ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_15, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [_hoisted_16, _hoisted_17, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_18, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website[_ctx.evolutionMetric]), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.website["".concat(_ctx.evolutionMetric, "_trend")] === 1]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [_hoisted_19, _hoisted_20, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website[_ctx.evolutionMetric]), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.website["".concat(_ctx.evolutionMetric, "_trend")] === 0]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [_hoisted_21, _hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_23, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.website[_ctx.evolutionMetric]), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.website["".concat(_ctx.evolutionMetric, "_trend")] === -1]])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 8, _hoisted_14)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.showSparklines ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_24, [!_ctx.website.isGroup ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_25, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", {
+ rel: "noreferrer noopener",
+ target: "_blank",
+ href: _ctx.dashboardUrl(_ctx.website),
+ title: _ctx.translate('General_GoTo', _ctx.translate('Dashboard_DashboardOf', _ctx.websiteLabel))
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("img", {
+ alt: "",
+ width: "100",
+ height: "25",
+ src: _ctx.sparklineImage(_ctx.website)
+ }, null, 8, _hoisted_27)], 8, _hoisted_26)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 2);
+}
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue?vue&type=template&id=96049642
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue?vue&type=script&lang=ts
+
+
+/* harmony default export */ var MultisitesSitevue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
+ props: {
+ website: {
+ type: Object,
+ required: true
+ },
+ evolutionMetric: {
+ type: String,
+ required: true
+ },
+ showSparklines: Boolean,
+ dateSparkline: String,
+ displayRevenueColumn: Boolean,
+ metric: String
+ },
+ methods: {
+ dashboardUrl: function dashboardUrl(website) {
+ return "index.php?module=CoreHome&action=index&date=".concat(this.date, "&period=").concat(this.period) + "&idSite=".concat(website.idsite).concat(this.tokenParam);
+ },
+ sparklineImage: function sparklineImage(website) {
+ var metric = this.metric;
+
+ switch (this.evolutionMetric) {
+ case 'visits_evolution':
+ metric = 'nb_visits';
+ break;
+
+ case 'pageviews_evolution':
+ metric = 'nb_pageviews';
+ break;
+
+ case 'revenue_evolution':
+ metric = 'revenue';
+ break;
+
+ default:
+ break;
+ }
+
+ return "index.php?module=MultiSites&action=getEvolutionGraph&period=".concat(this.period, "&date=") + "".concat(this.dateSparkline, "&evolutionBy=").concat(metric, "&columns=").concat(metric, "&idSite=").concat(website.idsite) + "&idsite=".concat(website.idsite, "&viewDataTable=sparkline").concat(this.tokenParam, "&colors=") + "".concat(encodeURIComponent(JSON.stringify(external_CoreHome_["Matomo"].getSparklineColors())));
+ }
+ },
+ computed: {
+ tokenParam: function tokenParam() {
+ var token_auth = external_CoreHome_["MatomoUrl"].urlParsed.value.token_auth;
+ return token_auth ? "&token_auth=".concat(token_auth) : '';
+ },
+ period: function period() {
+ return external_CoreHome_["Matomo"].period;
+ },
+ date: function date() {
+ return external_CoreHome_["MatomoUrl"].urlParsed.value.date;
+ },
+ websiteLabel: function websiteLabel() {
+ return external_CoreHome_["Matomo"].helper.htmlDecode(this.website.label);
+ }
+ }
+}));
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue?vue&type=script&lang=ts
+
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue
+
+
+
+MultisitesSitevue_type_script_lang_ts.render = render
+
+/* harmony default export */ var MultisitesSite = (MultisitesSitevue_type_script_lang_ts);
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+/* harmony default export */ var MultisitesSite_adapter = (Object(external_CoreHome_["createAngularJsAdapter"])({
+ component: MultisitesSite,
+ scope: {
+ website: {
+ angularJsBind: '='
+ },
+ evolutionMetric: {
+ angularJsBind: '='
+ },
+ showSparklines: {
+ angularJsBind: '='
+ },
+ dateSparkline: {
+ angularJsBind: '='
+ },
+ displayRevenueColumn: {
+ angularJsBind: '='
+ },
+ metric: {
+ angularJsBind: '='
+ }
+ },
+ directiveName: 'piwikMultisitesSite'
+}));
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/MultiSites/vue/src/Dashboard/Dashboard.vue?vue&type=template&id=3809d5a2
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_1 = {
+ class: "card-title"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_2 = ["innerHTML", "title"];
+var Dashboardvue_type_template_id_3809d5a2_hoisted_3 = {
+ id: "mt",
+ class: "dataTable card-table",
+ cellspacing: "0"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_4 = {
+ class: "heading"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_5 = {
+ class: "heading"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_6 = {
+ class: "heading"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_7 = {
+ class: "heading"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_8 = ["colspan"];
+var Dashboardvue_type_template_id_3809d5a2_hoisted_9 = ["value"];
+var Dashboardvue_type_template_id_3809d5a2_hoisted_10 = {
+ value: "visits_evolution"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_11 = {
+ value: "pageviews_evolution"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_12 = {
+ key: 0,
+ value: "revenue_evolution"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_13 = {
+ key: 0
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_14 = {
+ colspan: "7",
+ class: "allWebsitesLoading"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_15 = {
+ key: 1
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_16 = {
+ key: 0
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_17 = {
+ colspan: "7"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_18 = {
+ class: "notification system notification-error"
+};
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_19 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1);
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_20 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1);
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_21 = {
+ rel: "noreferrer noopener",
+ target: "_blank",
+ href: "https://matomo.org/faq/troubleshooting/faq_19489/"
+};
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_22 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" – ");
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_23 = {
+ rel: "noreferrer noopener",
+ target: "_blank",
+ href: "https://forum.matomo.org/"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_24 = ["href"];
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_25 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(". ");
+
+var Dashboardvue_type_template_id_3809d5a2_hoisted_26 = {
+ colspan: "8",
+ class: "paging"
+};
+var Dashboardvue_type_template_id_3809d5a2_hoisted_27 = {
+ class: "row"
+};
+var _hoisted_28 = {
+ class: "col s3 add_new_site"
+};
+var _hoisted_29 = ["href"];
+
+var _hoisted_30 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: "icon-add"
+}, null, -1);
+
+var _hoisted_31 = {
+ class: "col s6"
+};
+var _hoisted_32 = {
+ style: {
+ "cursor": "pointer"
+ }
+};
+var _hoisted_33 = {
+ class: "dataTablePages"
+};
+var _hoisted_34 = {
+ id: "counter"
+};
+var _hoisted_35 = {
+ style: {
+ "cursor": "pointer"
+ },
+ class: "pointer"
+};
+
+var _hoisted_36 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", {
+ class: "col s3"
+}, " ", -1);
+
+var _hoisted_37 = {
+ row_id: "last"
+};
+var _hoisted_38 = {
+ colspan: "8",
+ class: "site_search"
+};
+var _hoisted_39 = {
+ class: "row"
+};
+var _hoisted_40 = {
+ class: "input-field col s12"
+};
+var _hoisted_41 = ["placeholder"];
+var _hoisted_42 = ["title"];
+function Dashboardvue_type_template_id_3809d5a2_render(_ctx, _cache, $props, $setup, $data, $options) {
+ var _this = this;
+
+ var _component_EnrichedHeadline = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("EnrichedHeadline");
+
+ var _component_ActivityIndicator = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ActivityIndicator");
+
+ var _component_MultisitesSite = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("MultisitesSite");
+
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", Dashboardvue_type_template_id_3809d5a2_hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_EnrichedHeadline, {
+ "help-url": "https://matomo.org/docs/manage-websites/#all-websites-dashboard",
+ "feature-name": _ctx.translate('General_AllWebsitesDashboard')
+ }, {
+ default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () {
+ return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_AllWebsitesDashboard')) + " ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: "smallTitle",
+ innerHTML: _ctx.$sanitize(_this.smallTitleContent),
+ title: _ctx.smallTitleTooltip
+ }, null, 8, Dashboardvue_type_template_id_3809d5a2_hoisted_2)];
+ }),
+ _: 1
+ }, 8, ["feature-name"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("table", Dashboardvue_type_template_id_3809d5a2_hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("thead", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", {
+ id: "names",
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["label", {
+ columnSorted: 'label' === _ctx.sortColumn
+ }]),
+ onClick: _cache[0] || (_cache[0] = function ($event) {
+ return _ctx.sortBy('label');
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", Dashboardvue_type_template_id_3809d5a2_hoisted_4, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Website')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["arrow", {
+ multisites_asc: !_ctx.reverse && 'label' === _ctx.sortColumn,
+ multisites_desc: _ctx.reverse && 'label' === _ctx.sortColumn
+ }]),
+ style: {
+ "margin-left": "3.5px"
+ }
+ }, null, 2)], 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", {
+ id: "visits",
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["multisites-column", {
+ columnSorted: 'nb_visits' === _ctx.sortColumn
+ }]),
+ onClick: _cache[1] || (_cache[1] = function ($event) {
+ return _ctx.sortBy('nb_visits');
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["arrow", {
+ multisites_asc: !_ctx.reverse && 'nb_visits' === _ctx.sortColumn,
+ multisites_desc: _ctx.reverse && 'nb_visits' === _ctx.sortColumn
+ }]),
+ style: {
+ "margin-right": "3.5px"
+ }
+ }, null, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", Dashboardvue_type_template_id_3809d5a2_hoisted_5, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnNbVisits')), 1)], 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", {
+ id: "pageviews",
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["multisites-column", {
+ columnSorted: 'nb_pageviews' === _ctx.sortColumn
+ }]),
+ onClick: _cache[2] || (_cache[2] = function ($event) {
+ return _ctx.sortBy('nb_pageviews');
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["arrow", {
+ multisites_asc: !_ctx.reverse && 'nb_pageviews' === _ctx.sortColumn,
+ multisites_desc: _ctx.reverse && 'nb_pageviews' === _ctx.sortColumn
+ }]),
+ style: {
+ "margin-right": "3.5px"
+ }
+ }, null, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", Dashboardvue_type_template_id_3809d5a2_hoisted_6, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnPageviews')), 1)], 2), _ctx.displayRevenueColumn ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", {
+ key: 0,
+ id: "revenue",
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["multisites-column", {
+ columnSorted: 'revenue' === _ctx.sortColumn
+ }]),
+ onClick: _cache[3] || (_cache[3] = function ($event) {
+ return _ctx.sortBy('revenue');
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["arrow", {
+ multisites_asc: !_ctx.reverse && 'revenue' === _ctx.sortColumn,
+ multisites_desc: _ctx.reverse && 'revenue' === _ctx.sortColumn
+ }]),
+ style: {
+ "margin-right": "3.5px"
+ }
+ }, null, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", Dashboardvue_type_template_id_3809d5a2_hoisted_7, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnRevenue')), 1)], 2)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", {
+ id: "evolution",
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])({
+ columnSorted: _ctx.evolutionSelector === _ctx.sortColumn
+ }),
+ colspan: _ctx.showSparklines ? 2 : 1
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["normalizeClass"])(["arrow", {
+ multisites_asc: !_ctx.reverse && _ctx.evolutionSelector === _ctx.sortColumn,
+ multisites_desc: _ctx.reverse && _ctx.evolutionSelector === _ctx.sortColumn
+ }]),
+ style: {
+ "margin-right": "3.5px"
+ }
+ }, null, 2), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: "evolution",
+ onClick: _cache[4] || (_cache[4] = function ($event) {
+ return _ctx.sortBy(_ctx.evolutionSelector);
+ }),
+ style: {
+ "margin-right": "3.5px"
+ }
+ }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('MultiSites_Evolution')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("select", {
+ class: "selector browser-default",
+ id: "evolution_selector",
+ value: _ctx.evolutionSelector,
+ onChange: _cache[5] || (_cache[5] = function ($event) {
+ _ctx.evolutionSelector = $event.target.value;
+
+ _ctx.sortBy(_ctx.evolutionSelector);
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("option", Dashboardvue_type_template_id_3809d5a2_hoisted_10, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnNbVisits')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("option", Dashboardvue_type_template_id_3809d5a2_hoisted_11, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnPageviews')), 1), _ctx.displayRevenueColumn ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("option", Dashboardvue_type_template_id_3809d5a2_hoisted_12, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnRevenue')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 40, Dashboardvue_type_template_id_3809d5a2_hoisted_9)], 10, Dashboardvue_type_template_id_3809d5a2_hoisted_8)])]), _ctx.isLoading ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tbody", Dashboardvue_type_template_id_3809d5a2_hoisted_13, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", Dashboardvue_type_template_id_3809d5a2_hoisted_14, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ActivityIndicator, {
+ "loading-message": _ctx.loadingMessage,
+ loading: _ctx.isLoading
+ }, null, 8, ["loading-message", "loading"])])])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), !_ctx.isLoading ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tbody", Dashboardvue_type_template_id_3809d5a2_hoisted_15, [_ctx.errorLoadingSites ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", Dashboardvue_type_template_id_3809d5a2_hoisted_16, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", Dashboardvue_type_template_id_3809d5a2_hoisted_17, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", Dashboardvue_type_template_id_3809d5a2_hoisted_18, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ErrorRequest', '', '')) + " ", 1), Dashboardvue_type_template_id_3809d5a2_hoisted_19, Dashboardvue_type_template_id_3809d5a2_hoisted_20, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_NeedMoreHelp')) + " ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", Dashboardvue_type_template_id_3809d5a2_hoisted_21, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Faq')), 1), Dashboardvue_type_template_id_3809d5a2_hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", Dashboardvue_type_template_id_3809d5a2_hoisted_23, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Feedback_CommunityHelp')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, " – ", 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.areAdsForProfessionalServicesEnabled]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", {
+ rel: "noreferrer noopener",
+ target: "_blank",
+ href: _ctx.professionalHelpUrl
+ }, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Feedback_ProfessionalHelp')), 9, Dashboardvue_type_template_id_3809d5a2_hoisted_24), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.areAdsForProfessionalServicesEnabled]]), Dashboardvue_type_template_id_3809d5a2_hoisted_25])])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.sites, function (website) {
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_MultisitesSite, {
+ key: website.idsite,
+ website: website,
+ "evolution-metric": _ctx.evolutionSelector,
+ "date-sparkline": _ctx.dateSparkline,
+ "show-sparklines": _ctx.showSparklines,
+ metric: _ctx.sortColumn,
+ "display-revenue-column": _ctx.displayRevenueColumn
+ }, null, 8, ["website", "evolution-metric", "date-sparkline", "show-sparklines", "metric", "display-revenue-column"]);
+ }), 128))])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tfoot", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", Dashboardvue_type_template_id_3809d5a2_hoisted_26, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", Dashboardvue_type_template_id_3809d5a2_hoisted_27, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_28, [_ctx.hasSuperUserAccess ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("a", {
+ key: 0,
+ href: _ctx.addSiteUrl
+ }, [_hoisted_30, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('SitesManager_AddSite')), 1)], 8, _hoisted_29)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_31, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ id: "prev",
+ class: "previous dataTablePrevious",
+ onClick: _cache[6] || (_cache[6] = function ($event) {
+ return _ctx.previousPage();
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_32, "« " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Previous')), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], !(_ctx.currentPage === 0)]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_33, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_34, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Pagination', _ctx.paginationLowerBound, _ctx.paginationUpperBound, _ctx.numberOfFilteredSites)), 1)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ id: "next",
+ class: "next dataTableNext",
+ onClick: _cache[7] || (_cache[7] = function ($event) {
+ return _ctx.nextPage();
+ })
+ }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_35, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Next')) + " »", 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], !(_ctx.currentPage >= _ctx.numberOfPages)]])]), _hoisted_36])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", _hoisted_37, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_38, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_39, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_40, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", {
+ type: "text",
+ onKeydown: _cache[8] || (_cache[8] = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withKeys"])(function ($event) {
+ return _ctx.searchSite(_ctx.searchTerm);
+ }, ["enter"])),
+ "onUpdate:modelValue": _cache[9] || (_cache[9] = function ($event) {
+ return _ctx.searchTerm = $event;
+ }),
+ placeholder: _ctx.translate('Actions_SubmenuSitesearch')
+ }, null, 40, _hoisted_41), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vModelText"], _ctx.searchTerm]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", {
+ class: "icon-search search_ico",
+ onClick: _cache[10] || (_cache[10] = function ($event) {
+ return _ctx.searchSite(_ctx.searchTerm);
+ }),
+ title: _ctx.translate('General_ClickToSearch')
+ }, null, 8, _hoisted_42)])])])])])])]);
+}
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/Dashboard/Dashboard.vue?vue&type=template&id=3809d5a2
+
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/Dashboard/Dashboard.store.ts
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+var _window = window,
+ NumberFormatter = _window.NumberFormatter;
+
+var Dashboard_store_DashboardStore = /*#__PURE__*/function () {
+ function DashboardStore() {
+ var _this = this;
+
+ _classCallCheck(this, DashboardStore);
+
+ _defineProperty(this, "privateState", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["reactive"])({
+ sites: [],
+ isLoading: false,
+ pageSize: 25,
+ currentPage: 0,
+ totalVisits: '?',
+ totalPageviews: '?',
+ totalActions: '?',
+ totalRevenue: '?',
+ searchTerm: '',
+ lastVisits: '?',
+ lastVisitsDate: '?',
+ numberOfSites: 0,
+ loadingMessage: Object(external_CoreHome_["translate"])('MultiSites_LoadingWebsites'),
+ reverse: true,
+ sortColumn: 'nb_visits',
+ refreshInterval: 0,
+ errorLoadingSites: false
+ }));
+
+ _defineProperty(this, "refreshTimeout", null);
+
+ _defineProperty(this, "fetchAbort", null);
+
+ _defineProperty(this, "state", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["readonly"])(_this.privateState);
+ }));
+
+ _defineProperty(this, "numberOfFilteredSites", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ return _this.state.value.numberOfSites;
+ }));
+
+ _defineProperty(this, "numberOfPages", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ return Math.ceil(_this.numberOfFilteredSites.value / _this.state.value.pageSize - 1);
+ }));
+
+ _defineProperty(this, "currentPagingOffset", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ return Math.ceil(_this.state.value.currentPage * _this.state.value.pageSize);
+ }));
+
+ _defineProperty(this, "paginationLowerBound", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ return _this.currentPagingOffset.value + 1;
+ }));
+
+ _defineProperty(this, "paginationUpperBound", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () {
+ var end = _this.currentPagingOffset.value + _this.state.value.pageSize;
+ var max = _this.numberOfFilteredSites.value;
+
+ if (end > max) {
+ end = max;
+ }
+
+ return end;
+ }));
+ }
+
+ _createClass(DashboardStore, [{
+ key: "cancelRefereshInterval",
+ value: function cancelRefereshInterval() {
+ if (this.refreshTimeout) {
+ clearTimeout(this.refreshTimeout);
+ this.refreshTimeout = null;
+ }
+ }
+ }, {
+ key: "updateWebsitesList",
+ value: function updateWebsitesList(report) {
+ var _this2 = this;
+
+ if (!report) {
+ this.onError();
+ return;
+ }
+
+ var allSites = report.sites;
+ allSites.forEach(function (site) {
+ if (site.ratio !== 1 && site.ratio !== '1') {
+ var percent = NumberFormatter.formatPercent(Math.round(parseInt(site.ratio, 10) * 100));
+ var metricName = null;
+ var previousTotal = '0';
+ var currentTotal = '0';
+ var evolution = '0';
+ var previousTotalAdjusted = '0';
+
+ if (_this2.state.value.sortColumn === 'nb_visits' || _this2.state.value.sortColumn === 'visits_evolution') {
+ previousTotal = NumberFormatter.formatNumber(site.previous_nb_visits);
+ currentTotal = NumberFormatter.formatNumber(site.nb_visits);
+ evolution = NumberFormatter.formatPercent(site.visits_evolution);
+ metricName = Object(external_CoreHome_["translate"])('General_ColumnNbVisits');
+ previousTotalAdjusted = NumberFormatter.formatNumber(Math.round(parseInt(site.previous_nb_visits, 10) * parseInt(site.ratio, 10)));
+ }
+
+ if (_this2.state.value.sortColumn === 'pageviews_evolution') {
+ previousTotal = "".concat(site.previous_Actions_nb_pageviews);
+ currentTotal = "".concat(site.nb_pageviews);
+ evolution = NumberFormatter.formatPercent(site.pageviews_evolution);
+ metricName = Object(external_CoreHome_["translate"])('General_ColumnPageviews');
+ previousTotalAdjusted = NumberFormatter.formatNumber(Math.round(parseInt(site.previous_Actions_nb_pageviews, 10) * parseInt(site.ratio, 10)));
+ }
+
+ if (_this2.state.value.sortColumn === 'revenue_evolution') {
+ previousTotal = NumberFormatter.formatCurrency(site.previous_Goal_revenue, site.currencySymbol);
+ currentTotal = NumberFormatter.formatCurrency(site.revenue, site.currencySymbol);
+ evolution = NumberFormatter.formatPercent(site.revenue_evolution);
+ metricName = Object(external_CoreHome_["translate"])('General_ColumnRevenue');
+ previousTotalAdjusted = NumberFormatter.formatCurrency(Math.round(parseInt(site.previous_Goal_revenue, 10) * parseInt(site.ratio, 10)), site.currencySymbol);
+ }
+
+ if (metricName) {
+ site.tooltip = "".concat(Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonIncomplete', [percent]), "\n");
+ site.tooltip += "".concat(Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonProportional', [percent, "".concat(previousTotalAdjusted), metricName, "".concat(previousTotal)]), "\n");
+
+ switch (site.periodName) {
+ case 'day':
+ site.tooltip += Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonDay', ["".concat(currentTotal), metricName, "".concat(previousTotalAdjusted), site.previousRange, "".concat(evolution)]);
+ break;
+
+ case 'week':
+ site.tooltip += Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonWeek', ["".concat(currentTotal), metricName, "".concat(previousTotalAdjusted), site.previousRange, "".concat(evolution)]);
+ break;
+
+ case 'month':
+ site.tooltip += Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonMonth', ["".concat(currentTotal), metricName, "".concat(previousTotalAdjusted), site.previousRange, "".concat(evolution)]);
+ break;
+
+ case 'year':
+ site.tooltip += Object(external_CoreHome_["translate"])('MultiSites_EvolutionComparisonYear', ["".concat(currentTotal), metricName, "".concat(previousTotalAdjusted), site.previousRange, "".concat(evolution)]);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ });
+ this.privateState.totalVisits = report.totals.nb_visits;
+ this.privateState.totalPageviews = report.totals.nb_pageviews;
+ this.privateState.totalActions = report.totals.nb_actions;
+ this.privateState.totalRevenue = report.totals.revenue;
+ this.privateState.lastVisits = report.totals.nb_visits_lastdate;
+ this.privateState.sites = allSites;
+ this.privateState.numberOfSites = report.numSites;
+ this.privateState.lastVisitsDate = report.lastDate;
+ }
+ }, {
+ key: "sortBy",
+ value: function sortBy(metric) {
+ if (this.state.value.sortColumn === metric) {
+ this.privateState.reverse = !this.state.value.reverse;
+ }
+
+ this.privateState.sortColumn = metric;
+ this.fetchAllSites();
+ }
+ }, {
+ key: "previousPage",
+ value: function previousPage() {
+ this.privateState.currentPage = this.state.value.currentPage - 1;
+ this.fetchAllSites();
+ }
+ }, {
+ key: "nextPage",
+ value: function nextPage() {
+ this.privateState.currentPage = this.state.value.currentPage + 1;
+ this.fetchAllSites();
+ }
+ }, {
+ key: "searchSite",
+ value: function searchSite(term) {
+ this.privateState.searchTerm = term;
+ this.privateState.currentPage = 0;
+ this.fetchAllSites();
+ }
+ }, {
+ key: "fetchAllSites",
+ value: function fetchAllSites() {
+ var _this3 = this;
+
+ if (this.fetchAbort) {
+ this.fetchAbort.abort();
+ this.fetchAbort = null;
+ this.cancelRefereshInterval();
+ }
+
+ this.privateState.isLoading = true;
+ this.privateState.errorLoadingSites = false;
+ var params = {
+ module: 'MultiSites',
+ action: 'getAllWithGroups',
+ hideMetricsDoc: '1',
+ filter_sort_order: 'asc',
+ filter_limit: this.state.value.pageSize,
+ filter_offset: this.currentPagingOffset.value,
+ showColumns: ['label', 'nb_visits', 'nb_pageviews', 'visits_evolution', 'visits_evolution_trend', 'pageviews_evolution', 'pageviews_evolution_trend', 'revenue_evolution', 'revenue_evolution_trend', 'nb_actions,revenue'].join(',')
+ };
+
+ if (this.privateState.searchTerm) {
+ params.pattern = this.privateState.searchTerm;
+ }
+
+ if (this.privateState.sortColumn) {
+ params.filter_sort_column = this.privateState.sortColumn;
+ }
+
+ if (this.privateState.reverse) {
+ params.filter_sort_order = 'desc';
+ }
+
+ this.fetchAbort = new AbortController();
+ return external_CoreHome_["AjaxHelper"].fetch(params, {
+ abortController: this.fetchAbort
+ }).then(function (response) {
+ _this3.updateWebsitesList(response);
+ }).catch(function () {
+ _this3.onError();
+ }).finally(function () {
+ _this3.privateState.isLoading = false;
+ _this3.fetchAbort = null;
+
+ if (_this3.state.value.refreshInterval && _this3.state.value.refreshInterval > 0) {
+ _this3.cancelRefereshInterval();
+
+ _this3.refreshTimeout = setTimeout(function () {
+ _this3.refreshTimeout = null;
+
+ _this3.fetchAllSites();
+ }, _this3.state.value.refreshInterval * 1000);
+ }
+ });
+ }
+ }, {
+ key: "onError",
+ value: function onError() {
+ this.privateState.errorLoadingSites = true;
+ this.privateState.sites = [];
+ }
+ }, {
+ key: "setRefreshInterval",
+ value: function setRefreshInterval(interval) {
+ this.privateState.refreshInterval = interval;
+ }
+ }, {
+ key: "setPageSize",
+ value: function setPageSize(pageSize) {
+ this.privateState.pageSize = pageSize;
+ }
+ }]);
+
+ return DashboardStore;
+}();
+
+/* harmony default export */ var Dashboard_store = (new Dashboard_store_DashboardStore());
+// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/MultiSites/vue/src/Dashboard/Dashboard.vue?vue&type=script&lang=ts
+
+
+
+
+/* harmony default export */ var Dashboardvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({
+ props: {
+ displayRevenueColumn: Boolean,
+ showSparklines: Boolean,
+ dateSparkline: String,
+ pageSize: Number,
+ autoRefreshTodayReport: Number
+ },
+ components: {
+ EnrichedHeadline: external_CoreHome_["EnrichedHeadline"],
+ ActivityIndicator: external_CoreHome_["ActivityIndicator"],
+ MultisitesSite: MultisitesSite
+ },
+ data: function data() {
+ return {
+ evolutionSelector: 'visits_evolution',
+ searchTerm: ''
+ };
+ },
+ created: function created() {
+ if (this.pageSize) {
+ Dashboard_store.setPageSize(this.pageSize);
+ }
+
+ this.refresh(this.autoRefreshTodayReport);
+ },
+ methods: {
+ refresh: function refresh(interval) {
+ Dashboard_store.setRefreshInterval(interval);
+ Dashboard_store.fetchAllSites();
+ },
+ sortBy: function sortBy(column) {
+ Dashboard_store.sortBy(column);
+ },
+ previousPage: function previousPage() {
+ Dashboard_store.previousPage();
+ },
+ nextPage: function nextPage() {
+ Dashboard_store.nextPage();
+ },
+ searchSite: function searchSite() {
+ Dashboard_store.searchSite(this.searchTerm);
+ }
+ },
+ computed: {
+ hasSuperUserAccess: function hasSuperUserAccess() {
+ return external_CoreHome_["Matomo"].hasSuperUserAccess;
+ },
+ date: function date() {
+ return external_CoreHome_["MatomoUrl"].urlParsed.value.date;
+ },
+ idSite: function idSite() {
+ return external_CoreHome_["MatomoUrl"].urlParsed.value.idSite;
+ },
+ url: function url() {
+ return external_CoreHome_["Matomo"].piwik_url;
+ },
+ period: function period() {
+ return external_CoreHome_["Matomo"].period;
+ },
+ areAdsForProfessionalServicesEnabled: function areAdsForProfessionalServicesEnabled() {
+ return external_CoreHome_["Matomo"].config && external_CoreHome_["Matomo"].config.are_ads_enabled;
+ },
+ sortColumn: function sortColumn() {
+ return Dashboard_store.state.value.sortColumn;
+ },
+ reverse: function reverse() {
+ return Dashboard_store.state.value.reverse;
+ },
+ smallTitleContent: function smallTitleContent() {
+ var state = Dashboard_store.state.value;
+ return Object(external_CoreHome_["translate"])('General_TotalVisitsPageviewsActionsRevenue', "<strong>".concat(state.totalVisits, "</strong>"), "<strong>".concat(state.totalPageviews, "</strong>"), "<strong>".concat(state.totalActions, "</strong>"), "<strong>".concat(state.totalRevenue, "</strong>"));
+ },
+ smallTitleTooltip: function smallTitleTooltip() {
+ var state = Dashboard_store.state.value;
+ return Object(external_CoreHome_["translate"])('General_EvolutionSummaryGeneric', Object(external_CoreHome_["translate"])('General_NVisits', "".concat(state.totalVisits)), this.date, "".concat(state.lastVisits), state.lastVisitsDate, Object(external_CoreHome_["getFormattedEvolution"])(state.totalVisits, state.lastVisits));
+ },
+ loadingMessage: function loadingMessage() {
+ return Dashboard_store.state.value.loadingMessage;
+ },
+ isLoading: function isLoading() {
+ return Dashboard_store.state.value.isLoading;
+ },
+ errorLoadingSites: function errorLoadingSites() {
+ return Dashboard_store.state.value.errorLoadingSites;
+ },
+ sites: function sites() {
+ return Dashboard_store.state.value.sites;
+ },
+ numberOfPages: function numberOfPages() {
+ return Dashboard_store.numberOfPages.value;
+ },
+ currentPage: function currentPage() {
+ return Dashboard_store.state.value.currentPage;
+ },
+ paginationLowerBound: function paginationLowerBound() {
+ return Dashboard_store.paginationLowerBound.value;
+ },
+ paginationUpperBound: function paginationUpperBound() {
+ return Dashboard_store.paginationUpperBound.value;
+ },
+ numberOfFilteredSites: function numberOfFilteredSites() {
+ return Dashboard_store.numberOfFilteredSites.value;
+ },
+ professionalHelpUrl: function professionalHelpUrl() {
+ return 'https://matomo.org/support-plans/?pk_campaign=Help&pk_medium=AjaxError&pk_content=' + 'MultiSites&pk_source=Matomo_App';
+ },
+ addSiteUrl: function addSiteUrl() {
+ return "index.php?module=SitesManager&action=index&showaddsite=1&period=".concat(this.period, "&") + "date=".concat(this.date, "&idSite=").concat(this.idSite);
+ }
+ }
+}));
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/Dashboard/Dashboard.vue?vue&type=script&lang=ts
+
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/Dashboard/Dashboard.vue
+
+
+
+Dashboardvue_type_script_lang_ts.render = Dashboardvue_type_template_id_3809d5a2_render
+
+/* harmony default export */ var Dashboard = (Dashboardvue_type_script_lang_ts);
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/Dashboard/Dashboard.adapter.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+/* harmony default export */ var Dashboard_adapter = (Object(external_CoreHome_["createAngularJsAdapter"])({
+ component: Dashboard,
+ scope: {
+ displayRevenueColumn: {
+ angularJsBind: '@',
+ transform: external_CoreHome_["transformAngularJsBoolAttr"]
+ },
+ showSparklines: {
+ angularJsBind: '@',
+ transform: external_CoreHome_["transformAngularJsBoolAttr"]
+ },
+ dateSparkline: {
+ angularJsBind: '@'
+ },
+ pageSize: {
+ angularJsBind: '@',
+ transform: external_CoreHome_["transformAngularJsIntAttr"]
+ },
+ autoRefreshTodayReport: {
+ angularJsBind: '@',
+ transform: external_CoreHome_["transformAngularJsIntAttr"]
+ }
+ },
+ directiveName: 'piwikMultisitesDashboard'
+}));
+// CONCATENATED MODULE: ./plugins/MultiSites/vue/src/index.ts
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+
+
+
+
+// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js
+
+
+
+
+/***/ })
+
+/******/ });
+});
+//# sourceMappingURL=MultiSites.umd.js.map \ No newline at end of file
diff --git a/plugins/MultiSites/vue/dist/MultiSites.umd.min.js b/plugins/MultiSites/vue/dist/MultiSites.umd.min.js
new file mode 100644
index 0000000000..9a9e970fa8
--- /dev/null
+++ b/plugins/MultiSites/vue/dist/MultiSites.umd.min.js
@@ -0,0 +1,20 @@
+(function(e,t){"object"===typeof exports&&"object"===typeof module?module.exports=t(require("CoreHome"),require("vue")):"function"===typeof define&&define.amd?define(["CoreHome"],t):"object"===typeof exports?exports["MultiSites"]=t(require("CoreHome"),require("vue")):e["MultiSites"]=t(e["CoreHome"],e["Vue"])})("undefined"!==typeof self?self:this,(function(e,t){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="plugins/MultiSites/vue/dist/",n(n.s="fae3")}({"19dc":function(t,n){t.exports=e},"8bbf":function(e,n){e.exports=t},fae3:function(e,t,n){"use strict";if(n.r(t),n.d(t,"MultisitesSite",(function(){return x})),n.d(t,"DashboadStore",(function(){return Te})),n.d(t,"Dashboard",(function(){return De})),"undefined"!==typeof window){var r=window.document.currentScript,a=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);a&&(n.p=a[1])}var o=n("19dc"),i=n("8bbf"),s={key:0,class:"multisites-label label"},l=["href"],c=["href","title"],u=Object(i["createElementVNode"])("span",{class:"icon icon-outlink"},null,-1),d=[u],b={key:1,class:"multisites-label label"},m={class:"value"},p={class:"multisites-column"},v={class:"value"},f={class:"multisites-column"},h={class:"value"},g={key:2,class:"multisites-column"},O={class:"value"},j=["title"],S={key:0,class:"visits value"},_=Object(i["createElementVNode"])("img",{class:"multisites_icon",src:"plugins/MultiSites/images/arrow_up.png",alt:""},null,-1),y=Object(i["createTextVNode"])(),w={style:{color:"green"}},k=Object(i["createElementVNode"])("img",{class:"multisites_icon",src:"plugins/MultiSites/images/stop.png",alt:""},null,-1),V=Object(i["createTextVNode"])(),N=Object(i["createElementVNode"])("img",{class:"multisites_icon",src:"plugins/MultiSites/images/arrow_down.png",alt:""},null,-1),E=Object(i["createTextVNode"])(),C={style:{color:"red"}},B={key:4,style:{width:"180px"}},M={key:0,class:"sparkline",style:{width:"100px",margin:"auto"}},P=["href","title"],T=["src"];function A(e,t,n,r,a,o){return Object(i["openBlock"])(),Object(i["createElementBlock"])("tr",{class:Object(i["normalizeClass"])({groupedWebsite:e.website.group,website:!e.website.group,group:e.website.isGroup})},[e.website.isGroup?Object(i["createCommentVNode"])("",!0):(Object(i["openBlock"])(),Object(i["createElementBlock"])("td",s,[Object(i["createElementVNode"])("a",{title:"View reports",class:"value truncated-text-line",href:e.dashboardUrl(e.website)},Object(i["toDisplayString"])(e.websiteLabel),9,l),Object(i["createElementVNode"])("span",null,[Object(i["createElementVNode"])("a",{rel:"noreferrer noopener",target:"_blank",href:e.website.main_url,title:e.translate("General_GoTo",e.website.main_url)},d,8,c)])])),e.website.isGroup?(Object(i["openBlock"])(),Object(i["createElementBlock"])("td",b,[Object(i["createElementVNode"])("span",m,Object(i["toDisplayString"])(e.websiteLabel),1)])):Object(i["createCommentVNode"])("",!0),Object(i["createElementVNode"])("td",p,[Object(i["createElementVNode"])("span",v,Object(i["toDisplayString"])(e.website.nb_visits),1)]),Object(i["createElementVNode"])("td",f,[Object(i["createElementVNode"])("span",h,Object(i["toDisplayString"])(e.website.nb_pageviews),1)]),e.displayRevenueColumn?(Object(i["openBlock"])(),Object(i["createElementBlock"])("td",g,[Object(i["createElementVNode"])("span",O,Object(i["toDisplayString"])(e.website.revenue),1)])):Object(i["createCommentVNode"])("",!0),"range"!==e.period?(Object(i["openBlock"])(),Object(i["createElementBlock"])("td",{key:3,class:"multisites-evolution",title:e.website.tooltip},[e.website.isGroup?Object(i["createCommentVNode"])("",!0):(Object(i["openBlock"])(),Object(i["createElementBlock"])("div",S,[Object(i["withDirectives"])(Object(i["createElementVNode"])("span",null,[_,y,Object(i["createElementVNode"])("span",w,Object(i["toDisplayString"])(e.website[e.evolutionMetric]),1)],512),[[i["vShow"],1===e.website["".concat(e.evolutionMetric,"_trend")]]]),Object(i["withDirectives"])(Object(i["createElementVNode"])("span",null,[k,V,Object(i["createElementVNode"])("span",null,Object(i["toDisplayString"])(e.website[e.evolutionMetric]),1)],512),[[i["vShow"],0===e.website["".concat(e.evolutionMetric,"_trend")]]]),Object(i["withDirectives"])(Object(i["createElementVNode"])("span",null,[N,E,Object(i["createElementVNode"])("span",C,Object(i["toDisplayString"])(e.website[e.evolutionMetric]),1)],512),[[i["vShow"],-1===e.website["".concat(e.evolutionMetric,"_trend")]]])]))],8,j)):Object(i["createCommentVNode"])("",!0),e.showSparklines?(Object(i["openBlock"])(),Object(i["createElementBlock"])("td",B,[e.website.isGroup?Object(i["createCommentVNode"])("",!0):(Object(i["openBlock"])(),Object(i["createElementBlock"])("div",M,[Object(i["createElementVNode"])("a",{rel:"noreferrer noopener",target:"_blank",href:e.dashboardUrl(e.website),title:e.translate("General_GoTo",e.translate("Dashboard_DashboardOf",e.websiteLabel))},[Object(i["createElementVNode"])("img",{alt:"",width:"100",height:"25",src:e.sparklineImage(e.website)},null,8,T)],8,P)]))])):Object(i["createCommentVNode"])("",!0)],2)}var D=Object(i["defineComponent"])({props:{website:{type:Object,required:!0},evolutionMetric:{type:String,required:!0},showSparklines:Boolean,dateSparkline:String,displayRevenueColumn:Boolean,metric:String},methods:{dashboardUrl:function(e){return"index.php?module=CoreHome&action=index&date=".concat(this.date,"&period=").concat(this.period)+"&idSite=".concat(e.idsite).concat(this.tokenParam)},sparklineImage:function(e){var t=this.metric;switch(this.evolutionMetric){case"visits_evolution":t="nb_visits";break;case"pageviews_evolution":t="nb_pageviews";break;case"revenue_evolution":t="revenue";break;default:break}return"index.php?module=MultiSites&action=getEvolutionGraph&period=".concat(this.period,"&date=")+"".concat(this.dateSparkline,"&evolutionBy=").concat(t,"&columns=").concat(t,"&idSite=").concat(e.idsite)+"&idsite=".concat(e.idsite,"&viewDataTable=sparkline").concat(this.tokenParam,"&colors=")+"".concat(encodeURIComponent(JSON.stringify(o["Matomo"].getSparklineColors())))}},computed:{tokenParam:function(){var e=o["MatomoUrl"].urlParsed.value.token_auth;return e?"&token_auth=".concat(e):""},period:function(){return o["Matomo"].period},date:function(){return o["MatomoUrl"].urlParsed.value.date},websiteLabel:function(){return o["Matomo"].helper.htmlDecode(this.website.label)}}});D.render=A;var x=D,G=(Object(o["createAngularJsAdapter"])({component:x,scope:{website:{angularJsBind:"="},evolutionMetric:{angularJsBind:"="},showSparklines:{angularJsBind:"="},dateSparkline:{angularJsBind:"="},displayRevenueColumn:{angularJsBind:"="},metric:{angularJsBind:"="}},directiveName:"piwikMultisitesSite"}),{class:"card-title"}),R=["innerHTML","title"],L={id:"mt",class:"dataTable card-table",cellspacing:"0"},I={class:"heading"},z={class:"heading"},U={class:"heading"},J={class:"heading"},H=["colspan"],F=["value"],q={value:"visits_evolution"},W={value:"pageviews_evolution"},K={key:0,value:"revenue_evolution"},$={key:0},Y={colspan:"7",class:"allWebsitesLoading"},Q={key:1},X={key:0},Z={colspan:"7"},ee={class:"notification system notification-error"},te=Object(i["createElementVNode"])("br",null,null,-1),ne=Object(i["createElementVNode"])("br",null,null,-1),re={rel:"noreferrer noopener",target:"_blank",href:"https://matomo.org/faq/troubleshooting/faq_19489/"},ae=Object(i["createTextVNode"])(" – "),oe={rel:"noreferrer noopener",target:"_blank",href:"https://forum.matomo.org/"},ie=["href"],se=Object(i["createTextVNode"])(". "),le={colspan:"8",class:"paging"},ce={class:"row"},ue={class:"col s3 add_new_site"},de=["href"],be=Object(i["createElementVNode"])("span",{class:"icon-add"},null,-1),me={class:"col s6"},pe={style:{cursor:"pointer"}},ve={class:"dataTablePages"},fe={id:"counter"},he={style:{cursor:"pointer"},class:"pointer"},ge=Object(i["createElementVNode"])("div",{class:"col s3"}," ",-1),Oe={row_id:"last"},je={colspan:"8",class:"site_search"},Se={class:"row"},_e={class:"input-field col s12"},ye=["placeholder"],we=["title"];
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */function ke(e,t,n,r,a,o){var s=this,l=Object(i["resolveComponent"])("EnrichedHeadline"),c=Object(i["resolveComponent"])("ActivityIndicator"),u=Object(i["resolveComponent"])("MultisitesSite");return Object(i["openBlock"])(),Object(i["createElementBlock"])("div",null,[Object(i["createElementVNode"])("h2",G,[Object(i["createVNode"])(l,{"help-url":"https://matomo.org/docs/manage-websites/#all-websites-dashboard","feature-name":e.translate("General_AllWebsitesDashboard")},{default:Object(i["withCtx"])((function(){return[Object(i["createTextVNode"])(Object(i["toDisplayString"])(e.translate("General_AllWebsitesDashboard"))+" ",1),Object(i["createElementVNode"])("span",{class:"smallTitle",innerHTML:e.$sanitize(s.smallTitleContent),title:e.smallTitleTooltip},null,8,R)]})),_:1},8,["feature-name"])]),Object(i["createElementVNode"])("table",L,[Object(i["createElementVNode"])("thead",null,[Object(i["createElementVNode"])("tr",null,[Object(i["createElementVNode"])("th",{id:"names",class:Object(i["normalizeClass"])(["label",{columnSorted:"label"===e.sortColumn}]),onClick:t[0]||(t[0]=function(t){return e.sortBy("label")})},[Object(i["createElementVNode"])("span",I,Object(i["toDisplayString"])(e.translate("General_Website")),1),Object(i["createElementVNode"])("span",{class:Object(i["normalizeClass"])(["arrow",{multisites_asc:!e.reverse&&"label"===e.sortColumn,multisites_desc:e.reverse&&"label"===e.sortColumn}]),style:{"margin-left":"3.5px"}},null,2)],2),Object(i["createElementVNode"])("th",{id:"visits",class:Object(i["normalizeClass"])(["multisites-column",{columnSorted:"nb_visits"===e.sortColumn}]),onClick:t[1]||(t[1]=function(t){return e.sortBy("nb_visits")})},[Object(i["createElementVNode"])("span",{class:Object(i["normalizeClass"])(["arrow",{multisites_asc:!e.reverse&&"nb_visits"===e.sortColumn,multisites_desc:e.reverse&&"nb_visits"===e.sortColumn}]),style:{"margin-right":"3.5px"}},null,2),Object(i["createElementVNode"])("span",z,Object(i["toDisplayString"])(e.translate("General_ColumnNbVisits")),1)],2),Object(i["createElementVNode"])("th",{id:"pageviews",class:Object(i["normalizeClass"])(["multisites-column",{columnSorted:"nb_pageviews"===e.sortColumn}]),onClick:t[2]||(t[2]=function(t){return e.sortBy("nb_pageviews")})},[Object(i["createElementVNode"])("span",{class:Object(i["normalizeClass"])(["arrow",{multisites_asc:!e.reverse&&"nb_pageviews"===e.sortColumn,multisites_desc:e.reverse&&"nb_pageviews"===e.sortColumn}]),style:{"margin-right":"3.5px"}},null,2),Object(i["createElementVNode"])("span",U,Object(i["toDisplayString"])(e.translate("General_ColumnPageviews")),1)],2),e.displayRevenueColumn?(Object(i["openBlock"])(),Object(i["createElementBlock"])("th",{key:0,id:"revenue",class:Object(i["normalizeClass"])(["multisites-column",{columnSorted:"revenue"===e.sortColumn}]),onClick:t[3]||(t[3]=function(t){return e.sortBy("revenue")})},[Object(i["createElementVNode"])("span",{class:Object(i["normalizeClass"])(["arrow",{multisites_asc:!e.reverse&&"revenue"===e.sortColumn,multisites_desc:e.reverse&&"revenue"===e.sortColumn}]),style:{"margin-right":"3.5px"}},null,2),Object(i["createElementVNode"])("span",J,Object(i["toDisplayString"])(e.translate("General_ColumnRevenue")),1)],2)):Object(i["createCommentVNode"])("",!0),Object(i["createElementVNode"])("th",{id:"evolution",class:Object(i["normalizeClass"])({columnSorted:e.evolutionSelector===e.sortColumn}),colspan:e.showSparklines?2:1},[Object(i["createElementVNode"])("span",{class:Object(i["normalizeClass"])(["arrow",{multisites_asc:!e.reverse&&e.evolutionSelector===e.sortColumn,multisites_desc:e.reverse&&e.evolutionSelector===e.sortColumn}]),style:{"margin-right":"3.5px"}},null,2),Object(i["createElementVNode"])("span",{class:"evolution",onClick:t[4]||(t[4]=function(t){return e.sortBy(e.evolutionSelector)}),style:{"margin-right":"3.5px"}},Object(i["toDisplayString"])(e.translate("MultiSites_Evolution")),1),Object(i["createElementVNode"])("select",{class:"selector browser-default",id:"evolution_selector",value:e.evolutionSelector,onChange:t[5]||(t[5]=function(t){e.evolutionSelector=t.target.value,e.sortBy(e.evolutionSelector)})},[Object(i["createElementVNode"])("option",q,Object(i["toDisplayString"])(e.translate("General_ColumnNbVisits")),1),Object(i["createElementVNode"])("option",W,Object(i["toDisplayString"])(e.translate("General_ColumnPageviews")),1),e.displayRevenueColumn?(Object(i["openBlock"])(),Object(i["createElementBlock"])("option",K,Object(i["toDisplayString"])(e.translate("General_ColumnRevenue")),1)):Object(i["createCommentVNode"])("",!0)],40,F)],10,H)])]),e.isLoading?(Object(i["openBlock"])(),Object(i["createElementBlock"])("tbody",$,[Object(i["createElementVNode"])("tr",null,[Object(i["createElementVNode"])("td",Y,[Object(i["createVNode"])(c,{"loading-message":e.loadingMessage,loading:e.isLoading},null,8,["loading-message","loading"])])])])):Object(i["createCommentVNode"])("",!0),e.isLoading?Object(i["createCommentVNode"])("",!0):(Object(i["openBlock"])(),Object(i["createElementBlock"])("tbody",Q,[e.errorLoadingSites?(Object(i["openBlock"])(),Object(i["createElementBlock"])("tr",X,[Object(i["createElementVNode"])("td",Z,[Object(i["createElementVNode"])("div",ee,[Object(i["createTextVNode"])(Object(i["toDisplayString"])(e.translate("General_ErrorRequest","",""))+" ",1),te,ne,Object(i["createTextVNode"])(" "+Object(i["toDisplayString"])(e.translate("General_NeedMoreHelp"))+" ",1),Object(i["createElementVNode"])("a",re,Object(i["toDisplayString"])(e.translate("General_Faq")),1),ae,Object(i["createElementVNode"])("a",oe,Object(i["toDisplayString"])(e.translate("Feedback_CommunityHelp")),1),Object(i["withDirectives"])(Object(i["createElementVNode"])("span",null," – ",512),[[i["vShow"],e.areAdsForProfessionalServicesEnabled]]),Object(i["withDirectives"])(Object(i["createElementVNode"])("a",{rel:"noreferrer noopener",target:"_blank",href:e.professionalHelpUrl},Object(i["toDisplayString"])(e.translate("Feedback_ProfessionalHelp")),9,ie),[[i["vShow"],e.areAdsForProfessionalServicesEnabled]]),se])])])):Object(i["createCommentVNode"])("",!0),(Object(i["openBlock"])(!0),Object(i["createElementBlock"])(i["Fragment"],null,Object(i["renderList"])(e.sites,(function(t){return Object(i["openBlock"])(),Object(i["createBlock"])(u,{key:t.idsite,website:t,"evolution-metric":e.evolutionSelector,"date-sparkline":e.dateSparkline,"show-sparklines":e.showSparklines,metric:e.sortColumn,"display-revenue-column":e.displayRevenueColumn},null,8,["website","evolution-metric","date-sparkline","show-sparklines","metric","display-revenue-column"])})),128))])),Object(i["createElementVNode"])("tfoot",null,[Object(i["createElementVNode"])("tr",null,[Object(i["createElementVNode"])("td",le,[Object(i["createElementVNode"])("div",ce,[Object(i["createElementVNode"])("div",ue,[e.hasSuperUserAccess?(Object(i["openBlock"])(),Object(i["createElementBlock"])("a",{key:0,href:e.addSiteUrl},[be,Object(i["createTextVNode"])(" "+Object(i["toDisplayString"])(e.translate("SitesManager_AddSite")),1)],8,de)):Object(i["createCommentVNode"])("",!0)]),Object(i["createElementVNode"])("div",me,[Object(i["withDirectives"])(Object(i["createElementVNode"])("span",{id:"prev",class:"previous dataTablePrevious",onClick:t[6]||(t[6]=function(t){return e.previousPage()})},[Object(i["createElementVNode"])("span",pe,"« "+Object(i["toDisplayString"])(e.translate("General_Previous")),1)],512),[[i["vShow"],!(0===e.currentPage)]]),Object(i["createElementVNode"])("span",ve,[Object(i["createElementVNode"])("span",fe,Object(i["toDisplayString"])(e.translate("General_Pagination",e.paginationLowerBound,e.paginationUpperBound,e.numberOfFilteredSites)),1)]),Object(i["withDirectives"])(Object(i["createElementVNode"])("span",{id:"next",class:"next dataTableNext",onClick:t[7]||(t[7]=function(t){return e.nextPage()})},[Object(i["createElementVNode"])("span",he,Object(i["toDisplayString"])(e.translate("General_Next"))+" »",1)],512),[[i["vShow"],!(e.currentPage>=e.numberOfPages)]])]),ge])])]),Object(i["createElementVNode"])("tr",Oe,[Object(i["createElementVNode"])("td",je,[Object(i["createElementVNode"])("div",Se,[Object(i["createElementVNode"])("div",_e,[Object(i["withDirectives"])(Object(i["createElementVNode"])("input",{type:"text",onKeydown:t[8]||(t[8]=Object(i["withKeys"])((function(t){return e.searchSite(e.searchTerm)}),["enter"])),"onUpdate:modelValue":t[9]||(t[9]=function(t){return e.searchTerm=t}),placeholder:e.translate("Actions_SubmenuSitesearch")},null,40,ye),[[i["vModelText"],e.searchTerm]]),Object(i["createElementVNode"])("span",{class:"icon-search search_ico",onClick:t[10]||(t[10]=function(t){return e.searchSite(e.searchTerm)}),title:e.translate("General_ClickToSearch")},null,8,we)])])])])])])])}function Ve(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ne(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Ee(e,t,n){return t&&Ne(e.prototype,t),n&&Ne(e,n),e}function Ce(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */var Be=window,Me=Be.NumberFormatter,Pe=function(){function e(){var t=this;Ve(this,e),Ce(this,"privateState",Object(i["reactive"])({sites:[],isLoading:!1,pageSize:25,currentPage:0,totalVisits:"?",totalPageviews:"?",totalActions:"?",totalRevenue:"?",searchTerm:"",lastVisits:"?",lastVisitsDate:"?",numberOfSites:0,loadingMessage:Object(o["translate"])("MultiSites_LoadingWebsites"),reverse:!0,sortColumn:"nb_visits",refreshInterval:0,errorLoadingSites:!1})),Ce(this,"refreshTimeout",null),Ce(this,"fetchAbort",null),Ce(this,"state",Object(i["computed"])((function(){return Object(i["readonly"])(t.privateState)}))),Ce(this,"numberOfFilteredSites",Object(i["computed"])((function(){return t.state.value.numberOfSites}))),Ce(this,"numberOfPages",Object(i["computed"])((function(){return Math.ceil(t.numberOfFilteredSites.value/t.state.value.pageSize-1)}))),Ce(this,"currentPagingOffset",Object(i["computed"])((function(){return Math.ceil(t.state.value.currentPage*t.state.value.pageSize)}))),Ce(this,"paginationLowerBound",Object(i["computed"])((function(){return t.currentPagingOffset.value+1}))),Ce(this,"paginationUpperBound",Object(i["computed"])((function(){var e=t.currentPagingOffset.value+t.state.value.pageSize,n=t.numberOfFilteredSites.value;return e>n&&(e=n),e})))}return Ee(e,[{key:"cancelRefereshInterval",value:function(){this.refreshTimeout&&(clearTimeout(this.refreshTimeout),this.refreshTimeout=null)}},{key:"updateWebsitesList",value:function(e){var t=this;if(e){var n=e.sites;n.forEach((function(e){if(1!==e.ratio&&"1"!==e.ratio){var n=Me.formatPercent(Math.round(100*parseInt(e.ratio,10))),r=null,a="0",i="0",s="0",l="0";if("nb_visits"!==t.state.value.sortColumn&&"visits_evolution"!==t.state.value.sortColumn||(a=Me.formatNumber(e.previous_nb_visits),i=Me.formatNumber(e.nb_visits),s=Me.formatPercent(e.visits_evolution),r=Object(o["translate"])("General_ColumnNbVisits"),l=Me.formatNumber(Math.round(parseInt(e.previous_nb_visits,10)*parseInt(e.ratio,10)))),"pageviews_evolution"===t.state.value.sortColumn&&(a="".concat(e.previous_Actions_nb_pageviews),i="".concat(e.nb_pageviews),s=Me.formatPercent(e.pageviews_evolution),r=Object(o["translate"])("General_ColumnPageviews"),l=Me.formatNumber(Math.round(parseInt(e.previous_Actions_nb_pageviews,10)*parseInt(e.ratio,10)))),"revenue_evolution"===t.state.value.sortColumn&&(a=Me.formatCurrency(e.previous_Goal_revenue,e.currencySymbol),i=Me.formatCurrency(e.revenue,e.currencySymbol),s=Me.formatPercent(e.revenue_evolution),r=Object(o["translate"])("General_ColumnRevenue"),l=Me.formatCurrency(Math.round(parseInt(e.previous_Goal_revenue,10)*parseInt(e.ratio,10)),e.currencySymbol)),r)switch(e.tooltip="".concat(Object(o["translate"])("MultiSites_EvolutionComparisonIncomplete",[n]),"\n"),e.tooltip+="".concat(Object(o["translate"])("MultiSites_EvolutionComparisonProportional",[n,"".concat(l),r,"".concat(a)]),"\n"),e.periodName){case"day":e.tooltip+=Object(o["translate"])("MultiSites_EvolutionComparisonDay",["".concat(i),r,"".concat(l),e.previousRange,"".concat(s)]);break;case"week":e.tooltip+=Object(o["translate"])("MultiSites_EvolutionComparisonWeek",["".concat(i),r,"".concat(l),e.previousRange,"".concat(s)]);break;case"month":e.tooltip+=Object(o["translate"])("MultiSites_EvolutionComparisonMonth",["".concat(i),r,"".concat(l),e.previousRange,"".concat(s)]);break;case"year":e.tooltip+=Object(o["translate"])("MultiSites_EvolutionComparisonYear",["".concat(i),r,"".concat(l),e.previousRange,"".concat(s)]);break;default:break}}})),this.privateState.totalVisits=e.totals.nb_visits,this.privateState.totalPageviews=e.totals.nb_pageviews,this.privateState.totalActions=e.totals.nb_actions,this.privateState.totalRevenue=e.totals.revenue,this.privateState.lastVisits=e.totals.nb_visits_lastdate,this.privateState.sites=n,this.privateState.numberOfSites=e.numSites,this.privateState.lastVisitsDate=e.lastDate}else this.onError()}},{key:"sortBy",value:function(e){this.state.value.sortColumn===e&&(this.privateState.reverse=!this.state.value.reverse),this.privateState.sortColumn=e,this.fetchAllSites()}},{key:"previousPage",value:function(){this.privateState.currentPage=this.state.value.currentPage-1,this.fetchAllSites()}},{key:"nextPage",value:function(){this.privateState.currentPage=this.state.value.currentPage+1,this.fetchAllSites()}},{key:"searchSite",value:function(e){this.privateState.searchTerm=e,this.privateState.currentPage=0,this.fetchAllSites()}},{key:"fetchAllSites",value:function(){var e=this;this.fetchAbort&&(this.fetchAbort.abort(),this.fetchAbort=null,this.cancelRefereshInterval()),this.privateState.isLoading=!0,this.privateState.errorLoadingSites=!1;var t={module:"MultiSites",action:"getAllWithGroups",hideMetricsDoc:"1",filter_sort_order:"asc",filter_limit:this.state.value.pageSize,filter_offset:this.currentPagingOffset.value,showColumns:["label","nb_visits","nb_pageviews","visits_evolution","visits_evolution_trend","pageviews_evolution","pageviews_evolution_trend","revenue_evolution","revenue_evolution_trend","nb_actions,revenue"].join(",")};return this.privateState.searchTerm&&(t.pattern=this.privateState.searchTerm),this.privateState.sortColumn&&(t.filter_sort_column=this.privateState.sortColumn),this.privateState.reverse&&(t.filter_sort_order="desc"),this.fetchAbort=new AbortController,o["AjaxHelper"].fetch(t,{abortController:this.fetchAbort}).then((function(t){e.updateWebsitesList(t)})).catch((function(){e.onError()})).finally((function(){e.privateState.isLoading=!1,e.fetchAbort=null,e.state.value.refreshInterval&&e.state.value.refreshInterval>0&&(e.cancelRefereshInterval(),e.refreshTimeout=setTimeout((function(){e.refreshTimeout=null,e.fetchAllSites()}),1e3*e.state.value.refreshInterval))}))}},{key:"onError",value:function(){this.privateState.errorLoadingSites=!0,this.privateState.sites=[]}},{key:"setRefreshInterval",value:function(e){this.privateState.refreshInterval=e}},{key:"setPageSize",value:function(e){this.privateState.pageSize=e}}]),e}(),Te=new Pe,Ae=Object(i["defineComponent"])({props:{displayRevenueColumn:Boolean,showSparklines:Boolean,dateSparkline:String,pageSize:Number,autoRefreshTodayReport:Number},components:{EnrichedHeadline:o["EnrichedHeadline"],ActivityIndicator:o["ActivityIndicator"],MultisitesSite:x},data:function(){return{evolutionSelector:"visits_evolution",searchTerm:""}},created:function(){this.pageSize&&Te.setPageSize(this.pageSize),this.refresh(this.autoRefreshTodayReport)},methods:{refresh:function(e){Te.setRefreshInterval(e),Te.fetchAllSites()},sortBy:function(e){Te.sortBy(e)},previousPage:function(){Te.previousPage()},nextPage:function(){Te.nextPage()},searchSite:function(){Te.searchSite(this.searchTerm)}},computed:{hasSuperUserAccess:function(){return o["Matomo"].hasSuperUserAccess},date:function(){return o["MatomoUrl"].urlParsed.value.date},idSite:function(){return o["MatomoUrl"].urlParsed.value.idSite},url:function(){return o["Matomo"].piwik_url},period:function(){return o["Matomo"].period},areAdsForProfessionalServicesEnabled:function(){return o["Matomo"].config&&o["Matomo"].config.are_ads_enabled},sortColumn:function(){return Te.state.value.sortColumn},reverse:function(){return Te.state.value.reverse},smallTitleContent:function(){var e=Te.state.value;return Object(o["translate"])("General_TotalVisitsPageviewsActionsRevenue","<strong>".concat(e.totalVisits,"</strong>"),"<strong>".concat(e.totalPageviews,"</strong>"),"<strong>".concat(e.totalActions,"</strong>"),"<strong>".concat(e.totalRevenue,"</strong>"))},smallTitleTooltip:function(){var e=Te.state.value;return Object(o["translate"])("General_EvolutionSummaryGeneric",Object(o["translate"])("General_NVisits","".concat(e.totalVisits)),this.date,"".concat(e.lastVisits),e.lastVisitsDate,Object(o["getFormattedEvolution"])(e.totalVisits,e.lastVisits))},loadingMessage:function(){return Te.state.value.loadingMessage},isLoading:function(){return Te.state.value.isLoading},errorLoadingSites:function(){return Te.state.value.errorLoadingSites},sites:function(){return Te.state.value.sites},numberOfPages:function(){return Te.numberOfPages.value},currentPage:function(){return Te.state.value.currentPage},paginationLowerBound:function(){return Te.paginationLowerBound.value},paginationUpperBound:function(){return Te.paginationUpperBound.value},numberOfFilteredSites:function(){return Te.numberOfFilteredSites.value},professionalHelpUrl:function(){return"https://matomo.org/support-plans/?pk_campaign=Help&pk_medium=AjaxError&pk_content=MultiSites&pk_source=Matomo_App"},addSiteUrl:function(){return"index.php?module=SitesManager&action=index&showaddsite=1&period=".concat(this.period,"&")+"date=".concat(this.date,"&idSite=").concat(this.idSite)}}});Ae.render=ke;var De=Ae;
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */Object(o["createAngularJsAdapter"])({component:De,scope:{displayRevenueColumn:{angularJsBind:"@",transform:o["transformAngularJsBoolAttr"]},showSparklines:{angularJsBind:"@",transform:o["transformAngularJsBoolAttr"]},dateSparkline:{angularJsBind:"@"},pageSize:{angularJsBind:"@",transform:o["transformAngularJsIntAttr"]},autoRefreshTodayReport:{angularJsBind:"@",transform:o["transformAngularJsIntAttr"]}},directiveName:"piwikMultisitesDashboard"})}})}));
+//# sourceMappingURL=MultiSites.umd.min.js.map \ No newline at end of file
diff --git a/plugins/MultiSites/vue/dist/umd.metadata.json b/plugins/MultiSites/vue/dist/umd.metadata.json
new file mode 100644
index 0000000000..9ecfcc0456
--- /dev/null
+++ b/plugins/MultiSites/vue/dist/umd.metadata.json
@@ -0,0 +1,5 @@
+{
+ "dependsOn": [
+ "CoreHome"
+ ]
+} \ No newline at end of file
diff --git a/plugins/MultiSites/vue/src/Dashboard/Dashboard.adapter.ts b/plugins/MultiSites/vue/src/Dashboard/Dashboard.adapter.ts
new file mode 100644
index 0000000000..5db60f3d24
--- /dev/null
+++ b/plugins/MultiSites/vue/src/Dashboard/Dashboard.adapter.ts
@@ -0,0 +1,39 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import {
+ createAngularJsAdapter,
+ transformAngularJsBoolAttr,
+ transformAngularJsIntAttr,
+} from 'CoreHome';
+import Dashboard from './Dashboard.vue';
+
+export default createAngularJsAdapter({
+ component: Dashboard,
+ scope: {
+ displayRevenueColumn: {
+ angularJsBind: '@',
+ transform: transformAngularJsBoolAttr,
+ },
+ showSparklines: {
+ angularJsBind: '@',
+ transform: transformAngularJsBoolAttr,
+ },
+ dateSparkline: {
+ angularJsBind: '@',
+ },
+ pageSize: {
+ angularJsBind: '@',
+ transform: transformAngularJsIntAttr,
+ },
+ autoRefreshTodayReport: {
+ angularJsBind: '@',
+ transform: transformAngularJsIntAttr,
+ },
+ },
+ directiveName: 'piwikMultisitesDashboard',
+});
diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less b/plugins/MultiSites/vue/src/Dashboard/Dashboard.less
index 37d05ce83a..9f9a5f80e4 100644
--- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less
+++ b/plugins/MultiSites/vue/src/Dashboard/Dashboard.less
@@ -289,4 +289,8 @@
tfoot td {
border-bottom: 0;
}
+
+ .dataTablePages {
+ margin: 10px 13.5px;
+ }
}
diff --git a/plugins/MultiSites/vue/src/Dashboard/Dashboard.store.ts b/plugins/MultiSites/vue/src/Dashboard/Dashboard.store.ts
new file mode 100644
index 0000000000..2b9080a00c
--- /dev/null
+++ b/plugins/MultiSites/vue/src/Dashboard/Dashboard.store.ts
@@ -0,0 +1,359 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import {
+ reactive,
+ computed,
+ readonly,
+} from 'vue';
+import {
+ AjaxHelper,
+ translate,
+ Site,
+} from 'CoreHome';
+
+interface SiteWithMetrics extends Site {
+ label: string;
+ nb_actions: string|number;
+ nb_pageviews: string|number;
+ nb_visits: string|number;
+ pageviews_evolution: string;
+ revenue: string;
+ revenue_evolution: string;
+ visits_evolution: string;
+ ratio?: number|string;
+ previous_nb_visits?: string|number;
+ previous_Actions_nb_pageviews?: string|number;
+ previous_Goal_revenue?: string|number;
+ currencySymbol: string;
+ periodName: string;
+ previousRange: string;
+ tooltip?: string;
+}
+
+interface SiteTotals {
+ nb_actions: string|number;
+ nb_pageviews: string|number;
+ nb_visits: string|number;
+ nb_visits_lastdate: string|number;
+ revenue: string|number;
+}
+
+interface DashboardStoreState {
+ sites: SiteWithMetrics[];
+ isLoading: boolean;
+ pageSize: number;
+ currentPage: number;
+ totalVisits: string|number;
+ totalPageviews: string|number;
+ totalActions: string|number;
+ totalRevenue: string|number;
+ searchTerm: string;
+ lastVisits: string|number;
+ lastVisitsDate: string;
+ numberOfSites: number;
+ loadingMessage: string;
+ reverse: boolean;
+ sortColumn: string;
+ refreshInterval?: number;
+ errorLoadingSites: boolean;
+}
+
+interface GetAllWithGroupsResponse {
+ lastDate: string;
+ numSites: number;
+ sites: SiteWithMetrics[];
+ totals: SiteTotals;
+}
+
+const { NumberFormatter } = window;
+
+class DashboardStore {
+ private privateState = reactive<DashboardStoreState>({
+ sites: [],
+ isLoading: false,
+ pageSize: 25,
+ currentPage: 0,
+ totalVisits: '?',
+ totalPageviews: '?',
+ totalActions: '?',
+ totalRevenue: '?',
+ searchTerm: '',
+ lastVisits: '?',
+ lastVisitsDate: '?',
+ numberOfSites: 0,
+ loadingMessage: translate('MultiSites_LoadingWebsites'),
+ reverse: true,
+ sortColumn: 'nb_visits',
+ refreshInterval: 0,
+ errorLoadingSites: false,
+ });
+
+ private refreshTimeout: ReturnType<typeof setTimeout>|null = null;
+
+ private fetchAbort: AbortController|null = null;
+
+ readonly state = computed(() => readonly(this.privateState));
+
+ readonly numberOfFilteredSites = computed(() => this.state.value.numberOfSites);
+
+ readonly numberOfPages = computed(
+ () => Math.ceil(this.numberOfFilteredSites.value / this.state.value.pageSize - 1),
+ );
+
+ readonly currentPagingOffset = computed(
+ () => Math.ceil(this.state.value.currentPage * this.state.value.pageSize),
+ );
+
+ readonly paginationLowerBound = computed(() => this.currentPagingOffset.value + 1);
+
+ readonly paginationUpperBound = computed(() => {
+ let end = this.currentPagingOffset.value + this.state.value.pageSize;
+ const max = this.numberOfFilteredSites.value;
+
+ if (end > max) {
+ end = max;
+ }
+
+ return end;
+ });
+
+ cancelRefereshInterval(): void {
+ if (this.refreshTimeout) {
+ clearTimeout(this.refreshTimeout);
+ this.refreshTimeout = null;
+ }
+ }
+
+ updateWebsitesList(report: GetAllWithGroupsResponse): void {
+ if (!report) {
+ this.onError();
+ return;
+ }
+
+ const allSites = report.sites;
+ allSites.forEach((site) => {
+ if (site.ratio !== 1 && site.ratio !== '1') {
+ const percent = NumberFormatter.formatPercent(
+ Math.round(parseInt(site.ratio! as string, 10) * 100),
+ );
+
+ let metricName = null;
+ let previousTotal = '0';
+ let currentTotal = '0';
+ let evolution = '0';
+ let previousTotalAdjusted = '0';
+
+ if (this.state.value.sortColumn === 'nb_visits'
+ || this.state.value.sortColumn === 'visits_evolution'
+ ) {
+ previousTotal = NumberFormatter.formatNumber(site.previous_nb_visits);
+ currentTotal = NumberFormatter.formatNumber(site.nb_visits);
+ evolution = NumberFormatter.formatPercent(site.visits_evolution);
+ metricName = translate('General_ColumnNbVisits');
+ previousTotalAdjusted = NumberFormatter.formatNumber(
+ Math.round(parseInt(site.previous_nb_visits as string, 10)
+ * parseInt(site.ratio as string, 10)),
+ );
+ }
+
+ if (this.state.value.sortColumn === 'pageviews_evolution') {
+ previousTotal = `${site.previous_Actions_nb_pageviews}`;
+ currentTotal = `${site.nb_pageviews}`;
+ evolution = NumberFormatter.formatPercent(site.pageviews_evolution);
+ metricName = translate('General_ColumnPageviews');
+ previousTotalAdjusted = NumberFormatter.formatNumber(
+ Math.round(parseInt(site.previous_Actions_nb_pageviews as string, 10)
+ * parseInt(site.ratio as string, 10)),
+ );
+ }
+
+ if (this.state.value.sortColumn === 'revenue_evolution') {
+ previousTotal = NumberFormatter.formatCurrency(
+ site.previous_Goal_revenue,
+ site.currencySymbol,
+ );
+ currentTotal = NumberFormatter.formatCurrency(site.revenue, site.currencySymbol);
+ evolution = NumberFormatter.formatPercent(site.revenue_evolution);
+ metricName = translate('General_ColumnRevenue');
+ previousTotalAdjusted = NumberFormatter.formatCurrency(
+ Math.round(parseInt(site.previous_Goal_revenue as string, 10)
+ * parseInt(site.ratio as string, 10)),
+ site.currencySymbol,
+ );
+ }
+
+ if (metricName) {
+ site.tooltip = `${translate('MultiSites_EvolutionComparisonIncomplete', [percent])}\n`;
+ site.tooltip += `${translate('MultiSites_EvolutionComparisonProportional', [
+ percent,
+ `${previousTotalAdjusted}`,
+ metricName,
+ `${previousTotal}`,
+ ])}\n`;
+
+ switch (site.periodName) {
+ case 'day':
+ site.tooltip += translate('MultiSites_EvolutionComparisonDay', [
+ `${currentTotal}`,
+ metricName,
+ `${previousTotalAdjusted}`,
+ site.previousRange,
+ `${evolution}`,
+ ]);
+ break;
+
+ case 'week':
+ site.tooltip += translate('MultiSites_EvolutionComparisonWeek', [
+ `${currentTotal}`,
+ metricName,
+ `${previousTotalAdjusted}`,
+ site.previousRange,
+ `${evolution}`,
+ ]);
+ break;
+
+ case 'month':
+ site.tooltip += translate('MultiSites_EvolutionComparisonMonth', [
+ `${currentTotal}`,
+ metricName,
+ `${previousTotalAdjusted}`,
+ site.previousRange,
+ `${evolution}`,
+ ]);
+ break;
+
+ case 'year':
+ site.tooltip += translate('MultiSites_EvolutionComparisonYear', [
+ `${currentTotal}`,
+ metricName,
+ `${previousTotalAdjusted}`,
+ site.previousRange,
+ `${evolution}`,
+ ]);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ });
+ this.privateState.totalVisits = report.totals.nb_visits;
+ this.privateState.totalPageviews = report.totals.nb_pageviews;
+ this.privateState.totalActions = report.totals.nb_actions;
+ this.privateState.totalRevenue = report.totals.revenue;
+ this.privateState.lastVisits = report.totals.nb_visits_lastdate;
+ this.privateState.sites = allSites;
+ this.privateState.numberOfSites = report.numSites;
+ this.privateState.lastVisitsDate = report.lastDate;
+ }
+
+ sortBy(metric: string): void {
+ if (this.state.value.sortColumn === metric) {
+ this.privateState.reverse = !this.state.value.reverse;
+ }
+
+ this.privateState.sortColumn = metric;
+ this.fetchAllSites();
+ }
+
+ previousPage(): void {
+ this.privateState.currentPage = this.state.value.currentPage - 1;
+ this.fetchAllSites();
+ }
+
+ nextPage(): void {
+ this.privateState.currentPage = this.state.value.currentPage + 1;
+ this.fetchAllSites();
+ }
+
+ searchSite(term: string): void {
+ this.privateState.searchTerm = term;
+ this.privateState.currentPage = 0;
+ this.fetchAllSites();
+ }
+
+ fetchAllSites(): Promise<void> {
+ if (this.fetchAbort) {
+ this.fetchAbort.abort();
+ this.fetchAbort = null;
+
+ this.cancelRefereshInterval();
+ }
+
+ this.privateState.isLoading = true;
+ this.privateState.errorLoadingSites = false;
+ const params: QueryParameters = {
+ module: 'MultiSites',
+ action: 'getAllWithGroups',
+ hideMetricsDoc: '1',
+ filter_sort_order: 'asc',
+ filter_limit: this.state.value.pageSize,
+ filter_offset: this.currentPagingOffset.value,
+ showColumns: [
+ 'label',
+ 'nb_visits',
+ 'nb_pageviews',
+ 'visits_evolution',
+ 'visits_evolution_trend',
+ 'pageviews_evolution',
+ 'pageviews_evolution_trend',
+ 'revenue_evolution',
+ 'revenue_evolution_trend',
+ 'nb_actions,revenue',
+ ].join(','),
+ };
+
+ if (this.privateState.searchTerm) {
+ params.pattern = this.privateState.searchTerm;
+ }
+
+ if (this.privateState.sortColumn) {
+ params.filter_sort_column = this.privateState.sortColumn;
+ }
+
+ if (this.privateState.reverse) {
+ params.filter_sort_order = 'desc';
+ }
+
+ this.fetchAbort = new AbortController();
+ return AjaxHelper.fetch<GetAllWithGroupsResponse>(
+ params,
+ { abortController: this.fetchAbort },
+ ).then((response) => {
+ this.updateWebsitesList(response);
+ }).catch(() => {
+ this.onError();
+ }).finally(() => {
+ this.privateState.isLoading = false;
+ this.fetchAbort = null;
+
+ if (this.state.value.refreshInterval && this.state.value.refreshInterval > 0) {
+ this.cancelRefereshInterval();
+ this.refreshTimeout = setTimeout(() => {
+ this.refreshTimeout = null;
+ this.fetchAllSites();
+ }, this.state.value.refreshInterval! * 1000);
+ }
+ });
+ }
+
+ private onError(): void {
+ this.privateState.errorLoadingSites = true;
+ this.privateState.sites = [];
+ }
+
+ setRefreshInterval(interval?: number): void {
+ this.privateState.refreshInterval = interval;
+ }
+
+ setPageSize(pageSize: number): void {
+ this.privateState.pageSize = pageSize;
+ }
+}
+
+export default new DashboardStore();
diff --git a/plugins/MultiSites/vue/src/Dashboard/Dashboard.vue b/plugins/MultiSites/vue/src/Dashboard/Dashboard.vue
new file mode 100644
index 0000000000..00eafbb225
--- /dev/null
+++ b/plugins/MultiSites/vue/src/Dashboard/Dashboard.vue
@@ -0,0 +1,407 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <div>
+ <h2 class="card-title">
+ <EnrichedHeadline
+ help-url="https://matomo.org/docs/manage-websites/#all-websites-dashboard"
+ :feature-name="translate('General_AllWebsitesDashboard')"
+ >
+ {{ translate('General_AllWebsitesDashboard') }}
+ <span
+ class="smallTitle"
+ v-html="$sanitize(this.smallTitleContent)"
+ :title="smallTitleTooltip"
+ >
+ </span>
+ </EnrichedHeadline>
+ </h2>
+ <table
+ id="mt"
+ class="dataTable card-table"
+ cellspacing="0"
+ >
+ <thead>
+ <tr>
+ <th
+ id="names"
+ class="label"
+ @click="sortBy('label')"
+ :class="{columnSorted: 'label' === sortColumn}"
+ >
+ <span class="heading">{{ translate('General_Website') }}</span>
+ <span
+ class="arrow"
+ :class="{
+ multisites_asc: !reverse && 'label' === sortColumn,
+ multisites_desc: reverse && 'label' === sortColumn,
+ }"
+ style="margin-left: 3.5px"
+ />
+ </th>
+ <th
+ id="visits"
+ class="multisites-column"
+ @click="sortBy('nb_visits')"
+ :class="{columnSorted: 'nb_visits' === sortColumn}"
+ >
+ <span
+ class="arrow"
+ :class="{
+ multisites_asc: !reverse && 'nb_visits' === sortColumn,
+ multisites_desc: reverse && 'nb_visits' === sortColumn,
+ }"
+ style="margin-right: 3.5px"
+ />
+ <span class="heading">{{ translate('General_ColumnNbVisits') }}</span>
+ </th>
+ <th
+ id="pageviews"
+ class="multisites-column"
+ @click="sortBy('nb_pageviews')"
+ :class="{columnSorted: 'nb_pageviews' === sortColumn}"
+ >
+ <span
+ class="arrow"
+ :class="{
+ multisites_asc: !reverse && 'nb_pageviews' === sortColumn,
+ multisites_desc: reverse && 'nb_pageviews' === sortColumn,
+ }"
+ style="margin-right: 3.5px"
+ />
+ <span class="heading">{{ translate('General_ColumnPageviews') }}</span>
+ </th>
+ <th
+ id="revenue"
+ class="multisites-column"
+ v-if="displayRevenueColumn"
+ @click="sortBy('revenue')"
+ :class="{columnSorted: 'revenue' === sortColumn}"
+ >
+ <span
+ class="arrow"
+ :class="{
+ multisites_asc: !reverse && 'revenue' === sortColumn,
+ multisites_desc: reverse && 'revenue' === sortColumn,
+ }"
+ style="margin-right: 3.5px"
+ />
+ <span class="heading">{{ translate('General_ColumnRevenue') }}</span>
+ </th>
+ <th
+ id="evolution"
+ :class="{columnSorted: evolutionSelector === sortColumn}"
+ :colspan="showSparklines ? 2 : 1"
+ >
+ <span
+ class="arrow"
+ :class="{
+ multisites_asc: !reverse && evolutionSelector === sortColumn,
+ multisites_desc: reverse && evolutionSelector === sortColumn,
+ }"
+ style="margin-right: 3.5px"
+ />
+ <span
+ class="evolution"
+ @click="sortBy(evolutionSelector)"
+ style="margin-right: 3.5px"
+ > {{ translate('MultiSites_Evolution') }}</span>
+ <select
+ class="selector browser-default"
+ id="evolution_selector"
+ :value="evolutionSelector"
+ @change="evolutionSelector = $event.target.value; sortBy(evolutionSelector)"
+ >
+ <option value="visits_evolution">{{ translate('General_ColumnNbVisits') }}</option>
+ <option value="pageviews_evolution">
+ {{ translate('General_ColumnPageviews') }}
+ </option>
+ <option
+ value="revenue_evolution"
+ v-if="displayRevenueColumn"
+ >
+ {{ translate('General_ColumnRevenue') }}
+ </option>
+ </select>
+ </th>
+ </tr>
+ </thead>
+ <tbody v-if="isLoading">
+ <tr>
+ <td
+ colspan="7"
+ class="allWebsitesLoading"
+ >
+ <ActivityIndicator
+ :loading-message="loadingMessage"
+ :loading="isLoading"
+ />
+ </td>
+ </tr>
+ </tbody>
+ <tbody v-if="!isLoading">
+ <tr v-if="errorLoadingSites">
+ <td colspan="7">
+ <div class="notification system notification-error">
+ {{ translate('General_ErrorRequest', '', '') }}
+ <br /><br />
+ {{ translate('General_NeedMoreHelp') }}
+ <a
+ rel="noreferrer noopener"
+ target="_blank"
+ href="https://matomo.org/faq/troubleshooting/faq_19489/"
+ >{{ translate('General_Faq') }}</a>
+ &#x2013;
+ <a
+ rel="noreferrer noopener"
+ target="_blank"
+ href="https://forum.matomo.org/"
+ >{{ translate('Feedback_CommunityHelp') }}</a>
+ <span v-show="areAdsForProfessionalServicesEnabled"> &#x2013; </span>
+ <a
+ rel="noreferrer noopener"
+ target="_blank"
+ :href="professionalHelpUrl"
+ v-show="areAdsForProfessionalServicesEnabled"
+ >{{ translate('Feedback_ProfessionalHelp') }}</a>.
+ </div>
+ </td>
+ </tr>
+ <MultisitesSite
+ v-for="website in sites"
+ :key="website.idsite"
+ :website="website"
+ :evolution-metric="evolutionSelector"
+ :date-sparkline="dateSparkline"
+ :show-sparklines="showSparklines"
+ :metric="sortColumn"
+ :display-revenue-column="displayRevenueColumn"
+ >
+ </MultisitesSite>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td
+ colspan="8"
+ class="paging"
+ >
+ <div class="row">
+ <div class="col s3 add_new_site">
+ <a
+ :href="addSiteUrl"
+ v-if="hasSuperUserAccess"
+ >
+ <span class="icon-add" /> {{ translate('SitesManager_AddSite') }}
+ </a>
+ </div>
+ <div class="col s6">
+ <span
+ id="prev"
+ class="previous dataTablePrevious"
+ @click="previousPage()"
+ v-show="!(currentPage === 0)"
+ >
+ <span style="cursor:pointer;">&#xAB; {{ translate('General_Previous') }}</span>
+ </span>
+ <span class="dataTablePages">
+ <span id="counter">
+ {{ translate(
+ 'General_Pagination',
+ paginationLowerBound,
+ paginationUpperBound,
+ numberOfFilteredSites,
+ ) }}
+ </span>
+ </span>
+ <span
+ id="next"
+ class="next dataTableNext"
+ @click="nextPage()"
+ v-show="!(currentPage >= numberOfPages)"
+ >
+ <span
+ style="cursor:pointer;"
+ class="pointer"
+ >{{ translate('General_Next') }} &#xBB;</span>
+ </span>
+ </div>
+ <div class="col s3">&nbsp;</div>
+ </div>
+ </td>
+ </tr>
+ <tr row_id="last">
+ <td
+ colspan="8"
+ class="site_search"
+ >
+ <div class="row">
+ <div class="input-field col s12">
+ <input
+ type="text"
+ @keydown.enter="searchSite(searchTerm)"
+ v-model="searchTerm"
+ :placeholder="translate('Actions_SubmenuSitesearch')"
+ />
+ <span
+ class="icon-search search_ico"
+ @click="searchSite(searchTerm)"
+ :title="translate('General_ClickToSearch')"
+ />
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import {
+ translate,
+ Matomo,
+ EnrichedHeadline,
+ ActivityIndicator,
+ MatomoUrl,
+ getFormattedEvolution,
+} from 'CoreHome';
+import MultisitesSite from '../MultisitesSite/MultisitesSite.vue';
+import DashboardStore from './Dashboard.store';
+
+interface DashboardState {
+ evolutionSelector: string;
+ searchTerm: string;
+}
+
+export default defineComponent({
+ props: {
+ displayRevenueColumn: Boolean,
+ showSparklines: Boolean,
+ dateSparkline: String,
+ pageSize: Number,
+ autoRefreshTodayReport: Number,
+ },
+ components: {
+ EnrichedHeadline,
+ ActivityIndicator,
+ MultisitesSite,
+ },
+ data(): DashboardState {
+ return {
+ evolutionSelector: 'visits_evolution',
+ searchTerm: '',
+ };
+ },
+ created() {
+ if (this.pageSize) {
+ DashboardStore.setPageSize(this.pageSize);
+ }
+ this.refresh(this.autoRefreshTodayReport);
+ },
+ methods: {
+ refresh(interval?: number) {
+ DashboardStore.setRefreshInterval(interval);
+ DashboardStore.fetchAllSites();
+ },
+ sortBy(column: string) {
+ DashboardStore.sortBy(column);
+ },
+ previousPage() {
+ DashboardStore.previousPage();
+ },
+ nextPage() {
+ DashboardStore.nextPage();
+ },
+ searchSite() {
+ DashboardStore.searchSite(this.searchTerm);
+ },
+ },
+ computed: {
+ hasSuperUserAccess() {
+ return Matomo.hasSuperUserAccess;
+ },
+ date() {
+ return MatomoUrl.urlParsed.value.date as string;
+ },
+ idSite() {
+ return MatomoUrl.urlParsed.value.idSite as string;
+ },
+ url() {
+ return Matomo.piwik_url;
+ },
+ period() {
+ return Matomo.period;
+ },
+ areAdsForProfessionalServicesEnabled() {
+ return Matomo.config && Matomo.config.are_ads_enabled;
+ },
+ sortColumn() {
+ return DashboardStore.state.value.sortColumn;
+ },
+ reverse() {
+ return DashboardStore.state.value.reverse;
+ },
+ smallTitleContent() {
+ const state = DashboardStore.state.value;
+ return translate(
+ 'General_TotalVisitsPageviewsActionsRevenue',
+ `<strong>${state.totalVisits}</strong>`,
+ `<strong>${state.totalPageviews}</strong>`,
+ `<strong>${state.totalActions}</strong>`,
+ `<strong>${state.totalRevenue}</strong>`,
+ );
+ },
+ smallTitleTooltip() {
+ const state = DashboardStore.state.value;
+ return translate(
+ 'General_EvolutionSummaryGeneric',
+ translate('General_NVisits', `${state.totalVisits}`),
+ this.date,
+ `${state.lastVisits}`,
+ state.lastVisitsDate,
+ getFormattedEvolution(state.totalVisits, state.lastVisits),
+ );
+ },
+ loadingMessage() {
+ return DashboardStore.state.value.loadingMessage;
+ },
+ isLoading() {
+ return DashboardStore.state.value.isLoading;
+ },
+ errorLoadingSites() {
+ return DashboardStore.state.value.errorLoadingSites;
+ },
+ sites() {
+ return DashboardStore.state.value.sites;
+ },
+ numberOfPages() {
+ return DashboardStore.numberOfPages.value;
+ },
+ currentPage() {
+ return DashboardStore.state.value.currentPage;
+ },
+ paginationLowerBound() {
+ return DashboardStore.paginationLowerBound.value;
+ },
+ paginationUpperBound() {
+ return DashboardStore.paginationUpperBound.value;
+ },
+ numberOfFilteredSites() {
+ return DashboardStore.numberOfFilteredSites.value;
+ },
+ professionalHelpUrl() {
+ return 'https://matomo.org/support-plans/?pk_campaign=Help&pk_medium=AjaxError&pk_content='
+ + 'MultiSites&pk_source=Matomo_App';
+ },
+ addSiteUrl() {
+ return `index.php?module=SitesManager&action=index&showaddsite=1&period=${this.period}&`
+ + `date=${this.date}&idSite=${this.idSite}`;
+ },
+ },
+});
+</script>
diff --git a/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.adapter.ts b/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.adapter.ts
new file mode 100644
index 0000000000..5b74aee43f
--- /dev/null
+++ b/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.adapter.ts
@@ -0,0 +1,34 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import { createAngularJsAdapter } from 'CoreHome';
+import MultisitesSite from './MultisitesSite.vue';
+
+export default createAngularJsAdapter({
+ component: MultisitesSite,
+ scope: {
+ website: {
+ angularJsBind: '=',
+ },
+ evolutionMetric: {
+ angularJsBind: '=',
+ },
+ showSparklines: {
+ angularJsBind: '=',
+ },
+ dateSparkline: {
+ angularJsBind: '=',
+ },
+ displayRevenueColumn: {
+ angularJsBind: '=',
+ },
+ metric: {
+ angularJsBind: '=',
+ },
+ },
+ directiveName: 'piwikMultisitesSite',
+});
diff --git a/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue b/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue
new file mode 100644
index 0000000000..ff0171e9f1
--- /dev/null
+++ b/plugins/MultiSites/vue/src/MultisitesSite/MultisitesSite.vue
@@ -0,0 +1,172 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <tr
+ :class="{'groupedWebsite': website.group, 'website': !website.group, 'group': website.isGroup}"
+ >
+ <td
+ class="multisites-label label"
+ v-if="!website.isGroup"
+ >
+ <a
+ title="View reports"
+ class="value truncated-text-line"
+ :href="dashboardUrl(website)"
+ >
+ {{ websiteLabel }}
+ </a>
+ <span>
+ <a
+ rel="noreferrer noopener"
+ target="_blank"
+ :href="website.main_url"
+ :title="translate('General_GoTo', website.main_url)"
+ >
+ <span class="icon icon-outlink" /></a>
+ </span>
+ </td>
+ <td
+ class="multisites-label label"
+ v-if="website.isGroup"
+ >
+ <span class="value">{{ websiteLabel }}</span>
+ </td>
+ <td class="multisites-column">
+ <span class="value">{{ website.nb_visits }}</span>
+ </td>
+ <td class="multisites-column">
+ <span class="value">{{ website.nb_pageviews }}</span>
+ </td>
+ <td
+ class="multisites-column"
+ v-if="displayRevenueColumn"
+ >
+ <span class="value">{{ website.revenue }}</span>
+ </td>
+ <td
+ class="multisites-evolution"
+ v-if="period !== 'range'"
+ :title="website.tooltip"
+ >
+ <div
+ class="visits value"
+ v-if="!website.isGroup"
+ >
+ <span v-show="website[`${evolutionMetric}_trend`] === 1">
+ <img
+ class="multisites_icon"
+ src="plugins/MultiSites/images/arrow_up.png"
+ alt
+ /> <span style="color: green;">{{ website[evolutionMetric] }}</span>
+ </span>
+ <span v-show="website[`${evolutionMetric}_trend`] === 0">
+ <img
+ class="multisites_icon"
+ src="plugins/MultiSites/images/stop.png"
+ alt
+ /> <span>{{ website[evolutionMetric] }}</span>
+ </span>
+ <span v-show="website[`${evolutionMetric}_trend`] === -1">
+ <img
+ class="multisites_icon"
+ src="plugins/MultiSites/images/arrow_down.png"
+ alt
+ /> <span style="color: red;">{{ website[evolutionMetric] }}</span>
+ </span>
+ </div>
+ </td>
+ <td
+ style="width:180px;"
+ v-if="showSparklines"
+ >
+ <div
+ class="sparkline"
+ style="width: 100px; margin: auto;"
+ v-if="!website.isGroup"
+ >
+ <a
+ rel="noreferrer noopener"
+ target="_blank"
+ :href="dashboardUrl(website)"
+ :title="translate('General_GoTo', translate('Dashboard_DashboardOf', websiteLabel))"
+ >
+ <img
+ alt
+ width="100"
+ height="25"
+ :src="sparklineImage(website)"
+ />
+ </a>
+ </div>
+ </td>
+ </tr>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import { Matomo, MatomoUrl, Site } from 'CoreHome';
+
+export default defineComponent({
+ props: {
+ website: {
+ type: Object,
+ required: true,
+ },
+ evolutionMetric: {
+ type: String,
+ required: true,
+ },
+ showSparklines: Boolean,
+ dateSparkline: String,
+ displayRevenueColumn: Boolean,
+ metric: String,
+ },
+ methods: {
+ dashboardUrl(website: Site) {
+ return `index.php?module=CoreHome&action=index&date=${this.date}&period=${this.period}`
+ + `&idSite=${website.idsite}${this.tokenParam}`;
+ },
+ sparklineImage(website: Site) {
+ let { metric } = this;
+
+ switch (this.evolutionMetric) {
+ case 'visits_evolution':
+ metric = 'nb_visits';
+ break;
+ case 'pageviews_evolution':
+ metric = 'nb_pageviews';
+ break;
+ case 'revenue_evolution':
+ metric = 'revenue';
+ break;
+ default:
+ break;
+ }
+
+ return `index.php?module=MultiSites&action=getEvolutionGraph&period=${this.period}&date=`
+ + `${this.dateSparkline}&evolutionBy=${metric}&columns=${metric}&idSite=${website.idsite}`
+ + `&idsite=${website.idsite}&viewDataTable=sparkline${this.tokenParam}&colors=`
+ + `${encodeURIComponent(JSON.stringify(Matomo.getSparklineColors()))}`;
+ },
+ },
+ computed: {
+ tokenParam() {
+ const token_auth = MatomoUrl.urlParsed.value.token_auth as string;
+ return token_auth ? `&token_auth=${token_auth}` : '';
+ },
+ period() {
+ return Matomo.period;
+ },
+ date() {
+ return MatomoUrl.urlParsed.value.date as string;
+ },
+ websiteLabel() {
+ return Matomo.helper.htmlDecode(this.website.label);
+ },
+ },
+});
+</script>
diff --git a/plugins/MultiSites/vue/src/index.ts b/plugins/MultiSites/vue/src/index.ts
new file mode 100644
index 0000000000..b7042f0ce9
--- /dev/null
+++ b/plugins/MultiSites/vue/src/index.ts
@@ -0,0 +1,13 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+import './MultisitesSite/MultisitesSite.adapter';
+import './Dashboard/Dashboard.adapter';
+
+export { default as MultisitesSite } from './MultisitesSite/MultisitesSite.vue';
+export { default as DashboadStore } from './Dashboard/Dashboard.store';
+export { default as Dashboard } from './Dashboard/Dashboard.vue';