Skip to content

Commit

Permalink
Patterns: add option to set sync status when adding from wp-admin pat…
Browse files Browse the repository at this point in the history
…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
glendaviesnz and ramonjd authored Jul 11, 2023
1 parent e6c4f7e commit 203789b
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 8 deletions.
2 changes: 2 additions & 0 deletions packages/edit-post/src/components/layout/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
EditorNotices,
EditorKeyboardShortcutsRegister,
EditorSnackbars,
PostSyncStatusModal,
store as editorStore,
} from '@wordpress/editor';
import { useSelect, useDispatch } from '@wordpress/data';
Expand Down Expand Up @@ -291,6 +292,7 @@ function Layout( { styles } ) {
<EditPostPreferencesModal />
<KeyboardShortcutHelpModal />
<WelcomeGuide />
<PostSyncStatusModal />
<StartPageOptions />
<Popover.Slot />
<PluginArea onError={ onPluginAreaError } />
Expand Down
5 changes: 4 additions & 1 deletion packages/editor/src/components/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@ export { default as PostSlugCheck } from './post-slug/check';
export { default as PostSticky } from './post-sticky';
export { default as PostStickyCheck } from './post-sticky/check';
export { default as PostSwitchToDraftButton } from './post-switch-to-draft-button';
export { default as PostSyncStatus } from './post-sync-status';
export {
default as PostSyncStatus,
PostSyncStatusModal,
} from './post-sync-status';
export { default as PostTaxonomies } from './post-taxonomies';
export { FlatTermSelector as PostTaxonomiesFlatTermSelector } from './post-taxonomies/flat-term-selector';
export { HierarchicalTermSelector as PostTaxonomiesHierarchicalTermSelector } from './post-taxonomies/hierarchical-term-selector';
Expand Down
106 changes: 99 additions & 7 deletions packages/editor/src/components/post-sync-status/index.js
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>
) }
</>
);
}

1 comment on commit 203789b

@github-actions
Copy link

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:

Please sign in to comment.