mirror of https://github.com/portainer/portainer
143 lines
4.0 KiB
JavaScript
143 lines
4.0 KiB
JavaScript
import _ from "lodash-es";
|
|
import { AccessControlFormData } from "Portainer/components/accessControlForm/porAccessControlFormModel";
|
|
|
|
import angular from "angular";
|
|
|
|
class CreateConfigController {
|
|
/* @ngInject */
|
|
constructor($async, $state, $transition$, Notifications, ConfigService, Authentication, FormValidator, ResourceControlService) {
|
|
this.$state = $state;
|
|
this.$transition$ = $transition$;
|
|
this.Notifications = Notifications;
|
|
this.ConfigService = ConfigService;
|
|
this.Authentication = Authentication;
|
|
this.FormValidator = FormValidator;
|
|
this.ResourceControlService = ResourceControlService;
|
|
this.$async = $async;
|
|
|
|
this.formValues = {
|
|
Name: "",
|
|
Labels: [],
|
|
AccessControlData: new AccessControlFormData(),
|
|
ConfigContent: ""
|
|
};
|
|
|
|
this.state = {
|
|
formValidationError: ""
|
|
};
|
|
|
|
this.editorUpdate = this.editorUpdate.bind(this);
|
|
this.createAsync = this.createAsync.bind(this);
|
|
}
|
|
|
|
async $onInit() {
|
|
if (!this.$transition$.params().id) {
|
|
this.formValues.displayCodeEditor = true;
|
|
return;
|
|
}
|
|
|
|
try {
|
|
let data = await this.ConfigService.config(this.$transition$.params().id);
|
|
this.formValues.Name = data.Name + "_copy";
|
|
this.formValues.Data = data.Data;
|
|
let labels = _.keys(data.Labels);
|
|
for (let i = 0; i < labels.length; i++) {
|
|
let labelName = labels[i];
|
|
let labelValue = data.Labels[labelName];
|
|
this.formValues.Labels.push({ name: labelName, value: labelValue });
|
|
}
|
|
this.formValues.displayCodeEditor = true;
|
|
} catch (err) {
|
|
this.formValues.displayCodeEditor = true;
|
|
this.Notifications.error("Failure", err, "Unable to clone config");
|
|
}
|
|
}
|
|
|
|
addLabel() {
|
|
this.formValues.Labels.push({ name: "", value: "" });
|
|
}
|
|
|
|
removeLabel(index) {
|
|
this.formValues.Labels.splice(index, 1);
|
|
}
|
|
|
|
prepareLabelsConfig(config) {
|
|
let labels = {};
|
|
this.formValues.Labels.forEach(function(label) {
|
|
if (label.name && label.value) {
|
|
labels[label.name] = label.value;
|
|
}
|
|
});
|
|
config.Labels = labels;
|
|
}
|
|
|
|
prepareConfigData(config) {
|
|
let configData = this.formValues.ConfigContent;
|
|
config.Data = btoa(unescape(encodeURIComponent(configData)));
|
|
}
|
|
|
|
prepareConfiguration() {
|
|
let config = {};
|
|
config.Name = this.formValues.Name;
|
|
this.prepareConfigData(config);
|
|
this.prepareLabelsConfig(config);
|
|
return config;
|
|
}
|
|
|
|
validateForm(accessControlData, isAdmin) {
|
|
this.state.formValidationError = "";
|
|
let error = "";
|
|
error = this.FormValidator.validateAccessControl(
|
|
accessControlData,
|
|
isAdmin
|
|
);
|
|
|
|
if (error) {
|
|
this.state.formValidationError = error;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
create() {
|
|
return this.$async(this.createAsync);
|
|
}
|
|
|
|
async createAsync() {
|
|
const accessControlData = this.formValues.AccessControlData;
|
|
const userDetails = this.Authentication.getUserDetails();
|
|
const isAdmin = this.Authentication.isAdmin();
|
|
|
|
if (this.formValues.ConfigContent === "") {
|
|
this.state.formValidationError = "Config content must not be empty";
|
|
return;
|
|
}
|
|
|
|
if (!this.validateForm(accessControlData, isAdmin)) {
|
|
return;
|
|
}
|
|
|
|
const config = this.prepareConfiguration();
|
|
|
|
try {
|
|
const data = await this.ConfigService.create(config);
|
|
const resourceControl = data.Portainer.ResourceControl;
|
|
const userId = userDetails.ID;
|
|
await this.ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);
|
|
this.Notifications.success("Config successfully created");
|
|
this.$state.go("docker.configs", {}, { reload: true });
|
|
} catch (err) {
|
|
this.Notifications.error("Failure", err, "Unable to create config");
|
|
}
|
|
}
|
|
|
|
editorUpdate(cm) {
|
|
this.formValues.ConfigContent = cm.getValue();
|
|
}
|
|
}
|
|
|
|
export default CreateConfigController;
|
|
angular
|
|
.module("portainer.docker")
|
|
.controller("CreateConfigController", CreateConfigController);
|