@canonical/react-components 4.5.0 → 4.5.2

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.
@@ -24,6 +24,9 @@ export type MultiSelectProps = {
24
24
  renderItem?: (item: MultiSelectItem) => ReactNode;
25
25
  dropdownHeader?: ReactNode;
26
26
  dropdownFooter?: ReactNode;
27
+ footerClassName?: string;
28
+ inputClassName?: string;
29
+ dropdownClassName?: string;
27
30
  emptyState?: ReactNode;
28
31
  emptyMessage?: string;
29
32
  showDropdownFooter?: boolean;
@@ -35,6 +38,7 @@ export type MultiSelectProps = {
35
38
  onSearchChange?: (value: string) => void;
36
39
  onOpen?: () => void;
37
40
  onClose?: () => void;
41
+ searchButtonType?: "submit" | "button";
38
42
  };
39
43
  type GroupFn = (items: Parameters<typeof getGroupedItems>[0]) => ReturnType<typeof getGroupedItems>;
40
44
  type SortFn = typeof sortAlphabetically;
@@ -48,6 +52,8 @@ type MultiSelectDropdownProps = {
48
52
  onDeselectItem?: (item: MultiSelectItem) => void;
49
53
  onSelectItem?: (item: MultiSelectItem) => void;
50
54
  footer?: ReactNode;
55
+ footerClassName?: string;
56
+ dropdownClassName?: string;
51
57
  emptyState?: ReactNode;
52
58
  emptyMessage?: string;
53
59
  groupFn?: GroupFn;
@@ -10,7 +10,7 @@ var _react = _interopRequireWildcard(require("react"));
10
10
  require("./MultiSelect.scss");
11
11
  var _index = require("../../index");
12
12
  var _FadeInDown = require("./FadeInDown");
13
- const _excluded = ["items", "selectedItems", "disabledItems", "header", "updateItems", "onSelectItem", "onDeselectItem", "isOpen", "footer", "emptyState", "emptyMessage", "sortFn", "groupFn", "hasSelectedItemsFirst"];
13
+ const _excluded = ["items", "selectedItems", "disabledItems", "header", "updateItems", "onSelectItem", "onDeselectItem", "isOpen", "footer", "dropdownClassName", "footerClassName", "emptyState", "emptyMessage", "sortFn", "groupFn", "hasSelectedItemsFirst"];
14
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
16
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -57,6 +57,8 @@ const MultiSelectDropdown = _ref2 => {
57
57
  onDeselectItem,
58
58
  isOpen,
59
59
  footer,
60
+ dropdownClassName,
61
+ footerClassName,
60
62
  emptyState,
61
63
  emptyMessage,
62
64
  sortFn = sortAlphabetically,
@@ -101,7 +103,7 @@ const MultiSelectDropdown = _ref2 => {
101
103
  return /*#__PURE__*/_react.default.createElement(_FadeInDown.FadeInDown, {
102
104
  isVisible: isOpen
103
105
  }, /*#__PURE__*/_react.default.createElement("div", _extends({
104
- className: "multi-select__dropdown",
106
+ className: (0, _classnames.default)("multi-select__dropdown", dropdownClassName),
105
107
  role: "listbox"
106
108
  }, props), header ? header : null, hasItems ? groupedItems.map(_ref3 => {
107
109
  let {
@@ -130,7 +132,7 @@ const MultiSelectDropdown = _ref2 => {
130
132
  }) : emptyState !== null && emptyState !== void 0 ? emptyState : emptyMessage ? /*#__PURE__*/_react.default.createElement("p", {
131
133
  className: "multi-select__empty-state"
132
134
  }, emptyMessage) : null, footer ? /*#__PURE__*/_react.default.createElement("div", {
133
- className: "multi-select__footer"
135
+ className: (0, _classnames.default)("multi-select__footer", footerClassName)
134
136
  }, footer) : null));
135
137
  };
136
138
 
@@ -163,6 +165,8 @@ MultiSelectDropdown.propTypes = {
163
165
  onDeselectItem: _propTypes.default.func,
164
166
  onSelectItem: _propTypes.default.func,
165
167
  footer: _propTypes.default.node,
168
+ footerClassName: _propTypes.default.string,
169
+ dropdownClassName: _propTypes.default.string,
166
170
  emptyState: _propTypes.default.node,
167
171
  emptyMessage: _propTypes.default.string,
168
172
  groupFn: _propTypes.default.func,
@@ -184,8 +188,12 @@ const MultiSelect = _ref4 => {
184
188
  disabledItems = [],
185
189
  dropdownHeader,
186
190
  dropdownFooter,
191
+ footerClassName,
192
+ dropdownClassName,
193
+ inputClassName,
187
194
  emptyState,
188
195
  emptyMessage,
196
+ searchButtonType = "submit",
189
197
  showDropdownFooter = true,
190
198
  variant = "search",
191
199
  scrollOverflow = false,
@@ -271,6 +279,13 @@ const MultiSelect = _ref4 => {
271
279
  "aria-label": label || placeholder || "Search",
272
280
  disabled: disabled,
273
281
  autoComplete: "off",
282
+ onMouseDown: event => {
283
+ // When displayed as an input, clicking inside the input should not clear
284
+ // the text (e.g. if the user wants to edit what they've typed).
285
+ if (variant === "search") {
286
+ event.stopPropagation();
287
+ }
288
+ },
274
289
  onChange: value => {
275
290
  updateFilter(value);
276
291
  // reopen if dropdown has been closed via ESC
@@ -282,7 +297,8 @@ const MultiSelect = _ref4 => {
282
297
  required: required,
283
298
  type: "text",
284
299
  value: filter,
285
- className: "multi-select__input"
300
+ searchButtonType: searchButtonType,
301
+ className: (0, _classnames.default)("multi-select__input", inputClassName)
286
302
  }) : /*#__PURE__*/_react.default.createElement("button", {
287
303
  role: "combobox",
288
304
  type: "button",
@@ -326,6 +342,8 @@ const MultiSelect = _ref4 => {
326
342
  onSelectItem: onSelectItem,
327
343
  onDeselectItem: onDeselectItem,
328
344
  footer: footer,
345
+ footerClassName: footerClassName,
346
+ dropdownClassName: dropdownClassName,
329
347
  emptyState: emptyState,
330
348
  emptyMessage: emptyMessage,
331
349
  sortFn: isSortedAlphabetically ? sortAlphabetically : () => 0,
@@ -366,12 +384,12 @@ MultiSelect.propTypes = {
366
384
  renderItem: _propTypes.default.func,
367
385
  dropdownHeader: _propTypes.default.node,
368
386
  dropdownFooter: _propTypes.default.node,
387
+ footerClassName: _propTypes.default.string,
388
+ inputClassName: _propTypes.default.string,
389
+ dropdownClassName: _propTypes.default.string,
369
390
  emptyState: _propTypes.default.node,
370
391
  emptyMessage: _propTypes.default.string,
371
392
  showDropdownFooter: _propTypes.default.bool,
372
393
  variant: _propTypes.default.oneOf(["condensed", "search"]),
373
- scrollOverflow: _propTypes.default.bool,
374
- isSortedAlphabetically: _propTypes.default.bool,
375
- hasSelectedItemsFirst: _propTypes.default.bool,
376
- id: _propTypes.default.string
394
+ scrollOverflow: _propTypes.default.bool
377
395
  };
@@ -37,6 +37,10 @@ export type Props = PropsWithSpread<{
37
37
  * A search input placeholder message.
38
38
  */
39
39
  placeholder?: string;
40
+ /**
41
+ * Whether the search button should be a button or submit type.
42
+ */
43
+ searchButtonType?: "submit" | "button";
40
44
  /**
41
45
  * Whether the search input should lose focus when searching.
42
46
  */
@@ -7,7 +7,7 @@ exports.default = exports.Label = void 0;
7
7
  var _classnames = _interopRequireDefault(require("classnames"));
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _Icon = _interopRequireDefault(require("../Icon"));
10
- const _excluded = ["name", "id", "autocomplete", "className", "disabled", "externallyControlled", "onChange", "onSearch", "onClear", "placeholder", "shouldBlurOnSearch", "shouldRefocusAfterReset", "value"];
10
+ const _excluded = ["name", "id", "autocomplete", "className", "disabled", "externallyControlled", "onChange", "onSearch", "onClear", "searchButtonType", "placeholder", "shouldBlurOnSearch", "shouldRefocusAfterReset", "value"];
11
11
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
13
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -34,6 +34,7 @@ const SearchBox = /*#__PURE__*/_react.default.forwardRef((_ref, forwardedRef) =>
34
34
  onChange,
35
35
  onSearch,
36
36
  onClear,
37
+ searchButtonType = "submit",
37
38
  placeholder = "Search",
38
39
  shouldBlurOnSearch = true,
39
40
  shouldRefocusAfterReset,
@@ -102,7 +103,8 @@ const SearchBox = /*#__PURE__*/_react.default.forwardRef((_ref, forwardedRef) =>
102
103
  }, Label.Clear)), /*#__PURE__*/_react.default.createElement("button", {
103
104
  className: "p-search-box__button",
104
105
  disabled: disabled,
105
- onClick: triggerSearch
106
+ onClick: triggerSearch,
107
+ type: searchButtonType
106
108
  }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
107
109
  name: "search"
108
110
  }, Label.Search)));
@@ -24,6 +24,9 @@ export type MultiSelectProps = {
24
24
  renderItem?: (item: MultiSelectItem) => ReactNode;
25
25
  dropdownHeader?: ReactNode;
26
26
  dropdownFooter?: ReactNode;
27
+ footerClassName?: string;
28
+ inputClassName?: string;
29
+ dropdownClassName?: string;
27
30
  emptyState?: ReactNode;
28
31
  emptyMessage?: string;
29
32
  showDropdownFooter?: boolean;
@@ -35,6 +38,7 @@ export type MultiSelectProps = {
35
38
  onSearchChange?: (value: string) => void;
36
39
  onOpen?: () => void;
37
40
  onClose?: () => void;
41
+ searchButtonType?: "submit" | "button";
38
42
  };
39
43
  type GroupFn = (items: Parameters<typeof getGroupedItems>[0]) => ReturnType<typeof getGroupedItems>;
40
44
  type SortFn = typeof sortAlphabetically;
@@ -48,6 +52,8 @@ type MultiSelectDropdownProps = {
48
52
  onDeselectItem?: (item: MultiSelectItem) => void;
49
53
  onSelectItem?: (item: MultiSelectItem) => void;
50
54
  footer?: ReactNode;
55
+ footerClassName?: string;
56
+ dropdownClassName?: string;
51
57
  emptyState?: ReactNode;
52
58
  emptyMessage?: string;
53
59
  groupFn?: GroupFn;
@@ -1,5 +1,5 @@
1
1
  import _pt from "prop-types";
2
- var _excluded = ["items", "selectedItems", "disabledItems", "header", "updateItems", "onSelectItem", "onDeselectItem", "isOpen", "footer", "emptyState", "emptyMessage", "sortFn", "groupFn", "hasSelectedItemsFirst"];
2
+ var _excluded = ["items", "selectedItems", "disabledItems", "header", "updateItems", "onSelectItem", "onDeselectItem", "isOpen", "footer", "dropdownClassName", "footerClassName", "emptyState", "emptyMessage", "sortFn", "groupFn", "hasSelectedItemsFirst"];
3
3
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
4
4
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
5
5
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
@@ -49,6 +49,8 @@ export var MultiSelectDropdown = _ref2 => {
49
49
  onDeselectItem,
50
50
  isOpen,
51
51
  footer,
52
+ dropdownClassName,
53
+ footerClassName,
52
54
  emptyState,
53
55
  emptyMessage,
54
56
  sortFn = sortAlphabetically,
@@ -93,7 +95,7 @@ export var MultiSelectDropdown = _ref2 => {
93
95
  return /*#__PURE__*/React.createElement(FadeInDown, {
94
96
  isVisible: isOpen
95
97
  }, /*#__PURE__*/React.createElement("div", _extends({
96
- className: "multi-select__dropdown",
98
+ className: classNames("multi-select__dropdown", dropdownClassName),
97
99
  role: "listbox"
98
100
  }, props), header ? header : null, hasItems ? groupedItems.map(_ref3 => {
99
101
  var {
@@ -122,7 +124,7 @@ export var MultiSelectDropdown = _ref2 => {
122
124
  }) : emptyState !== null && emptyState !== void 0 ? emptyState : emptyMessage ? /*#__PURE__*/React.createElement("p", {
123
125
  className: "multi-select__empty-state"
124
126
  }, emptyMessage) : null, footer ? /*#__PURE__*/React.createElement("div", {
125
- className: "multi-select__footer"
127
+ className: classNames("multi-select__footer", footerClassName)
126
128
  }, footer) : null));
127
129
  };
128
130
 
@@ -154,6 +156,8 @@ MultiSelectDropdown.propTypes = {
154
156
  onDeselectItem: _pt.func,
155
157
  onSelectItem: _pt.func,
156
158
  footer: _pt.node,
159
+ footerClassName: _pt.string,
160
+ dropdownClassName: _pt.string,
157
161
  emptyState: _pt.node,
158
162
  emptyMessage: _pt.string,
159
163
  groupFn: _pt.func,
@@ -175,8 +179,12 @@ export var MultiSelect = _ref4 => {
175
179
  disabledItems = [],
176
180
  dropdownHeader,
177
181
  dropdownFooter,
182
+ footerClassName,
183
+ dropdownClassName,
184
+ inputClassName,
178
185
  emptyState,
179
186
  emptyMessage,
187
+ searchButtonType = "submit",
180
188
  showDropdownFooter = true,
181
189
  variant = "search",
182
190
  scrollOverflow = false,
@@ -262,6 +270,13 @@ export var MultiSelect = _ref4 => {
262
270
  "aria-label": label || placeholder || "Search",
263
271
  disabled: disabled,
264
272
  autoComplete: "off",
273
+ onMouseDown: event => {
274
+ // When displayed as an input, clicking inside the input should not clear
275
+ // the text (e.g. if the user wants to edit what they've typed).
276
+ if (variant === "search") {
277
+ event.stopPropagation();
278
+ }
279
+ },
265
280
  onChange: value => {
266
281
  updateFilter(value);
267
282
  // reopen if dropdown has been closed via ESC
@@ -273,7 +288,8 @@ export var MultiSelect = _ref4 => {
273
288
  required: required,
274
289
  type: "text",
275
290
  value: filter,
276
- className: "multi-select__input"
291
+ searchButtonType: searchButtonType,
292
+ className: classNames("multi-select__input", inputClassName)
277
293
  }) : /*#__PURE__*/React.createElement("button", {
278
294
  role: "combobox",
279
295
  type: "button",
@@ -317,6 +333,8 @@ export var MultiSelect = _ref4 => {
317
333
  onSelectItem: onSelectItem,
318
334
  onDeselectItem: onDeselectItem,
319
335
  footer: footer,
336
+ footerClassName: footerClassName,
337
+ dropdownClassName: dropdownClassName,
320
338
  emptyState: emptyState,
321
339
  emptyMessage: emptyMessage,
322
340
  sortFn: isSortedAlphabetically ? sortAlphabetically : () => 0,
@@ -356,12 +374,12 @@ MultiSelect.propTypes = {
356
374
  renderItem: _pt.func,
357
375
  dropdownHeader: _pt.node,
358
376
  dropdownFooter: _pt.node,
377
+ footerClassName: _pt.string,
378
+ inputClassName: _pt.string,
379
+ dropdownClassName: _pt.string,
359
380
  emptyState: _pt.node,
360
381
  emptyMessage: _pt.string,
361
382
  showDropdownFooter: _pt.bool,
362
383
  variant: _pt.oneOf(["condensed", "search"]),
363
- scrollOverflow: _pt.bool,
364
- isSortedAlphabetically: _pt.bool,
365
- hasSelectedItemsFirst: _pt.bool,
366
- id: _pt.string
384
+ scrollOverflow: _pt.bool
367
385
  };
@@ -37,6 +37,10 @@ export type Props = PropsWithSpread<{
37
37
  * A search input placeholder message.
38
38
  */
39
39
  placeholder?: string;
40
+ /**
41
+ * Whether the search button should be a button or submit type.
42
+ */
43
+ searchButtonType?: "submit" | "button";
40
44
  /**
41
45
  * Whether the search input should lose focus when searching.
42
46
  */
@@ -1,4 +1,4 @@
1
- var _excluded = ["name", "id", "autocomplete", "className", "disabled", "externallyControlled", "onChange", "onSearch", "onClear", "placeholder", "shouldBlurOnSearch", "shouldRefocusAfterReset", "value"];
1
+ var _excluded = ["name", "id", "autocomplete", "className", "disabled", "externallyControlled", "onChange", "onSearch", "onClear", "searchButtonType", "placeholder", "shouldBlurOnSearch", "shouldRefocusAfterReset", "value"];
2
2
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
3
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
4
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
@@ -26,6 +26,7 @@ var SearchBox = /*#__PURE__*/React.forwardRef((_ref, forwardedRef) => {
26
26
  onChange: _onChange,
27
27
  onSearch,
28
28
  onClear,
29
+ searchButtonType = "submit",
29
30
  placeholder = "Search",
30
31
  shouldBlurOnSearch = true,
31
32
  shouldRefocusAfterReset,
@@ -94,7 +95,8 @@ var SearchBox = /*#__PURE__*/React.forwardRef((_ref, forwardedRef) => {
94
95
  }, Label.Clear)), /*#__PURE__*/React.createElement("button", {
95
96
  className: "p-search-box__button",
96
97
  disabled: disabled,
97
- onClick: triggerSearch
98
+ onClick: triggerSearch,
99
+ type: searchButtonType
98
100
  }, /*#__PURE__*/React.createElement(Icon, {
99
101
  name: "search"
100
102
  }, Label.Search)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonical/react-components",
3
- "version": "4.5.0",
3
+ "version": "4.5.2",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "author": {