@wordpress/patterns 1.9.0 → 1.9.1-next.79a6196f.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/build/components/create-pattern-modal.js +33 -20
- package/build/components/create-pattern-modal.js.map +1 -1
- package/build/components/duplicate-pattern-modal.js +29 -17
- package/build/components/duplicate-pattern-modal.js.map +1 -1
- package/build/components/partial-syncing-controls.js +39 -29
- package/build/components/partial-syncing-controls.js.map +1 -1
- package/build/private-apis.js +6 -2
- package/build/private-apis.js.map +1 -1
- package/build-module/components/create-pattern-modal.js +32 -20
- package/build-module/components/create-pattern-modal.js.map +1 -1
- package/build-module/components/duplicate-pattern-modal.js +28 -17
- package/build-module/components/duplicate-pattern-modal.js.map +1 -1
- package/build-module/components/partial-syncing-controls.js +39 -29
- package/build-module/components/partial-syncing-controls.js.map +1 -1
- package/build-module/private-apis.js +4 -2
- package/build-module/private-apis.js.map +1 -1
- package/package.json +16 -16
- package/src/components/create-pattern-modal.js +100 -89
- package/src/components/duplicate-pattern-modal.js +26 -24
- package/src/components/partial-syncing-controls.js +57 -45
- package/src/private-apis.js +10 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","__","_x","useState","useMemo","useDispatch","useSelect","store","noticesStore","coreStore","PATTERN_DEFAULT_CATEGORY","PATTERN_SYNC_TYPES","patternsStore","CategorySelector","CATEGORY_SLUG","unlock","CreatePatternModal","confirmLabel","defaultCategories","className","content","modalTitle","onClose","onError","onSuccess","defaultSyncType","full","defaultTitle","syncType","setSyncType","categoryTerms","setCategoryTerms","title","setTitle","isSaving","setIsSaving","createPattern","saveEntityRecord","invalidateResolution","createErrorNotice","corePatternCategories","userPatternCategories","select","getUserPatternCategories","getBlockPatternCategories","categoryMap","uniqueCategories","Map","forEach","category","has","label","name","set","value","onCreate","patternTitle","sync","categories","Promise","all","map","termName","findOrCreateTerm","newPattern","pattern","categoryId","error","message","type","id","term","existingTerm","get","termData","slug","newTerm","throwOnError","code","data","term_id","createElement","onRequestClose","overlayClassName","onSubmit","event","preventDefault","spacing","onChange","placeholder","__nextHasNoMarginBottom","__next40pxDefaultSize","help","checked","unsynced","justify","variant","onClick","isBusy"],"sources":["@wordpress/patterns/src/components/create-pattern-modal.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { __, _x } from '@wordpress/i18n';\nimport { useState, useMemo } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { PATTERN_DEFAULT_CATEGORY, PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CategorySelector, { CATEGORY_SLUG } from './category-selector';\nimport { unlock } from '../lock-unlock';\n\nexport default function CreatePatternModal( {\n\tconfirmLabel = __( 'Create' ),\n\tdefaultCategories = [],\n\tclassName = 'patterns-menu-items__convert-modal',\n\tcontent,\n\tmodalTitle = __( 'Create pattern' ),\n\tonClose,\n\tonError,\n\tonSuccess,\n\tdefaultSyncType = PATTERN_SYNC_TYPES.full,\n\tdefaultTitle = '',\n} ) {\n\tconst [ syncType, setSyncType ] = useState( defaultSyncType );\n\tconst [ categoryTerms, setCategoryTerms ] = useState( defaultCategories );\n\tconst [ title, setTitle ] = useState( defaultTitle );\n\n\tconst [ isSaving, setIsSaving ] = useState( false );\n\tconst { createPattern } = unlock( useDispatch( patternsStore ) );\n\tconst { saveEntityRecord, invalidateResolution } = useDispatch( coreStore );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\n\tconst { corePatternCategories, userPatternCategories } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getUserPatternCategories, getBlockPatternCategories } =\n\t\t\t\tselect( coreStore );\n\n\t\t\treturn {\n\t\t\t\tcorePatternCategories: getBlockPatternCategories(),\n\t\t\t\tuserPatternCategories: getUserPatternCategories(),\n\t\t\t};\n\t\t}\n\t);\n\n\tconst categoryMap = useMemo( () => {\n\t\t// Merge the user and core pattern categories and remove any duplicates.\n\t\tconst uniqueCategories = new Map();\n\t\t[ ...userPatternCategories, ...corePatternCategories ].forEach(\n\t\t\t( category ) => {\n\t\t\t\tif (\n\t\t\t\t\t! uniqueCategories.has( category.label ) &&\n\t\t\t\t\t// There are two core categories with `Post` label so explicitly remove the one with\n\t\t\t\t\t// the `query` slug to avoid any confusion.\n\t\t\t\t\tcategory.name !== 'query'\n\t\t\t\t) {\n\t\t\t\t\t// We need to store the name separately as this is used as the slug in the\n\t\t\t\t\t// taxonomy and may vary from the label.\n\t\t\t\t\tuniqueCategories.set( category.label, {\n\t\t\t\t\t\tlabel: category.label,\n\t\t\t\t\t\tvalue: category.label,\n\t\t\t\t\t\tname: category.name,\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\treturn uniqueCategories;\n\t}, [ userPatternCategories, corePatternCategories ] );\n\n\tasync function onCreate( patternTitle, sync ) {\n\t\tif ( ! title || isSaving ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsSaving( true );\n\t\t\tconst categories = await Promise.all(\n\t\t\t\tcategoryTerms.map( ( termName ) =>\n\t\t\t\t\tfindOrCreateTerm( termName )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst newPattern = await createPattern(\n\t\t\t\tpatternTitle,\n\t\t\t\tsync,\n\t\t\t\ttypeof content === 'function' ? content() : content,\n\t\t\t\tcategories\n\t\t\t);\n\t\t\tonSuccess( {\n\t\t\t\tpattern: newPattern,\n\t\t\t\tcategoryId: PATTERN_DEFAULT_CATEGORY,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'pattern-create',\n\t\t\t} );\n\t\t\tonError?.();\n\t\t} finally {\n\t\t\tsetIsSaving( false );\n\t\t\tsetCategoryTerms( [] );\n\t\t\tsetTitle( '' );\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} term\n\t * @return {Promise<number>} The pattern category id.\n\t */\n\tasync function findOrCreateTerm( term ) {\n\t\ttry {\n\t\t\t// We need to match any existing term to the correct slug to prevent duplicates, eg.\n\t\t\t// the core `Headers` category uses the singular `header` as the slug.\n\t\t\tconst existingTerm = categoryMap.get( term );\n\t\t\tconst termData = existingTerm\n\t\t\t\t? { name: existingTerm.label, slug: existingTerm.name }\n\t\t\t\t: { name: term };\n\t\t\tconst newTerm = await saveEntityRecord(\n\t\t\t\t'taxonomy',\n\t\t\t\tCATEGORY_SLUG,\n\t\t\t\ttermData,\n\t\t\t\t{ throwOnError: true }\n\t\t\t);\n\t\t\tinvalidateResolution( 'getUserPatternCategories' );\n\t\t\treturn newTerm.id;\n\t\t} catch ( error ) {\n\t\t\tif ( error.code !== 'term_exists' ) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn error.data.term_id;\n\t\t}\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ modalTitle }\n\t\t\tonRequestClose={ () => {\n\t\t\t\tonClose();\n\t\t\t\tsetTitle( '' );\n\t\t\t} }\n\t\t\toverlayClassName={ className }\n\t\t>\n\t\t\t<form\n\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tonCreate( title, syncType );\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\t\tclassName=\"patterns-create-modal__name-input\"\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t/>\n\t\t\t\t\t<CategorySelector\n\t\t\t\t\t\tcategoryTerms={ categoryTerms }\n\t\t\t\t\t\tonChange={ setCategoryTerms }\n\t\t\t\t\t\tcategoryMap={ categoryMap }\n\t\t\t\t\t/>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\tlabel={ _x(\n\t\t\t\t\t\t\t'Synced',\n\t\t\t\t\t\t\t'Option that makes an individual pattern synchronized'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t'Sync this pattern across multiple locations.'\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tchecked={ syncType === PATTERN_SYNC_TYPES.full }\n\t\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\t\tsyncType === PATTERN_SYNC_TYPES.full\n\t\t\t\t\t\t\t\t\t? PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t\t\t\t\t\t: PATTERN_SYNC_TYPES.full\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\taria-disabled={ ! title || isSaving }\n\t\t\t\t\t\t\tisBusy={ isSaving }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ confirmLabel }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</HStack>\n\t\t\t\t</VStack>\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","__","_x","useState","useMemo","useDispatch","useSelect","store","noticesStore","coreStore","PATTERN_DEFAULT_CATEGORY","PATTERN_SYNC_TYPES","patternsStore","CategorySelector","CATEGORY_SLUG","unlock","CreatePatternModal","className","modalTitle","restProps","createElement","title","onRequestClose","onClose","overlayClassName","CreatePatternModalContents","confirmLabel","defaultCategories","content","onError","onSuccess","defaultSyncType","full","defaultTitle","syncType","setSyncType","categoryTerms","setCategoryTerms","setTitle","isSaving","setIsSaving","createPattern","saveEntityRecord","invalidateResolution","createErrorNotice","corePatternCategories","userPatternCategories","select","getUserPatternCategories","getBlockPatternCategories","categoryMap","uniqueCategories","Map","forEach","category","set","label","toLowerCase","name","id","has","onCreate","patternTitle","sync","categories","Promise","all","map","termName","findOrCreateTerm","newPattern","pattern","categoryId","error","message","type","term","existingTerm","get","termData","slug","newTerm","throwOnError","code","data","term_id","onSubmit","event","preventDefault","spacing","value","onChange","placeholder","__nextHasNoMarginBottom","__next40pxDefaultSize","help","checked","unsynced","justify","variant","onClick","isBusy"],"sources":["@wordpress/patterns/src/components/create-pattern-modal.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tModal,\n\tButton,\n\tTextControl,\n\t__experimentalHStack as HStack,\n\t__experimentalVStack as VStack,\n\tToggleControl,\n} from '@wordpress/components';\nimport { __, _x } from '@wordpress/i18n';\nimport { useState, useMemo } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport { PATTERN_DEFAULT_CATEGORY, PATTERN_SYNC_TYPES } from '../constants';\n\n/**\n * Internal dependencies\n */\nimport { store as patternsStore } from '../store';\nimport CategorySelector, { CATEGORY_SLUG } from './category-selector';\nimport { unlock } from '../lock-unlock';\n\nexport default function CreatePatternModal( {\n\tclassName = 'patterns-menu-items__convert-modal',\n\tmodalTitle = __( 'Create pattern' ),\n\t...restProps\n} ) {\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ modalTitle }\n\t\t\tonRequestClose={ restProps.onClose }\n\t\t\toverlayClassName={ className }\n\t\t>\n\t\t\t<CreatePatternModalContents { ...restProps } />\n\t\t</Modal>\n\t);\n}\n\nexport function CreatePatternModalContents( {\n\tconfirmLabel = __( 'Create' ),\n\tdefaultCategories = [],\n\tcontent,\n\tonClose,\n\tonError,\n\tonSuccess,\n\tdefaultSyncType = PATTERN_SYNC_TYPES.full,\n\tdefaultTitle = '',\n} ) {\n\tconst [ syncType, setSyncType ] = useState( defaultSyncType );\n\tconst [ categoryTerms, setCategoryTerms ] = useState( defaultCategories );\n\tconst [ title, setTitle ] = useState( defaultTitle );\n\n\tconst [ isSaving, setIsSaving ] = useState( false );\n\tconst { createPattern } = unlock( useDispatch( patternsStore ) );\n\tconst { saveEntityRecord, invalidateResolution } = useDispatch( coreStore );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\n\tconst { corePatternCategories, userPatternCategories } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getUserPatternCategories, getBlockPatternCategories } =\n\t\t\t\tselect( coreStore );\n\n\t\t\treturn {\n\t\t\t\tcorePatternCategories: getBlockPatternCategories(),\n\t\t\t\tuserPatternCategories: getUserPatternCategories(),\n\t\t\t};\n\t\t}\n\t);\n\n\tconst categoryMap = useMemo( () => {\n\t\t// Merge the user and core pattern categories and remove any duplicates.\n\t\tconst uniqueCategories = new Map();\n\t\tuserPatternCategories.forEach( ( category ) => {\n\t\t\tuniqueCategories.set( category.label.toLowerCase(), {\n\t\t\t\tlabel: category.label,\n\t\t\t\tname: category.name,\n\t\t\t\tid: category.id,\n\t\t\t} );\n\t\t} );\n\n\t\tcorePatternCategories.forEach( ( category ) => {\n\t\t\tif (\n\t\t\t\t! uniqueCategories.has( category.label.toLowerCase() ) &&\n\t\t\t\t// There are two core categories with `Post` label so explicitly remove the one with\n\t\t\t\t// the `query` slug to avoid any confusion.\n\t\t\t\tcategory.name !== 'query'\n\t\t\t) {\n\t\t\t\tuniqueCategories.set( category.label.toLowerCase(), {\n\t\t\t\t\tlabel: category.label,\n\t\t\t\t\tname: category.name,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t\treturn uniqueCategories;\n\t}, [ userPatternCategories, corePatternCategories ] );\n\n\tasync function onCreate( patternTitle, sync ) {\n\t\tif ( ! title || isSaving ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsSaving( true );\n\t\t\tconst categories = await Promise.all(\n\t\t\t\tcategoryTerms.map( ( termName ) =>\n\t\t\t\t\tfindOrCreateTerm( termName )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst newPattern = await createPattern(\n\t\t\t\tpatternTitle,\n\t\t\t\tsync,\n\t\t\t\ttypeof content === 'function' ? content() : content,\n\t\t\t\tcategories\n\t\t\t);\n\t\t\tonSuccess( {\n\t\t\t\tpattern: newPattern,\n\t\t\t\tcategoryId: PATTERN_DEFAULT_CATEGORY,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'pattern-create',\n\t\t\t} );\n\t\t\tonError?.();\n\t\t} finally {\n\t\t\tsetIsSaving( false );\n\t\t\tsetCategoryTerms( [] );\n\t\t\tsetTitle( '' );\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} term\n\t * @return {Promise<number>} The pattern category id.\n\t */\n\tasync function findOrCreateTerm( term ) {\n\t\ttry {\n\t\t\tconst existingTerm = categoryMap.get( term.toLowerCase() );\n\t\t\tif ( existingTerm && existingTerm.id ) {\n\t\t\t\treturn existingTerm.id;\n\t\t\t}\n\t\t\t// If we have an existing core category we need to match the new user category to the\n\t\t\t// correct slug rather than autogenerating it to prevent duplicates, eg. the core `Headers`\n\t\t\t// category uses the singular `header` as the slug.\n\t\t\tconst termData = existingTerm\n\t\t\t\t? { name: existingTerm.label, slug: existingTerm.name }\n\t\t\t\t: { name: term };\n\t\t\tconst newTerm = await saveEntityRecord(\n\t\t\t\t'taxonomy',\n\t\t\t\tCATEGORY_SLUG,\n\t\t\t\ttermData,\n\t\t\t\t{ throwOnError: true }\n\t\t\t);\n\t\t\tinvalidateResolution( 'getUserPatternCategories' );\n\t\t\treturn newTerm.id;\n\t\t} catch ( error ) {\n\t\t\tif ( error.code !== 'term_exists' ) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn error.data.term_id;\n\t\t}\n\t}\n\treturn (\n\t\t<form\n\t\t\tonSubmit={ ( event ) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tonCreate( title, syncType );\n\t\t\t} }\n\t\t>\n\t\t\t<VStack spacing=\"5\">\n\t\t\t\t<TextControl\n\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\tvalue={ title }\n\t\t\t\t\tonChange={ setTitle }\n\t\t\t\t\tplaceholder={ __( 'My pattern' ) }\n\t\t\t\t\tclassName=\"patterns-create-modal__name-input\"\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t/>\n\t\t\t\t<CategorySelector\n\t\t\t\t\tcategoryTerms={ categoryTerms }\n\t\t\t\t\tonChange={ setCategoryTerms }\n\t\t\t\t\tcategoryMap={ categoryMap }\n\t\t\t\t/>\n\t\t\t\t<ToggleControl\n\t\t\t\t\tlabel={ _x(\n\t\t\t\t\t\t'Synced',\n\t\t\t\t\t\t'Option that makes an individual pattern synchronized'\n\t\t\t\t\t) }\n\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t'Sync this pattern across multiple locations.'\n\t\t\t\t\t) }\n\t\t\t\t\tchecked={ syncType === PATTERN_SYNC_TYPES.full }\n\t\t\t\t\tonChange={ () => {\n\t\t\t\t\t\tsetSyncType(\n\t\t\t\t\t\t\tsyncType === PATTERN_SYNC_TYPES.full\n\t\t\t\t\t\t\t\t? PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t\t\t\t\t: PATTERN_SYNC_TYPES.full\n\t\t\t\t\t\t);\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\tsetTitle( '' );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t</Button>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\taria-disabled={ ! title || isSaving }\n\t\t\t\t\t\tisBusy={ isSaving }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ confirmLabel }\n\t\t\t\t\t</Button>\n\t\t\t\t</HStack>\n\t\t\t</VStack>\n\t\t</form>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -19,9 +19,8 @@ function getTermLabels(pattern, categories) {
|
|
|
19
19
|
}
|
|
20
20
|
return categories.user?.filter(category => pattern.wp_pattern_category.includes(category.id)).map(category => category.label);
|
|
21
21
|
}
|
|
22
|
-
export
|
|
22
|
+
export function useDuplicatePatternProps({
|
|
23
23
|
pattern,
|
|
24
|
-
onClose,
|
|
25
24
|
onSuccess
|
|
26
25
|
}) {
|
|
27
26
|
const {
|
|
@@ -40,33 +39,45 @@ export default function DuplicatePatternModal({
|
|
|
40
39
|
if (!pattern) {
|
|
41
40
|
return null;
|
|
42
41
|
}
|
|
43
|
-
|
|
42
|
+
return {
|
|
44
43
|
content: pattern.content,
|
|
45
44
|
defaultCategories: getTermLabels(pattern, categories),
|
|
46
45
|
defaultSyncType: pattern.type !== PATTERN_TYPES.user // Theme patterns are unsynced by default.
|
|
47
46
|
? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full,
|
|
48
47
|
defaultTitle: sprintf( /* translators: %s: Existing pattern title */
|
|
49
|
-
__('%s (Copy)'), typeof pattern.title === 'string' ? pattern.title : pattern.title.raw)
|
|
50
|
-
|
|
51
|
-
function handleOnSuccess({
|
|
52
|
-
pattern: newPattern
|
|
53
|
-
}) {
|
|
54
|
-
createSuccessNotice(sprintf(
|
|
55
|
-
// translators: %s: The new pattern's title e.g. 'Call to action (copy)'.
|
|
56
|
-
__('"%s" duplicated.'), newPattern.title.raw), {
|
|
57
|
-
type: 'snackbar',
|
|
58
|
-
id: 'patterns-create'
|
|
59
|
-
});
|
|
60
|
-
onSuccess?.({
|
|
48
|
+
__('%s (Copy)'), typeof pattern.title === 'string' ? pattern.title : pattern.title.raw),
|
|
49
|
+
onSuccess: ({
|
|
61
50
|
pattern: newPattern
|
|
62
|
-
})
|
|
51
|
+
}) => {
|
|
52
|
+
createSuccessNotice(sprintf(
|
|
53
|
+
// translators: %s: The new pattern's title e.g. 'Call to action (copy)'.
|
|
54
|
+
__('"%s" duplicated.'), newPattern.title.raw), {
|
|
55
|
+
type: 'snackbar',
|
|
56
|
+
id: 'patterns-create'
|
|
57
|
+
});
|
|
58
|
+
onSuccess?.({
|
|
59
|
+
pattern: newPattern
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export default function DuplicatePatternModal({
|
|
65
|
+
pattern,
|
|
66
|
+
onClose,
|
|
67
|
+
onSuccess
|
|
68
|
+
}) {
|
|
69
|
+
const duplicatedProps = useDuplicatePatternProps({
|
|
70
|
+
pattern,
|
|
71
|
+
onSuccess
|
|
72
|
+
});
|
|
73
|
+
if (!pattern) {
|
|
74
|
+
return null;
|
|
63
75
|
}
|
|
64
76
|
return createElement(CreatePatternModal, {
|
|
65
77
|
modalTitle: __('Duplicate pattern'),
|
|
66
78
|
confirmLabel: __('Duplicate'),
|
|
67
79
|
onClose: onClose,
|
|
68
80
|
onError: onClose,
|
|
69
|
-
onSuccess: handleOnSuccess,
|
|
70
81
|
...duplicatedProps
|
|
71
82
|
});
|
|
72
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["store","coreStore","useDispatch","useSelect","__","sprintf","noticesStore","CreatePatternModal","PATTERN_SYNC_TYPES","PATTERN_TYPES","getTermLabels","pattern","categories","type","user","core","filter","category","includes","name","map","label","wp_pattern_category","id","
|
|
1
|
+
{"version":3,"names":["store","coreStore","useDispatch","useSelect","__","sprintf","noticesStore","CreatePatternModal","PATTERN_SYNC_TYPES","PATTERN_TYPES","getTermLabels","pattern","categories","type","user","core","filter","category","includes","name","map","label","wp_pattern_category","id","useDuplicatePatternProps","onSuccess","createSuccessNotice","select","getUserPatternCategories","getBlockPatternCategories","content","defaultCategories","defaultSyncType","unsynced","wp_pattern_sync_status","full","defaultTitle","title","raw","newPattern","DuplicatePatternModal","onClose","duplicatedProps","createElement","modalTitle","confirmLabel","onError"],"sources":["@wordpress/patterns/src/components/duplicate-pattern-modal.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport CreatePatternModal from './create-pattern-modal';\nimport { PATTERN_SYNC_TYPES, PATTERN_TYPES } from '../constants';\n\nfunction getTermLabels( pattern, categories ) {\n\t// Theme patterns rely on core pattern categories.\n\tif ( pattern.type !== PATTERN_TYPES.user ) {\n\t\treturn categories.core\n\t\t\t?.filter( ( category ) =>\n\t\t\t\tpattern.categories.includes( category.name )\n\t\t\t)\n\t\t\t.map( ( category ) => category.label );\n\t}\n\n\treturn categories.user\n\t\t?.filter( ( category ) =>\n\t\t\tpattern.wp_pattern_category.includes( category.id )\n\t\t)\n\t\t.map( ( category ) => category.label );\n}\n\nexport function useDuplicatePatternProps( { pattern, onSuccess } ) {\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst categories = useSelect( ( select ) => {\n\t\tconst { getUserPatternCategories, getBlockPatternCategories } =\n\t\t\tselect( coreStore );\n\n\t\treturn {\n\t\t\tcore: getBlockPatternCategories(),\n\t\t\tuser: getUserPatternCategories(),\n\t\t};\n\t} );\n\tif ( ! pattern ) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tcontent: pattern.content,\n\t\tdefaultCategories: getTermLabels( pattern, categories ),\n\t\tdefaultSyncType:\n\t\t\tpattern.type !== PATTERN_TYPES.user // Theme patterns are unsynced by default.\n\t\t\t\t? PATTERN_SYNC_TYPES.unsynced\n\t\t\t\t: pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full,\n\t\tdefaultTitle: sprintf(\n\t\t\t/* translators: %s: Existing pattern title */\n\t\t\t__( '%s (Copy)' ),\n\t\t\ttypeof pattern.title === 'string'\n\t\t\t\t? pattern.title\n\t\t\t\t: pattern.title.raw\n\t\t),\n\t\tonSuccess: ( { pattern: newPattern } ) => {\n\t\t\tcreateSuccessNotice(\n\t\t\t\tsprintf(\n\t\t\t\t\t// translators: %s: The new pattern's title e.g. 'Call to action (copy)'.\n\t\t\t\t\t__( '\"%s\" duplicated.' ),\n\t\t\t\t\tnewPattern.title.raw\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\tid: 'patterns-create',\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tonSuccess?.( { pattern: newPattern } );\n\t\t},\n\t};\n}\n\nexport default function DuplicatePatternModal( {\n\tpattern,\n\tonClose,\n\tonSuccess,\n} ) {\n\tconst duplicatedProps = useDuplicatePatternProps( { pattern, onSuccess } );\n\tif ( ! pattern ) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<CreatePatternModal\n\t\t\tmodalTitle={ __( 'Duplicate pattern' ) }\n\t\t\tconfirmLabel={ __( 'Duplicate' ) }\n\t\t\tonClose={ onClose }\n\t\t\tonError={ onClose }\n\t\t\t{ ...duplicatedProps }\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -21,47 +21,58 @@ function PartialSyncingControls({
|
|
|
21
21
|
setAttributes
|
|
22
22
|
}) {
|
|
23
23
|
const syncedAttributes = PARTIAL_SYNCING_SUPPORTED_BLOCKS[name];
|
|
24
|
-
|
|
24
|
+
const attributeSources = Object.keys(syncedAttributes).map(attributeName => attributes.metadata?.bindings?.[attributeName]?.source?.name);
|
|
25
|
+
const isConnectedToOtherSources = attributeSources.every(source => source && source !== 'pattern_attributes');
|
|
26
|
+
|
|
27
|
+
// Render nothing if all supported attributes are connected to other sources.
|
|
28
|
+
if (isConnectedToOtherSources) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function updateBindings(isChecked) {
|
|
32
|
+
let updatedBindings = {
|
|
33
|
+
...attributes?.metadata?.bindings
|
|
34
|
+
};
|
|
25
35
|
if (!isChecked) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
...attributes.connections?.attributes,
|
|
30
|
-
[attributeName]: undefined
|
|
36
|
+
for (const attributeName of Object.keys(syncedAttributes)) {
|
|
37
|
+
if (updatedBindings[attributeName]?.source?.name === 'pattern_attributes') {
|
|
38
|
+
delete updatedBindings[attributeName];
|
|
31
39
|
}
|
|
32
|
-
};
|
|
33
|
-
if (Object.keys(updatedConnections.attributes).length === 1) {
|
|
34
|
-
updatedConnections.attributes = undefined;
|
|
35
40
|
}
|
|
36
|
-
if (Object.keys(
|
|
37
|
-
|
|
41
|
+
if (!Object.keys(updatedBindings).length) {
|
|
42
|
+
updatedBindings = undefined;
|
|
38
43
|
}
|
|
39
44
|
setAttributes({
|
|
40
|
-
|
|
45
|
+
metadata: {
|
|
46
|
+
...attributes.metadata,
|
|
47
|
+
bindings: updatedBindings
|
|
48
|
+
}
|
|
41
49
|
});
|
|
42
50
|
return;
|
|
43
51
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
52
|
+
for (const attributeName of Object.keys(syncedAttributes)) {
|
|
53
|
+
if (!updatedBindings[attributeName]) {
|
|
54
|
+
updatedBindings[attributeName] = {
|
|
55
|
+
source: {
|
|
56
|
+
name: 'pattern_attributes'
|
|
57
|
+
}
|
|
58
|
+
};
|
|
51
59
|
}
|
|
52
|
-
}
|
|
60
|
+
}
|
|
53
61
|
if (typeof attributes.metadata?.id === 'string') {
|
|
54
62
|
setAttributes({
|
|
55
|
-
|
|
63
|
+
metadata: {
|
|
64
|
+
...attributes.metadata,
|
|
65
|
+
bindings: updatedBindings
|
|
66
|
+
}
|
|
56
67
|
});
|
|
57
68
|
return;
|
|
58
69
|
}
|
|
59
70
|
const id = nanoid(6);
|
|
60
71
|
setAttributes({
|
|
61
|
-
connections: updatedConnections,
|
|
62
72
|
metadata: {
|
|
63
73
|
...attributes.metadata,
|
|
64
|
-
id
|
|
74
|
+
id,
|
|
75
|
+
bindings: updatedBindings
|
|
65
76
|
}
|
|
66
77
|
});
|
|
67
78
|
}
|
|
@@ -69,15 +80,14 @@ function PartialSyncingControls({
|
|
|
69
80
|
group: "advanced"
|
|
70
81
|
}, createElement(BaseControl, {
|
|
71
82
|
__nextHasNoMarginBottom: true
|
|
72
|
-
}, createElement(BaseControl.VisualLabel, null, __('
|
|
73
|
-
key: attributeName,
|
|
83
|
+
}, createElement(BaseControl.VisualLabel, null, __('Pattern overrides')), createElement(CheckboxControl, {
|
|
74
84
|
__nextHasNoMarginBottom: true,
|
|
75
|
-
label:
|
|
76
|
-
checked:
|
|
85
|
+
label: __('Allow instance overrides'),
|
|
86
|
+
checked: attributeSources.some(source => source === 'pattern_attributes'),
|
|
77
87
|
onChange: isChecked => {
|
|
78
|
-
|
|
88
|
+
updateBindings(isChecked);
|
|
79
89
|
}
|
|
80
|
-
})))
|
|
90
|
+
})));
|
|
81
91
|
}
|
|
82
92
|
export default PartialSyncingControls;
|
|
83
93
|
//# sourceMappingURL=partial-syncing-controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["nanoid","InspectorControls","BaseControl","CheckboxControl","__","PARTIAL_SYNCING_SUPPORTED_BLOCKS","PartialSyncingControls","name","attributes","setAttributes","syncedAttributes","
|
|
1
|
+
{"version":3,"names":["nanoid","InspectorControls","BaseControl","CheckboxControl","__","PARTIAL_SYNCING_SUPPORTED_BLOCKS","PartialSyncingControls","name","attributes","setAttributes","syncedAttributes","attributeSources","Object","keys","map","attributeName","metadata","bindings","source","isConnectedToOtherSources","every","updateBindings","isChecked","updatedBindings","length","undefined","id","createElement","group","__nextHasNoMarginBottom","VisualLabel","label","checked","some","onChange"],"sources":["@wordpress/patterns/src/components/partial-syncing-controls.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport { nanoid } from 'nanoid';\n\n/**\n * WordPress dependencies\n */\nimport { InspectorControls } from '@wordpress/block-editor';\nimport { BaseControl, CheckboxControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { PARTIAL_SYNCING_SUPPORTED_BLOCKS } from '../constants';\n\nfunction PartialSyncingControls( { name, attributes, setAttributes } ) {\n\tconst syncedAttributes = PARTIAL_SYNCING_SUPPORTED_BLOCKS[ name ];\n\tconst attributeSources = Object.keys( syncedAttributes ).map(\n\t\t( attributeName ) =>\n\t\t\tattributes.metadata?.bindings?.[ attributeName ]?.source?.name\n\t);\n\tconst isConnectedToOtherSources = attributeSources.every(\n\t\t( source ) => source && source !== 'pattern_attributes'\n\t);\n\n\t// Render nothing if all supported attributes are connected to other sources.\n\tif ( isConnectedToOtherSources ) {\n\t\treturn null;\n\t}\n\n\tfunction updateBindings( isChecked ) {\n\t\tlet updatedBindings = {\n\t\t\t...attributes?.metadata?.bindings,\n\t\t};\n\n\t\tif ( ! isChecked ) {\n\t\t\tfor ( const attributeName of Object.keys( syncedAttributes ) ) {\n\t\t\t\tif (\n\t\t\t\t\tupdatedBindings[ attributeName ]?.source?.name ===\n\t\t\t\t\t'pattern_attributes'\n\t\t\t\t) {\n\t\t\t\t\tdelete updatedBindings[ attributeName ];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( ! Object.keys( updatedBindings ).length ) {\n\t\t\t\tupdatedBindings = undefined;\n\t\t\t}\n\t\t\tsetAttributes( {\n\t\t\t\tmetadata: {\n\t\t\t\t\t...attributes.metadata,\n\t\t\t\t\tbindings: updatedBindings,\n\t\t\t\t},\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const attributeName of Object.keys( syncedAttributes ) ) {\n\t\t\tif ( ! updatedBindings[ attributeName ] ) {\n\t\t\t\tupdatedBindings[ attributeName ] = {\n\t\t\t\t\tsource: {\n\t\t\t\t\t\tname: 'pattern_attributes',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( typeof attributes.metadata?.id === 'string' ) {\n\t\t\tsetAttributes( {\n\t\t\t\tmetadata: {\n\t\t\t\t\t...attributes.metadata,\n\t\t\t\t\tbindings: updatedBindings,\n\t\t\t\t},\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tconst id = nanoid( 6 );\n\t\tsetAttributes( {\n\t\t\tmetadata: {\n\t\t\t\t...attributes.metadata,\n\t\t\t\tid,\n\t\t\t\tbindings: updatedBindings,\n\t\t\t},\n\t\t} );\n\t}\n\n\treturn (\n\t\t<InspectorControls group=\"advanced\">\n\t\t\t<BaseControl __nextHasNoMarginBottom>\n\t\t\t\t<BaseControl.VisualLabel>\n\t\t\t\t\t{ __( 'Pattern overrides' ) }\n\t\t\t\t</BaseControl.VisualLabel>\n\t\t\t\t<CheckboxControl\n\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\tlabel={ __( 'Allow instance overrides' ) }\n\t\t\t\t\tchecked={ attributeSources.some(\n\t\t\t\t\t\t( source ) => source === 'pattern_attributes'\n\t\t\t\t\t) }\n\t\t\t\t\tonChange={ ( isChecked ) => {\n\t\t\t\t\t\tupdateBindings( isChecked );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</BaseControl>\n\t\t</InspectorControls>\n\t);\n}\n\nexport default PartialSyncingControls;\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Internal dependencies
|
|
3
3
|
*/
|
|
4
4
|
import { lock } from './lock-unlock';
|
|
5
|
-
import CreatePatternModal from './components/create-pattern-modal';
|
|
6
|
-
import DuplicatePatternModal from './components/duplicate-pattern-modal';
|
|
5
|
+
import { default as CreatePatternModal, CreatePatternModalContents } from './components/create-pattern-modal';
|
|
6
|
+
import { default as DuplicatePatternModal, useDuplicatePatternProps } from './components/duplicate-pattern-modal';
|
|
7
7
|
import RenamePatternModal from './components/rename-pattern-modal';
|
|
8
8
|
import PatternsMenuItems from './components';
|
|
9
9
|
import RenamePatternCategoryModal from './components/rename-pattern-category-modal';
|
|
@@ -12,7 +12,9 @@ import { PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY, PATTERN_USER_CATEGORY, EXCLUDE
|
|
|
12
12
|
export const privateApis = {};
|
|
13
13
|
lock(privateApis, {
|
|
14
14
|
CreatePatternModal,
|
|
15
|
+
CreatePatternModalContents,
|
|
15
16
|
DuplicatePatternModal,
|
|
17
|
+
useDuplicatePatternProps,
|
|
16
18
|
RenamePatternModal,
|
|
17
19
|
PatternsMenuItems,
|
|
18
20
|
RenamePatternCategoryModal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["lock","CreatePatternModal","DuplicatePatternModal","RenamePatternModal","PatternsMenuItems","RenamePatternCategoryModal","PartialSyncingControls","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","EXCLUDED_PATTERN_SOURCES","PATTERN_SYNC_TYPES","PARTIAL_SYNCING_SUPPORTED_BLOCKS","privateApis"],"sources":["@wordpress/patterns/src/private-apis.js"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { lock } from './lock-unlock';\nimport CreatePatternModal from './components/create-pattern-modal';\nimport DuplicatePatternModal from './components/duplicate-pattern-modal';\nimport RenamePatternModal from './components/rename-pattern-modal';\nimport PatternsMenuItems from './components';\nimport RenamePatternCategoryModal from './components/rename-pattern-category-modal';\nimport PartialSyncingControls from './components/partial-syncing-controls';\nimport {\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tEXCLUDED_PATTERN_SOURCES,\n\tPATTERN_SYNC_TYPES,\n\tPARTIAL_SYNCING_SUPPORTED_BLOCKS,\n} from './constants';\n\nexport const privateApis = {};\nlock( privateApis, {\n\tCreatePatternModal,\n\tDuplicatePatternModal,\n\tRenamePatternModal,\n\tPatternsMenuItems,\n\tRenamePatternCategoryModal,\n\tPartialSyncingControls,\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tEXCLUDED_PATTERN_SOURCES,\n\tPATTERN_SYNC_TYPES,\n\tPARTIAL_SYNCING_SUPPORTED_BLOCKS,\n} );\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,IAAI,QAAQ,eAAe;AACpC,
|
|
1
|
+
{"version":3,"names":["lock","default","CreatePatternModal","CreatePatternModalContents","DuplicatePatternModal","useDuplicatePatternProps","RenamePatternModal","PatternsMenuItems","RenamePatternCategoryModal","PartialSyncingControls","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","EXCLUDED_PATTERN_SOURCES","PATTERN_SYNC_TYPES","PARTIAL_SYNCING_SUPPORTED_BLOCKS","privateApis"],"sources":["@wordpress/patterns/src/private-apis.js"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { lock } from './lock-unlock';\nimport {\n\tdefault as CreatePatternModal,\n\tCreatePatternModalContents,\n} from './components/create-pattern-modal';\nimport {\n\tdefault as DuplicatePatternModal,\n\tuseDuplicatePatternProps,\n} from './components/duplicate-pattern-modal';\nimport RenamePatternModal from './components/rename-pattern-modal';\nimport PatternsMenuItems from './components';\nimport RenamePatternCategoryModal from './components/rename-pattern-category-modal';\nimport PartialSyncingControls from './components/partial-syncing-controls';\nimport {\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tEXCLUDED_PATTERN_SOURCES,\n\tPATTERN_SYNC_TYPES,\n\tPARTIAL_SYNCING_SUPPORTED_BLOCKS,\n} from './constants';\n\nexport const privateApis = {};\nlock( privateApis, {\n\tCreatePatternModal,\n\tCreatePatternModalContents,\n\tDuplicatePatternModal,\n\tuseDuplicatePatternProps,\n\tRenamePatternModal,\n\tPatternsMenuItems,\n\tRenamePatternCategoryModal,\n\tPartialSyncingControls,\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tEXCLUDED_PATTERN_SOURCES,\n\tPATTERN_SYNC_TYPES,\n\tPARTIAL_SYNCING_SUPPORTED_BLOCKS,\n} );\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,IAAI,QAAQ,eAAe;AACpC,SACCC,OAAO,IAAIC,kBAAkB,EAC7BC,0BAA0B,QACpB,mCAAmC;AAC1C,SACCF,OAAO,IAAIG,qBAAqB,EAChCC,wBAAwB,QAClB,sCAAsC;AAC7C,OAAOC,kBAAkB,MAAM,mCAAmC;AAClE,OAAOC,iBAAiB,MAAM,cAAc;AAC5C,OAAOC,0BAA0B,MAAM,4CAA4C;AACnF,OAAOC,sBAAsB,MAAM,uCAAuC;AAC1E,SACCC,aAAa,EACbC,wBAAwB,EACxBC,qBAAqB,EACrBC,wBAAwB,EACxBC,kBAAkB,EAClBC,gCAAgC,QAC1B,aAAa;AAEpB,OAAO,MAAMC,WAAW,GAAG,CAAC,CAAC;AAC7BhB,IAAI,CAAEgB,WAAW,EAAE;EAClBd,kBAAkB;EAClBC,0BAA0B;EAC1BC,qBAAqB;EACrBC,wBAAwB;EACxBC,kBAAkB;EAClBC,iBAAiB;EACjBC,0BAA0B;EAC1BC,sBAAsB;EACtBC,aAAa;EACbC,wBAAwB;EACxBC,qBAAqB;EACrBC,wBAAwB;EACxBC,kBAAkB;EAClBC;AACD,CAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/patterns",
|
|
3
|
-
"version": "1.9.0",
|
|
3
|
+
"version": "1.9.1-next.79a6196f.0",
|
|
4
4
|
"description": "Management of user pattern editing.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -31,20 +31,20 @@
|
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@babel/runtime": "^7.16.0",
|
|
34
|
-
"@wordpress/a11y": "^3.48.0",
|
|
35
|
-
"@wordpress/block-editor": "^12.16.0",
|
|
36
|
-
"@wordpress/blocks": "^12.25.0",
|
|
37
|
-
"@wordpress/components": "^25.
|
|
38
|
-
"@wordpress/compose": "^6.25.0",
|
|
39
|
-
"@wordpress/core-data": "^6.25.0",
|
|
40
|
-
"@wordpress/data": "^9.18.0",
|
|
41
|
-
"@wordpress/element": "^5.25.0",
|
|
42
|
-
"@wordpress/html-entities": "^3.48.0",
|
|
43
|
-
"@wordpress/i18n": "^4.48.0",
|
|
44
|
-
"@wordpress/icons": "^9.39.0",
|
|
45
|
-
"@wordpress/notices": "^4.16.0",
|
|
46
|
-
"@wordpress/private-apis": "^0.30.0",
|
|
47
|
-
"@wordpress/url": "^3.49.0",
|
|
34
|
+
"@wordpress/a11y": "^3.48.1-next.79a6196f.0",
|
|
35
|
+
"@wordpress/block-editor": "^12.16.1-next.79a6196f.0",
|
|
36
|
+
"@wordpress/blocks": "^12.25.1-next.79a6196f.0",
|
|
37
|
+
"@wordpress/components": "^25.15.1-next.79a6196f.0",
|
|
38
|
+
"@wordpress/compose": "^6.25.1-next.79a6196f.0",
|
|
39
|
+
"@wordpress/core-data": "^6.25.1-next.79a6196f.0",
|
|
40
|
+
"@wordpress/data": "^9.18.1-next.79a6196f.0",
|
|
41
|
+
"@wordpress/element": "^5.25.1-next.79a6196f.0",
|
|
42
|
+
"@wordpress/html-entities": "^3.48.1-next.79a6196f.0",
|
|
43
|
+
"@wordpress/i18n": "^4.48.1-next.79a6196f.0",
|
|
44
|
+
"@wordpress/icons": "^9.39.1-next.79a6196f.0",
|
|
45
|
+
"@wordpress/notices": "^4.16.1-next.79a6196f.0",
|
|
46
|
+
"@wordpress/private-apis": "^0.30.1-next.79a6196f.0",
|
|
47
|
+
"@wordpress/url": "^3.49.1-next.79a6196f.0",
|
|
48
48
|
"nanoid": "^3.3.4"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"publishConfig": {
|
|
55
55
|
"access": "public"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "1e74b942ac0119a22ceaaf5c9594263f3ec516ab"
|
|
58
58
|
}
|
|
@@ -28,11 +28,25 @@ import CategorySelector, { CATEGORY_SLUG } from './category-selector';
|
|
|
28
28
|
import { unlock } from '../lock-unlock';
|
|
29
29
|
|
|
30
30
|
export default function CreatePatternModal( {
|
|
31
|
+
className = 'patterns-menu-items__convert-modal',
|
|
32
|
+
modalTitle = __( 'Create pattern' ),
|
|
33
|
+
...restProps
|
|
34
|
+
} ) {
|
|
35
|
+
return (
|
|
36
|
+
<Modal
|
|
37
|
+
title={ modalTitle }
|
|
38
|
+
onRequestClose={ restProps.onClose }
|
|
39
|
+
overlayClassName={ className }
|
|
40
|
+
>
|
|
41
|
+
<CreatePatternModalContents { ...restProps } />
|
|
42
|
+
</Modal>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function CreatePatternModalContents( {
|
|
31
47
|
confirmLabel = __( 'Create' ),
|
|
32
48
|
defaultCategories = [],
|
|
33
|
-
className = 'patterns-menu-items__convert-modal',
|
|
34
49
|
content,
|
|
35
|
-
modalTitle = __( 'Create pattern' ),
|
|
36
50
|
onClose,
|
|
37
51
|
onError,
|
|
38
52
|
onSuccess,
|
|
@@ -63,24 +77,27 @@ export default function CreatePatternModal( {
|
|
|
63
77
|
const categoryMap = useMemo( () => {
|
|
64
78
|
// Merge the user and core pattern categories and remove any duplicates.
|
|
65
79
|
const uniqueCategories = new Map();
|
|
66
|
-
|
|
67
|
-
( category
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
userPatternCategories.forEach( ( category ) => {
|
|
81
|
+
uniqueCategories.set( category.label.toLowerCase(), {
|
|
82
|
+
label: category.label,
|
|
83
|
+
name: category.name,
|
|
84
|
+
id: category.id,
|
|
85
|
+
} );
|
|
86
|
+
} );
|
|
87
|
+
|
|
88
|
+
corePatternCategories.forEach( ( category ) => {
|
|
89
|
+
if (
|
|
90
|
+
! uniqueCategories.has( category.label.toLowerCase() ) &&
|
|
91
|
+
// There are two core categories with `Post` label so explicitly remove the one with
|
|
92
|
+
// the `query` slug to avoid any confusion.
|
|
93
|
+
category.name !== 'query'
|
|
94
|
+
) {
|
|
95
|
+
uniqueCategories.set( category.label.toLowerCase(), {
|
|
96
|
+
label: category.label,
|
|
97
|
+
name: category.name,
|
|
98
|
+
} );
|
|
82
99
|
}
|
|
83
|
-
);
|
|
100
|
+
} );
|
|
84
101
|
return uniqueCategories;
|
|
85
102
|
}, [ userPatternCategories, corePatternCategories ] );
|
|
86
103
|
|
|
@@ -126,9 +143,13 @@ export default function CreatePatternModal( {
|
|
|
126
143
|
*/
|
|
127
144
|
async function findOrCreateTerm( term ) {
|
|
128
145
|
try {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
146
|
+
const existingTerm = categoryMap.get( term.toLowerCase() );
|
|
147
|
+
if ( existingTerm && existingTerm.id ) {
|
|
148
|
+
return existingTerm.id;
|
|
149
|
+
}
|
|
150
|
+
// If we have an existing core category we need to match the new user category to the
|
|
151
|
+
// correct slug rather than autogenerating it to prevent duplicates, eg. the core `Headers`
|
|
152
|
+
// category uses the singular `header` as the slug.
|
|
132
153
|
const termData = existingTerm
|
|
133
154
|
? { name: existingTerm.label, slug: existingTerm.name }
|
|
134
155
|
: { name: term };
|
|
@@ -148,78 +169,68 @@ export default function CreatePatternModal( {
|
|
|
148
169
|
return error.data.term_id;
|
|
149
170
|
}
|
|
150
171
|
}
|
|
151
|
-
|
|
152
172
|
return (
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
setTitle( '' );
|
|
173
|
+
<form
|
|
174
|
+
onSubmit={ ( event ) => {
|
|
175
|
+
event.preventDefault();
|
|
176
|
+
onCreate( title, syncType );
|
|
158
177
|
} }
|
|
159
|
-
overlayClassName={ className }
|
|
160
178
|
>
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
<VStack spacing="5">
|
|
180
|
+
<TextControl
|
|
181
|
+
label={ __( 'Name' ) }
|
|
182
|
+
value={ title }
|
|
183
|
+
onChange={ setTitle }
|
|
184
|
+
placeholder={ __( 'My pattern' ) }
|
|
185
|
+
className="patterns-create-modal__name-input"
|
|
186
|
+
__nextHasNoMarginBottom
|
|
187
|
+
__next40pxDefaultSize
|
|
188
|
+
/>
|
|
189
|
+
<CategorySelector
|
|
190
|
+
categoryTerms={ categoryTerms }
|
|
191
|
+
onChange={ setCategoryTerms }
|
|
192
|
+
categoryMap={ categoryMap }
|
|
193
|
+
/>
|
|
194
|
+
<ToggleControl
|
|
195
|
+
label={ _x(
|
|
196
|
+
'Synced',
|
|
197
|
+
'Option that makes an individual pattern synchronized'
|
|
198
|
+
) }
|
|
199
|
+
help={ __(
|
|
200
|
+
'Sync this pattern across multiple locations.'
|
|
201
|
+
) }
|
|
202
|
+
checked={ syncType === PATTERN_SYNC_TYPES.full }
|
|
203
|
+
onChange={ () => {
|
|
204
|
+
setSyncType(
|
|
205
|
+
syncType === PATTERN_SYNC_TYPES.full
|
|
206
|
+
? PATTERN_SYNC_TYPES.unsynced
|
|
207
|
+
: PATTERN_SYNC_TYPES.full
|
|
208
|
+
);
|
|
209
|
+
} }
|
|
210
|
+
/>
|
|
211
|
+
<HStack justify="right">
|
|
212
|
+
<Button
|
|
175
213
|
__next40pxDefaultSize
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
categoryMap={ categoryMap }
|
|
181
|
-
/>
|
|
182
|
-
<ToggleControl
|
|
183
|
-
label={ _x(
|
|
184
|
-
'Synced',
|
|
185
|
-
'Option that makes an individual pattern synchronized'
|
|
186
|
-
) }
|
|
187
|
-
help={ __(
|
|
188
|
-
'Sync this pattern across multiple locations.'
|
|
189
|
-
) }
|
|
190
|
-
checked={ syncType === PATTERN_SYNC_TYPES.full }
|
|
191
|
-
onChange={ () => {
|
|
192
|
-
setSyncType(
|
|
193
|
-
syncType === PATTERN_SYNC_TYPES.full
|
|
194
|
-
? PATTERN_SYNC_TYPES.unsynced
|
|
195
|
-
: PATTERN_SYNC_TYPES.full
|
|
196
|
-
);
|
|
214
|
+
variant="tertiary"
|
|
215
|
+
onClick={ () => {
|
|
216
|
+
onClose();
|
|
217
|
+
setTitle( '' );
|
|
197
218
|
} }
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
__next40pxDefaultSize
|
|
202
|
-
variant="tertiary"
|
|
203
|
-
onClick={ () => {
|
|
204
|
-
onClose();
|
|
205
|
-
setTitle( '' );
|
|
206
|
-
} }
|
|
207
|
-
>
|
|
208
|
-
{ __( 'Cancel' ) }
|
|
209
|
-
</Button>
|
|
219
|
+
>
|
|
220
|
+
{ __( 'Cancel' ) }
|
|
221
|
+
</Button>
|
|
210
222
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
</Modal>
|
|
223
|
+
<Button
|
|
224
|
+
__next40pxDefaultSize
|
|
225
|
+
variant="primary"
|
|
226
|
+
type="submit"
|
|
227
|
+
aria-disabled={ ! title || isSaving }
|
|
228
|
+
isBusy={ isSaving }
|
|
229
|
+
>
|
|
230
|
+
{ confirmLabel }
|
|
231
|
+
</Button>
|
|
232
|
+
</HStack>
|
|
233
|
+
</VStack>
|
|
234
|
+
</form>
|
|
224
235
|
);
|
|
225
236
|
}
|