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

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);