-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Patterns: add option to set sync status when adding from wp-admin pat…
…terns list (#52352) * Show a modal to set sync status if adding pattern from pattern list page * Make sure the modal loads if post settings panel not open * don't load modal component at all if not new post * Simplify the sync status so undefined always = synced * Update packages/editor/src/components/post-sync-status/index.js --------- Co-authored-by: Ramon <ramonjd@users.noreply.github.com>
- Loading branch information
1 parent
e6c4f7e
commit 203789b
Showing
3 changed files
with
105 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
106 changes: 99 additions & 7 deletions
106
packages/editor/src/components/post-sync-status/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,127 @@ | ||
/** | ||
* WordPress dependencies | ||
*/ | ||
import { useSelect } from '@wordpress/data'; | ||
import { useSelect, useDispatch } from '@wordpress/data'; | ||
import { __ } from '@wordpress/i18n'; | ||
import { PanelRow } from '@wordpress/components'; | ||
import { | ||
PanelRow, | ||
Modal, | ||
Button, | ||
__experimentalHStack as HStack, | ||
__experimentalVStack as VStack, | ||
ToggleControl, | ||
} from '@wordpress/components'; | ||
import { useEffect, useState } from '@wordpress/element'; | ||
import { ReusableBlocksRenameHint } from '@wordpress/block-editor'; | ||
|
||
/** | ||
* Internal dependencies | ||
*/ | ||
import { store as editorStore } from '../../store'; | ||
|
||
export default function PostSyncStatus() { | ||
const { syncStatus, postType } = useSelect( ( select ) => { | ||
const { syncStatus, postType, meta } = useSelect( ( select ) => { | ||
const { getEditedPostAttribute } = select( editorStore ); | ||
return { | ||
syncStatus: getEditedPostAttribute( 'wp_pattern_sync_status' ), | ||
meta: getEditedPostAttribute( 'meta' ), | ||
postType: getEditedPostAttribute( 'type' ), | ||
}; | ||
}, [] ); | ||
} ); | ||
|
||
if ( postType !== 'wp_block' ) { | ||
return null; | ||
} | ||
|
||
const isFullySynced = ! syncStatus; | ||
// When the post is first created, the top level wp_pattern_sync_status is not set so get meta value instead. | ||
const currentSyncStatus = | ||
meta?.wp_pattern_sync_status === 'unsynced' ? 'unsynced' : syncStatus; | ||
|
||
return ( | ||
<PanelRow className="edit-post-sync-status"> | ||
<span>{ __( 'Sync status' ) }</span> | ||
<div> | ||
{ isFullySynced ? __( 'Fully synced' ) : __( 'Not synced' ) } | ||
{ currentSyncStatus === 'unsynced' | ||
? __( 'Not synced' ) | ||
: __( 'Fully synced' ) } | ||
</div> | ||
</PanelRow> | ||
); | ||
} | ||
|
||
export function PostSyncStatusModal() { | ||
const { editPost } = useDispatch( editorStore ); | ||
const [ isModalOpen, setIsModalOpen ] = useState( false ); | ||
const [ syncType, setSyncType ] = useState( undefined ); | ||
|
||
const { postType, isNewPost } = useSelect( ( select ) => { | ||
const { getEditedPostAttribute, isCleanNewPost } = | ||
select( editorStore ); | ||
return { | ||
postType: getEditedPostAttribute( 'type' ), | ||
isNewPost: isCleanNewPost(), | ||
}; | ||
}, [] ); | ||
|
||
useEffect( () => { | ||
if ( isNewPost && postType === 'wp_block' ) { | ||
setIsModalOpen( true ); | ||
} | ||
// We only want the modal to open when the page is first loaded. | ||
// eslint-disable-next-line react-hooks/exhaustive-deps | ||
}, [] ); | ||
|
||
const setSyncStatus = () => { | ||
editPost( { | ||
meta: { | ||
wp_pattern_sync_status: syncType, | ||
}, | ||
} ); | ||
}; | ||
|
||
if ( postType !== 'wp_block' || ! isNewPost ) { | ||
return null; | ||
} | ||
|
||
return ( | ||
<> | ||
{ isModalOpen && ( | ||
<Modal | ||
title={ __( 'Set pattern sync status' ) } | ||
onRequestClose={ () => { | ||
setIsModalOpen( false ); | ||
} } | ||
overlayClassName="reusable-blocks-menu-items__convert-modal" | ||
> | ||
<form | ||
onSubmit={ ( event ) => { | ||
event.preventDefault(); | ||
setIsModalOpen( false ); | ||
setSyncStatus(); | ||
} } | ||
> | ||
<VStack spacing="5"> | ||
<ReusableBlocksRenameHint /> | ||
<ToggleControl | ||
label={ __( 'Synced' ) } | ||
help={ __( | ||
'Editing the pattern will update it anywhere it is used.' | ||
) } | ||
checked={ ! syncType } | ||
onChange={ () => { | ||
setSyncType( | ||
! syncType ? 'unsynced' : undefined | ||
); | ||
} } | ||
/> | ||
<HStack justify="right"> | ||
<Button variant="primary" type="submit"> | ||
{ __( 'Create' ) } | ||
</Button> | ||
</HStack> | ||
</VStack> | ||
</form> | ||
</Modal> | ||
) } | ||
</> | ||
); | ||
} |
203789b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Flaky tests detected in 203789b.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.
🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/5518338882
📝 Reported issues:
specs/editor/plugins/block-context.test.js
/test/e2e/specs/editor/various/preview.spec.js