carbon-react 124.3.0 → 124.4.0
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/__spec_helper__/index.js +3 -1
- package/esm/__spec_helper__/mock-element-scrollto.d.ts +2 -0
- package/esm/__spec_helper__/mock-element-scrollto.js +6 -0
- package/esm/__spec_helper__/select-test-utils.d.ts +3 -0
- package/esm/__spec_helper__/select-test-utils.js +39 -0
- package/esm/components/box/box.component.d.ts +1 -3
- package/esm/components/box/box.component.js +3 -4
- package/esm/components/box/box.config.d.ts +0 -1
- package/esm/components/box/box.config.js +0 -7
- package/esm/components/box/box.style.js +4 -3
- package/esm/components/select/select-list/select-list.component.js +41 -7
- package/esm/components/tile/flex-tile-cell/flex-tile-cell.component.d.ts +9 -0
- package/esm/components/tile/flex-tile-cell/flex-tile-cell.component.js +3808 -0
- package/esm/components/tile/flex-tile-cell/index.d.ts +2 -0
- package/esm/components/tile/flex-tile-cell/index.js +1 -0
- package/esm/components/tile/flex-tile-container/flex-tile-container.component.d.ts +8 -0
- package/esm/components/tile/flex-tile-container/flex-tile-container.component.js +29 -0
- package/esm/components/tile/flex-tile-container/index.d.ts +2 -0
- package/esm/components/tile/flex-tile-container/index.js +1 -0
- package/esm/components/tile/flex-tile-divider/flex-tile-divider.component.d.ts +3 -0
- package/esm/components/tile/flex-tile-divider/flex-tile-divider.component.js +17 -0
- package/esm/components/tile/flex-tile-divider/index.d.ts +1 -0
- package/esm/components/tile/flex-tile-divider/index.js +1 -0
- package/esm/components/tile/index.d.ts +5 -0
- package/esm/components/tile/index.js +4 -1
- package/esm/style/utils/box-gap.d.ts +5 -0
- package/esm/style/utils/box-gap.js +9 -0
- package/lib/__spec_helper__/index.js +3 -1
- package/lib/__spec_helper__/mock-element-scrollto.d.ts +2 -0
- package/lib/__spec_helper__/mock-element-scrollto.js +12 -0
- package/lib/__spec_helper__/select-test-utils.d.ts +3 -0
- package/lib/__spec_helper__/select-test-utils.js +47 -0
- package/lib/components/box/box.component.d.ts +1 -3
- package/lib/components/box/box.component.js +3 -4
- package/lib/components/box/box.config.d.ts +0 -1
- package/lib/components/box/box.config.js +0 -7
- package/lib/components/box/box.style.js +4 -3
- package/lib/components/select/select-list/select-list.component.js +40 -6
- package/lib/components/tile/flex-tile-cell/flex-tile-cell.component.d.ts +9 -0
- package/lib/components/tile/flex-tile-cell/flex-tile-cell.component.js +3815 -0
- package/lib/components/tile/flex-tile-cell/index.d.ts +2 -0
- package/lib/components/tile/flex-tile-cell/index.js +13 -0
- package/lib/components/tile/flex-tile-cell/package.json +6 -0
- package/lib/components/tile/flex-tile-container/flex-tile-container.component.d.ts +8 -0
- package/lib/components/tile/flex-tile-container/flex-tile-container.component.js +36 -0
- package/lib/components/tile/flex-tile-container/index.d.ts +2 -0
- package/lib/components/tile/flex-tile-container/index.js +13 -0
- package/lib/components/tile/flex-tile-container/package.json +6 -0
- package/lib/components/tile/flex-tile-divider/flex-tile-divider.component.d.ts +3 -0
- package/lib/components/tile/flex-tile-divider/flex-tile-divider.component.js +25 -0
- package/lib/components/tile/flex-tile-divider/index.d.ts +1 -0
- package/lib/components/tile/flex-tile-divider/index.js +13 -0
- package/lib/components/tile/flex-tile-divider/package.json +6 -0
- package/lib/components/tile/index.d.ts +5 -0
- package/lib/components/tile/index.js +21 -0
- package/lib/style/utils/box-gap.d.ts +5 -0
- package/lib/style/utils/box-gap.js +18 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./flex-tile-cell.component";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { BoxProps } from "../../box";
|
|
3
|
+
export interface FlexTileContainerProps extends Pick<BoxProps, "columnGap"> {
|
|
4
|
+
/** The child elements of FlexTileContainer need to be FlexTileCell components. */
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare const FlexTileContainer: ({ children, columnGap, }: FlexTileContainerProps) => JSX.Element;
|
|
8
|
+
export default FlexTileContainer;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
import Box from "../../box";
|
|
4
|
+
const FlexTileContainer = ({
|
|
5
|
+
children,
|
|
6
|
+
columnGap = 2
|
|
7
|
+
}) => {
|
|
8
|
+
if (!children) {
|
|
9
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null);
|
|
10
|
+
}
|
|
11
|
+
return /*#__PURE__*/React.createElement(Box, {
|
|
12
|
+
alignContent: "stretch",
|
|
13
|
+
alignItems: "stretch",
|
|
14
|
+
display: "flex",
|
|
15
|
+
flexDirection: "row",
|
|
16
|
+
flexWrap: "wrap",
|
|
17
|
+
columnGap: columnGap,
|
|
18
|
+
justifyContent: "flex-start",
|
|
19
|
+
overflow: "hidden",
|
|
20
|
+
width: "100%",
|
|
21
|
+
"data-component": "flex-tile-container"
|
|
22
|
+
}, children);
|
|
23
|
+
};
|
|
24
|
+
FlexTileContainer.propTypes = {
|
|
25
|
+
"children": PropTypes.node,
|
|
26
|
+
"columnGap": PropTypes.oneOfType([PropTypes.number, PropTypes.string])
|
|
27
|
+
};
|
|
28
|
+
export { FlexTileContainer };
|
|
29
|
+
export default FlexTileContainer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./flex-tile-container.component";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import PropTypes from "prop-types";
|
|
3
|
+
import Box from "../../box";
|
|
4
|
+
import Hr from "../../hr/hr.component";
|
|
5
|
+
export const FlexTileDivider = () => {
|
|
6
|
+
return /*#__PURE__*/React.createElement(Box, {
|
|
7
|
+
position: "absolute",
|
|
8
|
+
bottom: "0px",
|
|
9
|
+
left: "0px",
|
|
10
|
+
height: "1px",
|
|
11
|
+
width: "100vw",
|
|
12
|
+
m: "0px 0px -1px 0px"
|
|
13
|
+
}, /*#__PURE__*/React.createElement(Hr, {
|
|
14
|
+
m: 0
|
|
15
|
+
}));
|
|
16
|
+
};
|
|
17
|
+
export default FlexTileDivider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./flex-tile-divider.component";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./flex-tile-divider.component";
|
|
@@ -4,3 +4,8 @@ export { default as TileContent } from "./tile-content";
|
|
|
4
4
|
export type { TileContentProps } from "./tile-content";
|
|
5
5
|
export { default as TileFooter } from "./tile-footer";
|
|
6
6
|
export type { TileFooterProps } from "./tile-footer";
|
|
7
|
+
export { default as FlexTileContainer } from "./flex-tile-container";
|
|
8
|
+
export type { FlexTileContainerProps } from "./flex-tile-container";
|
|
9
|
+
export { default as FlexTileCell } from "./flex-tile-cell";
|
|
10
|
+
export type { FlexTileCellProps } from "./flex-tile-cell";
|
|
11
|
+
export { default as FlexTileDivider } from "./flex-tile-divider";
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export { default as Tile } from "./tile.component";
|
|
2
2
|
export { default as TileContent } from "./tile-content";
|
|
3
|
-
export { default as TileFooter } from "./tile-footer";
|
|
3
|
+
export { default as TileFooter } from "./tile-footer";
|
|
4
|
+
export { default as FlexTileContainer } from "./flex-tile-container";
|
|
5
|
+
export { default as FlexTileCell } from "./flex-tile-cell";
|
|
6
|
+
export { default as FlexTileDivider } from "./flex-tile-divider";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const GAP_VALUES: number[];
|
|
2
|
+
export declare type AllowedNumericalValues = typeof GAP_VALUES[number];
|
|
3
|
+
export declare type Gap = AllowedNumericalValues | string;
|
|
4
|
+
export declare const getGapValue: (gapValue: number | string) => string;
|
|
5
|
+
export default function gap(gapValue: number | string): string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { space } from "../../style/themes/base/base-theme.config";
|
|
2
|
+
export const GAP_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
3
|
+
export const getGapValue = gapValue => typeof gapValue === "number" ? `var(--spacing${gapValue}00)` : gapValue;
|
|
4
|
+
export default function gap(gapValue) {
|
|
5
|
+
if (typeof gapValue === "number") {
|
|
6
|
+
return space[gapValue];
|
|
7
|
+
}
|
|
8
|
+
return gapValue;
|
|
9
|
+
}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
var _jestFetchMock = require("jest-fetch-mock");
|
|
4
4
|
var _mockMatchMedia = require("./mock-match-media");
|
|
5
5
|
var _mockResizeObserver = _interopRequireDefault(require("./mock-resize-observer"));
|
|
6
|
+
var _mockElementScrollto = _interopRequireDefault(require("./mock-element-scrollto"));
|
|
6
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
7
8
|
(0, _jestFetchMock.enableFetchMocks)();
|
|
8
9
|
(0, _mockResizeObserver.default)();
|
|
9
|
-
(0, _mockMatchMedia.setupMatchMediaMock)();
|
|
10
|
+
(0, _mockMatchMedia.setupMatchMediaMock)();
|
|
11
|
+
(0, _mockElementScrollto.default)();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
const setupScrollToMock = () => {
|
|
8
|
+
// need to mock the `scrollTo` method, which is undefined in JSDOM. As we're not actually testing this behaviour, just make it
|
|
9
|
+
// do nothing.
|
|
10
|
+
HTMLElement.prototype.scrollTo = () => {};
|
|
11
|
+
};
|
|
12
|
+
var _default = exports.default = setupScrollToMock;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.simulateDropdownEvent = simulateDropdownEvent;
|
|
7
|
+
exports.simulateSelectTextboxEvent = simulateSelectTextboxEvent;
|
|
8
|
+
var _testUtils = require("react-dom/test-utils");
|
|
9
|
+
var _jsdomTestingMocks = require("jsdom-testing-mocks");
|
|
10
|
+
var _selectListContainer = _interopRequireDefault(require("../components/select/select-list/select-list-container.style"));
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
const resizeObserver = (0, _jsdomTestingMocks.mockResizeObserver)();
|
|
13
|
+
function simulateSelectTextboxEvent(container, eventType,
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
...eventArgs) {
|
|
16
|
+
const selectText = container.find('input[type="text"]').first();
|
|
17
|
+
selectText.simulate(eventType, ...eventArgs);
|
|
18
|
+
const selectList = container.find(_selectListContainer.default).getDOMNode();
|
|
19
|
+
// need to manually trigger a resize to make react-virtual realise that child options should be rendered
|
|
20
|
+
(0, _testUtils.act)(() => {
|
|
21
|
+
resizeObserver.mockElementSize(selectList, {
|
|
22
|
+
contentBoxSize: {
|
|
23
|
+
inlineSize: 500,
|
|
24
|
+
blockSize: 180
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
resizeObserver.resize();
|
|
28
|
+
});
|
|
29
|
+
if (eventType === "focus") jest.runOnlyPendingTimers();
|
|
30
|
+
container.update();
|
|
31
|
+
}
|
|
32
|
+
function simulateDropdownEvent(container, eventType) {
|
|
33
|
+
const dropdown = container.find('[type="dropdown"]').first();
|
|
34
|
+
dropdown.simulate(eventType);
|
|
35
|
+
const selectList = container.find(_selectListContainer.default).getDOMNode();
|
|
36
|
+
// need to manually trigger a resize to make react-virtual realise that child options should be rendered
|
|
37
|
+
(0, _testUtils.act)(() => {
|
|
38
|
+
resizeObserver.mockElementSize(selectList, {
|
|
39
|
+
contentBoxSize: {
|
|
40
|
+
inlineSize: 500,
|
|
41
|
+
blockSize: 180
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
resizeObserver.resize();
|
|
45
|
+
});
|
|
46
|
+
container.update();
|
|
47
|
+
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { SpaceProps, LayoutProps, FlexboxProps, PositionProps, GridProps } from "styled-system";
|
|
3
3
|
import * as DesignTokens from "@sage/design-tokens/js/base/common";
|
|
4
|
+
import { Gap } from "style/utils/box-gap";
|
|
4
5
|
import { TagProps } from "../../__internal__/utils/helpers/tags";
|
|
5
|
-
declare const GAP_VALUES: readonly [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
6
6
|
export declare type OverflowWrap = "break-word" | "anywhere";
|
|
7
7
|
export declare type ScrollVariant = "light" | "dark";
|
|
8
8
|
export declare type BoxSizing = "content-box" | "border-box";
|
|
9
|
-
export declare type AllowedNumericalValues = typeof GAP_VALUES[number];
|
|
10
|
-
export declare type Gap = AllowedNumericalValues | string;
|
|
11
9
|
declare type DesignTokensType = keyof typeof DesignTokens;
|
|
12
10
|
declare type BoxShadowsType = Extract<DesignTokensType, `boxShadow${string}`>;
|
|
13
11
|
declare type BorderRadiusType = Extract<DesignTokensType, `borderRadius${string}`>;
|
|
@@ -11,7 +11,6 @@ var _box = _interopRequireDefault(require("./box.style"));
|
|
|
11
11
|
var _tags = _interopRequireDefault(require("../../__internal__/utils/helpers/tags"));
|
|
12
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
13
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
14
|
-
const GAP_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
|
15
14
|
const Box = exports.Box = /*#__PURE__*/_react.default.forwardRef(({
|
|
16
15
|
"data-component": dataComponent,
|
|
17
16
|
as,
|
|
@@ -482,7 +481,7 @@ Box.propTypes = {
|
|
|
482
481
|
"children": _propTypes.default.node,
|
|
483
482
|
"className": _propTypes.default.string,
|
|
484
483
|
"color": _propTypes.default.string,
|
|
485
|
-
"columnGap": _propTypes.default.oneOfType([_propTypes.default.
|
|
484
|
+
"columnGap": _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
|
|
486
485
|
"data-component": _propTypes.default.string,
|
|
487
486
|
"data-element": _propTypes.default.string,
|
|
488
487
|
"data-role": _propTypes.default.string,
|
|
@@ -993,7 +992,7 @@ Box.propTypes = {
|
|
|
993
992
|
"valueOf": _propTypes.default.func.isRequired
|
|
994
993
|
})]),
|
|
995
994
|
"flexWrap": _propTypes.default.oneOfType([_propTypes.default.oneOf(["-moz-initial", "inherit", "initial", "nowrap", "revert-layer", "revert", "unset", "wrap-reverse", "wrap"]), _propTypes.default.arrayOf(_propTypes.default.oneOf(["-moz-initial", "inherit", "initial", "nowrap", "revert-layer", "revert", "unset", "wrap-reverse", "wrap", null])), _propTypes.default.object]),
|
|
996
|
-
"gap": _propTypes.default.oneOfType([_propTypes.default.
|
|
995
|
+
"gap": _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
|
|
997
996
|
"gridArea": _propTypes.default.oneOfType([_propTypes.default.oneOf(["-moz-initial", "auto", "inherit", "initial", "revert-layer", "revert", "unset"]), _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf(["-moz-initial", "auto", "inherit", "initial", "revert-layer", "revert", "unset", null]), _propTypes.default.shape({
|
|
998
997
|
"__@iterator": _propTypes.default.func.isRequired,
|
|
999
998
|
"anchor": _propTypes.default.func.isRequired,
|
|
@@ -3430,7 +3429,7 @@ Box.propTypes = {
|
|
|
3430
3429
|
"valueOf": _propTypes.default.func.isRequired
|
|
3431
3430
|
}), _propTypes.default.string]),
|
|
3432
3431
|
"role": _propTypes.default.string,
|
|
3433
|
-
"rowGap": _propTypes.default.oneOfType([_propTypes.default.
|
|
3432
|
+
"rowGap": _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
|
|
3434
3433
|
"scrollVariant": _propTypes.default.oneOf(["dark", "light"]),
|
|
3435
3434
|
"size": _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf([null]), _propTypes.default.number, _propTypes.default.shape({
|
|
3436
3435
|
"__@iterator": _propTypes.default.func.isRequired,
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var _baseTheme = require("../../style/themes/base/base-theme.config");
|
|
8
7
|
var _default = exports.default = {
|
|
9
8
|
light: {
|
|
10
9
|
thumb: "var(--colorsUtilityMajor300)",
|
|
@@ -13,11 +12,5 @@ var _default = exports.default = {
|
|
|
13
12
|
dark: {
|
|
14
13
|
thumb: "var(--colorsUtilityMajor200)",
|
|
15
14
|
track: "var(--colorsUtilityMajor400)"
|
|
16
|
-
},
|
|
17
|
-
gap: gapValue => {
|
|
18
|
-
if (typeof gapValue === "number") {
|
|
19
|
-
return _baseTheme.space[gapValue];
|
|
20
|
-
}
|
|
21
|
-
return gapValue;
|
|
22
15
|
}
|
|
23
16
|
};
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
8
8
|
var _styledSystem = require("styled-system");
|
|
9
|
+
var _boxGap = _interopRequireDefault(require("../../style/utils/box-gap"));
|
|
9
10
|
var _base = _interopRequireDefault(require("../../style/themes/base"));
|
|
10
11
|
var _color = _interopRequireDefault(require("../../style/utils/color"));
|
|
11
12
|
var _box = _interopRequireDefault(require("./box.config"));
|
|
@@ -97,15 +98,15 @@ const StyledBox = _styledComponents.default.div`
|
|
|
97
98
|
rowGap
|
|
98
99
|
}) => (display === "flex" || display === "inline-flex" || display === "grid" || display === "inline-grid") && (0, _styledComponents.css)`
|
|
99
100
|
${gap !== undefined && (0, _styledComponents.css)`
|
|
100
|
-
gap: ${
|
|
101
|
+
gap: ${(0, _boxGap.default)(gap)};
|
|
101
102
|
`}
|
|
102
103
|
|
|
103
104
|
${columnGap !== undefined && (0, _styledComponents.css)`
|
|
104
|
-
column-gap: ${
|
|
105
|
+
column-gap: ${(0, _boxGap.default)(columnGap)};
|
|
105
106
|
`}
|
|
106
107
|
|
|
107
108
|
${rowGap !== undefined && (0, _styledComponents.css)`
|
|
108
|
-
row-gap: ${
|
|
109
|
+
row-gap: ${(0, _boxGap.default)(rowGap)};
|
|
109
110
|
`}
|
|
110
111
|
`};
|
|
111
112
|
|
|
@@ -9,6 +9,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
9
9
|
var _dom = require("@floating-ui/dom");
|
|
10
10
|
var _reactVirtual = require("@tanstack/react-virtual");
|
|
11
11
|
var _findLastIndex = _interopRequireDefault(require("lodash/findLastIndex"));
|
|
12
|
+
var _usePrevious = _interopRequireDefault(require("../../../hooks/__internal__/usePrevious"));
|
|
12
13
|
var _useScrollBlock = _interopRequireDefault(require("../../../hooks/__internal__/useScrollBlock"));
|
|
13
14
|
var _useModalManager = _interopRequireDefault(require("../../../hooks/__internal__/useModalManager"));
|
|
14
15
|
var _selectList = require("./select-list.style");
|
|
@@ -69,7 +70,26 @@ const SelectList = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
69
70
|
allowScroll
|
|
70
71
|
} = (0, _useScrollBlock.default)();
|
|
71
72
|
const actionButtonHeight = (0, _react.useRef)(0);
|
|
73
|
+
const wasOpen = (0, _usePrevious.default)(isOpen);
|
|
74
|
+
|
|
75
|
+
// ensure scroll-position goes back to the top whenever the list is (re)-opened. (On Safari, without this it remains at the bottom if it had been scrolled
|
|
76
|
+
// to the bottom before closing.)
|
|
77
|
+
(0, _react.useEffect)(() => {
|
|
78
|
+
if (isOpen && !wasOpen) {
|
|
79
|
+
listContainerRef.current?.scrollTo(0, 0);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
72
82
|
const overscan = enableVirtualScroll ? virtualScrollOverscan : _react.default.Children.count(children);
|
|
83
|
+
|
|
84
|
+
// need to use a custom rangeExtractor that ensure the currently-selected option, if any, always appears as an option returned from the virtualiser.
|
|
85
|
+
// This ensures that the aria-activedescendant value is always valid even when the currently-selected item is out of the visible range.
|
|
86
|
+
const rangeExtractor = range => {
|
|
87
|
+
const toRender = (0, _reactVirtual.defaultRangeExtractor)(range);
|
|
88
|
+
if (currentOptionsListIndex !== -1 && !toRender.includes(currentOptionsListIndex)) {
|
|
89
|
+
toRender.push(currentOptionsListIndex);
|
|
90
|
+
}
|
|
91
|
+
return toRender;
|
|
92
|
+
};
|
|
73
93
|
const virtualizer = (0, _reactVirtual.useVirtualizer)({
|
|
74
94
|
count: _react.default.Children.count(children),
|
|
75
95
|
getScrollElement: () => listContainerRef.current,
|
|
@@ -77,9 +97,21 @@ const SelectList = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
77
97
|
// value doesn't really seem to matter since we're dynamically measuring, but 40px is the height of a single-line option
|
|
78
98
|
overscan,
|
|
79
99
|
paddingStart: multiColumn ? TABLE_HEADER_HEIGHT : 0,
|
|
80
|
-
scrollPaddingEnd: actionButtonHeight.current
|
|
100
|
+
scrollPaddingEnd: actionButtonHeight.current,
|
|
101
|
+
rangeExtractor
|
|
81
102
|
});
|
|
82
103
|
const items = virtualizer.getVirtualItems();
|
|
104
|
+
|
|
105
|
+
// getVirtualItems returns an empty array of items if the select list is currently closed - which is correct visually but
|
|
106
|
+
// we need to ensure that any currently-selected option is still in the DOM to avoid any accessibility issues.
|
|
107
|
+
// The isOpen prop will ensure that no options are visible regardless of what is in the items array.
|
|
108
|
+
if (items.length === 0 && currentOptionsListIndex !== -1) {
|
|
109
|
+
// only index property is required with the item not visible so the following type assertion, even though incorrect,
|
|
110
|
+
// should be OK
|
|
111
|
+
items.push({
|
|
112
|
+
index: currentOptionsListIndex
|
|
113
|
+
});
|
|
114
|
+
}
|
|
83
115
|
const listHeight = virtualizer.getTotalSize();
|
|
84
116
|
(0, _react.useEffect)(() => {
|
|
85
117
|
if (isOpen) {
|
|
@@ -128,11 +160,13 @@ const SelectList = /*#__PURE__*/_react.default.forwardRef(({
|
|
|
128
160
|
measureElement(element);
|
|
129
161
|
}
|
|
130
162
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
163
|
+
|
|
164
|
+
// the rangeExtractor above can cause an undefined value to be appended to the return items.
|
|
165
|
+
// Easiest way to stop that crashing is just to filter it out.
|
|
166
|
+
const renderedChildren = items.filter(item => item !== undefined).map(({
|
|
167
|
+
index,
|
|
168
|
+
start
|
|
169
|
+
}) => {
|
|
136
170
|
const child = childrenList[index];
|
|
137
171
|
if (! /*#__PURE__*/_react.default.isValidElement(child)) {
|
|
138
172
|
return child;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { BoxProps } from "../../box";
|
|
3
|
+
import { TagProps } from "../../../__internal__/utils/helpers/tags";
|
|
4
|
+
export interface FlexTileCellProps extends TagProps, BoxProps {
|
|
5
|
+
/** The content to render within the responsive cell. */
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare const FlexTileCell: ({ children, flexGrow, flexBasis, flexShrink, ...rest }: FlexTileCellProps) => JSX.Element;
|
|
9
|
+
export default FlexTileCell;
|