From ad705ec3f6ed5c7b3165fd2bf67e16455a05a976 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 13:17:24 +0100 Subject: [PATCH 01/15] Pass rootClientId to patterns tab --- .../block-editor/src/components/inserter/menu.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/block-editor/src/components/inserter/menu.js b/packages/block-editor/src/components/inserter/menu.js index 7db193e9e69c98..b9aac1e457ed52 100644 --- a/packages/block-editor/src/components/inserter/menu.js +++ b/packages/block-editor/src/components/inserter/menu.js @@ -46,20 +46,18 @@ function InserterMenu( { selectBlockOnInsert: __experimentalSelectBlockOnInsert, insertionIndex: __experimentalInsertionIndex, } ); - const { hasPatterns, hasReusableBlocks } = useSelect( ( select ) => { + const { showPatterns, hasReusableBlocks } = useSelect( ( select ) => { const { __experimentalBlockPatterns, __experimentalReusableBlocks, } = select( 'core/block-editor' ).getSettings(); return { - hasPatterns: !! __experimentalBlockPatterns?.length, + showPatterns: !! __experimentalBlockPatterns?.length, hasReusableBlocks: !! __experimentalReusableBlocks?.length, }; }, [] ); - const showPatterns = ! destinationRootClientId && hasPatterns; - const onInsert = useCallback( ( blocks ) => { onInsertBlocks( blocks ); @@ -125,12 +123,18 @@ function InserterMenu( { const patternsTab = useMemo( () => ( ), - [ onInsertPattern, onClickPatternCategory, selectedPatternCategory ] + [ + destinationRootClientId, + onInsertPattern, + onClickPatternCategory, + selectedPatternCategory, + ] ); const reusableBlocksTab = useMemo( From 2ecce4861f2f0ff9f45e0b01ea10550c4ca64475 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 13:18:45 +0100 Subject: [PATCH 02/15] Pass rootClientId to BlockPatternsCategory component --- .../src/components/inserter/block-patterns-tab.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/inserter/block-patterns-tab.js b/packages/block-editor/src/components/inserter/block-patterns-tab.js index 127077ae296625..57b85993262649 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-tab.js +++ b/packages/block-editor/src/components/inserter/block-patterns-tab.js @@ -18,11 +18,13 @@ import usePatternsState from './hooks/use-patterns-state'; import BlockPatternList from '../block-patterns-list'; function BlockPatternsCategory( { + rootClientId, onInsert, selectedCategory, onClickCategory, } ) { const [ allPatterns, allCategories, onClick ] = usePatternsState( + rootClientId, onInsert ); @@ -120,9 +122,15 @@ function BlockPatternsCategory( { ); } -function BlockPatternsTabs( { onInsert, onClickCategory, selectedCategory } ) { +function BlockPatternsTabs( { + rootClientId, + onInsert, + onClickCategory, + selectedCategory, +} ) { return ( Date: Mon, 25 Jan 2021 13:19:17 +0100 Subject: [PATCH 03/15] Only show patterns with allowed blocks --- .../inserter/hooks/use-patterns-state.js | 60 ++++++++++++++----- .../utils/contains-only-allowed-blocks.js | 26 ++++++++ 2 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js diff --git a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js index e94f5a875d9d06..14c2f54f02f8bd 100644 --- a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js +++ b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js @@ -6,30 +6,60 @@ import { map } from 'lodash'; /** * WordPress dependencies */ -import { useCallback } from '@wordpress/element'; -import { cloneBlock } from '@wordpress/blocks'; +import { useCallback, useMemo } from '@wordpress/element'; +import { cloneBlock, parse } from '@wordpress/blocks'; import { useDispatch, useSelect } from '@wordpress/data'; import { __, sprintf } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; +/** + * Internal dependencies + */ +import containsOnlyAllowedBlocks from '../utils/contains-only-allowed-blocks'; + /** * Retrieves the block patterns inserter state. * - * @param {Function} onInsert function called when inserter a list of blocks. + * @param {string=} rootClientId Insertion's root client ID. + * @param {Function} onInsert function called when inserter a list of blocks. * * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler) */ -const usePatternsState = ( onInsert ) => { - const { patternCategories, patterns } = useSelect( ( select ) => { - const { - __experimentalBlockPatterns, - __experimentalBlockPatternCategories, - } = select( 'core/block-editor' ).getSettings(); - return { - patterns: __experimentalBlockPatterns, - patternCategories: __experimentalBlockPatternCategories, - }; - }, [] ); +const usePatternsState = ( rootClientId, onInsert ) => { + const { patternCategories, patterns, allowedBlocks } = useSelect( + ( select ) => { + const { __experimentalGetAllowedBlocks, getSettings } = select( + 'core/block-editor' + ); + const { + __experimentalBlockPatterns, + __experimentalBlockPatternCategories, + } = getSettings(); + + return { + allowedBlocks: __experimentalGetAllowedBlocks( rootClientId ), + patterns: __experimentalBlockPatterns, + patternCategories: __experimentalBlockPatternCategories, + }; + }, + [ rootClientId ] + ); + + const allowedPatterns = useMemo( () => { + if ( + ! rootClientId || + ! Array.isArray( allowedBlocks ) || + ! Array.isArray( patterns ) + ) { + return patterns; + } + + return patterns.filter( ( pattern ) => { + const blocks = parse( pattern.content ); + return containsOnlyAllowedBlocks( blocks, allowedBlocks ); + } ); + }, [ rootClientId, allowedBlocks, patterns ] ); + const { createSuccessNotice } = useDispatch( noticesStore ); const onClickPattern = useCallback( ( pattern, blocks ) => { onInsert( @@ -48,7 +78,7 @@ const usePatternsState = ( onInsert ) => { ); }, [] ); - return [ patterns, patternCategories, onClickPattern ]; + return [ allowedPatterns, patternCategories, onClickPattern ]; }; export default usePatternsState; diff --git a/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js b/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js new file mode 100644 index 00000000000000..f410e19b9a6370 --- /dev/null +++ b/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js @@ -0,0 +1,26 @@ +export default function containsOnlyAllowedBlocks( + blocks = [], + allowedBlocks = [] +) { + if ( ! blocks.length ) { + return true; + } + + for ( const block of blocks ) { + const isBlockAllowed = allowedBlocks.includes( + ( allowedBlock ) => allowedBlock.name === block.name + ); + + if ( ! isBlockAllowed ) { + return false; + } + } + + for ( const block of blocks ) { + if ( ! containsOnlyAllowedBlocks( block.innerBlocks, allowedBlocks ) ) { + return false; + } + } + + return true; +} From dd6c16848f3d8ca1b97572aedf7503f248fa6aef Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 14:10:59 +0100 Subject: [PATCH 04/15] Move to selectors --- .../inserter/hooks/use-patterns-state.js | 42 ++++--------------- .../utils/contains-only-allowed-blocks.js | 26 ------------ packages/block-editor/src/store/selectors.js | 35 ++++++++++++++++ 3 files changed, 43 insertions(+), 60 deletions(-) delete mode 100644 packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js diff --git a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js index 14c2f54f02f8bd..f25dea4077af2d 100644 --- a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js +++ b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js @@ -6,17 +6,12 @@ import { map } from 'lodash'; /** * WordPress dependencies */ -import { useCallback, useMemo } from '@wordpress/element'; -import { cloneBlock, parse } from '@wordpress/blocks'; +import { useCallback } from '@wordpress/element'; +import { cloneBlock } from '@wordpress/blocks'; import { useDispatch, useSelect } from '@wordpress/data'; import { __, sprintf } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; -/** - * Internal dependencies - */ -import containsOnlyAllowedBlocks from '../utils/contains-only-allowed-blocks'; - /** * Retrieves the block patterns inserter state. * @@ -26,40 +21,19 @@ import containsOnlyAllowedBlocks from '../utils/contains-only-allowed-blocks'; * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler) */ const usePatternsState = ( rootClientId, onInsert ) => { - const { patternCategories, patterns, allowedBlocks } = useSelect( + const { patternCategories, patterns } = useSelect( ( select ) => { - const { __experimentalGetAllowedBlocks, getSettings } = select( + const { __experimentalGetAllowedPatterns, getSettings } = select( 'core/block-editor' ); - const { - __experimentalBlockPatterns, - __experimentalBlockPatternCategories, - } = getSettings(); - return { - allowedBlocks: __experimentalGetAllowedBlocks( rootClientId ), - patterns: __experimentalBlockPatterns, - patternCategories: __experimentalBlockPatternCategories, + patterns: __experimentalGetAllowedPatterns( rootClientId ), + patternCategories: getSettings() + .__experimentalBlockPatternCategories, }; }, [ rootClientId ] ); - - const allowedPatterns = useMemo( () => { - if ( - ! rootClientId || - ! Array.isArray( allowedBlocks ) || - ! Array.isArray( patterns ) - ) { - return patterns; - } - - return patterns.filter( ( pattern ) => { - const blocks = parse( pattern.content ); - return containsOnlyAllowedBlocks( blocks, allowedBlocks ); - } ); - }, [ rootClientId, allowedBlocks, patterns ] ); - const { createSuccessNotice } = useDispatch( noticesStore ); const onClickPattern = useCallback( ( pattern, blocks ) => { onInsert( @@ -78,7 +52,7 @@ const usePatternsState = ( rootClientId, onInsert ) => { ); }, [] ); - return [ allowedPatterns, patternCategories, onClickPattern ]; + return [ patterns, patternCategories, onClickPattern ]; }; export default usePatternsState; diff --git a/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js b/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js deleted file mode 100644 index f410e19b9a6370..00000000000000 --- a/packages/block-editor/src/components/inserter/utils/contains-only-allowed-blocks.js +++ /dev/null @@ -1,26 +0,0 @@ -export default function containsOnlyAllowedBlocks( - blocks = [], - allowedBlocks = [] -) { - if ( ! blocks.length ) { - return true; - } - - for ( const block of blocks ) { - const isBlockAllowed = allowedBlocks.includes( - ( allowedBlock ) => allowedBlock.name === block.name - ); - - if ( ! isBlockAllowed ) { - return false; - } - } - - for ( const block of blocks ) { - if ( ! containsOnlyAllowedBlocks( block.innerBlocks, allowedBlocks ) ) { - return false; - } - } - - return true; -} diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js index 9c72a3b9ad3582..2c2ccf19539eef 100644 --- a/packages/block-editor/src/store/selectors.js +++ b/packages/block-editor/src/store/selectors.js @@ -1735,6 +1735,41 @@ export const __experimentalGetAllowedBlocks = createSelector( ] ); +/** + * Returns the list of allowed patterns for inner blocks children + * + * @param {Object} state Editor state. + * @param {?string} rootClientId Optional target root client ID. + * + * @return {Array?} The list of allowed block types. + */ +export const __experimentalGetAllowedPatterns = createSelector( + ( state, rootClientId = null ) => { + const patterns = state.settings.__experimentalBlockPatterns; + const allowedBlockNames = map( + __experimentalGetAllowedBlocks( state, rootClientId ), + ( { name } ) => name + ); + + if ( ! rootClientId || ! allowedBlockNames.length ) { + return patterns; + } + + const patternsAllowed = patterns.filter( ( pattern ) => { + const blocks = parse( pattern.content ); + return blocks.every( ( { name } ) => + allowedBlockNames.includes( name ) + ); + } ); + + return patternsAllowed; + }, + ( state, rootClientId ) => [ + state.settings.__experimentalBlockPatterns, + __experimentalGetAllowedBlocks( state, rootClientId ), + ] +); + /** * Returns the Block List settings of a block, if any exist. * From a091ac2475dd96c313da60ad650c5c44f17bc756 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 14:15:33 +0100 Subject: [PATCH 05/15] Hide patterns tab if there are no patterns --- .../src/components/inserter/menu.js | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/block-editor/src/components/inserter/menu.js b/packages/block-editor/src/components/inserter/menu.js index b9aac1e457ed52..946b4d5d7f9255 100644 --- a/packages/block-editor/src/components/inserter/menu.js +++ b/packages/block-editor/src/components/inserter/menu.js @@ -46,17 +46,24 @@ function InserterMenu( { selectBlockOnInsert: __experimentalSelectBlockOnInsert, insertionIndex: __experimentalInsertionIndex, } ); - const { showPatterns, hasReusableBlocks } = useSelect( ( select ) => { - const { - __experimentalBlockPatterns, - __experimentalReusableBlocks, - } = select( 'core/block-editor' ).getSettings(); + const { showPatterns, hasReusableBlocks } = useSelect( + ( select ) => { + const { __experimentalGetAllowedPatterns, getSettings } = select( + 'core/block-editor' + ); - return { - showPatterns: !! __experimentalBlockPatterns?.length, - hasReusableBlocks: !! __experimentalReusableBlocks?.length, - }; - }, [] ); + return { + showPatterns: + ! destinationRootClientId || + !! __experimentalGetAllowedPatterns( + destinationRootClientId + ).length, + hasReusableBlocks: !! getSettings().__experimentalReusableBlocks + ?.length, + }; + }, + [ destinationRootClientId ] + ); const onInsert = useCallback( ( blocks ) => { From 58f758c0e1bcbf8a7a3095e9d3a21ae568d4a384 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 15:55:28 +0100 Subject: [PATCH 06/15] Use canInsertBlockType instead of reinventing it --- packages/block-editor/src/store/selectors.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js index 2c2ccf19539eef..39850c91b165b9 100644 --- a/packages/block-editor/src/store/selectors.js +++ b/packages/block-editor/src/store/selectors.js @@ -15,6 +15,7 @@ import { filter, mapKeys, orderBy, + every, } from 'lodash'; import createSelector from 'rememo'; @@ -1746,19 +1747,15 @@ export const __experimentalGetAllowedBlocks = createSelector( export const __experimentalGetAllowedPatterns = createSelector( ( state, rootClientId = null ) => { const patterns = state.settings.__experimentalBlockPatterns; - const allowedBlockNames = map( - __experimentalGetAllowedBlocks( state, rootClientId ), - ( { name } ) => name - ); - if ( ! rootClientId || ! allowedBlockNames.length ) { + if ( ! rootClientId ) { return patterns; } - const patternsAllowed = patterns.filter( ( pattern ) => { - const blocks = parse( pattern.content ); - return blocks.every( ( { name } ) => - allowedBlockNames.includes( name ) + const patternsAllowed = filter( patterns, ( { content } ) => { + const blocks = parse( content ); + return every( blocks, ( { name } ) => + canInsertBlockType( state, name, rootClientId ) ); } ); @@ -1766,7 +1763,10 @@ export const __experimentalGetAllowedPatterns = createSelector( }, ( state, rootClientId ) => [ state.settings.__experimentalBlockPatterns, - __experimentalGetAllowedBlocks( state, rootClientId ), + state.blockListSettings[ rootClientId ], + state.blocks.byClientId[ rootClientId ], + state.settings.allowedBlockTypes, + state.settings.templateLock, ] ); From 66c9bfb021401acd36ef555ec9b9eddf9c16ad5c Mon Sep 17 00:00:00 2001 From: David Szabo Date: Mon, 25 Jan 2021 15:56:09 +0100 Subject: [PATCH 07/15] Add tests --- .../block-editor/src/store/test/selectors.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/packages/block-editor/src/store/test/selectors.js b/packages/block-editor/src/store/test/selectors.js index 964b105047082a..e27baa322c2d46 100644 --- a/packages/block-editor/src/store/test/selectors.js +++ b/packages/block-editor/src/store/test/selectors.js @@ -71,6 +71,7 @@ const { getLowestCommonAncestorWithSelectedBlock, __experimentalGetActiveBlockIdByBlockNames: getActiveBlockIdByBlockNames, __experimentalGetParsedReusableBlock, + __experimentalGetAllowedPatterns, } = selectors; describe( 'selectors', () => { @@ -3349,6 +3350,58 @@ describe( 'selectors', () => { ).toEqual( 'client-id-03' ); } ); } ); + + describe( '__experimentalGetAllowedPatterns', () => { + const state = { + blocks: { + byClientId: { + block1: { name: 'core/test-block-a' }, + block2: { name: 'core/test-block-b' }, + }, + attributes: { + block1: {}, + block2: {}, + }, + }, + blockListSettings: { + block1: { + allowedBlocks: [ 'core/test-block-b' ], + }, + block2: { + allowedBlocks: [], + }, + }, + settings: { + __experimentalBlockPatterns: [ + { + title: 'pattern with a', + content: ``, + }, + { + title: 'pattern with b', + content: + '', + }, + ], + }, + }; + + it( 'should return all patterns for root level', () => { + expect( + __experimentalGetAllowedPatterns( state, null ) + ).toHaveLength( 2 ); + } ); + + it( 'should return patterns that consists of blocks allowed for the specified client ID', () => { + expect( + __experimentalGetAllowedPatterns( state, 'block1' ) + ).toHaveLength( 1 ); + + expect( + __experimentalGetAllowedPatterns( state, 'block2' ) + ).toHaveLength( 0 ); + } ); + } ); } ); describe( '__experimentalGetParsedReusableBlock', () => { From b2e46e30e4aa022e1b54c0449824cc1559ba6eaf Mon Sep 17 00:00:00 2001 From: David Szabo Date: Tue, 26 Jan 2021 08:46:12 +0100 Subject: [PATCH 08/15] Swap args --- .../src/components/inserter/block-patterns-tab.js | 4 ++-- .../src/components/inserter/hooks/use-patterns-state.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/block-editor/src/components/inserter/block-patterns-tab.js b/packages/block-editor/src/components/inserter/block-patterns-tab.js index 57b85993262649..803822b358becd 100644 --- a/packages/block-editor/src/components/inserter/block-patterns-tab.js +++ b/packages/block-editor/src/components/inserter/block-patterns-tab.js @@ -24,8 +24,8 @@ function BlockPatternsCategory( { onClickCategory, } ) { const [ allPatterns, allCategories, onClick ] = usePatternsState( - rootClientId, - onInsert + onInsert, + rootClientId ); // Remove any empty categories diff --git a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js index f25dea4077af2d..fd0e5801088136 100644 --- a/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js +++ b/packages/block-editor/src/components/inserter/hooks/use-patterns-state.js @@ -15,12 +15,12 @@ import { store as noticesStore } from '@wordpress/notices'; /** * Retrieves the block patterns inserter state. * - * @param {string=} rootClientId Insertion's root client ID. * @param {Function} onInsert function called when inserter a list of blocks. + * @param {string=} rootClientId Insertion's root client ID. * * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler) */ -const usePatternsState = ( rootClientId, onInsert ) => { +const usePatternsState = ( onInsert, rootClientId ) => { const { patternCategories, patterns } = useSelect( ( select ) => { const { __experimentalGetAllowedPatterns, getSettings } = select( From 443df66a73f81c8428ee0be556ce37b7b6163ba5 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Tue, 26 Jan 2021 09:58:34 +0100 Subject: [PATCH 09/15] Cache parsed patterns --- packages/block-editor/src/store/selectors.js | 22 ++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js index 39850c91b165b9..e9a3343868c7a8 100644 --- a/packages/block-editor/src/store/selectors.js +++ b/packages/block-editor/src/store/selectors.js @@ -1736,6 +1736,17 @@ export const __experimentalGetAllowedBlocks = createSelector( ] ); +const __experimentalGetParsedPatterns = createSelector( + ( state ) => { + const patterns = state.settings.__experimentalBlockPatterns; + return map( patterns, ( pattern ) => ( { + ...pattern, + contentBlocks: parse( pattern.content ), + } ) ); + }, + ( state ) => [ state.settings.__experimentalBlockPatterns ] +); + /** * Returns the list of allowed patterns for inner blocks children * @@ -1746,15 +1757,14 @@ export const __experimentalGetAllowedBlocks = createSelector( */ export const __experimentalGetAllowedPatterns = createSelector( ( state, rootClientId = null ) => { - const patterns = state.settings.__experimentalBlockPatterns; + const patterns = __experimentalGetParsedPatterns( state ); if ( ! rootClientId ) { return patterns; } - const patternsAllowed = filter( patterns, ( { content } ) => { - const blocks = parse( content ); - return every( blocks, ( { name } ) => + const patternsAllowed = filter( patterns, ( { contentBlocks } ) => { + return every( contentBlocks, ( { name } ) => canInsertBlockType( state, name, rootClientId ) ); } ); @@ -1763,10 +1773,10 @@ export const __experimentalGetAllowedPatterns = createSelector( }, ( state, rootClientId ) => [ state.settings.__experimentalBlockPatterns, - state.blockListSettings[ rootClientId ], - state.blocks.byClientId[ rootClientId ], state.settings.allowedBlockTypes, state.settings.templateLock, + state.blockListSettings[ rootClientId ], + state.blocks.byClientId[ rootClientId ], ] ); From 670f2a3b244cd057abbd04dbda4567cf19fffe0a Mon Sep 17 00:00:00 2001 From: David Szabo Date: Tue, 26 Jan 2021 10:07:08 +0100 Subject: [PATCH 10/15] Show patterns in quick inserter --- .../src/components/inserter/quick-inserter.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/block-editor/src/components/inserter/quick-inserter.js b/packages/block-editor/src/components/inserter/quick-inserter.js index fce5b5770b1961..f9f4b2e21d2ec1 100644 --- a/packages/block-editor/src/components/inserter/quick-inserter.js +++ b/packages/block-editor/src/components/inserter/quick-inserter.js @@ -44,9 +44,11 @@ export default function QuickInserter( { onInsertBlocks ); - const [ patterns ] = usePatternsState( onInsertBlocks ); - const showPatterns = - ! destinationRootClientId && patterns.length && !! filterValue; + const [ patterns ] = usePatternsState( + onInsertBlocks, + destinationRootClientId + ); + const showPatterns = patterns.length && !! filterValue; const showSearch = ( showPatterns && patterns.length > SEARCH_THRESHOLD ) || blockTypes.length > SEARCH_THRESHOLD; From ec5273af97c1a1fd339c2bcd8d65c8e7134b947a Mon Sep 17 00:00:00 2001 From: David Szabo Date: Tue, 26 Jan 2021 10:08:01 +0100 Subject: [PATCH 11/15] Fix pattern search --- .../block-editor/src/components/inserter/search-results.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/inserter/search-results.js b/packages/block-editor/src/components/inserter/search-results.js index 56f17a95f05f4b..00d34c814170be 100644 --- a/packages/block-editor/src/components/inserter/search-results.js +++ b/packages/block-editor/src/components/inserter/search-results.js @@ -54,7 +54,8 @@ function InserterSearchResults( { onSelectBlockType, ] = useBlockTypesState( destinationRootClientId, onInsertBlocks ); const [ patterns, , onSelectBlockPattern ] = usePatternsState( - onInsertBlocks + onInsertBlocks, + destinationRootClientId ); const filteredBlockTypes = useMemo( () => { From a15641ccdf59434c102a959ddbe4e1274aae35fe Mon Sep 17 00:00:00 2001 From: David Szabo Date: Wed, 27 Jan 2021 19:54:19 +0100 Subject: [PATCH 12/15] Prefetch patterns and parse them --- .../src/components/provider/use-block-editor-settings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js index 9e40ec16209498..f9742c2739038b 100644 --- a/packages/editor/src/components/provider/use-block-editor-settings.js +++ b/packages/editor/src/components/provider/use-block-editor-settings.js @@ -125,6 +125,9 @@ function useBlockEditorSettings( settings, hasTemplate ) { ); const { canUser } = select( coreStore ); + // Prefetch and parse patterns. + select( 'core/block-editor' ).__experimentalGetAllowedPatterns(); + return { canUseUnfilteredHTML: canUserUseUnfilteredHTML(), reusableBlocks: select( 'core' ).getEntityRecords( From c255a8b94c141a8705e39026ae7deb481fb15bf9 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Thu, 28 Jan 2021 09:37:48 +0100 Subject: [PATCH 13/15] Update comment --- .../src/components/provider/use-block-editor-settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js index f9742c2739038b..9c05ecbcc038bb 100644 --- a/packages/editor/src/components/provider/use-block-editor-settings.js +++ b/packages/editor/src/components/provider/use-block-editor-settings.js @@ -125,7 +125,8 @@ function useBlockEditorSettings( settings, hasTemplate ) { ); const { canUser } = select( coreStore ); - // Prefetch and parse patterns. + // Prefetch and parse patterns. This ensures patterns are loaded and parsed when + // the editor is loaded rather than degrading the performance of the inserter. select( 'core/block-editor' ).__experimentalGetAllowedPatterns(); return { From 185806f619a497b964fc6dbdcad0b83711498978 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Fri, 29 Jan 2021 14:32:37 +0100 Subject: [PATCH 14/15] Move prefetch --- packages/edit-post/src/editor.js | 4 ++++ packages/edit-site/src/components/editor/index.js | 4 ++++ .../src/components/provider/use-block-editor-settings.js | 5 ----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/edit-post/src/editor.js b/packages/edit-post/src/editor.js index 89c0e8efae5c6c..11a82a1e899d34 100644 --- a/packages/edit-post/src/editor.js +++ b/packages/edit-post/src/editor.js @@ -82,6 +82,10 @@ function Editor( { const isFSETheme = getEditorSettings().isFSETheme; const isViewable = getPostType( postType )?.viewable ?? false; + // Prefetch and parse patterns. This ensures patterns are loaded and parsed when + // the editor is loaded rather than degrading the performance of the inserter. + select( 'core/block-editor' ).__experimentalGetAllowedPatterns(); + return { hasFixedToolbar: isFeatureActive( 'fixedToolbar' ) || diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js index 204f75e9b02257..36edbc641a7a8f 100644 --- a/packages/edit-site/src/components/editor/index.js +++ b/packages/edit-site/src/components/editor/index.js @@ -71,6 +71,10 @@ function Editor() { const postType = getEditedPostType(); const postId = getEditedPostId(); + // Prefetch and parse patterns. This ensures patterns are loaded and parsed when + // the editor is loaded rather than degrading the performance of the inserter. + select( 'core/block-editor' ).__experimentalGetAllowedPatterns(); + // The currently selected entity to display. Typically template or template part. return { isInserterOpen: isInserterOpened(), diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js index 9c05ecbcc038bb..ec2591bf5234f9 100644 --- a/packages/editor/src/components/provider/use-block-editor-settings.js +++ b/packages/editor/src/components/provider/use-block-editor-settings.js @@ -124,11 +124,6 @@ function useBlockEditorSettings( settings, hasTemplate ) { editorStore ); const { canUser } = select( coreStore ); - - // Prefetch and parse patterns. This ensures patterns are loaded and parsed when - // the editor is loaded rather than degrading the performance of the inserter. - select( 'core/block-editor' ).__experimentalGetAllowedPatterns(); - return { canUseUnfilteredHTML: canUserUseUnfilteredHTML(), reusableBlocks: select( 'core' ).getEntityRecords( From 7b191ded4f6761ebfb1515e654f301a9a1636cf8 Mon Sep 17 00:00:00 2001 From: David Szabo Date: Fri, 29 Jan 2021 16:30:13 +0100 Subject: [PATCH 15/15] Rollback use-block-editor-settings file --- .../editor/src/components/provider/use-block-editor-settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js index ec2591bf5234f9..9e40ec16209498 100644 --- a/packages/editor/src/components/provider/use-block-editor-settings.js +++ b/packages/editor/src/components/provider/use-block-editor-settings.js @@ -124,6 +124,7 @@ function useBlockEditorSettings( settings, hasTemplate ) { editorStore ); const { canUser } = select( coreStore ); + return { canUseUnfilteredHTML: canUserUseUnfilteredHTML(), reusableBlocks: select( 'core' ).getEntityRecords(