]>
Commit | Line | Data |
---|---|---|
8e4bf8c5 DM |
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 | /*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 | ||
61 | Ext.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 | ||
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>', | |
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 | }); |