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