root / ui / static / snf / js / ui / web / ui_invitations_view.js @ 1e827d67
History | View | Annotate | Download (10 kB)
1 | 1e827d67 | Kostas Papadimitriou | ;(function(root){
|
---|---|---|---|
2 | 1e827d67 | Kostas Papadimitriou | |
3 | 1e827d67 | Kostas Papadimitriou | // root
|
4 | 1e827d67 | Kostas Papadimitriou | var root = root;
|
5 | 1e827d67 | Kostas Papadimitriou | |
6 | 1e827d67 | Kostas Papadimitriou | // setup namepsaces
|
7 | 1e827d67 | Kostas Papadimitriou | var snf = root.synnefo = root.synnefo || {};
|
8 | 1e827d67 | Kostas Papadimitriou | var api = snf.api = snf.api || {};
|
9 | 1e827d67 | Kostas Papadimitriou | var models = snf.models = snf.models || {}
|
10 | 1e827d67 | Kostas Papadimitriou | var storage = snf.storage = snf.storage || {};
|
11 | 1e827d67 | Kostas Papadimitriou | var ui = snf.ui = snf.ui || {};
|
12 | 1e827d67 | Kostas Papadimitriou | var util = snf.util = snf.util || {};
|
13 | 1e827d67 | Kostas Papadimitriou | |
14 | 1e827d67 | Kostas Papadimitriou | var views = snf.views = snf.views || {}
|
15 | 1e827d67 | Kostas Papadimitriou | |
16 | 1e827d67 | Kostas Papadimitriou | // shortcuts
|
17 | 1e827d67 | Kostas Papadimitriou | var bb = root.Backbone;
|
18 | 1e827d67 | Kostas Papadimitriou | |
19 | 1e827d67 | Kostas Papadimitriou | views.InvitationsView = views.Overlay.extend({ |
20 | 1e827d67 | Kostas Papadimitriou | |
21 | 1e827d67 | Kostas Papadimitriou | view_id: "invitations_view", |
22 | 1e827d67 | Kostas Papadimitriou | content_selector: "#invitations-overlay-content", |
23 | 1e827d67 | Kostas Papadimitriou | css_class: 'overlay-invitations overlay-info', |
24 | 1e827d67 | Kostas Papadimitriou | overlay_id: "invitations-overlay", |
25 | 1e827d67 | Kostas Papadimitriou | |
26 | 1e827d67 | Kostas Papadimitriou | subtitle: "", |
27 | 1e827d67 | Kostas Papadimitriou | title: "Invitations", |
28 | 1e827d67 | Kostas Papadimitriou | |
29 | 1e827d67 | Kostas Papadimitriou | initialize: function(options) { |
30 | 1e827d67 | Kostas Papadimitriou | views.InvitationsView.__super__.initialize.apply(this, arguments); |
31 | 1e827d67 | Kostas Papadimitriou | |
32 | 1e827d67 | Kostas Papadimitriou | _.bindAll(this);
|
33 | 1e827d67 | Kostas Papadimitriou | |
34 | 1e827d67 | Kostas Papadimitriou | this.entry_tpl = this.$(".form-entry-tpl"); |
35 | 1e827d67 | Kostas Papadimitriou | this.form_entries = this.$(".form-entries"); |
36 | 1e827d67 | Kostas Papadimitriou | this.add = this.$(".add-new-invitation"); |
37 | 1e827d67 | Kostas Papadimitriou | this.remove = this.$(".remove-invitation"); |
38 | 1e827d67 | Kostas Papadimitriou | this.send = this.$(".send-invitations"); |
39 | 1e827d67 | Kostas Papadimitriou | this.top_info = this.$(".top-info"); |
40 | 1e827d67 | Kostas Papadimitriou | this.sent = this.$(".invitations-sent-cont"); |
41 | 1e827d67 | Kostas Papadimitriou | this.sent_pages = this.$(".invitations-sent-pages"); |
42 | 1e827d67 | Kostas Papadimitriou | this.sent_tpl = this.$(".invitation-sent-tpl"); |
43 | 1e827d67 | Kostas Papadimitriou | this.entry_tpl.hide();
|
44 | 1e827d67 | Kostas Papadimitriou | |
45 | 1e827d67 | Kostas Papadimitriou | this.inv_sent_per_page = 9; |
46 | 1e827d67 | Kostas Papadimitriou | |
47 | 1e827d67 | Kostas Papadimitriou | this.init_handlers();
|
48 | 1e827d67 | Kostas Papadimitriou | }, |
49 | 1e827d67 | Kostas Papadimitriou | |
50 | 1e827d67 | Kostas Papadimitriou | init_handlers: function() { |
51 | 1e827d67 | Kostas Papadimitriou | var self = this; |
52 | 1e827d67 | Kostas Papadimitriou | this.add.click(this.add_new_entry); |
53 | 1e827d67 | Kostas Papadimitriou | this.send.click(this.send_entries); |
54 | 1e827d67 | Kostas Papadimitriou | this.remove.live('click', function() { |
55 | 1e827d67 | Kostas Papadimitriou | return self.remove_entry($(this).parent().parent()); |
56 | 1e827d67 | Kostas Papadimitriou | }); |
57 | 1e827d67 | Kostas Papadimitriou | }, |
58 | 1e827d67 | Kostas Papadimitriou | |
59 | 1e827d67 | Kostas Papadimitriou | remove_entry: function(entry) { |
60 | 1e827d67 | Kostas Papadimitriou | if (entry.hasClass("sending")) { return }; |
61 | 1e827d67 | Kostas Papadimitriou | entry.remove(); |
62 | 1e827d67 | Kostas Papadimitriou | this.fix_entries();
|
63 | 1e827d67 | Kostas Papadimitriou | }, |
64 | 1e827d67 | Kostas Papadimitriou | |
65 | 1e827d67 | Kostas Papadimitriou | add_new_entry: function() { |
66 | 1e827d67 | Kostas Papadimitriou | var new_entry = this.create_form_entry().show() |
67 | 1e827d67 | Kostas Papadimitriou | this.form_entries.append(new_entry).show();
|
68 | 1e827d67 | Kostas Papadimitriou | $(new_entry.find("input").get(0)).focus(); |
69 | 1e827d67 | Kostas Papadimitriou | this.fix_entries();
|
70 | 1e827d67 | Kostas Papadimitriou | }, |
71 | 1e827d67 | Kostas Papadimitriou | |
72 | 1e827d67 | Kostas Papadimitriou | show_entry_error: function(entry, error) { |
73 | 1e827d67 | Kostas Papadimitriou | entry.find(".send-error").text(error)
|
74 | 1e827d67 | Kostas Papadimitriou | entry.find(".send-error").show();
|
75 | 1e827d67 | Kostas Papadimitriou | entry.addClass("error");
|
76 | 1e827d67 | Kostas Papadimitriou | entry.find("input").attr("disabled", false); |
77 | 1e827d67 | Kostas Papadimitriou | }, |
78 | 1e827d67 | Kostas Papadimitriou | |
79 | 1e827d67 | Kostas Papadimitriou | get_entry_data: function(entry) { |
80 | 1e827d67 | Kostas Papadimitriou | var data = {name: entry.find("input.name").val(), email:entry.find("input.email").val()}; |
81 | 1e827d67 | Kostas Papadimitriou | return data;
|
82 | 1e827d67 | Kostas Papadimitriou | }, |
83 | 1e827d67 | Kostas Papadimitriou | |
84 | 1e827d67 | Kostas Papadimitriou | entry_is_valid: function(entry) { |
85 | 1e827d67 | Kostas Papadimitriou | var data = this.get_entry_data(entry); |
86 | 1e827d67 | Kostas Papadimitriou | |
87 | 1e827d67 | Kostas Papadimitriou | entry.find(".send-error").hide();
|
88 | 1e827d67 | Kostas Papadimitriou | entry.removeClass("error");
|
89 | 1e827d67 | Kostas Papadimitriou | entry.find("input").removeClass("has-errors"); |
90 | 1e827d67 | Kostas Papadimitriou | |
91 | 1e827d67 | Kostas Papadimitriou | error = false;
|
92 | 1e827d67 | Kostas Papadimitriou | if (!data.name || data.name.split(" ").length == 1) { |
93 | 1e827d67 | Kostas Papadimitriou | error = "Invalid name";
|
94 | 1e827d67 | Kostas Papadimitriou | entry.find("input.name").addClass("has-errors"); |
95 | 1e827d67 | Kostas Papadimitriou | } |
96 | 1e827d67 | Kostas Papadimitriou | |
97 | 1e827d67 | Kostas Papadimitriou | var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; |
98 | 1e827d67 | Kostas Papadimitriou | if (!data.email || reg.test(data.email) == false) { |
99 | 1e827d67 | Kostas Papadimitriou | error = "Invalid email";
|
100 | 1e827d67 | Kostas Papadimitriou | entry.find("input.email").addClass("has-errors"); |
101 | 1e827d67 | Kostas Papadimitriou | } |
102 | 1e827d67 | Kostas Papadimitriou | |
103 | 1e827d67 | Kostas Papadimitriou | if (error) { this.show_entry_error(entry, error) }; |
104 | 1e827d67 | Kostas Papadimitriou | return error
|
105 | 1e827d67 | Kostas Papadimitriou | }, |
106 | 1e827d67 | Kostas Papadimitriou | |
107 | 1e827d67 | Kostas Papadimitriou | send_entries: function() { |
108 | 1e827d67 | Kostas Papadimitriou | var self = this; |
109 | 1e827d67 | Kostas Papadimitriou | this.form_entries.find(".form-entry").each(function(index, el) { self.entry_is_valid($(el)) }); |
110 | 1e827d67 | Kostas Papadimitriou | var entries_to_send = this.form_entries.find(".form-entry:not(.error):not(.sending)"); |
111 | 1e827d67 | Kostas Papadimitriou | this._send_entries(entries_to_send);
|
112 | 1e827d67 | Kostas Papadimitriou | }, |
113 | 1e827d67 | Kostas Papadimitriou | |
114 | 1e827d67 | Kostas Papadimitriou | _send_entries: function(entries) { |
115 | 1e827d67 | Kostas Papadimitriou | $(entries).addClass("sending").find("input").attr("disabled", true); |
116 | 1e827d67 | Kostas Papadimitriou | var self = this; |
117 | 1e827d67 | Kostas Papadimitriou | _.each(entries, function(e) {
|
118 | 1e827d67 | Kostas Papadimitriou | var e = $(e); |
119 | 1e827d67 | Kostas Papadimitriou | var data = self.get_entry_data(e);
|
120 | 1e827d67 | Kostas Papadimitriou | self.send_invitation(data.name, |
121 | 1e827d67 | Kostas Papadimitriou | data.email, |
122 | 1e827d67 | Kostas Papadimitriou | _.bind(self.invitation_send, this, e),
|
123 | 1e827d67 | Kostas Papadimitriou | _.bind(self.invitation_failed, this, e));
|
124 | 1e827d67 | Kostas Papadimitriou | }); |
125 | 1e827d67 | Kostas Papadimitriou | }, |
126 | 1e827d67 | Kostas Papadimitriou | |
127 | 1e827d67 | Kostas Papadimitriou | invitation_send: function(entry, data) { |
128 | 1e827d67 | Kostas Papadimitriou | entry.removeClass("sending");
|
129 | 1e827d67 | Kostas Papadimitriou | if (data.errors && data.errors.length) {
|
130 | 1e827d67 | Kostas Papadimitriou | this.show_entry_error($(entry), data.errors[0]); |
131 | 1e827d67 | Kostas Papadimitriou | return;
|
132 | 1e827d67 | Kostas Papadimitriou | } else {
|
133 | 1e827d67 | Kostas Papadimitriou | entry.remove(); |
134 | 1e827d67 | Kostas Papadimitriou | this.show_send_success(entry.find("input.name").val(), data); |
135 | 1e827d67 | Kostas Papadimitriou | } |
136 | 1e827d67 | Kostas Papadimitriou | }, |
137 | 1e827d67 | Kostas Papadimitriou | |
138 | 1e827d67 | Kostas Papadimitriou | show_send_success: function(to, data) { |
139 | 1e827d67 | Kostas Papadimitriou | var msg = "Invitation to " + to + " was sent."; |
140 | 1e827d67 | Kostas Papadimitriou | var msg_el = $('<div class="msg">{0}</div>'.format(msg)); |
141 | 1e827d67 | Kostas Papadimitriou | |
142 | 1e827d67 | Kostas Papadimitriou | this.top_info.append(msg_el);
|
143 | 1e827d67 | Kostas Papadimitriou | |
144 | 1e827d67 | Kostas Papadimitriou | window.setTimeout(function(){
|
145 | 1e827d67 | Kostas Papadimitriou | msg_el.fadeOut(600, function(){$(this).remove()}); |
146 | 1e827d67 | Kostas Papadimitriou | }, 2000);
|
147 | 1e827d67 | Kostas Papadimitriou | |
148 | 1e827d67 | Kostas Papadimitriou | this.fix_entries();
|
149 | 1e827d67 | Kostas Papadimitriou | this.reset_invitations_sent();
|
150 | 1e827d67 | Kostas Papadimitriou | }, |
151 | 1e827d67 | Kostas Papadimitriou | |
152 | 1e827d67 | Kostas Papadimitriou | invitation_failed: function(entry) { |
153 | 1e827d67 | Kostas Papadimitriou | entry.removeClass("sending");
|
154 | 1e827d67 | Kostas Papadimitriou | this.show_entry_error(entry, "Cannot send email, please try again later"); |
155 | 1e827d67 | Kostas Papadimitriou | }, |
156 | 1e827d67 | Kostas Papadimitriou | |
157 | 1e827d67 | Kostas Papadimitriou | send_invitation: function(name, email, success, fail) { |
158 | 1e827d67 | Kostas Papadimitriou | var url = snf.config.invitations_url;
|
159 | 1e827d67 | Kostas Papadimitriou | var payload = {name_1: name, email_1: email, csrftoken: $.cookie('csrftoken')}; |
160 | 1e827d67 | Kostas Papadimitriou | params = { |
161 | 1e827d67 | Kostas Papadimitriou | success: success,
|
162 | 1e827d67 | Kostas Papadimitriou | error: fail,
|
163 | 1e827d67 | Kostas Papadimitriou | url: url,
|
164 | 1e827d67 | Kostas Papadimitriou | data: $.param(payload), |
165 | 1e827d67 | Kostas Papadimitriou | skip_api_error: true |
166 | 1e827d67 | Kostas Papadimitriou | } |
167 | 1e827d67 | Kostas Papadimitriou | snf.api.sync("create", undefined, params); |
168 | 1e827d67 | Kostas Papadimitriou | }, |
169 | 1e827d67 | Kostas Papadimitriou | |
170 | 1e827d67 | Kostas Papadimitriou | get_entries: function() { |
171 | 1e827d67 | Kostas Papadimitriou | return this.form_entries.find(".form-entry"); |
172 | 1e827d67 | Kostas Papadimitriou | }, |
173 | 1e827d67 | Kostas Papadimitriou | |
174 | 1e827d67 | Kostas Papadimitriou | fix_entries: function() { |
175 | 1e827d67 | Kostas Papadimitriou | this.$(".remove-invitation").hide(); |
176 | 1e827d67 | Kostas Papadimitriou | if (this.get_entries().length == 0) { |
177 | 1e827d67 | Kostas Papadimitriou | this.add_new_entry();
|
178 | 1e827d67 | Kostas Papadimitriou | } |
179 | 1e827d67 | Kostas Papadimitriou | |
180 | 1e827d67 | Kostas Papadimitriou | if (this.get_entries().length > 1) { |
181 | 1e827d67 | Kostas Papadimitriou | this.$(".remove-invitation").show(); |
182 | 1e827d67 | Kostas Papadimitriou | } |
183 | 1e827d67 | Kostas Papadimitriou | this.$(".form-entry:first-child label").show(); |
184 | 1e827d67 | Kostas Papadimitriou | this.$(".form-entry:not(:first-child) label").hide(); |
185 | 1e827d67 | Kostas Papadimitriou | }, |
186 | 1e827d67 | Kostas Papadimitriou | |
187 | 1e827d67 | Kostas Papadimitriou | show: function() { |
188 | 1e827d67 | Kostas Papadimitriou | views.InvitationsView.__super__.show.apply(this, arguments); |
189 | 1e827d67 | Kostas Papadimitriou | this.current_page = 0; |
190 | 1e827d67 | Kostas Papadimitriou | this.reset_invitations_sent();
|
191 | 1e827d67 | Kostas Papadimitriou | this.reset();
|
192 | 1e827d67 | Kostas Papadimitriou | |
193 | 1e827d67 | Kostas Papadimitriou | this.add_new_entry();
|
194 | 1e827d67 | Kostas Papadimitriou | this.add_new_entry();
|
195 | 1e827d67 | Kostas Papadimitriou | this.add_new_entry();
|
196 | 1e827d67 | Kostas Papadimitriou | }, |
197 | 1e827d67 | Kostas Papadimitriou | |
198 | 1e827d67 | Kostas Papadimitriou | create_form_entry: function() { |
199 | 1e827d67 | Kostas Papadimitriou | return this.entry_tpl.clone().removeClass("form-entry-tpl").addClass("form-entry").removeClass("hidden"); |
200 | 1e827d67 | Kostas Papadimitriou | }, |
201 | 1e827d67 | Kostas Papadimitriou | |
202 | 1e827d67 | Kostas Papadimitriou | reset: function() { |
203 | 1e827d67 | Kostas Papadimitriou | this.get_entries().remove();
|
204 | 1e827d67 | Kostas Papadimitriou | this.add_new_entry();
|
205 | 1e827d67 | Kostas Papadimitriou | }, |
206 | 1e827d67 | Kostas Papadimitriou | |
207 | 1e827d67 | Kostas Papadimitriou | new_invitation_sent_el: function() { |
208 | 1e827d67 | Kostas Papadimitriou | return this.sent_tpl.clone().removeClass("invitation-sent-tpl").addClass("invitation-sent"); |
209 | 1e827d67 | Kostas Papadimitriou | }, |
210 | 1e827d67 | Kostas Papadimitriou | |
211 | 1e827d67 | Kostas Papadimitriou | show_invitations_sent_error: function() { |
212 | 1e827d67 | Kostas Papadimitriou | this.sent.hide();
|
213 | 1e827d67 | Kostas Papadimitriou | this.$(".invitations-sent-error").show(); |
214 | 1e827d67 | Kostas Papadimitriou | }, |
215 | 1e827d67 | Kostas Papadimitriou | |
216 | 1e827d67 | Kostas Papadimitriou | reset_invitations_sent: function() { |
217 | 1e827d67 | Kostas Papadimitriou | var self = this; |
218 | 1e827d67 | Kostas Papadimitriou | var url = snf.config.invitations_url;
|
219 | 1e827d67 | Kostas Papadimitriou | params = { |
220 | 1e827d67 | Kostas Papadimitriou | success: function(data) { |
221 | 1e827d67 | Kostas Papadimitriou | if (!data || !data.invitations) {
|
222 | 1e827d67 | Kostas Papadimitriou | self.show_invitations_sent_error(); |
223 | 1e827d67 | Kostas Papadimitriou | } else {
|
224 | 1e827d67 | Kostas Papadimitriou | self.sent.empty(); |
225 | 1e827d67 | Kostas Papadimitriou | self.add_invitations_sent(data.invitations); |
226 | 1e827d67 | Kostas Papadimitriou | } |
227 | 1e827d67 | Kostas Papadimitriou | |
228 | 1e827d67 | Kostas Papadimitriou | //data.invitations_left = 0;
|
229 | 1e827d67 | Kostas Papadimitriou | self.$(".description .left").text(data.invitations_left); |
230 | 1e827d67 | Kostas Papadimitriou | if(data.invitations_left > 0) { |
231 | 1e827d67 | Kostas Papadimitriou | self.$(".invitations-form").show(); |
232 | 1e827d67 | Kostas Papadimitriou | self.$(".description .left").removeClass("none"); |
233 | 1e827d67 | Kostas Papadimitriou | self.el.removeClass("none-left");
|
234 | 1e827d67 | Kostas Papadimitriou | } else {
|
235 | 1e827d67 | Kostas Papadimitriou | self.$(".invitations-form").hide(); |
236 | 1e827d67 | Kostas Papadimitriou | self.$(".description .left").addClass("none"); |
237 | 1e827d67 | Kostas Papadimitriou | self.el.addClass("none-left");
|
238 | 1e827d67 | Kostas Papadimitriou | } |
239 | 1e827d67 | Kostas Papadimitriou | }, |
240 | 1e827d67 | Kostas Papadimitriou | error: _.bind(this.show_invitations_sent_error, this), |
241 | 1e827d67 | Kostas Papadimitriou | url: url,
|
242 | 1e827d67 | Kostas Papadimitriou | skip_api_error: true |
243 | 1e827d67 | Kostas Papadimitriou | } |
244 | 1e827d67 | Kostas Papadimitriou | |
245 | 1e827d67 | Kostas Papadimitriou | snf.api.sync("read", undefined, params); |
246 | 1e827d67 | Kostas Papadimitriou | }, |
247 | 1e827d67 | Kostas Papadimitriou | |
248 | 1e827d67 | Kostas Papadimitriou | add_invitations_sent: function(invs) { |
249 | 1e827d67 | Kostas Papadimitriou | _.each(invs, _.bind(function(inv) {
|
250 | 1e827d67 | Kostas Papadimitriou | var el = this.new_invitation_sent_el(); |
251 | 1e827d67 | Kostas Papadimitriou | el.find(".name").text(inv.targetname);
|
252 | 1e827d67 | Kostas Papadimitriou | el.find(".email").text(inv.target);
|
253 | 1e827d67 | Kostas Papadimitriou | el.find(".action").addClass("sent"); |
254 | 1e827d67 | Kostas Papadimitriou | if (!inv.accepted) {
|
255 | 1e827d67 | Kostas Papadimitriou | el.find(".action").removeClass("resend").addClass("resend") |
256 | 1e827d67 | Kostas Papadimitriou | } |
257 | 1e827d67 | Kostas Papadimitriou | el.removeClass("hidden");
|
258 | 1e827d67 | Kostas Papadimitriou | this.sent.append(el);
|
259 | 1e827d67 | Kostas Papadimitriou | }, this));
|
260 | 1e827d67 | Kostas Papadimitriou | this.update_pagination();
|
261 | 1e827d67 | Kostas Papadimitriou | this.sent_pages.trigger("setPage", this.current_page || 0); |
262 | 1e827d67 | Kostas Papadimitriou | }, |
263 | 1e827d67 | Kostas Papadimitriou | |
264 | 1e827d67 | Kostas Papadimitriou | inv_sent_per_page: 5, |
265 | 1e827d67 | Kostas Papadimitriou | update_pagination: function() { |
266 | 1e827d67 | Kostas Papadimitriou | this.sent.css({minHeight:this.inv_sent_per_page * 35 + "px"}) |
267 | 1e827d67 | Kostas Papadimitriou | this.sent_pages.pagination(this.sent.children().length, {items_per_page:this.inv_sent_per_page, callback: this.page_cb}); |
268 | 1e827d67 | Kostas Papadimitriou | }, |
269 | 1e827d67 | Kostas Papadimitriou | |
270 | 1e827d67 | Kostas Papadimitriou | page_cb: function(index, pager) { |
271 | 1e827d67 | Kostas Papadimitriou | this.current_page = index;
|
272 | 1e827d67 | Kostas Papadimitriou | var start = index * this.inv_sent_per_page; |
273 | 1e827d67 | Kostas Papadimitriou | var end = start + this.inv_sent_per_page -1; |
274 | 1e827d67 | Kostas Papadimitriou | var items = this.sent.children(); |
275 | 1e827d67 | Kostas Papadimitriou | items.hide().removeClass("last");
|
276 | 1e827d67 | Kostas Papadimitriou | for (var i = start; i<=end; i++) { |
277 | 1e827d67 | Kostas Papadimitriou | $(items.get(i)).show();
|
278 | 1e827d67 | Kostas Papadimitriou | } |
279 | 1e827d67 | Kostas Papadimitriou | $(items.get(end)).addClass("last"); |
280 | 1e827d67 | Kostas Papadimitriou | return false; |
281 | 1e827d67 | Kostas Papadimitriou | } |
282 | 1e827d67 | Kostas Papadimitriou | |
283 | 1e827d67 | Kostas Papadimitriou | }); |
284 | 1e827d67 | Kostas Papadimitriou | })(this);
|