Statistics
| Branch: | Tag: | Revision:

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