ui: add option to change the maintenance type
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
This commit is contained in:
parent
5fd823c3f2
commit
556eda0537
@ -61,6 +61,7 @@ JSSRC= \
|
||||
window/BackupGroupChangeOwner.js \
|
||||
window/CreateDirectory.js \
|
||||
window/DataStoreEdit.js \
|
||||
window/MaintenanceOptions.js \
|
||||
window/NotesEdit.js \
|
||||
window/RemoteEdit.js \
|
||||
window/TrafficControlEdit.js \
|
||||
|
23
www/Utils.js
23
www/Utils.js
@ -640,4 +640,27 @@ Ext.define('PBS.Utils', {
|
||||
return `${icon} ${value}`;
|
||||
},
|
||||
|
||||
renderMaintenance: function(mode, activeTasks) {
|
||||
if (!mode) return gettext('None');
|
||||
let [type, _message] = mode.split(",");
|
||||
type = type.split("=").pop();
|
||||
|
||||
const conflictingTasks = activeTasks.write + (type === 'offline' ? activeTasks.read : 0);
|
||||
const checkmarkIcon = '<i class="fa fa-check"></i>';
|
||||
const spinnerIcon = '<i class="fa fa-spinner fa-pulse fa-fw"></i>';
|
||||
const conflictingTasksMessage = `<i>${conflictingTasks} conflicting tasks still active</i>`;
|
||||
const extra = conflictingTasks > 0 ? `| ${spinnerIcon} ${conflictingTasksMessage}` : checkmarkIcon;
|
||||
|
||||
let modeText = Proxmox.Utils.unknownText;
|
||||
switch (type) {
|
||||
case 'read-only':
|
||||
modeText = gettext("Read-only");
|
||||
break;
|
||||
case 'offline':
|
||||
modeText = gettext("Offline");
|
||||
break;
|
||||
}
|
||||
return `${modeText} ${extra}`;
|
||||
},
|
||||
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
Ext.define('PBS.Datastore.Options', {
|
||||
extend: 'Proxmox.grid.ObjectGrid',
|
||||
xtype: 'pbsDatastoreOptionView',
|
||||
@ -6,6 +7,10 @@ Ext.define('PBS.Datastore.Options', {
|
||||
cbindData: function(initial) {
|
||||
let me = this;
|
||||
|
||||
me.maintenanceActiveTasks = {
|
||||
read: 0,
|
||||
write: 0,
|
||||
};
|
||||
me.datastore = encodeURIComponent(me.datastore);
|
||||
me.url = `/api2/json/config/datastore/${me.datastore}`;
|
||||
me.editorConfig = {
|
||||
@ -18,6 +23,24 @@ Ext.define('PBS.Datastore.Options', {
|
||||
controller: {
|
||||
xclass: 'Ext.app.ViewController',
|
||||
|
||||
init: function(view) {
|
||||
let me = this;
|
||||
me.callParent();
|
||||
view.rows['maintenance-mode'].renderer =
|
||||
(value) => PBS.Utils.renderMaintenance(value, view.maintenanceActiveTasks);
|
||||
|
||||
me.activeOperationsRstore = Ext.create('Proxmox.data.ObjectStore', {
|
||||
url: `/api2/json/admin/datastore/${view.datastore}/active-operations`,
|
||||
interval: 3000,
|
||||
});
|
||||
me.activeOperationsRstore.startUpdate();
|
||||
|
||||
view.mon(me.activeOperationsRstore, 'load', (store, data, success) => {
|
||||
me.view.maintenanceActiveTasks.read = data[0].data.value;
|
||||
me.view.maintenanceActiveTasks.write = data[1].data.value;
|
||||
});
|
||||
},
|
||||
|
||||
edit: function() {
|
||||
this.getView().run_editor();
|
||||
},
|
||||
@ -111,5 +134,12 @@ Ext.define('PBS.Datastore.Options', {
|
||||
},
|
||||
},
|
||||
},
|
||||
"maintenance-mode": {
|
||||
required: true,
|
||||
header: gettext('Maintenance mode'),
|
||||
editor: {
|
||||
xtype: 'pbsMaintenanceOptionEdit',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
77
www/window/MaintenanceOptions.js
Normal file
77
www/window/MaintenanceOptions.js
Normal file
@ -0,0 +1,77 @@
|
||||
Ext.define('PBS.form.maintenanceType', {
|
||||
extend: 'Proxmox.form.KVComboBox',
|
||||
alias: 'widget.pbsMaintenanceType',
|
||||
|
||||
comboItems: [
|
||||
['__default__', gettext('None')],
|
||||
['read-only', gettext('Read only')],
|
||||
['offline', gettext('Offline')],
|
||||
],
|
||||
});
|
||||
|
||||
Ext.define('PBS.window.MaintenanceOptions', {
|
||||
extend: 'Proxmox.window.Edit',
|
||||
xtype: 'pbsMaintenanceOptionEdit',
|
||||
mixins: ['Proxmox.Mixin.CBind'],
|
||||
|
||||
subject: gettext('Maintenance mode'),
|
||||
|
||||
width: 450,
|
||||
fieldDefaults: {
|
||||
labelWidth: 120,
|
||||
},
|
||||
|
||||
items: {
|
||||
onGetValues: function(values) {
|
||||
if (values.delete === 'maintenance-type') {
|
||||
values.delete = 'maintenance-mode';
|
||||
} else if (values['maintenance-type']) {
|
||||
const escaped_message = (values['maintenance-msg'] ?? '')
|
||||
.replaceAll('\\', '')
|
||||
.replaceAll('"', '\\"');
|
||||
const maybe_message =
|
||||
values['maintenance-msg'] ? `,message="${escaped_message}"` : '';
|
||||
values['maintenance-mode'] = `type=${values['maintenance-type']}${maybe_message}`;
|
||||
}
|
||||
delete values['maintenance-type'];
|
||||
delete values['maintenance-msg'];
|
||||
return values;
|
||||
},
|
||||
xtype: 'inputpanel',
|
||||
items: [
|
||||
{
|
||||
xtype: 'pbsMaintenanceType',
|
||||
name: 'maintenance-type',
|
||||
fieldLabel: gettext('Maintenance Type'),
|
||||
value: '__default__',
|
||||
deleteEmpty: true,
|
||||
},
|
||||
{
|
||||
xtype: 'proxmoxtextfield',
|
||||
name: 'maintenance-msg',
|
||||
fieldLabel: gettext('Description'),
|
||||
},
|
||||
],
|
||||
},
|
||||
setValues: function(values) {
|
||||
let me = this;
|
||||
|
||||
let options = {
|
||||
'maintenance-type': '__default__',
|
||||
'maintenance-msg': '',
|
||||
};
|
||||
if (values['maintenance-mode']) {
|
||||
let [type, message] = values['maintenance-mode'].split(/,(.+)/);
|
||||
type = type.split("=").pop();
|
||||
message = message ? message.split("=")[1]
|
||||
.replace(/^"(.*)"$/, '$1')
|
||||
.replaceAll('\\"', '"') : '';
|
||||
options = {
|
||||
'maintenance-type': type,
|
||||
'maintenance-msg': message,
|
||||
};
|
||||
}
|
||||
|
||||
me.callParent([options]);
|
||||
},
|
||||
});
|
Loading…
Reference in New Issue
Block a user