(function($, undefined){
var i = 0;
var Field = acf.Field.extend({
type: 'accordion',
wait: '',
$control: function(){
return this.$('.acf-fields:first');
},
initialize: function(){
// bail early if is cell
if( this.$el.is('td') ) return;
// enpoint
if( this.get('endpoint') ) {
return this.remove();
}
// vars
var $field = this.$el;
var $label = this.$labelWrap()
var $input = this.$inputWrap();
var $wrap = this.$control();
var $instructions = $input.children('.description');
// force description into label
if( $instructions.length ) {
$label.append( $instructions );
}
// table
if( this.$el.is('tr') ) {
// vars
var $table = this.$el.closest('table');
var $newLabel = $('
');
var $newInput = $('');
var $newTable = $('');
var $newWrap = $('');
// dom
$newLabel.append( $label.html() );
$newTable.append( $newWrap );
$newInput.append( $newTable );
$input.append( $newLabel );
$input.append( $newInput );
// modify
$label.remove();
$wrap.remove();
$input.attr('colspan', 2);
// update vars
$label = $newLabel;
$input = $newInput;
$wrap = $newWrap;
}
// add classes
$field.addClass('acf-accordion');
$label.addClass('acf-accordion-title');
$input.addClass('acf-accordion-content');
// index
i++;
// multi-expand
if( this.get('multi_expand') ) {
$field.attr('multi-expand', 1);
}
// open
var order = acf.getPreference('this.accordions') || [];
if( order[i-1] !== undefined ) {
this.set('open', order[i-1]);
}
if( this.get('open') ) {
$field.addClass('-open');
$input.css('display', 'block'); // needed for accordion to close smoothly
}
// add icon
$label.prepend( accordionManager.iconHtml({ open: this.get('open') }) );
// classes
// - remove 'inside' which is a #poststuff WP class
var $parent = $field.parent();
$wrap.addClass( $parent.hasClass('-left') ? '-left' : '' );
$wrap.addClass( $parent.hasClass('-clear') ? '-clear' : '' );
// append
$wrap.append( $field.nextUntil('.acf-field-accordion', '.acf-field') );
// clean up
$wrap.removeAttr('data-open data-multi_expand data-endpoint');
},
});
acf.registerFieldType( Field );
/**
* accordionManager
*
* Events manager for the acf accordion
*
* @date 14/2/18
* @since 5.6.9
*
* @param void
* @return void
*/
var accordionManager = new acf.Model({
actions: {
'unload': 'onUnload'
},
events: {
'click .acf-accordion-title': 'onClick',
'invalidField .acf-accordion': 'onInvalidField'
},
isOpen: function( $el ) {
return $el.hasClass('-open');
},
toggle: function( $el ){
if( this.isOpen($el) ) {
this.close( $el );
} else {
this.open( $el );
}
},
iconHtml: function( props ){
// Determine icon.
//if( acf.isGutenberg() ) {
// var icon = props.open ? 'arrow-up-alt2' : 'arrow-down-alt2';
//} else {
var icon = props.open ? 'arrow-down' : 'arrow-right';
//}
// Return HTML.
return '';
},
open: function( $el ){
// open
$el.find('.acf-accordion-content:first').slideDown().css('display', 'block');
$el.find('.acf-accordion-icon:first').replaceWith( this.iconHtml({ open: true }) );
$el.addClass('-open');
// action
acf.doAction('show', $el);
// close siblings
if( !$el.attr('multi-expand') ) {
$el.siblings('.acf-accordion.-open').each(function(){
accordionManager.close( $(this) );
});
}
},
close: function( $el ){
// close
$el.find('.acf-accordion-content:first').slideUp();
$el.find('.acf-accordion-icon:first').replaceWith( this.iconHtml({ open: false }) );
$el.removeClass('-open');
// action
acf.doAction('hide', $el);
},
onClick: function( e, $el ){
// prevent Defailt
e.preventDefault();
// open close
this.toggle( $el.parent() );
},
onInvalidField: function( e, $el ){
// bail early if already focused
if( this.busy ) {
return;
}
// disable functionality for 1sec (allow next validation to work)
this.busy = true;
this.setTimeout(function(){
this.busy = false;
}, 1000);
// open accordion
this.open( $el );
},
onUnload: function( e ){
// vars
var order = [];
// loop
$('.acf-accordion').each(function(){
var open = $(this).hasClass('-open') ? 1 : 0;
order.push(open);
});
// set
if( order.length ) {
acf.setPreference('this.accordions', order);
}
}
});
})(jQuery);