@wordpress/patterns 1.4.1 → 1.5.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/category-selector.js +16 -31
  3. package/build/components/category-selector.js.map +1 -1
  4. package/build/components/create-pattern-modal.js +59 -14
  5. package/build/components/create-pattern-modal.js.map +1 -1
  6. package/build/components/duplicate-pattern-modal.js +81 -0
  7. package/build/components/duplicate-pattern-modal.js.map +1 -0
  8. package/build/components/rename-pattern-category-modal.js +106 -0
  9. package/build/components/rename-pattern-category-modal.js.map +1 -0
  10. package/build/components/rename-pattern-modal.js +97 -0
  11. package/build/components/rename-pattern-modal.js.map +1 -0
  12. package/build/lock-unlock.js +1 -1
  13. package/build/lock-unlock.js.map +1 -1
  14. package/build/private-apis.js +6 -0
  15. package/build/private-apis.js.map +1 -1
  16. package/build-module/components/category-selector.js +17 -32
  17. package/build-module/components/category-selector.js.map +1 -1
  18. package/build-module/components/create-pattern-modal.js +61 -16
  19. package/build-module/components/create-pattern-modal.js.map +1 -1
  20. package/build-module/components/duplicate-pattern-modal.js +73 -0
  21. package/build-module/components/duplicate-pattern-modal.js.map +1 -0
  22. package/build-module/components/rename-pattern-category-modal.js +99 -0
  23. package/build-module/components/rename-pattern-category-modal.js.map +1 -0
  24. package/build-module/components/rename-pattern-modal.js +90 -0
  25. package/build-module/components/rename-pattern-modal.js.map +1 -0
  26. package/build-module/lock-unlock.js +1 -1
  27. package/build-module/lock-unlock.js.map +1 -1
  28. package/build-module/private-apis.js +6 -0
  29. package/build-module/private-apis.js.map +1 -1
  30. package/build-style/style-rtl.css +22 -2
  31. package/build-style/style.css +22 -2
  32. package/package.json +16 -17
  33. package/src/components/category-selector.js +28 -42
  34. package/src/components/create-pattern-modal.js +63 -14
  35. package/src/components/duplicate-pattern-modal.js +93 -0
  36. package/src/components/rename-pattern-category-modal.js +121 -0
  37. package/src/components/rename-pattern-modal.js +115 -0
  38. package/src/components/style.scss +28 -2
  39. package/src/lock-unlock.js +1 -1
  40. package/src/private-apis.js +6 -0
@@ -12,7 +12,7 @@ var _privateApis = require("@wordpress/private-apis");
12
12
  const {
13
13
  lock,
14
14
  unlock
15
- } = (0, _privateApis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.', '@wordpress/patterns');
15
+ } = (0, _privateApis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I know using unstable features means my theme or plugin will inevitably break in the next version of WordPress.', '@wordpress/patterns');
16
16
  exports.unlock = unlock;
17
17
  exports.lock = lock;
18
18
  //# sourceMappingURL=lock-unlock.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_privateApis","require","lock","unlock","__dangerousOptInToUnstableAPIsOnlyForCoreModules","exports"],"sources":["@wordpress/patterns/src/lock-unlock.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';\nexport const { lock, unlock } =\n\t__dangerousOptInToUnstableAPIsOnlyForCoreModules(\n\t\t'I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.',\n\t\t'@wordpress/patterns'\n\t);\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AAEO,MAAM;EAAEC,IAAI;EAAEC;AAAO,CAAC,GAC5B,IAAAC,6DAAgD,EAC/C,8GAA8G,EAC9G,qBACD,CAAC;AAACC,OAAA,CAAAF,MAAA,GAAAA,MAAA;AAAAE,OAAA,CAAAH,IAAA,GAAAA,IAAA"}
1
+ {"version":3,"names":["_privateApis","require","lock","unlock","__dangerousOptInToUnstableAPIsOnlyForCoreModules","exports"],"sources":["@wordpress/patterns/src/lock-unlock.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';\nexport const { lock, unlock } =\n\t__dangerousOptInToUnstableAPIsOnlyForCoreModules(\n\t\t'I know using unstable features means my theme or plugin will inevitably break in the next version of WordPress.',\n\t\t'@wordpress/patterns'\n\t);\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AAHA;AACA;AACA;;AAEO,MAAM;EAAEC,IAAI;EAAEC;AAAO,CAAC,GAC5B,IAAAC,6DAAgD,EAC/C,iHAAiH,EACjH,qBACD,CAAC;AAACC,OAAA,CAAAF,MAAA,GAAAA,MAAA;AAAAE,OAAA,CAAAH,IAAA,GAAAA,IAAA"}
@@ -7,7 +7,10 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.privateApis = void 0;
8
8
  var _lockUnlock = require("./lock-unlock");
9
9
  var _createPatternModal = _interopRequireDefault(require("./components/create-pattern-modal"));
10
+ var _duplicatePatternModal = _interopRequireDefault(require("./components/duplicate-pattern-modal"));
11
+ var _renamePatternModal = _interopRequireDefault(require("./components/rename-pattern-modal"));
10
12
  var _components = _interopRequireDefault(require("./components"));
13
+ var _renamePatternCategoryModal = _interopRequireDefault(require("./components/rename-pattern-category-modal"));
11
14
  var _constants = require("./constants");
12
15
  /**
13
16
  * Internal dependencies
@@ -17,7 +20,10 @@ const privateApis = {};
17
20
  exports.privateApis = privateApis;
18
21
  (0, _lockUnlock.lock)(privateApis, {
19
22
  CreatePatternModal: _createPatternModal.default,
23
+ DuplicatePatternModal: _duplicatePatternModal.default,
24
+ RenamePatternModal: _renamePatternModal.default,
20
25
  PatternsMenuItems: _components.default,
26
+ RenamePatternCategoryModal: _renamePatternCategoryModal.default,
21
27
  PATTERN_TYPES: _constants.PATTERN_TYPES,
22
28
  PATTERN_DEFAULT_CATEGORY: _constants.PATTERN_DEFAULT_CATEGORY,
23
29
  PATTERN_USER_CATEGORY: _constants.PATTERN_USER_CATEGORY,
@@ -1 +1 @@
1
- {"version":3,"names":["_lockUnlock","require","_createPatternModal","_interopRequireDefault","_components","_constants","privateApis","exports","lock","CreatePatternModal","PatternsMenuItems","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES"],"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 PatternsMenuItems from './components';\nimport {\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tPATTERN_CORE_SOURCES,\n\tPATTERN_SYNC_TYPES,\n} from './constants';\n\nexport const privateApis = {};\nlock( privateApis, {\n\tCreatePatternModal,\n\tPatternsMenuItems,\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tPATTERN_CORE_SOURCES,\n\tPATTERN_SYNC_TYPES,\n} );\n"],"mappings":";;;;;;;AAGA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,WAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AANA;AACA;AACA;;AAYO,MAAMK,WAAW,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,WAAA,GAAAA,WAAA;AAC9B,IAAAE,gBAAI,EAAEF,WAAW,EAAE;EAClBG,kBAAkB,EAAlBA,2BAAkB;EAClBC,iBAAiB,EAAjBA,mBAAiB;EACjBC,aAAa,EAAbA,wBAAa;EACbC,wBAAwB,EAAxBA,mCAAwB;EACxBC,qBAAqB,EAArBA,gCAAqB;EACrBC,oBAAoB,EAApBA,+BAAoB;EACpBC,kBAAkB,EAAlBA;AACD,CAAE,CAAC"}
1
+ {"version":3,"names":["_lockUnlock","require","_createPatternModal","_interopRequireDefault","_duplicatePatternModal","_renamePatternModal","_components","_renamePatternCategoryModal","_constants","privateApis","exports","lock","CreatePatternModal","DuplicatePatternModal","RenamePatternModal","PatternsMenuItems","RenamePatternCategoryModal","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES"],"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 {\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tPATTERN_CORE_SOURCES,\n\tPATTERN_SYNC_TYPES,\n} from './constants';\n\nexport const privateApis = {};\nlock( privateApis, {\n\tCreatePatternModal,\n\tDuplicatePatternModal,\n\tRenamePatternModal,\n\tPatternsMenuItems,\n\tRenamePatternCategoryModal,\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_CATEGORY,\n\tPATTERN_USER_CATEGORY,\n\tPATTERN_CORE_SOURCES,\n\tPATTERN_SYNC_TYPES,\n} );\n"],"mappings":";;;;;;;AAGA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,mBAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,WAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,2BAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AATA;AACA;AACA;;AAeO,MAAMQ,WAAW,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,WAAA,GAAAA,WAAA;AAC9B,IAAAE,gBAAI,EAAEF,WAAW,EAAE;EAClBG,kBAAkB,EAAlBA,2BAAkB;EAClBC,qBAAqB,EAArBA,8BAAqB;EACrBC,kBAAkB,EAAlBA,2BAAkB;EAClBC,iBAAiB,EAAjBA,mBAAiB;EACjBC,0BAA0B,EAA1BA,mCAA0B;EAC1BC,aAAa,EAAbA,wBAAa;EACbC,wBAAwB,EAAxBA,mCAAwB;EACxBC,qBAAqB,EAArBA,gCAAqB;EACrBC,oBAAoB,EAApBA,+BAAoB;EACpBC,kBAAkB,EAAlBA;AACD,CAAE,CAAC"}
@@ -1,47 +1,31 @@
1
- import { createElement, Fragment } from "react";
1
+ import { createElement } from "react";
2
2
  /**
3
3
  * WordPress dependencies
4
4
  */
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { useMemo, useState } from '@wordpress/element';
7
7
  import { FormTokenField } from '@wordpress/components';
8
- import { useSelect } from '@wordpress/data';
9
- import { store as coreStore } from '@wordpress/core-data';
10
8
  import { useDebounce } from '@wordpress/compose';
11
9
  import { decodeEntities } from '@wordpress/html-entities';
12
10
  const unescapeString = arg => {
13
11
  return decodeEntities(arg);
14
12
  };
15
- const EMPTY_ARRAY = [];
16
- const MAX_TERMS_SUGGESTIONS = 20;
17
- const DEFAULT_QUERY = {
18
- per_page: MAX_TERMS_SUGGESTIONS,
19
- _fields: 'id,name',
20
- context: 'view'
21
- };
22
13
  export const CATEGORY_SLUG = 'wp_pattern_category';
23
14
  export default function CategorySelector({
24
- values,
25
- onChange
15
+ categoryTerms,
16
+ onChange,
17
+ categoryMap
26
18
  }) {
27
19
  const [search, setSearch] = useState('');
28
20
  const debouncedSearch = useDebounce(setSearch, 500);
29
- const {
30
- searchResults
31
- } = useSelect(select => {
32
- const {
33
- getEntityRecords
34
- } = select(coreStore);
35
- return {
36
- searchResults: !!search ? getEntityRecords('taxonomy', CATEGORY_SLUG, {
37
- ...DEFAULT_QUERY,
38
- search
39
- }) : EMPTY_ARRAY
40
- };
41
- }, [search]);
42
21
  const suggestions = useMemo(() => {
43
- return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name));
44
- }, [searchResults]);
22
+ return Array.from(categoryMap.values()).map(category => unescapeString(category.label)).filter(category => {
23
+ if (search !== '') {
24
+ return category.toLowerCase().includes(search.toLowerCase());
25
+ }
26
+ return true;
27
+ }).sort((a, b) => a.localeCompare(b));
28
+ }, [search, categoryMap]);
45
29
  function handleChange(termNames) {
46
30
  const uniqueTerms = termNames.reduce((terms, newTerm) => {
47
31
  if (!terms.some(term => term.toLowerCase() === newTerm.toLowerCase())) {
@@ -51,15 +35,16 @@ export default function CategorySelector({
51
35
  }, []);
52
36
  onChange(uniqueTerms);
53
37
  }
54
- return createElement(Fragment, null, createElement(FormTokenField, {
38
+ return createElement(FormTokenField, {
55
39
  className: "patterns-menu-items__convert-modal-categories",
56
- value: values,
40
+ value: categoryTerms,
57
41
  suggestions: suggestions,
58
42
  onChange: handleChange,
59
43
  onInputChange: debouncedSearch,
60
- maxSuggestions: MAX_TERMS_SUGGESTIONS,
61
44
  label: __('Categories'),
62
- tokenizeOnBlur: true
63
- }));
45
+ tokenizeOnBlur: true,
46
+ __experimentalExpandOnFocus: true,
47
+ __next40pxDefaultSize: true
48
+ });
64
49
  }
65
50
  //# sourceMappingURL=category-selector.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["__","useMemo","useState","FormTokenField","useSelect","store","coreStore","useDebounce","decodeEntities","unescapeString","arg","EMPTY_ARRAY","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","_fields","context","CATEGORY_SLUG","CategorySelector","values","onChange","search","setSearch","debouncedSearch","searchResults","select","getEntityRecords","suggestions","map","term","name","handleChange","termNames","uniqueTerms","reduce","terms","newTerm","some","toLowerCase","push","createElement","Fragment","className","value","onInputChange","maxSuggestions","label","tokenizeOnBlur"],"sources":["@wordpress/patterns/src/components/category-selector.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useMemo, useState } from '@wordpress/element';\nimport { FormTokenField } from '@wordpress/components';\nimport { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useDebounce } from '@wordpress/compose';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst unescapeString = ( arg ) => {\n\treturn decodeEntities( arg );\n};\n\nconst EMPTY_ARRAY = [];\nconst MAX_TERMS_SUGGESTIONS = 20;\nconst DEFAULT_QUERY = {\n\tper_page: MAX_TERMS_SUGGESTIONS,\n\t_fields: 'id,name',\n\tcontext: 'view',\n};\nexport const CATEGORY_SLUG = 'wp_pattern_category';\n\nexport default function CategorySelector( { values, onChange } ) {\n\tconst [ search, setSearch ] = useState( '' );\n\tconst debouncedSearch = useDebounce( setSearch, 500 );\n\n\tconst { searchResults } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecords } = select( coreStore );\n\n\t\t\treturn {\n\t\t\t\tsearchResults: !! search\n\t\t\t\t\t? getEntityRecords( 'taxonomy', CATEGORY_SLUG, {\n\t\t\t\t\t\t\t...DEFAULT_QUERY,\n\t\t\t\t\t\t\tsearch,\n\t\t\t\t\t } )\n\t\t\t\t\t: EMPTY_ARRAY,\n\t\t\t};\n\t\t},\n\t\t[ search ]\n\t);\n\n\tconst suggestions = useMemo( () => {\n\t\treturn ( searchResults ?? [] ).map( ( term ) =>\n\t\t\tunescapeString( term.name )\n\t\t);\n\t}, [ searchResults ] );\n\n\tfunction handleChange( termNames ) {\n\t\tconst uniqueTerms = termNames.reduce( ( terms, newTerm ) => {\n\t\t\tif (\n\t\t\t\t! terms.some(\n\t\t\t\t\t( term ) => term.toLowerCase() === newTerm.toLowerCase()\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tterms.push( newTerm );\n\t\t\t}\n\t\t\treturn terms;\n\t\t}, [] );\n\n\t\tonChange( uniqueTerms );\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<FormTokenField\n\t\t\t\tclassName=\"patterns-menu-items__convert-modal-categories\"\n\t\t\t\tvalue={ values }\n\t\t\t\tsuggestions={ suggestions }\n\t\t\t\tonChange={ handleChange }\n\t\t\t\tonInputChange={ debouncedSearch }\n\t\t\t\tmaxSuggestions={ MAX_TERMS_SUGGESTIONS }\n\t\t\t\tlabel={ __( 'Categories' ) }\n\t\t\t\ttokenizeOnBlur={ true }\n\t\t\t/>\n\t\t</>\n\t);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,EAAE,QAAQ,iBAAiB;AACpC,SAASC,OAAO,EAAEC,QAAQ,QAAQ,oBAAoB;AACtD,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAASC,KAAK,IAAIC,SAAS,QAAQ,sBAAsB;AACzD,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,cAAc,QAAQ,0BAA0B;AAEzD,MAAMC,cAAc,GAAKC,GAAG,IAAM;EACjC,OAAOF,cAAc,CAAEE,GAAI,CAAC;AAC7B,CAAC;AAED,MAAMC,WAAW,GAAG,EAAE;AACtB,MAAMC,qBAAqB,GAAG,EAAE;AAChC,MAAMC,aAAa,GAAG;EACrBC,QAAQ,EAAEF,qBAAqB;EAC/BG,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACV,CAAC;AACD,OAAO,MAAMC,aAAa,GAAG,qBAAqB;AAElD,eAAe,SAASC,gBAAgBA,CAAE;EAAEC,MAAM;EAAEC;AAAS,CAAC,EAAG;EAChE,MAAM,CAAEC,MAAM,EAAEC,SAAS,CAAE,GAAGpB,QAAQ,CAAE,EAAG,CAAC;EAC5C,MAAMqB,eAAe,GAAGhB,WAAW,CAAEe,SAAS,EAAE,GAAI,CAAC;EAErD,MAAM;IAAEE;EAAc,CAAC,GAAGpB,SAAS,CAChCqB,MAAM,IAAM;IACb,MAAM;MAAEC;IAAiB,CAAC,GAAGD,MAAM,CAAEnB,SAAU,CAAC;IAEhD,OAAO;MACNkB,aAAa,EAAE,CAAC,CAAEH,MAAM,GACrBK,gBAAgB,CAAE,UAAU,EAAET,aAAa,EAAE;QAC7C,GAAGJ,aAAa;QAChBQ;MACA,CAAE,CAAC,GACHV;IACJ,CAAC;EACF,CAAC,EACD,CAAEU,MAAM,CACT,CAAC;EAED,MAAMM,WAAW,GAAG1B,OAAO,CAAE,MAAM;IAClC,OAAO,CAAEuB,aAAa,aAAbA,aAAa,cAAbA,aAAa,GAAI,EAAE,EAAGI,GAAG,CAAIC,IAAI,IACzCpB,cAAc,CAAEoB,IAAI,CAACC,IAAK,CAC3B,CAAC;EACF,CAAC,EAAE,CAAEN,aAAa,CAAG,CAAC;EAEtB,SAASO,YAAYA,CAAEC,SAAS,EAAG;IAClC,MAAMC,WAAW,GAAGD,SAAS,CAACE,MAAM,CAAE,CAAEC,KAAK,EAAEC,OAAO,KAAM;MAC3D,IACC,CAAED,KAAK,CAACE,IAAI,CACTR,IAAI,IAAMA,IAAI,CAACS,WAAW,CAAC,CAAC,KAAKF,OAAO,CAACE,WAAW,CAAC,CACxD,CAAC,EACA;QACDH,KAAK,CAACI,IAAI,CAAEH,OAAQ,CAAC;MACtB;MACA,OAAOD,KAAK;IACb,CAAC,EAAE,EAAG,CAAC;IAEPf,QAAQ,CAAEa,WAAY,CAAC;EACxB;EAEA,OACCO,aAAA,CAAAC,QAAA,QACCD,aAAA,CAACrC,cAAc;IACduC,SAAS,EAAC,+CAA+C;IACzDC,KAAK,EAAGxB,MAAQ;IAChBQ,WAAW,EAAGA,WAAa;IAC3BP,QAAQ,EAAGW,YAAc;IACzBa,aAAa,EAAGrB,eAAiB;IACjCsB,cAAc,EAAGjC,qBAAuB;IACxCkC,KAAK,EAAG9C,EAAE,CAAE,YAAa,CAAG;IAC5B+C,cAAc,EAAG;EAAM,CACvB,CACA,CAAC;AAEL"}
1
+ {"version":3,"names":["__","useMemo","useState","FormTokenField","useDebounce","decodeEntities","unescapeString","arg","CATEGORY_SLUG","CategorySelector","categoryTerms","onChange","categoryMap","search","setSearch","debouncedSearch","suggestions","Array","from","values","map","category","label","filter","toLowerCase","includes","sort","a","b","localeCompare","handleChange","termNames","uniqueTerms","reduce","terms","newTerm","some","term","push","createElement","className","value","onInputChange","tokenizeOnBlur","__experimentalExpandOnFocus","__next40pxDefaultSize"],"sources":["@wordpress/patterns/src/components/category-selector.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useMemo, useState } from '@wordpress/element';\nimport { FormTokenField } from '@wordpress/components';\nimport { useDebounce } from '@wordpress/compose';\nimport { decodeEntities } from '@wordpress/html-entities';\n\nconst unescapeString = ( arg ) => {\n\treturn decodeEntities( arg );\n};\n\nexport const CATEGORY_SLUG = 'wp_pattern_category';\n\nexport default function CategorySelector( {\n\tcategoryTerms,\n\tonChange,\n\tcategoryMap,\n} ) {\n\tconst [ search, setSearch ] = useState( '' );\n\tconst debouncedSearch = useDebounce( setSearch, 500 );\n\n\tconst suggestions = useMemo( () => {\n\t\treturn Array.from( categoryMap.values() )\n\t\t\t.map( ( category ) => unescapeString( category.label ) )\n\t\t\t.filter( ( category ) => {\n\t\t\t\tif ( search !== '' ) {\n\t\t\t\t\treturn category\n\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t.includes( search.toLowerCase() );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} )\n\t\t\t.sort( ( a, b ) => a.localeCompare( b ) );\n\t}, [ search, categoryMap ] );\n\n\tfunction handleChange( termNames ) {\n\t\tconst uniqueTerms = termNames.reduce( ( terms, newTerm ) => {\n\t\t\tif (\n\t\t\t\t! terms.some(\n\t\t\t\t\t( term ) => term.toLowerCase() === newTerm.toLowerCase()\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tterms.push( newTerm );\n\t\t\t}\n\t\t\treturn terms;\n\t\t}, [] );\n\n\t\tonChange( uniqueTerms );\n\t}\n\n\treturn (\n\t\t<FormTokenField\n\t\t\tclassName=\"patterns-menu-items__convert-modal-categories\"\n\t\t\tvalue={ categoryTerms }\n\t\t\tsuggestions={ suggestions }\n\t\t\tonChange={ handleChange }\n\t\t\tonInputChange={ debouncedSearch }\n\t\t\tlabel={ __( 'Categories' ) }\n\t\t\ttokenizeOnBlur\n\t\t\t__experimentalExpandOnFocus\n\t\t\t__next40pxDefaultSize\n\t\t/>\n\t);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,EAAE,QAAQ,iBAAiB;AACpC,SAASC,OAAO,EAAEC,QAAQ,QAAQ,oBAAoB;AACtD,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,cAAc,QAAQ,0BAA0B;AAEzD,MAAMC,cAAc,GAAKC,GAAG,IAAM;EACjC,OAAOF,cAAc,CAAEE,GAAI,CAAC;AAC7B,CAAC;AAED,OAAO,MAAMC,aAAa,GAAG,qBAAqB;AAElD,eAAe,SAASC,gBAAgBA,CAAE;EACzCC,aAAa;EACbC,QAAQ;EACRC;AACD,CAAC,EAAG;EACH,MAAM,CAAEC,MAAM,EAAEC,SAAS,CAAE,GAAGZ,QAAQ,CAAE,EAAG,CAAC;EAC5C,MAAMa,eAAe,GAAGX,WAAW,CAAEU,SAAS,EAAE,GAAI,CAAC;EAErD,MAAME,WAAW,GAAGf,OAAO,CAAE,MAAM;IAClC,OAAOgB,KAAK,CAACC,IAAI,CAAEN,WAAW,CAACO,MAAM,CAAC,CAAE,CAAC,CACvCC,GAAG,CAAIC,QAAQ,IAAMf,cAAc,CAAEe,QAAQ,CAACC,KAAM,CAAE,CAAC,CACvDC,MAAM,CAAIF,QAAQ,IAAM;MACxB,IAAKR,MAAM,KAAK,EAAE,EAAG;QACpB,OAAOQ,QAAQ,CACbG,WAAW,CAAC,CAAC,CACbC,QAAQ,CAAEZ,MAAM,CAACW,WAAW,CAAC,CAAE,CAAC;MACnC;MACA,OAAO,IAAI;IACZ,CAAE,CAAC,CACFE,IAAI,CAAE,CAAEC,CAAC,EAAEC,CAAC,KAAMD,CAAC,CAACE,aAAa,CAAED,CAAE,CAAE,CAAC;EAC3C,CAAC,EAAE,CAAEf,MAAM,EAAED,WAAW,CAAG,CAAC;EAE5B,SAASkB,YAAYA,CAAEC,SAAS,EAAG;IAClC,MAAMC,WAAW,GAAGD,SAAS,CAACE,MAAM,CAAE,CAAEC,KAAK,EAAEC,OAAO,KAAM;MAC3D,IACC,CAAED,KAAK,CAACE,IAAI,CACTC,IAAI,IAAMA,IAAI,CAACb,WAAW,CAAC,CAAC,KAAKW,OAAO,CAACX,WAAW,CAAC,CACxD,CAAC,EACA;QACDU,KAAK,CAACI,IAAI,CAAEH,OAAQ,CAAC;MACtB;MACA,OAAOD,KAAK;IACb,CAAC,EAAE,EAAG,CAAC;IAEPvB,QAAQ,CAAEqB,WAAY,CAAC;EACxB;EAEA,OACCO,aAAA,CAACpC,cAAc;IACdqC,SAAS,EAAC,+CAA+C;IACzDC,KAAK,EAAG/B,aAAe;IACvBM,WAAW,EAAGA,WAAa;IAC3BL,QAAQ,EAAGmB,YAAc;IACzBY,aAAa,EAAG3B,eAAiB;IACjCO,KAAK,EAAGtB,EAAE,CAAE,YAAa,CAAG;IAC5B2C,cAAc;IACdC,2BAA2B;IAC3BC,qBAAqB;EAAA,CACrB,CAAC;AAEJ"}
@@ -4,8 +4,8 @@ import { createElement } from "react";
4
4
  */
5
5
  import { Modal, Button, TextControl, __experimentalHStack as HStack, __experimentalVStack as VStack, ToggleControl } from '@wordpress/components';
6
6
  import { __ } from '@wordpress/i18n';
7
- import { useState } from '@wordpress/element';
8
- import { useDispatch } from '@wordpress/data';
7
+ import { useState, useMemo } from '@wordpress/element';
8
+ import { useDispatch, useSelect } from '@wordpress/data';
9
9
  import { store as noticesStore } from '@wordpress/notices';
10
10
  import { store as coreStore } from '@wordpress/core-data';
11
11
 
@@ -21,15 +21,20 @@ import { store as patternsStore } from '../store';
21
21
  import CategorySelector, { CATEGORY_SLUG } from './category-selector';
22
22
  import { unlock } from '../lock-unlock';
23
23
  export default function CreatePatternModal({
24
- onSuccess,
25
- onError,
24
+ confirmLabel = __('Create'),
25
+ defaultCategories = [],
26
+ className = 'patterns-menu-items__convert-modal',
26
27
  content,
28
+ modalTitle = __('Create pattern'),
27
29
  onClose,
28
- className = 'patterns-menu-items__convert-modal'
30
+ onError,
31
+ onSuccess,
32
+ defaultSyncType = PATTERN_SYNC_TYPES.full,
33
+ defaultTitle = ''
29
34
  }) {
30
- const [syncType, setSyncType] = useState(PATTERN_SYNC_TYPES.full);
31
- const [categoryTerms, setCategoryTerms] = useState([]);
32
- const [title, setTitle] = useState('');
35
+ const [syncType, setSyncType] = useState(defaultSyncType);
36
+ const [categoryTerms, setCategoryTerms] = useState(defaultCategories);
37
+ const [title, setTitle] = useState(defaultTitle);
33
38
  const [isSaving, setIsSaving] = useState(false);
34
39
  const {
35
40
  createPattern
@@ -41,6 +46,38 @@ export default function CreatePatternModal({
41
46
  const {
42
47
  createErrorNotice
43
48
  } = useDispatch(noticesStore);
49
+ const {
50
+ corePatternCategories,
51
+ userPatternCategories
52
+ } = useSelect(select => {
53
+ const {
54
+ getUserPatternCategories,
55
+ getBlockPatternCategories
56
+ } = select(coreStore);
57
+ return {
58
+ corePatternCategories: getBlockPatternCategories(),
59
+ userPatternCategories: getUserPatternCategories()
60
+ };
61
+ });
62
+ const categoryMap = useMemo(() => {
63
+ // Merge the user and core pattern categories and remove any duplicates.
64
+ const uniqueCategories = new Map();
65
+ [...userPatternCategories, ...corePatternCategories].forEach(category => {
66
+ if (!uniqueCategories.has(category.label) &&
67
+ // There are two core categories with `Post` label so explicitly remove the one with
68
+ // the `query` slug to avoid any confusion.
69
+ category.name !== 'query') {
70
+ // We need to store the name separately as this is used as the slug in the
71
+ // taxonomy and may vary from the label.
72
+ uniqueCategories.set(category.label, {
73
+ label: category.label,
74
+ value: category.label,
75
+ name: category.name
76
+ });
77
+ }
78
+ });
79
+ return uniqueCategories;
80
+ }, [userPatternCategories, corePatternCategories]);
44
81
  async function onCreate(patternTitle, sync) {
45
82
  if (!title || isSaving) {
46
83
  return;
@@ -56,9 +93,9 @@ export default function CreatePatternModal({
56
93
  } catch (error) {
57
94
  createErrorNotice(error.message, {
58
95
  type: 'snackbar',
59
- id: 'convert-to-pattern-error'
96
+ id: 'pattern-create'
60
97
  });
61
- onError();
98
+ onError?.();
62
99
  } finally {
63
100
  setIsSaving(false);
64
101
  setCategoryTerms([]);
@@ -72,9 +109,16 @@ export default function CreatePatternModal({
72
109
  */
73
110
  async function findOrCreateTerm(term) {
74
111
  try {
75
- const newTerm = await saveEntityRecord('taxonomy', CATEGORY_SLUG, {
112
+ // We need to match any existing term to the correct slug to prevent duplicates, eg.
113
+ // the core `Headers` category uses the singular `header` as the slug.
114
+ const existingTerm = categoryMap.get(term);
115
+ const termData = existingTerm ? {
116
+ name: existingTerm.label,
117
+ slug: existingTerm.name
118
+ } : {
76
119
  name: term
77
- }, {
120
+ };
121
+ const newTerm = await saveEntityRecord('taxonomy', CATEGORY_SLUG, termData, {
78
122
  throwOnError: true
79
123
  });
80
124
  invalidateResolution('getUserPatternCategories');
@@ -87,7 +131,7 @@ export default function CreatePatternModal({
87
131
  }
88
132
  }
89
133
  return createElement(Modal, {
90
- title: __('Create pattern'),
134
+ title: modalTitle,
91
135
  onRequestClose: () => {
92
136
  onClose();
93
137
  setTitle('');
@@ -108,8 +152,9 @@ export default function CreatePatternModal({
108
152
  placeholder: __('My pattern'),
109
153
  className: "patterns-create-modal__name-input"
110
154
  }), createElement(CategorySelector, {
111
- values: categoryTerms,
112
- onChange: setCategoryTerms
155
+ categoryTerms: categoryTerms,
156
+ onChange: setCategoryTerms,
157
+ categoryMap: categoryMap
113
158
  }), createElement(ToggleControl, {
114
159
  label: __('Synced'),
115
160
  help: __('Editing the pattern will update it anywhere it is used.'),
@@ -130,6 +175,6 @@ export default function CreatePatternModal({
130
175
  type: "submit",
131
176
  "aria-disabled": !title || isSaving,
132
177
  isBusy: isSaving
133
- }, __('Create'))))));
178
+ }, confirmLabel)))));
134
179
  }
135
180
  //# sourceMappingURL=create-pattern-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","__","useState","useDispatch","store","noticesStore","coreStore","PATTERN_DEFAULT_CATEGORY","PATTERN_SYNC_TYPES","patternsStore","CategorySelector","CATEGORY_SLUG","unlock","CreatePatternModal","onSuccess","onError","content","onClose","className","syncType","setSyncType","full","categoryTerms","setCategoryTerms","title","setTitle","isSaving","setIsSaving","createPattern","saveEntityRecord","invalidateResolution","createErrorNotice","onCreate","patternTitle","sync","categories","Promise","all","map","termName","findOrCreateTerm","newPattern","pattern","categoryId","error","message","type","id","term","newTerm","name","throwOnError","code","data","term_id","createElement","onRequestClose","overlayClassName","onSubmit","event","preventDefault","spacing","__nextHasNoMarginBottom","label","value","onChange","placeholder","values","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 { __ } from '@wordpress/i18n';\nimport { useState } from '@wordpress/element';\nimport { useDispatch } 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\tonSuccess,\n\tonError,\n\tcontent,\n\tonClose,\n\tclassName = 'patterns-menu-items__convert-modal',\n} ) {\n\tconst [ syncType, setSyncType ] = useState( PATTERN_SYNC_TYPES.full );\n\tconst [ categoryTerms, setCategoryTerms ] = useState( [] );\n\tconst [ title, setTitle ] = useState( '' );\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\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: 'convert-to-pattern-error',\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 newTerm = await saveEntityRecord(\n\t\t\t\t'taxonomy',\n\t\t\t\tCATEGORY_SLUG,\n\t\t\t\t{ name: term },\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={ __( 'Create pattern' ) }\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\t__nextHasNoMarginBottom\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/>\n\t\t\t\t\t<CategorySelector\n\t\t\t\t\t\tvalues={ categoryTerms }\n\t\t\t\t\t\tonChange={ setCategoryTerms }\n\t\t\t\t\t/>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\tlabel={ __( 'Synced' ) }\n\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\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\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\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{ __( 'Create' ) }\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","__","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","__nextHasNoMarginBottom","onChange","placeholder","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 { __ } 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\t__nextHasNoMarginBottom\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/>\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={ __( 'Synced' ) }\n\t\t\t\t\t\thelp={ __(\n\t\t\t\t\t\t\t'Editing the pattern will update it anywhere it is used.'\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\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\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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"}
@@ -0,0 +1,73 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { store as coreStore } from '@wordpress/core-data';
6
+ import { useDispatch, useSelect } from '@wordpress/data';
7
+ import { __, sprintf } from '@wordpress/i18n';
8
+ import { store as noticesStore } from '@wordpress/notices';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import CreatePatternModal from './create-pattern-modal';
14
+ import { PATTERN_SYNC_TYPES } from '../constants';
15
+ function getTermLabels(pattern, categories) {
16
+ // Theme patterns don't have an id and rely on core pattern categories.
17
+ if (!pattern.id) {
18
+ return categories.core?.filter(category => pattern.categories.includes(category.name)).map(category => category.label);
19
+ }
20
+ return categories.user?.filter(category => pattern.wp_pattern_category.includes(category.id)).map(category => category.label);
21
+ }
22
+ export default function DuplicatePatternModal({
23
+ pattern,
24
+ onClose,
25
+ onSuccess
26
+ }) {
27
+ const {
28
+ createSuccessNotice
29
+ } = useDispatch(noticesStore);
30
+ const categories = useSelect(select => {
31
+ const {
32
+ getUserPatternCategories,
33
+ getBlockPatternCategories
34
+ } = select(coreStore);
35
+ return {
36
+ core: getBlockPatternCategories(),
37
+ user: getUserPatternCategories()
38
+ };
39
+ });
40
+ if (!pattern) {
41
+ return null;
42
+ }
43
+ const duplicatedProps = {
44
+ content: pattern.content,
45
+ defaultCategories: getTermLabels(pattern, categories),
46
+ defaultSyncType: !pattern.id // Theme patterns don't have an ID.
47
+ ? PATTERN_SYNC_TYPES.unsynced : pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES.full,
48
+ 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?.({
61
+ pattern: newPattern
62
+ });
63
+ }
64
+ return createElement(CreatePatternModal, {
65
+ modalTitle: __('Duplicate pattern'),
66
+ confirmLabel: __('Duplicate'),
67
+ onClose: onClose,
68
+ onError: onClose,
69
+ onSuccess: handleOnSuccess,
70
+ ...duplicatedProps
71
+ });
72
+ }
73
+ //# sourceMappingURL=duplicate-pattern-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["store","coreStore","useDispatch","useSelect","__","sprintf","noticesStore","CreatePatternModal","PATTERN_SYNC_TYPES","getTermLabels","pattern","categories","id","core","filter","category","includes","name","map","label","user","wp_pattern_category","DuplicatePatternModal","onClose","onSuccess","createSuccessNotice","select","getUserPatternCategories","getBlockPatternCategories","duplicatedProps","content","defaultCategories","defaultSyncType","unsynced","wp_pattern_sync_status","full","defaultTitle","title","raw","handleOnSuccess","newPattern","type","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 } from '../constants';\n\nfunction getTermLabels( pattern, categories ) {\n\t// Theme patterns don't have an id and rely on core pattern categories.\n\tif ( ! pattern.id ) {\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: ! pattern.id // Theme patterns don't have an ID.\n\t\t\t? PATTERN_SYNC_TYPES.unsynced\n\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":";AAAA;AACA;AACA;AACA,SAASA,KAAK,IAAIC,SAAS,QAAQ,sBAAsB;AACzD,SAASC,WAAW,EAAEC,SAAS,QAAQ,iBAAiB;AACxD,SAASC,EAAE,EAAEC,OAAO,QAAQ,iBAAiB;AAC7C,SAASL,KAAK,IAAIM,YAAY,QAAQ,oBAAoB;;AAE1D;AACA;AACA;AACA,OAAOC,kBAAkB,MAAM,wBAAwB;AACvD,SAASC,kBAAkB,QAAQ,cAAc;AAEjD,SAASC,aAAaA,CAAEC,OAAO,EAAEC,UAAU,EAAG;EAC7C;EACA,IAAK,CAAED,OAAO,CAACE,EAAE,EAAG;IACnB,OAAOD,UAAU,CAACE,IAAI,EACnBC,MAAM,CAAIC,QAAQ,IACnBL,OAAO,CAACC,UAAU,CAACK,QAAQ,CAAED,QAAQ,CAACE,IAAK,CAC5C,CAAC,CACAC,GAAG,CAAIH,QAAQ,IAAMA,QAAQ,CAACI,KAAM,CAAC;EACxC;EAEA,OAAOR,UAAU,CAACS,IAAI,EACnBN,MAAM,CAAIC,QAAQ,IACnBL,OAAO,CAACW,mBAAmB,CAACL,QAAQ,CAAED,QAAQ,CAACH,EAAG,CACnD,CAAC,CACAM,GAAG,CAAIH,QAAQ,IAAMA,QAAQ,CAACI,KAAM,CAAC;AACxC;AAEA,eAAe,SAASG,qBAAqBA,CAAE;EAC9CZ,OAAO;EACPa,OAAO;EACPC;AACD,CAAC,EAAG;EACH,MAAM;IAAEC;EAAoB,CAAC,GAAGvB,WAAW,CAAEI,YAAa,CAAC;EAC3D,MAAMK,UAAU,GAAGR,SAAS,CAAIuB,MAAM,IAAM;IAC3C,MAAM;MAAEC,wBAAwB;MAAEC;IAA0B,CAAC,GAC5DF,MAAM,CAAEzB,SAAU,CAAC;IAEpB,OAAO;MACNY,IAAI,EAAEe,yBAAyB,CAAC,CAAC;MACjCR,IAAI,EAAEO,wBAAwB,CAAC;IAChC,CAAC;EACF,CAAE,CAAC;EAEH,IAAK,CAAEjB,OAAO,EAAG;IAChB,OAAO,IAAI;EACZ;EAEA,MAAMmB,eAAe,GAAG;IACvBC,OAAO,EAAEpB,OAAO,CAACoB,OAAO;IACxBC,iBAAiB,EAAEtB,aAAa,CAAEC,OAAO,EAAEC,UAAW,CAAC;IACvDqB,eAAe,EAAE,CAAEtB,OAAO,CAACE,EAAE,CAAC;IAAA,EAC3BJ,kBAAkB,CAACyB,QAAQ,GAC3BvB,OAAO,CAACwB,sBAAsB,IAAI1B,kBAAkB,CAAC2B,IAAI;IAC5DC,YAAY,EAAE/B,OAAO,EACpB;IACAD,EAAE,CAAE,WAAY,CAAC,EACjB,OAAOM,OAAO,CAAC2B,KAAK,KAAK,QAAQ,GAC9B3B,OAAO,CAAC2B,KAAK,GACb3B,OAAO,CAAC2B,KAAK,CAACC,GAClB;EACD,CAAC;EAED,SAASC,eAAeA,CAAE;IAAE7B,OAAO,EAAE8B;EAAW,CAAC,EAAG;IACnDf,mBAAmB,CAClBpB,OAAO;IACN;IACAD,EAAE,CAAE,kBAAmB,CAAC,EACxBoC,UAAU,CAACH,KAAK,CAACC,GAClB,CAAC,EACD;MACCG,IAAI,EAAE,UAAU;MAChB7B,EAAE,EAAE;IACL,CACD,CAAC;IAEDY,SAAS,GAAI;MAAEd,OAAO,EAAE8B;IAAW,CAAE,CAAC;EACvC;EAEA,OACCE,aAAA,CAACnC,kBAAkB;IAClBoC,UAAU,EAAGvC,EAAE,CAAE,mBAAoB,CAAG;IACxCwC,YAAY,EAAGxC,EAAE,CAAE,WAAY,CAAG;IAClCmB,OAAO,EAAGA,OAAS;IACnBsB,OAAO,EAAGtB,OAAS;IACnBC,SAAS,EAAGe,eAAiB;IAAA,GACxBV;EAAe,CACpB,CAAC;AAEJ"}
@@ -0,0 +1,99 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { Modal, Button, TextControl, __experimentalHStack as HStack, __experimentalVStack as VStack } from '@wordpress/components';
6
+ import { store as coreStore } from '@wordpress/core-data';
7
+ import { useDispatch } from '@wordpress/data';
8
+ import { useState } from '@wordpress/element';
9
+ import { decodeEntities } from '@wordpress/html-entities';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { store as noticesStore } from '@wordpress/notices';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { CATEGORY_SLUG } from './category-selector';
17
+ export default function RenamePatternCategoryModal({
18
+ category,
19
+ onClose,
20
+ onError,
21
+ onSuccess,
22
+ ...props
23
+ }) {
24
+ const [name, setName] = useState(decodeEntities(category.name));
25
+ const [isSaving, setIsSaving] = useState(false);
26
+ const {
27
+ saveEntityRecord,
28
+ invalidateResolution
29
+ } = useDispatch(coreStore);
30
+ const {
31
+ createErrorNotice,
32
+ createSuccessNotice
33
+ } = useDispatch(noticesStore);
34
+ const onRename = async event => {
35
+ event.preventDefault();
36
+ if (!name || name === category.name || isSaving) {
37
+ return;
38
+ }
39
+ try {
40
+ setIsSaving(true);
41
+
42
+ // User pattern category properties may differ as they can be
43
+ // normalized for use alongside template part areas, core pattern
44
+ // categories etc. As a result we won't just destructure the passed
45
+ // category object.
46
+ const savedRecord = await saveEntityRecord('taxonomy', CATEGORY_SLUG, {
47
+ id: category.id,
48
+ slug: category.slug,
49
+ name
50
+ });
51
+ invalidateResolution('getUserPatternCategories');
52
+ onSuccess?.(savedRecord);
53
+ onClose();
54
+ createSuccessNotice(__('Pattern category renamed.'), {
55
+ type: 'snackbar',
56
+ id: 'pattern-category-update'
57
+ });
58
+ } catch (error) {
59
+ onError?.();
60
+ createErrorNotice(error.message, {
61
+ type: 'snackbar',
62
+ id: 'pattern-category-update'
63
+ });
64
+ } finally {
65
+ setIsSaving(false);
66
+ setName('');
67
+ }
68
+ };
69
+ const onRequestClose = () => {
70
+ onClose();
71
+ setName('');
72
+ };
73
+ return createElement(Modal, {
74
+ title: __('Rename'),
75
+ onRequestClose: onRequestClose,
76
+ ...props
77
+ }, createElement("form", {
78
+ onSubmit: onRename
79
+ }, createElement(VStack, {
80
+ spacing: "5"
81
+ }, createElement(TextControl, {
82
+ __nextHasNoMarginBottom: true,
83
+ label: __('Name'),
84
+ value: name,
85
+ onChange: setName,
86
+ required: true
87
+ }), createElement(HStack, {
88
+ justify: "right"
89
+ }, createElement(Button, {
90
+ variant: "tertiary",
91
+ onClick: onRequestClose
92
+ }, __('Cancel')), createElement(Button, {
93
+ variant: "primary",
94
+ type: "submit",
95
+ "aria-disabled": !name || name === category.name || isSaving,
96
+ isBusy: isSaving
97
+ }, __('Save'))))));
98
+ }
99
+ //# sourceMappingURL=rename-pattern-category-modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","store","coreStore","useDispatch","useState","decodeEntities","__","noticesStore","CATEGORY_SLUG","RenamePatternCategoryModal","category","onClose","onError","onSuccess","props","name","setName","isSaving","setIsSaving","saveEntityRecord","invalidateResolution","createErrorNotice","createSuccessNotice","onRename","event","preventDefault","savedRecord","id","slug","type","error","message","onRequestClose","createElement","title","onSubmit","spacing","__nextHasNoMarginBottom","label","value","onChange","required","justify","variant","onClick","isBusy"],"sources":["@wordpress/patterns/src/components/rename-pattern-category-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} from '@wordpress/components';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useDispatch } from '@wordpress/data';\nimport { useState } from '@wordpress/element';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { __ } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport { CATEGORY_SLUG } from './category-selector';\n\nexport default function RenamePatternCategoryModal( {\n\tcategory,\n\tonClose,\n\tonError,\n\tonSuccess,\n\t...props\n} ) {\n\tconst [ name, setName ] = useState( decodeEntities( category.name ) );\n\tconst [ isSaving, setIsSaving ] = useState( false );\n\n\tconst { saveEntityRecord, invalidateResolution } = useDispatch( coreStore );\n\n\tconst { createErrorNotice, createSuccessNotice } =\n\t\tuseDispatch( noticesStore );\n\n\tconst onRename = async ( event ) => {\n\t\tevent.preventDefault();\n\n\t\tif ( ! name || name === category.name || isSaving ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsSaving( true );\n\n\t\t\t// User pattern category properties may differ as they can be\n\t\t\t// normalized for use alongside template part areas, core pattern\n\t\t\t// categories etc. As a result we won't just destructure the passed\n\t\t\t// category object.\n\t\t\tconst savedRecord = await saveEntityRecord(\n\t\t\t\t'taxonomy',\n\t\t\t\tCATEGORY_SLUG,\n\t\t\t\t{\n\t\t\t\t\tid: category.id,\n\t\t\t\t\tslug: category.slug,\n\t\t\t\t\tname,\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tinvalidateResolution( 'getUserPatternCategories' );\n\t\t\tonSuccess?.( savedRecord );\n\t\t\tonClose();\n\n\t\t\tcreateSuccessNotice( __( 'Pattern category renamed.' ), {\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'pattern-category-update',\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\tonError?.();\n\t\t\tcreateErrorNotice( error.message, {\n\t\t\t\ttype: 'snackbar',\n\t\t\t\tid: 'pattern-category-update',\n\t\t\t} );\n\t\t} finally {\n\t\t\tsetIsSaving( false );\n\t\t\tsetName( '' );\n\t\t}\n\t};\n\n\tconst onRequestClose = () => {\n\t\tonClose();\n\t\tsetName( '' );\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\ttitle={ __( 'Rename' ) }\n\t\t\tonRequestClose={ onRequestClose }\n\t\t\t{ ...props }\n\t\t>\n\t\t\t<form onSubmit={ onRename }>\n\t\t\t\t<VStack spacing=\"5\">\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\tlabel={ __( 'Name' ) }\n\t\t\t\t\t\tvalue={ name }\n\t\t\t\t\t\tonChange={ setName }\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t\t<HStack justify=\"right\">\n\t\t\t\t\t\t<Button variant=\"tertiary\" onClick={ onRequestClose }>\n\t\t\t\t\t\t\t{ __( 'Cancel' ) }\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\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={\n\t\t\t\t\t\t\t\t! name || name === category.name || isSaving\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tisBusy={ isSaving }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Save' ) }\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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"}