carbon-react 144.2.0 → 144.2.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/components/date-range/date-range.component.js +8 -3
- package/esm/components/multi-action-button/multi-action-button.component.js +2 -0
- package/esm/components/numeral-date/numeral-date.component.js +2 -1
- package/esm/components/radio-button/radio-button-group/radio-button-group.component.js +2 -1
- package/esm/components/select/filterable-select/filterable-select.component.js +13 -1
- package/esm/components/split-button/split-button.component.js +17 -4
- package/esm/components/text-editor/text-editor.component.js +4 -2
- package/esm/components/textarea/textarea.component.js +3 -2
- package/esm/hooks/__internal__/useChildButtons/useChildButtons.js +6 -11
- package/lib/components/date-range/date-range.component.js +7 -2
- package/lib/components/multi-action-button/multi-action-button.component.js +2 -0
- package/lib/components/numeral-date/numeral-date.component.js +2 -1
- package/lib/components/radio-button/radio-button-group/radio-button-group.component.js +2 -1
- package/lib/components/select/filterable-select/filterable-select.component.js +13 -1
- package/lib/components/split-button/split-button.component.js +17 -4
- package/lib/components/text-editor/text-editor.component.js +4 -2
- package/lib/components/textarea/textarea.component.js +3 -2
- package/lib/hooks/__internal__/useChildButtons/useChildButtons.js +5 -10
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
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); }
|
|
2
|
-
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useState, useContext } from "react";
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { formatToISO, formattedValue, parseISODate, checkISOFormatAndLength } from "../date/__internal__/utils";
|
|
5
5
|
import DateInput from "../date";
|
|
@@ -11,6 +11,7 @@ import useLocale from "../../hooks/__internal__/useLocale";
|
|
|
11
11
|
import usePrevious from "../../hooks/__internal__/usePrevious";
|
|
12
12
|
import getFormatData from "../date/__internal__/date-formats";
|
|
13
13
|
import DateRangeContext from "./__internal__/date-range.context";
|
|
14
|
+
import NewValidationContext from "../carbon-provider/__internal__/new-validation.context";
|
|
14
15
|
export const DateRange = ({
|
|
15
16
|
endDateProps = {},
|
|
16
17
|
id,
|
|
@@ -28,6 +29,10 @@ export const DateRange = ({
|
|
|
28
29
|
isOptional,
|
|
29
30
|
...rest
|
|
30
31
|
}) => {
|
|
32
|
+
const {
|
|
33
|
+
validationRedesignOptIn
|
|
34
|
+
} = useContext(NewValidationContext);
|
|
35
|
+
const labelsInlineWithNewValidation = validationRedesignOptIn ? false : labelsInline;
|
|
31
36
|
const l = useLocale();
|
|
32
37
|
const {
|
|
33
38
|
dateFnsLocale
|
|
@@ -179,7 +184,7 @@ export const DateRange = ({
|
|
|
179
184
|
const onChangeCallback = propsKey === "start" ? startDateOnChange : endDateOnChange;
|
|
180
185
|
return {
|
|
181
186
|
label: rest[`${propsKey}Label`],
|
|
182
|
-
labelInline:
|
|
187
|
+
labelInline: labelsInlineWithNewValidation,
|
|
183
188
|
value: inputValue,
|
|
184
189
|
error: rest[`${propsKey}Error`],
|
|
185
190
|
warning: rest[`${propsKey}Warning`],
|
|
@@ -194,7 +199,7 @@ export const DateRange = ({
|
|
|
194
199
|
};
|
|
195
200
|
};
|
|
196
201
|
return /*#__PURE__*/React.createElement(StyledDateRange, _extends({}, tagComponent("date-range", rest), {
|
|
197
|
-
labelsInline:
|
|
202
|
+
labelsInline: labelsInlineWithNewValidation
|
|
198
203
|
}, filterStyledSystemMarginProps(rest)), /*#__PURE__*/React.createElement(DateRangeContext.Provider, {
|
|
199
204
|
value: {
|
|
200
205
|
inputRefMap,
|
|
@@ -36,6 +36,8 @@ export const MultiActionButton = ({
|
|
|
36
36
|
} = useChildButtons(buttonRef);
|
|
37
37
|
const handleInsideClick = useClickAwayListener(hideButtons);
|
|
38
38
|
const handleClick = ev => {
|
|
39
|
+
// ensure button is focused when clicked (Safari)
|
|
40
|
+
buttonRef.current?.focus();
|
|
39
41
|
showButtons();
|
|
40
42
|
handleInsideClick();
|
|
41
43
|
if (onClick) {
|
|
@@ -119,6 +119,7 @@ export const NumeralDate = ({
|
|
|
119
119
|
const {
|
|
120
120
|
validationRedesignOptIn
|
|
121
121
|
} = useContext(NewValidationContext);
|
|
122
|
+
const labelInlineWithNewValidation = validationRedesignOptIn ? false : labelInline;
|
|
122
123
|
const {
|
|
123
124
|
current: uniqueId
|
|
124
125
|
} = useRef(id || guid());
|
|
@@ -208,7 +209,7 @@ export const NumeralDate = ({
|
|
|
208
209
|
warning: internalWarning,
|
|
209
210
|
info: info,
|
|
210
211
|
label: label,
|
|
211
|
-
labelInline:
|
|
212
|
+
labelInline: labelInlineWithNewValidation,
|
|
212
213
|
labelWidth: labelWidth,
|
|
213
214
|
labelAlign: labelAlign,
|
|
214
215
|
labelHelp: !validationRedesignOptIn && labelHelp,
|
|
@@ -41,6 +41,7 @@ export const RadioButtonGroup = props => {
|
|
|
41
41
|
const {
|
|
42
42
|
validationRedesignOptIn
|
|
43
43
|
} = useContext(NewValidationContext);
|
|
44
|
+
const legendInlineWithNewValidation = validationRedesignOptIn ? false : legendInline;
|
|
44
45
|
if (!deprecateUncontrolledWarnTriggered && !onChange) {
|
|
45
46
|
deprecateUncontrolledWarnTriggered = true;
|
|
46
47
|
Logger.deprecate("Uncontrolled behaviour in `Radio Button` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
|
|
@@ -48,7 +49,7 @@ export const RadioButtonGroup = props => {
|
|
|
48
49
|
const marginProps = filterStyledSystemMarginProps(props);
|
|
49
50
|
const isAboveLegendBreakpoint = useIsAboveBreakpoint(adaptiveLegendBreakpoint);
|
|
50
51
|
const isAboveSpacingBreakpoint = useIsAboveBreakpoint(adaptiveSpacingBreakpoint);
|
|
51
|
-
let inlineLegend =
|
|
52
|
+
let inlineLegend = legendInlineWithNewValidation;
|
|
52
53
|
if (adaptiveLegendBreakpoint) {
|
|
53
54
|
inlineLegend = !!isAboveLegendBreakpoint;
|
|
54
55
|
}
|
|
@@ -101,6 +101,7 @@ const FilterableSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
101
101
|
return customEvent;
|
|
102
102
|
}, [name, id]);
|
|
103
103
|
const triggerChange = useCallback((newValue, selectionConfirmed) => {
|
|
104
|
+
/* istanbul ignore else */
|
|
104
105
|
if (onChange) {
|
|
105
106
|
onChange(createCustomEvent(newValue, selectionConfirmed));
|
|
106
107
|
}
|
|
@@ -146,7 +147,11 @@ const FilterableSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
146
147
|
const matchingOption = React.Children.toArray(children).find(child => /*#__PURE__*/React.isValidElement(child) && isExpectedOption(child, newValue));
|
|
147
148
|
if (!matchingOption || matchingOption.props.text === undefined) {
|
|
148
149
|
setTextValue(filterText || "");
|
|
149
|
-
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* istanbul ignore else */
|
|
154
|
+
if (isClosing || matchingOption.props.text?.toLowerCase().startsWith(filterText?.toLowerCase().trim())) {
|
|
150
155
|
setTextValue(matchingOption.props.text);
|
|
151
156
|
}
|
|
152
157
|
}, [children, filterText]);
|
|
@@ -309,6 +314,13 @@ const FilterableSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
309
314
|
return !isAlreadyOpen;
|
|
310
315
|
});
|
|
311
316
|
}
|
|
317
|
+
useEffect(() => {
|
|
318
|
+
return () => {
|
|
319
|
+
if (focusTimer.current) {
|
|
320
|
+
clearTimeout(focusTimer.current);
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
}, []);
|
|
312
324
|
function handleTextboxFocus(event) {
|
|
313
325
|
const triggerFocus = () => onFocus?.(event);
|
|
314
326
|
if (openOnFocus) {
|
|
@@ -37,6 +37,7 @@ export const SplitButton = ({
|
|
|
37
37
|
const locale = useLocale();
|
|
38
38
|
const theme = useContext(ThemeContext) || baseTheme;
|
|
39
39
|
const buttonLabelId = useRef(guid());
|
|
40
|
+
const mainButtonRef = useRef(null);
|
|
40
41
|
const toggleButton = useRef(null);
|
|
41
42
|
const {
|
|
42
43
|
showAdditionalButtons,
|
|
@@ -47,25 +48,36 @@ export const SplitButton = ({
|
|
|
47
48
|
wrapperProps,
|
|
48
49
|
contextValue
|
|
49
50
|
} = useChildButtons(toggleButton, CONTENT_WIDTH_RATIO);
|
|
51
|
+
const handleMainClick = ev => {
|
|
52
|
+
// ensure button is focused when clicked (Safari)
|
|
53
|
+
mainButtonRef.current?.focus();
|
|
54
|
+
if (onClick) {
|
|
55
|
+
onClick(ev);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
50
58
|
const mainButtonProps = {
|
|
51
|
-
onMouseEnter: hideButtons,
|
|
52
59
|
onFocus: hideButtons,
|
|
53
60
|
onTouchStart: hideButtons,
|
|
54
61
|
iconPosition,
|
|
55
62
|
buttonType,
|
|
56
63
|
disabled,
|
|
57
64
|
iconType,
|
|
58
|
-
onClick:
|
|
65
|
+
onClick: handleMainClick,
|
|
59
66
|
size,
|
|
60
67
|
subtext,
|
|
61
68
|
...filterOutStyledSystemSpacingProps(rest)
|
|
62
69
|
};
|
|
70
|
+
const handleToggleClick = () => {
|
|
71
|
+
// ensure button is focused when clicked (Safari)
|
|
72
|
+
toggleButton.current?.focus();
|
|
73
|
+
showButtons();
|
|
74
|
+
};
|
|
63
75
|
const toggleButtonProps = {
|
|
64
76
|
disabled,
|
|
65
77
|
displayed: showAdditionalButtons,
|
|
66
78
|
onTouchStart: showButtons,
|
|
67
79
|
onKeyDown: handleToggleButtonKeyDown,
|
|
68
|
-
onClick:
|
|
80
|
+
onClick: handleToggleClick,
|
|
69
81
|
buttonType,
|
|
70
82
|
size
|
|
71
83
|
};
|
|
@@ -87,7 +99,8 @@ export const SplitButton = ({
|
|
|
87
99
|
return [/*#__PURE__*/React.createElement(Button, _extends({
|
|
88
100
|
"data-element": "main-button",
|
|
89
101
|
key: "main-button",
|
|
90
|
-
id: buttonLabelId.current
|
|
102
|
+
id: buttonLabelId.current,
|
|
103
|
+
ref: mainButtonRef
|
|
91
104
|
}, mainButtonProps), text), /*#__PURE__*/React.createElement(StyledSplitButtonToggle, _extends({
|
|
92
105
|
"aria-haspopup": "true",
|
|
93
106
|
"aria-expanded": showAdditionalButtons,
|
|
@@ -258,7 +258,8 @@ const TextEditor = /*#__PURE__*/React.forwardRef(({
|
|
|
258
258
|
editMode: true
|
|
259
259
|
}
|
|
260
260
|
}, /*#__PURE__*/React.createElement(StyledEditorWrapper, _extends({
|
|
261
|
-
ref: wrapper
|
|
261
|
+
ref: wrapper,
|
|
262
|
+
"data-role": "text-editor-wrapper"
|
|
262
263
|
}, rest), /*#__PURE__*/React.createElement(LabelWrapper, {
|
|
263
264
|
onClick: () => handleEditorFocus(true)
|
|
264
265
|
}, /*#__PURE__*/React.createElement(Label, {
|
|
@@ -277,7 +278,8 @@ const TextEditor = /*#__PURE__*/React.forwardRef(({
|
|
|
277
278
|
warning: !!(!error && warning)
|
|
278
279
|
})), /*#__PURE__*/React.createElement(StyledEditorOutline, {
|
|
279
280
|
isFocused: isFocused,
|
|
280
|
-
hasError: !!error
|
|
281
|
+
hasError: !!error,
|
|
282
|
+
"data-role": "editor-outline"
|
|
281
283
|
}, /*#__PURE__*/React.createElement(StyledEditorContainer, {
|
|
282
284
|
"data-component": "text-editor-container",
|
|
283
285
|
hasError: !!error,
|
|
@@ -66,6 +66,7 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
|
|
|
66
66
|
const {
|
|
67
67
|
validationRedesignOptIn
|
|
68
68
|
} = useContext(NewValidationContext);
|
|
69
|
+
const labelInlineWithNewValidation = validationRedesignOptIn ? false : labelInline;
|
|
69
70
|
const [textareaMinHeight, setTextareaMinHeight] = useState(DEFAULT_MIN_HEIGHT);
|
|
70
71
|
const computeLabelPropValues = prop => validationRedesignOptIn ? undefined : prop;
|
|
71
72
|
const {
|
|
@@ -217,7 +218,7 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
|
|
|
217
218
|
tooltipPosition: tooltipPosition,
|
|
218
219
|
helpAriaLabel: helpAriaLabel
|
|
219
220
|
}, /*#__PURE__*/React.createElement(InputBehaviour, null, /*#__PURE__*/React.createElement(StyledTextarea, _extends({
|
|
220
|
-
labelInline:
|
|
221
|
+
labelInline: labelInlineWithNewValidation,
|
|
221
222
|
"data-component": dataComponent,
|
|
222
223
|
"data-role": dataRole,
|
|
223
224
|
"data-element": dataElement,
|
|
@@ -233,7 +234,7 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
|
|
|
233
234
|
labelId: labelId,
|
|
234
235
|
disabled: disabled,
|
|
235
236
|
id: id,
|
|
236
|
-
labelInline: computeLabelPropValues(
|
|
237
|
+
labelInline: computeLabelPropValues(labelInlineWithNewValidation),
|
|
237
238
|
labelAlign: computeLabelPropValues(labelAlign),
|
|
238
239
|
labelWidth: computeLabelPropValues(labelWidth),
|
|
239
240
|
labelHelp: computeLabelPropValues(labelHelp),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState, useRef,
|
|
1
|
+
import { useState, useRef, useCallback } from "react";
|
|
2
2
|
import Events from "../../../__internal__/utils/helpers/events";
|
|
3
3
|
import useMenuKeyboardNavigation from "../useMenuKeyboardNavigation";
|
|
4
4
|
const useChildButtons = (toggleButtonRef, widthRatio = 1) => {
|
|
@@ -6,7 +6,6 @@ const useChildButtons = (toggleButtonRef, widthRatio = 1) => {
|
|
|
6
6
|
const [minWidth, setMinWidth] = useState(0);
|
|
7
7
|
const buttonNode = useRef(null);
|
|
8
8
|
const childrenContainer = useRef(null);
|
|
9
|
-
const focusFirstChildButtonOnOpen = useRef(false);
|
|
10
9
|
const hideButtons = useCallback(() => {
|
|
11
10
|
setShowAdditionalButtons(false);
|
|
12
11
|
}, []);
|
|
@@ -19,20 +18,16 @@ const useChildButtons = (toggleButtonRef, widthRatio = 1) => {
|
|
|
19
18
|
}
|
|
20
19
|
}
|
|
21
20
|
const getButtonChildren = useCallback(() => childrenContainer.current?.querySelectorAll('[data-component="button"]'), []);
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
const firstChild = getButtonChildren()?.[0];
|
|
24
|
-
if (focusFirstChildButtonOnOpen.current && showAdditionalButtons && firstChild) {
|
|
25
|
-
focusFirstChildButtonOnOpen.current = false;
|
|
26
|
-
firstChild.focus();
|
|
27
|
-
}
|
|
28
|
-
}, [showAdditionalButtons, getButtonChildren]);
|
|
29
21
|
const handleToggleButtonKeyDown = ev => {
|
|
30
|
-
|
|
22
|
+
const isToggleKey = Events.isEnterKey(ev) || Events.isSpaceKey(ev) || Events.isDownKey(ev) || Events.isUpKey(ev) || showAdditionalButtons && Events.isTabKey(ev);
|
|
23
|
+
if (isToggleKey) {
|
|
31
24
|
ev.preventDefault();
|
|
32
25
|
if (!showAdditionalButtons) {
|
|
33
26
|
showButtons();
|
|
34
27
|
}
|
|
35
|
-
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
getButtonChildren()?.[0]?.focus();
|
|
30
|
+
});
|
|
36
31
|
}
|
|
37
32
|
};
|
|
38
33
|
const handleKeyDown = useMenuKeyboardNavigation(toggleButtonRef, getButtonChildren, hideButtons, showAdditionalButtons);
|
|
@@ -16,6 +16,7 @@ var _useLocale = _interopRequireDefault(require("../../hooks/__internal__/useLoc
|
|
|
16
16
|
var _usePrevious = _interopRequireDefault(require("../../hooks/__internal__/usePrevious"));
|
|
17
17
|
var _dateFormats = _interopRequireDefault(require("../date/__internal__/date-formats"));
|
|
18
18
|
var _dateRange2 = _interopRequireDefault(require("./__internal__/date-range.context"));
|
|
19
|
+
var _newValidation = _interopRequireDefault(require("../carbon-provider/__internal__/new-validation.context"));
|
|
19
20
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
21
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
21
22
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -37,6 +38,10 @@ const DateRange = ({
|
|
|
37
38
|
isOptional,
|
|
38
39
|
...rest
|
|
39
40
|
}) => {
|
|
41
|
+
const {
|
|
42
|
+
validationRedesignOptIn
|
|
43
|
+
} = (0, _react.useContext)(_newValidation.default);
|
|
44
|
+
const labelsInlineWithNewValidation = validationRedesignOptIn ? false : labelsInline;
|
|
40
45
|
const l = (0, _useLocale.default)();
|
|
41
46
|
const {
|
|
42
47
|
dateFnsLocale
|
|
@@ -188,7 +193,7 @@ const DateRange = ({
|
|
|
188
193
|
const onChangeCallback = propsKey === "start" ? startDateOnChange : endDateOnChange;
|
|
189
194
|
return {
|
|
190
195
|
label: rest[`${propsKey}Label`],
|
|
191
|
-
labelInline:
|
|
196
|
+
labelInline: labelsInlineWithNewValidation,
|
|
192
197
|
value: inputValue,
|
|
193
198
|
error: rest[`${propsKey}Error`],
|
|
194
199
|
warning: rest[`${propsKey}Warning`],
|
|
@@ -203,7 +208,7 @@ const DateRange = ({
|
|
|
203
208
|
};
|
|
204
209
|
};
|
|
205
210
|
return /*#__PURE__*/_react.default.createElement(_dateRange.default, _extends({}, (0, _tags.default)("date-range", rest), {
|
|
206
|
-
labelsInline:
|
|
211
|
+
labelsInline: labelsInlineWithNewValidation
|
|
207
212
|
}, (0, _utils2.filterStyledSystemMarginProps)(rest)), /*#__PURE__*/_react.default.createElement(_dateRange2.default.Provider, {
|
|
208
213
|
value: {
|
|
209
214
|
inputRefMap,
|
|
@@ -45,6 +45,8 @@ const MultiActionButton = ({
|
|
|
45
45
|
} = (0, _useChildButtons.default)(buttonRef);
|
|
46
46
|
const handleInsideClick = (0, _useClickAwayListener.default)(hideButtons);
|
|
47
47
|
const handleClick = ev => {
|
|
48
|
+
// ensure button is focused when clicked (Safari)
|
|
49
|
+
buttonRef.current?.focus();
|
|
48
50
|
showButtons();
|
|
49
51
|
handleInsideClick();
|
|
50
52
|
if (onClick) {
|
|
@@ -128,6 +128,7 @@ const NumeralDate = ({
|
|
|
128
128
|
const {
|
|
129
129
|
validationRedesignOptIn
|
|
130
130
|
} = (0, _react.useContext)(_newValidation.default);
|
|
131
|
+
const labelInlineWithNewValidation = validationRedesignOptIn ? false : labelInline;
|
|
131
132
|
const {
|
|
132
133
|
current: uniqueId
|
|
133
134
|
} = (0, _react.useRef)(id || (0, _guid.default)());
|
|
@@ -217,7 +218,7 @@ const NumeralDate = ({
|
|
|
217
218
|
warning: internalWarning,
|
|
218
219
|
info: info,
|
|
219
220
|
label: label,
|
|
220
|
-
labelInline:
|
|
221
|
+
labelInline: labelInlineWithNewValidation,
|
|
221
222
|
labelWidth: labelWidth,
|
|
222
223
|
labelAlign: labelAlign,
|
|
223
224
|
labelHelp: !validationRedesignOptIn && labelHelp,
|
|
@@ -50,6 +50,7 @@ const RadioButtonGroup = props => {
|
|
|
50
50
|
const {
|
|
51
51
|
validationRedesignOptIn
|
|
52
52
|
} = (0, _react.useContext)(_newValidation.default);
|
|
53
|
+
const legendInlineWithNewValidation = validationRedesignOptIn ? false : legendInline;
|
|
53
54
|
if (!deprecateUncontrolledWarnTriggered && !onChange) {
|
|
54
55
|
deprecateUncontrolledWarnTriggered = true;
|
|
55
56
|
_logger.default.deprecate("Uncontrolled behaviour in `Radio Button` is deprecated and support will soon be removed. Please make sure all your inputs are controlled.");
|
|
@@ -57,7 +58,7 @@ const RadioButtonGroup = props => {
|
|
|
57
58
|
const marginProps = (0, _utils.filterStyledSystemMarginProps)(props);
|
|
58
59
|
const isAboveLegendBreakpoint = (0, _useIsAboveBreakpoint.default)(adaptiveLegendBreakpoint);
|
|
59
60
|
const isAboveSpacingBreakpoint = (0, _useIsAboveBreakpoint.default)(adaptiveSpacingBreakpoint);
|
|
60
|
-
let inlineLegend =
|
|
61
|
+
let inlineLegend = legendInlineWithNewValidation;
|
|
61
62
|
if (adaptiveLegendBreakpoint) {
|
|
62
63
|
inlineLegend = !!isAboveLegendBreakpoint;
|
|
63
64
|
}
|
|
@@ -110,6 +110,7 @@ const FilterableSelect = exports.FilterableSelect = /*#__PURE__*/_react.default.
|
|
|
110
110
|
return customEvent;
|
|
111
111
|
}, [name, id]);
|
|
112
112
|
const triggerChange = (0, _react.useCallback)((newValue, selectionConfirmed) => {
|
|
113
|
+
/* istanbul ignore else */
|
|
113
114
|
if (onChange) {
|
|
114
115
|
onChange(createCustomEvent(newValue, selectionConfirmed));
|
|
115
116
|
}
|
|
@@ -155,7 +156,11 @@ const FilterableSelect = exports.FilterableSelect = /*#__PURE__*/_react.default.
|
|
|
155
156
|
const matchingOption = _react.default.Children.toArray(children).find(child => /*#__PURE__*/_react.default.isValidElement(child) && (0, _isExpectedOption.default)(child, newValue));
|
|
156
157
|
if (!matchingOption || matchingOption.props.text === undefined) {
|
|
157
158
|
setTextValue(filterText || "");
|
|
158
|
-
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* istanbul ignore else */
|
|
163
|
+
if (isClosing || matchingOption.props.text?.toLowerCase().startsWith(filterText?.toLowerCase().trim())) {
|
|
159
164
|
setTextValue(matchingOption.props.text);
|
|
160
165
|
}
|
|
161
166
|
}, [children, filterText]);
|
|
@@ -318,6 +323,13 @@ const FilterableSelect = exports.FilterableSelect = /*#__PURE__*/_react.default.
|
|
|
318
323
|
return !isAlreadyOpen;
|
|
319
324
|
});
|
|
320
325
|
}
|
|
326
|
+
(0, _react.useEffect)(() => {
|
|
327
|
+
return () => {
|
|
328
|
+
if (focusTimer.current) {
|
|
329
|
+
clearTimeout(focusTimer.current);
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}, []);
|
|
321
333
|
function handleTextboxFocus(event) {
|
|
322
334
|
const triggerFocus = () => onFocus?.(event);
|
|
323
335
|
if (openOnFocus) {
|
|
@@ -46,6 +46,7 @@ const SplitButton = ({
|
|
|
46
46
|
const locale = (0, _useLocale.default)();
|
|
47
47
|
const theme = (0, _react.useContext)(_styledComponents.ThemeContext) || _themes.baseTheme;
|
|
48
48
|
const buttonLabelId = (0, _react.useRef)((0, _guid.default)());
|
|
49
|
+
const mainButtonRef = (0, _react.useRef)(null);
|
|
49
50
|
const toggleButton = (0, _react.useRef)(null);
|
|
50
51
|
const {
|
|
51
52
|
showAdditionalButtons,
|
|
@@ -56,25 +57,36 @@ const SplitButton = ({
|
|
|
56
57
|
wrapperProps,
|
|
57
58
|
contextValue
|
|
58
59
|
} = (0, _useChildButtons.default)(toggleButton, CONTENT_WIDTH_RATIO);
|
|
60
|
+
const handleMainClick = ev => {
|
|
61
|
+
// ensure button is focused when clicked (Safari)
|
|
62
|
+
mainButtonRef.current?.focus();
|
|
63
|
+
if (onClick) {
|
|
64
|
+
onClick(ev);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
59
67
|
const mainButtonProps = {
|
|
60
|
-
onMouseEnter: hideButtons,
|
|
61
68
|
onFocus: hideButtons,
|
|
62
69
|
onTouchStart: hideButtons,
|
|
63
70
|
iconPosition,
|
|
64
71
|
buttonType,
|
|
65
72
|
disabled,
|
|
66
73
|
iconType,
|
|
67
|
-
onClick:
|
|
74
|
+
onClick: handleMainClick,
|
|
68
75
|
size,
|
|
69
76
|
subtext,
|
|
70
77
|
...(0, _utils.filterOutStyledSystemSpacingProps)(rest)
|
|
71
78
|
};
|
|
79
|
+
const handleToggleClick = () => {
|
|
80
|
+
// ensure button is focused when clicked (Safari)
|
|
81
|
+
toggleButton.current?.focus();
|
|
82
|
+
showButtons();
|
|
83
|
+
};
|
|
72
84
|
const toggleButtonProps = {
|
|
73
85
|
disabled,
|
|
74
86
|
displayed: showAdditionalButtons,
|
|
75
87
|
onTouchStart: showButtons,
|
|
76
88
|
onKeyDown: handleToggleButtonKeyDown,
|
|
77
|
-
onClick:
|
|
89
|
+
onClick: handleToggleClick,
|
|
78
90
|
buttonType,
|
|
79
91
|
size
|
|
80
92
|
};
|
|
@@ -96,7 +108,8 @@ const SplitButton = ({
|
|
|
96
108
|
return [/*#__PURE__*/_react.default.createElement(_button.default, _extends({
|
|
97
109
|
"data-element": "main-button",
|
|
98
110
|
key: "main-button",
|
|
99
|
-
id: buttonLabelId.current
|
|
111
|
+
id: buttonLabelId.current,
|
|
112
|
+
ref: mainButtonRef
|
|
100
113
|
}, mainButtonProps), text), /*#__PURE__*/_react.default.createElement(_splitButtonToggle.default, _extends({
|
|
101
114
|
"aria-haspopup": "true",
|
|
102
115
|
"aria-expanded": showAdditionalButtons,
|
|
@@ -267,7 +267,8 @@ const TextEditor = exports.TextEditor = /*#__PURE__*/_react.default.forwardRef((
|
|
|
267
267
|
editMode: true
|
|
268
268
|
}
|
|
269
269
|
}, /*#__PURE__*/_react.default.createElement(_textEditor.StyledEditorWrapper, _extends({
|
|
270
|
-
ref: wrapper
|
|
270
|
+
ref: wrapper,
|
|
271
|
+
"data-role": "text-editor-wrapper"
|
|
271
272
|
}, rest), /*#__PURE__*/_react.default.createElement(_labelWrapper.default, {
|
|
272
273
|
onClick: () => handleEditorFocus(true)
|
|
273
274
|
}, /*#__PURE__*/_react.default.createElement(_label.default, {
|
|
@@ -286,7 +287,8 @@ const TextEditor = exports.TextEditor = /*#__PURE__*/_react.default.forwardRef((
|
|
|
286
287
|
warning: !!(!error && warning)
|
|
287
288
|
})), /*#__PURE__*/_react.default.createElement(_textEditor.StyledEditorOutline, {
|
|
288
289
|
isFocused: isFocused,
|
|
289
|
-
hasError: !!error
|
|
290
|
+
hasError: !!error,
|
|
291
|
+
"data-role": "editor-outline"
|
|
290
292
|
}, /*#__PURE__*/_react.default.createElement(_textEditor.StyledEditorContainer, {
|
|
291
293
|
"data-component": "text-editor-container",
|
|
292
294
|
hasError: !!error,
|
|
@@ -75,6 +75,7 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
|
|
|
75
75
|
const {
|
|
76
76
|
validationRedesignOptIn
|
|
77
77
|
} = (0, _react.useContext)(_newValidation.default);
|
|
78
|
+
const labelInlineWithNewValidation = validationRedesignOptIn ? false : labelInline;
|
|
78
79
|
const [textareaMinHeight, setTextareaMinHeight] = (0, _react.useState)(_textarea.DEFAULT_MIN_HEIGHT);
|
|
79
80
|
const computeLabelPropValues = prop => validationRedesignOptIn ? undefined : prop;
|
|
80
81
|
const {
|
|
@@ -226,7 +227,7 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
|
|
|
226
227
|
tooltipPosition: tooltipPosition,
|
|
227
228
|
helpAriaLabel: helpAriaLabel
|
|
228
229
|
}, /*#__PURE__*/_react.default.createElement(_inputBehaviour.InputBehaviour, null, /*#__PURE__*/_react.default.createElement(_textarea.default, _extends({
|
|
229
|
-
labelInline:
|
|
230
|
+
labelInline: labelInlineWithNewValidation,
|
|
230
231
|
"data-component": dataComponent,
|
|
231
232
|
"data-role": dataRole,
|
|
232
233
|
"data-element": dataElement,
|
|
@@ -242,7 +243,7 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
|
|
|
242
243
|
labelId: labelId,
|
|
243
244
|
disabled: disabled,
|
|
244
245
|
id: id,
|
|
245
|
-
labelInline: computeLabelPropValues(
|
|
246
|
+
labelInline: computeLabelPropValues(labelInlineWithNewValidation),
|
|
246
247
|
labelAlign: computeLabelPropValues(labelAlign),
|
|
247
248
|
labelWidth: computeLabelPropValues(labelWidth),
|
|
248
249
|
labelHelp: computeLabelPropValues(labelHelp),
|
|
@@ -13,7 +13,6 @@ const useChildButtons = (toggleButtonRef, widthRatio = 1) => {
|
|
|
13
13
|
const [minWidth, setMinWidth] = (0, _react.useState)(0);
|
|
14
14
|
const buttonNode = (0, _react.useRef)(null);
|
|
15
15
|
const childrenContainer = (0, _react.useRef)(null);
|
|
16
|
-
const focusFirstChildButtonOnOpen = (0, _react.useRef)(false);
|
|
17
16
|
const hideButtons = (0, _react.useCallback)(() => {
|
|
18
17
|
setShowAdditionalButtons(false);
|
|
19
18
|
}, []);
|
|
@@ -26,20 +25,16 @@ const useChildButtons = (toggleButtonRef, widthRatio = 1) => {
|
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
27
|
const getButtonChildren = (0, _react.useCallback)(() => childrenContainer.current?.querySelectorAll('[data-component="button"]'), []);
|
|
29
|
-
(0, _react.useEffect)(() => {
|
|
30
|
-
const firstChild = getButtonChildren()?.[0];
|
|
31
|
-
if (focusFirstChildButtonOnOpen.current && showAdditionalButtons && firstChild) {
|
|
32
|
-
focusFirstChildButtonOnOpen.current = false;
|
|
33
|
-
firstChild.focus();
|
|
34
|
-
}
|
|
35
|
-
}, [showAdditionalButtons, getButtonChildren]);
|
|
36
28
|
const handleToggleButtonKeyDown = ev => {
|
|
37
|
-
|
|
29
|
+
const isToggleKey = _events.default.isEnterKey(ev) || _events.default.isSpaceKey(ev) || _events.default.isDownKey(ev) || _events.default.isUpKey(ev) || showAdditionalButtons && _events.default.isTabKey(ev);
|
|
30
|
+
if (isToggleKey) {
|
|
38
31
|
ev.preventDefault();
|
|
39
32
|
if (!showAdditionalButtons) {
|
|
40
33
|
showButtons();
|
|
41
34
|
}
|
|
42
|
-
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
getButtonChildren()?.[0]?.focus();
|
|
37
|
+
});
|
|
43
38
|
}
|
|
44
39
|
};
|
|
45
40
|
const handleKeyDown = (0, _useMenuKeyboardNavigation.default)(toggleButtonRef, getButtonChildren, hideButtons, showAdditionalButtons);
|