carbon-react 100.0.0 → 100.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,8 +31,10 @@ const FocusTrap = ({
31
31
  const [focusableElements, setFocusableElements] = (0, _react.useState)();
32
32
  const [firstElement, setFirstElement] = (0, _react.useState)();
33
33
  const [lastElement, setLastElement] = (0, _react.useState)();
34
+ const [currentFocusedElement, setCurrentFocusedElement] = (0, _react.useState)();
34
35
  const {
35
- isAnimationComplete
36
+ isAnimationComplete,
37
+ triggerRefocusFlag
36
38
  } = (0, _react.useContext)(_modal.ModalContext);
37
39
  const hasNewInputs = (0, _react.useCallback)(candidate => {
38
40
  if (!focusableElements || candidate.length !== focusableElements.length) {
@@ -114,6 +116,33 @@ const FocusTrap = ({
114
116
  document.removeEventListener("keydown", trapFn);
115
117
  };
116
118
  }, [firstElement, lastElement, focusableElements, bespokeTrap]);
119
+ const updateCurrentFocusedElement = (0, _react.useCallback)(() => {
120
+ const element = focusableElements === null || focusableElements === void 0 ? void 0 : focusableElements.find(el => el === document.activeElement);
121
+
122
+ if (element) {
123
+ setCurrentFocusedElement(element);
124
+ }
125
+ }, [focusableElements]);
126
+ (0, _react.useEffect)(() => {
127
+ document.addEventListener("focusin", updateCurrentFocusedElement);
128
+ return () => {
129
+ document.removeEventListener("focusin", updateCurrentFocusedElement);
130
+ };
131
+ }, [updateCurrentFocusedElement]);
132
+ const refocusTrap = (0, _react.useCallback)(() => {
133
+ /* istanbul ignore else */
134
+ if (currentFocusedElement && !currentFocusedElement.hasAttribute("disabled")) {
135
+ // the trap breaks if it tries to refocus a disabled element
136
+ (0, _focusTrapUtils.setElementFocus)(currentFocusedElement);
137
+ } else if (firstElement) {
138
+ (0, _focusTrapUtils.setElementFocus)(firstElement);
139
+ }
140
+ }, [currentFocusedElement, firstElement]);
141
+ (0, _react.useEffect)(() => {
142
+ if (triggerRefocusFlag) {
143
+ refocusTrap();
144
+ }
145
+ }, [triggerRefocusFlag, refocusTrap]);
117
146
  return /*#__PURE__*/_react.default.createElement("div", {
118
147
  ref: trapRef
119
148
  }, children);
@@ -17,6 +17,8 @@ function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _
17
17
 
18
18
  function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
19
19
 
20
+ function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
21
+
20
22
  function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
21
23
 
22
24
  function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
@@ -25,39 +27,73 @@ function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) {
25
27
 
26
28
  var _modalList = /*#__PURE__*/new WeakMap();
27
29
 
30
+ var _getTopModal = /*#__PURE__*/new WeakSet();
31
+
28
32
  let ModalManagerInstance = /*#__PURE__*/function () {
29
33
  function ModalManagerInstance() {
30
34
  _classCallCheck(this, ModalManagerInstance);
31
35
 
36
+ _getTopModal.add(this);
37
+
32
38
  _modalList.set(this, {
33
39
  writable: true,
34
40
  value: []
35
41
  });
36
42
 
37
- _defineProperty(this, "addModal", modal => {
38
- _classPrivateFieldGet(this, _modalList).push(modal);
43
+ _defineProperty(this, "addModal", (modal, setTriggerRefocusFlag) => {
44
+ const {
45
+ modal: topModal,
46
+ setTriggerRefocusFlag: setTrapFlag
47
+ } = _classPrivateMethodGet(this, _getTopModal, _getTopModal2).call(this);
48
+
49
+ if (topModal && setTrapFlag) {
50
+ setTrapFlag(false);
51
+ }
52
+
53
+ _classPrivateFieldGet(this, _modalList).push({
54
+ modal,
55
+ setTriggerRefocusFlag
56
+ });
39
57
  });
40
58
  }
41
59
 
42
60
  _createClass(ModalManagerInstance, [{
43
61
  key: "isTopmost",
44
62
  value: function isTopmost(modal) {
45
- if (!modal || !_classPrivateFieldGet(this, _modalList).length) {
63
+ const {
64
+ modal: topModal
65
+ } = _classPrivateMethodGet(this, _getTopModal, _getTopModal2).call(this);
66
+
67
+ if (!modal || !topModal) {
46
68
  return false;
47
69
  }
48
70
 
49
- return _classPrivateFieldGet(this, _modalList).indexOf(modal) === _classPrivateFieldGet(this, _modalList).length - 1;
71
+ return modal === topModal;
50
72
  }
51
73
  }, {
52
74
  key: "removeModal",
53
75
  value: function removeModal(modal) {
54
- const modalIndex = _classPrivateFieldGet(this, _modalList).indexOf(modal);
76
+ const modalIndex = _classPrivateFieldGet(this, _modalList).findIndex(({
77
+ modal: m
78
+ }) => m === modal);
55
79
 
56
80
  if (modalIndex === -1) {
57
81
  return;
58
82
  }
59
83
 
60
84
  _classPrivateFieldGet(this, _modalList).splice(modalIndex, 1);
85
+
86
+ if (!_classPrivateFieldGet(this, _modalList).length) {
87
+ return;
88
+ }
89
+
90
+ const {
91
+ setTriggerRefocusFlag
92
+ } = _classPrivateMethodGet(this, _getTopModal, _getTopModal2).call(this);
93
+
94
+ if (setTriggerRefocusFlag) {
95
+ setTriggerRefocusFlag(true);
96
+ }
61
97
  }
62
98
  }, {
63
99
  key: "clearList",
@@ -69,6 +105,14 @@ let ModalManagerInstance = /*#__PURE__*/function () {
69
105
  return ModalManagerInstance;
70
106
  }();
71
107
 
108
+ function _getTopModal2() {
109
+ if (!_classPrivateFieldGet(this, _modalList).length) {
110
+ return {};
111
+ }
112
+
113
+ return _classPrivateFieldGet(this, _modalList)[_classPrivateFieldGet(this, _modalList).length - 1];
114
+ }
115
+
72
116
  const ModalManager = new ModalManagerInstance();
73
117
  var _default = ModalManager;
74
118
  exports.default = _default;
@@ -46,6 +46,7 @@ const Modal = ({
46
46
  const modalRegistered = (0, _react.useRef)(false);
47
47
  const originalOverflow = (0, _react.useRef)(undefined);
48
48
  const [isAnimationComplete, setAnimationComplete] = (0, _react.useState)(false);
49
+ const [triggerRefocusFlag, setTriggerRefocusFlag] = (0, _react.useState)(false);
49
50
  const setOverflow = (0, _react.useCallback)(() => {
50
51
  if (typeof originalOverflow.current === "undefined" && !enableBackgroundUI) {
51
52
  originalOverflow.current = document.documentElement.style.overflow;
@@ -110,7 +111,7 @@ const Modal = ({
110
111
  const registerModal = (0, _react.useCallback)(() => {
111
112
  /* istanbul ignore else */
112
113
  if (!modalRegistered.current) {
113
- _modalManager.default.addModal(ref.current);
114
+ _modalManager.default.addModal(ref.current, setTriggerRefocusFlag);
114
115
 
115
116
  modalRegistered.current = true;
116
117
  }
@@ -164,7 +165,8 @@ const Modal = ({
164
165
  timeout: timeout
165
166
  }, /*#__PURE__*/_react.default.createElement(ModalContext.Provider, {
166
167
  value: {
167
- isAnimationComplete
168
+ isAnimationComplete,
169
+ triggerRefocusFlag
168
170
  }
169
171
  }, content)))));
170
172
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "100.0.0",
3
+ "version": "100.1.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "engineStrict": true,
6
6
  "engines": {