File: //home/karalev/www/wp-content/themes/kadence/inc/customizer/react/src/contact/contact-component.js
/* jshint esversion: 6 */
import PropTypes from 'prop-types';
import classnames from 'classnames';
import ResponsiveControl from '../common/responsive.js';
import Icons from '../common/icons.js';
import { ReactSortable } from "react-sortablejs";
import uniqueId from 'lodash/uniqueId';
import ItemComponent from './item-component';
import { __ } from '@wordpress/i18n';
const { ButtonGroup, Dashicon, Tooltip, Popover, Button, SelectControl } = wp.components;
const { Component, Fragment } = wp.element;
class ContactComponent extends Component {
constructor() {
super( ...arguments );
this.updateValues = this.updateValues.bind( this );
this.onDragEnd = this.onDragEnd.bind( this );
this.onDragStart = this.onDragStart.bind( this );
this.onDragStop = this.onDragStop.bind( this );
this.removeItem = this.removeItem.bind( this );
this.saveArrayUpdate = this.saveArrayUpdate.bind( this );
this.toggleEnableItem = this.toggleEnableItem.bind( this );
this.onChangeIcon = this.onChangeIcon.bind( this );
this.onChangeLabel = this.onChangeLabel.bind( this );
this.onChangeLink = this.onChangeLink.bind( this );
this.onChangeURL = this.onChangeURL.bind( this );
this.onChangeAttachment = this.onChangeAttachment.bind( this );
this.onChangeWidth = this.onChangeWidth.bind( this );
this.onChangeSource = this.onChangeSource.bind( this );
this.addItem = this.addItem.bind( this );
let value = this.props.control.setting.get();
let baseDefault = {
'items': [
{
'id': 'phone',
'enabled': true,
'source': 'icon',
'url': '',
'imageid': '',
'width': 24,
'link': '',
'icon': 'mobile',
'label': '444-546-8765',
},
{
'id': 'hours',
'enabled': true,
'source': 'icon',
'url': '',
'imageid': '',
'width': 24,
'link': '',
'icon': 'hours',
'label': 'Mon - Fri: 8AM - 5PM',
}
],
};
this.defaultValue = this.props.control.params.default ? {
...baseDefault,
...this.props.control.params.default
} : baseDefault;
value = value ? {
...this.defaultValue,
...value
} : this.defaultValue;
let defaultParams = {
'group' : 'contact_item_group',
'options': [
{ value: 'phone', label: __( 'Phone', 'kadence' ), content: __( '444-546-8765', 'kadence' ) },
{ value: 'hours', label: __( 'Hours', 'kadence' ), content: __( 'Mon - Fri: 8AM - 5PM', 'kadence' ) },
{ value: 'email', label: __( 'Email', 'kadence' ), content: __( 'example@example.com', 'kadence' ) },
{ value: 'location', label: __( 'Address', 'kadence' ), content: __( '4560 example street', 'kadence' ) },
],
};
this.controlParams = this.props.control.params.input_attrs ? {
...defaultParams,
...this.props.control.params.input_attrs,
} : defaultParams;
let availibleContactOptions = [];
this.controlParams.options.map( ( option ) => {
if ( ! value.items.some( obj => obj.id === option.value ) ) {
availibleContactOptions.push( option );
}
} );
this.state = {
value: value,
isVisible: false,
control: ( undefined !== availibleContactOptions[0] && undefined !== availibleContactOptions[0].value ? availibleContactOptions[0].value : '' ),
};
}
onDragStart() {
var dropzones = document.querySelectorAll( '.kadence-builder-area' );
var i;
for (i = 0; i < dropzones.length; ++i) {
dropzones[i].classList.add( 'kadence-dragging-dropzones' );
}
}
onDragStop() {
var dropzones = document.querySelectorAll( '.kadence-builder-area' );
var i;
for (i = 0; i < dropzones.length; ++i) {
dropzones[i].classList.remove( 'kadence-dragging-dropzones' );
}
}
saveArrayUpdate( value, index ) {
let updateState = this.state.value;
let items = updateState.items;
const newItems = items.map( ( item, thisIndex ) => {
if ( index === thisIndex ) {
item = { ...item, ...value };
}
return item;
} );
updateState.items = newItems;
this.setState( { value: updateState } );
this.updateValues( updateState );
}
toggleEnableItem( value, itemIndex ) {
this.saveArrayUpdate( { enabled: value }, itemIndex );
}
onChangeLabel( value, itemIndex ) {
this.saveArrayUpdate( { label: value }, itemIndex );
}
onChangeLink( value, itemIndex ) {
this.saveArrayUpdate( { link: value }, itemIndex );
}
onChangeIcon( value, itemIndex ) {
this.saveArrayUpdate( { icon: value }, itemIndex );
}
onChangeURL( value, itemIndex ) {
this.saveArrayUpdate( { url: value }, itemIndex );
}
onChangeAttachment( value, itemIndex ) {
this.saveArrayUpdate( { imageid: value }, itemIndex );
}
onChangeWidth( value, itemIndex ) {
this.saveArrayUpdate( { width: value }, itemIndex );
}
onChangeSource( value, itemIndex ) {
this.saveArrayUpdate( { source: value }, itemIndex );
}
removeItem( itemIndex ) {
let updateState = this.state.value;
let update = updateState.items;
let updateItems = [];
{ update.length > 0 && (
update.map( ( old, index ) => {
if ( itemIndex !== index ) {
updateItems.push( old );
}
} )
) };
updateState.items = updateItems;
this.setState( { value: updateState } );
this.updateValues( updateState );
}
addItem() {
const itemControl = this.state.control;
this.setState( { isVisible: false } );
if ( itemControl ) {
let updateState = this.state.value;
let update = updateState.items;
const itemLabel = this.controlParams.options.filter(function(o){return o.value === itemControl;} );
let newItem = {
'id': itemControl,
'enabled': true,
'source': 'icon',
'url': '',
'imageid': '',
'width': 24,
'link': '',
'icon': itemControl,
'label': itemLabel[0].content,
};
update.push( newItem );
updateState.items = update;
let availibleContactOptions = [];
this.controlParams.options.map( ( option ) => {
if ( ! update.some( obj => obj.id === option.value ) ) {
availibleContactOptions.push( option );
}
} );
this.setState( { control: ( undefined !== availibleContactOptions[0] && undefined !== availibleContactOptions[0].value ? availibleContactOptions[0].value : '' ) } );
this.setState( { value: updateState } );
this.updateValues( updateState );
}
}
onDragEnd( items ) {
let updateState = this.state.value;
let update = updateState.items;
let updateItems = [];
{ items.length > 0 && (
items.map( ( item ) => {
update.filter( obj => {
if ( obj.id === item.id ) {
updateItems.push( obj );
}
} )
} )
) };
if ( ! this.arraysEqual( update, updateItems ) ) {
update.items = updateItems;
updateState.items = updateItems;
this.setState( { value: updateState } );
this.updateValues( updateState );
}
}
arraysEqual( a, b ) {
if (a === b) return true;
if (a == null || b == null) return false;
if (a.length != b.length) return false;
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) return false;
}
return true;
}
render() {
const currentList = ( typeof this.state.value != "undefined" && this.state.value.items != null && this.state.value.items.length != null && this.state.value.items.length > 0 ? this.state.value.items : [] );
let theItems = [];
{ currentList.length > 0 && (
currentList.map( ( item ) => {
theItems.push(
{
id: item.id,
}
)
} )
) };
const availibleContactOptions = [];
this.controlParams.options.map( ( option ) => {
if ( ! theItems.some( obj => obj.id === option.value ) ) {
availibleContactOptions.push( option );
}
} )
const toggleClose = () => {
if ( this.state.isVisible === true ) {
this.setState( { isVisible: false } );
}
};
return (
<div className="kadence-control-field kadence-sorter-items">
<div className="kadence-sorter-row">
<ReactSortable animation={100} onStart={ () => this.onDragStop() } onEnd={ () => this.onDragStop() } group={ this.controlParams.group } className={ `kadence-sorter-drop kadence-sorter-sortable-panel kadence-sorter-drop-${ this.controlParams.group } kadence-sorter-drop-social_item_group` } handle={ '.kadence-sorter-item-panel-header' } list={ theItems } setList={ ( newState ) => this.onDragEnd( newState ) } >
{ currentList.length > 0 && (
currentList.map( ( item, index ) => {
return <ItemComponent removeItem={ ( remove ) => this.removeItem( remove ) } toggleEnabled={ ( enable, itemIndex ) => this.toggleEnableItem( enable, itemIndex ) } onChangeLabel={ ( label, itemIndex ) => this.onChangeLabel( label, itemIndex ) } onChangeLink={ ( link, itemIndex ) => this.onChangeLink( link, itemIndex ) } onChangeSource={ ( source, itemIndex ) => this.onChangeSource( source, itemIndex ) } onChangeWidth={ ( width, itemIndex ) => this.onChangeWidth( width, itemIndex ) } onChangeURL={ ( url, itemIndex ) => this.onChangeURL( url, itemIndex ) } onChangeAttachment={ ( imageid, itemIndex ) => this.onChangeAttachment( imageid, itemIndex ) } onChangeIcon={ ( icon, itemIndex ) => this.onChangeIcon( icon, itemIndex ) } key={ item.id } index={ index } item={ item } controlParams={ this.controlParams } />;
} )
) }
</ReactSortable>
</div>
{ undefined !== availibleContactOptions[0] && undefined !== availibleContactOptions[0].value && (
<div className="kadence-contact-add-area kadence-social-add-area">
{ this.state.isVisible && (
<Popover position="top right" className="kadence-popover-color kadence-popover-contact kadence-customizer-popover" onClose={ toggleClose }>
<div className="kadence-popover-contact-list kadence-popover-social-list">
<ButtonGroup className="kadence-radio-container-control">
{ availibleContactOptions.map( ( item, index ) => {
return (
<Fragment>
<Button
isTertiary
className={ 'contact-radio-btn' }
onClick={ () => {
this.setState( { control: availibleContactOptions[index].value } );
this.state.control = availibleContactOptions[index].value;
this.addItem();
} }
>
{ availibleContactOptions[index].label && (
availibleContactOptions[index].label
) }
</Button>
</Fragment>
);
} ) }
</ButtonGroup>
</div>
</Popover>
) }
<Button
className="kadence-sorter-add-item"
isPrimary
onClick={ () => {
this.setState( { isVisible: true } );
} }
>
{ __( 'Add Contact', 'kadence' ) }
<Dashicon icon="plus"/>
</Button>
</div>
) }
</div>
);
}
updateValues( value ) {
this.props.control.setting.set( {
...this.props.control.setting.get(),
...value,
flag: !this.props.control.setting.get().flag
} );
}
}
ContactComponent.propTypes = {
control: PropTypes.object.isRequired,
};
export default ContactComponent;