(function($){
/*
* Repeater
*
* static model for this field
*
* @type event
* @date 18/08/13
*
*/
acf.fields.repeater = {
$el : null,
o : {},
set : function( o ){
// merge in new option
$.extend( this, o );
// find elements
//this.$input = this.$el.children('input[type="hidden"]');
// get options
this.o = acf.helpers.get_atts( this.$el );
// add row_count
this.o.row_count = this.$el.find('> table > tbody > tr.row').length;
// return this for chaining
return this;
},
init : function(){
// reference
var _this = this,
$el = this.$el;
// sortable
if( this.o.max_rows != 1 )
{
this.$el.find('> table > tbody').unbind('sortable').sortable({
items : '> tr.row',
handle : '> td.order',
helper : acf.helpers.sortable,
forceHelperSize : true,
forcePlaceholderSize : true,
scroll : true,
start : function (event, ui) {
$(document).trigger('acf/sortable_start', ui.item);
$(document).trigger('acf/sortable_start_repeater', ui.item);
// add markup to the placeholder
var td_count = ui.item.children('td').length;
ui.placeholder.html('
| ');
},
stop : function (event, ui) {
$(document).trigger('acf/sortable_stop', ui.item);
$(document).trigger('acf/sortable_stop_repeater', ui.item);
// render
_this.set({ $el : $el }).render();
}
});
}
// render
this.render();
},
render : function(){
// update row_count
this.o.row_count = this.$el.find('> table > tbody > tr.row').length;
// update order numbers
this.$el.find('> table > tbody > tr.row').each(function(i){
$(this).children('td.order').html( i+1 );
});
// empty?
if( this.o.row_count == 0 )
{
this.$el.addClass('empty');
}
else
{
this.$el.removeClass('empty');
}
// row limit reached
if( this.o.row_count >= this.o.max_rows )
{
this.$el.addClass('disabled');
this.$el.find('> .repeater-footer .acf-button').addClass('disabled');
}
else
{
this.$el.removeClass('disabled');
this.$el.find('> .repeater-footer .acf-button').removeClass('disabled');
}
},
add : function( $before ){
// validate
if( this.o.row_count >= this.o.max_rows )
{
alert( acf.l10n.repeater.max.replace('{max}', this.o.max_rows) );
return false;
}
// create and add the new field
var new_id = acf.helpers.uniqid(),
new_field_html = this.$el.find('> table > tbody > tr.row-clone').html().replace(/(=["]*[\w-\[\]]*?)(acfcloneindex)/g, '$1' + new_id),
new_field = $('
').append( new_field_html );
// add row
if( ! $before )
{
$before = this.$el.find('> table > tbody > .row-clone');
}
$before.before( new_field );
// trigger mouseenter on parent repeater to work out css margin on add-row button
this.$el.closest('tr').trigger('mouseenter');
// update order
this.render();
// setup fields
$(document).trigger('acf/setup_fields', new_field);
// validation
this.$el.closest('.field').removeClass('error');
},
remove : function( $tr ){
// refernce
var _this = this;
// validate
if( this.o.row_count <= this.o.min_rows )
{
alert( acf.l10n.repeater.min.replace('{min}', this.o.min_rows) );
return false;
}
// animate out tr
$tr.addClass('acf-remove-item');
setTimeout(function(){
$tr.remove();
// trigger mouseenter on parent repeater to work out css margin on add-row button
_this.$el.closest('tr').trigger('mouseenter');
// render
_this.render();
}, 400);
}
};
/*
* acf/setup_fields
*
* run init function on all elements for this field
*
* @type event
* @date 20/07/13
*
* @param {object} e event object
* @param {object} el DOM object which may contain new ACF elements
* @return N/A
*/
$(document).on('acf/setup_fields', function(e, el){
$(el).find('.repeater').each(function(){
acf.fields.repeater.set({ $el : $(this) }).init();
});
});
/*
* Events
*
* jQuery events for this field
*
* @type function
* @date 1/03/2011
*
* @param N/A
* @return N/A
*/
$(document).on('click', '.repeater .repeater-footer .add-row-end', function( e ){
e.preventDefault();
acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).add( false );
$(this).blur();
});
$(document).on('click', '.repeater td.remove .add-row-before', function( e ){
e.preventDefault();
acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).add( $(this).closest('tr') );
$(this).blur();
});
$(document).on('click', '.repeater td.remove .acf-button-remove', function( e ){
e.preventDefault();
acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).remove( $(this).closest('tr') );
$(this).blur();
});
$(document).on('mouseenter', '.repeater tr.row', function( e ){
// vars
var $el = $(this).find('> td.remove > a.acf-button-add'),
margin = ( $el.parent().height() / 2 ) + 9; // 9 = padding + border
// css
$el.css('margin-top', '-' + margin + 'px' );
});
$(document).on('acf/conditional_logic/show acf/conditional_logic/hide', function( e, $target, item ){
$target.closest('tr.row').trigger('mouseenter');
});
})(jQuery);