1- import { Fragment , useRef , useState } from "react" ;
1+ import { Fragment , useEffect , useRef , useState } from "react" ;
22
33import { AgColumn } from "ag-grid-community" ;
44
@@ -27,14 +27,16 @@ const GridMenu = ({
2727 menuItems,
2828 theme,
2929 top,
30- left,
30+ left : incomingLeft ,
3131 subMenu,
32+ subtractWidthFromLeft,
3233} : {
3334 menuItems : ( MenuItem | string ) [ ] ;
3435 theme : string ;
3536 top : number ;
3637 left : number ;
3738 subMenu ?: boolean ;
39+ subtractWidthFromLeft ?: boolean ;
3840} ) => {
3941 const menuRef = useRef < HTMLDivElement > ( undefined ) ;
4042 const [ subMenuItems , setSubMenuItems ] = useState < ( MenuItem | string ) [ ] > ( [ ] ) ;
@@ -43,22 +45,41 @@ const GridMenu = ({
4345 : `ag-menu ag-column-menu ag-ltr ag-popup-child ag-popup-positioned-under ${ theme } ` ;
4446 const [ activeIndex , setActiveIndex ] = useState ( - 1 ) ;
4547
48+ const [ offset , setOffset ] = useState ( 0 ) ;
49+ const [ left , setLeft ] = useState ( incomingLeft ) ;
50+ useEffect ( ( ) => {
51+ const w = menuRef . current . getBoundingClientRect ( ) . width ;
52+ const cw = menuRef . current . closest ( "body" ) . clientWidth ;
53+ if ( subtractWidthFromLeft ) {
54+ setLeft ( incomingLeft - w ) ;
55+ return ;
56+ }
57+ if ( left + w > cw ) {
58+ setOffset ( left + w - cw + 15 ) ;
59+ }
60+ } , [ ] ) ;
61+
4662 return (
4763 < Fragment >
4864 { subMenuItems . length > 0 && (
4965 < GridMenu
5066 menuItems = { subMenuItems }
5167 theme = { theme }
5268 top = { top }
53- left = { left + menuRef . current . getBoundingClientRect ( ) . width }
69+ left = {
70+ offset === 0
71+ ? left + menuRef . current . getBoundingClientRect ( ) . width
72+ : left - offset
73+ }
74+ subtractWidthFromLeft = { offset !== 0 }
5475 subMenu
5576 />
5677 ) }
5778 < div className = "ag-theme-sas ag-popup" >
5879 < div
5980 className = { className }
6081 role = "presentation"
61- style = { { top, left } }
82+ style = { { top, left : left - offset } }
6283 ref = { menuRef }
6384 >
6485 < div className = "ag-menu-list ag-focus-managed" role = "menu" >
0 commit comments