[pve-devel] [PATCH manager v2 2/8] move lxc mountpoint edit from ResourceEdit.js to MPEdit.js
Dominik Csapak
d.csapak at proxmox.com
Fri Nov 10 14:49:21 CET 2017
to follow qemu code
also fix the jslint errors in MountPointInputPanel and MountPointEdit
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes since v1:
* fixed typos
www/manager6/Makefile | 1 +
www/manager6/lxc/MPEdit.js | 405 +++++++++++++++++++++++++++++++++++++++
www/manager6/lxc/ResourceEdit.js | 401 --------------------------------------
3 files changed, 406 insertions(+), 401 deletions(-)
create mode 100644 www/manager6/lxc/MPEdit.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 52d2f117..6f5b72ca 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -175,6 +175,7 @@ JSSRC= \
lxc/Snapshot.js \
lxc/ResourceEdit.js \
lxc/MPResize.js \
+ lxc/MPEdit.js \
pool/StatusView.js \
pool/Summary.js \
pool/Config.js \
diff --git a/www/manager6/lxc/MPEdit.js b/www/manager6/lxc/MPEdit.js
new file mode 100644
index 00000000..6c4f9fff
--- /dev/null
+++ b/www/manager6/lxc/MPEdit.js
@@ -0,0 +1,405 @@
+Ext.define('PVE.lxc.MountPointInputPanel', {
+ extend: 'PVE.panel.InputPanel',
+ alias: 'widget.pveLxcMountPointInputPanel',
+
+ insideWizard: false,
+
+ onlineHelp: 'pct_container_storage',
+
+ unused: false, // add unused disk imaged
+
+ unprivileged: false,
+
+ vmconfig: {}, // used to select unused disks
+
+ onGetValues: function(values) {
+ var me = this;
+
+ var confid = me.confid || values.mpsel;
+
+ if (me.unused) {
+ me.mpdata.file = me.vmconfig[values.unusedId];
+ confid = values.mpsel;
+ } else if (me.isCreate) {
+ me.mpdata.file = values.storage + ':' + values.disksize;
+ }
+
+ if (confid !== 'rootfs') {
+ me.mpdata.mp = values.mp;
+ }
+
+ if (values.ro) {
+ me.mpdata.ro = 1;
+ } else {
+ delete me.mpdata.ro;
+ }
+
+ if (values.quota) {
+ me.mpdata.quota = 1;
+ } else {
+ delete me.mpdata.quota;
+ }
+
+ if (values.acl === 'Default') {
+ delete me.mpdata.acl;
+ } else {
+ me.mpdata.acl = values.acl;
+ }
+
+ if (values.backup) {
+ me.mpdata.backup = 1;
+ } else {
+ delete me.mpdata.backup;
+ }
+
+ if (values.noreplicate) {
+ me.mpdata.replicate = '0';
+ }
+ delete me.mpdata.noreplicate;
+
+ var res = {};
+ res[confid] = PVE.Parser.printLxcMountPoint(me.mpdata);
+ return res;
+ },
+
+ setMountPoint: function(mp) {
+ var me = this;
+
+ me.mpdata = mp;
+ if (!Ext.isDefined(me.mpdata.acl)) {
+ me.mpdata.acl = 'Default';
+ }
+
+ if (mp.type === 'bind') {
+ me.quota.setDisabled(true);
+ me.quota.setValue(false);
+ me.acl.setDisabled(true);
+ me.acl.setValue('Default');
+ me.hdstoragesel.setDisabled(true);
+ if (me.confid !== 'rootfs') {
+ me.backup.setDisabled(true);
+ }
+ }
+
+ if (mp.replicate) { // check box reverses the config option
+ mp.noreplicate = !PVE.Parser.parseBoolean(mp.replicate, 1);
+ delete mp.replicate;
+ }
+
+ me.setValues(mp);
+ },
+
+ setVMConfig: function(vmconfig) {
+ var me = this;
+
+ me.vmconfig = vmconfig;
+
+ if (me.mpsel) {
+ var i;
+ for (i = 0; i != 8; ++i) {
+ var name = "mp" + i.toString();
+ if (!Ext.isDefined(vmconfig[name])) {
+ me.mpsel.setValue(name);
+ break;
+ }
+ }
+ }
+
+ if (me.unusedDisks) {
+ var disklist = [];
+ Ext.Object.each(vmconfig, function(key, value) {
+ if (key.match(/^unused\d+$/)) {
+ disklist.push([key, value]);
+ }
+ });
+ me.unusedDisks.store.loadData(disklist);
+ me.unusedDisks.setValue(me.confid);
+ }
+ },
+
+ setNodename: function(nodename) {
+ var me = this;
+ me.hdstoragesel.setNodename(nodename);
+ me.hdfilesel.setStorage(undefined, nodename);
+ },
+
+ initComponent : function() {
+ var me = this;
+
+ var isroot = me.confid === 'rootfs';
+
+ me.mpdata = {};
+
+ me.column1 = [];
+
+ if (!me.confid || me.unused) {
+ var names = [];
+ var i;
+ for (i = 0; i != 8; ++i) {
+ var name = 'mp' + i.toString();
+ names.push([name, name]);
+ }
+ me.mpsel = Ext.create('PVE.form.KVComboBox', {
+ name: 'mpsel',
+ fieldLabel: gettext('Mount Point'),
+ matchFieldWidth: false,
+ allowBlank: false,
+ comboItems: names,
+ validator: function(value) {
+ if (!me.rendered) {
+ return;
+ }
+ if (Ext.isDefined(me.vmconfig[value])) {
+ return "Mount point is already in use.";
+ }
+ /*jslint confusion: true*/
+ /* returns a string above */
+ return true;
+ },
+ listeners: {
+ change: function(field, value) {
+ field.validate();
+ }
+ }
+ });
+ me.column1.push(me.mpsel);
+ }
+
+ // we always have this around, but only visible when creating a new mp
+ // since this handles per-filesystem capabilities
+ me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
+ name: 'storage',
+ nodename: me.nodename,
+ fieldLabel: gettext('Storage'),
+ storageContent: 'rootdir',
+ allowBlank: false,
+ autoSelect: true,
+ hidden: me.unused || !me.isCreate,
+ listeners: {
+ change: function(f, value) {
+ if (!value) { // initial store loading fires an unwanted 'change'
+ return;
+ }
+ if (me.mpdata.type === 'bind') {
+ me.quota.setDisabled(true);
+ me.quota.setValue(false);
+ me.acl.setDisabled(true);
+ me.acl.setValue('Default');
+ if (!isroot) {
+ me.backup.setDisabled(true);
+ }
+ return;
+ }
+ var rec = f.store.getById(value);
+ if (rec &&
+ (rec.data.type === 'zfs' ||
+ rec.data.type === 'zfspool')) {
+ me.quota.setDisabled(true);
+ me.quota.setValue(false);
+ } else {
+ me.quota.setDisabled(me.unprivileged);
+ }
+ if (me.unused || !me.isCreate) {
+ return;
+ }
+ if (rec.data.type === 'iscsi') {
+ me.hdfilesel.setStorage(value);
+ me.hdfilesel.setDisabled(false);
+ me.hdfilesel.setVisible(true);
+ me.hdsizesel.setDisabled(true);
+ me.hdsizesel.setVisible(false);
+ } else if (rec.data.type === 'lvm' ||
+ rec.data.type === 'lvmthin' ||
+ rec.data.type === 'rbd' ||
+ rec.data.type === 'sheepdog' ||
+ rec.data.type === 'zfs' ||
+ rec.data.type === 'zfspool') {
+ me.hdfilesel.setDisabled(true);
+ me.hdfilesel.setVisible(false);
+ me.hdsizesel.setDisabled(false);
+ me.hdsizesel.setVisible(true);
+ } else {
+ me.hdfilesel.setDisabled(true);
+ me.hdfilesel.setVisible(false);
+ me.hdsizesel.setDisabled(false);
+ me.hdsizesel.setVisible(true);
+ }
+ }
+ }
+ });
+ me.column1.push(me.hdstoragesel);
+
+ if (me.unused) {
+ me.unusedDisks = Ext.create('PVE.form.KVComboBox', {
+ name: 'unusedId',
+ fieldLabel: gettext('Disk image'),
+ matchFieldWidth: false,
+ listConfig: {
+ width: 350
+ },
+ data: [],
+ allowBlank: false,
+ listeners: {
+ change: function(f, value) {
+ // make sure our buttons are enabled/disabled when switching
+ // between images on different storages:
+ var disk = me.vmconfig[value];
+ var storage = disk.split(':')[0];
+ me.hdstoragesel.setValue(storage);
+ }
+ }
+ });
+ me.column1.push(me.unusedDisks);
+ } else if (me.isCreate) {
+ me.hdfilesel = Ext.create('PVE.form.FileSelector', {
+ name: 'file',
+ nodename: me.nodename,
+ storageContent: 'images',
+ fieldLabel: gettext('Disk image'),
+ disabled: true,
+ hidden: true,
+ allowBlank: false
+ });
+ me.hdsizesel = Ext.createWidget('numberfield', {
+ name: 'disksize',
+ minValue: 0.1,
+ maxValue: 128*1024,
+ decimalPrecision: 3,
+ value: '8',
+ step: 1,
+ fieldLabel: gettext('Disk size') + ' (GB)',
+ allowBlank: false
+ });
+ me.column1.push(me.hdfilesel);
+ me.column1.push(me.hdsizesel);
+ } else {
+ me.column1.push({
+ xtype: 'textfield',
+ disabled: true,
+ submitValue: false,
+ fieldLabel: gettext('Disk image'),
+ name: 'file'
+ });
+ }
+
+ me.acl = Ext.createWidget('pveKVComboBox', {
+ name: 'acl',
+ fieldLabel: gettext('ACLs'),
+ comboItems: [['Default', 'Default'], ['1', 'On'], ['0', 'Off']],
+ value: 'Default',
+ allowBlank: true
+ });
+
+ me.quota = Ext.createWidget('pvecheckbox', {
+ name: 'quota',
+ defaultValue: 0,
+ disabled: me.unprivileged,
+ fieldLabel: gettext('Enable quota')
+ });
+
+ me.column2 = [
+ me.acl,
+ me.quota
+ ];
+
+ if (!isroot) {
+ me.column2.splice(1, 0, {
+ xtype: 'pvecheckbox',
+ name: 'ro',
+ defaultValue: 0,
+ fieldLabel: gettext('Read-only'),
+ hidden: me.insideWizard
+ });
+
+ me.backup = Ext.createWidget('pvecheckbox',{
+ xtype: 'pvecheckbox',
+ name: 'backup',
+ fieldLabel: gettext('Backup')
+ });
+ if (me.mpdata.type !== 'bind') {
+ me.column2.push(me.backup);
+ }
+ me.column2.push({
+ xtype: 'pvecheckbox',
+ name: 'noreplicate',
+ fieldLabel: gettext('Skip replication')
+ });
+ me.column2.push({
+ xtype: 'textfield',
+ name: 'mp',
+ value: '',
+ emptyText: gettext('/some/path'),
+ allowBlank: false,
+ hidden: isroot,
+ fieldLabel: gettext('Path')
+ });
+ }
+
+ me.callParent();
+ }
+});
+
+Ext.define('PVE.lxc.MountPointEdit', {
+ extend: 'PVE.window.Edit',
+
+ unprivileged: false,
+
+ initComponent : function() {
+ var me = this;
+
+ var nodename = me.pveSelNode.data.node;
+ if (!nodename) {
+ throw "no node name specified";
+ }
+
+ var unused = me.confid && me.confid.match(/^unused\d+$/);
+
+ me.isCreate = me.confid ? unused : true;
+
+ var ipanel = Ext.create('PVE.lxc.MountPointInputPanel', {
+ confid: me.confid,
+ nodename: nodename,
+ unused: unused,
+ unprivileged: me.unprivileged,
+ isCreate: me.isCreate
+ });
+
+ var subject;
+ if (unused) {
+ subject = gettext('Unused Disk');
+ } else if (me.isCreate) {
+ subject = gettext('Mount Point');
+ } else {
+ subject = gettext('Mount Point') + ' (' + me.confid + ')';
+ }
+
+ Ext.apply(me, {
+ subject: subject,
+ items: ipanel
+ });
+
+ me.callParent();
+
+ me.load({
+ success: function(response, options) {
+ ipanel.setVMConfig(response.result.data);
+ if (me.confid) {
+ /*jslint confusion: true*/
+ /*data is defined as array above*/
+ var value = response.result.data[me.confid];
+ /*jslint confusion: false*/
+ var mp = PVE.Parser.parseLxcMountPoint(value);
+
+ if (!mp) {
+ Ext.Msg.alert(gettext('Error'), 'Unable to parse mount point options');
+ me.close();
+ return;
+ }
+
+ ipanel.setMountPoint(mp);
+ me.isValid(); // trigger validation
+ }
+ }
+ });
+ }
+});
diff --git a/www/manager6/lxc/ResourceEdit.js b/www/manager6/lxc/ResourceEdit.js
index 9770de8d..6bd35e8a 100644
--- a/www/manager6/lxc/ResourceEdit.js
+++ b/www/manager6/lxc/ResourceEdit.js
@@ -36,68 +36,6 @@ Ext.define('PVE.lxc.CPUEdit', {
}
});
-Ext.define('PVE.lxc.MountPointEdit', {
- extend: 'PVE.window.Edit',
-
- unprivileged: false,
-
- initComponent : function() {
- var me = this;
-
- var nodename = me.pveSelNode.data.node;
- if (!nodename) {
- throw "no node name specified";
- }
-
- var unused = me.confid && me.confid.match(/^unused\d+$/);
-
- me.isCreate = me.confid ? unused : true;
-
- var ipanel = Ext.create('PVE.lxc.MountPointInputPanel', {
- confid: me.confid,
- nodename: nodename,
- unused: unused,
- unprivileged: me.unprivileged,
- isCreate: me.isCreate
- });
-
- var subject;
- if (unused) {
- subject = gettext('Unused Disk');
- } else if (me.isCreate) {
- subject = gettext('Mount Point');
- } else {
- subject = gettext('Mount Point') + ' (' + me.confid + ')';
- }
-
- Ext.apply(me, {
- subject: subject,
- items: ipanel
- });
-
- me.callParent();
-
- me.load({
- success: function(response, options) {
- ipanel.setVMConfig(response.result.data);
- if (me.confid) {
- var value = response.result.data[me.confid];
- var mp = PVE.Parser.parseLxcMountPoint(value);
-
- if (!mp) {
- Ext.Msg.alert(gettext('Error'), 'Unable to parse mount point options');
- me.close();
- return;
- }
-
- ipanel.setMountPoint(mp);
- me.isValid(); // trigger validation
- }
- }
- });
- }
-});
-
Ext.define('PVE.lxc.CPUInputPanel', {
extend: 'PVE.panel.InputPanel',
alias: 'widget.pveLxcCPUInputPanel',
@@ -213,342 +151,3 @@ Ext.define('PVE.lxc.MemoryInputPanel', {
me.callParent();
}
});
-
-Ext.define('PVE.lxc.MountPointInputPanel', {
- extend: 'PVE.panel.InputPanel',
- alias: 'widget.pveLxcMountPointInputPanel',
-
- insideWizard: false,
-
- onlineHelp: 'pct_container_storage',
-
- unused: false, // ADD usused disk imaged
-
- unprivileged: false,
-
- vmconfig: {}, // used to select usused disks
-
- onGetValues: function(values) {
- var me = this;
-
- var confid = me.confid || values.mpsel;
-
- if (me.unused) {
- me.mpdata.file = me.vmconfig[values.unusedId];
- confid = values.mpsel;
- } else if (me.isCreate) {
- me.mpdata.file = values.storage + ':' + values.disksize;
- }
-
- if (confid !== 'rootfs') {
- me.mpdata.mp = values.mp;
- }
-
- if (values.ro) {
- me.mpdata.ro = 1;
- } else {
- delete me.mpdata.ro;
- }
-
- if (values.quota) {
- me.mpdata.quota = 1;
- } else {
- delete me.mpdata.quota;
- }
-
- if (values.acl === 'Default') {
- delete me.mpdata.acl;
- } else {
- me.mpdata.acl = values.acl;
- }
-
- if (values.backup) {
- me.mpdata.backup = 1;
- } else {
- delete me.mpdata.backup;
- }
-
- if (values.noreplicate) {
- me.mpdata.replicate = '0';
- }
- delete me.mpdata.noreplicate;
-
- var res = {};
- res[confid] = PVE.Parser.printLxcMountPoint(me.mpdata);
- return res;
- },
-
- setMountPoint: function(mp) {
- var me = this;
-
- me.mpdata = mp;
- if (!Ext.isDefined(me.mpdata.acl)) {
- me.mpdata.acl = 'Default';
- }
-
- if (mp.type === 'bind') {
- me.quota.setDisabled(true);
- me.quota.setValue(false);
- me.acl.setDisabled(true);
- me.acl.setValue('Default');
- me.hdstoragesel.setDisabled(true);
- if (me.confid !== 'rootfs') {
- me.backup.setDisabled(true);
- }
- }
-
- if (mp.replicate) { // check box reverses the config option
- mp.noreplicate = !PVE.Parser.parseBoolean(mp.replicate, 1);
- delete mp.replicate;
- }
-
- me.setValues(mp);
- },
-
- setVMConfig: function(vmconfig) {
- var me = this;
-
- me.vmconfig = vmconfig;
-
- if (me.mpsel) {
- var i;
- for (i = 0; i != 8; ++i) {
- var name = "mp" + i;
- if (!Ext.isDefined(vmconfig[name])) {
- me.mpsel.setValue(name);
- break;
- }
- }
- }
-
- if (me.unusedDisks) {
- var disklist = [];
- Ext.Object.each(vmconfig, function(key, value) {
- if (key.match(/^unused\d+$/)) {
- disklist.push([key, value]);
- }
- });
- me.unusedDisks.store.loadData(disklist);
- me.unusedDisks.setValue(me.confid);
- }
- },
-
- setNodename: function(nodename) {
- var me = this;
- me.hdstoragesel.setNodename(nodename);
- me.hdfilesel.setStorage(undefined, nodename);
- },
-
- initComponent : function() {
- var me = this;
-
- var isroot = me.confid === 'rootfs';
-
- me.mpdata = {};
-
- me.column1 = [];
-
- if (!me.confid || me.unused) {
- var names = [];
- var i;
- for (i = 0; i != 8; ++i) {
- var name = 'mp' + i;
- names.push([name, name]);
- }
- me.mpsel = Ext.create('PVE.form.KVComboBox', {
- name: 'mpsel',
- fieldLabel: gettext('Mount Point'),
- matchFieldWidth: false,
- allowBlank: false,
- comboItems: names,
- validator: function(value) {
- if (!me.rendered) {
- return;
- }
- if (Ext.isDefined(me.vmconfig[value])) {
- return "Mount point is already in use.";
- }
- return true;
- },
- listeners: {
- change: function(field, value) {
- field.validate();
- }
- }
- });
- me.column1.push(me.mpsel);
- }
-
- // we always have this around, but only visible when creating a new mp
- // since this handles per-filesystem capabilities
- me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
- name: 'storage',
- nodename: me.nodename,
- fieldLabel: gettext('Storage'),
- storageContent: 'rootdir',
- allowBlank: false,
- autoSelect: true,
- hidden: me.unused || !me.isCreate,
- listeners: {
- change: function(f, value) {
- if (!value) { // initial store loading fires an unwanted 'change'
- return;
- }
- if (me.mpdata.type === 'bind') {
- me.quota.setDisabled(true);
- me.quota.setValue(false);
- me.acl.setDisabled(true);
- me.acl.setValue('Default');
- if (!isroot) {
- me.backup.setDisabled(true);
- }
- return;
- }
- var rec = f.store.getById(value);
- if (rec &&
- (rec.data.type === 'zfs' ||
- rec.data.type === 'zfspool')) {
- me.quota.setDisabled(true);
- me.quota.setValue(false);
- } else {
- me.quota.setDisabled(me.unprivileged);
- }
- if (me.unused || !me.isCreate) {
- return;
- }
- if (rec.data.type === 'iscsi') {
- me.hdfilesel.setStorage(value);
- me.hdfilesel.setDisabled(false);
- me.hdfilesel.setVisible(true);
- me.hdsizesel.setDisabled(true);
- me.hdsizesel.setVisible(false);
- } else if (rec.data.type === 'lvm' ||
- rec.data.type === 'lvmthin' ||
- rec.data.type === 'rbd' ||
- rec.data.type === 'sheepdog' ||
- rec.data.type === 'zfs' ||
- rec.data.type === 'zfspool') {
- me.hdfilesel.setDisabled(true);
- me.hdfilesel.setVisible(false);
- me.hdsizesel.setDisabled(false);
- me.hdsizesel.setVisible(true);
- } else {
- me.hdfilesel.setDisabled(true);
- me.hdfilesel.setVisible(false);
- me.hdsizesel.setDisabled(false);
- me.hdsizesel.setVisible(true);
- }
- }
- }
- });
- me.column1.push(me.hdstoragesel);
-
- if (me.unused) {
- me.unusedDisks = Ext.create('PVE.form.KVComboBox', {
- name: 'unusedId',
- fieldLabel: gettext('Disk image'),
- matchFieldWidth: false,
- listConfig: {
- width: 350
- },
- data: [],
- allowBlank: false,
- listeners: {
- change: function(f, value) {
- // make sure our buttons are enabled/disabled when switching
- // between images on different storages:
- var disk = me.vmconfig[value];
- var storage = disk.split(':')[0];
- me.hdstoragesel.setValue(storage);
- }
- }
- });
- me.column1.push(me.unusedDisks);
- } else if (me.isCreate) {
- me.hdfilesel = Ext.create('PVE.form.FileSelector', {
- name: 'file',
- nodename: me.nodename,
- storageContent: 'images',
- fieldLabel: gettext('Disk image'),
- disabled: true,
- hidden: true,
- allowBlank: false
- });
- me.hdsizesel = Ext.createWidget('numberfield', {
- name: 'disksize',
- minValue: 0.1,
- maxValue: 128*1024,
- decimalPrecision: 3,
- value: '8',
- step: 1,
- fieldLabel: gettext('Disk size') + ' (GB)',
- allowBlank: false
- });
- me.column1.push(me.hdfilesel);
- me.column1.push(me.hdsizesel);
- } else {
- me.column1.push({
- xtype: 'textfield',
- disabled: true,
- submitValue: false,
- fieldLabel: gettext('Disk image'),
- name: 'file'
- });
- }
-
- me.acl = Ext.createWidget('pveKVComboBox', {
- name: 'acl',
- fieldLabel: gettext('ACLs'),
- comboItems: [['Default', 'Default'], ['1', 'On'], ['0', 'Off']],
- value: 'Default',
- allowBlank: true
- });
-
- me.quota = Ext.createWidget('pvecheckbox', {
- name: 'quota',
- defaultValue: 0,
- disabled: me.unprivileged,
- fieldLabel: gettext('Enable quota')
- });
-
- me.column2 = [
- me.acl,
- me.quota
- ];
-
- if (!isroot) {
- me.column2.splice(1, 0, {
- xtype: 'pvecheckbox',
- name: 'ro',
- defaultValue: 0,
- fieldLabel: gettext('Read-only'),
- hidden: me.insideWizard
- });
-
- me.backup = Ext.createWidget('pvecheckbox',{
- xtype: 'pvecheckbox',
- name: 'backup',
- fieldLabel: gettext('Backup')
- });
- if (me.mpdata.type !== 'bind') {
- me.column2.push(me.backup);
- }
- me.column2.push({
- xtype: 'pvecheckbox',
- name: 'noreplicate',
- fieldLabel: gettext('Skip replication')
- });
- me.column2.push({
- xtype: 'textfield',
- name: 'mp',
- value: '',
- emptyText: gettext('/some/path'),
- allowBlank: false,
- hidden: isroot,
- fieldLabel: gettext('Path')
- });
- }
-
- me.callParent();
- }
-});
--
2.11.0
More information about the pve-devel
mailing list