]>
Commit | Line | Data |
---|---|---|
9233148b AD |
1 | Ext.define('PVE.sdn.ControllerView', { |
2 | extend: 'Ext.grid.GridPanel', | |
9233148b AD |
3 | alias: ['widget.pveSDNControllerView'], |
4 | ||
1d9643f6 | 5 | onlineHelp: 'pvesdn_config_controllers', |
f3c1eac7 | 6 | |
9233148b AD |
7 | stateful: true, |
8 | stateId: 'grid-sdn-controller', | |
9 | ||
10 | createSDNControllerEditWindow: function(type, sid) { | |
11 | var schema = PVE.Utils.sdncontrollerSchema[type]; | |
12 | if (!schema || !schema.ipanel) { | |
13 | throw "no editor registered for controller type: " + type; | |
14 | } | |
15 | ||
16 | Ext.create('PVE.sdn.controllers.BaseEdit', { | |
17 | paneltype: 'PVE.sdn.controllers.' + schema.ipanel, | |
18 | type: type, | |
19 | controllerid: sid, | |
20 | autoShow: true, | |
21 | listeners: { | |
f6710aac TL |
22 | destroy: this.reloadStore, |
23 | }, | |
9233148b AD |
24 | }); |
25 | }, | |
26 | ||
8058410f | 27 | initComponent: function() { |
9233148b AD |
28 | var me = this; |
29 | ||
30 | var store = new Ext.data.Store({ | |
31 | model: 'pve-sdn-controller', | |
32 | proxy: { | |
1d9643f6 AD |
33 | type: 'proxmox', |
34 | url: "/api2/json/cluster/sdn/controllers?pending=1", | |
9233148b AD |
35 | }, |
36 | sorters: { | |
37 | property: 'controller', | |
392e3cf1 | 38 | direction: 'ASC', |
9233148b AD |
39 | }, |
40 | }); | |
41 | ||
69908c51 | 42 | let sm = Ext.create('Ext.selection.RowModel', {}); |
1d9643f6 | 43 | |
69908c51 TL |
44 | let run_editor = function() { |
45 | let rec = sm.getSelection()[0]; | |
9233148b AD |
46 | if (!rec) { |
47 | return; | |
48 | } | |
69908c51 | 49 | let type = rec.data.type, controller = rec.data.controller; |
9233148b AD |
50 | me.createSDNControllerEditWindow(type, controller); |
51 | }; | |
52 | ||
69908c51 | 53 | let edit_btn = new Proxmox.button.Button({ |
9233148b AD |
54 | text: gettext('Edit'), |
55 | disabled: true, | |
56 | selModel: sm, | |
f6710aac | 57 | handler: run_editor, |
9233148b AD |
58 | }); |
59 | ||
69908c51 | 60 | let remove_btn = Ext.create('Proxmox.button.StdRemoveButton', { |
9233148b AD |
61 | selModel: sm, |
62 | baseurl: '/cluster/sdn/controllers/', | |
69908c51 | 63 | callback: () => store.load(), |
9233148b AD |
64 | }); |
65 | ||
66 | // else we cannot dynamically generate the add menu handlers | |
69908c51 | 67 | let addHandleGenerator = function(type) { |
9233148b AD |
68 | return function() { me.createSDNControllerEditWindow(type); }; |
69 | }; | |
69908c51 TL |
70 | let addMenuItems = []; |
71 | for (const [type, controller] of Object.entries(PVE.Utils.sdncontrollerSchema)) { | |
9233148b AD |
72 | if (controller.hideAdd) { |
73 | continue; | |
74 | } | |
75 | addMenuItems.push({ | |
8058410f | 76 | text: PVE.Utils.format_sdncontroller_type(type), |
9233148b | 77 | iconCls: 'fa fa-fw fa-' + controller.faIcon, |
f6710aac | 78 | handler: addHandleGenerator(type), |
9233148b AD |
79 | }); |
80 | } | |
81 | ||
82 | Ext.apply(me, { | |
83 | store: store, | |
69908c51 | 84 | reloadStore: () => store.load(), |
9233148b AD |
85 | selModel: sm, |
86 | viewConfig: { | |
f6710aac | 87 | trackOver: false, |
9233148b AD |
88 | }, |
89 | tbar: [ | |
90 | { | |
91 | text: gettext('Add'), | |
92 | menu: new Ext.menu.Menu({ | |
f6710aac TL |
93 | items: addMenuItems, |
94 | }), | |
9233148b AD |
95 | }, |
96 | remove_btn, | |
97 | edit_btn, | |
9233148b AD |
98 | ], |
99 | columns: [ | |
100 | { | |
101 | header: 'ID', | |
102 | flex: 2, | |
103 | sortable: true, | |
f6710aac | 104 | dataIndex: 'controller', |
1d9643f6 AD |
105 | renderer: function(value, metaData, rec) { |
106 | return PVE.Utils.render_sdn_pending(rec, value, 'controller', 1); | |
4966ba74 | 107 | }, |
9233148b AD |
108 | }, |
109 | { | |
110 | header: gettext('Type'), | |
111 | flex: 1, | |
112 | sortable: true, | |
113 | dataIndex: 'type', | |
1d9643f6 AD |
114 | renderer: function(value, metaData, rec) { |
115 | return PVE.Utils.render_sdn_pending(rec, value, 'type', 1); | |
4966ba74 | 116 | }, |
9233148b | 117 | }, |
1d9643f6 AD |
118 | { |
119 | header: gettext('Node'), | |
120 | flex: 1, | |
121 | sortable: true, | |
122 | dataIndex: 'node', | |
123 | renderer: function(value, metaData, rec) { | |
124 | return PVE.Utils.render_sdn_pending(rec, value, 'node', 1); | |
4966ba74 | 125 | }, |
1d9643f6 AD |
126 | }, |
127 | { | |
128 | header: gettext('State'), | |
129 | width: 100, | |
130 | dataIndex: 'state', | |
131 | renderer: function(value, metaData, rec) { | |
132 | return PVE.Utils.render_sdn_pending_state(rec, value); | |
4966ba74 TL |
133 | }, |
134 | }, | |
9233148b AD |
135 | ], |
136 | listeners: { | |
69908c51 | 137 | activate: () => store.load(), |
f6710aac TL |
138 | itemdblclick: run_editor, |
139 | }, | |
9233148b | 140 | }); |
1d9643f6 | 141 | store.load(); |
9233148b | 142 | me.callParent(); |
f6710aac | 143 | }, |
9233148b | 144 | }); |