Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F100935370
ModalManager.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Feb 4, 02:40
Size
2 KB
Mime Type
text/x-c++
Expires
Thu, Feb 6, 02:40 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
24056829
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
ModalManager.js
View Options
import
css
from
'dom-helpers/css'
;
import
{
dataAttr
}
from
'./DataKey'
;
import
getBodyScrollbarWidth
from
'./getScrollbarWidth'
;
export
const
OPEN_DATA_ATTRIBUTE
=
dataAttr
(
'modal-open'
);
/**
* Manages a stack of Modals as well as ensuring
* body scrolling is is disabled and padding accounted for
*/
class
ModalManager
{
constructor
({
ownerDocument
,
handleContainerOverflow
=
true
,
isRTL
=
false
}
=
{})
{
this
.
handleContainerOverflow
=
handleContainerOverflow
;
this
.
isRTL
=
isRTL
;
this
.
modals
=
[];
this
.
ownerDocument
=
ownerDocument
;
}
getScrollbarWidth
()
{
return
getBodyScrollbarWidth
(
this
.
ownerDocument
);
}
getElement
()
{
return
(
this
.
ownerDocument
||
document
).
body
;
}
setModalAttributes
(
_modal
)
{
// For overriding
}
removeModalAttributes
(
_modal
)
{
// For overriding
}
setContainerStyle
(
containerState
)
{
const
style
=
{
overflow
:
'hidden'
};
// we are only interested in the actual `style` here
// because we will override it
const
paddingProp
=
this
.
isRTL
?
'paddingLeft'
:
'paddingRight'
;
const
container
=
this
.
getElement
();
containerState
.
style
=
{
overflow
:
container
.
style
.
overflow
,
[
paddingProp
]
:
container
.
style
[
paddingProp
]
};
if
(
containerState
.
scrollBarWidth
)
{
// use computed style, here to get the real padding
// to add our scrollbar width
style
[
paddingProp
]
=
`
$
{
parseInt
(
css
(
container
,
paddingProp
)
||
'0'
,
10
)
+
containerState
.
scrollBarWidth
}
px
`
;
}
container
.
setAttribute
(
OPEN_DATA_ATTRIBUTE
,
''
);
css
(
container
,
style
);
}
reset
()
{
[...
this
.
modals
].
forEach
(
m
=>
this
.
remove
(
m
));
}
removeContainerStyle
(
containerState
)
{
const
container
=
this
.
getElement
();
container
.
removeAttribute
(
OPEN_DATA_ATTRIBUTE
);
Object
.
assign
(
container
.
style
,
containerState
.
style
);
}
add
(
modal
)
{
let
modalIdx
=
this
.
modals
.
indexOf
(
modal
);
if
(
modalIdx
!==
-
1
)
{
return
modalIdx
;
}
modalIdx
=
this
.
modals
.
length
;
this
.
modals
.
push
(
modal
);
this
.
setModalAttributes
(
modal
);
if
(
modalIdx
!==
0
)
{
return
modalIdx
;
}
this
.
state
=
{
scrollBarWidth
:
this
.
getScrollbarWidth
(),
style
:
{}
};
if
(
this
.
handleContainerOverflow
)
{
this
.
setContainerStyle
(
this
.
state
);
}
return
modalIdx
;
}
remove
(
modal
)
{
const
modalIdx
=
this
.
modals
.
indexOf
(
modal
);
if
(
modalIdx
===
-
1
)
{
return
;
}
this
.
modals
.
splice
(
modalIdx
,
1
);
// if that was the last modal in a container,
// clean up the container
if
(
!
this
.
modals
.
length
&&
this
.
handleContainerOverflow
)
{
this
.
removeContainerStyle
(
this
.
state
);
}
this
.
removeModalAttributes
(
modal
);
}
isTopModal
(
modal
)
{
return
!!
this
.
modals
.
length
&&
this
.
modals
[
this
.
modals
.
length
-
1
]
===
modal
;
}
}
export
default
ModalManager
;
Event Timeline
Log In to Comment