@wordpress/patterns 1.3.0 → 1.3.1

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.
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.CATEGORY_SLUG = void 0;
6
7
  exports.default = CategorySelector;
7
8
  var _element = require("@wordpress/element");
8
9
  var _i18n = require("@wordpress/i18n");
@@ -18,12 +19,6 @@ var _htmlEntities = require("@wordpress/html-entities");
18
19
  const unescapeString = arg => {
19
20
  return (0, _htmlEntities.decodeEntities)(arg);
20
21
  };
21
- const unescapeTerm = term => {
22
- return {
23
- ...term,
24
- name: unescapeString(term.name)
25
- };
26
- };
27
22
  const EMPTY_ARRAY = [];
28
23
  const MAX_TERMS_SUGGESTIONS = 20;
29
24
  const DEFAULT_QUERY = {
@@ -31,16 +26,14 @@ const DEFAULT_QUERY = {
31
26
  _fields: 'id,name',
32
27
  context: 'view'
33
28
  };
34
- const slug = 'wp_pattern_category';
29
+ const CATEGORY_SLUG = 'wp_pattern_category';
30
+ exports.CATEGORY_SLUG = CATEGORY_SLUG;
35
31
  function CategorySelector({
36
- onCategorySelection
32
+ values,
33
+ onChange
37
34
  }) {
38
- const [values, setValues] = (0, _element.useState)([]);
39
35
  const [search, setSearch] = (0, _element.useState)('');
40
36
  const debouncedSearch = (0, _compose.useDebounce)(setSearch, 500);
41
- const {
42
- invalidateResolution
43
- } = (0, _data.useDispatch)(_coreData.store);
44
37
  const {
45
38
  searchResults
46
39
  } = (0, _data.useSelect)(select => {
@@ -48,7 +41,7 @@ function CategorySelector({
48
41
  getEntityRecords
49
42
  } = select(_coreData.store);
50
43
  return {
51
- searchResults: !!search ? getEntityRecords('taxonomy', slug, {
44
+ searchResults: !!search ? getEntityRecords('taxonomy', CATEGORY_SLUG, {
52
45
  ...DEFAULT_QUERY,
53
46
  search
54
47
  }) : EMPTY_ARRAY
@@ -57,45 +50,20 @@ function CategorySelector({
57
50
  const suggestions = (0, _element.useMemo)(() => {
58
51
  return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name));
59
52
  }, [searchResults]);
60
- const {
61
- saveEntityRecord
62
- } = (0, _data.useDispatch)(_coreData.store);
63
- async function findOrCreateTerm(term) {
64
- try {
65
- const newTerm = await saveEntityRecord('taxonomy', slug, term, {
66
- throwOnError: true
67
- });
68
- invalidateResolution('getUserPatternCategories');
69
- return unescapeTerm(newTerm);
70
- } catch (error) {
71
- if (error.code !== 'term_exists') {
72
- throw error;
73
- }
74
- return {
75
- id: error.data.term_id,
76
- name: term.name
77
- };
78
- }
79
- }
80
- function onChange(termNames) {
53
+ function handleChange(termNames) {
81
54
  const uniqueTerms = termNames.reduce((terms, newTerm) => {
82
55
  if (!terms.some(term => term.toLowerCase() === newTerm.toLowerCase())) {
83
56
  terms.push(newTerm);
84
57
  }
85
58
  return terms;
86
59
  }, []);
87
- setValues(uniqueTerms);
88
- Promise.all(uniqueTerms.map(termName => findOrCreateTerm({
89
- name: termName
90
- }))).then(newTerms => {
91
- onCategorySelection(newTerms);
92
- });
60
+ onChange(uniqueTerms);
93
61
  }
94
62
  return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.FormTokenField, {
95
63
  className: "patterns-menu-items__convert-modal-categories",
96
64
  value: values,
97
65
  suggestions: suggestions,
98
- onChange: onChange,
66
+ onChange: handleChange,
99
67
  onInputChange: debouncedSearch,
100
68
  maxSuggestions: MAX_TERMS_SUGGESTIONS,
101
69
  label: (0, _i18n.__)('Categories'),
@@ -1 +1 @@
1
- {"version":3,"names":["_element","require","_i18n","_components","_data","_coreData","_compose","_htmlEntities","unescapeString","arg","decodeEntities","unescapeTerm","term","name","EMPTY_ARRAY","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","_fields","context","slug","CategorySelector","onCategorySelection","values","setValues","useState","search","setSearch","debouncedSearch","useDebounce","invalidateResolution","useDispatch","coreStore","searchResults","useSelect","select","getEntityRecords","suggestions","useMemo","map","saveEntityRecord","findOrCreateTerm","newTerm","throwOnError","error","code","id","data","term_id","onChange","termNames","uniqueTerms","reduce","terms","some","toLowerCase","push","Promise","all","termName","then","newTerms","createElement","Fragment","FormTokenField","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, useDispatch } 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 unescapeTerm = ( term ) => {\n\treturn {\n\t\t...term,\n\t\tname: unescapeString( term.name ),\n\t};\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};\nconst slug = 'wp_pattern_category';\n\nexport default function CategorySelector( { onCategorySelection } ) {\n\tconst [ values, setValues ] = useState( [] );\n\tconst [ search, setSearch ] = useState( '' );\n\tconst debouncedSearch = useDebounce( setSearch, 500 );\n\tconst { invalidateResolution } = useDispatch( coreStore );\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', 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\tconst { saveEntityRecord } = useDispatch( coreStore );\n\n\tasync function findOrCreateTerm( term ) {\n\t\ttry {\n\t\t\tconst newTerm = await saveEntityRecord( 'taxonomy', slug, term, {\n\t\t\t\tthrowOnError: true,\n\t\t\t} );\n\t\t\tinvalidateResolution( 'getUserPatternCategories' );\n\t\t\treturn unescapeTerm( newTerm );\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 {\n\t\t\t\tid: error.data.term_id,\n\t\t\t\tname: term.name,\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction onChange( 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\tsetValues( uniqueTerms );\n\n\t\tPromise.all(\n\t\t\tuniqueTerms.map( ( termName ) =>\n\t\t\t\tfindOrCreateTerm( { name: termName } )\n\t\t\t)\n\t\t).then( ( newTerms ) => {\n\t\t\tonCategorySelection( newTerms );\n\t\t} );\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={ onChange }\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":"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"}
1
+ {"version":3,"names":["_element","require","_i18n","_components","_data","_coreData","_compose","_htmlEntities","unescapeString","arg","decodeEntities","EMPTY_ARRAY","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","_fields","context","CATEGORY_SLUG","exports","CategorySelector","values","onChange","search","setSearch","useState","debouncedSearch","useDebounce","searchResults","useSelect","select","getEntityRecords","coreStore","suggestions","useMemo","map","term","name","handleChange","termNames","uniqueTerms","reduce","terms","newTerm","some","toLowerCase","push","createElement","Fragment","FormTokenField","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":";;;;;;;AAIA,IAAAA,QAAA,GAAAC,OAAA;AADA,IAAAC,KAAA,GAAAD,OAAA;AAEA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AATA;AACA;AACA;;AASA,MAAMO,cAAc,GAAKC,GAAG,IAAM;EACjC,OAAO,IAAAC,4BAAc,EAAED,GAAI,CAAC;AAC7B,CAAC;AAED,MAAME,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;AACM,MAAMC,aAAa,GAAG,qBAAqB;AAACC,OAAA,CAAAD,aAAA,GAAAA,aAAA;AAEpC,SAASE,gBAAgBA,CAAE;EAAEC,MAAM;EAAEC;AAAS,CAAC,EAAG;EAChE,MAAM,CAAEC,MAAM,EAAEC,SAAS,CAAE,GAAG,IAAAC,iBAAQ,EAAE,EAAG,CAAC;EAC5C,MAAMC,eAAe,GAAG,IAAAC,oBAAW,EAAEH,SAAS,EAAE,GAAI,CAAC;EAErD,MAAM;IAAEI;EAAc,CAAC,GAAG,IAAAC,eAAS,EAChCC,MAAM,IAAM;IACb,MAAM;MAAEC;IAAiB,CAAC,GAAGD,MAAM,CAAEE,eAAU,CAAC;IAEhD,OAAO;MACNJ,aAAa,EAAE,CAAC,CAAEL,MAAM,GACrBQ,gBAAgB,CAAE,UAAU,EAAEb,aAAa,EAAE;QAC7C,GAAGJ,aAAa;QAChBS;MACA,CAAE,CAAC,GACHX;IACJ,CAAC;EACF,CAAC,EACD,CAAEW,MAAM,CACT,CAAC;EAED,MAAMU,WAAW,GAAG,IAAAC,gBAAO,EAAE,MAAM;IAClC,OAAO,CAAEN,aAAa,aAAbA,aAAa,cAAbA,aAAa,GAAI,EAAE,EAAGO,GAAG,CAAIC,IAAI,IACzC3B,cAAc,CAAE2B,IAAI,CAACC,IAAK,CAC3B,CAAC;EACF,CAAC,EAAE,CAAET,aAAa,CAAG,CAAC;EAEtB,SAASU,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;IAEPpB,QAAQ,CAAEkB,WAAY,CAAC;EACxB;EAEA,OACC,IAAAvC,QAAA,CAAA8C,aAAA,EAAA9C,QAAA,CAAA+C,QAAA,QACC,IAAA/C,QAAA,CAAA8C,aAAA,EAAC3C,WAAA,CAAA6C,cAAc;IACdC,SAAS,EAAC,+CAA+C;IACzDC,KAAK,EAAG9B,MAAQ;IAChBY,WAAW,EAAGA,WAAa;IAC3BX,QAAQ,EAAGgB,YAAc;IACzBc,aAAa,EAAG1B,eAAiB;IACjC2B,cAAc,EAAGxC,qBAAuB;IACxCyC,KAAK,EAAG,IAAAC,QAAE,EAAE,YAAa,CAAG;IAC5BC,cAAc,EAAG;EAAM,CACvB,CACA,CAAC;AAEL"}
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -10,10 +9,13 @@ var _components = require("@wordpress/components");
10
9
  var _i18n = require("@wordpress/i18n");
11
10
  var _data = require("@wordpress/data");
12
11
  var _notices = require("@wordpress/notices");
12
+ var _coreData = require("@wordpress/core-data");
13
13
  var _constants = require("../constants");
14
14
  var _store = require("../store");
15
- var _categorySelector = _interopRequireDefault(require("./category-selector"));
15
+ var _categorySelector = _interopRequireWildcard(require("./category-selector"));
16
16
  var _lockUnlock = require("../lock-unlock");
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
19
  /**
18
20
  * WordPress dependencies
19
21
  */
@@ -34,16 +36,26 @@ function CreatePatternModal({
34
36
  className = 'patterns-menu-items__convert-modal'
35
37
  }) {
36
38
  const [syncType, setSyncType] = (0, _element.useState)(_constants.PATTERN_SYNC_TYPES.full);
37
- const [categories, setCategories] = (0, _element.useState)([]);
39
+ const [categoryTerms, setCategoryTerms] = (0, _element.useState)([]);
38
40
  const [title, setTitle] = (0, _element.useState)('');
41
+ const [isSaving, setIsSaving] = (0, _element.useState)(false);
39
42
  const {
40
43
  createPattern
41
44
  } = (0, _lockUnlock.unlock)((0, _data.useDispatch)(_store.store));
45
+ const {
46
+ saveEntityRecord,
47
+ invalidateResolution
48
+ } = (0, _data.useDispatch)(_coreData.store);
42
49
  const {
43
50
  createErrorNotice
44
51
  } = (0, _data.useDispatch)(_notices.store);
45
52
  async function onCreate(patternTitle, sync) {
53
+ if (!title || isSaving) {
54
+ return;
55
+ }
46
56
  try {
57
+ setIsSaving(true);
58
+ const categories = await Promise.all(categoryTerms.map(termName => findOrCreateTerm(termName)));
47
59
  const newPattern = await createPattern(patternTitle, sync, typeof content === 'function' ? content() : content, categories);
48
60
  onSuccess({
49
61
  pattern: newPattern,
@@ -55,11 +67,33 @@ function CreatePatternModal({
55
67
  id: 'convert-to-pattern-error'
56
68
  });
57
69
  onError();
70
+ } finally {
71
+ setIsSaving(false);
72
+ setCategoryTerms([]);
73
+ setTitle('');
74
+ }
75
+ }
76
+
77
+ /**
78
+ * @param {string} term
79
+ * @return {Promise<number>} The pattern category id.
80
+ */
81
+ async function findOrCreateTerm(term) {
82
+ try {
83
+ const newTerm = await saveEntityRecord('taxonomy', _categorySelector.CATEGORY_SLUG, {
84
+ name: term
85
+ }, {
86
+ throwOnError: true
87
+ });
88
+ invalidateResolution('getUserPatternCategories');
89
+ return newTerm.id;
90
+ } catch (error) {
91
+ if (error.code !== 'term_exists') {
92
+ throw error;
93
+ }
94
+ return error.data.term_id;
58
95
  }
59
96
  }
60
- const handleCategorySelection = selectedCategories => {
61
- setCategories(selectedCategories.map(cat => cat.id));
62
- };
63
97
  return (0, _element.createElement)(_components.Modal, {
64
98
  title: (0, _i18n.__)('Create pattern'),
65
99
  onRequestClose: () => {
@@ -71,7 +105,6 @@ function CreatePatternModal({
71
105
  onSubmit: event => {
72
106
  event.preventDefault();
73
107
  onCreate(title, syncType);
74
- setTitle('');
75
108
  }
76
109
  }, (0, _element.createElement)(_components.__experimentalVStack, {
77
110
  spacing: "5"
@@ -83,7 +116,8 @@ function CreatePatternModal({
83
116
  placeholder: (0, _i18n.__)('My pattern'),
84
117
  className: "patterns-create-modal__name-input"
85
118
  }), (0, _element.createElement)(_categorySelector.default, {
86
- onCategorySelection: handleCategorySelection
119
+ values: categoryTerms,
120
+ onChange: setCategoryTerms
87
121
  }), (0, _element.createElement)(_components.ToggleControl, {
88
122
  label: (0, _i18n.__)('Synced'),
89
123
  help: (0, _i18n.__)('Editing the pattern will update it anywhere it is used.'),
@@ -101,7 +135,9 @@ function CreatePatternModal({
101
135
  }
102
136
  }, (0, _i18n.__)('Cancel')), (0, _element.createElement)(_components.Button, {
103
137
  variant: "primary",
104
- type: "submit"
138
+ type: "submit",
139
+ "aria-disabled": !title || isSaving,
140
+ isBusy: isSaving
105
141
  }, (0, _i18n.__)('Create'))))));
106
142
  }
107
143
  //# sourceMappingURL=create-pattern-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_element","require","_components","_i18n","_data","_notices","_constants","_store","_categorySelector","_interopRequireDefault","_lockUnlock","CreatePatternModal","onSuccess","onError","content","onClose","className","syncType","setSyncType","useState","PATTERN_SYNC_TYPES","full","categories","setCategories","title","setTitle","createPattern","unlock","useDispatch","patternsStore","createErrorNotice","noticesStore","onCreate","patternTitle","sync","newPattern","pattern","categoryId","PATTERN_DEFAULT_CATEGORY","error","message","type","id","handleCategorySelection","selectedCategories","map","cat","createElement","Modal","__","onRequestClose","overlayClassName","onSubmit","event","preventDefault","__experimentalVStack","spacing","TextControl","__nextHasNoMarginBottom","label","value","onChange","placeholder","default","onCategorySelection","ToggleControl","help","checked","unsynced","__experimentalHStack","justify","Button","variant","onClick"],"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';\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 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 [ categories, setCategories ] = useState( [] );\n\tconst [ title, setTitle ] = useState( '' );\n\tconst { createPattern } = unlock( useDispatch( patternsStore ) );\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tasync function onCreate( patternTitle, sync ) {\n\t\ttry {\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}\n\t}\n\n\tconst handleCategorySelection = ( selectedCategories ) => {\n\t\tsetCategories( selectedCategories.map( ( cat ) => cat.id ) );\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\tsetTitle( '' );\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\tonCategorySelection={ handleCategorySelection }\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 variant=\"primary\" type=\"submit\">\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":["_element","require","_components","_i18n","_data","_notices","_coreData","_constants","_store","_categorySelector","_interopRequireWildcard","_lockUnlock","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CreatePatternModal","onSuccess","onError","content","onClose","className","syncType","setSyncType","useState","PATTERN_SYNC_TYPES","full","categoryTerms","setCategoryTerms","title","setTitle","isSaving","setIsSaving","createPattern","unlock","useDispatch","patternsStore","saveEntityRecord","invalidateResolution","coreStore","createErrorNotice","noticesStore","onCreate","patternTitle","sync","categories","Promise","all","map","termName","findOrCreateTerm","newPattern","pattern","categoryId","PATTERN_DEFAULT_CATEGORY","error","message","type","id","term","newTerm","CATEGORY_SLUG","name","throwOnError","code","data","term_id","createElement","Modal","__","onRequestClose","overlayClassName","onSubmit","event","preventDefault","__experimentalVStack","spacing","TextControl","__nextHasNoMarginBottom","label","value","onChange","placeholder","values","ToggleControl","help","checked","unsynced","__experimentalHStack","justify","Button","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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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PATTERN_TYPES = exports.PATTERN_SYNC_TYPES = exports.PATTERN_DEFAULT_CATEGORY = exports.PATTERN_CORE_SOURCES = void 0;
6
+ exports.PATTERN_USER_CATEGORY = exports.PATTERN_TYPES = exports.PATTERN_SYNC_TYPES = exports.PATTERN_DEFAULT_CATEGORY = exports.PATTERN_CORE_SOURCES = void 0;
7
7
  const PATTERN_TYPES = {
8
8
  theme: 'pattern',
9
9
  user: 'wp_block'
@@ -11,6 +11,8 @@ const PATTERN_TYPES = {
11
11
  exports.PATTERN_TYPES = PATTERN_TYPES;
12
12
  const PATTERN_DEFAULT_CATEGORY = 'all-patterns';
13
13
  exports.PATTERN_DEFAULT_CATEGORY = PATTERN_DEFAULT_CATEGORY;
14
+ const PATTERN_USER_CATEGORY = 'my-patterns';
15
+ exports.PATTERN_USER_CATEGORY = PATTERN_USER_CATEGORY;
14
16
  const PATTERN_CORE_SOURCES = ['core', 'pattern-directory/core', 'pattern-directory/featured', 'pattern-directory/theme'];
15
17
  exports.PATTERN_CORE_SOURCES = PATTERN_CORE_SOURCES;
16
18
  const PATTERN_SYNC_TYPES = {
@@ -1 +1 @@
1
- {"version":3,"names":["PATTERN_TYPES","theme","user","exports","PATTERN_DEFAULT_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","full","unsynced"],"sources":["@wordpress/patterns/src/constants.js"],"sourcesContent":["export const PATTERN_TYPES = {\n\ttheme: 'pattern',\n\tuser: 'wp_block',\n};\n\nexport const PATTERN_DEFAULT_CATEGORY = 'all-patterns';\nexport const PATTERN_CORE_SOURCES = [\n\t'core',\n\t'pattern-directory/core',\n\t'pattern-directory/featured',\n\t'pattern-directory/theme',\n];\nexport const PATTERN_SYNC_TYPES = {\n\tfull: 'fully',\n\tunsynced: 'unsynced',\n};\n"],"mappings":";;;;;;AAAO,MAAMA,aAAa,GAAG;EAC5BC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE;AACP,CAAC;AAACC,OAAA,CAAAH,aAAA,GAAAA,aAAA;AAEK,MAAMI,wBAAwB,GAAG,cAAc;AAACD,OAAA,CAAAC,wBAAA,GAAAA,wBAAA;AAChD,MAAMC,oBAAoB,GAAG,CACnC,MAAM,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,CACzB;AAACF,OAAA,CAAAE,oBAAA,GAAAA,oBAAA;AACK,MAAMC,kBAAkB,GAAG;EACjCC,IAAI,EAAE,OAAO;EACbC,QAAQ,EAAE;AACX,CAAC;AAACL,OAAA,CAAAG,kBAAA,GAAAA,kBAAA"}
1
+ {"version":3,"names":["PATTERN_TYPES","theme","user","exports","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","full","unsynced"],"sources":["@wordpress/patterns/src/constants.js"],"sourcesContent":["export const PATTERN_TYPES = {\n\ttheme: 'pattern',\n\tuser: 'wp_block',\n};\n\nexport const PATTERN_DEFAULT_CATEGORY = 'all-patterns';\nexport const PATTERN_USER_CATEGORY = 'my-patterns';\nexport const PATTERN_CORE_SOURCES = [\n\t'core',\n\t'pattern-directory/core',\n\t'pattern-directory/featured',\n\t'pattern-directory/theme',\n];\nexport const PATTERN_SYNC_TYPES = {\n\tfull: 'fully',\n\tunsynced: 'unsynced',\n};\n"],"mappings":";;;;;;AAAO,MAAMA,aAAa,GAAG;EAC5BC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE;AACP,CAAC;AAACC,OAAA,CAAAH,aAAA,GAAAA,aAAA;AAEK,MAAMI,wBAAwB,GAAG,cAAc;AAACD,OAAA,CAAAC,wBAAA,GAAAA,wBAAA;AAChD,MAAMC,qBAAqB,GAAG,aAAa;AAACF,OAAA,CAAAE,qBAAA,GAAAA,qBAAA;AAC5C,MAAMC,oBAAoB,GAAG,CACnC,MAAM,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,CACzB;AAACH,OAAA,CAAAG,oBAAA,GAAAA,oBAAA;AACK,MAAMC,kBAAkB,GAAG;EACjCC,IAAI,EAAE,OAAO;EACbC,QAAQ,EAAE;AACX,CAAC;AAACN,OAAA,CAAAI,kBAAA,GAAAA,kBAAA"}
@@ -20,6 +20,7 @@ exports.privateApis = privateApis;
20
20
  PatternsMenuItems: _components.default,
21
21
  PATTERN_TYPES: _constants.PATTERN_TYPES,
22
22
  PATTERN_DEFAULT_CATEGORY: _constants.PATTERN_DEFAULT_CATEGORY,
23
+ PATTERN_USER_CATEGORY: _constants.PATTERN_USER_CATEGORY,
23
24
  PATTERN_CORE_SOURCES: _constants.PATTERN_CORE_SOURCES,
24
25
  PATTERN_SYNC_TYPES: _constants.PATTERN_SYNC_TYPES
25
26
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_lockUnlock","require","_createPatternModal","_interopRequireDefault","_components","_constants","privateApis","exports","lock","CreatePatternModal","PatternsMenuItems","PATTERN_TYPES","PATTERN_DEFAULT_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_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_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;;AAWO,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,oBAAoB,EAApBA,+BAAoB;EACpBC,kBAAkB,EAAlBA;AACD,CAAE,CAAC"}
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"}
@@ -5,19 +5,13 @@ import { createElement, Fragment } from "@wordpress/element";
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { useMemo, useState } from '@wordpress/element';
7
7
  import { FormTokenField } from '@wordpress/components';
8
- import { useSelect, useDispatch } from '@wordpress/data';
8
+ import { useSelect } from '@wordpress/data';
9
9
  import { store as coreStore } from '@wordpress/core-data';
10
10
  import { useDebounce } from '@wordpress/compose';
11
11
  import { decodeEntities } from '@wordpress/html-entities';
12
12
  const unescapeString = arg => {
13
13
  return decodeEntities(arg);
14
14
  };
15
- const unescapeTerm = term => {
16
- return {
17
- ...term,
18
- name: unescapeString(term.name)
19
- };
20
- };
21
15
  const EMPTY_ARRAY = [];
22
16
  const MAX_TERMS_SUGGESTIONS = 20;
23
17
  const DEFAULT_QUERY = {
@@ -25,16 +19,13 @@ const DEFAULT_QUERY = {
25
19
  _fields: 'id,name',
26
20
  context: 'view'
27
21
  };
28
- const slug = 'wp_pattern_category';
22
+ export const CATEGORY_SLUG = 'wp_pattern_category';
29
23
  export default function CategorySelector({
30
- onCategorySelection
24
+ values,
25
+ onChange
31
26
  }) {
32
- const [values, setValues] = useState([]);
33
27
  const [search, setSearch] = useState('');
34
28
  const debouncedSearch = useDebounce(setSearch, 500);
35
- const {
36
- invalidateResolution
37
- } = useDispatch(coreStore);
38
29
  const {
39
30
  searchResults
40
31
  } = useSelect(select => {
@@ -42,7 +33,7 @@ export default function CategorySelector({
42
33
  getEntityRecords
43
34
  } = select(coreStore);
44
35
  return {
45
- searchResults: !!search ? getEntityRecords('taxonomy', slug, {
36
+ searchResults: !!search ? getEntityRecords('taxonomy', CATEGORY_SLUG, {
46
37
  ...DEFAULT_QUERY,
47
38
  search
48
39
  }) : EMPTY_ARRAY
@@ -51,45 +42,20 @@ export default function CategorySelector({
51
42
  const suggestions = useMemo(() => {
52
43
  return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name));
53
44
  }, [searchResults]);
54
- const {
55
- saveEntityRecord
56
- } = useDispatch(coreStore);
57
- async function findOrCreateTerm(term) {
58
- try {
59
- const newTerm = await saveEntityRecord('taxonomy', slug, term, {
60
- throwOnError: true
61
- });
62
- invalidateResolution('getUserPatternCategories');
63
- return unescapeTerm(newTerm);
64
- } catch (error) {
65
- if (error.code !== 'term_exists') {
66
- throw error;
67
- }
68
- return {
69
- id: error.data.term_id,
70
- name: term.name
71
- };
72
- }
73
- }
74
- function onChange(termNames) {
45
+ function handleChange(termNames) {
75
46
  const uniqueTerms = termNames.reduce((terms, newTerm) => {
76
47
  if (!terms.some(term => term.toLowerCase() === newTerm.toLowerCase())) {
77
48
  terms.push(newTerm);
78
49
  }
79
50
  return terms;
80
51
  }, []);
81
- setValues(uniqueTerms);
82
- Promise.all(uniqueTerms.map(termName => findOrCreateTerm({
83
- name: termName
84
- }))).then(newTerms => {
85
- onCategorySelection(newTerms);
86
- });
52
+ onChange(uniqueTerms);
87
53
  }
88
54
  return createElement(Fragment, null, createElement(FormTokenField, {
89
55
  className: "patterns-menu-items__convert-modal-categories",
90
56
  value: values,
91
57
  suggestions: suggestions,
92
- onChange: onChange,
58
+ onChange: handleChange,
93
59
  onInputChange: debouncedSearch,
94
60
  maxSuggestions: MAX_TERMS_SUGGESTIONS,
95
61
  label: __('Categories'),
@@ -1 +1 @@
1
- {"version":3,"names":["__","useMemo","useState","FormTokenField","useSelect","useDispatch","store","coreStore","useDebounce","decodeEntities","unescapeString","arg","unescapeTerm","term","name","EMPTY_ARRAY","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","_fields","context","slug","CategorySelector","onCategorySelection","values","setValues","search","setSearch","debouncedSearch","invalidateResolution","searchResults","select","getEntityRecords","suggestions","map","saveEntityRecord","findOrCreateTerm","newTerm","throwOnError","error","code","id","data","term_id","onChange","termNames","uniqueTerms","reduce","terms","some","toLowerCase","push","Promise","all","termName","then","newTerms","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, useDispatch } 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 unescapeTerm = ( term ) => {\n\treturn {\n\t\t...term,\n\t\tname: unescapeString( term.name ),\n\t};\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};\nconst slug = 'wp_pattern_category';\n\nexport default function CategorySelector( { onCategorySelection } ) {\n\tconst [ values, setValues ] = useState( [] );\n\tconst [ search, setSearch ] = useState( '' );\n\tconst debouncedSearch = useDebounce( setSearch, 500 );\n\tconst { invalidateResolution } = useDispatch( coreStore );\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', 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\tconst { saveEntityRecord } = useDispatch( coreStore );\n\n\tasync function findOrCreateTerm( term ) {\n\t\ttry {\n\t\t\tconst newTerm = await saveEntityRecord( 'taxonomy', slug, term, {\n\t\t\t\tthrowOnError: true,\n\t\t\t} );\n\t\t\tinvalidateResolution( 'getUserPatternCategories' );\n\t\t\treturn unescapeTerm( newTerm );\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 {\n\t\t\t\tid: error.data.term_id,\n\t\t\t\tname: term.name,\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction onChange( 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\tsetValues( uniqueTerms );\n\n\t\tPromise.all(\n\t\t\tuniqueTerms.map( ( termName ) =>\n\t\t\t\tfindOrCreateTerm( { name: termName } )\n\t\t\t)\n\t\t).then( ( newTerms ) => {\n\t\t\tonCategorySelection( newTerms );\n\t\t} );\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={ onChange }\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":"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"}
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"}
@@ -7,6 +7,7 @@ import { __ } from '@wordpress/i18n';
7
7
  import { useState } from '@wordpress/element';
8
8
  import { useDispatch } from '@wordpress/data';
9
9
  import { store as noticesStore } from '@wordpress/notices';
10
+ import { store as coreStore } from '@wordpress/core-data';
10
11
 
11
12
  /**
12
13
  * Internal dependencies
@@ -17,7 +18,7 @@ import { PATTERN_DEFAULT_CATEGORY, PATTERN_SYNC_TYPES } from '../constants';
17
18
  * Internal dependencies
18
19
  */
19
20
  import { store as patternsStore } from '../store';
20
- import CategorySelector from './category-selector';
21
+ import CategorySelector, { CATEGORY_SLUG } from './category-selector';
21
22
  import { unlock } from '../lock-unlock';
22
23
  export default function CreatePatternModal({
23
24
  onSuccess,
@@ -27,16 +28,26 @@ export default function CreatePatternModal({
27
28
  className = 'patterns-menu-items__convert-modal'
28
29
  }) {
29
30
  const [syncType, setSyncType] = useState(PATTERN_SYNC_TYPES.full);
30
- const [categories, setCategories] = useState([]);
31
+ const [categoryTerms, setCategoryTerms] = useState([]);
31
32
  const [title, setTitle] = useState('');
33
+ const [isSaving, setIsSaving] = useState(false);
32
34
  const {
33
35
  createPattern
34
36
  } = unlock(useDispatch(patternsStore));
37
+ const {
38
+ saveEntityRecord,
39
+ invalidateResolution
40
+ } = useDispatch(coreStore);
35
41
  const {
36
42
  createErrorNotice
37
43
  } = useDispatch(noticesStore);
38
44
  async function onCreate(patternTitle, sync) {
45
+ if (!title || isSaving) {
46
+ return;
47
+ }
39
48
  try {
49
+ setIsSaving(true);
50
+ const categories = await Promise.all(categoryTerms.map(termName => findOrCreateTerm(termName)));
40
51
  const newPattern = await createPattern(patternTitle, sync, typeof content === 'function' ? content() : content, categories);
41
52
  onSuccess({
42
53
  pattern: newPattern,
@@ -48,11 +59,33 @@ export default function CreatePatternModal({
48
59
  id: 'convert-to-pattern-error'
49
60
  });
50
61
  onError();
62
+ } finally {
63
+ setIsSaving(false);
64
+ setCategoryTerms([]);
65
+ setTitle('');
66
+ }
67
+ }
68
+
69
+ /**
70
+ * @param {string} term
71
+ * @return {Promise<number>} The pattern category id.
72
+ */
73
+ async function findOrCreateTerm(term) {
74
+ try {
75
+ const newTerm = await saveEntityRecord('taxonomy', CATEGORY_SLUG, {
76
+ name: term
77
+ }, {
78
+ throwOnError: true
79
+ });
80
+ invalidateResolution('getUserPatternCategories');
81
+ return newTerm.id;
82
+ } catch (error) {
83
+ if (error.code !== 'term_exists') {
84
+ throw error;
85
+ }
86
+ return error.data.term_id;
51
87
  }
52
88
  }
53
- const handleCategorySelection = selectedCategories => {
54
- setCategories(selectedCategories.map(cat => cat.id));
55
- };
56
89
  return createElement(Modal, {
57
90
  title: __('Create pattern'),
58
91
  onRequestClose: () => {
@@ -64,7 +97,6 @@ export default function CreatePatternModal({
64
97
  onSubmit: event => {
65
98
  event.preventDefault();
66
99
  onCreate(title, syncType);
67
- setTitle('');
68
100
  }
69
101
  }, createElement(VStack, {
70
102
  spacing: "5"
@@ -76,7 +108,8 @@ export default function CreatePatternModal({
76
108
  placeholder: __('My pattern'),
77
109
  className: "patterns-create-modal__name-input"
78
110
  }), createElement(CategorySelector, {
79
- onCategorySelection: handleCategorySelection
111
+ values: categoryTerms,
112
+ onChange: setCategoryTerms
80
113
  }), createElement(ToggleControl, {
81
114
  label: __('Synced'),
82
115
  help: __('Editing the pattern will update it anywhere it is used.'),
@@ -94,7 +127,9 @@ export default function CreatePatternModal({
94
127
  }
95
128
  }, __('Cancel')), createElement(Button, {
96
129
  variant: "primary",
97
- type: "submit"
130
+ type: "submit",
131
+ "aria-disabled": !title || isSaving,
132
+ isBusy: isSaving
98
133
  }, __('Create'))))));
99
134
  }
100
135
  //# sourceMappingURL=create-pattern-modal.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Modal","Button","TextControl","__experimentalHStack","HStack","__experimentalVStack","VStack","ToggleControl","__","useState","useDispatch","store","noticesStore","PATTERN_DEFAULT_CATEGORY","PATTERN_SYNC_TYPES","patternsStore","CategorySelector","unlock","CreatePatternModal","onSuccess","onError","content","onClose","className","syncType","setSyncType","full","categories","setCategories","title","setTitle","createPattern","createErrorNotice","onCreate","patternTitle","sync","newPattern","pattern","categoryId","error","message","type","id","handleCategorySelection","selectedCategories","map","cat","createElement","onRequestClose","overlayClassName","onSubmit","event","preventDefault","spacing","__nextHasNoMarginBottom","label","value","onChange","placeholder","onCategorySelection","help","checked","unsynced","justify","variant","onClick"],"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';\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 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 [ categories, setCategories ] = useState( [] );\n\tconst [ title, setTitle ] = useState( '' );\n\tconst { createPattern } = unlock( useDispatch( patternsStore ) );\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tasync function onCreate( patternTitle, sync ) {\n\t\ttry {\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}\n\t}\n\n\tconst handleCategorySelection = ( selectedCategories ) => {\n\t\tsetCategories( selectedCategories.map( ( cat ) => cat.id ) );\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\tsetTitle( '' );\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\tonCategorySelection={ handleCategorySelection }\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 variant=\"primary\" type=\"submit\">\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","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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"}
@@ -3,6 +3,7 @@ export const PATTERN_TYPES = {
3
3
  user: 'wp_block'
4
4
  };
5
5
  export const PATTERN_DEFAULT_CATEGORY = 'all-patterns';
6
+ export const PATTERN_USER_CATEGORY = 'my-patterns';
6
7
  export const PATTERN_CORE_SOURCES = ['core', 'pattern-directory/core', 'pattern-directory/featured', 'pattern-directory/theme'];
7
8
  export const PATTERN_SYNC_TYPES = {
8
9
  full: 'fully',
@@ -1 +1 @@
1
- {"version":3,"names":["PATTERN_TYPES","theme","user","PATTERN_DEFAULT_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","full","unsynced"],"sources":["@wordpress/patterns/src/constants.js"],"sourcesContent":["export const PATTERN_TYPES = {\n\ttheme: 'pattern',\n\tuser: 'wp_block',\n};\n\nexport const PATTERN_DEFAULT_CATEGORY = 'all-patterns';\nexport const PATTERN_CORE_SOURCES = [\n\t'core',\n\t'pattern-directory/core',\n\t'pattern-directory/featured',\n\t'pattern-directory/theme',\n];\nexport const PATTERN_SYNC_TYPES = {\n\tfull: 'fully',\n\tunsynced: 'unsynced',\n};\n"],"mappings":"AAAA,OAAO,MAAMA,aAAa,GAAG;EAC5BC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE;AACP,CAAC;AAED,OAAO,MAAMC,wBAAwB,GAAG,cAAc;AACtD,OAAO,MAAMC,oBAAoB,GAAG,CACnC,MAAM,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,CACzB;AACD,OAAO,MAAMC,kBAAkB,GAAG;EACjCC,IAAI,EAAE,OAAO;EACbC,QAAQ,EAAE;AACX,CAAC"}
1
+ {"version":3,"names":["PATTERN_TYPES","theme","user","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","full","unsynced"],"sources":["@wordpress/patterns/src/constants.js"],"sourcesContent":["export const PATTERN_TYPES = {\n\ttheme: 'pattern',\n\tuser: 'wp_block',\n};\n\nexport const PATTERN_DEFAULT_CATEGORY = 'all-patterns';\nexport const PATTERN_USER_CATEGORY = 'my-patterns';\nexport const PATTERN_CORE_SOURCES = [\n\t'core',\n\t'pattern-directory/core',\n\t'pattern-directory/featured',\n\t'pattern-directory/theme',\n];\nexport const PATTERN_SYNC_TYPES = {\n\tfull: 'fully',\n\tunsynced: 'unsynced',\n};\n"],"mappings":"AAAA,OAAO,MAAMA,aAAa,GAAG;EAC5BC,KAAK,EAAE,SAAS;EAChBC,IAAI,EAAE;AACP,CAAC;AAED,OAAO,MAAMC,wBAAwB,GAAG,cAAc;AACtD,OAAO,MAAMC,qBAAqB,GAAG,aAAa;AAClD,OAAO,MAAMC,oBAAoB,GAAG,CACnC,MAAM,EACN,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,CACzB;AACD,OAAO,MAAMC,kBAAkB,GAAG;EACjCC,IAAI,EAAE,OAAO;EACbC,QAAQ,EAAE;AACX,CAAC"}
@@ -4,13 +4,14 @@
4
4
  import { lock } from './lock-unlock';
5
5
  import CreatePatternModal from './components/create-pattern-modal';
6
6
  import PatternsMenuItems from './components';
7
- import { PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY, PATTERN_CORE_SOURCES, PATTERN_SYNC_TYPES } from './constants';
7
+ import { PATTERN_TYPES, PATTERN_DEFAULT_CATEGORY, PATTERN_USER_CATEGORY, PATTERN_CORE_SOURCES, PATTERN_SYNC_TYPES } from './constants';
8
8
  export const privateApis = {};
9
9
  lock(privateApis, {
10
10
  CreatePatternModal,
11
11
  PatternsMenuItems,
12
12
  PATTERN_TYPES,
13
13
  PATTERN_DEFAULT_CATEGORY,
14
+ PATTERN_USER_CATEGORY,
14
15
  PATTERN_CORE_SOURCES,
15
16
  PATTERN_SYNC_TYPES
16
17
  });
@@ -1 +1 @@
1
- {"version":3,"names":["lock","CreatePatternModal","PatternsMenuItems","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","privateApis"],"sources":["@wordpress/patterns/src/private-apis.js"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { lock } from './lock-unlock';\nimport CreatePatternModal from './components/create-pattern-modal';\nimport PatternsMenuItems from './components';\nimport {\n\tPATTERN_TYPES,\n\tPATTERN_DEFAULT_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_CORE_SOURCES,\n\tPATTERN_SYNC_TYPES,\n} );\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,IAAI,QAAQ,eAAe;AACpC,OAAOC,kBAAkB,MAAM,mCAAmC;AAClE,OAAOC,iBAAiB,MAAM,cAAc;AAC5C,SACCC,aAAa,EACbC,wBAAwB,EACxBC,oBAAoB,EACpBC,kBAAkB,QACZ,aAAa;AAEpB,OAAO,MAAMC,WAAW,GAAG,CAAC,CAAC;AAC7BP,IAAI,CAAEO,WAAW,EAAE;EAClBN,kBAAkB;EAClBC,iBAAiB;EACjBC,aAAa;EACbC,wBAAwB;EACxBC,oBAAoB;EACpBC;AACD,CAAE,CAAC"}
1
+ {"version":3,"names":["lock","CreatePatternModal","PatternsMenuItems","PATTERN_TYPES","PATTERN_DEFAULT_CATEGORY","PATTERN_USER_CATEGORY","PATTERN_CORE_SOURCES","PATTERN_SYNC_TYPES","privateApis"],"sources":["@wordpress/patterns/src/private-apis.js"],"sourcesContent":["/**\n * Internal dependencies\n */\nimport { lock } from './lock-unlock';\nimport CreatePatternModal from './components/create-pattern-modal';\nimport 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":"AAAA;AACA;AACA;AACA,SAASA,IAAI,QAAQ,eAAe;AACpC,OAAOC,kBAAkB,MAAM,mCAAmC;AAClE,OAAOC,iBAAiB,MAAM,cAAc;AAC5C,SACCC,aAAa,EACbC,wBAAwB,EACxBC,qBAAqB,EACrBC,oBAAoB,EACpBC,kBAAkB,QACZ,aAAa;AAEpB,OAAO,MAAMC,WAAW,GAAG,CAAC,CAAC;AAC7BR,IAAI,CAAEQ,WAAW,EAAE;EAClBP,kBAAkB;EAClBC,iBAAiB;EACjBC,aAAa;EACbC,wBAAwB;EACxBC,qBAAqB;EACrBC,oBAAoB;EACpBC;AACD,CAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/patterns",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Management of user pattern editing.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -32,19 +32,19 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@babel/runtime": "^7.16.0",
35
- "@wordpress/block-editor": "^12.10.0",
36
- "@wordpress/blocks": "^12.19.0",
37
- "@wordpress/components": "^25.8.0",
38
- "@wordpress/compose": "^6.19.0",
39
- "@wordpress/core-data": "^6.19.0",
40
- "@wordpress/data": "^9.12.0",
41
- "@wordpress/element": "^5.19.0",
42
- "@wordpress/html-entities": "^3.42.0",
43
- "@wordpress/i18n": "^4.42.0",
44
- "@wordpress/icons": "^9.33.0",
45
- "@wordpress/notices": "^4.10.0",
46
- "@wordpress/private-apis": "^0.24.0",
47
- "@wordpress/url": "^3.43.0"
35
+ "@wordpress/block-editor": "^12.10.1",
36
+ "@wordpress/blocks": "^12.19.1",
37
+ "@wordpress/components": "^25.8.1",
38
+ "@wordpress/compose": "^6.19.1",
39
+ "@wordpress/core-data": "^6.19.1",
40
+ "@wordpress/data": "^9.12.1",
41
+ "@wordpress/element": "^5.19.1",
42
+ "@wordpress/html-entities": "^3.42.1",
43
+ "@wordpress/i18n": "^4.42.1",
44
+ "@wordpress/icons": "^9.33.1",
45
+ "@wordpress/notices": "^4.10.1",
46
+ "@wordpress/private-apis": "^0.24.1",
47
+ "@wordpress/url": "^3.43.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "react": "^18.0.0",
@@ -53,5 +53,5 @@
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
- "gitHead": "cc35f517ed017ab7131319af3e87c359e8de175d"
56
+ "gitHead": "4987d16acb5c41b62704dc4f88225acb97ddd698"
57
57
  }
@@ -4,7 +4,7 @@
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { useMemo, useState } from '@wordpress/element';
6
6
  import { FormTokenField } from '@wordpress/components';
7
- import { useSelect, useDispatch } from '@wordpress/data';
7
+ import { useSelect } from '@wordpress/data';
8
8
  import { store as coreStore } from '@wordpress/core-data';
9
9
  import { useDebounce } from '@wordpress/compose';
10
10
  import { decodeEntities } from '@wordpress/html-entities';
@@ -13,13 +13,6 @@ const unescapeString = ( arg ) => {
13
13
  return decodeEntities( arg );
14
14
  };
15
15
 
16
- const unescapeTerm = ( term ) => {
17
- return {
18
- ...term,
19
- name: unescapeString( term.name ),
20
- };
21
- };
22
-
23
16
  const EMPTY_ARRAY = [];
24
17
  const MAX_TERMS_SUGGESTIONS = 20;
25
18
  const DEFAULT_QUERY = {
@@ -27,13 +20,11 @@ const DEFAULT_QUERY = {
27
20
  _fields: 'id,name',
28
21
  context: 'view',
29
22
  };
30
- const slug = 'wp_pattern_category';
23
+ export const CATEGORY_SLUG = 'wp_pattern_category';
31
24
 
32
- export default function CategorySelector( { onCategorySelection } ) {
33
- const [ values, setValues ] = useState( [] );
25
+ export default function CategorySelector( { values, onChange } ) {
34
26
  const [ search, setSearch ] = useState( '' );
35
27
  const debouncedSearch = useDebounce( setSearch, 500 );
36
- const { invalidateResolution } = useDispatch( coreStore );
37
28
 
38
29
  const { searchResults } = useSelect(
39
30
  ( select ) => {
@@ -41,7 +32,7 @@ export default function CategorySelector( { onCategorySelection } ) {
41
32
 
42
33
  return {
43
34
  searchResults: !! search
44
- ? getEntityRecords( 'taxonomy', slug, {
35
+ ? getEntityRecords( 'taxonomy', CATEGORY_SLUG, {
45
36
  ...DEFAULT_QUERY,
46
37
  search,
47
38
  } )
@@ -57,28 +48,7 @@ export default function CategorySelector( { onCategorySelection } ) {
57
48
  );
58
49
  }, [ searchResults ] );
59
50
 
60
- const { saveEntityRecord } = useDispatch( coreStore );
61
-
62
- async function findOrCreateTerm( term ) {
63
- try {
64
- const newTerm = await saveEntityRecord( 'taxonomy', slug, term, {
65
- throwOnError: true,
66
- } );
67
- invalidateResolution( 'getUserPatternCategories' );
68
- return unescapeTerm( newTerm );
69
- } catch ( error ) {
70
- if ( error.code !== 'term_exists' ) {
71
- throw error;
72
- }
73
-
74
- return {
75
- id: error.data.term_id,
76
- name: term.name,
77
- };
78
- }
79
- }
80
-
81
- function onChange( termNames ) {
51
+ function handleChange( termNames ) {
82
52
  const uniqueTerms = termNames.reduce( ( terms, newTerm ) => {
83
53
  if (
84
54
  ! terms.some(
@@ -90,15 +60,7 @@ export default function CategorySelector( { onCategorySelection } ) {
90
60
  return terms;
91
61
  }, [] );
92
62
 
93
- setValues( uniqueTerms );
94
-
95
- Promise.all(
96
- uniqueTerms.map( ( termName ) =>
97
- findOrCreateTerm( { name: termName } )
98
- )
99
- ).then( ( newTerms ) => {
100
- onCategorySelection( newTerms );
101
- } );
63
+ onChange( uniqueTerms );
102
64
  }
103
65
 
104
66
  return (
@@ -107,7 +69,7 @@ export default function CategorySelector( { onCategorySelection } ) {
107
69
  className="patterns-menu-items__convert-modal-categories"
108
70
  value={ values }
109
71
  suggestions={ suggestions }
110
- onChange={ onChange }
72
+ onChange={ handleChange }
111
73
  onInputChange={ debouncedSearch }
112
74
  maxSuggestions={ MAX_TERMS_SUGGESTIONS }
113
75
  label={ __( 'Categories' ) }
@@ -13,6 +13,7 @@ import { __ } from '@wordpress/i18n';
13
13
  import { useState } from '@wordpress/element';
14
14
  import { useDispatch } from '@wordpress/data';
15
15
  import { store as noticesStore } from '@wordpress/notices';
16
+ import { store as coreStore } from '@wordpress/core-data';
16
17
 
17
18
  /**
18
19
  * Internal dependencies
@@ -23,7 +24,7 @@ import { PATTERN_DEFAULT_CATEGORY, PATTERN_SYNC_TYPES } from '../constants';
23
24
  * Internal dependencies
24
25
  */
25
26
  import { store as patternsStore } from '../store';
26
- import CategorySelector from './category-selector';
27
+ import CategorySelector, { CATEGORY_SLUG } from './category-selector';
27
28
  import { unlock } from '../lock-unlock';
28
29
 
29
30
  export default function CreatePatternModal( {
@@ -34,13 +35,26 @@ export default function CreatePatternModal( {
34
35
  className = 'patterns-menu-items__convert-modal',
35
36
  } ) {
36
37
  const [ syncType, setSyncType ] = useState( PATTERN_SYNC_TYPES.full );
37
- const [ categories, setCategories ] = useState( [] );
38
+ const [ categoryTerms, setCategoryTerms ] = useState( [] );
38
39
  const [ title, setTitle ] = useState( '' );
40
+ const [ isSaving, setIsSaving ] = useState( false );
39
41
  const { createPattern } = unlock( useDispatch( patternsStore ) );
40
-
42
+ const { saveEntityRecord, invalidateResolution } = useDispatch( coreStore );
41
43
  const { createErrorNotice } = useDispatch( noticesStore );
44
+
42
45
  async function onCreate( patternTitle, sync ) {
46
+ if ( ! title || isSaving ) {
47
+ return;
48
+ }
49
+
43
50
  try {
51
+ setIsSaving( true );
52
+ const categories = await Promise.all(
53
+ categoryTerms.map( ( termName ) =>
54
+ findOrCreateTerm( termName )
55
+ )
56
+ );
57
+
44
58
  const newPattern = await createPattern(
45
59
  patternTitle,
46
60
  sync,
@@ -57,12 +71,35 @@ export default function CreatePatternModal( {
57
71
  id: 'convert-to-pattern-error',
58
72
  } );
59
73
  onError();
74
+ } finally {
75
+ setIsSaving( false );
76
+ setCategoryTerms( [] );
77
+ setTitle( '' );
60
78
  }
61
79
  }
62
80
 
63
- const handleCategorySelection = ( selectedCategories ) => {
64
- setCategories( selectedCategories.map( ( cat ) => cat.id ) );
65
- };
81
+ /**
82
+ * @param {string} term
83
+ * @return {Promise<number>} The pattern category id.
84
+ */
85
+ async function findOrCreateTerm( term ) {
86
+ try {
87
+ const newTerm = await saveEntityRecord(
88
+ 'taxonomy',
89
+ CATEGORY_SLUG,
90
+ { name: term },
91
+ { throwOnError: true }
92
+ );
93
+ invalidateResolution( 'getUserPatternCategories' );
94
+ return newTerm.id;
95
+ } catch ( error ) {
96
+ if ( error.code !== 'term_exists' ) {
97
+ throw error;
98
+ }
99
+
100
+ return error.data.term_id;
101
+ }
102
+ }
66
103
 
67
104
  return (
68
105
  <Modal
@@ -77,7 +114,6 @@ export default function CreatePatternModal( {
77
114
  onSubmit={ ( event ) => {
78
115
  event.preventDefault();
79
116
  onCreate( title, syncType );
80
- setTitle( '' );
81
117
  } }
82
118
  >
83
119
  <VStack spacing="5">
@@ -90,7 +126,8 @@ export default function CreatePatternModal( {
90
126
  className="patterns-create-modal__name-input"
91
127
  />
92
128
  <CategorySelector
93
- onCategorySelection={ handleCategorySelection }
129
+ values={ categoryTerms }
130
+ onChange={ setCategoryTerms }
94
131
  />
95
132
  <ToggleControl
96
133
  label={ __( 'Synced' ) }
@@ -117,7 +154,12 @@ export default function CreatePatternModal( {
117
154
  { __( 'Cancel' ) }
118
155
  </Button>
119
156
 
120
- <Button variant="primary" type="submit">
157
+ <Button
158
+ variant="primary"
159
+ type="submit"
160
+ aria-disabled={ ! title || isSaving }
161
+ isBusy={ isSaving }
162
+ >
121
163
  { __( 'Create' ) }
122
164
  </Button>
123
165
  </HStack>
package/src/constants.js CHANGED
@@ -4,6 +4,7 @@ export const PATTERN_TYPES = {
4
4
  };
5
5
 
6
6
  export const PATTERN_DEFAULT_CATEGORY = 'all-patterns';
7
+ export const PATTERN_USER_CATEGORY = 'my-patterns';
7
8
  export const PATTERN_CORE_SOURCES = [
8
9
  'core',
9
10
  'pattern-directory/core',
@@ -7,6 +7,7 @@ import PatternsMenuItems from './components';
7
7
  import {
8
8
  PATTERN_TYPES,
9
9
  PATTERN_DEFAULT_CATEGORY,
10
+ PATTERN_USER_CATEGORY,
10
11
  PATTERN_CORE_SOURCES,
11
12
  PATTERN_SYNC_TYPES,
12
13
  } from './constants';
@@ -17,6 +18,7 @@ lock( privateApis, {
17
18
  PatternsMenuItems,
18
19
  PATTERN_TYPES,
19
20
  PATTERN_DEFAULT_CATEGORY,
21
+ PATTERN_USER_CATEGORY,
20
22
  PATTERN_CORE_SOURCES,
21
23
  PATTERN_SYNC_TYPES,
22
24
  } );