]> git.proxmox.com Git - pmg-gui.git/blob - js/LDAPConfig.js
LDAPConfig.js: add Synchronize button
[pmg-gui.git] / js / LDAPConfig.js
1 Ext.define('pmg-ldap-config', {
2 extend: 'Ext.data.Model',
3 fields: [ 'section', 'server1', 'server2', 'comment',
4 'mode', 'binddn', 'bindpw', 'basedn', 'groupbasedn',
5 'filter', 'accountattr', 'mailattr',
6 { name: 'port', type: 'integer' },
7 { name: 'gcount', type: 'integer' },
8 { name: 'mcount', type: 'integer' },
9 { name: 'ucount', type: 'integer' },
10 { name: 'disable', type: 'boolean' }
11 ],
12 proxy: {
13 type: 'proxmox',
14 url: "/api2/json/config/ldap"
15 },
16 idProperty: 'section'
17 });
18
19 Ext.define('PMG.LDAPInputPanel', {
20 extend: 'Proxmox.panel.InputPanel',
21 alias: 'widget.pmgLDAPInputPanel',
22
23 sectionId: undefined,
24
25 onGetValues: function(values) {
26 var me = this;
27
28 values.disable = values.enable ? 0 : 1;
29 delete values.enable;
30
31 return values;
32 },
33
34 initComponent : function() {
35 var me = this;
36
37 me.column1 = [
38 {
39 xtype: me.sectionId ? 'displayfield' : 'textfield',
40 fieldLabel: gettext('Profile Name'),
41 value: me.sectionId || '',
42 name: 'section',
43 vtype: 'StorageId',
44 allowBlank: false
45 },
46 {
47 xtype: 'proxmoxKVComboBox',
48 name: 'mode',
49 comboItems: [
50 ['ldap', PMG.Utils.format_ldap_protocol('ldap')],
51 ['ldaps', PMG.Utils.format_ldap_protocol('ldaps')]
52 ],
53 value: 'ldap',
54 fieldLabel: gettext('Protocol')
55 },
56 {
57 xtype: 'textfield',
58 fieldLabel: gettext('Server'),
59 allowBlank: false,
60 vtype: 'IP64Address',
61 name: 'server1'
62 },
63 {
64 xtype: 'proxmoxtextfield',
65 fieldLabel: gettext('Server'),
66 allowBlank: true,
67 deleteEmpty: me.create ? false : true,
68 vtype: 'IP64Address',
69 name: 'server2'
70 },
71 {
72 xtype: 'proxmoxintegerfield',
73 name: 'port',
74 emptyText: gettext('Default'),
75 deleteEmpty: me.create ? false : true,
76 minValue: 1,
77 maxValue: 65535,
78 fieldLabel: gettext('Port'),
79 },
80 {
81 xtype: 'textfield',
82 name: 'binddn',
83 allowBlank: true,
84 fieldLabel: gettext('User name')
85 },
86 {
87 xtype: 'textfield',
88 inputType: 'password',
89 allowBlank: true,
90 name: 'bindpw',
91 fieldLabel: gettext('Password')
92 }
93 ];
94
95 me.column2 = [
96 {
97 xtype: 'proxmoxcheckbox',
98 name: 'enable',
99 checked: true,
100 uncheckedValue: 0,
101 fieldLabel: gettext('Enable')
102 },
103 {
104 xtype: 'proxmoxtextfield',
105 allowBlank: true,
106 deleteEmpty: me.create ? false : true,
107 name: 'basedn',
108 fieldLabel: gettext('Base DN')
109 },
110 {
111 xtype: 'proxmoxtextfield',
112 allowBlank: true,
113 deleteEmpty: me.create ? false : true,
114 name: 'groupbasedn',
115 fieldLabel: gettext('Base DN for Groups')
116 },
117 {
118 xtype: 'proxmoxtextfield',
119 allowBlank: true,
120 deleteEmpty: me.create ? false : true,
121 name: 'mailattr',
122 fieldLabel: gettext('EMail attribute name(s)')
123 },
124 {
125 xtype: 'proxmoxtextfield',
126 allowBlank: true,
127 deleteEmpty: me.create ? false : true,
128 name: 'accountattr',
129 fieldLabel: gettext('Account attribute name')
130 },
131 {
132 xtype: 'proxmoxtextfield',
133 allowBlank: true,
134 deleteEmpty: me.create ? false : true,
135 name: 'filter',
136 fieldLabel: gettext('LDAP filter')
137 }
138 ];
139
140 me.columnB = [
141 {
142 xtype: 'textfield',
143 fieldLabel: gettext('Comment'),
144 allowBlank: true,
145 name: 'comment'
146 }
147 ];
148
149 me.callParent();
150 }
151 });
152
153 Ext.define('PMG.LDAPEdit', {
154 extend: 'Proxmox.window.Edit',
155 alias: 'widget.pmgLDAPEdit',
156
157 subject: 'LDAP Profile',
158 isAdd: true,
159
160 initComponent : function() {
161 var me = this;
162
163 me.create = me.sectionId ? false : true;
164
165 if (me.create) {
166 me.url = '/api2/extjs/config/ldap';
167 me.method = 'POST';
168 } else {
169 me.url = '/api2/extjs/config/ldap/' + me.sectionId;
170 me.method = 'PUT';
171 }
172
173 var ipanel = Ext.create('PMG.LDAPInputPanel', {
174 create: me.create,
175 sectionId: me.sectionId
176 });
177
178 me.items = [ ipanel ];
179
180 me.fieldDefaults = {
181 labelWidth: 150
182 };
183
184 me.callParent();
185
186 if (!me.create) {
187 me.load({
188 success: function(response, options) {
189 var values = response.result.data;
190
191 values.enable = values.disable ? 0 : 1;
192 ipanel.setValues(values);
193 }
194 });
195 }
196 }
197 });
198
199 Ext.define('PMG.LDAPConfig', {
200 extend: 'Ext.grid.GridPanel',
201 alias: ['widget.pmgLDAPConfig'],
202
203 initComponent : function() {
204 var me = this;
205
206 me.store = new Ext.data.Store({
207 model: 'pmg-ldap-config',
208 sorters: {
209 property: 'section',
210 order: 'DESC'
211 }
212 });
213
214 var reload = function() {
215 me.store.load();
216 };
217
218 me.selModel = Ext.create('Ext.selection.RowModel', {});
219
220 var remove_btn = Ext.createWidget('proxmoxStdRemoveButton', {
221 selModel: me.selModel,
222 baseurl: '/config/ldap',
223 callback: reload,
224 waitMsgTarget: me
225 });
226
227 var sync_btn = Ext.createWidget('proxmoxButton', {
228 text: gettext('Synchronize'),
229 selModel: me.selModel,
230 disabled: true,
231 handler: function(btn, event, rec) {
232 Proxmox.Utils.API2Request({
233 url: '/config/ldap/' + rec.data.section,
234 method: 'POST',
235 waitMsgTarget: me,
236 callback: reload,
237 failure: function (response, opts) {
238 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
239 }
240 });
241 }
242 });
243
244 var run_editor = function() {
245 var rec = me.selModel.getSelection()[0];
246 if (!rec) {
247 return;
248 }
249
250 var win = Ext.createWidget('pmgLDAPEdit', {
251 sectionId: rec.data.section
252 });
253 win.load();
254 win.on('destroy', reload);
255 win.show();
256 };
257
258 me.tbar = [
259 {
260 xtype: 'proxmoxButton',
261 text: gettext('Edit'),
262 disabled: true,
263 selModel: me.selModel,
264 handler: run_editor
265 },
266 {
267 text: gettext('Create'),
268 handler: function() {
269 var win = Ext.createWidget('pmgLDAPEdit', {});
270 win.on('destroy', reload);
271 win.show();
272 }
273 },
274 remove_btn, sync_btn
275 ];
276
277 Proxmox.Utils.monStoreErrors(me, me.store);
278
279 Ext.apply(me, {
280
281 columns: [
282 {
283 header: gettext('Profile Name'),
284 sortable: true,
285 width: 120,
286 dataIndex: 'section'
287 },
288 {
289 header: gettext('Protocol'),
290 sortable: true,
291 dataIndex: 'mode',
292 renderer: PMG.Utils.format_ldap_protocol
293 },
294 {
295 header: gettext('Server'),
296 sortable: true,
297 dataIndex: 'server1',
298 renderer: function(value, metaData, rec) {
299 if (rec.data.server2) {
300 return value + '<br>' + rec.data.server2;
301 }
302 return value;
303 }
304 },
305 {
306 header: gettext('Enabled'),
307 width: 80,
308 sortable: true,
309 dataIndex: 'disable',
310 renderer: Proxmox.Utils.format_neg_boolean
311 },
312 {
313 header: gettext('Comment'),
314 sortable: false,
315 renderer: Ext.String.htmlEncode,
316 dataIndex: 'comment',
317 flex: 1
318 },
319 {
320 header: gettext('Accounts'),
321 width: 80,
322 sortable: true,
323 dataIndex: 'ucount'
324 },
325 {
326 header: gettext('Addresses'),
327 width: 80,
328 sortable: true,
329 dataIndex: 'mcount'
330 },
331 {
332 header: gettext('Groups'),
333 width: 80,
334 sortable: true,
335 dataIndex: 'gcount'
336 },
337 ],
338 listeners: {
339 itemdblclick: run_editor,
340 activate: reload
341 }
342 });
343
344 me.callParent();
345 }
346 });