Statistics
| Branch: | Tag: | Revision:

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