MDL-52127 js: check YUI modules with eslint
[moodle.git] / lib / yui / build / moodle-core-notification-exception / moodle-core-notification-exception.js
1 YUI.add('moodle-core-notification-exception', function (Y, NAME) {
3 /* eslint-disable */
4 var DIALOGUE_PREFIX,
5     BASE,
6     CONFIRMYES,
7     CONFIRMNO,
8     TITLE,
9     QUESTION,
10     CSS;
12 DIALOGUE_PREFIX = 'moodle-dialogue',
13 BASE = 'notificationBase',
14 CONFIRMYES = 'yesLabel',
15 CONFIRMNO = 'noLabel',
16 TITLE = 'title',
17 QUESTION = 'question',
18 CSS = {
19     BASE : 'moodle-dialogue-base',
20     WRAP : 'moodle-dialogue-wrap',
21     HEADER : 'moodle-dialogue-hd',
22     BODY : 'moodle-dialogue-bd',
23     CONTENT : 'moodle-dialogue-content',
24     FOOTER : 'moodle-dialogue-ft',
25     HIDDEN : 'hidden',
26     LIGHTBOX : 'moodle-dialogue-lightbox'
27 };
29 // Set up the namespace once.
30 M.core = M.core || {};
31 /**
32  * A dialogue type designed to display an appropriate error when a generic
33  * javascript error was thrown and caught.
34  *
35  * @module moodle-core-notification
36  * @submodule moodle-core-notification-exception
37  */
39 var EXCEPTION_NAME = 'Moodle exception',
40     EXCEPTION;
42 /**
43  * Extends core Dialogue to show the exception dialogue.
44  *
45  * @param {Object} config Object literal specifying the dialogue configuration properties.
46  * @constructor
47  * @class M.core.exception
48  * @extends M.core.dialogue
49  */
50 EXCEPTION = function(c) {
51     var config = Y.mix({}, c);
52     config.width = config.width || (M.cfg.developerdebug)?Math.floor(Y.one(document.body).get('winWidth')/3)+'px':null;
53     config.closeButton = true;
55     // We need to whitelist some properties which are part of the exception
56     // prototype, otherwise AttributeCore filters them during value normalisation.
57     var whitelist = [
58         'message',
59         'name',
60         'fileName',
61         'lineNumber',
62         'stack'
63     ];
64     Y.Array.each(whitelist, function(k) {
65         config[k] = c[k];
66     });
68     EXCEPTION.superclass.constructor.apply(this, [config]);
69 };
70 Y.extend(EXCEPTION, M.core.notification.info, {
71     _hideTimeout : null,
72     _keypress : null,
73     initializer : function(config) {
74         var content,
75             self = this,
76             delay = this.get('hideTimeoutDelay');
77         this.get(BASE).addClass('moodle-dialogue-exception');
78         this.setStdModContent(Y.WidgetStdMod.HEADER,
79                 '<h1 id="moodle-dialogue-'+config.COUNT+'-header-text">' + Y.Escape.html(config.name) + '</h1>',
80                 Y.WidgetStdMod.REPLACE);
81         content = Y.Node.create('<div class="moodle-exception"></div>')
82                 .append(Y.Node.create('<div class="moodle-exception-message">'+Y.Escape.html(this.get('message'))+'</div>'))
83                 .append(Y.Node.create('<div class="moodle-exception-param hidden param-filename"><label>File:</label> ' +
84                         Y.Escape.html(this.get('fileName'))+'</div>'))
85                 .append(Y.Node.create('<div class="moodle-exception-param hidden param-linenumber"><label>Line:</label> ' +
86                         Y.Escape.html(this.get('lineNumber'))+'</div>'))
87                 .append(Y.Node.create('<div class="moodle-exception-param hidden param-stacktrace">' +
88                                       '<label>Stack trace:</label> <pre>' +
89                         this.get('stack')+'</pre></div>'));
90         if (M.cfg.developerdebug) {
91             content.all('.moodle-exception-param').removeClass('hidden');
92         }
93         this.setStdModContent(Y.WidgetStdMod.BODY, content, Y.WidgetStdMod.REPLACE);
95         if (delay) {
96             this._hideTimeout = setTimeout(function(){self.hide();}, delay);
97         }
98         this.after('visibleChange', this.visibilityChanged, this);
99         this._keypress = Y.on('key', this.hide, window, 'down:13,27', this);
100         this.centerDialogue();
101     },
102     visibilityChanged : function(e) {
103         if (e.attrName === 'visible' && e.prevVal && !e.newVal) {
104             if (this._keypress) {
105                 this._keypress.detach();
106             }
107             var self = this;
108             setTimeout(function(){self.destroy();}, 1000);
109         }
110     }
111 }, {
112     NAME : EXCEPTION_NAME,
113     CSS_PREFIX : DIALOGUE_PREFIX,
114     ATTRS : {
115         /**
116          * The message of the alert.
117          *
118          * @attribute message
119          * @type String
120          * @default ''
121          */
122         message : {
123             value : ''
124         },
126         /**
127          * The name of the alert.
128          *
129          * @attribute title
130          * @type String
131          * @default ''
132          */
133         name : {
134             value : ''
135         },
137         /**
138          * The name of the file where the error was thrown.
139          *
140          * @attribute fileName
141          * @type String
142          * @default ''
143          */
144         fileName : {
145             value : ''
146         },
148         /**
149          * The line number where the error was thrown.
150          *
151          * @attribute lineNumber
152          * @type String
153          * @default ''
154          */
155         lineNumber : {
156             value : ''
157         },
159         /**
160          * The backtrace from the error
161          *
162          * @attribute lineNumber
163          * @type String
164          * @default ''
165          */
166         stack : {
167             setter : function(str) {
168                 var lines = Y.Escape.html(str).split("\n"),
169                     pattern = new RegExp('^(.+)@('+M.cfg.wwwroot+')?(.{0,75}).*:(\\d+)$'),
170                     i;
171                 for (i in lines) {
172                     lines[i] = lines[i].replace(pattern,
173                             "<div class='stacktrace-line'>ln: $4</div>" +
174                             "<div class='stacktrace-file'>$3</div>" +
175                             "<div class='stacktrace-call'>$1</div>");
176                 }
177                 return lines.join('');
178             },
179             value : ''
180         },
182         /**
183          * If set, the dialogue is hidden after the specified timeout period.
184          *
185          * @attribute hideTimeoutDelay
186          * @type Number
187          * @default null
188          * @optional
189          */
190         hideTimeoutDelay : {
191             validator : Y.Lang.isNumber,
192             value : null
193         }
194     }
195 });
197 M.core.exception = EXCEPTION;
200 }, '@VERSION@', {"requires": ["moodle-core-notification-dialogue"]});