Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_error_view.js @ 4f1968db

History | View | Annotate | Download (9.3 kB)

1 dc020cf6 Kostas Papadimitriou
;(function(root){
2 dc020cf6 Kostas Papadimitriou
3 dc020cf6 Kostas Papadimitriou
    // root
4 dc020cf6 Kostas Papadimitriou
    var root = root;
5 dc020cf6 Kostas Papadimitriou
    
6 dc020cf6 Kostas Papadimitriou
    // setup namepsaces
7 dc020cf6 Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
8 dc020cf6 Kostas Papadimitriou
    var models = snf.models = snf.models || {}
9 dc020cf6 Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
10 dc020cf6 Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
11 dc020cf6 Kostas Papadimitriou
    var util = snf.util = snf.util || {};
12 dc020cf6 Kostas Papadimitriou
13 dc020cf6 Kostas Papadimitriou
    var views = snf.views = snf.views || {}
14 dc020cf6 Kostas Papadimitriou
15 dc020cf6 Kostas Papadimitriou
    // shortcuts
16 dc020cf6 Kostas Papadimitriou
    var bb = root.Backbone;
17 dc020cf6 Kostas Papadimitriou
18 dc020cf6 Kostas Papadimitriou
    views.ErrorView = views.Overlay.extend({
19 dc020cf6 Kostas Papadimitriou
        
20 dc020cf6 Kostas Papadimitriou
        view_id: "error_view",
21 dc020cf6 Kostas Papadimitriou
        content_selector: "#error-overlay-content",
22 dc020cf6 Kostas Papadimitriou
        css_class: 'overlay-error',
23 dc020cf6 Kostas Papadimitriou
        overlay_id: "error-overlay",
24 edd1d565 Kostas Papadimitriou
        error_stack: {},
25 dc020cf6 Kostas Papadimitriou
26 dc020cf6 Kostas Papadimitriou
        initialize: function() {
27 dc020cf6 Kostas Papadimitriou
            views.ErrorView.__super__.initialize.apply(this, arguments);
28 dc020cf6 Kostas Papadimitriou
            var self = this;
29 dc020cf6 Kostas Papadimitriou
30 dc020cf6 Kostas Papadimitriou
            this.error_state = false;
31 dc020cf6 Kostas Papadimitriou
32 dc020cf6 Kostas Papadimitriou
            this.$(".actions .show-details, .actions .hide-details").click(function() {
33 dc020cf6 Kostas Papadimitriou
                self.$(".error-details").toggle();
34 dc020cf6 Kostas Papadimitriou
                self.$(".show-details").toggle();
35 dc020cf6 Kostas Papadimitriou
                self.$(".hide-details").toggle();
36 dc020cf6 Kostas Papadimitriou
            });
37 dc020cf6 Kostas Papadimitriou
38 dc020cf6 Kostas Papadimitriou
            this.$(".key.details").click(function() {
39 dc020cf6 Kostas Papadimitriou
                $(this).next().toggle();
40 dc020cf6 Kostas Papadimitriou
                if (!$(this).next().is(":visible")) {
41 dc020cf6 Kostas Papadimitriou
                    $(this).addClass("expand");
42 dc020cf6 Kostas Papadimitriou
                } else {
43 dc020cf6 Kostas Papadimitriou
                    $(this).removeClass("expand");
44 dc020cf6 Kostas Papadimitriou
                }
45 dc020cf6 Kostas Papadimitriou
            })
46 dc020cf6 Kostas Papadimitriou
47 dc020cf6 Kostas Papadimitriou
            this.$(".actions .report-error").click(_.bind(function() {
48 dc020cf6 Kostas Papadimitriou
                this.report_error();
49 dc020cf6 Kostas Papadimitriou
            }, this));
50 dc020cf6 Kostas Papadimitriou
51 dc020cf6 Kostas Papadimitriou
            this.$(".actions .hide-details").hide();
52 dc020cf6 Kostas Papadimitriou
53 dc020cf6 Kostas Papadimitriou
            this.$(".reload-app").click(function(){
54 dc020cf6 Kostas Papadimitriou
                window.location.reload(true);
55 9ffd10ce Kostas Papadimitriou
            });
56 9ffd10ce Kostas Papadimitriou
57 9ffd10ce Kostas Papadimitriou
            this.$(".show-next").click(_.bind(function(){
58 9ffd10ce Kostas Papadimitriou
                this.show_next_error();
59 9ffd10ce Kostas Papadimitriou
            }, this));
60 9ffd10ce Kostas Papadimitriou
61 9ffd10ce Kostas Papadimitriou
            this.$(".show-prev").click(_.bind(function(){
62 9ffd10ce Kostas Papadimitriou
                this.show_prev_error();
63 9ffd10ce Kostas Papadimitriou
            }, this));
64 9ffd10ce Kostas Papadimitriou
65 9ffd10ce Kostas Papadimitriou
            this.displaying_error = false;
66 9ffd10ce Kostas Papadimitriou
            this.error_stack_index = [];
67 9ffd10ce Kostas Papadimitriou
            this.error_stack = {};
68 dc020cf6 Kostas Papadimitriou
        },
69 dc020cf6 Kostas Papadimitriou
70 dc020cf6 Kostas Papadimitriou
        error_object: function() {
71 dc020cf6 Kostas Papadimitriou
            return {ns:this.ns, code:this.code, message:this.message, details:this.details};
72 dc020cf6 Kostas Papadimitriou
        },
73 dc020cf6 Kostas Papadimitriou
74 dc020cf6 Kostas Papadimitriou
        report_error: function() {
75 dc020cf6 Kostas Papadimitriou
            this.feedback_view = this.feedback_view || ui.main.feedback_view;
76 edd1d565 Kostas Papadimitriou
            this.hide(false);
77 9ffd10ce Kostas Papadimitriou
            this.displaying_error = true;
78 9ffd10ce Kostas Papadimitriou
79 edd1d565 Kostas Papadimitriou
            window.setTimeout(_.bind(function() {
80 edd1d565 Kostas Papadimitriou
                this.feedback_view.show(this.get_report_message(), true, {error: this.error_object()});
81 edd1d565 Kostas Papadimitriou
            }, this), 400);
82 dc020cf6 Kostas Papadimitriou
        },
83 dc020cf6 Kostas Papadimitriou
84 dc020cf6 Kostas Papadimitriou
        get_report_message: function() {
85 dc020cf6 Kostas Papadimitriou
            var fdb_msg =   "Error report\n" +
86 dc020cf6 Kostas Papadimitriou
                "-------------------" + "\n" +
87 dc020cf6 Kostas Papadimitriou
                "Code: " + this.code + "\n" + 
88 dc020cf6 Kostas Papadimitriou
                "Type: " + this.type + "\n" +
89 dc020cf6 Kostas Papadimitriou
                "Message: " + this.message + "\n" +
90 dc020cf6 Kostas Papadimitriou
                "Module: " + this.ns + "\n" +
91 dc020cf6 Kostas Papadimitriou
                "Details: " + this.details + "\n\n" +
92 dc020cf6 Kostas Papadimitriou
                "Please describe the actions that triggered the error:\n"
93 dc020cf6 Kostas Papadimitriou
            
94 dc020cf6 Kostas Papadimitriou
            return fdb_msg;
95 dc020cf6 Kostas Papadimitriou
        },
96 edd1d565 Kostas Papadimitriou
        
97 dc020cf6 Kostas Papadimitriou
        show_error: function(ns, code, message, type, details, error_options) {
98 9ffd10ce Kostas Papadimitriou
            
99 edd1d565 Kostas Papadimitriou
            var error_entry = [ns, code, message, type, details, error_options];
100 9ffd10ce Kostas Papadimitriou
            var last_error_key = this.update_errors_stack(error_entry);
101 9ffd10ce Kostas Papadimitriou
            
102 9ffd10ce Kostas Papadimitriou
            if (!this.is_visible && !this.displaying_error) {
103 9ffd10ce Kostas Papadimitriou
                this.current_error = last_error_key;
104 9ffd10ce Kostas Papadimitriou
                this.display_error.call(this, last_error_key);
105 9ffd10ce Kostas Papadimitriou
                this.show();
106 9ffd10ce Kostas Papadimitriou
            }
107 9ffd10ce Kostas Papadimitriou
108 9ffd10ce Kostas Papadimitriou
            this.update_errors_stack();
109 9ffd10ce Kostas Papadimitriou
        },
110 9ffd10ce Kostas Papadimitriou
111 9ffd10ce Kostas Papadimitriou
        update_errors_stack: function(entry) {
112 9ffd10ce Kostas Papadimitriou
            if (snf.api.error_state != snf.api.STATES.ERROR) { 
113 9ffd10ce Kostas Papadimitriou
                this.error_stack = {};
114 9ffd10ce Kostas Papadimitriou
                this.error_stack_index = [];
115 9ffd10ce Kostas Papadimitriou
            };
116 9ffd10ce Kostas Papadimitriou
117 9ffd10ce Kostas Papadimitriou
            var stack_key = (new Date()).getTime();
118 9ffd10ce Kostas Papadimitriou
            this.error_stack[stack_key] = entry;
119 9ffd10ce Kostas Papadimitriou
            this.error_stack_index.push(stack_key);
120 9ffd10ce Kostas Papadimitriou
            this.errors_occured = this.error_stack_index.length;
121 9ffd10ce Kostas Papadimitriou
            
122 9ffd10ce Kostas Papadimitriou
            this.$(".error-nav").hide();
123 9ffd10ce Kostas Papadimitriou
            //this.update_errors_stack_layout();
124 9ffd10ce Kostas Papadimitriou
            return stack_key;
125 edd1d565 Kostas Papadimitriou
        },
126 edd1d565 Kostas Papadimitriou
127 9ffd10ce Kostas Papadimitriou
        is_last_error: function(stack_key) {
128 9ffd10ce Kostas Papadimitriou
            return this.error_stack_index.indexOf(stack_key) == this.error_stack_index.length - 1;
129 9ffd10ce Kostas Papadimitriou
        },
130 9ffd10ce Kostas Papadimitriou
131 9ffd10ce Kostas Papadimitriou
        is_first_error: function(stack_key) {
132 9ffd10ce Kostas Papadimitriou
            return this.error_stack_index.indexOf(stack_key) == 0;
133 9ffd10ce Kostas Papadimitriou
        },
134 9ffd10ce Kostas Papadimitriou
135 9ffd10ce Kostas Papadimitriou
        update_errors_stack_layout: function() {
136 9ffd10ce Kostas Papadimitriou
            if (!this.current_error) { return };
137 9ffd10ce Kostas Papadimitriou
138 9ffd10ce Kostas Papadimitriou
            if (this.errors_occured <= 1) {
139 9ffd10ce Kostas Papadimitriou
                this.$(".error-nav").hide();
140 9ffd10ce Kostas Papadimitriou
            } else {
141 9ffd10ce Kostas Papadimitriou
                this.$(".error-nav").show();
142 9ffd10ce Kostas Papadimitriou
            };
143 9ffd10ce Kostas Papadimitriou
            
144 9ffd10ce Kostas Papadimitriou
            if (this.is_last_error(this.current_error)) {
145 9ffd10ce Kostas Papadimitriou
                this.$(".show-next").hide();
146 9ffd10ce Kostas Papadimitriou
            } else {
147 9ffd10ce Kostas Papadimitriou
                this.$(".show-next").show();
148 9ffd10ce Kostas Papadimitriou
            }
149 9ffd10ce Kostas Papadimitriou
150 9ffd10ce Kostas Papadimitriou
            if (this.is_first_error(this.current_error)) {
151 9ffd10ce Kostas Papadimitriou
                this.$(".show-prev").hide();
152 9ffd10ce Kostas Papadimitriou
            } else {
153 9ffd10ce Kostas Papadimitriou
                this.$(".show-prev").show();
154 9ffd10ce Kostas Papadimitriou
            }
155 9ffd10ce Kostas Papadimitriou
        },
156 9ffd10ce Kostas Papadimitriou
157 9ffd10ce Kostas Papadimitriou
        show_next_error: function() {
158 9ffd10ce Kostas Papadimitriou
        },
159 9ffd10ce Kostas Papadimitriou
160 9ffd10ce Kostas Papadimitriou
        show_prev_error: function() {
161 9ffd10ce Kostas Papadimitriou
        },
162 9ffd10ce Kostas Papadimitriou
163 9ffd10ce Kostas Papadimitriou
        display_error: function(stack_key) {
164 9ffd10ce Kostas Papadimitriou
            var err = this.error_stack[stack_key];
165 9ffd10ce Kostas Papadimitriou
            var ns = err[0], code = err[1], message = err[2], type = err[3], details = err[4], error_options = err[5]
166 9ffd10ce Kostas Papadimitriou
167 9ce969a7 Kostas Papadimitriou
            this.error_options = {'allow_report': true, 'allow_reload': true, 
168 9ce969a7 Kostas Papadimitriou
                'extra_details': {}, 'non_critical': false, 
169 9ffd10ce Kostas Papadimitriou
                'allow_details': false,
170 9ffd10ce Kostas Papadimitriou
                'allow_close': true };
171 9ce969a7 Kostas Papadimitriou
            
172 dc020cf6 Kostas Papadimitriou
            if (error_options) {
173 dc020cf6 Kostas Papadimitriou
                this.error_options = _.extend(this.error_options, error_options);
174 dc020cf6 Kostas Papadimitriou
            }
175 dc020cf6 Kostas Papadimitriou
176 dc020cf6 Kostas Papadimitriou
            this.code = code;
177 dc020cf6 Kostas Papadimitriou
            this.ns = ns;
178 dc020cf6 Kostas Papadimitriou
            this.type = type;
179 dc020cf6 Kostas Papadimitriou
            this.details = details ? (details.toString ? details.toString() : details) : undefined;
180 dc020cf6 Kostas Papadimitriou
            this.message = message;
181 9ce969a7 Kostas Papadimitriou
            this.title = error_options.title || undefined;
182 dc020cf6 Kostas Papadimitriou
183 dc020cf6 Kostas Papadimitriou
            this.update_details();
184 dc020cf6 Kostas Papadimitriou
            
185 dc020cf6 Kostas Papadimitriou
            if (error_options.non_critical) {
186 dc020cf6 Kostas Papadimitriou
                this.el.addClass("non-critical");
187 6a3a5bf7 Kostas Papadimitriou
                this.error_options.allow_details = false;
188 dc020cf6 Kostas Papadimitriou
            } else {
189 dc020cf6 Kostas Papadimitriou
                this.el.removeClass("non-critical");
190 6a3a5bf7 Kostas Papadimitriou
                this.error_options.allow_details = true;
191 dc020cf6 Kostas Papadimitriou
            }
192 6a3a5bf7 Kostas Papadimitriou
            
193 9ce969a7 Kostas Papadimitriou
            if (APP_DEBUG) {
194 9ce969a7 Kostas Papadimitriou
                this.error_options.allow_details = true;
195 9ce969a7 Kostas Papadimitriou
            }
196 9ce969a7 Kostas Papadimitriou
            
197 dc020cf6 Kostas Papadimitriou
            this.$(".actions .show-details").click();
198 9ffd10ce Kostas Papadimitriou
            this.$(".error-details").hide();
199 dc020cf6 Kostas Papadimitriou
            this.$(".key.details").click();
200 dc020cf6 Kostas Papadimitriou
            this.$(".error-more-details").hide();
201 dc020cf6 Kostas Papadimitriou
        },
202 dc020cf6 Kostas Papadimitriou
203 dc020cf6 Kostas Papadimitriou
        update_details: function() {
204 dc020cf6 Kostas Papadimitriou
            var title = "Application error";
205 dc020cf6 Kostas Papadimitriou
            if (this.ns && this.type) {
206 b15a0cc4 Kostas Papadimitriou
                title = this.title || this.type + " Error";
207 dc020cf6 Kostas Papadimitriou
            }
208 9ce969a7 Kostas Papadimitriou
209 dc020cf6 Kostas Papadimitriou
            this.$(".header .title").text(title);
210 dc020cf6 Kostas Papadimitriou
            this.$(".error-code").text(this.code || "");
211 dc020cf6 Kostas Papadimitriou
            this.$(".error-type").text(this.type || "");
212 dc020cf6 Kostas Papadimitriou
            this.$(".error-module").text(this.ns || "");
213 dc020cf6 Kostas Papadimitriou
            this.$(".message p").text(this.message || "");
214 dc020cf6 Kostas Papadimitriou
            this.$(".error-more-details p").html(this.details || "no info");
215 dc020cf6 Kostas Papadimitriou
216 dc020cf6 Kostas Papadimitriou
            this.$(".extra-details").remove();
217 dc020cf6 Kostas Papadimitriou
            _.each(this.error_options.extra_details, function(value, key){
218 dc020cf6 Kostas Papadimitriou
                var opt = $(('<span class="extra-details key">{0}</span>' +
219 dc020cf6 Kostas Papadimitriou
                            '<span class="extra-details value">{1}</span>').format(key, value))
220 dc020cf6 Kostas Papadimitriou
                this.$(".value.error-type").after(opt);
221 dc020cf6 Kostas Papadimitriou
            })
222 dc020cf6 Kostas Papadimitriou
223 dc020cf6 Kostas Papadimitriou
        },
224 dc020cf6 Kostas Papadimitriou
225 dc020cf6 Kostas Papadimitriou
        beforeOpen: function() {
226 dc020cf6 Kostas Papadimitriou
            this.$(".error-details").hide();
227 a59437e9 Kostas Papadimitriou
            this.$(".key.details").addClass("expand");
228 dc020cf6 Kostas Papadimitriou
            this.$(".show-details").show();
229 dc020cf6 Kostas Papadimitriou
            this.$(".hide-details").hide();
230 6a3a5bf7 Kostas Papadimitriou
            
231 6a3a5bf7 Kostas Papadimitriou
            if (this.error_options.allow_details) {
232 6a3a5bf7 Kostas Papadimitriou
                this.$(".show-details").show();
233 6a3a5bf7 Kostas Papadimitriou
            } else {
234 6a3a5bf7 Kostas Papadimitriou
                this.$(".show-details").hide();
235 6a3a5bf7 Kostas Papadimitriou
            }
236 dc020cf6 Kostas Papadimitriou
237 dc020cf6 Kostas Papadimitriou
            if (this.error_options.allow_report) {
238 dc020cf6 Kostas Papadimitriou
                this.$(".report-error").show();
239 dc020cf6 Kostas Papadimitriou
            } else {
240 dc020cf6 Kostas Papadimitriou
                this.$(".report-error").hide();
241 dc020cf6 Kostas Papadimitriou
            }
242 dc020cf6 Kostas Papadimitriou
243 dc020cf6 Kostas Papadimitriou
            if (this.error_options.allow_reload) {
244 dc020cf6 Kostas Papadimitriou
                this.$(".reload-app").show();
245 dc020cf6 Kostas Papadimitriou
            } else {
246 dc020cf6 Kostas Papadimitriou
                this.$(".reload-app").hide();
247 dc020cf6 Kostas Papadimitriou
            }
248 9ce969a7 Kostas Papadimitriou
249 9ffd10ce Kostas Papadimitriou
            if (this.error_options.allow_close) {
250 9ffd10ce Kostas Papadimitriou
                this.$(".closeme").show();
251 9ffd10ce Kostas Papadimitriou
            } else {
252 9ffd10ce Kostas Papadimitriou
                this.$(".closeme").hide();
253 9ffd10ce Kostas Papadimitriou
            }
254 9ffd10ce Kostas Papadimitriou
255 9ce969a7 Kostas Papadimitriou
        },
256 9ce969a7 Kostas Papadimitriou
257 9ce969a7 Kostas Papadimitriou
        onOpen: function() {
258 9ffd10ce Kostas Papadimitriou
            this.displaying_error = true;
259 9ce969a7 Kostas Papadimitriou
            var self = this;
260 9ce969a7 Kostas Papadimitriou
261 9ce969a7 Kostas Papadimitriou
            this.$(".closeme").unbind("click");
262 9ce969a7 Kostas Papadimitriou
            this.$(".closeme").bind("click", function(){
263 9ffd10ce Kostas Papadimitriou
                self.hide("reset");
264 9ce969a7 Kostas Papadimitriou
            })
265 dc020cf6 Kostas Papadimitriou
        },
266 dc020cf6 Kostas Papadimitriou
267 edd1d565 Kostas Papadimitriou
        hide: function(reset_state) {
268 9ffd10ce Kostas Papadimitriou
            if (reset_state === "reset") {
269 9ffd10ce Kostas Papadimitriou
                // delay reset error state for fade out
270 9ffd10ce Kostas Papadimitriou
                window.setTimeout(_.bind(function(){
271 9ffd10ce Kostas Papadimitriou
                    this.displaying_error = false;
272 9ffd10ce Kostas Papadimitriou
                    this.error_stack = {};
273 9ffd10ce Kostas Papadimitriou
                    snf.api.trigger("reset");
274 9ffd10ce Kostas Papadimitriou
                }, this), 500);
275 9ffd10ce Kostas Papadimitriou
            } else {
276 9ffd10ce Kostas Papadimitriou
                this.displaying_error = false;
277 9ffd10ce Kostas Papadimitriou
            }
278 edd1d565 Kostas Papadimitriou
            views.ErrorView.__super__.hide.apply(this);
279 edd1d565 Kostas Papadimitriou
        },
280 edd1d565 Kostas Papadimitriou
281 edd1d565 Kostas Papadimitriou
        onClose: function(reset_state) {
282 dc020cf6 Kostas Papadimitriou
            this.trigger("close", this);
283 dc020cf6 Kostas Papadimitriou
        }
284 dc020cf6 Kostas Papadimitriou
    });
285 dc020cf6 Kostas Papadimitriou
286 dc020cf6 Kostas Papadimitriou
})(this);