2023-01-23 11:03:31 +01:00

160 lines
5.9 KiB
JavaScript

/*!
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
(function () {
angular.module('piwikApp').controller('ManageGdprController', ManageGdprController);
ManageGdprController.$inject = ["$scope", "piwikApi", "piwik", "$timeout"];
function ManageGdprController($scope, piwikApi, piwik, $timeout) {
var self = this;
this.isLoading = false;
this.isDeleting = false;
this.site = {id: 'all', name: 'All Websites'};
this.segment_filter = 'userId==';
this.dataSubjects = [];
this.toggleAll = true;
this.hasSearched = false
var sitesPromise = piwikApi.fetch({method: 'SitesManager.getSitesIdWithAdminAccess', filter_limit: '-1'});
this.linkTo = function (action){
var currentUrl = window.location.pathname + window.location.search;
var newUrl = piwik.broadcast.updateParamValue('module=PrivacyManager', currentUrl);
newUrl = piwik.broadcast.updateParamValue('action=' + action, newUrl);
return newUrl;
}
function showSuccessNotification(message)
{
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(message, {context: 'success', id: 'manageGdpr'});
$timeout(function () {
notification.scrollToNotification();
}, 200);
}
this.toggleActivateAll = function () {
var toggleAll = this.toggleAll;
angular.forEach(this.dataSubjects, function (dataSubject) {
dataSubject.dataSubjectActive = toggleAll;
});
};
this.hasActiveDataSubjects = function()
{
return !!this.getActivatedDataSubjects().length;
};
this.getActivatedDataSubjects = function () {
var visitsToDelete = [];
angular.forEach(this.dataSubjects, function (visit) {
if (visit.dataSubjectActive) {
visitsToDelete.push({idsite: visit.idSite, idvisit: visit.idVisit});
}
});
return visitsToDelete;
}
this.showProfile = function (visitorId, idSite) {
require('piwik/UI').VisitorProfileControl.showPopover(visitorId, idSite);
};
this.exportDataSubject = function () {
var visitsToDelete = this.getActivatedDataSubjects();
piwikApi.post({
module: 'API',
method: 'PrivacyManager.exportDataSubjects',
format: 'json',
filter_limit: -1,
}, {visits: visitsToDelete}).then(function (visits) {
showSuccessNotification('Visits were successfully exported');
piwik.helper.sendContentAsDownload('exported_data_subjects.json', JSON.stringify(visits));
});
};
this.deleteDataSubject = function () {
piwik.helper.modalConfirm('#confirmDeleteDataSubject', {yes: function () {
self.isDeleting = true;
var visitsToDelete = self.getActivatedDataSubjects();
piwikApi.post({
module: 'API',
method: 'PrivacyManager.deleteDataSubjects',
filter_limit: -1,
}, {visits: visitsToDelete}).then(function (visits) {
self.dataSubjects = [];
self.isDeleting = false;
showSuccessNotification('Visits were successfully deleted');
self.findDataSubjects();
}, function () {
self.isDeleting = false;
});
}});
};
this.addFilter = function (segment, value) {
this.segment_filter += ',' + segment + '==' + value;
this.findDataSubjects();
};
this.findDataSubjects = function () {
this.dataSubjects = [];
this.isLoading = true;
this.toggleAll = true;
function addDatePadding(number)
{
if (number < 10) {
return '0' + number;
}
return number;
}
var now = new Date();
var dateString = (now.getFullYear() + 2) + '-' + addDatePadding(now.getMonth() + 1) + '-' + addDatePadding(now.getDay());
// we are adding two years to make sure to also capture some requests in the future as we fetch data across
// different sites and different timezone and want to avoid missing any possible requests
sitesPromise.then(function (idsites) {
var siteIds = self.site.id;
if (siteIds === 'all' && !piwik.hasSuperUserAccess) {
// when superuser, we speed the request up a little and simply use 'all'
siteIds = idsites;
if (angular.isArray(idsites)) {
siteIds = idsites.join(',');
}
}
piwikApi.fetch({
idSite: siteIds,
period: 'range',
date: '1998-01-01,today',
module: 'API',
method: 'Live.getLastVisitsDetails',
segment: self.segment_filter,
filter_limit: 401,
doNotFetchActions: 1
}).then(function (visits) {
self.hasSearched = true;
angular.forEach(visits, function (visit) {
visit.dataSubjectActive = true;
});
self.dataSubjects = visits;
self.isLoading = false;
}, function () {
self.isLoading = false;
});
});
};
}
})();