]>
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 | }, |
8058410f | 10 | initComponent: function() { |
e5c95a12 DM |
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() { | |
e5c95a12 | 42 | var filterfn = me.viewFilter ? me.viewFilter.filterfn : null; |
2a4971d8 | 43 | |
e5c95a12 DM |
44 | //console.log("START GRID UPDATE " + me.viewFilter); |
45 | ||
46 | store.suspendEvents(); | |
47 | ||
48 | var nodeidx = {}; | |
49 | var gather_child_nodes = function(cn) { | |
50 | if (!cn) { | |
51 | return; | |
52 | } | |
53 | var cs = cn.childNodes; | |
54 | if (!cs) { | |
55 | return; | |
56 | } | |
57 | var len = cs.length, i = 0, n, res; | |
58 | ||
59 | for (; i < len; i++) { | |
60 | var child = cs[i]; | |
61 | var orgnode = rstore.data.get(child.data.id); | |
62 | if (orgnode) { | |
63 | if ((!filterfn || filterfn(child)) && | |
64 | (!textfilter || textfilter_match(child))) { | |
65 | nodeidx[child.data.id] = orgnode; | |
66 | } | |
67 | } | |
68 | gather_child_nodes(child); | |
69 | } | |
70 | }; | |
71 | gather_child_nodes(me.pveSelNode); | |
72 | ||
73 | // remove vanished items | |
74 | var rmlist = []; | |
75 | store.each(function(olditem) { | |
76 | var item = nodeidx[olditem.data.id]; | |
77 | if (!item) { | |
78 | //console.log("GRID REM UID: " + olditem.data.id); | |
79 | rmlist.push(olditem); | |
80 | } | |
81 | }); | |
82 | ||
83 | if (rmlist.length) { | |
84 | store.remove(rmlist); | |
85 | } | |
86 | ||
87 | // add new items | |
88 | var addlist = []; | |
89 | var key; | |
90 | for (key in nodeidx) { | |
91 | if (nodeidx.hasOwnProperty(key)) { | |
92 | var item = nodeidx[key]; | |
2a4971d8 TL |
93 | |
94 | // getById() use find(), which is slow (ExtJS4 DP5) | |
e5c95a12 DM |
95 | //var olditem = store.getById(item.data.id); |
96 | var olditem = store.data.get(item.data.id); | |
97 | ||
98 | if (!olditem) { | |
99 | //console.log("GRID ADD UID: " + item.data.id); | |
100 | var info = Ext.apply({}, item.data); | |
5ea30043 | 101 | var child = Ext.create(store.model, info); |
e5c95a12 DM |
102 | addlist.push(item); |
103 | continue; | |
104 | } | |
105 | // try to detect changes | |
106 | var changes = false; | |
107 | var fieldkeys = PVE.data.ResourceStore.fieldNames; | |
108 | var fieldcount = fieldkeys.length; | |
109 | var fieldind; | |
110 | for (fieldind = 0; fieldind < fieldcount; fieldind++) { | |
111 | var field = fieldkeys[fieldind]; | |
112 | if (field != 'id' && item.data[field] != olditem.data[field]) { | |
113 | changes = true; | |
114 | //console.log("changed item " + item.id + " " + field + " " + item.data[field] + " != " + olditem.data[field]); | |
115 | olditem.beginEdit(); | |
116 | olditem.set(field, item.data[field]); | |
117 | } | |
118 | } | |
119 | if (changes) { | |
120 | olditem.endEdit(true); | |
2a4971d8 | 121 | olditem.commit(true); |
e5c95a12 DM |
122 | } |
123 | } | |
124 | } | |
125 | ||
126 | if (addlist.length) { | |
127 | store.add(addlist); | |
128 | } | |
129 | ||
130 | store.sort(); | |
131 | ||
132 | store.resumeEvents(); | |
133 | ||
7a3691ac | 134 | store.fireEvent('refresh', store); |
e5c95a12 DM |
135 | |
136 | //console.log("END GRID UPDATE"); | |
137 | }; | |
138 | ||
8058410f | 139 | var filter_task = new Ext.util.DelayedTask(function() { |
e5c95a12 DM |
140 | updateGrid(); |
141 | }); | |
142 | ||
2a4971d8 TL |
143 | var load_cb = function() { |
144 | updateGrid(); | |
e5c95a12 DM |
145 | }; |
146 | ||
e5c95a12 DM |
147 | Ext.apply(me, { |
148 | store: store, | |
df6345f9 | 149 | stateful: true, |
ac419eb9 | 150 | stateId: 'grid-resource', |
e5c95a12 | 151 | tbar: [ |
2a4971d8 | 152 | '->', |
e5c95a12 DM |
153 | gettext('Search') + ':', ' ', |
154 | { | |
155 | xtype: 'textfield', | |
156 | width: 200, | |
157 | value: textfilter, | |
158 | enableKeyEvents: true, | |
159 | listeners: { | |
160 | keyup: function(field, e) { | |
161 | var v = field.getValue(); | |
162 | textfilter = v.toLowerCase(); | |
163 | filter_task.delay(500); | |
f6710aac TL |
164 | }, |
165 | }, | |
166 | }, | |
e5c95a12 DM |
167 | ], |
168 | viewConfig: { | |
f6710aac | 169 | stripeRows: true, |
e5c95a12 DM |
170 | }, |
171 | listeners: { | |
685b7aa4 | 172 | itemcontextmenu: PVE.Utils.createCmdMenu, |
e5c95a12 DM |
173 | itemdblclick: function(v, record) { |
174 | var ws = me.up('pveStdWorkspace'); | |
175 | ws.selectById(record.data.id); | |
176 | }, | |
177 | destroy: function() { | |
178 | rstore.un("load", load_cb); | |
f6710aac | 179 | }, |
e5c95a12 | 180 | }, |
f6710aac | 181 | columns: coldef, |
e5c95a12 | 182 | }); |
e5c95a12 | 183 | me.callParent(); |
e5c95a12 DM |
184 | updateGrid(); |
185 | rstore.on("load", load_cb); | |
f6710aac | 186 | }, |
e5c95a12 | 187 | }); |