newspack-components 2.1.0 → 2.2.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 (268) hide show
  1. package/dist/cjs/accordion/index.js +46 -0
  2. package/dist/cjs/accordion/style.scss +27 -0
  3. package/dist/cjs/action-card/index.js +48 -25
  4. package/dist/cjs/action-card/style.scss +100 -23
  5. package/dist/cjs/autocomplete-tokenfield/index.js +13 -41
  6. package/dist/cjs/autocomplete-tokenfield/style.scss +2 -2
  7. package/dist/cjs/autocomplete-with-suggestions/index.js +30 -51
  8. package/dist/cjs/autocomplete-with-suggestions/style.scss +16 -15
  9. package/dist/cjs/button/index.js +5 -13
  10. package/dist/cjs/button-card/index.js +1 -10
  11. package/dist/cjs/button-card/style.scss +13 -13
  12. package/dist/cjs/card/index.js +1 -8
  13. package/dist/cjs/card/style.scss +25 -8
  14. package/dist/cjs/category-autocomplete/index.js +18 -38
  15. package/dist/cjs/category-autocomplete/style.scss +0 -2
  16. package/dist/cjs/color-picker/index.js +1 -15
  17. package/dist/cjs/color-picker/style.scss +0 -3
  18. package/dist/cjs/consts.js +5 -3
  19. package/dist/cjs/custom-select-control/index.js +1 -9
  20. package/dist/cjs/custom-select-control/style.scss +6 -7
  21. package/dist/cjs/date-range-picker/index.js +1 -10
  22. package/dist/cjs/date-range-picker/style.scss +12 -12
  23. package/dist/cjs/footer/index.js +5 -17
  24. package/dist/cjs/footer/style.scss +5 -5
  25. package/dist/cjs/form-token-field/index.js +1 -9
  26. package/dist/cjs/form-token-field/style.scss +2 -3
  27. package/dist/cjs/global-notices/index.js +1 -8
  28. package/dist/cjs/grid/index.js +1 -8
  29. package/dist/cjs/grid/style.scss +5 -5
  30. package/dist/cjs/handoff/index.js +8 -17
  31. package/dist/cjs/handoff-message/index.js +50 -0
  32. package/dist/cjs/hooks/index.js +1 -7
  33. package/dist/cjs/hooks/useObjectState.js +7 -13
  34. package/dist/cjs/hooks/useObjectState.test.js +0 -14
  35. package/dist/cjs/hooks/useOnClickOutside.js +3 -6
  36. package/dist/cjs/hooks/usePrompt.js +1 -13
  37. package/dist/cjs/image-upload/index.js +21 -19
  38. package/dist/cjs/image-upload/index.test.js +0 -5
  39. package/dist/cjs/image-upload/style.scss +5 -9
  40. package/dist/cjs/index.js +28 -44
  41. package/dist/cjs/info-button/index.js +3 -11
  42. package/dist/cjs/info-button/style.scss +1 -3
  43. package/dist/cjs/modal/index.js +1 -9
  44. package/dist/cjs/modal/style.scss +8 -8
  45. package/dist/cjs/newspack-icon/index.js +1 -9
  46. package/dist/cjs/newspack-icon/style.scss +4 -4
  47. package/dist/cjs/newspack-logo/index.js +1 -9
  48. package/dist/cjs/newspack-logo/style.scss +3 -3
  49. package/dist/cjs/notice/index.js +8 -15
  50. package/dist/cjs/notice/style.scss +28 -15
  51. package/dist/cjs/patrons-logo/index.js +3 -11
  52. package/dist/cjs/plugin-installer/index.js +36 -36
  53. package/dist/cjs/plugin-installer/style.scss +5 -5
  54. package/dist/cjs/plugin-settings/SettingsSection.js +9 -28
  55. package/dist/cjs/plugin-settings/index.js +39 -22
  56. package/dist/cjs/plugin-toggle/index.js +40 -33
  57. package/dist/cjs/plugin-toggle/style.scss +2 -2
  58. package/dist/cjs/popover/index.js +1 -11
  59. package/dist/cjs/popover/style.scss +19 -16
  60. package/dist/cjs/position-control/index.js +113 -0
  61. package/dist/cjs/position-control/style.scss +66 -0
  62. package/dist/cjs/progress-bar/index.js +2 -9
  63. package/dist/cjs/progress-bar/index.test.js +2 -7
  64. package/dist/cjs/progress-bar/style.scss +4 -4
  65. package/dist/cjs/proxied-imports/router.js +0 -3
  66. package/dist/cjs/radio-control/index.js +1 -11
  67. package/dist/cjs/radio-control/style.scss +9 -9
  68. package/dist/cjs/section-header/index.js +44 -29
  69. package/dist/cjs/section-header/style.scss +2 -2
  70. package/dist/cjs/select-control/ButtonGroupControl.js +4 -13
  71. package/dist/cjs/select-control/GroupedSelectControl.js +9 -15
  72. package/dist/cjs/select-control/index.js +5 -12
  73. package/dist/cjs/select-control/style.scss +2 -2
  74. package/dist/cjs/settings/MinMaxSetting.js +3 -7
  75. package/dist/cjs/settings/SettingsCard.js +3 -7
  76. package/dist/cjs/settings/SettingsSection.js +1 -4
  77. package/dist/cjs/settings/index.js +0 -6
  78. package/dist/cjs/settings/style.scss +1 -1
  79. package/dist/cjs/steps-list/index.js +52 -0
  80. package/dist/cjs/steps-list/style.scss +11 -0
  81. package/dist/cjs/steps-list-item/index.js +56 -0
  82. package/dist/cjs/steps-list-item/style.scss +47 -0
  83. package/dist/cjs/style-card/index.js +6 -13
  84. package/dist/cjs/style-card/style.scss +9 -12
  85. package/dist/cjs/style.scss +5 -6
  86. package/dist/cjs/tabbed-navigation/index.js +19 -16
  87. package/dist/cjs/tabbed-navigation/style.scss +3 -4
  88. package/dist/cjs/text-control/index.js +6 -16
  89. package/dist/cjs/utils/index.js +10 -5
  90. package/dist/cjs/waiting/index.js +1 -9
  91. package/dist/cjs/web-preview/index.js +13 -28
  92. package/dist/cjs/web-preview/style.scss +14 -14
  93. package/dist/cjs/with-wizard/index.js +51 -31
  94. package/dist/cjs/with-wizard/style.scss +35 -37
  95. package/dist/cjs/with-wizard-screen/index.js +11 -17
  96. package/dist/cjs/with-wizard-screen/style.scss +14 -17
  97. package/dist/cjs/wizard/components/WizardError.js +3 -15
  98. package/dist/cjs/wizard/index.js +10 -24
  99. package/dist/cjs/wizard/store/index.js +42 -55
  100. package/dist/cjs/wizard/store/utils.js +1 -6
  101. package/dist/esm/accordion/index.js +38 -0
  102. package/dist/esm/accordion/style.scss +27 -0
  103. package/dist/esm/action-card/index.js +50 -21
  104. package/dist/esm/action-card/style.scss +100 -23
  105. package/dist/esm/autocomplete-tokenfield/index.js +14 -37
  106. package/dist/esm/autocomplete-tokenfield/style.scss +2 -2
  107. package/dist/esm/autocomplete-with-suggestions/index.js +28 -41
  108. package/dist/esm/autocomplete-with-suggestions/style.scss +16 -15
  109. package/dist/esm/button/index.js +5 -7
  110. package/dist/esm/button-card/index.js +2 -5
  111. package/dist/esm/button-card/style.scss +13 -13
  112. package/dist/esm/card/index.js +2 -5
  113. package/dist/esm/card/style.scss +25 -8
  114. package/dist/esm/category-autocomplete/index.js +17 -30
  115. package/dist/esm/category-autocomplete/style.scss +0 -2
  116. package/dist/esm/color-picker/index.js +2 -4
  117. package/dist/esm/color-picker/style.scss +0 -3
  118. package/dist/esm/consts.js +3 -2
  119. package/dist/esm/custom-select-control/index.js +2 -5
  120. package/dist/esm/custom-select-control/style.scss +6 -7
  121. package/dist/esm/date-range-picker/index.js +1 -3
  122. package/dist/esm/date-range-picker/style.scss +12 -12
  123. package/dist/esm/footer/index.js +3 -11
  124. package/dist/esm/footer/style.scss +5 -5
  125. package/dist/esm/form-token-field/index.js +2 -5
  126. package/dist/esm/form-token-field/style.scss +2 -3
  127. package/dist/esm/global-notices/index.js +1 -6
  128. package/dist/esm/grid/index.js +2 -5
  129. package/dist/esm/grid/style.scss +5 -5
  130. package/dist/esm/handoff/index.js +3 -14
  131. package/dist/esm/handoff-message/index.js +45 -0
  132. package/dist/esm/hooks/index.js +0 -2
  133. package/dist/esm/hooks/useObjectState.js +3 -8
  134. package/dist/esm/hooks/useObjectState.test.js +0 -3
  135. package/dist/esm/hooks/useOnClickOutside.js +2 -5
  136. package/dist/esm/hooks/usePrompt.js +1 -8
  137. package/dist/esm/image-upload/index.js +17 -16
  138. package/dist/esm/image-upload/style.scss +5 -9
  139. package/dist/esm/index.js +4 -0
  140. package/dist/esm/info-button/index.js +4 -6
  141. package/dist/esm/info-button/style.scss +1 -3
  142. package/dist/esm/modal/index.js +2 -5
  143. package/dist/esm/modal/style.scss +8 -8
  144. package/dist/esm/newspack-icon/index.js +2 -5
  145. package/dist/esm/newspack-icon/style.scss +4 -4
  146. package/dist/esm/newspack-logo/index.js +2 -5
  147. package/dist/esm/newspack-logo/style.scss +3 -3
  148. package/dist/esm/notice/index.js +4 -8
  149. package/dist/esm/notice/style.scss +28 -15
  150. package/dist/esm/patrons-logo/index.js +3 -5
  151. package/dist/esm/plugin-installer/index.js +35 -39
  152. package/dist/esm/plugin-installer/style.scss +5 -5
  153. package/dist/esm/plugin-settings/SettingsSection.js +8 -21
  154. package/dist/esm/plugin-settings/index.js +38 -24
  155. package/dist/esm/plugin-toggle/index.js +39 -36
  156. package/dist/esm/plugin-toggle/style.scss +2 -2
  157. package/dist/esm/popover/index.js +3 -6
  158. package/dist/esm/popover/style.scss +19 -16
  159. package/dist/esm/position-control/index.js +109 -0
  160. package/dist/esm/position-control/style.scss +66 -0
  161. package/dist/esm/progress-bar/index.js +2 -7
  162. package/dist/esm/progress-bar/index.test.js +2 -1
  163. package/dist/esm/progress-bar/style.scss +4 -4
  164. package/dist/esm/proxied-imports/router.js +1 -0
  165. package/dist/esm/radio-control/index.js +3 -6
  166. package/dist/esm/radio-control/style.scss +9 -9
  167. package/dist/esm/section-header/index.js +44 -25
  168. package/dist/esm/section-header/style.scss +2 -2
  169. package/dist/esm/select-control/ButtonGroupControl.js +5 -7
  170. package/dist/esm/select-control/GroupedSelectControl.js +5 -6
  171. package/dist/esm/select-control/index.js +6 -6
  172. package/dist/esm/select-control/style.scss +2 -2
  173. package/dist/esm/settings/MinMaxSetting.js +1 -3
  174. package/dist/esm/settings/SettingsCard.js +3 -4
  175. package/dist/esm/settings/SettingsSection.js +0 -2
  176. package/dist/esm/settings/style.scss +1 -1
  177. package/dist/esm/steps-list/index.js +43 -0
  178. package/dist/esm/steps-list/style.scss +11 -0
  179. package/dist/esm/steps-list-item/index.js +48 -0
  180. package/dist/esm/steps-list-item/style.scss +47 -0
  181. package/dist/esm/style-card/index.js +2 -5
  182. package/dist/esm/style-card/style.scss +9 -12
  183. package/dist/esm/style.scss +5 -6
  184. package/dist/esm/tabbed-navigation/index.js +20 -10
  185. package/dist/esm/tabbed-navigation/style.scss +3 -4
  186. package/dist/esm/text-control/index.js +2 -9
  187. package/dist/esm/utils/index.js +9 -3
  188. package/dist/esm/waiting/index.js +2 -5
  189. package/dist/esm/web-preview/index.js +9 -24
  190. package/dist/esm/web-preview/style.scss +14 -14
  191. package/dist/esm/with-wizard/index.js +49 -34
  192. package/dist/esm/with-wizard/style.scss +35 -37
  193. package/dist/esm/with-wizard-screen/index.js +9 -11
  194. package/dist/esm/with-wizard-screen/style.scss +14 -17
  195. package/dist/esm/wizard/components/WizardError.js +1 -10
  196. package/dist/esm/wizard/index.js +10 -12
  197. package/dist/esm/wizard/store/index.js +40 -46
  198. package/dist/esm/wizard/store/utils.js +1 -1
  199. package/package.json +4 -4
  200. package/shared/js/button-props.js +3 -1
  201. package/shared/scss/_mixins.scss +12 -0
  202. package/src/accordion/index.js +32 -0
  203. package/src/accordion/style.scss +27 -0
  204. package/src/action-card/index.js +43 -8
  205. package/src/action-card/style.scss +100 -23
  206. package/src/autocomplete-tokenfield/index.js +1 -1
  207. package/src/autocomplete-tokenfield/style.scss +2 -2
  208. package/src/autocomplete-with-suggestions/style.scss +16 -15
  209. package/src/button-card/style.scss +13 -13
  210. package/src/card/style.scss +25 -8
  211. package/src/category-autocomplete/index.js +3 -1
  212. package/src/category-autocomplete/style.scss +0 -2
  213. package/src/color-picker/style.scss +0 -3
  214. package/src/consts.js +2 -1
  215. package/src/custom-select-control/style.scss +6 -7
  216. package/src/date-range-picker/style.scss +12 -12
  217. package/src/footer/index.js +2 -2
  218. package/src/footer/style.scss +5 -5
  219. package/src/form-token-field/index.js +2 -7
  220. package/src/form-token-field/style.scss +2 -3
  221. package/src/grid/style.scss +5 -5
  222. package/src/handoff/index.js +3 -8
  223. package/src/handoff-message/index.js +39 -0
  224. package/src/hooks/useObjectState.js +2 -1
  225. package/src/image-upload/index.js +9 -3
  226. package/src/image-upload/style.scss +5 -9
  227. package/src/index.js +4 -0
  228. package/src/info-button/style.scss +1 -3
  229. package/src/modal/style.scss +8 -8
  230. package/src/newspack-icon/style.scss +4 -4
  231. package/src/newspack-logo/style.scss +3 -3
  232. package/src/notice/index.js +2 -0
  233. package/src/notice/style.scss +28 -15
  234. package/src/plugin-installer/index.js +15 -2
  235. package/src/plugin-installer/style.scss +5 -5
  236. package/src/plugin-settings/SettingsSection.js +7 -13
  237. package/src/plugin-settings/index.js +7 -2
  238. package/src/plugin-toggle/index.js +2 -3
  239. package/src/plugin-toggle/style.scss +2 -2
  240. package/src/popover/style.scss +19 -16
  241. package/src/position-control/index.js +122 -0
  242. package/src/position-control/style.scss +66 -0
  243. package/src/progress-bar/style.scss +4 -4
  244. package/src/radio-control/style.scss +9 -9
  245. package/src/section-header/index.js +32 -15
  246. package/src/section-header/style.scss +2 -2
  247. package/src/select-control/ButtonGroupControl.js +3 -0
  248. package/src/select-control/GroupedSelectControl.js +2 -1
  249. package/src/select-control/index.js +6 -2
  250. package/src/select-control/style.scss +2 -2
  251. package/src/settings/style.scss +1 -1
  252. package/src/steps-list/index.js +39 -0
  253. package/src/steps-list/style.scss +11 -0
  254. package/src/steps-list-item/index.js +40 -0
  255. package/src/steps-list-item/style.scss +47 -0
  256. package/src/style-card/index.js +2 -11
  257. package/src/style-card/style.scss +9 -12
  258. package/src/style.scss +5 -6
  259. package/src/tabbed-navigation/index.js +12 -4
  260. package/src/tabbed-navigation/style.scss +3 -4
  261. package/src/utils/index.js +9 -0
  262. package/src/web-preview/index.js +1 -1
  263. package/src/web-preview/style.scss +14 -14
  264. package/src/with-wizard/style.scss +35 -37
  265. package/src/with-wizard-screen/index.js +4 -1
  266. package/src/with-wizard-screen/style.scss +14 -17
  267. package/src/wizard/index.js +15 -3
  268. package/src/wizard/store/index.js +8 -2
@@ -2,20 +2,20 @@
2
2
  * External dependencies.
3
3
  */
4
4
  import classnames from 'classnames';
5
+
5
6
  /**
6
7
  * WordPress dependencies.
7
8
  */
8
-
9
9
  import { useSelect } from '@wordpress/data';
10
10
  import { useState } from '@wordpress/element';
11
11
  import { __ as alias__ } from '@wordpress/i18n';
12
12
  const __ = alias__;
13
13
  import { category } from '@wordpress/icons';
14
+
14
15
  /**
15
16
  * Internal dependencies
16
17
  */
17
-
18
- import { Footer, Notice, Button, NewspackIcon, TabbedNavigation, PluginInstaller } from '../';
18
+ import { Footer, Notice, Button, NewspackIcon, TabbedNavigation, PluginInstaller, HandoffMessage } from '../';
19
19
  import Router from '../proxied-imports/router';
20
20
  import registerStore, { WIZARD_STORE_NAMESPACE } from './store';
21
21
  import { useWizardData } from './store/utils';
@@ -30,7 +30,6 @@ const {
30
30
  Route,
31
31
  Switch
32
32
  } = Router;
33
-
34
33
  const Wizard = _ref => {
35
34
  let {
36
35
  sections = [],
@@ -43,13 +42,13 @@ const Wizard = _ref => {
43
42
  requiredPlugins = []
44
43
  } = _ref;
45
44
  const isLoading = useSelect(select => select(WIZARD_STORE_NAMESPACE).isLoading());
46
- const isQuietLoading = useSelect(select => select(WIZARD_STORE_NAMESPACE).isQuietLoading()); // Trigger initial data fetch. Some sections might not use the wizard data,
47
- // but for consistency, fetching is triggered regardless of the section.
45
+ const isQuietLoading = useSelect(select => select(WIZARD_STORE_NAMESPACE).isQuietLoading());
48
46
 
47
+ // Trigger initial data fetch. Some sections might not use the wizard data,
48
+ // but for consistency, fetching is triggered regardless of the section.
49
49
  useSelect(select => select(WIZARD_STORE_NAMESPACE).getWizardAPIData(apiSlug));
50
50
  let displayedSections = sections.filter(section => !section.isHidden);
51
51
  const [pluginRequirementsSatisfied, setPluginRequirementsSatisfied] = useState(requiredPlugins.length === 0);
52
-
53
52
  if (!pluginRequirementsSatisfied) {
54
53
  headerText = requiredPlugins.length > 1 ? __('Required plugins', 'newspack') : __('Required plugin', 'newspack');
55
54
  displayedSections = [{
@@ -65,9 +64,8 @@ const Wizard = _ref => {
65
64
  })
66
65
  }];
67
66
  }
68
-
69
67
  return _jsxs(_Fragment, {
70
- children: [_jsx(WizardError, {}), _jsx("div", {
68
+ children: [_jsx("div", {
71
69
  className: classnames(isLoading ? 'newspack-wizard__is-loading' : 'newspack-wizard__is-loaded', {
72
70
  'newspack-wizard__is-loading-quiet': isQuietLoading
73
71
  }),
@@ -101,8 +99,9 @@ const Wizard = _ref => {
101
99
  })
102
100
  })
103
101
  }), displayedSections.length > 1 && _jsx(TabbedNavigation, {
104
- items: displayedSections
105
- }), _jsxs(Switch, {
102
+ items: displayedSections,
103
+ children: _jsx(WizardError, {})
104
+ }), _jsx(HandoffMessage, {}), _jsxs(Switch, {
106
105
  children: [displayedSections.map((section, index) => {
107
106
  const SectionComponent = section.render;
108
107
  return _jsx(Route, {
@@ -122,7 +121,6 @@ const Wizard = _ref => {
122
121
  })]
123
122
  });
124
123
  };
125
-
126
124
  Wizard.useWizardData = useWizardData;
127
125
  Wizard.STORE_NAMESPACE = WIZARD_STORE_NAMESPACE;
128
126
  export default Wizard;
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * External dependencies.
3
3
  */
4
- import { set, get, isEmpty } from 'lodash';
4
+ import set from 'lodash/set';
5
+ import get from 'lodash/get';
6
+ import isEmpty from 'lodash/isEmpty';
7
+
5
8
  /**
6
9
  * WordPress dependencies.
7
10
  */
8
-
9
11
  import apiFetch from '@wordpress/api-fetch';
10
12
  import { createReduxStore, register, dispatch, select } from '@wordpress/data';
11
13
  import { createAction } from './utils.js';
@@ -16,55 +18,50 @@ const DEFAULT_STATE = {
16
18
  apiData: {},
17
19
  error: null
18
20
  };
21
+
19
22
  /**
20
23
  * wordpress/data does not trigger a component re-render
21
24
  * on deep state change (via lodash's set function)
22
25
  * unless the state was cloned first.
23
26
  */
24
-
25
27
  const clone = objectToClone => JSON.parse(JSON.stringify(objectToClone));
26
-
27
28
  const reducer = function () {
28
29
  let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE;
29
30
  let {
30
31
  type,
31
32
  payload = {}
32
33
  } = arguments.length > 1 ? arguments[1] : undefined;
33
-
34
34
  switch (type) {
35
35
  case 'START_LOADING_DATA':
36
36
  if (payload.isQuietLoading) {
37
- return { ...state,
37
+ return {
38
+ ...state,
38
39
  isQuietLoading: true
39
40
  };
40
41
  }
41
-
42
- return { ...state,
42
+ return {
43
+ ...state,
43
44
  isLoading: true
44
45
  };
45
-
46
46
  case 'FINISH_LOADING_DATA':
47
- return { ...state,
47
+ return {
48
+ ...state,
48
49
  isLoading: false,
49
50
  isQuietLoading: false
50
51
  };
51
-
52
52
  case 'SET_API_DATA':
53
53
  return set(clone(state), ['apiData', payload.slug], payload.data);
54
-
55
54
  case 'UPDATE_WIZARD_SETTINGS':
56
55
  return set(clone(state), ['apiData', payload.slug, ...payload.path], payload.value);
57
-
58
56
  case 'SET_ERROR':
59
- return { ...state,
57
+ return {
58
+ ...state,
60
59
  error: payload
61
60
  };
62
-
63
61
  default:
64
62
  return state;
65
63
  }
66
64
  };
67
-
68
65
  const actions = {
69
66
  // Regular actions.
70
67
  startLoadingData: createAction('START_LOADING_DATA'),
@@ -73,47 +70,43 @@ const actions = {
73
70
  setAPIDataForWizard: createAction('SET_API_DATA'),
74
71
  updateWizardSettings: createAction('UPDATE_WIZARD_SETTINGS'),
75
72
  setError: createAction('SET_ERROR'),
76
-
77
73
  // Async actions. These will not show up in Redux devtools.
78
- *saveWizardSettings(_ref) {
74
+ saveWizardSettings(_ref) {
79
75
  let {
80
76
  slug,
81
77
  section = '',
82
78
  payloadPath = false,
83
79
  updatePayload = null
84
80
  } = _ref;
85
-
86
- // Optionally data can be updated before saving - an immediate update case
87
- // (without an explicit "save" action).
88
- if (updatePayload) {
89
- yield actions.updateWizardSettings({
90
- slug,
91
- ...updatePayload
92
- });
93
- }
94
-
95
- const wizardState = select(WIZARD_STORE_NAMESPACE).getWizardAPIData(slug);
96
- const updatedData = yield actions.fetchFromAPI({
97
- path: `/newspack/v1/wizard/${slug}/${section}`,
98
- method: 'POST',
99
- data: payloadPath ? get(wizardState, payloadPath) : wizardState,
100
- isQuietFetch: true
101
- });
102
-
103
- if (!isEmpty(updatedData)) {
104
- return actions.setAPIDataForWizard({
105
- slug,
106
- data: updatedData
81
+ return function* () {
82
+ // Optionally data can be updated before saving - an immediate update case
83
+ // (without an explicit "save" action).
84
+ if (updatePayload) {
85
+ yield actions.updateWizardSettings({
86
+ slug,
87
+ ...updatePayload
88
+ });
89
+ }
90
+ const wizardState = select(WIZARD_STORE_NAMESPACE).getWizardAPIData(slug);
91
+ const updatedData = yield actions.fetchFromAPI({
92
+ path: `/newspack/v1/wizard/${slug}/${section}`,
93
+ method: 'POST',
94
+ data: payloadPath ? get(wizardState, payloadPath) : wizardState,
95
+ isQuietFetch: true
107
96
  });
108
- }
97
+ if (!isEmpty(updatedData) && !updatedData.error) {
98
+ return actions.setAPIDataForWizard({
99
+ slug,
100
+ data: updatedData
101
+ });
102
+ }
103
+ }();
109
104
  },
110
-
111
105
  *wizardApiFetch(fetchConfig) {
112
106
  // Just a proxy to fetchFromAPI, but it has to be a generator.
113
107
  const result = yield actions.fetchFromAPI(fetchConfig);
114
108
  return result;
115
109
  }
116
-
117
110
  };
118
111
  const selectors = {
119
112
  isLoading: state => state.isLoading,
@@ -130,7 +123,10 @@ const store = createReduxStore(WIZARD_STORE_NAMESPACE, {
130
123
  dispatch(WIZARD_STORE_NAMESPACE).startLoadingData({
131
124
  isQuietLoading: Boolean(action.payload.isQuietFetch)
132
125
  });
133
- return apiFetch(action.payload).catch(error => {
126
+ return apiFetch(action.payload).then(data => {
127
+ dispatch(WIZARD_STORE_NAMESPACE).setError(null);
128
+ return data;
129
+ }).catch(error => {
134
130
  dispatch(WIZARD_STORE_NAMESPACE).setError(error);
135
131
  return {
136
132
  error
@@ -152,10 +148,8 @@ const store = createReduxStore(WIZARD_STORE_NAMESPACE, {
152
148
  data
153
149
  });
154
150
  }
155
-
156
151
  return actions.finishLoadingData();
157
152
  }
158
-
159
153
  }
160
154
  });
161
155
  export default (() => register(store));
@@ -2,10 +2,10 @@
2
2
  * WordPress dependencies.
3
3
  */
4
4
  import { useSelect } from '@wordpress/data';
5
+
5
6
  /**
6
7
  * Internal dependencies
7
8
  */
8
-
9
9
  import { WIZARD_STORE_NAMESPACE } from '.';
10
10
  export const createAction = type => payload => ({
11
11
  type,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "newspack-components",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Newspack design system components",
5
5
  "author": "Automattic",
6
6
  "license": "GPL-2.0-or-later",
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@wordpress/base-styles": "^4.0.0",
27
- "@wordpress/components": "^19.0.1",
28
- "@wordpress/element": "^4.0.1",
27
+ "@wordpress/components": "^23.6.0",
28
+ "@wordpress/element": "^5.5.0",
29
29
  "@wordpress/i18n": "^4.2.2",
30
- "@wordpress/icons": "^6.1.0",
30
+ "@wordpress/icons": "^9.11.0",
31
31
  "classnames": "^2.3.1",
32
32
  "lodash": "^4.17.21",
33
33
  "moment-range": "^3.1.1",
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import { isFunction, isString, isObject } from 'lodash';
4
+ import isFunction from 'lodash/isFunction';
5
+ import isObject from 'lodash/isObject';
6
+ import isString from 'lodash/isString';
5
7
 
6
8
  /**
7
9
  * Creates button props based on an action
@@ -0,0 +1,12 @@
1
+ @mixin visuallyHidden {
2
+ border: 0;
3
+ clip: rect( 1px, 1px, 1px, 1px );
4
+ clip-path: inset( 50% );
5
+ width: 1px;
6
+ height: 1px;
7
+ margin: -1px;
8
+ overflow: hidden;
9
+ padding: 0;
10
+ position: absolute !important;
11
+ word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */
12
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useState } from '@wordpress/element';
5
+ import { Icon, chevronRight } from '@wordpress/icons';
6
+
7
+ /**
8
+ * External dependencies
9
+ */
10
+ import classNames from 'classnames';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import './style.scss';
16
+
17
+ const Accordion = ( { children, title } ) => {
18
+ const [ isOpen, setIsOpen ] = useState( false );
19
+ return (
20
+ <details
21
+ className={ classNames( 'newspack-accordion', { 'newspack-accordion--is-open': isOpen } ) }
22
+ >
23
+ <summary onClick={ () => setIsOpen( ! isOpen ) }>
24
+ { title }
25
+ <Icon className="newspack-accordion__icon" icon={ chevronRight } size={ 24 } />
26
+ </summary>
27
+ { children }
28
+ </details>
29
+ );
30
+ };
31
+
32
+ export default Accordion;
@@ -0,0 +1,27 @@
1
+ @use '~@wordpress/base-styles/colors' as wp-colors;
2
+
3
+ .newspack-accordion {
4
+ border: 1px solid wp-colors.$gray-300;
5
+
6
+ &__icon {
7
+ transition: transform 200ms ease-out;
8
+ transform: rotate( 90deg );
9
+ }
10
+
11
+ &--is-open {
12
+ .newspack-accordion {
13
+ &__icon {
14
+ transform: rotate( -90deg );
15
+ }
16
+ }
17
+ }
18
+ summary {
19
+ padding: 16px 32px;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ cursor: pointer;
24
+ font-size: 14px;
25
+ font-weight: bold;
26
+ }
27
+ }
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { Component } from '@wordpress/element';
9
9
  import { ExternalLink, ToggleControl } from '@wordpress/components';
10
- import { Icon, check } from '@wordpress/icons';
10
+ import { Icon, check, chevronDown, chevronUp } from '@wordpress/icons';
11
11
 
12
12
  /**
13
13
  * Internal dependencies
@@ -21,12 +21,21 @@ import './style.scss';
21
21
  import classnames from 'classnames';
22
22
 
23
23
  class ActionCard extends Component {
24
- backgroundImageStyles = url => {
25
- return url ? { backgroundImage: `url(${ url })` } : {};
24
+ state = {
25
+ expanded: false,
26
26
  };
27
27
 
28
28
  /**
29
- * Render
29
+ * When the collapse prop is updated to true, collapse the card if already expanded.
30
+ */
31
+ componentDidUpdate( prevProps ) {
32
+ if ( ! prevProps.collapse && this.props.collapse && this.state.expanded ) {
33
+ this.setState( { expanded: false } );
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Render.
30
39
  */
31
40
  render() {
32
41
  const {
@@ -60,19 +69,31 @@ class ActionCard extends Component {
60
69
  toggleChecked,
61
70
  toggleOnChange,
62
71
  hasGreyHeader,
72
+ hasWhiteHeader,
63
73
  isPending,
74
+ expandable = false,
64
75
  } = this.props;
76
+
77
+ const { expanded } = this.state;
78
+
65
79
  const hasChildren = notification || children;
66
80
  const classes = classnames(
67
81
  'newspack-action-card',
68
82
  simple && 'newspack-card--is-clickable',
69
83
  hasGreyHeader && 'newspack-card--has-grey-header',
84
+ hasWhiteHeader && 'newspack-card--has-white-header',
70
85
  hasChildren && 'newspack-card--has-children',
71
86
  indent && 'newspack-card--indent',
72
87
  isSmall && 'is-small',
73
88
  isMedium && 'is-medium',
89
+ checkbox && 'has-checkbox',
90
+ expandable && 'is-expandable',
91
+ actionContent && 'has-action-content',
74
92
  className
75
93
  );
94
+ const backgroundImageStyles = url => {
95
+ return url ? { backgroundImage: `url(${ url })` } : {};
96
+ };
76
97
  const titleProps =
77
98
  toggleOnChange && ! titleLink && ! disabled
78
99
  ? { onClick: () => toggleOnChange( ! toggleChecked ), tabIndex: '0' }
@@ -95,7 +116,7 @@ class ActionCard extends Component {
95
116
  <a href={ imageLink }>
96
117
  <div
97
118
  className="newspack-action-card__image"
98
- style={ this.backgroundImageStyles( image ) }
119
+ style={ backgroundImageStyles( image ) }
99
120
  />
100
121
  </a>
101
122
  </div>
@@ -118,7 +139,13 @@ class ActionCard extends Component {
118
139
  <Grid columns={ 1 } gutter={ 8 } noMargin>
119
140
  <h2>
120
141
  <span className="newspack-action-card__title" { ...titleProps }>
121
- { titleLink ? <a href={ titleLink }>{ title }</a> : title }
142
+ { titleLink && <a href={ titleLink }>{ title }</a> }
143
+ { ! titleLink && expandable && (
144
+ <Button isLink onClick={ () => this.setState( { expanded: ! expanded } ) }>
145
+ { title }
146
+ </Button>
147
+ ) }
148
+ { ! titleLink && ! expandable && title }
122
149
  </span>
123
150
  { badges?.length &&
124
151
  badges.map( ( badgeText, i ) => (
@@ -135,7 +162,7 @@ class ActionCard extends Component {
135
162
  ) }
136
163
  </Grid>
137
164
  </div>
138
- { ( actionText || isDisplayingSecondaryAction || actionContent ) && (
165
+ { ! expandable && ( actionText || isDisplayingSecondaryAction || actionContent ) && (
139
166
  <div className="newspack-action-card__region newspack-action-card__region-right">
140
167
  { /* eslint-disable no-nested-ternary */ }
141
168
  { actionContent && actionContent }
@@ -146,6 +173,7 @@ class ActionCard extends Component {
146
173
  </Handoff>
147
174
  ) : onClick || hasInternalLink ? (
148
175
  <Button
176
+ disabled={ disabled }
149
177
  isLink
150
178
  href={ href }
151
179
  onClick={ onClick }
@@ -176,6 +204,11 @@ class ActionCard extends Component {
176
204
  ) }
177
205
  </div>
178
206
  ) }
207
+ { expandable && (
208
+ <Button onClick={ () => this.setState( { expanded: ! expanded } ) }>
209
+ <Icon icon={ expanded ? chevronUp : chevronDown } height={ 24 } width={ 24 } />
210
+ </Button>
211
+ ) }
179
212
  </div>
180
213
  { notification && (
181
214
  <div className="newspack-action-card__notification newspack-action-card__region-children">
@@ -193,7 +226,9 @@ class ActionCard extends Component {
193
226
  ) }
194
227
  </div>
195
228
  ) }
196
- { children && <div className="newspack-action-card__region-children">{ children }</div> }
229
+ { children && ( ( expandable && expanded ) || ! expandable ) && (
230
+ <div className="newspack-action-card__region-children">{ children }</div>
231
+ ) }
197
232
  </Card>
198
233
  );
199
234
  }