Statistics
| Branch: | Tag: | Revision:

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);