]>
Commit | Line | Data |
---|---|---|
e5c95a12 DM |
1 | Ext.define('PVE.grid.ResourceGrid', { |
2 | extend: 'Ext.grid.GridPanel', | |
3 | alias: ['widget.pveResourceGrid'], | |
4 | ||
4dce154f | 5 | border: false, |
df6345f9 DC |
6 | defaultSorter: { |
7 | property: 'type', | |
f6710aac | 8 | direction: 'ASC', |
df6345f9 | 9 | }, |
e5c95a12 DM |
10 | initComponent : function() { |
11 | var me = this; | |
12 | ||
13 | var rstore = PVE.data.ResourceStore; | |
14 | var sp = Ext.state.Manager.getProvider(); | |
15 | ||
3a8c89c2 | 16 | var coldef = rstore.defaultColumns(); |
e5c95a12 DM |
17 | |
18 | var store = Ext.create('Ext.data.Store', { | |
19 | model: 'PVEResources', | |
df6345f9 | 20 | sorters: me.defaultSorter, |
f6710aac | 21 | proxy: { type: 'memory' }, |
e5c95a12 DM |
22 | }); |
23 | ||
24 | var textfilter = ''; | |
25 | ||
26 | var textfilter_match = function(item) { | |
27 | var match = false; | |
28 | Ext.each(['name', 'storage', 'node', 'type', 'text'], function(field) { | |
29 | var v = item.data[field]; | |
30 | if (v !== undefined) { | |
31 | v = v.toLowerCase(); | |
32 | if (v.indexOf(textfilter) >= 0) { | |
33 | match = true; | |
34 | return false; | |
35 | } | |
36 | } | |
37 | }); | |
38 | return match; | |
39 | }; | |
40 | ||
41 | var updateGrid = function() { | |
42 | ||
43 | var filterfn = me.viewFilter ? me.viewFilter.filterfn : null; | |
2a4971d8 | 44 | |
e5c95a12 DM |
45 | //console.log("START GRID UPDATE " + me.viewFilter); |
46 | ||
47 | store.suspendEvents(); | |
48 | ||
49 | var nodeidx = {}; | |
50 | var gather_child_nodes = function(cn) { | |
51 | if (!cn) { | |
52 | return; | |
53 | } | |
54 | var cs = cn.childNodes; | |
55 | if (!cs) { | |
56 | return; | |
57 | } | |
58 | var len = cs.length, i = 0, n, res; | |
59 | ||
60 | for (; i < len; i++) { | |
61 | var child = cs[i]; | |
62 | var orgnode = rstore.data.get(child.data.id); | |
63 | if (orgnode) { | |
64 | if ((!filterfn || filterfn(child)) && | |
65 | (!textfilter || textfilter_match(child))) { | |
66 | nodeidx[child.data.id] = orgnode; | |
67 | } | |
68 | } | |
69 | gather_child_nodes(child); | |
70 | } | |
71 | }; | |
72 | gather_child_nodes(me.pveSelNode); | |
73 | ||
74 | // remove vanished items | |
75 | var rmlist = []; | |
76 | store.each(function(olditem) { | |
77 | var item = nodeidx[olditem.data.id]; | |
78 | if (!item) { | |
79 | //console.log("GRID REM UID: " + olditem.data.id); | |
80 | rmlist.push(olditem); | |
81 | } | |
82 | }); | |
83 | ||
84 | if (rmlist.length) { | |
85 | store.remove(rmlist); | |
86 | } | |
87 | ||
88 | // add new items | |
89 | var addlist = []; | |
90 | var key; | |
91 | for (key in nodeidx) { | |
92 | if (nodeidx.hasOwnProperty(key)) { | |
93 | var item = nodeidx[key]; | |
2a4971d8 TL |
94 | |
95 | // getById() use find(), which is slow (ExtJS4 DP5) | |
e5c95a12 DM |
96 | //var olditem = store.getById(item.data.id); |
97 | var olditem = store.data.get(item.data.id); | |
98 | ||
99 | if (!olditem) { | |
100 | //console.log("GRID ADD UID: " + item.data.id); | |
101 | var info = Ext.apply({}, item.data); | |
5ea30043 | 102 | var child = Ext.create(store.model, info); |
e5c95a12 DM |
103 | addlist.push(item); |
104 | continue; | |
105 | } | |
106 | // try to detect changes | |
107 | var changes = false; | |
108 | var fieldkeys = PVE.data.ResourceStore.fieldNames; | |
109 | var fieldcount = fieldkeys.length; | |
110 | var fieldind; | |
111 | for (fieldind = 0; fieldind < fieldcount; fieldind++) { | |
112 | var field = fieldkeys[fieldind]; | |
113 | if (field != 'id' && item.data[field] != olditem.data[field]) { | |
114 | changes = true; | |
115 | //console.log("changed item " + item.id + " " + field + " " + item.data[field] + " != " + olditem.data[field]); | |
116 | olditem.beginEdit(); | |
117 | olditem.set(field, item.data[field]); | |
118 | } | |
119 | } | |
120 | if (changes) { | |
121 | olditem.endEdit(true); | |
2a4971d8 | 122 | olditem.commit(true); |
e5c95a12 DM |
123 | } |
124 | } | |
125 | } | |
126 | ||
127 | if (addlist.length) { | |
128 | store.add(addlist); | |
129 | } | |
130 | ||
131 | store.sort(); | |
132 | ||
133 | store.resumeEvents(); | |
134 | ||
7a3691ac | 135 | store.fireEvent('refresh', store); |
e5c95a12 DM |
136 | |
137 | //console.log("END GRID UPDATE"); | |
138 | }; | |
139 | ||
140 | var filter_task = new Ext.util.DelayedTask(function(){ | |
141 | updateGrid(); | |
142 | }); | |
143 | ||
2a4971d8 TL |
144 | var load_cb = function() { |
145 | updateGrid(); | |
e5c95a12 DM |
146 | }; |
147 | ||
e5c95a12 DM |
148 | Ext.apply(me, { |
149 | store: store, | |
df6345f9 | 150 | stateful: true, |
ac419eb9 | 151 | stateId: 'grid-resource', |
e5c95a12 | 152 | tbar: [ |
2a4971d8 | 153 | '->', |
e5c95a12 DM |
154 | gettext('Search') + ':', ' ', |
155 | { | |
156 | xtype: 'textfield', | |
157 | width: 200, | |
158 | value: textfilter, | |
159 | enableKeyEvents: true, | |
160 | listeners: { | |
161 | keyup: function(field, e) { | |
162 | var v = field.getValue(); | |
163 | textfilter = v.toLowerCase(); | |
164 | filter_task.delay(500); | |
f6710aac TL |
165 | }, |
166 | }, | |
167 | }, | |
e5c95a12 DM |
168 | ], |
169 | viewConfig: { | |
f6710aac | 170 | stripeRows: true, |
e5c95a12 DM |
171 | }, |
172 | listeners: { | |
685b7aa4 | 173 | itemcontextmenu: PVE.Utils.createCmdMenu, |
e5c95a12 DM |
174 | itemdblclick: function(v, record) { |
175 | var ws = me.up('pveStdWorkspace'); | |
176 | ws.selectById(record.data.id); | |
177 | }, | |
178 | destroy: function() { | |
179 | rstore.un("load", load_cb); | |
f6710aac | 180 | }, |
e5c95a12 | 181 | }, |
f6710aac | 182 | columns: coldef, |
e5c95a12 | 183 | }); |
e5c95a12 | 184 | me.callParent(); |
e5c95a12 DM |
185 | updateGrid(); |
186 | rstore.on("load", load_cb); | |
f6710aac | 187 | }, |
e5c95a12 | 188 | }); |