carbon-react 87.0.0 → 87.3.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.
Files changed (24) hide show
  1. package/lib/{components/textarea → __internal__}/character-count/character-count.component.js +1 -1
  2. package/lib/{components/textarea → __internal__}/character-count/character-count.style.js +1 -1
  3. package/lib/{components/textarea → __internal__}/character-count/index.js +0 -0
  4. package/lib/__internal__/input/input-presentation.style.js +0 -8
  5. package/lib/__internal__/input/input.style.js +2 -8
  6. package/lib/components/flat-table/flat-table-body/flat-table-body.component.js +6 -4
  7. package/lib/components/flat-table/flat-table-body-draggable/flat-table-body-draggable.component.js +115 -0
  8. package/lib/components/flat-table/flat-table-body-draggable/flat-table-body-draggable.d.ts +12 -0
  9. package/lib/components/flat-table/flat-table-body-draggable/index.d.ts +2 -0
  10. package/lib/components/flat-table/flat-table-body-draggable/index.js +15 -0
  11. package/lib/components/flat-table/flat-table-row/__internal__/flat-table-row-draggable.component.js +86 -0
  12. package/lib/components/flat-table/flat-table-row/__internal__/flat-table-row-draggable.d.ts +18 -0
  13. package/lib/components/flat-table/flat-table-row/flat-table-row.component.js +44 -7
  14. package/lib/components/flat-table/flat-table-row/flat-table-row.style.js +21 -1
  15. package/lib/components/flat-table/index.d.ts +2 -0
  16. package/lib/components/flat-table/index.js +8 -0
  17. package/lib/components/menu/__internal__/submenu/submenu.component.js +19 -6
  18. package/lib/components/menu/menu-item/menu-item.component.js +12 -2
  19. package/lib/components/menu/menu-item/menu-item.d.ts +4 -0
  20. package/lib/components/textarea/textarea.component.js +1 -1
  21. package/lib/components/textbox/textbox.component.js +19 -3
  22. package/lib/components/textbox/textbox.d.ts +6 -0
  23. package/lib/hooks/__internal__/useCharacterCount/index.js +34 -0
  24. package/package.json +1 -1
@@ -11,7 +11,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
12
  var _styledComponents = require("styled-components");
13
13
 
14
- var _base = _interopRequireDefault(require("../../../style/themes/base"));
14
+ var _base = _interopRequireDefault(require("../../style/themes/base"));
15
15
 
16
16
  var _characterCount = _interopRequireDefault(require("./character-count.style"));
17
17
 
@@ -7,7 +7,7 @@ exports.default = void 0;
7
7
 
8
8
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
9
9
 
10
- var _base = _interopRequireDefault(require("../../../style/themes/base"));
10
+ var _base = _interopRequireDefault(require("../../style/themes/base"));
11
11
 
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
@@ -13,8 +13,6 @@ var _base = _interopRequireDefault(require("../../style/themes/base"));
13
13
 
14
14
  var _inputSizes = _interopRequireDefault(require("./input-sizes.style"));
15
15
 
16
- var _input = _interopRequireDefault(require("./input.style"));
17
-
18
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
17
 
20
18
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
@@ -51,12 +49,6 @@ const InputPresentationStyle = _styledComponents.default.div`
51
49
  size
52
50
  }) => _inputSizes.default[size].horizontalPadding};
53
51
 
54
- ${_input.default} {
55
- &:-webkit-autofill {
56
- margin-top: 2px;
57
- }
58
- }
59
-
60
52
  ${({
61
53
  disabled,
62
54
  theme
@@ -33,9 +33,8 @@ const StyledInput = _styledComponents.default.input`
33
33
  width: 30px;
34
34
 
35
35
  &:-webkit-autofill {
36
- box-shadow: 0 0 0px 1000px #fff inset;
37
- -webkit-box-shadow: 0 0 0px 1000px #fff inset;
38
- -webkit-box-border: none;
36
+ background-clip: text;
37
+ -webkit-background-clip: text;
39
38
  }
40
39
 
41
40
  ${({
@@ -58,11 +57,6 @@ const StyledInput = _styledComponents.default.input`
58
57
  cursor: not-allowed;
59
58
  `}
60
59
 
61
- &:invalid, &:required {
62
- box-shadow: 0 0 0px 1000px #fff inset;
63
- -webkit-box-shadow: 0 0 0px 1000px #fff inset;
64
- }
65
-
66
60
  ${({
67
61
  readOnly,
68
62
  theme
@@ -11,11 +11,13 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
14
- const FlatTableBody = ({
14
+ const FlatTableBody = /*#__PURE__*/_react.default.forwardRef(({
15
15
  children
16
- }) => {
17
- return /*#__PURE__*/_react.default.createElement("tbody", null, children);
18
- };
16
+ }, ref) => {
17
+ return /*#__PURE__*/_react.default.createElement("tbody", {
18
+ ref: ref
19
+ }, children);
20
+ });
19
21
 
20
22
  FlatTableBody.propTypes = {
21
23
  /** Array of FlatTableRow. */
@@ -0,0 +1,115 @@
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 _reactDnd = require("react-dnd");
11
+
12
+ var _reactDndHtml5Backend = _interopRequireDefault(require("react-dnd-html5-backend"));
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _icon = _interopRequireDefault(require("../../icon/icon.style"));
17
+
18
+ var _flatTableBody = _interopRequireDefault(require("../flat-table-body/flat-table-body.component"));
19
+
20
+ var _flatTableCell = _interopRequireDefault(require("../flat-table-cell/flat-table-cell.component"));
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
25
+
26
+ 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; }
27
+
28
+ function _extends() { _extends = Object.assign || 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); }
29
+
30
+ const DropTarget = ({
31
+ children,
32
+ getOrder,
33
+ ...rest
34
+ }) => {
35
+ const [, drop] = (0, _reactDnd.useDrop)({
36
+ accept: "flatTableRow",
37
+
38
+ drop() {
39
+ getOrder();
40
+ }
41
+
42
+ });
43
+ return /*#__PURE__*/_react.default.createElement(_flatTableBody.default, _extends({
44
+ ref: drop
45
+ }, rest), children);
46
+ };
47
+
48
+ const FlatTableBodyDraggable = ({
49
+ children,
50
+ getOrder
51
+ }) => {
52
+ const [draggableItems, setDraggableItems] = (0, _react.useState)(_react.default.Children.toArray(children));
53
+ const isFirstRender = (0, _react.useRef)(true);
54
+ (0, _react.useEffect)(() => {
55
+ if (!isFirstRender.current) {
56
+ setDraggableItems(_react.default.Children.toArray(children));
57
+ } else {
58
+ isFirstRender.current = false;
59
+ }
60
+ }, [children]);
61
+
62
+ const findItem = id => {
63
+ const draggableItem = draggableItems.filter(item => `${item.props.id}` === id)[0];
64
+ return {
65
+ draggableItem,
66
+ index: draggableItems.indexOf(draggableItem)
67
+ };
68
+ };
69
+
70
+ const moveItem = (id, atIndex) => {
71
+ const {
72
+ draggableItem,
73
+ index
74
+ } = findItem(id);
75
+ const copyOfDraggableItems = [...draggableItems];
76
+ copyOfDraggableItems.splice(index, 1);
77
+ copyOfDraggableItems.splice(atIndex, 0, draggableItem);
78
+ setDraggableItems(copyOfDraggableItems);
79
+ };
80
+
81
+ const getItemsId = () => {
82
+ if (!getOrder) {
83
+ return;
84
+ }
85
+
86
+ const draggableItemIds = draggableItems.map(draggableItem => draggableItem.props.id);
87
+ getOrder(draggableItemIds);
88
+ };
89
+
90
+ return /*#__PURE__*/_react.default.createElement(_reactDnd.DndProvider, {
91
+ backend: _reactDndHtml5Backend.default
92
+ }, /*#__PURE__*/_react.default.createElement(DropTarget, {
93
+ getOrder: getItemsId
94
+ }, draggableItems.map(item => /*#__PURE__*/_react.default.cloneElement(item, {
95
+ id: `${item.props.id}`,
96
+ moveItem,
97
+ findItem,
98
+ draggable: true
99
+ }, [/*#__PURE__*/_react.default.createElement(_flatTableCell.default, {
100
+ key: item.props.id
101
+ }, /*#__PURE__*/_react.default.createElement(_icon.default, {
102
+ type: "drag"
103
+ })), item.props.children]))));
104
+ };
105
+
106
+ FlatTableBodyDraggable.propTypes = {
107
+ getOrder: _propTypes.default.func,
108
+ children: _propTypes.default.node.isRequired
109
+ };
110
+ DropTarget.propTypes = {
111
+ children: _propTypes.default.node.isRequired,
112
+ getOrder: _propTypes.default.func
113
+ };
114
+ var _default = FlatTableBodyDraggable;
115
+ exports.default = _default;
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+
3
+ export interface FlatTableBodyDraggableProps {
4
+ /** Array of FlatTableRow. */
5
+ children: React.ReactNode;
6
+ /** Callback fired when order is changed */
7
+ getOrder?: (draggableItemIds: number[]) => void;
8
+ }
9
+
10
+ declare function FlatTableBodyDraggable(props: FlatTableBodyDraggableProps): JSX.Element;
11
+
12
+ export default FlatTableBodyDraggable;
@@ -0,0 +1,2 @@
1
+ export { default } from "./flat-table-body-draggable";
2
+ export * from "./flat-table-body-draggable";
@@ -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 _flatTableBodyDraggable.default;
10
+ }
11
+ });
12
+
13
+ var _flatTableBodyDraggable = _interopRequireDefault(require("./flat-table-body-draggable.component"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _reactDnd = require("react-dnd");
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ const FlatTableRowDraggable = ({
17
+ children,
18
+ id,
19
+ findItem,
20
+ moveItem
21
+ }) => {
22
+ const originalIndex = findItem(id).index;
23
+ const [{
24
+ isDragging
25
+ }, drag] = (0, _reactDnd.useDrag)({
26
+ item: {
27
+ type: "flatTableRow",
28
+ id,
29
+ originalIndex
30
+ },
31
+ collect: monitor => ({
32
+ isDragging: monitor.isDragging()
33
+ }),
34
+ end: (dropResult, monitor) => {
35
+ const {
36
+ id: droppedId,
37
+ originalIndex: oIndex
38
+ } = monitor.getItem();
39
+ const didDrop = monitor.didDrop();
40
+
41
+ if (!didDrop) {
42
+ moveItem(droppedId, oIndex);
43
+ }
44
+ }
45
+ });
46
+ const [, drop] = (0, _reactDnd.useDrop)({
47
+ accept: "flatTableRow",
48
+ canDrop: () => false,
49
+
50
+ hover({
51
+ id: draggedId
52
+ }) {
53
+ if (draggedId !== id) {
54
+ const {
55
+ index: overIndex
56
+ } = findItem(id);
57
+ moveItem(draggedId, overIndex);
58
+ }
59
+ }
60
+
61
+ });
62
+ return /*#__PURE__*/_react.default.cloneElement(children, {
63
+ id,
64
+ isDragging,
65
+ ref: node => drag(drop(node))
66
+ });
67
+ };
68
+
69
+ FlatTableRowDraggable.propTypes = {
70
+ /** Array of FlatTableHeader or FlatTableCell. FlatTableRowHeader could also be passed. */
71
+ children: _propTypes.default.node.isRequired,
72
+
73
+ /** ID for use in drag and drop functionality */
74
+ id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
75
+
76
+ /** function to find an item in the list of draggable items */
77
+ findItem: _propTypes.default.func.isRequired,
78
+
79
+ /** function to reposition an item in the list of draggable items */
80
+ moveItem: _propTypes.default.func.isRequired,
81
+
82
+ /** item is draggable */
83
+ draggable: _propTypes.default.bool
84
+ };
85
+ var _default = FlatTableRowDraggable;
86
+ exports.default = _default;
@@ -0,0 +1,18 @@
1
+ import * as React from "react";
2
+
3
+ export interface FlatTableRowDraggableProps {
4
+ /** Array of FlatTableRow. */
5
+ children: React.ReactNode;
6
+ /** ID for use in drag and drop functionality */
7
+ id?: number | string;
8
+ /** function to find an item in the list of draggable items */
9
+ findItem: () => object;
10
+ /** function to reposition an item in the list of draggable items */
11
+ moveItem: () => void;
12
+ /** item is draggable */
13
+ draggable?: boolean;
14
+ }
15
+
16
+ declare function FlatTableRowDraggable(props: FlatTableRowDraggableProps): JSX.Element;
17
+
18
+ export default FlatTableRowDraggable;
@@ -19,6 +19,8 @@ var _flatTableCheckbox = _interopRequireDefault(require("../flat-table-checkbox"
19
19
 
20
20
  var _flatTableRowHeader = _interopRequireDefault(require("../flat-table-row-header"));
21
21
 
22
+ var _flatTableRowDraggable = _interopRequireDefault(require("./__internal__/flat-table-row-draggable.component"));
23
+
22
24
  var _flatTable = require("../flat-table.component");
23
25
 
24
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -44,7 +46,11 @@ const FlatTableRow = /*#__PURE__*/_react.default.forwardRef(({
44
46
  bgColor,
45
47
  horizontalBorderColor,
46
48
  horizontalBorderSize = "small",
47
- applyBorderLeft
49
+ applyBorderLeft,
50
+ id,
51
+ draggable,
52
+ findItem,
53
+ moveItem
48
54
  }, ref) => {
49
55
  const [isExpanded, setIsExpanded] = (0, _react.useState)(expanded);
50
56
  const rowRef = ref || (0, _react.useRef)();
@@ -123,9 +129,8 @@ const FlatTableRow = /*#__PURE__*/_react.default.forwardRef(({
123
129
  (0, _react.useEffect)(() => {
124
130
  setIsExpanded(expanded);
125
131
  }, [expanded]);
126
- return /*#__PURE__*/_react.default.createElement(_drawer.DrawerSidebarContext.Consumer, null, ({
127
- isInSidebar
128
- }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_flatTableRow.default, _extends({
132
+
133
+ const rowComponent = isInSidebar => /*#__PURE__*/_react.default.createElement(_flatTableRow.default, _extends({
129
134
  isInSidebar: isInSidebar,
130
135
  expandable: expandable,
131
136
  isSubRow: isSubRow,
@@ -143,7 +148,8 @@ const FlatTableRow = /*#__PURE__*/_react.default.forwardRef(({
143
148
  bgColor: bgColor,
144
149
  horizontalBorderColor: horizontalBorderColor,
145
150
  horizontalBorderSize: horizontalBorderSize,
146
- applyBorderLeft: applyBorderLeft
151
+ applyBorderLeft: applyBorderLeft,
152
+ draggable: draggable
147
153
  }, interactiveRowProps), _react.default.Children.map(children, (child, index) => {
148
154
  return child && /*#__PURE__*/_react.default.cloneElement(child, {
149
155
  expandable: expandable && index === firstCellIndex(),
@@ -154,7 +160,17 @@ const FlatTableRow = /*#__PURE__*/_react.default.forwardRef(({
154
160
  leftPosition: leftPositions[index],
155
161
  ...child.props
156
162
  });
157
- })), isExpanded && subRows && _react.default.Children.map(subRows, (child, index) => child && /*#__PURE__*/_react.default.cloneElement(child, {
163
+ }));
164
+
165
+ const draggableComponent = isInSidebar => /*#__PURE__*/_react.default.createElement(_flatTableRowDraggable.default, {
166
+ id: id,
167
+ moveItem: moveItem,
168
+ findItem: findItem
169
+ }, rowComponent(isInSidebar));
170
+
171
+ return /*#__PURE__*/_react.default.createElement(_drawer.DrawerSidebarContext.Consumer, null, ({
172
+ isInSidebar
173
+ }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, draggable ? draggableComponent(isInSidebar) : rowComponent(isInSidebar), isExpanded && subRows && _react.default.Children.map(subRows, (child, index) => child && /*#__PURE__*/_react.default.cloneElement(child, {
158
174
  isSubRow: true,
159
175
  isFirstSubRow: index === 0,
160
176
  ...child.props
@@ -205,7 +221,28 @@ FlatTableRow.propTypes = {
205
221
  stickyOffset: _propTypes.default.number,
206
222
 
207
223
  /** @ignore @private applies a border-left to the first child */
208
- applyBorderLeft: _propTypes.default.bool
224
+ applyBorderLeft: _propTypes.default.bool,
225
+
226
+ /** ID for use in drag and drop functionality
227
+ * @private
228
+ * @ignore
229
+ */
230
+ id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
231
+
232
+ /**
233
+ * @private
234
+ * @ignore
235
+ */
236
+ findItem: _propTypes.default.func,
237
+
238
+ /**
239
+ * @private
240
+ * @ignore
241
+ */
242
+ moveItem: _propTypes.default.func,
243
+
244
+ /** @ignore @private position in header if multiple rows */
245
+ draggable: _propTypes.default.bool
209
246
  };
210
247
  var _default = FlatTableRow;
211
248
  exports.default = _default;
@@ -92,7 +92,9 @@ const StyledFlatTableRow = _styledComponents.default.tr`
92
92
  isFirstSubRow,
93
93
  size,
94
94
  theme,
95
- applyBorderLeft
95
+ applyBorderLeft,
96
+ isDragging,
97
+ draggable
96
98
  }) => {
97
99
  const backgroundColor = bgColor ? (0, _color.toColor)(theme, bgColor) : undefined;
98
100
  const customBorderColor = horizontalBorderColor ? (0, _color.toColor)(theme, horizontalBorderColor) : undefined;
@@ -123,6 +125,9 @@ const StyledFlatTableRow = _styledComponents.default.tr`
123
125
 
124
126
  ${_flatTableHeader.default} {
125
127
  border-bottom: 1px solid ${borderColor(colorTheme, theme)};
128
+ :first-child {
129
+ border-left: 1px solid ${borderColor(colorTheme, theme)};
130
+ }
126
131
  }
127
132
 
128
133
  ${stickyOffset > 0 && (0, _styledComponents.css)`
@@ -255,6 +260,21 @@ const StyledFlatTableRow = _styledComponents.default.tr`
255
260
  }
256
261
  `}
257
262
 
263
+ ${isDragging && (0, _styledComponents.css)`
264
+ border: ${isInSidebar ? theme.palette.slateTint(40) : theme.palette.slateTint(55)}
265
+ 2px solid;
266
+ cursor: grabbing;
267
+ ${allCellTypes} {
268
+ background-color: ${isInSidebar ? theme.palette.slateTint(60) : theme.palette.slateTint(75)};
269
+ }
270
+ `}
271
+
272
+ ${draggable && (0, _styledComponents.css)`
273
+ ${_icon.default}:first-of-type {
274
+ font-size: 16px;
275
+ }
276
+ `}
277
+
258
278
  ${isFirstSubRow && (0, _styledComponents.css)`
259
279
  ${allCellTypes} {
260
280
  box-shadow: inset 0 6px 4px -4px ${theme.flatTable.subRow.shadow};
@@ -5,6 +5,7 @@ export { default as FlatTable } from "./flat-table";
5
5
  export { default as FlatTableHead } from "./flat-table-head";
6
6
  export { default as FlatTableHeader } from "./flat-table-header";
7
7
  export { default as FlatTableBody } from "./flat-table-body";
8
+ export { default as FlatTableBodyDraggable } from "./flat-table-body-draggable";
8
9
  export { default as FlatTableRow } from "./flat-table-row";
9
10
  export { default as FlatTableRowHeader } from "./flat-table-row-header";
10
11
  export { default as FlatTableCell } from "./flat-table-cell";
@@ -14,6 +15,7 @@ export * from "./flat-table";
14
15
  export * from "./flat-table-head";
15
16
  export * from "./flat-table-header";
16
17
  export * from "./flat-table-body";
18
+ export * from "./flat-table-body-draggable";
17
19
  export * from "./flat-table-row";
18
20
  export * from "./flat-table-row-header";
19
21
  export * from "./flat-table-cell";
@@ -51,6 +51,12 @@ Object.defineProperty(exports, "FlatTableCheckbox", {
51
51
  return _flatTableCheckbox.default;
52
52
  }
53
53
  });
54
+ Object.defineProperty(exports, "FlatTableBodyDraggable", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _flatTableBodyDraggable.default;
58
+ }
59
+ });
54
60
  Object.defineProperty(exports, "Sort", {
55
61
  enumerable: true,
56
62
  get: function () {
@@ -74,6 +80,8 @@ var _flatTableCell = _interopRequireDefault(require("./flat-table-cell/flat-tabl
74
80
 
75
81
  var _flatTableCheckbox = _interopRequireDefault(require("./flat-table-checkbox/flat-table-checkbox.component"));
76
82
 
83
+ var _flatTableBodyDraggable = _interopRequireDefault(require("./flat-table-body-draggable/flat-table-body-draggable.component"));
84
+
77
85
  var _sort = _interopRequireDefault(require("./sort/sort.component"));
78
86
 
79
87
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -48,6 +48,8 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
48
48
  href,
49
49
  maxWidth,
50
50
  asPassiveItem,
51
+ onSubmenuOpen,
52
+ onSubmenuClose,
51
53
  ...rest
52
54
  }, ref) => {
53
55
  const [blockDoubleFocus, setBlockDoubleFocus] = (0, _react.useState)(false);
@@ -81,17 +83,22 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
81
83
  clearTimeout(characterTimer.current);
82
84
  startCharacterTimeout();
83
85
  }, [startCharacterTimeout]);
86
+ const openSubmenu = (0, _react.useCallback)(() => {
87
+ setSubmenuOpen(true);
88
+ if (onSubmenuOpen) onSubmenuOpen();
89
+ }, [onSubmenuOpen]);
84
90
  const closeSubmenu = (0, _react.useCallback)(() => {
85
91
  setSubmenuOpen(false);
92
+ if (onSubmenuClose) onSubmenuClose();
86
93
  setSubmenuFocusIndex(undefined);
87
94
  setBlockDoubleFocus(false);
88
95
  setCharacterString("");
89
- }, []);
96
+ }, [onSubmenuClose]);
90
97
  const handleKeyDown = (0, _react.useCallback)((event, index = submenuFocusIndex) => {
91
98
  if (!submenuOpen) {
92
99
  if (_events.default.isEnterKey(event) || _events.default.isSpaceKey(event) || _events.default.isDownKey(event) || _events.default.isUpKey(event)) {
93
100
  event.preventDefault();
94
- setSubmenuOpen(true);
101
+ openSubmenu();
95
102
 
96
103
  if (!href) {
97
104
  setSubmenuFocusIndex(0);
@@ -200,7 +207,7 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
200
207
  handleKeyDown(event, nextIndex);
201
208
  }
202
209
  }
203
- }, [submenuFocusIndex, submenuOpen, href, menuContext, arrayOfFormattedChildren, numberOfChildren, closeSubmenu, onKeyDown, characterString, restartCharacterTimeout, startCharacterTimeout]);
210
+ }, [submenuFocusIndex, submenuOpen, href, menuContext, arrayOfFormattedChildren, numberOfChildren, openSubmenu, closeSubmenu, onKeyDown, characterString, restartCharacterTimeout, startCharacterTimeout]);
204
211
  const onClickOutside = (0, _react.useCallback)(event => {
205
212
  if (!_events.default.composedPath(event).includes(submenuRef.current)) {
206
213
  document.removeEventListener("click", onClickOutside);
@@ -260,9 +267,9 @@ const Submenu = /*#__PURE__*/_react.default.forwardRef(({
260
267
  return /*#__PURE__*/_react.default.createElement(_submenu.StyledSubmenuWrapper, {
261
268
  "data-component": "submenu-wrapper",
262
269
  role: "menuitem",
263
- onMouseOver: !clickToOpen ? () => setSubmenuOpen(true) : undefined,
270
+ onMouseOver: !clickToOpen ? () => openSubmenu() : undefined,
264
271
  onMouseLeave: () => closeSubmenu(),
265
- onClick: clickToOpen ? () => setSubmenuOpen(true) : undefined,
272
+ onClick: clickToOpen ? () => openSubmenu() : undefined,
266
273
  ref: submenuRef,
267
274
  isSubmenuOpen: submenuOpen
268
275
  }, /*#__PURE__*/_react.default.createElement(_menuItem.default, _extends({}, rest, {
@@ -336,7 +343,13 @@ Submenu.propTypes = {
336
343
  maxWidth: _propTypes.default.string,
337
344
 
338
345
  /** Used to set a submenu parent to passive styling in MenuFullscreen */
339
- asPassiveItem: _propTypes.default.bool
346
+ asPassiveItem: _propTypes.default.bool,
347
+
348
+ /** Callback triggered when submenu opens. Only valid with submenu prop */
349
+ onSubmenuOpen: _propTypes.default.func,
350
+
351
+ /** Callback triggered when submenu closes. Only valid with submenu prop */
352
+ onSubmenuClose: _propTypes.default.func
340
353
  };
341
354
  var _default = Submenu;
342
355
  exports.default = _default;
@@ -55,6 +55,8 @@ const MenuItem = ({
55
55
  clickToOpen,
56
56
  maxWidth,
57
57
  menuOpen,
58
+ onSubmenuOpen,
59
+ onSubmenuClose,
58
60
  ...rest
59
61
  }) => {
60
62
  const menuContext = (0, _react.useContext)(_menu.default);
@@ -153,7 +155,9 @@ const MenuItem = ({
153
155
  clickToOpen: clickToOpen,
154
156
  maxWidth: maxWidth,
155
157
  asPassiveItem: asPassiveItem,
156
- ariaLabel: ariaLabel
158
+ ariaLabel: ariaLabel,
159
+ onSubmenuOpen: onSubmenuOpen,
160
+ onSubmenuClose: onSubmenuClose
157
161
  }, elementProps, rest), childrenItems));
158
162
  }
159
163
 
@@ -251,7 +255,13 @@ MenuItem.propTypes = {
251
255
  }
252
256
 
253
257
  return _propTypes.default.string(props, ...rest);
254
- }
258
+ },
259
+
260
+ /** Callback triggered when submenu opens. Only valid with submenu prop */
261
+ onSubmenuOpen: _propTypes.default.func,
262
+
263
+ /** Callback triggered when submenu closes. Only valid with submenu prop */
264
+ onSubmenuClose: _propTypes.default.func
255
265
  };
256
266
  var _default = MenuItem;
257
267
  exports.default = _default;
@@ -25,6 +25,10 @@ export interface MenuItemBaseProps extends LayoutProps, FlexboxProps {
25
25
  showDropdownArrow?: boolean;
26
26
  /** If no text is provided an ariaLabel should be given to facilitate accessibility. */
27
27
  ariaLabel?: string;
28
+ /** Callback triggered when submenu opens. Only valid with submenu prop */
29
+ onSubmenuOpen?: () => void;
30
+ /** Callback triggered when submenu closes. Only valid with submenu prop */
31
+ onSubmenuClose?: () => void;
28
32
  }
29
33
 
30
34
  export interface MenuWithChildren extends MenuItemBaseProps {
@@ -15,7 +15,7 @@ var _input = require("../../__internal__/input");
15
15
 
16
16
  var _formField = _interopRequireDefault(require("../../__internal__/form-field"));
17
17
 
18
- var _characterCount = _interopRequireDefault(require("./character-count"));
18
+ var _characterCount = _interopRequireDefault(require("../../__internal__/character-count"));
19
19
 
20
20
  var _input2 = _interopRequireDefault(require("../../__internal__/input/input.component"));
21
21
 
@@ -27,6 +27,8 @@ var _prefix = _interopRequireDefault(require("./__internal__/prefix.style"));
27
27
 
28
28
  var _tooltipProvider = require("../../__internal__/tooltip-provider");
29
29
 
30
+ var _useCharacterCount = _interopRequireDefault(require("../../hooks/__internal__/useCharacterCount"));
31
+
30
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
33
 
32
34
  function _extends() { _extends = Object.assign || 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); }
@@ -58,8 +60,12 @@ const Textbox = ({
58
60
  positionedChildren,
59
61
  inputRef,
60
62
  tooltipPosition,
63
+ enforceCharacterLimit = true,
64
+ characterLimit,
65
+ warnOverLimit = false,
61
66
  ...props
62
67
  }) => {
68
+ const [maxLength, characterCount] = (0, _useCharacterCount.default)(value, characterLimit, warnOverLimit, enforceCharacterLimit);
63
69
  return /*#__PURE__*/_react.default.createElement(_tooltipProvider.TooltipProvider, {
64
70
  tooltipPosition: tooltipPosition
65
71
  }, /*#__PURE__*/_react.default.createElement(_inputBehaviour.InputBehaviour, null, /*#__PURE__*/_react.default.createElement(_formField.default, _extends({
@@ -83,14 +89,15 @@ const Textbox = ({
83
89
  placeholder: props.disabled || props.readOnly ? "" : props.placeholder,
84
90
  "aria-invalid": !!props.error,
85
91
  inputRef: inputRef,
86
- value: visibleValue(value, formattedValue)
92
+ value: visibleValue(value, formattedValue),
93
+ maxLength: maxLength
87
94
  })), children, /*#__PURE__*/_react.default.createElement(_inputIconToggle.default, _extends({}, removeParentProps(props), {
88
95
  useValidationIcon: !validationOnLabel,
89
96
  onClick: iconOnClick || props.onClick,
90
97
  onMouseDown: iconOnMouseDown,
91
98
  inputIcon: inputIcon,
92
99
  iconTabIndex: iconTabIndex
93
- }))))));
100
+ })))), characterCount));
94
101
  };
95
102
 
96
103
  exports.OriginalTextbox = Textbox;
@@ -242,7 +249,16 @@ Textbox.propTypes = {
242
249
  inputRef: _propTypes.default.func,
243
250
 
244
251
  /** Overrides the default tooltip position */
245
- tooltipPosition: _propTypes.default.oneOf(["top", "bottom", "left", "right"])
252
+ tooltipPosition: _propTypes.default.oneOf(["top", "bottom", "left", "right"]),
253
+
254
+ /** Stop the user typing over the characterLimit */
255
+ enforceCharacterLimit: _propTypes.default.bool,
256
+
257
+ /** Character limit of the textarea */
258
+ characterLimit: _propTypes.default.string,
259
+
260
+ /** Whether to display the character count message in red */
261
+ warnOverLimit: _propTypes.default.bool
246
262
  };
247
263
  Textbox.defaultProps = {
248
264
  labelWidth: 30,
@@ -80,6 +80,12 @@ export interface TextboxProps extends CommonTextboxProps, SpaceProps {
80
80
  mb?: 0 | 1 | 2 | 3 | 4 | 5 | 7;
81
81
  /** Container for DatePicker or SelectList components */
82
82
  positionedChildren?: React.ReactNode;
83
+ /** Character limit of the textarea */
84
+ characterLimit?: string;
85
+ /** Stop the user typing over the characterLimit */
86
+ enforceCharacterLimit?: boolean;
87
+ /** Whether to display the character count message in red */
88
+ warnOverLimit?: boolean;
83
89
  }
84
90
 
85
91
  declare function Textbox(props: TextboxProps): JSX.Element;
@@ -0,0 +1,34 @@
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 _characterCount = _interopRequireDefault(require("../../../__internal__/character-count"));
11
+
12
+ var _useLocale = _interopRequireDefault(require("../useLocale"));
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 getFormatNumber = (value, locale) => new Intl.NumberFormat(locale).format(value);
21
+
22
+ const useCharacterCount = (value, characterLimit, warnOverLimit = false, enforceCharacterLimit = true) => {
23
+ const l = (0, _useLocale.default)();
24
+ const isOverLimit = (0, _react.useMemo)(() => value && value.length > parseInt(characterLimit, 10), [value, characterLimit]);
25
+ return [enforceCharacterLimit && characterLimit ? characterLimit : undefined, characterLimit ? /*#__PURE__*/_react.default.createElement(_characterCount.default, {
26
+ isOverLimit: isOverLimit && warnOverLimit,
27
+ value: getFormatNumber(value.length, l.locale()),
28
+ limit: getFormatNumber(characterLimit, l.locale()),
29
+ "data-element": "character-limit"
30
+ }) : null];
31
+ };
32
+
33
+ var _default = useCharacterCount;
34
+ exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "87.0.0",
3
+ "version": "87.3.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "engineStrict": true,
6
6
  "engines": {