Skip to content

Commit

Permalink
setList
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Detering authored and Brian Detering committed Oct 9, 2016
1 parent 9259896 commit 7dc4fea
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 51 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,18 @@ $('.repeater').repeater();
//get the values of the inputs as a formatted object
$('.repeater').repeaterVal();
```

## setList

You can set repeater list data after it has been initialized.

```javascript
var $repeater = $('.repeater').repeater();
$repeater.setList([
{
'text-input': 'set-a',
'inner-group': [{ 'inner-text-input': 'set-b' }]
},
{ 'text-input': 'set-foo' }
]);
```
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ <h2>Nested</h2>
}
});

$('.outer-repeater').repeater({
window.outerRepeater = $('.outer-repeater').repeater({
isFirstItemUndeletable: true,
defaultValues: { 'text-input': 'outer-default' },
show: function () {
Expand Down
2 changes: 1 addition & 1 deletion index.pre.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ <h2>Nested</h2>
}
});

$('.outer-repeater').repeater({
window.outerRepeater = $('.outer-repeater').repeater({
isFirstItemUndeletable: true,
defaultValues: { 'text-input': 'outer-default' },
show: function () {
Expand Down
71 changes: 52 additions & 19 deletions jquery.repeater.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// jquery.repeater version 1.2.0
// jquery.repeater version 1.2.1
// https://github.com/DubFriend/jquery.repeater
// (MIT) 08-10-2016
// (MIT) 09-10-2016
// Brian Detering <[email protected]> (http://www.briandetering.net/)
(function ($) {
'use strict';
Expand Down Expand Up @@ -797,6 +797,8 @@ $.fn.repeaterVal = function () {
$.fn.repeater = function (fig) {
fig = fig || {};

var setList;

$(this).each(function () {

var $self = $(this);
Expand Down Expand Up @@ -915,58 +917,87 @@ $.fn.repeater = function (fig) {
});
}



var appendItem = (function () {
var setItemsValues = function ($item, values, repeaters) {
if(values) {
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(values, identity, function (name) {
return inputNames[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 () {
setItemsValues(
$(this),
nestedFig.defaultValues,
nestedFig.repeaters || []
);
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) {
return function ($item, data) {
$list.append($item);
setIndexes($items(), getGroupName(), fig.repeaters);
$item.find('[name]').each(function () {
$(this).inputClear();
});
setItemsValues($item, fig.defaultValues, fig.repeaters);
setItemsValues($item, data || fig.defaultValues, fig.repeaters);
};
}());

var addItem = function () {
var addItem = function (data) {
var $item = $itemTemplate.clone();
appendItem($item);
appendItem($item, data);
if(fig.repeaters) {
initNested($item);
}
show.call($item.get(0));
};

$filterNested($self.find('[data-repeater-create]'), fig.repeaters).click(addItem);
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);
Expand All @@ -977,6 +1008,8 @@ $.fn.repeater = function (fig) {
});
});

this.setList = setList;

return this;
};

Expand Down
6 changes: 3 additions & 3 deletions jquery.repeater.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jquery.repeater",
"version": "1.2.0",
"version": "1.2.1",
"description": "repeatable form input interface",
"main": "jquery.repeater.js",
"directories": {
Expand Down
2 changes: 1 addition & 1 deletion repeater.jquery.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "repeater",
"version": "1.2.0",
"version": "1.2.1",
"title": "Repeater",
"author": {
"name": "Brian Detering",
Expand Down
67 changes: 50 additions & 17 deletions src/repeater.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ $.fn.repeaterVal = function () {
$.fn.repeater = function (fig) {
fig = fig || {};

var setList;

$(this).each(function () {

var $self = $(this);
Expand Down Expand Up @@ -190,58 +192,87 @@ $.fn.repeater = function (fig) {
});
}



var appendItem = (function () {
var setItemsValues = function ($item, values, repeaters) {
if(values) {
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(values, identity, function (name) {
return inputNames[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 () {
setItemsValues(
$(this),
nestedFig.defaultValues,
nestedFig.repeaters || []
);
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) {
return function ($item, data) {
$list.append($item);
setIndexes($items(), getGroupName(), fig.repeaters);
$item.find('[name]').each(function () {
$(this).inputClear();
});
setItemsValues($item, fig.defaultValues, fig.repeaters);
setItemsValues($item, data || fig.defaultValues, fig.repeaters);
};
}());

var addItem = function () {
var addItem = function (data) {
var $item = $itemTemplate.clone();
appendItem($item);
appendItem($item, data);
if(fig.repeaters) {
initNested($item);
}
show.call($item.get(0));
};

$filterNested($self.find('[data-repeater-create]'), fig.repeaters).click(addItem);
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);
Expand All @@ -252,5 +283,7 @@ $.fn.repeater = function (fig) {
});
});

this.setList = setList;

return this;
};
40 changes: 32 additions & 8 deletions test/nested.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@ QUnit.test('isFirstItemUndeletable configuration option', function (assert) {
assert.strictEqual($outerItems.length, 2, 'adds a second item to outer list');
assert.strictEqual($innerItems.length, 2, 'adds a second item to inner list');
assert.strictEqual(
// this.$outerRepeater.find('[data-repeater-list="outer-group"] > [data-repeater-item]')
// .first().find('[data-repeater-delete]').length,
// this.$outerRepeater.find(
// '[data-repeater-list="outer-group"] > [data-repeater-item] > [data-repeater-delete]'
// ).first().length,
this.$outerRepeater.find('[data-repeater-item].outer')
.first().find('[data-repeater-delete].outer').length,
0,
Expand Down Expand Up @@ -66,12 +61,41 @@ QUnit.test('isFirstItemUndeletable configuration option', function (assert) {
0,
'No delete button on first inner item of second outer item'
);
});

// var $firstDeleteButton = this.$repeater.find('[data-repeater-item]')
// .first().find('[data-repeater-delete]');
QUnit.test('setList', function (assert) {
var repeater = this.$outerRepeater.repeater({
repeaters: [{ selector: '.inner-repeater' }]
});
repeater.setList([
{
'text-input': 'set-a',
'inner-group': [{ 'inner-text-input': 'set-b' }]
},
{
'text-input': 'set-foo',
'inner-group': []
}
]);

var $items = this.$outerRepeater.find('[data-repeater-list="outer-group"] > [data-repeater-item]');

// assert.strictEqual($firstDeleteButton.length, 0, 'first delete button is removed');
assert.deepEqual(
getNamedInputValues($items.first()),
{
"outer-group[0][text-input]": "set-a",
"outer-group[0][inner-group][0][inner-text-input]": "set-b"
},
'set first item'
);

assert.deepEqual(
getNamedInputValues($items.last()),
{
"outer-group[1][text-input]": "set-foo"
},
'set second item'
);
});

QUnit.test('add item nested outer', function (assert) {
Expand Down

0 comments on commit 7dc4fea

Please sign in to comment.