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

[RNMobile] Add featured image settings to the Latest Posts block #39257

Merged
merged 23 commits into from
Apr 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
447f2a8
Add 'display featured image' toggle to settings
Mar 7, 2022
49a5824
Add 'link to featured image' toggle to settings
Mar 7, 2022
e49d8ef
Add alignment control to featured image settings
Mar 11, 2022
0ad7afe
Style BlockAlignmentControl within BottomSheet
Mar 11, 2022
61d12b7
Update new BottomSheet's label
Mar 11, 2022
30c62ac
Update CHANGELOG
Mar 11, 2022
9278d5f
Merge branch 'trunk' into rnmobile/update/latest-posts-featured-settings
Mar 11, 2022
466c655
Merge branch 'trunk' into rnmobile/update/latest-posts-featured-settings
Mar 21, 2022
ae2d3ae
Remove redundant new line (added by mistake)
Mar 21, 2022
9d99ffa
Revert BlockAlignmentControl implementation
Mar 24, 2022
f81bb40
Add alignment options via BottomSheetSelectControl
Mar 24, 2022
28235ad
Add separator between settings
Mar 24, 2022
21e52a1
Move BLOCK_ALIGNMENTS_CONTROLS to constants file
Mar 24, 2022
b5dbeec
Merge branch 'trunk' into rnmobile/update/latest-posts-featured-settings
Mar 25, 2022
0fe02e6
Refactor to make use of 'BlockAlignmentControl'
Apr 22, 2022
19b0e21
Create native version of 'ui.js'
Apr 22, 2022
c0799d1
Merge branch 'trunk' into rnmobile/update/latest-posts-featured-settings
Apr 22, 2022
40765b4
Remove native-specific code from web-only file
Apr 22, 2022
ec59670
Style BlockAlignmentControl within BottomSheet
Apr 22, 2022
dac3698
Move constants to dedicated file
Apr 22, 2022
9fb7b38
Remove unnecessary code in web-only file
Apr 22, 2022
abf44c8
Only pass props when components use them
Apr 22, 2022
30db2b0
Merge branch 'trunk' into rnmobile/update/latest-posts-featured-settings
Apr 27, 2022
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* WordPress dependencies
*/
import { __, _x } from '@wordpress/i18n';
import {
alignNone,
positionCenter,
positionLeft,
positionRight,
stretchFullWidth,
stretchWide,
} from '@wordpress/icons';

export const BLOCK_ALIGNMENTS_CONTROLS = {
none: {
icon: alignNone,
title: _x( 'None', 'Alignment option' ),
},
left: {
icon: positionLeft,
title: __( 'Align left' ),
},
center: {
icon: positionCenter,
title: __( 'Align center' ),
},
right: {
icon: positionRight,
title: __( 'Align right' ),
},
wide: {
icon: stretchWide,
title: __( 'Wide width' ),
},
full: {
icon: stretchFullWidth,
title: __( 'Full width' ),
},
};

export const DEFAULT_CONTROL = 'none';

export const POPOVER_PROPS = {
isAlternate: true,
};
178 changes: 69 additions & 109 deletions packages/block-editor/src/components/block-alignment-control/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,60 +6,23 @@ import classNames from 'classnames';
/**
* WordPress dependencies
*/
import { __, _x } from '@wordpress/i18n';
import { __ } from '@wordpress/i18n';
import {
ToolbarDropdownMenu,
ToolbarGroup,
MenuGroup,
MenuItem,
} from '@wordpress/components';
import {
alignNone,
positionCenter,
positionLeft,
positionRight,
stretchFullWidth,
stretchWide,
} from '@wordpress/icons';
import { Platform } from '@wordpress/element';

/**
* Internal dependencies
*/
import useAvailableAlignments from './use-available-alignments';

const BLOCK_ALIGNMENTS_CONTROLS = {
none: {
icon: alignNone,
title: _x( 'None', 'Alignment option' ),
},
left: {
icon: positionLeft,
title: __( 'Align left' ),
},
center: {
icon: positionCenter,
title: __( 'Align center' ),
},
right: {
icon: positionRight,
title: __( 'Align right' ),
},
wide: {
icon: stretchWide,
title: __( 'Wide width' ),
},
full: {
icon: stretchFullWidth,
title: __( 'Full width' ),
},
};

const DEFAULT_CONTROL = 'none';

const POPOVER_PROPS = {
isAlternate: true,
};
import {
BLOCK_ALIGNMENTS_CONTROLS,
DEFAULT_CONTROL,
POPOVER_PROPS,
} from './constants';

function BlockAlignmentUI( {
value,
Expand Down Expand Up @@ -92,72 +55,69 @@ function BlockAlignmentUI( {
label: __( 'Align' ),
toggleProps: { describedBy: __( 'Change alignment' ) },
};
const extraProps =
isToolbar || Platform.isNative
? {
isCollapsed: isToolbar ? isCollapsed : undefined,
controls: enabledControls.map(
( { name: controlName } ) => {
return {
...BLOCK_ALIGNMENTS_CONTROLS[ controlName ],
isActive:
value === controlName ||
( ! value && controlName === 'none' ),
role: isCollapsed ? 'menuitemradio' : undefined,
onClick: () => onChangeAlignment( controlName ),
};
}
),
}
: {
children: ( { onClose } ) => {
return (
<>
<MenuGroup className="block-editor-block-alignment-control__menu-group">
{ enabledControls.map(
( { name: controlName, info } ) => {
const {
icon,
title,
} = BLOCK_ALIGNMENTS_CONTROLS[
controlName
];
// If no value is provided, mark as selected the `none` option.
const isSelected =
controlName === value ||
( ! value &&
controlName === 'none' );
return (
<MenuItem
key={ controlName }
icon={ icon }
iconPosition="left"
className={ classNames(
'components-dropdown-menu__menu-item',
{
'is-active': isSelected,
}
) }
isSelected={ isSelected }
onClick={ () => {
onChangeAlignment(
controlName
);
onClose();
} }
role="menuitemradio"
info={ info }
>
{ title }
</MenuItem>
);
}
) }
</MenuGroup>
</>
);
},
};
const extraProps = isToolbar
? {
isCollapsed,
controls: enabledControls.map( ( { name: controlName } ) => {
return {
...BLOCK_ALIGNMENTS_CONTROLS[ controlName ],
isActive:
value === controlName ||
( ! value && controlName === 'none' ),
role: isCollapsed ? 'menuitemradio' : undefined,
onClick: () => onChangeAlignment( controlName ),
};
} ),
}
: {
children: ( { onClose } ) => {
return (
<>
<MenuGroup className="block-editor-block-alignment-control__menu-group">
{ enabledControls.map(
( { name: controlName, info } ) => {
const {
icon,
title,
} = BLOCK_ALIGNMENTS_CONTROLS[
controlName
];
// If no value is provided, mark as selected the `none` option.
const isSelected =
controlName === value ||
( ! value &&
controlName === 'none' );
return (
<MenuItem
key={ controlName }
icon={ icon }
iconPosition="left"
className={ classNames(
'components-dropdown-menu__menu-item',
{
'is-active': isSelected,
}
) }
isSelected={ isSelected }
onClick={ () => {
onChangeAlignment(
controlName
);
onClose();
} }
role="menuitemradio"
info={ info }
>
{ title }
</MenuItem>
);
}
) }
</MenuGroup>
</>
);
},
};

return <UIComponent { ...commonProps } { ...extraProps } />;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import {
ToolbarDropdownMenu,
ToolbarGroup,
BottomSheetSelectControl,
} from '@wordpress/components';

/**
* Internal dependencies
*/
import useAvailableAlignments from './use-available-alignments';
import {
BLOCK_ALIGNMENTS_CONTROLS,
DEFAULT_CONTROL,
POPOVER_PROPS,
} from './constants';

function BlockAlignmentUI( {
value,
onChange,
controls,
isToolbar,
isCollapsed = true,
isBottomSheetControl = false,
} ) {
const enabledControls = useAvailableAlignments( controls );
const hasEnabledControls = !! enabledControls.length;

if ( ! hasEnabledControls ) {
return null;
}

function onChangeAlignment( align ) {
onChange( [ value, 'none' ].includes( align ) ? undefined : align );
}

const activeAlignmentControl = BLOCK_ALIGNMENTS_CONTROLS[ value ];
const defaultAlignmentControl =
BLOCK_ALIGNMENTS_CONTROLS[ DEFAULT_CONTROL ];

const toolbarUIComponent = isToolbar ? ToolbarGroup : ToolbarDropdownMenu;
const UIComponent = isBottomSheetControl
? BottomSheetSelectControl
: toolbarUIComponent;

const commonProps = {
label: __( 'Align' ),
};
const extraProps = isBottomSheetControl
? {
options: enabledControls.map( ( { name: controlName } ) => {
const control = BLOCK_ALIGNMENTS_CONTROLS[ controlName ];
return {
value: controlName,
label: control.title,
icon: control.icon,
};
} ),
value: activeAlignmentControl ? value : 'none',
onChange: ( align ) => onChangeAlignment( align ),
}
: {
icon: activeAlignmentControl
? activeAlignmentControl.icon
: defaultAlignmentControl.icon,
isCollapsed: isToolbar ? isCollapsed : undefined,
controls: enabledControls.map( ( { name: controlName } ) => {
return {
...BLOCK_ALIGNMENTS_CONTROLS[ controlName ],
isActive:
value === controlName ||
( ! value && controlName === 'none' ),
onClick: () => onChangeAlignment( controlName ),
};
} ),
popoverProps: POPOVER_PROPS,
toggleProps: { describedBy: __( 'Change alignment' ) },
};

return <UIComponent { ...commonProps } { ...extraProps } />;
}

export default BlockAlignmentUI;
Loading