carbon-react 107.0.0 → 107.1.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.
- package/esm/__internal__/click-away-wrapper/click-away-wrapper.component.d.ts +12 -0
- package/esm/__internal__/click-away-wrapper/click-away-wrapper.component.js +43 -0
- package/esm/__internal__/click-away-wrapper/index.d.ts +2 -0
- package/esm/__internal__/click-away-wrapper/index.js +1 -0
- package/esm/components/button-toggle-group/button-toggle-group.component.d.ts +2 -1
- package/esm/components/button-toggle-group/button-toggle-group.component.js +3 -1
- package/esm/components/date/date.component.js +19 -20
- package/esm/components/date/date.d.ts +10 -1
- package/esm/components/date/index.d.ts +1 -0
- package/esm/components/date-range/date-range.d.ts +3 -3
- package/esm/components/date-range/index.d.ts +1 -0
- package/esm/components/menu/__internal__/submenu/submenu.component.js +11 -17
- package/esm/components/popover-container/popover-container.component.js +16 -3
- package/lib/__internal__/click-away-wrapper/click-away-wrapper.component.d.ts +12 -0
- package/lib/__internal__/click-away-wrapper/click-away-wrapper.component.js +59 -0
- package/lib/__internal__/click-away-wrapper/index.d.ts +2 -0
- package/lib/__internal__/click-away-wrapper/index.js +15 -0
- package/lib/__internal__/click-away-wrapper/package.json +6 -0
- package/lib/components/button-toggle-group/button-toggle-group.component.d.ts +2 -1
- package/lib/components/button-toggle-group/button-toggle-group.component.js +3 -1
- package/lib/components/date/date.component.js +20 -20
- package/lib/components/date/date.d.ts +10 -1
- package/lib/components/date/index.d.ts +1 -0
- package/lib/components/date-range/date-range.d.ts +3 -3
- package/lib/components/date-range/index.d.ts +1 -0
- package/lib/components/menu/__internal__/submenu/submenu.component.js +12 -17
- package/lib/components/popover-container/popover-container.component.js +17 -3
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface ClickAwayWrapperProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
handleClickAway: (ev: CustomEvent) => void;
|
|
5
|
+
eventTypeId?: "mousedown" | "click";
|
|
6
|
+
targets: React.RefObject<HTMLElement>[];
|
|
7
|
+
}
|
|
8
|
+
declare const ClickAwayWrapper: {
|
|
9
|
+
({ children, handleClickAway, eventTypeId, targets, }: ClickAwayWrapperProps): JSX.Element;
|
|
10
|
+
displayName: string;
|
|
11
|
+
};
|
|
12
|
+
export default ClickAwayWrapper;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React, { useEffect } from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
import Events from "../utils/helpers/events";
|
|
4
|
+
|
|
5
|
+
const ClickAwayWrapper = ({
|
|
6
|
+
children,
|
|
7
|
+
handleClickAway,
|
|
8
|
+
eventTypeId = "click",
|
|
9
|
+
targets
|
|
10
|
+
}) => {
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const fnClickAway = ev => {
|
|
13
|
+
const clickedElements = targets.filter(ref => (ref === null || ref === void 0 ? void 0 : ref.current) && Events.composedPath(ev).includes(ref.current));
|
|
14
|
+
|
|
15
|
+
if (!clickedElements || !clickedElements.length) {
|
|
16
|
+
handleClickAway(ev);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
document.addEventListener(eventTypeId, fnClickAway);
|
|
21
|
+
return function cleanup() {
|
|
22
|
+
document.removeEventListener(eventTypeId, fnClickAway);
|
|
23
|
+
};
|
|
24
|
+
}, [handleClickAway, targets, eventTypeId]);
|
|
25
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
ClickAwayWrapper.propTypes = {
|
|
29
|
+
"children": PropTypes.node,
|
|
30
|
+
"eventTypeId": PropTypes.oneOf(["click", "mousedown"]),
|
|
31
|
+
"handleClickAway": PropTypes.func.isRequired,
|
|
32
|
+
"targets": PropTypes.arrayOf(PropTypes.shape({
|
|
33
|
+
"current": PropTypes.oneOfType([PropTypes.oneOf([null]), function (props, propName) {
|
|
34
|
+
if (props[propName] == null) {
|
|
35
|
+
return new Error("Prop '" + propName + "' is required but wasn't specified");
|
|
36
|
+
} else if (typeof props[propName] !== 'object' || props[propName].nodeType !== 1) {
|
|
37
|
+
return new Error("Expected prop '" + propName + "' to be of type Element");
|
|
38
|
+
}
|
|
39
|
+
}]).isRequired
|
|
40
|
+
})).isRequired
|
|
41
|
+
};
|
|
42
|
+
ClickAwayWrapper.displayName = "ClickAwayWrapper";
|
|
43
|
+
export default ClickAwayWrapper;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./click-away-wrapper.component";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default ButtonToggleGroup;
|
|
2
|
-
declare function ButtonToggleGroup({ children, name, error, warning, info, validationOnLabel, label, labelHelp, labelSpacing, inputWidth, fieldHelp, fieldHelpInline, labelInline, labelWidth, labelAlign, onChange, onBlur, value, "data-component": dataComponent, "data-element": dataElement, "data-role": dataRole, helpAriaLabel, ...props }: {
|
|
2
|
+
declare function ButtonToggleGroup({ children, name, error, warning, info, validationOnLabel, label, labelHelp, labelSpacing, inputWidth, fieldHelp, fieldHelpInline, labelInline, labelWidth, labelAlign, onChange, onBlur, value, "data-component": dataComponent, "data-element": dataElement, "data-role": dataRole, helpAriaLabel, id, ...props }: {
|
|
3
3
|
[x: string]: any;
|
|
4
4
|
children: any;
|
|
5
5
|
name: any;
|
|
@@ -23,6 +23,7 @@ declare function ButtonToggleGroup({ children, name, error, warning, info, valid
|
|
|
23
23
|
"data-element": any;
|
|
24
24
|
"data-role": any;
|
|
25
25
|
helpAriaLabel: any;
|
|
26
|
+
id: any;
|
|
26
27
|
}): JSX.Element;
|
|
27
28
|
declare namespace ButtonToggleGroup {
|
|
28
29
|
const propTypes: {
|
|
@@ -36,6 +36,7 @@ const ButtonToggleGroup = ({
|
|
|
36
36
|
"data-element": dataElement,
|
|
37
37
|
"data-role": dataRole,
|
|
38
38
|
helpAriaLabel,
|
|
39
|
+
id,
|
|
39
40
|
...props
|
|
40
41
|
}) => {
|
|
41
42
|
const validationProps = {
|
|
@@ -57,7 +58,8 @@ const ButtonToggleGroup = ({
|
|
|
57
58
|
labelAlign: labelAlign,
|
|
58
59
|
"data-component": dataComponent,
|
|
59
60
|
"data-role": dataRole,
|
|
60
|
-
"data-element": dataElement
|
|
61
|
+
"data-element": dataElement,
|
|
62
|
+
id: id
|
|
61
63
|
}, validationProps, filterStyledSystemMarginProps(props)), /*#__PURE__*/React.createElement(ButtonToggleGroupStyle, _extends({
|
|
62
64
|
"aria-label": label,
|
|
63
65
|
role: "radiogroup",
|
|
@@ -12,6 +12,7 @@ import StyledDateInput from "./date.style";
|
|
|
12
12
|
import Textbox from "../textbox";
|
|
13
13
|
import DatePicker from "./__internal__/date-picker";
|
|
14
14
|
import DateRangeContext from "../date-range/date-range.context";
|
|
15
|
+
import ClickAwayWrapper from "../../__internal__/click-away-wrapper";
|
|
15
16
|
const marginPropTypes = filterStyledSystemMarginProps(styledSystemPropTypes.space);
|
|
16
17
|
|
|
17
18
|
const DateInput = ({
|
|
@@ -234,23 +235,6 @@ const DateInput = ({
|
|
|
234
235
|
}
|
|
235
236
|
};
|
|
236
237
|
|
|
237
|
-
useEffect(() => {
|
|
238
|
-
const fnClosePicker = ev => {
|
|
239
|
-
if (open && !Events.composedPath(ev).includes(parentRef.current) && !Events.composedPath(ev).includes(pickerRef.current)) {
|
|
240
|
-
alreadyFocused.current = true;
|
|
241
|
-
inputRef.current.focus();
|
|
242
|
-
isBlurBlocked.current = false;
|
|
243
|
-
inputRef.current.blur();
|
|
244
|
-
setOpen(false);
|
|
245
|
-
alreadyFocused.current = false;
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
document.addEventListener("mousedown", fnClosePicker);
|
|
250
|
-
return function cleanup() {
|
|
251
|
-
document.removeEventListener("mousedown", fnClosePicker);
|
|
252
|
-
};
|
|
253
|
-
}, [open]);
|
|
254
238
|
useEffect(() => {
|
|
255
239
|
const [matchedFormat, matchedValue] = findMatchedFormatAndValue(value, formats);
|
|
256
240
|
|
|
@@ -282,7 +266,22 @@ const DateInput = ({
|
|
|
282
266
|
return value;
|
|
283
267
|
};
|
|
284
268
|
|
|
285
|
-
|
|
269
|
+
const handleClickAway = () => {
|
|
270
|
+
if (open) {
|
|
271
|
+
alreadyFocused.current = true;
|
|
272
|
+
inputRef.current.focus();
|
|
273
|
+
isBlurBlocked.current = false;
|
|
274
|
+
inputRef.current.blur();
|
|
275
|
+
setOpen(false);
|
|
276
|
+
alreadyFocused.current = false;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
return /*#__PURE__*/React.createElement(ClickAwayWrapper, {
|
|
281
|
+
handleClickAway: handleClickAway,
|
|
282
|
+
eventTypeId: "mousedown",
|
|
283
|
+
targets: [parentRef, pickerRef]
|
|
284
|
+
}, /*#__PURE__*/React.createElement(StyledDateInput, _extends({
|
|
286
285
|
ref: wrapperRef,
|
|
287
286
|
role: "presentation",
|
|
288
287
|
size: size,
|
|
@@ -322,13 +321,13 @@ const DateInput = ({
|
|
|
322
321
|
ref: pickerRef,
|
|
323
322
|
pickerMouseDown: handlePickerMouseDown,
|
|
324
323
|
open: open
|
|
325
|
-
}));
|
|
324
|
+
})));
|
|
326
325
|
};
|
|
327
326
|
|
|
328
327
|
DateInput.propTypes = { ...Textbox.propTypes,
|
|
329
328
|
...marginPropTypes,
|
|
330
329
|
|
|
331
|
-
/** Pass any props that match the [DayPickerProps](https://react-day-picker.
|
|
330
|
+
/** Pass any props that match the [DayPickerProps](https://react-day-picker-v7.netlify.app/docs/getting-started/)
|
|
332
331
|
* interface to override default behaviors
|
|
333
332
|
* */
|
|
334
333
|
pickerProps: PropTypes.object,
|
|
@@ -2,6 +2,15 @@ import * as React from "react";
|
|
|
2
2
|
import { DayPickerProps } from "react-day-picker";
|
|
3
3
|
import { TextboxProps } from "../textbox/textbox";
|
|
4
4
|
|
|
5
|
+
export interface DateChangeEvent {
|
|
6
|
+
target: {
|
|
7
|
+
value: {
|
|
8
|
+
formattedValue: string;
|
|
9
|
+
rawValue: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
5
14
|
export interface DateInputProps
|
|
6
15
|
extends Omit<
|
|
7
16
|
TextboxProps,
|
|
@@ -31,7 +40,7 @@ export interface DateInputProps
|
|
|
31
40
|
/** Maximum possible date YYYY-MM-DD */
|
|
32
41
|
maxDate?: string;
|
|
33
42
|
/** Specify a callback triggered on change */
|
|
34
|
-
onChange: (ev:
|
|
43
|
+
onChange: (ev: DateChangeEvent) => void;
|
|
35
44
|
/** The current date string */
|
|
36
45
|
value: string;
|
|
37
46
|
/** Pass any props that match the DayPickerProps interface to override default behaviors */
|
|
@@ -2,7 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import { MarginProps } from "styled-system";
|
|
3
3
|
import { DateInputProps } from "../date/date";
|
|
4
4
|
|
|
5
|
-
interface DateRangeChangeEvent {
|
|
5
|
+
export interface DateRangeChangeEvent {
|
|
6
6
|
target: {
|
|
7
7
|
value: [
|
|
8
8
|
{
|
|
@@ -19,7 +19,7 @@ interface DateRangeChangeEvent {
|
|
|
19
19
|
|
|
20
20
|
export interface DateRangeProps extends MarginProps {
|
|
21
21
|
/** Props for the child end Date component */
|
|
22
|
-
endDateProps?: DateInputProps
|
|
22
|
+
endDateProps?: Partial<DateInputProps>;
|
|
23
23
|
/** Optional label for endDate field */
|
|
24
24
|
endLabel?: string;
|
|
25
25
|
/**
|
|
@@ -51,7 +51,7 @@ export interface DateRangeProps extends MarginProps {
|
|
|
51
51
|
/** Specify a callback triggered on blur */
|
|
52
52
|
onBlur?: (ev: DateRangeChangeEvent) => void;
|
|
53
53
|
/** Props for the child start Date component */
|
|
54
|
-
startDateProps?: DateInputProps
|
|
54
|
+
startDateProps?: Partial<DateInputProps>;
|
|
55
55
|
/** Optional label for startDate field */
|
|
56
56
|
startLabel?: string;
|
|
57
57
|
/**
|
|
@@ -12,6 +12,7 @@ import MenuItem from "../../menu-item";
|
|
|
12
12
|
import { characterNavigation } from "../keyboard-navigation";
|
|
13
13
|
import ScrollableBlock from "../../scrollable-block";
|
|
14
14
|
import SubmenuContext from "./submenu.context";
|
|
15
|
+
import ClickAwayWrapper from "../../../../__internal__/click-away-wrapper";
|
|
15
16
|
const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
16
17
|
children,
|
|
17
18
|
className,
|
|
@@ -183,12 +184,11 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
186
|
}, [submenuFocusIndex, submenuOpen, href, menuContext, arrayOfFormattedChildren, numberOfChildren, openSubmenu, closeSubmenu, onKeyDown, characterString, restartCharacterTimeout, startCharacterTimeout]);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}, [closeSubmenu]);
|
|
187
|
+
|
|
188
|
+
const handleClickAway = () => {
|
|
189
|
+
document.removeEventListener("click", handleClickAway);
|
|
190
|
+
closeSubmenu();
|
|
191
|
+
};
|
|
192
192
|
|
|
193
193
|
const handleClick = event => {
|
|
194
194
|
if (clickToOpen) {
|
|
@@ -207,15 +207,6 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
207
207
|
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
208
208
|
|
|
209
209
|
}, [characterString]);
|
|
210
|
-
useEffect(() => {
|
|
211
|
-
if (submenuOpen) {
|
|
212
|
-
document.addEventListener("click", onClickOutside);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return function cleanup() {
|
|
216
|
-
document.removeEventListener("click", onClickOutside);
|
|
217
|
-
};
|
|
218
|
-
}, [onClickOutside, submenuOpen]);
|
|
219
210
|
|
|
220
211
|
if (inFullscreenView) {
|
|
221
212
|
return /*#__PURE__*/React.createElement(StyledSubmenuWrapper, {
|
|
@@ -249,7 +240,10 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
249
240
|
}, child))));
|
|
250
241
|
}
|
|
251
242
|
|
|
252
|
-
return /*#__PURE__*/React.createElement(
|
|
243
|
+
return /*#__PURE__*/React.createElement(ClickAwayWrapper, {
|
|
244
|
+
handleClickAway: handleClickAway,
|
|
245
|
+
targets: [submenuRef]
|
|
246
|
+
}, /*#__PURE__*/React.createElement(StyledSubmenuWrapper, {
|
|
253
247
|
"data-component": "submenu-wrapper",
|
|
254
248
|
onMouseOver: !clickToOpen ? () => openSubmenu() : undefined,
|
|
255
249
|
onMouseLeave: () => closeSubmenu(),
|
|
@@ -287,7 +281,7 @@ const Submenu = /*#__PURE__*/React.forwardRef(({
|
|
|
287
281
|
updateFocusIndex: setSubmenuFocusIndex,
|
|
288
282
|
itemIndex: child.type === MenuItem ? index : undefined
|
|
289
283
|
}
|
|
290
|
-
}, child))));
|
|
284
|
+
}, child)))));
|
|
291
285
|
});
|
|
292
286
|
Submenu.propTypes = {
|
|
293
287
|
/** Children elements */
|
|
@@ -8,6 +8,7 @@ import { PopoverContainerWrapperStyle, PopoverContainerHeaderStyle, PopoverConta
|
|
|
8
8
|
import Icon from "../icon";
|
|
9
9
|
import createGuid from "../../__internal__/utils/helpers/guid";
|
|
10
10
|
import { filterStyledSystemPaddingProps } from "../../style/utils";
|
|
11
|
+
import ClickAwayWrapper from "../../__internal__/click-away-wrapper";
|
|
11
12
|
const paddingPropTypes = filterStyledSystemPaddingProps(styledSystemPropTypes.space);
|
|
12
13
|
|
|
13
14
|
const PopoverContainer = ({
|
|
@@ -28,6 +29,7 @@ const PopoverContainer = ({
|
|
|
28
29
|
}) => {
|
|
29
30
|
const isControlled = open !== undefined;
|
|
30
31
|
const [isOpenInternal, setIsOpenInternal] = useState(false);
|
|
32
|
+
const ref = useRef();
|
|
31
33
|
const closeButtonRef = useRef();
|
|
32
34
|
const openButtonRef = useRef();
|
|
33
35
|
const guid = useRef(createGuid());
|
|
@@ -68,10 +70,21 @@ const PopoverContainer = ({
|
|
|
68
70
|
ref: closeButtonRef,
|
|
69
71
|
ariaLabel: closeButtonAriaLabel
|
|
70
72
|
};
|
|
71
|
-
|
|
73
|
+
|
|
74
|
+
const handleClickAway = e => {
|
|
75
|
+
if (!isControlled) setIsOpenInternal(false);
|
|
76
|
+
if (onClose) onClose(e);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
return /*#__PURE__*/React.createElement(ClickAwayWrapper, {
|
|
80
|
+
targets: [ref],
|
|
81
|
+
handleClickAway: handleClickAway,
|
|
82
|
+
eventTypeId: "mousedown"
|
|
83
|
+
}, /*#__PURE__*/React.createElement(PopoverContainerWrapperStyle, {
|
|
72
84
|
"data-component": "popover-container",
|
|
73
85
|
role: "region",
|
|
74
|
-
"aria-labelledby": popoverContainerId
|
|
86
|
+
"aria-labelledby": popoverContainerId,
|
|
87
|
+
ref: ref
|
|
75
88
|
}, renderOpenComponent(renderOpenComponentProps), /*#__PURE__*/React.createElement(Transition, {
|
|
76
89
|
in: isOpen,
|
|
77
90
|
timeout: {
|
|
@@ -95,7 +108,7 @@ const PopoverContainer = ({
|
|
|
95
108
|
}, filterStyledSystemPaddingProps(rest)), /*#__PURE__*/React.createElement(PopoverContainerHeaderStyle, null, /*#__PURE__*/React.createElement(PopoverContainerTitleStyle, {
|
|
96
109
|
id: popoverContainerId,
|
|
97
110
|
"data-element": "popover-container-title"
|
|
98
|
-
}, title), renderCloseComponent(renderCloseComponentProps)), children)));
|
|
111
|
+
}, title), renderCloseComponent(renderCloseComponentProps)), children))));
|
|
99
112
|
};
|
|
100
113
|
|
|
101
114
|
PopoverContainer.propTypes = { ...paddingPropTypes,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface ClickAwayWrapperProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
handleClickAway: (ev: CustomEvent) => void;
|
|
5
|
+
eventTypeId?: "mousedown" | "click";
|
|
6
|
+
targets: React.RefObject<HTMLElement>[];
|
|
7
|
+
}
|
|
8
|
+
declare const ClickAwayWrapper: {
|
|
9
|
+
({ children, handleClickAway, eventTypeId, targets, }: ClickAwayWrapperProps): JSX.Element;
|
|
10
|
+
displayName: string;
|
|
11
|
+
};
|
|
12
|
+
export default ClickAwayWrapper;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
|
+
|
|
12
|
+
var _events = _interopRequireDefault(require("../utils/helpers/events"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
17
|
+
|
|
18
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
19
|
+
|
|
20
|
+
const ClickAwayWrapper = ({
|
|
21
|
+
children,
|
|
22
|
+
handleClickAway,
|
|
23
|
+
eventTypeId = "click",
|
|
24
|
+
targets
|
|
25
|
+
}) => {
|
|
26
|
+
(0, _react.useEffect)(() => {
|
|
27
|
+
const fnClickAway = ev => {
|
|
28
|
+
const clickedElements = targets.filter(ref => (ref === null || ref === void 0 ? void 0 : ref.current) && _events.default.composedPath(ev).includes(ref.current));
|
|
29
|
+
|
|
30
|
+
if (!clickedElements || !clickedElements.length) {
|
|
31
|
+
handleClickAway(ev);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
document.addEventListener(eventTypeId, fnClickAway);
|
|
36
|
+
return function cleanup() {
|
|
37
|
+
document.removeEventListener(eventTypeId, fnClickAway);
|
|
38
|
+
};
|
|
39
|
+
}, [handleClickAway, targets, eventTypeId]);
|
|
40
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
ClickAwayWrapper.propTypes = {
|
|
44
|
+
"children": _propTypes.default.node,
|
|
45
|
+
"eventTypeId": _propTypes.default.oneOf(["click", "mousedown"]),
|
|
46
|
+
"handleClickAway": _propTypes.default.func.isRequired,
|
|
47
|
+
"targets": _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
48
|
+
"current": _propTypes.default.oneOfType([_propTypes.default.oneOf([null]), function (props, propName) {
|
|
49
|
+
if (props[propName] == null) {
|
|
50
|
+
return new Error("Prop '" + propName + "' is required but wasn't specified");
|
|
51
|
+
} else if (typeof props[propName] !== 'object' || props[propName].nodeType !== 1) {
|
|
52
|
+
return new Error("Expected prop '" + propName + "' to be of type Element");
|
|
53
|
+
}
|
|
54
|
+
}]).isRequired
|
|
55
|
+
})).isRequired
|
|
56
|
+
};
|
|
57
|
+
ClickAwayWrapper.displayName = "ClickAwayWrapper";
|
|
58
|
+
var _default = ClickAwayWrapper;
|
|
59
|
+
exports.default = _default;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "default", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _clickAwayWrapper.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
var _clickAwayWrapper = _interopRequireDefault(require("./click-away-wrapper.component"));
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default ButtonToggleGroup;
|
|
2
|
-
declare function ButtonToggleGroup({ children, name, error, warning, info, validationOnLabel, label, labelHelp, labelSpacing, inputWidth, fieldHelp, fieldHelpInline, labelInline, labelWidth, labelAlign, onChange, onBlur, value, "data-component": dataComponent, "data-element": dataElement, "data-role": dataRole, helpAriaLabel, ...props }: {
|
|
2
|
+
declare function ButtonToggleGroup({ children, name, error, warning, info, validationOnLabel, label, labelHelp, labelSpacing, inputWidth, fieldHelp, fieldHelpInline, labelInline, labelWidth, labelAlign, onChange, onBlur, value, "data-component": dataComponent, "data-element": dataElement, "data-role": dataRole, helpAriaLabel, id, ...props }: {
|
|
3
3
|
[x: string]: any;
|
|
4
4
|
children: any;
|
|
5
5
|
name: any;
|
|
@@ -23,6 +23,7 @@ declare function ButtonToggleGroup({ children, name, error, warning, info, valid
|
|
|
23
23
|
"data-element": any;
|
|
24
24
|
"data-role": any;
|
|
25
25
|
helpAriaLabel: any;
|
|
26
|
+
id: any;
|
|
26
27
|
}): JSX.Element;
|
|
27
28
|
declare namespace ButtonToggleGroup {
|
|
28
29
|
const propTypes: {
|
|
@@ -56,6 +56,7 @@ const ButtonToggleGroup = ({
|
|
|
56
56
|
"data-element": dataElement,
|
|
57
57
|
"data-role": dataRole,
|
|
58
58
|
helpAriaLabel,
|
|
59
|
+
id,
|
|
59
60
|
...props
|
|
60
61
|
}) => {
|
|
61
62
|
const validationProps = {
|
|
@@ -77,7 +78,8 @@ const ButtonToggleGroup = ({
|
|
|
77
78
|
labelAlign: labelAlign,
|
|
78
79
|
"data-component": dataComponent,
|
|
79
80
|
"data-role": dataRole,
|
|
80
|
-
"data-element": dataElement
|
|
81
|
+
"data-element": dataElement,
|
|
82
|
+
id: id
|
|
81
83
|
}, validationProps, (0, _utils.filterStyledSystemMarginProps)(props)), /*#__PURE__*/_react.default.createElement(_buttonToggleGroup.default, _extends({
|
|
82
84
|
"aria-label": label,
|
|
83
85
|
role: "radiogroup",
|
|
@@ -29,6 +29,8 @@ var _datePicker = _interopRequireDefault(require("./__internal__/date-picker"));
|
|
|
29
29
|
|
|
30
30
|
var _dateRange = _interopRequireDefault(require("../date-range/date-range.context"));
|
|
31
31
|
|
|
32
|
+
var _clickAwayWrapper = _interopRequireDefault(require("../../__internal__/click-away-wrapper"));
|
|
33
|
+
|
|
32
34
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
33
35
|
|
|
34
36
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
@@ -259,23 +261,6 @@ const DateInput = ({
|
|
|
259
261
|
}
|
|
260
262
|
};
|
|
261
263
|
|
|
262
|
-
(0, _react.useEffect)(() => {
|
|
263
|
-
const fnClosePicker = ev => {
|
|
264
|
-
if (open && !_events.default.composedPath(ev).includes(parentRef.current) && !_events.default.composedPath(ev).includes(pickerRef.current)) {
|
|
265
|
-
alreadyFocused.current = true;
|
|
266
|
-
inputRef.current.focus();
|
|
267
|
-
isBlurBlocked.current = false;
|
|
268
|
-
inputRef.current.blur();
|
|
269
|
-
setOpen(false);
|
|
270
|
-
alreadyFocused.current = false;
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
document.addEventListener("mousedown", fnClosePicker);
|
|
275
|
-
return function cleanup() {
|
|
276
|
-
document.removeEventListener("mousedown", fnClosePicker);
|
|
277
|
-
};
|
|
278
|
-
}, [open]);
|
|
279
264
|
(0, _react.useEffect)(() => {
|
|
280
265
|
const [matchedFormat, matchedValue] = (0, _utils.findMatchedFormatAndValue)(value, formats);
|
|
281
266
|
|
|
@@ -307,7 +292,22 @@ const DateInput = ({
|
|
|
307
292
|
return value;
|
|
308
293
|
};
|
|
309
294
|
|
|
310
|
-
|
|
295
|
+
const handleClickAway = () => {
|
|
296
|
+
if (open) {
|
|
297
|
+
alreadyFocused.current = true;
|
|
298
|
+
inputRef.current.focus();
|
|
299
|
+
isBlurBlocked.current = false;
|
|
300
|
+
inputRef.current.blur();
|
|
301
|
+
setOpen(false);
|
|
302
|
+
alreadyFocused.current = false;
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
return /*#__PURE__*/_react.default.createElement(_clickAwayWrapper.default, {
|
|
307
|
+
handleClickAway: handleClickAway,
|
|
308
|
+
eventTypeId: "mousedown",
|
|
309
|
+
targets: [parentRef, pickerRef]
|
|
310
|
+
}, /*#__PURE__*/_react.default.createElement(_date.default, _extends({
|
|
311
311
|
ref: wrapperRef,
|
|
312
312
|
role: "presentation",
|
|
313
313
|
size: size,
|
|
@@ -347,13 +347,13 @@ const DateInput = ({
|
|
|
347
347
|
ref: pickerRef,
|
|
348
348
|
pickerMouseDown: handlePickerMouseDown,
|
|
349
349
|
open: open
|
|
350
|
-
}));
|
|
350
|
+
})));
|
|
351
351
|
};
|
|
352
352
|
|
|
353
353
|
DateInput.propTypes = { ..._textbox.default.propTypes,
|
|
354
354
|
...marginPropTypes,
|
|
355
355
|
|
|
356
|
-
/** Pass any props that match the [DayPickerProps](https://react-day-picker.
|
|
356
|
+
/** Pass any props that match the [DayPickerProps](https://react-day-picker-v7.netlify.app/docs/getting-started/)
|
|
357
357
|
* interface to override default behaviors
|
|
358
358
|
* */
|
|
359
359
|
pickerProps: _propTypes.default.object,
|
|
@@ -2,6 +2,15 @@ import * as React from "react";
|
|
|
2
2
|
import { DayPickerProps } from "react-day-picker";
|
|
3
3
|
import { TextboxProps } from "../textbox/textbox";
|
|
4
4
|
|
|
5
|
+
export interface DateChangeEvent {
|
|
6
|
+
target: {
|
|
7
|
+
value: {
|
|
8
|
+
formattedValue: string;
|
|
9
|
+
rawValue: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
5
14
|
export interface DateInputProps
|
|
6
15
|
extends Omit<
|
|
7
16
|
TextboxProps,
|
|
@@ -31,7 +40,7 @@ export interface DateInputProps
|
|
|
31
40
|
/** Maximum possible date YYYY-MM-DD */
|
|
32
41
|
maxDate?: string;
|
|
33
42
|
/** Specify a callback triggered on change */
|
|
34
|
-
onChange: (ev:
|
|
43
|
+
onChange: (ev: DateChangeEvent) => void;
|
|
35
44
|
/** The current date string */
|
|
36
45
|
value: string;
|
|
37
46
|
/** Pass any props that match the DayPickerProps interface to override default behaviors */
|
|
@@ -2,7 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import { MarginProps } from "styled-system";
|
|
3
3
|
import { DateInputProps } from "../date/date";
|
|
4
4
|
|
|
5
|
-
interface DateRangeChangeEvent {
|
|
5
|
+
export interface DateRangeChangeEvent {
|
|
6
6
|
target: {
|
|
7
7
|
value: [
|
|
8
8
|
{
|
|
@@ -19,7 +19,7 @@ interface DateRangeChangeEvent {
|
|
|
19
19
|
|
|
20
20
|
export interface DateRangeProps extends MarginProps {
|
|
21
21
|
/** Props for the child end Date component */
|
|
22
|
-
endDateProps?: DateInputProps
|
|
22
|
+
endDateProps?: Partial<DateInputProps>;
|
|
23
23
|
/** Optional label for endDate field */
|
|
24
24
|
endLabel?: string;
|
|
25
25
|
/**
|
|
@@ -51,7 +51,7 @@ export interface DateRangeProps extends MarginProps {
|
|
|
51
51
|
/** Specify a callback triggered on blur */
|
|
52
52
|
onBlur?: (ev: DateRangeChangeEvent) => void;
|
|
53
53
|
/** Props for the child start Date component */
|
|
54
|
-
startDateProps?: DateInputProps
|
|
54
|
+
startDateProps?: Partial<DateInputProps>;
|
|
55
55
|
/** Optional label for startDate field */
|
|
56
56
|
startLabel?: string;
|
|
57
57
|
/**
|
|
@@ -27,6 +27,8 @@ var _scrollableBlock = _interopRequireDefault(require("../../scrollable-block"))
|
|
|
27
27
|
|
|
28
28
|
var _submenu2 = _interopRequireDefault(require("./submenu.context"));
|
|
29
29
|
|
|
30
|
+
var _clickAwayWrapper = _interopRequireDefault(require("../../../../__internal__/click-away-wrapper"));
|
|
31
|
+
|
|
30
32
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
33
|
|
|
32
34
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
@@ -209,12 +211,11 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
}, [submenuFocusIndex, submenuOpen, href, menuContext, arrayOfFormattedChildren, numberOfChildren, openSubmenu, closeSubmenu, onKeyDown, characterString, restartCharacterTimeout, startCharacterTimeout]);
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}, [closeSubmenu]);
|
|
214
|
+
|
|
215
|
+
const handleClickAway = () => {
|
|
216
|
+
document.removeEventListener("click", handleClickAway);
|
|
217
|
+
closeSubmenu();
|
|
218
|
+
};
|
|
218
219
|
|
|
219
220
|
const handleClick = event => {
|
|
220
221
|
if (clickToOpen) {
|
|
@@ -233,15 +234,6 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
233
234
|
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
234
235
|
|
|
235
236
|
}, [characterString]);
|
|
236
|
-
(0, _react.useEffect)(() => {
|
|
237
|
-
if (submenuOpen) {
|
|
238
|
-
document.addEventListener("click", onClickOutside);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return function cleanup() {
|
|
242
|
-
document.removeEventListener("click", onClickOutside);
|
|
243
|
-
};
|
|
244
|
-
}, [onClickOutside, submenuOpen]);
|
|
245
237
|
|
|
246
238
|
if (inFullscreenView) {
|
|
247
239
|
return /*#__PURE__*/_react.default.createElement(_submenu.StyledSubmenuWrapper, {
|
|
@@ -275,7 +267,10 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
275
267
|
}, child))));
|
|
276
268
|
}
|
|
277
269
|
|
|
278
|
-
return /*#__PURE__*/_react.default.createElement(
|
|
270
|
+
return /*#__PURE__*/_react.default.createElement(_clickAwayWrapper.default, {
|
|
271
|
+
handleClickAway: handleClickAway,
|
|
272
|
+
targets: [submenuRef]
|
|
273
|
+
}, /*#__PURE__*/_react.default.createElement(_submenu.StyledSubmenuWrapper, {
|
|
279
274
|
"data-component": "submenu-wrapper",
|
|
280
275
|
onMouseOver: !clickToOpen ? () => openSubmenu() : undefined,
|
|
281
276
|
onMouseLeave: () => closeSubmenu(),
|
|
@@ -313,7 +308,7 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
313
308
|
updateFocusIndex: setSubmenuFocusIndex,
|
|
314
309
|
itemIndex: child.type === _menuItem2.default ? index : undefined
|
|
315
310
|
}
|
|
316
|
-
}, child))));
|
|
311
|
+
}, child)))));
|
|
317
312
|
});
|
|
318
313
|
|
|
319
314
|
Submenu.propTypes = {
|
|
@@ -21,6 +21,8 @@ var _guid = _interopRequireDefault(require("../../__internal__/utils/helpers/gui
|
|
|
21
21
|
|
|
22
22
|
var _utils = require("../../style/utils");
|
|
23
23
|
|
|
24
|
+
var _clickAwayWrapper = _interopRequireDefault(require("../../__internal__/click-away-wrapper"));
|
|
25
|
+
|
|
24
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
27
|
|
|
26
28
|
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
@@ -49,6 +51,7 @@ const PopoverContainer = ({
|
|
|
49
51
|
}) => {
|
|
50
52
|
const isControlled = open !== undefined;
|
|
51
53
|
const [isOpenInternal, setIsOpenInternal] = (0, _react.useState)(false);
|
|
54
|
+
const ref = (0, _react.useRef)();
|
|
52
55
|
const closeButtonRef = (0, _react.useRef)();
|
|
53
56
|
const openButtonRef = (0, _react.useRef)();
|
|
54
57
|
const guid = (0, _react.useRef)((0, _guid.default)());
|
|
@@ -89,10 +92,21 @@ const PopoverContainer = ({
|
|
|
89
92
|
ref: closeButtonRef,
|
|
90
93
|
ariaLabel: closeButtonAriaLabel
|
|
91
94
|
};
|
|
92
|
-
|
|
95
|
+
|
|
96
|
+
const handleClickAway = e => {
|
|
97
|
+
if (!isControlled) setIsOpenInternal(false);
|
|
98
|
+
if (onClose) onClose(e);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
return /*#__PURE__*/_react.default.createElement(_clickAwayWrapper.default, {
|
|
102
|
+
targets: [ref],
|
|
103
|
+
handleClickAway: handleClickAway,
|
|
104
|
+
eventTypeId: "mousedown"
|
|
105
|
+
}, /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerWrapperStyle, {
|
|
93
106
|
"data-component": "popover-container",
|
|
94
107
|
role: "region",
|
|
95
|
-
"aria-labelledby": popoverContainerId
|
|
108
|
+
"aria-labelledby": popoverContainerId,
|
|
109
|
+
ref: ref
|
|
96
110
|
}, renderOpenComponent(renderOpenComponentProps), /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.Transition, {
|
|
97
111
|
in: isOpen,
|
|
98
112
|
timeout: {
|
|
@@ -116,7 +130,7 @@ const PopoverContainer = ({
|
|
|
116
130
|
}, (0, _utils.filterStyledSystemPaddingProps)(rest)), /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerHeaderStyle, null, /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerTitleStyle, {
|
|
117
131
|
id: popoverContainerId,
|
|
118
132
|
"data-element": "popover-container-title"
|
|
119
|
-
}, title), renderCloseComponent(renderCloseComponentProps)), children)));
|
|
133
|
+
}, title), renderCloseComponent(renderCloseComponentProps)), children))));
|
|
120
134
|
};
|
|
121
135
|
|
|
122
136
|
PopoverContainer.propTypes = { ...paddingPropTypes,
|