@wordpress/patterns 1.4.0 → 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.
- package/CHANGELOG.md +2 -0
- package/build/components/category-selector.js +16 -31
- package/build/components/category-selector.js.map +1 -1
- package/build/components/create-pattern-modal.js +59 -14
- package/build/components/create-pattern-modal.js.map +1 -1
- package/build/components/duplicate-pattern-modal.js +81 -0
- package/build/components/duplicate-pattern-modal.js.map +1 -0
- package/build/components/rename-pattern-category-modal.js +106 -0
- package/build/components/rename-pattern-category-modal.js.map +1 -0
- package/build/components/rename-pattern-modal.js +97 -0
- package/build/components/rename-pattern-modal.js.map +1 -0
- package/build/lock-unlock.js +1 -1
- package/build/lock-unlock.js.map +1 -1
- package/build/private-apis.js +6 -0
- package/build/private-apis.js.map +1 -1
- package/build-module/components/category-selector.js +17 -32
- package/build-module/components/category-selector.js.map +1 -1
- package/build-module/components/create-pattern-modal.js +61 -16
- package/build-module/components/create-pattern-modal.js.map +1 -1
- package/build-module/components/duplicate-pattern-modal.js +73 -0
- package/build-module/components/duplicate-pattern-modal.js.map +1 -0
- package/build-module/components/rename-pattern-category-modal.js +99 -0
- package/build-module/components/rename-pattern-category-modal.js.map +1 -0
- package/build-module/components/rename-pattern-modal.js +90 -0
- package/build-module/components/rename-pattern-modal.js.map +1 -0
- package/build-module/lock-unlock.js +1 -1
- package/build-module/lock-unlock.js.map +1 -1
- package/build-module/private-apis.js +6 -0
- package/build-module/private-apis.js.map +1 -1
- package/build-style/style-rtl.css +22 -2
- package/build-style/style.css +22 -2
- package/package.json +16 -17
- package/src/components/category-selector.js +28 -42
- package/src/components/create-pattern-modal.js +63 -14
- package/src/components/duplicate-pattern-modal.js +93 -0
- package/src/components/rename-pattern-category-modal.js +121 -0
- package/src/components/rename-pattern-modal.js +115 -0
- package/src/components/style.scss +28 -2
- package/src/lock-unlock.js +1 -1
- package/src/private-apis.js +6 -0
package/build/lock-unlock.js
CHANGED
|
@@ -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
|
|
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
|
package/build/lock-unlock.js.map
CHANGED
|
@@ -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
|
|
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"}
|
package/build/private-apis.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
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 (
|
|
44
|
-
|
|
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(
|
|
38
|
+
return createElement(FormTokenField, {
|
|
55
39
|
className: "patterns-menu-items__convert-modal-categories",
|
|
56
|
-
value:
|
|
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","
|
|
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
|
-
|
|
25
|
-
|
|
24
|
+
confirmLabel = __('Create'),
|
|
25
|
+
defaultCategories = [],
|
|
26
|
+
className = 'patterns-menu-items__convert-modal',
|
|
26
27
|
content,
|
|
28
|
+
modalTitle = __('Create pattern'),
|
|
27
29
|
onClose,
|
|
28
|
-
|
|
30
|
+
onError,
|
|
31
|
+
onSuccess,
|
|
32
|
+
defaultSyncType = PATTERN_SYNC_TYPES.full,
|
|
33
|
+
defaultTitle = ''
|
|
29
34
|
}) {
|
|
30
|
-
const [syncType, setSyncType] = useState(
|
|
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: '
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
},
|
|
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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"}
|