@wordpress/editor 12.0.0 → 12.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/build/components/autosave-monitor/index.js +5 -0
  2. package/build/components/autosave-monitor/index.js.map +1 -1
  3. package/build/components/editor-help/index.native.js +4 -3
  4. package/build/components/editor-help/index.native.js.map +1 -1
  5. package/build/components/entities-saved-states/entity-type-list.js +22 -13
  6. package/build/components/entities-saved-states/entity-type-list.js.map +1 -1
  7. package/build/components/entities-saved-states/index.js +23 -4
  8. package/build/components/entities-saved-states/index.js.map +1 -1
  9. package/build/components/post-taxonomies/flat-term-selector.js +154 -211
  10. package/build/components/post-taxonomies/flat-term-selector.js.map +1 -1
  11. package/build/components/post-title/index.js +4 -2
  12. package/build/components/post-title/index.js.map +1 -1
  13. package/build/components/provider/use-block-editor-settings.js +1 -1
  14. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  15. package/build/store/utils/notice-builder.js +15 -18
  16. package/build/store/utils/notice-builder.js.map +1 -1
  17. package/build/utils/get-template-part-icon.js +1 -1
  18. package/build/utils/get-template-part-icon.js.map +1 -1
  19. package/build-module/components/autosave-monitor/index.js +5 -0
  20. package/build-module/components/autosave-monitor/index.js.map +1 -1
  21. package/build-module/components/editor-help/index.native.js +5 -4
  22. package/build-module/components/editor-help/index.native.js.map +1 -1
  23. package/build-module/components/entities-saved-states/entity-type-list.js +24 -13
  24. package/build-module/components/entities-saved-states/entity-type-list.js.map +1 -1
  25. package/build-module/components/entities-saved-states/index.js +23 -4
  26. package/build-module/components/entities-saved-states/index.js.map +1 -1
  27. package/build-module/components/post-taxonomies/flat-term-selector.js +156 -214
  28. package/build-module/components/post-taxonomies/flat-term-selector.js.map +1 -1
  29. package/build-module/components/post-title/index.js +4 -2
  30. package/build-module/components/post-title/index.js.map +1 -1
  31. package/build-module/components/provider/use-block-editor-settings.js +1 -1
  32. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  33. package/build-module/store/utils/notice-builder.js +15 -18
  34. package/build-module/store/utils/notice-builder.js.map +1 -1
  35. package/build-module/utils/get-template-part-icon.js +2 -2
  36. package/build-module/utils/get-template-part-icon.js.map +1 -1
  37. package/build-style/style-rtl.css +1 -1
  38. package/build-style/style.css +1 -1
  39. package/package.json +19 -19
  40. package/src/components/autosave-monitor/index.js +5 -0
  41. package/src/components/autosave-monitor/test/index.js +10 -4
  42. package/src/components/editor-help/index.native.js +116 -106
  43. package/src/components/editor-help/style.scss +4 -0
  44. package/src/components/entities-saved-states/entity-type-list.js +29 -10
  45. package/src/components/entities-saved-states/index.js +38 -8
  46. package/src/components/post-saved-state/style.scss +2 -0
  47. package/src/components/post-taxonomies/flat-term-selector.js +220 -254
  48. package/src/components/post-title/index.js +4 -2
  49. package/src/components/provider/use-block-editor-settings.js +0 -2
  50. package/src/store/test/actions.js +4 -2
  51. package/src/store/utils/notice-builder.js +17 -19
  52. package/src/store/utils/test/notice-builder.js +1 -1
  53. package/src/utils/get-template-part-icon.js +2 -2
@@ -25,6 +25,8 @@ var _apiFetch = _interopRequireDefault(require("@wordpress/api-fetch"));
25
25
 
26
26
  var _url = require("@wordpress/url");
27
27
 
28
+ var _a11y = require("@wordpress/a11y");
29
+
28
30
  var _store = require("../../store");
29
31
 
30
32
  var _terms = require("../../utils/terms");
@@ -43,264 +45,205 @@ var _mostUsedTerms = _interopRequireDefault(require("./most-used-terms"));
43
45
  * Internal dependencies
44
46
  */
45
47
 
48
+ /**
49
+ * Shared reference to an empty array for cases where it is important to avoid
50
+ * returning a new array reference on every invocation.
51
+ *
52
+ * @type {Array<any>}
53
+ */
54
+ const EMPTY_ARRAY = [];
46
55
  /**
47
56
  * Module constants
48
57
  */
58
+
49
59
  const MAX_TERMS_SUGGESTIONS = 20;
50
60
  const DEFAULT_QUERY = {
51
61
  per_page: MAX_TERMS_SUGGESTIONS,
52
62
  orderby: 'count',
53
63
  order: 'desc',
54
- _fields: 'id,name,count'
64
+ _fields: 'id,name',
65
+ context: 'view'
55
66
  };
56
67
 
57
68
  const isSameTermName = (termA, termB) => (0, _terms.unescapeString)(termA).toLowerCase() === (0, _terms.unescapeString)(termB).toLowerCase();
58
69
 
59
70
  const termNamesToIds = (names, terms) => {
60
71
  return names.map(termName => (0, _lodash.find)(terms, term => isSameTermName(term.name, termName)).id);
61
- };
72
+ }; // Tries to create a term or fetch it if it already exists.
62
73
 
63
- class FlatTermSelector extends _element.Component {
64
- constructor() {
65
- super(...arguments);
66
- this.onChange = this.onChange.bind(this);
67
- this.searchTerms = (0, _lodash.debounce)(this.searchTerms.bind(this), 500);
68
- this.findOrCreateTerm = this.findOrCreateTerm.bind(this);
69
- this.appendTerm = this.appendTerm.bind(this);
70
- this.state = {
71
- loading: !(0, _lodash.isEmpty)(this.props.terms),
72
- availableTerms: [],
73
- selectedTerms: []
74
- };
75
- }
76
74
 
77
- componentDidMount() {
78
- if (!(0, _lodash.isEmpty)(this.props.terms)) {
79
- this.initRequest = this.fetchTerms({
80
- include: this.props.terms.join(','),
81
- per_page: -1
82
- });
83
- this.initRequest.then(() => {
84
- this.setState({
85
- loading: false
86
- });
87
- }, xhr => {
88
- if (xhr.statusText === 'abort') {
89
- return;
90
- }
91
-
92
- this.setState({
93
- loading: false
94
- });
75
+ function findOrCreateTerm(termName, restBase) {
76
+ const escapedTermName = (0, _lodash.escape)(termName);
77
+ return (0, _apiFetch.default)({
78
+ path: `/wp/v2/${restBase}`,
79
+ method: 'POST',
80
+ data: {
81
+ name: escapedTermName
82
+ }
83
+ }).catch(error => {
84
+ const errorCode = error.code;
85
+
86
+ if (errorCode === 'term_exists') {
87
+ // If the terms exist, fetch it instead of creating a new one.
88
+ const addRequest = (0, _apiFetch.default)({
89
+ path: (0, _url.addQueryArgs)(`/wp/v2/${restBase}`, { ...DEFAULT_QUERY,
90
+ search: escapedTermName
91
+ })
92
+ }).then(_terms.unescapeTerms);
93
+ return addRequest.then(searchResult => {
94
+ return (0, _lodash.find)(searchResult, result => isSameTermName(result.name, termName));
95
95
  });
96
96
  }
97
- }
98
-
99
- componentWillUnmount() {
100
- (0, _lodash.invoke)(this.initRequest, ['abort']);
101
- (0, _lodash.invoke)(this.searchRequest, ['abort']);
102
- }
103
97
 
104
- componentDidUpdate(prevProps) {
105
- if (prevProps.terms !== this.props.terms) {
106
- this.updateSelectedTerms(this.props.terms);
107
- }
108
- }
98
+ return Promise.reject(error);
99
+ }).then(_terms.unescapeTerm);
100
+ }
109
101
 
110
- fetchTerms(params = {}) {
102
+ function FlatTermSelector({
103
+ slug
104
+ }) {
105
+ const [values, setValues] = (0, _element.useState)([]);
106
+ const [search, setSearch] = (0, _element.useState)('');
107
+ const debouncedSearch = (0, _compose.useDebounce)(setSearch, 500);
108
+ const {
109
+ terms,
110
+ termIds,
111
+ taxonomy,
112
+ hasAssignAction,
113
+ hasCreateAction,
114
+ hasResolvedTerms
115
+ } = (0, _data.useSelect)(select => {
111
116
  const {
112
- taxonomy
113
- } = this.props;
114
- const query = { ...DEFAULT_QUERY,
115
- ...params
116
- };
117
- const request = (0, _apiFetch.default)({
118
- path: (0, _url.addQueryArgs)(`/wp/v2/${taxonomy.rest_base}`, query)
119
- });
120
- request.then(_terms.unescapeTerms).then(terms => {
121
- this.setState(state => ({
122
- availableTerms: state.availableTerms.concat(terms.filter(term => !(0, _lodash.find)(state.availableTerms, availableTerm => availableTerm.id === term.id)))
123
- }));
124
- this.updateSelectedTerms(this.props.terms);
125
- });
126
- return request;
127
- }
117
+ getCurrentPost,
118
+ getEditedPostAttribute
119
+ } = select(_store.store);
120
+ const {
121
+ getEntityRecords,
122
+ getTaxonomy,
123
+ hasFinishedResolution
124
+ } = select(_coreData.store);
125
+ const post = getCurrentPost();
128
126
 
129
- updateSelectedTerms(terms = []) {
130
- const selectedTerms = terms.reduce((accumulator, termId) => {
131
- const termObject = (0, _lodash.find)(this.state.availableTerms, term => term.id === termId);
127
+ const _taxonomy = getTaxonomy(slug);
132
128
 
133
- if (termObject) {
134
- accumulator.push(termObject.name);
135
- }
129
+ const _termIds = _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : EMPTY_ARRAY;
136
130
 
137
- return accumulator;
138
- }, []);
139
- this.setState({
140
- selectedTerms
141
- });
131
+ const query = { ...DEFAULT_QUERY,
132
+ include: _termIds.join(','),
133
+ per_page: -1
134
+ };
135
+ return {
136
+ hasCreateAction: _taxonomy ? (0, _lodash.get)(post, ['_links', 'wp:action-create-' + _taxonomy.rest_base], false) : false,
137
+ hasAssignAction: _taxonomy ? (0, _lodash.get)(post, ['_links', 'wp:action-assign-' + _taxonomy.rest_base], false) : false,
138
+ taxonomy: _taxonomy,
139
+ termIds: _termIds,
140
+ terms: _termIds.length ? getEntityRecords('taxonomy', slug, query) : EMPTY_ARRAY,
141
+ hasResolvedTerms: hasFinishedResolution('getEntityRecords', ['taxonomy', slug, query])
142
+ };
143
+ }, [slug]);
144
+ const {
145
+ searchResults
146
+ } = (0, _data.useSelect)(select => {
147
+ const {
148
+ getEntityRecords
149
+ } = select(_coreData.store);
150
+ return {
151
+ searchResults: !!search ? getEntityRecords('taxonomy', slug, { ...DEFAULT_QUERY,
152
+ search
153
+ }) : EMPTY_ARRAY
154
+ };
155
+ }, [search]); // Update terms state only after the selectors are resolved.
156
+ // We're using this to avoid terms temporarily disappearing on slow networks
157
+ // while core data makes REST API requests.
158
+
159
+ (0, _element.useEffect)(() => {
160
+ if (hasResolvedTerms) {
161
+ const newValues = terms.map(term => (0, _terms.unescapeString)(term.name));
162
+ setValues(newValues);
163
+ }
164
+ }, [terms, hasResolvedTerms]);
165
+ const suggestions = (0, _element.useMemo)(() => {
166
+ return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => (0, _terms.unescapeString)(term.name));
167
+ }, [searchResults]);
168
+ const {
169
+ editPost
170
+ } = (0, _data.useDispatch)(_store.store);
171
+
172
+ if (!hasAssignAction) {
173
+ return null;
142
174
  }
143
175
 
144
- findOrCreateTerm(termName) {
145
- const {
146
- taxonomy
147
- } = this.props;
148
- const termNameEscaped = (0, _lodash.escape)(termName); // Tries to create a term or fetch it if it already exists.
149
-
150
- return (0, _apiFetch.default)({
151
- path: `/wp/v2/${taxonomy.rest_base}`,
152
- method: 'POST',
153
- data: {
154
- name: termNameEscaped
155
- }
156
- }).catch(error => {
157
- const errorCode = error.code;
158
-
159
- if (errorCode === 'term_exists') {
160
- // If the terms exist, fetch it instead of creating a new one.
161
- this.addRequest = (0, _apiFetch.default)({
162
- path: (0, _url.addQueryArgs)(`/wp/v2/${taxonomy.rest_base}`, { ...DEFAULT_QUERY,
163
- search: termNameEscaped
164
- })
165
- }).then(_terms.unescapeTerms);
166
- return this.addRequest.then(searchResult => {
167
- return (0, _lodash.find)(searchResult, result => isSameTermName(result.name, termName));
168
- });
169
- }
170
-
171
- return Promise.reject(error);
172
- }).then(_terms.unescapeTerm);
176
+ function onUpdateTerms(newTermIds) {
177
+ editPost({
178
+ [taxonomy.rest_base]: newTermIds
179
+ });
173
180
  }
174
181
 
175
- onChange(termNames) {
182
+ function onChange(termNames) {
183
+ const availableTerms = [...terms, ...(searchResults !== null && searchResults !== void 0 ? searchResults : [])];
176
184
  const uniqueTerms = (0, _lodash.uniqBy)(termNames, term => term.toLowerCase());
177
- this.setState({
178
- selectedTerms: uniqueTerms
179
- });
180
- const newTermNames = uniqueTerms.filter(termName => !(0, _lodash.find)(this.state.availableTerms, term => isSameTermName(term.name, termName)));
185
+ const newTermNames = uniqueTerms.filter(termName => !(0, _lodash.find)(availableTerms, term => isSameTermName(term.name, termName))); // Optimistically update term values.
186
+ // The selector will always re-fetch terms later.
187
+
188
+ setValues(uniqueTerms);
181
189
 
182
190
  if (newTermNames.length === 0) {
183
- return this.props.onUpdateTerms(termNamesToIds(uniqueTerms, this.state.availableTerms), this.props.taxonomy.rest_base);
191
+ return onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms));
184
192
  }
185
193
 
186
- Promise.all(newTermNames.map(this.findOrCreateTerm)).then(newTerms => {
187
- const newAvailableTerms = this.state.availableTerms.concat(newTerms);
188
- this.setState({
189
- availableTerms: newAvailableTerms
190
- });
191
- return this.props.onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms), this.props.taxonomy.rest_base);
192
- });
193
- }
194
-
195
- searchTerms(search = '') {
196
- (0, _lodash.invoke)(this.searchRequest, ['abort']);
197
-
198
- if (search.length >= 3) {
199
- this.searchRequest = this.fetchTerms({
200
- search
201
- });
194
+ if (!hasCreateAction) {
195
+ return;
202
196
  }
197
+
198
+ Promise.all(newTermNames.map(termName => findOrCreateTerm(termName, taxonomy.rest_base))).then(newTerms => {
199
+ const newAvailableTerms = availableTerms.concat(newTerms);
200
+ return onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms));
201
+ });
203
202
  }
204
203
 
205
- appendTerm(newTerm) {
206
- const {
207
- onUpdateTerms,
208
- taxonomy,
209
- terms = [],
210
- slug,
211
- speak
212
- } = this.props;
213
-
214
- if (terms.includes(newTerm.id)) {
204
+ function appendTerm(newTerm) {
205
+ if (termIds.includes(newTerm.id)) {
215
206
  return;
216
207
  }
217
208
 
218
- const newTerms = [...terms, newTerm.id];
209
+ const newTermIds = [...termIds, newTerm.id];
219
210
  const termAddedMessage = (0, _i18n.sprintf)(
220
211
  /* translators: %s: term name. */
221
212
  (0, _i18n._x)('%s added', 'term'), (0, _lodash.get)(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? (0, _i18n.__)('Tag') : (0, _i18n.__)('Term')));
222
- speak(termAddedMessage, 'assertive');
223
- this.setState({
224
- availableTerms: [...this.state.availableTerms, newTerm]
225
- });
226
- onUpdateTerms(newTerms, taxonomy.rest_base);
213
+ (0, _a11y.speak)(termAddedMessage, 'assertive');
214
+ onUpdateTerms(newTermIds);
227
215
  }
228
216
 
229
- render() {
230
- const {
231
- slug,
232
- taxonomy,
233
- hasAssignAction
234
- } = this.props;
235
-
236
- if (!hasAssignAction) {
237
- return null;
217
+ const newTermLabel = (0, _lodash.get)(taxonomy, ['labels', 'add_new_item'], slug === 'post_tag' ? (0, _i18n.__)('Add new tag') : (0, _i18n.__)('Add new Term'));
218
+ const singularName = (0, _lodash.get)(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? (0, _i18n.__)('Tag') : (0, _i18n.__)('Term'));
219
+ const termAddedLabel = (0, _i18n.sprintf)(
220
+ /* translators: %s: term name. */
221
+ (0, _i18n._x)('%s added', 'term'), singularName);
222
+ const termRemovedLabel = (0, _i18n.sprintf)(
223
+ /* translators: %s: term name. */
224
+ (0, _i18n._x)('%s removed', 'term'), singularName);
225
+ const removeTermLabel = (0, _i18n.sprintf)(
226
+ /* translators: %s: term name. */
227
+ (0, _i18n._x)('Remove %s', 'term'), singularName);
228
+ return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.FormTokenField, {
229
+ value: values,
230
+ suggestions: suggestions,
231
+ onChange: onChange,
232
+ onInputChange: debouncedSearch,
233
+ maxSuggestions: MAX_TERMS_SUGGESTIONS,
234
+ label: newTermLabel,
235
+ messages: {
236
+ added: termAddedLabel,
237
+ removed: termRemovedLabel,
238
+ remove: removeTermLabel
238
239
  }
239
-
240
- const {
241
- loading,
242
- availableTerms,
243
- selectedTerms
244
- } = this.state;
245
- const termNames = availableTerms.map(term => term.name);
246
- const newTermLabel = (0, _lodash.get)(taxonomy, ['labels', 'add_new_item'], slug === 'post_tag' ? (0, _i18n.__)('Add new tag') : (0, _i18n.__)('Add new Term'));
247
- const singularName = (0, _lodash.get)(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? (0, _i18n.__)('Tag') : (0, _i18n.__)('Term'));
248
- const termAddedLabel = (0, _i18n.sprintf)(
249
- /* translators: %s: term name. */
250
- (0, _i18n._x)('%s added', 'term'), singularName);
251
- const termRemovedLabel = (0, _i18n.sprintf)(
252
- /* translators: %s: term name. */
253
- (0, _i18n._x)('%s removed', 'term'), singularName);
254
- const removeTermLabel = (0, _i18n.sprintf)(
255
- /* translators: %s: term name. */
256
- (0, _i18n._x)('Remove %s', 'term'), singularName);
257
- return (0, _element.createElement)(_element.Fragment, null, (0, _element.createElement)(_components.FormTokenField, {
258
- value: selectedTerms,
259
- suggestions: termNames,
260
- onChange: this.onChange,
261
- onInputChange: this.searchTerms,
262
- maxSuggestions: MAX_TERMS_SUGGESTIONS,
263
- disabled: loading,
264
- label: newTermLabel,
265
- messages: {
266
- added: termAddedLabel,
267
- removed: termRemovedLabel,
268
- remove: removeTermLabel
269
- }
270
- }), (0, _element.createElement)(_mostUsedTerms.default, {
271
- taxonomy: taxonomy,
272
- onSelect: this.appendTerm
273
- }));
274
- }
275
-
240
+ }), (0, _element.createElement)(_mostUsedTerms.default, {
241
+ taxonomy: taxonomy,
242
+ onSelect: appendTerm
243
+ }));
276
244
  }
277
245
 
278
- var _default = (0, _compose.compose)((0, _data.withSelect)((select, {
279
- slug
280
- }) => {
281
- const {
282
- getCurrentPost
283
- } = select(_store.store);
284
- const {
285
- getTaxonomy
286
- } = select(_coreData.store);
287
- const taxonomy = getTaxonomy(slug);
288
- return {
289
- hasCreateAction: taxonomy ? (0, _lodash.get)(getCurrentPost(), ['_links', 'wp:action-create-' + taxonomy.rest_base], false) : false,
290
- hasAssignAction: taxonomy ? (0, _lodash.get)(getCurrentPost(), ['_links', 'wp:action-assign-' + taxonomy.rest_base], false) : false,
291
- terms: taxonomy ? select(_store.store).getEditedPostAttribute(taxonomy.rest_base) : [],
292
- taxonomy
293
- };
294
- }), (0, _data.withDispatch)(dispatch => {
295
- return {
296
- onUpdateTerms(terms, restBase) {
297
- dispatch(_store.store).editPost({
298
- [restBase]: terms
299
- });
300
- }
301
-
302
- };
303
- }), _components.withSpokenMessages, (0, _components.withFilters)('editor.PostTaxonomyType'))(FlatTermSelector);
246
+ var _default = (0, _components.withFilters)('editor.PostTaxonomyType')(FlatTermSelector);
304
247
 
305
248
  exports.default = _default;
306
249
  //# sourceMappingURL=flat-term-selector.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/editor/src/components/post-taxonomies/flat-term-selector.js"],"names":["MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","orderby","order","_fields","isSameTermName","termA","termB","toLowerCase","termNamesToIds","names","terms","map","termName","term","name","id","FlatTermSelector","Component","constructor","arguments","onChange","bind","searchTerms","findOrCreateTerm","appendTerm","state","loading","props","availableTerms","selectedTerms","componentDidMount","initRequest","fetchTerms","include","join","then","setState","xhr","statusText","componentWillUnmount","searchRequest","componentDidUpdate","prevProps","updateSelectedTerms","params","taxonomy","query","request","path","rest_base","unescapeTerms","concat","filter","availableTerm","reduce","accumulator","termId","termObject","push","termNameEscaped","method","data","catch","error","errorCode","code","addRequest","search","searchResult","result","Promise","reject","unescapeTerm","termNames","uniqueTerms","newTermNames","length","onUpdateTerms","all","newTerms","newAvailableTerms","newTerm","slug","speak","includes","termAddedMessage","render","hasAssignAction","newTermLabel","singularName","termAddedLabel","termRemovedLabel","removeTermLabel","added","removed","remove","select","getCurrentPost","editorStore","getTaxonomy","coreStore","hasCreateAction","getEditedPostAttribute","dispatch","restBase","editPost","withSpokenMessages"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport {\n\tdebounce,\n\tescape as escapeString,\n\tfind,\n\tget,\n\tinvoke,\n\tisEmpty,\n\tuniqBy,\n} from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport { Component } from '@wordpress/element';\nimport {\n\tFormTokenField,\n\twithFilters,\n\twithSpokenMessages,\n} from '@wordpress/components';\nimport { withSelect, withDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { compose } from '@wordpress/compose';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../../store';\nimport { unescapeString, unescapeTerm, unescapeTerms } from '../../utils/terms';\nimport MostUsedTerms from './most-used-terms';\n\n/**\n * Module constants\n */\nconst MAX_TERMS_SUGGESTIONS = 20;\nconst DEFAULT_QUERY = {\n\tper_page: MAX_TERMS_SUGGESTIONS,\n\torderby: 'count',\n\torder: 'desc',\n\t_fields: 'id,name,count',\n};\n\nconst isSameTermName = ( termA, termB ) =>\n\tunescapeString( termA ).toLowerCase() ===\n\tunescapeString( termB ).toLowerCase();\n\nconst termNamesToIds = ( names, terms ) => {\n\treturn names.map(\n\t\t( termName ) =>\n\t\t\tfind( terms, ( term ) => isSameTermName( term.name, termName ) ).id\n\t);\n};\n\nclass FlatTermSelector extends Component {\n\tconstructor() {\n\t\tsuper( ...arguments );\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.searchTerms = debounce( this.searchTerms.bind( this ), 500 );\n\t\tthis.findOrCreateTerm = this.findOrCreateTerm.bind( this );\n\t\tthis.appendTerm = this.appendTerm.bind( this );\n\t\tthis.state = {\n\t\t\tloading: ! isEmpty( this.props.terms ),\n\t\t\tavailableTerms: [],\n\t\t\tselectedTerms: [],\n\t\t};\n\t}\n\n\tcomponentDidMount() {\n\t\tif ( ! isEmpty( this.props.terms ) ) {\n\t\t\tthis.initRequest = this.fetchTerms( {\n\t\t\t\tinclude: this.props.terms.join( ',' ),\n\t\t\t\tper_page: -1,\n\t\t\t} );\n\t\t\tthis.initRequest.then(\n\t\t\t\t() => {\n\t\t\t\t\tthis.setState( { loading: false } );\n\t\t\t\t},\n\t\t\t\t( xhr ) => {\n\t\t\t\t\tif ( xhr.statusText === 'abort' ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setState( {\n\t\t\t\t\t\tloading: false,\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tinvoke( this.initRequest, [ 'abort' ] );\n\t\tinvoke( this.searchRequest, [ 'abort' ] );\n\t}\n\n\tcomponentDidUpdate( prevProps ) {\n\t\tif ( prevProps.terms !== this.props.terms ) {\n\t\t\tthis.updateSelectedTerms( this.props.terms );\n\t\t}\n\t}\n\n\tfetchTerms( params = {} ) {\n\t\tconst { taxonomy } = this.props;\n\t\tconst query = { ...DEFAULT_QUERY, ...params };\n\t\tconst request = apiFetch( {\n\t\t\tpath: addQueryArgs( `/wp/v2/${ taxonomy.rest_base }`, query ),\n\t\t} );\n\t\trequest.then( unescapeTerms ).then( ( terms ) => {\n\t\t\tthis.setState( ( state ) => ( {\n\t\t\t\tavailableTerms: state.availableTerms.concat(\n\t\t\t\t\tterms.filter(\n\t\t\t\t\t\t( term ) =>\n\t\t\t\t\t\t\t! find(\n\t\t\t\t\t\t\t\tstate.availableTerms,\n\t\t\t\t\t\t\t\t( availableTerm ) =>\n\t\t\t\t\t\t\t\t\tavailableTerm.id === term.id\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t} ) );\n\t\t\tthis.updateSelectedTerms( this.props.terms );\n\t\t} );\n\n\t\treturn request;\n\t}\n\n\tupdateSelectedTerms( terms = [] ) {\n\t\tconst selectedTerms = terms.reduce( ( accumulator, termId ) => {\n\t\t\tconst termObject = find(\n\t\t\t\tthis.state.availableTerms,\n\t\t\t\t( term ) => term.id === termId\n\t\t\t);\n\t\t\tif ( termObject ) {\n\t\t\t\taccumulator.push( termObject.name );\n\t\t\t}\n\n\t\t\treturn accumulator;\n\t\t}, [] );\n\t\tthis.setState( {\n\t\t\tselectedTerms,\n\t\t} );\n\t}\n\n\tfindOrCreateTerm( termName ) {\n\t\tconst { taxonomy } = this.props;\n\t\tconst termNameEscaped = escapeString( termName );\n\t\t// Tries to create a term or fetch it if it already exists.\n\t\treturn apiFetch( {\n\t\t\tpath: `/wp/v2/${ taxonomy.rest_base }`,\n\t\t\tmethod: 'POST',\n\t\t\tdata: { name: termNameEscaped },\n\t\t} )\n\t\t\t.catch( ( error ) => {\n\t\t\t\tconst errorCode = error.code;\n\t\t\t\tif ( errorCode === 'term_exists' ) {\n\t\t\t\t\t// If the terms exist, fetch it instead of creating a new one.\n\t\t\t\t\tthis.addRequest = apiFetch( {\n\t\t\t\t\t\tpath: addQueryArgs( `/wp/v2/${ taxonomy.rest_base }`, {\n\t\t\t\t\t\t\t...DEFAULT_QUERY,\n\t\t\t\t\t\t\tsearch: termNameEscaped,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t} ).then( unescapeTerms );\n\t\t\t\t\treturn this.addRequest.then( ( searchResult ) => {\n\t\t\t\t\t\treturn find( searchResult, ( result ) =>\n\t\t\t\t\t\t\tisSameTermName( result.name, termName )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn Promise.reject( error );\n\t\t\t} )\n\t\t\t.then( unescapeTerm );\n\t}\n\n\tonChange( termNames ) {\n\t\tconst uniqueTerms = uniqBy( termNames, ( term ) => term.toLowerCase() );\n\t\tthis.setState( { selectedTerms: uniqueTerms } );\n\t\tconst newTermNames = uniqueTerms.filter(\n\t\t\t( termName ) =>\n\t\t\t\t! find( this.state.availableTerms, ( term ) =>\n\t\t\t\t\tisSameTermName( term.name, termName )\n\t\t\t\t)\n\t\t);\n\n\t\tif ( newTermNames.length === 0 ) {\n\t\t\treturn this.props.onUpdateTerms(\n\t\t\t\ttermNamesToIds( uniqueTerms, this.state.availableTerms ),\n\t\t\t\tthis.props.taxonomy.rest_base\n\t\t\t);\n\t\t}\n\t\tPromise.all( newTermNames.map( this.findOrCreateTerm ) ).then(\n\t\t\t( newTerms ) => {\n\t\t\t\tconst newAvailableTerms = this.state.availableTerms.concat(\n\t\t\t\t\tnewTerms\n\t\t\t\t);\n\t\t\t\tthis.setState( { availableTerms: newAvailableTerms } );\n\t\t\t\treturn this.props.onUpdateTerms(\n\t\t\t\t\ttermNamesToIds( uniqueTerms, newAvailableTerms ),\n\t\t\t\t\tthis.props.taxonomy.rest_base\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\t}\n\n\tsearchTerms( search = '' ) {\n\t\tinvoke( this.searchRequest, [ 'abort' ] );\n\t\tif ( search.length >= 3 ) {\n\t\t\tthis.searchRequest = this.fetchTerms( { search } );\n\t\t}\n\t}\n\n\tappendTerm( newTerm ) {\n\t\tconst { onUpdateTerms, taxonomy, terms = [], slug, speak } = this.props;\n\n\t\tif ( terms.includes( newTerm.id ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newTerms = [ ...terms, newTerm.id ];\n\n\t\tconst termAddedMessage = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( '%s added', 'term' ),\n\t\t\tget(\n\t\t\t\ttaxonomy,\n\t\t\t\t[ 'labels', 'singular_name' ],\n\t\t\t\tslug === 'post_tag' ? __( 'Tag' ) : __( 'Term' )\n\t\t\t)\n\t\t);\n\n\t\tspeak( termAddedMessage, 'assertive' );\n\n\t\tthis.setState( {\n\t\t\tavailableTerms: [ ...this.state.availableTerms, newTerm ],\n\t\t} );\n\n\t\tonUpdateTerms( newTerms, taxonomy.rest_base );\n\t}\n\n\trender() {\n\t\tconst { slug, taxonomy, hasAssignAction } = this.props;\n\n\t\tif ( ! hasAssignAction ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { loading, availableTerms, selectedTerms } = this.state;\n\t\tconst termNames = availableTerms.map( ( term ) => term.name );\n\t\tconst newTermLabel = get(\n\t\t\ttaxonomy,\n\t\t\t[ 'labels', 'add_new_item' ],\n\t\t\tslug === 'post_tag' ? __( 'Add new tag' ) : __( 'Add new Term' )\n\t\t);\n\t\tconst singularName = get(\n\t\t\ttaxonomy,\n\t\t\t[ 'labels', 'singular_name' ],\n\t\t\tslug === 'post_tag' ? __( 'Tag' ) : __( 'Term' )\n\t\t);\n\t\tconst termAddedLabel = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( '%s added', 'term' ),\n\t\t\tsingularName\n\t\t);\n\t\tconst termRemovedLabel = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( '%s removed', 'term' ),\n\t\t\tsingularName\n\t\t);\n\t\tconst removeTermLabel = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( 'Remove %s', 'term' ),\n\t\t\tsingularName\n\t\t);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<FormTokenField\n\t\t\t\t\tvalue={ selectedTerms }\n\t\t\t\t\tsuggestions={ termNames }\n\t\t\t\t\tonChange={ this.onChange }\n\t\t\t\t\tonInputChange={ this.searchTerms }\n\t\t\t\t\tmaxSuggestions={ MAX_TERMS_SUGGESTIONS }\n\t\t\t\t\tdisabled={ loading }\n\t\t\t\t\tlabel={ newTermLabel }\n\t\t\t\t\tmessages={ {\n\t\t\t\t\t\tadded: termAddedLabel,\n\t\t\t\t\t\tremoved: termRemovedLabel,\n\t\t\t\t\t\tremove: removeTermLabel,\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t\t<MostUsedTerms\n\t\t\t\t\ttaxonomy={ taxonomy }\n\t\t\t\t\tonSelect={ this.appendTerm }\n\t\t\t\t/>\n\t\t\t</>\n\t\t);\n\t}\n}\n\nexport default compose(\n\twithSelect( ( select, { slug } ) => {\n\t\tconst { getCurrentPost } = select( editorStore );\n\t\tconst { getTaxonomy } = select( coreStore );\n\t\tconst taxonomy = getTaxonomy( slug );\n\t\treturn {\n\t\t\thasCreateAction: taxonomy\n\t\t\t\t? get(\n\t\t\t\t\t\tgetCurrentPost(),\n\t\t\t\t\t\t[ '_links', 'wp:action-create-' + taxonomy.rest_base ],\n\t\t\t\t\t\tfalse\n\t\t\t\t )\n\t\t\t\t: false,\n\t\t\thasAssignAction: taxonomy\n\t\t\t\t? get(\n\t\t\t\t\t\tgetCurrentPost(),\n\t\t\t\t\t\t[ '_links', 'wp:action-assign-' + taxonomy.rest_base ],\n\t\t\t\t\t\tfalse\n\t\t\t\t )\n\t\t\t\t: false,\n\t\t\tterms: taxonomy\n\t\t\t\t? select( editorStore ).getEditedPostAttribute(\n\t\t\t\t\t\ttaxonomy.rest_base\n\t\t\t\t )\n\t\t\t\t: [],\n\t\t\ttaxonomy,\n\t\t};\n\t} ),\n\twithDispatch( ( dispatch ) => {\n\t\treturn {\n\t\t\tonUpdateTerms( terms, restBase ) {\n\t\t\t\tdispatch( editorStore ).editPost( { [ restBase ]: terms } );\n\t\t\t},\n\t\t};\n\t} ),\n\twithSpokenMessages,\n\twithFilters( 'editor.PostTaxonomyType' )\n)( FlatTermSelector );\n"]}
1
+ {"version":3,"sources":["@wordpress/editor/src/components/post-taxonomies/flat-term-selector.js"],"names":["EMPTY_ARRAY","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","orderby","order","_fields","context","isSameTermName","termA","termB","toLowerCase","termNamesToIds","names","terms","map","termName","term","name","id","findOrCreateTerm","restBase","escapedTermName","path","method","data","catch","error","errorCode","code","addRequest","search","then","unescapeTerms","searchResult","result","Promise","reject","unescapeTerm","FlatTermSelector","slug","values","setValues","setSearch","debouncedSearch","termIds","taxonomy","hasAssignAction","hasCreateAction","hasResolvedTerms","select","getCurrentPost","getEditedPostAttribute","editorStore","getEntityRecords","getTaxonomy","hasFinishedResolution","coreStore","post","_taxonomy","_termIds","rest_base","query","include","join","length","searchResults","newValues","suggestions","editPost","onUpdateTerms","newTermIds","onChange","termNames","availableTerms","uniqueTerms","newTermNames","filter","all","newTerms","newAvailableTerms","concat","appendTerm","newTerm","includes","termAddedMessage","newTermLabel","singularName","termAddedLabel","termRemovedLabel","removeTermLabel","added","removed","remove"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { escape as escapeString, find, get, uniqBy } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport { useEffect, useMemo, useState } from '@wordpress/element';\nimport { FormTokenField, withFilters } from '@wordpress/components';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { useDebounce } from '@wordpress/compose';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport { store as editorStore } from '../../store';\nimport { unescapeString, unescapeTerm, unescapeTerms } from '../../utils/terms';\nimport MostUsedTerms from './most-used-terms';\n\n/**\n * Shared reference to an empty array for cases where it is important to avoid\n * returning a new array reference on every invocation.\n *\n * @type {Array<any>}\n */\nconst EMPTY_ARRAY = [];\n\n/**\n * Module constants\n */\nconst MAX_TERMS_SUGGESTIONS = 20;\nconst DEFAULT_QUERY = {\n\tper_page: MAX_TERMS_SUGGESTIONS,\n\torderby: 'count',\n\torder: 'desc',\n\t_fields: 'id,name',\n\tcontext: 'view',\n};\n\nconst isSameTermName = ( termA, termB ) =>\n\tunescapeString( termA ).toLowerCase() ===\n\tunescapeString( termB ).toLowerCase();\n\nconst termNamesToIds = ( names, terms ) => {\n\treturn names.map(\n\t\t( termName ) =>\n\t\t\tfind( terms, ( term ) => isSameTermName( term.name, termName ) ).id\n\t);\n};\n\n// Tries to create a term or fetch it if it already exists.\nfunction findOrCreateTerm( termName, restBase ) {\n\tconst escapedTermName = escapeString( termName );\n\n\treturn apiFetch( {\n\t\tpath: `/wp/v2/${ restBase }`,\n\t\tmethod: 'POST',\n\t\tdata: { name: escapedTermName },\n\t} )\n\t\t.catch( ( error ) => {\n\t\t\tconst errorCode = error.code;\n\t\t\tif ( errorCode === 'term_exists' ) {\n\t\t\t\t// If the terms exist, fetch it instead of creating a new one.\n\t\t\t\tconst addRequest = apiFetch( {\n\t\t\t\t\tpath: addQueryArgs( `/wp/v2/${ restBase }`, {\n\t\t\t\t\t\t...DEFAULT_QUERY,\n\t\t\t\t\t\tsearch: escapedTermName,\n\t\t\t\t\t} ),\n\t\t\t\t} ).then( unescapeTerms );\n\n\t\t\t\treturn addRequest.then( ( searchResult ) => {\n\t\t\t\t\treturn find( searchResult, ( result ) =>\n\t\t\t\t\t\tisSameTermName( result.name, termName )\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn Promise.reject( error );\n\t\t} )\n\t\t.then( unescapeTerm );\n}\n\nfunction FlatTermSelector( { slug } ) {\n\tconst [ values, setValues ] = useState( [] );\n\tconst [ search, setSearch ] = useState( '' );\n\tconst debouncedSearch = useDebounce( setSearch, 500 );\n\n\tconst {\n\t\tterms,\n\t\ttermIds,\n\t\ttaxonomy,\n\t\thasAssignAction,\n\t\thasCreateAction,\n\t\thasResolvedTerms,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getCurrentPost, getEditedPostAttribute } = select(\n\t\t\t\teditorStore\n\t\t\t);\n\t\t\tconst {\n\t\t\t\tgetEntityRecords,\n\t\t\t\tgetTaxonomy,\n\t\t\t\thasFinishedResolution,\n\t\t\t} = select( coreStore );\n\t\t\tconst post = getCurrentPost();\n\t\t\tconst _taxonomy = getTaxonomy( slug );\n\t\t\tconst _termIds = _taxonomy\n\t\t\t\t? getEditedPostAttribute( _taxonomy.rest_base )\n\t\t\t\t: EMPTY_ARRAY;\n\n\t\t\tconst query = {\n\t\t\t\t...DEFAULT_QUERY,\n\t\t\t\tinclude: _termIds.join( ',' ),\n\t\t\t\tper_page: -1,\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\thasCreateAction: _taxonomy\n\t\t\t\t\t? get(\n\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'_links',\n\t\t\t\t\t\t\t\t'wp:action-create-' + _taxonomy.rest_base,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t )\n\t\t\t\t\t: false,\n\t\t\t\thasAssignAction: _taxonomy\n\t\t\t\t\t? get(\n\t\t\t\t\t\t\tpost,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'_links',\n\t\t\t\t\t\t\t\t'wp:action-assign-' + _taxonomy.rest_base,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tfalse\n\t\t\t\t\t )\n\t\t\t\t\t: false,\n\t\t\t\ttaxonomy: _taxonomy,\n\t\t\t\ttermIds: _termIds,\n\t\t\t\tterms: _termIds.length\n\t\t\t\t\t? getEntityRecords( 'taxonomy', slug, query )\n\t\t\t\t\t: EMPTY_ARRAY,\n\t\t\t\thasResolvedTerms: hasFinishedResolution( 'getEntityRecords', [\n\t\t\t\t\t'taxonomy',\n\t\t\t\t\tslug,\n\t\t\t\t\tquery,\n\t\t\t\t] ),\n\t\t\t};\n\t\t},\n\t\t[ slug ]\n\t);\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\t// Update terms state only after the selectors are resolved.\n\t// We're using this to avoid terms temporarily disappearing on slow networks\n\t// while core data makes REST API requests.\n\tuseEffect( () => {\n\t\tif ( hasResolvedTerms ) {\n\t\t\tconst newValues = terms.map( ( term ) =>\n\t\t\t\tunescapeString( term.name )\n\t\t\t);\n\n\t\t\tsetValues( newValues );\n\t\t}\n\t}, [ terms, hasResolvedTerms ] );\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 { editPost } = useDispatch( editorStore );\n\n\tif ( ! hasAssignAction ) {\n\t\treturn null;\n\t}\n\n\tfunction onUpdateTerms( newTermIds ) {\n\t\teditPost( { [ taxonomy.rest_base ]: newTermIds } );\n\t}\n\n\tfunction onChange( termNames ) {\n\t\tconst availableTerms = [ ...terms, ...( searchResults ?? [] ) ];\n\t\tconst uniqueTerms = uniqBy( termNames, ( term ) => term.toLowerCase() );\n\t\tconst newTermNames = uniqueTerms.filter(\n\t\t\t( termName ) =>\n\t\t\t\t! find( availableTerms, ( term ) =>\n\t\t\t\t\tisSameTermName( term.name, termName )\n\t\t\t\t)\n\t\t);\n\n\t\t// Optimistically update term values.\n\t\t// The selector will always re-fetch terms later.\n\t\tsetValues( uniqueTerms );\n\n\t\tif ( newTermNames.length === 0 ) {\n\t\t\treturn onUpdateTerms(\n\t\t\t\ttermNamesToIds( uniqueTerms, availableTerms )\n\t\t\t);\n\t\t}\n\n\t\tif ( ! hasCreateAction ) {\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.all(\n\t\t\tnewTermNames.map( ( termName ) =>\n\t\t\t\tfindOrCreateTerm( termName, taxonomy.rest_base )\n\t\t\t)\n\t\t).then( ( newTerms ) => {\n\t\t\tconst newAvailableTerms = availableTerms.concat( newTerms );\n\t\t\treturn onUpdateTerms(\n\t\t\t\ttermNamesToIds( uniqueTerms, newAvailableTerms )\n\t\t\t);\n\t\t} );\n\t}\n\n\tfunction appendTerm( newTerm ) {\n\t\tif ( termIds.includes( newTerm.id ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newTermIds = [ ...termIds, newTerm.id ];\n\t\tconst termAddedMessage = sprintf(\n\t\t\t/* translators: %s: term name. */\n\t\t\t_x( '%s added', 'term' ),\n\t\t\tget(\n\t\t\t\ttaxonomy,\n\t\t\t\t[ 'labels', 'singular_name' ],\n\t\t\t\tslug === 'post_tag' ? __( 'Tag' ) : __( 'Term' )\n\t\t\t)\n\t\t);\n\n\t\tspeak( termAddedMessage, 'assertive' );\n\t\tonUpdateTerms( newTermIds );\n\t}\n\n\tconst newTermLabel = get(\n\t\ttaxonomy,\n\t\t[ 'labels', 'add_new_item' ],\n\t\tslug === 'post_tag' ? __( 'Add new tag' ) : __( 'Add new Term' )\n\t);\n\tconst singularName = get(\n\t\ttaxonomy,\n\t\t[ 'labels', 'singular_name' ],\n\t\tslug === 'post_tag' ? __( 'Tag' ) : __( 'Term' )\n\t);\n\tconst termAddedLabel = sprintf(\n\t\t/* translators: %s: term name. */\n\t\t_x( '%s added', 'term' ),\n\t\tsingularName\n\t);\n\tconst termRemovedLabel = sprintf(\n\t\t/* translators: %s: term name. */\n\t\t_x( '%s removed', 'term' ),\n\t\tsingularName\n\t);\n\tconst removeTermLabel = sprintf(\n\t\t/* translators: %s: term name. */\n\t\t_x( 'Remove %s', 'term' ),\n\t\tsingularName\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<FormTokenField\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={ newTermLabel }\n\t\t\t\tmessages={ {\n\t\t\t\t\tadded: termAddedLabel,\n\t\t\t\t\tremoved: termRemovedLabel,\n\t\t\t\t\tremove: removeTermLabel,\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t<MostUsedTerms taxonomy={ taxonomy } onSelect={ appendTerm } />\n\t\t</>\n\t);\n}\n\nexport default withFilters( 'editor.PostTaxonomyType' )( FlatTermSelector );\n"]}
@@ -224,7 +224,7 @@ function PostTitle() {
224
224
  __unstableDisableFormats: true,
225
225
  preserveWhiteSpace: true
226
226
  });
227
- /* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-interactions */
227
+ /* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */
228
228
 
229
229
  return (0, _element.createElement)(_postTypeSupportCheck.default, {
230
230
  supportKeys: "title"
@@ -233,12 +233,14 @@ function PostTitle() {
233
233
  contentEditable: true,
234
234
  className: className,
235
235
  "aria-label": decodedPlaceholder,
236
+ role: "textbox",
237
+ "aria-multiline": "true",
236
238
  onFocus: onSelect,
237
239
  onBlur: onUnselect,
238
240
  onKeyDown: onKeyDown,
239
241
  onKeyPress: onUnselect,
240
242
  onPaste: onPaste
241
243
  }));
242
- /* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-interactions */
244
+ /* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */
243
245
  }
244
246
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/editor/src/components/post-title/index.js"],"names":["REGEXP_NEWLINES","PostTitle","ref","isSelected","setIsSelected","editPost","editorStore","insertDefaultBlock","clearSelectedBlock","insertBlocks","blockEditorStore","isCleanNewPost","title","placeholder","isFocusMode","hasFixedToolbar","select","getEditedPostAttribute","_isCleanNewPost","getSettings","titlePlaceholder","focusMode","_hasFixedToolbar","current","ownerDocument","activeElement","body","focus","onEnterPress","undefined","onInsertBlockAfter","blocks","onUpdate","newTitle","selection","setSelection","onSelect","onUnselect","onChange","value","replace","onKeyDown","event","keyCode","ENTER","preventDefault","onPaste","clipboardData","plainText","html","getData","error1","error2","window","console","log","content","HTML","length","firstBlock","name","attributes","slice","className","decodedPlaceholder","richTextRef","selectionStart","start","selectionEnd","end","onSelectionChange","newStart","newEnd","sel","__unstableDisableFormats","preserveWhiteSpace"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useEffect, useRef, useState } from '@wordpress/element';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { ENTER } from '@wordpress/keycodes';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { pasteHandler } from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { __unstableUseRichText as useRichText } from '@wordpress/rich-text';\nimport { useMergeRefs } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport PostTypeSupportCheck from '../post-type-support-check';\nimport { store as editorStore } from '../../store';\n\n/**\n * Constants\n */\nconst REGEXP_NEWLINES = /[\\r\\n]+/g;\n\nexport default function PostTitle() {\n\tconst ref = useRef();\n\tconst [ isSelected, setIsSelected ] = useState( false );\n\tconst { editPost } = useDispatch( editorStore );\n\tconst {\n\t\tinsertDefaultBlock,\n\t\tclearSelectedBlock,\n\t\tinsertBlocks,\n\t} = useDispatch( blockEditorStore );\n\tconst {\n\t\tisCleanNewPost,\n\t\ttitle,\n\t\tplaceholder,\n\t\tisFocusMode,\n\t\thasFixedToolbar,\n\t} = useSelect( ( select ) => {\n\t\tconst {\n\t\t\tgetEditedPostAttribute,\n\t\t\tisCleanNewPost: _isCleanNewPost,\n\t\t} = select( editorStore );\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\tconst {\n\t\t\ttitlePlaceholder,\n\t\t\tfocusMode,\n\t\t\thasFixedToolbar: _hasFixedToolbar,\n\t\t} = getSettings();\n\n\t\treturn {\n\t\t\tisCleanNewPost: _isCleanNewPost(),\n\t\t\ttitle: getEditedPostAttribute( 'title' ),\n\t\t\tplaceholder: titlePlaceholder,\n\t\t\tisFocusMode: focusMode,\n\t\t\thasFixedToolbar: _hasFixedToolbar,\n\t\t};\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\t\tconst { activeElement, body } = ownerDocument;\n\n\t\t// Only autofocus the title when the post is entirely empty. This should\n\t\t// only happen for a new post, which means we focus the title on new\n\t\t// post so the author can start typing right away, without needing to\n\t\t// click anything.\n\t\tif ( isCleanNewPost && ( ! activeElement || body === activeElement ) ) {\n\t\t\tref.current.focus();\n\t\t}\n\t}, [ isCleanNewPost ] );\n\n\tfunction onEnterPress() {\n\t\tinsertDefaultBlock( undefined, undefined, 0 );\n\t}\n\n\tfunction onInsertBlockAfter( blocks ) {\n\t\tinsertBlocks( blocks, 0 );\n\t}\n\n\tfunction onUpdate( newTitle ) {\n\t\teditPost( { title: newTitle } );\n\t}\n\n\tconst [ selection, setSelection ] = useState( {} );\n\n\tfunction onSelect() {\n\t\tsetIsSelected( true );\n\t\tclearSelectedBlock();\n\t}\n\n\tfunction onUnselect() {\n\t\tsetIsSelected( false );\n\t\tsetSelection( {} );\n\t}\n\n\tfunction onChange( value ) {\n\t\tonUpdate( value.replace( REGEXP_NEWLINES, ' ' ) );\n\t}\n\n\tfunction onKeyDown( event ) {\n\t\tif ( event.keyCode === ENTER ) {\n\t\t\tevent.preventDefault();\n\t\t\tonEnterPress();\n\t\t}\n\t}\n\n\tfunction onPaste( event ) {\n\t\tconst clipboardData = event.clipboardData;\n\n\t\tlet plainText = '';\n\t\tlet html = '';\n\n\t\t// IE11 only supports `Text` as an argument for `getData` and will\n\t\t// otherwise throw an invalid argument error, so we try the standard\n\t\t// arguments first, then fallback to `Text` if they fail.\n\t\ttry {\n\t\t\tplainText = clipboardData.getData( 'text/plain' );\n\t\t\thtml = clipboardData.getData( 'text/html' );\n\t\t} catch ( error1 ) {\n\t\t\ttry {\n\t\t\t\thtml = clipboardData.getData( 'Text' );\n\t\t\t} catch ( error2 ) {\n\t\t\t\t// Some browsers like UC Browser paste plain text by default and\n\t\t\t\t// don't support clipboardData at all, so allow default\n\t\t\t\t// behaviour.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Received HTML:\\n\\n', html );\n\t\twindow.console.log( 'Received plain text:\\n\\n', plainText );\n\n\t\tconst content = pasteHandler( {\n\t\t\tHTML: html,\n\t\t\tplainText,\n\t\t} );\n\n\t\tif ( typeof content !== 'string' && content.length ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tconst [ firstBlock ] = content;\n\n\t\t\tif (\n\t\t\t\t! title &&\n\t\t\t\t( firstBlock.name === 'core/heading' ||\n\t\t\t\t\tfirstBlock.name === 'core/paragraph' )\n\t\t\t) {\n\t\t\t\tonUpdate( firstBlock.attributes.content );\n\t\t\t\tonInsertBlockAfter( content.slice( 1 ) );\n\t\t\t} else {\n\t\t\t\tonInsertBlockAfter( content );\n\t\t\t}\n\t\t}\n\t}\n\n\t// The wp-block className is important for editor styles.\n\t// This same block is used in both the visual and the code editor.\n\tconst className = classnames(\n\t\t'wp-block wp-block-post-title block-editor-block-list__block editor-post-title editor-post-title__input rich-text',\n\t\t{\n\t\t\t'is-selected': isSelected,\n\t\t\t'is-focus-mode': isFocusMode,\n\t\t\t'has-fixed-toolbar': hasFixedToolbar,\n\t\t}\n\t);\n\tconst decodedPlaceholder =\n\t\tdecodeEntities( placeholder ) || __( 'Add title' );\n\tconst { ref: richTextRef } = useRichText( {\n\t\tvalue: title,\n\t\tonChange,\n\t\tplaceholder: decodedPlaceholder,\n\t\tselectionStart: selection.start,\n\t\tselectionEnd: selection.end,\n\t\tonSelectionChange( newStart, newEnd ) {\n\t\t\tsetSelection( ( sel ) => {\n\t\t\t\tconst { start, end } = sel;\n\t\t\t\tif ( start === newStart && end === newEnd ) {\n\t\t\t\t\treturn sel;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstart: newStart,\n\t\t\t\t\tend: newEnd,\n\t\t\t\t};\n\t\t\t} );\n\t\t},\n\t\t__unstableDisableFormats: true,\n\t\tpreserveWhiteSpace: true,\n\t} );\n\n\t/* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-interactions */\n\treturn (\n\t\t<PostTypeSupportCheck supportKeys=\"title\">\n\t\t\t<h1\n\t\t\t\tref={ useMergeRefs( [ richTextRef, ref ] ) }\n\t\t\t\tcontentEditable\n\t\t\t\tclassName={ className }\n\t\t\t\taria-label={ decodedPlaceholder }\n\t\t\t\tonFocus={ onSelect }\n\t\t\t\tonBlur={ onUnselect }\n\t\t\t\tonKeyDown={ onKeyDown }\n\t\t\t\tonKeyPress={ onUnselect }\n\t\t\t\tonPaste={ onPaste }\n\t\t\t/>\n\t\t</PostTypeSupportCheck>\n\t);\n\t/* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-interactions */\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/editor/src/components/post-title/index.js"],"names":["REGEXP_NEWLINES","PostTitle","ref","isSelected","setIsSelected","editPost","editorStore","insertDefaultBlock","clearSelectedBlock","insertBlocks","blockEditorStore","isCleanNewPost","title","placeholder","isFocusMode","hasFixedToolbar","select","getEditedPostAttribute","_isCleanNewPost","getSettings","titlePlaceholder","focusMode","_hasFixedToolbar","current","ownerDocument","activeElement","body","focus","onEnterPress","undefined","onInsertBlockAfter","blocks","onUpdate","newTitle","selection","setSelection","onSelect","onUnselect","onChange","value","replace","onKeyDown","event","keyCode","ENTER","preventDefault","onPaste","clipboardData","plainText","html","getData","error1","error2","window","console","log","content","HTML","length","firstBlock","name","attributes","slice","className","decodedPlaceholder","richTextRef","selectionStart","start","selectionEnd","end","onSelectionChange","newStart","newEnd","sel","__unstableDisableFormats","preserveWhiteSpace"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { useEffect, useRef, useState } from '@wordpress/element';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { ENTER } from '@wordpress/keycodes';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { pasteHandler } from '@wordpress/blocks';\nimport { store as blockEditorStore } from '@wordpress/block-editor';\nimport { __unstableUseRichText as useRichText } from '@wordpress/rich-text';\nimport { useMergeRefs } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport PostTypeSupportCheck from '../post-type-support-check';\nimport { store as editorStore } from '../../store';\n\n/**\n * Constants\n */\nconst REGEXP_NEWLINES = /[\\r\\n]+/g;\n\nexport default function PostTitle() {\n\tconst ref = useRef();\n\tconst [ isSelected, setIsSelected ] = useState( false );\n\tconst { editPost } = useDispatch( editorStore );\n\tconst {\n\t\tinsertDefaultBlock,\n\t\tclearSelectedBlock,\n\t\tinsertBlocks,\n\t} = useDispatch( blockEditorStore );\n\tconst {\n\t\tisCleanNewPost,\n\t\ttitle,\n\t\tplaceholder,\n\t\tisFocusMode,\n\t\thasFixedToolbar,\n\t} = useSelect( ( select ) => {\n\t\tconst {\n\t\t\tgetEditedPostAttribute,\n\t\t\tisCleanNewPost: _isCleanNewPost,\n\t\t} = select( editorStore );\n\t\tconst { getSettings } = select( blockEditorStore );\n\t\tconst {\n\t\t\ttitlePlaceholder,\n\t\t\tfocusMode,\n\t\t\thasFixedToolbar: _hasFixedToolbar,\n\t\t} = getSettings();\n\n\t\treturn {\n\t\t\tisCleanNewPost: _isCleanNewPost(),\n\t\t\ttitle: getEditedPostAttribute( 'title' ),\n\t\t\tplaceholder: titlePlaceholder,\n\t\t\tisFocusMode: focusMode,\n\t\t\thasFixedToolbar: _hasFixedToolbar,\n\t\t};\n\t}, [] );\n\n\tuseEffect( () => {\n\t\tif ( ! ref.current ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { ownerDocument } = ref.current;\n\t\tconst { activeElement, body } = ownerDocument;\n\n\t\t// Only autofocus the title when the post is entirely empty. This should\n\t\t// only happen for a new post, which means we focus the title on new\n\t\t// post so the author can start typing right away, without needing to\n\t\t// click anything.\n\t\tif ( isCleanNewPost && ( ! activeElement || body === activeElement ) ) {\n\t\t\tref.current.focus();\n\t\t}\n\t}, [ isCleanNewPost ] );\n\n\tfunction onEnterPress() {\n\t\tinsertDefaultBlock( undefined, undefined, 0 );\n\t}\n\n\tfunction onInsertBlockAfter( blocks ) {\n\t\tinsertBlocks( blocks, 0 );\n\t}\n\n\tfunction onUpdate( newTitle ) {\n\t\teditPost( { title: newTitle } );\n\t}\n\n\tconst [ selection, setSelection ] = useState( {} );\n\n\tfunction onSelect() {\n\t\tsetIsSelected( true );\n\t\tclearSelectedBlock();\n\t}\n\n\tfunction onUnselect() {\n\t\tsetIsSelected( false );\n\t\tsetSelection( {} );\n\t}\n\n\tfunction onChange( value ) {\n\t\tonUpdate( value.replace( REGEXP_NEWLINES, ' ' ) );\n\t}\n\n\tfunction onKeyDown( event ) {\n\t\tif ( event.keyCode === ENTER ) {\n\t\t\tevent.preventDefault();\n\t\t\tonEnterPress();\n\t\t}\n\t}\n\n\tfunction onPaste( event ) {\n\t\tconst clipboardData = event.clipboardData;\n\n\t\tlet plainText = '';\n\t\tlet html = '';\n\n\t\t// IE11 only supports `Text` as an argument for `getData` and will\n\t\t// otherwise throw an invalid argument error, so we try the standard\n\t\t// arguments first, then fallback to `Text` if they fail.\n\t\ttry {\n\t\t\tplainText = clipboardData.getData( 'text/plain' );\n\t\t\thtml = clipboardData.getData( 'text/html' );\n\t\t} catch ( error1 ) {\n\t\t\ttry {\n\t\t\t\thtml = clipboardData.getData( 'Text' );\n\t\t\t} catch ( error2 ) {\n\t\t\t\t// Some browsers like UC Browser paste plain text by default and\n\t\t\t\t// don't support clipboardData at all, so allow default\n\t\t\t\t// behaviour.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Allows us to ask for this information when we get a report.\n\t\twindow.console.log( 'Received HTML:\\n\\n', html );\n\t\twindow.console.log( 'Received plain text:\\n\\n', plainText );\n\n\t\tconst content = pasteHandler( {\n\t\t\tHTML: html,\n\t\t\tplainText,\n\t\t} );\n\n\t\tif ( typeof content !== 'string' && content.length ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tconst [ firstBlock ] = content;\n\n\t\t\tif (\n\t\t\t\t! title &&\n\t\t\t\t( firstBlock.name === 'core/heading' ||\n\t\t\t\t\tfirstBlock.name === 'core/paragraph' )\n\t\t\t) {\n\t\t\t\tonUpdate( firstBlock.attributes.content );\n\t\t\t\tonInsertBlockAfter( content.slice( 1 ) );\n\t\t\t} else {\n\t\t\t\tonInsertBlockAfter( content );\n\t\t\t}\n\t\t}\n\t}\n\n\t// The wp-block className is important for editor styles.\n\t// This same block is used in both the visual and the code editor.\n\tconst className = classnames(\n\t\t'wp-block wp-block-post-title block-editor-block-list__block editor-post-title editor-post-title__input rich-text',\n\t\t{\n\t\t\t'is-selected': isSelected,\n\t\t\t'is-focus-mode': isFocusMode,\n\t\t\t'has-fixed-toolbar': hasFixedToolbar,\n\t\t}\n\t);\n\tconst decodedPlaceholder =\n\t\tdecodeEntities( placeholder ) || __( 'Add title' );\n\tconst { ref: richTextRef } = useRichText( {\n\t\tvalue: title,\n\t\tonChange,\n\t\tplaceholder: decodedPlaceholder,\n\t\tselectionStart: selection.start,\n\t\tselectionEnd: selection.end,\n\t\tonSelectionChange( newStart, newEnd ) {\n\t\t\tsetSelection( ( sel ) => {\n\t\t\t\tconst { start, end } = sel;\n\t\t\t\tif ( start === newStart && end === newEnd ) {\n\t\t\t\t\treturn sel;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstart: newStart,\n\t\t\t\t\tend: newEnd,\n\t\t\t\t};\n\t\t\t} );\n\t\t},\n\t\t__unstableDisableFormats: true,\n\t\tpreserveWhiteSpace: true,\n\t} );\n\n\t/* eslint-disable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */\n\treturn (\n\t\t<PostTypeSupportCheck supportKeys=\"title\">\n\t\t\t<h1\n\t\t\t\tref={ useMergeRefs( [ richTextRef, ref ] ) }\n\t\t\t\tcontentEditable\n\t\t\t\tclassName={ className }\n\t\t\t\taria-label={ decodedPlaceholder }\n\t\t\t\trole=\"textbox\"\n\t\t\t\taria-multiline=\"true\"\n\t\t\t\tonFocus={ onSelect }\n\t\t\t\tonBlur={ onUnselect }\n\t\t\t\tonKeyDown={ onKeyDown }\n\t\t\t\tonKeyPress={ onUnselect }\n\t\t\t\tonPaste={ onPaste }\n\t\t\t/>\n\t\t</PostTypeSupportCheck>\n\t);\n\t/* eslint-enable jsx-a11y/heading-has-content, jsx-a11y/no-noninteractive-element-to-interactive-role */\n}\n"]}
@@ -93,7 +93,7 @@ function useBlockEditorSettings(settings, hasTemplate) {
93
93
  return saveEntityRecord('postType', 'page', options);
94
94
  };
95
95
 
96
- return (0, _element.useMemo)(() => ({ ...(0, _lodash.pick)(settings, ['__experimentalBlockDirectory', '__experimentalBlockPatternCategories', '__experimentalBlockPatterns', '__experimentalFeatures', '__experimentalGlobalStylesBaseStyles', '__experimentalGlobalStylesUserEntityId', '__experimentalPreferredStyleVariations', '__experimentalSetIsInserterOpened', '__unstableGalleryWithImageBlocks', 'alignWide', 'allowedBlockTypes', 'bodyPlaceholder', 'codeEditingEnabled', 'colors', 'disableCustomColors', 'disableCustomFontSizes', 'disableCustomGradients', 'enableCustomLineHeight', 'enableCustomSpacing', 'enableCustomUnits', 'focusMode', 'fontSizes', 'gradients', 'hasFixedToolbar', 'hasReducedUI', 'imageDefaultSize', 'imageDimensions', 'imageEditing', 'imageSizes', 'isRTL', 'keepCaretInsideBlock', 'maxWidth', 'onUpdateDefaultBlockStyles', 'styles', 'template', 'templateLock', 'titlePlaceholder', 'supportsLayout', 'widgetTypesToHideFromLegacyWidgetBlock']),
96
+ return (0, _element.useMemo)(() => ({ ...(0, _lodash.pick)(settings, ['__experimentalBlockDirectory', '__experimentalBlockPatternCategories', '__experimentalBlockPatterns', '__experimentalFeatures', '__experimentalPreferredStyleVariations', '__experimentalSetIsInserterOpened', '__unstableGalleryWithImageBlocks', 'alignWide', 'allowedBlockTypes', 'bodyPlaceholder', 'codeEditingEnabled', 'colors', 'disableCustomColors', 'disableCustomFontSizes', 'disableCustomGradients', 'enableCustomLineHeight', 'enableCustomSpacing', 'enableCustomUnits', 'focusMode', 'fontSizes', 'gradients', 'hasFixedToolbar', 'hasReducedUI', 'imageDefaultSize', 'imageDimensions', 'imageEditing', 'imageSizes', 'isRTL', 'keepCaretInsideBlock', 'maxWidth', 'onUpdateDefaultBlockStyles', 'styles', 'template', 'templateLock', 'titlePlaceholder', 'supportsLayout', 'widgetTypesToHideFromLegacyWidgetBlock']),
97
97
  mediaUpload: hasUploadPermissions ? _utils.mediaUpload : undefined,
98
98
  __experimentalReusableBlocks: reusableBlocks,
99
99
  __experimentalFetchLinkSuggestions: (search, searchOptions) => (0, _coreData.__experimentalFetchLinkSuggestions)(search, searchOptions, settings),