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

Sign up to get free protection for your applications and to get access to all the features.
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>;