File "acf-pro-input.js"
Full Path: /home/vantageo/public_html/cache/cache/cache/cache/.wp-cli/wp-content/plugins/advanced-custom-fields-pro/pro/assets/js/acf-pro-input.js
File size: 33.24 KB
MIME-type: text/plain
Charset: utf-8
(function($){
var Field = acf.Field.extend({
type: 'repeater',
wait: '',
events: {
'click a[data-event="add-row"]': 'onClickAdd',
'click a[data-event="remove-row"]': 'onClickRemove',
'click a[data-event="collapse-row"]': 'onClickCollapse',
'showField': 'onShow',
'unloadField': 'onUnload',
'mouseover': 'onHover',
'unloadField': 'onUnload'
},
$control: function(){
return this.$('.acf-repeater:first');
},
$table: function(){
return this.$('table:first');
},
$tbody: function(){
return this.$('tbody:first');
},
$rows: function(){
return this.$('tbody:first > tr').not('.acf-clone');
},
$row: function( index ){
return this.$('tbody:first > tr:eq(' + index + ')');
},
$clone: function(){
return this.$('tbody:first > tr.acf-clone');
},
$actions: function(){
return this.$('.acf-actions:last');
},
$button: function(){
return this.$('.acf-actions:last .button');
},
getValue: function(){
return this.$rows().length;
},
allowRemove: function(){
var min = parseInt( this.get('min') );
return ( !min || min < this.val() );
},
allowAdd: function(){
var max = parseInt( this.get('max') );
return ( !max || max > this.val() );
},
addSortable: function( self ){
// bail early if max 1 row
if( this.get('max') == 1 ) {
return;
}
// add sortable
this.$tbody().sortable({
items: '> tr',
handle: '> td.order',
forceHelperSize: true,
forcePlaceholderSize: true,
scroll: true,
stop: function(event, ui) {
self.render();
},
update: function(event, ui) {
self.$input().trigger('change');
}
});
},
addCollapsed: function(){
// vars
var indexes = preference.load( this.get('key') );
// bail early if no collapsed
if( !indexes ) {
return false;
}
// loop
this.$rows().each(function( i ){
if( indexes.indexOf(i) > -1 ) {
$(this).addClass('-collapsed');
}
});
},
addUnscopedEvents: function( self ){
// invalidField
this.on('invalidField', '.acf-row', function(e){
var $row = $(this);
if( self.isCollapsed($row) ) {
self.expand( $row );
}
});
},
initialize: function(){
// add unscoped events
this.addUnscopedEvents( this );
// add collapsed
this.addCollapsed();
// disable clone
acf.disable( this.$clone(), this.cid );
// render
this.render();
},
render: function(){
// update order number
this.$rows().each(function( i ){
$(this).find('> .order > span').html( i+1 );
});
// empty
if( this.val() == 0 ) {
this.$control().addClass('-empty');
} else {
this.$control().removeClass('-empty');
}
// max
if( this.allowAdd() ) {
this.$button().removeClass('disabled');
} else {
this.$button().addClass('disabled');
}
},
validateAdd: function(){
// return true if allowed
if( this.allowAdd() ) {
return true;
}
// vars
var max = this.get('max');
var text = acf.__('Maximum rows reached ({max} rows)');
// replace
text = text.replace('{max}', max);
// add notice
this.showNotice({
text: text,
type: 'warning'
});
// return
return false;
},
onClickAdd: function( e, $el ){
// validate
if( !this.validateAdd() ) {
return false;
}
// add above row
if( $el.hasClass('acf-icon') ) {
this.add({
before: $el.closest('.acf-row')
});
// default
} else {
this.add();
}
},
add: function( args ){
// validate
if( !this.allowAdd() ) {
return false;
}
// defaults
args = acf.parseArgs(args, {
before: false
});
// add row
var $el = acf.duplicate({
target: this.$clone(),
append: this.proxy(function( $el, $el2 ){
// append
if( args.before ) {
args.before.before( $el2 );
} else {
$el.before( $el2 );
}
// remove clone class
$el2.removeClass('acf-clone');
// enable
acf.enable( $el2, this.cid );
// render
this.render();
})
});
// trigger change for validation errors
this.$input().trigger('change');
// return
return $el;
},
validateRemove: function(){
// return true if allowed
if( this.allowRemove() ) {
return true;
}
// vars
var min = this.get('min');
var text = acf.__('Minimum rows reached ({min} rows)');
// replace
text = text.replace('{min}', min);
// add notice
this.showNotice({
text: text,
type: 'warning'
});
// return
return false;
},
onClickRemove: function( e, $el ){
// vars
var $row = $el.closest('.acf-row');
// add class
$row.addClass('-hover');
// add tooltip
var tooltip = acf.newTooltip({
confirmRemove: true,
target: $el,
context: this,
confirm: function(){
this.remove( $row );
},
cancel: function(){
$row.removeClass('-hover');
}
});
},
remove: function( $row ){
// reference
var self = this;
// remove
acf.remove({
target: $row,
endHeight: 0,
complete: function(){
// trigger change to allow attachment save
self.$input().trigger('change');
// render
self.render();
// sync collapsed order
//self.sync();
}
});
},
isCollapsed: function( $row ){
return $row.hasClass('-collapsed');
},
collapse: function( $row ){
$row.addClass('-collapsed');
acf.doAction('hide', $row, 'collapse');
},
expand: function( $row ){
$row.removeClass('-collapsed');
acf.doAction('show', $row, 'collapse');
},
onClickCollapse: function( e, $el ){
// vars
var $row = $el.closest('.acf-row');
var isCollpased = this.isCollapsed( $row );
// shift
if( e.shiftKey ) {
$row = this.$rows();
}
// toggle
if( isCollpased ) {
this.expand( $row );
} else {
this.collapse( $row );
}
},
onShow: function( e, $el, context ){
// get sub fields
var fields = acf.getFields({
is: ':visible',
parent: this.$el,
});
// trigger action
// - ignore context, no need to pass through 'conditional_logic'
// - this is just for fields like google_map to render itself
acf.doAction('show_fields', fields);
},
onUnload: function(){
// vars
var indexes = [];
// loop
this.$rows().each(function( i ){
if( $(this).hasClass('-collapsed') ) {
indexes.push( i );
}
});
// allow null
indexes = indexes.length ? indexes : null;
// set
preference.save( this.get('key'), indexes );
},
onHover: function(){
// add sortable
this.addSortable( this );
// remove event
this.off('mouseover');
}
});
acf.registerFieldType( Field );
// register existing conditions
acf.registerConditionForFieldType('hasValue', 'repeater');
acf.registerConditionForFieldType('hasNoValue', 'repeater');
acf.registerConditionForFieldType('lessThan', 'repeater');
acf.registerConditionForFieldType('greaterThan', 'repeater');
// state
var preference = new acf.Model({
name: 'this.collapsedRows',
key: function( key, context ){
// vars
var count = this.get(key+context) || 0;
// update
count++;
this.set(key+context, count, true);
// modify fieldKey
if( count > 1 ) {
key += '-' + count;
}
// return
return key;
},
load: function( key ){
// vars
var key = this.key(key, 'load');
var data = acf.getPreference(this.name);
// return
if( data && data[key] ) {
return data[key]
} else {
return false;
}
},
save: function( key, value ){
// vars
var key = this.key(key, 'save');
var data = acf.getPreference(this.name) || {};
// delete
if( value === null ) {
delete data[ key ];
// append
} else {
data[ key ] = value;
}
// allow null
if( $.isEmptyObject(data) ) {
data = null;
}
// save
acf.setPreference(this.name, data);
}
});
})(jQuery);
(function($){
var Field = acf.Field.extend({
type: 'flexible_content',
wait: '',
events: {
'click [data-name="add-layout"]': 'onClickAdd',
'click [data-name="remove-layout"]': 'onClickRemove',
'click [data-name="collapse-layout"]': 'onClickCollapse',
'showField': 'onShow',
'unloadField': 'onUnload',
'mouseover': 'onHover'
},
$control: function(){
return this.$('.acf-flexible-content:first');
},
$layoutsWrap: function(){
return this.$('.acf-flexible-content:first > .values');
},
$layouts: function(){
return this.$('.acf-flexible-content:first > .values > .layout');
},
$layout: function( index ){
return this.$('.acf-flexible-content:first > .values > .layout:eq(' + index + ')');
},
$clonesWrap: function(){
return this.$('.acf-flexible-content:first > .clones');
},
$clones: function(){
return this.$('.acf-flexible-content:first > .clones > .layout');
},
$clone: function( name ){
return this.$('.acf-flexible-content:first > .clones > .layout[data-layout="' + name + '"]');
},
$actions: function(){
return this.$('.acf-actions:last');
},
$button: function(){
return this.$('.acf-actions:last .button');
},
$popup: function(){
return this.$('.tmpl-popup:last');
},
getPopupHTML: function(){
// vars
var html = this.$popup().html();
var $html = $(html);
// count layouts
var $layouts = this.$layouts();
var countLayouts = function( name ){
return $layouts.filter(function(){
return $(this).data('layout') === name;
}).length;
};
// modify popup
$html.find('[data-layout]').each(function(){
// vars
var $a = $(this);
var min = $a.data('min') || 0;
var max = $a.data('max') || 0;
var name = $a.data('layout') || '';
var count = countLayouts( name );
// max
if( max && count >= max) {
$a.addClass('disabled');
return;
}
// min
if( min && count < min ) {
// vars
var required = min - count;
var title = acf.__('{required} {label} {identifier} required (min {min})');
var identifier = acf._n('layout', 'layouts', required);
// translate
title = title.replace('{required}', required);
title = title.replace('{label}', name); // 5.5.0
title = title.replace('{identifier}', identifier);
title = title.replace('{min}', min);
// badge
$a.append('<span class="badge" title="' + title + '">' + required + '</span>');
}
});
// update
html = $html.outerHTML();
// return
return html;
},
getValue: function(){
return this.$layouts().length;
},
allowRemove: function(){
var min = parseInt( this.get('min') );
return ( !min || min < this.val() );
},
allowAdd: function(){
var max = parseInt( this.get('max') );
return ( !max || max > this.val() );
},
isFull: function(){
var max = parseInt( this.get('max') );
return ( max && this.val() >= max );
},
addSortable: function( self ){
// bail early if max 1 row
if( this.get('max') == 1 ) {
return;
}
// add sortable
this.$layoutsWrap().sortable({
items: '> .layout',
handle: '> .acf-fc-layout-handle',
forceHelperSize: true,
forcePlaceholderSize: true,
scroll: true,
stop: function(event, ui) {
self.render();
},
update: function(event, ui) {
self.$input().trigger('change');
}
});
},
addCollapsed: function(){
// vars
var indexes = preference.load( this.get('key') );
// bail early if no collapsed
if( !indexes ) {
return false;
}
// loop
this.$layouts().each(function( i ){
if( indexes.indexOf(i) > -1 ) {
$(this).addClass('-collapsed');
}
});
},
addUnscopedEvents: function( self ){
// invalidField
this.on('invalidField', '.layout', function(e){
self.onInvalidField( e, $(this) );
});
},
initialize: function(){
// add unscoped events
this.addUnscopedEvents( this );
// add collapsed
this.addCollapsed();
// disable clone
acf.disable( this.$clonesWrap(), this.cid );
// render
this.render();
},
render: function(){
// update order number
this.$layouts().each(function( i ){
$(this).find('.acf-fc-layout-order:first').html( i+1 );
});
// empty
if( this.val() == 0 ) {
this.$control().addClass('-empty');
} else {
this.$control().removeClass('-empty');
}
// max
if( this.isFull() ) {
this.$button().addClass('disabled');
} else {
this.$button().removeClass('disabled');
}
},
onShow: function( e, $el, context ){
// get sub fields
var fields = acf.getFields({
is: ':visible',
parent: this.$el,
});
// trigger action
// - ignore context, no need to pass through 'conditional_logic'
// - this is just for fields like google_map to render itself
acf.doAction('show_fields', fields);
},
validateAdd: function(){
// return true if allowed
if( this.allowAdd() ) {
return true;
}
// vars
var max = this.get('max');
var text = acf.__('This field has a limit of {max} {label} {identifier}');
var identifier = acf._n('layout', 'layouts', max);
// replace
text = text.replace('{max}', max);
text = text.replace('{label}', '');
text = text.replace('{identifier}', identifier);
// add notice
this.showNotice({
text: text,
type: 'warning'
});
// return
return false;
},
onClickAdd: function( e, $el ){
// validate
if( !this.validateAdd() ) {
return false;
}
// within layout
var $layout = null;
if( $el.hasClass('acf-icon') ) {
$layout = $el.closest('.layout');
$layout.addClass('-hover');
}
// new popup
var popup = new Popup({
target: $el,
targetConfirm: false,
text: this.getPopupHTML(),
context: this,
confirm: function( e, $el ){
// check disabled
if( $el.hasClass('disabled') ) {
return;
}
// add
this.add({
layout: $el.data('layout'),
before: $layout
});
},
cancel: function(){
if( $layout ) {
$layout.removeClass('-hover');
}
}
});
// add extra event
popup.on('click', '[data-layout]', 'onConfirm');
},
add: function( args ){
// defaults
args = acf.parseArgs(args, {
layout: '',
before: false
});
// validate
if( !this.allowAdd() ) {
return false;
}
// add row
var $el = acf.duplicate({
target: this.$clone( args.layout ),
append: this.proxy(function( $el, $el2 ){
// append
if( args.before ) {
args.before.before( $el2 );
} else {
this.$layoutsWrap().append( $el2 );
}
// enable
acf.enable( $el2, this.cid );
// render
this.render();
})
});
// trigger change for validation errors
this.$input().trigger('change');
// return
return $el;
},
validateRemove: function(){
// return true if allowed
if( this.allowRemove() ) {
return true;
}
// vars
var min = this.get('min');
var text = acf.__('This field requires at least {min} {label} {identifier}');
var identifier = acf._n('layout', 'layouts', min);
// replace
text = text.replace('{min}', min);
text = text.replace('{label}', '');
text = text.replace('{identifier}', identifier);
// add notice
this.showNotice({
text: text,
type: 'warning'
});
// return
return false;
},
onClickRemove: function( e, $el ){
// vars
var $layout = $el.closest('.layout');
// add class
$layout.addClass('-hover');
// add tooltip
var tooltip = acf.newTooltip({
confirmRemove: true,
target: $el,
context: this,
confirm: function(){
this.removeLayout( $layout );
},
cancel: function(){
$layout.removeClass('-hover');
}
});
},
removeLayout: function( $layout ){
// reference
var self = this;
// vars
var endHeight = this.getValue() == 1 ? 60: 0;
// remove
acf.remove({
target: $layout,
endHeight: endHeight,
complete: function(){
// trigger change to allow attachment save
self.$input().trigger('change');
// render
self.render();
}
});
},
onClickCollapse: function( e, $el ){
// vars
var $layout = $el.closest('.layout');
// toggle
if( this.isLayoutClosed( $layout ) ) {
this.openLayout( $layout );
} else {
this.closeLayout( $layout );
}
},
isLayoutClosed: function( $layout ){
return $layout.hasClass('-collapsed');
},
openLayout: function( $layout ){
$layout.removeClass('-collapsed');
acf.doAction('show', $layout, 'collapse');
},
closeLayout: function( $layout ){
$layout.addClass('-collapsed');
acf.doAction('hide', $layout, 'collapse');
// render
// - no change could happen if layout was already closed. Only render when closing
this.renderLayout( $layout );
},
renderLayout: function( $layout ){
// vars
var $input = $layout.children('input');
var prefix = $input.attr('name').replace('[acf_fc_layout]', '');
// ajax data
var ajaxData = {
action: 'acf/fields/flexible_content/layout_title',
field_key: this.get('key'),
i: $layout.index(),
layout: $layout.data('layout'),
value: acf.serialize( $layout, prefix )
};
// ajax
$.ajax({
url: acf.get('ajaxurl'),
data: acf.prepareForAjax(ajaxData),
dataType: 'html',
type: 'post',
success: function( html ){
if( html ) {
$layout.children('.acf-fc-layout-handle').html( html );
}
}
});
},
onUnload: function(){
// vars
var indexes = [];
// loop
this.$layouts().each(function( i ){
if( $(this).hasClass('-collapsed') ) {
indexes.push( i );
}
});
// allow null
indexes = indexes.length ? indexes : null;
// set
preference.save( this.get('key'), indexes );
},
onInvalidField: function( e, $layout ){
// open if is collapsed
if( this.isLayoutClosed( $layout ) ) {
this.openLayout( $layout );
}
},
onHover: function(){
// add sortable
this.addSortable( this );
// remove event
this.off('mouseover');
}
});
acf.registerFieldType( Field );
/**
* Popup
*
* description
*
* @date 7/4/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
var Popup = acf.models.TooltipConfirm.extend({
events: {
'click [data-layout]': 'onConfirm',
'click [data-event="cancel"]': 'onCancel',
},
render: function(){
// set HTML
this.html( this.get('text') );
// add class
this.$el.addClass('acf-fc-popup');
}
});
/**
* conditions
*
* description
*
* @date 9/4/18
* @since 5.6.9
*
* @param type $var Description. Default.
* @return type Description.
*/
// register existing conditions
acf.registerConditionForFieldType('hasValue', 'flexible_content');
acf.registerConditionForFieldType('hasNoValue', 'flexible_content');
acf.registerConditionForFieldType('lessThan', 'flexible_content');
acf.registerConditionForFieldType('greaterThan', 'flexible_content');
// state
var preference = new acf.Model({
name: 'this.collapsedLayouts',
key: function( key, context ){
// vars
var count = this.get(key+context) || 0;
// update
count++;
this.set(key+context, count, true);
// modify fieldKey
if( count > 1 ) {
key += '-' + count;
}
// return
return key;
},
load: function( key ){
// vars
var key = this.key(key, 'load');
var data = acf.getPreference(this.name);
// return
if( data && data[key] ) {
return data[key]
} else {
return false;
}
},
save: function( key, value ){
// vars
var key = this.key(key, 'save');
var data = acf.getPreference(this.name) || {};
// delete
if( value === null ) {
delete data[ key ];
// append
} else {
data[ key ] = value;
}
// allow null
if( $.isEmptyObject(data) ) {
data = null;
}
// save
acf.setPreference(this.name, data);
}
});
})(jQuery);
(function($){
var Field = acf.Field.extend({
type: 'gallery',
events: {
'click .acf-gallery-add': 'onClickAdd',
'click .acf-gallery-edit': 'onClickEdit',
'click .acf-gallery-remove': 'onClickRemove',
'click .acf-gallery-attachment': 'onClickSelect',
'click .acf-gallery-close': 'onClickClose',
'change .acf-gallery-sort': 'onChangeSort',
'click .acf-gallery-update': 'onUpdate',
'mouseover': 'onHover',
'showField': 'render'
},
actions: {
'validation_begin': 'onValidationBegin',
'validation_failure': 'onValidationFailure',
'resize': 'onResize'
},
onValidationBegin: function(){
acf.disable( this.$sideData(), this.cid );
},
onValidationFailure: function(){
acf.enable( this.$sideData(), this.cid );
},
$control: function(){
return this.$('.acf-gallery');
},
$collection: function(){
return this.$('.acf-gallery-attachments');
},
$attachments: function(){
return this.$('.acf-gallery-attachment');
},
$attachment: function( id ){
return this.$('.acf-gallery-attachment[data-id="' + id + '"]');
},
$active: function(){
return this.$('.acf-gallery-attachment.active');
},
$main: function(){
return this.$('.acf-gallery-main');
},
$side: function(){
return this.$('.acf-gallery-side');
},
$sideData: function(){
return this.$('.acf-gallery-side-data');
},
isFull: function(){
var max = parseInt( this.get('max') );
var count = this.$attachments().length;
return ( max && count >= max );
},
getValue: function(){
// vars
var val = [];
// loop
this.$attachments().each(function(){
val.push( $(this).data('id') );
});
// return
return val.length ? val : false;
},
addUnscopedEvents: function( self ){
// invalidField
this.on('change', '.acf-gallery-side', function(e){
self.onUpdate( e, $(this) );
});
},
addSortable: function( self ){
// add sortable
this.$collection().sortable({
items: '.acf-gallery-attachment',
forceHelperSize: true,
forcePlaceholderSize: true,
scroll: true,
start: function (event, ui) {
ui.placeholder.html( ui.item.html() );
ui.placeholder.removeAttr('style');
},
update: function(event, ui) {
self.$input().trigger('change');
}
});
// resizable
this.$control().resizable({
handles: 's',
minHeight: 200,
stop: function(event, ui){
acf.update_user_setting('gallery_height', ui.size.height);
}
});
},
initialize: function(){
// add unscoped events
this.addUnscopedEvents( this );
// render
this.render();
},
render: function(){
// vars
var $sort = this.$('.acf-gallery-sort');
var $add = this.$('.acf-gallery-add');
var count = this.$attachments().length;
// disable add
if( this.isFull() ) {
$add.addClass('disabled');
} else {
$add.removeClass('disabled');
}
// disable select
if( !count ) {
$sort.addClass('disabled');
} else {
$sort.removeClass('disabled');
}
// resize
this.resize();
},
resize: function(){
// vars
var width = this.$control().width();
var target = 150;
var columns = Math.round( width / target );
// max columns = 8
columns = Math.min(columns, 8);
// update data
this.$control().attr('data-columns', columns);
},
onResize: function(){
this.resize();
},
openSidebar: function(){
// add class
this.$control().addClass('-open');
// hide bulk actions
// should be done with CSS
//this.$main().find('.acf-gallery-sort').hide();
// vars
var width = this.$control().width() / 3;
width = parseInt( width );
width = Math.max( width, 350 );
// animate
this.$('.acf-gallery-side-inner').css({ 'width' : width-1 });
this.$side().animate({ 'width' : width-1 }, 250);
this.$main().animate({ 'right' : width }, 250);
},
closeSidebar: function(){
// remove class
this.$control().removeClass('-open');
// clear selection
this.$active().removeClass('active');
// disable sidebar
acf.disable( this.$side() );
// animate
var $sideData = this.$('.acf-gallery-side-data');
this.$main().animate({ right: 0 }, 250);
this.$side().animate({ width: 0 }, 250, function(){
$sideData.html('');
});
},
onClickAdd: function( e, $el ){
// validate
if( this.isFull() ) {
this.showNotice({
text: acf.__('Maximum selection reached'),
type: 'warning'
});
return;
}
// new frame
var frame = acf.newMediaPopup({
mode: 'select',
title: acf.__('Add Image to Gallery'),
field: this.get('key'),
multiple: 'add',
library: this.get('library'),
allowedTypes: this.get('mime_types'),
selected: this.val(),
select: $.proxy(function( attachment, i ) {
this.appendAttachment( attachment, i );
}, this)
});
},
appendAttachment: function( attachment, i ){
// vars
attachment = this.validateAttachment( attachment );
// bail early if is full
if( this.isFull() ) {
return;
}
// bail early if already exists
if( this.$attachment( attachment.id ).length ) {
return;
}
// html
var html = [
'<div class="acf-gallery-attachment" data-id="' + attachment.id + '">',
'<input type="hidden" value="' + attachment.id + '" name="' + this.getInputName() + '[]">',
'<div class="margin" title="">',
'<div class="thumbnail">',
'<img src="" alt="">',
'</div>',
'<div class="filename"></div>',
'</div>',
'<div class="actions">',
'<a href="#" class="acf-icon -cancel dark acf-gallery-remove" data-id="' + attachment.id + '"></a>',
'</div>',
'</div>'].join('');
var $html = $(html);
// append
this.$collection().append( $html );
// move to beginning
if( this.get('insert') === 'prepend' ) {
var $before = this.$attachments().eq( i );
if( $before.length ) {
$before.before( $html );
}
}
// render attachment
this.renderAttachment( attachment );
// render
this.render();
// trigger change
this.$input().trigger('change');
},
validateAttachment: function( attachment ){
// defaults
attachment = acf.parseArgs(attachment, {
id: '',
url: '',
alt: '',
title: '',
filename: '',
type: 'image'
});
// WP attachment
if( attachment.attributes ) {
attachment = attachment.attributes;
// preview size
var url = acf.isget(attachment, 'sizes', this.get('preview_size'), 'url');
if( url !== null ) {
attachment.url = url;
}
}
// return
return attachment;
},
renderAttachment: function( attachment ){
// vars
attachment = this.validateAttachment( attachment );
// vars
var $el = this.$attachment( attachment.id );
// Image type.
if( attachment.type == 'image' ) {
// Remove filename.
$el.find('.filename').remove();
// Other file type.
} else {
// Check for attachment featured image.
var image = acf.isget(attachment, 'image', 'src');
if( image !== null ) {
attachment.url = image;
}
// Update filename text.
$el.find('.filename').text( attachment.filename );
}
// Default to mimetype icon.
if( !attachment.url ) {
attachment.url = acf.get('mimeTypeIcon');
$el.addClass('-icon');
}
// update els
$el.find('img').attr({
src: attachment.url,
alt: attachment.alt,
title: attachment.title
});
// update val
acf.val( $el.find('input'), attachment.id );
},
editAttachment: function( id ){
// new frame
var frame = acf.newMediaPopup({
mode: 'edit',
title: acf.__('Edit Image'),
button: acf.__('Update Image'),
attachment: id,
field: this.get('key'),
select: $.proxy(function( attachment, i ) {
this.renderAttachment( attachment );
// todo - render sidebar
}, this)
});
},
onClickEdit: function( e, $el ){
var id = $el.data('id');
if( id ) {
this.editAttachment( id );
}
},
removeAttachment: function( id ){
// close sidebar (if open)
this.closeSidebar();
// remove attachment
this.$attachment( id ).remove();
// render
this.render();
// trigger change
this.$input().trigger('change');
},
onClickRemove: function( e, $el ){
// prevent event from triggering click on attachment
e.preventDefault();
e.stopPropagation();
//remove
var id = $el.data('id');
if( id ) {
this.removeAttachment( id );
}
},
selectAttachment: function( id ){
// vars
var $el = this.$attachment( id );
// bail early if already active
if( $el.hasClass('active') ) {
return;
}
// step 1
var step1 = this.proxy(function(){
// save any changes in sidebar
this.$side().find(':focus').trigger('blur');
// clear selection
this.$active().removeClass('active');
// add selection
$el.addClass('active');
// open sidebar
this.openSidebar();
// call step 2
step2();
});
// step 2
var step2 = this.proxy(function(){
// ajax
var ajaxData = {
action: 'acf/fields/gallery/get_attachment',
field_key: this.get('key'),
id: id
};
// abort prev ajax call
if( this.has('xhr') ) {
this.get('xhr').abort();
}
// loading
acf.showLoading( this.$sideData() );
// get HTML
var xhr = $.ajax({
url: acf.get('ajaxurl'),
data: acf.prepareForAjax(ajaxData),
type: 'post',
dataType: 'html',
cache: false,
success: step3
});
// update
this.set('xhr', xhr);
});
// step 3
var step3 = this.proxy(function( html ){
// bail early if no html
if( !html ) {
return;
}
// vars
var $side = this.$sideData();
// render
$side.html( html );
// remove acf form data
$side.find('.compat-field-acf-form-data').remove();
// merge tables
$side.find('> table.form-table > tbody').append( $side.find('> .compat-attachment-fields > tbody > tr') );
// setup fields
acf.doAction('append', $side);
});
// run step 1
step1();
},
onClickSelect: function( e, $el ){
var id = $el.data('id');
if( id ) {
this.selectAttachment( id );
}
},
onClickClose: function( e, $el ){
this.closeSidebar();
},
onChangeSort: function( e, $el ){
// vars
var val = $el.val();
// validate
if( !val ) {
return;
}
// find ids
var ids = [];
this.$attachments().each(function(){
ids.push( $(this).data('id') );
});
// step 1
var step1 = this.proxy(function(){
// vars
var ajaxData = {
action: 'acf/fields/gallery/get_sort_order',
field_key: this.get('key'),
ids: ids,
sort: val
};
// get results
var xhr = $.ajax({
url: acf.get('ajaxurl'),
dataType: 'json',
type: 'post',
cache: false,
data: acf.prepareForAjax(ajaxData),
success: step2
});
});
// step 2
var step2 = this.proxy(function( json ){
// validate
if( !acf.isAjaxSuccess(json) ) {
return;
}
// reverse order
json.data.reverse();
// loop
json.data.map(function(id){
this.$collection().prepend( this.$attachment(id) );
}, this);
});
// call step 1
step1();
},
onUpdate: function( e, $el ){
// vars
var $submit = this.$('.acf-gallery-update');
// validate
if( $submit.hasClass('disabled') ) {
return;
}
// serialize data
var ajaxData = acf.serialize( this.$sideData() );
// loading
$submit.addClass('disabled');
$submit.before('<i class="acf-loading"></i> ');
// append AJAX action
ajaxData.action = 'acf/fields/gallery/update_attachment';
// ajax
$.ajax({
url: acf.get('ajaxurl'),
data: acf.prepareForAjax(ajaxData),
type: 'post',
dataType: 'json',
complete: function(){
$submit.removeClass('disabled');
$submit.prev('.acf-loading').remove();
}
});
},
onHover: function(){
// add sortable
this.addSortable( this );
// remove event
this.off('mouseover');
}
});
acf.registerFieldType( Field );
// register existing conditions
acf.registerConditionForFieldType('hasValue', 'gallery');
acf.registerConditionForFieldType('hasNoValue', 'gallery');
acf.registerConditionForFieldType('selectionLessThan', 'gallery');
acf.registerConditionForFieldType('selectionGreaterThan', 'gallery');
})(jQuery);
// @codekit-prepend "_acf-field-repeater.js";
// @codekit-prepend "_acf-field-flexible-content.js";
// @codekit-prepend "_acf-field-gallery.js";