File "admin-edit.js"
Full Path: /www/wwwroot/shphe-en.com/wp-content/plugins/admin-columns-pro/classes/inline-edit/assets/js/admin-edit.js
File size: 34.62 KB
MIME-type: --
Charset: utf-8
/**
* Format a list of options from a storage model for use in X-editable
*
* @since 1.0
*
* @param array options List of options, can be nested (1 level max). Options have their key as the input value and their value as the input label. Parents have string 'label' and array 'options' of options.
* @return array List of options with parents with 'text' and 'children' and options with 'id' and 'text'
*/
function cacie_options_format_editable( options ) {
var foptions = [];
if ( typeof options === "undefined" ) {
return foptions;
}
for ( var i = 0; i < options.length; i++ ) {
var parent;
if ( typeof options[ i ].options !== 'undefined' ) {
parent = {
text: options[ i ].label,
children: []
};
for ( var j in options[ i ].options ) {
parent.children.push( {
value: options[ i ].options[ j ].value,
id: options[ i ].options[ j ].value,
text: options[ i ].options[ j ].label
} );
}
}
else {
parent = {
value: options[ i ].value,
id: options[ i ].value,
text: options[ i ].label
};
}
foptions.push( parent );
}
return foptions;
}
function cacie_get_jquery_boostrap_date_format( format ) {
format = format.replace( 'yy', 'R' );
format = format.replace( 'y', 'yy' );
format = format.replace( 'R', 'yyyy' );
return format;
}
jQuery.fn.cacie_show_message = function( message, type ) {
if ( typeof type == 'undefined' ) {
type = '';
}
else if ( type != 'info' && type != 'error' && type != 'success' ) {
type = '';
}
var el_alert = jQuery( '<div />' );
el_alert.addClass( 'alert' );
if ( type ) {
el_alert.addClass( 'alert-' + type );
}
el_alert.append( '<button type="button" class="close" data-dismiss="alert">×</button>' );
el_alert.append( message );
jQuery( this ).after( el_alert );
};
jQuery.fn.cacie_after_save = function( column, item, newvalue ) {
var el = jQuery( this );
if ( typeof newvalue != 'undefined' ) {
el.cacie_set_value( column, item, newvalue );
}
el.removeClass( 'bg-transition' );
el.cacie_handle_value( column, item );
el.cacie_handle_actions( column, item );
el.cacie_remove_ajax_loading( column, item );
// hook for addons
jQuery( document ).trigger( 'cacie_after_save', column, item, newvalue );
};
jQuery.fn.cacie_handle_value = function( column, item ) {
var el = jQuery( this );
var currentvalue = el.cacie_get_value( column, item );
var isempty;
if ( currentvalue ) {
isempty = false;
}
else {
isempty = true;
}
if ( column.addon_cacie.editable.type == 'media' && currentvalue == 'false' ) {
isempty = true;
}
if ( isempty ) {
el.parents( 'td' ).removeClass( 'cacie-nonempty' );
el.parents( 'td' ).addClass( 'cacie-empty' );
}
else {
el.parents( 'td' ).addClass( 'cacie-nonempty' );
el.parents( 'td' ).removeClass( 'cacie-empty' );
}
};
jQuery.fn.cacie_add_ajax_loading = function( column, item ) {
var el = jQuery( this );
var editable_el = el.parents( 'td' ).find( '.cacie-editable' );
switch ( column.type ) {
case 'title':
case 'name':
case 'username':
if ( editable_el.siblings( '.post-state' ).length ) {
editable_el = editable_el.siblings( '.post-state' ).eq( 0 );
}
break;
}
editable_el.after( '<div class="spinner cacie-ajax-loading" />' );
};
jQuery.fn.cacie_remove_ajax_loading = function( column, item ) {
var el = jQuery( this );
el.parents( 'td' ).find( '.cacie-ajax-loading' ).remove();
};
jQuery.fn.cacie_restore_revision = function( column, item, revision ) {
var el = jQuery( this );
item.columndata[ column.column_name ].current_revision = revision;
var revisions = CACIE_Items[ item.ID ].columndata[ column.column_name ].revisions;
var current_revision = CACIE_Items[ item.ID ].columndata[ column.column_name ].current_revision;
if ( 'is_xeditable' in column.addon_cacie.editable && column.addon_cacie.editable.is_xeditable ) {
var target = el.cacie_get_target( column );
el.cacie_add_ajax_loading( column, item );
target.editable( 'setValue', revisions[ current_revision ], true );
target.editable( 'submit' );
}
else {
el.cacie_savecolumn( column, item, revisions[ current_revision ], false );
}
el.cacie_handle_actions( column, item );
};
jQuery.fn.cacie_get_target = function( column ) {
var el = jQuery( this );
if ( typeof column.addon_cacie.editable.js != 'undefined' && typeof column.addon_cacie.editable.js.selector != 'undefined' && el.find( column.addon_cacie.editable.js.selector ).length ) {
el = el.find( column.addon_cacie.editable.js.selector );
}
return el;
};
/**
* Get value
*
* @since 1.0
*/
jQuery.fn.cacie_get_value = function( column, item ) {
return item.columndata[ column.column_name ].value;
};
/**
* Set value
*
* @since 1.0
*/
jQuery.fn.cacie_set_value = function( column, item, newvalue ) {
item.columndata[ column.column_name ].value = newvalue;
};
/**
* Edit type: Text
*
* @since 1.0
*/
jQuery.fn.cacie_edit_text = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'text',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: URL
*
* @since 3.6
*/
jQuery.fn.cacie_edit_url = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'url',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: Float
*
* @since 1.0
*/
jQuery.fn.cacie_edit_float = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'text',
value: el.cacie_get_value( column, item ),
validate: function( value ) {
if ( ! cacie_is_float( value ) ) {
return qie_i18n.errors.invalid_float;
}
}
}, column, item );
};
/**
* Edit type: WooCommerce Price
*
* @since 1.0
*/
jQuery.fn.cacie_edit_wc_price = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'wc_price',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: WooCommerce Usage and Limit
*
* @since 1.0
*/
jQuery.fn.cacie_edit_wc_usage = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'wc_usage',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: WooCommerce Stock
*
* @since 1.0
*/
jQuery.fn.cacie_edit_wc_stock = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'wc_stock',
value: el.cacie_get_value( column, item )
}, column, item );
};
function cacie_esc_regex( value ) {
return value.replace( /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&" );
}
function cacie_is_float( value ) {
var decimal_point_regex = '';
if ( 'decimal_point' in woocommerce_admin && woocommerce_admin.decimal_point ) {
decimal_point_regex = '|' + cacie_esc_regex( woocommerce_admin.decimal_point );
}
var regex = new RegExp( "^[0-9]+((\." + decimal_point_regex + ")[0-9]+)?$" );
return value.match( regex );
}
/**
* Edit type: Dimensions
*
* @since 1.0
*/
jQuery.fn.cacie_edit_dimensions = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'dimensions',
value: el.cacie_get_value( column, item ),
validate: function( value ) {
if ( ! cacie_is_float( value.length ) || ! cacie_is_float( value.width ) || ! cacie_is_float( value.height ) ) {
return qie_i18n.errors.invalid_floats;
}
}
}, column, item );
};
/**
* Edit type: Number
*
* @since 1.0
*/
jQuery.fn.cacie_edit_number = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'number',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: Password
*
* @since 1.0
*/
jQuery.fn.cacie_edit_password = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'password',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: Email
*
* @since 1.0
*/
jQuery.fn.cacie_edit_email = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'email',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: Checkbox list
*
* @since 1.0
*/
jQuery.fn.cacie_edit_checkboxlist = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'checklist'
}, column, item );
};
/**
* Edit type: Textarea
*
* @since 1.0
*/
jQuery.fn.cacie_edit_textarea = function( column, item ) {
var el = jQuery( this );
el.cacie_xeditable( {
type: 'textarea',
value: el.cacie_get_value( column, item )
}, column, item );
};
/**
* Edit type: Select
*
* @since 1.0
*/
jQuery.fn.cacie_edit_select = function( column, item ) {
var el = jQuery( this );
var value = el.cacie_get_value( column, item );
var options = column.addon_cacie.editable.options;
el.cacie_xeditable( {
type: 'select',
value: value,
source: cacie_options_format_editable( options ),
}, column, item );
};
/**
* Edit type: Select2 - Dropdown
*
* @since 1.0
*/
jQuery.fn.cacie_edit_select2_dropdown = function( column, item ) {
var options = column.addon_cacie.editable.options;
var el = jQuery( this );
// populate options from object
var defaults = {
type: 'select2',
showbuttons: false,
source: cacie_options_format_editable( options ),
select2: {
width: 200
}
};
var column_editable = item.columndata[ column.column_name ].editable;
// populate options by ajax
if ( typeof column.addon_cacie.editable.ajax_populate !== 'undefined' && column.addon_cacie.editable.ajax_populate ) {
args = {
source: '',
select2: {
width: 200,
minimumInputLength: 1,
initSelection: function( element, callback ) {
var data = [];
if ( typeof column_editable.formattedvalue != 'undefined' ) {
for ( var id in column_editable.formattedvalue ) {
data.push( {
id: id,
text: column_editable.formattedvalue[ id ]
} );
}
}
if ( data.length == 1 ) {
callback( data[0] );
}
else if ( data.length > 0 ) {
callback( data );
}
},
ajax: {
url: ajaxurl,
dataType: 'json',
quietMillis: 100,
data: function ( searchterm, page ) {
return {
plugin_id: 'cpac',
action: 'cacie_get_options',
searchterm: searchterm,
column: column.column_name,
storage_model: CACIE_Storage_Model,
item_id: item.ID
};
},
results: function ( response, page ) {
if ( response.success ) {
return {
results: cacie_options_format_editable( response.data )
};
}
// Close Select2 dropdown
el.data( 'editable' ).input.$input.select2( 'close' );
// Output error
el.data( 'editable' ).container.$form.editableform( 'error', response.data );
return { results: [] };
}
}
}
};
defaults = jQuery.extend( defaults, args );
}
if ( typeof column.addon_cacie.editable.multiple !== 'undefined' && column.addon_cacie.editable.multiple ) {
defaults.select2.multiple = true;
}
jQuery( this ).cacie_xeditable( defaults, column, item );
if ( typeof column.addon_cacie.editable.ajax_populate !== 'undefined' && column.addon_cacie.editable.ajax_populate ) {
jQuery( this ).on( 'shown', function() {
var inp = el.data( 'editable' ).input.$input;
inp.on( 'change', function() {
column_editable.formattedvalue = [];
var currentdata = inp.select2( 'data' );
if ( typeof currentdata.id != 'undefined' ) {
column_editable.formattedvalue[ currentdata.id ] = currentdata.text;
}
else {
for ( var i in currentdata ) {
column_editable.formattedvalue[ currentdata[ i ].id ] = currentdata[ i ].text;
}
}
} );
} );
}
};
/**
* Edit type: Select2 - Tags
*
* @since 1.0
*/
jQuery.fn.cacie_edit_select2_tags = function( column, item ) {
var el = jQuery( this );
var options = column.addon_cacie.editable.options;
var value = el.cacie_get_value( column, item );
// e.g. no terms available
if ( 'false' == value )
value = '';
el.cacie_xeditable( {
type: 'select2',
value: value,
select2: {
width: 200,
tags: cacie_options_format_editable( options )
},
}, column, item );
};
/**
* Edit type: togglable
*
* @since 1.0
*/
jQuery.fn.cacie_edit_togglable = function( column, item ) {
var el = jQuery( this );
var options = column.addon_cacie.editable.options;
// Toggle on click
jQuery( this ).on( 'click', function() {
if ( ! window.cacie_edit_enabled || ! options ) {
return;
}
var currentvalue = el.cacie_get_value( column, item );
var num_values = options.length;
var current_index = 0;
var newvalue;
for ( var i in options ) {
if ( currentvalue == options[ i ].label ) {
current_index = options[ i ].value;
break;
}
}
if ( typeof column.addon_cacie.editable.required != 'undefined' && column.addon_cacie.editable.required ) {
if ( current_index !== 0 ) {
el.cacie_show_message( qie_i18n.errors.field_required );
return;
}
}
newvalue = options[ ( current_index + 1 ) % num_values ].label;
// Save column
el.cacie_savecolumn( column, item, newvalue );
} );
};
jQuery.fn.cacie_edit_media = function( column, item ) {
var el = jQuery( this );
el.cacie_edit_attachment( column, item );
};
/**
* Edit type: media
*
* @since 1.0
*/
jQuery.fn.cacie_edit_attachment = function( column, item ) {
var el = jQuery( this );
// Media upload
el.on( 'click', function( e ) {
e.preventDefault();
if ( ! window.cacie_edit_enabled ) {
return;
}
var current_selection = el.cacie_get_value( column, item );
if ( ! jQuery.isArray( current_selection ) ) {
current_selection = [ current_selection ];
}
var args = {
title: 'Change image',
button: {
text: 'Set as image'
},
multiple: ( typeof column.addon_cacie.editable.multiple != 'undefined' && column.addon_cacie.editable.multiple )
};
if ( typeof column.addon_cacie.editable.attachment != 'undefined' && typeof column.addon_cacie.editable.attachment.library != 'undefined' ) {
args.library = {};
if ( typeof column.addon_cacie.editable.attachment.library.uploaded_to_post != 'undefined' ) {
args.library.uploadedTo = item.ID;
}
if ( typeof column.addon_cacie.editable.attachment.library.type != 'undefined' ) {
args.library.type = column.addon_cacie.editable.attachment.library.type;
}
}
// Merge with column type-specific arguments
if ( 'js' in column.addon_cacie.editable ) {
args = jQuery.extend( args, column.addon_cacie.editable.js );
}
// Init
var uploader = wp.media( args );
// Add current selection
uploader.on( 'open', function() {
var selection = uploader.state().get( 'selection' );
current_selection.forEach( function( id ) {
attachment = wp.media.attachment( id );
attachment.fetch();
selection.add( attachment ? [ attachment ] : [] );
} );
} );
// Store selection
uploader.on( 'select', function() {
var selection = uploader.state().get( 'selection' ).toJSON();
var multiple = uploader.options.multiple;
// multiple attachments
var attachment_ids = [];
for ( var k in selection ) {
var attachment = selection[ k ];
attachment_ids.push( attachment.id );
}
// Single attachment ( integer )
if ( 1 === attachment_ids.length && ! multiple ) {
attachment_ids = attachment_ids[0];
}
// Save column
el.cacie_savecolumn( column, item, attachment_ids );
} );
if ( typeof column.addon_cacie.editable.attachment !== 'undefined' ) {
if ( typeof column.addon_cacie.editable.attachment.disable_select_current !== 'undefined' && column.addon_cacie.editable.attachment.disable_select_current ) {
uploader.on( 'ready', function() {
setTimeout( function() {
}, 1 );
} );
/*uploader.on( 'open', function() {
var selection = uploader.state().get( 'selection' ).toJSON();
for ( var i in selection ) {
console.log(uploader);
console.log( wp.media.model.Attachment.get( selection[ i] ) );
console.log( jQuery( '.media-frame-content .attachment:eq(' + i + ')' ).length );
jQuery( '.media-frame-content .thumbnail[data-id="' + selection[ i ].id + '"]' ).html( 'test' )
}
} );*/
}
}
uploader.open();
} );
};
/**
* Edit type: Date
*
* Uses bootrap datepicker; http://www.eyecon.ro/bootstrap-datepicker/
*
* @since 1.0
*/
jQuery.fn.cacie_edit_date = function( column, item ) {
var el = jQuery( this );
var value = el.cacie_get_value( column, item );
// convert yyyymmdd to yyyy-mm-dd
if ( value ) {
value = [ value.slice(0, 4), '-', value.slice(4) ].join('');
value = [ value.slice(0, 7), '-', value.slice(7) ].join('');
}
el.attr( 'data-date', value );
el.attr( 'data-date-format', 'yyyy-mm-dd' );
el.bdatepicker().on('changeDate', function(ev) {
var new_date = new Date( ev.date );
var yyyymmdd = new_date.yyyymmdd();
el.cacie_savecolumn( column, item, yyyymmdd );
});
// Convert date object to yyyyddmm format
// http://stackoverflow.com/questions/3066586/get-string-in-yyyymmdd-format-from-js-date-object
Date.prototype.yyyymmdd = function() {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
var dd = this.getDate().toString();
return yyyy + (mm[1]?mm:"0"+mm[0]) + (dd[1]?dd:"0"+dd[0]); // padding
};
};
/**
* Edit type: combodate
*
* http://vitalets.github.io/bootstrap-datepicker/
* http://vitalets.github.io/combodate/#docs
*
* Display formats: http://momentjs.com/docs/#/displaying/format/
*
* @since 1.0
*/
jQuery.fn.cacie_edit_combodate = function( column, item ) {
var el = jQuery( this );
// Toggle on click
jQuery( this ).on( 'click', null, function() {
if ( ! window.cacie_edit_enabled )
return;
var currentvalue = el.cacie_get_value( column, item );
var save_format = column.date_save_format;
el.bdatepicker();
} );
if ( false ) {
// combodate
el.cacie_xeditable( {
value: value,
type: 'combodate',
format: save_format,
//viewformat: '',
template: 'DD / MM / YYYY HH:mm', // D / MM / YYYY
combodate: {
// value: value,
minuteStep: 1,
firstItem: 'none',
}
}, column, item );
}
};
/**
* Edit type: taxonomy
*
* @since 1.0
*/
jQuery.fn.cacie_edit_checklist = function( column, item ) {
var el = jQuery( this );
var value = el.cacie_get_value( column, item );
var options = column.addon_cacie.editable.options;
// e.g. no terms available
if ( 'false' == value ) {
value = '';
}
el.cacie_xeditable( {
type: 'checklist',
value: value,
source: cacie_options_format_editable( options ),
}, column, item );
};
/**
* Make column editable via x-editable for a certain item
*
* @since 1.0
*
* @param object args Arguments to be used for the x-editable call. Arguments that are passed will overwrite the default values for these arguments
* @param object editable Information about this type of editable column
* @param object column Information about this specific editable column
* @param object item The current item (row) that is being made editable (e.g. a post or user object)
*/
jQuery.fn.cacie_xeditable = function( args, column, item ) {
var el = jQuery( this );
var defaults = {
url: ajaxurl,
params: {
plugin_id: 'cpac',
action: 'cacie_column_save',
storage_model: CACIE_Storage_Model,
column: column.column_name
},
pk: item.ID,
value: jQuery( this ).cacie_get_value( column, item ),
placement: 'bottom',
mode: 'popup', // or inline
emptytext: '',
};
// Merge with edit type-specific arguments
args = jQuery.extend( defaults, args );
// Merge with column type-specific arguments
if ( typeof column.addon_cacie.editable.js != 'undefined' ) {
args = jQuery.extend( args, column.addon_cacie.editable.js );
}
// Placeholder
if ( typeof column.addon_cacie.editable.placeholder != 'undefined' ) {
args.placeholder = column.addon_cacie.editable.placeholder;
}
var htmlatts = [];
// Max length
if ( typeof column.addon_cacie.editable.maxlength != 'undefined' ) {
htmlatts.push( {
key: 'maxlength',
value: parseInt( column.addon_cacie.editable.maxlength, 10 )
} );
}
// Number range
if ( typeof column.addon_cacie.editable.range_min != 'undefined' ) {
htmlatts.push( {
key: 'min',
value: parseFloat( column.addon_cacie.editable.range_min, 10 )
} );
}
if ( typeof column.addon_cacie.editable.range_max != 'undefined' ) {
htmlatts.push( {
key: 'max',
value: parseFloat( column.addon_cacie.editable.range_max, 10 )
} );
}
if ( typeof column.addon_cacie.editable.range_step != 'undefined' ) {
var step = 'any';
if ( column.addon_cacie.editable.range_step.length > 0 && column.addon_cacie.editable.range_step != 'any' ) {
step = parseFloat( column.addon_cacie.editable.range_step, 10 );
}
htmlatts.push( {
key: 'step',
value: step
} );
}
if ( htmlatts.length ) {
var htmlatts_html = '';
for ( var i in htmlatts ) {
htmlatts_html += htmlatts[ i ].key + '="' + jQuery( '<div />' ).text( htmlatts[ i ].value ).html() + '"';
}
switch ( column.addon_cacie.editable.type ) {
case 'number':
args.tpl = '<input type="number" ' + htmlatts_html + '>';
break;
case 'text':
args.tpl = '<input type="text" ' + htmlatts_html + '>';
break;
case 'textarea':
args.tpl = '<textarea ' + htmlatts_html + '></textarea>';
break;
}
}
// Required
if ( typeof column.addon_cacie.editable.required != 'undefined' && column.addon_cacie.editable.required ) {
args.validate = function( value ) {
var valid = true;
switch ( column.addon_cacie.editable.type ) {
case 'select':
if ( ! value || value == 'null' ) {
valid = false;
}
break;
default:
if ( ! value.length ) {
valid = false;
}
break;
}
if ( ! valid ) {
return qie_i18n.errors.field_required;
}
};
}
var target = el.cacie_get_target( column );
target.on( 'save', function( e, params ) {
el.cacie_store_revision( column, item, params.newValue );
el.cacie_after_save( column, item, params.newValue );
} );
// Display ajax returned value
if ( typeof column.addon_cacie.editable.display_ajax == 'undefined' || column.addon_cacie.editable.display_ajax ) {
args.display = function() {}; // should be left empty, do not remove
args.success = function( response ) { // replace display with ajax value
if ( response.success ) {
el.html( response.data.value );
}
el.cacie_after_save( column, item );
if ( typeof response.data !== 'undefined' && typeof response.data.rawvalue !== 'undefined' ) {
return { newValue: response.data.rawvalue };
}
};
}
else if ( typeof column.addon_cacie.editable.js !== 'undefined' && typeof column.addon_cacie.editable.js.selector !== 'undefined' ) {
args.success = function( response ) {
el.cacie_after_save( column, item );
}
}
else {
args.success = function( response ) {
el.cacie_after_save( column, item );
if ( typeof response.data !== 'undefined' && typeof response.data.rawvalue !== 'undefined' ) {
return { newValue: response.data.rawvalue };
}
};
}
// Add marker to editable that XEditable is in use
column.addon_cacie.editable.is_xeditable = true;
// Reference to xeditables
var xeditable = el;
if ( typeof column.addon_cacie.editable.js !== 'undefined' && typeof column.addon_cacie.editable.js.selector !== 'undefined' ) {
xeditable = el.find( column.addon_cacie.editable.js.selector );
el.removeClass( 'cacie-editable' );
xeditable.addClass( 'cacie-editable' );
}
// Add for reference
window.xeditables.push( xeditable );
// XEditable
el.editable( args );
};
/**
* Store Revision
*
* @since 1.0
*
* @param object editable Information about this type of editable column
* @param object column Information about this specific editable column
* @param object item The current item (row) that is being made editable (e.g. a post or user object)
* @param mixed value Revised value
*/
jQuery.fn.cacie_store_revision = function( column, item, value ) {
var revisions = CACIE_Items[ item.ID ].columndata[ column.column_name ].revisions;
var current_revision = CACIE_Items[ item.ID ].columndata[ column.column_name ].current_revision;
var num_deletes = revisions.length - current_revision - 1;
for ( var i = 0; i < num_deletes; i++ ) {
CACIE_Items[ item.ID ].columndata[ column.column_name ].revisions.pop();
}
CACIE_Items[ item.ID ].columndata[ column.column_name ].revisions.push( value );
CACIE_Items[ item.ID ].columndata[ column.column_name ].current_revision++;
jQuery( this ).cacie_handle_actions( column, item );
};
/**
* Save a column by initiating an AJAX request, setting the item column HTML based on the return value from the AJAX call
*
* @since 1.0
*
* @param object editable Information about this type of editable column
* @param object column Information about this specific editable column
* @param object item The current item (row) that is being made editable (e.g. a post or user object)
* @param mixed newvalue New value for this item and column
* @param bool storerevision Optional. Whether to store the change as a revision
*/
jQuery.fn.cacie_savecolumn = function( column, item, newvalue, storerevision ) {
var el = jQuery( this );
// Update value for element
el.cacie_set_value( column, item, newvalue );
// Css transition
el.addClass( 'bg-transition' );
// Handle storing the revision
storerevision = ( typeof storerevision == 'undefined' || storerevision );
if ( storerevision ) {
jQuery( this ).cacie_store_revision( column, item, newvalue );
}
// Do AJAX request
el.cacie_add_ajax_loading( column, item );
jQuery.post( ajaxurl, {
plugin_id: 'cpac',
action: 'cacie_column_save',
storage_model: CACIE_Storage_Model,
column: column.column_name,
pk: item.ID,
value: newvalue
}, function( response ) {
if ( response.success ) {
// update data even when empty, in case field is cleared
el.html( response.data.value );
if ( typeof response.data.itemdata !== 'undefined' ) {
item.columndata[ column.column_name ].itemdata = response.data.itemdata;
}
}
el.cacie_after_save( column, item );
}, 'json' );
};
/*
* Handle cell actions
*/
jQuery.fn.cacie_handle_actions = function( column, item ) {
var el, el_actions, el_undo, el_redo, el_clear, el_download;
el = jQuery( this );
el_actions = el.parent().find( '.cacie-cell-actions' );
el_actions.remove();
el.parent().find( '.cacie-edit, .cacie-undo, .cacie-redo, .cacie-clear' ).remove();
el_actions = jQuery( '<div class="cacie-cell-actions" />' );
el_edit = jQuery( '<a href="#" class="cacie-cell-action cacie-edit" title="' + qie_i18n.edit + '" />' );
el_undo = jQuery( '<a href="#" class="cacie-cell-action cacie-undo" title="' + qie_i18n.undo + '" />' );
el_redo = jQuery( '<a href="#" class="cacie-cell-action cacie-redo" title="' + qie_i18n.redo + '" />' );
el_clear = jQuery( '<a href="#" class="cacie-cell-action cacie-clear" title="' + qie_i18n.delete + '"/>' );
el_undo.hide();
el_redo.hide();
el_clear.hide();
el_actions.append( el_redo );
el_actions.append( el_undo );
if ( column.addon_cacie.editable.clear_button ) {
el_actions.prepend( el_clear );
}
switch ( column.type ) {
case 'title':
case 'name':
case 'username':
case 'coupon_code':
el_actions.prepend( el_edit );
el.parents( 'td' ).find( column.addon_cacie.editable.js.selector ).after( el_actions );
el.parents( 'td' ).find( '.row-actions a' ).click( function( e ) {
e.stopPropagation();
} );
break;
default:
switch ( column.addon_cacie.editable.type ) {
case 'attachment':
if ( item.columndata[ column.column_name ].itemdata.url ) {
el_download = jQuery( '<a href="' + item.columndata[ column.column_name ].itemdata.url + '" class="cacie-cell-action cacie-download" target="_blank" title="' + qie_i18n.download + '"/>' );
el_actions.prepend( el_download );
}
el_actions.prepend( el_edit );
el.parents( 'td' ).find( '.cacie-editable' ).after( el_actions );
break;
case 'media':
el_actions.prepend( el_edit );
el_undo.before( '<div class="cacie-separator" />' );
el_redo.before( '<div class="cacie-separator" />' );
if ( typeof column.addon_cacie.editable.multiple !== 'undefined' && column.addon_cacie.editable.multiple ) {
el.parents( 'td' ).addClass( 'cacie-multiple' );
el_clear.remove();
el.parents( 'td' ).find( '.cacie-item' ).each( function() {
var el_item_actions = jQuery( '<div class="cacie-item-actions" />' );
var el_delete = jQuery( '<a href="#" class="cacie-cell-action cacie-delete" title="' + qie_i18n.delete + '"/>' );
el_item_actions.append( el_delete );
el_delete.on( 'click', ( function( column, item ) {
return function() {
var item_id = jQuery( this ).parents( '.cacie-item' ).attr( 'data-cacie-id' );
var val = el.cacie_get_value( column, item );
if ( jQuery.isArray( val ) ) {
val = jQuery.grep( val, function( value ) {
return value != item_id;
} );
}
el.cacie_savecolumn( column, item, val );
return false;
};
}( column, item ) ) );
jQuery( this ).append( el_item_actions );
} );
el.parents( 'td' ).find( '.cacie-editable' ).append( el_actions );
}
else {
el.parents( 'td' ).find( '.cacie-editable' ).append( el_actions );
}
break;
default:
el_actions.prepend( el_edit );
el.parents( 'td' ).find( '.cacie-editable' ).after( el_actions );
break;
}
break;
}
// Edit: Click event
el_edit.on( 'click', ( function( column, item ) {
return function( e ) {
e.preventDefault();
e.stopPropagation();
el.cacie_get_target( column ).trigger( 'click' );
};
}( column, item ) ) );
// Undo: Click Event
el_undo.on( 'click', ( function( column, item ) {
return function( e ) {
e.preventDefault();
e.stopPropagation();
el.cacie_restore_revision( column, item, item.columndata[ column.column_name ].current_revision - 1 );
};
}( column, item ) ) );
// Redo: Click Event
el_redo.on( 'click', ( function( column, item ) {
return function( e ) {
e.preventDefault();
e.stopPropagation();
el.cacie_restore_revision( column, item, item.columndata[ column.column_name ].current_revision + 1 );
};
}( column, item ) ) );
// Clear: Click Event
el_clear.on( 'click', ( function( column, item ) {
return function( e ) {
el.cacie_savecolumn( column, item, '' );
e.stopPropagation();
};
} ( column, item ) ) );
var revisions = CACIE_Items[ item.ID ].columndata[ column.column_name ].revisions;
var current_revision = CACIE_Items[ item.ID ].columndata[ column.column_name ].current_revision;
var current_value = revisions[ current_revision ];
if ( current_revision < revisions.length - 1 ) {
el_redo.show();
}
else {
el_redo.hide();
}
if ( current_revision > 0 ) {
el_undo.show();
}
else {
el_undo.hide();
}
if ( current_value ) {
el_clear.show();
}
else {
el_clear.hide();
}
};
/*
* Init
*/
function cacie_init() {
// List of xeditable elements for global reference
window.xeditables = [];
// this will allow non xeditable fields with click events to be disabled / enabled
window.cacie_edit_enabled = 1;
// Items table/container to apply editability on
var list = jQuery( CACIE_List_Selector );
// Readability
var columns = CACIE_Columns;
var items = CACIE_Items;
// Loop through columns
for ( var column_name in columns ) {
var column = columns[ column_name ];
// Set column name
column.column_name = column_name;
// Make column editable
if ( column.edit == 'on' && column.addon_cacie.editable ) {
if ( typeof column.addon_cacie.editable.type === 'undefined' || column.addon_cacie.editable.type === '' ) {
continue;
}
var type = column.addon_cacie.editable.type;
var fn;
var options;
// Function for editability of items in this column
fn = 'cacie_edit_' + type;
// Loop through items for current column
jQuery( '.column-' + column_name, list ).each( function() {
// Get corresponding item for row
var item;
var id_attr = jQuery( this ).parents( 'tr' ).attr( 'id' );
var id = parseInt( id_attr.substr( id_attr.lastIndexOf( '-' ) + 1 ), 10 );
if ( ! ( id in items ) ) {
// Skip to the next element (equivalent to "continue" in a for-loop)
return true;
}
item = items[ id ];
// Current value
var currentvalue;
if ( column_name in item.columndata ) {
currentvalue = item.columndata[ column_name ].revisions[0];
}
// Value must be defined and must no be a WP Error object
if ( ( typeof currentvalue === 'undefined' ) || ( typeof currentvalue.errors !== 'undefined' ) ) {
// Skip to the next element (equivalent to "continue" in a for-loop)
return true;
}
// Save value to item
if ( type == 'select2_dropdown' || type == 'select2_tags' ) {
if ( currentvalue.length === 0 ) {
currentvalue = [];
}
}
item.columndata[ column_name ].value = currentvalue;
// Add classes to table cell
jQuery( this ).addClass( 'cacie-editable-container cacie-editable-' + type );
// Wrap the editable content for better control
jQuery( this ).wrapInner( '<span class="inner cacie-editable"></span>' );
var el = jQuery( this ).find( '.inner' );
// set attributes
el.cacie_handle_value( column, item );
el.cacie_handle_actions( column, item );
// Make editable
el[ fn ]( column, item );
} );
}
}
}
/*
* Enable inline editing
*/
function cacie_enable() {
jQuery('#cacie-toggle-edit').addClass('active');
if ( typeof window.xeditables === 'undefined' ) {
cacie_init();
}
// enable cacie when init has run once
else {
jQuery( window.xeditables ).editable('enable');
}
jQuery(CACIE_List_Selector).addClass('cacie-enabled');
window.cacie_edit_enabled = 1;
}
/*
* Enable inline editing
*/
function cacie_disable() {
jQuery('#cacie-toggle-edit').removeClass('active');
jQuery( window.xeditables ).editable('disable');
window.cacie_edit_enabled = 0; // disable click events
jQuery(CACIE_List_Selector).removeClass('cacie-enabled');
}
/*
* Onload functions
*/
jQuery( document ).ready( function( $ ) {
// Columns and items are available
if ( typeof CACIE_Columns === 'undefined' || typeof CACIE_Items === 'undefined' ) {
return;
}
// Any editable columns and items
if ( CACIE_Columns.length === 0 || CACIE_Items.length === 0 ) {
return;
}
// Add button
jQuery('.tablenav.top .actions:last').append('<a href="javascript:;" id="cacie-toggle-edit" class="add-new-h2">' + qie_i18n.inline_edit + '</a>');
// Toggle Inline Edit
$('#cacie-toggle-edit').on( 'click', function( e ) {
// disable
if ( window.cacie_edit_enabled ) {
cacie_disable();
}
// enable
else {
cacie_enable();
}
// store preference
jQuery.post( ajaxurl, {
plugin_id: 'cpac',
action: 'cacie_editability_state_save',
value: window.cacie_edit_enabled,
storage_model: CACIE_Storage_Model
});
e.preventDefault();
});
if ( CACIE.inline_edit.active === true ) {
cacie_enable();
}
});