Skip to content

Commit

Permalink
Merge pull request #89 from BoldGrid/col-width
Browse files Browse the repository at this point in the history
Col width
  • Loading branch information
jamesros161 committed Oct 1, 2020
2 parents 7917124 + 6dc38a2 commit 6e665ca
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 14 deletions.
140 changes: 140 additions & 0 deletions src/controls/col-width/col-width.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import { MultiSlider } from '@boldgrid/controls/src/controls/multi-slider';
import { Slider } from '../slider';
import linkSvg from '../multi-slider/img/link.svg';

export class ColWidth
extends MultiSlider {
constructor( options ) {
super( options );
this.controlOptions = {
control: {
title: 'Column Widths',
name: 'column-widths',
units: {
default: 'col',
enabled: [ 'col' ]
},
sliders: this.getControlSliders(),
description: options.description
},
slider: {
col: {
min: 1,
max: 12,
step: 1
}
},
defaults: this.getDefaults( options ),
devicesEnabled: [ 'large', 'desktop', 'tablet', 'phone' ],
defaultSelected: 'large'
};

this.options.control.sliders = this.controlOptions.control.sliders;
this.options.defaults = this.controlOptions.defaults;
}

/**
* Create sliders and attach them to the template.
*
* @since 1.0.0
*/
_createSliders() {
this.sliders = {};
for ( let slider of this.controlOptions.control.sliders ) {
let sliderControl;
let thisRow = slider.label.split( ' ' )[1];
let lastRow = this.$sliderGroup.find( 'label' ).last().text() ? this.$sliderGroup.find( 'label' ).last().text().split( ' ' )[1] : thisRow;

if ( thisRow > lastRow ) {
this.$sliderGroup.append( '<hr />' );
}
slider.uiSettings = this.getSliderConfig( slider );

sliderControl = new Slider( $.extend( true, {}, slider ) );

sliderControl.render();

this.$sliderGroup.append( sliderControl.$control );
sliderControl.$input.after(
'<a class="link" href="#" title="Link all sliders">' + linkSvg + '</a>'
);

this.sliders[slider.name] = sliderControl;

this._bindSliderChange( sliderControl );
}
}

/**
* Get Control Sliders.
*
* @since 0.16.0
*
* @return {array} An Array of slider configs.
*/
getControlSliders() {
let sliders = [];

if ( _.isFunction( wp.customize ) ) {

$( wp.customize.control( 'bgtfw_header_layout' ).container ).find( '.repeater' ).each( function() {
let label,
row;
key = this.dataset.key;
row = parseInt( $( this ).parent().attr( 'id' ).split('-')[2] ) + 1;
if ( 'sidebar' === key ) {
label = 'Row ' + row + ' Widget Area';
} else {
label = 'Row ' + row + ' ' + key.substr( 0, 1 ).toUpperCase() + key.substr( 1 );
}
sliders.push(
{
'name': this.dataset.uid,
'label': label,
'cssProperty': 'width'
}
);
} );
} else {
sliders = [
{ name: 'default_branding', label: 'Row 1 Branding', cssProperty: 'width' },
{ name: 'default_menu', label: 'Row 1 Menu', cssProperty: 'width' },
];
}

return sliders;
}

/**
* Get Default Slider uids and values.
*
* @since 0.16.0
*
* @param {object} options Options config.
*
* @return {object} Options defaults.
*/
getDefaults( options ) {
let defaults = options.defaults,
sliderNames = [];

this.getControlSliders().forEach( function( slider ) {
sliderNames.push( slider.name );
} );

options.defaults.forEach( function( type, index ) {
let values = type.values;
let placeHolders = Object.keys( values ).filter( key => /default_.*/.test(key) );
if ( 0 < placeHolders.length ) {
defaults[ index ].values = {};
sliderNames.forEach( function( sliderName, placeHolderIndex ) {
defaults[ index ].values[ sliderName ] = values[ placeHolders[ placeHolderIndex ] ] ? values[ placeHolders[ placeHolderIndex ] ] : 12;
} );
}
} );

return defaults;
}
}

export { ColWidth as default };
1 change: 1 addition & 0 deletions src/controls/col-width/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from '@boldgrid/controls/src/controls/col-width/col-width';
2 changes: 2 additions & 0 deletions src/controls/multi-slider/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ let config = {
}
}
],
devicesEnabled: [ 'base', 'large', 'desktop', 'tablet', 'phone' ],
defaultSelected: 'base',
responsive: {

// These are max widths.
Expand Down
62 changes: 52 additions & 10 deletions src/controls/multi-slider/control.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@ export class MultiSlider {
this.controlOptions = deepmerge( this.controlOptions, this.options, {
arrayMerge: ( destination, source ) => source
} );

}

/**
Expand Down Expand Up @@ -165,7 +164,12 @@ export class MultiSlider {
this._setupLinks();

// Apply initial settings for the control, past saved settings or config defaults.
this.applySettings( this.configInitial.media.base );
if ( this.configInitial.media.base ) {
this.applySettings( this.configInitial.media.base );
} else {
this.applySettings( this.configInitial.media.large );
}


// If defaults passed in set them as the initial values.
this.settings = this._getParamDefaultSettings() || this.settings;
Expand Down Expand Up @@ -401,7 +405,9 @@ export class MultiSlider {
_setupDevices() {
if ( this.controlOptions.responsive ) {
this.deviceSelection = new DeviceSelection( {
sizes: this.controlOptions.responsive
sizes: this.controlOptions.responsive,
enabled: this.controlOptions.devicesEnabled,
defaultSelected: this.controlOptions.defaultSelected
} );

this._setupDeviceChange();
Expand All @@ -421,10 +427,19 @@ export class MultiSlider {
if ( isLinked ) {
this.tempSavedSettings[ selectedDevice ] = this.settings.media[ selectedDevice ];

let baseSettings;

// Determine the correct base styles to use.
let baseSettings = this.configDefaults.media.base;
if ( this.configDefaults.media.base ) {
baseSettings = this.configDefaults.media.base;
} else {
baseSettings = this.configDefaults.media.large;
}

if ( this.settings.media && this.settings.media.base ) {
baseSettings = this.settings.media.base;
} else {
baseSettings = this.settings.media.large;
}

// Update inputs.
Expand All @@ -436,7 +451,13 @@ export class MultiSlider {
this._updateRelationshipStatus( this.settings );
this.events.emit( 'change', this.settings );
} else {
let unlinkSettings = this.configDefaults.media.base;
let unlinkSettings;
if ( this.configDefaults.media.base ) {
unlinkSettings = this.configDefaults.media.base;
} else {
unlinkSettings = this.configDefaults.media.large;
}

if ( this.settings.media && this.settings.media.base ) {
unlinkSettings = this.settings.media.base;
}
Expand Down Expand Up @@ -499,7 +520,14 @@ export class MultiSlider {

// Delete saved Settings.
this.settings = {};
this.applySettings( this.configDefaults.media.base );
let settings;
if ( this.configDefaults.media.base ) {
settings = this.configDefaults.media.base;
} else {
settings = this.configDefaults.media.large;
}

this.applySettings( settings );

// Trigger Delete Event.
this.events.emit( 'deleteSettings' );
Expand Down Expand Up @@ -552,8 +580,15 @@ export class MultiSlider {

this.deviceSelection.$inputs.on( 'change', () => {
const selectedDevice = this.deviceSelection.getSelectedValue();
let settings = this.configDefaults.media.base,
let settings,
isLinkedToBase;
if ( this.configDefaults.media.base ) {
settings = this.configDefaults.media.base,
isLinkedToBase = true;
} else {
settings = this.configDefaults.media.large,
isLinkedToBase = false;
}

// If the user has customized a device, prepoulate.
if ( this.settings.media && this.settings.media[ selectedDevice ] ) {
Expand Down Expand Up @@ -582,8 +617,16 @@ export class MultiSlider {
* @return {string} Unit.
*/
_getDefaultUnits() {
let defaultUnit = this.configDefaults.media.base.unit,
baseDefault = this._getBaseDefault();
let defaultUnit,
baseDefault;

if ( this.configDefaults.media.base ) {
defaultUnit = this.configDefaults.media.base.unit;
} else {
defaultUnit = this.configDefaults.media.large.unit;
}

baseDefault = this._getBaseDefault();

if ( baseDefault && baseDefault.unit ) {
defaultUnit = baseDefault.unit;
Expand Down Expand Up @@ -664,7 +707,6 @@ export class MultiSlider {
*/
_createSliders() {
this.sliders = {};

for ( let slider of this.controlOptions.control.sliders ) {
let sliderControl;

Expand Down
10 changes: 10 additions & 0 deletions src/controls/multi-slider/device-selection/control.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ export class Control {
// Large is 1200+
};

this.enabled = this.options.enabled || [
'base',
'large',
'desktop',
'tablet',
'phone'
];

this.defaultSelected = this.options.defaultSelected || 'base';

let maxRand = 1000000;
this._id = _.random( 0, maxRand );
this.template = _.template( template );
Expand Down
12 changes: 8 additions & 4 deletions src/controls/multi-slider/device-selection/template.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
<div class="device" data-relationship-linked="1">
<div class="device" data-relationship-linked="1" >
<ul>
<%
var devices = this.devices;
_.each( devices, function ( device ) { %>
var enabled = this.enabled;
var defaultSelected = this.defaultSelected;
_.each( devices, function ( device ) {
if ( enabled.includes( device.name ) ) {%>
<li>
<input <%= 'base' === device.name ? 'checked="checked"' : '' %> name="<%=id %>"
<input <%= 'base' === device.name || defaultSelected === device.name ? 'checked="checked"' : '' %> name="<%=id %>"
type="radio" id="<%=id + '-' + device.name %>" value="<%= device.name %>">
<label title="<%= device.tooltip ? device.tooltip : titleCase( device.name ) + ' Only' %>" for="<%=id + '-' + device.name %>"><%= device.icon %></label>
<div class="relationship" title="Inherting from All Devices setting">
Expand All @@ -14,6 +17,7 @@
<%= device.icon %>
</div>
</li>
<% } ); %>
<% }
} ); %>
</ul>
</div>
6 changes: 6 additions & 0 deletions src/controls/multi-slider/template.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<div class="directional-control <%=control.name %>-control boldgrid-control" data-linkable="<%= control.linkable.enabled %>">
<h3 class="control-name"><%=control.title %></h3>
<% if ( control.description ) { %>
<p class="control-description"><%=control.description %></p>
<% } %>
<div class="configs">
<device-selection/>
<div class="units">
Expand All @@ -12,6 +15,9 @@ <h3 class="control-name"><%=control.title %></h3>
<% if ( -1 !== control.units.enabled.indexOf( '%' ) ) { %>
<label title="Percentage Unit"><input type="radio" name="<%=control.name %>-unit" class="unit" value="%" ><span>%</span></label>
<% } %>
<% if ( -1 !== control.units.enabled.indexOf( 'col' ) ) { %>
<label title="Columns Unit"><input type="radio" name="<%=control.name %>-unit" class="unit" value="col" ><span>COL</span></label>
<% } %>
</div>
</div>
<div class="slider-group">
Expand Down

0 comments on commit 6e665ca

Please sign in to comment.