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