unforassets 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +41 -39
  4. data/lib/unforassets/version.rb +1 -1
  5. data/vendor/assets/images/unforassets/jcrop/jcrop.gif +0 -0
  6. data/vendor/assets/javascripts/unforassets/accounting.js +4 -0
  7. data/vendor/assets/javascripts/unforassets/autonumeric.js +4 -0
  8. data/vendor/assets/javascripts/{big.js → unforassets/big.js} +0 -0
  9. data/vendor/assets/javascripts/unforassets/bootstrap-datetimepicker.js +2 -0
  10. data/vendor/assets/javascripts/unforassets/bootstrap-multiselect/plugins/collapsible-groups.js +92 -0
  11. data/vendor/assets/javascripts/unforassets/bootstrap-multiselect.js +1416 -0
  12. data/vendor/assets/javascripts/unforassets/chart.js +14 -0
  13. data/vendor/assets/javascripts/unforassets/jcrop.js +6 -0
  14. data/vendor/assets/javascripts/{jquery.blockui.js → unforassets/jquery-blockui.js} +0 -0
  15. data/vendor/assets/javascripts/unforassets/moment.js +505 -0
  16. data/vendor/assets/javascripts/unforassets/pnotify.js +31 -0
  17. data/vendor/assets/javascripts/unforassets/select2/i18n/ar.js +3 -0
  18. data/vendor/assets/javascripts/unforassets/select2/i18n/az.js +3 -0
  19. data/vendor/assets/javascripts/unforassets/select2/i18n/bg.js +3 -0
  20. data/vendor/assets/javascripts/unforassets/select2/i18n/ca.js +3 -0
  21. data/vendor/assets/javascripts/unforassets/select2/i18n/cs.js +3 -0
  22. data/vendor/assets/javascripts/unforassets/select2/i18n/da.js +3 -0
  23. data/vendor/assets/javascripts/unforassets/select2/i18n/de.js +3 -0
  24. data/vendor/assets/javascripts/unforassets/select2/i18n/el.js +3 -0
  25. data/vendor/assets/javascripts/unforassets/select2/i18n/en.js +3 -0
  26. data/vendor/assets/javascripts/unforassets/select2/i18n/es.js +3 -0
  27. data/vendor/assets/javascripts/unforassets/select2/i18n/et.js +3 -0
  28. data/vendor/assets/javascripts/unforassets/select2/i18n/eu.js +3 -0
  29. data/vendor/assets/javascripts/unforassets/select2/i18n/fa.js +3 -0
  30. data/vendor/assets/javascripts/unforassets/select2/i18n/fi.js +3 -0
  31. data/vendor/assets/javascripts/unforassets/select2/i18n/fr.js +3 -0
  32. data/vendor/assets/javascripts/unforassets/select2/i18n/gl.js +3 -0
  33. data/vendor/assets/javascripts/unforassets/select2/i18n/he.js +3 -0
  34. data/vendor/assets/javascripts/unforassets/select2/i18n/hi.js +3 -0
  35. data/vendor/assets/javascripts/unforassets/select2/i18n/hr.js +3 -0
  36. data/vendor/assets/javascripts/unforassets/select2/i18n/hu.js +3 -0
  37. data/vendor/assets/javascripts/unforassets/select2/i18n/id.js +3 -0
  38. data/vendor/assets/javascripts/unforassets/select2/i18n/is.js +3 -0
  39. data/vendor/assets/javascripts/unforassets/select2/i18n/it.js +3 -0
  40. data/vendor/assets/javascripts/unforassets/select2/i18n/ja.js +3 -0
  41. data/vendor/assets/javascripts/unforassets/select2/i18n/km.js +3 -0
  42. data/vendor/assets/javascripts/unforassets/select2/i18n/ko.js +3 -0
  43. data/vendor/assets/javascripts/unforassets/select2/i18n/lt.js +3 -0
  44. data/vendor/assets/javascripts/unforassets/select2/i18n/lv.js +3 -0
  45. data/vendor/assets/javascripts/unforassets/select2/i18n/mk.js +3 -0
  46. data/vendor/assets/javascripts/unforassets/select2/i18n/ms.js +3 -0
  47. data/vendor/assets/javascripts/unforassets/select2/i18n/nb.js +3 -0
  48. data/vendor/assets/javascripts/unforassets/select2/i18n/nl.js +3 -0
  49. data/vendor/assets/javascripts/unforassets/select2/i18n/pl.js +3 -0
  50. data/vendor/assets/javascripts/unforassets/select2/i18n/pt-BR.js +3 -0
  51. data/vendor/assets/javascripts/unforassets/select2/i18n/pt.js +3 -0
  52. data/vendor/assets/javascripts/unforassets/select2/i18n/ro.js +3 -0
  53. data/vendor/assets/javascripts/unforassets/select2/i18n/ru.js +3 -0
  54. data/vendor/assets/javascripts/unforassets/select2/i18n/sk.js +3 -0
  55. data/vendor/assets/javascripts/unforassets/select2/i18n/sr-Cyrl.js +3 -0
  56. data/vendor/assets/javascripts/unforassets/select2/i18n/sr.js +3 -0
  57. data/vendor/assets/javascripts/unforassets/select2/i18n/sv.js +3 -0
  58. data/vendor/assets/javascripts/unforassets/select2/i18n/th.js +3 -0
  59. data/vendor/assets/javascripts/unforassets/select2/i18n/tr.js +3 -0
  60. data/vendor/assets/javascripts/unforassets/select2/i18n/uk.js +3 -0
  61. data/vendor/assets/javascripts/unforassets/select2/i18n/vi.js +3 -0
  62. data/vendor/assets/javascripts/unforassets/select2/i18n/zh-CN.js +3 -0
  63. data/vendor/assets/javascripts/unforassets/select2/i18n/zh-TW.js +3 -0
  64. data/vendor/assets/javascripts/unforassets/select2.js +3 -0
  65. data/vendor/assets/javascripts/unforassets/tooltipster.js +2 -0
  66. data/vendor/assets/javascripts/unforassets/typeahead.js +2451 -0
  67. data/vendor/assets/javascripts/unforassets/undescore.js +6 -0
  68. data/vendor/assets/javascripts/unforassets/uri.js +151 -0
  69. data/vendor/assets/javascripts/unforassets/vex.js +2 -0
  70. data/vendor/assets/stylesheets/unforassets/bootstrap-datetimepicker.css +5 -0
  71. data/vendor/assets/stylesheets/unforassets/bootstrap-multiselect.css +1 -0
  72. data/vendor/assets/stylesheets/unforassets/jcrop.css +6 -0
  73. data/vendor/assets/stylesheets/unforassets/pnotify.css +10 -0
  74. data/vendor/assets/stylesheets/unforassets/select2.css +1 -0
  75. data/vendor/assets/stylesheets/unforassets/typeahead.css +77 -0
  76. metadata +91 -24
  77. data/vendor/assets/javascripts/tooltipster.bundle.js +0 -4260
  78. data/vendor/assets/javascripts/vex.combined.js +0 -1621
  79. /data/vendor/assets/javascripts/{fancybox.js → unforassets/fancybox.js} +0 -0
  80. /data/vendor/assets/javascripts/{tooltipster-plugin-scrollable-tip.js → unforassets/tooltipster/plugins/scrollable-tip.js} +0 -0
  81. /data/vendor/assets/javascripts/{tooltipster-plugin-svg.js → unforassets/tooltipster/plugins/svg.js} +0 -0
  82. /data/vendor/assets/stylesheets/{fancybox.css → unforassets/fancybox.css} +0 -0
  83. /data/vendor/assets/stylesheets/{tooltipster-sidetip-borderless.min.css → unforassets/tooltipster/themes/tooltipster-sidetip-borderless.css} +0 -0
  84. /data/vendor/assets/stylesheets/{tooltipster-sidetip-light.min.css → unforassets/tooltipster/themes/tooltipster-sidetip-light.css} +0 -0
  85. /data/vendor/assets/stylesheets/{tooltipster-sidetip-noir.min.css → unforassets/tooltipster/themes/tooltipster-sidetip-noir.css} +0 -0
  86. /data/vendor/assets/stylesheets/{tooltipster-sidetip-punk.min.css → unforassets/tooltipster/themes/tooltipster-sidetip-punk.css} +0 -0
  87. /data/vendor/assets/stylesheets/{tooltipster-sidetip-shadow.min.css → unforassets/tooltipster/themes/tooltipster-sidetip-shadow.css} +0 -0
  88. /data/vendor/assets/stylesheets/{tooltipster.bundle.css → unforassets/tooltipster.css} +0 -0
  89. /data/vendor/assets/stylesheets/{vex-theme-bottom-right-corner.css → unforassets/vex/themes/vex-theme-bottom-right-corner.css} +0 -0
  90. /data/vendor/assets/stylesheets/{vex-theme-default.css → unforassets/vex/themes/vex-theme-default.css} +0 -0
  91. /data/vendor/assets/stylesheets/{vex-theme-flat-attack.css → unforassets/vex/themes/vex-theme-flat-attack.css} +0 -0
  92. /data/vendor/assets/stylesheets/{vex-theme-os.css → unforassets/vex/themes/vex-theme-os.css} +0 -0
  93. /data/vendor/assets/stylesheets/{vex-theme-plain.css → unforassets/vex/themes/vex-theme-plain.css} +0 -0
  94. /data/vendor/assets/stylesheets/{vex-theme-top.css → unforassets/vex/themes/vex-theme-top.css} +0 -0
  95. /data/vendor/assets/stylesheets/{vex-theme-wireframe.css → unforassets/vex/themes/vex-theme-wireframe.css} +0 -0
  96. /data/vendor/assets/stylesheets/{vex.css → unforassets/vex.css} +0 -0
@@ -1,1621 +0,0 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.vex = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
- /*
3
- * classList.js: Cross-browser full element.classList implementation.
4
- * 2014-07-23
5
- *
6
- * By Eli Grey, http://eligrey.com
7
- * Public Domain.
8
- * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
9
- */
10
-
11
- /*global self, document, DOMException */
12
-
13
- /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
14
-
15
- /* Copied from MDN:
16
- * https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
17
- */
18
-
19
- if ("document" in window.self) {
20
-
21
- // Full polyfill for browsers with no classList support
22
- // Including IE < Edge missing SVGElement.classList
23
- if (!("classList" in document.createElement("_"))
24
- || document.createElementNS && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g"))) {
25
-
26
- (function (view) {
27
-
28
- "use strict";
29
-
30
- if (!('Element' in view)) return;
31
-
32
- var
33
- classListProp = "classList"
34
- , protoProp = "prototype"
35
- , elemCtrProto = view.Element[protoProp]
36
- , objCtr = Object
37
- , strTrim = String[protoProp].trim || function () {
38
- return this.replace(/^\s+|\s+$/g, "");
39
- }
40
- , arrIndexOf = Array[protoProp].indexOf || function (item) {
41
- var
42
- i = 0
43
- , len = this.length
44
- ;
45
- for (; i < len; i++) {
46
- if (i in this && this[i] === item) {
47
- return i;
48
- }
49
- }
50
- return -1;
51
- }
52
- // Vendors: please allow content code to instantiate DOMExceptions
53
- , DOMEx = function (type, message) {
54
- this.name = type;
55
- this.code = DOMException[type];
56
- this.message = message;
57
- }
58
- , checkTokenAndGetIndex = function (classList, token) {
59
- if (token === "") {
60
- throw new DOMEx(
61
- "SYNTAX_ERR"
62
- , "An invalid or illegal string was specified"
63
- );
64
- }
65
- if (/\s/.test(token)) {
66
- throw new DOMEx(
67
- "INVALID_CHARACTER_ERR"
68
- , "String contains an invalid character"
69
- );
70
- }
71
- return arrIndexOf.call(classList, token);
72
- }
73
- , ClassList = function (elem) {
74
- var
75
- trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
76
- , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
77
- , i = 0
78
- , len = classes.length
79
- ;
80
- for (; i < len; i++) {
81
- this.push(classes[i]);
82
- }
83
- this._updateClassName = function () {
84
- elem.setAttribute("class", this.toString());
85
- };
86
- }
87
- , classListProto = ClassList[protoProp] = []
88
- , classListGetter = function () {
89
- return new ClassList(this);
90
- }
91
- ;
92
- // Most DOMException implementations don't allow calling DOMException's toString()
93
- // on non-DOMExceptions. Error's toString() is sufficient here.
94
- DOMEx[protoProp] = Error[protoProp];
95
- classListProto.item = function (i) {
96
- return this[i] || null;
97
- };
98
- classListProto.contains = function (token) {
99
- token += "";
100
- return checkTokenAndGetIndex(this, token) !== -1;
101
- };
102
- classListProto.add = function () {
103
- var
104
- tokens = arguments
105
- , i = 0
106
- , l = tokens.length
107
- , token
108
- , updated = false
109
- ;
110
- do {
111
- token = tokens[i] + "";
112
- if (checkTokenAndGetIndex(this, token) === -1) {
113
- this.push(token);
114
- updated = true;
115
- }
116
- }
117
- while (++i < l);
118
-
119
- if (updated) {
120
- this._updateClassName();
121
- }
122
- };
123
- classListProto.remove = function () {
124
- var
125
- tokens = arguments
126
- , i = 0
127
- , l = tokens.length
128
- , token
129
- , updated = false
130
- , index
131
- ;
132
- do {
133
- token = tokens[i] + "";
134
- index = checkTokenAndGetIndex(this, token);
135
- while (index !== -1) {
136
- this.splice(index, 1);
137
- updated = true;
138
- index = checkTokenAndGetIndex(this, token);
139
- }
140
- }
141
- while (++i < l);
142
-
143
- if (updated) {
144
- this._updateClassName();
145
- }
146
- };
147
- classListProto.toggle = function (token, force) {
148
- token += "";
149
-
150
- var
151
- result = this.contains(token)
152
- , method = result ?
153
- force !== true && "remove"
154
- :
155
- force !== false && "add"
156
- ;
157
-
158
- if (method) {
159
- this[method](token);
160
- }
161
-
162
- if (force === true || force === false) {
163
- return force;
164
- } else {
165
- return !result;
166
- }
167
- };
168
- classListProto.toString = function () {
169
- return this.join(" ");
170
- };
171
-
172
- if (objCtr.defineProperty) {
173
- var classListPropDesc = {
174
- get: classListGetter
175
- , enumerable: true
176
- , configurable: true
177
- };
178
- try {
179
- objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
180
- } catch (ex) { // IE 8 doesn't support enumerable:true
181
- if (ex.number === -0x7FF5EC54) {
182
- classListPropDesc.enumerable = false;
183
- objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
184
- }
185
- }
186
- } else if (objCtr[protoProp].__defineGetter__) {
187
- elemCtrProto.__defineGetter__(classListProp, classListGetter);
188
- }
189
-
190
- }(window.self));
191
-
192
- } else {
193
- // There is full or partial native classList support, so just check if we need
194
- // to normalize the add/remove and toggle APIs.
195
-
196
- (function () {
197
- "use strict";
198
-
199
- var testElement = document.createElement("_");
200
-
201
- testElement.classList.add("c1", "c2");
202
-
203
- // Polyfill for IE 10/11 and Firefox <26, where classList.add and
204
- // classList.remove exist but support only one argument at a time.
205
- if (!testElement.classList.contains("c2")) {
206
- var createMethod = function(method) {
207
- var original = DOMTokenList.prototype[method];
208
-
209
- DOMTokenList.prototype[method] = function(token) {
210
- var i, len = arguments.length;
211
-
212
- for (i = 0; i < len; i++) {
213
- token = arguments[i];
214
- original.call(this, token);
215
- }
216
- };
217
- };
218
- createMethod('add');
219
- createMethod('remove');
220
- }
221
-
222
- testElement.classList.toggle("c3", false);
223
-
224
- // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
225
- // support the second argument.
226
- if (testElement.classList.contains("c3")) {
227
- var _toggle = DOMTokenList.prototype.toggle;
228
-
229
- DOMTokenList.prototype.toggle = function(token, force) {
230
- if (1 in arguments && !this.contains(token) === !force) {
231
- return force;
232
- } else {
233
- return _toggle.call(this, token);
234
- }
235
- };
236
-
237
- }
238
-
239
- testElement = null;
240
- }());
241
- }
242
- }
243
-
244
- },{}],2:[function(require,module,exports){
245
-
246
- /**
247
- * Expose `parse`.
248
- */
249
-
250
- module.exports = parse;
251
-
252
- /**
253
- * Tests for browser support.
254
- */
255
-
256
- var innerHTMLBug = false;
257
- var bugTestDiv;
258
- if (typeof document !== 'undefined') {
259
- bugTestDiv = document.createElement('div');
260
- // Setup
261
- bugTestDiv.innerHTML = ' <link/><table></table><a href="/a">a</a><input type="checkbox"/>';
262
- // Make sure that link elements get serialized correctly by innerHTML
263
- // This requires a wrapper element in IE
264
- innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;
265
- bugTestDiv = undefined;
266
- }
267
-
268
- /**
269
- * Wrap map from jquery.
270
- */
271
-
272
- var map = {
273
- legend: [1, '<fieldset>', '</fieldset>'],
274
- tr: [2, '<table><tbody>', '</tbody></table>'],
275
- col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
276
- // for script/link/style tags to work in IE6-8, you have to wrap
277
- // in a div with a non-whitespace character in front, ha!
278
- _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']
279
- };
280
-
281
- map.td =
282
- map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
283
-
284
- map.option =
285
- map.optgroup = [1, '<select multiple="multiple">', '</select>'];
286
-
287
- map.thead =
288
- map.tbody =
289
- map.colgroup =
290
- map.caption =
291
- map.tfoot = [1, '<table>', '</table>'];
292
-
293
- map.polyline =
294
- map.ellipse =
295
- map.polygon =
296
- map.circle =
297
- map.text =
298
- map.line =
299
- map.path =
300
- map.rect =
301
- map.g = [1, '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">','</svg>'];
302
-
303
- /**
304
- * Parse `html` and return a DOM Node instance, which could be a TextNode,
305
- * HTML DOM Node of some kind (<div> for example), or a DocumentFragment
306
- * instance, depending on the contents of the `html` string.
307
- *
308
- * @param {String} html - HTML string to "domify"
309
- * @param {Document} doc - The `document` instance to create the Node for
310
- * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance
311
- * @api private
312
- */
313
-
314
- function parse(html, doc) {
315
- if ('string' != typeof html) throw new TypeError('String expected');
316
-
317
- // default to the global `document` object
318
- if (!doc) doc = document;
319
-
320
- // tag name
321
- var m = /<([\w:]+)/.exec(html);
322
- if (!m) return doc.createTextNode(html);
323
-
324
- html = html.replace(/^\s+|\s+$/g, ''); // Remove leading/trailing whitespace
325
-
326
- var tag = m[1];
327
-
328
- // body support
329
- if (tag == 'body') {
330
- var el = doc.createElement('html');
331
- el.innerHTML = html;
332
- return el.removeChild(el.lastChild);
333
- }
334
-
335
- // wrap map
336
- var wrap = map[tag] || map._default;
337
- var depth = wrap[0];
338
- var prefix = wrap[1];
339
- var suffix = wrap[2];
340
- var el = doc.createElement('div');
341
- el.innerHTML = prefix + html + suffix;
342
- while (depth--) el = el.lastChild;
343
-
344
- // one element
345
- if (el.firstChild == el.lastChild) {
346
- return el.removeChild(el.firstChild);
347
- }
348
-
349
- // several elements
350
- var fragment = doc.createDocumentFragment();
351
- while (el.firstChild) {
352
- fragment.appendChild(el.removeChild(el.firstChild));
353
- }
354
-
355
- return fragment;
356
- }
357
-
358
- },{}],3:[function(require,module,exports){
359
- /**
360
- * Code refactored from Mozilla Developer Network:
361
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
362
- */
363
-
364
- 'use strict';
365
-
366
- function assign(target, firstSource) {
367
- if (target === undefined || target === null) {
368
- throw new TypeError('Cannot convert first argument to object');
369
- }
370
-
371
- var to = Object(target);
372
- for (var i = 1; i < arguments.length; i++) {
373
- var nextSource = arguments[i];
374
- if (nextSource === undefined || nextSource === null) {
375
- continue;
376
- }
377
-
378
- var keysArray = Object.keys(Object(nextSource));
379
- for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
380
- var nextKey = keysArray[nextIndex];
381
- var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
382
- if (desc !== undefined && desc.enumerable) {
383
- to[nextKey] = nextSource[nextKey];
384
- }
385
- }
386
- }
387
- return to;
388
- }
389
-
390
- function polyfill() {
391
- if (!Object.assign) {
392
- Object.defineProperty(Object, 'assign', {
393
- enumerable: false,
394
- configurable: true,
395
- writable: true,
396
- value: assign
397
- });
398
- }
399
- }
400
-
401
- module.exports = {
402
- assign: assign,
403
- polyfill: polyfill
404
- };
405
-
406
- },{}],4:[function(require,module,exports){
407
- // get successful control from form and assemble into object
408
- // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
409
-
410
- // types which indicate a submit action and are not successful controls
411
- // these will be ignored
412
- var k_r_submitter = /^(?:submit|button|image|reset|file)$/i;
413
-
414
- // node names which could be successful controls
415
- var k_r_success_contrls = /^(?:input|select|textarea|keygen)/i;
416
-
417
- // Matches bracket notation.
418
- var brackets = /(\[[^\[\]]*\])/g;
419
-
420
- // serializes form fields
421
- // @param form MUST be an HTMLForm element
422
- // @param options is an optional argument to configure the serialization. Default output
423
- // with no options specified is a url encoded string
424
- // - hash: [true | false] Configure the output type. If true, the output will
425
- // be a js object.
426
- // - serializer: [function] Optional serializer function to override the default one.
427
- // The function takes 3 arguments (result, key, value) and should return new result
428
- // hash and url encoded str serializers are provided with this module
429
- // - disabled: [true | false]. If true serialize disabled fields.
430
- // - empty: [true | false]. If true serialize empty fields
431
- function serialize(form, options) {
432
- if (typeof options != 'object') {
433
- options = { hash: !!options };
434
- }
435
- else if (options.hash === undefined) {
436
- options.hash = true;
437
- }
438
-
439
- var result = (options.hash) ? {} : '';
440
- var serializer = options.serializer || ((options.hash) ? hash_serializer : str_serialize);
441
-
442
- var elements = form && form.elements ? form.elements : [];
443
-
444
- //Object store each radio and set if it's empty or not
445
- var radio_store = Object.create(null);
446
-
447
- for (var i=0 ; i<elements.length ; ++i) {
448
- var element = elements[i];
449
-
450
- // ingore disabled fields
451
- if ((!options.disabled && element.disabled) || !element.name) {
452
- continue;
453
- }
454
- // ignore anyhting that is not considered a success field
455
- if (!k_r_success_contrls.test(element.nodeName) ||
456
- k_r_submitter.test(element.type)) {
457
- continue;
458
- }
459
-
460
- var key = element.name;
461
- var val = element.value;
462
-
463
- // we can't just use element.value for checkboxes cause some browsers lie to us
464
- // they say "on" for value when the box isn't checked
465
- if ((element.type === 'checkbox' || element.type === 'radio') && !element.checked) {
466
- val = undefined;
467
- }
468
-
469
- // If we want empty elements
470
- if (options.empty) {
471
- // for checkbox
472
- if (element.type === 'checkbox' && !element.checked) {
473
- val = '';
474
- }
475
-
476
- // for radio
477
- if (element.type === 'radio') {
478
- if (!radio_store[element.name] && !element.checked) {
479
- radio_store[element.name] = false;
480
- }
481
- else if (element.checked) {
482
- radio_store[element.name] = true;
483
- }
484
- }
485
-
486
- // if options empty is true, continue only if its radio
487
- if (!val && element.type == 'radio') {
488
- continue;
489
- }
490
- }
491
- else {
492
- // value-less fields are ignored unless options.empty is true
493
- if (!val) {
494
- continue;
495
- }
496
- }
497
-
498
- // multi select boxes
499
- if (element.type === 'select-multiple') {
500
- val = [];
501
-
502
- var selectOptions = element.options;
503
- var isSelectedOptions = false;
504
- for (var j=0 ; j<selectOptions.length ; ++j) {
505
- var option = selectOptions[j];
506
- var allowedEmpty = options.empty && !option.value;
507
- var hasValue = (option.value || allowedEmpty);
508
- if (option.selected && hasValue) {
509
- isSelectedOptions = true;
510
-
511
- // If using a hash serializer be sure to add the
512
- // correct notation for an array in the multi-select
513
- // context. Here the name attribute on the select element
514
- // might be missing the trailing bracket pair. Both names
515
- // "foo" and "foo[]" should be arrays.
516
- if (options.hash && key.slice(key.length - 2) !== '[]') {
517
- result = serializer(result, key + '[]', option.value);
518
- }
519
- else {
520
- result = serializer(result, key, option.value);
521
- }
522
- }
523
- }
524
-
525
- // Serialize if no selected options and options.empty is true
526
- if (!isSelectedOptions && options.empty) {
527
- result = serializer(result, key, '');
528
- }
529
-
530
- continue;
531
- }
532
-
533
- result = serializer(result, key, val);
534
- }
535
-
536
- // Check for all empty radio buttons and serialize them with key=""
537
- if (options.empty) {
538
- for (var key in radio_store) {
539
- if (!radio_store[key]) {
540
- result = serializer(result, key, '');
541
- }
542
- }
543
- }
544
-
545
- return result;
546
- }
547
-
548
- function parse_keys(string) {
549
- var keys = [];
550
- var prefix = /^([^\[\]]*)/;
551
- var children = new RegExp(brackets);
552
- var match = prefix.exec(string);
553
-
554
- if (match[1]) {
555
- keys.push(match[1]);
556
- }
557
-
558
- while ((match = children.exec(string)) !== null) {
559
- keys.push(match[1]);
560
- }
561
-
562
- return keys;
563
- }
564
-
565
- function hash_assign(result, keys, value) {
566
- if (keys.length === 0) {
567
- result = value;
568
- return result;
569
- }
570
-
571
- var key = keys.shift();
572
- var between = key.match(/^\[(.+?)\]$/);
573
-
574
- if (key === '[]') {
575
- result = result || [];
576
-
577
- if (Array.isArray(result)) {
578
- result.push(hash_assign(null, keys, value));
579
- }
580
- else {
581
- // This might be the result of bad name attributes like "[][foo]",
582
- // in this case the original `result` object will already be
583
- // assigned to an object literal. Rather than coerce the object to
584
- // an array, or cause an exception the attribute "_values" is
585
- // assigned as an array.
586
- result._values = result._values || [];
587
- result._values.push(hash_assign(null, keys, value));
588
- }
589
-
590
- return result;
591
- }
592
-
593
- // Key is an attribute name and can be assigned directly.
594
- if (!between) {
595
- result[key] = hash_assign(result[key], keys, value);
596
- }
597
- else {
598
- var string = between[1];
599
- // +var converts the variable into a number
600
- // better than parseInt because it doesn't truncate away trailing
601
- // letters and actually fails if whole thing is not a number
602
- var index = +string;
603
-
604
- // If the characters between the brackets is not a number it is an
605
- // attribute name and can be assigned directly.
606
- if (isNaN(index)) {
607
- result = result || {};
608
- result[string] = hash_assign(result[string], keys, value);
609
- }
610
- else {
611
- result = result || [];
612
- result[index] = hash_assign(result[index], keys, value);
613
- }
614
- }
615
-
616
- return result;
617
- }
618
-
619
- // Object/hash encoding serializer.
620
- function hash_serializer(result, key, value) {
621
- var matches = key.match(brackets);
622
-
623
- // Has brackets? Use the recursive assignment function to walk the keys,
624
- // construct any missing objects in the result tree and make the assignment
625
- // at the end of the chain.
626
- if (matches) {
627
- var keys = parse_keys(key);
628
- hash_assign(result, keys, value);
629
- }
630
- else {
631
- // Non bracket notation can make assignments directly.
632
- var existing = result[key];
633
-
634
- // If the value has been assigned already (for instance when a radio and
635
- // a checkbox have the same name attribute) convert the previous value
636
- // into an array before pushing into it.
637
- //
638
- // NOTE: If this requirement were removed all hash creation and
639
- // assignment could go through `hash_assign`.
640
- if (existing) {
641
- if (!Array.isArray(existing)) {
642
- result[key] = [ existing ];
643
- }
644
-
645
- result[key].push(value);
646
- }
647
- else {
648
- result[key] = value;
649
- }
650
- }
651
-
652
- return result;
653
- }
654
-
655
- // urlform encoding serializer
656
- function str_serialize(result, key, value) {
657
- // encode newlines as \r\n cause the html spec says so
658
- value = value.replace(/(\r)?\n/g, '\r\n');
659
- value = encodeURIComponent(value);
660
-
661
- // spaces should be '+' rather than '%20'.
662
- value = value.replace(/%20/g, '+');
663
- return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + value;
664
- }
665
-
666
- module.exports = serialize;
667
-
668
- },{}],5:[function(require,module,exports){
669
- (function (global){
670
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.vexDialog = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
671
-
672
- /**
673
- * Expose `parse`.
674
- */
675
-
676
- module.exports = parse;
677
-
678
- /**
679
- * Tests for browser support.
680
- */
681
-
682
- var innerHTMLBug = false;
683
- var bugTestDiv;
684
- if (typeof document !== 'undefined') {
685
- bugTestDiv = document.createElement('div');
686
- // Setup
687
- bugTestDiv.innerHTML = ' <link/><table></table><a href="/a">a</a><input type="checkbox"/>';
688
- // Make sure that link elements get serialized correctly by innerHTML
689
- // This requires a wrapper element in IE
690
- innerHTMLBug = !bugTestDiv.getElementsByTagName('link').length;
691
- bugTestDiv = undefined;
692
- }
693
-
694
- /**
695
- * Wrap map from jquery.
696
- */
697
-
698
- var map = {
699
- legend: [1, '<fieldset>', '</fieldset>'],
700
- tr: [2, '<table><tbody>', '</tbody></table>'],
701
- col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
702
- // for script/link/style tags to work in IE6-8, you have to wrap
703
- // in a div with a non-whitespace character in front, ha!
704
- _default: innerHTMLBug ? [1, 'X<div>', '</div>'] : [0, '', '']
705
- };
706
-
707
- map.td =
708
- map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
709
-
710
- map.option =
711
- map.optgroup = [1, '<select multiple="multiple">', '</select>'];
712
-
713
- map.thead =
714
- map.tbody =
715
- map.colgroup =
716
- map.caption =
717
- map.tfoot = [1, '<table>', '</table>'];
718
-
719
- map.polyline =
720
- map.ellipse =
721
- map.polygon =
722
- map.circle =
723
- map.text =
724
- map.line =
725
- map.path =
726
- map.rect =
727
- map.g = [1, '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">','</svg>'];
728
-
729
- /**
730
- * Parse `html` and return a DOM Node instance, which could be a TextNode,
731
- * HTML DOM Node of some kind (<div> for example), or a DocumentFragment
732
- * instance, depending on the contents of the `html` string.
733
- *
734
- * @param {String} html - HTML string to "domify"
735
- * @param {Document} doc - The `document` instance to create the Node for
736
- * @return {DOMNode} the TextNode, DOM Node, or DocumentFragment instance
737
- * @api private
738
- */
739
-
740
- function parse(html, doc) {
741
- if ('string' != typeof html) throw new TypeError('String expected');
742
-
743
- // default to the global `document` object
744
- if (!doc) doc = document;
745
-
746
- // tag name
747
- var m = /<([\w:]+)/.exec(html);
748
- if (!m) return doc.createTextNode(html);
749
-
750
- html = html.replace(/^\s+|\s+$/g, ''); // Remove leading/trailing whitespace
751
-
752
- var tag = m[1];
753
-
754
- // body support
755
- if (tag == 'body') {
756
- var el = doc.createElement('html');
757
- el.innerHTML = html;
758
- return el.removeChild(el.lastChild);
759
- }
760
-
761
- // wrap map
762
- var wrap = map[tag] || map._default;
763
- var depth = wrap[0];
764
- var prefix = wrap[1];
765
- var suffix = wrap[2];
766
- var el = doc.createElement('div');
767
- el.innerHTML = prefix + html + suffix;
768
- while (depth--) el = el.lastChild;
769
-
770
- // one element
771
- if (el.firstChild == el.lastChild) {
772
- return el.removeChild(el.firstChild);
773
- }
774
-
775
- // several elements
776
- var fragment = doc.createDocumentFragment();
777
- while (el.firstChild) {
778
- fragment.appendChild(el.removeChild(el.firstChild));
779
- }
780
-
781
- return fragment;
782
- }
783
-
784
- },{}],2:[function(require,module,exports){
785
- // get successful control from form and assemble into object
786
- // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
787
-
788
- // types which indicate a submit action and are not successful controls
789
- // these will be ignored
790
- var k_r_submitter = /^(?:submit|button|image|reset|file)$/i;
791
-
792
- // node names which could be successful controls
793
- var k_r_success_contrls = /^(?:input|select|textarea|keygen)/i;
794
-
795
- // Matches bracket notation.
796
- var brackets = /(\[[^\[\]]*\])/g;
797
-
798
- // serializes form fields
799
- // @param form MUST be an HTMLForm element
800
- // @param options is an optional argument to configure the serialization. Default output
801
- // with no options specified is a url encoded string
802
- // - hash: [true | false] Configure the output type. If true, the output will
803
- // be a js object.
804
- // - serializer: [function] Optional serializer function to override the default one.
805
- // The function takes 3 arguments (result, key, value) and should return new result
806
- // hash and url encoded str serializers are provided with this module
807
- // - disabled: [true | false]. If true serialize disabled fields.
808
- // - empty: [true | false]. If true serialize empty fields
809
- function serialize(form, options) {
810
- if (typeof options != 'object') {
811
- options = { hash: !!options };
812
- }
813
- else if (options.hash === undefined) {
814
- options.hash = true;
815
- }
816
-
817
- var result = (options.hash) ? {} : '';
818
- var serializer = options.serializer || ((options.hash) ? hash_serializer : str_serialize);
819
-
820
- var elements = form && form.elements ? form.elements : [];
821
-
822
- //Object store each radio and set if it's empty or not
823
- var radio_store = Object.create(null);
824
-
825
- for (var i=0 ; i<elements.length ; ++i) {
826
- var element = elements[i];
827
-
828
- // ingore disabled fields
829
- if ((!options.disabled && element.disabled) || !element.name) {
830
- continue;
831
- }
832
- // ignore anyhting that is not considered a success field
833
- if (!k_r_success_contrls.test(element.nodeName) ||
834
- k_r_submitter.test(element.type)) {
835
- continue;
836
- }
837
-
838
- var key = element.name;
839
- var val = element.value;
840
-
841
- // we can't just use element.value for checkboxes cause some browsers lie to us
842
- // they say "on" for value when the box isn't checked
843
- if ((element.type === 'checkbox' || element.type === 'radio') && !element.checked) {
844
- val = undefined;
845
- }
846
-
847
- // If we want empty elements
848
- if (options.empty) {
849
- // for checkbox
850
- if (element.type === 'checkbox' && !element.checked) {
851
- val = '';
852
- }
853
-
854
- // for radio
855
- if (element.type === 'radio') {
856
- if (!radio_store[element.name] && !element.checked) {
857
- radio_store[element.name] = false;
858
- }
859
- else if (element.checked) {
860
- radio_store[element.name] = true;
861
- }
862
- }
863
-
864
- // if options empty is true, continue only if its radio
865
- if (!val && element.type == 'radio') {
866
- continue;
867
- }
868
- }
869
- else {
870
- // value-less fields are ignored unless options.empty is true
871
- if (!val) {
872
- continue;
873
- }
874
- }
875
-
876
- // multi select boxes
877
- if (element.type === 'select-multiple') {
878
- val = [];
879
-
880
- var selectOptions = element.options;
881
- var isSelectedOptions = false;
882
- for (var j=0 ; j<selectOptions.length ; ++j) {
883
- var option = selectOptions[j];
884
- var allowedEmpty = options.empty && !option.value;
885
- var hasValue = (option.value || allowedEmpty);
886
- if (option.selected && hasValue) {
887
- isSelectedOptions = true;
888
-
889
- // If using a hash serializer be sure to add the
890
- // correct notation for an array in the multi-select
891
- // context. Here the name attribute on the select element
892
- // might be missing the trailing bracket pair. Both names
893
- // "foo" and "foo[]" should be arrays.
894
- if (options.hash && key.slice(key.length - 2) !== '[]') {
895
- result = serializer(result, key + '[]', option.value);
896
- }
897
- else {
898
- result = serializer(result, key, option.value);
899
- }
900
- }
901
- }
902
-
903
- // Serialize if no selected options and options.empty is true
904
- if (!isSelectedOptions && options.empty) {
905
- result = serializer(result, key, '');
906
- }
907
-
908
- continue;
909
- }
910
-
911
- result = serializer(result, key, val);
912
- }
913
-
914
- // Check for all empty radio buttons and serialize them with key=""
915
- if (options.empty) {
916
- for (var key in radio_store) {
917
- if (!radio_store[key]) {
918
- result = serializer(result, key, '');
919
- }
920
- }
921
- }
922
-
923
- return result;
924
- }
925
-
926
- function parse_keys(string) {
927
- var keys = [];
928
- var prefix = /^([^\[\]]*)/;
929
- var children = new RegExp(brackets);
930
- var match = prefix.exec(string);
931
-
932
- if (match[1]) {
933
- keys.push(match[1]);
934
- }
935
-
936
- while ((match = children.exec(string)) !== null) {
937
- keys.push(match[1]);
938
- }
939
-
940
- return keys;
941
- }
942
-
943
- function hash_assign(result, keys, value) {
944
- if (keys.length === 0) {
945
- result = value;
946
- return result;
947
- }
948
-
949
- var key = keys.shift();
950
- var between = key.match(/^\[(.+?)\]$/);
951
-
952
- if (key === '[]') {
953
- result = result || [];
954
-
955
- if (Array.isArray(result)) {
956
- result.push(hash_assign(null, keys, value));
957
- }
958
- else {
959
- // This might be the result of bad name attributes like "[][foo]",
960
- // in this case the original `result` object will already be
961
- // assigned to an object literal. Rather than coerce the object to
962
- // an array, or cause an exception the attribute "_values" is
963
- // assigned as an array.
964
- result._values = result._values || [];
965
- result._values.push(hash_assign(null, keys, value));
966
- }
967
-
968
- return result;
969
- }
970
-
971
- // Key is an attribute name and can be assigned directly.
972
- if (!between) {
973
- result[key] = hash_assign(result[key], keys, value);
974
- }
975
- else {
976
- var string = between[1];
977
- // +var converts the variable into a number
978
- // better than parseInt because it doesn't truncate away trailing
979
- // letters and actually fails if whole thing is not a number
980
- var index = +string;
981
-
982
- // If the characters between the brackets is not a number it is an
983
- // attribute name and can be assigned directly.
984
- if (isNaN(index)) {
985
- result = result || {};
986
- result[string] = hash_assign(result[string], keys, value);
987
- }
988
- else {
989
- result = result || [];
990
- result[index] = hash_assign(result[index], keys, value);
991
- }
992
- }
993
-
994
- return result;
995
- }
996
-
997
- // Object/hash encoding serializer.
998
- function hash_serializer(result, key, value) {
999
- var matches = key.match(brackets);
1000
-
1001
- // Has brackets? Use the recursive assignment function to walk the keys,
1002
- // construct any missing objects in the result tree and make the assignment
1003
- // at the end of the chain.
1004
- if (matches) {
1005
- var keys = parse_keys(key);
1006
- hash_assign(result, keys, value);
1007
- }
1008
- else {
1009
- // Non bracket notation can make assignments directly.
1010
- var existing = result[key];
1011
-
1012
- // If the value has been assigned already (for instance when a radio and
1013
- // a checkbox have the same name attribute) convert the previous value
1014
- // into an array before pushing into it.
1015
- //
1016
- // NOTE: If this requirement were removed all hash creation and
1017
- // assignment could go through `hash_assign`.
1018
- if (existing) {
1019
- if (!Array.isArray(existing)) {
1020
- result[key] = [ existing ];
1021
- }
1022
-
1023
- result[key].push(value);
1024
- }
1025
- else {
1026
- result[key] = value;
1027
- }
1028
- }
1029
-
1030
- return result;
1031
- }
1032
-
1033
- // urlform encoding serializer
1034
- function str_serialize(result, key, value) {
1035
- // encode newlines as \r\n cause the html spec says so
1036
- value = value.replace(/(\r)?\n/g, '\r\n');
1037
- value = encodeURIComponent(value);
1038
-
1039
- // spaces should be '+' rather than '%20'.
1040
- value = value.replace(/%20/g, '+');
1041
- return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + value;
1042
- }
1043
-
1044
- module.exports = serialize;
1045
-
1046
- },{}],3:[function(require,module,exports){
1047
- var domify = require('domify')
1048
- var serialize = require('form-serialize')
1049
-
1050
- // Build DOM elements for the structure of the dialog
1051
- var buildDialogForm = function buildDialogForm (options) {
1052
- var form = document.createElement('form')
1053
- form.classList.add('vex-dialog-form')
1054
-
1055
- var message = document.createElement('div')
1056
- message.classList.add('vex-dialog-message')
1057
- message.appendChild(options.message instanceof window.Node ? options.message : domify(options.message))
1058
-
1059
- var input = document.createElement('div')
1060
- input.classList.add('vex-dialog-input')
1061
- input.appendChild(options.input instanceof window.Node ? options.input : domify(options.input))
1062
-
1063
- form.appendChild(message)
1064
- form.appendChild(input)
1065
-
1066
- return form
1067
- }
1068
-
1069
- // Take an array of buttons (see the default buttons below) and turn them into DOM elements
1070
- var buttonsToDOM = function buttonsToDOM (buttons) {
1071
- var domButtons = document.createElement('div')
1072
- domButtons.classList.add('vex-dialog-buttons')
1073
-
1074
- for (var i = 0; i < buttons.length; i++) {
1075
- var button = buttons[i]
1076
- var domButton = document.createElement('button')
1077
- domButton.type = button.type
1078
- domButton.textContent = button.text
1079
- domButton.className = button.className
1080
- domButton.classList.add('vex-dialog-button')
1081
- if (i === 0) {
1082
- domButton.classList.add('vex-first')
1083
- } else if (i === buttons.length - 1) {
1084
- domButton.classList.add('vex-last')
1085
- }
1086
- // Attach click listener to button with closure
1087
- (function (button) {
1088
- domButton.addEventListener('click', function (e) {
1089
- if (button.click) {
1090
- button.click.call(this, e)
1091
- }
1092
- }.bind(this))
1093
- }.bind(this)(button))
1094
-
1095
- domButtons.appendChild(domButton)
1096
- }
1097
-
1098
- return domButtons
1099
- }
1100
-
1101
- var plugin = function plugin (vex) {
1102
- // Define the API first
1103
- var dialog = {
1104
- // Plugin name
1105
- name: 'dialog',
1106
-
1107
- // Open
1108
- open: function open (opts) {
1109
- var options = Object.assign({}, this.defaultOptions, opts)
1110
-
1111
- // `message` is unsafe internally, so translate
1112
- // safe default: HTML-escape the message before passing it through
1113
- if (options.unsafeMessage && !options.message) {
1114
- options.message = options.unsafeMessage
1115
- } else if (options.message) {
1116
- options.message = vex._escapeHtml(options.message)
1117
- }
1118
-
1119
- // Build the form from the options
1120
- var form = options.unsafeContent = buildDialogForm(options)
1121
-
1122
- // Open the dialog
1123
- var dialogInstance = vex.open(options)
1124
-
1125
- // Quick comment - these options and appending buttons and everything
1126
- // would preferably be done _before_ opening the dialog. However, since
1127
- // they rely on the context of the vex instance, we have to do them
1128
- // after. A potential future fix would be to differentiate between
1129
- // a "created" vex instance and an "opened" vex instance, so any actions
1130
- // that rely on the specific context of the instance can do their stuff
1131
- // before opening the dialog on the page.
1132
-
1133
- // Override the before close callback to also pass the value of the form
1134
- var beforeClose = options.beforeClose && options.beforeClose.bind(dialogInstance)
1135
- dialogInstance.options.beforeClose = function dialogBeforeClose () {
1136
- // Only call the callback once - when the validation in beforeClose, if present, is true
1137
- var shouldClose = beforeClose ? beforeClose() : true
1138
- if (shouldClose) {
1139
- options.callback(this.value || false)
1140
- }
1141
- // Return the result of beforeClose() to vex
1142
- return shouldClose
1143
- }.bind(dialogInstance)
1144
-
1145
- // Append buttons to form with correct context
1146
- form.appendChild(buttonsToDOM.call(dialogInstance, options.buttons))
1147
-
1148
- // Attach form to instance
1149
- dialogInstance.form = form
1150
-
1151
- // Add submit listener to form
1152
- form.addEventListener('submit', options.onSubmit.bind(dialogInstance))
1153
-
1154
- // Optionally focus the first input in the form
1155
- if (options.focusFirstInput) {
1156
- var el = dialogInstance.contentEl.querySelector('button, input, select, textarea')
1157
- if (el) {
1158
- el.focus()
1159
- }
1160
- }
1161
-
1162
- // For chaining
1163
- return dialogInstance
1164
- },
1165
-
1166
- // Alert
1167
- alert: function (options) {
1168
- // Allow string as message
1169
- if (typeof options === 'string') {
1170
- options = {
1171
- message: options
1172
- }
1173
- }
1174
- options = Object.assign({}, this.defaultOptions, this.defaultAlertOptions, options)
1175
- return this.open(options)
1176
- },
1177
-
1178
- // Confirm
1179
- confirm: function (options) {
1180
- if (typeof options !== 'object' || typeof options.callback !== 'function') {
1181
- throw new Error('dialog.confirm(options) requires options.callback.')
1182
- }
1183
- options = Object.assign({}, this.defaultOptions, this.defaultConfirmOptions, options)
1184
- return this.open(options)
1185
- },
1186
-
1187
- // Prompt
1188
- prompt: function (options) {
1189
- if (typeof options !== 'object' || typeof options.callback !== 'function') {
1190
- throw new Error('dialog.prompt(options) requires options.callback.')
1191
- }
1192
- var defaults = Object.assign({}, this.defaultOptions, this.defaultPromptOptions)
1193
- var dynamicDefaults = {
1194
- unsafeMessage: '<label for="vex">' + vex._escapeHtml(options.label || defaults.label) + '</label>',
1195
- input: '<input name="vex" type="text" class="vex-dialog-prompt-input" placeholder="' + vex._escapeHtml(options.placeholder || defaults.placeholder) + '" value="' + vex._escapeHtml(options.value || defaults.value) + '" />'
1196
- }
1197
- options = Object.assign(defaults, dynamicDefaults, options)
1198
- // Pluck the value of the "vex" input field as the return value for prompt's callback
1199
- // More closely mimics "window.prompt" in that a single string is returned
1200
- var callback = options.callback
1201
- options.callback = function promptCallback (value) {
1202
- if (typeof value === 'object') {
1203
- var keys = Object.keys(value)
1204
- value = keys.length ? value[keys[0]] : ''
1205
- }
1206
- callback(value)
1207
- }
1208
- return this.open(options)
1209
- }
1210
- }
1211
-
1212
- // Now define any additional data that's not the direct dialog API
1213
- dialog.buttons = {
1214
- YES: {
1215
- text: 'OK',
1216
- type: 'submit',
1217
- className: 'vex-dialog-button-primary',
1218
- click: function yesClick () {
1219
- this.value = true
1220
- }
1221
- },
1222
-
1223
- NO: {
1224
- text: 'Cancel',
1225
- type: 'button',
1226
- className: 'vex-dialog-button-secondary',
1227
- click: function noClick () {
1228
- this.value = false
1229
- this.close()
1230
- }
1231
- }
1232
- }
1233
-
1234
- dialog.defaultOptions = {
1235
- callback: function () {},
1236
- afterOpen: function () {},
1237
- message: '',
1238
- input: '',
1239
- buttons: [
1240
- dialog.buttons.YES,
1241
- dialog.buttons.NO
1242
- ],
1243
- showCloseButton: false,
1244
- onSubmit: function onDialogSubmit (e) {
1245
- e.preventDefault()
1246
- if (this.options.input) {
1247
- this.value = serialize(this.form, { hash: true })
1248
- }
1249
- return this.close()
1250
- },
1251
- focusFirstInput: true
1252
- }
1253
-
1254
- dialog.defaultAlertOptions = {
1255
- buttons: [
1256
- dialog.buttons.YES
1257
- ]
1258
- }
1259
-
1260
- dialog.defaultPromptOptions = {
1261
- label: 'Prompt:',
1262
- placeholder: '',
1263
- value: ''
1264
- }
1265
-
1266
- dialog.defaultConfirmOptions = {}
1267
-
1268
- return dialog
1269
- }
1270
-
1271
- module.exports = plugin
1272
-
1273
- },{"domify":1,"form-serialize":2}]},{},[3])(3)
1274
- });
1275
- }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1276
- },{"domify":2,"form-serialize":4}],6:[function(require,module,exports){
1277
- var vex = require('./vex')
1278
- vex.registerPlugin(require('vex-dialog'))
1279
- module.exports = vex
1280
-
1281
- },{"./vex":7,"vex-dialog":5}],7:[function(require,module,exports){
1282
- // classList polyfill for old browsers
1283
- require('classlist-polyfill')
1284
- // Object.assign polyfill
1285
- require('es6-object-assign').polyfill()
1286
-
1287
- // String to DOM function
1288
- var domify = require('domify')
1289
-
1290
- // Use the DOM's HTML parsing to escape any dangerous strings
1291
- var escapeHtml = function escapeHtml (str) {
1292
- if (typeof str !== 'undefined') {
1293
- var div = document.createElement('div')
1294
- div.appendChild(document.createTextNode(str))
1295
- return div.innerHTML
1296
- } else {
1297
- return ''
1298
- }
1299
- }
1300
-
1301
- // Utility function to add space-delimited class strings to a DOM element's classList
1302
- var addClasses = function addClasses (el, classStr) {
1303
- if (typeof classStr !== 'string' || classStr.length === 0) {
1304
- return
1305
- }
1306
- var classes = classStr.split(' ')
1307
- for (var i = 0; i < classes.length; i++) {
1308
- var className = classes[i]
1309
- if (className.length) {
1310
- el.classList.add(className)
1311
- }
1312
- }
1313
- }
1314
-
1315
- // Detect CSS Animation End Support
1316
- // https://github.com/limonte/sweetalert2/blob/99bd539f85e15ac170f69d35001d12e092ef0054/src/utils/dom.js#L194
1317
- var animationEndEvent = (function detectAnimationEndEvent () {
1318
- var el = document.createElement('div')
1319
- var eventNames = {
1320
- 'WebkitAnimation': 'webkitAnimationEnd',
1321
- 'MozAnimation': 'animationend',
1322
- 'OAnimation': 'oanimationend',
1323
- 'msAnimation': 'MSAnimationEnd',
1324
- 'animation': 'animationend'
1325
- }
1326
- for (var i in eventNames) {
1327
- if (el.style[i] !== undefined) {
1328
- return eventNames[i]
1329
- }
1330
- }
1331
- return false
1332
- })()
1333
-
1334
- // vex base CSS classes
1335
- var baseClassNames = {
1336
- vex: 'vex',
1337
- content: 'vex-content',
1338
- overlay: 'vex-overlay',
1339
- close: 'vex-close',
1340
- closing: 'vex-closing',
1341
- open: 'vex-open'
1342
- }
1343
-
1344
- // Private lookup table of all open vex objects, keyed by id
1345
- var vexes = {}
1346
- var globalId = 1
1347
-
1348
- // Private boolean to assist the escapeButtonCloses option
1349
- var isEscapeActive = false
1350
-
1351
- // vex itself is an object that exposes a simple API to open and close vex objects in various ways
1352
- var vex = {
1353
- open: function open (opts) {
1354
- // Check for usage of deprecated options, and log a warning
1355
- var warnDeprecated = function warnDeprecated (prop) {
1356
- console.warn('The "' + prop + '" property is deprecated in vex 3. Use CSS classes and the appropriate "ClassName" options, instead.')
1357
- console.warn('See http://github.hubspot.com/vex/api/advanced/#options')
1358
- }
1359
- if (opts.css) {
1360
- warnDeprecated('css')
1361
- }
1362
- if (opts.overlayCSS) {
1363
- warnDeprecated('overlayCSS')
1364
- }
1365
- if (opts.contentCSS) {
1366
- warnDeprecated('contentCSS')
1367
- }
1368
- if (opts.closeCSS) {
1369
- warnDeprecated('closeCSS')
1370
- }
1371
-
1372
- // The dialog instance
1373
- var vexInstance = {}
1374
-
1375
- // Set id
1376
- vexInstance.id = globalId++
1377
-
1378
- // Store internally
1379
- vexes[vexInstance.id] = vexInstance
1380
-
1381
- // Set state
1382
- vexInstance.isOpen = true
1383
-
1384
- // Close function on the vex instance
1385
- // This is how all API functions should close individual vexes
1386
- vexInstance.close = function instanceClose () {
1387
- // Check state
1388
- if (!this.isOpen) {
1389
- return true
1390
- }
1391
-
1392
- var options = this.options
1393
-
1394
- // escapeButtonCloses is checked first
1395
- if (isEscapeActive && !options.escapeButtonCloses) {
1396
- return false
1397
- }
1398
-
1399
- // Allow the user to validate any info or abort the close with the beforeClose callback
1400
- var shouldClose = (function shouldClose () {
1401
- // Call before close callback
1402
- if (options.beforeClose) {
1403
- return options.beforeClose.call(this)
1404
- }
1405
- // Otherwise indicate that it's ok to continue with close
1406
- return true
1407
- }.bind(this)())
1408
-
1409
- // If beforeClose() fails, abort the close
1410
- if (shouldClose === false) {
1411
- return false
1412
- }
1413
-
1414
- // Update state
1415
- this.isOpen = false
1416
-
1417
- // Detect if the content el has any CSS animations defined
1418
- var style = window.getComputedStyle(this.contentEl)
1419
- function hasAnimationPre (prefix) {
1420
- return style.getPropertyValue(prefix + 'animation-name') !== 'none' && style.getPropertyValue(prefix + 'animation-duration') !== '0s'
1421
- }
1422
- var hasAnimation = hasAnimationPre('') || hasAnimationPre('-webkit-') || hasAnimationPre('-moz-') || hasAnimationPre('-o-')
1423
-
1424
- // Define the function that will actually close the instance
1425
- var close = function close () {
1426
- if (!this.rootEl.parentNode) {
1427
- return
1428
- }
1429
- // Run once
1430
- this.rootEl.removeEventListener(animationEndEvent, close)
1431
- // Remove from lookup table (prevent memory leaks)
1432
- delete vexes[this.id]
1433
- // Remove the dialog from the DOM
1434
- this.rootEl.parentNode.removeChild(this.rootEl)
1435
- // Call after close callback
1436
- if (options.afterClose) {
1437
- options.afterClose.call(this)
1438
- }
1439
- // Remove styling from the body, if no more vexes are open
1440
- if (Object.keys(vexes).length === 0) {
1441
- document.body.classList.remove(baseClassNames.open)
1442
- }
1443
- }.bind(this)
1444
-
1445
- // Close the vex
1446
- if (animationEndEvent && hasAnimation) {
1447
- // Setup the end event listener, to remove the el from the DOM
1448
- this.rootEl.addEventListener(animationEndEvent, close)
1449
- // Add the closing class to the dialog, showing the close animation
1450
- this.rootEl.classList.add(baseClassNames.closing)
1451
- } else {
1452
- close()
1453
- }
1454
-
1455
- return true
1456
- }
1457
-
1458
- // Allow strings as content
1459
- if (typeof opts === 'string') {
1460
- opts = {
1461
- content: opts
1462
- }
1463
- }
1464
-
1465
- // `content` is unsafe internally, so translate
1466
- // safe default: HTML-escape the content before passing it through
1467
- if (opts.unsafeContent && !opts.content) {
1468
- opts.content = opts.unsafeContent
1469
- } else if (opts.content) {
1470
- opts.content = escapeHtml(opts.content)
1471
- }
1472
-
1473
- // Store options on instance for future reference
1474
- var options = vexInstance.options = Object.assign({}, vex.defaultOptions, opts)
1475
-
1476
- // vex root
1477
- var rootEl = vexInstance.rootEl = document.createElement('div')
1478
- rootEl.classList.add(baseClassNames.vex)
1479
- addClasses(rootEl, options.className)
1480
-
1481
- // Overlay
1482
- var overlayEl = vexInstance.overlayEl = document.createElement('div')
1483
- overlayEl.classList.add(baseClassNames.overlay)
1484
- addClasses(overlayEl, options.overlayClassName)
1485
- if (options.overlayClosesOnClick) {
1486
- overlayEl.addEventListener('click', function overlayClickListener (e) {
1487
- if (e.target === overlayEl) {
1488
- vexInstance.close()
1489
- }
1490
- })
1491
- }
1492
- rootEl.appendChild(overlayEl)
1493
-
1494
- // Content
1495
- var contentEl = vexInstance.contentEl = document.createElement('div')
1496
- contentEl.classList.add(baseClassNames.content)
1497
- addClasses(contentEl, options.contentClassName)
1498
- contentEl.appendChild(options.content instanceof window.Node ? options.content : domify(options.content))
1499
- rootEl.appendChild(contentEl)
1500
-
1501
- // Close button
1502
- if (options.showCloseButton) {
1503
- var closeEl = vexInstance.closeEl = document.createElement('div')
1504
- closeEl.classList.add(baseClassNames.close)
1505
- addClasses(closeEl, options.closeClassName)
1506
- closeEl.addEventListener('click', vexInstance.close.bind(vexInstance))
1507
- contentEl.appendChild(closeEl)
1508
- }
1509
-
1510
- // Add to DOM
1511
- document.querySelector(options.appendLocation).appendChild(rootEl)
1512
-
1513
- // Call after open callback
1514
- if (options.afterOpen) {
1515
- options.afterOpen.call(vexInstance)
1516
- }
1517
-
1518
- // Apply styling to the body
1519
- document.body.classList.add(baseClassNames.open)
1520
-
1521
- // Return the created vex instance
1522
- return vexInstance
1523
- },
1524
-
1525
- // A top-level vex.close function to close dialogs by reference or id
1526
- close: function close (vexOrId) {
1527
- var id
1528
- if (vexOrId.id) {
1529
- id = vexOrId.id
1530
- } else if (typeof vexOrId === 'string') {
1531
- id = vexOrId
1532
- } else {
1533
- throw new TypeError('close requires a vex object or id string')
1534
- }
1535
- if (!vexes[id]) {
1536
- return false
1537
- }
1538
- return vexes[id].close()
1539
- },
1540
-
1541
- // Close the most recently created/opened vex
1542
- closeTop: function closeTop () {
1543
- var ids = Object.keys(vexes)
1544
- if (!ids.length) {
1545
- return false
1546
- }
1547
- return vexes[ids[ids.length - 1]].close()
1548
- },
1549
-
1550
- // Close every vex!
1551
- closeAll: function closeAll () {
1552
- for (var id in vexes) {
1553
- this.close(id)
1554
- }
1555
- return true
1556
- },
1557
-
1558
- // A getter for the internal lookup table
1559
- getAll: function getAll () {
1560
- return vexes
1561
- },
1562
-
1563
- // A getter for the internal lookup table
1564
- getById: function getById (id) {
1565
- return vexes[id]
1566
- }
1567
- }
1568
-
1569
- // Close top vex on escape
1570
- window.addEventListener('keyup', function vexKeyupListener (e) {
1571
- if (e.keyCode === 27) {
1572
- isEscapeActive = true
1573
- vex.closeTop()
1574
- isEscapeActive = false
1575
- }
1576
- })
1577
-
1578
- // Close all vexes on history pop state (useful in single page apps)
1579
- window.addEventListener('popstate', function () {
1580
- if (vex.defaultOptions.closeAllOnPopState) {
1581
- vex.closeAll()
1582
- }
1583
- })
1584
-
1585
- vex.defaultOptions = {
1586
- content: '',
1587
- showCloseButton: true,
1588
- escapeButtonCloses: true,
1589
- overlayClosesOnClick: true,
1590
- appendLocation: 'body',
1591
- className: '',
1592
- overlayClassName: '',
1593
- contentClassName: '',
1594
- closeClassName: '',
1595
- closeAllOnPopState: true
1596
- }
1597
-
1598
- // TODO Loading symbols?
1599
-
1600
- // Include escapeHtml function on the library object
1601
- Object.defineProperty(vex, '_escapeHtml', {
1602
- configurable: false,
1603
- enumerable: false,
1604
- writable: false,
1605
- value: escapeHtml
1606
- })
1607
-
1608
- // Plugin system!
1609
- vex.registerPlugin = function registerPlugin (pluginFn, name) {
1610
- var plugin = pluginFn(vex)
1611
- var pluginName = name || plugin.name
1612
- if (vex[pluginName]) {
1613
- throw new Error('Plugin ' + name + ' is already registered.')
1614
- }
1615
- vex[pluginName] = plugin
1616
- }
1617
-
1618
- module.exports = vex
1619
-
1620
- },{"classlist-polyfill":1,"domify":2,"es6-object-assign":3}]},{},[6])(6)
1621
- });