Repository URL to install this package:
/**
* Interface Builder
*/
;( function( $, underscore ) {
'use strict';
var cxInterfaceBuilder = {
init: function() {
// Component Init
this.component.init();
$( document ).on( 'cxFramework:interfaceBuilder:component', this.component.init.bind( this.component ) );
// Control Init
this.control.init();
$( document ).on( 'cxFramework:interfaceBuilder:control', this.control.init.bind( this.control ) );
},
component: {
tabClass: '.cx-tab',
accordionClass: '.cx-accordion',
toggleClass: '.cx-toggle',
buttonClass: '.cx-component__button',
contentClass: '.cx-settings__content',
buttonActiveClass: 'active',
showClass: 'show',
localStorage: {},
controlConditions: window.cxInterfaceBuilder.conditions || {},
controlValues: window.cxInterfaceBuilder.fields || {},
conditionState: {},
init: function () {
this.localStorage = this.getState() || {};
this.componentInit( this.tabClass );
this.componentInit( this.accordionClass );
this.componentInit( this.toggleClass );
this.addEvent();
this.conditionsHandleInit();
},
addEvent: function() {
$( 'body' )
.off( 'click.cxInterfaceBuilder' )
.on( 'click.cxInterfaceBuilder',
this.tabClass + ' ' + this.buttonClass + ', ' +
this.toggleClass + ' ' + this.buttonClass + ', ' +
this.accordionClass + ' ' + this.buttonClass,
this.componentClick.bind( this )
);
},
conditionsHandleInit: function() {
var self = this;
$( window ).on( 'cx-switcher-change', function( event ) {
var controlName = event.controlName,
controlStatus = event.controlStatus;
self.updateConditionRules( controlName, controlStatus );
self.renderConditionRules();
});
$( window ).on( 'cx-select-change', function( event ) {
var controlName = event.controlName,
controlStatus = event.controlStatus;
self.updateConditionRules( controlName, controlStatus );
self.renderConditionRules();
});
$( window ).on( 'cx-select2-change', function( event ) {
var controlName = event.controlName,
controlStatus = event.controlStatus;
self.updateConditionRules( controlName, controlStatus );
self.renderConditionRules();
});
$( window ).on( 'cx-radio-change', function( event ) {
var controlName = event.controlName,
controlStatus = event.controlStatus;
self.updateConditionRules( controlName, controlStatus );
self.renderConditionRules();
});
$( window ).on( 'cx-checkbox-change', function( event ) {
var controlName = event.controlName,
controlStatus = event.controlStatus,
updatedStatus = {};
$.each( controlStatus[ controlName ], function( checkbox, value ) {
updatedStatus[ checkbox ] = cxInterfaceBuilder.utils.filterBoolValue( value );
} );
self.updateConditionRules( controlName, updatedStatus );
self.renderConditionRules();
});
this.generateConditionRules();
self.renderConditionRules();
},
generateConditionRules: function() {
var self = this;
$.each( this.controlConditions, function( control, conditions ) {
$.each( conditions, function( control, value ) {
if ( self.controlValues.hasOwnProperty( control ) ) {
self.conditionState[ control ] = self.controlValues[ control ];
}
} );
} );
},
updateConditionRules: function( name, status ) {
this.conditionState[ name ] = status;
},
renderConditionRules: function() {
var self = this;
$.each( this.controlConditions, function( control, conditions ) {
var $selector = $( '.cx-control[data-control-name="' + control + '"]' ),
hidden = true;
$selector.addClass( 'cx-control-hidden' );
$.each( conditions, function( control, value ) {
hidden = true;
if ( self.conditionState.hasOwnProperty( control ) ) {
var type = typeof value;
switch ( type ) {
case 'string':
if ( self.conditionState[control] === value ) {
hidden = false;
}
break;
case 'boolean':
if ( self.conditionState[control].toString() === value.toString() ) {
hidden = false;
}
break;
default :
if ( 'string' === typeof self.conditionState[ control ] ){
if ( 'true' === self.conditionState[ control ] ){
self.conditionState[ control ] = true;
}
if ( 'false' === self.conditionState[ control ] ){
self.conditionState[ control ] = false;
}
}
if ( -1 !== value.indexOf( self.conditionState[control] ) ) {
hidden = false;
}
break;
}
if ( 'object' === typeof self.conditionState[ control ] ) {
hidden = false;
$.each( self.conditionState[ control ], function( prop, val ) {
if ( ! val && -1 !== value.indexOf( prop ) ) {
hidden = true;
return false;
}
} );
}
}
if ( hidden ) {
return false;
}
} );
if ( hidden ) {
$selector.addClass( 'cx-control-hidden' );
} else {
$selector.removeClass( 'cx-control-hidden' );
}
} );
},
componentInit: function( componentClass ) {
var _this = this,
components = $( componentClass ),
componentId = null,
button = null,
contentId = null,
notShow = '';
components.each( function( index, component ) {
component = $( component );
componentId = component.data( 'compotent-id' );
switch ( componentClass ) {
case _this.toggleClass:
if ( _this.localStorage[ componentId ] && _this.localStorage[ componentId ].length ) {
notShow = _this.localStorage[ componentId ].join( ', ' );
}
$( _this.contentClass, component )
.not( notShow )
.addClass( _this.showClass )
.prevAll( _this.buttonClass )
.addClass( _this.buttonActiveClass );
break;
case _this.tabClass:
case _this.accordionClass:
if ( _this.localStorage[ componentId ] ) {
contentId = _this.localStorage[ componentId ][ 0 ];
button = $( '[data-content-id="' + contentId + '"]', component );
} else {
button = $( _this.buttonClass, component ).eq( 0 );
contentId = button.data( 'content-id' );
}
_this.showElement( button, component, contentId );
break;
}
} );
},
componentClick: function( event ) {
var $target = $( event.target ),
$parent = $target.closest( this.tabClass + ', ' + this.accordionClass + ', ' + this.toggleClass ),
expr = new RegExp( this.tabClass + '|' + this.accordionClass + '|' + this.toggleClass ),
componentName = $parent[0].className.match( expr )[ 0 ].replace( ' ', '.' ),
contentId = $target.data( 'content-id' ),
componentId = $parent.data( 'compotent-id' ),
activeFlag = $target.hasClass( this.buttonActiveClass ),
itemClosed;
switch ( componentName ) {
case this.tabClass:
if ( ! activeFlag ) {
this.hideElement( $parent );
this.showElement( $target, $parent, contentId );
this.localStorage[ componentId ] = new Array( contentId );
this.setState();
}
break;
case this.accordionClass:
this.hideElement( $parent );
if ( ! activeFlag ) {
this.showElement( $target, $parent, contentId );
this.localStorage[ componentId ] = new Array( contentId );
} else {
this.localStorage[ componentId ] = {};
}
this.setState();
break;
case this.toggleClass:
$target
.toggleClass( this.buttonActiveClass )
.nextAll( contentId )
.toggleClass( this.showClass );
if ( Array.isArray( this.localStorage[ componentId ] ) ) {
itemClosed = this.localStorage[ componentId ].indexOf( contentId );
if ( -1 !== itemClosed ) {
this.localStorage[ componentId ].splice( itemClosed, 1 );
} else {
this.localStorage[ componentId ].push( contentId );
}
} else {
this.localStorage[ componentId ] = new Array( contentId );
}
this.setState();
break;
}
$target.blur();
return false;
},
showElement: function ( button, holder, contentId ) {
button
.addClass( this.buttonActiveClass );
holder
.data( 'content-id', contentId );
$( contentId, holder )
.addClass( this.showClass );
},
hideElement: function ( holder ) {
var contsntId = holder.data( 'content-id' );
$( '[data-content-id="' + contsntId + '"]', holder )
.removeClass( this.buttonActiveClass );
$( contsntId, holder )
.removeClass( this.showClass );
},
getState: function() {
try {
return JSON.parse( localStorage.getItem( 'interface-builder' ) );
} catch ( e ) {
return false;
}
},
setState: function() {
try {
localStorage.setItem( 'interface-builder', JSON.stringify( this.localStorage ) );
} catch ( e ) {
return false;
}
}
},
control: {
init: function () {
this.switcher.init();
this.checkbox.init();
this.radio.init();
Loading ...