]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/dc/SecurityGroups.js
make firewall panels/grids stateful
[pve-manager.git] / www / manager6 / dc / SecurityGroups.js
CommitLineData
8e4bf8c5
DM
1Ext.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 /*jslint confusion: true */
10 var me = this;
11
12 me.create = (me.group_name === undefined);
13
14 var subject;
15
16 me.url = '/api2/extjs' + me.base_url;
17 me.method = 'POST';
18
19 var items = [
20 {
21 xtype: 'textfield',
22 name: 'group',
23 value: me.group_name || '',
24 fieldLabel: gettext('Name'),
25 allowBlank: false
26 },
27 {
28 xtype: 'textfield',
29 name: 'comment',
30 value: me.group_comment || '',
31 fieldLabel: gettext('Comment')
32 }
33 ];
34
35 if (me.create) {
36 subject = gettext('Security Group');
37 } else {
38 subject = gettext('Security Group') + " '" + me.group_name + "'";
39 items.push({
40 xtype: 'hiddenfield',
41 name: 'rename',
42 value: me.group_name
43 });
44 }
45
46 var ipanel = Ext.create('PVE.panel.InputPanel', {
47 create: me.create,
48 items: items
49 });
50
51
52 Ext.apply(me, {
53 subject: subject,
54 items: [ ipanel ]
55 });
56
57 me.callParent();
58 }
59});
60
61Ext.define('PVE.SecurityGroupList', {
62 extend: 'Ext.grid.Panel',
63 alias: 'widget.pveSecurityGroupList',
64
123e1c80
DC
65 stateful: true,
66 stateId: 'grid-securitygroups',
67
8e4bf8c5
DM
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: [
123e1c80 172 { header: gettext('Group'), dataIndex: 'group', width: '100' },
2eb0767b 173 { header: gettext('Comment'), dataIndex: 'comment', renderer: Ext.String.htmlEncode, flex: 1 }
8e4bf8c5
DM
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
194Ext.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>',
8e4bf8c5
DM
208 border: false
209 });
210
211 var sglist = Ext.createWidget('pveSecurityGroupList', {
212 region: 'west',
213 rule_panel: rule_panel,
123e1c80 214 width: '25%',
8e4bf8c5
DM
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});