]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/OptionView.js
ui: dc/options: add bandwidth limit editor
[pve-manager.git] / www / manager6 / dc / OptionView.js
1 /*jslint confusion: true*/
2 Ext.define('PVE.dc.OptionView', {
3 extend: 'Proxmox.grid.ObjectGrid',
4 alias: ['widget.pveDcOptionView'],
5
6 onlineHelp: 'datacenter_configuration_file',
7
8 monStoreErrors: true,
9
10 add_inputpanel_row: function(name, text, opts) {
11 var me = this;
12
13 opts = opts || {};
14 me.rows = me.rows || {};
15
16 var canEdit = (opts.caps === undefined || opts.caps);
17 me.rows[name] = {
18 required: true,
19 defaultValue: opts.defaultValue,
20 header: text,
21 renderer: opts.renderer,
22 editor: canEdit ? {
23 xtype: 'proxmoxWindowEdit',
24 width: opts.width || 350,
25 subject: text,
26 fieldDefaults: {
27 labelWidth: opts.labelWidth || 100
28 },
29 setValues: function(values) {
30 var edit_value = values[name];
31
32 if (opts.parseBeforeSet) {
33 edit_value = PVE.Parser.parsePropertyString(edit_value);
34 }
35
36 Ext.Array.each(this.query('inputpanel'), function(panel) {
37 panel.setValues(edit_value);
38 });
39 },
40 url: opts.url,
41 items: [{
42 xtype: 'inputpanel',
43 onGetValues: function(values) {
44 if (values === undefined || Object.keys(values).length === 0) {
45 return { 'delete': name };
46 }
47 var ret_val = {};
48 ret_val[name] = PVE.Parser.printPropertyString(values);
49 return ret_val;
50 },
51 items: opts.items
52 }]
53 } : undefined
54 };
55 },
56
57 initComponent : function() {
58 var me = this;
59
60 var caps = Ext.state.Manager.get('GuiCap');
61
62 me.add_combobox_row('keyboard', gettext('Keyboard Layout'), {
63 renderer: PVE.Utils.render_kvm_language,
64 comboItems: PVE.Utils.kvm_keymap_array(),
65 defaultValue: '__default__',
66 deleteEmpty: true
67 });
68 me.add_text_row('http_proxy', gettext('HTTP proxy'), {
69 defaultValue: Proxmox.Utils.noneText,
70 vtype: 'HttpProxy',
71 deleteEmpty: true
72 });
73 me.add_combobox_row('console', gettext('Console Viewer'), {
74 renderer: PVE.Utils.render_console_viewer,
75 comboItems: PVE.Utils.console_viewer_array(),
76 defaultValue: '__default__',
77 deleteEmpty: true
78 });
79 me.add_text_row('email_from', gettext('Email from address'), {
80 deleteEmpty: true,
81 vtype: 'proxmoxMail',
82 defaultValue: 'root@$hostname'
83 });
84 me.add_text_row('mac_prefix', gettext('MAC address prefix'), {
85 deleteEmpty: true,
86 vtype: 'MacPrefix',
87 defaultValue: Proxmox.Utils.noneText
88 });
89 me.add_inputpanel_row('migration', gettext('Migration Settings'), {
90 renderer: PVE.Utils.render_dc_ha_opts,
91 caps: caps.vms['Sys.Modify'],
92 labelWidth: 120,
93 url: "/api2/extjs/cluster/options",
94 defaultKey: 'type',
95 items: [{
96 xtype: 'displayfield',
97 name: 'type',
98 fieldLabel: gettext('Type'),
99 value: 'secure',
100 submitValue: true,
101 }, {
102 xtype: 'proxmoxNetworkSelector',
103 name: 'network',
104 fieldLabel: gettext('Network'),
105 value: null,
106 emptyText: Proxmox.Utils.defaultText,
107 autoSelect: false,
108 skipEmptyText: true
109 }]
110 });
111 me.add_inputpanel_row('ha', gettext('HA Settings'), {
112 renderer: PVE.Utils.render_dc_ha_opts,
113 caps: caps.vms['Sys.Modify'],
114 labelWidth: 120,
115 url: "/api2/extjs/cluster/options",
116 items: [{
117 xtype: 'proxmoxKVComboBox',
118 name: 'shutdown_policy',
119 fieldLabel: gettext('Shutdown Policy'),
120 deleteEmpty: false,
121 value: '__default__',
122 comboItems: [
123 ['__default__', Proxmox.Utils.defaultText + ' (conditional)' ],
124 ['freeze', 'freeze'],
125 ['failover', 'failover'],
126 ['migrate', 'migrate'],
127 ['conditional', 'conditional']
128 ],
129 defaultValue: '__default__'
130 }]
131 });
132 me.add_inputpanel_row('u2f', gettext('U2F Settings'), {
133 renderer: PVE.Utils.render_dc_ha_opts,
134 caps: caps.vms['Sys.Modify'],
135 width: 450,
136 url: "/api2/extjs/cluster/options",
137 items: [{
138 xtype: 'textfield',
139 name: 'appid',
140 fieldLabel: gettext('U2F AppID URL'),
141 emptyText: gettext('Defaults to origin'),
142 value: '',
143 skipEmptyText: true,
144 deleteEmpty: true,
145 submitEmptyText: false,
146 skipEmptyText: true,
147 }, {
148 xtype: 'textfield',
149 name: 'origin',
150 fieldLabel: gettext('U2F Origin'),
151 emptyText: gettext('Defaults to requesting host URI'),
152 value: '',
153 deleteEmpty: true,
154 skipEmptyText: true,
155 submitEmptyText: false,
156 },
157 {
158 xtype: 'displayfield',
159 userCls: 'pmx-hint',
160 value: gettext('NOTE: Changing an AppID breaks existing U2F registrations!'),
161 }]
162 });
163 me.add_inputpanel_row('bwlimit', gettext('Bandwidth Limits'), {
164 renderer: (v) => !v ? gettext('None') : v,
165 caps: caps.vms['Sys.Modify'],
166 width: 450,
167 url: "/api2/extjs/cluster/options",
168 parseBeforeSet: true,
169 items: [{
170 xtype: 'pveBandwidthField',
171 name: 'default',
172 fieldLabel: gettext('Default'),
173 emptyText: gettext('none')
174 },
175 {
176 xtype: 'pveBandwidthField',
177 name: 'restore',
178 fieldLabel: gettext('Backup Restore'),
179 emptyText: gettext('default')
180 },
181 {
182 xtype: 'pveBandwidthField',
183 name: 'migration',
184 fieldLabel: gettext('Migration'),
185 emptyText: gettext('default')
186 },
187 {
188 xtype: 'pveBandwidthField',
189 name: 'clone',
190 fieldLabel: gettext('Clone'),
191 emptyText: gettext('default')
192 },
193 {
194 xtype: 'pveBandwidthField',
195 name: 'move',
196 fieldLabel: gettext('Disk Move'),
197 emptyText: gettext('default')
198 }]
199 });
200
201 // TODO: bwlimits
202
203 me.selModel = Ext.create('Ext.selection.RowModel', {});
204
205 Ext.apply(me, {
206 tbar: [{
207 text: gettext('Edit'),
208 xtype: 'proxmoxButton',
209 disabled: true,
210 handler: function() { me.run_editor(); },
211 selModel: me.selModel
212 }],
213 url: "/api2/json/cluster/options",
214 editorConfig: {
215 url: "/api2/extjs/cluster/options"
216 },
217 interval: 5000,
218 cwidth1: 200,
219 listeners: {
220 itemdblclick: me.run_editor
221 }
222 });
223
224 me.callParent();
225
226 // set the new value for the default console
227 me.mon(me.rstore, 'load', function(store, records, success) {
228 if (!success) {
229 return;
230 }
231
232 var rec = store.getById('console');
233 PVE.VersionInfo.console = rec.data.value;
234 if (rec.data.value === '__default__') {
235 delete PVE.VersionInfo.console;
236 }
237 });
238
239 me.on('activate', me.rstore.startUpdate);
240 me.on('destroy', me.rstore.stopUpdate);
241 me.on('deactivate', me.rstore.stopUpdate);
242 }
243 });