From 3faa4df6d7a888dbfe8781ecec0c59def0a30eab Mon Sep 17 00:00:00 2001 From: Jorge Date: Mon, 4 Jul 2022 16:10:44 +0100 Subject: [PATCH] Site Editor: Add New - Custom/General template --- .../add-custom-generic-template-modal.js | 100 ++++++++++++++++++ .../add-new-template/new-template.js | 29 ++++- .../components/add-new-template/style.scss | 21 ++++ 3 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 packages/edit-site/src/components/add-new-template/add-custom-generic-template-modal.js diff --git a/packages/edit-site/src/components/add-new-template/add-custom-generic-template-modal.js b/packages/edit-site/src/components/add-new-template/add-custom-generic-template-modal.js new file mode 100644 index 0000000000000..66652de31b007 --- /dev/null +++ b/packages/edit-site/src/components/add-new-template/add-custom-generic-template-modal.js @@ -0,0 +1,100 @@ +/** + * External dependencies + */ +import { kebabCase } from 'lodash'; + +/** + * WordPress dependencies + */ +import { useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { + Button, + Flex, + FlexItem, + Modal, + TextControl, +} from '@wordpress/components'; + +function AddCustomGenericTemplateModal( { onClose, createTemplate } ) { + const [ title, setTitle ] = useState( '' ); + const defaultTitle = __( 'Custom Template' ); + const [ isBusy, setIsBusy ] = useState( false ); + async function onCreateTemplate( event ) { + event.preventDefault(); + + if ( isBusy ) { + return; + } + + setIsBusy( true ); + + await createTemplate( + { + slug: + 'wp-custom-template-' + kebabCase( title || defaultTitle ), + title: title || defaultTitle, + }, + false + ); + + setIsBusy( false ); + onClose( false ); + } + return ( + { + onClose(); + } } + overlayClassName="edit-site-custom-generic-template__modal" + > +
+ + + + + + + + + + + + + + +
+
+ ); +} + +export default AddCustomGenericTemplateModal; diff --git a/packages/edit-site/src/components/add-new-template/new-template.js b/packages/edit-site/src/components/add-new-template/new-template.js index f8b2f9ec26d31..8aabea6e632f8 100644 --- a/packages/edit-site/src/components/add-new-template/new-template.js +++ b/packages/edit-site/src/components/add-new-template/new-template.js @@ -30,6 +30,7 @@ import { postDate, search, tag, + layout as customGenericTemplateIcon, } from '@wordpress/icons'; import { __, sprintf } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; @@ -38,6 +39,7 @@ import { store as noticesStore } from '@wordpress/notices'; * Internal dependencies */ import AddCustomTemplateModal from './add-custom-template-modal'; +import AddCustomGenericTemplateModal from './add-custom-generic-template-modal'; import { usePostTypes, usePostTypesEntitiesInfo } from './utils'; import { useHistory } from '../routes'; import { store as editSiteStore } from '../../store'; @@ -78,6 +80,10 @@ export default function NewTemplate( { postType } ) { const postTypes = usePostTypes(); const [ showCustomTemplateModal, setShowCustomTemplateModal ] = useState( false ); + const [ + showCustomGenericTemplateModal, + setShowCustomGenericTemplateModal, + ] = useState( false ); const [ entityForSuggestions, setEntityForSuggestions ] = useState( {} ); const { existingTemplates, defaultTemplateTypes } = useSelect( ( select ) => ( { @@ -96,7 +102,7 @@ export default function NewTemplate( { postType } ) { const { createErrorNotice } = useDispatch( noticesStore ); const { setTemplate } = useDispatch( editSiteStore ); - async function createTemplate( template ) { + async function createTemplate( template, isWPSuggestion = true ) { try { const { title, description, slug } = template; const newTemplate = await saveEntityRecord( @@ -109,7 +115,7 @@ export default function NewTemplate( { postType } ) { status: 'publish', title, // This adds a post meta field in template that is part of `is_custom` value calculation. - is_wp_suggestion: true, + is_wp_suggestion: isWPSuggestion, }, { throwOnError: true } ); @@ -253,6 +259,19 @@ export default function NewTemplate( { postType } ) { ); } ) } + + setShowCustomGenericTemplateModal( true ) + } + > + { __( 'Custom template' ) } + ) } @@ -263,6 +282,12 @@ export default function NewTemplate( { postType } ) { entityForSuggestions={ entityForSuggestions } /> ) } + { showCustomGenericTemplateModal && ( + setShowCustomGenericTemplateModal( false ) } + createTemplate={ createTemplate } + /> + ) } ); } diff --git a/packages/edit-site/src/components/add-new-template/style.scss b/packages/edit-site/src/components/add-new-template/style.scss index 81fe785680062..7ee65f4f94a9f 100644 --- a/packages/edit-site/src/components/add-new-template/style.scss +++ b/packages/edit-site/src/components/add-new-template/style.scss @@ -125,3 +125,24 @@ margin-bottom: 0; margin-top: $grid-unit-20; } + + +.edit-site-custom-generic-template__modal { + .components-base-control { + @include break-medium() { + width: $grid-unit * 40; + } + } + + .components-modal__header { + border-bottom: none; + } + + .components-modal__content::before { + margin-bottom: $grid-unit-05; + } +} + +.edit-site-custom-generic-template__modal-actions { + margin-top: $grid-unit-15; +}