]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/lxc/DNS.js
ui: lxc: add edit window for device passthrough
[pve-manager.git] / www / manager6 / lxc / DNS.js
CommitLineData
93cc7b95 1Ext.define('PVE.lxc.DNSInputPanel', {
ef4ef788 2 extend: 'Proxmox.panel.InputPanel',
93cc7b95
DM
3 alias: 'widget.pveLxcDNSInputPanel',
4
5 insideWizard: false,
6
7 onGetValues: function(values) {
8 var me = this;
9
e31690fa
DC
10 var deletes = [];
11 if (!values.searchdomain && !me.insideWizard) {
12 deletes.push('searchdomain');
93cc7b95 13 }
93cc7b95 14
e31690fa 15 if (values.nameserver) {
f1374bff 16 let list = values.nameserver.split(/[ ,;]+/);
93cc7b95 17 values.nameserver = list.join(' ');
8058410f 18 } else if (!me.insideWizard) {
e31690fa 19 deletes.push('nameserver');
93cc7b95 20 }
e31690fa
DC
21
22 if (deletes.length) {
399ffa76 23 values.delete = deletes.join(',');
e31690fa
DC
24 }
25
93cc7b95
DM
26 return values;
27 },
28
8058410f 29 initComponent: function() {
93cc7b95
DM
30 var me = this;
31
32 var items = [
33 {
dbed4c1c 34 xtype: 'proxmoxtextfield',
93cc7b95
DM
35 name: 'searchdomain',
36 skipEmptyText: true,
37 fieldLabel: gettext('DNS domain'),
38 emptyText: gettext('use host settings'),
f6710aac 39 allowBlank: true,
93cc7b95
DM
40 },
41 {
dbed4c1c 42 xtype: 'proxmoxtextfield',
e31690fa 43 fieldLabel: gettext('DNS servers'),
5865b597 44 vtype: 'IP64AddressWithSuffixList',
93cc7b95 45 allowBlank: true,
e31690fa
DC
46 emptyText: gettext('use host settings'),
47 name: 'nameserver',
f6710aac
TL
48 itemId: 'nameserver',
49 },
93cc7b95
DM
50 ];
51
52 if (me.insideWizard) {
53 me.column1 = items;
54 } else {
55 me.items = items;
56 }
57
58 me.callParent();
f6710aac 59 },
93cc7b95
DM
60});
61
62Ext.define('PVE.lxc.DNSEdit', {
9fccc702 63 extend: 'Proxmox.window.Edit',
93cc7b95 64
8058410f 65 initComponent: function() {
93cc7b95
DM
66 var me = this;
67
68 var ipanel = Ext.create('PVE.lxc.DNSInputPanel');
69
70 Ext.apply(me, {
71 subject: gettext('Resources'),
8058410f 72 items: [ipanel],
93cc7b95
DM
73 });
74
75 me.callParent();
76
d5e771ce 77 if (!me.isCreate) {
93cc7b95
DM
78 me.load({
79 success: function(response, options) {
80 var values = response.result.data;
81
82 if (values.nameserver) {
83 values.nameserver.replace(/[,;]/, ' ');
84 values.nameserver.replace(/^\s+/, '');
93cc7b95
DM
85 }
86
87 ipanel.setValues(values);
f6710aac 88 },
93cc7b95
DM
89 });
90 }
f6710aac 91 },
93cc7b95
DM
92});
93
93cc7b95 94Ext.define('PVE.lxc.DNS', {
9fd8d73e 95 extend: 'Proxmox.grid.PendingObjectGrid',
93cc7b95
DM
96 alias: ['widget.pveLxcDNS'],
97
ba93a9c6
DC
98 onlineHelp: 'pct_container_network',
99
8058410f 100 initComponent: function() {
93cc7b95 101 var me = this;
93cc7b95
DM
102
103 var nodename = me.pveSelNode.data.node;
104 if (!nodename) {
105 throw "no node name specified";
106 }
107
108 var vmid = me.pveSelNode.data.vmid;
109 if (!vmid) {
110 throw "no VM ID specified";
111 }
112
113 var caps = Ext.state.Manager.get('GuiCap');
114
115 var rows = {
116 hostname: {
117 required: true,
118 defaultValue: me.pveSelNode.data.name,
119 header: gettext('Hostname'),
120 editor: caps.vms['VM.Config.Network'] ? {
9fccc702 121 xtype: 'proxmoxWindowEdit',
93cc7b95
DM
122 subject: gettext('Hostname'),
123 items: {
6b702514 124 xtype: 'inputpanel',
8058410f 125 items: {
6b702514
DC
126 fieldLabel: gettext('Hostname'),
127 xtype: 'textfield',
128 name: 'hostname',
129 vtype: 'DnsName',
b6571655 130 allowBlank: true,
f6710aac 131 emptyText: 'CT' + vmid.toString(),
6b702514
DC
132 },
133 onGetValues: function(values) {
134 var params = values;
135 if (values.hostname === undefined ||
136 values.hostname === null ||
137 values.hostname === '') {
8058410f 138 params = { hostname: 'CT'+vmid.toString() };
6b702514
DC
139 }
140 return params;
f6710aac
TL
141 },
142 },
143 } : undefined,
93cc7b95
DM
144 },
145 searchdomain: {
146 header: gettext('DNS domain'),
147 defaultValue: '',
148 editor: caps.vms['VM.Config.Network'] ? 'PVE.lxc.DNSEdit' : undefined,
149 renderer: function(value) {
e31690fa 150 return value || gettext('use host settings');
f6710aac 151 },
93cc7b95
DM
152 },
153 nameserver: {
154 header: gettext('DNS server'),
155 defaultValue: '',
156 editor: caps.vms['VM.Config.Network'] ? 'PVE.lxc.DNSEdit' : undefined,
157 renderer: function(value) {
e31690fa 158 return value || gettext('use host settings');
f6710aac
TL
159 },
160 },
93cc7b95
DM
161 };
162
163 var baseurl = 'nodes/' + nodename + '/lxc/' + vmid + '/config';
164
165 var reload = function() {
166 me.rstore.load();
167 };
168
169 var sm = Ext.create('Ext.selection.RowModel', {});
170
171 var run_editor = function() {
172 var rec = sm.getSelection()[0];
173 if (!rec) {
174 return;
175 }
176
177 var rowdef = rows[rec.data.key];
178 if (!rowdef.editor) {
179 return;
180 }
181
182 var win;
183 if (Ext.isString(rowdef.editor)) {
184 win = Ext.create(rowdef.editor, {
185 pveSelNode: me.pveSelNode,
186 confid: rec.data.key,
f6710aac 187 url: '/api2/extjs/nodes/' + nodename + '/lxc/' + vmid + '/config',
93cc7b95
DM
188 });
189 } else {
190 var config = Ext.apply({
191 pveSelNode: me.pveSelNode,
192 confid: rec.data.key,
f6710aac 193 url: '/api2/extjs/nodes/' + nodename + '/lxc/' + vmid + '/config',
93cc7b95
DM
194 }, rowdef.editor);
195 win = Ext.createWidget(rowdef.editor.xtype, config);
6b702514 196 win.load();
93cc7b95
DM
197 }
198 //win.load();
199 win.show();
200 win.on('destroy', reload);
201 };
202
5720fafa 203 var edit_btn = new Proxmox.button.Button({
93cc7b95
DM
204 text: gettext('Edit'),
205 disabled: true,
206 selModel: sm,
207 enableFn: function(rec) {
208 var rowdef = rows[rec.data.key];
209 return !!rowdef.editor;
210 },
f6710aac 211 handler: run_editor,
93cc7b95
DM
212 });
213
417f904f 214 var revert_btn = new PVE.button.PendingRevert();
273b5ce3 215
93cc7b95 216 var set_button_status = function() {
55ee6ba1
DJ
217 let button_sm = me.getSelectionModel();
218 let rec = button_sm.getSelection()[0];
93cc7b95
DM
219
220 if (!rec) {
221 edit_btn.disable();
222 return;
223 }
b8d53fbe
TL
224 let key = rec.data.key;
225
226 let rowdef = rows[key];
93cc7b95 227 edit_btn.setDisabled(!rowdef.editor);
b8d53fbe 228
399ffa76 229 let pending = rec.data.delete || me.hasPendingChanges(key);
273b5ce3 230 revert_btn.setDisabled(!pending);
93cc7b95
DM
231 };
232
f7993618 233 Ext.apply(me, {
9fd8d73e 234 url: "/api2/json/nodes/" + nodename + "/lxc/" + vmid + "/pending",
93cc7b95
DM
235 selModel: sm,
236 cwidth1: 150,
273b5ce3 237 interval: 5000,
b08ae044 238 run_editor: run_editor,
8058410f 239 tbar: [edit_btn, revert_btn],
93cc7b95 240 rows: rows,
9fd8d73e 241 editorConfig: {
f6710aac 242 url: "/api2/extjs/" + baseurl,
9fd8d73e 243 },
93cc7b95
DM
244 listeners: {
245 itemdblclick: run_editor,
4b488565 246 selectionchange: set_button_status,
f6710aac
TL
247 activate: reload,
248 },
93cc7b95
DM
249 });
250
251 me.callParent();
273b5ce3
OB
252
253 me.on('activate', me.rstore.startUpdate);
254 me.on('destroy', me.rstore.stopUpdate);
255 me.on('deactivate', me.rstore.stopUpdate);
256
257 me.mon(me.getStore(), 'datachanged', function() {
258 set_button_status();
259 });
f6710aac 260 },
93cc7b95 261});