299 lines
9.6 KiB
JavaScript
299 lines
9.6 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
|
|
*/
|
|
|
|
/**
|
|
* Usage:
|
|
* <piwik-user-permissions-edit>
|
|
*/
|
|
(function () {
|
|
angular.module('piwikApp').component('piwikUserPermissionsEdit', {
|
|
templateUrl: 'plugins/UsersManager/angularjs/user-permissions-edit/user-permissions-edit.component.html?cb=' + piwik.cacheBuster,
|
|
bindings: {
|
|
userLogin: '<',
|
|
limit: '<',
|
|
onUserHasAccessDetected: '&',
|
|
onAccessChange: '&',
|
|
accessLevels: '<',
|
|
filterAccessLevels: '<'
|
|
},
|
|
controller: UserPermissionsEditController
|
|
});
|
|
|
|
UserPermissionsEditController.$inject = ['piwikApi', '$element', '$q'];
|
|
|
|
function UserPermissionsEditController(piwikApi, $element, $q) {
|
|
var vm = this;
|
|
|
|
// search/pagination state
|
|
vm.siteAccess = [];
|
|
vm.offset = 0;
|
|
vm.totalEntries = null;
|
|
vm.accessLevelFilter = '';
|
|
vm.siteNameFilter = '';
|
|
vm.isLoadingAccess = false;
|
|
vm.allWebsitesAccssLevelSet = 'view';
|
|
|
|
// row selection state
|
|
vm.isAllCheckboxSelected = false;
|
|
vm.selectedRows = {};
|
|
vm.isBulkActionsDisabled = true;
|
|
vm.areAllResultsSelected = false;
|
|
vm.previousRole = null;
|
|
|
|
// other state
|
|
vm.hasAccessToAtLeastOneSite = true;
|
|
vm.isRoleHelpToggled = false;
|
|
vm.isCapabilitiesHelpToggled = false;
|
|
vm.isGivingAccessToAllSites = false;
|
|
|
|
// intermediate state
|
|
vm.roleToChangeTo = null;
|
|
vm.siteAccessToChange = null;
|
|
|
|
vm.$onInit = $onInit;
|
|
vm.$onChanges = $onChanges;
|
|
vm.onAllCheckboxChange = onAllCheckboxChange;
|
|
vm.onRowSelected = onRowSelected;
|
|
vm.getPaginationLowerBound = getPaginationLowerBound;
|
|
vm.getPaginationUpperBound = getPaginationUpperBound;
|
|
vm.fetchAccess = fetchAccess;
|
|
vm.gotoPreviousPage = gotoPreviousPage;
|
|
vm.gotoNextPage = gotoNextPage;
|
|
vm.showRemoveAccessConfirm = showRemoveAccessConfirm;
|
|
vm.getSelectedRowsCount = getSelectedRowsCount;
|
|
vm.getAffectedSitesCount = getAffectedSitesCount;
|
|
vm.changeUserRole = changeUserRole;
|
|
vm.showChangeAccessConfirm = showChangeAccessConfirm;
|
|
vm.getRoleDisplay = getRoleDisplay;
|
|
vm.showAddExistingUserModal = showAddExistingUserModal;
|
|
vm.giveAccessToAllSites = giveAccessToAllSites;
|
|
vm.showChangeAccessAllSitesModal = showChangeAccessAllSitesModal;
|
|
|
|
function giveAccessToAllSites() {
|
|
vm.isGivingAccessToAllSites = true;
|
|
piwikApi.fetch({
|
|
method: 'SitesManager.getSitesWithAdminAccess',
|
|
}).then(function (allSites) {
|
|
var idSites = allSites.map(function (s) { return s.idsite; });
|
|
return piwikApi.post({
|
|
method: 'UsersManager.setUserAccess'
|
|
}, {
|
|
userLogin: vm.userLogin,
|
|
access: vm.allWebsitesAccssLevelSet,
|
|
'idSites[]': idSites,
|
|
});
|
|
}).then(function () {
|
|
return vm.fetchAccess();
|
|
})['finally'](function () {
|
|
vm.isGivingAccessToAllSites = false;
|
|
});
|
|
}
|
|
|
|
function showChangeAccessAllSitesModal() {
|
|
$element.find('.confirm-give-access-all-sites').openModal({ dismissible: false });
|
|
}
|
|
|
|
function $onInit() {
|
|
vm.limit = vm.limit || 10;
|
|
|
|
resetSiteToAdd();
|
|
fetchAccess();
|
|
}
|
|
|
|
function $onChanges() {
|
|
vm.accessLevels = vm.accessLevels.filter(shouldShowAccessLevel);
|
|
vm.filterAccessLevels = vm.filterAccessLevels.filter(shouldShowAccessLevel);
|
|
|
|
if (vm.limit) {
|
|
fetchAccess();
|
|
}
|
|
|
|
function shouldShowAccessLevel(entry) {
|
|
return entry.key !== 'superuser';
|
|
}
|
|
}
|
|
|
|
function fetchAccess() {
|
|
vm.isLoadingAccess = true;
|
|
piwikApi.fetch({
|
|
method: 'UsersManager.getSitesAccessForUser',
|
|
limit: vm.limit,
|
|
offset: vm.offset,
|
|
filter_search: vm.siteNameFilter,
|
|
filter_access: vm.accessLevelFilter,
|
|
userLogin: vm.userLogin
|
|
}, { includeHeaders: true }).then(function (result) {
|
|
vm.isLoadingAccess = false;
|
|
vm.siteAccess = result.response;
|
|
vm.totalEntries = parseInt(result.headers('x-matomo-total-results')) || 0;
|
|
vm.hasAccessToAtLeastOneSite = !! result.headers('x-matomo-has-some');
|
|
|
|
if (vm.onUserHasAccessDetected) {
|
|
vm.onUserHasAccessDetected({ hasAccess: vm.hasAccessToAtLeastOneSite });
|
|
}
|
|
|
|
clearSelection();
|
|
}).catch(function () {
|
|
vm.isLoadingAccess = false;
|
|
|
|
clearSelection();
|
|
});
|
|
}
|
|
|
|
function getAllSitesInSearch() {
|
|
return piwikApi.fetch({
|
|
method: 'UsersManager.getSitesAccessForUser',
|
|
filter_search: vm.siteNameFilter,
|
|
filter_access: vm.accessLevelFilter,
|
|
userLogin: vm.userLogin,
|
|
filter_limit: '-1'
|
|
}).then(function (access) {
|
|
return access.map(function (a) { return a.idsite; });
|
|
});
|
|
}
|
|
|
|
function clearSelection() {
|
|
vm.selectedRows = {};
|
|
vm.areAllResultsSelected = false;
|
|
vm.isBulkActionsDisabled = true;
|
|
vm.isAllCheckboxSelected = false;
|
|
vm.siteAccessToChange = null;
|
|
}
|
|
|
|
function onAllCheckboxChange() {
|
|
if (!vm.isAllCheckboxSelected) {
|
|
clearSelection();
|
|
} else {
|
|
for (var i = 0; i !== vm.siteAccess.length; ++i) {
|
|
vm.selectedRows[i] = true;
|
|
}
|
|
vm.isBulkActionsDisabled = false;
|
|
}
|
|
}
|
|
|
|
function onRowSelected() {
|
|
var selectedRowKeyCount = getSelectedRowsCount();
|
|
vm.isBulkActionsDisabled = selectedRowKeyCount === 0;
|
|
vm.isAllCheckboxSelected = selectedRowKeyCount === vm.siteAccess.length;
|
|
}
|
|
|
|
function getPaginationLowerBound() {
|
|
return vm.offset + 1;
|
|
}
|
|
|
|
function getPaginationUpperBound() {
|
|
return Math.min(vm.offset + vm.limit, vm.totalEntries);
|
|
}
|
|
|
|
function resetSiteToAdd() {
|
|
vm.siteToAdd = {
|
|
id: null,
|
|
name: ''
|
|
};
|
|
}
|
|
|
|
function changeUserRole() {
|
|
vm.isLoadingAccess = true;
|
|
|
|
return $q.resolve().then(function () {
|
|
if (vm.siteAccessToChange) {
|
|
return [vm.siteAccessToChange.idsite];
|
|
}
|
|
|
|
if (vm.areAllResultsSelected) {
|
|
return getAllSitesInSearch();
|
|
}
|
|
|
|
return getSelectedSites();
|
|
}).then(function (idSites) {
|
|
return piwikApi.post({
|
|
method: 'UsersManager.setUserAccess'
|
|
}, {
|
|
userLogin: vm.userLogin,
|
|
access: vm.roleToChangeTo,
|
|
'idSites[]': idSites
|
|
});
|
|
}).catch(function () {
|
|
// ignore (errors will still be displayed to the user)
|
|
}).then(function () {
|
|
vm.onAccessChange();
|
|
|
|
return fetchAccess();
|
|
});
|
|
}
|
|
|
|
function getSelectedSites() {
|
|
var result = [];
|
|
Object.keys(vm.selectedRows).forEach(function (index) {
|
|
if (vm.selectedRows[index]
|
|
&& vm.siteAccess[index] // safety check
|
|
) {
|
|
result.push(vm.siteAccess[index].idsite);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
|
|
function gotoPreviousPage() {
|
|
vm.offset = Math.max(0, vm.offset - vm.limit);
|
|
|
|
fetchAccess();
|
|
}
|
|
|
|
function gotoNextPage() {
|
|
var newOffset = vm.offset + vm.limit;
|
|
if (newOffset >= vm.totalEntries) {
|
|
return;
|
|
}
|
|
|
|
vm.offset = newOffset;
|
|
fetchAccess();
|
|
}
|
|
|
|
function showRemoveAccessConfirm() {
|
|
$element.find('.delete-access-confirm-modal').openModal({ dismissible: false });
|
|
}
|
|
|
|
function showChangeAccessConfirm() {
|
|
$element.find('.change-access-confirm-modal').openModal({ dismissible: false });
|
|
}
|
|
|
|
function showAddExistingUserModal() {
|
|
$element.find('.add-existing-user-modal').openModal({ dismissible: false });
|
|
}
|
|
|
|
function getSelectedRowsCount() {
|
|
var selectedRowKeyCount = 0;
|
|
Object.keys(vm.selectedRows).forEach(function (key) {
|
|
if (vm.selectedRows[key]) {
|
|
++selectedRowKeyCount;
|
|
}
|
|
});
|
|
return selectedRowKeyCount;
|
|
}
|
|
|
|
function getAffectedSitesCount() {
|
|
if (vm.areAllResultsSelected) {
|
|
return vm.totalEntries;
|
|
}
|
|
|
|
return getSelectedRowsCount();
|
|
}
|
|
|
|
function getRoleDisplay(role) {
|
|
var result = null;
|
|
vm.accessLevels.forEach(function (entry) {
|
|
if (entry.key === role) {
|
|
result = entry.value;
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
}
|
|
|
|
})();
|