File "control.js"
Full Path: /home/romayxjt/public_html/wp-content/themes/kadence/inc/customizer/react/src/background/control.js
File size: 6.55 KB
MIME-type: text/x-java
Charset: utf-8
import { createRoot } from '@wordpress/element';
import BackgroundComponent from './background-component.js';
export const BackgroundControl = wp.customize.MediaControl.extend( {
renderContent: function renderContent() {
let control = this;
let root = createRoot( control.container[0] );
root.render( <BackgroundComponent control={control} customizer={ wp.customize }/> );
},
initialize: function( id, options ) {
var control = this,
args = options || {};
args.params = args.params || {};
if ( ! args.params.type ) {
args.params.type = 'kadence-basic';
}
if ( ! args.params.content ) {
args.params.content = jQuery( '<li></li>' );
args.params.content.attr( 'id', 'customize-control-' + id.replace( /]/g, '' ).replace( /\[/g, '-' ) );
args.params.content.attr( 'class', 'customize-control customize-control-' + args.params.type );
}
control.propertyElements = [];
wp.customize.Control.prototype.initialize.call( control, id, args );
},
/**
* Add bidirectional data binding links between inputs and the setting(s).
*
* This is copied from wp.customize.Control.prototype.initialize(). It
* should be changed in Core to be applied once the control is embedded.
*
* @private
* @returns {null}
*/
_setUpSettingRootLinks: function() {
var control = this,
nodes = control.container.find( '[data-customize-setting-link]' );
nodes.each( function() {
var node = jQuery( this );
wp.customize( node.data( 'customizeSettingLink' ), function( setting ) {
var element = new wp.customize.Element( node );
control.elements.push( element );
element.sync( setting );
element.set( setting() );
} );
} );
},
/**
* Add bidirectional data binding links between inputs and the setting properties.
*
* @private
* @returns {null}
*/
_setUpSettingPropertyLinks: function() {
var control = this,
nodes;
if ( ! control.setting ) {
return;
}
nodes = control.container.find( '[data-customize-setting-property-link]' );
nodes.each( function() {
var node = jQuery( this ),
element,
propertyName = node.data( 'customizeSettingPropertyLink' );
element = new wp.customize.Element( node );
control.propertyElements.push( element );
element.set( control.setting()[ propertyName ] );
element.bind( function( newPropertyValue ) {
var newSetting = control.setting();
if ( newPropertyValue === newSetting[ propertyName ] ) {
return;
}
newSetting = _.clone( newSetting );
newSetting[ propertyName ] = newPropertyValue;
control.setting.set( newSetting );
} );
control.setting.bind( function( newValue ) {
if ( newValue[ propertyName ] !== element.get() ) {
element.set( newValue[ propertyName ] );
}
} );
} );
},
/**
* @inheritdoc
*/
ready: function() {
var control = this;
// Shortcut so that we don't have to use _.bind every time we add a callback.
_.bindAll( control, 'openFrame', 'select' );
// Bind events, with delegation to facilitate re-rendering.
control.container.on( 'click keydown', '.upload-button', function( e ) {
let event = new CustomEvent( 'kadenceOpenMediaModal', {
'detail': false,
} );
document.dispatchEvent( event );
control.openFrame( e );
} );
control._setUpSettingRootLinks();
control._setUpSettingPropertyLinks();
wp.customize.Control.prototype.ready.call( control );
control.setting.bind( control.renderContent() );
control.deferred.embedded.done( function() {
} );
},
/**
* Embed the control in the document.
*
* Override the embed() method to do nothing,
* so that the control isn't embedded on load,
* unless the containing section is already expanded.
*
* @returns {null}
*/
embed: function() {
var control = this,
sectionId = control.section();
if ( ! sectionId ) {
return;
}
wp.customize.section( sectionId, function( section ) {
if ( section.expanded() || wp.customize.settings.autofocus.control === control.id ) {
control.actuallyEmbed();
} else {
section.expanded.bind( function( expanded ) {
if ( expanded ) {
control.actuallyEmbed();
}
} );
}
} );
},
/**
* Deferred embedding of control when actually
*
* This function is called in Section.onChangeExpanded() so the control
* will only get embedded when the Section is first expanded.
*
* @returns {null}
*/
actuallyEmbed: function() {
var control = this;
if ( 'resolved' === control.deferred.embedded.state() ) {
return;
}
control.renderContent();
control.deferred.embedded.resolve(); // This triggers control.ready().
// Fire event after control is initialized.
control.container.trigger( 'init' );
},
/**
* This is not working with autofocus.
*
* @param {object} [args] Args.
* @returns {null}
*/
focus: function( args ) {
var control = this;
control.actuallyEmbed();
wp.customize.Control.prototype.focus.call( control, args );
},
/**
* Callback handler for when an attachment is selected in the media modal.
* Gets the selected image information, and sets it within the control.
*/
select: function() {
// Get the attachment from the modal frame.
var node,
attachment = this.frame.state().get( 'selection' ).first().toJSON(),
device = wp.customize.previewedDevice.get(),
settings = this.setting();
// This is a hack to make the popup background work, I don't like this and need to find a better solution.
if ( this.id && this.id === 'header_popup_background' ) {
if ( device === 'tablet' || device === 'mobile' ) {
if ( undefined !== settings['desktop'] && undefined !== settings['desktop'].type && settings['desktop'].type === 'image' ) {
if ( undefined !== settings[device] && undefined !== settings[device].type && settings[device].type === 'image' ) {
// Leave this alone
} else {
device = 'desktop';
}
}
}
}
if ( undefined === this.params.attachment ) {
this.params.attachment = {};
}
if ( undefined === this.params.input_attrs.attachments ) {
this.params.input_attrs.attachments = {};
}
this.params.input_attrs.attachments[ device ] = attachment;
if ( undefined === settings[ device ] ) {
settings[ device ] = {};
}
if ( undefined === settings[ device ].image ) {
settings[ device ].image = {};
}
settings[ device ].image.url = attachment.url;
// Set the Customizer setting; the callback takes care of rendering.
let event = new CustomEvent( 'kadenceOpenMediaModal', {
'detail': true,
} );
document.dispatchEvent( event );
this.setting.set( {
...this.setting.get(),
...settings,
flag: ! this.setting.get().flag
} );
},
} );