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

227 lines
8.4 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('SitesManagerSiteController', SitesManagerSiteController);
SitesManagerSiteController.$inject = ['$scope', '$filter', 'sitesManagerApiHelper', 'sitesManagerTypeModel', 'piwikApi', '$timeout'];
function SitesManagerSiteController($scope, $filter, sitesManagerApiHelper, sitesManagerTypeModel, piwikApi, $timeout) {
var translate = $filter('translate');
var updateView = function () {
$timeout(function () {
$('.editingSite').find('select').material_select();
Materialize.updateTextFields();
});
}
var init = function () {
initModel();
initActions();
$scope.site.isLoading = true;
sitesManagerTypeModel.fetchTypeById($scope.site.type).then(function (type) {
$scope.site.isLoading = false;
if (type) {
$scope.currentType = type;
$scope.howToSetupUrl = type.howToSetupUrl;
$scope.isInternalSetupUrl = '?' === ('' + type.howToSetupUrl).substr(0, 1);
$scope.typeSettings = type.settings;
if (isSiteNew()) {
$scope.measurableSettings = angular.copy(type.settings);
}
} else {
$scope.currentType = {name: $scope.site.type};
}
});
};
var initActions = function () {
$scope.editSite = editSite;
$scope.saveSite = saveSite;
$scope.openDeleteDialog = openDeleteDialog;
$scope.site['delete'] = deleteSite;
};
var initModel = function() {
if (isSiteNew()) {
initNewSite();
} else {
$scope.site.excluded_ips = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_ips);
$scope.site.excluded_parameters = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_parameters);
$scope.site.excluded_user_agents = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_user_agents);
$scope.site.sitesearch_keyword_parameters = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.sitesearch_keyword_parameters);
$scope.site.sitesearch_category_parameters = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.sitesearch_category_parameters);
}
$scope.site.removeDialog = {};
updateView();
};
var editSite = function () {
$scope.site.editMode = true;
$scope.measurableSettings = [];
$scope.site.isLoading = true;
piwikApi.fetch({method: 'SitesManager.getSiteSettings', idSite: $scope.site.idsite}).then(function (settings) {
$scope.measurableSettings = settings;
$scope.site.isLoading = false;
}, function () {
$scope.site.isLoading = false;
});
updateView();
};
var saveSite = function() {
var sendSiteSearchKeywordParams = $scope.site.sitesearch == '1' && !$scope.site.useDefaultSiteSearchParams;
var sendSearchCategoryParameters = sendSiteSearchKeywordParams && $scope.customVariablesActivated;
var values = {
siteName: $scope.site.name,
timezone: $scope.site.timezone,
currency: $scope.site.currency,
type: $scope.site.type,
settingValues: {}
};
var isNewSite = isSiteNew();
var apiMethod = 'SitesManager.addSite';
if (!isNewSite) {
apiMethod = 'SitesManager.updateSite';
values.idSite = $scope.site.idsite;
}
angular.forEach($scope.measurableSettings, function (settings) {
if (!values['settingValues'][settings.pluginName]) {
values['settingValues'][settings.pluginName] = [];
}
angular.forEach(settings.settings, function (setting) {
var value = setting.value;
if (value === false) {
value = '0';
} else if (value === true) {
value = '1';
}
if (angular.isArray(value) && setting.uiControl == 'textarea') {
var newValue = [];
angular.forEach(value, function (val) {
// as they are line separated we cannot trim them in the view
if (val) {
newValue.push(val);
}
});
value = newValue;
}
values['settingValues'][settings.pluginName].push({
name: setting.name,
value: value
});
});
});
piwikApi.post({method: apiMethod}, values).then(function (response) {
$scope.site.editMode = false;
var UI = require('piwik/UI');
var notification = new UI.Notification();
var message = 'Website updated';
if (isNewSite) {
message = 'Website created';
}
notification.show(message, {context: 'success', id: 'websitecreated'});
notification.scrollToNotification();
if (!$scope.site.idsite && response && response.value) {
$scope.site.idsite = response.value;
}
angular.forEach(values.settingValues, function (settings, pluginName) {
angular.forEach(settings, function (setting) {
if (setting.name === 'urls') {
$scope.site.alias_urls = setting.value;
} else {
$scope.site[setting.name] = setting.value;
}
});
});
});
};
var isSiteNew = function() {
return angular.isUndefined($scope.site.idsite);
};
var initNewSite = function() {
$scope.site.editMode = true;
$scope.site.timezone = $scope.globalSettings.defaultTimezone;
$scope.site.currency = $scope.globalSettings.defaultCurrency;
if ($scope.typeSettings) {
// we do not want to manipulate initial type settings
$scope.measurableSettings = angular.copy($scope.typeSettings);
}
};
var openDeleteDialog = function() {
$scope.site.removeDialog.title = translate('SitesManager_DeleteConfirm', '"' + $scope.site.name + '" (idSite = ' + $scope.site.idsite + ')');
$scope.site.removeDialog.show = true;
};
var deleteSite = function() {
var redirectParams = $scope.redirectParams;
// if the current idSite in the URL is the site we're deleting, then we have to make to change it. otherwise,
// if a user goes to another page, the invalid idSite may cause a fatal error.
if (broadcast.getValueFromUrl('idSite') == $scope.site.idsite) {
var sites = $scope.adminSites.sites;
var otherSite;
for (var i = 0; i !== sites.length; ++i) {
if (sites[i].idsite != $scope.site.idsite) {
otherSite = sites[i];
break;
}
}
if (otherSite) {
redirectParams = $.extend({}, redirectParams, { idSite: otherSite.idsite });
}
}
var ajaxHandler = new ajaxHelper();
ajaxHandler.addParams({
idSite: $scope.site.idsite,
module: 'API',
format: 'json',
method: 'SitesManager.deleteSite'
}, 'GET');
ajaxHandler.redirectOnSuccess(redirectParams);
ajaxHandler.setLoadingElement();
ajaxHandler.send();
};
init();
}
})();