@wordpress/editor 12.0.1 → 12.0.5

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 (331) hide show
  1. package/build/components/autocompleters/user.js +1 -1
  2. package/build/components/autosave-monitor/index.js +7 -1
  3. package/build/components/autosave-monitor/index.js.map +1 -1
  4. package/build/components/deprecated.js +6 -4
  5. package/build/components/deprecated.js.map +1 -1
  6. package/build/components/deprecated.native.js +26 -26
  7. package/build/components/document-outline/check.js +5 -4
  8. package/build/components/document-outline/check.js.map +1 -1
  9. package/build/components/document-outline/index.js +13 -9
  10. package/build/components/document-outline/index.js.map +1 -1
  11. package/build/components/document-outline/item.js +25 -22
  12. package/build/components/document-outline/item.js.map +1 -1
  13. package/build/components/editor-help/help-detail-navigation-screen.native.js +5 -4
  14. package/build/components/editor-help/help-detail-navigation-screen.native.js.map +1 -1
  15. package/build/components/editor-help/help-get-support-button.native.js +5 -4
  16. package/build/components/editor-help/help-get-support-button.native.js.map +1 -1
  17. package/build/components/editor-help/help-topic-row.native.js +6 -5
  18. package/build/components/editor-help/help-topic-row.native.js.map +1 -1
  19. package/build/components/editor-help/index.native.js +23 -18
  20. package/build/components/editor-help/index.native.js.map +1 -1
  21. package/build/components/editor-help/view-sections.native.js +16 -13
  22. package/build/components/editor-help/view-sections.native.js.map +1 -1
  23. package/build/components/editor-notices/index.js +5 -4
  24. package/build/components/editor-notices/index.js.map +1 -1
  25. package/build/components/entities-saved-states/entity-record-item.js +7 -6
  26. package/build/components/entities-saved-states/entity-record-item.js.map +1 -1
  27. package/build/components/entities-saved-states/entity-type-list.js +30 -20
  28. package/build/components/entities-saved-states/entity-type-list.js.map +1 -1
  29. package/build/components/entities-saved-states/index.js +51 -26
  30. package/build/components/entities-saved-states/index.js.map +1 -1
  31. package/build/components/error-boundary/index.js +5 -4
  32. package/build/components/error-boundary/index.js.map +1 -1
  33. package/build/components/global-keyboard-shortcuts/save-shortcut.js +4 -3
  34. package/build/components/global-keyboard-shortcuts/save-shortcut.js.map +1 -1
  35. package/build/components/index.js +22 -22
  36. package/build/components/index.native.js +4 -4
  37. package/build/components/page-attributes/check.js +4 -3
  38. package/build/components/page-attributes/check.js.map +1 -1
  39. package/build/components/page-attributes/order.js +5 -4
  40. package/build/components/page-attributes/order.js.map +1 -1
  41. package/build/components/page-attributes/parent.js +6 -3
  42. package/build/components/page-attributes/parent.js.map +1 -1
  43. package/build/components/post-author/check.js +4 -3
  44. package/build/components/post-author/check.js.map +1 -1
  45. package/build/components/post-author/combobox.js +6 -3
  46. package/build/components/post-author/combobox.js.map +1 -1
  47. package/build/components/post-comments/index.js +6 -4
  48. package/build/components/post-comments/index.js.map +1 -1
  49. package/build/components/post-excerpt/index.js +5 -4
  50. package/build/components/post-excerpt/index.js.map +1 -1
  51. package/build/components/post-featured-image/index.js +51 -41
  52. package/build/components/post-featured-image/index.js.map +1 -1
  53. package/build/components/post-format/check.js +5 -4
  54. package/build/components/post-format/check.js.map +1 -1
  55. package/build/components/post-format/index.js +1 -1
  56. package/build/components/post-last-revision/check.js +7 -5
  57. package/build/components/post-last-revision/check.js.map +1 -1
  58. package/build/components/post-last-revision/index.js +5 -4
  59. package/build/components/post-last-revision/index.js.map +1 -1
  60. package/build/components/post-pending-status/check.js +7 -5
  61. package/build/components/post-pending-status/check.js.map +1 -1
  62. package/build/components/post-pending-status/index.js +6 -4
  63. package/build/components/post-pending-status/index.js.map +1 -1
  64. package/build/components/post-pingbacks/index.js +6 -4
  65. package/build/components/post-pingbacks/index.js.map +1 -1
  66. package/build/components/post-preview-button/index.js +11 -7
  67. package/build/components/post-preview-button/index.js.map +1 -1
  68. package/build/components/post-publish-button/index.js +12 -4
  69. package/build/components/post-publish-button/index.js.map +1 -1
  70. package/build/components/post-publish-button/label.js +15 -12
  71. package/build/components/post-publish-button/label.js.map +1 -1
  72. package/build/components/post-publish-panel/index.js +4 -3
  73. package/build/components/post-publish-panel/index.js.map +1 -1
  74. package/build/components/post-publish-panel/maybe-post-format-panel.js +11 -8
  75. package/build/components/post-publish-panel/maybe-post-format-panel.js.map +1 -1
  76. package/build/components/post-publish-panel/maybe-tags-panel.js +7 -4
  77. package/build/components/post-publish-panel/maybe-tags-panel.js.map +1 -1
  78. package/build/components/post-publish-panel/postpublish.js +6 -5
  79. package/build/components/post-publish-panel/postpublish.js.map +1 -1
  80. package/build/components/post-publish-panel/prepublish.js +4 -3
  81. package/build/components/post-publish-panel/prepublish.js.map +1 -1
  82. package/build/components/post-saved-state/index.js +6 -5
  83. package/build/components/post-saved-state/index.js.map +1 -1
  84. package/build/components/post-schedule/check.js +6 -4
  85. package/build/components/post-schedule/check.js.map +1 -1
  86. package/build/components/post-schedule/index.js +15 -10
  87. package/build/components/post-schedule/index.js.map +1 -1
  88. package/build/components/post-schedule/label.js +5 -4
  89. package/build/components/post-schedule/label.js.map +1 -1
  90. package/build/components/post-slug/check.js +4 -3
  91. package/build/components/post-slug/check.js.map +1 -1
  92. package/build/components/post-slug/index.js +6 -5
  93. package/build/components/post-slug/index.js.map +1 -1
  94. package/build/components/post-sticky/check.js +7 -5
  95. package/build/components/post-sticky/check.js.map +1 -1
  96. package/build/components/post-sticky/index.js +5 -4
  97. package/build/components/post-sticky/index.js.map +1 -1
  98. package/build/components/post-switch-to-draft-button/index.js +7 -6
  99. package/build/components/post-switch-to-draft-button/index.js.map +1 -1
  100. package/build/components/post-taxonomies/check.js +6 -5
  101. package/build/components/post-taxonomies/check.js.map +1 -1
  102. package/build/components/post-taxonomies/flat-term-selector.js +155 -211
  103. package/build/components/post-taxonomies/flat-term-selector.js.map +1 -1
  104. package/build/components/post-taxonomies/hierarchical-term-selector.js +6 -5
  105. package/build/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  106. package/build/components/post-taxonomies/index.js +6 -5
  107. package/build/components/post-taxonomies/index.js.map +1 -1
  108. package/build/components/post-taxonomies/most-used-terms.js +5 -4
  109. package/build/components/post-taxonomies/most-used-terms.js.map +1 -1
  110. package/build/components/post-template/index.js +2 -1
  111. package/build/components/post-template/index.js.map +1 -1
  112. package/build/components/post-title/index.js +4 -2
  113. package/build/components/post-title/index.js.map +1 -1
  114. package/build/components/post-title/index.native.js +6 -5
  115. package/build/components/post-title/index.native.js.map +1 -1
  116. package/build/components/post-trash/check.js +8 -6
  117. package/build/components/post-trash/check.js.map +1 -1
  118. package/build/components/post-trash/index.js +8 -6
  119. package/build/components/post-trash/index.js.map +1 -1
  120. package/build/components/post-type-support-check/index.js +6 -5
  121. package/build/components/post-type-support-check/index.js.map +1 -1
  122. package/build/components/post-visibility/check.js +5 -4
  123. package/build/components/post-visibility/check.js.map +1 -1
  124. package/build/components/post-visibility/index.js +28 -24
  125. package/build/components/post-visibility/index.js.map +1 -1
  126. package/build/components/post-visibility/label.js +5 -3
  127. package/build/components/post-visibility/label.js.map +1 -1
  128. package/build/components/provider/index.js +9 -8
  129. package/build/components/provider/index.js.map +1 -1
  130. package/build/components/provider/index.native.js +17 -11
  131. package/build/components/provider/index.native.js.map +1 -1
  132. package/build/components/provider/use-block-editor-settings.js +1 -1
  133. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  134. package/build/components/table-of-contents/index.js +33 -26
  135. package/build/components/table-of-contents/index.js.map +1 -1
  136. package/build/components/table-of-contents/panel.js +5 -4
  137. package/build/components/table-of-contents/panel.js.map +1 -1
  138. package/build/components/template-validation-notice/index.js +6 -4
  139. package/build/components/template-validation-notice/index.js.map +1 -1
  140. package/build/components/theme-support-check/index.js +7 -6
  141. package/build/components/theme-support-check/index.js.map +1 -1
  142. package/build/hooks/custom-sources-backwards-compatibility.js +12 -8
  143. package/build/hooks/custom-sources-backwards-compatibility.js.map +1 -1
  144. package/build/hooks/default-autocompleters.js +2 -1
  145. package/build/hooks/default-autocompleters.js.map +1 -1
  146. package/build/index.js +4 -4
  147. package/build/store/actions.js +51 -30
  148. package/build/store/actions.js.map +1 -1
  149. package/build/store/actions.native.js +3 -2
  150. package/build/store/actions.native.js.map +1 -1
  151. package/build/store/constants.js +1 -1
  152. package/build/store/controls.js +10 -9
  153. package/build/store/controls.js.map +1 -1
  154. package/build/store/defaults.js +1 -1
  155. package/build/store/index.js +5 -3
  156. package/build/store/index.js.map +1 -1
  157. package/build/store/reducer.js +52 -22
  158. package/build/store/reducer.js.map +1 -1
  159. package/build/store/reducer.native.js +14 -4
  160. package/build/store/reducer.native.js.map +1 -1
  161. package/build/store/selectors.js +56 -37
  162. package/build/store/selectors.js.map +1 -1
  163. package/build/store/selectors.native.js +1 -1
  164. package/build/store/utils/notice-builder.js +1 -1
  165. package/build/utils/index.js +6 -6
  166. package/build/utils/media-upload/index.js +15 -11
  167. package/build/utils/media-upload/index.js.map +1 -1
  168. package/build/utils/url.js +1 -1
  169. package/build-module/components/autosave-monitor/index.js +7 -1
  170. package/build-module/components/autosave-monitor/index.js.map +1 -1
  171. package/build-module/components/deprecated.js +4 -3
  172. package/build-module/components/deprecated.js.map +1 -1
  173. package/build-module/components/document-outline/check.js +5 -4
  174. package/build-module/components/document-outline/check.js.map +1 -1
  175. package/build-module/components/document-outline/index.js +13 -9
  176. package/build-module/components/document-outline/index.js.map +1 -1
  177. package/build-module/components/document-outline/item.js +25 -22
  178. package/build-module/components/document-outline/item.js.map +1 -1
  179. package/build-module/components/editor-help/help-detail-navigation-screen.native.js +5 -4
  180. package/build-module/components/editor-help/help-detail-navigation-screen.native.js.map +1 -1
  181. package/build-module/components/editor-help/help-get-support-button.native.js +5 -4
  182. package/build-module/components/editor-help/help-get-support-button.native.js.map +1 -1
  183. package/build-module/components/editor-help/help-topic-row.native.js +6 -5
  184. package/build-module/components/editor-help/help-topic-row.native.js.map +1 -1
  185. package/build-module/components/editor-help/index.native.js +23 -19
  186. package/build-module/components/editor-help/index.native.js.map +1 -1
  187. package/build-module/components/editor-help/view-sections.native.js +15 -12
  188. package/build-module/components/editor-help/view-sections.native.js.map +1 -1
  189. package/build-module/components/editor-notices/index.js +5 -4
  190. package/build-module/components/editor-notices/index.js.map +1 -1
  191. package/build-module/components/entities-saved-states/entity-record-item.js +7 -6
  192. package/build-module/components/entities-saved-states/entity-record-item.js.map +1 -1
  193. package/build-module/components/entities-saved-states/entity-type-list.js +31 -19
  194. package/build-module/components/entities-saved-states/entity-type-list.js.map +1 -1
  195. package/build-module/components/entities-saved-states/index.js +50 -25
  196. package/build-module/components/entities-saved-states/index.js.map +1 -1
  197. package/build-module/components/error-boundary/index.js +5 -4
  198. package/build-module/components/error-boundary/index.js.map +1 -1
  199. package/build-module/components/global-keyboard-shortcuts/save-shortcut.js +4 -3
  200. package/build-module/components/global-keyboard-shortcuts/save-shortcut.js.map +1 -1
  201. package/build-module/components/page-attributes/check.js +4 -3
  202. package/build-module/components/page-attributes/check.js.map +1 -1
  203. package/build-module/components/page-attributes/order.js +5 -4
  204. package/build-module/components/page-attributes/order.js.map +1 -1
  205. package/build-module/components/page-attributes/parent.js +5 -2
  206. package/build-module/components/page-attributes/parent.js.map +1 -1
  207. package/build-module/components/post-author/check.js +4 -3
  208. package/build-module/components/post-author/check.js.map +1 -1
  209. package/build-module/components/post-author/combobox.js +6 -3
  210. package/build-module/components/post-author/combobox.js.map +1 -1
  211. package/build-module/components/post-comments/index.js +6 -4
  212. package/build-module/components/post-comments/index.js.map +1 -1
  213. package/build-module/components/post-excerpt/index.js +5 -4
  214. package/build-module/components/post-excerpt/index.js.map +1 -1
  215. package/build-module/components/post-featured-image/index.js +51 -41
  216. package/build-module/components/post-featured-image/index.js.map +1 -1
  217. package/build-module/components/post-format/check.js +5 -4
  218. package/build-module/components/post-format/check.js.map +1 -1
  219. package/build-module/components/post-last-revision/check.js +7 -5
  220. package/build-module/components/post-last-revision/check.js.map +1 -1
  221. package/build-module/components/post-last-revision/index.js +5 -4
  222. package/build-module/components/post-last-revision/index.js.map +1 -1
  223. package/build-module/components/post-pending-status/check.js +7 -5
  224. package/build-module/components/post-pending-status/check.js.map +1 -1
  225. package/build-module/components/post-pending-status/index.js +6 -4
  226. package/build-module/components/post-pending-status/index.js.map +1 -1
  227. package/build-module/components/post-pingbacks/index.js +6 -4
  228. package/build-module/components/post-pingbacks/index.js.map +1 -1
  229. package/build-module/components/post-preview-button/index.js +11 -7
  230. package/build-module/components/post-preview-button/index.js.map +1 -1
  231. package/build-module/components/post-publish-button/index.js +12 -4
  232. package/build-module/components/post-publish-button/index.js.map +1 -1
  233. package/build-module/components/post-publish-button/label.js +15 -12
  234. package/build-module/components/post-publish-button/label.js.map +1 -1
  235. package/build-module/components/post-publish-panel/index.js +4 -3
  236. package/build-module/components/post-publish-panel/index.js.map +1 -1
  237. package/build-module/components/post-publish-panel/maybe-post-format-panel.js +11 -8
  238. package/build-module/components/post-publish-panel/maybe-post-format-panel.js.map +1 -1
  239. package/build-module/components/post-publish-panel/maybe-tags-panel.js +7 -4
  240. package/build-module/components/post-publish-panel/maybe-tags-panel.js.map +1 -1
  241. package/build-module/components/post-publish-panel/postpublish.js +6 -5
  242. package/build-module/components/post-publish-panel/postpublish.js.map +1 -1
  243. package/build-module/components/post-publish-panel/prepublish.js +4 -3
  244. package/build-module/components/post-publish-panel/prepublish.js.map +1 -1
  245. package/build-module/components/post-saved-state/index.js +6 -5
  246. package/build-module/components/post-saved-state/index.js.map +1 -1
  247. package/build-module/components/post-schedule/check.js +6 -4
  248. package/build-module/components/post-schedule/check.js.map +1 -1
  249. package/build-module/components/post-schedule/index.js +15 -10
  250. package/build-module/components/post-schedule/index.js.map +1 -1
  251. package/build-module/components/post-schedule/label.js +6 -4
  252. package/build-module/components/post-schedule/label.js.map +1 -1
  253. package/build-module/components/post-slug/check.js +4 -3
  254. package/build-module/components/post-slug/check.js.map +1 -1
  255. package/build-module/components/post-slug/index.js +6 -5
  256. package/build-module/components/post-slug/index.js.map +1 -1
  257. package/build-module/components/post-sticky/check.js +7 -5
  258. package/build-module/components/post-sticky/check.js.map +1 -1
  259. package/build-module/components/post-sticky/index.js +5 -4
  260. package/build-module/components/post-sticky/index.js.map +1 -1
  261. package/build-module/components/post-switch-to-draft-button/index.js +7 -6
  262. package/build-module/components/post-switch-to-draft-button/index.js.map +1 -1
  263. package/build-module/components/post-taxonomies/check.js +6 -5
  264. package/build-module/components/post-taxonomies/check.js.map +1 -1
  265. package/build-module/components/post-taxonomies/flat-term-selector.js +157 -214
  266. package/build-module/components/post-taxonomies/flat-term-selector.js.map +1 -1
  267. package/build-module/components/post-taxonomies/hierarchical-term-selector.js +4 -3
  268. package/build-module/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  269. package/build-module/components/post-taxonomies/index.js +6 -5
  270. package/build-module/components/post-taxonomies/index.js.map +1 -1
  271. package/build-module/components/post-taxonomies/most-used-terms.js +5 -4
  272. package/build-module/components/post-taxonomies/most-used-terms.js.map +1 -1
  273. package/build-module/components/post-template/index.js +2 -1
  274. package/build-module/components/post-template/index.js.map +1 -1
  275. package/build-module/components/post-title/index.js +4 -2
  276. package/build-module/components/post-title/index.js.map +1 -1
  277. package/build-module/components/post-title/index.native.js +6 -5
  278. package/build-module/components/post-title/index.native.js.map +1 -1
  279. package/build-module/components/post-trash/check.js +8 -6
  280. package/build-module/components/post-trash/check.js.map +1 -1
  281. package/build-module/components/post-trash/index.js +8 -6
  282. package/build-module/components/post-trash/index.js.map +1 -1
  283. package/build-module/components/post-type-support-check/index.js +6 -5
  284. package/build-module/components/post-type-support-check/index.js.map +1 -1
  285. package/build-module/components/post-visibility/check.js +5 -4
  286. package/build-module/components/post-visibility/check.js.map +1 -1
  287. package/build-module/components/post-visibility/index.js +28 -24
  288. package/build-module/components/post-visibility/index.js.map +1 -1
  289. package/build-module/components/post-visibility/label.js +5 -3
  290. package/build-module/components/post-visibility/label.js.map +1 -1
  291. package/build-module/components/provider/index.js +9 -8
  292. package/build-module/components/provider/index.js.map +1 -1
  293. package/build-module/components/provider/index.native.js +13 -9
  294. package/build-module/components/provider/index.native.js.map +1 -1
  295. package/build-module/components/provider/use-block-editor-settings.js +1 -1
  296. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  297. package/build-module/components/table-of-contents/index.js +33 -26
  298. package/build-module/components/table-of-contents/index.js.map +1 -1
  299. package/build-module/components/table-of-contents/panel.js +5 -4
  300. package/build-module/components/table-of-contents/panel.js.map +1 -1
  301. package/build-module/components/template-validation-notice/index.js +6 -4
  302. package/build-module/components/template-validation-notice/index.js.map +1 -1
  303. package/build-module/components/theme-support-check/index.js +7 -6
  304. package/build-module/components/theme-support-check/index.js.map +1 -1
  305. package/build-module/hooks/custom-sources-backwards-compatibility.js +12 -8
  306. package/build-module/hooks/custom-sources-backwards-compatibility.js.map +1 -1
  307. package/build-module/hooks/default-autocompleters.js +2 -1
  308. package/build-module/hooks/default-autocompleters.js.map +1 -1
  309. package/build-module/store/actions.js +27 -12
  310. package/build-module/store/actions.js.map +1 -1
  311. package/build-module/store/actions.native.js +2 -1
  312. package/build-module/store/actions.native.js.map +1 -1
  313. package/build-module/store/controls.js +8 -7
  314. package/build-module/store/controls.js.map +1 -1
  315. package/build-module/store/reducer.js +44 -14
  316. package/build-module/store/reducer.js.map +1 -1
  317. package/build-module/store/reducer.native.js +12 -3
  318. package/build-module/store/reducer.native.js.map +1 -1
  319. package/build-module/store/selectors.js +7 -4
  320. package/build-module/store/selectors.js.map +1 -1
  321. package/build-module/utils/media-upload/index.js +15 -11
  322. package/build-module/utils/media-upload/index.js.map +1 -1
  323. package/package.json +31 -31
  324. package/src/components/autosave-monitor/index.js +5 -0
  325. package/src/components/autosave-monitor/test/index.js +10 -4
  326. package/src/components/editor-help/index.native.js +116 -110
  327. package/src/components/entities-saved-states/entity-type-list.js +29 -10
  328. package/src/components/entities-saved-states/index.js +38 -8
  329. package/src/components/post-taxonomies/flat-term-selector.js +220 -254
  330. package/src/components/post-title/index.js +4 -2
  331. package/src/components/provider/use-block-editor-settings.js +0 -2
@@ -3,19 +3,20 @@ import { createElement, Fragment } from "@wordpress/element";
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
- import { debounce, escape as escapeString, find, get, invoke, isEmpty, uniqBy } from 'lodash';
6
+ import { escape as escapeString, find, get, uniqBy } from 'lodash';
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
10
 
11
11
  import { __, _x, sprintf } from '@wordpress/i18n';
12
- import { Component } from '@wordpress/element';
13
- import { FormTokenField, withFilters, withSpokenMessages } from '@wordpress/components';
14
- import { withSelect, withDispatch } from '@wordpress/data';
12
+ import { useEffect, useMemo, useState } from '@wordpress/element';
13
+ import { FormTokenField, withFilters } from '@wordpress/components';
14
+ import { useSelect, useDispatch } from '@wordpress/data';
15
15
  import { store as coreStore } from '@wordpress/core-data';
16
- import { compose } from '@wordpress/compose';
16
+ import { useDebounce } from '@wordpress/compose';
17
17
  import apiFetch from '@wordpress/api-fetch';
18
18
  import { addQueryArgs } from '@wordpress/url';
19
+ import { speak } from '@wordpress/a11y';
19
20
  /**
20
21
  * Internal dependencies
21
22
  */
@@ -23,6 +24,14 @@ import { addQueryArgs } from '@wordpress/url';
23
24
  import { store as editorStore } from '../../store';
24
25
  import { unescapeString, unescapeTerm, unescapeTerms } from '../../utils/terms';
25
26
  import MostUsedTerms from './most-used-terms';
27
+ /**
28
+ * Shared reference to an empty array for cases where it is important to avoid
29
+ * returning a new array reference on every invocation.
30
+ *
31
+ * @type {Array<any>}
32
+ */
33
+
34
+ const EMPTY_ARRAY = [];
26
35
  /**
27
36
  * Module constants
28
37
  */
@@ -32,254 +41,188 @@ const DEFAULT_QUERY = {
32
41
  per_page: MAX_TERMS_SUGGESTIONS,
33
42
  orderby: 'count',
34
43
  order: 'desc',
35
- _fields: 'id,name,count'
44
+ _fields: 'id,name',
45
+ context: 'view'
36
46
  };
37
47
 
38
48
  const isSameTermName = (termA, termB) => unescapeString(termA).toLowerCase() === unescapeString(termB).toLowerCase();
39
49
 
40
50
  const termNamesToIds = (names, terms) => {
41
51
  return names.map(termName => find(terms, term => isSameTermName(term.name, termName)).id);
42
- };
52
+ }; // Tries to create a term or fetch it if it already exists.
43
53
 
44
- class FlatTermSelector extends Component {
45
- constructor() {
46
- super(...arguments);
47
- this.onChange = this.onChange.bind(this);
48
- this.searchTerms = debounce(this.searchTerms.bind(this), 500);
49
- this.findOrCreateTerm = this.findOrCreateTerm.bind(this);
50
- this.appendTerm = this.appendTerm.bind(this);
51
- this.state = {
52
- loading: !isEmpty(this.props.terms),
53
- availableTerms: [],
54
- selectedTerms: []
55
- };
56
- }
57
-
58
- componentDidMount() {
59
- if (!isEmpty(this.props.terms)) {
60
- this.initRequest = this.fetchTerms({
61
- include: this.props.terms.join(','),
62
- per_page: -1
63
- });
64
- this.initRequest.then(() => {
65
- this.setState({
66
- loading: false
67
- });
68
- }, xhr => {
69
- if (xhr.statusText === 'abort') {
70
- return;
71
- }
72
54
 
73
- this.setState({
74
- loading: false
75
- });
55
+ function findOrCreateTerm(termName, restBase) {
56
+ const escapedTermName = escapeString(termName);
57
+ return apiFetch({
58
+ path: `/wp/v2/${restBase}`,
59
+ method: 'POST',
60
+ data: {
61
+ name: escapedTermName
62
+ }
63
+ }).catch(error => {
64
+ const errorCode = error.code;
65
+
66
+ if (errorCode === 'term_exists') {
67
+ // If the terms exist, fetch it instead of creating a new one.
68
+ const addRequest = apiFetch({
69
+ path: addQueryArgs(`/wp/v2/${restBase}`, { ...DEFAULT_QUERY,
70
+ search: escapedTermName
71
+ })
72
+ }).then(unescapeTerms);
73
+ return addRequest.then(searchResult => {
74
+ return find(searchResult, result => isSameTermName(result.name, termName));
76
75
  });
77
76
  }
78
- }
79
-
80
- componentWillUnmount() {
81
- invoke(this.initRequest, ['abort']);
82
- invoke(this.searchRequest, ['abort']);
83
- }
84
77
 
85
- componentDidUpdate(prevProps) {
86
- if (prevProps.terms !== this.props.terms) {
87
- this.updateSelectedTerms(this.props.terms);
88
- }
89
- }
78
+ return Promise.reject(error);
79
+ }).then(unescapeTerm);
80
+ }
90
81
 
91
- fetchTerms(params = {}) {
82
+ function FlatTermSelector(_ref) {
83
+ let {
84
+ slug
85
+ } = _ref;
86
+ const [values, setValues] = useState([]);
87
+ const [search, setSearch] = useState('');
88
+ const debouncedSearch = useDebounce(setSearch, 500);
89
+ const {
90
+ terms,
91
+ termIds,
92
+ taxonomy,
93
+ hasAssignAction,
94
+ hasCreateAction,
95
+ hasResolvedTerms
96
+ } = useSelect(select => {
92
97
  const {
93
- taxonomy
94
- } = this.props;
95
- const query = { ...DEFAULT_QUERY,
96
- ...params
97
- };
98
- const request = apiFetch({
99
- path: addQueryArgs(`/wp/v2/${taxonomy.rest_base}`, query)
100
- });
101
- request.then(unescapeTerms).then(terms => {
102
- this.setState(state => ({
103
- availableTerms: state.availableTerms.concat(terms.filter(term => !find(state.availableTerms, availableTerm => availableTerm.id === term.id)))
104
- }));
105
- this.updateSelectedTerms(this.props.terms);
106
- });
107
- return request;
108
- }
109
-
110
- updateSelectedTerms(terms = []) {
111
- const selectedTerms = terms.reduce((accumulator, termId) => {
112
- const termObject = find(this.state.availableTerms, term => term.id === termId);
98
+ getCurrentPost,
99
+ getEditedPostAttribute
100
+ } = select(editorStore);
101
+ const {
102
+ getEntityRecords,
103
+ getTaxonomy,
104
+ hasFinishedResolution
105
+ } = select(coreStore);
106
+ const post = getCurrentPost();
113
107
 
114
- if (termObject) {
115
- accumulator.push(termObject.name);
116
- }
108
+ const _taxonomy = getTaxonomy(slug);
117
109
 
118
- return accumulator;
119
- }, []);
120
- this.setState({
121
- selectedTerms
122
- });
123
- }
110
+ const _termIds = _taxonomy ? getEditedPostAttribute(_taxonomy.rest_base) : EMPTY_ARRAY;
124
111
 
125
- findOrCreateTerm(termName) {
112
+ const query = { ...DEFAULT_QUERY,
113
+ include: _termIds.join(','),
114
+ per_page: -1
115
+ };
116
+ return {
117
+ hasCreateAction: _taxonomy ? get(post, ['_links', 'wp:action-create-' + _taxonomy.rest_base], false) : false,
118
+ hasAssignAction: _taxonomy ? get(post, ['_links', 'wp:action-assign-' + _taxonomy.rest_base], false) : false,
119
+ taxonomy: _taxonomy,
120
+ termIds: _termIds,
121
+ terms: _termIds.length ? getEntityRecords('taxonomy', slug, query) : EMPTY_ARRAY,
122
+ hasResolvedTerms: hasFinishedResolution('getEntityRecords', ['taxonomy', slug, query])
123
+ };
124
+ }, [slug]);
125
+ const {
126
+ searchResults
127
+ } = useSelect(select => {
126
128
  const {
127
- taxonomy
128
- } = this.props;
129
- const termNameEscaped = escapeString(termName); // Tries to create a term or fetch it if it already exists.
130
-
131
- return apiFetch({
132
- path: `/wp/v2/${taxonomy.rest_base}`,
133
- method: 'POST',
134
- data: {
135
- name: termNameEscaped
136
- }
137
- }).catch(error => {
138
- const errorCode = error.code;
129
+ getEntityRecords
130
+ } = select(coreStore);
131
+ return {
132
+ searchResults: !!search ? getEntityRecords('taxonomy', slug, { ...DEFAULT_QUERY,
133
+ search
134
+ }) : EMPTY_ARRAY
135
+ };
136
+ }, [search]); // Update terms state only after the selectors are resolved.
137
+ // We're using this to avoid terms temporarily disappearing on slow networks
138
+ // while core data makes REST API requests.
139
+
140
+ useEffect(() => {
141
+ if (hasResolvedTerms) {
142
+ const newValues = terms.map(term => unescapeString(term.name));
143
+ setValues(newValues);
144
+ }
145
+ }, [terms, hasResolvedTerms]);
146
+ const suggestions = useMemo(() => {
147
+ return (searchResults !== null && searchResults !== void 0 ? searchResults : []).map(term => unescapeString(term.name));
148
+ }, [searchResults]);
149
+ const {
150
+ editPost
151
+ } = useDispatch(editorStore);
139
152
 
140
- if (errorCode === 'term_exists') {
141
- // If the terms exist, fetch it instead of creating a new one.
142
- this.addRequest = apiFetch({
143
- path: addQueryArgs(`/wp/v2/${taxonomy.rest_base}`, { ...DEFAULT_QUERY,
144
- search: termNameEscaped
145
- })
146
- }).then(unescapeTerms);
147
- return this.addRequest.then(searchResult => {
148
- return find(searchResult, result => isSameTermName(result.name, termName));
149
- });
150
- }
153
+ if (!hasAssignAction) {
154
+ return null;
155
+ }
151
156
 
152
- return Promise.reject(error);
153
- }).then(unescapeTerm);
157
+ function onUpdateTerms(newTermIds) {
158
+ editPost({
159
+ [taxonomy.rest_base]: newTermIds
160
+ });
154
161
  }
155
162
 
156
- onChange(termNames) {
163
+ function onChange(termNames) {
164
+ const availableTerms = [...terms, ...(searchResults !== null && searchResults !== void 0 ? searchResults : [])];
157
165
  const uniqueTerms = uniqBy(termNames, term => term.toLowerCase());
158
- this.setState({
159
- selectedTerms: uniqueTerms
160
- });
161
- const newTermNames = uniqueTerms.filter(termName => !find(this.state.availableTerms, term => isSameTermName(term.name, termName)));
166
+ const newTermNames = uniqueTerms.filter(termName => !find(availableTerms, term => isSameTermName(term.name, termName))); // Optimistically update term values.
167
+ // The selector will always re-fetch terms later.
168
+
169
+ setValues(uniqueTerms);
162
170
 
163
171
  if (newTermNames.length === 0) {
164
- return this.props.onUpdateTerms(termNamesToIds(uniqueTerms, this.state.availableTerms), this.props.taxonomy.rest_base);
172
+ return onUpdateTerms(termNamesToIds(uniqueTerms, availableTerms));
165
173
  }
166
174
 
167
- Promise.all(newTermNames.map(this.findOrCreateTerm)).then(newTerms => {
168
- const newAvailableTerms = this.state.availableTerms.concat(newTerms);
169
- this.setState({
170
- availableTerms: newAvailableTerms
171
- });
172
- return this.props.onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms), this.props.taxonomy.rest_base);
173
- });
174
- }
175
-
176
- searchTerms(search = '') {
177
- invoke(this.searchRequest, ['abort']);
178
-
179
- if (search.length >= 3) {
180
- this.searchRequest = this.fetchTerms({
181
- search
182
- });
175
+ if (!hasCreateAction) {
176
+ return;
183
177
  }
184
- }
185
178
 
186
- appendTerm(newTerm) {
187
- const {
188
- onUpdateTerms,
189
- taxonomy,
190
- terms = [],
191
- slug,
192
- speak
193
- } = this.props;
179
+ Promise.all(newTermNames.map(termName => findOrCreateTerm(termName, taxonomy.rest_base))).then(newTerms => {
180
+ const newAvailableTerms = availableTerms.concat(newTerms);
181
+ return onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms));
182
+ });
183
+ }
194
184
 
195
- if (terms.includes(newTerm.id)) {
185
+ function appendTerm(newTerm) {
186
+ if (termIds.includes(newTerm.id)) {
196
187
  return;
197
188
  }
198
189
 
199
- const newTerms = [...terms, newTerm.id];
190
+ const newTermIds = [...termIds, newTerm.id];
200
191
  const termAddedMessage = sprintf(
201
192
  /* translators: %s: term name. */
202
193
  _x('%s added', 'term'), get(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? __('Tag') : __('Term')));
203
194
  speak(termAddedMessage, 'assertive');
204
- this.setState({
205
- availableTerms: [...this.state.availableTerms, newTerm]
206
- });
207
- onUpdateTerms(newTerms, taxonomy.rest_base);
195
+ onUpdateTerms(newTermIds);
208
196
  }
209
197
 
210
- render() {
211
- const {
212
- slug,
213
- taxonomy,
214
- hasAssignAction
215
- } = this.props;
216
-
217
- if (!hasAssignAction) {
218
- return null;
198
+ const newTermLabel = get(taxonomy, ['labels', 'add_new_item'], slug === 'post_tag' ? __('Add new tag') : __('Add new Term'));
199
+ const singularName = get(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? __('Tag') : __('Term'));
200
+ const termAddedLabel = sprintf(
201
+ /* translators: %s: term name. */
202
+ _x('%s added', 'term'), singularName);
203
+ const termRemovedLabel = sprintf(
204
+ /* translators: %s: term name. */
205
+ _x('%s removed', 'term'), singularName);
206
+ const removeTermLabel = sprintf(
207
+ /* translators: %s: term name. */
208
+ _x('Remove %s', 'term'), singularName);
209
+ return createElement(Fragment, null, createElement(FormTokenField, {
210
+ value: values,
211
+ suggestions: suggestions,
212
+ onChange: onChange,
213
+ onInputChange: debouncedSearch,
214
+ maxSuggestions: MAX_TERMS_SUGGESTIONS,
215
+ label: newTermLabel,
216
+ messages: {
217
+ added: termAddedLabel,
218
+ removed: termRemovedLabel,
219
+ remove: removeTermLabel
219
220
  }
220
-
221
- const {
222
- loading,
223
- availableTerms,
224
- selectedTerms
225
- } = this.state;
226
- const termNames = availableTerms.map(term => term.name);
227
- const newTermLabel = get(taxonomy, ['labels', 'add_new_item'], slug === 'post_tag' ? __('Add new tag') : __('Add new Term'));
228
- const singularName = get(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? __('Tag') : __('Term'));
229
- const termAddedLabel = sprintf(
230
- /* translators: %s: term name. */
231
- _x('%s added', 'term'), singularName);
232
- const termRemovedLabel = sprintf(
233
- /* translators: %s: term name. */
234
- _x('%s removed', 'term'), singularName);
235
- const removeTermLabel = sprintf(
236
- /* translators: %s: term name. */
237
- _x('Remove %s', 'term'), singularName);
238
- return createElement(Fragment, null, createElement(FormTokenField, {
239
- value: selectedTerms,
240
- suggestions: termNames,
241
- onChange: this.onChange,
242
- onInputChange: this.searchTerms,
243
- maxSuggestions: MAX_TERMS_SUGGESTIONS,
244
- disabled: loading,
245
- label: newTermLabel,
246
- messages: {
247
- added: termAddedLabel,
248
- removed: termRemovedLabel,
249
- remove: removeTermLabel
250
- }
251
- }), createElement(MostUsedTerms, {
252
- taxonomy: taxonomy,
253
- onSelect: this.appendTerm
254
- }));
255
- }
256
-
221
+ }), createElement(MostUsedTerms, {
222
+ taxonomy: taxonomy,
223
+ onSelect: appendTerm
224
+ }));
257
225
  }
258
226
 
259
- export default compose(withSelect((select, {
260
- slug
261
- }) => {
262
- const {
263
- getCurrentPost
264
- } = select(editorStore);
265
- const {
266
- getTaxonomy
267
- } = select(coreStore);
268
- const taxonomy = getTaxonomy(slug);
269
- return {
270
- hasCreateAction: taxonomy ? get(getCurrentPost(), ['_links', 'wp:action-create-' + taxonomy.rest_base], false) : false,
271
- hasAssignAction: taxonomy ? get(getCurrentPost(), ['_links', 'wp:action-assign-' + taxonomy.rest_base], false) : false,
272
- terms: taxonomy ? select(editorStore).getEditedPostAttribute(taxonomy.rest_base) : [],
273
- taxonomy
274
- };
275
- }), withDispatch(dispatch => {
276
- return {
277
- onUpdateTerms(terms, restBase) {
278
- dispatch(editorStore).editPost({
279
- [restBase]: terms
280
- });
281
- }
282
-
283
- };
284
- }), withSpokenMessages, withFilters('editor.PostTaxonomyType'))(FlatTermSelector);
227
+ export default withFilters('editor.PostTaxonomyType')(FlatTermSelector);
285
228
  //# sourceMappingURL=flat-term-selector.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/editor/src/components/post-taxonomies/flat-term-selector.js"],"names":["debounce","escape","escapeString","find","get","invoke","isEmpty","uniqBy","__","_x","sprintf","Component","FormTokenField","withFilters","withSpokenMessages","withSelect","withDispatch","store","coreStore","compose","apiFetch","addQueryArgs","editorStore","unescapeString","unescapeTerm","unescapeTerms","MostUsedTerms","MAX_TERMS_SUGGESTIONS","DEFAULT_QUERY","per_page","orderby","order","_fields","isSameTermName","termA","termB","toLowerCase","termNamesToIds","names","terms","map","termName","term","name","id","FlatTermSelector","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","concat","filter","availableTerm","reduce","accumulator","termId","termObject","push","termNameEscaped","method","data","catch","error","errorCode","code","addRequest","search","searchResult","result","Promise","reject","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","getTaxonomy","hasCreateAction","getEditedPostAttribute","dispatch","restBase","editPost"],"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":["escape","escapeString","find","get","uniqBy","__","_x","sprintf","useEffect","useMemo","useState","FormTokenField","withFilters","useSelect","useDispatch","store","coreStore","useDebounce","apiFetch","addQueryArgs","speak","editorStore","unescapeString","unescapeTerm","unescapeTerms","MostUsedTerms","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","searchResult","result","Promise","reject","FlatTermSelector","slug","values","setValues","setSearch","debouncedSearch","termIds","taxonomy","hasAssignAction","hasCreateAction","hasResolvedTerms","select","getCurrentPost","getEditedPostAttribute","getEntityRecords","getTaxonomy","hasFinishedResolution","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"]}
@@ -137,9 +137,10 @@ export function getFilterMatcher(filterValue) {
137
137
  * @return {WPElement} Hierarchical term selector component.
138
138
  */
139
139
 
140
- function HierarchicalTermSelector({
141
- slug
142
- }) {
140
+ function HierarchicalTermSelector(_ref) {
141
+ let {
142
+ slug
143
+ } = _ref;
143
144
  const [adding, setAdding] = useState(false);
144
145
  const [formName, setFormName] = useState('');
145
146
  /**