]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/panel/ConfigPanel.js
2 * Base class for all the multitab config panels
6 * You create a subclass of this, and then define your wanted tabs
12 * iconCls: 'fa fa-icon',
13 * groups: ['somegroup'],
14 * expandedOnInit: true,
18 * this has to be in the declarative syntax, else we
19 * cannot save them for later
20 * (so no Ext.create or Ext.apply of an item in the subclass)
22 * the groups array expects the itemids of the items
23 * which are the parents, which have to come before they
26 * if you want following the tree:
33 * the suboption1 group array has to look like this:
34 * groups: ['itemid-of-option2']
36 * and of subsuboption1:
37 * groups: ['itemid-of-option2', 'itemid-of-suboption1']
39 * setting the expandedOnInit determines if the item/group is expanded
40 * initially (false by default)
42 Ext
.define('PVE.panel.Config', {
43 extend
: 'Ext.panel.Panel',
44 alias
: 'widget.pvePanelConfig',
46 showSearch
: true, // add a resource grid with a search button as first tab
47 viewFilter
: undefined, // a filter to pass to that resource grid
49 tbarSpacing
: true, // if true, adds a spacer after the title in tbar
52 // this is needed for the overflow handler
54 overflowHandler
: 'scroller',
60 cls
: 'pve-toolbar-bg',
70 selectionchange: function(treeList
, selection
) {
74 let view
= this.up('panel');
75 view
.suspendLayout
= true;
76 view
.activateCard(selection
.data
.id
);
77 view
.suspendLayout
= false;
80 itemclick: function(treelist
, info
) {
81 var olditem
= treelist
.getSelection();
82 var newitem
= info
.node
;
84 // when clicking on the expand arrow, we don't select items, but still want the original behaviour
85 if (info
.select
=== false) {
89 // click on a different, open item then leave it open, else toggle the clicked item
90 if (olditem
.data
.id
!== newitem
.data
.id
&&
91 newitem
.data
.expanded
=== true) {
105 overflowHandler
: 'scroller',
112 // used for automated test
113 selectById: function(cardid
) {
116 var root
= me
.store
.getRoot();
117 var selection
= root
.findChild('id', cardid
, true);
121 var menu
= me
.down('#menu');
122 menu
.setSelection(selection
);
128 activateCard: function(cardid
) {
130 if (me
.savedItems
[cardid
]) {
131 var curcard
= me
.getLayout().getActiveItem();
132 var newcard
= me
.add(me
.savedItems
[cardid
]);
133 me
.helpButton
.setOnlineHelp(newcard
.onlineHelp
|| me
.onlineHelp
);
135 me
.setActiveItem(cardid
);
136 me
.remove(curcard
, true);
138 // trigger state change
141 // Note: '' is alias for first tab.
142 // First tab can be 'search' or something else
143 if (cardid
=== me
.firstItem
) {
147 me
.sp
.set(me
.hstateid
, { value
: ncard
});
153 initComponent: function() {
156 var stateid
= me
.hstateid
;
158 me
.sp
= Ext
.state
.Manager
.getProvider();
160 var activeTab
; // leaving this undefined means items[0] will be the default tab
163 let state
= me
.sp
.get(stateid
);
164 if (state
&& state
.value
) {
165 // if this tab does not exist, it chooses the first
166 activeTab
= state
.value
;
171 var title
= me
.title
|| me
.pveSelNode
.data
.text
;
172 me
.title
= undefined;
175 var tbar
= me
.tbar
|| [];
178 if (!me
.onlineHelp
) {
179 // use the onlineHelp property indirection to enforce checking reference validity
180 let typeToOnlineHelp
= {
181 'type/lxc': { onlineHelp
: 'chapter_pct' },
182 'type/node': { onlineHelp
: 'chapter_system_administration' },
183 'type/pool': { onlineHelp
: 'pveum_pools' },
184 'type/qemu': { onlineHelp
: 'chapter_virtual_machines' },
185 'type/sdn': { onlineHelp
: 'chapter_pvesdn' },
186 'type/storage': { onlineHelp
: 'chapter_storage' },
188 me
.onlineHelp
= typeToOnlineHelp
[me
.pveSelNode
.data
.id
]?.onlineHelp
;
191 if (me
.tbarSpacing
) {
197 baseCls
: 'x-panel-header-text',
200 me
.helpButton
= Ext
.create('Proxmox.button.Help', {
202 listenToGlobalEvent
: false,
203 onlineHelp
: me
.onlineHelp
|| undefined,
206 tbar
.push(me
.helpButton
);
208 me
.dockedItems
[1].items
= tbar
;
210 // include search tab
211 me
.items
= me
.items
|| [];
214 xtype
: 'pveResourceGrid',
216 title
: gettext('Search'),
217 iconCls
: 'fa fa-search',
218 pveSelNode
: me
.pveSelNode
,
224 me
.firstItem
= me
.items
[0].itemId
;
227 me
.store
= Ext
.create('Ext.data.TreeStore', {
232 var root
= me
.store
.getRoot();
233 me
.insertNodes(me
.items
);
236 me
.defaults
= me
.defaults
|| {};
237 Ext
.apply(me
.defaults
, {
238 pveSelNode
: me
.pveSelNode
,
239 viewFilter
: me
.viewFilter
,
240 workspace
: me
.workspace
,
246 var menu
= me
.down('#menu');
247 var selection
= root
.findChild('id', activeTab
, true) || root
.firstChild
;
248 var node
= selection
;
249 while (node
!== root
) {
251 node
= node
.parentNode
;
253 menu
.setStore(me
.store
);
254 menu
.setSelection(selection
);
256 // on a state change,
257 // select the new item
258 var statechange = function(sp
, key
, state
) {
259 // it the state change is for this panel
260 if (stateid
&& key
=== stateid
&& state
) {
262 var acard
= me
.getLayout().getActiveItem().itemId
;
263 // get the itemid of the new value
264 var ncard
= state
.value
|| me
.firstItem
;
265 if (ncard
&& acard
!== ncard
) {
266 // select the chosen item
267 menu
.setSelection(root
.findChild('id', ncard
, true) || root
.firstChild
);
273 me
.mon(me
.sp
, 'statechange', statechange
);
277 insertNodes: function(items
) {
279 var root
= me
.store
.getRoot();
281 items
.forEach(function(item
) {
282 var treeitem
= Ext
.create('Ext.data.TreeModel', {
285 iconCls
: item
.iconCls
,
287 expanded
: item
.expandedOnInit
,
290 if (me
.savedItems
[item
.itemId
] !== undefined) {
291 throw "itemId already exists, please use another";
293 me
.savedItems
[item
.itemId
] = item
;
298 // get/create the group items
299 while (Ext
.isArray(item
.groups
) && item
.groups
.length
> 0) {
300 group
= item
.groups
.shift();
302 var child
= curnode
.findChild('id', group
);
303 if (child
=== null) {
304 // did not find the group item
305 // so add it where we are
313 // lets see if it already exists
314 var node
= curnode
.findChild('id', item
.itemId
);
317 curnode
.appendChild(treeitem
);
319 // should not happen!
320 throw "id already exists";