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