portainer/app/docker/views/configs/create/createConfigController.js

119 lines
3.4 KiB
JavaScript

angular.module('portainer.docker')
.controller('CreateConfigController', ['$scope', '$state', '$transition$', 'Notifications', 'ConfigService', 'Authentication', 'FormValidator', 'ResourceControlService',
function ($scope, $state, $transition$, Notifications, ConfigService, Authentication, FormValidator, ResourceControlService) {
$scope.formValues = {
Name: '',
Labels: [],
AccessControlData: new AccessControlFormData(),
ConfigContent: ''
};
$scope.state = {
formValidationError: ''
};
$scope.addLabel = function() {
$scope.formValues.Labels.push({ name: '', value: ''});
};
$scope.removeLabel = function(index) {
$scope.formValues.Labels.splice(index, 1);
};
function prepareLabelsConfig(config) {
var labels = {};
$scope.formValues.Labels.forEach(function (label) {
if (label.name && label.value) {
labels[label.name] = label.value;
}
});
config.Labels = labels;
}
function prepareConfigData(config) {
var configData = $scope.formValues.ConfigContent;
config.Data = btoa(unescape(encodeURIComponent(configData)));
}
function prepareConfiguration() {
var config = {};
config.Name = $scope.formValues.Name;
prepareConfigData(config);
prepareLabelsConfig(config);
return config;
}
function validateForm(accessControlData, isAdmin) {
$scope.state.formValidationError = '';
var error = '';
error = FormValidator.validateAccessControl(accessControlData, isAdmin);
if (error) {
$scope.state.formValidationError = error;
return false;
}
return true;
}
$scope.create = function () {
var accessControlData = $scope.formValues.AccessControlData;
var userDetails = Authentication.getUserDetails();
var isAdmin = userDetails.role === 1;
if ($scope.formValues.ConfigContent === '') {
$scope.state.formValidationError = 'Config content must not be empty';
return;
}
if (!validateForm(accessControlData, isAdmin)) {
return;
}
var config = prepareConfiguration();
ConfigService.create(config)
.then(function success(data) {
var configIdentifier = data.ID;
var userId = userDetails.ID;
return ResourceControlService.applyResourceControl('config', configIdentifier, userId, accessControlData, []);
})
.then(function success() {
Notifications.success('Config successfully created');
$state.go('docker.configs', {}, {reload: true});
})
.catch(function error(err) {
Notifications.error('Failure', err, 'Unable to create config');
});
};
$scope.editorUpdate = function(cm) {
$scope.formValues.ConfigContent = cm.getValue();
};
function initView() {
if (!$transition$.params().id) {
$scope.formValues.displayCodeEditor = true;
return;
}
ConfigService.config($transition$.params().id)
.then(function success(data) {
$scope.formValues.Name = data.Name + '_copy';
$scope.formValues.Data = data.Data;
var labels = _.keys(data.Labels);
for (var i = 0; i < labels.length; i++) {
var labelName = labels[i];
var labelValue = data.Labels[labelName];
$scope.formValues.Labels.push({ name: labelName, value: labelValue});
}
$scope.formValues.displayCodeEditor = true;
})
.catch(function error(err) {
$scope.formValues.displayCodeEditor = true;
Notifications.error('Failure', err, 'Unable to clone config');
});
}
initView();
}]);