@alfalab/core-components-base-modal 3.0.1 → 3.2.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.
- package/CHANGELOG.md +34 -0
- package/dist/Component.d.ts +4 -0
- package/dist/Component.js +36 -27
- package/dist/cssm/Component.d.ts +4 -0
- package/dist/cssm/Component.js +35 -26
- package/dist/cssm/index.js +2 -0
- package/dist/cssm/index.module.css +1 -1
- package/dist/cssm/utils.d.ts +3 -2
- package/dist/cssm/utils.js +39 -14
- package/dist/esm/Component.d.ts +4 -0
- package/dist/esm/Component.js +38 -29
- package/dist/esm/index.css +14 -14
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils.d.ts +3 -2
- package/dist/esm/utils.js +39 -15
- package/dist/index.css +14 -14
- package/dist/index.js +2 -0
- package/dist/modern/Component.d.ts +4 -0
- package/dist/modern/Component.js +32 -23
- package/dist/modern/index.css +14 -14
- package/dist/modern/index.js +2 -1
- package/dist/modern/utils.d.ts +3 -2
- package/dist/modern/utils.js +38 -14
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +39 -14
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,40 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.2.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.1.0...@alfalab/core-components-base-modal@3.2.0) (2022-03-01)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **base-modal:** add component ref for base modal ([#1008](https://github.com/alfa-laboratory/core-components/issues/1008)) ([fb13dbd](https://github.com/alfa-laboratory/core-components/commit/fb13dbdf6352b10b80a74fa87edfcb1f54b76d5a))
|
|
12
|
+
* Исправить импорты в сторях. ([#998](https://github.com/alfa-laboratory/core-components/issues/998)) ([e6a654a](https://github.com/alfa-laboratory/core-components/commit/e6a654a0599451c7d149484cb61d8067eed083b7))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# [3.1.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.2...@alfalab/core-components-base-modal@3.1.0) (2022-01-17)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
* **base-modal:** extract modal store to global ([#943](https://github.com/alfa-laboratory/core-components/issues/943)) ([9587f17](https://github.com/alfa-laboratory/core-components/commit/9587f1773bb690ac6696077509d4a519aa109198))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## [3.0.2](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.1...@alfalab/core-components-base-modal@3.0.2) (2021-09-14)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Bug Fixes
|
|
33
|
+
|
|
34
|
+
* **base-modal:** modal scroll ([#820](https://github.com/alfa-laboratory/core-components/issues/820)) ([1b2d94a](https://github.com/alfa-laboratory/core-components/commit/1b2d94ad45e04145bf1292d749ae2028702dc622))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
6
40
|
## [3.0.1](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.0...@alfalab/core-components-base-modal@3.0.1) (2021-07-09)
|
|
7
41
|
|
|
8
42
|
**Note:** Version bump only for package @alfalab/core-components-base-modal
|
package/dist/Component.d.ts
CHANGED
|
@@ -108,6 +108,10 @@ type BaseModalProps = {
|
|
|
108
108
|
* z-index компонента
|
|
109
109
|
*/
|
|
110
110
|
zIndex?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Реф, который должен быть установлен компонентной области
|
|
113
|
+
*/
|
|
114
|
+
componentRef?: MutableRefObject<HTMLDivElement | null>;
|
|
111
115
|
};
|
|
112
116
|
type BaseModalContext = {
|
|
113
117
|
hasFooter?: boolean;
|
package/dist/Component.js
CHANGED
|
@@ -11,6 +11,7 @@ var FocusLock = require('react-focus-lock');
|
|
|
11
11
|
var coreComponentsPortal = require('@alfalab/core-components-portal');
|
|
12
12
|
var coreComponentsBackdrop = require('@alfalab/core-components-backdrop');
|
|
13
13
|
var coreComponentsStack = require('@alfalab/core-components-stack');
|
|
14
|
+
require('@alfalab/core-components-global-store');
|
|
14
15
|
var utils = require('./utils.js');
|
|
15
16
|
|
|
16
17
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -47,7 +48,7 @@ var __assign = function () {
|
|
|
47
48
|
return __assign.apply(this, arguments);
|
|
48
49
|
};
|
|
49
50
|
|
|
50
|
-
var styles = {"component":"base-
|
|
51
|
+
var styles = {"component":"base-modal__component_pvkw5","wrapper":"base-modal__wrapper_pvkw5","content":"base-modal__content_pvkw5","hidden":"base-modal__hidden_pvkw5","backdrop":"base-modal__backdrop_pvkw5","appear":"base-modal__appear_pvkw5","enter":"base-modal__enter_pvkw5","appearActive":"base-modal__appearActive_pvkw5","enterActive":"base-modal__enterActive_pvkw5","exit":"base-modal__exit_pvkw5","exitActive":"base-modal__exitActive_pvkw5","exitDone":"base-modal__exitDone_pvkw5"};
|
|
51
52
|
require('./index.css')
|
|
52
53
|
|
|
53
54
|
var BaseModalContext = React__default['default'].createContext({
|
|
@@ -62,18 +63,18 @@ var BaseModalContext = React__default['default'].createContext({
|
|
|
62
63
|
onClose: function () { return null; },
|
|
63
64
|
});
|
|
64
65
|
var BaseModal = React.forwardRef(function (_a, ref) {
|
|
65
|
-
var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l;
|
|
66
|
-
var
|
|
67
|
-
var
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
var
|
|
71
|
-
var
|
|
72
|
-
var
|
|
66
|
+
var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l, _m = _a.componentRef, componentRef = _m === void 0 ? null : _m;
|
|
67
|
+
var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
|
|
68
|
+
var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
|
|
69
|
+
var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
|
|
70
|
+
var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
|
|
71
|
+
var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
|
|
72
|
+
var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
|
|
73
|
+
var componentNodeRef = React.useRef(null);
|
|
73
74
|
var wrapperRef = React.useRef(null);
|
|
74
75
|
var scrollableNodeRef = React.useRef(null);
|
|
75
76
|
var contentNodeRef = React.useRef(null);
|
|
76
|
-
var
|
|
77
|
+
var restoreContainerStylesRef = React.useRef(null);
|
|
77
78
|
var checkToHasScrollBar = function () {
|
|
78
79
|
if (scrollableNodeRef.current) {
|
|
79
80
|
var scrollExists = utils.hasScrollbar(scrollableNodeRef.current);
|
|
@@ -82,6 +83,9 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
82
83
|
}
|
|
83
84
|
};
|
|
84
85
|
var shouldRender = keepMounted || open || !exited;
|
|
86
|
+
var getContainer = React.useCallback(function () {
|
|
87
|
+
return (container ? container() : document.body);
|
|
88
|
+
}, [container]);
|
|
85
89
|
var resizeObserver$1 = React.useMemo(function () { return new resizeObserver.ResizeObserver(checkToHasScrollBar); }, []);
|
|
86
90
|
var addResizeHandle = React.useCallback(function () {
|
|
87
91
|
if (scrollableNodeRef.current)
|
|
@@ -100,15 +104,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
100
104
|
}
|
|
101
105
|
}, [resizeObserver$1]);
|
|
102
106
|
var handleScroll = React.useCallback(function () {
|
|
103
|
-
if (!scrollableNodeRef.current || !
|
|
107
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
104
108
|
return;
|
|
105
109
|
if (hasHeader) {
|
|
106
110
|
setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
|
|
107
|
-
|
|
111
|
+
componentNodeRef.current.getBoundingClientRect().top <= 0);
|
|
108
112
|
}
|
|
109
113
|
if (hasFooter) {
|
|
110
114
|
setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
|
|
111
|
-
|
|
115
|
+
componentNodeRef.current.getBoundingClientRect().bottom >=
|
|
116
|
+
window.innerHeight);
|
|
112
117
|
}
|
|
113
118
|
}, [hasFooter, hasHeader]);
|
|
114
119
|
var handleClose = React.useCallback(function (event, reason) {
|
|
@@ -124,7 +129,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
124
129
|
return null;
|
|
125
130
|
}, [onBackdropClick, onClose, onEscapeKeyDown]);
|
|
126
131
|
var handleBackdropClick = function (event) {
|
|
127
|
-
if (!disableBackdropClick) {
|
|
132
|
+
if (!disableBackdropClick && event.target === wrapperRef.current) {
|
|
128
133
|
handleClose(event, 'backdropClick');
|
|
129
134
|
}
|
|
130
135
|
};
|
|
@@ -146,7 +151,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
146
151
|
if (scrollHandler === 'wrapper')
|
|
147
152
|
return wrapperRef.current;
|
|
148
153
|
if (scrollHandler === 'content')
|
|
149
|
-
return
|
|
154
|
+
return componentNodeRef.current;
|
|
150
155
|
return scrollHandler.current || wrapperRef.current;
|
|
151
156
|
}, [scrollHandler]);
|
|
152
157
|
var handleEntered = React.useCallback(function (node, isAppearing) {
|
|
@@ -173,27 +178,29 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
173
178
|
}
|
|
174
179
|
if (onUnmount)
|
|
175
180
|
onUnmount();
|
|
176
|
-
if (
|
|
177
|
-
|
|
178
|
-
restoreContainerStyles.current = null;
|
|
181
|
+
if (restoreContainerStylesRef.current) {
|
|
182
|
+
restoreContainerStylesRef.current();
|
|
179
183
|
}
|
|
180
184
|
}, [handleScroll, onUnmount, removeResizeHandle, transitionProps]);
|
|
181
185
|
React.useEffect(function () {
|
|
182
186
|
if (open) {
|
|
183
|
-
|
|
187
|
+
utils.handleContainer(getContainer());
|
|
188
|
+
restoreContainerStylesRef.current = function () {
|
|
189
|
+
restoreContainerStylesRef.current = null;
|
|
190
|
+
utils.restoreContainerStyles(getContainer());
|
|
191
|
+
};
|
|
184
192
|
}
|
|
185
|
-
|
|
186
|
-
}, [open]);
|
|
193
|
+
}, [getContainer, open]);
|
|
187
194
|
React.useEffect(function () {
|
|
188
195
|
if (open)
|
|
189
196
|
setExited(false);
|
|
190
197
|
}, [open]);
|
|
191
198
|
React.useEffect(function () {
|
|
192
199
|
return function () {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
restoreContainerStyles.current();
|
|
200
|
+
if (restoreContainerStylesRef.current) {
|
|
201
|
+
restoreContainerStylesRef.current();
|
|
196
202
|
}
|
|
203
|
+
resizeObserver$1.disconnect();
|
|
197
204
|
};
|
|
198
205
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
199
206
|
}, []);
|
|
@@ -223,14 +230,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
223
230
|
return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: container },
|
|
224
231
|
React__default['default'].createElement(BaseModalContext.Provider, { value: contextValue },
|
|
225
232
|
React__default['default'].createElement(FocusLock__default['default'], { autoFocus: !disableAutoFocus, disabled: disableFocusLock || !open, returnFocus: !disableRestoreFocus },
|
|
233
|
+
Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles.backdrop), open: open, style: {
|
|
234
|
+
zIndex: computedZIndex,
|
|
235
|
+
} }))),
|
|
226
236
|
React__default['default'].createElement("div", { role: 'dialog', className: cn__default['default'](styles.wrapper, wrapperClassName, (_a = {},
|
|
227
237
|
_a[styles.hidden] = !open && exited,
|
|
228
|
-
_a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, tabIndex: -1, "data-test-id": dataTestId, style: {
|
|
238
|
+
_a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, onClick: handleBackdropClick, tabIndex: -1, "data-test-id": dataTestId, style: {
|
|
229
239
|
zIndex: computedZIndex,
|
|
230
240
|
} },
|
|
231
|
-
Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles.backdrop), open: open, onClick: handleBackdropClick }))),
|
|
232
241
|
React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
|
|
233
|
-
React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: componentRef },
|
|
242
|
+
React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
|
|
234
243
|
React__default['default'].createElement("div", { className: cn__default['default'](styles.content, contentClassName) }, children))))))));
|
|
235
244
|
}));
|
|
236
245
|
});
|
package/dist/cssm/Component.d.ts
CHANGED
|
@@ -108,6 +108,10 @@ type BaseModalProps = {
|
|
|
108
108
|
* z-index компонента
|
|
109
109
|
*/
|
|
110
110
|
zIndex?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Реф, который должен быть установлен компонентной области
|
|
113
|
+
*/
|
|
114
|
+
componentRef?: MutableRefObject<HTMLDivElement | null>;
|
|
111
115
|
};
|
|
112
116
|
type BaseModalContext = {
|
|
113
117
|
hasFooter?: boolean;
|
package/dist/cssm/Component.js
CHANGED
|
@@ -11,6 +11,7 @@ var FocusLock = require('react-focus-lock');
|
|
|
11
11
|
var coreComponentsPortal = require('@alfalab/core-components-portal/dist/cssm');
|
|
12
12
|
var coreComponentsBackdrop = require('@alfalab/core-components-backdrop/dist/cssm');
|
|
13
13
|
var coreComponentsStack = require('@alfalab/core-components-stack/dist/cssm');
|
|
14
|
+
require('@alfalab/core-components-global-store/dist/cssm');
|
|
14
15
|
var utils = require('./utils.js');
|
|
15
16
|
var styles = require('./index.module.css');
|
|
16
17
|
|
|
@@ -61,18 +62,18 @@ var BaseModalContext = React__default['default'].createContext({
|
|
|
61
62
|
onClose: function () { return null; },
|
|
62
63
|
});
|
|
63
64
|
var BaseModal = React.forwardRef(function (_a, ref) {
|
|
64
|
-
var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l;
|
|
65
|
-
var
|
|
66
|
-
var
|
|
67
|
-
var
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
var
|
|
71
|
-
var
|
|
65
|
+
var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l, _m = _a.componentRef, componentRef = _m === void 0 ? null : _m;
|
|
66
|
+
var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
|
|
67
|
+
var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
|
|
68
|
+
var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
|
|
69
|
+
var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
|
|
70
|
+
var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
|
|
71
|
+
var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
|
|
72
|
+
var componentNodeRef = React.useRef(null);
|
|
72
73
|
var wrapperRef = React.useRef(null);
|
|
73
74
|
var scrollableNodeRef = React.useRef(null);
|
|
74
75
|
var contentNodeRef = React.useRef(null);
|
|
75
|
-
var
|
|
76
|
+
var restoreContainerStylesRef = React.useRef(null);
|
|
76
77
|
var checkToHasScrollBar = function () {
|
|
77
78
|
if (scrollableNodeRef.current) {
|
|
78
79
|
var scrollExists = utils.hasScrollbar(scrollableNodeRef.current);
|
|
@@ -81,6 +82,9 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
81
82
|
}
|
|
82
83
|
};
|
|
83
84
|
var shouldRender = keepMounted || open || !exited;
|
|
85
|
+
var getContainer = React.useCallback(function () {
|
|
86
|
+
return (container ? container() : document.body);
|
|
87
|
+
}, [container]);
|
|
84
88
|
var resizeObserver$1 = React.useMemo(function () { return new resizeObserver.ResizeObserver(checkToHasScrollBar); }, []);
|
|
85
89
|
var addResizeHandle = React.useCallback(function () {
|
|
86
90
|
if (scrollableNodeRef.current)
|
|
@@ -99,15 +103,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
99
103
|
}
|
|
100
104
|
}, [resizeObserver$1]);
|
|
101
105
|
var handleScroll = React.useCallback(function () {
|
|
102
|
-
if (!scrollableNodeRef.current || !
|
|
106
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
103
107
|
return;
|
|
104
108
|
if (hasHeader) {
|
|
105
109
|
setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
|
|
106
|
-
|
|
110
|
+
componentNodeRef.current.getBoundingClientRect().top <= 0);
|
|
107
111
|
}
|
|
108
112
|
if (hasFooter) {
|
|
109
113
|
setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
|
|
110
|
-
|
|
114
|
+
componentNodeRef.current.getBoundingClientRect().bottom >=
|
|
115
|
+
window.innerHeight);
|
|
111
116
|
}
|
|
112
117
|
}, [hasFooter, hasHeader]);
|
|
113
118
|
var handleClose = React.useCallback(function (event, reason) {
|
|
@@ -123,7 +128,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
123
128
|
return null;
|
|
124
129
|
}, [onBackdropClick, onClose, onEscapeKeyDown]);
|
|
125
130
|
var handleBackdropClick = function (event) {
|
|
126
|
-
if (!disableBackdropClick) {
|
|
131
|
+
if (!disableBackdropClick && event.target === wrapperRef.current) {
|
|
127
132
|
handleClose(event, 'backdropClick');
|
|
128
133
|
}
|
|
129
134
|
};
|
|
@@ -145,7 +150,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
145
150
|
if (scrollHandler === 'wrapper')
|
|
146
151
|
return wrapperRef.current;
|
|
147
152
|
if (scrollHandler === 'content')
|
|
148
|
-
return
|
|
153
|
+
return componentNodeRef.current;
|
|
149
154
|
return scrollHandler.current || wrapperRef.current;
|
|
150
155
|
}, [scrollHandler]);
|
|
151
156
|
var handleEntered = React.useCallback(function (node, isAppearing) {
|
|
@@ -172,27 +177,29 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
172
177
|
}
|
|
173
178
|
if (onUnmount)
|
|
174
179
|
onUnmount();
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
restoreContainerStyles.current = null;
|
|
180
|
+
if (restoreContainerStylesRef.current) {
|
|
181
|
+
restoreContainerStylesRef.current();
|
|
178
182
|
}
|
|
179
183
|
}, [handleScroll, onUnmount, removeResizeHandle, transitionProps]);
|
|
180
184
|
React.useEffect(function () {
|
|
181
185
|
if (open) {
|
|
182
|
-
|
|
186
|
+
utils.handleContainer(getContainer());
|
|
187
|
+
restoreContainerStylesRef.current = function () {
|
|
188
|
+
restoreContainerStylesRef.current = null;
|
|
189
|
+
utils.restoreContainerStyles(getContainer());
|
|
190
|
+
};
|
|
183
191
|
}
|
|
184
|
-
|
|
185
|
-
}, [open]);
|
|
192
|
+
}, [getContainer, open]);
|
|
186
193
|
React.useEffect(function () {
|
|
187
194
|
if (open)
|
|
188
195
|
setExited(false);
|
|
189
196
|
}, [open]);
|
|
190
197
|
React.useEffect(function () {
|
|
191
198
|
return function () {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
restoreContainerStyles.current();
|
|
199
|
+
if (restoreContainerStylesRef.current) {
|
|
200
|
+
restoreContainerStylesRef.current();
|
|
195
201
|
}
|
|
202
|
+
resizeObserver$1.disconnect();
|
|
196
203
|
};
|
|
197
204
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
198
205
|
}, []);
|
|
@@ -222,14 +229,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
|
|
|
222
229
|
return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: container },
|
|
223
230
|
React__default['default'].createElement(BaseModalContext.Provider, { value: contextValue },
|
|
224
231
|
React__default['default'].createElement(FocusLock__default['default'], { autoFocus: !disableAutoFocus, disabled: disableFocusLock || !open, returnFocus: !disableRestoreFocus },
|
|
232
|
+
Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles__default['default'].backdrop), open: open, style: {
|
|
233
|
+
zIndex: computedZIndex,
|
|
234
|
+
} }))),
|
|
225
235
|
React__default['default'].createElement("div", { role: 'dialog', className: cn__default['default'](styles__default['default'].wrapper, wrapperClassName, (_a = {},
|
|
226
236
|
_a[styles__default['default'].hidden] = !open && exited,
|
|
227
|
-
_a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, tabIndex: -1, "data-test-id": dataTestId, style: {
|
|
237
|
+
_a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, onClick: handleBackdropClick, tabIndex: -1, "data-test-id": dataTestId, style: {
|
|
228
238
|
zIndex: computedZIndex,
|
|
229
239
|
} },
|
|
230
|
-
Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles__default['default'].backdrop), open: open, onClick: handleBackdropClick }))),
|
|
231
240
|
React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles__default['default'] }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
|
|
232
|
-
React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: componentRef },
|
|
241
|
+
React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
|
|
233
242
|
React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].content, contentClassName) }, children))))))));
|
|
234
243
|
}));
|
|
235
244
|
});
|
package/dist/cssm/index.js
CHANGED
|
@@ -12,6 +12,7 @@ require('react-focus-lock');
|
|
|
12
12
|
require('@alfalab/core-components-portal/dist/cssm');
|
|
13
13
|
require('@alfalab/core-components-backdrop/dist/cssm');
|
|
14
14
|
require('@alfalab/core-components-stack/dist/cssm');
|
|
15
|
+
require('@alfalab/core-components-global-store/dist/cssm');
|
|
15
16
|
var utils = require('./utils.js');
|
|
16
17
|
require('./index.module.css');
|
|
17
18
|
|
|
@@ -23,3 +24,4 @@ exports.handleContainer = utils.handleContainer;
|
|
|
23
24
|
exports.hasScrollbar = utils.hasScrollbar;
|
|
24
25
|
exports.isScrolledToBottom = utils.isScrolledToBottom;
|
|
25
26
|
exports.isScrolledToTop = utils.isScrolledToTop;
|
|
27
|
+
exports.restoreContainerStyles = utils.restoreContainerStyles;
|
package/dist/cssm/utils.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
declare function isScrolledToTop(target: HTMLElement): boolean;
|
|
2
2
|
declare function isScrolledToBottom(target: HTMLElement): boolean;
|
|
3
3
|
declare function hasScrollbar(target: HTMLElement): boolean;
|
|
4
|
-
declare const
|
|
5
|
-
|
|
4
|
+
declare const restoreContainerStyles: (container: HTMLElement) => void;
|
|
5
|
+
declare const handleContainer: (container?: HTMLElement | undefined) => void;
|
|
6
|
+
export { isScrolledToTop, isScrolledToBottom, hasScrollbar, restoreContainerStyles, handleContainer };
|
package/dist/cssm/utils.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
var coreComponentsGlobalStore = require('@alfalab/core-components-global-store/dist/cssm');
|
|
6
|
+
|
|
5
7
|
function isScrolledToTop(target) {
|
|
6
8
|
return target.scrollTop <= 0;
|
|
7
9
|
}
|
|
@@ -32,12 +34,40 @@ var isOverflowing = function (container) {
|
|
|
32
34
|
var getPaddingRight = function (node) {
|
|
33
35
|
return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
|
|
34
36
|
};
|
|
37
|
+
var restoreContainerStyles = function (container) {
|
|
38
|
+
var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
|
|
39
|
+
var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
|
|
40
|
+
var existingStyles = modalRestoreStyles[index];
|
|
41
|
+
if (!existingStyles)
|
|
42
|
+
return;
|
|
43
|
+
existingStyles.modals -= 1;
|
|
44
|
+
if (existingStyles.modals <= 0) {
|
|
45
|
+
modalRestoreStyles.splice(index, 1);
|
|
46
|
+
existingStyles.styles.forEach(function (_a) {
|
|
47
|
+
var value = _a.value, el = _a.el, key = _a.key;
|
|
48
|
+
if (value) {
|
|
49
|
+
el.style.setProperty(key, value);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
el.style.removeProperty(key);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
35
57
|
var handleContainer = function (container) {
|
|
36
|
-
|
|
58
|
+
if (!container)
|
|
59
|
+
return;
|
|
60
|
+
var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
|
|
61
|
+
var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
|
|
62
|
+
if (existingStyles) {
|
|
63
|
+
existingStyles.modals += 1;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
var containerStyles = [];
|
|
37
67
|
if (isOverflowing(container)) {
|
|
38
68
|
// Вычисляет размер до применения `overflow hidden` для избежания скачков
|
|
39
69
|
var scrollbarSize = getScrollbarSize();
|
|
40
|
-
|
|
70
|
+
containerStyles.push({
|
|
41
71
|
value: container.style.paddingRight,
|
|
42
72
|
key: 'padding-right',
|
|
43
73
|
el: container,
|
|
@@ -56,27 +86,22 @@ var handleContainer = function (container) {
|
|
|
56
86
|
: container;
|
|
57
87
|
// Блокируем скролл даже если отсутствует скроллбар
|
|
58
88
|
if (scrollContainer.style.overflow !== 'hidden') {
|
|
59
|
-
|
|
89
|
+
containerStyles.push({
|
|
60
90
|
value: scrollContainer.style.overflow,
|
|
61
91
|
key: 'overflow',
|
|
62
92
|
el: scrollContainer,
|
|
63
93
|
});
|
|
64
94
|
}
|
|
65
95
|
scrollContainer.style.overflow = 'hidden';
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
el.style.removeProperty(key);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
};
|
|
96
|
+
modalRestoreStyles.push({
|
|
97
|
+
container: container,
|
|
98
|
+
modals: 1,
|
|
99
|
+
styles: containerStyles,
|
|
100
|
+
});
|
|
77
101
|
};
|
|
78
102
|
|
|
79
103
|
exports.handleContainer = handleContainer;
|
|
80
104
|
exports.hasScrollbar = hasScrollbar;
|
|
81
105
|
exports.isScrolledToBottom = isScrolledToBottom;
|
|
82
106
|
exports.isScrolledToTop = isScrolledToTop;
|
|
107
|
+
exports.restoreContainerStyles = restoreContainerStyles;
|
package/dist/esm/Component.d.ts
CHANGED
|
@@ -108,6 +108,10 @@ type BaseModalProps = {
|
|
|
108
108
|
* z-index компонента
|
|
109
109
|
*/
|
|
110
110
|
zIndex?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Реф, который должен быть установлен компонентной области
|
|
113
|
+
*/
|
|
114
|
+
componentRef?: MutableRefObject<HTMLDivElement | null>;
|
|
111
115
|
};
|
|
112
116
|
type BaseModalContext = {
|
|
113
117
|
hasFooter?: boolean;
|