Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Border panel: Don't restore deselected border color when width changed from zero #37049

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 30 additions & 32 deletions packages/block-editor/src/hooks/border-width.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
__experimentalUnitControl as UnitControl,
__experimentalUseCustomUnits as useCustomUnits,
} from '@wordpress/components';
import { useEffect, useState } from '@wordpress/element';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';

/**
Expand All @@ -32,25 +32,12 @@ export const BorderWidthEdit = ( props ) => {

const { width, color: customBorderColor, style: borderStyle } =
style?.border || {};

// Used to temporarily track previous border color & style selections to be
// able to restore them when border width changes from zero value.
const [ styleSelection, setStyleSelection ] = useState();
const [ colorSelection, setColorSelection ] = useState();

// Temporarily track previous border color & style selections to be able to
// restore them when border width changes from zero value.
useEffect( () => {
if ( borderStyle !== 'none' ) {
setStyleSelection( borderStyle );
}
}, [ borderStyle ] );

useEffect( () => {
if ( borderColor || customBorderColor ) {
setColorSelection( {
name: !! borderColor ? borderColor : undefined,
color: !! customBorderColor ? customBorderColor : undefined,
} );
}
}, [ borderColor, customBorderColor ] );
const [ customColorSelection, setCustomColorSelection ] = useState();

const onChange = ( newWidth ) => {
let newStyle = {
Expand All @@ -65,28 +52,39 @@ export const BorderWidthEdit = ( props ) => {
let borderPaletteColor = borderColor;

const hasZeroWidth = parseFloat( newWidth ) === 0;
const hadPreviousZeroWidth = parseFloat( width ) === 0;

// Setting the border width explicitly to zero will also set the
// border style to `none` and clear border color attributes.
if ( hasZeroWidth ) {
if ( hasZeroWidth && ! hadPreviousZeroWidth ) {
// Before clearing color and style selections, keep track of
// the current selections so they can be restored when the width
// changes to a non-zero value.
setColorSelection( borderColor );
setCustomColorSelection( customBorderColor );
setStyleSelection( borderStyle );

// Clear style and color attributes.
borderPaletteColor = undefined;
newStyle.border.color = undefined;
newStyle.border.style = 'none';
}

// Restore previous border style selection if width is now not zero and
// border style was 'none'. This is to support changes to the UI which
// change the border style UI to a segmented control without a "none"
// option.
if ( ! hasZeroWidth && borderStyle === 'none' ) {
newStyle.border.style = styleSelection;
}

// Restore previous border color selection if width is no longer zero
// and current border color is undefined.
if ( ! hasZeroWidth && borderColor === undefined ) {
borderPaletteColor = colorSelection?.name;
newStyle.border.color = colorSelection?.color;
if ( ! hasZeroWidth && hadPreviousZeroWidth ) {
aaronrobertshaw marked this conversation as resolved.
Show resolved Hide resolved
// Restore previous border style selection if width is now not zero and
// border style was 'none'. This is to support changes to the UI which
// change the border style UI to a segmented control without a "none"
// option.
if ( borderStyle === 'none' ) {
newStyle.border.style = styleSelection;
}

// Restore previous border color selection if width is no longer zero
// and current border color is undefined.
if ( borderColor === undefined ) {
borderPaletteColor = colorSelection;
newStyle.border.color = customColorSelection;
}
}

// If width was reset, clean out undefined styles.
Expand Down