@carbon/ibm-products 2.41.1-canary.5 → 2.41.1-canary.8

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 (52) hide show
  1. package/css/index-full-carbon.css +6 -0
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +1 -1
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +6 -0
  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 +6 -0
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +1 -1
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +6 -0
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +1 -1
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/Datagrid/Datagrid/DatagridContent.js +21 -1
  18. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/TearsheetWrapper.js +12 -2
  19. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.d.ts +3 -3
  20. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.js +5 -5
  21. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.d.ts +3 -1
  22. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +12 -3
  23. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditContext/InlineEditContext.js +7 -0
  24. package/es/components/Datagrid/useCustomizeColumns.js +0 -4
  25. package/es/components/Datagrid/useEditableCell.js +1 -1
  26. package/es/components/Datagrid/useInlineEdit.d.ts +1 -1
  27. package/es/components/Datagrid/useInlineEdit.js +9 -16
  28. package/es/components/FeatureFlags/index.d.ts +37 -0
  29. package/es/components/FeatureFlags/index.js +151 -0
  30. package/es/components/index.d.ts +1 -0
  31. package/es/feature-flags.d.ts +1 -0
  32. package/es/global/js/hooks/usePortalTarget.js +4 -2
  33. package/es/index.js +1 -0
  34. package/lib/components/Datagrid/Datagrid/DatagridContent.js +49 -29
  35. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/TearsheetWrapper.js +13 -19
  36. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.d.ts +3 -3
  37. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditButton/InlineEditButton.js +5 -5
  38. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.d.ts +3 -1
  39. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +12 -3
  40. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditContext/InlineEditContext.js +7 -0
  41. package/lib/components/Datagrid/useCustomizeColumns.js +0 -4
  42. package/lib/components/Datagrid/useEditableCell.js +1 -1
  43. package/lib/components/Datagrid/useInlineEdit.d.ts +1 -1
  44. package/lib/components/Datagrid/useInlineEdit.js +8 -15
  45. package/lib/components/FeatureFlags/index.d.ts +37 -0
  46. package/lib/components/FeatureFlags/index.js +162 -0
  47. package/lib/components/index.d.ts +1 -0
  48. package/lib/feature-flags.d.ts +1 -0
  49. package/lib/global/js/hooks/usePortalTarget.js +4 -2
  50. package/lib/index.js +4 -0
  51. package/package.json +8 -4
  52. package/scss/components/Datagrid/styles/_useInlineEdit.scss +6 -0
@@ -1,9 +1,9 @@
1
- export function InlineEditButton({ label, renderIcon: Icon, disabled, labelIcon: LabelIcon, placeholder, nonEditCell, isActiveCell, columnConfig, type, }: {
1
+ export function InlineEditButton({ label, renderIcon: Icon, labelIcon: LabelIcon, placeholder, disabledCell, nonEditCell, isActiveCell, columnConfig, type, }: {
2
2
  label: any;
3
3
  renderIcon: any;
4
- disabled: any;
5
4
  labelIcon: any;
6
5
  placeholder: any;
6
+ disabledCell: any;
7
7
  nonEditCell: any;
8
8
  isActiveCell: any;
9
9
  columnConfig: any;
@@ -12,7 +12,7 @@ export function InlineEditButton({ label, renderIcon: Icon, disabled, labelIcon:
12
12
  export namespace InlineEditButton {
13
13
  namespace propTypes {
14
14
  let columnConfig: PropTypes.Requireable<object>;
15
- let disabled: PropTypes.Requireable<boolean>;
15
+ let disabledCell: PropTypes.Requireable<boolean>;
16
16
  let isActiveCell: PropTypes.Requireable<boolean>;
17
17
  let label: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
18
18
  let labelIcon: PropTypes.Requireable<object>;
@@ -15,18 +15,18 @@ var blockClass = "".concat(pkg.prefix, "--datagrid");
15
15
  var InlineEditButton = function InlineEditButton(_ref) {
16
16
  var label = _ref.label,
17
17
  Icon = _ref.renderIcon,
18
- disabled = _ref.disabled,
19
18
  LabelIcon = _ref.labelIcon,
20
19
  placeholder = _ref.placeholder,
20
+ disabledCell = _ref.disabledCell,
21
21
  nonEditCell = _ref.nonEditCell,
22
22
  isActiveCell = _ref.isActiveCell,
23
23
  columnConfig = _ref.columnConfig,
24
24
  type = _ref.type;
25
25
  return /*#__PURE__*/React__default.createElement("div", {
26
- className: cx("".concat(blockClass, "__inline-edit-button"), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(blockClass, "__inline-edit-button--disabled"), disabled || nonEditCell), "".concat(blockClass, "__inline-edit-button--with-label-icon"), LabelIcon), "".concat(blockClass, "__inline-edit-button--non-edit"), nonEditCell), "".concat(blockClass, "__inline-edit-button--active"), isActiveCell), "".concat(blockClass, "__inline-edit-button--").concat(type), type === 'date' || type === 'selection')),
26
+ className: cx("".concat(blockClass, "__inline-edit-button"), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(blockClass, "__inline-edit-button--disabled"), disabledCell), "".concat(blockClass, "__inline-edit-button--with-label-icon"), LabelIcon), "".concat(blockClass, "__inline-edit-button--non-edit"), nonEditCell), "".concat(blockClass, "__inline-edit-button--active"), isActiveCell), "".concat(blockClass, "__inline-edit-button--").concat(type), type === 'date' || type === 'selection')),
27
27
  tabIndex: isActiveCell ? 0 : -1,
28
- "data-disabled": disabled || nonEditCell,
29
- "aria-disabled": disabled || nonEditCell,
28
+ "data-disabled": disabledCell,
29
+ "aria-disabled": disabledCell,
30
30
  role: "button",
31
31
  title: label
32
32
  }, LabelIcon && /*#__PURE__*/React__default.createElement("div", {
@@ -41,7 +41,7 @@ var InlineEditButton = function InlineEditButton(_ref) {
41
41
  };
42
42
  InlineEditButton.propTypes = {
43
43
  columnConfig: PropTypes.object,
44
- disabled: PropTypes.bool,
44
+ disabledCell: PropTypes.bool,
45
45
  isActiveCell: PropTypes.bool,
46
46
  label: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
47
47
  labelIcon: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
@@ -1,6 +1,7 @@
1
- export function InlineEditCell({ cell, config, instance, placeholder, tabIndex, value, nonEditCell, type, }: {
1
+ export function InlineEditCell({ cell, config, disabledCell, instance, placeholder, tabIndex, value, nonEditCell, type, }: {
2
2
  cell: any;
3
3
  config: any;
4
+ disabledCell?: boolean | undefined;
4
5
  instance: any;
5
6
  placeholder?: string | undefined;
6
7
  tabIndex: any;
@@ -12,6 +13,7 @@ export namespace InlineEditCell {
12
13
  namespace propTypes {
13
14
  let cell: PropTypes.Requireable<object>;
14
15
  let config: PropTypes.Requireable<object>;
16
+ let disabledCell: PropTypes.Requireable<boolean>;
15
17
  let instance: PropTypes.Requireable<PropTypes.InferProps<{
16
18
  columns: PropTypes.Requireable<(object | null | undefined)[]>;
17
19
  onDataUpdate: PropTypes.Requireable<(...args: any[]) => any>;
@@ -22,6 +22,8 @@ var InlineEditCell = function InlineEditCell(_ref) {
22
22
  var _config$validator, _value$text;
23
23
  var cell = _ref.cell,
24
24
  config = _ref.config,
25
+ _ref$disabledCell = _ref.disabledCell,
26
+ disabledCell = _ref$disabledCell === void 0 ? false : _ref$disabledCell,
25
27
  instance = _ref.instance,
26
28
  _ref$placeholder = _ref.placeholder,
27
29
  placeholder = _ref$placeholder === void 0 ? '' : _ref$placeholder,
@@ -319,6 +321,11 @@ var InlineEditCell = function InlineEditCell(_ref) {
319
321
  return Calendar;
320
322
  }
321
323
  };
324
+ var renderRegularCell = function renderRegularCell() {
325
+ return /*#__PURE__*/React__default.createElement("span", _extends({}, inputProps, {
326
+ id: cellId
327
+ }));
328
+ };
322
329
  var renderDateCell = function renderDateCell() {
323
330
  var _config$inputProps, _outerButtonElement$c;
324
331
  var datePickerPreparedProps = prepareProps(config.inputProps, ['datePickerInputProps']);
@@ -434,15 +441,16 @@ var InlineEditCell = function InlineEditCell(_ref) {
434
441
  "data-cell-id": cellId,
435
442
  "data-column-index": columnIndex,
436
443
  "data-row-index": cell.row.index,
437
- "data-disabled": nonEditCell,
444
+ "data-disabled": disabledCell,
438
445
  "data-inline-type": type,
439
446
  onClick: !nonEditCell ? handleInlineCellClick : addActiveState,
440
447
  onKeyDown: !nonEditCell ? handleKeyDown : null,
441
- className: cx("".concat(blockClass, "__inline-edit--outer-cell-button"), _defineProperty(_defineProperty(_defineProperty({}, "".concat(blockClass, "__inline-edit--outer-cell-button--").concat(rowSize), rowSize), "".concat(blockClass, "__inline-edit--outer-cell-button--lg"), !rowSize), "".concat(blockClass, "__inline-edit--outer-cell-button--invalid"), config === null || config === void 0 || (_config$validator = config.validator) === null || _config$validator === void 0 ? void 0 : _config$validator.call(config, cellValue)))
442
- }, !inEditMode && /*#__PURE__*/React__default.createElement(InlineEditButton, {
448
+ className: cx("".concat(blockClass, "__inline-edit--outer-cell-button"), _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(blockClass, "__inline-edit--outer-cell-button--").concat(rowSize), rowSize), "".concat(blockClass, "__inline-edit--outer-cell-button--lg"), !rowSize), "".concat(blockClass, "__inline-edit--outer-cell-button--invalid"), config === null || config === void 0 || (_config$validator = config.validator) === null || _config$validator === void 0 ? void 0 : _config$validator.call(config, cellValue)), "".concat(blockClass, "__static--outer-cell"), !disabledCell))
449
+ }, !nonEditCell && !disabledCell && renderRegularCell(), (!inEditMode || disabledCell) && /*#__PURE__*/React__default.createElement(InlineEditButton, {
443
450
  isActiveCell: cellId === activeCellId,
444
451
  renderIcon: setRenderIcon(),
445
452
  label: type === 'selection' ? (_value$text = value === null || value === void 0 ? void 0 : value.text) !== null && _value$text !== void 0 ? _value$text : value : type === 'date' ? buildDate(value) : value,
453
+ disabledCell: disabledCell,
446
454
  labelIcon: (value === null || value === void 0 ? void 0 : value.icon) || null,
447
455
  placeholder: placeholder,
448
456
  tabIndex: tabIndex,
@@ -455,6 +463,7 @@ var InlineEditCell = function InlineEditCell(_ref) {
455
463
  InlineEditCell.propTypes = {
456
464
  cell: PropTypes.object,
457
465
  config: PropTypes.object,
466
+ disabledCell: PropTypes.bool,
458
467
  instance: PropTypes.shape({
459
468
  columns: PropTypes.arrayOf(PropTypes.object),
460
469
  onDataUpdate: PropTypes.func,
@@ -73,6 +73,13 @@ var inlineEditReducer = function inlineEditReducer(state, action) {
73
73
  }
74
74
  break;
75
75
  }
76
+ case 'SET_FEATURE_FLAGS':
77
+ {
78
+ var _action$payload2;
79
+ return _objectSpread2(_objectSpread2({}, state), {}, {
80
+ featureFlags: (_action$payload2 = action.payload) !== null && _action$payload2 !== void 0 ? _action$payload2 : {}
81
+ });
82
+ }
76
83
  default:
77
84
  return state;
78
85
  }
@@ -7,14 +7,10 @@
7
7
 
8
8
  import { slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js';
9
9
  import * as React from 'react';
10
- import { pkg } from '../../settings.js';
11
10
  import ToggleButtonWrapper from './Datagrid/addons/CustomizeColumns/ButtonWrapper.js';
12
11
  import CustomizeColumnsTearsheetWrapper from './Datagrid/addons/CustomizeColumns/TearsheetWrapper.js';
13
12
 
14
13
  var useCustomizeColumns = function useCustomizeColumns(hooks) {
15
- React.useEffect(function () {
16
- pkg.checkReportFeatureEnabled('Datagrid.useCustomizeColumns');
17
- }, []);
18
14
  var _React$useState = React.useState(false),
19
15
  _React$useState2 = _slicedToArray(_React$useState, 2),
20
16
  isTearsheetOpen = _React$useState2[0],
@@ -8,7 +8,7 @@
8
8
  import useInlineEdit from './useInlineEdit.js';
9
9
 
10
10
  var useEditableCell = function useEditableCell(hooks) {
11
- useInlineEdit(hooks, 'usingEditableCell');
11
+ useInlineEdit(hooks);
12
12
  };
13
13
  var useEditableCell$1 = useEditableCell;
14
14
 
@@ -1,2 +1,2 @@
1
1
  export default useInlineEdit;
2
- declare function useInlineEdit(hooks: any, usingEditableCell: any): void;
2
+ declare function useInlineEdit(hooks: any): void;
@@ -5,34 +5,27 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { defineProperty as _defineProperty } from '../../_virtual/_rollupPluginBabelHelpers.js';
9
- import React__default, { useEffect } from 'react';
8
+ import React__default from 'react';
10
9
  import { pkg } from '../../settings.js';
11
10
  import cx from 'classnames';
12
11
  import { InlineEditCell } from './Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js';
13
12
 
14
13
  var blockClass = "".concat(pkg.prefix, "--datagrid");
15
- var useInlineEdit = function useInlineEdit(hooks, usingEditableCell) {
16
- useEffect(function () {
17
- if (!usingEditableCell) {
18
- pkg.checkReportFeatureEnabled('Datagrid.useInlineEdit');
19
- }
20
- if (usingEditableCell) {
21
- pkg.checkReportFeatureEnabled('Datagrid.useEditableCell');
22
- }
23
- }, [usingEditableCell]);
14
+ var useInlineEdit = function useInlineEdit(hooks) {
24
15
  var addInlineEdit = function addInlineEdit(props, _ref) {
25
- var _cell$column;
16
+ var _cell$column, _cell$column2;
26
17
  var cell = _ref.cell,
27
18
  instance = _ref.instance;
28
19
  var columnInlineEditConfig = cell.column.inlineEdit;
29
20
  var inlineEditType = (_cell$column = cell.column) === null || _cell$column === void 0 || (_cell$column = _cell$column.inlineEdit) === null || _cell$column === void 0 ? void 0 : _cell$column.type;
21
+ var isDisabled = (_cell$column2 = cell.column) === null || _cell$column2 === void 0 ? void 0 : _cell$column2.isDisabled;
30
22
  var renderInlineEditComponent = function renderInlineEditComponent(type) {
31
23
  return /*#__PURE__*/React__default.createElement(InlineEditCell, {
32
24
  config: columnInlineEditConfig,
33
25
  tabIndex: -1,
34
26
  value: cell.value,
35
27
  cell: cell,
28
+ isDisabled: isDisabled,
36
29
  instance: instance,
37
30
  type: type
38
31
  });
@@ -43,15 +36,15 @@ var useInlineEdit = function useInlineEdit(hooks, usingEditableCell) {
43
36
  }];
44
37
  }
45
38
  return [props, {
46
- className: cx("".concat(blockClass, "__cell"), _defineProperty({}, "".concat(blockClass, "__cell-inline-edit"), !!usingEditableCell || pkg.isFeatureEnabled('Datagrid.useInlineEdit') ? true : '')),
39
+ className: cx("".concat(blockClass, "__cell"), "".concat(blockClass, "__cell-inline-edit")),
47
40
  role: 'gridcell',
48
- children: (!!usingEditableCell || pkg.isFeatureEnabled('Datagrid.useInlineEdit')) && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, inlineEditType === 'text' && renderInlineEditComponent(inlineEditType), inlineEditType === 'number' && renderInlineEditComponent(inlineEditType), inlineEditType === 'selection' && renderInlineEditComponent(inlineEditType), inlineEditType === 'date' && renderInlineEditComponent(inlineEditType), !inlineEditType && /*#__PURE__*/React__default.createElement(InlineEditCell, {
41
+ children: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, inlineEditType === 'text' && renderInlineEditComponent(inlineEditType), inlineEditType === 'number' && renderInlineEditComponent(inlineEditType), inlineEditType === 'selection' && renderInlineEditComponent(inlineEditType), inlineEditType === 'date' && renderInlineEditComponent(inlineEditType), !inlineEditType && /*#__PURE__*/React__default.createElement(InlineEditCell, {
49
42
  config: columnInlineEditConfig,
50
43
  tabIndex: -1,
51
44
  value: cell.value,
52
45
  cell: cell,
53
46
  instance: instance,
54
- disabled: true,
47
+ disabledCell: isDisabled,
55
48
  nonEditCell: true,
56
49
  type: "text"
57
50
  }))
@@ -60,7 +53,7 @@ var useInlineEdit = function useInlineEdit(hooks, usingEditableCell) {
60
53
  hooks.getCellProps.push(addInlineEdit);
61
54
  hooks.useInstance.push(function (instance) {
62
55
  Object.assign(instance, {
63
- withInlineEdit: !!usingEditableCell || pkg.isFeatureEnabled('Datagrid.useInlineEdit') ? true : false
56
+ withInlineEdit: true
64
57
  });
65
58
  });
66
59
  };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Supports an object of feature flag values with the `flags` prop, merging them
3
+ * along with the current `FeatureFlagContext` to provide consumers to check if
4
+ * a feature flag is enabled or disabled in a given React tree
5
+ */
6
+ export function FeatureFlags({ children, flags }: {
7
+ children: any;
8
+ flags?: {} | undefined;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export namespace FeatureFlags {
11
+ namespace propTypes {
12
+ let children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
13
+ let flags: PropTypes.Requireable<{
14
+ [x: string]: boolean | null | undefined;
15
+ }>;
16
+ }
17
+ }
18
+ /**
19
+ * Our FeatureFlagContext is used alongside the FeatureFlags component to enable
20
+ * or disable feature flags in a given React tree
21
+ */
22
+ export const FeatureFlagContext: React.Context<any>;
23
+ /**
24
+ * Access all feature flag information for the given FeatureFlagContext
25
+ *
26
+ * @returns {FeatureFlagScope}
27
+ */
28
+ export function useFeatureFlags(): FeatureFlagScope;
29
+ /**
30
+ * Access whether a given flag is enabled or disabled in a given
31
+ * FeatureFlagContext
32
+ *
33
+ * @returns {boolean}
34
+ */
35
+ export function useFeatureFlag(flag: any): boolean;
36
+ import PropTypes from 'prop-types';
37
+ import React from 'react';
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Copyright IBM Corp. 2020, 2024
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
+ import { slicedToArray as _slicedToArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
9
+ import React__default, { useContext, useState, useRef, useEffect, createContext } from 'react';
10
+ import PropTypes from '../../node_modules/prop-types/index.js';
11
+ import { createScope, FeatureFlags as FeatureFlags$1 } from '@carbon/feature-flags';
12
+
13
+ /**
14
+ * Our FeatureFlagContext is used alongside the FeatureFlags component to enable
15
+ * or disable feature flags in a given React tree
16
+ */
17
+ var FeatureFlagContext = /*#__PURE__*/createContext(FeatureFlags$1);
18
+
19
+ /**
20
+ * Supports an object of feature flag values with the `flags` prop, merging them
21
+ * along with the current `FeatureFlagContext` to provide consumers to check if
22
+ * a feature flag is enabled or disabled in a given React tree
23
+ */
24
+ function FeatureFlags(_ref) {
25
+ var children = _ref.children,
26
+ _ref$flags = _ref.flags,
27
+ flags = _ref$flags === void 0 ? {} : _ref$flags;
28
+ var parentScope = useContext(FeatureFlagContext);
29
+ var _useState = useState(parentScope),
30
+ _useState2 = _slicedToArray(_useState, 2),
31
+ prevParentScope = _useState2[0],
32
+ setPrevParentScope = _useState2[1];
33
+ var _useState3 = useState(function () {
34
+ var scope = createScope(flags);
35
+ scope.mergeWithScope(parentScope);
36
+ return scope;
37
+ }),
38
+ _useState4 = _slicedToArray(_useState3, 2),
39
+ scope = _useState4[0],
40
+ updateScope = _useState4[1];
41
+ if (parentScope !== prevParentScope) {
42
+ var _scope = createScope(flags);
43
+ _scope.mergeWithScope(parentScope);
44
+ updateScope(_scope);
45
+ setPrevParentScope(parentScope);
46
+ }
47
+
48
+ // We use a custom hook to detect if any of the keys or their values change
49
+ // for flags that are passed in. If they have changed, then we re-create the
50
+ // FeatureFlagScope using the new flags
51
+ useChangedValue(flags, isEqual, function (changedFlags) {
52
+ var scope = createScope(changedFlags);
53
+ scope.mergeWithScope(parentScope);
54
+ updateScope(scope);
55
+ });
56
+ return /*#__PURE__*/React__default.createElement(FeatureFlagContext.Provider, {
57
+ value: scope
58
+ }, children);
59
+ }
60
+ FeatureFlags.propTypes = {
61
+ children: PropTypes.node,
62
+ /**
63
+ * Provide the feature flags to enabled or disabled in the current React tree
64
+ */
65
+ flags: PropTypes.objectOf(PropTypes.bool)
66
+ };
67
+
68
+ /**
69
+ * This hook will store previous versions of the given `value` and compare the
70
+ * current value to the previous one using the `compare` function. If the
71
+ * compare function returns true, then the given `callback` is invoked in an
72
+ * effect.
73
+ *
74
+ * @param {any} value
75
+ * @param {Function} compare
76
+ * @param {Function} callback
77
+ */
78
+ function useChangedValue(value, compare, callback) {
79
+ var initialRender = useRef(false);
80
+ var savedCallback = useRef(callback);
81
+ var _useState5 = useState(value),
82
+ _useState6 = _slicedToArray(_useState5, 2),
83
+ prevValue = _useState6[0],
84
+ setPrevValue = _useState6[1];
85
+ if (!compare(prevValue, value)) {
86
+ setPrevValue(value);
87
+ }
88
+ useEffect(function () {
89
+ savedCallback.current = callback;
90
+ });
91
+ useEffect(function () {
92
+ // We only want the callback triggered after the first render
93
+ if (initialRender.current) {
94
+ savedCallback.current(prevValue);
95
+ }
96
+ }, [prevValue]);
97
+ useEffect(function () {
98
+ initialRender.current = true;
99
+ }, []);
100
+ }
101
+
102
+ /**
103
+ * Access whether a given flag is enabled or disabled in a given
104
+ * FeatureFlagContext
105
+ *
106
+ * @returns {boolean}
107
+ */
108
+ function useFeatureFlag(flag) {
109
+ var scope = useContext(FeatureFlagContext);
110
+ // console.log(scope);
111
+ return scope.enabled(flag);
112
+ }
113
+
114
+ /**
115
+ * Access all feature flag information for the given FeatureFlagContext
116
+ *
117
+ * @returns {FeatureFlagScope}
118
+ */
119
+ function useFeatureFlags() {
120
+ return useContext(FeatureFlagContext);
121
+ }
122
+
123
+ /**
124
+ * Compare two objects and determine if they are equal. This is a shallow
125
+ * comparison since the objects we are comparing are objects with boolean flags
126
+ * from the flags prop in the `FeatureFlags` component
127
+ *
128
+ * @param {object} a
129
+ * @param {object} b
130
+ * @returns {boolean}
131
+ */
132
+ function isEqual(a, b) {
133
+ if (a === b) {
134
+ return true;
135
+ }
136
+ for (var _i = 0, _Object$keys = Object.keys(a); _i < _Object$keys.length; _i++) {
137
+ var key = _Object$keys[_i];
138
+ if (a[key] !== b[key]) {
139
+ return false;
140
+ }
141
+ }
142
+ for (var _i2 = 0, _Object$keys2 = Object.keys(b); _i2 < _Object$keys2.length; _i2++) {
143
+ var _key = _Object$keys2[_i2];
144
+ if (b[_key] !== a[_key]) {
145
+ return false;
146
+ }
147
+ }
148
+ return true;
149
+ }
150
+
151
+ export { FeatureFlagContext, FeatureFlags, useFeatureFlag, useFeatureFlags };
@@ -69,3 +69,4 @@ export { Guidebanner, GuidebannerElement, GuidebannerElementButton, GuidebannerE
69
69
  export { InlineTip, InlineTipButton, InlineTipLink } from "./InlineTip";
70
70
  export { DescriptionList, DescriptionListBody, DescriptionListCell, DescriptionListRow } from "./DescriptionList";
71
71
  export { FilterPanel, FilterPanelAccordion, FilterPanelAccordionItem, FilterPanelCheckbox, FilterPanelCheckboxWithOverflow, FilterPanelGroup, FilterPanelLabel, FilterPanelSearch } from "./FilterPanel";
72
+ export { FeatureFlags as unstable_FeatureFlags, useFeatureFlag as unstable_useFeatureFlag, useFeatureFlags as unstable_useFeatureFlags } from "./FeatureFlags";
@@ -0,0 +1 @@
1
+ export {};
@@ -9,8 +9,10 @@ import { slicedToArray as _slicedToArray } from '../../../_virtual/_rollupPlugin
9
9
  import { useState, useEffect, useCallback } from 'react';
10
10
  import { pkg } from '../../../settings.js';
11
11
  import { createPortal } from 'react-dom';
12
+ import { useFeatureFlag } from '../../../components/FeatureFlags/index.js';
12
13
 
13
14
  var usePortalTarget = function usePortalTarget(portalTargetIn) {
15
+ var enablePortalTarget = useFeatureFlag('default-portal-target-body');
14
16
  var _useState = useState(null),
15
17
  _useState2 = _slicedToArray(_useState, 2),
16
18
  portalTarget = _useState2[0],
@@ -19,11 +21,11 @@ var usePortalTarget = function usePortalTarget(portalTargetIn) {
19
21
  if (portalTargetIn) {
20
22
  setPortalTarget(portalTargetIn);
21
23
  } else {
22
- if (pkg.isFeatureEnabled('default-portal-target-body')) {
24
+ if (pkg.isFeatureEnabled('default-portal-target-body') || enablePortalTarget) {
23
25
  setPortalTarget(document.body);
24
26
  }
25
27
  }
26
- }, [portalTargetIn]);
28
+ }, [portalTargetIn, enablePortalTarget]);
27
29
  var renderPortalUse = useCallback(function (children) {
28
30
  return portalTarget ? /*#__PURE__*/createPortal(children, portalTarget) : children;
29
31
  }, [portalTarget]);
package/es/index.js CHANGED
@@ -133,3 +133,4 @@ export { FilterPanelLabel } from './components/FilterPanel/FilterPanelLabel/Filt
133
133
  export { FilterPanelSearch } from './components/FilterPanel/FilterPanelSearch/FilterPanelSearch.js';
134
134
  export { ConditionBuilder } from './components/ConditionBuilder/ConditionBuilder.js';
135
135
  export { GetStartedCard } from './components/GetStartedCard/GetStartedCard.js';
136
+ export { FeatureFlags as unstable_FeatureFlags, useFeatureFlag as unstable_useFeatureFlag, useFeatureFlags as unstable_useFeatureFlags } from './components/FeatureFlags/index.js';
@@ -17,12 +17,13 @@ var constants = require('./addons/Filtering/constants.js');
17
17
  var DatagridBody = require('./DatagridBody.js');
18
18
  var DatagridHead = require('./DatagridHead.js');
19
19
  var DatagridToolbar = require('./DatagridToolbar.js');
20
- var index = require('../../../node_modules/prop-types/index.js');
20
+ var index$1 = require('../../../node_modules/prop-types/index.js');
21
21
  var cx = require('classnames');
22
22
  var handleGridFocus = require('./addons/InlineEdit/handleGridFocus.js');
23
23
  var handleGridKeyPress = require('./addons/InlineEdit/handleGridKeyPress.js');
24
24
  var layout = require('@carbon/layout');
25
25
  var FilterProvider = require('./addons/Filtering/FilterProvider.js');
26
+ var index = require('../../FeatureFlags/index.js');
26
27
  var InlineEditContext = require('./addons/InlineEdit/InlineEditContext/InlineEditContext.js');
27
28
  var useClickOutside = require('../../../global/js/hooks/useClickOutside.js');
28
29
  var useMultipleKeyTracking = require('../../DataSpreadsheet/hooks/useMultipleKeyTracking.js');
@@ -50,7 +51,8 @@ var DatagridContent = function DatagridContent(_ref) {
50
51
  panelOpen = _useContext2.panelOpen;
51
52
  var activeCellId = inlineEditState.activeCellId,
52
53
  gridActive = inlineEditState.gridActive,
53
- editId = inlineEditState.editId;
54
+ editId = inlineEditState.editId,
55
+ featureFlags = inlineEditState.featureFlags;
54
56
  var getTableProps = datagridState.getTableProps,
55
57
  getFilterFlyoutProps = datagridState.getFilterFlyoutProps,
56
58
  withVirtualScroll = datagridState.withVirtualScroll,
@@ -78,6 +80,24 @@ var DatagridContent = function DatagridContent(_ref) {
78
80
  var contentRows = DatagridPagination && page || rows;
79
81
  var gridAreaRef = React.useRef();
80
82
  var multiKeyTrackingRef = React.useRef();
83
+ var enableEditableCell = index.useFeatureFlag('enable-datagrid-useEditableCell');
84
+ var enableInlineEdit = index.useFeatureFlag('enable-datagrid-useInlineEdit');
85
+ var enableCustomizeCols = index.useFeatureFlag('enable-datagrid-useCustomizeColumns');
86
+ React.useEffect(function () {
87
+ dispatch({
88
+ type: 'SET_FEATURE_FLAGS',
89
+ payload: {
90
+ 'enable-datagrid-useEditableCell': enableEditableCell,
91
+ 'enable-datagrid-useInlineEdit': enableInlineEdit,
92
+ 'enable-datagrid-useCustomizeColumns': enableCustomizeCols
93
+ }
94
+ });
95
+ }, [dispatch, enableEditableCell, enableCustomizeCols, enableInlineEdit]);
96
+ React.useEffect(function () {
97
+ if (featureFlags && (featureFlags !== null && featureFlags !== void 0 && featureFlags['enable-datagrid-useEditableCell'] || featureFlags !== null && featureFlags !== void 0 && featureFlags['enable-datagrid-useInlineEdit'])) {
98
+ console.error("Datagrid useEditableCell/useInlineEdit extension has not been enabled via feature flag.");
99
+ }
100
+ }, [featureFlags]);
81
101
  useClickOutside.useClickOutside(gridAreaRef, function (target) {
82
102
  if (!withInlineEdit) {
83
103
  return;
@@ -184,34 +204,34 @@ var DatagridContent = function DatagridContent(_ref) {
184
204
  }));
185
205
  };
186
206
  DatagridContent.propTypes = {
187
- ariaToolbarLabel: index["default"].string,
188
- datagridState: index["default"].shape({
189
- getTableProps: index["default"].func,
190
- getFilterFlyoutProps: index["default"].func,
191
- withVirtualScroll: index["default"].bool,
192
- DatagridActions: index["default"].oneOfType([index["default"].element, index["default"].func]),
193
- DatagridPagination: index["default"].oneOfType([index["default"].element, index["default"].func]),
194
- CustomizeColumnsTearsheet: index["default"].oneOfType([index["default"].element, index["default"].func]),
195
- isFetching: index["default"].bool,
196
- skeletonRowCount: index["default"].number,
197
- fullHeightDatagrid: index["default"].bool,
198
- filterProps: index["default"].object,
199
- variableRowHeight: index["default"].bool,
200
- useDenseHeader: index["default"].bool,
201
- withInlineEdit: index["default"].bool,
202
- verticalAlign: index["default"].string,
203
- gridTitle: index["default"].node,
204
- gridDescription: index["default"].node,
205
- page: index["default"].arrayOf(index["default"].object),
206
- rows: index["default"].arrayOf(index["default"].object),
207
- tableId: index["default"].string,
208
- totalColumnsWidth: index["default"].number,
209
- gridRef: index["default"].object,
210
- setAllFilters: index["default"].func,
211
- getFilterProps: index["default"].func,
212
- state: index["default"].object
207
+ ariaToolbarLabel: index$1["default"].string,
208
+ datagridState: index$1["default"].shape({
209
+ getTableProps: index$1["default"].func,
210
+ getFilterFlyoutProps: index$1["default"].func,
211
+ withVirtualScroll: index$1["default"].bool,
212
+ DatagridActions: index$1["default"].oneOfType([index$1["default"].element, index$1["default"].func]),
213
+ DatagridPagination: index$1["default"].oneOfType([index$1["default"].element, index$1["default"].func]),
214
+ CustomizeColumnsTearsheet: index$1["default"].oneOfType([index$1["default"].element, index$1["default"].func]),
215
+ isFetching: index$1["default"].bool,
216
+ skeletonRowCount: index$1["default"].number,
217
+ fullHeightDatagrid: index$1["default"].bool,
218
+ filterProps: index$1["default"].object,
219
+ variableRowHeight: index$1["default"].bool,
220
+ useDenseHeader: index$1["default"].bool,
221
+ withInlineEdit: index$1["default"].bool,
222
+ verticalAlign: index$1["default"].string,
223
+ gridTitle: index$1["default"].node,
224
+ gridDescription: index$1["default"].node,
225
+ page: index$1["default"].arrayOf(index$1["default"].object),
226
+ rows: index$1["default"].arrayOf(index$1["default"].object),
227
+ tableId: index$1["default"].string,
228
+ totalColumnsWidth: index$1["default"].number,
229
+ gridRef: index$1["default"].object,
230
+ setAllFilters: index$1["default"].func,
231
+ getFilterProps: index$1["default"].func,
232
+ state: index$1["default"].object
213
233
  }),
214
- title: index["default"].string
234
+ title: index$1["default"].string
215
235
  };
216
236
 
217
237
  exports.DatagridContent = DatagridContent;
@@ -13,26 +13,11 @@ var _rollupPluginBabelHelpers = require('../../../../../_virtual/_rollupPluginBa
13
13
  var React = require('react');
14
14
  var index = require('../../../../../node_modules/prop-types/index.js');
15
15
  var CustomizeColumnsTearsheet = require('./CustomizeColumnsTearsheet.js');
16
+ var InlineEditContext = require('../InlineEdit/InlineEditContext/InlineEditContext.js');
16
17
 
17
- function _interopNamespace(e) {
18
- if (e && e.__esModule) return e;
19
- var n = Object.create(null);
20
- if (e) {
21
- Object.keys(e).forEach(function (k) {
22
- if (k !== 'default') {
23
- var d = Object.getOwnPropertyDescriptor(e, k);
24
- Object.defineProperty(n, k, d.get ? d : {
25
- enumerable: true,
26
- get: function () { return e[k]; }
27
- });
28
- }
29
- });
30
- }
31
- n["default"] = e;
32
- return Object.freeze(n);
33
- }
18
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
34
19
 
35
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
20
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
36
21
 
37
22
  var _excluded = ["onSaveColumnPrefs", "isTearsheetOpen", "setIsTearsheetOpen", "labels"];
38
23
  var TearsheetWrapper = function TearsheetWrapper(_ref) {
@@ -43,7 +28,16 @@ var TearsheetWrapper = function TearsheetWrapper(_ref) {
43
28
  setIsTearsheetOpen = _instance$customizeCo.setIsTearsheetOpen,
44
29
  labels = _instance$customizeCo.labels,
45
30
  rest = _rollupPluginBabelHelpers.objectWithoutProperties(_instance$customizeCo, _excluded);
46
- return /*#__PURE__*/React__namespace.createElement(CustomizeColumnsTearsheet["default"], _rollupPluginBabelHelpers["extends"]({}, rest, labels, {
31
+ var _useContext = React.useContext(InlineEditContext.InlineEditContext),
32
+ state = _useContext.state;
33
+ var _ref2 = state || {},
34
+ featureFlags = _ref2.featureFlags;
35
+ React.useEffect(function () {
36
+ if (featureFlags && !(featureFlags !== null && featureFlags !== void 0 && featureFlags['enable-datagrid-useCustomizeColumns'])) {
37
+ console.error("Datagrid useCustomizeColumns extension has not been enabled via feature flag.");
38
+ }
39
+ }, [featureFlags]);
40
+ return /*#__PURE__*/React__default["default"].createElement(CustomizeColumnsTearsheet["default"], _rollupPluginBabelHelpers["extends"]({}, rest, labels, {
47
41
  isOpen: isTearsheetOpen,
48
42
  setIsTearsheetOpen: setIsTearsheetOpen,
49
43
  columnDefinitions: instance.allColumns,
@@ -1,9 +1,9 @@
1
- export function InlineEditButton({ label, renderIcon: Icon, disabled, labelIcon: LabelIcon, placeholder, nonEditCell, isActiveCell, columnConfig, type, }: {
1
+ export function InlineEditButton({ label, renderIcon: Icon, labelIcon: LabelIcon, placeholder, disabledCell, nonEditCell, isActiveCell, columnConfig, type, }: {
2
2
  label: any;
3
3
  renderIcon: any;
4
- disabled: any;
5
4
  labelIcon: any;
6
5
  placeholder: any;
6
+ disabledCell: any;
7
7
  nonEditCell: any;
8
8
  isActiveCell: any;
9
9
  columnConfig: any;
@@ -12,7 +12,7 @@ export function InlineEditButton({ label, renderIcon: Icon, disabled, labelIcon:
12
12
  export namespace InlineEditButton {
13
13
  namespace propTypes {
14
14
  let columnConfig: PropTypes.Requireable<object>;
15
- let disabled: PropTypes.Requireable<boolean>;
15
+ let disabledCell: PropTypes.Requireable<boolean>;
16
16
  let isActiveCell: PropTypes.Requireable<boolean>;
17
17
  let label: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
18
18
  let labelIcon: PropTypes.Requireable<object>;