@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.
@@ -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 default function DuplicatePatternModal({
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
- const duplicatedProps = {
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","DuplicatePatternModal","onClose","onSuccess","createSuccessNotice","select","getUserPatternCategories","getBlockPatternCategories","duplicatedProps","content","defaultCategories","defaultSyncType","unsynced","wp_pattern_sync_status","full","defaultTitle","title","raw","handleOnSuccess","newPattern","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 default function DuplicatePatternModal( {\n\tpattern,\n\tonClose,\n\tonSuccess,\n} ) {\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\n\tif ( ! pattern ) {\n\t\treturn null;\n\t}\n\n\tconst duplicatedProps = {\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};\n\n\tfunction handleOnSuccess( { pattern: newPattern } ) {\n\t\tcreateSuccessNotice(\n\t\t\tsprintf(\n\t\t\t\t// translators: %s: The new pattern's title e.g. 'Call to action (copy)'.\n\t\t\t\t__( '\"%s\" duplicated.' ),\n\t\t\t\tnewPattern.title.raw\n\t\t\t),\n\t\t\t{\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'patterns-create',\n\t\t\t}\n\t\t);\n\n\t\tonSuccess?.( { pattern: newPattern } );\n\t}\n\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\tonSuccess={ handleOnSuccess }\n\t\t\t{ ...duplicatedProps }\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
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
- function updateConnections(attributeName, isChecked) {
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
- let updatedConnections = {
27
- ...attributes.connections,
28
- attributes: {
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(updatedConnections).length === 1 && updateConnections.attributes === undefined) {
37
- updatedConnections = undefined;
41
+ if (!Object.keys(updatedBindings).length) {
42
+ updatedBindings = undefined;
38
43
  }
39
44
  setAttributes({
40
- connections: updatedConnections
45
+ metadata: {
46
+ ...attributes.metadata,
47
+ bindings: updatedBindings
48
+ }
41
49
  });
42
50
  return;
43
51
  }
44
- const updatedConnections = {
45
- ...attributes.connections,
46
- attributes: {
47
- ...attributes.connections?.attributes,
48
- [attributeName]: {
49
- source: 'pattern_attributes'
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
- connections: updatedConnections
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, __('Synced attributes')), Object.entries(syncedAttributes).map(([attributeName, label]) => createElement(CheckboxControl, {
73
- key: attributeName,
83
+ }, createElement(BaseControl.VisualLabel, null, __('Pattern overrides')), createElement(CheckboxControl, {
74
84
  __nextHasNoMarginBottom: true,
75
- label: label,
76
- checked: attributes.connections?.attributes?.[attributeName]?.source === 'pattern_attributes',
85
+ label: __('Allow instance overrides'),
86
+ checked: attributeSources.some(source => source === 'pattern_attributes'),
77
87
  onChange: isChecked => {
78
- updateConnections(attributeName, isChecked);
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","updateConnections","attributeName","isChecked","updatedConnections","connections","undefined","Object","keys","length","source","metadata","id","createElement","group","__nextHasNoMarginBottom","VisualLabel","entries","map","label","key","checked","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\n\tfunction updateConnections( attributeName, isChecked ) {\n\t\tif ( ! isChecked ) {\n\t\t\tlet updatedConnections = {\n\t\t\t\t...attributes.connections,\n\t\t\t\tattributes: {\n\t\t\t\t\t...attributes.connections?.attributes,\n\t\t\t\t\t[ attributeName ]: undefined,\n\t\t\t\t},\n\t\t\t};\n\t\t\tif ( Object.keys( updatedConnections.attributes ).length === 1 ) {\n\t\t\t\tupdatedConnections.attributes = undefined;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.keys( updatedConnections ).length === 1 &&\n\t\t\t\tupdateConnections.attributes === undefined\n\t\t\t) {\n\t\t\t\tupdatedConnections = undefined;\n\t\t\t}\n\t\t\tsetAttributes( {\n\t\t\t\tconnections: updatedConnections,\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\tconst updatedConnections = {\n\t\t\t...attributes.connections,\n\t\t\tattributes: {\n\t\t\t\t...attributes.connections?.attributes,\n\t\t\t\t[ attributeName ]: {\n\t\t\t\t\tsource: 'pattern_attributes',\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( { connections: updatedConnections } );\n\t\t\treturn;\n\t\t}\n\n\t\tconst id = nanoid( 6 );\n\t\tsetAttributes( {\n\t\t\tconnections: updatedConnections,\n\t\t\tmetadata: {\n\t\t\t\t...attributes.metadata,\n\t\t\t\tid,\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{ __( 'Synced attributes' ) }\n\t\t\t\t</BaseControl.VisualLabel>\n\t\t\t\t{ Object.entries( syncedAttributes ).map(\n\t\t\t\t\t( [ attributeName, label ] ) => (\n\t\t\t\t\t\t<CheckboxControl\n\t\t\t\t\t\t\tkey={ attributeName }\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\tattributes.connections?.attributes?.[\n\t\t\t\t\t\t\t\t\tattributeName\n\t\t\t\t\t\t\t\t]?.source === 'pattern_attributes'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={ ( isChecked ) => {\n\t\t\t\t\t\t\t\tupdateConnections( attributeName, isChecked );\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) }\n\t\t\t</BaseControl>\n\t\t</InspectorControls>\n\t);\n}\n\nexport default PartialSyncingControls;\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,MAAM,QAAQ,QAAQ;;AAE/B;AACA;AACA;AACA,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,WAAW,EAAEC,eAAe,QAAQ,uBAAuB;AACpE,SAASC,EAAE,QAAQ,iBAAiB;;AAEpC;AACA;AACA;AACA,SAASC,gCAAgC,QAAQ,cAAc;AAE/D,SAASC,sBAAsBA,CAAE;EAAEC,IAAI;EAAEC,UAAU;EAAEC;AAAc,CAAC,EAAG;EACtE,MAAMC,gBAAgB,GAAGL,gCAAgC,CAAEE,IAAI,CAAE;EAEjE,SAASI,iBAAiBA,CAAEC,aAAa,EAAEC,SAAS,EAAG;IACtD,IAAK,CAAEA,SAAS,EAAG;MAClB,IAAIC,kBAAkB,GAAG;QACxB,GAAGN,UAAU,CAACO,WAAW;QACzBP,UAAU,EAAE;UACX,GAAGA,UAAU,CAACO,WAAW,EAAEP,UAAU;UACrC,CAAEI,aAAa,GAAII;QACpB;MACD,CAAC;MACD,IAAKC,MAAM,CAACC,IAAI,CAAEJ,kBAAkB,CAACN,UAAW,CAAC,CAACW,MAAM,KAAK,CAAC,EAAG;QAChEL,kBAAkB,CAACN,UAAU,GAAGQ,SAAS;MAC1C;MACA,IACCC,MAAM,CAACC,IAAI,CAAEJ,kBAAmB,CAAC,CAACK,MAAM,KAAK,CAAC,IAC9CR,iBAAiB,CAACH,UAAU,KAAKQ,SAAS,EACzC;QACDF,kBAAkB,GAAGE,SAAS;MAC/B;MACAP,aAAa,CAAE;QACdM,WAAW,EAAED;MACd,CAAE,CAAC;MACH;IACD;IAEA,MAAMA,kBAAkB,GAAG;MAC1B,GAAGN,UAAU,CAACO,WAAW;MACzBP,UAAU,EAAE;QACX,GAAGA,UAAU,CAACO,WAAW,EAAEP,UAAU;QACrC,CAAEI,aAAa,GAAI;UAClBQ,MAAM,EAAE;QACT;MACD;IACD,CAAC;IAED,IAAK,OAAOZ,UAAU,CAACa,QAAQ,EAAEC,EAAE,KAAK,QAAQ,EAAG;MAClDb,aAAa,CAAE;QAAEM,WAAW,EAAED;MAAmB,CAAE,CAAC;MACpD;IACD;IAEA,MAAMQ,EAAE,GAAGtB,MAAM,CAAE,CAAE,CAAC;IACtBS,aAAa,CAAE;MACdM,WAAW,EAAED,kBAAkB;MAC/BO,QAAQ,EAAE;QACT,GAAGb,UAAU,CAACa,QAAQ;QACtBC;MACD;IACD,CAAE,CAAC;EACJ;EAEA,OACCC,aAAA,CAACtB,iBAAiB;IAACuB,KAAK,EAAC;EAAU,GAClCD,aAAA,CAACrB,WAAW;IAACuB,uBAAuB;EAAA,GACnCF,aAAA,CAACrB,WAAW,CAACwB,WAAW,QACrBtB,EAAE,CAAE,mBAAoB,CACF,CAAC,EACxBa,MAAM,CAACU,OAAO,CAAEjB,gBAAiB,CAAC,CAACkB,GAAG,CACvC,CAAE,CAAEhB,aAAa,EAAEiB,KAAK,CAAE,KACzBN,aAAA,CAACpB,eAAe;IACf2B,GAAG,EAAGlB,aAAe;IACrBa,uBAAuB;IACvBI,KAAK,EAAGA,KAAO;IACfE,OAAO,EACNvB,UAAU,CAACO,WAAW,EAAEP,UAAU,GACjCI,aAAa,CACb,EAAEQ,MAAM,KAAK,oBACd;IACDY,QAAQ,EAAKnB,SAAS,IAAM;MAC3BF,iBAAiB,CAAEC,aAAa,EAAEC,SAAU,CAAC;IAC9C;EAAG,CACH,CAEH,CACY,CACK,CAAC;AAEtB;AAEA,eAAeP,sBAAsB"}
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,OAAOC,kBAAkB,MAAM,mCAAmC;AAClE,OAAOC,qBAAqB,MAAM,sCAAsC;AACxE,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;AAC7Bb,IAAI,CAAEa,WAAW,EAAE;EAClBZ,kBAAkB;EAClBC,qBAAqB;EACrBC,kBAAkB;EAClBC,iBAAiB;EACjBC,0BAA0B;EAC1BC,sBAAsB;EACtBC,aAAa;EACbC,wBAAwB;EACxBC,qBAAqB;EACrBC,wBAAwB;EACxBC,kBAAkB;EAClBC;AACD,CAAE,CAAC"}
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.14.0",
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": "fcf61b4beff747222c2c81d09d757ca1a0abd925"
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
- [ ...userPatternCategories, ...corePatternCategories ].forEach(
67
- ( category ) => {
68
- if (
69
- ! uniqueCategories.has( category.label ) &&
70
- // There are two core categories with `Post` label so explicitly remove the one with
71
- // the `query` slug to avoid any confusion.
72
- category.name !== 'query'
73
- ) {
74
- // We need to store the name separately as this is used as the slug in the
75
- // taxonomy and may vary from the label.
76
- uniqueCategories.set( category.label, {
77
- label: category.label,
78
- value: category.label,
79
- name: category.name,
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
- // We need to match any existing term to the correct slug to prevent duplicates, eg.
130
- // the core `Headers` category uses the singular `header` as the slug.
131
- const existingTerm = categoryMap.get( term );
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
- <Modal
154
- title={ modalTitle }
155
- onRequestClose={ () => {
156
- onClose();
157
- setTitle( '' );
173
+ <form
174
+ onSubmit={ ( event ) => {
175
+ event.preventDefault();
176
+ onCreate( title, syncType );
158
177
  } }
159
- overlayClassName={ className }
160
178
  >
161
- <form
162
- onSubmit={ ( event ) => {
163
- event.preventDefault();
164
- onCreate( title, syncType );
165
- } }
166
- >
167
- <VStack spacing="5">
168
- <TextControl
169
- label={ __( 'Name' ) }
170
- value={ title }
171
- onChange={ setTitle }
172
- placeholder={ __( 'My pattern' ) }
173
- className="patterns-create-modal__name-input"
174
- __nextHasNoMarginBottom
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
- <CategorySelector
178
- categoryTerms={ categoryTerms }
179
- onChange={ setCategoryTerms }
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
- <HStack justify="right">
200
- <Button
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
- <Button
212
- __next40pxDefaultSize
213
- variant="primary"
214
- type="submit"
215
- aria-disabled={ ! title || isSaving }
216
- isBusy={ isSaving }
217
- >
218
- { confirmLabel }
219
- </Button>
220
- </HStack>
221
- </VStack>
222
- </form>
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
  }