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.
- package/CHANGELOG.md +11 -0
- package/DEVELOPMENT.md +868 -0
- package/colors/colors.module.scss +52 -2
- package/copy-styles.js +3 -2
- package/dist/cjs/accordion/index.js +17 -12
- package/dist/cjs/action-card/index.js +176 -139
- package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
- package/dist/cjs/autocomplete-with-latest-posts/index.js +172 -110
- package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
- package/dist/cjs/badge/index.js +7 -7
- package/dist/cjs/box-contrast/index.js +19 -15
- package/dist/cjs/button/index.js +41 -26
- package/dist/cjs/button-props/button-props.js +5 -5
- package/dist/cjs/button-props/index.js +2 -2
- package/dist/cjs/card/core-card.js +110 -52
- package/dist/cjs/card/index.js +74 -67
- package/dist/cjs/card/style-core.scss +93 -25
- package/dist/cjs/card/style.scss +2 -2
- package/dist/cjs/card-feature/index.js +141 -0
- package/dist/cjs/card-feature/style.scss +75 -0
- package/dist/cjs/card-form/index.js +144 -0
- package/dist/cjs/card-form/style.scss +20 -0
- package/dist/cjs/card-settings-group/index.js +36 -16
- package/dist/cjs/card-sortable-list/index.js +176 -140
- package/dist/cjs/category-autocomplete/index.js +175 -155
- package/dist/cjs/color-picker/index.js +41 -23
- package/dist/cjs/color-picker/index.test.js +82 -0
- package/dist/cjs/color-picker/style.scss +11 -13
- package/dist/cjs/confirm-dialog/index.js +86 -22
- package/dist/cjs/consts.js +1 -1
- package/dist/cjs/custom-select-control/index.js +39 -28
- package/dist/cjs/dataviews/index.js +38 -0
- package/dist/cjs/dataviews/style.scss +9 -0
- package/dist/cjs/divider/index.js +26 -21
- package/dist/cjs/footer/index.js +36 -30
- package/dist/cjs/form-token-field/index.js +51 -40
- package/dist/cjs/global-notices/index.js +5 -5
- package/dist/cjs/grid/index.js +25 -19
- package/dist/cjs/grid/style.scss +6 -1
- package/dist/cjs/handoff/index.js +204 -156
- package/dist/cjs/handoff-message/index.js +12 -7
- package/dist/cjs/hooks/index.js +10 -8
- package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
- package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
- package/dist/cjs/hooks/useObjectState.js +21 -12
- package/dist/cjs/hooks/useObjectState.test.js +55 -33
- package/dist/cjs/hooks/useOnClickOutside.js +6 -6
- package/dist/cjs/hooks/usePrompt.js +10 -13
- package/dist/cjs/image-upload/index.js +114 -123
- package/dist/cjs/image-upload/index.test.js +11 -13
- package/dist/cjs/image-upload/style.scss +12 -40
- package/dist/cjs/index.js +136 -104
- package/dist/cjs/info-button/index.js +43 -32
- package/dist/cjs/integration-icons/active-campaign.js +22 -0
- package/dist/cjs/integration-icons/constant-contact.js +28 -0
- package/dist/cjs/integration-icons/fundraise-up.js +25 -0
- package/dist/cjs/integration-icons/index.js +48 -0
- package/dist/cjs/integration-icons/mailchimp.js +19 -0
- package/dist/cjs/integration-icons/salesforce.js +17 -0
- package/dist/cjs/integration-icons/wisepops.js +20 -0
- package/dist/cjs/modal/index.js +22 -19
- package/dist/cjs/modal/style.scss +4 -0
- package/dist/cjs/newspack-icon/index.js +45 -38
- package/dist/cjs/notice/index.js +64 -55
- package/dist/cjs/plugin-installer/index.js +259 -253
- package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
- package/dist/cjs/plugin-settings/index.js +217 -200
- package/dist/cjs/plugin-toggle/index.js +192 -199
- package/dist/cjs/popover/index.js +41 -28
- package/dist/cjs/position-control/index.js +24 -23
- package/dist/cjs/progress-bar/index.js +71 -59
- package/dist/cjs/progress-bar/index.test.js +62 -68
- package/dist/cjs/proxied-imports/router.js +3 -3
- package/dist/cjs/radio-control/index.js +40 -27
- package/dist/cjs/section-header/index.js +103 -58
- package/dist/cjs/section-header/style.scss +31 -11
- package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
- package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
- package/dist/cjs/select-control/index.js +52 -40
- package/dist/cjs/settings/MinMaxSetting.js +30 -20
- package/dist/cjs/settings/SettingsCard.js +20 -17
- package/dist/cjs/settings/SettingsSection.js +22 -21
- package/dist/cjs/settings/index.js +5 -5
- package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
- package/dist/cjs/steps-list/index.js +44 -34
- package/dist/cjs/steps-list-item/index.js +47 -39
- package/dist/cjs/style-card/index.js +70 -63
- package/dist/cjs/tabbed-navigation/index.js +38 -36
- package/dist/cjs/text-control/index.js +27 -25
- package/dist/cjs/utils/color.js +4 -4
- package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
- package/dist/cjs/utils/index.js +31 -19
- package/dist/cjs/utils/style.scss +8 -0
- package/dist/cjs/waiting/index.js +48 -37
- package/dist/cjs/web-preview/index.js +217 -211
- package/dist/cjs/with-wizard/index.js +362 -364
- package/dist/cjs/with-wizard/style.scss +4 -54
- package/dist/cjs/with-wizard-screen/index.js +54 -58
- package/dist/cjs/with-wizard-screen/style.scss +41 -3
- package/dist/cjs/wizard/components/WizardError.js +20 -18
- package/dist/cjs/wizard/components/WizardSnackbar.js +26 -23
- package/dist/cjs/wizard/index.js +176 -114
- package/dist/cjs/wizard/store/index.js +171 -123
- package/dist/cjs/wizard/store/utils.js +13 -8
- package/dist/esm/accordion/index.js +14 -9
- package/dist/esm/action-card/index.js +168 -123
- package/dist/esm/autocomplete-tokenfield/index.js +248 -222
- package/dist/esm/autocomplete-with-latest-posts/index.js +169 -103
- package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
- package/dist/esm/badge/index.js +5 -5
- package/dist/esm/box-contrast/index.js +15 -11
- package/dist/esm/button/index.js +39 -21
- package/dist/esm/button-props/button-props.js +1 -1
- package/dist/esm/card/core-card.js +109 -47
- package/dist/esm/card/index.js +69 -54
- package/dist/esm/card/style-core.scss +93 -25
- package/dist/esm/card/style.scss +2 -2
- package/dist/esm/card-feature/index.js +131 -0
- package/dist/esm/card-feature/style.scss +75 -0
- package/dist/esm/card-form/index.js +134 -0
- package/dist/esm/card-form/style.scss +20 -0
- package/dist/esm/card-settings-group/index.js +33 -14
- package/dist/esm/card-sortable-list/index.js +170 -126
- package/dist/esm/category-autocomplete/index.js +168 -140
- package/dist/esm/color-picker/index.js +39 -21
- package/dist/esm/color-picker/index.test.js +78 -0
- package/dist/esm/color-picker/style.scss +11 -13
- package/dist/esm/confirm-dialog/index.js +85 -18
- package/dist/esm/consts.js +1 -1
- package/dist/esm/custom-select-control/index.js +34 -15
- package/dist/esm/dataviews/index.js +34 -0
- package/dist/esm/dataviews/style.scss +9 -0
- package/dist/esm/divider/index.js +24 -16
- package/dist/esm/footer/index.js +34 -28
- package/dist/esm/form-token-field/index.js +46 -27
- package/dist/esm/global-notices/index.js +3 -3
- package/dist/esm/grid/index.js +23 -14
- package/dist/esm/grid/style.scss +6 -1
- package/dist/esm/handoff/index.js +199 -143
- package/dist/esm/handoff-message/index.js +10 -6
- package/dist/esm/hooks/index.js +8 -6
- package/dist/esm/hooks/use-confirm-dialog.js +73 -0
- package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
- package/dist/esm/hooks/useObjectState.js +19 -9
- package/dist/esm/hooks/useObjectState.test.js +54 -32
- package/dist/esm/hooks/useOnClickOutside.js +4 -4
- package/dist/esm/hooks/usePrompt.js +9 -11
- package/dist/esm/image-upload/index.js +110 -111
- package/dist/esm/image-upload/index.test.js +11 -13
- package/dist/esm/image-upload/style.scss +12 -40
- package/dist/esm/index.js +7 -1
- package/dist/esm/info-button/index.js +38 -19
- package/dist/esm/integration-icons/active-campaign.js +16 -0
- package/dist/esm/integration-icons/constant-contact.js +22 -0
- package/dist/esm/integration-icons/fundraise-up.js +19 -0
- package/dist/esm/integration-icons/index.js +6 -0
- package/dist/esm/integration-icons/mailchimp.js +13 -0
- package/dist/esm/integration-icons/salesforce.js +11 -0
- package/dist/esm/integration-icons/wisepops.js +14 -0
- package/dist/esm/modal/index.js +20 -13
- package/dist/esm/modal/style.scss +4 -0
- package/dist/esm/newspack-icon/index.js +40 -25
- package/dist/esm/notice/index.js +59 -42
- package/dist/esm/plugin-installer/index.js +255 -243
- package/dist/esm/plugin-settings/SettingsSection.js +61 -50
- package/dist/esm/plugin-settings/index.js +212 -189
- package/dist/esm/plugin-toggle/index.js +187 -190
- package/dist/esm/popover/index.js +35 -16
- package/dist/esm/position-control/index.js +22 -18
- package/dist/esm/progress-bar/index.js +66 -49
- package/dist/esm/progress-bar/index.test.js +61 -67
- package/dist/esm/radio-control/index.js +34 -15
- package/dist/esm/section-header/index.js +102 -57
- package/dist/esm/section-header/style.scss +31 -11
- package/dist/esm/select-control/ButtonGroupControl.js +23 -18
- package/dist/esm/select-control/GroupedSelectControl.js +38 -30
- package/dist/esm/select-control/index.js +47 -27
- package/dist/esm/settings/MinMaxSetting.js +27 -16
- package/dist/esm/settings/SettingsCard.js +18 -13
- package/dist/esm/settings/SettingsSection.js +20 -19
- package/dist/esm/settings/index.js +3 -3
- package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
- package/dist/esm/steps-list/index.js +39 -21
- package/dist/esm/steps-list-item/index.js +42 -26
- package/dist/esm/style-card/index.js +65 -50
- package/dist/esm/tabbed-navigation/index.js +35 -33
- package/dist/esm/text-control/index.js +25 -19
- package/dist/esm/utils/color.js +4 -4
- package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
- package/dist/esm/utils/index.js +29 -16
- package/dist/esm/utils/style.scss +8 -0
- package/dist/esm/waiting/index.js +43 -24
- package/dist/esm/web-preview/index.js +213 -201
- package/dist/esm/with-wizard/index.js +360 -358
- package/dist/esm/with-wizard/style.scss +4 -54
- package/dist/esm/with-wizard-screen/index.js +48 -46
- package/dist/esm/with-wizard-screen/style.scss +41 -3
- package/dist/esm/wizard/components/WizardError.js +18 -16
- package/dist/esm/wizard/components/WizardSnackbar.js +23 -17
- package/dist/esm/wizard/index.js +171 -103
- package/dist/esm/wizard/store/index.js +169 -116
- package/dist/esm/wizard/store/utils.js +13 -6
- package/package.json +30 -16
- package/release.config.js +1 -0
- package/shared/hooks/use-coauthors.js +195 -27
- package/shared/hooks/use-coauthors.test.js +232 -6
- package/shared/scss/_mixins.scss +13 -5
- package/src/accordion/index.js +8 -7
- package/src/action-card/index.js +15 -1
- package/src/badge/index.tsx +3 -1
- package/src/card/core-card.js +95 -18
- package/src/card/index.js +1 -0
- package/src/card/style-core.scss +93 -25
- package/src/card/style.scss +2 -2
- package/src/card-feature/README.md +188 -0
- package/src/card-feature/index.tsx +186 -0
- package/src/card-feature/style.scss +75 -0
- package/src/card-form/README.md +113 -0
- package/src/card-form/index.tsx +128 -0
- package/src/card-form/style.scss +20 -0
- package/src/card-settings-group/index.tsx +28 -3
- package/src/card-sortable-list/index.tsx +27 -4
- package/src/color-picker/index.js +15 -8
- package/src/color-picker/index.test.js +52 -0
- package/src/color-picker/style.scss +11 -13
- package/src/confirm-dialog/README.md +128 -0
- package/src/confirm-dialog/index.tsx +74 -6
- package/src/dataviews/index.tsx +34 -0
- package/src/dataviews/style.scss +9 -0
- package/src/grid/style.scss +6 -1
- package/src/handoff/README.md +93 -0
- package/src/handoff/index.js +46 -8
- package/src/hooks/index.ts +2 -1
- package/src/hooks/use-confirm-dialog.tsx +80 -0
- package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
- package/src/image-upload/index.js +10 -15
- package/src/image-upload/style.scss +12 -40
- package/src/index.js +7 -1
- package/src/integration-icons/active-campaign.js +14 -0
- package/src/integration-icons/constant-contact.js +22 -0
- package/src/integration-icons/fundraise-up.js +18 -0
- package/src/integration-icons/index.js +6 -0
- package/src/integration-icons/mailchimp.js +10 -0
- package/src/integration-icons/salesforce.js +10 -0
- package/src/integration-icons/wisepops.js +14 -0
- package/src/modal/style.scss +4 -0
- package/src/plugin-installer/index.js +30 -19
- package/src/section-header/index.js +56 -24
- package/src/section-header/style.scss +31 -11
- package/src/select-control/index.js +4 -0
- package/src/utils/editor-toolbar-back-button.tsx +48 -0
- package/src/utils/index.js +6 -0
- package/src/utils/style.scss +8 -0
- package/src/with-wizard/style.scss +4 -54
- package/src/with-wizard-screen/style.scss +41 -3
- package/src/wizard/index.js +90 -53
- package/src/wizard/store/index.js +2 -2
- package/dist/cjs/button-card/index.js +0 -72
- package/dist/cjs/button-card/style.scss +0 -180
- package/dist/esm/button-card/index.js +0 -64
- package/dist/esm/button-card/style.scss +0 -180
- package/src/button-card/index.js +0 -52
- package/src/button-card/style.scss +0 -180
|
@@ -4,7 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
14
|
var _apiFetch = _interopRequireDefault(require("@wordpress/api-fetch"));
|
|
9
15
|
var _components = require("@wordpress/components");
|
|
10
16
|
var _element = require("@wordpress/element");
|
|
@@ -16,174 +22,188 @@ var _find = _interopRequireDefault(require("lodash/find"));
|
|
|
16
22
|
var _filter = _interopRequireDefault(require("lodash/filter"));
|
|
17
23
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
18
24
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
19
|
-
|
|
25
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
28
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /**
|
|
20
29
|
* Category Autocomplete
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
30
|
+
*/ /**
|
|
24
31
|
* WordPress dependencies.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
32
|
+
*/ /**
|
|
28
33
|
* Internal dependencies.
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
/**
|
|
34
|
+
*/ /**
|
|
32
35
|
* External dependencies
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
+
*/ /**
|
|
36
37
|
* Category autocomplete field component.
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
suggestions: {},
|
|
40
|
-
allCategories: {},
|
|
41
|
-
isLoading: false
|
|
42
|
-
};
|
|
43
|
-
|
|
38
|
+
*/
|
|
39
|
+
var CategoryAutocomplete = /*#__PURE__*/function (_Component) {
|
|
44
40
|
/**
|
|
45
41
|
* Class constructor.
|
|
46
42
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
(0, _apiFetch.default)({
|
|
56
|
-
path: (0, _url.addQueryArgs)(`/wp/v2/${this.props.taxonomy}`, {
|
|
57
|
-
per_page: -1,
|
|
58
|
-
_fields: 'id,name'
|
|
59
|
-
})
|
|
60
|
-
}).then(categories => this.setState({
|
|
61
|
-
allCategories: categories
|
|
62
|
-
})).finally(() => this.setState({
|
|
43
|
+
function CategoryAutocomplete(props) {
|
|
44
|
+
var _this;
|
|
45
|
+
(0, _classCallCheck2["default"])(this, CategoryAutocomplete);
|
|
46
|
+
_this = _callSuper(this, CategoryAutocomplete, [props]);
|
|
47
|
+
(0, _defineProperty2["default"])(_this, "state", {
|
|
48
|
+
suggestions: {},
|
|
49
|
+
allCategories: {},
|
|
63
50
|
isLoading: false
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Clean up debounced suggestions method.
|
|
69
|
-
*/
|
|
70
|
-
componentWillUnmount() {
|
|
71
|
-
this.debouncedUpdateSuggestions.cancel();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Refresh the autocomplete UI based on text that was typed.
|
|
76
|
-
*
|
|
77
|
-
* @param {string} search The typed text to search for.
|
|
78
|
-
*/
|
|
79
|
-
updateSuggestions(search) {
|
|
80
|
-
this.setState({
|
|
81
|
-
isLoading: true
|
|
82
51
|
});
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Prepare categories data for the API endpoint, call the change handler.
|
|
54
|
+
*
|
|
55
|
+
* @param {Array} tokens An array of category tokens.
|
|
56
|
+
*/
|
|
57
|
+
(0, _defineProperty2["default"])(_this, "handleOnChange", function (tokens) {
|
|
58
|
+
var onChange = _this.props.onChange;
|
|
59
|
+
var suggestions = _this.state.suggestions;
|
|
60
|
+
// Categories that are already will be objects, while new additions will be strings (the name).
|
|
61
|
+
// allValues nomalizes the array so that they are all objects.
|
|
62
|
+
var allValues = tokens.filter(function (token) {
|
|
63
|
+
return 'undefined' !== typeof token;
|
|
64
|
+
}) // Ensure each token is a valid value.
|
|
65
|
+
.map(function (token) {
|
|
66
|
+
return 'string' === typeof token ? suggestions[token] : token;
|
|
67
|
+
}).filter(Boolean);
|
|
68
|
+
onChange(allValues);
|
|
69
|
+
});
|
|
70
|
+
(0, _defineProperty2["default"])(_this, "getAvailableSuggestions", function () {
|
|
71
|
+
var value = _this.props.value;
|
|
72
|
+
var suggestions = _this.state.suggestions;
|
|
73
|
+
var selectedIds = value.reduce(function (acc, item) {
|
|
74
|
+
if (item !== null && item !== void 0 && item.id) {
|
|
75
|
+
acc.push(item.id);
|
|
76
|
+
}
|
|
77
|
+
return acc;
|
|
78
|
+
}, []);
|
|
79
|
+
var availableSuggestions = (0, _filter["default"])(suggestions, function (_ref) {
|
|
80
|
+
var id = _ref.id;
|
|
81
|
+
return selectedIds.indexOf(id) === -1;
|
|
97
82
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
83
|
+
return availableSuggestions.map(function (v) {
|
|
84
|
+
return v.name;
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
_this.debouncedUpdateSuggestions = (0, _debounce["default"])(_this.updateSuggestions, 100);
|
|
88
|
+
return _this;
|
|
101
89
|
}
|
|
90
|
+
(0, _inherits2["default"])(CategoryAutocomplete, _Component);
|
|
91
|
+
return (0, _createClass2["default"])(CategoryAutocomplete, [{
|
|
92
|
+
key: "componentDidMount",
|
|
93
|
+
value: function componentDidMount() {
|
|
94
|
+
var _this2 = this;
|
|
95
|
+
this.setState({
|
|
96
|
+
isLoading: true
|
|
97
|
+
});
|
|
98
|
+
(0, _apiFetch["default"])({
|
|
99
|
+
path: (0, _url.addQueryArgs)("/wp/v2/".concat(this.props.taxonomy), {
|
|
100
|
+
per_page: -1,
|
|
101
|
+
_fields: 'id,name'
|
|
102
|
+
})
|
|
103
|
+
}).then(function (categories) {
|
|
104
|
+
return _this2.setState({
|
|
105
|
+
allCategories: categories
|
|
106
|
+
});
|
|
107
|
+
})["finally"](function () {
|
|
108
|
+
return _this2.setState({
|
|
109
|
+
isLoading: false
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
102
113
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
} = this.props;
|
|
112
|
-
const {
|
|
113
|
-
suggestions
|
|
114
|
-
} = this.state;
|
|
115
|
-
// Categories that are already will be objects, while new additions will be strings (the name).
|
|
116
|
-
// allValues nomalizes the array so that they are all objects.
|
|
117
|
-
const allValues = tokens.filter(token => 'undefined' !== typeof token) // Ensure each token is a valid value.
|
|
118
|
-
.map(token => 'string' === typeof token ? suggestions[token] : token).filter(Boolean);
|
|
119
|
-
onChange(allValues);
|
|
120
|
-
};
|
|
121
|
-
getAvailableSuggestions = () => {
|
|
122
|
-
const {
|
|
123
|
-
value
|
|
124
|
-
} = this.props;
|
|
125
|
-
const {
|
|
126
|
-
suggestions
|
|
127
|
-
} = this.state;
|
|
128
|
-
const selectedIds = value.reduce((acc, item) => {
|
|
129
|
-
if (item?.id) {
|
|
130
|
-
acc.push(item.id);
|
|
131
|
-
}
|
|
132
|
-
return acc;
|
|
133
|
-
}, []);
|
|
134
|
-
const availableSuggestions = (0, _filter.default)(suggestions, ({
|
|
135
|
-
id
|
|
136
|
-
}) => selectedIds.indexOf(id) === -1);
|
|
137
|
-
return availableSuggestions.map(v => v.name);
|
|
138
|
-
};
|
|
114
|
+
/**
|
|
115
|
+
* Clean up debounced suggestions method.
|
|
116
|
+
*/
|
|
117
|
+
}, {
|
|
118
|
+
key: "componentWillUnmount",
|
|
119
|
+
value: function componentWillUnmount() {
|
|
120
|
+
this.debouncedUpdateSuggestions.cancel();
|
|
121
|
+
}
|
|
139
122
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Refresh the autocomplete UI based on text that was typed.
|
|
125
|
+
*
|
|
126
|
+
* @param {string} search The typed text to search for.
|
|
127
|
+
*/
|
|
128
|
+
}, {
|
|
129
|
+
key: "updateSuggestions",
|
|
130
|
+
value: function updateSuggestions(search) {
|
|
131
|
+
var _this3 = this;
|
|
132
|
+
this.setState({
|
|
133
|
+
isLoading: true
|
|
134
|
+
});
|
|
135
|
+
(0, _apiFetch["default"])({
|
|
136
|
+
path: (0, _url.addQueryArgs)("/wp/v2/".concat(this.props.taxonomy), {
|
|
137
|
+
search: search,
|
|
138
|
+
per_page: 20,
|
|
139
|
+
_fields: 'id,name',
|
|
140
|
+
orderby: 'count',
|
|
141
|
+
order: 'desc'
|
|
142
|
+
})
|
|
143
|
+
}).then(function (categories) {
|
|
144
|
+
_this3.setState({
|
|
145
|
+
suggestions: categories.reduce(function (accumulator, category) {
|
|
146
|
+
return _objectSpread(_objectSpread({}, accumulator), {}, (0, _defineProperty2["default"])({}, category.name, category));
|
|
147
|
+
}, {})
|
|
148
|
+
});
|
|
149
|
+
})["finally"](function () {
|
|
150
|
+
return _this3.setState({
|
|
151
|
+
isLoading: false
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}, {
|
|
156
|
+
key: "render",
|
|
157
|
+
value:
|
|
158
|
+
/**
|
|
159
|
+
* Render the component.
|
|
160
|
+
*/
|
|
161
|
+
function render() {
|
|
162
|
+
var _this4 = this;
|
|
163
|
+
var _this$props = this.props,
|
|
164
|
+
className = _this$props.className,
|
|
165
|
+
disabled = _this$props.disabled,
|
|
166
|
+
description = _this$props.description,
|
|
167
|
+
hideHelpFromVision = _this$props.hideHelpFromVision,
|
|
168
|
+
hideLabelFromVision = _this$props.hideLabelFromVision,
|
|
169
|
+
label = _this$props.label,
|
|
170
|
+
value = _this$props.value;
|
|
171
|
+
var _this$state = this.state,
|
|
172
|
+
allCategories = _this$state.allCategories,
|
|
173
|
+
isLoading = _this$state.isLoading;
|
|
174
|
+
var classes = (0, _classnames["default"])('newspack-category-autocomplete', className);
|
|
175
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
176
|
+
className: classes,
|
|
177
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_.FormTokenField, {
|
|
178
|
+
onInputChange: function onInputChange(input) {
|
|
179
|
+
return _this4.debouncedUpdateSuggestions(input);
|
|
180
|
+
},
|
|
181
|
+
value: value.reduce(function (acc, item) {
|
|
182
|
+
var categoryOrItem = typeof item === 'number' ? (0, _find["default"])(allCategories, ['id', item]) : item;
|
|
183
|
+
if (categoryOrItem) {
|
|
184
|
+
acc.push({
|
|
185
|
+
id: categoryOrItem.term_id || categoryOrItem.id,
|
|
186
|
+
value: categoryOrItem.value || categoryOrItem.name
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return acc;
|
|
190
|
+
}, []),
|
|
191
|
+
suggestions: this.getAvailableSuggestions(),
|
|
192
|
+
onChange: this.handleOnChange,
|
|
193
|
+
label: label,
|
|
194
|
+
disabled: disabled,
|
|
195
|
+
description: description,
|
|
196
|
+
hideHelpFromVision: hideHelpFromVision,
|
|
197
|
+
hideLabelFromVision: hideLabelFromVision
|
|
198
|
+
}), isLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
199
|
+
className: "newspack-category-autocomplete__suggestions-spinner",
|
|
200
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Spinner, {})
|
|
201
|
+
}) : null]
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}]);
|
|
205
|
+
}(_element.Component);
|
|
186
206
|
CategoryAutocomplete.defaultProps = {
|
|
187
207
|
taxonomy: 'categories'
|
|
188
208
|
};
|
|
189
|
-
var _default = exports
|
|
209
|
+
var _default = exports["default"] = CategoryAutocomplete;
|
|
@@ -4,8 +4,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
8
9
|
var _components = require("@wordpress/components");
|
|
10
|
+
var _compose = require("@wordpress/compose");
|
|
9
11
|
var _element = require("@wordpress/element");
|
|
10
12
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
11
13
|
var _colord = require("colord");
|
|
@@ -26,42 +28,58 @@ var _jsxRuntime = require("react/jsx-runtime");
|
|
|
26
28
|
* Internal dependencies.
|
|
27
29
|
*/
|
|
28
30
|
|
|
29
|
-
(0, _colord.extend)([_a11y
|
|
30
|
-
|
|
31
|
-
InteractiveDiv
|
|
32
|
-
} = _utils.default;
|
|
31
|
+
(0, _colord.extend)([_a11y["default"]]);
|
|
32
|
+
var InteractiveDiv = _utils["default"].InteractiveDiv;
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* ColorPicker component.
|
|
36
36
|
*
|
|
37
37
|
* @param {Object} props - Component props.
|
|
38
38
|
* @param {JSX.Element|string} props.label - Label for the color picker.
|
|
39
|
+
* @param {JSX.Element|string} props.help - Help text for the color picker.
|
|
39
40
|
* @param {string} [props.color] - Default color.
|
|
40
41
|
* @param {Function} props.onChange - Function to call when the color changes.
|
|
41
42
|
* @param {string} [props.className] - Additional class name.
|
|
42
43
|
* @return {JSX.Element} ColorPicker component.
|
|
43
44
|
*/
|
|
44
|
-
|
|
45
|
-
label,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
45
|
+
var _ColorPicker = function ColorPicker(_ref) {
|
|
46
|
+
var label = _ref.label,
|
|
47
|
+
help = _ref.help,
|
|
48
|
+
_ref$color = _ref.color,
|
|
49
|
+
color = _ref$color === void 0 ? '#ffffff' : _ref$color,
|
|
50
|
+
onChange = _ref.onChange,
|
|
51
|
+
className = _ref.className;
|
|
52
|
+
var _useState = (0, _element.useState)(false),
|
|
53
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
54
|
+
isExpanded = _useState2[0],
|
|
55
|
+
setIsExpanded = _useState2[1];
|
|
56
|
+
var ref = (0, _element.useRef)();
|
|
57
|
+
var id = (0, _compose.useInstanceId)(_ColorPicker, 'newspack-color-picker');
|
|
58
|
+
var labelId = "".concat(id, "-label");
|
|
59
|
+
var colordColor = (0, _colord.colord)(color);
|
|
60
|
+
_hooks["default"].useOnClickOutside(ref, function () {
|
|
61
|
+
return setIsExpanded(false);
|
|
62
|
+
});
|
|
63
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.BaseControl, {
|
|
64
|
+
id: id,
|
|
65
|
+
className: (0, _classnames["default"])('newspack-color-picker', className),
|
|
66
|
+
help: help,
|
|
67
|
+
__nextHasNoMarginBottom: true,
|
|
68
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.BaseControl.VisualLabel, {
|
|
69
|
+
id: labelId,
|
|
58
70
|
children: label
|
|
59
71
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(InteractiveDiv, {
|
|
72
|
+
id: id,
|
|
73
|
+
"aria-labelledby": labelId,
|
|
74
|
+
"aria-describedby": help ? "".concat(id, "__help") : undefined,
|
|
75
|
+
"aria-expanded": isExpanded,
|
|
60
76
|
className: 'newspack-color-picker__expander',
|
|
61
|
-
onClick: ()
|
|
77
|
+
onClick: function onClick() {
|
|
78
|
+
return setIsExpanded(!isExpanded);
|
|
79
|
+
},
|
|
62
80
|
style: {
|
|
63
81
|
backgroundColor: color,
|
|
64
|
-
color: colordColor.contrast() > colordColor.contrast('#
|
|
82
|
+
color: colordColor.contrast() > colordColor.contrast('#000000') ? '#ffffff' : '#000000'
|
|
65
83
|
},
|
|
66
84
|
children: color
|
|
67
85
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
@@ -69,10 +87,10 @@ const ColorPicker = ({
|
|
|
69
87
|
ref: ref,
|
|
70
88
|
children: isExpanded && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ColorPicker, {
|
|
71
89
|
color: color,
|
|
72
|
-
onChange:
|
|
90
|
+
onChange: onChange,
|
|
73
91
|
enableAlpha: false
|
|
74
92
|
})
|
|
75
93
|
})]
|
|
76
94
|
});
|
|
77
95
|
};
|
|
78
|
-
var _default = exports
|
|
96
|
+
var _default = exports["default"] = _ColorPicker;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _ = _interopRequireDefault(require("./"));
|
|
6
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* External dependencies
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Internal dependencies
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
describe('ColorPicker', function () {
|
|
16
|
+
it('should render the label', function () {
|
|
17
|
+
var _render = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
18
|
+
label: "Background color",
|
|
19
|
+
onChange: function onChange() {}
|
|
20
|
+
})),
|
|
21
|
+
getByText = _render.getByText;
|
|
22
|
+
expect(getByText('Background color')).toBeInTheDocument();
|
|
23
|
+
});
|
|
24
|
+
it('should render help text', function () {
|
|
25
|
+
var _render2 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
26
|
+
label: "Background color",
|
|
27
|
+
help: "Choose a color",
|
|
28
|
+
onChange: function onChange() {}
|
|
29
|
+
})),
|
|
30
|
+
getByText = _render2.getByText;
|
|
31
|
+
expect(getByText('Choose a color')).toBeInTheDocument();
|
|
32
|
+
});
|
|
33
|
+
it('should start collapsed', function () {
|
|
34
|
+
var _render3 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
35
|
+
label: "Background color",
|
|
36
|
+
onChange: function onChange() {}
|
|
37
|
+
})),
|
|
38
|
+
getByRole = _render3.getByRole;
|
|
39
|
+
expect(getByRole('button')).toHaveAttribute('aria-expanded', 'false');
|
|
40
|
+
});
|
|
41
|
+
it('should expand when the expander is clicked', function () {
|
|
42
|
+
var _render4 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
43
|
+
label: "Background color",
|
|
44
|
+
onChange: function onChange() {}
|
|
45
|
+
})),
|
|
46
|
+
getByRole = _render4.getByRole;
|
|
47
|
+
var expander = getByRole('button');
|
|
48
|
+
_react.fireEvent.click(expander);
|
|
49
|
+
expect(expander).toHaveAttribute('aria-expanded', 'true');
|
|
50
|
+
});
|
|
51
|
+
it('should associate label via aria-labelledby', function () {
|
|
52
|
+
var _render5 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
53
|
+
label: "Background color",
|
|
54
|
+
onChange: function onChange() {}
|
|
55
|
+
})),
|
|
56
|
+
getByRole = _render5.getByRole,
|
|
57
|
+
getByText = _render5.getByText;
|
|
58
|
+
var expander = getByRole('button');
|
|
59
|
+
var label = getByText('Background color');
|
|
60
|
+
expect(expander.getAttribute('aria-labelledby')).toBe(label.id);
|
|
61
|
+
});
|
|
62
|
+
it('should associate help text via aria-describedby when help is provided', function () {
|
|
63
|
+
var _render6 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
64
|
+
label: "Background color",
|
|
65
|
+
help: "Choose a color",
|
|
66
|
+
onChange: function onChange() {}
|
|
67
|
+
})),
|
|
68
|
+
getByRole = _render6.getByRole,
|
|
69
|
+
getByText = _render6.getByText;
|
|
70
|
+
var expander = getByRole('button');
|
|
71
|
+
var help = getByText('Choose a color');
|
|
72
|
+
expect(expander.getAttribute('aria-describedby')).toBe(help.id);
|
|
73
|
+
});
|
|
74
|
+
it('should not set aria-describedby when no help is provided', function () {
|
|
75
|
+
var _render7 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
|
|
76
|
+
label: "Background color",
|
|
77
|
+
onChange: function onChange() {}
|
|
78
|
+
})),
|
|
79
|
+
getByRole = _render7.getByRole;
|
|
80
|
+
expect(getByRole('button')).not.toHaveAttribute('aria-describedby');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -2,31 +2,29 @@
|
|
|
2
2
|
* Color Picker
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
@use "~@wordpress/base-styles/colors" as wp-colors;
|
|
6
|
+
@use "~@wordpress/base-styles/variables" as wp-vars;
|
|
7
|
+
|
|
5
8
|
.newspack-color-picker {
|
|
6
9
|
position: relative;
|
|
7
|
-
|
|
8
|
-
&__label {
|
|
9
|
-
margin-bottom: 8px;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
10
|
&__expander {
|
|
13
|
-
box-shadow: inset 0 0 0 1px
|
|
14
|
-
border-radius:
|
|
15
|
-
height:
|
|
16
|
-
padding:
|
|
11
|
+
box-shadow: inset 0 0 0 1px rgba(wp-colors.$black, 0.54);
|
|
12
|
+
border-radius: wp-vars.$radius-small;
|
|
13
|
+
height: wp-vars.$grid-unit-80;
|
|
14
|
+
padding: wp-vars.$grid-unit-10;
|
|
17
15
|
text-align: right;
|
|
18
16
|
text-transform: uppercase;
|
|
19
17
|
|
|
20
18
|
&:focus-visible {
|
|
21
19
|
box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
|
|
22
|
-
border-color: white;
|
|
20
|
+
border-color: wp-colors.$white;
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
23
|
|
|
26
24
|
&__main {
|
|
27
|
-
background: white;
|
|
28
|
-
box-shadow:
|
|
29
|
-
margin:
|
|
25
|
+
background: wp-colors.$white;
|
|
26
|
+
box-shadow: wp-vars.$elevation-small;
|
|
27
|
+
margin: wp-vars.$grid-unit-10 0 0;
|
|
30
28
|
position: absolute;
|
|
31
29
|
z-index: 2;
|
|
32
30
|
|