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