Skip to content

Commit

Permalink
Add allowedBlocksMiddleware
Browse files Browse the repository at this point in the history
  • Loading branch information
jorgefilipecosta committed Jun 13, 2018
1 parent 3504ae7 commit 54e9ebf
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 5 deletions.
10 changes: 6 additions & 4 deletions editor/store/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -286,19 +286,21 @@ export function insertBlock( block, index, rootUID ) {
* Returns an action object used in signalling that an array of blocks should
* be inserted, optionally at a specific index respective a root block list.
*
* @param {Object[]} blocks Block objects to insert.
* @param {?number} index Index at which block should be inserted.
* @param {?string} rootUID Optional root UID of block list to insert.
* @param {Object[]} blocks Block objects to insert.
* @param {?number} index Index at which block should be inserted.
* @param {?string} rootUID Optional root UID of block list to insert.
* @param {?boolean} ignoreAllowedBlocksValidation Optional root UID of block list to insert.
*
* @return {Object} Action object.
*/
export function insertBlocks( blocks, index, rootUID ) {
export function insertBlocks( blocks, index, rootUID, ignoreAllowedBlocksValidation ) {
return {
type: 'INSERT_BLOCKS',
blocks: castArray( blocks ),
index,
rootUID,
time: Date.now(),
ignoreAllowedBlocksValidation,
};
}

Expand Down
2 changes: 2 additions & 0 deletions editor/store/middlewares.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { flowRight } from 'lodash';
* Internal dependencies
*/
import effects from './effects';
import allowedBlocksMiddleware from '../utils/allowed-blocks-middleware';

/**
* Applies the custom middlewares used specifically in the editor module.
Expand All @@ -21,6 +22,7 @@ function applyMiddlewares( store ) {
const middlewares = [
refx( effects ),
multi,
allowedBlocksMiddleware,
];

let enhancedDispatch = () => {
Expand Down
63 changes: 63 additions & 0 deletions editor/utils/allowed-blocks-middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

/**
* External dependencies
*/
import { every, filter, first } from 'lodash';

/**
* Internal dependencies
*/
import { canInsertBlockType, getBlock, getBlockName, getBlockRootUID } from '../store/selectors';

const allowedBlocksMiddleware = ( store ) => ( next ) => ( action ) => {
switch ( action.type ) {
// on insert we allow the action if at least one of the blocks can be inserted filtering the other blocks
case 'INSERT_BLOCKS': {
if ( action.ignoreAllowedBlocksValidation ) {
next( action );
return;
}
const allowedBlocks =
filter( action.blocks, ( block ) => block && canInsertBlockType( store.getState(), block.name, action.rootUID ) );
if ( allowedBlocks.length ) {
next( {
...action,
blocks: allowedBlocks,
} );
}
return;
}
case 'MOVE_BLOCK_TO_POSITION': {
const { fromRootUID, toRootUID, uid } = action;
const blockName = getBlockName( store.getState(), uid );
// currently the only constraint to move inside the same parent is locking
// locking was already handled
// it is not possible to use drag & drop if locking is active
if ( toRootUID === fromRootUID || canInsertBlockType( store.getState(), blockName, toRootUID ) ) {
next( action );
}
return;
}
case 'REPLACE_BLOCKS': {
const rootUID = getBlockRootUID( store.getState(), first( action.uids ) );
// replace is valid if the new blocks can be inserted in the root block
// or if we had a block of the same type in the position of the block being replaced.
const replaceIsValid = every( action.blocks, ( block, index ) => {
if ( canInsertBlockType( store.getState(), block.name, rootUID ) ) {
return true;
}
const uidBlockBeingReplaced = action.uids[ index ];
const blockBeingReplaced = uidBlockBeingReplaced && getBlock( store.getState(), uidBlockBeingReplaced );
return blockBeingReplaced && blockBeingReplaced.name === block.name;
} );
if ( replaceIsValid ) {
next( action );
}
return;
}
default:
next( action );
}
};

export default allowedBlocksMiddleware;
2 changes: 1 addition & 1 deletion editor/utils/block-list.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export function createInnerBlockList( uid, renderBlockMenu = noop ) {
const { insertBlocks, updateBlockListSettings } = dispatch( 'core/editor' );
return {
insertBlocks( blocks ) {
dispatch( insertBlocks( blocks, undefined, uid ) );
dispatch( insertBlocks( blocks, undefined, uid, true ) );
},
updateNestedSettings( settings ) {
dispatch( updateBlockListSettings( uid, settings ) );
Expand Down

0 comments on commit 54e9ebf

Please sign in to comment.