newspack-components 4.3.0 → 4.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/DEVELOPMENT.md +868 -0
  3. package/colors/colors.module.scss +52 -2
  4. package/copy-styles.js +3 -2
  5. package/dist/cjs/accordion/index.js +17 -12
  6. package/dist/cjs/action-card/index.js +176 -139
  7. package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
  8. package/dist/cjs/autocomplete-with-latest-posts/index.js +172 -110
  9. package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
  10. package/dist/cjs/badge/index.js +7 -7
  11. package/dist/cjs/box-contrast/index.js +19 -15
  12. package/dist/cjs/button/index.js +41 -26
  13. package/dist/cjs/button-props/button-props.js +5 -5
  14. package/dist/cjs/button-props/index.js +2 -2
  15. package/dist/cjs/card/core-card.js +110 -52
  16. package/dist/cjs/card/index.js +74 -67
  17. package/dist/cjs/card/style-core.scss +93 -25
  18. package/dist/cjs/card/style.scss +2 -2
  19. package/dist/cjs/card-feature/index.js +141 -0
  20. package/dist/cjs/card-feature/style.scss +75 -0
  21. package/dist/cjs/card-form/index.js +144 -0
  22. package/dist/cjs/card-form/style.scss +20 -0
  23. package/dist/cjs/card-settings-group/index.js +36 -16
  24. package/dist/cjs/card-sortable-list/index.js +176 -140
  25. package/dist/cjs/category-autocomplete/index.js +175 -155
  26. package/dist/cjs/color-picker/index.js +41 -23
  27. package/dist/cjs/color-picker/index.test.js +82 -0
  28. package/dist/cjs/color-picker/style.scss +11 -13
  29. package/dist/cjs/confirm-dialog/index.js +86 -22
  30. package/dist/cjs/consts.js +1 -1
  31. package/dist/cjs/custom-select-control/index.js +39 -28
  32. package/dist/cjs/dataviews/index.js +38 -0
  33. package/dist/cjs/dataviews/style.scss +9 -0
  34. package/dist/cjs/divider/index.js +26 -21
  35. package/dist/cjs/footer/index.js +36 -30
  36. package/dist/cjs/form-token-field/index.js +51 -40
  37. package/dist/cjs/global-notices/index.js +5 -5
  38. package/dist/cjs/grid/index.js +25 -19
  39. package/dist/cjs/grid/style.scss +6 -1
  40. package/dist/cjs/handoff/index.js +204 -156
  41. package/dist/cjs/handoff-message/index.js +12 -7
  42. package/dist/cjs/hooks/index.js +10 -8
  43. package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
  44. package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
  45. package/dist/cjs/hooks/useObjectState.js +21 -12
  46. package/dist/cjs/hooks/useObjectState.test.js +55 -33
  47. package/dist/cjs/hooks/useOnClickOutside.js +6 -6
  48. package/dist/cjs/hooks/usePrompt.js +10 -13
  49. package/dist/cjs/image-upload/index.js +114 -123
  50. package/dist/cjs/image-upload/index.test.js +11 -13
  51. package/dist/cjs/image-upload/style.scss +12 -40
  52. package/dist/cjs/index.js +136 -104
  53. package/dist/cjs/info-button/index.js +43 -32
  54. package/dist/cjs/integration-icons/active-campaign.js +22 -0
  55. package/dist/cjs/integration-icons/constant-contact.js +28 -0
  56. package/dist/cjs/integration-icons/fundraise-up.js +25 -0
  57. package/dist/cjs/integration-icons/index.js +48 -0
  58. package/dist/cjs/integration-icons/mailchimp.js +19 -0
  59. package/dist/cjs/integration-icons/salesforce.js +17 -0
  60. package/dist/cjs/integration-icons/wisepops.js +20 -0
  61. package/dist/cjs/modal/index.js +22 -19
  62. package/dist/cjs/modal/style.scss +4 -0
  63. package/dist/cjs/newspack-icon/index.js +45 -38
  64. package/dist/cjs/notice/index.js +64 -55
  65. package/dist/cjs/plugin-installer/index.js +259 -253
  66. package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
  67. package/dist/cjs/plugin-settings/index.js +217 -200
  68. package/dist/cjs/plugin-toggle/index.js +192 -199
  69. package/dist/cjs/popover/index.js +41 -28
  70. package/dist/cjs/position-control/index.js +24 -23
  71. package/dist/cjs/progress-bar/index.js +71 -59
  72. package/dist/cjs/progress-bar/index.test.js +62 -68
  73. package/dist/cjs/proxied-imports/router.js +3 -3
  74. package/dist/cjs/radio-control/index.js +40 -27
  75. package/dist/cjs/section-header/index.js +103 -58
  76. package/dist/cjs/section-header/style.scss +31 -11
  77. package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
  78. package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
  79. package/dist/cjs/select-control/index.js +52 -40
  80. package/dist/cjs/settings/MinMaxSetting.js +30 -20
  81. package/dist/cjs/settings/SettingsCard.js +20 -17
  82. package/dist/cjs/settings/SettingsSection.js +22 -21
  83. package/dist/cjs/settings/index.js +5 -5
  84. package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
  85. package/dist/cjs/steps-list/index.js +44 -34
  86. package/dist/cjs/steps-list-item/index.js +47 -39
  87. package/dist/cjs/style-card/index.js +70 -63
  88. package/dist/cjs/tabbed-navigation/index.js +38 -36
  89. package/dist/cjs/text-control/index.js +27 -25
  90. package/dist/cjs/utils/color.js +4 -4
  91. package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
  92. package/dist/cjs/utils/index.js +31 -19
  93. package/dist/cjs/utils/style.scss +8 -0
  94. package/dist/cjs/waiting/index.js +48 -37
  95. package/dist/cjs/web-preview/index.js +217 -211
  96. package/dist/cjs/with-wizard/index.js +362 -364
  97. package/dist/cjs/with-wizard/style.scss +4 -54
  98. package/dist/cjs/with-wizard-screen/index.js +54 -58
  99. package/dist/cjs/with-wizard-screen/style.scss +41 -3
  100. package/dist/cjs/wizard/components/WizardError.js +20 -18
  101. package/dist/cjs/wizard/components/WizardSnackbar.js +26 -23
  102. package/dist/cjs/wizard/index.js +176 -114
  103. package/dist/cjs/wizard/store/index.js +171 -123
  104. package/dist/cjs/wizard/store/utils.js +13 -8
  105. package/dist/esm/accordion/index.js +14 -9
  106. package/dist/esm/action-card/index.js +168 -123
  107. package/dist/esm/autocomplete-tokenfield/index.js +248 -222
  108. package/dist/esm/autocomplete-with-latest-posts/index.js +169 -103
  109. package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
  110. package/dist/esm/badge/index.js +5 -5
  111. package/dist/esm/box-contrast/index.js +15 -11
  112. package/dist/esm/button/index.js +39 -21
  113. package/dist/esm/button-props/button-props.js +1 -1
  114. package/dist/esm/card/core-card.js +109 -47
  115. package/dist/esm/card/index.js +69 -54
  116. package/dist/esm/card/style-core.scss +93 -25
  117. package/dist/esm/card/style.scss +2 -2
  118. package/dist/esm/card-feature/index.js +131 -0
  119. package/dist/esm/card-feature/style.scss +75 -0
  120. package/dist/esm/card-form/index.js +134 -0
  121. package/dist/esm/card-form/style.scss +20 -0
  122. package/dist/esm/card-settings-group/index.js +33 -14
  123. package/dist/esm/card-sortable-list/index.js +170 -126
  124. package/dist/esm/category-autocomplete/index.js +168 -140
  125. package/dist/esm/color-picker/index.js +39 -21
  126. package/dist/esm/color-picker/index.test.js +78 -0
  127. package/dist/esm/color-picker/style.scss +11 -13
  128. package/dist/esm/confirm-dialog/index.js +85 -18
  129. package/dist/esm/consts.js +1 -1
  130. package/dist/esm/custom-select-control/index.js +34 -15
  131. package/dist/esm/dataviews/index.js +34 -0
  132. package/dist/esm/dataviews/style.scss +9 -0
  133. package/dist/esm/divider/index.js +24 -16
  134. package/dist/esm/footer/index.js +34 -28
  135. package/dist/esm/form-token-field/index.js +46 -27
  136. package/dist/esm/global-notices/index.js +3 -3
  137. package/dist/esm/grid/index.js +23 -14
  138. package/dist/esm/grid/style.scss +6 -1
  139. package/dist/esm/handoff/index.js +199 -143
  140. package/dist/esm/handoff-message/index.js +10 -6
  141. package/dist/esm/hooks/index.js +8 -6
  142. package/dist/esm/hooks/use-confirm-dialog.js +73 -0
  143. package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
  144. package/dist/esm/hooks/useObjectState.js +19 -9
  145. package/dist/esm/hooks/useObjectState.test.js +54 -32
  146. package/dist/esm/hooks/useOnClickOutside.js +4 -4
  147. package/dist/esm/hooks/usePrompt.js +9 -11
  148. package/dist/esm/image-upload/index.js +110 -111
  149. package/dist/esm/image-upload/index.test.js +11 -13
  150. package/dist/esm/image-upload/style.scss +12 -40
  151. package/dist/esm/index.js +7 -1
  152. package/dist/esm/info-button/index.js +38 -19
  153. package/dist/esm/integration-icons/active-campaign.js +16 -0
  154. package/dist/esm/integration-icons/constant-contact.js +22 -0
  155. package/dist/esm/integration-icons/fundraise-up.js +19 -0
  156. package/dist/esm/integration-icons/index.js +6 -0
  157. package/dist/esm/integration-icons/mailchimp.js +13 -0
  158. package/dist/esm/integration-icons/salesforce.js +11 -0
  159. package/dist/esm/integration-icons/wisepops.js +14 -0
  160. package/dist/esm/modal/index.js +20 -13
  161. package/dist/esm/modal/style.scss +4 -0
  162. package/dist/esm/newspack-icon/index.js +40 -25
  163. package/dist/esm/notice/index.js +59 -42
  164. package/dist/esm/plugin-installer/index.js +255 -243
  165. package/dist/esm/plugin-settings/SettingsSection.js +61 -50
  166. package/dist/esm/plugin-settings/index.js +212 -189
  167. package/dist/esm/plugin-toggle/index.js +187 -190
  168. package/dist/esm/popover/index.js +35 -16
  169. package/dist/esm/position-control/index.js +22 -18
  170. package/dist/esm/progress-bar/index.js +66 -49
  171. package/dist/esm/progress-bar/index.test.js +61 -67
  172. package/dist/esm/radio-control/index.js +34 -15
  173. package/dist/esm/section-header/index.js +102 -57
  174. package/dist/esm/section-header/style.scss +31 -11
  175. package/dist/esm/select-control/ButtonGroupControl.js +23 -18
  176. package/dist/esm/select-control/GroupedSelectControl.js +38 -30
  177. package/dist/esm/select-control/index.js +47 -27
  178. package/dist/esm/settings/MinMaxSetting.js +27 -16
  179. package/dist/esm/settings/SettingsCard.js +18 -13
  180. package/dist/esm/settings/SettingsSection.js +20 -19
  181. package/dist/esm/settings/index.js +3 -3
  182. package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
  183. package/dist/esm/steps-list/index.js +39 -21
  184. package/dist/esm/steps-list-item/index.js +42 -26
  185. package/dist/esm/style-card/index.js +65 -50
  186. package/dist/esm/tabbed-navigation/index.js +35 -33
  187. package/dist/esm/text-control/index.js +25 -19
  188. package/dist/esm/utils/color.js +4 -4
  189. package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
  190. package/dist/esm/utils/index.js +29 -16
  191. package/dist/esm/utils/style.scss +8 -0
  192. package/dist/esm/waiting/index.js +43 -24
  193. package/dist/esm/web-preview/index.js +213 -201
  194. package/dist/esm/with-wizard/index.js +360 -358
  195. package/dist/esm/with-wizard/style.scss +4 -54
  196. package/dist/esm/with-wizard-screen/index.js +48 -46
  197. package/dist/esm/with-wizard-screen/style.scss +41 -3
  198. package/dist/esm/wizard/components/WizardError.js +18 -16
  199. package/dist/esm/wizard/components/WizardSnackbar.js +23 -17
  200. package/dist/esm/wizard/index.js +171 -103
  201. package/dist/esm/wizard/store/index.js +169 -116
  202. package/dist/esm/wizard/store/utils.js +13 -6
  203. package/package.json +30 -16
  204. package/release.config.js +1 -0
  205. package/shared/hooks/use-coauthors.js +195 -27
  206. package/shared/hooks/use-coauthors.test.js +232 -6
  207. package/shared/scss/_mixins.scss +13 -5
  208. package/src/accordion/index.js +8 -7
  209. package/src/action-card/index.js +15 -1
  210. package/src/badge/index.tsx +3 -1
  211. package/src/card/core-card.js +95 -18
  212. package/src/card/index.js +1 -0
  213. package/src/card/style-core.scss +93 -25
  214. package/src/card/style.scss +2 -2
  215. package/src/card-feature/README.md +188 -0
  216. package/src/card-feature/index.tsx +186 -0
  217. package/src/card-feature/style.scss +75 -0
  218. package/src/card-form/README.md +113 -0
  219. package/src/card-form/index.tsx +128 -0
  220. package/src/card-form/style.scss +20 -0
  221. package/src/card-settings-group/index.tsx +28 -3
  222. package/src/card-sortable-list/index.tsx +27 -4
  223. package/src/color-picker/index.js +15 -8
  224. package/src/color-picker/index.test.js +52 -0
  225. package/src/color-picker/style.scss +11 -13
  226. package/src/confirm-dialog/README.md +128 -0
  227. package/src/confirm-dialog/index.tsx +74 -6
  228. package/src/dataviews/index.tsx +34 -0
  229. package/src/dataviews/style.scss +9 -0
  230. package/src/grid/style.scss +6 -1
  231. package/src/handoff/README.md +93 -0
  232. package/src/handoff/index.js +46 -8
  233. package/src/hooks/index.ts +2 -1
  234. package/src/hooks/use-confirm-dialog.tsx +80 -0
  235. package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
  236. package/src/image-upload/index.js +10 -15
  237. package/src/image-upload/style.scss +12 -40
  238. package/src/index.js +7 -1
  239. package/src/integration-icons/active-campaign.js +14 -0
  240. package/src/integration-icons/constant-contact.js +22 -0
  241. package/src/integration-icons/fundraise-up.js +18 -0
  242. package/src/integration-icons/index.js +6 -0
  243. package/src/integration-icons/mailchimp.js +10 -0
  244. package/src/integration-icons/salesforce.js +10 -0
  245. package/src/integration-icons/wisepops.js +14 -0
  246. package/src/modal/style.scss +4 -0
  247. package/src/plugin-installer/index.js +30 -19
  248. package/src/section-header/index.js +56 -24
  249. package/src/section-header/style.scss +31 -11
  250. package/src/select-control/index.js +4 -0
  251. package/src/utils/editor-toolbar-back-button.tsx +48 -0
  252. package/src/utils/index.js +6 -0
  253. package/src/utils/style.scss +8 -0
  254. package/src/with-wizard/style.scss +4 -54
  255. package/src/with-wizard-screen/style.scss +41 -3
  256. package/src/wizard/index.js +90 -53
  257. package/src/wizard/store/index.js +2 -2
  258. package/dist/cjs/button-card/index.js +0 -72
  259. package/dist/cjs/button-card/style.scss +0 -180
  260. package/dist/esm/button-card/index.js +0 -64
  261. package/dist/esm/button-card/style.scss +0 -180
  262. package/src/button-card/index.js +0 -52
  263. package/src/button-card/style.scss +0 -180
@@ -1,3 +1,12 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
5
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
6
+ import _inherits from "@babel/runtime/helpers/inherits";
7
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
9
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
1
10
  /**
2
11
  * External dependencies
3
12
  */
@@ -18,248 +27,265 @@ import './style.scss';
18
27
  * An multi-selecting, api-driven autocomplete input suitable for use in block attributes.
19
28
  */
20
29
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
- class AutocompleteTokenField extends Component {
22
- constructor(props) {
23
- super(props);
24
- this.state = {
30
+ var AutocompleteTokenField = /*#__PURE__*/function (_Component) {
31
+ function AutocompleteTokenField(props) {
32
+ var _this;
33
+ _classCallCheck(this, AutocompleteTokenField);
34
+ _this = _callSuper(this, AutocompleteTokenField, [props]);
35
+ /**
36
+ * If the component has tokens passed in props, it should fetch info after it mounts.
37
+ */
38
+ _defineProperty(_this, "isFetchingInfoOnLoad", function () {
39
+ var _this$props = _this.props,
40
+ tokens = _this$props.tokens,
41
+ fetchSavedInfo = _this$props.fetchSavedInfo;
42
+ return Boolean(tokens.length && fetchSavedInfo);
43
+ });
44
+ _this.state = {
25
45
  suggestions: [],
26
46
  validValues: {},
27
- loading: this.isFetchingInfoOnLoad()
47
+ loading: _this.isFetchingInfoOnLoad()
28
48
  };
29
- this.debouncedUpdateSuggestions = debounce(this.updateSuggestions, 500);
49
+ _this.debouncedUpdateSuggestions = debounce(_this.updateSuggestions, 500);
50
+ return _this;
30
51
  }
31
-
32
- /**
33
- * If the component has tokens passed in props, it should fetch info after it mounts.
34
- */
35
- isFetchingInfoOnLoad = () => {
36
- const {
37
- tokens,
38
- fetchSavedInfo
39
- } = this.props;
40
- return Boolean(tokens.length && fetchSavedInfo);
41
- };
42
-
43
- /**
44
- * When the component loads, fetch information about the tokens so we can populate
45
- * the tokens with the correct labels.
46
- */
47
- componentDidMount() {
48
- if (this.isFetchingInfoOnLoad()) {
49
- const {
50
- tokens,
51
- fetchSavedInfo
52
- } = this.props;
53
- fetchSavedInfo(tokens).then(results => {
54
- const {
55
- validValues
56
- } = this.state;
57
- results.forEach(suggestion => {
58
- validValues[suggestion.value] = suggestion.label;
59
- });
60
- this.setState({
61
- validValues,
62
- loading: false
52
+ _inherits(AutocompleteTokenField, _Component);
53
+ return _createClass(AutocompleteTokenField, [{
54
+ key: "componentDidMount",
55
+ value:
56
+ /**
57
+ * When the component loads, fetch information about the tokens so we can populate
58
+ * the tokens with the correct labels.
59
+ */
60
+ function componentDidMount() {
61
+ var _this2 = this;
62
+ if (this.isFetchingInfoOnLoad()) {
63
+ var _this$props2 = this.props,
64
+ tokens = _this$props2.tokens,
65
+ fetchSavedInfo = _this$props2.fetchSavedInfo;
66
+ fetchSavedInfo(tokens).then(function (results) {
67
+ var validValues = _this2.state.validValues;
68
+ results.forEach(function (suggestion) {
69
+ validValues[suggestion.value] = suggestion.label;
70
+ });
71
+ _this2.setState({
72
+ validValues: validValues,
73
+ loading: false
74
+ });
63
75
  });
64
- });
76
+ }
65
77
  }
66
- }
67
78
 
68
- /**
69
- * When the component updates, fetch information about the tokens so we can populate
70
- * the tokens with the correct labels.
71
- */
72
- componentDidUpdate(prevProps) {
73
- const {
74
- tokens,
75
- fetchSavedInfo
76
- } = this.props;
77
- if (tokens !== prevProps.tokens && this.isFetchingInfoOnLoad()) {
78
- fetchSavedInfo(tokens).then(results => {
79
- const {
80
- validValues
81
- } = this.state;
82
- results.forEach(suggestion => {
83
- validValues[suggestion.value] = suggestion.label;
84
- });
85
- this.setState({
86
- validValues,
87
- loading: false
79
+ /**
80
+ * When the component updates, fetch information about the tokens so we can populate
81
+ * the tokens with the correct labels.
82
+ */
83
+ }, {
84
+ key: "componentDidUpdate",
85
+ value: function componentDidUpdate(prevProps) {
86
+ var _this3 = this;
87
+ var _this$props3 = this.props,
88
+ tokens = _this$props3.tokens,
89
+ fetchSavedInfo = _this$props3.fetchSavedInfo;
90
+ if (tokens !== prevProps.tokens && this.isFetchingInfoOnLoad()) {
91
+ fetchSavedInfo(tokens).then(function (results) {
92
+ var validValues = _this3.state.validValues;
93
+ results.forEach(function (suggestion) {
94
+ validValues[suggestion.value] = suggestion.label;
95
+ });
96
+ _this3.setState({
97
+ validValues: validValues,
98
+ loading: false
99
+ });
88
100
  });
89
- });
101
+ }
90
102
  }
91
- }
92
103
 
93
- /**
94
- * Clean up any unfinished autocomplete api call requests.
95
- */
96
- componentWillUnmount() {
97
- delete this.suggestionsRequest;
98
- this.debouncedUpdateSuggestions.cancel();
99
- }
100
-
101
- /**
102
- * Get a list of labels for input values.
103
- *
104
- * @param {Array} values Array of values (ids, etc.).
105
- * @return {Array} array of valid labels corresponding to the values.
106
- */
107
- getLabelsForValues(values) {
108
- const {
109
- validValues
110
- } = this.state;
111
- return values.reduce((accumulator, value) => {
112
- if (!value) {
113
- return accumulator;
114
- }
115
- if (value.label) {
116
- return [...accumulator, value.label];
117
- }
118
- return validValues[value] ? [...accumulator, validValues[value]] : accumulator;
119
- }, []);
120
- }
104
+ /**
105
+ * Clean up any unfinished autocomplete api call requests.
106
+ */
107
+ }, {
108
+ key: "componentWillUnmount",
109
+ value: function componentWillUnmount() {
110
+ delete this.suggestionsRequest;
111
+ this.debouncedUpdateSuggestions.cancel();
112
+ }
121
113
 
122
- /**
123
- * Get a list of values for input labels.
124
- *
125
- * @param {Array} labels Array of labels from the tokens.
126
- * @return {Array} Array of valid values corresponding to the labels.
127
- */
128
- getValuesForLabels(labels) {
129
- const {
130
- returnFullObjects
131
- } = this.props; // If this prop is passed, return both the value and label. Otherwise, return just the label.
132
- const {
133
- validValues
134
- } = this.state;
135
- if (returnFullObjects) {
136
- return labels.reduce((acc, label) => {
137
- Object.keys(validValues).forEach(key => {
138
- if (validValues[key] === label) {
139
- // Preserve numeric or string type of values. Object.keys will convert numbers to strings.
140
- const value = /^\d+$/.test(key.toString()) ? parseInt(key) : key.toString();
141
- acc.push({
142
- value,
143
- label
144
- });
145
- }
146
- });
147
- return acc;
114
+ /**
115
+ * Get a list of labels for input values.
116
+ *
117
+ * @param {Array} values Array of values (ids, etc.).
118
+ * @return {Array} array of valid labels corresponding to the values.
119
+ */
120
+ }, {
121
+ key: "getLabelsForValues",
122
+ value: function getLabelsForValues(values) {
123
+ var validValues = this.state.validValues;
124
+ return values.reduce(function (accumulator, value) {
125
+ if (!value) {
126
+ return accumulator;
127
+ }
128
+ if (value.label) {
129
+ return [].concat(_toConsumableArray(accumulator), [value.label]);
130
+ }
131
+ return validValues[value] ? [].concat(_toConsumableArray(accumulator), [validValues[value]]) : accumulator;
148
132
  }, []);
149
133
  }
150
- return labels.map(label => Object.keys(validValues).map(key => /^\d+$/.test(key.toString()) ? parseInt(key) : key.toString()).find(key => validValues[key] === label));
151
- }
152
134
 
153
- /**
154
- * Refresh the autocomplete dropdown.
155
- *
156
- * @param {string} input Input to fetch suggestions for
157
- */
158
- updateSuggestions(input) {
159
- const {
160
- fetchSuggestions
161
- } = this.props;
162
- if (!fetchSuggestions) {
163
- return;
164
- }
165
- this.setState({
166
- loading: true
167
- }, () => {
168
- const request = fetchSuggestions(input);
169
- request.then(suggestions => {
170
- // A fetch Promise doesn't have an abort option. It's mimicked by
171
- // comparing the request reference in on the instance, which is
172
- // reset or deleted on subsequent requests or unmounting.
173
- if (this.suggestionsRequest !== request) {
174
- return;
175
- }
176
- const {
177
- validValues
178
- } = this.state;
179
- const currentSuggestions = [...suggestions];
180
- suggestions.forEach(suggestion => {
181
- validValues[suggestion.value] = suggestion.label;
182
- });
183
- this.setState({
184
- suggestions: currentSuggestions,
185
- validValues,
186
- loading: false
135
+ /**
136
+ * Get a list of values for input labels.
137
+ *
138
+ * @param {Array} labels Array of labels from the tokens.
139
+ * @return {Array} Array of valid values corresponding to the labels.
140
+ */
141
+ }, {
142
+ key: "getValuesForLabels",
143
+ value: function getValuesForLabels(labels) {
144
+ var returnFullObjects = this.props.returnFullObjects; // If this prop is passed, return both the value and label. Otherwise, return just the label.
145
+ var validValues = this.state.validValues;
146
+ if (returnFullObjects) {
147
+ return labels.reduce(function (acc, label) {
148
+ Object.keys(validValues).forEach(function (key) {
149
+ if (validValues[key] === label) {
150
+ // Preserve numeric or string type of values. Object.keys will convert numbers to strings.
151
+ var value = /^\d+$/.test(key.toString()) ? parseInt(key) : key.toString();
152
+ acc.push({
153
+ value: value,
154
+ label: label
155
+ });
156
+ }
157
+ });
158
+ return acc;
159
+ }, []);
160
+ }
161
+ return labels.map(function (label) {
162
+ return Object.keys(validValues).map(function (key) {
163
+ return /^\d+$/.test(key.toString()) ? parseInt(key) : key.toString();
164
+ }).find(function (key) {
165
+ return validValues[key] === label;
187
166
  });
188
- }).catch(() => {
189
- if (this.suggestionsRequest === request) {
190
- this.setState({
167
+ });
168
+ }
169
+
170
+ /**
171
+ * Refresh the autocomplete dropdown.
172
+ *
173
+ * @param {string} input Input to fetch suggestions for
174
+ */
175
+ }, {
176
+ key: "updateSuggestions",
177
+ value: function updateSuggestions(input) {
178
+ var _this4 = this;
179
+ var fetchSuggestions = this.props.fetchSuggestions;
180
+ if (!fetchSuggestions) {
181
+ return;
182
+ }
183
+ this.setState({
184
+ loading: true
185
+ }, function () {
186
+ var request = fetchSuggestions(input);
187
+ request.then(function (suggestions) {
188
+ // A fetch Promise doesn't have an abort option. It's mimicked by
189
+ // comparing the request reference in on the instance, which is
190
+ // reset or deleted on subsequent requests or unmounting.
191
+ if (_this4.suggestionsRequest !== request) {
192
+ return;
193
+ }
194
+ var validValues = _this4.state.validValues;
195
+ var currentSuggestions = _toConsumableArray(suggestions);
196
+ suggestions.forEach(function (suggestion) {
197
+ validValues[suggestion.value] = suggestion.label;
198
+ });
199
+ _this4.setState({
200
+ suggestions: currentSuggestions,
201
+ validValues: validValues,
191
202
  loading: false
192
203
  });
193
- }
204
+ })["catch"](function () {
205
+ if (_this4.suggestionsRequest === request) {
206
+ _this4.setState({
207
+ loading: false
208
+ });
209
+ }
210
+ });
211
+ _this4.suggestionsRequest = request;
194
212
  });
195
- this.suggestionsRequest = request;
196
- });
197
- }
213
+ }
198
214
 
199
- /**
200
- * When a token is selected, we need to convert the string label into a recognized value suitable for saving as an attribute.
201
- *
202
- * @param {Array} tokenStrings An array of token label strings.
203
- */
204
- handleOnChange(tokenStrings) {
205
- const {
206
- onChange
207
- } = this.props;
208
- onChange(this.getValuesForLabels(tokenStrings));
209
- }
215
+ /**
216
+ * When a token is selected, we need to convert the string label into a recognized value suitable for saving as an attribute.
217
+ *
218
+ * @param {Array} tokenStrings An array of token label strings.
219
+ */
220
+ }, {
221
+ key: "handleOnChange",
222
+ value: function handleOnChange(tokenStrings) {
223
+ var onChange = this.props.onChange;
224
+ onChange(this.getValuesForLabels(tokenStrings));
225
+ }
210
226
 
211
- /**
212
- * To populate the tokens, we need to convert the values into a human-readable label.
213
- *
214
- * @return {Array} An array of token label strings.
215
- */
216
- getTokens() {
217
- const {
218
- tokens
219
- } = this.props;
220
- return this.getLabelsForValues(tokens);
221
- }
227
+ /**
228
+ * To populate the tokens, we need to convert the values into a human-readable label.
229
+ *
230
+ * @return {Array} An array of token label strings.
231
+ */
232
+ }, {
233
+ key: "getTokens",
234
+ value: function getTokens() {
235
+ var tokens = this.props.tokens;
236
+ return this.getLabelsForValues(tokens);
237
+ }
222
238
 
223
- /**
224
- * Render.
225
- */
226
- render() {
227
- const {
228
- help,
229
- label = '',
230
- placeholder = '',
231
- maxLength,
232
- style,
233
- __next40pxDefaultSize
234
- } = this.props;
235
- const {
236
- suggestions,
237
- loading
238
- } = this.state;
239
- const classNames = ['newspack-autocomplete-tokenfield__input-container'];
240
- if (label) {
241
- classNames.push('has-label');
239
+ /**
240
+ * Render.
241
+ */
242
+ }, {
243
+ key: "render",
244
+ value: function render() {
245
+ var _this5 = this;
246
+ var _this$props4 = this.props,
247
+ help = _this$props4.help,
248
+ _this$props4$label = _this$props4.label,
249
+ label = _this$props4$label === void 0 ? '' : _this$props4$label,
250
+ _this$props4$placehol = _this$props4.placeholder,
251
+ placeholder = _this$props4$placehol === void 0 ? '' : _this$props4$placehol,
252
+ maxLength = _this$props4.maxLength,
253
+ style = _this$props4.style,
254
+ __next40pxDefaultSize = _this$props4.__next40pxDefaultSize;
255
+ var _this$state = this.state,
256
+ suggestions = _this$state.suggestions,
257
+ loading = _this$state.loading;
258
+ var classNames = ['newspack-autocomplete-tokenfield__input-container'];
259
+ if (label) {
260
+ classNames.push('has-label');
261
+ }
262
+ return /*#__PURE__*/_jsxs("div", {
263
+ className: "newspack-autocomplete-tokenfield",
264
+ style: style,
265
+ children: [/*#__PURE__*/_jsxs("div", {
266
+ className: classNames.join(' '),
267
+ children: [/*#__PURE__*/_jsx(FormTokenField, {
268
+ value: this.getTokens(),
269
+ suggestions: suggestions.map(function (suggestion) {
270
+ return suggestion.label;
271
+ }),
272
+ onChange: function onChange(tokens) {
273
+ return _this5.handleOnChange(tokens);
274
+ },
275
+ onInputChange: function onInputChange(input) {
276
+ return _this5.debouncedUpdateSuggestions(input);
277
+ },
278
+ label: label,
279
+ maxLength: maxLength,
280
+ placeholder: placeholder,
281
+ __next40pxDefaultSize: __next40pxDefaultSize
282
+ }), loading && /*#__PURE__*/_jsx(Spinner, {})]
283
+ }), help && /*#__PURE__*/_jsx("p", {
284
+ className: "newspack-autocomplete-tokenfield__help",
285
+ children: help
286
+ })]
287
+ });
242
288
  }
243
- return /*#__PURE__*/_jsxs("div", {
244
- className: "newspack-autocomplete-tokenfield",
245
- style: style,
246
- children: [/*#__PURE__*/_jsxs("div", {
247
- className: classNames.join(' '),
248
- children: [/*#__PURE__*/_jsx(FormTokenField, {
249
- value: this.getTokens(),
250
- suggestions: suggestions.map(suggestion => suggestion.label),
251
- onChange: tokens => this.handleOnChange(tokens),
252
- onInputChange: input => this.debouncedUpdateSuggestions(input),
253
- label: label,
254
- maxLength: maxLength,
255
- placeholder: placeholder,
256
- __next40pxDefaultSize: __next40pxDefaultSize
257
- }), loading && /*#__PURE__*/_jsx(Spinner, {})]
258
- }), help && /*#__PURE__*/_jsx("p", {
259
- className: "newspack-autocomplete-tokenfield__help",
260
- children: help
261
- })]
262
- });
263
- }
264
- }
289
+ }]);
290
+ }(Component);
265
291
  export default AutocompleteTokenField;