Skip to content

Commit

Permalink
fix for DubFriend#25 firstItemUndeletable fail on nested
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Detering authored and Brian Detering committed Oct 8, 2016
1 parent 45b8390 commit 9259896
Show file tree
Hide file tree
Showing 11 changed files with 122 additions and 56 deletions.
2 changes: 1 addition & 1 deletion gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,4 @@ module.exports = function (grunt) {

grunt.registerTask('default', ['preprocess', 'concat', 'uglify', 'qunit']);
grunt.registerTask('test', ['preprocess', 'concat', 'uglify', 'qunit']);
};
};
22 changes: 12 additions & 10 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -75,22 +75,22 @@ <h2>Repeater</h2>

<h2>Nested</h2>
<form action="echo.php" class="outer-repeater">
<div data-repeater-list="outer-group">
<div data-repeater-item>
<input type="text" name="text-input" value="A"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="outer-group" class="outer">
<div data-repeater-item class="outer">
<input type="text" name="text-input" value="A" class="outer"/>
<input data-repeater-delete type="button" value="Delete" class="outer"/>
<div class="inner-repeater">
<div data-repeater-list="inner-group">
<div data-repeater-item>
<input type="text" name="inner-text-input" value="B"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="inner-group" class="inner">
<div data-repeater-item class="inner">
<input type="text" name="inner-text-input" value="B" class="inner"/>
<input data-repeater-delete type="button" value="Delete" class="inner"/>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="inner"/>
</div>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="outer"/>
</form>

<script src="jquery-1.11.1.js"></script>
Expand Down Expand Up @@ -121,6 +121,7 @@ <h2>Nested</h2>
});

$('.outer-repeater').repeater({
isFirstItemUndeletable: true,
defaultValues: { 'text-input': 'outer-default' },
show: function () {
console.log('outer show');
Expand All @@ -131,6 +132,7 @@ <h2>Nested</h2>
$(this).slideUp(deleteElement);
},
repeaters: [{
isFirstItemUndeletable: true,
selector: '.inner-repeater',
defaultValues: { 'inner-text-input': 'inner-default' },
show: function () {
Expand Down
2 changes: 2 additions & 0 deletions index.pre.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ <h2>Nested</h2>
});

$('.outer-repeater').repeater({
isFirstItemUndeletable: true,
defaultValues: { 'text-input': 'outer-default' },
show: function () {
console.log('outer show');
Expand All @@ -54,6 +55,7 @@ <h2>Nested</h2>
$(this).slideUp(deleteElement);
},
repeaters: [{
isFirstItemUndeletable: true,
selector: '.inner-repeater',
defaultValues: { 'inner-text-input': 'inner-default' },
show: function () {
Expand Down
15 changes: 7 additions & 8 deletions jquery.repeater.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// jquery.repeater version 1.1.5
// jquery.repeater version 1.2.0
// https://github.com/DubFriend/jquery.repeater
// (MIT) 03-10-2016
// (MIT) 08-10-2016
// Brian Detering <[email protected]> (http://www.briandetering.net/)
(function ($) {
'use strict';
Expand Down Expand Up @@ -827,12 +827,11 @@ $.fn.repeater = function (fig) {
var $itemTemplate = $list.find('[data-repeater-item]')
.first().clone().hide();

// if(fig.initEmpty) {
// $itemTemplate.css('display', '');
// }

var $firstDeleteButton = $(this).find('[data-repeater-item]').first()
.find('[data-repeater-delete]');
var $firstDeleteButton = $filterNested(
$filterNested($(this).find('[data-repeater-item]'), fig.repeaters)
.first().find('[data-repeater-delete]'),
fig.repeaters
);

if(fig.isFirstItemUndeletable && $firstDeleteButton) {
$firstDeleteButton.remove();
Expand Down
6 changes: 3 additions & 3 deletions jquery.repeater.min.js

Large diffs are not rendered by default.

20 changes: 10 additions & 10 deletions nested-repeater.html
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
<form action="echo.php" class="outer-repeater">
<div data-repeater-list="outer-group">
<div data-repeater-item>
<input type="text" name="text-input" value="A"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="outer-group" class="outer">
<div data-repeater-item class="outer">
<input type="text" name="text-input" value="A" class="outer"/>
<input data-repeater-delete type="button" value="Delete" class="outer"/>
<div class="inner-repeater">
<div data-repeater-list="inner-group">
<div data-repeater-item>
<input type="text" name="inner-text-input" value="B"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="inner-group" class="inner">
<div data-repeater-item class="inner">
<input type="text" name="inner-text-input" value="B" class="inner"/>
<input data-repeater-delete type="button" value="Delete" class="inner"/>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="inner"/>
</div>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="outer"/>
</form>
14 changes: 7 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jquery.repeater",
"version": "1.1.5",
"version": "1.2.0",
"description": "repeatable form input interface",
"main": "jquery.repeater.js",
"directories": {
Expand All @@ -26,11 +26,11 @@
},
"homepage": "https://github.com/DubFriend/jquery.repeater",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-qunit": "^0.5.2",
"grunt-contrib-uglify": "^0.5.1",
"grunt-contrib-watch": "^0.6.1",
"grunt-preprocess": "^4.0.0"
"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"
}
}
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.1.5",
"version": "1.2.0",
"title": "Repeater",
"author": {
"name": "Brian Detering",
Expand Down
11 changes: 5 additions & 6 deletions src/repeater.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,11 @@ $.fn.repeater = function (fig) {
var $itemTemplate = $list.find('[data-repeater-item]')
.first().clone().hide();

// if(fig.initEmpty) {
// $itemTemplate.css('display', '');
// }

var $firstDeleteButton = $(this).find('[data-repeater-item]').first()
.find('[data-repeater-delete]');
var $firstDeleteButton = $filterNested(
$filterNested($(this).find('[data-repeater-item]'), fig.repeaters)
.first().find('[data-repeater-delete]'),
fig.repeaters
);

if(fig.isFirstItemUndeletable && $firstDeleteButton) {
$firstDeleteButton.remove();
Expand Down
20 changes: 10 additions & 10 deletions test/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,22 +71,22 @@
</form>

<form action="echo.php" class="outer-repeater">
<div data-repeater-list="outer-group">
<div data-repeater-item>
<input type="text" name="text-input" value="A"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="outer-group" class="outer">
<div data-repeater-item class="outer">
<input type="text" name="text-input" value="A" class="outer"/>
<input data-repeater-delete type="button" value="Delete" class="outer"/>
<div class="inner-repeater">
<div data-repeater-list="inner-group">
<div data-repeater-item>
<input type="text" name="inner-text-input" value="B"/>
<input data-repeater-delete type="button" value="Delete"/>
<div data-repeater-list="inner-group" class="inner">
<div data-repeater-item class="inner">
<input type="text" name="inner-text-input" value="B" class="inner"/>
<input data-repeater-delete type="button" value="Delete" class="inner"/>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="inner"/>
</div>
</div>
</div>
<input data-repeater-create type="button" value="Add"/>
<input data-repeater-create type="button" value="Add" class="outer"/>
</form>

<div class="complex-repeater">
Expand Down
64 changes: 64 additions & 0 deletions test/nested.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,70 @@ QUnit.module('nested-repeater', {
});


QUnit.test('isFirstItemUndeletable configuration option', function (assert) {
this.$outerRepeater.repeater({
isFirstItemUndeletable: true,
repeaters: [{
selector: '.inner-repeater',
isFirstItemUndeletable: true
}]
});

this.$outerAddButton.click();
this.$innerAddButton.click();

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

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,
'No delete button on first outer item'
);

assert.strictEqual(
this.$outerRepeater.find('[data-repeater-item].outer')
.last().find('[data-repeater-delete].outer').length,
1,
'Delete button on second outer item'
);

assert.strictEqual(
this.$innerRepeater.find('[data-repeater-item]')
.first().find('[data-repeater-delete]').length,
0,
'No delete button on first inner item of first outer item'
);

assert.strictEqual(
this.$innerRepeater.find('[data-repeater-item]')
.last().find('[data-repeater-delete]').length,
1,
'Delete button on second inner item of first outer item'
);

assert.strictEqual(
this.$outerRepeater.find('[data-repeater-list="inner-group"]').last()
.find('[data-repeater-item]').first().find('[data-repeater-delete]').length,
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]');


// assert.strictEqual($firstDeleteButton.length, 0, 'first delete button is removed');
});

QUnit.test('add item nested outer', function (assert) {
this.$outerRepeater.repeater({ repeaters: [{ selector: '.inner-repeater' }] });
this.$outerAddButton.click();
Expand Down

0 comments on commit 9259896

Please sign in to comment.