alertify-rails 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c930f5a16b5d39584d064d045a7ab872ec67df1
4
+ data.tar.gz: d9cf0e54dac707cafd0e4493fb950e3db92e592d
5
+ SHA512:
6
+ metadata.gz: e04d5fe1acb32540f8f52cdbe1c584ca7018f7f474ecdfd086d2f2b0d38552caac565d5972b13c4016717b581f37bbb8b61335983d5277b84e682efb22ca1822
7
+ data.tar.gz: af3cc1a64cbafa36048693d2abb91e211476719428e88a044f5dc6872bfebef938ac6ddebf8a0ae8eaca83f580b0396376cddd4d2974aa8c1afa80f31c89e5db
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # alertify-rails
2
2
 
3
- This gem provides [alertify.js](http://fabien-d.github.com/alertify.js) (v0.2.12) for Rails.
3
+ This gem provides [alertify.js](http://fabien-d.github.com/alertify.js) (v0.3.11) for Rails.
4
4
 
5
5
 
6
6
  ## Installation
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Alertify::Rails::VERSION
9
9
  gem.authors = ["Rudolf Schmidt"]
10
10
 
11
- gem.description = %q{Use Alertify.js with Rails 3}
12
- gem.summary = %q{This gem provides the Alertify.js driver for Rails 3 applications}
11
+ gem.description = %q{Use Alertify.js with Rails 3 and 4}
12
+ gem.summary = %q{This gem provides the Alertify.js driver for Rails 3 and 4 applications}
13
13
  gem.homepage = ""
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
@@ -0,0 +1,22 @@
1
+ module AlertifyHelper
2
+ ALERT_TYPES = [:error, :info, :success, :warning] unless const_defined?(:ALERT_TYPES)
3
+
4
+ def alertify_flash
5
+ jsReturn = javascript_tag()
6
+ flash.each do |type, message|
7
+ # Skip empty messages, e.g. for devise messages set to nothing in a locale file.
8
+ next if message.blank?
9
+
10
+ type = :success if type == :notice
11
+ type = :error if type == :alert
12
+ next unless ALERT_TYPES.include?(type)
13
+
14
+ js_alertify = ""
15
+ Array(message).each do |msg|
16
+ js_alertify << "alertify.#{type}('#{msg}');\n" if msg;
17
+ end
18
+ jsReturn = javascript_tag(js_alertify)
19
+ end
20
+ jsReturn.html_safe()
21
+ end
22
+ end
@@ -1,7 +1,7 @@
1
1
  module Alertify #:nodoc:
2
2
  module Rails #:nodoc:
3
- VERSION = "0.1.0"
4
- ALERTIFY_VERSION = "0.2.12"
3
+ VERSION = "0.2.0"
4
+ ALERTIFY_VERSION = "0.3.11"
5
5
 
6
6
  end
7
7
  end
@@ -3,16 +3,14 @@
3
3
  * An unobtrusive customizable JavaScript notification system
4
4
  *
5
5
  * @author Fabien Doiron <fabien.doiron@gmail.com>
6
- * @copyright Fabien Doiron 2012
6
+ * @copyright Fabien Doiron 2013
7
7
  * @license MIT <http://opensource.org/licenses/mit-license.php>
8
- * @link http://www.github.com/fabien-d
8
+ * @link http://fabien-d.github.com/alertify.js/
9
9
  * @module alertify
10
- * @version 0.2.12
10
+ * @version 0.3.11
11
11
  */
12
-
13
- /*global define*/
14
12
  (function (global, undefined) {
15
- "use strict";
13
+ "use strict";
16
14
 
17
15
  var document = global.document,
18
16
  Alertify;
@@ -24,7 +22,7 @@
24
22
  isopen = false,
25
23
  keys = { ENTER: 13, ESC: 27, SPACE: 32 },
26
24
  queue = [],
27
- $, elCallee, elCover, elDialog, elLog;
25
+ $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;
28
26
 
29
27
  /**
30
28
  * Markup pieces
@@ -33,15 +31,45 @@
33
31
  dialogs = {
34
32
  buttons : {
35
33
  holder : "<nav class=\"alertify-buttons\">{{buttons}}</nav>",
36
- submit : "<button type=\"submit\" class=\"alertify-button alertify-button-ok\" id=\"alertify-ok\" />{{ok}}</button>",
37
- ok : "<a href=\"#\" class=\"alertify-button alertify-button-ok\" id=\"alertify-ok\">{{ok}}</a>",
38
- cancel : "<a href=\"#\" class=\"alertify-button alertify-button-cancel\" id=\"alertify-cancel\">{{cancel}}</a>"
34
+ submit : "<button type=\"submit\" class=\"alertify-button alertify-button-ok\" id=\"alertify-ok\">{{ok}}</button>",
35
+ ok : "<button class=\"alertify-button alertify-button-ok\" id=\"alertify-ok\">{{ok}}</button>",
36
+ cancel : "<button class=\"alertify-button alertify-button-cancel\" id=\"alertify-cancel\">{{cancel}}</button>"
39
37
  },
40
- input : "<input type=\"text\" class=\"alertify-text\" id=\"alertify-text\">",
38
+ input : "<div class=\"alertify-text-wrapper\"><input type=\"text\" class=\"alertify-text\" id=\"alertify-text\"></div>",
41
39
  message : "<p class=\"alertify-message\">{{message}}</p>",
42
40
  log : "<article class=\"alertify-log{{class}}\">{{message}}</article>"
43
41
  };
44
42
 
43
+ /**
44
+ * Return the proper transitionend event
45
+ * @return {String} Transition type string
46
+ */
47
+ getTransitionEvent = function () {
48
+ var t,
49
+ type,
50
+ supported = false,
51
+ el = document.createElement("fakeelement"),
52
+ transitions = {
53
+ "WebkitTransition" : "webkitTransitionEnd",
54
+ "MozTransition" : "transitionend",
55
+ "OTransition" : "otransitionend",
56
+ "transition" : "transitionend"
57
+ };
58
+
59
+ for (t in transitions) {
60
+ if (el.style[t] !== undefined) {
61
+ type = transitions[t];
62
+ supported = true;
63
+ break;
64
+ }
65
+ }
66
+
67
+ return {
68
+ type : type,
69
+ supported : supported
70
+ };
71
+ };
72
+
45
73
  /**
46
74
  * Shorthand for document.getElementById()
47
75
  *
@@ -73,6 +101,24 @@
73
101
  */
74
102
  delay : 5000,
75
103
 
104
+ /**
105
+ * Whether buttons are reversed (default is secondary/primary)
106
+ * @type {Boolean}
107
+ */
108
+ buttonReverse : false,
109
+
110
+ /**
111
+ * Which button should be focused by default
112
+ * @type {String} "ok" (default), "cancel", or "none"
113
+ */
114
+ buttonFocus : "ok",
115
+
116
+ /**
117
+ * Set the transition event on load
118
+ * @type {[type]}
119
+ */
120
+ transition : undefined,
121
+
76
122
  /**
77
123
  * Set the proper button click events
78
124
  *
@@ -81,12 +127,7 @@
81
127
  * @return {undefined}
82
128
  */
83
129
  addListeners : function (fn) {
84
- var btnReset = $("alertify-resetFocus"),
85
- btnOK = $("alertify-ok") || undefined,
86
- btnCancel = $("alertify-cancel") || undefined,
87
- input = $("alertify-text") || undefined,
88
- form = $("alertify-form") || undefined,
89
- hasOK = (typeof btnOK !== "undefined"),
130
+ var hasOK = (typeof btnOK !== "undefined"),
90
131
  hasCancel = (typeof btnCancel !== "undefined"),
91
132
  hasInput = (typeof input !== "undefined"),
92
133
  val = "",
@@ -98,7 +139,13 @@
98
139
  if (typeof event.preventDefault !== "undefined") event.preventDefault();
99
140
  common(event);
100
141
  if (typeof input !== "undefined") val = input.value;
101
- if (typeof fn === "function") fn(true, val);
142
+ if (typeof fn === "function") {
143
+ if (typeof input !== "undefined") {
144
+ fn(true, val);
145
+ }
146
+ else fn(true);
147
+ }
148
+ return false;
102
149
  };
103
150
 
104
151
  // cancel event handler
@@ -106,6 +153,7 @@
106
153
  if (typeof event.preventDefault !== "undefined") event.preventDefault();
107
154
  common(event);
108
155
  if (typeof fn === "function") fn(false);
156
+ return false;
109
157
  };
110
158
 
111
159
  // common event handler (keyup, ok and cancel)
@@ -113,7 +161,6 @@
113
161
  self.hide();
114
162
  self.unbind(document.body, "keyup", key);
115
163
  self.unbind(btnReset, "focus", reset);
116
- if (hasInput) self.unbind(form, "submit", ok);
117
164
  if (hasOK) self.unbind(btnOK, "click", ok);
118
165
  if (hasCancel) self.unbind(btnCancel, "click", cancel);
119
166
  };
@@ -121,15 +168,15 @@
121
168
  // keyup handler
122
169
  key = function (event) {
123
170
  var keyCode = event.keyCode;
124
- if (keyCode === keys.SPACE && !hasInput) ok(event);
171
+ if ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);
125
172
  if (keyCode === keys.ESC && hasCancel) cancel(event);
126
173
  };
127
174
 
128
175
  // reset focus to first item in the dialog
129
176
  reset = function (event) {
130
177
  if (hasInput) input.focus();
131
- else if (hasCancel) btnCancel.focus();
132
- else btnOK.focus();
178
+ else if (!hasCancel || self.buttonReverse) btnOK.focus();
179
+ else btnCancel.focus();
133
180
  };
134
181
 
135
182
  // handle reset focus link
@@ -137,22 +184,16 @@
137
184
  // ever leave the dialog box until an action has
138
185
  // been taken
139
186
  this.bind(btnReset, "focus", reset);
187
+ this.bind(btnResetBack, "focus", reset);
140
188
  // handle OK click
141
189
  if (hasOK) this.bind(btnOK, "click", ok);
142
190
  // handle Cancel click
143
191
  if (hasCancel) this.bind(btnCancel, "click", cancel);
144
192
  // listen for keys, Cancel => ESC
145
193
  this.bind(document.body, "keyup", key);
146
- // bind form submit
147
- if (hasInput) this.bind(form, "submit", ok);
148
- // set focus on OK button or the input text
149
- global.setTimeout(function () {
150
- if (input) {
151
- input.focus();
152
- input.select();
153
- }
154
- else btnOK.focus();
155
- }, 50);
194
+ if (!this.transition.supported) {
195
+ this.setFocus();
196
+ }
156
197
  },
157
198
 
158
199
  /**
@@ -172,6 +213,35 @@
172
213
  }
173
214
  },
174
215
 
216
+ /**
217
+ * Use alertify as the global error handler (using window.onerror)
218
+ *
219
+ * @return {boolean} success
220
+ */
221
+ handleErrors : function () {
222
+ if (typeof global.onerror !== "undefined") {
223
+ var self = this;
224
+ global.onerror = function (msg, url, line) {
225
+ self.error("[" + msg + " on line " + line + " of " + url + "]", 0);
226
+ };
227
+ return true;
228
+ } else {
229
+ return false;
230
+ }
231
+ },
232
+
233
+ /**
234
+ * Append button HTML strings
235
+ *
236
+ * @param {String} secondary The secondary button HTML string
237
+ * @param {String} primary The primary button HTML string
238
+ *
239
+ * @return {String} The appended button HTML strings
240
+ */
241
+ appendButtons : function (secondary, primary) {
242
+ return this.buttonReverse ? primary + secondary : secondary + primary;
243
+ },
244
+
175
245
  /**
176
246
  * Build the proper message box
177
247
  *
@@ -182,11 +252,16 @@
182
252
  build : function (item) {
183
253
  var html = "",
184
254
  type = item.type,
185
- message = item.message;
255
+ message = item.message,
256
+ css = item.cssClass || "";
186
257
 
187
258
  html += "<div class=\"alertify-dialog\">";
259
+ html += "<a id=\"alertify-resetFocusBack\" class=\"alertify-resetFocus\" href=\"#\">Reset Focus</a>";
188
260
 
189
- if (type === "prompt") html += "<form id=\"alertify-form\">";
261
+ if (_alertify.buttonFocus === "none") html += "<a href=\"#\" id=\"alertify-noneFocus\" class=\"alertify-hidden\"></a>";
262
+
263
+ // doens't require an actual form
264
+ if (type === "prompt") html += "<div id=\"alertify-form\">";
190
265
 
191
266
  html += "<article class=\"alertify-inner\">";
192
267
  html += dialogs.message.replace("{{message}}", message);
@@ -196,18 +271,18 @@
196
271
  html += dialogs.buttons.holder;
197
272
  html += "</article>";
198
273
 
199
- if (type === "prompt") html += "</form>";
274
+ if (type === "prompt") html += "</div>";
200
275
 
201
276
  html += "<a id=\"alertify-resetFocus\" class=\"alertify-resetFocus\" href=\"#\">Reset Focus</a>";
202
277
  html += "</div>";
203
278
 
204
279
  switch (type) {
205
280
  case "confirm":
206
- html = html.replace("{{buttons}}", dialogs.buttons.cancel + dialogs.buttons.ok);
281
+ html = html.replace("{{buttons}}", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));
207
282
  html = html.replace("{{ok}}", this.labels.ok).replace("{{cancel}}", this.labels.cancel);
208
283
  break;
209
284
  case "prompt":
210
- html = html.replace("{{buttons}}", dialogs.buttons.cancel + dialogs.buttons.submit);
285
+ html = html.replace("{{buttons}}", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));
211
286
  html = html.replace("{{ok}}", this.labels.ok).replace("{{cancel}}", this.labels.cancel);
212
287
  break;
213
288
  case "alert":
@@ -218,7 +293,7 @@
218
293
  break;
219
294
  }
220
295
 
221
- elDialog.className = "alertify alertify-show alertify-" + type;
296
+ elDialog.className = "alertify alertify-" + type + " " + css;
222
297
  elCover.className = "alertify-cover";
223
298
  return html;
224
299
  },
@@ -227,18 +302,49 @@
227
302
  * Close the log messages
228
303
  *
229
304
  * @param {Object} elem HTML Element of log message to close
230
- * @param {Number} wait [optional] Time (in ms) to wait before automatically hiding the message
305
+ * @param {Number} wait [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide
231
306
  *
232
307
  * @return {undefined}
233
308
  */
234
309
  close : function (elem, wait) {
235
- var timer = (wait && !isNaN(wait)) ? +wait : this.delay; // Unary Plus: +"2" === 2
310
+ // Unary Plus: +"2" === 2
311
+ var timer = (wait && !isNaN(wait)) ? +wait : this.delay,
312
+ self = this,
313
+ hideElement, transitionDone;
314
+
315
+ // set click event on log messages
236
316
  this.bind(elem, "click", function () {
237
- elLog.removeChild(elem);
317
+ hideElement(elem);
238
318
  });
239
- setTimeout(function () {
240
- if (typeof elem !== "undefined" && elem.parentNode === elLog) elLog.removeChild(elem);
241
- }, timer);
319
+ // Hide the dialog box after transition
320
+ // This ensure it doens't block any element from being clicked
321
+ transitionDone = function (event) {
322
+ event.stopPropagation();
323
+ // unbind event so function only gets called once
324
+ self.unbind(this, self.transition.type, transitionDone);
325
+ // remove log message
326
+ elLog.removeChild(this);
327
+ if (!elLog.hasChildNodes()) elLog.className += " alertify-logs-hidden";
328
+ };
329
+ // this sets the hide class to transition out
330
+ // or removes the child if css transitions aren't supported
331
+ hideElement = function (el) {
332
+ // ensure element exists
333
+ if (typeof el !== "undefined" && el.parentNode === elLog) {
334
+ // whether CSS transition exists
335
+ if (self.transition.supported) {
336
+ self.bind(el, self.transition.type, transitionDone);
337
+ el.className += " alertify-log-hide";
338
+ } else {
339
+ elLog.removeChild(el);
340
+ if (!elLog.hasChildNodes()) elLog.className += " alertify-logs-hidden";
341
+ }
342
+ }
343
+ };
344
+ // never close (until click) if wait is set to 0
345
+ if (wait === 0) return;
346
+ // set timeout to auto close the log message
347
+ setTimeout(function () { hideElement(elem); }, timer);
242
348
  },
243
349
 
244
350
  /**
@@ -248,10 +354,11 @@
248
354
  * @param {String} type Type of dialog to create
249
355
  * @param {Function} fn [Optional] Callback function
250
356
  * @param {String} placeholder [Optional] Default value for prompt input field
357
+ * @param {String} cssClass [Optional] Class(es) to append to dialog box
251
358
  *
252
359
  * @return {Object}
253
360
  */
254
- dialog : function (message, type, fn, placeholder) {
361
+ dialog : function (message, type, fn, placeholder, cssClass) {
255
362
  // set the current active element
256
363
  // this allows the keyboard focus to be resetted
257
364
  // after the dialog box is closed
@@ -259,7 +366,7 @@
259
366
  // check to ensure the alertify dialog element
260
367
  // has been successfully created
261
368
  var check = function () {
262
- if (elDialog && elDialog.scrollTop !== null) return;
369
+ if ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;
263
370
  else check();
264
371
  };
265
372
  // error catching
@@ -267,12 +374,10 @@
267
374
  if (typeof type !== "string") throw new Error("type must be a string");
268
375
  if (typeof fn !== "undefined" && typeof fn !== "function") throw new Error("fn must be a function");
269
376
  // initialize alertify if it hasn't already been done
270
- if (typeof this.init === "function") {
271
- this.init();
272
- check();
273
- }
377
+ this.init();
378
+ check();
274
379
 
275
- queue.push({ type: type, message: message, callback: fn, placeholder: placeholder });
380
+ queue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });
276
381
  if (!isopen) this.setup();
277
382
 
278
383
  return this;
@@ -286,7 +391,11 @@
286
391
  * @return {Function}
287
392
  */
288
393
  extend : function (type) {
289
- return function (message, wait) { this.log(message, type, wait); };
394
+ if (typeof type !== "string") throw new Error("extend method must have exactly one paramter");
395
+ return function (message, wait) {
396
+ this.log(message, type, wait);
397
+ return this;
398
+ };
290
399
  },
291
400
 
292
401
  /**
@@ -295,14 +404,29 @@
295
404
  * @return {undefined}
296
405
  */
297
406
  hide : function () {
407
+ var transitionDone,
408
+ self = this;
298
409
  // remove reference from queue
299
410
  queue.splice(0,1);
300
411
  // if items remaining in the queue
301
- if (queue.length > 0) this.setup();
412
+ if (queue.length > 0) this.setup(true);
302
413
  else {
303
414
  isopen = false;
304
- elDialog.className = "alertify alertify-hide alertify-hidden";
305
- elCover.className = "alertify-cover alertify-hidden";
415
+ // Hide the dialog box after transition
416
+ // This ensure it doens't block any element from being clicked
417
+ transitionDone = function (event) {
418
+ event.stopPropagation();
419
+ // unbind event so function only gets called once
420
+ self.unbind(elDialog, self.transition.type, transitionDone);
421
+ };
422
+ // whether CSS transition exists
423
+ if (this.transition.supported) {
424
+ this.bind(elDialog, this.transition.type, transitionDone);
425
+ elDialog.className = "alertify alertify-hide alertify-hidden";
426
+ } else {
427
+ elDialog.className = "alertify alertify-hide alertify-hidden alertify-isHidden";
428
+ }
429
+ elCover.className = "alertify-cover alertify-cover-hidden";
306
430
  // set focus to the last element or body
307
431
  // after the dialog is closed
308
432
  elCallee.focus();
@@ -321,26 +445,34 @@
321
445
  document.createElement("article");
322
446
  document.createElement("section");
323
447
  // cover
324
- elCover = document.createElement("div");
325
- elCover.setAttribute("id", "alertify-cover");
326
- elCover.className = "alertify-cover alertify-hidden";
327
- document.body.appendChild(elCover);
448
+ if ($("alertify-cover") == null) {
449
+ elCover = document.createElement("div");
450
+ elCover.setAttribute("id", "alertify-cover");
451
+ elCover.className = "alertify-cover alertify-cover-hidden";
452
+ document.body.appendChild(elCover);
453
+ }
328
454
  // main element
329
- elDialog = document.createElement("section");
330
- elDialog.setAttribute("id", "alertify");
331
- elDialog.className = "alertify alertify-hidden";
332
- document.body.appendChild(elDialog);
455
+ if ($("alertify") == null) {
456
+ isopen = false;
457
+ queue = [];
458
+ elDialog = document.createElement("section");
459
+ elDialog.setAttribute("id", "alertify");
460
+ elDialog.className = "alertify alertify-hidden";
461
+ document.body.appendChild(elDialog);
462
+ }
333
463
  // log element
334
- elLog = document.createElement("section");
335
- elLog.setAttribute("id", "alertify-logs");
336
- elLog.className = "alertify-logs";
337
- document.body.appendChild(elLog);
464
+ if ($("alertify-logs") == null) {
465
+ elLog = document.createElement("section");
466
+ elLog.setAttribute("id", "alertify-logs");
467
+ elLog.className = "alertify-logs alertify-logs-hidden";
468
+ document.body.appendChild(elLog);
469
+ }
338
470
  // set tabindex attribute on body element
339
471
  // this allows script to give it focus
340
472
  // after the dialog is closed
341
473
  document.body.setAttribute("tabindex", "0");
342
- // clean up init method
343
- delete this.init;
474
+ // set transition type
475
+ this.transition = getTransitionEvent();
344
476
  },
345
477
 
346
478
  /**
@@ -360,10 +492,10 @@
360
492
  else check();
361
493
  };
362
494
  // initialize alertify if it hasn't already been done
363
- if (typeof this.init === "function") {
364
- this.init();
365
- check();
366
- }
495
+ this.init();
496
+ check();
497
+
498
+ elLog.className = "alertify-logs";
367
499
  this.notify(message, type, wait);
368
500
  return this;
369
501
  },
@@ -383,8 +515,8 @@
383
515
  var log = document.createElement("article");
384
516
  log.className = "alertify-log" + ((typeof type === "string" && type !== "") ? " alertify-log-" + type : "");
385
517
  log.innerHTML = message;
386
- // prepend child
387
- elLog.insertBefore(log, elLog.firstChild);
518
+ // append child
519
+ elLog.appendChild(log);
388
520
  // triggers the CSS animation
389
521
  setTimeout(function() { log.className = log.className + " alertify-log-show"; }, 50);
390
522
  this.close(log, wait);
@@ -409,17 +541,55 @@
409
541
  }
410
542
  },
411
543
 
544
+ /**
545
+ * Common place to set focus to proper element
546
+ *
547
+ * @return {undefined}
548
+ */
549
+ setFocus : function () {
550
+ if (input) {
551
+ input.focus();
552
+ input.select();
553
+ }
554
+ else btnFocus.focus();
555
+ },
556
+
412
557
  /**
413
558
  * Initiate all the required pieces for the dialog box
414
559
  *
415
560
  * @return {undefined}
416
561
  */
417
- setup : function () {
418
- var item = queue[0];
562
+ setup : function (fromQueue) {
563
+ var item = queue[0],
564
+ self = this,
565
+ transitionDone;
419
566
 
567
+ // dialog is open
420
568
  isopen = true;
569
+ // Set button focus after transition
570
+ transitionDone = function (event) {
571
+ event.stopPropagation();
572
+ self.setFocus();
573
+ // unbind event so function only gets called once
574
+ self.unbind(elDialog, self.transition.type, transitionDone);
575
+ };
576
+ // whether CSS transition exists
577
+ if (this.transition.supported && !fromQueue) {
578
+ this.bind(elDialog, this.transition.type, transitionDone);
579
+ }
580
+ // build the proper dialog HTML
421
581
  elDialog.innerHTML = this.build(item);
422
- if (typeof item.placeholder === "string") $("alertify-text").value = item.placeholder;
582
+ // assign all the common elements
583
+ btnReset = $("alertify-resetFocus");
584
+ btnResetBack = $("alertify-resetFocusBack");
585
+ btnOK = $("alertify-ok") || undefined;
586
+ btnCancel = $("alertify-cancel") || undefined;
587
+ btnFocus = (_alertify.buttonFocus === "cancel") ? btnCancel : ((_alertify.buttonFocus === "none") ? $("alertify-noneFocus") : btnOK),
588
+ input = $("alertify-text") || undefined;
589
+ form = $("alertify-form") || undefined;
590
+ // add placeholder value to the input field
591
+ if (typeof item.placeholder === "string" && item.placeholder !== "") input.value = item.placeholder;
592
+ if (fromQueue) this.setFocus();
423
593
  this.addListeners(item.callback);
424
594
  },
425
595
 
@@ -442,26 +612,25 @@
442
612
  };
443
613
 
444
614
  return {
445
- alert : function (message, fn) { _alertify.dialog(message, "alert", fn); return this; },
446
- confirm : function (message, fn) { _alertify.dialog(message, "confirm", fn); return this; },
615
+ alert : function (message, fn, cssClass) { _alertify.dialog(message, "alert", fn, "", cssClass); return this; },
616
+ confirm : function (message, fn, cssClass) { _alertify.dialog(message, "confirm", fn, "", cssClass); return this; },
447
617
  extend : _alertify.extend,
448
618
  init : _alertify.init,
449
619
  log : function (message, type, wait) { _alertify.log(message, type, wait); return this; },
450
- prompt : function (message, fn, placeholder) { _alertify.dialog(message, "prompt", fn, placeholder); return this; },
620
+ prompt : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, "prompt", fn, placeholder, cssClass); return this; },
451
621
  success : function (message, wait) { _alertify.log(message, "success", wait); return this; },
452
622
  error : function (message, wait) { _alertify.log(message, "error", wait); return this; },
453
623
  set : function (args) { _alertify.set(args); },
454
- labels : _alertify.labels
624
+ labels : _alertify.labels,
625
+ debug : _alertify.handleErrors
455
626
  };
456
627
  };
457
628
 
458
629
  // AMD and window support
459
630
  if (typeof define === "function") {
460
631
  define([], function () { return new Alertify(); });
461
- } else {
462
- if (typeof global.alertify === "undefined") {
463
- global.alertify = new Alertify();
464
- }
632
+ } else if (typeof global.alertify === "undefined") {
633
+ global.alertify = new Alertify();
465
634
  }
466
635
 
467
636
  }(this));
@@ -1,6 +1,6 @@
1
+ .alertify,
1
2
  .alertify-show,
2
3
  .alertify-log {
3
- -webkit-transition: all 500ms cubic-bezier(0.175, 0.885, 0.320, 1); /* older webkit */
4
4
  -webkit-transition: all 500ms cubic-bezier(0.175, 0.885, 0.320, 1.275);
5
5
  -moz-transition: all 500ms cubic-bezier(0.175, 0.885, 0.320, 1.275);
6
6
  -ms-transition: all 500ms cubic-bezier(0.175, 0.885, 0.320, 1.275);
@@ -8,25 +8,48 @@
8
8
  transition: all 500ms cubic-bezier(0.175, 0.885, 0.320, 1.275); /* easeOutBack */
9
9
  }
10
10
  .alertify-hide {
11
- -webkit-transition: all 250ms cubic-bezier(0.600, 0, 0.735, 0.045); /* older webkit */
12
11
  -webkit-transition: all 250ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
13
12
  -moz-transition: all 250ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
14
13
  -ms-transition: all 250ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
15
14
  -o-transition: all 250ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
16
15
  transition: all 250ms cubic-bezier(0.600, -0.280, 0.735, 0.045); /* easeInBack */
17
16
  }
17
+ .alertify-log-hide {
18
+ -webkit-transition: all 500ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
19
+ -moz-transition: all 500ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
20
+ -ms-transition: all 500ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
21
+ -o-transition: all 500ms cubic-bezier(0.600, -0.280, 0.735, 0.045);
22
+ transition: all 500ms cubic-bezier(0.600, -0.280, 0.735, 0.045); /* easeInBack */
23
+ }
18
24
  .alertify-cover {
19
25
  position: fixed; z-index: 99999;
20
26
  top: 0; right: 0; bottom: 0; left: 0;
27
+ background-color:white;
28
+ filter:alpha(opacity=0);
29
+ opacity:0;
21
30
  }
31
+ .alertify-cover-hidden {
32
+ display: none;
33
+ }
22
34
  .alertify {
23
35
  position: fixed; z-index: 99999;
24
36
  top: 50px; left: 50%;
25
37
  width: 550px;
26
38
  margin-left: -275px;
39
+ opacity: 1;
27
40
  }
28
41
  .alertify-hidden {
29
- top: -50px;
42
+ -webkit-transform: translate(0,-150px);
43
+ -moz-transform: translate(0,-150px);
44
+ -ms-transform: translate(0,-150px);
45
+ -o-transform: translate(0,-150px);
46
+ transform: translate(0,-150px);
47
+ opacity: 0;
48
+ display: none;
49
+ }
50
+ /* overwrite display: none; for everything except IE6-8 */
51
+ :root *> .alertify-hidden {
52
+ display: block;
30
53
  visibility: hidden;
31
54
  }
32
55
  .alertify-logs {
@@ -35,15 +58,28 @@
35
58
  bottom: 10px;
36
59
  right: 10px;
37
60
  width: 300px;
61
+ }
62
+ .alertify-logs-hidden {
63
+ display: none;
38
64
  }
39
65
  .alertify-log {
40
66
  display: block;
41
67
  margin-top: 10px;
42
68
  position: relative;
43
69
  right: -300px;
70
+ opacity: 0;
44
71
  }
45
72
  .alertify-log-show {
46
73
  right: 0;
74
+ opacity: 1;
75
+ }
76
+ .alertify-log-hide {
77
+ -webkit-transform: translate(300px, 0);
78
+ -moz-transform: translate(300px, 0);
79
+ -ms-transform: translate(300px, 0);
80
+ -o-transform: translate(300px, 0);
81
+ transform: translate(300px, 0);
82
+ opacity: 0;
47
83
  }
48
84
  .alertify-dialog {
49
85
  padding: 25px;
@@ -71,7 +107,13 @@
71
107
  }
72
108
  .alertify-buttons {
73
109
  }
74
- .alertify-button {
110
+ .alertify-button,
111
+ .alertify-button:hover,
112
+ .alertify-button:active,
113
+ .alertify-button:visited {
114
+ background: none;
115
+ text-decoration: none;
116
+ border: none;
75
117
  /* line-height and font-size for input button */
76
118
  line-height: 1.5;
77
119
  font-size: 100%;
@@ -92,4 +134,4 @@
92
134
  left: 5%;
93
135
  margin: 0;
94
136
  }
95
- }
137
+ }
@@ -3,72 +3,79 @@
3
3
  */
4
4
  .alertify,
5
5
  .alertify-log {
6
- font-family: sans-serif;
6
+ font-family: sans-serif;
7
7
  }
8
8
  .alertify {
9
- background: #FFF;
10
- border: 10px solid #333; /* browsers that don't support rgba */
11
- border: 10px solid rgba(0,0,0,.7);
12
- border-radius: 8px;
13
- box-shadow: 0 3px 3px rgba(0,0,0,.3);
14
- -webkit-background-clip: padding; /* Safari 4? Chrome 6? */
15
- -moz-background-clip: padding; /* Firefox 3.6 */
16
- background-clip: padding-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
17
- }
18
- .alertify-text {
19
- border: 1px solid #CCC;
20
- padding: 10px;
21
- border-radius: 4px;
22
- }
23
- .alertify-button {
24
- border-radius: 4px;
25
- color: #FFF;
26
- font-weight: bold;
27
- padding: 6px 15px;
28
- text-decoration: none;
29
- text-shadow: 1px 1px 0 rgba(0,0,0,.5);
30
- box-shadow: inset 0 1px 0 0 rgba(255,255,255,.5);
31
- background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
32
- background-image: -moz-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
33
- background-image: -ms-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
34
- background-image: -o-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
35
- background-image: linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
36
- }
37
- .alertify-button:hover,
38
- .alertify-button:focus {
39
- outline: none;
40
- box-shadow: 0 0 15px #2B72D5;
41
- background-image: -webkit-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
42
- background-image: -moz-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
43
- background-image: -ms-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
44
- background-image: -o-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
45
- background-image: linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
46
- }
47
- .alertify-button:active {
48
- position: relative;
49
- top: 1px;
50
- }
51
- .alertify-button-cancel {
52
- background-color: #FE1A00;
53
- border: 1px solid #D83526;
54
- }
55
- .alertify-button-ok {
56
- background-color: #5CB811;
57
- border: 1px solid #3B7808;
9
+ background: #FFF;
10
+ border: 10px solid #333; /* browsers that don't support rgba */
11
+ border: 10px solid rgba(0,0,0,.7);
12
+ border-radius: 8px;
13
+ box-shadow: 0 3px 3px rgba(0,0,0,.3);
14
+ -webkit-background-clip: padding; /* Safari 4? Chrome 6? */
15
+ -moz-background-clip: padding; /* Firefox 3.6 */
16
+ background-clip: padding-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
58
17
  }
18
+ .alertify-text {
19
+ border: 1px solid #CCC;
20
+ padding: 10px;
21
+ border-radius: 4px;
22
+ }
23
+ .alertify-button {
24
+ border-radius: 4px;
25
+ color: #FFF;
26
+ font-weight: bold;
27
+ padding: 6px 15px;
28
+ text-decoration: none;
29
+ text-shadow: 1px 1px 0 rgba(0,0,0,.5);
30
+ box-shadow: inset 0 1px 0 0 rgba(255,255,255,.5);
31
+ background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
32
+ background-image: -moz-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
33
+ background-image: -ms-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
34
+ background-image: -o-linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
35
+ background-image: linear-gradient(top, rgba(255,255,255,.3), rgba(255,255,255,0));
36
+ }
37
+ .alertify-button:hover,
38
+ .alertify-button:focus {
39
+ outline: none;
40
+ background-image: -webkit-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
41
+ background-image: -moz-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
42
+ background-image: -ms-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
43
+ background-image: -o-linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
44
+ background-image: linear-gradient(top, rgba(0,0,0,.1), rgba(0,0,0,0));
45
+ }
46
+ .alertify-button:focus {
47
+ box-shadow: 0 0 15px #2B72D5;
48
+ }
49
+ .alertify-button:active {
50
+ position: relative;
51
+ box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
52
+ }
53
+ .alertify-button-cancel,
54
+ .alertify-button-cancel:hover,
55
+ .alertify-button-cancel:focus {
56
+ background-color: #FE1A00;
57
+ border: 1px solid #D83526;
58
+ }
59
+ .alertify-button-ok,
60
+ .alertify-button-ok:hover,
61
+ .alertify-button-ok:focus {
62
+ background-color: #5CB811;
63
+ border: 1px solid #3B7808;
64
+ }
65
+
59
66
  .alertify-log {
60
- background: #1F1F1F;
61
- background: rgba(0,0,0,.9);
62
- padding: 15px;
63
- border-radius: 4px;
64
- color: #FFF;
65
- text-shadow: -1px -1px 0 rgba(0,0,0,.5);
66
- }
67
- .alertify-log-error {
68
- background: #FE1A00;
69
- background: rgba(254,26,0,.9);
70
- }
71
- .alertify-log-success {
72
- background: #5CB811;
73
- background: rgba(92,184,17,.9);
67
+ background: #1F1F1F;
68
+ background: rgba(0,0,0,.9);
69
+ padding: 15px;
70
+ border-radius: 4px;
71
+ color: #FFF;
72
+ text-shadow: -1px -1px 0 rgba(0,0,0,.5);
74
73
  }
74
+ .alertify-log-error {
75
+ background: #FE1A00;
76
+ background: rgba(254,26,0,.9);
77
+ }
78
+ .alertify-log-success {
79
+ background: #5CB811;
80
+ background: rgba(92,184,17,.9);
81
+ }
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alertify-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Rudolf Schmidt
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
13
12
  dependencies: []
14
- description: Use Alertify.js with Rails 3
13
+ description: Use Alertify.js with Rails 3 and 4
15
14
  email:
16
15
  executables: []
17
16
  extensions: []
@@ -23,6 +22,7 @@ files:
23
22
  - README.md
24
23
  - Rakefile
25
24
  - alertify-rails.gemspec
25
+ - app/helpers/alertify_helper.rb
26
26
  - lib/alertify-rails.rb
27
27
  - lib/alertify/rails.rb
28
28
  - lib/alertify/rails/engine.rb
@@ -34,27 +34,26 @@ files:
34
34
  - vendor/assets/stylesheets/alertify.default.css.scss
35
35
  homepage: ''
36
36
  licenses: []
37
+ metadata: {}
37
38
  post_install_message:
38
39
  rdoc_options: []
39
40
  require_paths:
40
41
  - lib
41
42
  required_ruby_version: !ruby/object:Gem::Requirement
42
- none: false
43
43
  requirements:
44
- - - ! '>='
44
+ - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  required_rubygems_version: !ruby/object:Gem::Requirement
48
- none: false
49
48
  requirements:
50
- - - ! '>='
49
+ - - '>='
51
50
  - !ruby/object:Gem::Version
52
51
  version: '0'
53
52
  requirements: []
54
53
  rubyforge_project:
55
- rubygems_version: 1.8.24
54
+ rubygems_version: 2.2.2
56
55
  signing_key:
57
- specification_version: 3
58
- summary: This gem provides the Alertify.js driver for Rails 3 applications
56
+ specification_version: 4
57
+ summary: This gem provides the Alertify.js driver for Rails 3 and 4 applications
59
58
  test_files: []
60
59
  has_rdoc: