diff --git a/src/Gridler/GridlerDataGrid.tsx b/src/Gridler/GridlerDataGrid.tsx index 30dc5a1..6f1b126 100644 --- a/src/Gridler/GridlerDataGrid.tsx +++ b/src/Gridler/GridlerDataGrid.tsx @@ -23,7 +23,6 @@ import { useGridTheme } from './hooks/use-grid-theme'; export const GridlerDataGrid = () => { const ref = React.useRef(null); const refContextActivated = React.useRef(false); - const { ref: refWrapper, width } = useElementSize(); const { _gridSelection, @@ -51,6 +50,8 @@ export const GridlerDataGrid = () => { setState, setStateFN, total_rows, + heightProp, + widthProp, } = useGridlerStore((s) => ({ _gridSelection: s._gridSelection, focused: s.focused, @@ -77,6 +78,8 @@ export const GridlerDataGrid = () => { setState: s.setState, setStateFN: s.setStateFN, total_rows: s.total_rows, + heightProp: s.height, + widthProp: s.width, })); const refMerged = useMergedRef(ref, (r) => { @@ -96,7 +99,13 @@ export const GridlerDataGrid = () => { ); } return ( - + {sections?.top}
{ }, 100); } }} - ref={refWrapper} > {sections?.left} { gridSelection={_gridSelection} headerHeight={headerHeight ?? 32} headerIcons={{ sort: SortSprite, sortdown: SortDownSprite, sortup: SortUpSprite }} - height={width} onCellContextMenu={(cell, event) => { event.preventDefault(); if (!refContextActivated.current) { @@ -212,8 +219,7 @@ export const GridlerDataGrid = () => { width="100%" {...glideProps} /> - {/* */} -
+ {/* */} {!hasLocalData && } @@ -221,6 +227,7 @@ export const GridlerDataGrid = () => {
{sections?.bottom} + {/* */} ); }; diff --git a/src/Gridler/components/Store.tsx b/src/Gridler/components/Store.tsx index 6a1d5b3..b08e28c 100644 --- a/src/Gridler/components/Store.tsx +++ b/src/Gridler/components/Store.tsx @@ -64,10 +64,13 @@ export interface GridlerProps extends PropsWithChildren { glideProps?: Partial; headerHeight?: number; + height?: number | string; hideMenu?: (id: string) => void; keyField?: string; maxConcurrency?: number; onChange?: (values: Array>) => void; + onMounted?: (getState: GridlerState['getState'], setState: GridlerState['setState']) => void; + onUnMounted?: () => void; pageSize?: number; progressiveScroll?: boolean; RenderCell?: >( @@ -92,6 +95,7 @@ export interface GridlerProps extends PropsWithChildren { uniqueid: string; useAPIQuery?: (index: number) => Promise>>; values?: Array>; + width?: number | string; } export interface GridlerState { @@ -680,8 +684,28 @@ const { Provider, useStore: useGridlerStore } = createSyncStore { + const onMounted = getState('onMounted'); + if (typeof onMounted === 'function') { + onMounted(getState, setState); + } setState('mounted', true); - }, [setState]); + if (window && window.document) { + const portalElement = window.document.getElementById('portal'); + if (!portalElement) { + const div = window.document.createElement('div'); + div.id = 'portal'; + div.setAttribute('data-gridler-portal', props.uniqueid); + window.document.body.appendChild(div); + } + } + return () => { + const onUnMounted = getState('onUnMounted'); + setState('mounted', false); + if (typeof onUnMounted === 'function') { + onUnMounted(); + } + }; + }, [setState, getState]); /// logic to apply the selected row. useEffect(() => { diff --git a/src/Gridler/stories/Examples.goapi.tsx b/src/Gridler/stories/Examples.goapi.tsx index 517deaa..7d3cdf6 100644 --- a/src/Gridler/stories/Examples.goapi.tsx +++ b/src/Gridler/stories/Examples.goapi.tsx @@ -44,12 +44,13 @@ export const GridlerGoAPIExampleEventlog = () => { ]; return ( - +

Demo Using Go API Adaptor

setApiUrl(e.target.value)} value={apiUrl} /> setApiKey(e.target.value)} value={apiKey} /> { return [