unforassets 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.md +21 -0
- data/README.md +41 -0
- data/lib/unforassets.rb +8 -0
- data/lib/unforassets/engine.rb +4 -0
- data/lib/unforassets/version.rb +3 -0
- data/vendor/assets/javascripts/big.js +1 -0
- data/vendor/assets/javascripts/fancybox.js +12 -0
- data/vendor/assets/javascripts/jquery.blockui.js +620 -0
- data/vendor/assets/javascripts/tooltipster-plugin-scrollable-tip.js +187 -0
- data/vendor/assets/javascripts/tooltipster-plugin-svg.js +171 -0
- data/vendor/assets/javascripts/tooltipster.bundle.js +4260 -0
- data/vendor/assets/javascripts/vex.combined.js +1621 -0
- data/vendor/assets/stylesheets/fancybox.css +1 -0
- data/vendor/assets/stylesheets/tooltipster-sidetip-borderless.min.css +1 -0
- data/vendor/assets/stylesheets/tooltipster-sidetip-light.min.css +1 -0
- data/vendor/assets/stylesheets/tooltipster-sidetip-noir.min.css +1 -0
- data/vendor/assets/stylesheets/tooltipster-sidetip-punk.min.css +1 -0
- data/vendor/assets/stylesheets/tooltipster-sidetip-shadow.min.css +1 -0
- data/vendor/assets/stylesheets/tooltipster.bundle.css +388 -0
- data/vendor/assets/stylesheets/vex-theme-bottom-right-corner.css +437 -0
- data/vendor/assets/stylesheets/vex-theme-default.css +368 -0
- data/vendor/assets/stylesheets/vex-theme-flat-attack.css +325 -0
- data/vendor/assets/stylesheets/vex-theme-os.css +373 -0
- data/vendor/assets/stylesheets/vex-theme-plain.css +173 -0
- data/vendor/assets/stylesheets/vex-theme-top.css +432 -0
- data/vendor/assets/stylesheets/vex-theme-wireframe.css +174 -0
- data/vendor/assets/stylesheets/vex.css +231 -0
- metadata +100 -0
@@ -0,0 +1,1621 @@
|
|
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
|
+
});
|