Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / views.js @ 1afc3946

History | View | Annotate | Download (9.6 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 views = snf.views = snf.views || {}
11 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {}
12 8d08f18a Kostas Papadimitriou
13 8d08f18a Kostas Papadimitriou
    // shortcuts
14 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
15 8d08f18a Kostas Papadimitriou
    
16 8d08f18a Kostas Papadimitriou
    // logging
17 8d08f18a Kostas Papadimitriou
    var logger = new snf.logging.logger("SNF-VIEWS");
18 8d08f18a Kostas Papadimitriou
    var debug = _.bind(logger.debug, logger);
19 8d08f18a Kostas Papadimitriou
    
20 8d08f18a Kostas Papadimitriou
    // Base view object
21 8d08f18a Kostas Papadimitriou
    views.View = bb.View.extend({
22 8d08f18a Kostas Papadimitriou
        // the main element of the view
23 8d08f18a Kostas Papadimitriou
        // view delegates show, visible, hide etc to this element
24 8d08f18a Kostas Papadimitriou
        view_id: false,
25 8d08f18a Kostas Papadimitriou
26 23a3bb8e Kostas Papadimitriou
        el: '#app',
27 8d08f18a Kostas Papadimitriou
        data_from: false,
28 8d08f18a Kostas Papadimitriou
        selectors: {},
29 8d08f18a Kostas Papadimitriou
        
30 8d08f18a Kostas Papadimitriou
        initialize: function() {
31 8d08f18a Kostas Papadimitriou
            this.log = new snf.logging.logger("SNF-VIEWS:" + this.view_id);
32 8d08f18a Kostas Papadimitriou
        },
33 122850c5 Kostas Papadimitriou
    
34 8d08f18a Kostas Papadimitriou
        // is the view visible ?
35 8d08f18a Kostas Papadimitriou
        visible: function(){
36 8d08f18a Kostas Papadimitriou
            return $(this.el).is(":visible");
37 8d08f18a Kostas Papadimitriou
        },
38 8d08f18a Kostas Papadimitriou
        
39 8d08f18a Kostas Papadimitriou
        // hide view
40 e673a761 Kostas Papadimitriou
        hide: function(force) {
41 e673a761 Kostas Papadimitriou
            if (!this.visible() && !force) { return this };
42 8d08f18a Kostas Papadimitriou
            return $(this.el).hide();
43 8d08f18a Kostas Papadimitriou
        },
44 8d08f18a Kostas Papadimitriou
        
45 8d08f18a Kostas Papadimitriou
        // show view
46 8d08f18a Kostas Papadimitriou
        show: function() {
47 8d08f18a Kostas Papadimitriou
            if (this.visible()) { return this };
48 8d08f18a Kostas Papadimitriou
            $(this.el).show();
49 8d08f18a Kostas Papadimitriou
            if (this.show_view) { this.show_view.apply(this, arguments)};
50 8d08f18a Kostas Papadimitriou
        },
51 8d08f18a Kostas Papadimitriou
52 8d08f18a Kostas Papadimitriou
        sel: function(id) {
53 8d08f18a Kostas Papadimitriou
            return this.$(this.selectors[id]);
54 8d08f18a Kostas Papadimitriou
        },
55 8d08f18a Kostas Papadimitriou
56 8d08f18a Kostas Papadimitriou
        // animations
57 8d08f18a Kostas Papadimitriou
        fadeIn: function(time, callback) {
58 8d08f18a Kostas Papadimitriou
            $(this.el).fadeIn(time, callback);
59 8d08f18a Kostas Papadimitriou
            return this.show();
60 8d08f18a Kostas Papadimitriou
        },
61 8d08f18a Kostas Papadimitriou
62 8d08f18a Kostas Papadimitriou
        fadeOut: function(time, callback) {
63 8d08f18a Kostas Papadimitriou
            $(this.el).fadeOut(time, callback);
64 8d08f18a Kostas Papadimitriou
            return this.hide();
65 8d08f18a Kostas Papadimitriou
        }
66 8d08f18a Kostas Papadimitriou
    });
67 8d08f18a Kostas Papadimitriou
    
68 8d08f18a Kostas Papadimitriou
    
69 8d08f18a Kostas Papadimitriou
    // overlays registry
70 8d08f18a Kostas Papadimitriou
    views._overlay_index = [];
71 8d08f18a Kostas Papadimitriou
72 8d08f18a Kostas Papadimitriou
    // overlay view helper
73 8d08f18a Kostas Papadimitriou
    views.Overlay = views.View.extend({
74 8d08f18a Kostas Papadimitriou
        view_id: 'overlay',
75 8d08f18a Kostas Papadimitriou
        tpl_selector: '#generic-overlay-tpl',
76 8d08f18a Kostas Papadimitriou
        css_class: 'overlay',
77 8d08f18a Kostas Papadimitriou
        oneInstance: true,
78 8d08f18a Kostas Papadimitriou
        fixed: false,
79 8d08f18a Kostas Papadimitriou
80 8d08f18a Kostas Papadimitriou
        
81 8d08f18a Kostas Papadimitriou
        initialize: function(options, selector) {
82 8d08f18a Kostas Papadimitriou
            this.defaults = {
83 8d08f18a Kostas Papadimitriou
                load: false,
84 8d08f18a Kostas Papadimitriou
                closeOnClick: false,
85 9ce969a7 Kostas Papadimitriou
                closeOnEsc: false,
86 8d08f18a Kostas Papadimitriou
                mask: {
87 8d08f18a Kostas Papadimitriou
                    color: "#444",
88 2506f741 Kostas Papadimitriou
                    loadSpeed: snf.config.overlay_speed || 0,
89 8d08f18a Kostas Papadimitriou
                    opacity: 0.7
90 2506f741 Kostas Papadimitriou
                },
91 2506f741 Kostas Papadimitriou
                speed: snf.config.overlay_speed || 200
92 8d08f18a Kostas Papadimitriou
            }
93 8d08f18a Kostas Papadimitriou
            
94 8d08f18a Kostas Papadimitriou
            this.tpl_selector = selector || this.tpl_selector;
95 8d08f18a Kostas Papadimitriou
            views.Overlay.__super__.initialize.apply(this);
96 8d08f18a Kostas Papadimitriou
            views._overlay_index.push(this);
97 8d08f18a Kostas Papadimitriou
98 8d08f18a Kostas Papadimitriou
            this.options = _.extend(this.defaults, options);
99 a1481c1d Kostas Papadimitriou
            this.options.clone = this.options.clone == undefined ? true : this.options.clone;
100 8d08f18a Kostas Papadimitriou
            this.options.fixed = this.fixed;
101 8d08f18a Kostas Papadimitriou
102 8d08f18a Kostas Papadimitriou
            this.options.onOpen = this.options.onOpen || function() {};
103 8d08f18a Kostas Papadimitriou
            this.options.onClose = this.options.onClose || function() {};
104 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen = this.options.beforeOpen || function() {};
105 8d08f18a Kostas Papadimitriou
            this.options.beforeClose = this.options.beforeClose || function() {};
106 8d08f18a Kostas Papadimitriou
            this.el = this.create_element();
107 8d08f18a Kostas Papadimitriou
            this.el.hide();
108 8d08f18a Kostas Papadimitriou
        
109 8d08f18a Kostas Papadimitriou
            var ajax_params = _.clone(this.options);
110 8d08f18a Kostas Papadimitriou
111 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeLoad = _.bind(this._beforeOpen, this);
112 8d08f18a Kostas Papadimitriou
            ajax_params.onLoad = _.bind(this._onOpen, this);
113 8d08f18a Kostas Papadimitriou
            ajax_params.onBeforeClose = _.bind(this._beforeClose, this);
114 8d08f18a Kostas Papadimitriou
            ajax_params.onClose = _.bind(this._onClose, this);
115 8d08f18a Kostas Papadimitriou
            ajax_params.oneInstance = this.oneInstance;
116 8d08f18a Kostas Papadimitriou
            // create overlay
117 8d08f18a Kostas Papadimitriou
            // TODO: does this return overlay object ?? (to avoid the next code line)
118 8d08f18a Kostas Papadimitriou
            $(this.el).overlay(ajax_params);
119 8d08f18a Kostas Papadimitriou
120 8d08f18a Kostas Papadimitriou
            this.overlay = $(this.el).overlay();
121 8d08f18a Kostas Papadimitriou
            this.append_css = this.options ? this.options.css_class ? this.options.css_class : "" : "";
122 9ffd10ce Kostas Papadimitriou
123 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
124 8d08f18a Kostas Papadimitriou
            return this;
125 8d08f18a Kostas Papadimitriou
        },
126 8d08f18a Kostas Papadimitriou
127 8d08f18a Kostas Papadimitriou
        create_element: function() {
128 8d08f18a Kostas Papadimitriou
            var el = undefined;
129 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
130 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector).clone();
131 8d08f18a Kostas Papadimitriou
            } else {
132 8d08f18a Kostas Papadimitriou
                el = $(this.tpl_selector);
133 8d08f18a Kostas Papadimitriou
            }
134 8d08f18a Kostas Papadimitriou
            
135 8d08f18a Kostas Papadimitriou
            // append content
136 8d08f18a Kostas Papadimitriou
            if (this.content_selector) {
137 8d08f18a Kostas Papadimitriou
                var content = $(this.content_selector).clone();
138 8d08f18a Kostas Papadimitriou
                content.addClass("content");
139 8d08f18a Kostas Papadimitriou
                
140 8d08f18a Kostas Papadimitriou
                if ($(el).find(".content").length) {
141 8d08f18a Kostas Papadimitriou
                    $(el).find(".content").replaceWith(content);
142 8d08f18a Kostas Papadimitriou
                }
143 8d08f18a Kostas Papadimitriou
                content.removeClass("hidden");
144 8d08f18a Kostas Papadimitriou
            }
145 8d08f18a Kostas Papadimitriou
146 8d08f18a Kostas Papadimitriou
            if (this.overlay_id) {
147 8d08f18a Kostas Papadimitriou
            }
148 8d08f18a Kostas Papadimitriou
149 8d08f18a Kostas Papadimitriou
            $(el).addClass("overlay");
150 8d08f18a Kostas Papadimitriou
            if (this.css_class) {
151 8d08f18a Kostas Papadimitriou
                $(el).addClass(this.css_class);
152 8d08f18a Kostas Papadimitriou
            }
153 8d08f18a Kostas Papadimitriou
            
154 8d08f18a Kostas Papadimitriou
            if (this.options.clone) {
155 8d08f18a Kostas Papadimitriou
                $("body").append(el);
156 8d08f18a Kostas Papadimitriou
            }
157 8d08f18a Kostas Papadimitriou
158 8d08f18a Kostas Papadimitriou
            return el;
159 8d08f18a Kostas Papadimitriou
        },
160 8d08f18a Kostas Papadimitriou
161 8d08f18a Kostas Papadimitriou
        set_title: function(title) {
162 8d08f18a Kostas Papadimitriou
            if (title || this.title) {
163 8d08f18a Kostas Papadimitriou
                $(this.el).find(".header .title").html(title || this.title)
164 8d08f18a Kostas Papadimitriou
            }
165 8d08f18a Kostas Papadimitriou
        },
166 8d08f18a Kostas Papadimitriou
167 8d08f18a Kostas Papadimitriou
        set_subtitle: function(subtitle) {
168 8d08f18a Kostas Papadimitriou
            if (subtitle || this.subtitle) {
169 8d08f18a Kostas Papadimitriou
                $(this.el).find(".header .subtitle").html(subtitle || this.subtitle)
170 8d08f18a Kostas Papadimitriou
            }
171 8d08f18a Kostas Papadimitriou
        },
172 8d08f18a Kostas Papadimitriou
173 8d08f18a Kostas Papadimitriou
        _beforeOpen: function() {
174 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
175 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
176 8d08f18a Kostas Papadimitriou
                $(this.el).addClass(this.append_css);
177 8d08f18a Kostas Papadimitriou
            }
178 8d08f18a Kostas Papadimitriou
179 8d08f18a Kostas Papadimitriou
            this.set_title();
180 8d08f18a Kostas Papadimitriou
            this.set_subtitle();
181 8d08f18a Kostas Papadimitriou
            
182 8d08f18a Kostas Papadimitriou
            this.beforeOpen.apply(this, arguments);
183 8d08f18a Kostas Papadimitriou
            this.options.beforeOpen.apply(this, arguments);
184 8d08f18a Kostas Papadimitriou
        },
185 8d08f18a Kostas Papadimitriou
186 8d08f18a Kostas Papadimitriou
        _onOpen: function() {
187 9ce969a7 Kostas Papadimitriou
            // clear previously bound click events
188 9ce969a7 Kostas Papadimitriou
            $(this.el).find(".closeme").unbind("click");
189 9ce969a7 Kostas Papadimitriou
190 8d08f18a Kostas Papadimitriou
            if ($(this.el).find(".closeme").length) {
191 8d08f18a Kostas Papadimitriou
                $(this.el).find(".closeme").click(_.bind(function(){
192 8d08f18a Kostas Papadimitriou
                    this.hide();
193 8d08f18a Kostas Papadimitriou
                }, this))
194 8d08f18a Kostas Papadimitriou
            }
195 8d08f18a Kostas Papadimitriou
            this.onOpen.apply(this, arguments);
196 8d08f18a Kostas Papadimitriou
            this.options.onOpen.apply(this, arguments);
197 8d08f18a Kostas Papadimitriou
        },
198 8d08f18a Kostas Papadimitriou
199 8d08f18a Kostas Papadimitriou
        _beforeClose: function() {
200 9ffd10ce Kostas Papadimitriou
            this.is_visible = false;
201 8d08f18a Kostas Papadimitriou
            this.beforeClose.apply(this, arguments);
202 8d08f18a Kostas Papadimitriou
            this.options.beforeClose.apply(this, arguments);
203 8d08f18a Kostas Papadimitriou
        },
204 8d08f18a Kostas Papadimitriou
205 8d08f18a Kostas Papadimitriou
        _onClose: function() {
206 8d08f18a Kostas Papadimitriou
            if (this.append_css) {
207 8d08f18a Kostas Papadimitriou
                $(this.el).removeClass(this.append_css);
208 8d08f18a Kostas Papadimitriou
            }
209 8d08f18a Kostas Papadimitriou
            this.onClose.apply(this, arguments);
210 8d08f18a Kostas Papadimitriou
            this.options.onClose.apply(this, arguments);
211 8d08f18a Kostas Papadimitriou
        },
212 8d08f18a Kostas Papadimitriou
213 8d08f18a Kostas Papadimitriou
        beforeOpen: function () {},
214 8d08f18a Kostas Papadimitriou
        onOpen: function () {},
215 8d08f18a Kostas Papadimitriou
        beforeClose: function () {},
216 8d08f18a Kostas Papadimitriou
        onClose: function () {},
217 8d08f18a Kostas Papadimitriou
218 8d08f18a Kostas Papadimitriou
        show: function() {
219 96d725ac Kostas Papadimitriou
            // close opened overlays
220 8d08f18a Kostas Papadimitriou
            var hidden = false;
221 8d08f18a Kostas Papadimitriou
            _.each(views._overlay_index, function(ovr){
222 8d08f18a Kostas Papadimitriou
                if (ovr == this) { return };
223 8d08f18a Kostas Papadimitriou
                if (ovr.visible()) {
224 8d08f18a Kostas Papadimitriou
                    hidden = true;
225 8d08f18a Kostas Papadimitriou
                    ovr.hide();
226 8d08f18a Kostas Papadimitriou
                }
227 8d08f18a Kostas Papadimitriou
            })
228 8d08f18a Kostas Papadimitriou
229 96d725ac Kostas Papadimitriou
            // do we need to wait for other overlays to close ???
230 96d725ac Kostas Papadimitriou
            if (hidden) { delay = 300; } else { delay = 0; }
231 9ffd10ce Kostas Papadimitriou
232 9ffd10ce Kostas Papadimitriou
            this.is_visible = true;
233 8d08f18a Kostas Papadimitriou
            window.setTimeout(_.bind(function(){ this.overlay.load() }, this), delay)
234 8d08f18a Kostas Papadimitriou
            return this;
235 8d08f18a Kostas Papadimitriou
        },
236 8d08f18a Kostas Papadimitriou
237 8d08f18a Kostas Papadimitriou
        hide: function() {
238 550d9733 Kostas Papadimitriou
            if (!this.overlay.isOpened()) {
239 550d9733 Kostas Papadimitriou
                // if its not opened events wont trigger
240 550d9733 Kostas Papadimitriou
                this._onClose()
241 550d9733 Kostas Papadimitriou
            } else {
242 550d9733 Kostas Papadimitriou
                this.overlay.close();
243 550d9733 Kostas Papadimitriou
            }
244 8d08f18a Kostas Papadimitriou
            return this;
245 8d08f18a Kostas Papadimitriou
        }
246 8d08f18a Kostas Papadimitriou
    });
247 8d08f18a Kostas Papadimitriou
248 550d9733 Kostas Papadimitriou
    
249 550d9733 Kostas Papadimitriou
    // overlay view helper
250 550d9733 Kostas Papadimitriou
    views.VMOverlay = views.Overlay.extend({
251 550d9733 Kostas Papadimitriou
252 550d9733 Kostas Papadimitriou
        initialize: function() {
253 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.initialize.apply(this);
254 550d9733 Kostas Papadimitriou
            this.vm = undefined;
255 550d9733 Kostas Papadimitriou
            this.view_id_tpl = this.view_id;
256 550d9733 Kostas Papadimitriou
257 f0532b59 Kostas Papadimitriou
            _.bindAll(this, "_handle_vm_change", "_handle_vm_remove");
258 550d9733 Kostas Papadimitriou
        },
259 550d9733 Kostas Papadimitriou
260 550d9733 Kostas Papadimitriou
        set_vm: function(vm) {
261 550d9733 Kostas Papadimitriou
            if (this.vm) { this.unbind_vm_handlers };
262 550d9733 Kostas Papadimitriou
            this.vm = vm;
263 550d9733 Kostas Papadimitriou
            this.view_id = this.view_id + "_" + vm.id;
264 550d9733 Kostas Papadimitriou
            this.bind_vm_handlers();
265 550d9733 Kostas Papadimitriou
        },
266 550d9733 Kostas Papadimitriou
267 550d9733 Kostas Papadimitriou
        bind_vm_handlers: function() {
268 550d9733 Kostas Papadimitriou
            this.log.debug("binding handlers");
269 f0532b59 Kostas Papadimitriou
            this.vm.bind("change", this._handle_vm_change);
270 f0532b59 Kostas Papadimitriou
            storage.vms.bind("remove", this._handle_vm_remove);
271 550d9733 Kostas Papadimitriou
        },
272 550d9733 Kostas Papadimitriou
        
273 550d9733 Kostas Papadimitriou
        unbind_vm_handlers: function() {
274 550d9733 Kostas Papadimitriou
            this.log.debug("unbinding handlers", this.vm);
275 550d9733 Kostas Papadimitriou
            if (!this.vm) { return };
276 f0532b59 Kostas Papadimitriou
            this.vm.unbind("change", this._handle_vm_change);
277 f0532b59 Kostas Papadimitriou
            storage.vms.unbind("remove", this._handle_vm_remove);
278 550d9733 Kostas Papadimitriou
        },
279 550d9733 Kostas Papadimitriou
        
280 550d9733 Kostas Papadimitriou
        _update_vm_details: function() { 
281 550d9733 Kostas Papadimitriou
            if (!this.vm) { console.error("invalid view state"); return }
282 550d9733 Kostas Papadimitriou
            this.set_subtitle(this.vm.get("name") + snf.ui.helpers.vm_icon_tag(this.vm, "small"));
283 550d9733 Kostas Papadimitriou
            this.update_vm_details() 
284 550d9733 Kostas Papadimitriou
        },
285 550d9733 Kostas Papadimitriou
286 550d9733 Kostas Papadimitriou
        update_vm_details: function() {},
287 f0532b59 Kostas Papadimitriou
        handle_vm_remove: function() {},
288 f0532b59 Kostas Papadimitriou
        handle_vm_change: function () {},
289 f0532b59 Kostas Papadimitriou
        
290 f0532b59 Kostas Papadimitriou
        _handle_vm_remove: function(vm, collection) {
291 550d9733 Kostas Papadimitriou
            if (this.vm && vm.id == this.vm.id) {
292 550d9733 Kostas Papadimitriou
                this.hide();
293 550d9733 Kostas Papadimitriou
            }
294 f0532b59 Kostas Papadimitriou
            this.handle_vm_remove();
295 550d9733 Kostas Papadimitriou
        },
296 f0532b59 Kostas Papadimitriou
        
297 f0532b59 Kostas Papadimitriou
        _handle_vm_change: function(vm) {
298 550d9733 Kostas Papadimitriou
            this._update_vm_details();
299 f0532b59 Kostas Papadimitriou
            this.handle_vm_change(vm);
300 550d9733 Kostas Papadimitriou
        },
301 550d9733 Kostas Papadimitriou
        
302 550d9733 Kostas Papadimitriou
        beforeClose: function() {
303 550d9733 Kostas Papadimitriou
            this.unbind_vm_handlers();
304 550d9733 Kostas Papadimitriou
            this.vm = undefined;
305 550d9733 Kostas Papadimitriou
        },
306 550d9733 Kostas Papadimitriou
307 550d9733 Kostas Papadimitriou
        show: function(vm) {
308 550d9733 Kostas Papadimitriou
            this.set_vm(vm);
309 550d9733 Kostas Papadimitriou
            views.VMOverlay.__super__.show.apply(this, arguments);
310 550d9733 Kostas Papadimitriou
            this._update_vm_details();
311 550d9733 Kostas Papadimitriou
        }
312 550d9733 Kostas Papadimitriou
313 550d9733 Kostas Papadimitriou
    });
314 550d9733 Kostas Papadimitriou
315 5dad72ea Kostas Papadimitriou
    snf.config.update_hidden_views = true;
316 5dad72ea Kostas Papadimitriou
317 8d08f18a Kostas Papadimitriou
})(this);