@carbon/ibm-products 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. package/css/index-full-carbon.css +80 -2
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +2 -2
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +3 -2
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +1 -1
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +80 -2
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +2 -2
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +80 -2
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +2 -2
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AddSelect/AddSelectRow.js +2 -1
  18. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +6 -7
  19. package/es/components/ButtonMenu/ButtonMenu.js +4 -0
  20. package/es/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +21 -28
  21. package/es/components/ComboButton/ComboButton.js +5 -0
  22. package/es/components/DataSpreadsheet/DataSpreadsheet.js +1 -1
  23. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +117 -10
  24. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +8 -14
  25. package/es/components/Datagrid/Datagrid/addons/stateReducer.js +111 -0
  26. package/es/components/Datagrid/Datagrid.docs-page.js +6 -0
  27. package/es/components/Datagrid/useDatagrid.js +5 -2
  28. package/es/components/Datagrid/utils/DatagridActions.js +9 -10
  29. package/es/components/NotificationsPanel/NotificationsPanel.js +3 -5
  30. package/es/components/PageHeader/PageHeaderUtils.js +10 -3
  31. package/es/components/TooltipTrigger/TooltipTrigger.js +62 -0
  32. package/es/components/TooltipTrigger/index.js +8 -0
  33. package/es/components/TooltipTrigger/useExample.js +49 -0
  34. package/es/components/UserProfileImage/UserProfileImage.js +7 -6
  35. package/es/global/js/hooks/useResizeObserver.js +7 -5
  36. package/es/global/js/utils/test-helper.js +97 -43
  37. package/es/settings.js +8 -2
  38. package/lib/components/AddSelect/AddSelectRow.js +2 -1
  39. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +5 -6
  40. package/lib/components/ButtonMenu/ButtonMenu.js +5 -1
  41. package/lib/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +20 -27
  42. package/lib/components/ComboButton/ComboButton.js +5 -0
  43. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +1 -1
  44. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +120 -10
  45. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +7 -13
  46. package/lib/components/Datagrid/Datagrid/addons/stateReducer.js +122 -0
  47. package/lib/components/Datagrid/Datagrid.docs-page.js +6 -0
  48. package/lib/components/Datagrid/useDatagrid.js +5 -2
  49. package/lib/components/Datagrid/utils/DatagridActions.js +8 -9
  50. package/lib/components/NotificationsPanel/NotificationsPanel.js +3 -5
  51. package/lib/components/PageHeader/PageHeaderUtils.js +10 -3
  52. package/lib/components/TooltipTrigger/TooltipTrigger.js +67 -0
  53. package/lib/components/TooltipTrigger/index.js +12 -0
  54. package/lib/components/TooltipTrigger/useExample.js +58 -0
  55. package/lib/components/UserProfileImage/UserProfileImage.js +6 -5
  56. package/lib/global/js/hooks/useResizeObserver.js +7 -5
  57. package/lib/global/js/utils/test-helper.js +99 -44
  58. package/lib/settings.js +8 -2
  59. package/package.json +8 -8
  60. package/scss/components/APIKeyModal/_storybook-styles.scss +1 -1
  61. package/scss/components/AboutModal/_storybook-styles.scss +1 -1
  62. package/scss/components/ActionSet/_storybook-styles.scss +1 -1
  63. package/scss/components/CreateFullPage/_storybook-styles.scss +1 -1
  64. package/scss/components/CreateModal/_storybook-styles.scss +1 -1
  65. package/scss/components/CreateSidePanel/_storybook-styles.scss +1 -1
  66. package/scss/components/CreateTearsheet/_storybook-styles.scss +1 -1
  67. package/scss/components/CreateTearsheetNarrow/_storybook-styles.scss +1 -1
  68. package/scss/components/Datagrid/_storybook-styles.scss +1 -1
  69. package/scss/components/Datagrid/styles/_datagrid.scss +65 -0
  70. package/scss/components/EditSidePanel/_storybook-styles.scss +1 -1
  71. package/scss/components/EditTearsheet/_storybook-styles.scss +1 -1
  72. package/scss/components/EditTearsheetNarrow/_storybook-styles.scss +1 -1
  73. package/scss/components/EditUpdateCards/_storybook-styles.scss +1 -1
  74. package/scss/components/ExpressiveCard/_storybook-styles.scss +1 -1
  75. package/scss/components/NotificationsPanel/_storybook-styles.scss +1 -1
  76. package/scss/components/OptionsTile/_storybook-styles.scss +1 -1
  77. package/scss/components/PageHeader/_page-header.scss +8 -4
  78. package/scss/components/Tearsheet/_storybook-styles.scss +1 -1
  79. package/scss/components/TooltipTrigger/_index-with-carbon.scss +8 -0
  80. package/scss/components/TooltipTrigger/_index.scss +8 -0
  81. package/scss/components/TooltipTrigger/_storybook-styles.scss +6 -0
  82. package/scss/components/TooltipTrigger/_tooltip-trigger.scss +29 -0
  83. package/scss/components/WebTerminal/_storybook-styles.scss +1 -1
  84. package/scss/components/_index-with-carbon.scss +1 -0
  85. package/scss/components/_index.scss +1 -0
@@ -1,19 +1,22 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
4
  /**
4
- * Copyright IBM Corp. 2020, 2022
5
+ * Copyright IBM Corp. 2020, 2023
5
6
  *
6
7
  * This source code is licensed under the Apache-2.0 license found in the
7
8
  * LICENSE file in the root directory of this source tree.
8
9
  */
9
10
 
10
11
  // @flow
11
- import React from 'react';
12
+ import React, { useState, useEffect } from 'react';
12
13
  import cx from 'classnames';
13
14
  import { TableHeader, TableRow } from '@carbon/react';
15
+ import { px } from '@carbon/layout';
14
16
  import { selectionColumnId } from '../common-column-ids';
15
17
  import { pkg } from '../../../settings';
16
18
  import getColTitle from '../utils/getColTitle';
19
+ import { handleColumnResizeEndEvent, handleColumnResizeStartEvent, handleColumnResizingEvent } from './addons/stateReducer';
17
20
  var blockClass = "".concat(pkg.prefix, "--datagrid");
18
21
  var getAccessibilityProps = function getAccessibilityProps(header) {
19
22
  var props = {};
@@ -26,15 +29,75 @@ var getAccessibilityProps = function getAccessibilityProps(header) {
26
29
  return props;
27
30
  };
28
31
  var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
32
+ // Used to measure the height of the table and uses that value
33
+ // to display a vertical line to indicate the column you are resizing
34
+ useEffect(function () {
35
+ var tableId = datagridState.tableId;
36
+ if (tableId) {
37
+ var gridElement = document.querySelector("#".concat(tableId));
38
+ var tableElement = gridElement.querySelector('table');
39
+ var headerRowElement = document.querySelector("#".concat(tableId, " .").concat(blockClass, "__head"));
40
+ var hasHorizontalScrollbar = tableElement.scrollWidth > tableElement.clientWidth;
41
+ var scrollBuffer = hasHorizontalScrollbar ? 18 : 2;
42
+ var tableToolbar = gridElement.querySelector(".".concat(blockClass, "__table-toolbar"));
43
+ var tableToolbarHeight = (tableToolbar === null || tableToolbar === void 0 ? void 0 : tableToolbar.offsetHeight) || 0;
44
+ var setCustomValues = function setCustomValues(_ref) {
45
+ var _ref$rowHeight = _ref.rowHeight,
46
+ rowHeight = _ref$rowHeight === void 0 ? 48 : _ref$rowHeight,
47
+ gridHeight = _ref.gridHeight;
48
+ headerRowElement.style.setProperty("--".concat(blockClass, "--row-height"), px(rowHeight));
49
+ headerRowElement.style.setProperty("--".concat(blockClass, "--grid-height"), px(gridHeight - scrollBuffer - tableToolbarHeight));
50
+ };
51
+ setCustomValues({
52
+ gridHeight: gridElement.offsetHeight,
53
+ rowHeight: headerRowElement.clientHeight
54
+ });
55
+ }
56
+ }, [datagridState.rowSize, datagridState.tableId, datagridState]);
57
+ var _useState = useState(2),
58
+ _useState2 = _slicedToArray(_useState, 1),
59
+ incrementAmount = _useState2[0];
60
+ var getClientXPosition = function getClientXPosition(event) {
61
+ var isTouchEvent = false;
62
+ if (event.type === 'touchstart') {
63
+ // Do not respond to multiple touches (e.g. 2 or 3 fingers)
64
+ if (event.touches && event.touches.length > 1) {
65
+ return;
66
+ }
67
+ isTouchEvent = true;
68
+ }
69
+ var clientX = isTouchEvent ? Math.round(event.touches[0].clientX) : event.clientX;
70
+ var closestHeader = event.target.closest('th');
71
+ var closestHeaderCoords = closestHeader.getBoundingClientRect();
72
+ var headerOffset = closestHeaderCoords.left;
73
+ var offsetValue = clientX - headerOffset;
74
+ return offsetValue;
75
+ };
76
+ useEffect(function () {
77
+ var isResizing = datagridState.state.isResizing;
78
+ if (isResizing) {
79
+ var onColResizeEnd = datagridState.onColResizeEnd;
80
+ document.addEventListener('mouseup', function () {
81
+ handleColumnResizeEndEvent(datagridState.dispatch, onColResizeEnd, isResizing);
82
+ document.activeElement.blur();
83
+ });
84
+ }
85
+ return function () {
86
+ document.removeEventListener('mouseup', function () {
87
+ return handleColumnResizeEndEvent(datagridState.dispatch);
88
+ });
89
+ };
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ }, [datagridState.state.isResizing]);
29
92
  return /*#__PURE__*/React.createElement(TableRow, _extends({}, headerGroup.getHeaderGroupProps({
30
93
  role: false
31
94
  }), {
32
95
  className: cx("".concat(blockClass, "__head"), headerGroup.getHeaderGroupProps().className),
33
96
  ref: headRef
34
- }), datagridState.headers.filter(function (_ref) {
35
- var isVisible = _ref.isVisible;
97
+ }), datagridState.headers.filter(function (_ref2) {
98
+ var isVisible = _ref2.isVisible;
36
99
  return isVisible;
37
- }).map(function (header) {
100
+ }).map(function (header, index) {
38
101
  var _cx;
39
102
  if (header.id === selectionColumnId) {
40
103
  // render directly without the wrapper TableHeader
@@ -42,13 +105,57 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
42
105
  key: header.id
43
106
  });
44
107
  }
45
- return /*#__PURE__*/React.createElement(TableHeader, _extends({}, header.getHeaderProps({
46
- role: false
47
- }), {
108
+ var _ref3 = header || 50,
109
+ minWidth = _ref3.minWidth;
110
+ var visibleColumns = datagridState.visibleColumns,
111
+ state = datagridState.state,
112
+ dispatch = datagridState.dispatch,
113
+ onColResizeEnd = datagridState.onColResizeEnd;
114
+ var columnResizing = state.columnResizing,
115
+ isResizing = state.isResizing;
116
+ var columnWidths = columnResizing.columnWidths;
117
+ var originalCol = visibleColumns[index];
118
+ return /*#__PURE__*/React.createElement(TableHeader, _extends({}, header.getHeaderProps(), {
48
119
  className: cx((_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__resizableColumn"), header.getResizerProps), _defineProperty(_cx, "".concat(blockClass, "__isResizing"), header.isResizing), _defineProperty(_cx, "".concat(blockClass, "__sortableColumn"), datagridState.isTableSortable), _defineProperty(_cx, "".concat(blockClass, "__isSorted"), header.isSorted), _cx), header.getHeaderProps().className),
49
120
  key: header.id
50
- }, getAccessibilityProps(header)), header.render('Header'), header.getResizerProps && /*#__PURE__*/React.createElement("div", _extends({}, header.getResizerProps(), {
51
- className: "".concat(blockClass, "__resizer")
121
+ }, getAccessibilityProps(header)), header.render('Header'), header.getResizerProps && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("input", _extends({}, header.getResizerProps(), {
122
+ onMouseMove: function onMouseMove(event) {
123
+ if (isResizing) {
124
+ var newWidth = getClientXPosition(event);
125
+ // Sets a min width for resizing so at least one character from the column header is visible
126
+ if (newWidth >= 50) {
127
+ handleColumnResizingEvent(dispatch, header, newWidth);
128
+ }
129
+ }
130
+ },
131
+ onMouseDown: function onMouseDown() {
132
+ return handleColumnResizeStartEvent(dispatch, header.id);
133
+ },
134
+ onKeyDown: function onKeyDown(event) {
135
+ var key = event.key;
136
+ if (key === 'ArrowLeft' || key === 'ArrowRight') {
137
+ var currentColumnWidth = columnWidths[header.id] || (datagridState.isTableSortable && originalCol.width < 90 ? 90 : originalCol.width);
138
+ if (key === 'ArrowLeft') {
139
+ if (currentColumnWidth - incrementAmount > Math.max(minWidth, 50)) {
140
+ var newWidth = currentColumnWidth - incrementAmount;
141
+ handleColumnResizingEvent(dispatch, header, newWidth, true);
142
+ }
143
+ }
144
+ if (key === 'ArrowRight') {
145
+ var _newWidth = currentColumnWidth + incrementAmount;
146
+ handleColumnResizingEvent(dispatch, header, _newWidth, true);
147
+ }
148
+ }
149
+ },
150
+ onKeyUp: function onKeyUp() {
151
+ return handleColumnResizeEndEvent(dispatch, onColResizeEnd, header.id);
152
+ },
153
+ className: cx("".concat(blockClass, "__col-resizer-range")),
154
+ type: "range",
155
+ defaultValue: originalCol.width,
156
+ "aria-label": "Resize column"
157
+ })), /*#__PURE__*/React.createElement("span", {
158
+ className: "".concat(blockClass, "__col-resize-indicator")
52
159
  })));
53
160
  }));
54
161
  };
@@ -8,10 +8,8 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
8
8
  */
9
9
 
10
10
  import React, { useEffect, useRef, useState } from 'react';
11
- import { Add, OverflowMenuVertical } from '@carbon/react/icons';
12
- import { TableToolbar, TableBatchActions, TableBatchAction } from '@carbon/react';
11
+ import { TableToolbar, TableBatchActions, TableBatchAction, MenuButton, MenuItem } from '@carbon/react';
13
12
  import { useResizeObserver } from '../../../global/js/hooks/useResizeObserver';
14
- import { ButtonMenu, ButtonMenuItem } from '../../ButtonMenu';
15
13
  import { pkg, carbon } from '../../../settings';
16
14
  import cx from 'classnames';
17
15
  var blockClass = "".concat(pkg.prefix, "--datagrid");
@@ -76,19 +74,15 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
76
74
  if ((toolbarBatchActions === null || toolbarBatchActions === void 0 ? void 0 : toolbarBatchActions.length) <= 3 && !displayAllInMenu) {
77
75
  return null;
78
76
  }
79
- return /*#__PURE__*/React.createElement(ButtonMenu, {
80
- label: width > minWidthBeforeOverflowIcon ? 'More' : null,
81
- renderIcon: width > minWidthBeforeOverflowIcon ? Add : OverflowMenuVertical,
82
- className: cx("".concat(blockClass, "__button-menu"), _defineProperty({}, "".concat(blockClass, "__button-menu--icon-only"), width <= minWidthBeforeOverflowIcon)),
83
- menuOptionsClass: "".concat(blockClass, "__button-menu-options"),
84
- flipped: true,
85
- menuAriaLabel: 'Batch actions'
77
+ return /*#__PURE__*/React.createElement(MenuButton, {
78
+ label: "More",
79
+ className: cx("".concat(blockClass, "__button-menu"), _defineProperty({}, "".concat(blockClass, "__button-menu--icon-only"), width <= minWidthBeforeOverflowIcon))
86
80
  }, toolbarBatchActions && toolbarBatchActions.map(function (batchAction, index) {
87
81
  if (index < 2) {
88
82
  if (displayAllInMenu) {
89
- return /*#__PURE__*/React.createElement(ButtonMenuItem, {
83
+ return /*#__PURE__*/React.createElement(MenuItem, {
90
84
  key: "".concat(batchAction.label, "-").concat(index),
91
- itemText: batchAction.label,
85
+ label: batchAction.label,
92
86
  onClick: function onClick(event) {
93
87
  batchAction.onClick(getSelectedRowData(), event);
94
88
  if (batchAction.type === 'select_all') {
@@ -99,9 +93,9 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
99
93
  }
100
94
  return null;
101
95
  }
102
- return /*#__PURE__*/React.createElement(ButtonMenuItem, {
96
+ return /*#__PURE__*/React.createElement(MenuItem, {
103
97
  key: "".concat(batchAction.label, "-").concat(index),
104
- itemText: batchAction.label,
98
+ label: batchAction.label,
105
99
  onClick: function onClick(event) {
106
100
  batchAction.onClick(getSelectedRowData(), event);
107
101
  if (batchAction.type === 'select_all') {
@@ -0,0 +1,111 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
+ /**
6
+ * Copyright IBM Corp. 2023, 2023
7
+ *
8
+ * This source code is licensed under the Apache-2.0 license found in the
9
+ * LICENSE file in the root directory of this source tree.
10
+ */
11
+
12
+ var COLUMN_RESIZE_START = 'columnStartResizing';
13
+ var COLUMN_RESIZING = 'columnResizing';
14
+ var COLUMN_RESIZE_END = 'columnDoneResizing';
15
+ var INIT = 'init';
16
+ export var handleColumnResizeStartEvent = function handleColumnResizeStartEvent(dispatch, headerId) {
17
+ dispatch({
18
+ type: COLUMN_RESIZE_START,
19
+ payload: {
20
+ headerId: headerId
21
+ }
22
+ });
23
+ };
24
+ export var handleColumnResizeEndEvent = function handleColumnResizeEndEvent(dispatch, onColResizeEnd, headerId) {
25
+ dispatch({
26
+ type: COLUMN_RESIZE_END,
27
+ payload: {
28
+ onColResizeEnd: onColResizeEnd,
29
+ headerId: headerId
30
+ }
31
+ });
32
+ };
33
+ export var handleColumnResizingEvent = function handleColumnResizingEvent(dispatch, header, newWidth, isKeyEvent) {
34
+ if (isKeyEvent) {
35
+ dispatch({
36
+ type: COLUMN_RESIZE_START,
37
+ payload: {
38
+ newWidth: newWidth,
39
+ headerId: header.id,
40
+ defaultWidth: header.originalWidth
41
+ }
42
+ });
43
+ }
44
+ dispatch({
45
+ type: COLUMN_RESIZING,
46
+ payload: {
47
+ newWidth: newWidth,
48
+ headerId: header.id,
49
+ defaultWidth: header.originalWidth
50
+ }
51
+ });
52
+ };
53
+ export var stateReducer = function stateReducer(newState, action) {
54
+ switch (action.type) {
55
+ case INIT:
56
+ {
57
+ return _objectSpread(_objectSpread({}, newState), {}, {
58
+ isResizing: false
59
+ });
60
+ }
61
+ case COLUMN_RESIZE_START:
62
+ {
63
+ var headerId = action.payload.headerId;
64
+ return _objectSpread(_objectSpread({}, newState), {}, {
65
+ isResizing: headerId
66
+ });
67
+ }
68
+ case COLUMN_RESIZING:
69
+ {
70
+ var _ref = action.payload || {},
71
+ _headerId = _ref.headerId,
72
+ newWidth = _ref.newWidth,
73
+ defaultWidth = _ref.defaultWidth;
74
+ var newColumnWidth = {};
75
+ if (typeof _headerId === 'undefined') {
76
+ return _objectSpread({}, newState);
77
+ }
78
+ newColumnWidth[_headerId] = newWidth;
79
+ var cleanedWidths = Object.fromEntries(Object.entries(newState.columnResizing.columnWidths).filter(function (_ref2) {
80
+ var _ref3 = _slicedToArray(_ref2, 2),
81
+ _ = _ref3[0],
82
+ value = _ref3[1];
83
+ return !isNaN(value);
84
+ }));
85
+ return _objectSpread(_objectSpread({}, newState), {}, {
86
+ isResizing: _headerId,
87
+ columnResizing: _objectSpread(_objectSpread({}, newState.columnResizing), {}, {
88
+ columnWidth: defaultWidth,
89
+ columnWidths: _objectSpread(_objectSpread({}, cleanedWidths), newColumnWidth),
90
+ headerIdWidths: [_headerId, newWidth]
91
+ })
92
+ });
93
+ }
94
+ case COLUMN_RESIZE_END:
95
+ {
96
+ var _action$payload = action.payload,
97
+ onColResizeEnd = _action$payload.onColResizeEnd,
98
+ _headerId2 = _action$payload.headerId;
99
+ var currentColumn = {};
100
+ currentColumn[_headerId2] = newState.columnResizing.columnWidths[_headerId2];
101
+ var allChangedColumns = newState.columnResizing.columnWidths;
102
+ var isResizing = newState.isResizing;
103
+ if (isResizing) {
104
+ onColResizeEnd === null || onColResizeEnd === void 0 ? void 0 : onColResizeEnd(currentColumn, allChangedColumns);
105
+ }
106
+ return _objectSpread(_objectSpread({}, newState), {}, {
107
+ isResizing: false
108
+ });
109
+ }
110
+ }
111
+ };
@@ -41,6 +41,12 @@ export var DocsPage = function DocsPage() {
41
41
  language: 'jsx',
42
42
  code: "\n const columns = [\n {\n Header: 'First Name',\n accessor: 'firstName',\n },\n {\n Header: 'Last Name',\n accessor: 'lastName',\n Cell: ({ cell: { value } }) => (\n <span className=\"custom-cell-wrapper\">{value}</span>\n ),\n },\n];\n "
43
43
  }
44
+ }, {
45
+ description: "There is also an optional resize callback when resizing columns, allowing you to save the widths of columns that have been resized. The resize callback returns the column that was just resized and it's width, in addition to all of the columns that have been resized and their widths.",
46
+ source: {
47
+ language: 'jsx',
48
+ code: "\nuseDatagrid({\n columns,\n data,\n onColResizeEnd: (currentColumn, allColumns) =>\n console.log(currentColumn, allColumns),\n});\n "
49
+ }
44
50
  }, {
45
51
  title: 'Rendering the table toolbar',
46
52
  image: /*#__PURE__*/React.createElement("img", {
@@ -19,6 +19,7 @@ import useRowSize from './useRowSize';
19
19
  import useHeaderRow from './Datagrid/DatagridHeaderRow';
20
20
  import useFlexResize from './useFlexResize';
21
21
  import useFloatingScroll from './useFloatingScroll';
22
+ import { stateReducer } from './Datagrid/addons/stateReducer';
22
23
  var useDatagrid = function useDatagrid(params) {
23
24
  var defaultPlugins = [useFlexLayout, useHeaderRow, useSkeletonRows, useResizeColumns, useRowRenderer, useDefaultStringRenderer, useRowSize, useFilters, useGlobalFilter, useSortBy, useExpanded];
24
25
  var defaultEndPlugins = [usePagination, useRowSelect, useFlexResize, useFloatingScroll];
@@ -29,9 +30,11 @@ var useDatagrid = function useDatagrid(params) {
29
30
  for (var _len = arguments.length, plugins = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
30
31
  plugins[_key - 1] = arguments[_key];
31
32
  }
32
- var tableState = useTable.apply(void 0, [_objectSpread({
33
+ var tableState = useTable.apply(void 0, [_objectSpread(_objectSpread({
33
34
  tableId: tableId
34
- }, params)].concat(defaultPlugins, plugins, defaultEndPlugins, _toConsumableArray(clientEndPlugins)));
35
+ }, params), {}, {
36
+ stateReducer: stateReducer
37
+ })].concat(defaultPlugins, plugins, defaultEndPlugins, _toConsumableArray(clientEndPlugins)));
35
38
  return tableState;
36
39
  };
37
40
  export default useDatagrid;
@@ -7,8 +7,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
7
7
  */
8
8
 
9
9
  import { Add, ChevronDown, Download, Filter, Restart } from '@carbon/react/icons';
10
- import { Button, ComposedModal, Dropdown, IconButton, ModalBody, ModalFooter, ModalHeader, OverflowMenu, OverflowMenuItem, TableToolbarContent, TableToolbarSearch } from '@carbon/react';
11
- import { ButtonMenu, ButtonMenuItem } from '../../ButtonMenu';
10
+ import { Button, ComposedModal, Dropdown, IconButton, ModalBody, ModalFooter, ModalHeader, OverflowMenu, OverflowMenuItem, TableToolbarContent, TableToolbarSearch, MenuButton, MenuItem } from '@carbon/react';
12
11
  import React, { useLayoutEffect, useState } from 'react';
13
12
  import { action } from '@storybook/addon-actions';
14
13
  import { pkg } from '../../../settings';
@@ -151,18 +150,18 @@ export var DatagridActions = function DatagridActions(datagridState) {
151
150
  onClick: downloadCsv
152
151
  })), CustomizeColumnsButton && /*#__PURE__*/React.createElement("div", {
153
152
  style: style
154
- }, /*#__PURE__*/React.createElement(CustomizeColumnsButton, null)), /*#__PURE__*/React.createElement(RowSizeDropdown, rowSizeDropdownProps), /*#__PURE__*/React.createElement(ButtonMenu, {
153
+ }, /*#__PURE__*/React.createElement(CustomizeColumnsButton, null)), /*#__PURE__*/React.createElement(RowSizeDropdown, rowSizeDropdownProps), /*#__PURE__*/React.createElement(MenuButton, {
155
154
  label: "Primary button",
156
155
  renderIcon: ChevronDown,
157
- menuOptionsClass: "".concat(blockClass, "__toolbar-options")
158
- }, /*#__PURE__*/React.createElement(ButtonMenuItem, {
159
- itemText: "Option 1",
156
+ className: "".concat(blockClass, "__toolbar-options")
157
+ }, /*#__PURE__*/React.createElement(MenuItem, {
158
+ label: "Option 1",
160
159
  onClick: action("Click on ButtonMenu Option 1")
161
- }), /*#__PURE__*/React.createElement(ButtonMenuItem, {
162
- itemText: "Option 2",
160
+ }), /*#__PURE__*/React.createElement(MenuItem, {
161
+ label: "Option 2",
163
162
  onClick: action("Click on ButtonMenu Option 2")
164
- }), /*#__PURE__*/React.createElement(ButtonMenuItem, {
165
- itemText: "Option 3",
163
+ }), /*#__PURE__*/React.createElement(MenuItem, {
164
+ label: "Option 3",
166
165
  onClick: action("Click on ButtonMenu Option 3")
167
166
  }))) : /*#__PURE__*/React.createElement(TableToolbarContent, null, renderFilterPanelButton(), /*#__PURE__*/React.createElement(TableToolbarSearch, {
168
167
  size: "xl",
@@ -20,6 +20,7 @@ import { getDevtoolsProps } from '../../global/js/utils/devtools';
20
20
  import { useClickOutside } from '../../global/js/hooks';
21
21
  import { pkg } from '../../settings';
22
22
  import { timeAgo } from './utils';
23
+ import { prepareProps } from '../../global/js/utils/props-helper';
23
24
  import { NotificationsEmptyState } from '../EmptyStates/NotificationsEmptyState';
24
25
 
25
26
  // Carbon and package components we use.
@@ -300,7 +301,7 @@ export var NotificationsPanel = /*#__PURE__*/React.forwardRef(function (_ref, re
300
301
  }, notification.title), notification.description && notification.description.length && renderDescription(notification.id), notification.link && notification.link.text && notification.link.url && /*#__PURE__*/React.createElement(Link, _extends({
301
302
  href: notification.link.url,
302
303
  className: "".concat(blockClass, "__notifications-link")
303
- }, notification.link.optional), notification.link.text)), /*#__PURE__*/React.createElement(IconButton, {
304
+ }, prepareProps({}, notification.link, ['text', 'url'])), notification.link.text)), /*#__PURE__*/React.createElement(IconButton, {
304
305
  align: "left",
305
306
  kind: "ghost",
306
307
  size: "sm",
@@ -420,10 +421,7 @@ NotificationsPanel.propTypes = {
420
421
  description: PropTypes.string,
421
422
  link: PropTypes.shape({
422
423
  url: PropTypes.string,
423
- text: PropTypes.string,
424
- optional: PropTypes.shape({
425
- // Add optional props here
426
- })
424
+ text: PropTypes.string
427
425
  }),
428
426
  unread: PropTypes.bool,
429
427
  onNotificationClick: PropTypes.func
@@ -2,7 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
3
3
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
4
  /**
5
- * Copyright IBM Corp. 2020, 2021
5
+ * Copyright IBM Corp. 2020, 2023
6
6
  *
7
7
  * This source code is licensed under the Apache-2.0 license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -65,11 +65,14 @@ export var utilCheckUpdateVerticalSpace = function utilCheckUpdateVerticalSpace(
65
65
  var scrollableContainer = scrollableAncestor(headerRef.current);
66
66
 
67
67
  /* istanbul ignore next */
68
- var scrollableContainerTop = scrollableContainer ? scrollableContainer.scrollTop - scrollableContainer.getBoundingClientRect().top : 0;
68
+ var scrollableContainerTop = scrollableContainer ? scrollableContainer.getBoundingClientRect().top : 0;
69
+
70
+ /* istanbul ignore next */
71
+ var offsetMeasuringTop = offsetTopMeasuringRef.current ? offsetTopMeasuringRef.current.getBoundingClientRect().top : 0;
69
72
 
70
73
  // The header offset calculation is either going to work out at 0 if we have no gap between scrolling container
71
74
  // top and the measuring ref top, or the difference between. It does not change on scroll or resize.
72
- update.headerOffset = (offsetTopMeasuringRef.current ? offsetTopMeasuringRef.current.getBoundingClientRect().top : 0) + scrollableContainerTop;
75
+ update.headerOffset = offsetMeasuringTop - scrollableContainerTop;
73
76
 
74
77
  /* istanbul ignore next */
75
78
  update.breadcrumbRowHeight = breadcrumbRowEl ? breadcrumbRowEl.clientHeight : 0;
@@ -127,6 +130,10 @@ export var utilCheckUpdateVerticalSpace = function utilCheckUpdateVerticalSpace(
127
130
  update.pageActionsSpaceAbove = titleRowEl.clientHeight - pageActionsEl.clientHeight + update.titleRowSpaceAbove - (isNaN(val) ? 0 : val);
128
131
  }
129
132
  }
133
+ if (!hasActionBar && pageActionsEl) {
134
+ // adjust headerTopValue when there are no page actions or action bar items (margin above title row)
135
+ update.headerTopValue -= update.titleRowSpaceAbove;
136
+ }
130
137
  return _objectSpread(_objectSpread({}, previous), update);
131
138
  });
132
139
  };
@@ -0,0 +1,62 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["children", "className"];
4
+ /**
5
+ * Copyright IBM Corp. 2023, 2023
6
+ *
7
+ * This source code is licensed under the Apache-2.0 license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+
11
+ // Import portions of React that are needed.
12
+ import React from 'react';
13
+
14
+ // Other standard imports.
15
+ import PropTypes from 'prop-types';
16
+ import cx from 'classnames';
17
+ import { pkg } from '../../settings';
18
+
19
+ // The block part of our conventional BEM class names (blockClass__E--M).
20
+ var blockClass = "".concat(pkg.prefix, "--tooltip-trigger");
21
+ var componentName = 'TooltipTrigger';
22
+
23
+ // NOTE: the component SCSS is not imported here: it is rolled up separately.
24
+
25
+ /**
26
+ * This is an tooltip trigger as Carbon Tooltip requires an active element to work but provides
27
+ * no blanked button.
28
+ */
29
+ export var TooltipTrigger = function TooltipTrigger(_ref) {
30
+ var children = _ref.children,
31
+ className = _ref.className,
32
+ rest = _objectWithoutProperties(_ref, _excluded);
33
+ return /*#__PURE__*/React.createElement("button", _extends({
34
+ type: "button"
35
+ }, rest, {
36
+ className: cx(blockClass,
37
+ // Apply the block class to the main HTML element
38
+ className // Apply any supplied class names to the main HTML element.
39
+ )
40
+ }), children);
41
+ };
42
+
43
+ // Return a placeholder if not released and not enabled by feature flag.
44
+ TooltipTrigger = pkg.checkComponentEnabled(TooltipTrigger, componentName);
45
+
46
+ // The display name of the component, used by React. Note that displayName
47
+ // is used in preference to relying on function.name.
48
+ TooltipTrigger.displayName = componentName;
49
+
50
+ // The types and DocGen commentary for the component props,
51
+ // in alphabetical order (for consistency).
52
+ // See https://www.npmjs.com/package/prop-types#usage.
53
+ TooltipTrigger.propTypes = {
54
+ /**
55
+ * Child content of tooltip trigger
56
+ */
57
+ children: PropTypes.node,
58
+ /**
59
+ * Provide an optional class to be applied to the containing node.
60
+ */
61
+ className: PropTypes.string
62
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright IBM Corp. 2023, 2023
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ export { TooltipTrigger } from './TooltipTrigger';
@@ -0,0 +1,49 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ /**
3
+ * Copyright IBM Corp. 2023, 2023
4
+ *
5
+ * This source code is licensed under the Apache-2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { useState, useEffect } from 'react';
9
+ import { pkg } from '../../settings';
10
+ var useExample = function useExample(initialTime) {
11
+ // NOTE: hooks cannot be called conditionally.
12
+ //
13
+ // ** If the hook uses other hooks then they must be called,
14
+ // ** this could lead to unexpected behavior.
15
+ // ** As some hooks may still be called even if the condition is false.
16
+
17
+ var _useState = useState(
18
+ // Disable hook in a safe way if possible, else use despite feature disabled.
19
+ // Either a console error or warning will be logged.
20
+ initialTime),
21
+ _useState2 = _slicedToArray(_useState, 2),
22
+ time = _useState2[0],
23
+ setTime = _useState2[1];
24
+
25
+ // Use of the feature flag to
26
+ var feature = 'ExampleComponent.useExample';
27
+ var tryFeature = initialTime !== undefined;
28
+ var featureEnabled = tryFeature && pkg.checkReportFeatureEnabled(feature);
29
+ if (tryFeature && !featureEnabled) {
30
+ // Output a useful message if the feature is disabled.
31
+ console.warn("Disabled feature \"".concat(feature, "\" does not change the initialTime."));
32
+ }
33
+
34
+ // Actual hook is code is below
35
+ useEffect(function () {
36
+ if (!featureEnabled) {
37
+ return;
38
+ }
39
+
40
+ // turn off all or part of the feature
41
+ if (time > 0) {
42
+ setTimeout(function () {
43
+ setTime(Math.max(0, time - 0.1));
44
+ }, 100);
45
+ }
46
+ }, [featureEnabled, time]);
47
+ return [time];
48
+ };
49
+ export default useExample;
@@ -20,7 +20,8 @@ import { pkg } from '../../settings';
20
20
 
21
21
  // Carbon and package components we use.
22
22
  import { User, Group } from '@carbon/react/icons';
23
- import { IconButton } from '@carbon/react';
23
+ import { Tooltip, usePrefix } from '@carbon/react';
24
+ import { TooltipTrigger } from '../TooltipTrigger';
24
25
 
25
26
  // The block part of our conventional BEM class names (blockClass__E--M).
26
27
  var blockClass = "".concat(pkg.prefix, "--user-profile-image");
@@ -49,6 +50,7 @@ export var UserProfileImage = /*#__PURE__*/React.forwardRef(function (_ref, ref)
49
50
  _ref$tooltipAlignment = _ref.tooltipAlignment,
50
51
  tooltipAlignment = _ref$tooltipAlignment === void 0 ? defaults.tooltipAlignment : _ref$tooltipAlignment,
51
52
  rest = _objectWithoutProperties(_ref, _excluded);
53
+ var carbonPrefix = usePrefix();
52
54
  var icons = {
53
55
  user: {
54
56
  md: function md(props) {
@@ -124,12 +126,11 @@ export var UserProfileImage = /*#__PURE__*/React.forwardRef(function (_ref, ref)
124
126
  className: cx([blockClass, className, "".concat(blockClass, "--").concat(size), "".concat(blockClass, "--").concat(theme), "".concat(blockClass, "--").concat(backgroundColor || getRandomColor())])
125
127
  }, getDevtoolsProps(componentName)), /*#__PURE__*/React.createElement(FillItem, null));
126
128
  };
127
- return FillItem && (tooltipText ? /*#__PURE__*/React.createElement(IconButton, {
129
+ return FillItem && (tooltipText ? /*#__PURE__*/React.createElement(Tooltip, {
130
+ align: tooltipAlignment,
128
131
  label: tooltipText,
129
- className: "".concat(blockClass, "__tooltip"),
130
- kind: "ghost",
131
- align: tooltipAlignment
132
- }, renderUserProfileImage()) : renderUserProfileImage());
132
+ className: "".concat(blockClass, "__tooltip ").concat(carbonPrefix, "--icon-tooltip")
133
+ }, /*#__PURE__*/React.createElement(TooltipTrigger, null, renderUserProfileImage())) : renderUserProfileImage());
133
134
  });
134
135
 
135
136
  // Return a placeholder if not released and not enabled by feature flag