dinocollab-core 2.2.23 → 2.2.24

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.
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as n,asyncToGenerator as e,regenerator as r,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{useCallback as c,useMemo as s,useRef as d,useState as v,useEffect as f,useLayoutEffect as h}from"react";import{useMergedConfig as p}from"./hooks.js";import{ViewGridStyled as g,viewGridClasses as m}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as T,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as I}from"./helpers.js";function S(e){var r=function(e){return function(r){var o,a=v(!1),c=t(a,2),h=c[0],x=c[1],T=d(null),I=p(r,e),S=I.Component,H=!0===(null===(o=I.normalOptions)||void 0===o?void 0:o.autoHeight),M="client"===r.featureMode,y=s(function(){return r.value},[r.value]);f(function(){M&&!H&&void 0!==r.scrollResetToken&&T.current&&(T.current.scrollTop=0)},[M,H,r.scrollResetToken]);var b=s(function(){var n=[m.root,m.normal];return h&&n.push(m.scrolling),H&&n.push(m.autoHeight),n.join(" ")},[h,H]);return i(g,{className:b,children:i(l,{className:m.scrollContainer,ref:T,onScroll:function(n){var e,t=n.currentTarget;x(t.scrollTop>I.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=I.nearEndThreshold&&(null===(e=r.onNearEnd)||void 0===e||e.call(r))},children:i(u,{container:!0,spacing:"".concat(I.spacing,"px"),className:m.grid,children:y.map(function(r,t){var o,a=null!==(o=e.getterId(r,t))&&void 0!==o?o:t;return i(u,n(n({className:m.gridItem,item:!0},I.sizes),{},{children:i(S,{value:r,index:t})}),a)})})})})}}(e),S=function(n){return function(e){var r=s(function(){return e.value},[e.value]),u=p(e,n),S=u.sizes,H=u.virtualizedOptions,M=u.Component,y=d(null),b=d(new Map),z=d(null),N=d(!1),R=v(0),k=t(R,2),C=k[0],w=k[1],O=v(0),j=t(O,2),E=j[0],A=j[1],B=v(0),F=t(B,2),P=F[0],_=F[1],q=v(null),G=t(q,2),W=G[0],D=G[1],J=Math.max(1,H.overscan),K=x(u.spacing),L=P>u.scrollingThreshold,Q=null!=W?W:I;f(function(){"client"===e.featureMode&&void 0!==e.scrollResetToken&&(y.current&&(y.current.scrollTop=0),_(0))},[e.featureMode,e.scrollResetToken]),h(function(){if(y.current){var n=function(){var n,e,r,t,o=null!==(n=null===(e=y.current)||void 0===e?void 0:e.clientWidth)&&void 0!==n?n:0,i=null!==(r=null===(t=y.current)||void 0===t?void 0:t.clientHeight)&&void 0!==r?r:0;w(function(n){return n===o?n:o}),A(function(n){return n===i?n:i})};n();var e=new ResizeObserver(function(){return n()});return e.observe(y.current),function(){return e.disconnect()}}},[]);var U=T(C,S),V=Q+K,X=s(function(){var n=r.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var e=Math.ceil(n/U),t=Math.max(1,E),o=P,i=Math.max(0,Math.floor(o/V)-J),a=Math.ceil(t/V),l=Math.min(e-1,i+a+2*J),u=i*U,c=Math.min(n-1,(l+1)*U-1);return{startRow:i,endRow:l,topSpacerHeight:i*V,bottomSpacerHeight:Math.max(0,(e-l-1)*V),startIndex:u,endIndex:c}},[U,r.length,J,V,P,E]),Y=X.endIndex>=X.startIndex?r.slice(X.startIndex,X.endIndex+1):[],Z=X.endIndex,$=s(function(){return{display:"grid",gap:"".concat(K,"px"),gridTemplateColumns:"repeat(".concat(U,", minmax(0, 1fr))")}},[U,K]),nn=c(function(){null!==z.current&&(cancelAnimationFrame(z.current),z.current=null)},[]),en=c(function(){N.current||null!==z.current||(z.current=requestAnimationFrame(function(){if(z.current=null,!N.current){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length){var e,r=0,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r=Math.max(r,a.getBoundingClientRect().height)}}catch(n){i.e(n)}finally{i.f()}r<=0||(N.current=!0,D(r))}}}))},[Z,X.startIndex]),rn=c(function(n,e){e?b.current.set(n,e):b.current.delete(n)},[]);h(function(){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length&&!N.current){en();var e,r=new ResizeObserver(function(){en()}),i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r.observe(a)}}catch(n){i.e(n)}finally{i.f()}return function(){r.disconnect(),nn()}}},[X.startIndex,Z,en,nn]),h(function(){return function(){nn()}},[nn]);var tn=[m.root,m.virtualized];return L&&tn.push(m.scrolling),i(g,{className:tn.filter(Boolean).join(" "),children:a(l,{ref:y,className:m.scrollContainer,onScroll:function(n){var r,t=n.currentTarget;_(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=u.nearEndThreshold&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:[X.topSpacerHeight>0?i(l,{sx:{height:X.topSpacerHeight}}):null,i(l,{sx:$,className:m.grid,children:Y.map(function(e,r){var t,o=X.startIndex+r,a=null!==(t=n.getterId(e,o))&&void 0!==t?t:o;return i(l,{className:m.gridItem,ref:N.current?void 0:function(n){return rn(o,n)},sx:null!==W?{minHeight:Q,height:Q}:void 0,children:i(M,{value:e,index:o})},a)})}),X.bottomSpacerHeight>0?i(l,{sx:{height:X.bottomSpacerHeight}}):null]})})}}(e);return function(t){var o,a,l=null!==(o=null!==(a=t.renderStrategy)&&void 0!==a?a:e.renderStrategy)&&void 0!==o?o:"normal";return i("virtualized"===l?S:r,n({},t))}}function H(n){return function(t){var o,a,l,u=c(e(r().m(function n(){var e,o,i,a,l,u,c,s,d;return r().w(function(n){for(;;)switch(n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(e=t.pagination)&&void 0!==e&&e.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:return c=null!==(o=null===(i=t.pagination)||void 0===i?void 0:i.page)&&void 0!==o?o:0,s=null!==(a=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==a?a:20,d=c+1,n.n=4,null===(u=t.onPageChange)||void 0===u?void 0:u.call(t,d,s);case 4:return n.a(2)}},n)})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(a=t.pagination)||void 0===a?void 0:a.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return i(n,{value:t.value,spacing:t.spacing,sizes:t.sizes,renderStrategy:t.renderStrategy,Component:t.Component,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?u:void 0,nearEndThreshold:t.nearEndThreshold,scrollResetToken:t.scrollResetToken})}}export{S as createViewGrid,H as createViewGridLoading,S as default};
1
+ import{objectSpread2 as n,asyncToGenerator as e,regenerator as r,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{useCallback as c,useMemo as s,useRef as d,useState as v,useEffect as f,useLayoutEffect as h}from"react";import{useMergedConfig as p}from"./hooks.js";import{ViewGridStyled as g,viewGridClasses as m}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as T,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as M}from"./helpers.js";function I(e){var r=function(e){return function(r){var o,a=v(!1),c=t(a,2),h=c[0],x=c[1],T=d(null),M=p(r,e),I=M.Component,S=!0===(null===(o=M.normalOptions)||void 0===o?void 0:o.autoHeight),H="client"===r.featureMode,y=s(function(){return r.value},[r.value]);f(function(){H&&!S&&void 0!==r.scrollResetToken&&T.current&&(T.current.scrollTop=0)},[H,S,r.scrollResetToken]);var b=s(function(){var n=[m.root,m.normal];return h&&n.push(m.scrolling),S&&n.push(m.autoHeight),n.join(" ")},[h,S]);return i(g,{className:b,children:i(l,{className:m.scrollContainer,ref:T,onScroll:function(n){var e,t=n.currentTarget;x(t.scrollTop>M.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=M.nearEndThreshold&&(null===(e=r.onNearEnd)||void 0===e||e.call(r))},children:i(u,{container:!0,spacing:"".concat(M.spacing,"px"),className:m.grid,children:y.map(function(r,t){var o,a=null!==(o=e.getterId(r,t))&&void 0!==o?o:t;return i(u,n(n({className:m.gridItem,item:!0},M.sizes),{},{children:i(I,{value:r,index:t})}),a)})})})})}}(e),I=function(n){return function(e){var r=s(function(){return e.value},[e.value]),u=p(e,n),I=u.sizes,S=u.virtualizedOptions,H=u.Component,y=d(null),b=d(new Map),z=d(null),N=d(!1),R=v(0),k=t(R,2),C=k[0],w=k[1],O=v(0),j=t(O,2),E=j[0],A=j[1],B=v(0),F=t(B,2),P=F[0],_=F[1],q=v(null),G=t(q,2),W=G[0],D=G[1],J=Math.max(1,S.overscan),K=Math.round(x(u.spacing)),L=P>u.scrollingThreshold,Q=null!=W?W:M;f(function(){"client"===e.featureMode&&void 0!==e.scrollResetToken&&(y.current&&(y.current.scrollTop=0),_(0))},[e.featureMode,e.scrollResetToken]),h(function(){if(y.current){var n=function(){var n,e,r,t,o=null!==(n=null===(e=y.current)||void 0===e?void 0:e.clientWidth)&&void 0!==n?n:0,i=null!==(r=null===(t=y.current)||void 0===t?void 0:t.clientHeight)&&void 0!==r?r:0;w(function(n){return n===o?n:o}),A(function(n){return n===i?n:i})};n();var e=new ResizeObserver(function(){return n()});return e.observe(y.current),function(){return e.disconnect()}}},[]);var U=T(C,I),V=Q+K,X=s(function(){var n=r.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var e=Math.ceil(n/U),t=Math.max(1,E),o=P,i=Math.max(0,Math.floor(o/V)-J),a=Math.ceil(t/V),l=Math.min(e-1,i+a+2*J);l===e-1&&(i=Math.max(0,e-a-2*J));var u=i*U,c=Math.min(n-1,(l+1)*U-1);return{startRow:i,endRow:l,topSpacerHeight:i*V,bottomSpacerHeight:Math.max(0,(e-l-1)*V),startIndex:u,endIndex:c}},[U,r.length,J,V,P,E]),Y=X.endIndex>=X.startIndex?r.slice(X.startIndex,X.endIndex+1):[],Z=X.endIndex,$=s(function(){return{display:"grid",gap:"".concat(K,"px"),gridTemplateColumns:"repeat(".concat(U,", minmax(0, 1fr))")}},[U,K]),nn=c(function(){null!==z.current&&(cancelAnimationFrame(z.current),z.current=null)},[]),en=c(function(){N.current||null!==z.current||(z.current=requestAnimationFrame(function(){if(z.current=null,!N.current){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length){var e,r=0,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r=Math.max(r,a.getBoundingClientRect().height)}}catch(n){i.e(n)}finally{i.f()}r<=0||(N.current=!0,D(Math.round(r)))}}}))},[Z,X.startIndex]),rn=c(function(n,e){e?b.current.set(n,e):b.current.delete(n)},[]);h(function(){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length&&!N.current){en();var e,r=new ResizeObserver(function(){en()}),i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r.observe(a)}}catch(n){i.e(n)}finally{i.f()}return function(){r.disconnect(),nn()}}},[X.startIndex,Z,en,nn]),h(function(){return function(){nn()}},[nn]);var tn=[m.root,m.virtualized];return L&&tn.push(m.scrolling),i(g,{className:tn.filter(Boolean).join(" "),children:a(l,{ref:y,className:m.scrollContainer,onScroll:function(n){var r,t=n.currentTarget;_(Math.round(t.scrollTop)),t.scrollHeight-t.scrollTop-t.clientHeight<=u.nearEndThreshold&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:[X.topSpacerHeight>0?i(l,{sx:{height:X.topSpacerHeight}}):null,i(l,{sx:$,className:m.grid,children:Y.map(function(e,r){var t,o=X.startIndex+r,a=null!==(t=n.getterId(e,o))&&void 0!==t?t:o;return i(l,{className:m.gridItem,ref:N.current?void 0:function(n){return rn(o,n)},sx:null!==W?{minHeight:Q,height:Q}:void 0,children:i(H,{value:e,index:o})},a)})}),X.bottomSpacerHeight>0?i(l,{sx:{height:X.bottomSpacerHeight}}):null]})})}}(e);return function(t){var o,a,l=null!==(o=null!==(a=t.renderStrategy)&&void 0!==a?a:e.renderStrategy)&&void 0!==o?o:"normal";return i("virtualized"===l?I:r,n({},t))}}function S(n){return function(t){var o,a,l,u=c(e(r().m(function n(){var e,o,i,a,l,u,c,s,d;return r().w(function(n){for(;;)switch(n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(e=t.pagination)&&void 0!==e&&e.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:return c=null!==(o=null===(i=t.pagination)||void 0===i?void 0:i.page)&&void 0!==o?o:0,s=null!==(a=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==a?a:20,d=c+1,n.n=4,null===(u=t.onPageChange)||void 0===u?void 0:u.call(t,d,s);case 4:return n.a(2)}},n)})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(a=t.pagination)||void 0===a?void 0:a.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return i(n,{value:t.value,spacing:t.spacing,sizes:t.sizes,renderStrategy:t.renderStrategy,Component:t.Component,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?u:void 0,nearEndThreshold:t.nearEndThreshold,scrollResetToken:t.scrollResetToken})}}export{I as createViewGrid,S as createViewGridLoading,I as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-grid/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, Grid } from '@mui/material'\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { useMergedConfig } from './hooks'\r\nimport { ViewGridStyled, viewGridClasses as classes } from './styleds'\r\nimport { DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE, resolveGridColumnsFromWidth, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n// re-exports\r\nexport * from './types'\r\n\r\n//#region Normal\r\n/**\r\n * Creates a Grid view component that renders all items in the DOM. Suitable for small datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridNormal<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal: FC<IViewGridProps<T>> = (props) => {\r\n const [isScrolling, setIsScrolling] = useState(false)\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const ItemComponent = mergedConfig.Component\r\n const isAutoHeight = mergedConfig.normalOptions?.autoHeight === true\r\n const isClient = props.featureMode === 'client'\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [isClient, isAutoHeight, props.scrollResetToken])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setIsScrolling(t.scrollTop > mergedConfig.scrollingThreshold)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isScrolling) l.push(classes.scrolling)\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isScrolling, isAutoHeight])\r\n\r\n return (\r\n <ViewGridStyled className={rootClasses}>\r\n <Box className={classes.scrollContainer} ref={scrollContainerRef} onScroll={handleScroll}>\r\n <Grid container spacing={`${mergedConfig.spacing}px`} className={classes.grid}>\r\n {finalItems.map((item, index) => {\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Grid key={key} className={classes.gridItem} item {...mergedConfig.sizes}>\r\n <ItemComponent value={item} index={index} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridNormal\r\n}\r\n//#endregion\r\n//#region Virtualized\r\n/**\r\n * Creates a Grid view component that virtualizes items, rendering only those visible in the viewport. Suitable for large datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a virtualized grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridVirtualized<T>(config: IViewGridConfig<T>) {\r\n const ViewGridVirtualized: FC<IViewGridProps<T>> = (props) => {\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const { sizes, virtualizedOptions } = mergedConfig\r\n const ItemComponent = mergedConfig.Component\r\n\r\n // Track container geometry and the first measured item height used for virtualization math.\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const measuredItemsRef = useRef(new Map<number, HTMLDivElement>())\r\n const measurementRafRef = useRef<number | null>(null)\r\n const hasMeasuredDatasetRef = useRef(false)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number | null>(null)\r\n\r\n const overscan = Math.max(1, virtualizedOptions.overscan)\r\n const spacingPx = resolveGridSpacing(mergedConfig.spacing)\r\n const isScrolling = scrollTopState > mergedConfig.scrollingThreshold\r\n const effectiveItemHeight = measuredItemHeight ?? DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n // Keep viewport dimensions in sync so column count and window size react to container resize.\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextWidth = wrapRef.current?.clientWidth ?? 0\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const columns = resolveGridColumnsFromWidth(containerWidth, sizes)\r\n const rowHeight = effectiveItemHeight + spacingPx\r\n\r\n // Convert scroll position into a virtual row window plus spacer heights above and below.\r\n const windowed = useMemo(() => {\r\n const totalItems = finalItems.length\r\n if (totalItems === 0) {\r\n return { startRow: 0, endRow: -1, topSpacerHeight: 0, bottomSpacerHeight: 0, startIndex: 0, endIndex: -1 }\r\n }\r\n\r\n const totalRows = Math.ceil(totalItems / columns)\r\n const safeViewportHeight = Math.max(1, containerHeight)\r\n const effectiveScrollTop = scrollTopState\r\n const startRow = Math.max(0, Math.floor(effectiveScrollTop / rowHeight) - overscan)\r\n const visibleRows = Math.ceil(safeViewportHeight / rowHeight)\r\n const endRow = Math.min(totalRows - 1, startRow + visibleRows + overscan * 2)\r\n const startIndex = startRow * columns\r\n const endIndex = Math.min(totalItems - 1, (endRow + 1) * columns - 1)\r\n const topSpacerHeight = startRow * rowHeight\r\n const bottomSpacerHeight = Math.max(0, (totalRows - endRow - 1) * rowHeight)\r\n\r\n return { startRow, endRow, topSpacerHeight, bottomSpacerHeight, startIndex, endIndex }\r\n }, [columns, finalItems.length, overscan, rowHeight, scrollTopState, containerHeight])\r\n\r\n const visibleItems = windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []\r\n const measurementEndIndex = windowed.endIndex\r\n const contentSx = useMemo<BoxProps['sx']>(() => {\r\n return {\r\n display: 'grid',\r\n gap: `${spacingPx}px`,\r\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`\r\n }\r\n }, [columns, spacingPx])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const cancelScheduledMeasurement = useCallback(() => {\r\n if (measurementRafRef.current === null) return\r\n cancelAnimationFrame(measurementRafRef.current)\r\n measurementRafRef.current = null\r\n }, [])\r\n\r\n // Measure the largest item in the first rendered window once, then reuse it permanently.\r\n const scheduleMeasuredHeightUpdate = useCallback(() => {\r\n if (hasMeasuredDatasetRef.current || measurementRafRef.current !== null) return\r\n\r\n measurementRafRef.current = requestAnimationFrame(() => {\r\n measurementRafRef.current = null\r\n if (hasMeasuredDatasetRef.current) return\r\n\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0) return\r\n\r\n let nextHeight = 0\r\n for (const element of elements) {\r\n nextHeight = Math.max(nextHeight, element.getBoundingClientRect().height)\r\n }\r\n\r\n if (nextHeight <= 0) return\r\n\r\n hasMeasuredDatasetRef.current = true\r\n setMeasuredItemHeight(nextHeight)\r\n })\r\n }, [measurementEndIndex, windowed.startIndex])\r\n\r\n const setMeasuredItemRef = useCallback((index: number, node: HTMLDivElement | null) => {\r\n if (node) {\r\n measuredItemsRef.current.set(index, node)\r\n return\r\n }\r\n\r\n measuredItemsRef.current.delete(index)\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0 || hasMeasuredDatasetRef.current) return\r\n\r\n scheduleMeasuredHeightUpdate()\r\n\r\n const observer = new ResizeObserver(() => {\r\n scheduleMeasuredHeightUpdate()\r\n })\r\n\r\n for (const element of elements) {\r\n observer.observe(element)\r\n }\r\n\r\n return () => {\r\n observer.disconnect()\r\n cancelScheduledMeasurement()\r\n }\r\n }, [windowed.startIndex, measurementEndIndex, scheduleMeasuredHeightUpdate, cancelScheduledMeasurement])\r\n\r\n useLayoutEffect(() => {\r\n return () => {\r\n cancelScheduledMeasurement()\r\n }\r\n }, [cancelScheduledMeasurement])\r\n\r\n const rootClasses = [classes.root, classes.virtualized]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\r\n <Box ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n {/* Spacer keeps total scroll height stable for rows rendered before the current window. */}\r\n {windowed.topSpacerHeight > 0 ? <Box sx={{ height: windowed.topSpacerHeight }} /> : null}\r\n\r\n <Box sx={contentSx} className={classes.grid}>\r\n {visibleItems.map((item, offset) => {\r\n const index = windowed.startIndex + offset\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Box\r\n key={key}\r\n className={classes.gridItem}\r\n ref={!hasMeasuredDatasetRef.current ? (node) => setMeasuredItemRef(index, node as HTMLDivElement | null) : undefined}\r\n sx={measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined}\r\n >\r\n <ItemComponent value={item} index={index} />\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n {/* Spacer keeps total scroll height stable for rows rendered after the current window. */}\r\n {windowed.bottomSpacerHeight > 0 ? <Box sx={{ height: windowed.bottomSpacerHeight }} /> : null}\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\n/**\r\n * Factory function to create a Grid view component that can switch between normal and virtualized rendering strategies based on props and configuration.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props, supporting both normal and virtualized rendering strategies.\r\n */\r\nexport function createViewGrid<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal = createViewGridNormal<T>(config)\r\n const ViewGridVirtualized = createViewGridVirtualized<T>(config)\r\n\r\n const ViewGrid: FC<IViewGridProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewGridVirtualized {...props} />\r\n }\r\n return <ViewGridNormal {...props} />\r\n }\r\n return ViewGrid\r\n}\r\n\r\nexport interface IViewGridLoadingProps<T> extends IViewGridProps<T> {\r\n value: T[]\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewGridLoading<T>(GridComponent: ComponentType<IViewGridProps<T>>) {\r\n const ViewGridLoading: FC<IViewGridLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <GridComponent\r\n value={props.value}\r\n spacing={props.spacing}\r\n sizes={props.sizes}\r\n renderStrategy={props.renderStrategy}\r\n Component={props.Component}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n nearEndThreshold={props.nearEndThreshold}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewGridLoading\r\n}\r\n\r\nexport default createViewGrid\r\n//#endregion\r\n"],"names":["createViewGrid","config","ViewGridNormal","props","_mergedConfig$normalO","_useState","useState","_useState2","_slicedToArray","isScrolling","setIsScrolling","scrollContainerRef","useRef","mergedConfig","useMergedConfig","ItemComponent","Component","isAutoHeight","normalOptions","autoHeight","isClient","featureMode","finalItems","useMemo","value","useEffect","undefined","scrollResetToken","current","scrollTop","rootClasses","l","classes","root","normal","push","scrolling","join","_jsx","ViewGridStyled","className","children","Box","scrollContainer","ref","onScroll","e","_props$onNearEnd","t","currentTarget","scrollingThreshold","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Grid","container","spacing","concat","grid","map","item","index","_config$getterId","key","getterId","_objectSpread","gridItem","sizes","createViewGridNormal","ViewGridVirtualized","virtualizedOptions","wrapRef","measuredItemsRef","Map","measurementRafRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","startIndex","endIndex","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","cancelScheduledMeasurement","useCallback","cancelAnimationFrame","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","height","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","sx","offset","_config$getterId2","minHeight","createViewGridVirtualized","_ref9","_props$renderStrategy","renderStrategy","createViewGridLoading","GridComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-grid/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, Grid } from '@mui/material'\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { useMergedConfig } from './hooks'\r\nimport { ViewGridStyled, viewGridClasses as classes } from './styleds'\r\nimport { DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE, resolveGridColumnsFromWidth, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n// re-exports\r\nexport * from './types'\r\n\r\n//#region Normal\r\n/**\r\n * Creates a Grid view component that renders all items in the DOM. Suitable for small datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridNormal<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal: FC<IViewGridProps<T>> = (props) => {\r\n const [isScrolling, setIsScrolling] = useState(false)\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const ItemComponent = mergedConfig.Component\r\n const isAutoHeight = mergedConfig.normalOptions?.autoHeight === true\r\n const isClient = props.featureMode === 'client'\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [isClient, isAutoHeight, props.scrollResetToken])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setIsScrolling(t.scrollTop > mergedConfig.scrollingThreshold)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isScrolling) l.push(classes.scrolling)\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isScrolling, isAutoHeight])\r\n\r\n return (\r\n <ViewGridStyled className={rootClasses}>\r\n <Box className={classes.scrollContainer} ref={scrollContainerRef} onScroll={handleScroll}>\r\n <Grid container spacing={`${mergedConfig.spacing}px`} className={classes.grid}>\r\n {finalItems.map((item, index) => {\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Grid key={key} className={classes.gridItem} item {...mergedConfig.sizes}>\r\n <ItemComponent value={item} index={index} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridNormal\r\n}\r\n//#endregion\r\n//#region Virtualized\r\n/**\r\n * Creates a Grid view component that virtualizes items, rendering only those visible in the viewport. Suitable for large datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a virtualized grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridVirtualized<T>(config: IViewGridConfig<T>) {\r\n const ViewGridVirtualized: FC<IViewGridProps<T>> = (props) => {\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const { sizes, virtualizedOptions } = mergedConfig\r\n const ItemComponent = mergedConfig.Component\r\n\r\n // Track container geometry and the first measured item height used for virtualization math.\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const measuredItemsRef = useRef(new Map<number, HTMLDivElement>())\r\n const measurementRafRef = useRef<number | null>(null)\r\n const hasMeasuredDatasetRef = useRef(false)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number | null>(null)\r\n\r\n const overscan = Math.max(1, virtualizedOptions.overscan)\r\n const spacingPx = Math.round(resolveGridSpacing(mergedConfig.spacing))\r\n const isScrolling = scrollTopState > mergedConfig.scrollingThreshold\r\n const effectiveItemHeight = measuredItemHeight ?? DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n // Keep viewport dimensions in sync so column count and window size react to container resize.\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextWidth = wrapRef.current?.clientWidth ?? 0\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const columns = resolveGridColumnsFromWidth(containerWidth, sizes)\r\n const rowHeight = effectiveItemHeight + spacingPx\r\n\r\n // Convert scroll position into a virtual row window plus spacer heights above and below.\r\n const windowed = useMemo(() => {\r\n const totalItems = finalItems.length\r\n if (totalItems === 0) {\r\n return { startRow: 0, endRow: -1, topSpacerHeight: 0, bottomSpacerHeight: 0, startIndex: 0, endIndex: -1 }\r\n }\r\n\r\n const totalRows = Math.ceil(totalItems / columns)\r\n const safeViewportHeight = Math.max(1, containerHeight)\r\n const effectiveScrollTop = scrollTopState\r\n let startRow = Math.max(0, Math.floor(effectiveScrollTop / rowHeight) - overscan)\r\n const visibleRows = Math.ceil(safeViewportHeight / rowHeight)\r\n let endRow = Math.min(totalRows - 1, startRow + visibleRows + overscan * 2)\r\n // When clamped at the bottom, pin startRow to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n if (endRow === totalRows - 1) {\r\n startRow = Math.max(0, totalRows - visibleRows - overscan * 2)\r\n }\r\n const startIndex = startRow * columns\r\n const endIndex = Math.min(totalItems - 1, (endRow + 1) * columns - 1)\r\n const topSpacerHeight = startRow * rowHeight\r\n const bottomSpacerHeight = Math.max(0, (totalRows - endRow - 1) * rowHeight)\r\n\r\n return { startRow, endRow, topSpacerHeight, bottomSpacerHeight, startIndex, endIndex }\r\n }, [columns, finalItems.length, overscan, rowHeight, scrollTopState, containerHeight])\r\n\r\n const visibleItems = windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []\r\n const measurementEndIndex = windowed.endIndex\r\n const contentSx = useMemo<BoxProps['sx']>(() => {\r\n return {\r\n display: 'grid',\r\n gap: `${spacingPx}px`,\r\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`\r\n }\r\n }, [columns, spacingPx])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const cancelScheduledMeasurement = useCallback(() => {\r\n if (measurementRafRef.current === null) return\r\n cancelAnimationFrame(measurementRafRef.current)\r\n measurementRafRef.current = null\r\n }, [])\r\n\r\n // Measure the largest item in the first rendered window once, then reuse it permanently.\r\n const scheduleMeasuredHeightUpdate = useCallback(() => {\r\n if (hasMeasuredDatasetRef.current || measurementRafRef.current !== null) return\r\n\r\n measurementRafRef.current = requestAnimationFrame(() => {\r\n measurementRafRef.current = null\r\n if (hasMeasuredDatasetRef.current) return\r\n\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0) return\r\n\r\n let nextHeight = 0\r\n for (const element of elements) {\r\n nextHeight = Math.max(nextHeight, element.getBoundingClientRect().height)\r\n }\r\n\r\n if (nextHeight <= 0) return\r\n\r\n hasMeasuredDatasetRef.current = true\r\n setMeasuredItemHeight(Math.round(nextHeight))\r\n })\r\n }, [measurementEndIndex, windowed.startIndex])\r\n\r\n const setMeasuredItemRef = useCallback((index: number, node: HTMLDivElement | null) => {\r\n if (node) {\r\n measuredItemsRef.current.set(index, node)\r\n return\r\n }\r\n\r\n measuredItemsRef.current.delete(index)\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0 || hasMeasuredDatasetRef.current) return\r\n\r\n scheduleMeasuredHeightUpdate()\r\n\r\n const observer = new ResizeObserver(() => {\r\n scheduleMeasuredHeightUpdate()\r\n })\r\n\r\n for (const element of elements) {\r\n observer.observe(element)\r\n }\r\n\r\n return () => {\r\n observer.disconnect()\r\n cancelScheduledMeasurement()\r\n }\r\n }, [windowed.startIndex, measurementEndIndex, scheduleMeasuredHeightUpdate, cancelScheduledMeasurement])\r\n\r\n useLayoutEffect(() => {\r\n return () => {\r\n cancelScheduledMeasurement()\r\n }\r\n }, [cancelScheduledMeasurement])\r\n\r\n const rootClasses = [classes.root, classes.virtualized]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\r\n <Box ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n {/* Spacer keeps total scroll height stable for rows rendered before the current window. */}\r\n {windowed.topSpacerHeight > 0 ? <Box sx={{ height: windowed.topSpacerHeight }} /> : null}\r\n\r\n <Box sx={contentSx} className={classes.grid}>\r\n {visibleItems.map((item, offset) => {\r\n const index = windowed.startIndex + offset\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Box\r\n key={key}\r\n className={classes.gridItem}\r\n ref={!hasMeasuredDatasetRef.current ? (node) => setMeasuredItemRef(index, node as HTMLDivElement | null) : undefined}\r\n sx={measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined}\r\n >\r\n <ItemComponent value={item} index={index} />\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n {/* Spacer keeps total scroll height stable for rows rendered after the current window. */}\r\n {windowed.bottomSpacerHeight > 0 ? <Box sx={{ height: windowed.bottomSpacerHeight }} /> : null}\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\n/**\r\n * Factory function to create a Grid view component that can switch between normal and virtualized rendering strategies based on props and configuration.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props, supporting both normal and virtualized rendering strategies.\r\n */\r\nexport function createViewGrid<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal = createViewGridNormal<T>(config)\r\n const ViewGridVirtualized = createViewGridVirtualized<T>(config)\r\n\r\n const ViewGrid: FC<IViewGridProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewGridVirtualized {...props} />\r\n }\r\n return <ViewGridNormal {...props} />\r\n }\r\n return ViewGrid\r\n}\r\n\r\nexport interface IViewGridLoadingProps<T> extends IViewGridProps<T> {\r\n value: T[]\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewGridLoading<T>(GridComponent: ComponentType<IViewGridProps<T>>) {\r\n const ViewGridLoading: FC<IViewGridLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <GridComponent\r\n value={props.value}\r\n spacing={props.spacing}\r\n sizes={props.sizes}\r\n renderStrategy={props.renderStrategy}\r\n Component={props.Component}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n nearEndThreshold={props.nearEndThreshold}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewGridLoading\r\n}\r\n\r\nexport default createViewGrid\r\n//#endregion\r\n"],"names":["createViewGrid","config","ViewGridNormal","props","_mergedConfig$normalO","_useState","useState","_useState2","_slicedToArray","isScrolling","setIsScrolling","scrollContainerRef","useRef","mergedConfig","useMergedConfig","ItemComponent","Component","isAutoHeight","normalOptions","autoHeight","isClient","featureMode","finalItems","useMemo","value","useEffect","undefined","scrollResetToken","current","scrollTop","rootClasses","l","classes","root","normal","push","scrolling","join","_jsx","ViewGridStyled","className","children","Box","scrollContainer","ref","onScroll","e","_props$onNearEnd","t","currentTarget","scrollingThreshold","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Grid","container","spacing","concat","grid","map","item","index","_config$getterId","key","getterId","_objectSpread","gridItem","sizes","createViewGridNormal","ViewGridVirtualized","virtualizedOptions","wrapRef","measuredItemsRef","Map","measurementRafRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","round","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","startIndex","endIndex","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","cancelScheduledMeasurement","useCallback","cancelAnimationFrame","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","height","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","sx","offset","_config$getterId2","minHeight","createViewGridVirtualized","_ref9","_props$renderStrategy","renderStrategy","createViewGridLoading","GridComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as e,asyncToGenerator as l,regenerator as n,slicedToArray as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as f,TableRow as v,TableCell as m,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as N}from"./hooks.js";import{ViewListStyled as H,viewListClasses as T}from"./styled.js";import{LIST_HEADER_HEIGHT as k,resolveListSpacerHeight as y,mapSxTableCell as w}from"./helpers.js";function M(e,l,n){var r=l[e.field],a=e.valueGetter?e.valueGetter(r,l,n):r,i={value:a,row:l,index:n,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return t(x,{variant:"body2",noWrap:!0,title:o,children:o})}function R(l){var n=function(e){return function(l){var n=C(e,l),r=1==n.normalOptions.autoHeight,i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),c=l.onSelectionChange,s=o(null);d(function(){"client"===l.featureMode&&!r&&void 0!==l.scrollResetToken&&s.current&&(s.current.scrollTop=0)},[l.featureMode,l.scrollResetToken]);var x=N(l.value,e.getterId,n.selectable,l.selectedIds,c),k=x.selectedIds,y=x.isAllSelected,R=x.isSomeSelected,z=x.handleToggleAll,I=x.handleToggleRow,j=u(function(){var e=[T.root,T.normal];return r&&e.push(T.autoHeight),e.join(" ")},[r]);return t(H,{className:j,style:n.rootStyle,children:t(h,{ref:s,className:T.scrollContainer,onScroll:function(e){if(!r){var t,a=e.currentTarget;a.scrollHeight-a.scrollTop-a.clientHeight<=n.nearEndThreshold&&(null===(t=l.onNearEnd)||void 0===t||t.call(l))}},children:a(g,{size:"small",className:T.table,children:[t(f,{className:T.tableHeader,children:a(v,{children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:t(p,{checked:y,indeterminate:R,onChange:z})}),n.columns.map(function(e){var l;return t(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),t(b,{children:l.value.map(function(l,r){var o,c=null!==(o=e.getterId(l,r))&&void 0!==o?o:r,d=k.includes(c),s=n.rowHeight,u=n.cellPadding;return a(v,{hover:!0,sx:{height:s},selected:d,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:s,padding:u},children:t(p,{checked:d,onChange:function(){return I(c)}})}),n.columns.map(function(e){return t(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:s,padding:u}),children:t(S,{className:T.tableCellContent,children:M(e,l,r)})},"".concat(String(c),"-").concat(String(e.field)))})]},c)})})]})})})}}(l),i=function(e){return function(l){var n=C(e,l),i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),x=l.onSelectionChange,R=N(l.value,e.getterId,n.selectable,l.selectedIds,x),z=R.selectedIds,I=R.isAllSelected,j=R.isSomeSelected,O=R.handleToggleAll,B=R.handleToggleRow,A=o(null),E=o(null),P=o(!1),G=c(0),_=r(G,2),W=_[0],q=_[1],D=c(0),F=r(D,2),J=F[0],K=F[1],L=c(k),Q=r(L,2),U=Q[0],V=Q[1],X=Math.max(1,n.virtualizedOptions.overscan);d(function(){"client"===l.featureMode&&void 0!==l.scrollResetToken&&(A.current&&(A.current.scrollTop=0),K(0))},[l.featureMode,l.scrollResetToken]),s(function(){if(A.current){var e=function(){var e,l,n=null!==(e=null===(l=A.current)||void 0===l?void 0:l.clientHeight)&&void 0!==e?e:0;q(function(e){return e===n?e:n})};e();var l=new ResizeObserver(function(){return e()});return l.observe(A.current),function(){return l.disconnect()}}},[]),s(function(){P.current=!1},[n.columns.length]),s(function(){var e,l;if(!P.current){var n=null!==(e=null===(l=E.current)||void 0===l?void 0:l.offsetHeight)&&void 0!==e?e:0;n>0&&(P.current=!0,V(n))}},[n.columns.length]);var Y=u(function(){var e=l.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};var r=n.rowHeight,t=n.rowSpacing,a=r+t,i=J,o=Math.max(1,W-U),c=Math.max(0,i-U),d=Math.max(0,Math.floor(c/a)-X),s=Math.ceil(o/a),u=Math.min(e-1,d+s+2*X);return{start:d,end:u,topSpacerHeight:y(d,r,t),bottomSpacerHeight:y(e-u-1,r,t)}},[l.value.length,U,X,n,J,W]),Z=Y.end>=Y.start?l.value.slice(Y.start,Y.end+1):[],$=[T.root,T.virtualized].filter(Boolean).join(" ");return t(H,{className:$,style:n.rootStyle,children:t(h,{ref:A,className:T.scrollContainer,onScroll:function(e){var r,t=e.currentTarget;K(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=n.nearEndThreshold&&(null===(r=l.onNearEnd)||void 0===r||r.call(l))},children:a(g,{size:"small",className:T.table,children:[t(f,{className:T.tableHeader,children:a(v,{ref:E,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:t(p,{checked:I,indeterminate:j,onChange:O})}),n.columns.map(function(e){var l;return t(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),a(b,{children:[Y.topSpacerHeight>0?t(v,{className:T.tableSpacerRow,children:t(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.topSpacerHeight,padding:0,border:0}})}):null,Z.map(function(l,r){var o,c=Y.start+r,d=null!==(o=e.getterId(l,c))&&void 0!==o?o:c,s=z.includes(d),u=n.rowHeight,h=n.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:u,padding:h},children:t(p,{checked:s,onChange:function(){return B(d)}})}),n.columns.map(function(e){return t(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:u,padding:h}),children:t(S,{className:T.tableCellContent,children:M(e,l,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),Y.bottomSpacerHeight>0?t(v,{className:T.tableSpacerRow,children:t(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(l);return function(r){var a,o,c=null!==(a=null!==(o=r.renderStrategy)&&void 0!==o?o:l.renderStrategy)&&void 0!==a?a:"normal";return t("virtualized"===c?i:n,e({},r))}}function z(e){return function(r){var a,o,c,d=i(l(n().m(function e(){var l,t,a,i,o,c,d,s,u;return n().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===r.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(l=r.pagination)&&void 0!==l&&l.hasNext){e.n=2;break}return e.a(2);case 2:if(!r.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(t=null===(a=r.pagination)||void 0===a?void 0:a.page)&&void 0!==t?t:0,s=null!==(i=null===(o=r.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=r.onPageChange)||void 0===c?void 0:c.call(r,u,s);case 4:return e.a(2)}},e)})),[r.loadMode,null===(a=r.pagination)||void 0===a?void 0:a.hasNext,null===(o=r.pagination)||void 0===o?void 0:o.page,null===(c=r.pagination)||void 0===c?void 0:c.pageSize,r.loading,r.onPageChange]);return t(e,{value:r.value,columns:r.columns,density:r.density,spacing:r.spacing,renderStrategy:r.renderStrategy,normalOptions:r.normalOptions,virtualizedOptions:r.virtualizedOptions,onNearEnd:"infiniteScroll"===r.loadMode?d:void 0,selectable:r.selectable,selectedIds:r.selectedIds,onSelectionChange:r.onSelectionChange,scrollResetToken:r.scrollResetToken})}}export{R as createViewList,z as createViewListLoading,R as default};
1
+ import{objectSpread2 as e,asyncToGenerator as l,regenerator as n,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as f,TableRow as m,TableCell as v,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as N}from"./hooks.js";import{ViewListStyled as H,viewListClasses as T}from"./styled.js";import{LIST_HEADER_HEIGHT as k,resolveListSpacerHeight as y,mapSxTableCell as M}from"./helpers.js";function w(e,l,n){var t=l[e.field],a=e.valueGetter?e.valueGetter(t,l,n):t,i={value:a,row:l,index:n,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function R(l){var n=function(e){return function(l){var n=C(e,l),t=1==n.normalOptions.autoHeight,i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),c=l.onSelectionChange,s=o(null);d(function(){"client"===l.featureMode&&!t&&void 0!==l.scrollResetToken&&s.current&&(s.current.scrollTop=0)},[l.featureMode,l.scrollResetToken]);var x=N(l.value,e.getterId,n.selectable,l.selectedIds,c),k=x.selectedIds,y=x.isAllSelected,R=x.isSomeSelected,z=x.handleToggleAll,I=x.handleToggleRow,j=u(function(){var e=[T.root,T.normal];return t&&e.push(T.autoHeight),e.join(" ")},[t]);return r(H,{className:j,style:n.rootStyle,children:r(h,{ref:s,className:T.scrollContainer,onScroll:function(e){if(!t){var r,a=e.currentTarget;a.scrollHeight-a.scrollTop-a.clientHeight<=n.nearEndThreshold&&(null===(r=l.onNearEnd)||void 0===r||r.call(l))}},children:a(g,{size:"small",className:T.table,children:[r(f,{className:T.tableHeader,children:a(m,{children:[n.selectable&&r(v,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:r(p,{checked:y,indeterminate:R,onChange:z})}),n.columns.map(function(e){var l;return r(v,{className:T.tableHeaderCell,align:e.align,sx:M(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),r(b,{children:l.value.map(function(l,t){var o,c=null!==(o=e.getterId(l,t))&&void 0!==o?o:t,d=k.includes(c),s=n.rowHeight,u=n.cellPadding;return a(m,{hover:!0,sx:{height:s},selected:d,children:[n.selectable&&r(v,{padding:"checkbox",className:T.tableBodyCell,sx:{height:s,padding:u},children:r(p,{checked:d,onChange:function(){return I(c)}})}),n.columns.map(function(e){return r(v,{className:T.tableBodyCell,align:e.align,sx:M(e,i,{height:s,padding:u}),children:r(S,{className:T.tableCellContent,children:w(e,l,t)})},"".concat(String(c),"-").concat(String(e.field)))})]},c)})})]})})})}}(l),i=function(e){return function(l){var n=C(e,l),i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),x=l.onSelectionChange,R=N(l.value,e.getterId,n.selectable,l.selectedIds,x),z=R.selectedIds,I=R.isAllSelected,j=R.isSomeSelected,O=R.handleToggleAll,B=R.handleToggleRow,A=o(null),E=o(null),P=o(!1),G=c(0),_=t(G,2),W=_[0],q=_[1],D=c(0),F=t(D,2),J=F[0],K=F[1],L=c(k),Q=t(L,2),U=Q[0],V=Q[1],X=Math.max(1,n.virtualizedOptions.overscan);d(function(){"client"===l.featureMode&&void 0!==l.scrollResetToken&&(A.current&&(A.current.scrollTop=0),K(0))},[l.featureMode,l.scrollResetToken]),s(function(){if(A.current){var e=function(){var e,l,n=null!==(e=null===(l=A.current)||void 0===l?void 0:l.clientHeight)&&void 0!==e?e:0;q(function(e){return e===n?e:n})};e();var l=new ResizeObserver(function(){return e()});return l.observe(A.current),function(){return l.disconnect()}}},[]),s(function(){P.current=!1},[n.columns.length]),s(function(){var e,l;if(!P.current){var n=null!==(e=null===(l=E.current)||void 0===l?void 0:l.offsetHeight)&&void 0!==e?e:0;n>0&&(P.current=!0,V(n))}},[n.columns.length]);var Y=u(function(){var e=l.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};var t=n.rowHeight,r=n.rowSpacing,a=Math.round(t),i=Math.round(r),o=a+i,c=J,d=Math.max(1,W-U),s=Math.max(0,c-U),u=Math.ceil(d/o),h=Math.max(0,Math.floor(s/o)-X),g=Math.min(e-1,h+u+2*X);return g===e-1&&(h=Math.max(0,e-u-2*X)),{start:h,end:g,topSpacerHeight:y(h,a,i),bottomSpacerHeight:y(e-g-1,a,i)}},[l.value.length,U,X,n,J,W]),Z=Y.end>=Y.start?l.value.slice(Y.start,Y.end+1):[],$=[T.root,T.virtualized].filter(Boolean).join(" ");return r(H,{className:$,style:n.rootStyle,children:r(h,{ref:A,className:T.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;K(Math.round(r.scrollTop)),r.scrollHeight-r.scrollTop-r.clientHeight<=n.nearEndThreshold&&(null===(t=l.onNearEnd)||void 0===t||t.call(l))},children:a(g,{size:"small",className:T.table,children:[r(f,{className:T.tableHeader,children:a(m,{ref:E,children:[n.selectable&&r(v,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:r(p,{checked:I,indeterminate:j,onChange:O})}),n.columns.map(function(e){var l;return r(v,{className:T.tableHeaderCell,align:e.align,sx:M(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),a(b,{children:[Y.topSpacerHeight>0?r(m,{className:T.tableSpacerRow,children:r(v,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.topSpacerHeight,padding:0,border:0}})}):null,Z.map(function(l,t){var o,c=Y.start+t,d=null!==(o=e.getterId(l,c))&&void 0!==o?o:c,s=z.includes(d),u=n.rowHeight,h=n.cellPadding;return a(m,{hover:!0,sx:{height:u},selected:s,children:[n.selectable&&r(v,{padding:"checkbox",className:T.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return B(d)}})}),n.columns.map(function(e){return r(v,{className:T.tableBodyCell,align:e.align,sx:M(e,i,{height:u,padding:h}),children:r(S,{className:T.tableCellContent,children:w(e,l,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),Y.bottomSpacerHeight>0?r(m,{className:T.tableSpacerRow,children:r(v,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(l);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:l.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:n,e({},t))}}function z(e){return function(t){var a,o,c,d=i(l(n().m(function e(){var l,r,a,i,o,c,d,s,u;return n().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(l=t.pagination)&&void 0!==l&&l.hasNext){e.n=2;break}return e.a(2);case 2:if(!t.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{R as createViewList,z as createViewListLoading,R as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n const isClient = props.featureMode === 'client'\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const rowStride = rowHeight + rowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n const end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, rowHeight, rowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, rowHeight, rowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","isAutoHeight","normalOptions","autoHeight","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","scrollContainerRef","useRef","useEffect","featureMode","undefined","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","style","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","floor","visibleCount","ceil","min","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n const isClient = props.featureMode === 'client'\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const intRowHeight = Math.round(rowHeight)\r\n const intRowSpacing = Math.round(rowSpacing)\r\n const rowStride = intRowHeight + intRowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n let start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n let end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n // When clamped at the bottom, pin start to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n if (end === totalItems - 1) {\r\n start = Math.max(0, totalItems - visibleCount - overscan * 2)\r\n }\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","isAutoHeight","normalOptions","autoHeight","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","scrollContainerRef","useRef","useEffect","featureMode","undefined","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","style","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","intRowHeight","round","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","min","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.2.23",
3
+ "version": "2.2.24",
4
4
  "description": "Dinocollab core - libraries for building collaborative applications with React 18",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",