pve-manager/www/manager6/window/DirMapEdit.js
Thomas Lamprecht af50ee6a70 ui: directory mapping: use actual words in the title
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2025-04-08 11:10:09 +02:00

205 lines
4.4 KiB
JavaScript

Ext.define('PVE.window.DirMapEditWindow', {
extend: 'Proxmox.window.Edit',
mixins: ['Proxmox.Mixin.CBind'],
cbindData: function(initialConfig) {
let me = this;
me.isCreate = !me.name;
me.method = me.isCreate ? 'POST' : 'PUT';
me.hideMapping = !!me.entryOnly;
me.hideComment = me.name && !me.entryOnly;
me.hideNodeSelector = me.nodename || me.entryOnly;
me.hideNode = !me.nodename || !me.hideNodeSelector;
return {
name: me.name,
nodename: me.nodename,
};
},
submitUrl: function(_url, data) {
let me = this;
let name = me.isCreate ? '' : me.name;
return `/cluster/mapping/dir/${name}`;
},
title: gettext('Add Directory Mapping'),
onlineHelp: 'resource_mapping',
method: 'POST',
controller: {
xclass: 'Ext.app.ViewController',
onGetValues: function(values) {
let me = this;
let view = me.getView();
values.node ??= view.nodename;
let name = values.name;
let description = values.description;
let deletes = values.delete;
delete values.description;
delete values.name;
delete values.delete;
let map = [];
if (me.originalMap) {
map = PVE.Parser.filterPropertyStringList(me.originalMap, (e) => e.node !== values.node);
}
if (values.path) {
// TODO: Remove this when property string supports quotation of properties
if (!/^\/[^;,=()]+/.test(values.path)) {
let errMsg = "Value does not look like a valid absolute path."
+" These symbols are currently not allowed in path: ;,=()\n";
Ext.Msg.alert(gettext('Error'), errMsg);
// prevent sending a broken property string to the API
throw errMsg;
}
map.push(PVE.Parser.printPropertyString(values));
}
values = { map };
if (description) {
values.description = description;
}
if (deletes && !view.isCreate) {
values.delete = deletes;
}
if (view.isCreate) {
values.id = name;
}
return values;
},
onSetValues: function(values) {
let me = this;
let view = me.getView();
me.originalMap = [...values.map];
let configuredNodes = [];
PVE.Parser.filterPropertyStringList(values.map, (e) => {
configuredNodes.push(e.node);
if (e.node === view.nodename) {
values = e;
}
return false;
});
me.lookup('nodeselector').disallowedNodes = configuredNodes;
return values;
},
init: function(view) {
let me = this;
if (!view.nodename) {
//throw "no nodename given";
}
},
},
items: [
{
xtype: 'inputpanel',
onGetValues: function(values) {
return this.up('window').getController().onGetValues(values);
},
onSetValues: function(values) {
return this.up('window').getController().onSetValues(values);
},
columnT: [
{
xtype: 'displayfield',
reference: 'directory-hint',
columnWidth: 1,
value: 'Make sure the directory exists.',
cbind: {
disabled: '{hideMapping}',
hidden: '{hideMapping}',
},
userCls: 'pmx-hint',
},
],
column1: [
{
xtype: 'pmxDisplayEditField',
fieldLabel: gettext('Name'),
cbind: {
editable: '{!name}',
value: '{name}',
submitValue: '{isCreate}',
},
name: 'name',
allowBlank: false,
},
{
xtype: 'pveNodeSelector',
reference: 'nodeselector',
fieldLabel: gettext('Node'),
name: 'node',
cbind: {
disabled: '{hideNodeSelector}',
hidden: '{hideNodeSelector}',
},
allowBlank: false,
},
],
column2: [
{
xtype: 'fieldcontainer',
defaultType: 'radiofield',
layout: 'fit',
cbind: {
disabled: '{hideMapping}',
hidden: '{hideMapping}',
},
items: [
{
xtype: 'textfield',
name: 'path',
reference: 'path',
value: '',
emptyText: gettext('/some/path'),
cbind: {
nodename: '{nodename}',
disabled: '{hideMapping}',
},
allowBlank: false,
fieldLabel: gettext('Path'),
},
],
},
],
columnB: [
{
xtype: 'fieldcontainer',
defaultType: 'radiofield',
layout: 'fit',
cbind: {
disabled: '{hideComment}',
hidden: '{hideComment}',
},
items: [
{
xtype: 'proxmoxtextfield',
fieldLabel: gettext('Comment'),
submitValue: true,
name: 'description',
deleteEmpty: true,
},
],
},
],
},
],
});