| Current Path : /home/emeraadmin/www/4d695/ |
| Current File : /home/emeraadmin/www/4d695/jquery.repeater.tar |
src/outro.js 0000644 00000000013 15167672625 0007054 0 ustar 00 }(jQuery)); src/lib.js 0000644 00000007452 15167672625 0006470 0 ustar 00 var identity = function (x) {
return x;
};
var isArray = function (value) {
return $.isArray(value);
};
var isObject = function (value) {
return !isArray(value) && (value instanceof Object);
};
var isNumber = function (value) {
return value instanceof Number;
};
var isFunction = function (value) {
return value instanceof Function;
};
var indexOf = function (object, value) {
return $.inArray(value, object);
};
var inArray = function (array, value) {
return indexOf(array, value) !== -1;
};
var foreach = function (collection, callback) {
for(var i in collection) {
if(collection.hasOwnProperty(i)) {
callback(collection[i], i, collection);
}
}
};
var last = function (array) {
return array[array.length - 1];
};
var argumentsToArray = function (args) {
return Array.prototype.slice.call(args);
};
var extend = function () {
var extended = {};
foreach(argumentsToArray(arguments), function (o) {
foreach(o, function (val, key) {
extended[key] = val;
});
});
return extended;
};
var mapToArray = function (collection, callback) {
var mapped = [];
foreach(collection, function (value, key, coll) {
mapped.push(callback(value, key, coll));
});
return mapped;
};
var mapToObject = function (collection, callback, keyCallback) {
var mapped = {};
foreach(collection, function (value, key, coll) {
key = keyCallback ? keyCallback(key, value) : key;
mapped[key] = callback(value, key, coll);
});
return mapped;
};
var map = function (collection, callback, keyCallback) {
return isArray(collection) ?
mapToArray(collection, callback) :
mapToObject(collection, callback, keyCallback);
};
var pluck = function (arrayOfObjects, key) {
return map(arrayOfObjects, function (val) {
return val[key];
});
};
var filter = function (collection, callback) {
var filtered;
if(isArray(collection)) {
filtered = [];
foreach(collection, function (val, key, coll) {
if(callback(val, key, coll)) {
filtered.push(val);
}
});
}
else {
filtered = {};
foreach(collection, function (val, key, coll) {
if(callback(val, key, coll)) {
filtered[key] = val;
}
});
}
return filtered;
};
var call = function (collection, functionName, args) {
return map(collection, function (object, name) {
return object[functionName].apply(object, args || []);
});
};
//execute callback immediately and at most one time on the minimumInterval,
//ignore block attempts
var throttle = function (minimumInterval, callback) {
var timeout = null;
return function () {
var that = this, args = arguments;
if(timeout === null) {
timeout = setTimeout(function () {
timeout = null;
}, minimumInterval);
callback.apply(that, args);
}
};
};
var mixinPubSub = function (object) {
object = object || {};
var topics = {};
object.publish = function (topic, data) {
foreach(topics[topic], function (callback) {
callback(data);
});
};
object.subscribe = function (topic, callback) {
topics[topic] = topics[topic] || [];
topics[topic].push(callback);
};
object.unsubscribe = function (callback) {
foreach(topics, function (subscribers) {
var index = indexOf(subscribers, callback);
if(index !== -1) {
subscribers.splice(index, 1);
}
});
};
return object;
};
src/jquery.input.js 0000644 00000033637 15167672625 0010403 0 ustar 00 // jquery.input version 0.0.0
// https://github.com/DubFriend/jquery.input
// (MIT) 09-04-2014
// Brian Detering <BDeterin@gmail.com> (http://www.briandetering.net/)
(function ($) {
'use strict';
var createBaseInput = function (fig, my) {
var self = mixinPubSub(),
$self = fig.$;
self.getType = function () {
throw 'implement me (return type. "text", "radio", etc.)';
};
self.$ = function (selector) {
return selector ? $self.find(selector) : $self;
};
self.disable = function () {
self.$().prop('disabled', true);
self.publish('isEnabled', false);
};
self.enable = function () {
self.$().prop('disabled', false);
self.publish('isEnabled', true);
};
my.equalTo = function (a, b) {
return a === b;
};
my.publishChange = (function () {
var oldValue;
return function (e, domElement) {
var newValue = self.get();
if(!my.equalTo(newValue, oldValue)) {
self.publish('change', { e: e, domElement: domElement });
}
oldValue = newValue;
};
}());
return self;
};
var createInput = function (fig, my) {
var self = createBaseInput(fig, my);
self.get = function () {
return self.$().val();
};
self.set = function (newValue) {
self.$().val(newValue);
};
self.clear = function () {
self.set('');
};
my.buildSetter = function (callback) {
return function (newValue) {
callback.call(self, newValue);
};
};
return self;
};
var inputEqualToArray = function (a, b) {
a = isArray(a) ? a : [a];
b = isArray(b) ? b : [b];
var isEqual = true;
if(a.length !== b.length) {
isEqual = false;
}
else {
foreach(a, function (value) {
if(!inArray(b, value)) {
isEqual = false;
}
});
}
return isEqual;
};
var createInputButton = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'button';
};
self.$().on('change', function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputCheckbox = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'checkbox';
};
self.get = function () {
var values = [];
self.$().filter(':checked').each(function () {
values.push($(this).val());
});
return values;
};
self.set = function (newValues) {
newValues = isArray(newValues) ? newValues : [newValues];
self.$().each(function () {
$(this).prop('checked', false);
});
foreach(newValues, function (value) {
self.$().filter('[value="' + value + '"]')
.prop('checked', true);
});
};
my.equalTo = inputEqualToArray;
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputEmail = function (fig) {
var my = {},
self = createInputText(fig, my);
self.getType = function () {
return 'email';
};
return self;
};
var createInputFile = function (fig) {
var my = {},
self = createBaseInput(fig, my);
self.getType = function () {
return 'file';
};
self.get = function () {
return last(self.$().val().split('\\'));
};
self.clear = function () {
// http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery
this.$().each(function () {
$(this).wrap('<form>').closest('form').get(0).reset();
$(this).unwrap();
});
};
self.$().change(function (e) {
my.publishChange(e, this);
// self.publish('change', self);
});
return self;
};
var createInputHidden = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'hidden';
};
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputMultipleFile = function (fig) {
var my = {},
self = createBaseInput(fig, my);
self.getType = function () {
return 'file[multiple]';
};
self.get = function () {
// http://stackoverflow.com/questions/14035530/how-to-get-value-of-html-5-multiple-file-upload-variable-using-jquery
var fileListObject = self.$().get(0).files || [],
names = [], i;
for(i = 0; i < (fileListObject.length || 0); i += 1) {
names.push(fileListObject[i].name);
}
return names;
};
self.clear = function () {
// http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery
this.$().each(function () {
$(this).wrap('<form>').closest('form').get(0).reset();
$(this).unwrap();
});
};
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputMultipleSelect = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'select[multiple]';
};
self.get = function () {
return self.$().val() || [];
};
self.set = function (newValues) {
self.$().val(
newValues === '' ? [] : isArray(newValues) ? newValues : [newValues]
);
};
my.equalTo = inputEqualToArray;
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputPassword = function (fig) {
var my = {},
self = createInputText(fig, my);
self.getType = function () {
return 'password';
};
return self;
};
var createInputRadio = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'radio';
};
self.get = function () {
return self.$().filter(':checked').val() || null;
};
self.set = function (newValue) {
if(!newValue) {
self.$().each(function () {
$(this).prop('checked', false);
});
}
else {
self.$().filter('[value="' + newValue + '"]').prop('checked', true);
}
};
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputRange = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'range';
};
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputSelect = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'select';
};
self.$().change(function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputText = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'text';
};
self.$().on('change keyup keydown', function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputTextarea = function (fig) {
var my = {},
self = createInput(fig, my);
self.getType = function () {
return 'textarea';
};
self.$().on('change keyup keydown', function (e) {
my.publishChange(e, this);
});
return self;
};
var createInputURL = function (fig) {
var my = {},
self = createInputText(fig, my);
self.getType = function () {
return 'url';
};
return self;
};
var buildFormInputs = function (fig) {
var inputs = {},
$self = fig.$;
var constructor = fig.constructorOverride || {
button: createInputButton,
text: createInputText,
url: createInputURL,
email: createInputEmail,
password: createInputPassword,
range: createInputRange,
textarea: createInputTextarea,
select: createInputSelect,
'select[multiple]': createInputMultipleSelect,
radio: createInputRadio,
checkbox: createInputCheckbox,
file: createInputFile,
'file[multiple]': createInputMultipleFile,
hidden: createInputHidden
};
var addInputsBasic = function (type, selector) {
var $input = isObject(selector) ? selector : $self.find(selector);
$input.each(function () {
var name = $(this).attr('name');
inputs[name] = constructor[type]({
$: $(this)
});
});
};
var addInputsGroup = function (type, selector) {
var names = [],
$input = isObject(selector) ? selector : $self.find(selector);
if(isObject(selector)) {
inputs[$input.attr('name')] = constructor[type]({
$: $input
});
}
else {
// group by name attribute
$input.each(function () {
if(indexOf(names, $(this).attr('name')) === -1) {
names.push($(this).attr('name'));
}
});
foreach(names, function (name) {
inputs[name] = constructor[type]({
$: $self.find('input[name="' + name + '"]')
});
});
}
};
if($self.is('input, select, textarea')) {
if($self.is('input[type="button"], button, input[type="submit"]')) {
addInputsBasic('button', $self);
}
else if($self.is('textarea')) {
addInputsBasic('textarea', $self);
}
else if(
$self.is('input[type="text"]') ||
$self.is('input') && !$self.attr('type')
) {
addInputsBasic('text', $self);
}
else if($self.is('input[type="password"]')) {
addInputsBasic('password', $self);
}
else if($self.is('input[type="email"]')) {
addInputsBasic('email', $self);
}
else if($self.is('input[type="url"]')) {
addInputsBasic('url', $self);
}
else if($self.is('input[type="range"]')) {
addInputsBasic('range', $self);
}
else if($self.is('select')) {
if($self.is('[multiple]')) {
addInputsBasic('select[multiple]', $self);
}
else {
addInputsBasic('select', $self);
}
}
else if($self.is('input[type="file"]')) {
if($self.is('[multiple]')) {
addInputsBasic('file[multiple]', $self);
}
else {
addInputsBasic('file', $self);
}
}
else if($self.is('input[type="hidden"]')) {
addInputsBasic('hidden', $self);
}
else if($self.is('input[type="radio"]')) {
addInputsGroup('radio', $self);
}
else if($self.is('input[type="checkbox"]')) {
addInputsGroup('checkbox', $self);
}
else {
//in all other cases default to a "text" input interface.
addInputsBasic('text', $self);
}
}
else {
addInputsBasic('button', 'input[type="button"], button, input[type="submit"]');
addInputsBasic('text', 'input[type="text"]');
addInputsBasic('password', 'input[type="password"]');
addInputsBasic('email', 'input[type="email"]');
addInputsBasic('url', 'input[type="url"]');
addInputsBasic('range', 'input[type="range"]');
addInputsBasic('textarea', 'textarea');
addInputsBasic('select', 'select:not([multiple])');
addInputsBasic('select[multiple]', 'select[multiple]');
addInputsBasic('file', 'input[type="file"]:not([multiple])');
addInputsBasic('file[multiple]', 'input[type="file"][multiple]');
addInputsBasic('hidden', 'input[type="hidden"]');
addInputsGroup('radio', 'input[type="radio"]');
addInputsGroup('checkbox', 'input[type="checkbox"]');
}
return inputs;
};
$.fn.inputVal = function (newValue) {
var $self = $(this);
var inputs = buildFormInputs({ $: $self });
if($self.is('input, textarea, select')) {
if(typeof newValue === 'undefined') {
return inputs[$self.attr('name')].get();
}
else {
inputs[$self.attr('name')].set(newValue);
return $self;
}
}
else {
if(typeof newValue === 'undefined') {
return call(inputs, 'get');
}
else {
foreach(newValue, function (value, inputName) {
inputs[inputName].set(value);
});
return $self;
}
}
};
$.fn.inputOnChange = function (callback) {
var $self = $(this);
var inputs = buildFormInputs({ $: $self });
foreach(inputs, function (input) {
input.subscribe('change', function (data) {
callback.call(data.domElement, data.e);
});
});
return $self;
};
$.fn.inputDisable = function () {
var $self = $(this);
call(buildFormInputs({ $: $self }), 'disable');
return $self;
};
$.fn.inputEnable = function () {
var $self = $(this);
call(buildFormInputs({ $: $self }), 'enable');
return $self;
};
$.fn.inputClear = function () {
var $self = $(this);
call(buildFormInputs({ $: $self }), 'clear');
return $self;
};
}(jQuery));
src/repeater.js 0000644 00000023235 15167672625 0007526 0 ustar 00 $.fn.repeaterVal = function () {
var parse = function (raw) {
var parsed = [];
foreach(raw, function (val, key) {
var parsedKey = [];
if(key !== "undefined") {
parsedKey.push(key.match(/^[^\[]*/)[0]);
parsedKey = parsedKey.concat(map(
key.match(/\[[^\]]*\]/g),
function (bracketed) {
return bracketed.replace(/[\[\]]/g, '');
}
));
parsed.push({
val: val,
key: parsedKey
});
}
});
return parsed;
};
var build = function (parsed) {
if(
parsed.length === 1 &&
(parsed[0].key.length === 0 || parsed[0].key.length === 1 && !parsed[0].key[0])
) {
return parsed[0].val;
}
foreach(parsed, function (p) {
p.head = p.key.shift();
});
var grouped = (function () {
var grouped = {};
foreach(parsed, function (p) {
if(!grouped[p.head]) {
grouped[p.head] = [];
}
grouped[p.head].push(p);
});
return grouped;
}());
var built;
if(/^[0-9]+$/.test(parsed[0].head)) {
built = [];
foreach(grouped, function (group) {
built.push(build(group));
});
}
else {
built = {};
foreach(grouped, function (group, key) {
built[key] = build(group);
});
}
return built;
};
return build(parse($(this).inputVal()));
};
$.fn.repeater = function (fig) {
fig = fig || {};
var setList;
$(this).each(function () {
var $self = $(this);
var show = fig.show || function () {
$(this).show();
};
var hide = fig.hide || function (removeElement) {
removeElement();
};
var $list = $self.find('[data-repeater-list]').first();
var $filterNested = function ($items, repeaters) {
return $items.filter(function () {
return repeaters ?
$(this).closest(
pluck(repeaters, 'selector').join(',')
).length === 0 : true;
});
};
var $items = function () {
return $filterNested($list.find('[data-repeater-item]'), fig.repeaters);
};
var $itemTemplate = $list.find('[data-repeater-item]')
.first().clone().hide();
var $firstDeleteButton = $filterNested(
$filterNested($(this).find('[data-repeater-item]'), fig.repeaters)
.first().find('[data-repeater-delete]'),
fig.repeaters
);
if(fig.isFirstItemUndeletable && $firstDeleteButton) {
$firstDeleteButton.remove();
}
var getGroupName = function () {
var groupName = $list.data('repeater-list');
return fig.$parent ?
fig.$parent.data('item-name') + '[' + groupName + ']' :
groupName;
};
var initNested = function ($listItems) {
if(fig.repeaters) {
$listItems.each(function () {
var $item = $(this);
foreach(fig.repeaters, function (nestedFig) {
$item.find(nestedFig.selector).repeater(extend(
nestedFig, { $parent: $item }
));
});
});
}
};
var $foreachRepeaterInItem = function (repeaters, $item, cb) {
if(repeaters) {
foreach(repeaters, function (nestedFig) {
cb.call($item.find(nestedFig.selector)[0], nestedFig);
});
}
};
var setIndexes = function ($items, groupName, repeaters) {
$items.each(function (index) {
var $item = $(this);
$item.data('item-name', groupName + '[' + index + ']');
$filterNested($item.find('[name]'), repeaters)
.each(function () {
var $input = $(this);
// match non empty brackets (ex: "[foo]")
var matches = $input.attr('name').match(/\[[^\]]+\]/g);
var name = matches ?
// strip "[" and "]" characters
last(matches).replace(/\[|\]/g, '') :
$input.attr('name');
var newName = groupName + '[' + index + '][' + name + ']' +
($input.is(':checkbox') || $input.attr('multiple') ? '[]' : '');
$input.attr('name', newName);
$foreachRepeaterInItem(repeaters, $item, function (nestedFig) {
var $repeater = $(this);
setIndexes(
$filterNested($repeater.find('[data-repeater-item]'), nestedFig.repeaters || []),
groupName + '[' + index + ']' +
'[' + $repeater.find('[data-repeater-list]').first().data('repeater-list') + ']',
nestedFig.repeaters
);
});
});
});
$list.find('input[name][checked]')
.removeAttr('checked')
.prop('checked', true);
};
setIndexes($items(), getGroupName(), fig.repeaters);
initNested($items());
if(fig.initEmpty) {
$items().remove();
}
if(fig.ready) {
fig.ready(function () {
setIndexes($items(), getGroupName(), fig.repeaters);
});
}
var appendItem = (function () {
var setItemsValues = function ($item, data, repeaters) {
if(data || fig.defaultValues) {
var inputNames = {};
$filterNested($item.find('[name]'), repeaters).each(function () {
var key = $(this).attr('name').match(/\[([^\]]*)(\]|\]\[\])$/)[1];
inputNames[key] = $(this).attr('name');
});
$item.inputVal(map(
filter(data || fig.defaultValues, function (val, name) {
return inputNames[name];
}),
identity,
function (name) {
return inputNames[name];
}
));
}
$foreachRepeaterInItem(repeaters, $item, function (nestedFig) {
var $repeater = $(this);
$filterNested(
$repeater.find('[data-repeater-item]'),
nestedFig.repeaters
)
.each(function () {
var fieldName = $repeater.find('[data-repeater-list]').data('repeater-list');
if(data && data[fieldName]) {
var $template = $(this).clone();
$repeater.find('[data-repeater-item]').remove();
foreach(data[fieldName], function (data) {
var $item = $template.clone();
setItemsValues(
$item,
data,
nestedFig.repeaters || []
);
$repeater.find('[data-repeater-list]').append($item);
});
}
else {
setItemsValues(
$(this),
nestedFig.defaultValues,
nestedFig.repeaters || []
);
}
});
});
};
return function ($item, data) {
$list.append($item);
setIndexes($items(), getGroupName(), fig.repeaters);
$item.find('[name]').each(function () {
$(this).inputClear();
});
setItemsValues($item, data || fig.defaultValues, fig.repeaters);
};
}());
var addItem = function (data) {
var $item = $itemTemplate.clone();
appendItem($item, data);
if(fig.repeaters) {
initNested($item);
}
show.call($item.get(0));
};
setList = function (rows) {
$items().remove();
foreach(rows, addItem);
};
$filterNested($self.find('[data-repeater-create]'), fig.repeaters).click(function () {
addItem();
});
$list.on('click', '[data-repeater-delete]', function () {
var self = $(this).closest('[data-repeater-item]').get(0);
hide.call(self, function () {
$(self).remove();
setIndexes($items(), getGroupName(), fig.repeaters);
});
});
});
this.setList = setList;
return this;
};
src/intro.js 0000644 00000000040 15167672625 0007037 0 ustar 00 (function ($) {
'use strict';
jquery.repeater.min.js 0000644 00000024472 15167672625 0011043 0 ustar 00 // 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); package.json 0000644 00000003375 15167672625 0007063 0 ustar 00 {
"_args": [
[
"jquery.repeater@1.2.1",
"C:\\Users\\Ovi-PC\\Downloads\\themekit-master\\themekit"
]
],
"_from": "jquery.repeater@1.2.1",
"_id": "jquery.repeater@1.2.1",
"_inBundle": false,
"_integrity": "sha1-6ihKaTdL9EeNwuYK9ecFsWnLFRQ=",
"_location": "/jquery.repeater",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "jquery.repeater@1.2.1",
"name": "jquery.repeater",
"escapedName": "jquery.repeater",
"rawSpec": "1.2.1",
"saveSpec": null,
"fetchSpec": "1.2.1"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/jquery.repeater/-/jquery.repeater-1.2.1.tgz",
"_spec": "1.2.1",
"_where": "C:\\Users\\Ovi-PC\\Downloads\\themekit-master\\themekit",
"author": {
"name": "Brian Detering",
"email": "BDeterin@gmail.com",
"url": "http://www.briandetering.net/"
},
"bugs": {
"url": "https://github.com/DubFriend/jquery.repeater/issues"
},
"description": "repeatable form input interface",
"devDependencies": {
"grunt": "^1.0.1",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-qunit": "^1.2.0",
"grunt-contrib-uglify": "^2.0.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-preprocess": "^5.1.0"
},
"directories": {
"test": "test"
},
"homepage": "https://github.com/DubFriend/jquery.repeater",
"keywords": [
"input",
"repeat",
"multiple",
"form"
],
"license": "MIT",
"main": "jquery.repeater.js",
"name": "jquery.repeater",
"repository": {
"type": "git",
"url": "git+https://github.com/DubFriend/jquery.repeater.git"
},
"scripts": {
"test": "grunt test"
},
"version": "1.2.1"
}
complex-repeater.html 0000644 00000000710 15167672625 0010725 0 ustar 00 <div class="complex-repeater">
<div>
<div>
<button data-repeater-create>create</button>
</div>
<div>
<div data-repeater-list="complex-repeater">
<div data-repeater-item>
<div>
<input type="text" name="text-input" value="A"/>
</div>
<div>
<button data-repeater-delete></button>
</div>
</div>
</div>
</div>
</div>
</div>
gruntfile.js 0000644 00000004546 15167672625 0007133 0 ustar 00 module.exports = function (grunt) {
var bannerTemplate = '' +
'// <%= pkg.name %> version <%= pkg.version %>\n' +
'// <%= pkg.repository.url %>\n' +
'// (<%= pkg.license %>) <%= grunt.template.today("dd-mm-yyyy") %>\n' +
'// <%= pkg.author %>\n';
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
preprocess : {
options: {
context : {
DEBUG: true
}
},
test : {
src : 'test/index.pre.html',
dest : 'test/index.html'
},
index: {
src: 'index.pre.html',
dest: 'index.html'
}
},
concat: {
options: {
separator: '\n',
banner: bannerTemplate
},
dist: {
src: [
'src/intro.js',
'src/lib.js',
'src/jquery.input.js',
'src/repeater.js',
'src/outro.js'
],
dest: '<%= pkg.name %>.js'
}
},
uglify: {
options: { banner: bannerTemplate },
dist: {
files: { '<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] }
}
},
qunit: {
// http://stackoverflow.com/questions/22409002/qunitphantomjs-ajax-success-handler-not-called-in-grunt-using-qunit-with-phant
options : {
'--web-security': false,
'--local-to-remote-url-access': true
},
all: ['test/index.html']
},
watch: {
scripts: {
files: ['**/*'],
tasks: ['preprocess', 'concat', 'uglify', 'qunit'],
options: { spawn: true }
}
}
});
grunt.loadNpmTasks('grunt-preprocess');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.registerTask('default', ['preprocess', 'concat', 'uglify', 'qunit']);
grunt.registerTask('test', ['preprocess', 'concat', 'uglify', 'qunit']);
};
index.pre.html 0000644 00000004343 15167672625 0007353 0 ustar 00 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Repeater</title>
<title>jquery.repeater</title>
<style>
html, body {
font-family: Helvetica, Arial, sans-serif;
color: rgb(80, 80, 80);
}
</style>
</head>
<body>
<h2>Repeater</h2>
<!-- @include repeater.html -->
<h2>Nested</h2>
<!-- @include nested-repeater.html -->
<script src="jquery-1.11.1.js"></script>
<script src="jquery.repeater.js"></script>
<script>
$(document).ready(function () {
'use strict';
$('.repeater').repeater({
defaultValues: {
'textarea-input': 'foo',
'text-input': 'bar',
'select-input': 'B',
'checkbox-input': ['A', 'B'],
'radio-input': 'B'
},
show: function () {
$(this).slideDown();
},
hide: function (deleteElement) {
if(confirm('Are you sure you want to delete this element?')) {
$(this).slideUp(deleteElement);
}
},
ready: function (setIndexes) {
}
});
window.outerRepeater = $('.outer-repeater').repeater({
isFirstItemUndeletable: true,
defaultValues: { 'text-input': 'outer-default' },
show: function () {
console.log('outer show');
$(this).slideDown();
},
hide: function (deleteElement) {
console.log('outer delete');
$(this).slideUp(deleteElement);
},
repeaters: [{
isFirstItemUndeletable: true,
selector: '.inner-repeater',
defaultValues: { 'inner-text-input': 'inner-default' },
show: function () {
console.log('inner show');
$(this).slideDown();
},
hide: function (deleteElement) {
console.log('inner delete');
$(this).slideUp(deleteElement);
}
}]
});
});
</script>
</body>
</html>
test/test-lib.js 0000644 00000001640 15167672625 0007626 0 ustar 00 var getNamedInputValues = function ($scope) {
return filter($scope.inputVal(), function (val, key) {
return key !== 'undefined';
});
};
var generateNameMappedInputValues = function (group, index, defaultValue, override) {
var defaultObject = {};
defaultObject['group-' + group + '[' + index + '][text-input]'] = defaultValue;
defaultObject['group-' + group + '[' + index + '][textarea-input]'] = defaultValue;
defaultObject['group-' + group + '[' + index + '][select-input]'] = defaultValue || null;
defaultObject['group-' + group + '[' + index + '][radio-input]'] = defaultValue || null;
defaultObject['group-' + group + '[' + index + '][checkbox-input][]'] = defaultValue ? [defaultValue] : [];
defaultObject['group-' + group + '[' + index + '][multiple-select-input][]'] = defaultValue ? [defaultValue] : [];
return $.extend(defaultObject, override || {});
};
test/echo.php 0000644 00000000042 15167672625 0007167 0 ustar 00 <?php echo json_encode($_POST); ?>