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