97 lines
14 KiB
JavaScript
97 lines
14 KiB
JavaScript
|
// jquery.repeater version 1.2.1
|
||
|
// https://github.com/DubFriend/jquery.repeater
|
||
|
// (MIT) 09-10-2016
|
||
|
// Brian Detering <BDeterin@gmail.com> (http://www.briandetering.net/)
|
||
|
! function(a) { "use strict"; var b = function(a) { return a },
|
||
|
c = function(b) { return a.isArray(b) },
|
||
|
d = function(a) { return !c(a) && a instanceof Object },
|
||
|
e = function(b, c) { return a.inArray(c, b) },
|
||
|
f = function(a, b) { return e(a, b) !== -1 },
|
||
|
g = function(a, b) { for (var c in a) a.hasOwnProperty(c) && b(a[c], c, a) },
|
||
|
h = function(a) { return a[a.length - 1] },
|
||
|
i = function(a) { return Array.prototype.slice.call(a) },
|
||
|
j = function() { var a = {}; return g(i(arguments), function(b) { g(b, function(b, c) { a[c] = b }) }), a },
|
||
|
k = function(a, b) { var c = []; return g(a, function(a, d, e) { c.push(b(a, d, e)) }), c },
|
||
|
l = function(a, b, c) { var d = {}; return g(a, function(a, e, f) { e = c ? c(e, a) : e, d[e] = b(a, e, f) }), d },
|
||
|
m = function(a, b, d) { return c(a) ? k(a, b) : l(a, b, d) },
|
||
|
n = function(a, b) { return m(a, function(a) { return a[b] }) },
|
||
|
o = function(a, b) { var d; return c(a) ? (d = [], g(a, function(a, c, e) { b(a, c, e) && d.push(a) })) : (d = {}, g(a, function(a, c, e) { b(a, c, e) && (d[c] = a) })), d },
|
||
|
p = function(a, b, c) { return m(a, function(a, d) { return a[b].apply(a, c || []) }) },
|
||
|
q = function(a) { a = a || {}; var b = {}; return a.publish = function(a, c) { g(b[a], function(a) { a(c) }) }, a.subscribe = function(a, c) { b[a] = b[a] || [], b[a].push(c) }, a.unsubscribe = function(a) { g(b, function(b) { var c = e(b, a);
|
||
|
c !== -1 && b.splice(c, 1) }) }, a };! function(a) { var b = function(a, b) { var c = q(),
|
||
|
d = a.$; return c.getType = function() { throw 'implement me (return type. "text", "radio", etc.)' }, c.$ = function(a) { return a ? d.find(a) : d }, c.disable = function() { c.$().prop("disabled", !0), c.publish("isEnabled", !1) }, c.enable = function() { c.$().prop("disabled", !1), c.publish("isEnabled", !0) }, b.equalTo = function(a, b) { return a === b }, b.publishChange = function() { var a; return function(d, e) { var f = c.get();
|
||
|
b.equalTo(f, a) || c.publish("change", { e: d, domElement: e }), a = f } }(), c },
|
||
|
i = function(a, c) { var d = b(a, c); return d.get = function() { return d.$().val() }, d.set = function(a) { d.$().val(a) }, d.clear = function() { d.set("") }, c.buildSetter = function(a) { return function(b) { a.call(d, b) } }, d },
|
||
|
j = function(a, b) { a = c(a) ? a : [a], b = c(b) ? b : [b]; var d = !0; return a.length !== b.length ? d = !1 : g(a, function(a) { f(b, a) || (d = !1) }), d },
|
||
|
k = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "button" }, c.$().on("change", function(a) { b.publishChange(a, this) }), c },
|
||
|
l = function(b) { var d = {},
|
||
|
e = i(b, d); return e.getType = function() { return "checkbox" }, e.get = function() { var b = []; return e.$().filter(":checked").each(function() { b.push(a(this).val()) }), b }, e.set = function(b) { b = c(b) ? b : [b], e.$().each(function() { a(this).prop("checked", !1) }), g(b, function(a) { e.$().filter('[value="' + a + '"]').prop("checked", !0) }) }, d.equalTo = j, e.$().change(function(a) { d.publishChange(a, this) }), e },
|
||
|
m = function(a) { var b = {},
|
||
|
c = x(a, b); return c.getType = function() { return "email" }, c },
|
||
|
n = function(c) { var d = {},
|
||
|
e = b(c, d); return e.getType = function() { return "file" }, e.get = function() { return h(e.$().val().split("\\")) }, e.clear = function() { this.$().each(function() { a(this).wrap("<form>").closest("form").get(0).reset(), a(this).unwrap() }) }, e.$().change(function(a) { d.publishChange(a, this) }), e },
|
||
|
o = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "hidden" }, c.$().change(function(a) { b.publishChange(a, this) }), c },
|
||
|
r = function(c) { var d = {},
|
||
|
e = b(c, d); return e.getType = function() { return "file[multiple]" }, e.get = function() { var a, b = e.$().get(0).files || [],
|
||
|
c = []; for (a = 0; a < (b.length || 0); a += 1) c.push(b[a].name); return c }, e.clear = function() { this.$().each(function() { a(this).wrap("<form>").closest("form").get(0).reset(), a(this).unwrap() }) }, e.$().change(function(a) { d.publishChange(a, this) }), e },
|
||
|
s = function(a) { var b = {},
|
||
|
d = i(a, b); return d.getType = function() { return "select[multiple]" }, d.get = function() { return d.$().val() || [] }, d.set = function(a) { d.$().val("" === a ? [] : c(a) ? a : [a]) }, b.equalTo = j, d.$().change(function(a) { b.publishChange(a, this) }), d },
|
||
|
t = function(a) { var b = {},
|
||
|
c = x(a, b); return c.getType = function() { return "password" }, c },
|
||
|
u = function(b) { var c = {},
|
||
|
d = i(b, c); return d.getType = function() { return "radio" }, d.get = function() { return d.$().filter(":checked").val() || null }, d.set = function(b) { b ? d.$().filter('[value="' + b + '"]').prop("checked", !0) : d.$().each(function() { a(this).prop("checked", !1) }) }, d.$().change(function(a) { c.publishChange(a, this) }), d },
|
||
|
v = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "range" }, c.$().change(function(a) { b.publishChange(a, this) }), c },
|
||
|
w = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "select" }, c.$().change(function(a) { b.publishChange(a, this) }), c },
|
||
|
x = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "text" }, c.$().on("change keyup keydown", function(a) { b.publishChange(a, this) }), c },
|
||
|
y = function(a) { var b = {},
|
||
|
c = i(a, b); return c.getType = function() { return "textarea" }, c.$().on("change keyup keydown", function(a) { b.publishChange(a, this) }), c },
|
||
|
z = function(a) { var b = {},
|
||
|
c = x(a, b); return c.getType = function() { return "url" }, c },
|
||
|
A = function(b) { var c = {},
|
||
|
f = b.$,
|
||
|
h = b.constructorOverride || { button: k, text: x, url: z, email: m, password: t, range: v, textarea: y, select: w, "select[multiple]": s, radio: u, checkbox: l, file: n, "file[multiple]": r, hidden: o },
|
||
|
i = function(b, e) { var g = d(e) ? e : f.find(e);
|
||
|
g.each(function() { var d = a(this).attr("name");
|
||
|
c[d] = h[b]({ $: a(this) }) }) },
|
||
|
j = function(b, i) { var j = [],
|
||
|
k = d(i) ? i : f.find(i);
|
||
|
d(i) ? c[k.attr("name")] = h[b]({ $: k }) : (k.each(function() { e(j, a(this).attr("name")) === -1 && j.push(a(this).attr("name")) }), g(j, function(a) { c[a] = h[b]({ $: f.find('input[name="' + a + '"]') }) })) }; return f.is("input, select, textarea") ? f.is('input[type="button"], button, input[type="submit"]') ? i("button", f) : f.is("textarea") ? i("textarea", f) : f.is('input[type="text"]') || f.is("input") && !f.attr("type") ? i("text", f) : f.is('input[type="password"]') ? i("password", f) : f.is('input[type="email"]') ? i("email", f) : f.is('input[type="url"]') ? i("url", f) : f.is('input[type="range"]') ? i("range", f) : f.is("select") ? f.is("[multiple]") ? i("select[multiple]", f) : i("select", f) : f.is('input[type="file"]') ? f.is("[multiple]") ? i("file[multiple]", f) : i("file", f) : f.is('input[type="hidden"]') ? i("hidden", f) : f.is('input[type="radio"]') ? j("radio", f) : f.is('input[type="checkbox"]') ? j("checkbox", f) : i("text", f) : (i("button", 'input[type="button"], button, input[type="submit"]'), i("text", 'input[type="text"]'), i("password", 'input[type="password"]'), i("email", 'input[type="email"]'), i("url", 'input[type="url"]'), i("range", 'input[type="range"]'), i("textarea", "textarea"), i("select", "select:not([multiple])"), i("select[multiple]", "select[multiple]"), i("file", 'input[type="file"]:not([multiple])'), i("file[multiple]", 'input[type="file"][multiple]'), i("hidden", 'input[type="hidden"]'), j("radio", 'input[type="radio"]'), j("checkbox", 'input[type="checkbox"]')), c };
|
||
|
a.fn.inputVal = function(b) { var c = a(this),
|
||
|
d = A({ $: c }); return c.is("input, textarea, select") ? "undefined" == typeof b ? d[c.attr("name")].get() : (d[c.attr("name")].set(b), c) : "undefined" == typeof b ? p(d, "get") : (g(b, function(a, b) { d[b].set(a) }), c) }, a.fn.inputOnChange = function(b) { var c = a(this),
|
||
|
d = A({ $: c }); return g(d, function(a) { a.subscribe("change", function(a) { b.call(a.domElement, a.e) }) }), c }, a.fn.inputDisable = function() { var b = a(this); return p(A({ $: b }), "disable"), b }, a.fn.inputEnable = function() { var b = a(this); return p(A({ $: b }), "enable"), b }, a.fn.inputClear = function() { var b = a(this); return p(A({ $: b }), "clear"), b } }(jQuery), a.fn.repeaterVal = function() { var b = function(a) { var b = []; return g(a, function(a, c) { var d = []; "undefined" !== c && (d.push(c.match(/^[^\[]*/)[0]), d = d.concat(m(c.match(/\[[^\]]*\]/g), function(a) { return a.replace(/[\[\]]/g, "") })), b.push({ val: a, key: d })) }), b },
|
||
|
c = function(a) { if (1 === a.length && (0 === a[0].key.length || 1 === a[0].key.length && !a[0].key[0])) return a[0].val;
|
||
|
g(a, function(a) { a.head = a.key.shift() }); var b, d = function() { var b = {}; return g(a, function(a) { b[a.head] || (b[a.head] = []), b[a.head].push(a) }), b }(); return /^[0-9]+$/.test(a[0].head) ? (b = [], g(d, function(a) { b.push(c(a)) })) : (b = {}, g(d, function(a, d) { b[d] = c(a) })), b }; return c(b(a(this).inputVal())) }, a.fn.repeater = function(c) { c = c || {}; var d; return a(this).each(function() { var e = a(this),
|
||
|
f = c.show || function() { a(this).show() },
|
||
|
i = c.hide || function(a) { a() },
|
||
|
k = e.find("[data-repeater-list]").first(),
|
||
|
l = function(b, c) { return b.filter(function() { return !c || 0 === a(this).closest(n(c, "selector").join(",")).length }) },
|
||
|
p = function() { return l(k.find("[data-repeater-item]"), c.repeaters) },
|
||
|
q = k.find("[data-repeater-item]").first().clone().hide(),
|
||
|
r = l(l(a(this).find("[data-repeater-item]"), c.repeaters).first().find("[data-repeater-delete]"), c.repeaters);
|
||
|
c.isFirstItemUndeletable && r && r.remove(); var s = function() { var a = k.data("repeater-list"); return c.$parent ? c.$parent.data("item-name") + "[" + a + "]" : a },
|
||
|
t = function(b) { c.repeaters && b.each(function() { var b = a(this);
|
||
|
g(c.repeaters, function(a) { b.find(a.selector).repeater(j(a, { $parent: b })) }) }) },
|
||
|
u = function(a, b, c) { a && g(a, function(a) { c.call(b.find(a.selector)[0], a) }) },
|
||
|
v = function(b, c, d) { b.each(function(b) { var e = a(this);
|
||
|
e.data("item-name", c + "[" + b + "]"), l(e.find("[name]"), d).each(function() { var f = a(this),
|
||
|
g = f.attr("name").match(/\[[^\]]+\]/g),
|
||
|
i = g ? h(g).replace(/\[|\]/g, "") : f.attr("name"),
|
||
|
j = c + "[" + b + "][" + i + "]" + (f.is(":checkbox") || f.attr("multiple") ? "[]" : "");
|
||
|
f.attr("name", j), u(d, e, function(d) { var e = a(this);
|
||
|
v(l(e.find("[data-repeater-item]"), d.repeaters || []), c + "[" + b + "][" + e.find("[data-repeater-list]").first().data("repeater-list") + "]", d.repeaters) }) }) }), k.find("input[name][checked]").removeAttr("checked").prop("checked", !0) };
|
||
|
v(p(), s(), c.repeaters), t(p()), c.initEmpty && p().remove(), c.ready && c.ready(function() { v(p(), s(), c.repeaters) }); var w = function() { var d = function(e, f, h) { if (f || c.defaultValues) { var i = {};
|
||
|
l(e.find("[name]"), h).each(function() { var b = a(this).attr("name").match(/\[([^\]]*)(\]|\]\[\])$/)[1];
|
||
|
i[b] = a(this).attr("name") }), e.inputVal(m(o(f || c.defaultValues, function(a, b) { return i[b] }), b, function(a) { return i[a] })) }
|
||
|
u(h, e, function(b) { var c = a(this);
|
||
|
l(c.find("[data-repeater-item]"), b.repeaters).each(function() { var e = c.find("[data-repeater-list]").data("repeater-list"); if (f && f[e]) { var h = a(this).clone();
|
||
|
c.find("[data-repeater-item]").remove(), g(f[e], function(a) { var e = h.clone();
|
||
|
d(e, a, b.repeaters || []), c.find("[data-repeater-list]").append(e) }) } else d(a(this), b.defaultValues, b.repeaters || []) }) }) }; return function(b, e) { k.append(b), v(p(), s(), c.repeaters), b.find("[name]").each(function() { a(this).inputClear() }), d(b, e || c.defaultValues, c.repeaters) } }(),
|
||
|
x = function(a) { var b = q.clone();
|
||
|
w(b, a), c.repeaters && t(b), f.call(b.get(0)) };
|
||
|
d = function(a) { p().remove(), g(a, x) }, l(e.find("[data-repeater-create]"), c.repeaters).click(function() { x() }), k.on("click", "[data-repeater-delete]", function() { var b = a(this).closest("[data-repeater-item]").get(0);
|
||
|
i.call(b, function() { a(b).remove(), v(p(), s(), c.repeaters) }) }) }), this.setList = d, this } }(jQuery);
|