]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/dc/SecurityGroups.js
ui: ldap: add 'Check connection' checkbox as advanced option
[pve-manager.git] / www / manager6 / dc / SecurityGroups.js
CommitLineData
1774f148
DC
1Ext.define('pve-security-groups', {
2 extend: 'Ext.data.Model',
3
8058410f 4 fields: ['group', 'comment', 'digest'],
f6710aac 5 idProperty: 'group',
1774f148
DC
6});
7
8e4bf8c5 8Ext.define('PVE.SecurityGroupEdit', {
9fccc702 9 extend: 'Proxmox.window.Edit',
8e4bf8c5
DM
10
11 base_url: "/cluster/firewall/groups",
12
13 allow_iface: false,
14
8058410f 15 initComponent: function() {
8e4bf8c5
DM
16 var me = this;
17
53e3ea84 18 me.isCreate = me.group_name === undefined;
8e4bf8c5
DM
19
20 var subject;
21
22 me.url = '/api2/extjs' + me.base_url;
23 me.method = 'POST';
2a4971d8
TL
24
25 var items = [
8e4bf8c5
DM
26 {
27 xtype: 'textfield',
28 name: 'group',
29 value: me.group_name || '',
30 fieldLabel: gettext('Name'),
f6710aac 31 allowBlank: false,
8e4bf8c5
DM
32 },
33 {
34 xtype: 'textfield',
35 name: 'comment',
36 value: me.group_comment || '',
f6710aac
TL
37 fieldLabel: gettext('Comment'),
38 },
8e4bf8c5
DM
39 ];
40
d5e771ce 41 if (me.isCreate) {
8e4bf8c5
DM
42 subject = gettext('Security Group');
43 } else {
44 subject = gettext('Security Group') + " '" + me.group_name + "'";
45 items.push({
46 xtype: 'hiddenfield',
47 name: 'rename',
f6710aac 48 value: me.group_name,
8e4bf8c5
DM
49 });
50 }
51
ef4ef788 52 var ipanel = Ext.create('Proxmox.panel.InputPanel', {
d5e771ce
EK
53 // InputPanel does not have a 'create' property, does it need a 'isCreate'
54 isCreate: me.isCreate,
f6710aac 55 items: items,
8e4bf8c5
DM
56 });
57
58
59 Ext.apply(me, {
60 subject: subject,
8058410f 61 items: [ipanel],
8e4bf8c5
DM
62 });
63
64 me.callParent();
f6710aac 65 },
8e4bf8c5
DM
66});
67
68Ext.define('PVE.SecurityGroupList', {
69 extend: 'Ext.grid.Panel',
70 alias: 'widget.pveSecurityGroupList',
71
123e1c80
DC
72 stateful: true,
73 stateId: 'grid-securitygroups',
74
90d5bbb6 75 rulePanel: undefined,
8e4bf8c5
DM
76
77 addBtn: undefined,
78 removeBtn: undefined,
79 editBtn: undefined,
80
81 base_url: "/cluster/firewall/groups",
82
83 initComponent: function() {
90d5bbb6
TL
84 let me = this;
85 if (!me.base_url) {
8e4bf8c5
DM
86 throw "no base_url specified";
87 }
88
90d5bbb6 89 let store = new Ext.data.Store({
1774f148 90 model: 'pve-security-groups',
8e4bf8c5 91 proxy: {
56a353b9 92 type: 'proxmox',
f6710aac 93 url: '/api2/json' + me.base_url,
8e4bf8c5 94 },
8e4bf8c5
DM
95 sorters: {
96 property: 'group',
392e3cf1 97 direction: 'ASC',
f6710aac 98 },
8e4bf8c5
DM
99 });
100
90d5bbb6 101 let sm = Ext.create('Ext.selection.RowModel', {});
8e4bf8c5 102
2e37e779 103 let caps = Ext.state.Manager.get('GuiCap');
1056e10c 104 let canEdit = !!caps.dc['Sys.Modify'];
2e37e779 105
90d5bbb6
TL
106 let reload = function() {
107 let oldrec = sm.getSelection()[0];
108 store.load((records, operation, success) => {
8e4bf8c5 109 if (oldrec) {
90d5bbb6 110 let rec = store.findRecord('group', oldrec.data.group, 0, false, true, true);
8e4bf8c5
DM
111 if (rec) {
112 sm.select(rec);
113 }
114 }
115 });
116 };
117
90d5bbb6
TL
118 let run_editor = function() {
119 let rec = sm.getSelection()[0];
1056e10c 120 if (!rec || !canEdit) {
8e4bf8c5
DM
121 return;
122 }
90d5bbb6 123 Ext.create('PVE.SecurityGroupEdit', {
8e4bf8c5
DM
124 digest: rec.data.digest,
125 group_name: rec.data.group,
f6710aac 126 group_comment: rec.data.comment,
90d5bbb6
TL
127 listeners: {
128 destroy: () => reload(),
129 },
130 autoShow: true,
8e4bf8c5 131 });
8e4bf8c5
DM
132 };
133
5720fafa 134 me.editBtn = new Proxmox.button.Button({
8e4bf8c5 135 text: gettext('Edit'),
1056e10c 136 enableFn: rec => canEdit,
8e4bf8c5
DM
137 disabled: true,
138 selModel: sm,
f6710aac 139 handler: run_editor,
8e4bf8c5 140 });
5720fafa 141 me.addBtn = new Proxmox.button.Button({
8e4bf8c5 142 text: gettext('Create'),
1056e10c 143 disabled: !canEdit,
8e4bf8c5
DM
144 handler: function() {
145 sm.deselectAll();
146 var win = Ext.create('PVE.SecurityGroupEdit', {});
147 win.show();
148 win.on('destroy', reload);
f6710aac 149 },
8e4bf8c5
DM
150 });
151
3b1ca3ff 152 me.removeBtn = Ext.create('Proxmox.button.StdRemoveButton', {
8e4bf8c5 153 selModel: sm,
3b1ca3ff 154 baseurl: me.base_url + '/',
1056e10c 155 enableFn: (rec) => canEdit && rec && me.base_url,
90d5bbb6 156 callback: () => reload(),
8e4bf8c5
DM
157 });
158
159 Ext.apply(me, {
160 store: store,
8058410f 161 tbar: ['<b>' + gettext('Group') + ':</b>', me.addBtn, me.removeBtn, me.editBtn],
8e4bf8c5
DM
162 selModel: sm,
163 columns: [
90d5bbb6
TL
164 {
165 header: gettext('Group'),
166 dataIndex: 'group',
167 width: '100',
168 },
169 {
170 header: gettext('Comment'),
171 dataIndex: 'comment',
172 renderer: Ext.String.htmlEncode,
173 flex: 1,
174 },
8e4bf8c5
DM
175 ],
176 listeners: {
177 itemdblclick: run_editor,
90d5bbb6
TL
178 select: function(_sm, rec) {
179 if (!me.rulePanel) {
180 me.rulePanel = me.up('panel').down('pveFirewallRules');
181 }
182 me.rulePanel.setBaseUrl(`/cluster/firewall/groups/${rec.data.group}`);
8e4bf8c5
DM
183 },
184 deselect: function() {
90d5bbb6
TL
185 if (!me.rulePanel) {
186 me.rulePanel = me.up('panel').down('pveFirewallRules');
187 }
188 me.rulePanel.setBaseUrl(undefined);
8e4bf8c5 189 },
f6710aac
TL
190 show: reload,
191 },
8e4bf8c5
DM
192 });
193
194 me.callParent();
195
196 store.load();
f6710aac 197 },
8e4bf8c5
DM
198});
199
200Ext.define('PVE.SecurityGroups', {
201 extend: 'Ext.panel.Panel',
202 alias: 'widget.pveSecurityGroups',
203
204 title: 'Security Groups',
98246fb7 205 onlineHelp: 'pve_firewall_security_groups',
8e4bf8c5 206
90d5bbb6 207 layout: 'border',
8e4bf8c5 208
90d5bbb6
TL
209 items: [
210 {
211 xtype: 'pveFirewallRules',
8e4bf8c5
DM
212 region: 'center',
213 allow_groups: false,
214 list_refs_url: '/cluster/firewall/refs',
215 tbar_prefix: '<b>' + gettext('Rules') + ':</b>',
f6710aac 216 border: false,
90d5bbb6
TL
217 },
218 {
219 xtype: 'pveSecurityGroupList',
8e4bf8c5 220 region: 'west',
123e1c80 221 width: '25%',
8e4bf8c5 222 border: false,
f6710aac 223 split: true,
90d5bbb6
TL
224 },
225 ],
226 listeners: {
227 show: function() {
228 let sglist = this.down('pveSecurityGroupList');
229 sglist.fireEvent('show', sglist);
230 },
f6710aac 231 },
8e4bf8c5 232});