diff --git a/gruntfile.js b/gruntfile.js index 038c6be..64f0098 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -75,4 +75,4 @@ module.exports = function (grunt) { grunt.registerTask('default', ['preprocess', 'concat', 'uglify', 'qunit']); grunt.registerTask('test', ['preprocess', 'concat', 'uglify', 'qunit']); -}; \ No newline at end of file +}; diff --git a/index.html b/index.html index 5ecdd6b..12232e7 100644 --- a/index.html +++ b/index.html @@ -75,22 +75,22 @@

Repeater

Nested

-
-
- - +
+
+ +
-
-
- - +
+
+ +
- +
- + @@ -121,6 +121,7 @@

Nested

}); $('.outer-repeater').repeater({ + isFirstItemUndeletable: true, defaultValues: { 'text-input': 'outer-default' }, show: function () { console.log('outer show'); @@ -131,6 +132,7 @@

Nested

$(this).slideUp(deleteElement); }, repeaters: [{ + isFirstItemUndeletable: true, selector: '.inner-repeater', defaultValues: { 'inner-text-input': 'inner-default' }, show: function () { diff --git a/index.pre.html b/index.pre.html index aef103f..baf027f 100644 --- a/index.pre.html +++ b/index.pre.html @@ -44,6 +44,7 @@

Nested

}); $('.outer-repeater').repeater({ + isFirstItemUndeletable: true, defaultValues: { 'text-input': 'outer-default' }, show: function () { console.log('outer show'); @@ -54,6 +55,7 @@

Nested

$(this).slideUp(deleteElement); }, repeaters: [{ + isFirstItemUndeletable: true, selector: '.inner-repeater', defaultValues: { 'inner-text-input': 'inner-default' }, show: function () { diff --git a/jquery.repeater.js b/jquery.repeater.js index a2302fa..ebd911f 100644 --- a/jquery.repeater.js +++ b/jquery.repeater.js @@ -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 (http://www.briandetering.net/) (function ($) { 'use strict'; @@ -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(); diff --git a/jquery.repeater.min.js b/jquery.repeater.min.js index ba5802a..91ffe1c 100644 --- a/jquery.repeater.min.js +++ b/jquery.repeater.min.js @@ -1,5 +1,5 @@ -// 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 (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-1!==e(a,b)},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,c){return m(a,function(a,d){return a[b].apply(a,c||[])})},p=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);-1!==c&&b.splice(c,1)})},a};!function(a){var b=function(a,b){var c=p(),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("
").closest("form").get(0).reset(),a(this).unwrap()})},e.$().change(function(a){d.publishChange(a,this)}),e},q=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("").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:q},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(){-1===e(j,a(this).attr("name"))&&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?o(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 o(A({$:b}),"disable"),b},a.fn.inputEnable=function(){var b=a(this);return o(A({$:b}),"enable"),b},a.fn.inputClear=function(){var b=a(this);return o(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){return c=c||{},a(this).each(function(){var d=a(this),e=c.show||function(){a(this).show()},f=c.hide||function(a){a()},i=d.find("[data-repeater-list]").first(),k=function(b,c){return b.filter(function(){return c?0===a(this).closest(n(c,"selector").join(",")).length:!0})},l=function(){return k(i.find("[data-repeater-item]"),c.repeaters)},o=i.find("[data-repeater-item]").first().clone().hide(),p=a(this).find("[data-repeater-item]").first().find("[data-repeater-delete]");c.isFirstItemUndeletable&&p&&p.remove();var q=function(){var a=i.data("repeater-list");return c.$parent?c.$parent.data("item-name")+"["+a+"]":a},r=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}))})})},s=function(a,b,c){a&&g(a,function(a){c.call(b.find(a.selector)[0],a)})},t=function(b,c,d){b.each(function(b){var e=a(this);e.data("item-name",c+"["+b+"]"),k(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),s(d,e,function(d){var e=a(this);t(k(e.find("[data-repeater-item]"),d.repeaters||[]),c+"["+b+"]["+e.find("[data-repeater-list]").first().data("repeater-list")+"]",d.repeaters)})})}),i.find("input[name][checked]").removeAttr("checked").prop("checked",!0)};t(l(),q(),c.repeaters),r(l()),c.initEmpty&&l().remove(),c.ready&&c.ready(function(){t(l(),q(),c.repeaters)});var u=function(){var d=function(c,e,f){if(e){var g={};k(c.find("[name]"),f).each(function(){var b=a(this).attr("name").match(/\[([^\]]*)(\]|\]\[\])$/)[1];g[b]=a(this).attr("name")}),c.inputVal(m(e,b,function(a){return g[a]}))}s(f,c,function(b){var c=a(this);k(c.find("[data-repeater-item]"),b.repeaters).each(function(){d(a(this),b.defaultValues,b.repeaters||[])})})};return function(b){i.append(b),t(l(),q(),c.repeaters),b.find("[name]").each(function(){a(this).inputClear()}),d(b,c.defaultValues,c.repeaters)}}(),v=function(){var a=o.clone();u(a),c.repeaters&&r(a),e.call(a.get(0))};k(d.find("[data-repeater-create]"),c.repeaters).click(v),i.on("click","[data-repeater-delete]",function(){var b=a(this).closest("[data-repeater-item]").get(0);f.call(b,function(){a(b).remove(),t(l(),q(),c.repeaters)})})}),this}}(jQuery); \ No newline at end of file +!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,c){return m(a,function(a,d){return a[b].apply(a,c||[])})},p=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=p(),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("").closest("form").get(0).reset(),a(this).unwrap()})},e.$().change(function(a){d.publishChange(a,this)}),e},q=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("").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:q},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?o(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 o(A({$:b}),"disable"),b},a.fn.inputEnable=function(){var b=a(this);return o(A({$:b}),"enable"),b},a.fn.inputClear=function(){var b=a(this);return o(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){return c=c||{},a(this).each(function(){var d=a(this),e=c.show||function(){a(this).show()},f=c.hide||function(a){a()},i=d.find("[data-repeater-list]").first(),k=function(b,c){return b.filter(function(){return!c||0===a(this).closest(n(c,"selector").join(",")).length})},l=function(){return k(i.find("[data-repeater-item]"),c.repeaters)},o=i.find("[data-repeater-item]").first().clone().hide(),p=k(k(a(this).find("[data-repeater-item]"),c.repeaters).first().find("[data-repeater-delete]"),c.repeaters);c.isFirstItemUndeletable&&p&&p.remove();var q=function(){var a=i.data("repeater-list");return c.$parent?c.$parent.data("item-name")+"["+a+"]":a},r=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}))})})},s=function(a,b,c){a&&g(a,function(a){c.call(b.find(a.selector)[0],a)})},t=function(b,c,d){b.each(function(b){var e=a(this);e.data("item-name",c+"["+b+"]"),k(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),s(d,e,function(d){var e=a(this);t(k(e.find("[data-repeater-item]"),d.repeaters||[]),c+"["+b+"]["+e.find("[data-repeater-list]").first().data("repeater-list")+"]",d.repeaters)})})}),i.find("input[name][checked]").removeAttr("checked").prop("checked",!0)};t(l(),q(),c.repeaters),r(l()),c.initEmpty&&l().remove(),c.ready&&c.ready(function(){t(l(),q(),c.repeaters)});var u=function(){var d=function(c,e,f){if(e){var g={};k(c.find("[name]"),f).each(function(){var b=a(this).attr("name").match(/\[([^\]]*)(\]|\]\[\])$/)[1];g[b]=a(this).attr("name")}),c.inputVal(m(e,b,function(a){return g[a]}))}s(f,c,function(b){var c=a(this);k(c.find("[data-repeater-item]"),b.repeaters).each(function(){d(a(this),b.defaultValues,b.repeaters||[])})})};return function(b){i.append(b),t(l(),q(),c.repeaters),b.find("[name]").each(function(){a(this).inputClear()}),d(b,c.defaultValues,c.repeaters)}}(),v=function(){var a=o.clone();u(a),c.repeaters&&r(a),e.call(a.get(0))};k(d.find("[data-repeater-create]"),c.repeaters).click(v),i.on("click","[data-repeater-delete]",function(){var b=a(this).closest("[data-repeater-item]").get(0);f.call(b,function(){a(b).remove(),t(l(),q(),c.repeaters)})})}),this}}(jQuery); \ No newline at end of file diff --git a/nested-repeater.html b/nested-repeater.html index 317cf43..96ef1b7 100644 --- a/nested-repeater.html +++ b/nested-repeater.html @@ -1,18 +1,18 @@ -
-
- - +
+
+ +
-
-
- - +
+
+ +
- +
- + diff --git a/package.json b/package.json index 413cac6..df2da99 100644 --- a/package.json +++ b/package.json @@ -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": { @@ -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" } } diff --git a/repeater.jquery.json b/repeater.jquery.json index 8eddcc5..396016b 100644 --- a/repeater.jquery.json +++ b/repeater.jquery.json @@ -1,6 +1,6 @@ { "name": "repeater", - "version": "1.1.5", + "version": "1.2.0", "title": "Repeater", "author": { "name": "Brian Detering", diff --git a/src/repeater.js b/src/repeater.js index bb8d5e1..afb95c3 100644 --- a/src/repeater.js +++ b/src/repeater.js @@ -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(); diff --git a/test/index.html b/test/index.html index 1977cb0..3f97eda 100644 --- a/test/index.html +++ b/test/index.html @@ -71,22 +71,22 @@
-
-
- - +
+
+ +
-
-
- - +
+
+ +
- +
- +
diff --git a/test/nested.js b/test/nested.js index 0ffc65f..4e779d8 100644 --- a/test/nested.js +++ b/test/nested.js @@ -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();