Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_metadata_view.js @ e673a761

History | View | Annotate | Download (7.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
19 8d08f18a Kostas Papadimitriou
    views.MetadataView = views.Overlay.extend({
20 8d08f18a Kostas Papadimitriou
        
21 8d08f18a Kostas Papadimitriou
        view_id: "metadata_view",
22 8d08f18a Kostas Papadimitriou
        content_selector: "#metadata-overlay-content",
23 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-metadata overlay-info',
24 8d08f18a Kostas Papadimitriou
        overlay_id: "metadata-overlay",
25 8d08f18a Kostas Papadimitriou
26 8d08f18a Kostas Papadimitriou
        subtitle: "",
27 f06cf120 Kostas Papadimitriou
        title: "Manage tags",
28 8d08f18a Kostas Papadimitriou
29 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
30 8d08f18a Kostas Papadimitriou
            views.MetadataView.__super__.initialize.apply(this);
31 8d08f18a Kostas Papadimitriou
            _.bindAll(this);
32 8d08f18a Kostas Papadimitriou
33 8d08f18a Kostas Papadimitriou
            this.current_vm = undefined;
34 8d08f18a Kostas Papadimitriou
            this.list = this.$(".options-list");
35 8d08f18a Kostas Papadimitriou
            this.tpl = this.$("li.meta-object-tpl");
36 8d08f18a Kostas Papadimitriou
            this.editor = this.$(".editor");
37 8d08f18a Kostas Papadimitriou
38 8d08f18a Kostas Papadimitriou
            this.pre_init_handlers();
39 8d08f18a Kostas Papadimitriou
        },
40 8d08f18a Kostas Papadimitriou
41 8d08f18a Kostas Papadimitriou
        pre_init_handlers: function() {
42 8d08f18a Kostas Papadimitriou
            this.$(".editor .cancel").click(_.bind(function(){
43 8d08f18a Kostas Papadimitriou
                this.close_editor();
44 8d08f18a Kostas Papadimitriou
            }, this))
45 8d08f18a Kostas Papadimitriou
            this.$(".editor .create").click(_.bind(function(){
46 8d08f18a Kostas Papadimitriou
                this.submit_editor();
47 8d08f18a Kostas Papadimitriou
            }, this));
48 8d08f18a Kostas Papadimitriou
        },
49 8d08f18a Kostas Papadimitriou
50 8d08f18a Kostas Papadimitriou
        show: function(vm) {
51 8d08f18a Kostas Papadimitriou
            this.current_vm = vm;
52 a1dbcae1 Kostas Papadimitriou
            this.current_vm.bind("change", this.handle_vm_change);
53 8d08f18a Kostas Papadimitriou
            views.MetadataView.__super__.show.apply(this);
54 8d08f18a Kostas Papadimitriou
        },
55 8d08f18a Kostas Papadimitriou
56 8d08f18a Kostas Papadimitriou
        get_meta: function() {
57 8d08f18a Kostas Papadimitriou
            return this.current_vm.get_meta();
58 8d08f18a Kostas Papadimitriou
        },
59 8d08f18a Kostas Papadimitriou
        
60 8d08f18a Kostas Papadimitriou
        get_meta_el: function(key, value) {
61 8d08f18a Kostas Papadimitriou
            return this.tpl.clone();
62 8d08f18a Kostas Papadimitriou
        },
63 8d08f18a Kostas Papadimitriou
64 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
65 8d08f18a Kostas Papadimitriou
            this.update_layout();
66 8d08f18a Kostas Papadimitriou
        },
67 8d08f18a Kostas Papadimitriou
68 8d08f18a Kostas Papadimitriou
        update_layout: function() {
69 8d08f18a Kostas Papadimitriou
            if (!this.editing) {
70 8d08f18a Kostas Papadimitriou
                this.editor.hide();
71 8d08f18a Kostas Papadimitriou
            }
72 8d08f18a Kostas Papadimitriou
73 8d08f18a Kostas Papadimitriou
            this.update_vm_details();
74 8d08f18a Kostas Papadimitriou
            // update metadata
75 8d08f18a Kostas Papadimitriou
            this.list.empty();
76 8d08f18a Kostas Papadimitriou
            _.each(this.get_meta(), _.bind(function(value, key) {
77 8d08f18a Kostas Papadimitriou
                var el = this.get_meta_el();
78 8d08f18a Kostas Papadimitriou
                el.find(".title").text(util.truncate(key, 15)).attr("title", key);
79 8d08f18a Kostas Papadimitriou
                el.find(".value").text(util.truncate(value, 15)).attr("title", value);
80 8d08f18a Kostas Papadimitriou
                el.data('meta', {'key':key, 'value':value});
81 8d08f18a Kostas Papadimitriou
                this.list.append(el);
82 8d08f18a Kostas Papadimitriou
                $(el).data({key:key, value:value});
83 8d08f18a Kostas Papadimitriou
            }, this));
84 8d08f18a Kostas Papadimitriou
85 8d08f18a Kostas Papadimitriou
            this.list.append('<li class="options-object create">' + 
86 8d08f18a Kostas Papadimitriou
                             '<div class="options-object-cont">' +
87 8d08f18a Kostas Papadimitriou
                             '<span class="title">Add new</span>' + 
88 f06cf120 Kostas Papadimitriou
                             '<span class="value">tag</span>' + 
89 8d08f18a Kostas Papadimitriou
                             '</div>' + 
90 8d08f18a Kostas Papadimitriou
                             '</li>')
91 8d08f18a Kostas Papadimitriou
92 8d08f18a Kostas Papadimitriou
            this.list.show();
93 8d08f18a Kostas Papadimitriou
            this.init_handlers();
94 8d08f18a Kostas Papadimitriou
        },
95 8d08f18a Kostas Papadimitriou
        
96 8d08f18a Kostas Papadimitriou
        meta_from_el: function(el) {
97 8d08f18a Kostas Papadimitriou
            return el.closest("li").data("meta");
98 8d08f18a Kostas Papadimitriou
        },
99 8d08f18a Kostas Papadimitriou
    
100 8d08f18a Kostas Papadimitriou
        show_editor: function(meta, el) {
101 8d08f18a Kostas Papadimitriou
            this.editing = true;
102 8d08f18a Kostas Papadimitriou
103 8d08f18a Kostas Papadimitriou
            this.editor.find("label").removeClass("error");
104 8d08f18a Kostas Papadimitriou
            if (meta) {
105 8d08f18a Kostas Papadimitriou
                this.editor.find(".predefined").hide();
106 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-key").val(meta.key).attr("disabled", true);
107 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-value").val(meta.value);
108 8d08f18a Kostas Papadimitriou
            } else {
109 8d08f18a Kostas Papadimitriou
                this.editor.find(".predefined").show();
110 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-key").val("").attr("disabled", false);
111 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-value").val("");
112 8d08f18a Kostas Papadimitriou
            }
113 ed89d8df Kostas Papadimitriou
            this.$(".editor").fadeIn(200);
114 8d08f18a Kostas Papadimitriou
115 8d08f18a Kostas Papadimitriou
            if (meta) {
116 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-value").focus().select();
117 8d08f18a Kostas Papadimitriou
            } else {
118 8d08f18a Kostas Papadimitriou
                this.editor.find("input.meta-key").focus();
119 8d08f18a Kostas Papadimitriou
            }
120 8d08f18a Kostas Papadimitriou
            
121 8d08f18a Kostas Papadimitriou
            // remove predefined for existing keys
122 8d08f18a Kostas Papadimitriou
            var existing_keys = this.current_vm.get_meta();
123 8d08f18a Kostas Papadimitriou
            if (!meta) {
124 8d08f18a Kostas Papadimitriou
                this.editor.find(".predefined-meta-key").each(function(i, el){
125 8d08f18a Kostas Papadimitriou
                    if (existing_keys[$(el).text()]) {
126 8d08f18a Kostas Papadimitriou
                        $(el).hide();
127 8d08f18a Kostas Papadimitriou
                    } else {
128 8d08f18a Kostas Papadimitriou
                        $(el).show();
129 8d08f18a Kostas Papadimitriou
                    }
130 8d08f18a Kostas Papadimitriou
                })
131 8d08f18a Kostas Papadimitriou
            }
132 8d08f18a Kostas Papadimitriou
        },
133 8d08f18a Kostas Papadimitriou
134 8d08f18a Kostas Papadimitriou
        update_vm_details: function() {
135 8d08f18a Kostas Papadimitriou
            // show proper title
136 8d08f18a Kostas Papadimitriou
            this.set_subtitle(this.current_vm.get("name") + snf.ui.helpers.vm_icon_tag(this.current_vm, "small"));
137 8d08f18a Kostas Papadimitriou
        },
138 8d08f18a Kostas Papadimitriou
139 8d08f18a Kostas Papadimitriou
        validate: function(meta) {
140 8d08f18a Kostas Papadimitriou
            if (!meta) { return false };
141 8d08f18a Kostas Papadimitriou
            if ((meta.key && meta.key != "") && (meta.value && meta.value != "")) {
142 8d08f18a Kostas Papadimitriou
                return true;
143 8d08f18a Kostas Papadimitriou
            }
144 8d08f18a Kostas Papadimitriou
            return false;
145 8d08f18a Kostas Papadimitriou
        },
146 8d08f18a Kostas Papadimitriou
147 8d08f18a Kostas Papadimitriou
        get_editor_values: function() {
148 8d08f18a Kostas Papadimitriou
            var meta = {};
149 8d08f18a Kostas Papadimitriou
            meta.key = this.editor.find("input.meta-key").val();
150 8d08f18a Kostas Papadimitriou
            meta.value = this.editor.find("input.meta-value").val();
151 8d08f18a Kostas Papadimitriou
152 8d08f18a Kostas Papadimitriou
            meta.key = _(meta.key).trim();
153 8d08f18a Kostas Papadimitriou
            meta.value = _(meta.value).trim();
154 8d08f18a Kostas Papadimitriou
            return meta;
155 8d08f18a Kostas Papadimitriou
        },
156 8d08f18a Kostas Papadimitriou
    
157 8d08f18a Kostas Papadimitriou
        submit_editor: function() {
158 8d08f18a Kostas Papadimitriou
            if (!this.editing) { return };
159 8d08f18a Kostas Papadimitriou
            this.editing = false;
160 8d08f18a Kostas Papadimitriou
            var meta = this.get_editor_values();
161 8d08f18a Kostas Papadimitriou
            if (this.validate(meta)) {
162 7865b24c Kostas Papadimitriou
                this.$(".editor .create").addClass('in-progress');
163 8d08f18a Kostas Papadimitriou
                this.current_vm.save_meta(meta, _.bind(function() {
164 8d08f18a Kostas Papadimitriou
                    this.close_editor();
165 7865b24c Kostas Papadimitriou
                    this.$(".editor .create").removeClass('in-progress');
166 8d08f18a Kostas Papadimitriou
                }, this));
167 8d08f18a Kostas Papadimitriou
            } else {
168 8d08f18a Kostas Papadimitriou
                this.editor.find(".form-field label").addClass("error");
169 8d08f18a Kostas Papadimitriou
            }
170 8d08f18a Kostas Papadimitriou
171 8d08f18a Kostas Papadimitriou
        },
172 8d08f18a Kostas Papadimitriou
173 8d08f18a Kostas Papadimitriou
        remove_meta: function(key) {
174 8d08f18a Kostas Papadimitriou
            this.current_vm.remove_meta(key);
175 8d08f18a Kostas Papadimitriou
        },
176 8d08f18a Kostas Papadimitriou
177 8d08f18a Kostas Papadimitriou
        close_editor: function() {
178 8d08f18a Kostas Papadimitriou
            this.$(".editor").fadeOut(100);
179 8d08f18a Kostas Papadimitriou
            this.editing = false;
180 8d08f18a Kostas Papadimitriou
        },
181 8d08f18a Kostas Papadimitriou
182 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
183 8d08f18a Kostas Papadimitriou
            var self = this;
184 8d08f18a Kostas Papadimitriou
            this.list.find(".remove").click(function(e){
185 8d08f18a Kostas Papadimitriou
                e.preventDefault();
186 8d08f18a Kostas Papadimitriou
                var meta = self.meta_from_el($(this));
187 8d08f18a Kostas Papadimitriou
                self.remove_meta(meta.key);
188 f06cf120 Kostas Papadimitriou
                $(this).parent().parent().parent().remove();
189 8d08f18a Kostas Papadimitriou
            });
190 8d08f18a Kostas Papadimitriou
191 8d08f18a Kostas Papadimitriou
            this.list.find(".edit").click(function(e) {
192 8d08f18a Kostas Papadimitriou
                e.preventDefault();
193 8d08f18a Kostas Papadimitriou
                var meta = self.meta_from_el($(this));
194 8d08f18a Kostas Papadimitriou
                self.show_editor(meta, $(this));
195 8d08f18a Kostas Papadimitriou
            })
196 8d08f18a Kostas Papadimitriou
197 383d7369 Kostas Papadimitriou
            //this.list.find(".options-object").dblclick(function(e) {
198 383d7369 Kostas Papadimitriou
                //e.preventDefault();
199 383d7369 Kostas Papadimitriou
                //var meta = self.meta_from_el($(this));
200 383d7369 Kostas Papadimitriou
                //self.show_editor(meta, $(this));
201 383d7369 Kostas Papadimitriou
            //})
202 ed89d8df Kostas Papadimitriou
203 8d08f18a Kostas Papadimitriou
            this.list.find("li.create").click(function(){
204 8d08f18a Kostas Papadimitriou
                self.show_create();
205 8d08f18a Kostas Papadimitriou
            })
206 8d08f18a Kostas Papadimitriou
            
207 8d08f18a Kostas Papadimitriou
            this.editor.find("input").keyup(_.bind(function(e){
208 8d08f18a Kostas Papadimitriou
                if (e.keyCode == 13) { this.submit_editor() };    
209 8d08f18a Kostas Papadimitriou
            }, this));
210 8d08f18a Kostas Papadimitriou
211 8d08f18a Kostas Papadimitriou
            this.editor.find(".predefined-meta-key").click(function() {
212 8d08f18a Kostas Papadimitriou
                self.editor.find("input.meta-key").val($(this).text());
213 8d08f18a Kostas Papadimitriou
                self.editor.find("input.meta-value").focus();
214 8d08f18a Kostas Papadimitriou
            })
215 8d08f18a Kostas Papadimitriou
216 8d08f18a Kostas Papadimitriou
        },
217 8d08f18a Kostas Papadimitriou
218 8d08f18a Kostas Papadimitriou
        show_create: function() {
219 7865b24c Kostas Papadimitriou
            this.$(".editor .create").removeClass('in-progress');
220 8d08f18a Kostas Papadimitriou
            this.show_editor();
221 8d08f18a Kostas Papadimitriou
        },
222 8d08f18a Kostas Papadimitriou
223 8d08f18a Kostas Papadimitriou
        unbind_vm_handlers: function() {
224 4921b056 Kostas Papadimitriou
            if (!this.current_vm) { return }
225 8d08f18a Kostas Papadimitriou
            this.current_vm.unbind("change", this.handle_vm_change);
226 8d08f18a Kostas Papadimitriou
        },
227 8d08f18a Kostas Papadimitriou
228 8d08f18a Kostas Papadimitriou
        handle_vm_change: function(vm) {
229 4921b056 Kostas Papadimitriou
            // if overlay has been closed and for
230 4921b056 Kostas Papadimitriou
            // some reason change event still triggers
231 4921b056 Kostas Papadimitriou
            // force event unbind
232 4921b056 Kostas Papadimitriou
            if (!this.current_vm) {
233 4921b056 Kostas Papadimitriou
                vm.unbind("change", this.handle_vm_change);
234 4921b056 Kostas Papadimitriou
                return;
235 4921b056 Kostas Papadimitriou
            } 
236 4921b056 Kostas Papadimitriou
237 8d08f18a Kostas Papadimitriou
            this.update_vm_details();
238 8d08f18a Kostas Papadimitriou
            this.update_layout();
239 8d08f18a Kostas Papadimitriou
        },
240 8d08f18a Kostas Papadimitriou
241 8d08f18a Kostas Papadimitriou
        onClose: function() {
242 0d2096c2 Kostas Papadimitriou
            this.editing = false;
243 8d08f18a Kostas Papadimitriou
            this.unbind_vm_handlers();
244 a1dbcae1 Kostas Papadimitriou
            this.current_vm = undefined;
245 8d08f18a Kostas Papadimitriou
        }
246 8d08f18a Kostas Papadimitriou
    });
247 8d08f18a Kostas Papadimitriou
    
248 8d08f18a Kostas Papadimitriou
})(this);