/**
* Content Widget JS file
*
* This file contains functions relating to the Content Widget
*
* @package Layers
* @since Layers 1.0.0
* Contents
* 1 - Define Repeater Plugin
* 2 - Init Repeaters
* 3 - Remove Item
* 4 - Add Item
* 5 - Update Item Title
*
* Author: Obox Themes
* Author URI: http://www.oboxthemes.com/
* License: GNU General Public License v2 or later
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/
jQuery(document).ready(function($){
/**
* 1 - Define Repeater Plugin
*/
$.fn.layersRepeater = function( options ) {
// Apply defaults to the options
$.extend( options, options, {});
return this.each(function() {
var $repeater = $(this);
$repeater.find( 'ul.layers-accordions-sortable' ).sortable({
placeholder: "layers-sortable-drop",
handle: ".layers-accordion-title",
stop: function(e , li){
// Get Elements
$repeater_list = li.item.closest( 'ul' );
$repeater = $repeater_list.parents('.layers-widget-repeater');
$repeater_input = $repeater.find('.layers-repeater-input');
// Apply new column order
$item_guids = [];
$repeater_list.find( 'li.layers-accordion-item' ).each(function(){
$item_guids.push( $(this).data( 'guid' ) );
});
// Trigger change for ajax save
$repeater_input.val( $item_guids.join() ).layers_trigger_change();
}
});
});
};
/**
* 2 - Init Init Repeaters
*/
$( document ).on( 'layers-interface-init', function( e, element ){
$(element).find( '.layers-widget-repeater' ).each( function(){
$(this).layersRepeater();
});
});
/**
* 3 - Add Item Function (used for 'add item', 'duplicate item')
*/
function add_item( $repeater, $duplicate_guid ) {
// Get elements
$repeater = $repeater;
$repeater_add_button = $repeater.find('.layers-widget-repeater-add-item');
$repeater_list = $repeater.find('.layers-accordions');
$repeater_input = $repeater.find('.layers-repeater-input');
$repeater_new_item_tpl = $repeater.find('.layers-widget-repeater-template');
$widget_form = $repeater.parents('.widget-content');
$duplicate_element = $repeater_list.find('[data-guid="' + $duplicate_guid + '"]');
// Generate a new unique guid.
$guid = false;
while( ! $guid || $repeater.find('[data-guid="' + $guid + '"]').length ) {
$guid = _.random(100, 999);
}
// Get the template text.
$repeater_new_item_tpl_text = $repeater_new_item_tpl.text();
// Convert it to an jQuery element.
$new_item = $( $repeater_new_item_tpl_text );
$new_item.find('input[type="checkbox"]').prop( 'checked', true ); // Pre-check all checkbox, so the following serialize knows they exist.
// Get all the inputs so we can save them for reference.
$new_item_data = $new_item.find('select, hidden, textarea, input:not([type=radio]), input:checked').serializeArray();
// Convert the template back to text again, so we can do string replace on it.
$repeater_new_item_tpl = $new_item.wrapAll('
').parent().html();
// Do string replace, with the new unique guid.
$repeater_new_item_tpl_text = $repeater_new_item_tpl.replace( /{{{{guid}}}}/g, $guid );
// Convert it back to jQuery element again.
$new_item = $( $repeater_new_item_tpl_text );
// If we've passed an element to reference then lets grab the data from it.
if ( $duplicate_element.length ) {
$( $new_item_data ).each(function( index ){
// Do string replaces on the name so we know the reference field and the original field.
$original_name = $new_item_data[index].name;
$new_item_data[index].name = $original_name.replace( /{{{{guid}}}}/g, $guid );
$new_item_data[index].name_to_get = $original_name.replace( /{{{{guid}}}}/g, $duplicate_guid );
// Ge the reference field and the original field.
$new_field = $new_item.find( '[name="' + $new_item_data[index].name + '"]' );
$duplicated_field = $repeater.find( '[name="' + $new_item_data[index].name_to_get + '"]' );
// Update the new field values with the duplicated field values.
if ( $new_field.is(':radio') ) {
// Radio
$duplicated_field = $duplicated_field.filter(':checked');
if ( $duplicated_field.length ) {
// Un-check all.
$new_field.removeAttr('checked');
$new_field.prop( 'checked', false );
// Check the correct field.
$new_field = $new_field.filter('[value="' + $duplicated_field.val() + '"]');
$new_field.prop( 'checked', true );
$new_field.attr( 'checked', 'checked' );
}
}
else if ( $new_field.is(':checkbox') ) {
// Checkbox
$duplicated_field = $duplicated_field.filter(':checked');
if ( $duplicated_field.length ) {
// Check the correct field.
$new_field.prop( 'checked', true );
$new_field.attr( 'checked', 'checked' );
}
}
else {
// Input, Select, etc
$new_field.val( $duplicated_field.val() );
}
// Special behaviour for Image Select items.
if ( $duplicated_field.parents('.layers-image-container').length ) {
// Get elements.
$new_field_container = $new_field.parents('.layers-image-container');
$duplicated_field_container = $duplicated_field.parents('.layers-image-container');
// Get Image HTML
var $duplicated_field_image = $duplicated_field_container.find('.layers-image-display').clone();
// Duplicate the duplicated fields image.
$new_field_container.find('.layers-image-display').replaceWith( $duplicated_field_image );
// Add 'Has Image' Class.
$new_field_container.addClass('layers-has-image');
}
});
}
// Hide the section so just title is showing.
$new_item.find('.layers-accordion-section').hide();
$new_item.addClass('layers-accordion-item-adding');
$new_item.addClass('layers-accordion-item-adding-hidden');
$new_item.addClass('layers-accordion-item-adding-flash');
// Append item HTML
if ( $duplicate_element.length )
$duplicate_element.after($new_item);
else
$repeater_list.append($new_item);
// Append item IDs to the items input
$new_item_guids = [];
$repeater_list.find( 'li.layers-accordion-item' ).each(function(){
$new_item_guids.push( $(this).data( 'guid' ) );
});
// Trigger change for ajax save
$repeater_input.val( $new_item_guids.join() ).layers_trigger_change();
// Trigger interface init. will trigger init of elements eg colorpickers etc
$(document).trigger( 'layers-interface-init', $new_item );
// Remove loading class
$repeater_add_button.removeClass('layers-loading-button');
// Auto-update the title
update_titles( $new_item );
// Add Open Class to item
$hidden_items = $repeater.find('.layers-accordion-item-adding-hidden');
$hidden_items.removeClass('layers-accordion-item-adding-hidden');
setTimeout( function(){
$hidden_items.find('.layers-accordion-title').trigger('click');
}, 200 );
setTimeout( function(){
$hidden_items.removeClass('layers-accordion-item-adding-flash');
}, 1000 );
setTimeout( function(){
$hidden_items.removeClass('layers-accordion-item-adding');
}, 1500 );
}
/**
* 4 - Duplicate Item
*/
$( document ).on( 'click', '.layers-accordion-duplicate', function( e, element ){
$repeater = $(this).closest('.layers-widget-repeater');
$repeater_item_clicked = $(this).closest('.layers-accordion-item');
$repeater_item_clicked_guid = $repeater_item_clicked.attr('data-guid');
add_item( $repeater, $repeater_item_clicked_guid );
return false;
});
// Add the duplciated buttons, so that we don't have to add them in the HTML.
$( document ).on( 'layers-interface-init', function( e, element ){
$(element).find( '.layers-accordion-title' ).each( function(){
if ( ! $(this).find('.layers-accordion-duplicate').length ) {
$(this).append( $('') );
$(this).append( $('') );
}
});
});
/**
* 4 - Add Item
*/
$(document).on( 'click', '.layers-widget-repeater-add-item' , function(e){
e.preventDefault();
$repeater = $(this).closest('.layers-widget-repeater');
$last_repeater_item = $repeater.find('ul.layers-accordions > li.layers-accordion-item:last-child');
if ( $last_repeater_item.length )
$last_repeater_guid = $last_repeater_item.attr('data-guid');
else
$last_repeater_guid = 0;
add_item( $repeater, $last_repeater_guid );
});
/**
* 5 - Remove Item
*/
$(document).on( 'click' , '.layers-widget-repeater .layers-icon-error' , function(e){
e.preventDefault();
// "Hi Mom"
var $that = $(this);
// Confirmation message @TODO: Make JS confirmation column
if( false === confirm( repeateri18n.confirm_message ) ) return;
// Get elements
$repeater_delete_button = $(this);
$repeater_item_row = $repeater_delete_button.closest( '.layers-accordion-item' );
$repeater_item_title = $repeater_item_row.find('.layers-accordion-title');
$repeater = $repeater_delete_button.parents('.layers-widget-repeater');
$repeater_list = $repeater.find('.layers-accordions');
$repeater_input = $repeater.find('.layers-repeater-input');
// Close the row first.
$repeater_item_title.click();
// Delay till the row closed.
setTimeout(function() {
$repeater_item_row.addClass('layers-accordion-item-remove');
// Delay while the remove animation plays.
setTimeout(function() {
$repeater_item_row.animate({ height: 0, margin: 0 }, { duration: 150, complete: function() {
// Remove this row completely now.
$repeater_item_row.remove();
// Curate column IDs
$column_guids = [];
$repeater_list.find( 'li.layers-accordion-item' ).each(function(){
$column_guids.push( $(this).data( 'guid' ) );
});
// Trigger change for ajax save
$repeater_input.val( $column_guids.join() ).layers_trigger_change();
// Reset Sortable Items
// layers_set_column_sortable( $that );
$repeater.find( 'ul.layers-accordions-sortable' ).sortable('refresh');
}});
}, 700 );
}, 500 );
});
/**
* 5 - Update Item Title
*/
$(document).on( 'keyup', '.layers-widget-repeater > ul input[id*="-title"], .layers-widget-repeater > ul input[id*="-button-link_text"]', function(e){
// "Hi Mom"
$that = $(this);
$repeater_item = $that.closest('.layers-accordion-item');
update_titles( $repeater_item );
});
function update_titles( $repeater_item ) {
// "Hi Mom"
$title_field = $repeater_item.find( 'input[id*="-title"], input[id*="-button-link_text"]' );
if( 'undefined' == typeof( $title_field.val() ) ) return;
// Set the string value
$val = $title_field.val().substr( 0 , 51 );
// Set the Title
$string = ': ' + ( $val.length > 50 ? $val + '...' : $val );
// Update the accordian title
$title_field.closest( '.layers-accordion-item' ).find( 'span.layers-detail' ).text( $string );
}
}); //jQuery