]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/OptionView.js
632ae72c96b529ca1844f0e5122eb2d5f06ae9a0
[pve-manager.git] / www / manager6 / dc / OptionView.js
1 Ext.define('PVE.dc.OptionView', {
2 extend: 'Proxmox.grid.ObjectGrid',
3 alias: ['widget.pveDcOptionView'],
4
5 onlineHelp: 'datacenter_configuration_file',
6
7 monStoreErrors: true,
8
9 add_inputpanel_row: function(name, text, opts) {
10 var me = this;
11
12 opts = opts || {};
13 me.rows = me.rows || {};
14
15 let canEdit = (!opts.hasOwnProperty('caps') || opts.caps);
16 me.rows[name] = {
17 required: true,
18 defaultValue: opts.defaultValue,
19 header: text,
20 renderer: opts.renderer,
21 editor: canEdit ? {
22 xtype: 'proxmoxWindowEdit',
23 width: opts.width || 350,
24 subject: text,
25 onlineHelp: opts.onlineHelp,
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 render_bwlimits: function(value) {
58 if (!value) {
59 return gettext("None");
60 }
61
62 let parsed = PVE.Parser.parsePropertyString(value);
63 return Object.entries(parsed)
64 .map(([k, v]) => k + ": " + Proxmox.Utils.format_size(v * 1024) + "/s")
65 .join(',');
66 },
67
68 initComponent : function() {
69 var me = this;
70
71 var caps = Ext.state.Manager.get('GuiCap');
72
73 me.add_combobox_row('keyboard', gettext('Keyboard Layout'), {
74 renderer: PVE.Utils.render_kvm_language,
75 comboItems: PVE.Utils.kvm_keymap_array(),
76 defaultValue: '__default__',
77 deleteEmpty: true
78 });
79 me.add_text_row('http_proxy', gettext('HTTP proxy'), {
80 defaultValue: Proxmox.Utils.noneText,
81 vtype: 'HttpProxy',
82 deleteEmpty: true
83 });
84 me.add_combobox_row('console', gettext('Console Viewer'), {
85 renderer: PVE.Utils.render_console_viewer,
86 comboItems: PVE.Utils.console_viewer_array(),
87 defaultValue: '__default__',
88 deleteEmpty: true
89 });
90 me.add_text_row('email_from', gettext('Email from address'), {
91 deleteEmpty: true,
92 vtype: 'proxmoxMail',
93 defaultValue: 'root@$hostname'
94 });
95 me.add_text_row('mac_prefix', gettext('MAC address prefix'), {
96 deleteEmpty: true,
97 vtype: 'MacPrefix',
98 defaultValue: Proxmox.Utils.noneText
99 });
100 me.add_inputpanel_row('migration', gettext('Migration Settings'), {
101 renderer: PVE.Utils.render_dc_ha_opts,
102 labelWidth: 120,
103 url: "/api2/extjs/cluster/options",
104 defaultKey: 'type',
105 items: [{
106 xtype: 'displayfield',
107 name: 'type',
108 fieldLabel: gettext('Type'),
109 value: 'secure',
110 submitValue: true,
111 }, {
112 xtype: 'proxmoxNetworkSelector',
113 name: 'network',
114 fieldLabel: gettext('Network'),
115 value: null,
116 emptyText: Proxmox.Utils.defaultText,
117 autoSelect: false,
118 skipEmptyText: true
119 }]
120 });
121 me.add_inputpanel_row('ha', gettext('HA Settings'), {
122 renderer: PVE.Utils.render_dc_ha_opts,
123 labelWidth: 120,
124 url: "/api2/extjs/cluster/options",
125 onlineHelp: 'ha_manager_shutdown_policy',
126 items: [{
127 xtype: 'proxmoxKVComboBox',
128 name: 'shutdown_policy',
129 fieldLabel: gettext('Shutdown Policy'),
130 deleteEmpty: false,
131 value: '__default__',
132 comboItems: [
133 ['__default__', Proxmox.Utils.defaultText + ' (conditional)' ],
134 ['freeze', 'freeze'],
135 ['failover', 'failover'],
136 ['migrate', 'migrate'],
137 ['conditional', 'conditional']
138 ],
139 defaultValue: '__default__'
140 }]
141 });
142 me.add_inputpanel_row('u2f', gettext('U2F Settings'), {
143 renderer: PVE.Utils.render_dc_ha_opts,
144 width: 450,
145 url: "/api2/extjs/cluster/options",
146 onlineHelp: 'pveum_configure_u2f',
147 items: [{
148 xtype: 'textfield',
149 name: 'appid',
150 fieldLabel: gettext('U2F AppID URL'),
151 emptyText: gettext('Defaults to origin'),
152 value: '',
153 skipEmptyText: true,
154 deleteEmpty: true,
155 submitEmptyText: false,
156 skipEmptyText: true,
157 }, {
158 xtype: 'textfield',
159 name: 'origin',
160 fieldLabel: gettext('U2F Origin'),
161 emptyText: gettext('Defaults to requesting host URI'),
162 value: '',
163 deleteEmpty: true,
164 skipEmptyText: true,
165 submitEmptyText: false,
166 },
167 {
168 xtype: 'displayfield',
169 userCls: 'pmx-hint',
170 value: gettext('NOTE: Changing an AppID breaks existing U2F registrations!'),
171 }]
172 });
173 me.add_inputpanel_row('bwlimit', gettext('Bandwidth Limits'), {
174 renderer: me.render_bwlimits,
175 width: 450,
176 url: "/api2/extjs/cluster/options",
177 parseBeforeSet: true,
178 labelWidth: 120,
179 items: [{
180 xtype: 'pveBandwidthField',
181 name: 'default',
182 fieldLabel: gettext('Default'),
183 emptyText: gettext('none'),
184 backendUnit: "KiB",
185 },
186 {
187 xtype: 'pveBandwidthField',
188 name: 'restore',
189 fieldLabel: gettext('Backup Restore'),
190 emptyText: gettext('default'),
191 backendUnit: "KiB",
192 },
193 {
194 xtype: 'pveBandwidthField',
195 name: 'migration',
196 fieldLabel: gettext('Migration'),
197 emptyText: gettext('default'),
198 backendUnit: "KiB",
199 },
200 {
201 xtype: 'pveBandwidthField',
202 name: 'clone',
203 fieldLabel: gettext('Clone'),
204 emptyText: gettext('default'),
205 backendUnit: "KiB",
206 },
207 {
208 xtype: 'pveBandwidthField',
209 name: 'move',
210 fieldLabel: gettext('Disk Move'),
211 emptyText: gettext('default'),
212 backendUnit: "KiB",
213 }]
214 });
215 me.add_integer_row('max_workers', gettext('Maximal Workers/bulk-action'), {
216 deleteEmpty: true,
217 defaultValue: 4,
218 minValue: 1,
219 maxValue: 64, // arbitrary but generous limit as limits are good
220 });
221
222 me.selModel = Ext.create('Ext.selection.RowModel', {});
223
224 Ext.apply(me, {
225 tbar: [{
226 text: gettext('Edit'),
227 xtype: 'proxmoxButton',
228 disabled: true,
229 handler: function() { me.run_editor(); },
230 selModel: me.selModel
231 }],
232 url: "/api2/json/cluster/options",
233 editorConfig: {
234 url: "/api2/extjs/cluster/options"
235 },
236 interval: 5000,
237 cwidth1: 200,
238 listeners: {
239 itemdblclick: me.run_editor
240 }
241 });
242
243 me.callParent();
244
245 // set the new value for the default console
246 me.mon(me.rstore, 'load', function(store, records, success) {
247 if (!success) {
248 return;
249 }
250
251 var rec = store.getById('console');
252 PVE.VersionInfo.console = rec.data.value;
253 if (rec.data.value === '__default__') {
254 delete PVE.VersionInfo.console;
255 }
256 });
257
258 me.on('activate', me.rstore.startUpdate);
259 me.on('destroy', me.rstore.stopUpdate);
260 me.on('deactivate', me.rstore.stopUpdate);
261 }
262 });