Skip to content

Commit

Permalink
Use block context to detect presence of parent pattern for overrides (#…
Browse files Browse the repository at this point in the history
…62861)

* Use block context to detect presence of parent pattern

* Regenerate fixtures

* Update image block to use context for checking a parent pattern block exists

* Rename context to `pattern/overrides` to be consistent with php code

* Move pattern overrides context shim to pattern overrides hooks

* Remove shim

Co-authored-by: talldan <[email protected]>
Co-authored-by: ellatrix <[email protected]>
Co-authored-by: SantosGuillamot <[email protected]>
  • Loading branch information
4 people authored Jun 26, 2024
1 parent e1bdd7e commit 9ee6ad3
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 41 deletions.
32 changes: 10 additions & 22 deletions packages/block-editor/src/hooks/use-bindings-attributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import { addFilter } from '@wordpress/hooks';
* Internal dependencies
*/
import { unlock } from '../lock-unlock';
import { store as blockEditorStore } from '../store';

/** @typedef {import('@wordpress/compose').WPHigherOrderComponent} WPHigherOrderComponent */
/** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */
Expand Down Expand Up @@ -95,24 +94,12 @@ export const withBlockBindingSupport = createHigherOrderComponent(
( BlockEdit ) => ( props ) => {
const registry = useRegistry();
const { name, clientId, context } = props;
const { sources, hasParentPattern } = useSelect(
( select ) => {
const { getAllBlockBindingsSources } = unlock(
select( blocksStore )
);
const { getBlockParentsByBlockName } = unlock(
select( blockEditorStore )
);

return {
sources: getAllBlockBindingsSources(),
hasParentPattern:
getBlockParentsByBlockName( clientId, 'core/block' )
.length > 0,
};
},
[ clientId ]
const sources = useSelect(
( select ) =>
unlock( select( blocksStore ) ).getAllBlockBindingsSources(),
[]
);
const hasParentPattern = !! props.context[ 'pattern/overrides' ];
const hasPatternOverridesDefaultBinding =
props.attributes.metadata?.bindings?.[ DEFAULT_ATTRIBUTE ]
?.source === 'core/pattern-overrides';
Expand Down Expand Up @@ -254,12 +241,13 @@ export const withBlockBindingSupport = createHigherOrderComponent(
[
registry,
bindings,
name,
clientId,
context,
hasPatternOverridesDefaultBinding,
hasParentPattern,
setAttributes,
name,
sources,
hasPatternOverridesDefaultBinding,
context,
clientId,
]
);

Expand Down
6 changes: 5 additions & 1 deletion packages/block-library/src/block/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@
"type": "number"
},
"content": {
"type": "object"
"type": "object",
"default": {}
}
},
"providesContext": {
"pattern/overrides": "content"
},
"supports": {
"customClassName": false,
"html": false,
Expand Down
13 changes: 7 additions & 6 deletions packages/block-library/src/image/image.js
Original file line number Diff line number Diff line change
Expand Up @@ -443,16 +443,12 @@ export default function Image( {
return {};
}
const { getBlockBindingsSource } = unlock( select( blocksStore ) );
const { getBlockParentsByBlockName } = unlock(
select( blockEditorStore )
);
const {
url: urlBinding,
alt: altBinding,
title: titleBinding,
} = metadata?.bindings || {};
const hasParentPattern =
getBlockParentsByBlockName( clientId, 'core/block' ).length > 0;
const hasParentPattern = !! context[ 'pattern/overrides' ];
const urlBindingSource = getBlockBindingsSource(
urlBinding?.source
);
Expand Down Expand Up @@ -508,7 +504,12 @@ export default function Image( {
: __( 'Connected to dynamic data' ),
};
},
[ clientId, isSingleSelected, metadata?.bindings ]
[
arePatternOverridesEnabled,
context,
isSingleSelected,
metadata?.bindings,
]
);

const showUrlInput =
Expand Down
19 changes: 9 additions & 10 deletions packages/editor/src/bindings/pattern-overrides.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,22 @@ const CONTENT = 'content';
export default {
name: 'core/pattern-overrides',
label: _x( 'Pattern Overrides', 'block bindings source' ),
getValue( { registry, clientId, attributeName } ) {
const { getBlockAttributes, getBlockParentsByBlockName } =
registry.select( blockEditorStore );
getValue( { registry, clientId, context, attributeName } ) {
const patternOverridesContent = context[ 'pattern/overrides' ];
const { getBlockAttributes } = registry.select( blockEditorStore );
const currentBlockAttributes = getBlockAttributes( clientId );
const [ patternClientId ] = getBlockParentsByBlockName(
clientId,
'core/block',
true
);

if ( ! patternOverridesContent ) {
return currentBlockAttributes[ attributeName ];
}

const overridableValue =
getBlockAttributes( patternClientId )?.[ CONTENT ]?.[
patternOverridesContent?.[
currentBlockAttributes?.metadata?.name
]?.[ attributeName ];

// If there is no pattern client ID, or it is not overwritten, return the default value.
if ( ! patternClientId || overridableValue === undefined ) {
if ( overridableValue === undefined ) {
return currentBlockAttributes[ attributeName ];
}

Expand Down
5 changes: 4 additions & 1 deletion packages/editor/src/hooks/pattern-overrides.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { store as blocksStore } from '@wordpress/blocks';
import { store as editorStore } from '../store';
import { unlock } from '../lock-unlock';

/** @typedef {import('@wordpress/blocks').WPBlockSettings} WPBlockSettings */

const {
PatternOverridesControls,
ResetOverridesControl,
Expand Down Expand Up @@ -46,7 +48,8 @@ const withPatternOverrideControls = createHigherOrderComponent(
{ isSupportedBlock && <PatternOverridesBlockControls /> }
</>
);
}
},
'withPatternOverrideControls'
);

// Split into a separate component to avoid a store subscription
Expand Down
3 changes: 2 additions & 1 deletion test/integration/fixtures/blocks/core__block.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"name": "core/block",
"isValid": true,
"attributes": {
"ref": 123
"ref": 123,
"content": {}
},
"innerBlocks": []
}
Expand Down

0 comments on commit 9ee6ad3

Please sign in to comment.