Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_feedback_view.js @ 6201f0e3

History | View | Annotate | Download (6.6 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
;(function(root){
36 8d08f18a Kostas Papadimitriou
37 8d08f18a Kostas Papadimitriou
    // root
38 8d08f18a Kostas Papadimitriou
    var root = root;
39 8d08f18a Kostas Papadimitriou
    
40 8d08f18a Kostas Papadimitriou
    // setup namepsaces
41 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 8d08f18a Kostas Papadimitriou
    var api = snf.api = snf.api || {};
43 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
44 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
45 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
46 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {};
47 8d08f18a Kostas Papadimitriou
48 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
49 8d08f18a Kostas Papadimitriou
50 8d08f18a Kostas Papadimitriou
    // shortcuts
51 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
52 8d08f18a Kostas Papadimitriou
53 8d08f18a Kostas Papadimitriou
    views.FeedbackView = views.Overlay.extend({
54 8d08f18a Kostas Papadimitriou
        
55 8d08f18a Kostas Papadimitriou
        view_id: "feedback_view",
56 8d08f18a Kostas Papadimitriou
        content_selector: "#feedback-overlay-content",
57 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-feedback overlay-info',
58 8d08f18a Kostas Papadimitriou
        overlay_id: "feedback-overlay",
59 8d08f18a Kostas Papadimitriou
60 8d08f18a Kostas Papadimitriou
        subtitle: "",
61 8d08f18a Kostas Papadimitriou
        title: "Send feedback",
62 8d08f18a Kostas Papadimitriou
63 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
64 8d08f18a Kostas Papadimitriou
            views.FeedbackView.__super__.initialize.apply(this, arguments);
65 8d08f18a Kostas Papadimitriou
            
66 8d08f18a Kostas Papadimitriou
            _.bindAll(this, 'submit_form', 'show_error', 'show_success');
67 8d08f18a Kostas Papadimitriou
68 8d08f18a Kostas Papadimitriou
            this.submit = this.$("span.submit");
69 8d08f18a Kostas Papadimitriou
            this.text = this.$("textarea.feedback-message");
70 8d08f18a Kostas Papadimitriou
            this.text_row = this.$("div.form-field");
71 8d08f18a Kostas Papadimitriou
            this.messages = this.$(".messages").hide();
72 8d08f18a Kostas Papadimitriou
            this.error = this.$("p.error-message");
73 8d08f18a Kostas Papadimitriou
            this.success = this.$("p.success-message");
74 8d08f18a Kostas Papadimitriou
            this.form = this.$(".form");
75 8d08f18a Kostas Papadimitriou
            this.sending = this.$(".sending-message");
76 8d08f18a Kostas Papadimitriou
77 8d08f18a Kostas Papadimitriou
            this.init_handlers();
78 8d08f18a Kostas Papadimitriou
        },
79 8d08f18a Kostas Papadimitriou
        
80 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
81 8d08f18a Kostas Papadimitriou
            this.submit.click(this.submit_form);
82 8d08f18a Kostas Papadimitriou
        },
83 8d08f18a Kostas Papadimitriou
84 8d08f18a Kostas Papadimitriou
        get_message: function() {
85 8d08f18a Kostas Papadimitriou
            var text = _(this.text.val()).trim();
86 8d08f18a Kostas Papadimitriou
            return text;
87 8d08f18a Kostas Papadimitriou
        },
88 8d08f18a Kostas Papadimitriou
89 8d08f18a Kostas Papadimitriou
        validate: function() {
90 8d08f18a Kostas Papadimitriou
            var msg = this.get_message();
91 8d08f18a Kostas Papadimitriou
            if (msg == "") {
92 8d08f18a Kostas Papadimitriou
                this.text_row.addClass("error");
93 8d08f18a Kostas Papadimitriou
                return false;
94 8d08f18a Kostas Papadimitriou
            } else {
95 8d08f18a Kostas Papadimitriou
                this.text_row.removeClass("error");
96 8d08f18a Kostas Papadimitriou
                return true;
97 8d08f18a Kostas Papadimitriou
            }
98 8d08f18a Kostas Papadimitriou
        },
99 8d08f18a Kostas Papadimitriou
100 8d08f18a Kostas Papadimitriou
        submit_form: function() {
101 8d08f18a Kostas Papadimitriou
            if (this.validate()) {
102 8d08f18a Kostas Papadimitriou
                this.show_sending();
103 8d08f18a Kostas Papadimitriou
                this.send_message(this.get_message(), {});
104 8d08f18a Kostas Papadimitriou
            } else {}
105 8d08f18a Kostas Papadimitriou
        },
106 8d08f18a Kostas Papadimitriou
107 8d08f18a Kostas Papadimitriou
        send_message: function(msg, extra) {
108 8d08f18a Kostas Papadimitriou
            var extra = extra || {};
109 8d08f18a Kostas Papadimitriou
110 8d08f18a Kostas Papadimitriou
            var data = {
111 5af5920c Kostas Papadimitriou
                'feedback_msg': msg,
112 5af5920c Kostas Papadimitriou
                'feedback_data': this.get_feedback_data() || ""
113 8d08f18a Kostas Papadimitriou
            }
114 8d08f18a Kostas Papadimitriou
            
115 8d08f18a Kostas Papadimitriou
            var opts = {
116 5af5920c Kostas Papadimitriou
                'url': synnefo.config.feedback_post_url,
117 8d08f18a Kostas Papadimitriou
                'data': $.param(data),
118 8d08f18a Kostas Papadimitriou
                'success': this.show_success,
119 8d08f18a Kostas Papadimitriou
                'error': this.show_error,
120 9ce969a7 Kostas Papadimitriou
                'no_skip': true,
121 9ce969a7 Kostas Papadimitriou
                'display': false,
122 8d08f18a Kostas Papadimitriou
                'handles_error': true
123 8d08f18a Kostas Papadimitriou
            }
124 8d08f18a Kostas Papadimitriou
            api.sync('create', undefined, opts);
125 8d08f18a Kostas Papadimitriou
        },
126 8d08f18a Kostas Papadimitriou
127 8d08f18a Kostas Papadimitriou
        get_feedback_data: function() {
128 8d08f18a Kostas Papadimitriou
            if (this.collect_data) return JSON.stringify(_.extend({}, snf.collect_user_data(),this.extra_data));
129 8d08f18a Kostas Papadimitriou
        },
130 8d08f18a Kostas Papadimitriou
        
131 8d08f18a Kostas Papadimitriou
        onOpen: function() {
132 9ce969a7 Kostas Papadimitriou
            var self = this;
133 8d08f18a Kostas Papadimitriou
            var point = this.text.val().length;
134 8d08f18a Kostas Papadimitriou
            this.text.show().focus().setCursorPosition(point);
135 9ce969a7 Kostas Papadimitriou
136 9ce969a7 Kostas Papadimitriou
            this.$(".closeme").unbind("click");
137 9ce969a7 Kostas Papadimitriou
            this.$(".closeme").bind("click", function(){
138 9ce969a7 Kostas Papadimitriou
                self.hide("reset")
139 9ce969a7 Kostas Papadimitriou
            });
140 8d08f18a Kostas Papadimitriou
        },
141 8d08f18a Kostas Papadimitriou
142 8d08f18a Kostas Papadimitriou
        show_form: function() {
143 8d08f18a Kostas Papadimitriou
            this.form.show();
144 8d08f18a Kostas Papadimitriou
            this.messages.hide();
145 8d08f18a Kostas Papadimitriou
            this.text.focus();
146 8d08f18a Kostas Papadimitriou
        },
147 8d08f18a Kostas Papadimitriou
148 8d08f18a Kostas Papadimitriou
        show_sending: function() {
149 8d08f18a Kostas Papadimitriou
            this.form.hide();
150 8d08f18a Kostas Papadimitriou
            this.messages.show();
151 8d08f18a Kostas Papadimitriou
            this.error.hide();
152 8d08f18a Kostas Papadimitriou
            this.success.hide();
153 8d08f18a Kostas Papadimitriou
            this.sending.show();
154 8d08f18a Kostas Papadimitriou
        },
155 8d08f18a Kostas Papadimitriou
156 8d08f18a Kostas Papadimitriou
        show_error: function() {
157 8d08f18a Kostas Papadimitriou
            this.form.hide();
158 8d08f18a Kostas Papadimitriou
            this.messages.show();
159 8d08f18a Kostas Papadimitriou
            this.error.show();
160 8d08f18a Kostas Papadimitriou
            this.success.hide();
161 8d08f18a Kostas Papadimitriou
            this.sending.hide();
162 8d08f18a Kostas Papadimitriou
        },
163 8d08f18a Kostas Papadimitriou
164 8d08f18a Kostas Papadimitriou
        show_success: function() {
165 8d08f18a Kostas Papadimitriou
            this.form.hide();
166 8d08f18a Kostas Papadimitriou
            this.messages.show();
167 8d08f18a Kostas Papadimitriou
            this.error.hide();
168 8d08f18a Kostas Papadimitriou
            this.success.show();
169 8d08f18a Kostas Papadimitriou
            this.sending.hide();
170 8d08f18a Kostas Papadimitriou
        },
171 edd1d565 Kostas Papadimitriou
        
172 9ce969a7 Kostas Papadimitriou
        hide: function(reset_error_state) {
173 9ce969a7 Kostas Papadimitriou
            // trigger api reset
174 9ce969a7 Kostas Papadimitriou
            if (reset_error_state === "reset") {
175 9ce969a7 Kostas Papadimitriou
                // report error feedback form
176 9ce969a7 Kostas Papadimitriou
                if (snf.api.error_state == snf.api.STATES.ERROR) {
177 9ce969a7 Kostas Papadimitriou
                    snf.api.trigger("reset");
178 9ffd10ce Kostas Papadimitriou
                    ui.main.error_view.displaying_error = false;
179 9ffd10ce Kostas Papadimitriou
                    ui.main.error_view.is_visible = false;
180 9ce969a7 Kostas Papadimitriou
                }
181 9ce969a7 Kostas Papadimitriou
            }
182 9ffd10ce Kostas Papadimitriou
            ui.main.error_view.is_visible = false;
183 edd1d565 Kostas Papadimitriou
            views.FeedbackView.__super__.hide.apply(this);
184 edd1d565 Kostas Papadimitriou
        },
185 8d08f18a Kostas Papadimitriou
186 8d08f18a Kostas Papadimitriou
        show: function(data, collect_data, extra_data, cb) {
187 9ffd10ce Kostas Papadimitriou
            // proxy error view visibility to avoid showing
188 9ffd10ce Kostas Papadimitriou
            // errors while user sees feedback overlay
189 9ffd10ce Kostas Papadimitriou
            ui.main.error_view.is_visible = true;
190 9ffd10ce Kostas Papadimitriou
191 8d08f18a Kostas Papadimitriou
            this.data = data || "";
192 8d08f18a Kostas Papadimitriou
            this.cb = cb || function () {};
193 8d08f18a Kostas Papadimitriou
            this.collect_data = collect_data || false;
194 8d08f18a Kostas Papadimitriou
            this.extra_data = extra_data || {};
195 8d08f18a Kostas Papadimitriou
196 8d08f18a Kostas Papadimitriou
            views.FeedbackView.__super__.show.apply(this, arguments);
197 8d08f18a Kostas Papadimitriou
            this.text.val(data);
198 8d08f18a Kostas Papadimitriou
            this.show_form();
199 8d08f18a Kostas Papadimitriou
        }
200 8d08f18a Kostas Papadimitriou
    });
201 8d08f18a Kostas Papadimitriou
})(this);