Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_list_view.js @ 8579f4e0

History | View | Annotate | Download (12.9 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 8d08f18a Kostas Papadimitriou
    views.ListMultipleActions = views.View.extend({
19 8d08f18a Kostas Papadimitriou
        
20 8d08f18a Kostas Papadimitriou
        view_id: "list_actions",
21 8d08f18a Kostas Papadimitriou
22 8d08f18a Kostas Papadimitriou
        initialize: function(view) {
23 8d08f18a Kostas Papadimitriou
            this.parent = view;
24 8d08f18a Kostas Papadimitriou
            this.el = this.parent.el;
25 8d08f18a Kostas Papadimitriou
           
26 8d08f18a Kostas Papadimitriou
            views.ListMultipleActions.__super__.initialize.call(this);
27 8d08f18a Kostas Papadimitriou
            this.set_handlers();
28 8d08f18a Kostas Papadimitriou
            this.update_layout();
29 8d08f18a Kostas Papadimitriou
30 8d08f18a Kostas Papadimitriou
            this.selected_action = undefined;
31 8d08f18a Kostas Papadimitriou
            this.available_actions = [];
32 8d08f18a Kostas Papadimitriou
            this.multi_view = synnefo.ui.main.multiple_actions_view;
33 8d08f18a Kostas Papadimitriou
        },
34 8d08f18a Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
36 122850c5 Kostas Papadimitriou
            var self = this;
37 122850c5 Kostas Papadimitriou
            storage.vms.bind("change:pending_action", function() {
38 122850c5 Kostas Papadimitriou
                if (!storage.vms.has_pending_actions()) {
39 122850c5 Kostas Papadimitriou
                    self.parent.$(".actions a").removeClass("selected");
40 122850c5 Kostas Papadimitriou
                }
41 122850c5 Kostas Papadimitriou
            })
42 122850c5 Kostas Papadimitriou
            
43 122850c5 Kostas Papadimitriou
            var self = this;
44 122850c5 Kostas Papadimitriou
            this.parent.$(".actions a.enabled").live('click', function() {
45 122850c5 Kostas Papadimitriou
                self.parent.$(".actions a").removeClass("selected");
46 122850c5 Kostas Papadimitriou
                $(this).addClass("selected");
47 122850c5 Kostas Papadimitriou
                self.parent.select_action($(this).attr("id").replace("action-",""));
48 122850c5 Kostas Papadimitriou
            })
49 8d08f18a Kostas Papadimitriou
        },
50 8d08f18a Kostas Papadimitriou
        
51 8d08f18a Kostas Papadimitriou
        update_actions: function() {
52 8d08f18a Kostas Papadimitriou
            actions = undefined;
53 8d08f18a Kostas Papadimitriou
            this.available_actions = [];
54 122850c5 Kostas Papadimitriou
            _.each(this.parent.get_selected_vms(), function(vm) {
55 8d08f18a Kostas Papadimitriou
                if (!actions) {
56 8d08f18a Kostas Papadimitriou
                    actions = vm.get_available_actions();
57 8d08f18a Kostas Papadimitriou
                    return;
58 8d08f18a Kostas Papadimitriou
                }
59 8d08f18a Kostas Papadimitriou
                actions = _.intersection(actions, vm.get_available_actions());
60 8d08f18a Kostas Papadimitriou
            });
61 8d08f18a Kostas Papadimitriou
62 8d08f18a Kostas Papadimitriou
            this.available_actions = actions;
63 8d08f18a Kostas Papadimitriou
64 8d08f18a Kostas Papadimitriou
            this.$(".actions a").removeClass("enabled");
65 8d08f18a Kostas Papadimitriou
            _.each(this.available_actions, _.bind(function(name){
66 8d08f18a Kostas Papadimitriou
                this.$("#action-" + name).addClass("enabled");
67 8d08f18a Kostas Papadimitriou
            }, this))
68 8d08f18a Kostas Papadimitriou
        },
69 8d08f18a Kostas Papadimitriou
70 8d08f18a Kostas Papadimitriou
        update_layout: function() {
71 8d08f18a Kostas Papadimitriou
            this.update_actions();
72 8d08f18a Kostas Papadimitriou
        }
73 8d08f18a Kostas Papadimitriou
    });
74 8d08f18a Kostas Papadimitriou
75 8d08f18a Kostas Papadimitriou
    // VMs list view
76 8d08f18a Kostas Papadimitriou
    views.ListView = views.VMListView.extend({
77 8d08f18a Kostas Papadimitriou
        
78 8d08f18a Kostas Papadimitriou
        // view id (this could be used to identify 
79 8d08f18a Kostas Papadimitriou
        // the view object from global context
80 8d08f18a Kostas Papadimitriou
        view_id: 'vm_list',
81 8d08f18a Kostas Papadimitriou
82 8d08f18a Kostas Papadimitriou
        el: '#machinesview-list',
83 8d08f18a Kostas Papadimitriou
        id_tpl: 'list-vm-{0}',
84 8d08f18a Kostas Papadimitriou
        link_id_tpl: 'list-vm-at-{0}',
85 8d08f18a Kostas Papadimitriou
86 8d08f18a Kostas Papadimitriou
        hide_actions: false,
87 8d08f18a Kostas Papadimitriou
88 8d08f18a Kostas Papadimitriou
        selectors: {
89 8d08f18a Kostas Papadimitriou
            'vms': '.list-container',
90 8d08f18a Kostas Papadimitriou
            'vm': '#list-vm-{0}',
91 8d08f18a Kostas Papadimitriou
            'view': '#machinesview-list',
92 8d08f18a Kostas Papadimitriou
            'tpl': '.list-container#machine-container-template',
93 8d08f18a Kostas Papadimitriou
            'spinner': '.large-spinner',
94 8d08f18a Kostas Papadimitriou
            'vm_spinner': '#list-vm-{0} .spinner',
95 8d08f18a Kostas Papadimitriou
            'vm_wave': '#list-vm-{0} .wave',
96 8d08f18a Kostas Papadimitriou
            'os_icon': '#list-vm-{0} .os_icon',
97 8d08f18a Kostas Papadimitriou
            'vm_cont_active': '#machinesview-list',
98 8d08f18a Kostas Papadimitriou
            'vm_cont_terminated': '#machinesview-list'
99 8d08f18a Kostas Papadimitriou
        },
100 8d08f18a Kostas Papadimitriou
        
101 8d08f18a Kostas Papadimitriou
        initialize: function() {
102 8d08f18a Kostas Papadimitriou
            this.current_vm = 0;
103 8d08f18a Kostas Papadimitriou
            
104 8d08f18a Kostas Papadimitriou
            // button selectors
105 8d08f18a Kostas Papadimitriou
            this.prev_button = this.$(".controls .previous");
106 8d08f18a Kostas Papadimitriou
            this.next_button = this.$(".controls .next");
107 8d08f18a Kostas Papadimitriou
108 8d08f18a Kostas Papadimitriou
            this.actions = this.$(".actions").show();
109 8d08f18a Kostas Papadimitriou
            this.datatable_cont = this.$(".dataTables_wrapper").show();
110 8d08f18a Kostas Papadimitriou
            this.content = this.$("#machinesview_content").show();
111 8d08f18a Kostas Papadimitriou
            this.filter = this.$(".dataTables_filter").show().css({'display':'block'});
112 8d08f18a Kostas Papadimitriou
            this.table_el = this.$(".list-machines").show();
113 8d08f18a Kostas Papadimitriou
            this.select_all = $("#list-view-select-all");
114 8d08f18a Kostas Papadimitriou
115 8d08f18a Kostas Papadimitriou
            this.actions = new views.ListMultipleActions(this);
116 8d08f18a Kostas Papadimitriou
117 8d08f18a Kostas Papadimitriou
            this.table = $("div.list table.list-machines").dataTable({
118 8d08f18a Kostas Papadimitriou
                "bInfo": false,
119 8d08f18a Kostas Papadimitriou
                "bRetrieve": true,
120 8d08f18a Kostas Papadimitriou
                "bPaginate": false,
121 8d08f18a Kostas Papadimitriou
                "bAutoWidth": false,
122 8d08f18a Kostas Papadimitriou
                "bSort": true,
123 8d08f18a Kostas Papadimitriou
                "bStateSave": true,
124 8d08f18a Kostas Papadimitriou
                "sScrollXInner": "500px",
125 8d08f18a Kostas Papadimitriou
                "aoColumnDefs": [
126 8d08f18a Kostas Papadimitriou
                    { "bSortable": false, "aTargets": [ 0 ] }
127 8d08f18a Kostas Papadimitriou
                ]
128 8d08f18a Kostas Papadimitriou
            });
129 8d08f18a Kostas Papadimitriou
130 8d08f18a Kostas Papadimitriou
            this.table_data = {};
131 8d08f18a Kostas Papadimitriou
            views.ListView.__super__.initialize.apply(this, arguments);
132 8d08f18a Kostas Papadimitriou
        },
133 122850c5 Kostas Papadimitriou
        
134 122850c5 Kostas Papadimitriou
        reset: function() {
135 122850c5 Kostas Papadimitriou
        },
136 122850c5 Kostas Papadimitriou
137 122850c5 Kostas Papadimitriou
        hide_actions: function() {
138 122850c5 Kostas Papadimitriou
            this.$(".actions a").removeClass("selected");
139 122850c5 Kostas Papadimitriou
        },
140 8d08f18a Kostas Papadimitriou
141 8d08f18a Kostas Papadimitriou
        // overload show function
142 8d08f18a Kostas Papadimitriou
        show_view: function() {
143 8d08f18a Kostas Papadimitriou
            this.log.debug("showing");
144 8d08f18a Kostas Papadimitriou
            this.sel('spinner').hide();
145 8d08f18a Kostas Papadimitriou
            this.__update_layout();
146 8d08f18a Kostas Papadimitriou
        },
147 8d08f18a Kostas Papadimitriou
        
148 8d08f18a Kostas Papadimitriou
        check_vm_container: function() {
149 8d08f18a Kostas Papadimitriou
        },
150 8d08f18a Kostas Papadimitriou
151 8d08f18a Kostas Papadimitriou
        // identify vm model instance id based on DOM element
152 8d08f18a Kostas Papadimitriou
        vm_id_for_element: function(el) {
153 8d08f18a Kostas Papadimitriou
            return el.attr('id').replace("list-vm-", "");
154 8d08f18a Kostas Papadimitriou
        },
155 122850c5 Kostas Papadimitriou
156 122850c5 Kostas Papadimitriou
        reset_actions: function() {
157 122850c5 Kostas Papadimitriou
            this.$(".actions a").removeClass("selected");
158 122850c5 Kostas Papadimitriou
            storage.vms.reset_pending_actions();
159 122850c5 Kostas Papadimitriou
        },
160 8d08f18a Kostas Papadimitriou
        
161 8d08f18a Kostas Papadimitriou
        // set generic view handlers
162 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
163 8d08f18a Kostas Papadimitriou
            //init_action_indicator_handlers('list');
164 8d08f18a Kostas Papadimitriou
165 8d08f18a Kostas Papadimitriou
            this.$(".list-vm-checkbox").live('change', _.bind(function(){
166 122850c5 Kostas Papadimitriou
                this.reset_actions();
167 8d08f18a Kostas Papadimitriou
                this.actions.update_layout();
168 8d08f18a Kostas Papadimitriou
                if (this.$("tbody input:checked").length > 0) {
169 8d08f18a Kostas Papadimitriou
                    this.select_all.attr("checked", true);
170 8d08f18a Kostas Papadimitriou
                } else {
171 8d08f18a Kostas Papadimitriou
                    this.select_all.attr("checked", false);
172 8d08f18a Kostas Papadimitriou
                }
173 8d08f18a Kostas Papadimitriou
            }, this))
174 8d08f18a Kostas Papadimitriou
175 8d08f18a Kostas Papadimitriou
            var self = this;
176 8d08f18a Kostas Papadimitriou
            this.select_all.click(function(){
177 8d08f18a Kostas Papadimitriou
                if ($(this).is(":checked")) {
178 8d08f18a Kostas Papadimitriou
                    self.$("tbody input").attr("checked", true);
179 8d08f18a Kostas Papadimitriou
                } else {
180 8d08f18a Kostas Papadimitriou
                    self.$("tbody input").attr("checked", false);
181 8d08f18a Kostas Papadimitriou
                }
182 8d08f18a Kostas Papadimitriou
                self.actions.update_layout();
183 8d08f18a Kostas Papadimitriou
            });
184 8d08f18a Kostas Papadimitriou
        },  
185 8d08f18a Kostas Papadimitriou
186 122850c5 Kostas Papadimitriou
        get_selected_vms: function() {
187 122850c5 Kostas Papadimitriou
            var selected = $(this.el).find(".list-vm-checkbox:checked");
188 122850c5 Kostas Papadimitriou
            var vms = []
189 122850c5 Kostas Papadimitriou
            _.each(selected, function(el){
190 122850c5 Kostas Papadimitriou
                var id = parseInt($(el).attr("id").replace("checkbox-list-vm-", ""));
191 122850c5 Kostas Papadimitriou
                vm = storage.vms.get(id);
192 122850c5 Kostas Papadimitriou
                vms.push(vm);
193 122850c5 Kostas Papadimitriou
            });
194 122850c5 Kostas Papadimitriou
195 122850c5 Kostas Papadimitriou
            return vms;
196 122850c5 Kostas Papadimitriou
        },
197 122850c5 Kostas Papadimitriou
198 122850c5 Kostas Papadimitriou
        select_action: function(action) {
199 122850c5 Kostas Papadimitriou
            this.reset_actions();
200 122850c5 Kostas Papadimitriou
            this.$(".actions a#action-" + action).addClass("selected");
201 122850c5 Kostas Papadimitriou
            var vms = this.get_selected_vms();
202 122850c5 Kostas Papadimitriou
            _.each(vms, function(vm){
203 122850c5 Kostas Papadimitriou
                vm.update_pending_action(action);
204 122850c5 Kostas Papadimitriou
            })
205 122850c5 Kostas Papadimitriou
        },
206 122850c5 Kostas Papadimitriou
207 122850c5 Kostas Papadimitriou
        reset: function() {
208 122850c5 Kostas Papadimitriou
            this.reset_actions();
209 122850c5 Kostas Papadimitriou
        },
210 122850c5 Kostas Papadimitriou
211 8d08f18a Kostas Papadimitriou
        create_vm: function(vm) {
212 8d08f18a Kostas Papadimitriou
            params = this.get_vm_table_data(vm);
213 8d08f18a Kostas Papadimitriou
            var index = this.table.fnAddData.call(this.table, params);
214 8d08f18a Kostas Papadimitriou
            this.table_data["vm_" + vm.id] = {index: index[0], params: params};
215 8d08f18a Kostas Papadimitriou
            
216 8d08f18a Kostas Papadimitriou
            // append row id
217 8d08f18a Kostas Papadimitriou
            $(this.table.fnGetNodes(index)).attr("id", this.id_tpl.format(vm.id));
218 8d08f18a Kostas Papadimitriou
            
219 8d08f18a Kostas Papadimitriou
            // hide indicators on creation
220 8d08f18a Kostas Papadimitriou
            this.vm(vm).find(".spinner").hide();
221 8d08f18a Kostas Papadimitriou
            this.vm(vm).find(".wave").hide();
222 8d08f18a Kostas Papadimitriou
            this.vm(vm).find(".os_icon").show();
223 8d08f18a Kostas Papadimitriou
            
224 8d08f18a Kostas Papadimitriou
            // ancestor method
225 8d08f18a Kostas Papadimitriou
            this.__set_vm_handlers(vm);
226 8d08f18a Kostas Papadimitriou
            this.set_vm_handlers(vm);
227 8d08f18a Kostas Papadimitriou
            this.post_add(vm);
228 8d08f18a Kostas Papadimitriou
        },
229 8d08f18a Kostas Papadimitriou
230 8d08f18a Kostas Papadimitriou
        // remove vm
231 8d08f18a Kostas Papadimitriou
        remove_vm: function(vm) {
232 8d08f18a Kostas Papadimitriou
            var index = this.table_data["vm_" + vm.id].index;
233 8d08f18a Kostas Papadimitriou
            this.table.fnDeleteRow(index);
234 8d08f18a Kostas Papadimitriou
            delete this.table_data["vm_" + vm.id];
235 8d08f18a Kostas Papadimitriou
            this.update_data();
236 8d08f18a Kostas Papadimitriou
        },
237 8d08f18a Kostas Papadimitriou
238 8d08f18a Kostas Papadimitriou
        update_data: function() {
239 8d08f18a Kostas Papadimitriou
            var new_data = this.table.fnGetData();
240 8d08f18a Kostas Papadimitriou
            _.each(new_data, _.bind(function(row, i){
241 8d08f18a Kostas Papadimitriou
                this.table_data["vm_" + row[5]].index = i;
242 8d08f18a Kostas Papadimitriou
                this.table_data["vm_" + row[5]].params = row;
243 8d08f18a Kostas Papadimitriou
            }, this));
244 8d08f18a Kostas Papadimitriou
        },
245 8d08f18a Kostas Papadimitriou
246 8d08f18a Kostas Papadimitriou
        get_vm_table_data: function(vm) {
247 8d08f18a Kostas Papadimitriou
            var checkbox = '<input type="checkbox" class="' + 
248 8d08f18a Kostas Papadimitriou
                views.ListView.STATE_CLASSES[vm.state()].join(" ") + 
249 8d08f18a Kostas Papadimitriou
                ' list-vm-checkbox" id="checkbox-' + this.id_tpl.format(vm.id) + '"/>';
250 8d08f18a Kostas Papadimitriou
251 8d08f18a Kostas Papadimitriou
            var img = '<img class="os_icon" src="'+ this.get_vm_icon_path(vm, "small") +'" />';
252 8d08f18a Kostas Papadimitriou
            img = img + '<img src="static/icons/indicators/small/progress.gif" class="spinner" />';
253 8d08f18a Kostas Papadimitriou
            img = img + '<img src="static/icons/indicators/medium/wave.gif" class="wave" />';
254 8d08f18a Kostas Papadimitriou
255 8d08f18a Kostas Papadimitriou
            var name = util.truncate(vm.get('name'), 20);
256 8d08f18a Kostas Papadimitriou
            var flavor = vm.get_flavor().details_string();
257 8d08f18a Kostas Papadimitriou
            var status = STATE_TEXTS[vm.state()];
258 8d08f18a Kostas Papadimitriou
            
259 8d08f18a Kostas Papadimitriou
            return [checkbox, img, name, flavor, status, vm.id];
260 8d08f18a Kostas Papadimitriou
        },
261 8d08f18a Kostas Papadimitriou
262 8d08f18a Kostas Papadimitriou
        post_add: function(vm) {
263 8d08f18a Kostas Papadimitriou
        },
264 8d08f18a Kostas Papadimitriou
265 8d08f18a Kostas Papadimitriou
        // is vm in transition ??? show the progress spinner
266 8d08f18a Kostas Papadimitriou
        update_transition_state: function(vm) {
267 8d08f18a Kostas Papadimitriou
            if (vm.in_transition()){
268 8d08f18a Kostas Papadimitriou
                this.sel('vm_spinner', vm.id).show();
269 8d08f18a Kostas Papadimitriou
                this.sel('vm_wave', vm.id).hide();
270 8d08f18a Kostas Papadimitriou
                this.sel('os_icon', vm.id).hide();
271 8d08f18a Kostas Papadimitriou
            } else {
272 8d08f18a Kostas Papadimitriou
                this.sel('vm_spinner', vm.id).hide();
273 8d08f18a Kostas Papadimitriou
            }
274 8d08f18a Kostas Papadimitriou
        },
275 8d08f18a Kostas Papadimitriou
276 8d08f18a Kostas Papadimitriou
        // display transition animations
277 8d08f18a Kostas Papadimitriou
        show_transition: function(vm) {
278 8d08f18a Kostas Papadimitriou
            var wave = this.sel('vm_wave', vm.id);
279 8d08f18a Kostas Papadimitriou
            if (!wave.length) {
280 8d08f18a Kostas Papadimitriou
                return
281 8d08f18a Kostas Papadimitriou
            }
282 8d08f18a Kostas Papadimitriou
            
283 8d08f18a Kostas Papadimitriou
            this.sel('vm_spinner', vm.id).hide();
284 8d08f18a Kostas Papadimitriou
            this.sel('os_icon', vm.id).hide();
285 8d08f18a Kostas Papadimitriou
286 8d08f18a Kostas Papadimitriou
            var src = wave.attr('src');
287 8d08f18a Kostas Papadimitriou
            var self = this;
288 8d08f18a Kostas Papadimitriou
289 8d08f18a Kostas Papadimitriou
            // change src to force gif play from the first frame
290 8d08f18a Kostas Papadimitriou
            // animate for 500 ms then hide
291 8d08f18a Kostas Papadimitriou
            wave.attr('src', "").show().attr('src', src).fadeIn(500).delay(700).fadeOut(300, function() {
292 8d08f18a Kostas Papadimitriou
                if (vm.in_transition()) {
293 8d08f18a Kostas Papadimitriou
                    self.sel("vm_spinner", vm.id).fadeIn(200);
294 8d08f18a Kostas Papadimitriou
                } else {
295 8d08f18a Kostas Papadimitriou
                    self.sel("os_icon", vm.id).fadeIn(200);
296 8d08f18a Kostas Papadimitriou
                }
297 8d08f18a Kostas Papadimitriou
            });
298 8d08f18a Kostas Papadimitriou
        },
299 8d08f18a Kostas Papadimitriou
300 8d08f18a Kostas Papadimitriou
        update_actions_layout: function(vm) {
301 8d08f18a Kostas Papadimitriou
        },
302 8d08f18a Kostas Papadimitriou
303 8d08f18a Kostas Papadimitriou
        post_update_vm: function(vm) {
304 8d08f18a Kostas Papadimitriou
            var index = this.table_data["vm_" + vm.id].index;
305 8d08f18a Kostas Papadimitriou
            params = this.get_vm_table_data(vm);
306 8d08f18a Kostas Papadimitriou
            this.table_data["vm_" + vm.id].params = params;
307 8d08f18a Kostas Papadimitriou
            data = this.table.fnGetData()[index];
308 8d08f18a Kostas Papadimitriou
309 8d08f18a Kostas Papadimitriou
            // do not recreate checkboxes and images to avoid messing
310 8d08f18a Kostas Papadimitriou
            // with user interaction
311 8d08f18a Kostas Papadimitriou
            this.table.fnUpdate(params[2], parseInt(index), 2);
312 8d08f18a Kostas Papadimitriou
            this.table.fnUpdate(params[3], parseInt(index), 3);
313 8d08f18a Kostas Papadimitriou
            this.table.fnUpdate(params[4], parseInt(index), 4);
314 8d08f18a Kostas Papadimitriou
            
315 8d08f18a Kostas Papadimitriou
            this.update_os_icon(vm);
316 8d08f18a Kostas Papadimitriou
            this.update_transition_state(vm);
317 8d08f18a Kostas Papadimitriou
        },
318 8d08f18a Kostas Papadimitriou
319 8d08f18a Kostas Papadimitriou
        update_os_icon: function(vm) {
320 8d08f18a Kostas Papadimitriou
            this.sel('os_icon', vm.id).attr('src', this.get_vm_icon_path(vm, "small"));
321 8d08f18a Kostas Papadimitriou
        },
322 8d08f18a Kostas Papadimitriou
        
323 8d08f18a Kostas Papadimitriou
        // vm specific event handlers
324 8d08f18a Kostas Papadimitriou
        set_vm_handlers: function(vm) {
325 8d08f18a Kostas Papadimitriou
326 8d08f18a Kostas Papadimitriou
        },
327 8d08f18a Kostas Papadimitriou
328 8d08f18a Kostas Papadimitriou
        // generic stuff to do on each view update
329 8d08f18a Kostas Papadimitriou
        // called once after each vm has been updated
330 8d08f18a Kostas Papadimitriou
        update_layout: function() {
331 8d08f18a Kostas Papadimitriou
            this.actions.update_layout();
332 8d08f18a Kostas Papadimitriou
        },
333 8d08f18a Kostas Papadimitriou
334 8d08f18a Kostas Papadimitriou
        // update vm details
335 8d08f18a Kostas Papadimitriou
        update_details: function(vm) {
336 8d08f18a Kostas Papadimitriou
        },
337 8d08f18a Kostas Papadimitriou
            
338 8d08f18a Kostas Papadimitriou
        get_vm_icon_os: function(vm) {
339 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
340 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.ListView.VM_OS_ICONS;
341 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
342 8d08f18a Kostas Papadimitriou
                os = "unknown";
343 8d08f18a Kostas Papadimitriou
            }
344 8d08f18a Kostas Papadimitriou
            return os;
345 8d08f18a Kostas Papadimitriou
        },
346 8d08f18a Kostas Papadimitriou
347 8d08f18a Kostas Papadimitriou
        // TODO: move to views.utils (the method and the VM_OS_ICON vars)
348 8d08f18a Kostas Papadimitriou
        get_vm_icon_path: function(vm, icon_type) {
349 8d08f18a Kostas Papadimitriou
            var os = vm.get_os();
350 8d08f18a Kostas Papadimitriou
            var icons = window.os_icons || views.ListView.VM_OS_ICONS;
351 8d08f18a Kostas Papadimitriou
352 8d08f18a Kostas Papadimitriou
            if (icons.indexOf(os) == -1) {
353 8d08f18a Kostas Papadimitriou
                os = "unknown";
354 8d08f18a Kostas Papadimitriou
            }
355 8d08f18a Kostas Papadimitriou
            
356 8d08f18a Kostas Papadimitriou
            var st = "off";
357 8d08f18a Kostas Papadimitriou
            if (vm.is_active()) {
358 8d08f18a Kostas Papadimitriou
                st = "on"
359 8d08f18a Kostas Papadimitriou
            }
360 8d08f18a Kostas Papadimitriou
361 8d08f18a Kostas Papadimitriou
            return views.ListView.VM_OS_ICON_TPLS[icon_type].format(os, st);
362 8d08f18a Kostas Papadimitriou
        }
363 8d08f18a Kostas Papadimitriou
    })
364 8d08f18a Kostas Papadimitriou
365 8d08f18a Kostas Papadimitriou
    views.ListView.VM_OS_ICON_TPLS = {
366 8d08f18a Kostas Papadimitriou
        "small": "/static/icons/machines/small/{0}-{1}.png"
367 8d08f18a Kostas Papadimitriou
    }
368 8d08f18a Kostas Papadimitriou
369 8d08f18a Kostas Papadimitriou
    views.ListView.VM_OS_ICONS = window.os_icons || [];
370 8d08f18a Kostas Papadimitriou
371 8d08f18a Kostas Papadimitriou
    views.ListView.STATE_CLASSES = {
372 8d08f18a Kostas Papadimitriou
        'UNKNOWN':          ['error-state'],
373 8d08f18a Kostas Papadimitriou
        'BUILD':            ['build-state'],
374 8d08f18a Kostas Papadimitriou
        'REBOOT':           ['rebooting-state'],
375 8d08f18a Kostas Papadimitriou
        'STOPPED':          ['terminated-state'],
376 8d08f18a Kostas Papadimitriou
        'ACTIVE':           ['running-state'],
377 8d08f18a Kostas Papadimitriou
        'ERROR':            ['error-state'],
378 8d08f18a Kostas Papadimitriou
        'DELETE':           ['destroying-state'],
379 8d08f18a Kostas Papadimitriou
        'DESTROY':          ['destroying-state'],
380 8d08f18a Kostas Papadimitriou
        'BUILD_INIT':       ['build-state'], 
381 8d08f18a Kostas Papadimitriou
        'BUILD_COPY':       ['build-state'],
382 8d08f18a Kostas Papadimitriou
        'BUILD_FINAL':      ['build-state'],
383 8d08f18a Kostas Papadimitriou
        'SHUTDOWN':         ['shutting-state'],
384 8d08f18a Kostas Papadimitriou
        'START':            ['starting-state'],
385 8d08f18a Kostas Papadimitriou
        'CONNECT':          ['connecting-state'],
386 8d08f18a Kostas Papadimitriou
        'DISCONNECT':       ['disconnecting-state']
387 8d08f18a Kostas Papadimitriou
    };
388 8d08f18a Kostas Papadimitriou
389 8d08f18a Kostas Papadimitriou
})(this);