Files
Leitgedanken/msd2/tracking/piwik/plugins/MultiSites/angularjs/dashboard/dashboard-model.service.js
2023-01-23 11:03:31 +01:00

185 lines
5.7 KiB
JavaScript

/**
* 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) {
site.visits_evolution = parseInt(site.visits_evolution, 10);
site.pageviews_evolution = parseInt(site.pageviews_evolution, 10);
site.revenue_evolution = parseInt(site.revenue_evolution, 10);
});
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 previousPage() {
model.currentPage = model.currentPage - 1;
fetchAllSites();
}
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,pageviews_evolution,revenue_evolution,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);
}
});
}
}
})();