root / ui / static / snf / js / ui / web / ui_list_view.js @ c72a830d
History | View | Annotate | Download (17.3 kB)
1 | 8d08f18a | Kostas Papadimitriou | ;(function(root){
|
---|---|---|---|
2 | 8d08f18a | Kostas Papadimitriou | |
3 | 8d08f18a | Kostas Papadimitriou | // root
|
4 | 8d08f18a | Kostas Papadimitriou | var root = root;
|
5 | 8d08f18a | Kostas Papadimitriou | |
6 | 8d08f18a | Kostas Papadimitriou | // setup namepsaces
|
7 | 8d08f18a | Kostas Papadimitriou | var snf = root.synnefo = root.synnefo || {};
|
8 | 8d08f18a | Kostas Papadimitriou | var models = snf.models = snf.models || {}
|
9 | 8d08f18a | Kostas Papadimitriou | var storage = snf.storage = snf.storage || {};
|
10 | 8d08f18a | Kostas Papadimitriou | var ui = snf.ui = snf.ui || {};
|
11 | 8d08f18a | Kostas Papadimitriou | var util = snf.util = snf.util || {};
|
12 | 8d08f18a | Kostas Papadimitriou | |
13 | 8d08f18a | Kostas Papadimitriou | var views = snf.views = snf.views || {}
|
14 | 8d08f18a | Kostas Papadimitriou | |
15 | 8d08f18a | Kostas Papadimitriou | // shortcuts
|
16 | 8d08f18a | Kostas Papadimitriou | var bb = root.Backbone;
|
17 | 8d08f18a | Kostas Papadimitriou | |
18 | 75331d54 | Kostas Papadimitriou | var hasKey = Object.prototype.hasOwnProperty;
|
19 | 75331d54 | Kostas Papadimitriou | |
20 | 8d08f18a | Kostas Papadimitriou | views.ListMultipleActions = views.View.extend({ |
21 | 8d08f18a | Kostas Papadimitriou | |
22 | 8d08f18a | Kostas Papadimitriou | view_id: "list_actions", |
23 | 8d08f18a | Kostas Papadimitriou | |
24 | 8d08f18a | Kostas Papadimitriou | initialize: function(view) { |
25 | 8d08f18a | Kostas Papadimitriou | this.parent = view;
|
26 | 8d08f18a | Kostas Papadimitriou | this.el = this.parent.el; |
27 | 8d08f18a | Kostas Papadimitriou | |
28 | 8d08f18a | Kostas Papadimitriou | views.ListMultipleActions.__super__.initialize.call(this);
|
29 | 8d08f18a | Kostas Papadimitriou | this.set_handlers();
|
30 | 8d08f18a | Kostas Papadimitriou | this.update_layout();
|
31 | 8d08f18a | Kostas Papadimitriou | |
32 | 8d08f18a | Kostas Papadimitriou | this.selected_action = undefined; |
33 | 8d08f18a | Kostas Papadimitriou | this.available_actions = [];
|
34 | 8d08f18a | Kostas Papadimitriou | this.multi_view = synnefo.ui.main.multiple_actions_view;
|
35 | 5e21ee35 | Kostas Papadimitriou | this.hovered = false; |
36 | 2506f741 | Kostas Papadimitriou | |
37 | 2506f741 | Kostas Papadimitriou | this.update_actions = _.throttle(this.update_actions, 100); |
38 | 8d08f18a | Kostas Papadimitriou | }, |
39 | 8d08f18a | Kostas Papadimitriou | |
40 | 8d08f18a | Kostas Papadimitriou | set_handlers: function() { |
41 | 122850c5 | Kostas Papadimitriou | var self = this; |
42 | 122850c5 | Kostas Papadimitriou | storage.vms.bind("change:pending_action", function() { |
43 | 122850c5 | Kostas Papadimitriou | if (!storage.vms.has_pending_actions()) {
|
44 | 122850c5 | Kostas Papadimitriou | self.parent.$(".actions a").removeClass("selected"); |
45 | 5e21ee35 | Kostas Papadimitriou | self.parent.clear_indicators(); |
46 | 122850c5 | Kostas Papadimitriou | } |
47 | 5e21ee35 | Kostas Papadimitriou | }); |
48 | 122850c5 | Kostas Papadimitriou | |
49 | 122850c5 | Kostas Papadimitriou | var self = this; |
50 | 122850c5 | Kostas Papadimitriou | this.parent.$(".actions a.enabled").live('click', function() { |
51 | 122850c5 | Kostas Papadimitriou | self.parent.$(".actions a").removeClass("selected"); |
52 | 122850c5 | Kostas Papadimitriou | $(this).addClass("selected"); |
53 | 122850c5 | Kostas Papadimitriou | self.parent.select_action($(this).attr("id").replace("action-","")); |
54 | 5e21ee35 | Kostas Papadimitriou | }); |
55 | 5e21ee35 | Kostas Papadimitriou | |
56 | 5e21ee35 | Kostas Papadimitriou | this.parent.$(".actions a.enabled").live({ |
57 | 5e21ee35 | Kostas Papadimitriou | 'mouseenter': function() { |
58 | 5e21ee35 | Kostas Papadimitriou | self.hovered = true;
|
59 | 60491a38 | Kostas Papadimitriou | self.parent.set_indicator_for($(this).attr("id").replace("action-","")); |
60 | 5e21ee35 | Kostas Papadimitriou | }, |
61 | 5e21ee35 | Kostas Papadimitriou | 'mouseleave': function() { |
62 | 5e21ee35 | Kostas Papadimitriou | self.hovered = false;
|
63 | d1f55cb0 | Kostas Papadimitriou | self.parent.clear_indicators(); |
64 | 5e21ee35 | Kostas Papadimitriou | } |
65 | 5e21ee35 | Kostas Papadimitriou | }); |
66 | 8d08f18a | Kostas Papadimitriou | }, |
67 | 8d08f18a | Kostas Papadimitriou | |
68 | 8d08f18a | Kostas Papadimitriou | update_actions: function() { |
69 | 8d08f18a | Kostas Papadimitriou | actions = undefined;
|
70 | 8d08f18a | Kostas Papadimitriou | this.available_actions = [];
|
71 | 122850c5 | Kostas Papadimitriou | _.each(this.parent.get_selected_vms(), function(vm) { |
72 | 8d08f18a | Kostas Papadimitriou | if (!actions) {
|
73 | 8d08f18a | Kostas Papadimitriou | actions = vm.get_available_actions(); |
74 | 8d08f18a | Kostas Papadimitriou | return;
|
75 | 8d08f18a | Kostas Papadimitriou | } |
76 | 8d08f18a | Kostas Papadimitriou | actions = _.intersection(actions, vm.get_available_actions()); |
77 | 8d08f18a | Kostas Papadimitriou | }); |
78 | 8d08f18a | Kostas Papadimitriou | |
79 | 8d08f18a | Kostas Papadimitriou | this.available_actions = actions;
|
80 | 8d08f18a | Kostas Papadimitriou | |
81 | 8d08f18a | Kostas Papadimitriou | this.$(".actions a").removeClass("enabled"); |
82 | 8d08f18a | Kostas Papadimitriou | _.each(this.available_actions, _.bind(function(name){ |
83 | 8d08f18a | Kostas Papadimitriou | this.$("#action-" + name).addClass("enabled"); |
84 | 8d08f18a | Kostas Papadimitriou | }, this))
|
85 | 8d08f18a | Kostas Papadimitriou | }, |
86 | 8d08f18a | Kostas Papadimitriou | |
87 | d1f55cb0 | Kostas Papadimitriou | update_selected: function() { |
88 | d1f55cb0 | Kostas Papadimitriou | this.$("tr").removeClass("checked"); |
89 | d1f55cb0 | Kostas Papadimitriou | this.$("tr input:checked").parent().parent().addClass("checked"); |
90 | d1f55cb0 | Kostas Papadimitriou | }, |
91 | d1f55cb0 | Kostas Papadimitriou | |
92 | 8d08f18a | Kostas Papadimitriou | update_layout: function() { |
93 | 8d08f18a | Kostas Papadimitriou | this.update_actions();
|
94 | d1f55cb0 | Kostas Papadimitriou | this.update_selected();
|
95 | 8d08f18a | Kostas Papadimitriou | } |
96 | 8d08f18a | Kostas Papadimitriou | }); |
97 | 8d08f18a | Kostas Papadimitriou | |
98 | 8d08f18a | Kostas Papadimitriou | // VMs list view
|
99 | 8d08f18a | Kostas Papadimitriou | views.ListView = views.VMListView.extend({ |
100 | 8d08f18a | Kostas Papadimitriou | |
101 | 8d08f18a | Kostas Papadimitriou | // view id (this could be used to identify
|
102 | 8d08f18a | Kostas Papadimitriou | // the view object from global context
|
103 | 8d08f18a | Kostas Papadimitriou | view_id: 'vm_list', |
104 | 8d08f18a | Kostas Papadimitriou | |
105 | 8d08f18a | Kostas Papadimitriou | el: '#machinesview-list', |
106 | 23a3bb8e | Kostas Papadimitriou | id_tpl: 'list-vm-', |
107 | 23a3bb8e | Kostas Papadimitriou | link_id_tpl: 'list-vm-at-', |
108 | 8d08f18a | Kostas Papadimitriou | |
109 | 8d08f18a | Kostas Papadimitriou | hide_actions: false, |
110 | 8d08f18a | Kostas Papadimitriou | |
111 | 8d08f18a | Kostas Papadimitriou | selectors: {
|
112 | 8d08f18a | Kostas Papadimitriou | 'vms': '.list-container', |
113 | 44660f58 | Kostas Papadimitriou | 'vm': '#list-vm-', |
114 | 8d08f18a | Kostas Papadimitriou | 'view': '#machinesview-list', |
115 | 8d08f18a | Kostas Papadimitriou | 'tpl': '.list-container#machine-container-template', |
116 | 8d08f18a | Kostas Papadimitriou | 'spinner': '.large-spinner', |
117 | 8d08f18a | Kostas Papadimitriou | 'vm_spinner': '#list-vm-{0} .spinner', |
118 | 8d08f18a | Kostas Papadimitriou | 'vm_wave': '#list-vm-{0} .wave', |
119 | 8d08f18a | Kostas Papadimitriou | 'os_icon': '#list-vm-{0} .os_icon', |
120 | 8d08f18a | Kostas Papadimitriou | 'vm_cont_active': '#machinesview-list', |
121 | 8d08f18a | Kostas Papadimitriou | 'vm_cont_terminated': '#machinesview-list' |
122 | 8d08f18a | Kostas Papadimitriou | }, |
123 | 8d08f18a | Kostas Papadimitriou | |
124 | 8d08f18a | Kostas Papadimitriou | initialize: function() { |
125 | 8d08f18a | Kostas Papadimitriou | this.current_vm = 0; |
126 | 8d08f18a | Kostas Papadimitriou | |
127 | 8d08f18a | Kostas Papadimitriou | // button selectors
|
128 | 8d08f18a | Kostas Papadimitriou | this.prev_button = this.$(".controls .previous"); |
129 | 8d08f18a | Kostas Papadimitriou | this.next_button = this.$(".controls .next"); |
130 | 8d08f18a | Kostas Papadimitriou | |
131 | 8d08f18a | Kostas Papadimitriou | this.actions = this.$(".actions").show(); |
132 | 8d08f18a | Kostas Papadimitriou | this.datatable_cont = this.$(".dataTables_wrapper").show(); |
133 | 8d08f18a | Kostas Papadimitriou | this.content = this.$("#machinesview_content").show(); |
134 | 8d08f18a | Kostas Papadimitriou | this.filter = this.$(".dataTables_filter").show().css({'display':'block'}); |
135 | 8d08f18a | Kostas Papadimitriou | this.table_el = this.$(".list-machines").show(); |
136 | 8d08f18a | Kostas Papadimitriou | this.select_all = $("#list-view-select-all"); |
137 | 8d08f18a | Kostas Papadimitriou | |
138 | 8d08f18a | Kostas Papadimitriou | this.actions = new views.ListMultipleActions(this); |
139 | 8d08f18a | Kostas Papadimitriou | |
140 | 8d08f18a | Kostas Papadimitriou | this.table = $("div.list table.list-machines").dataTable({ |
141 | 8d08f18a | Kostas Papadimitriou | "bInfo": false, |
142 | 8d08f18a | Kostas Papadimitriou | "bRetrieve": true, |
143 | 8d08f18a | Kostas Papadimitriou | "bPaginate": false, |
144 | 8d08f18a | Kostas Papadimitriou | "bAutoWidth": false, |
145 | 8d08f18a | Kostas Papadimitriou | "bSort": true, |
146 | 8d08f18a | Kostas Papadimitriou | "bStateSave": true, |
147 | 8d08f18a | Kostas Papadimitriou | "sScrollXInner": "500px", |
148 | 8d08f18a | Kostas Papadimitriou | "aoColumnDefs": [
|
149 | 8d08f18a | Kostas Papadimitriou | { "bSortable": false, "aTargets": [ 0 ] } |
150 | 8d08f18a | Kostas Papadimitriou | ] |
151 | 8d08f18a | Kostas Papadimitriou | }); |
152 | 8d08f18a | Kostas Papadimitriou | |
153 | 8d08f18a | Kostas Papadimitriou | this.table_data = {};
|
154 | 8d08f18a | Kostas Papadimitriou | views.ListView.__super__.initialize.apply(this, arguments); |
155 | 2506f741 | Kostas Papadimitriou | |
156 | 2506f741 | Kostas Papadimitriou | this.update_layout = _.throttle(this.update_layout, 100); |
157 | 8d08f18a | Kostas Papadimitriou | }, |
158 | 122850c5 | Kostas Papadimitriou | |
159 | 122850c5 | Kostas Papadimitriou | reset: function() { |
160 | 122850c5 | Kostas Papadimitriou | }, |
161 | 122850c5 | Kostas Papadimitriou | |
162 | 122850c5 | Kostas Papadimitriou | hide_actions: function() { |
163 | 122850c5 | Kostas Papadimitriou | this.$(".actions a").removeClass("selected"); |
164 | 122850c5 | Kostas Papadimitriou | }, |
165 | 8d08f18a | Kostas Papadimitriou | |
166 | 8d08f18a | Kostas Papadimitriou | // overload show function
|
167 | 8d08f18a | Kostas Papadimitriou | show_view: function() { |
168 | 8d08f18a | Kostas Papadimitriou | this.log.debug("showing"); |
169 | 8d08f18a | Kostas Papadimitriou | this.sel('spinner').hide(); |
170 | 8d08f18a | Kostas Papadimitriou | this.__update_layout();
|
171 | 8d08f18a | Kostas Papadimitriou | }, |
172 | 8d08f18a | Kostas Papadimitriou | |
173 | 8d08f18a | Kostas Papadimitriou | check_vm_container: function() { |
174 | 8d08f18a | Kostas Papadimitriou | }, |
175 | 8d08f18a | Kostas Papadimitriou | |
176 | 8d08f18a | Kostas Papadimitriou | // identify vm model instance id based on DOM element
|
177 | 8d08f18a | Kostas Papadimitriou | vm_id_for_element: function(el) { |
178 | 8d08f18a | Kostas Papadimitriou | return el.attr('id').replace("list-vm-", ""); |
179 | 8d08f18a | Kostas Papadimitriou | }, |
180 | 122850c5 | Kostas Papadimitriou | |
181 | 122850c5 | Kostas Papadimitriou | reset_actions: function() { |
182 | 122850c5 | Kostas Papadimitriou | this.$(".actions a").removeClass("selected"); |
183 | 122850c5 | Kostas Papadimitriou | storage.vms.reset_pending_actions(); |
184 | 122850c5 | Kostas Papadimitriou | }, |
185 | 8d08f18a | Kostas Papadimitriou | |
186 | 8d08f18a | Kostas Papadimitriou | // set generic view handlers
|
187 | 8d08f18a | Kostas Papadimitriou | set_handlers: function() { |
188 | 8d08f18a | Kostas Papadimitriou | this.$(".list-vm-checkbox").live('change', _.bind(function(){ |
189 | 122850c5 | Kostas Papadimitriou | this.reset_actions();
|
190 | 8d08f18a | Kostas Papadimitriou | this.actions.update_layout();
|
191 | 8d08f18a | Kostas Papadimitriou | if (this.$("tbody input:checked").length > 0) { |
192 | 8d08f18a | Kostas Papadimitriou | this.select_all.attr("checked", true); |
193 | 8d08f18a | Kostas Papadimitriou | } else {
|
194 | 8d08f18a | Kostas Papadimitriou | this.select_all.attr("checked", false); |
195 | 8d08f18a | Kostas Papadimitriou | } |
196 | d1f55cb0 | Kostas Papadimitriou | self.actions.update_layout(); |
197 | 8d08f18a | Kostas Papadimitriou | }, this))
|
198 | 8d08f18a | Kostas Papadimitriou | |
199 | 8d08f18a | Kostas Papadimitriou | var self = this; |
200 | 8d08f18a | Kostas Papadimitriou | this.select_all.click(function(){ |
201 | 8d08f18a | Kostas Papadimitriou | if ($(this).is(":checked")) { |
202 | 8d08f18a | Kostas Papadimitriou | self.$("tbody input").attr("checked", true); |
203 | 8d08f18a | Kostas Papadimitriou | } else {
|
204 | 8d08f18a | Kostas Papadimitriou | self.$("tbody input").attr("checked", false); |
205 | 8d08f18a | Kostas Papadimitriou | } |
206 | 8d08f18a | Kostas Papadimitriou | self.actions.update_layout(); |
207 | 8d08f18a | Kostas Papadimitriou | }); |
208 | 8d08f18a | Kostas Papadimitriou | }, |
209 | 8d08f18a | Kostas Papadimitriou | |
210 | 122850c5 | Kostas Papadimitriou | get_selected_vms: function() { |
211 | 122850c5 | Kostas Papadimitriou | var selected = $(this.el).find(".list-vm-checkbox:checked"); |
212 | 122850c5 | Kostas Papadimitriou | var vms = []
|
213 | 122850c5 | Kostas Papadimitriou | _.each(selected, function(el){
|
214 | 122850c5 | Kostas Papadimitriou | var id = parseInt($(el).attr("id").replace("checkbox-list-vm-", "")); |
215 | 122850c5 | Kostas Papadimitriou | vm = storage.vms.get(id); |
216 | 643de8c0 | Kostas Papadimitriou | if (!vm) { return }; |
217 | 122850c5 | Kostas Papadimitriou | vms.push(vm); |
218 | 122850c5 | Kostas Papadimitriou | }); |
219 | 122850c5 | Kostas Papadimitriou | |
220 | 122850c5 | Kostas Papadimitriou | return vms;
|
221 | 122850c5 | Kostas Papadimitriou | }, |
222 | 122850c5 | Kostas Papadimitriou | |
223 | 122850c5 | Kostas Papadimitriou | select_action: function(action) { |
224 | 122850c5 | Kostas Papadimitriou | this.reset_actions();
|
225 | 122850c5 | Kostas Papadimitriou | this.$(".actions a#action-" + action).addClass("selected"); |
226 | 122850c5 | Kostas Papadimitriou | var vms = this.get_selected_vms(); |
227 | 122850c5 | Kostas Papadimitriou | _.each(vms, function(vm){
|
228 | 122850c5 | Kostas Papadimitriou | vm.update_pending_action(action); |
229 | 122850c5 | Kostas Papadimitriou | }) |
230 | 122850c5 | Kostas Papadimitriou | }, |
231 | 122850c5 | Kostas Papadimitriou | |
232 | 122850c5 | Kostas Papadimitriou | reset: function() { |
233 | 122850c5 | Kostas Papadimitriou | this.reset_actions();
|
234 | 122850c5 | Kostas Papadimitriou | }, |
235 | 122850c5 | Kostas Papadimitriou | |
236 | 8d08f18a | Kostas Papadimitriou | create_vm: function(vm) { |
237 | 8d08f18a | Kostas Papadimitriou | params = this.get_vm_table_data(vm);
|
238 | 8d08f18a | Kostas Papadimitriou | var index = this.table.fnAddData.call(this.table, params); |
239 | 8d08f18a | Kostas Papadimitriou | this.table_data["vm_" + vm.id] = {index: index[0], params: params}; |
240 | 8d08f18a | Kostas Papadimitriou | // append row id
|
241 | 23a3bb8e | Kostas Papadimitriou | $(this.table.fnGetNodes(index)).attr("id", this.id_tpl + vm.id); |
242 | 60491a38 | Kostas Papadimitriou | |
243 | 60491a38 | Kostas Papadimitriou | var vm_el = $("#" + this.id_tpl + vm.id); |
244 | 60491a38 | Kostas Papadimitriou | this._vm_els[vm.id] = vm_el;
|
245 | 8d08f18a | Kostas Papadimitriou | // hide indicators on creation
|
246 | 8d08f18a | Kostas Papadimitriou | this.vm(vm).find(".spinner").hide(); |
247 | 8d08f18a | Kostas Papadimitriou | this.vm(vm).find(".wave").hide(); |
248 | 8d08f18a | Kostas Papadimitriou | this.vm(vm).find(".os_icon").show(); |
249 | 5e21ee35 | Kostas Papadimitriou | this.vm(vm).find(".action-indicator").hide(); |
250 | 8d08f18a | Kostas Papadimitriou | |
251 | 8d08f18a | Kostas Papadimitriou | // ancestor method
|
252 | 8d08f18a | Kostas Papadimitriou | this.__set_vm_handlers(vm);
|
253 | 8d08f18a | Kostas Papadimitriou | this.post_add(vm);
|
254 | 75331d54 | Kostas Papadimitriou | return this.vm(vm); |
255 | 8d08f18a | Kostas Papadimitriou | }, |
256 | 8d08f18a | Kostas Papadimitriou | |
257 | 8d08f18a | Kostas Papadimitriou | // remove vm
|
258 | 8d08f18a | Kostas Papadimitriou | remove_vm: function(vm) { |
259 | 643de8c0 | Kostas Papadimitriou | this.vm(vm).find("input[type=checkbox]").removeAttr("checked"); |
260 | 2506f741 | Kostas Papadimitriou | var vm_data = this.table_data["vm_" + vm.id]; |
261 | 5dad72ea | Kostas Papadimitriou | |
262 | 5dad72ea | Kostas Papadimitriou | // update triggered on removed vm, skipping
|
263 | 2506f741 | Kostas Papadimitriou | if (!vm_data) { return }; |
264 | 5dad72ea | Kostas Papadimitriou | |
265 | 2506f741 | Kostas Papadimitriou | var index = vm_data.index;
|
266 | 8d08f18a | Kostas Papadimitriou | this.table.fnDeleteRow(index);
|
267 | 8d08f18a | Kostas Papadimitriou | delete this.table_data["vm_" + vm.id]; |
268 | 8d08f18a | Kostas Papadimitriou | this.update_data();
|
269 | 75331d54 | Kostas Papadimitriou | |
270 | 75331d54 | Kostas Papadimitriou | if (hasKey.call(this._vm_els, vm.id)) { |
271 | 75331d54 | Kostas Papadimitriou | delete this._vm_els[vm.id]; |
272 | 75331d54 | Kostas Papadimitriou | } |
273 | 8d08f18a | Kostas Papadimitriou | }, |
274 | 8d08f18a | Kostas Papadimitriou | |
275 | 8d08f18a | Kostas Papadimitriou | update_data: function() { |
276 | 8d08f18a | Kostas Papadimitriou | var new_data = this.table.fnGetData(); |
277 | 8d08f18a | Kostas Papadimitriou | _.each(new_data, _.bind(function(row, i){
|
278 | 8d08f18a | Kostas Papadimitriou | this.table_data["vm_" + row[5]].index = i; |
279 | 8d08f18a | Kostas Papadimitriou | this.table_data["vm_" + row[5]].params = row; |
280 | 8d08f18a | Kostas Papadimitriou | }, this));
|
281 | 8d08f18a | Kostas Papadimitriou | }, |
282 | 8d08f18a | Kostas Papadimitriou | |
283 | 5e21ee35 | Kostas Papadimitriou | set_indicator_for: function(action) { |
284 | 643de8c0 | Kostas Papadimitriou | var vms = this.get_selected_vms(); |
285 | 5e21ee35 | Kostas Papadimitriou | _.each(vms, _.bind(function(vm){
|
286 | 5e21ee35 | Kostas Papadimitriou | var vmel = this.vm(vm); |
287 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.spinner, img.wave, img.os_icon").hide();
|
288 | 5e21ee35 | Kostas Papadimitriou | vmel.find("span.action-indicator").show().removeClass().addClass(action + " action-indicator"); |
289 | 5e21ee35 | Kostas Papadimitriou | }, this));
|
290 | 5e21ee35 | Kostas Papadimitriou | }, |
291 | 5e21ee35 | Kostas Papadimitriou | |
292 | 5e21ee35 | Kostas Papadimitriou | clear_indicators: function() { |
293 | 5e21ee35 | Kostas Papadimitriou | var vms = storage.vms.models;
|
294 | 5e21ee35 | Kostas Papadimitriou | _.each(vms, _.bind(function(vm){
|
295 | 5e21ee35 | Kostas Papadimitriou | var vmel = this.vm(vm); |
296 | 5e21ee35 | Kostas Papadimitriou | |
297 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.wave").hide();
|
298 | 5e21ee35 | Kostas Papadimitriou | |
299 | 5e21ee35 | Kostas Papadimitriou | if (vm.pending_action) {
|
300 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.os_icon").hide();
|
301 | 5e21ee35 | Kostas Papadimitriou | vmel.find("span.action-indicator").show().removeClass().addClass(vm.pending_action + " action-indicator"); |
302 | 5e21ee35 | Kostas Papadimitriou | return;
|
303 | 5e21ee35 | Kostas Papadimitriou | } |
304 | 5e21ee35 | Kostas Papadimitriou | |
305 | 5e21ee35 | Kostas Papadimitriou | if (vm.in_transition()) {
|
306 | 5e21ee35 | Kostas Papadimitriou | vmel.find("span.action-indicator").hide();
|
307 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.spinner").show();
|
308 | 5e21ee35 | Kostas Papadimitriou | return;
|
309 | 5e21ee35 | Kostas Papadimitriou | } |
310 | 5e21ee35 | Kostas Papadimitriou | |
311 | 5e21ee35 | Kostas Papadimitriou | if (!this.actions.hovered) { |
312 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.os_icon").show();
|
313 | 5e21ee35 | Kostas Papadimitriou | vmel.find("span.action-indicator").hide();
|
314 | 5e21ee35 | Kostas Papadimitriou | vmel.find("img.spinner").hide();
|
315 | 5e21ee35 | Kostas Papadimitriou | } |
316 | 5e21ee35 | Kostas Papadimitriou | |
317 | 5e21ee35 | Kostas Papadimitriou | |
318 | 5e21ee35 | Kostas Papadimitriou | }, this));
|
319 | 5e21ee35 | Kostas Papadimitriou | }, |
320 | 5e21ee35 | Kostas Papadimitriou | |
321 | 8d08f18a | Kostas Papadimitriou | get_vm_table_data: function(vm) { |
322 | 8d08f18a | Kostas Papadimitriou | var checkbox = '<input type="checkbox" class="' + |
323 | 8d08f18a | Kostas Papadimitriou | views.ListView.STATE_CLASSES[vm.state()].join(" ") +
|
324 | 23a3bb8e | Kostas Papadimitriou | ' list-vm-checkbox" id="checkbox-' + this.id_tpl + vm.id + '"/>'; |
325 | 8d08f18a | Kostas Papadimitriou | |
326 | 8d08f18a | Kostas Papadimitriou | var img = '<img class="os_icon" src="'+ this.get_vm_icon_path(vm, "small") +'" />'; |
327 | c62c6b91 | Kostas Papadimitriou | img = img + '<img src="'+snf.config.indicators_icons_url+'small/progress.gif" class="spinner" />'; |
328 | c62c6b91 | Kostas Papadimitriou | img = img + '<img src="'+snf.config.indicators_icons_url+'medium/wave.gif" class="wave" />'; |
329 | 5e21ee35 | Kostas Papadimitriou | img = img + '<span class="action-indicator" />';
|
330 | 8d08f18a | Kostas Papadimitriou | |
331 | d1f55cb0 | Kostas Papadimitriou | var name = util.truncate(vm.get('name'), 25); |
332 | 8d08f18a | Kostas Papadimitriou | var flavor = vm.get_flavor().details_string();
|
333 | 8d08f18a | Kostas Papadimitriou | var status = STATE_TEXTS[vm.state()];
|
334 | 8d08f18a | Kostas Papadimitriou | |
335 | 8d08f18a | Kostas Papadimitriou | return [checkbox, img, name, flavor, status, vm.id];
|
336 | 8d08f18a | Kostas Papadimitriou | }, |
337 | 8d08f18a | Kostas Papadimitriou | |
338 | 8d08f18a | Kostas Papadimitriou | post_add: function(vm) { |
339 | 8d08f18a | Kostas Papadimitriou | }, |
340 | 8d08f18a | Kostas Papadimitriou | |
341 | 8d08f18a | Kostas Papadimitriou | // is vm in transition ??? show the progress spinner
|
342 | 8d08f18a | Kostas Papadimitriou | update_transition_state: function(vm) { |
343 | 60491a38 | Kostas Papadimitriou | if (!vm) { return }; |
344 | 8d1b1ffb | Kostas Papadimitriou | if (this.in_transition) { return }; |
345 | 60491a38 | Kostas Papadimitriou | |
346 | d1f55cb0 | Kostas Papadimitriou | if ((this.actions.hovered && this.vm(vm).find("input").is(":checked")) || vm.pending_action) { |
347 | d1f55cb0 | Kostas Papadimitriou | this.sel('vm_spinner', vm.id).hide(); |
348 | d1f55cb0 | Kostas Papadimitriou | this.sel('vm_wave', vm.id).hide(); |
349 | d1f55cb0 | Kostas Papadimitriou | this.sel('os_icon', vm.id).hide(); |
350 | d1f55cb0 | Kostas Papadimitriou | this.vm(vm).find(".action-indicator").show(); |
351 | d1f55cb0 | Kostas Papadimitriou | return;
|
352 | d1f55cb0 | Kostas Papadimitriou | } |
353 | d1f55cb0 | Kostas Papadimitriou | |
354 | 8d08f18a | Kostas Papadimitriou | if (vm.in_transition()){
|
355 | 8d08f18a | Kostas Papadimitriou | this.sel('vm_spinner', vm.id).show(); |
356 | 8d08f18a | Kostas Papadimitriou | this.sel('vm_wave', vm.id).hide(); |
357 | 8d08f18a | Kostas Papadimitriou | this.sel('os_icon', vm.id).hide(); |
358 | 60491a38 | Kostas Papadimitriou | this.vm(vm).find(".action-indicator").hide(); |
359 | 8d08f18a | Kostas Papadimitriou | } else {
|
360 | 8d08f18a | Kostas Papadimitriou | this.sel('vm_spinner', vm.id).hide(); |
361 | 60491a38 | Kostas Papadimitriou | this.vm(vm).find(".action-indicator").hide(); |
362 | 8d1b1ffb | Kostas Papadimitriou | this.sel('os_icon', vm.id).show(); |
363 | 8d08f18a | Kostas Papadimitriou | } |
364 | 8d08f18a | Kostas Papadimitriou | }, |
365 | 8d08f18a | Kostas Papadimitriou | |
366 | 8d08f18a | Kostas Papadimitriou | // display transition animations
|
367 | 8d08f18a | Kostas Papadimitriou | show_transition: function(vm) { |
368 | 8d1b1ffb | Kostas Papadimitriou | this.in_transition = true; |
369 | 8d1b1ffb | Kostas Papadimitriou | |
370 | 60491a38 | Kostas Papadimitriou | if (!this.visible()) { |
371 | 60491a38 | Kostas Papadimitriou | this.in_transition = false; |
372 | 60491a38 | Kostas Papadimitriou | this.update_transition_state();
|
373 | 60491a38 | Kostas Papadimitriou | return
|
374 | 60491a38 | Kostas Papadimitriou | }; |
375 | 60491a38 | Kostas Papadimitriou | |
376 | 8d08f18a | Kostas Papadimitriou | var wave = this.sel('vm_wave', vm.id); |
377 | 8d08f18a | Kostas Papadimitriou | if (!wave.length) {
|
378 | 60491a38 | Kostas Papadimitriou | this.in_transition = false |
379 | 8d08f18a | Kostas Papadimitriou | return
|
380 | 8d08f18a | Kostas Papadimitriou | } |
381 | 8d08f18a | Kostas Papadimitriou | |
382 | 8d08f18a | Kostas Papadimitriou | this.sel('vm_spinner', vm.id).hide(); |
383 | 8d08f18a | Kostas Papadimitriou | this.sel('os_icon', vm.id).hide(); |
384 | 8d08f18a | Kostas Papadimitriou | |
385 | 8d08f18a | Kostas Papadimitriou | var src = wave.attr('src'); |
386 | 8d08f18a | Kostas Papadimitriou | var self = this; |
387 | 8d1b1ffb | Kostas Papadimitriou | |
388 | 8d08f18a | Kostas Papadimitriou | // change src to force gif play from the first frame
|
389 | 8d08f18a | Kostas Papadimitriou | // animate for 500 ms then hide
|
390 | 8d08f18a | Kostas Papadimitriou | wave.attr('src', "").show().attr('src', src).fadeIn(500).delay(700).fadeOut(300, function() { |
391 | 8d1b1ffb | Kostas Papadimitriou | self.in_transition = false;
|
392 | 8d1b1ffb | Kostas Papadimitriou | self.update_transition_state(vm); |
393 | 8d08f18a | Kostas Papadimitriou | }); |
394 | 8d08f18a | Kostas Papadimitriou | }, |
395 | 8d08f18a | Kostas Papadimitriou | |
396 | 8d08f18a | Kostas Papadimitriou | update_actions_layout: function(vm) { |
397 | 8d08f18a | Kostas Papadimitriou | }, |
398 | 8d08f18a | Kostas Papadimitriou | |
399 | 8d08f18a | Kostas Papadimitriou | post_update_vm: function(vm) { |
400 | 5dad72ea | Kostas Papadimitriou | |
401 | 5dad72ea | Kostas Papadimitriou | // skip update for these changes for performance issues
|
402 | 2506f741 | Kostas Papadimitriou | if (vm.hasOnlyChange(["pending_action", "stats"])) { return }; |
403 | 5dad72ea | Kostas Papadimitriou | |
404 | 8d08f18a | Kostas Papadimitriou | var index = this.table_data["vm_" + vm.id].index; |
405 | 8d08f18a | Kostas Papadimitriou | params = this.get_vm_table_data(vm);
|
406 | 8d08f18a | Kostas Papadimitriou | this.table_data["vm_" + vm.id].params = params; |
407 | 8d08f18a | Kostas Papadimitriou | data = this.table.fnGetData()[index];
|
408 | 8d08f18a | Kostas Papadimitriou | |
409 | 8d08f18a | Kostas Papadimitriou | // do not recreate checkboxes and images to avoid messing
|
410 | 8d08f18a | Kostas Papadimitriou | // with user interaction
|
411 | 8d08f18a | Kostas Papadimitriou | this.table.fnUpdate(params[2], parseInt(index), 2); |
412 | 8d08f18a | Kostas Papadimitriou | this.table.fnUpdate(params[3], parseInt(index), 3); |
413 | 8d08f18a | Kostas Papadimitriou | this.table.fnUpdate(params[4], parseInt(index), 4); |
414 | d1f55cb0 | Kostas Papadimitriou | |
415 | d1f55cb0 | Kostas Papadimitriou | var active_class = vm.is_active() ? "active" : "inactive"; |
416 | d1f55cb0 | Kostas Papadimitriou | this.vm(vm).removeClass("active").removeClass("inactive").addClass(active_class); |
417 | d1f55cb0 | Kostas Papadimitriou | $(this.vm(vm).find("td").get(4)).addClass("status"); |
418 | d1f55cb0 | Kostas Papadimitriou | $(this.vm(vm).find("td").get(3)).addClass("flavor"); |
419 | d1f55cb0 | Kostas Papadimitriou | $(this.vm(vm).find("td").get(2)).addClass("name"); |
420 | d1f55cb0 | Kostas Papadimitriou | |
421 | d1f55cb0 | Kostas Papadimitriou | if (vm.status() == "ERROR") { |
422 | d1f55cb0 | Kostas Papadimitriou | this.vm(vm).removeClass("active").removeClass("inactive").addClass("error"); |
423 | 8d1b1ffb | Kostas Papadimitriou | } else {
|
424 | 8d1b1ffb | Kostas Papadimitriou | this.vm(vm).removeClass("error").addClass(active_class); |
425 | d1f55cb0 | Kostas Papadimitriou | } |
426 | 8d08f18a | Kostas Papadimitriou | |
427 | 8d08f18a | Kostas Papadimitriou | this.update_os_icon(vm);
|
428 | 8d08f18a | Kostas Papadimitriou | this.update_transition_state(vm);
|
429 | 8d08f18a | Kostas Papadimitriou | }, |
430 | 8d08f18a | Kostas Papadimitriou | |
431 | 8d08f18a | Kostas Papadimitriou | update_os_icon: function(vm) { |
432 | 8d08f18a | Kostas Papadimitriou | this.sel('os_icon', vm.id).attr('src', this.get_vm_icon_path(vm, "small")); |
433 | 8d08f18a | Kostas Papadimitriou | }, |
434 | 8d08f18a | Kostas Papadimitriou | |
435 | 8d08f18a | Kostas Papadimitriou | // vm specific event handlers
|
436 | 8d08f18a | Kostas Papadimitriou | set_vm_handlers: function(vm) { |
437 | 8d08f18a | Kostas Papadimitriou | }, |
438 | 8d08f18a | Kostas Papadimitriou | |
439 | 8d08f18a | Kostas Papadimitriou | // generic stuff to do on each view update
|
440 | 8d08f18a | Kostas Papadimitriou | // called once after each vm has been updated
|
441 | 8d08f18a | Kostas Papadimitriou | update_layout: function() { |
442 | 8d08f18a | Kostas Papadimitriou | this.actions.update_layout();
|
443 | 8d08f18a | Kostas Papadimitriou | }, |
444 | 8d08f18a | Kostas Papadimitriou | |
445 | 8d08f18a | Kostas Papadimitriou | // update vm details
|
446 | 8d08f18a | Kostas Papadimitriou | update_details: function(vm) { |
447 | 8d08f18a | Kostas Papadimitriou | }, |
448 | 8d08f18a | Kostas Papadimitriou | |
449 | 8d08f18a | Kostas Papadimitriou | get_vm_icon_os: function(vm) { |
450 | 8d08f18a | Kostas Papadimitriou | var os = vm.get_os();
|
451 | 8d08f18a | Kostas Papadimitriou | var icons = window.os_icons || views.ListView.VM_OS_ICONS;
|
452 | 8d08f18a | Kostas Papadimitriou | if (icons.indexOf(os) == -1) { |
453 | c62c6b91 | Kostas Papadimitriou | os = "okeanos";
|
454 | 8d08f18a | Kostas Papadimitriou | } |
455 | 8d08f18a | Kostas Papadimitriou | return os;
|
456 | 8d08f18a | Kostas Papadimitriou | }, |
457 | 8d08f18a | Kostas Papadimitriou | |
458 | 8d08f18a | Kostas Papadimitriou | // TODO: move to views.utils (the method and the VM_OS_ICON vars)
|
459 | 8d08f18a | Kostas Papadimitriou | get_vm_icon_path: function(vm, icon_type) { |
460 | 8d08f18a | Kostas Papadimitriou | var os = vm.get_os();
|
461 | 8d08f18a | Kostas Papadimitriou | var icons = window.os_icons || views.ListView.VM_OS_ICONS;
|
462 | 8d08f18a | Kostas Papadimitriou | |
463 | 8d08f18a | Kostas Papadimitriou | if (icons.indexOf(os) == -1) { |
464 | c62c6b91 | Kostas Papadimitriou | os = "okeanos";
|
465 | 8d08f18a | Kostas Papadimitriou | } |
466 | 8d08f18a | Kostas Papadimitriou | |
467 | 8d08f18a | Kostas Papadimitriou | var st = "off"; |
468 | 8d08f18a | Kostas Papadimitriou | if (vm.is_active()) {
|
469 | 8d08f18a | Kostas Papadimitriou | st = "on"
|
470 | 8d08f18a | Kostas Papadimitriou | } |
471 | 8d08f18a | Kostas Papadimitriou | |
472 | c62c6b91 | Kostas Papadimitriou | return views.ListView.VM_OS_ICON_TPLS()[icon_type].format(os, st);
|
473 | 8d08f18a | Kostas Papadimitriou | } |
474 | 8d08f18a | Kostas Papadimitriou | }) |
475 | 8d08f18a | Kostas Papadimitriou | |
476 | c62c6b91 | Kostas Papadimitriou | views.ListView.VM_OS_ICON_TPLS = function() { |
477 | c62c6b91 | Kostas Papadimitriou | return {
|
478 | c62c6b91 | Kostas Papadimitriou | "small": snf.config.machines_icons_url + "small/{0}-{1}.png" |
479 | c62c6b91 | Kostas Papadimitriou | } |
480 | 8d08f18a | Kostas Papadimitriou | } |
481 | 8d08f18a | Kostas Papadimitriou | |
482 | 8d08f18a | Kostas Papadimitriou | views.ListView.VM_OS_ICONS = window.os_icons || []; |
483 | 8d08f18a | Kostas Papadimitriou | |
484 | 8d08f18a | Kostas Papadimitriou | views.ListView.STATE_CLASSES = { |
485 | 8d08f18a | Kostas Papadimitriou | 'UNKNOWN': ['error-state'], |
486 | 8d08f18a | Kostas Papadimitriou | 'BUILD': ['build-state'], |
487 | 8d08f18a | Kostas Papadimitriou | 'REBOOT': ['rebooting-state'], |
488 | 8d08f18a | Kostas Papadimitriou | 'STOPPED': ['terminated-state'], |
489 | 8d08f18a | Kostas Papadimitriou | 'ACTIVE': ['running-state'], |
490 | 8d08f18a | Kostas Papadimitriou | 'ERROR': ['error-state'], |
491 | 643de8c0 | Kostas Papadimitriou | 'DELETED': ['destroying-state'], |
492 | 8d08f18a | Kostas Papadimitriou | 'DESTROY': ['destroying-state'], |
493 | 8d08f18a | Kostas Papadimitriou | 'BUILD_INIT': ['build-state'], |
494 | 8d08f18a | Kostas Papadimitriou | 'BUILD_COPY': ['build-state'], |
495 | 8d08f18a | Kostas Papadimitriou | 'BUILD_FINAL': ['build-state'], |
496 | 8d08f18a | Kostas Papadimitriou | 'SHUTDOWN': ['shutting-state'], |
497 | 8d08f18a | Kostas Papadimitriou | 'START': ['starting-state'], |
498 | 8d08f18a | Kostas Papadimitriou | 'CONNECT': ['connecting-state'], |
499 | 8d08f18a | Kostas Papadimitriou | 'DISCONNECT': ['disconnecting-state'] |
500 | 8d08f18a | Kostas Papadimitriou | }; |
501 | 8d08f18a | Kostas Papadimitriou | |
502 | 8d08f18a | Kostas Papadimitriou | })(this); |