dinocollab-core 2.2.31 → 2.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/data-surface/index.create.js +1 -1
- package/dist/src/data-surface/index.create.js.map +1 -1
- package/dist/src/data-surface/ui.units.js +1 -1
- package/dist/src/data-surface/ui.units.js.map +1 -1
- package/dist/src/data-surface/view-grid/index.js +1 -1
- package/dist/src/data-surface/view-grid/index.js.map +1 -1
- package/dist/src/data-surface/view-list/index.js +1 -1
- package/dist/src/data-surface/view-list/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{slicedToArray as n,asyncToGenerator as e,regenerator as i,objectSpread2 as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as o,jsx as t}from"react/jsx-runtime";import{styled as r,Box as l}from"@mui/material";import{useState as u,useMemo as g,useCallback as d,useEffect as v,useRef as
|
|
1
|
+
import{slicedToArray as n,asyncToGenerator as e,regenerator as i,objectSpread2 as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as o,jsx as t}from"react/jsx-runtime";import{styled as r,Box as l}from"@mui/material";import{useState as u,useMemo as g,useCallback as d,useEffect as v,useRef as c}from"react";import{LoadingModeRule as s}from"./types.js";import{createViewList as p,createViewListLoading as f}from"./view-list/index.js";import{createViewGrid as h,createViewGridLoading as m}from"./view-grid/index.js";import{createViewSwitchTransition as P}from"./view-switch-transition.js";import{PanelLoading as C,PanelNoData as S,PanelLoadMore as x,PanelInfiniteScrollFooter as w,PanelPaginationFooter as z}from"./ui.units.js";function N(r){if(!r.GridComponent){var N=r.gridConfig||{getterId:function(n,e){return e}};r.gridConfig=N,r.GridComponent=h(N)}if(!r.ListComponent){var L=r.listConfig||{getterId:function(n,e){return e}};r.listConfig=L,r.ListComponent=p(L)}var b=r.defaultViewMode,y=void 0===b?"grid":b,j=r.defaultLoadMode,k=void 0===j?"pagination":j,T=r.featureMode,D=void 0===T?"client":T,I=P({}),V=m(r.GridComponent),B=f(r.ListComponent);return function(p){var f,h,m,P,N,L,b=p.slots||{},j=null!==(f=null!==(h=null===(m=p.pagination)||void 0===m?void 0:m.pageSize)&&void 0!==h?h:r.defaultPageSize)&&void 0!==f?f:20,T=u({page:0,pageSize:j}),G=n(T,2),H=G[0],A=G[1],R=g(function(){var n,e,i,a,o,t=null!==(n=p.pagination)&&void 0!==n?n:H;return{page:null!==(e=t.page)&&void 0!==e?e:0,pageSize:null!==(i=t.pageSize)&&void 0!==i?i:j,hasNext:null!==(a=t.hasNext)&&void 0!==a&&a,hasPrev:null!==(o=t.hasPrev)&&void 0!==o&&o,total:t.total}},[p.pagination,H]),_=null!==(P=p.viewMode)&&void 0!==P?P:y,J=null!==(N=p.loadMode)&&void 0!==N?N:k,q=g(function(){var n,e,i,a;return"grid"===_?null!==(i=null===(a=r.gridConfig)||void 0===a?void 0:a.renderStrategy)&&void 0!==i?i:"normal":null!==(n=null===(e=r.listConfig)||void 0===e?void 0:e.renderStrategy)&&void 0!==n?n:"normal"},[_]),E=d(e(i().m(function n(){var e,o,t,r,l;return i().w(function(n){for(;;)switch(n.n){case 0:if(!((r=null!==(e=R.page)&&void 0!==e?e:0)<=0)){n.n=1;break}return n.a(2);case 1:return l=r-1,p.pagination||A(function(n){return a(a({},n),{},{page:l})}),n.n=2,null===(o=p.onPageChange)||void 0===o?void 0:o.call(p,l,null!==(t=R.pageSize)&&void 0!==t?t:j);case 2:return n.a(2)}},n)})),[R.page,R.pageSize,p.pagination,p.onPageChange]),F=d(e(i().m(function n(){var e,o,t,r,l;return i().w(function(n){for(;;)switch(n.n){case 0:if(R.hasNext){n.n=1;break}return n.a(2);case 1:return r=null!==(e=R.page)&&void 0!==e?e:0,l=r+1,p.pagination||A(function(n){return a(a({},n),{},{page:l})}),n.n=2,null===(o=p.onPageChange)||void 0===o?void 0:o.call(p,l,null!==(t=R.pageSize)&&void 0!==t?t:j);case 2:return n.a(2)}},n)})),[R.hasNext,R.page,R.pageSize,p.pagination,p.onPageChange]),K=d(function(){var n=e(i().m(function n(e){var o,t;return i().w(function(n){for(;;)switch(n.n){case 0:if(!(e<0)){n.n=1;break}return n.a(2);case 1:return p.pagination||A(function(n){return a(a({},n),{},{page:e})}),n.n=2,null===(o=p.onPageChange)||void 0===o?void 0:o.call(p,e,null!==(t=R.pageSize)&&void 0!==t?t:j);case 2:return n.a(2)}},n)}));return function(e){return n.apply(this,arguments)}}(),[R.pageSize,p.pagination,p.onPageChange]),O=p.value||[],Q="client"===D?p.value:void 0;v(function(){"client"!==D||p.pagination||A(function(n){return a(a({},n),{},{page:0})})},[p.value]);var U=c(null),W=u(!1),X=n(W,2),Y=X[0],Z=X[1];v(function(){var n;"server"===D&&void 0===(null===(n=p.pagination)||void 0===n?void 0:n.total)&&(p.loading?U.current=O.length:null!==U.current&&(O.length<=U.current?Z(!0):Z(!1),U.current=null))},[p.loading,D,null===(L=p.pagination)||void 0===L?void 0:L.total,O.length]),v(function(){0===R.page&&Z(!1)},[R.page]);var $=g(function(){var n,e,i=null!==(n=R.page)&&void 0!==n?n:0,o=null!==(e=R.pageSize)&&void 0!==e?e:j;if("client"===D){var t=O.length;return{page:i,pageSize:o,hasNext:o*(i+1)<t,hasPrev:i>0,total:t}}return void 0===R.total&&Y?a(a({},R),{},{hasNext:!1}):R},[R,O.length,D,j,Y]),nn=g(function(){if("client"===D){var n,e,i=null!==(n=$.page)&&void 0!==n?n:0,a=null!==(e=$.pageSize)&&void 0!==e?e:j;if("infiniteScroll"===J)return O.slice(0,(i+1)*a);var o=i*a;return O.slice(o,o+a)}return O},[O,$,D,J,j]),en=0===O.length,an=Boolean(p.loading&&en),on=!p.loading&&en,tn=Boolean(p.loading)&&!en,rn=d(function(){var n=e(i().m(function n(e,a){var o;return i().w(function(n){for(;;)switch(n.n){case 0:return p.pagination||A({page:e,pageSize:a}),n.n=1,null===(o=p.onPageChange)||void 0===o?void 0:o.call(p,e,a);case 1:return n.a(2)}},n)}));return function(e,i){return n.apply(this,arguments)}}(),[p.pagination,p.onPageChange]),ln=g(function(){return a({value:nn,loadMode:J,loading:p.loading,pagination:$,onPageChange:rn,scrollResetToken:Q},b.gridViewProps)},[nn,J,p.loading,$,rn,Q,b.gridViewProps]),un=c(ln);un.current=ln;var gn=g(function(){var n,e;return a({value:nn,loadMode:J,loading:p.loading,pagination:$,onPageChange:rn,renderStrategy:q,selectable:null!==(n=p.selectable)&&void 0!==n?n:null===(e=r.listConfig)||void 0===e?void 0:e.selectable,selectedIds:p.selectedIds,onSelectionChange:p.onSelectionChange,scrollResetToken:Q},b.listViewProps)},[nn,J,p.loading,$,q,rn,p.selectable,p.selectedIds,p.onSelectionChange,Q,b.listViewProps]),dn=c(gn);dn.current=gn;var vn=g(function(){return function(){return t(B,a({},dn.current))}},[B]),cn=g(function(){return function(){return t(V,a({},un.current))}},[V]),sn=g(function(){return b.PanelLoading||(null==r?void 0:r.PanelLoading)||C},[b.PanelLoading,r.PanelLoading,_]),pn=g(function(){return b.PanelNoData||(null==r?void 0:r.PanelNoData)||S},[b.PanelNoData,r.PanelNoData,_]),fn=g(function(){return b.PanelLoadMore||(null==r?void 0:r.PanelLoadMore)||x},[b.PanelLoadMore,r.PanelLoadMore]);return o(M,{sx:p.sx,children:[o(l,{sx:{flex:1,minHeight:0,position:"relative"},children:[an&&t(sn,{viewMode:_}),on&&t(pn,{viewMode:_}),!an&&!on&&t(I,{value:_,viewA:{value:"list",Content:vn},viewB:{value:"grid",Content:cn}}),tn&&t(fn,{})]}),function(){var n,e,i;if(J===s.infiniteScroll){var a,o=null===(a=p.slots)||void 0===a?void 0:a.footer;return t(w,{loading:p.loading,hasNext:$.hasNext,currentCount:nn.length,total:$.total,slots:{statusText:null==o?void 0:o.status,rangeText:null==o?void 0:o.range}})}return t(z,{page:null!==(n=$.page)&&void 0!==n?n:0,pageSize:null!==(e=$.pageSize)&&void 0!==e?e:j,total:$.total,hasNext:$.hasNext,hasPrev:(null!==(i=$.page)&&void 0!==i?i:0)>0,loading:p.loading,onPrevPage:E,onNextPage:F,onPageJump:K})}()]})}}var M=r(l)(function(n){return{display:"flex",flexDirection:"column",width:"100%",height:"100%",position:"relative",flex:1,minHeight:0,backgroundColor:n.theme.palette.background.default}});export{N as createDataSurface,N as default};
|
|
2
2
|
//# sourceMappingURL=index.create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.create.js","sources":["../../../src/data-surface/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, styled } from '@mui/material'\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { DataSurfaceViewMode, LoadingModeRule, DataSurfaceFeatureMode } from './types'\r\nimport { createViewList, createViewListLoading } from './view-list'\r\nimport { createViewGrid, createViewGridLoading } from './view-grid'\r\nimport { createViewSwitchTransition } from './view-switch-transition'\r\nimport { PanelInfiniteScrollFooter, PanelLoadMore, PanelLoading, PanelNoData, PanelPaginationFooter } from './ui.units'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { IViewGridLoadingProps } from './view-grid'\r\nimport type { IViewGridConfig, IViewGridProps } from './view-grid/types'\r\nimport type { TPagination, TDataSurfaceState, TRenderableNode } from './types'\r\nimport type { IViewListConfig, IViewListLoadingProps, IViewListProps } from './view-list'\r\n\r\nexport interface IDataSurfaceSlots<T> {\r\n listViewProps?: IViewListProps<T>\r\n gridViewProps?: IViewGridProps<T>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n footer?: {\r\n status?: TRenderableNode\r\n range?: TRenderableNode\r\n }\r\n}\r\n\r\nexport interface IDataSurfaceProps<T> {\r\n value?: T[]\r\n /**\r\n * @deprecated No longer used. Use `viewMode` and `loadMode` props directly instead.\r\n * Controlled state. When provided, DataSurface becomes fully controlled.\r\n */\r\n state?: TDataSurfaceState\r\n /**\r\n * @deprecated No longer used. Component now uses uncontrolled mode with props.\r\n * Called on any state change (viewMode, loadMode, page, pageSize).\r\n */\r\n onStateChange?: (state: TDataSurfaceState) => void\r\n viewMode?: DataSurfaceViewMode\r\n /** Pagination metadata shared by both modes. */\r\n pagination?: TPagination\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** True while a page fetch is in flight (shows loading indicator). */\r\n loading?: boolean\r\n /**\r\n * Called when the component needs a new page of data.\r\n * - pagination mode: triggered by user clicking page control\r\n * - infiniteScroll mode: triggered automatically when scrolling near the bottom\r\n * Supports async operations - return a Promise to indicate loading state.\r\n */\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n /** Load orchestration mode. @default 'pagination' */\r\n loadMode?: LoadingModeRule\r\n sx?: BoxProps['sx']\r\n slots?: IDataSurfaceSlots<T>\r\n /** Enable row selection with checkboxes (List view only). */\r\n selectable?: boolean\r\n /** Array of selected row IDs (List view only). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes (List view only). */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n}\r\n\r\nexport interface IDataSurfaceConfig<T> {\r\n /** Feature mode determines the internal optimizations and rendering strategies. @default 'client' */\r\n featureMode?: DataSurfaceFeatureMode\r\n /** Default view mode when not provided via props. @default 'grid' */\r\n defaultViewMode?: DataSurfaceViewMode\r\n /** Default load mode when not provided via props. @default 'pagination' */\r\n defaultLoadMode?: LoadingModeRule\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** Configuration for List view. If not provided, List view will use default settings. */\r\n listConfig?: IViewListConfig<T>\r\n /** Custom List component. If not provided, a default List component will be used. */\r\n ListComponent?: ComponentType<IViewListProps<T>>\r\n /** Configuration for Grid view. If not provided, Grid view will use default settings. */\r\n gridConfig?: IViewGridConfig<T>\r\n /** Custom Grid component. If not provided, a default Grid component will be used. */\r\n GridComponent?: ComponentType<IViewGridProps<T>>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n}\r\n\r\nexport function createDataSurface<T>(config: IDataSurfaceConfig<T>) {\r\n if (!config.GridComponent) {\r\n const configInput: IViewGridConfig<T> = config.gridConfig || { getterId: (item: T, index: number) => index }\r\n config.gridConfig = configInput\r\n config.GridComponent = createViewGrid<T>(configInput)\r\n }\r\n\r\n if (!config.ListComponent) {\r\n const configInput: IViewListConfig<T> = config.listConfig || { getterId: (item: T, index: number) => index }\r\n config.listConfig = configInput\r\n config.ListComponent = createViewList<T>(configInput)\r\n }\r\n\r\n const { defaultViewMode = 'grid', defaultLoadMode = 'pagination', featureMode = 'client' } = config\r\n const ViewSwitchTranstionInstance = createViewSwitchTransition<DataSurfaceViewMode>({})\r\n const GridLoadingComponent = createViewGridLoading<T>(config.GridComponent as ComponentType<IViewGridProps<T>>)\r\n const ListLoadingComponent = createViewListLoading<T>(config.ListComponent as ComponentType<IViewListProps<T>>)\r\n\r\n const DataSurface: FC<IDataSurfaceProps<T>> = (props) => {\r\n const slots = props.slots || {}\r\n const defaultPageSize = props.pagination?.pageSize ?? config.defaultPageSize ?? 20\r\n // separate pagination state\r\n const [internalPagination, setInternalPagination] = useState<TPagination>({ page: 0, pageSize: defaultPageSize })\r\n\r\n // resolved pagination: external takes priority over internal\r\n const paginationState = useMemo<TPagination>(() => {\r\n const p = props.pagination ?? internalPagination\r\n return {\r\n page: p.page ?? 0,\r\n pageSize: p.pageSize ?? defaultPageSize,\r\n hasNext: p.hasNext ?? false,\r\n hasPrev: p.hasPrev ?? false,\r\n total: p.total\r\n }\r\n }, [props.pagination, internalPagination])\r\n\r\n const viewMode = props.viewMode ?? defaultViewMode\r\n const loadMode = props.loadMode ?? defaultLoadMode\r\n\r\n // Determine renderStrategy based on current viewMode\r\n const renderStrategy = useMemo(() => {\r\n if (viewMode === 'grid') {\r\n return config.gridConfig?.renderStrategy ?? 'normal'\r\n }\r\n return config.listConfig?.renderStrategy ?? 'normal'\r\n }, [viewMode])\r\n\r\n const handlePrevPage = useCallback(async () => {\r\n const currentPage = paginationState.page ?? 0\r\n if (currentPage <= 0) return\r\n const prevPage = currentPage - 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: prevPage }))\r\n }\r\n await props.onPageChange?.(prevPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handleNextPage = useCallback(async () => {\r\n if (!paginationState.hasNext) return\r\n const currentPage = paginationState.page ?? 0\r\n const nextPage = currentPage + 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: nextPage }))\r\n }\r\n await props.onPageChange?.(nextPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.hasNext, paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handlePageJump = useCallback(\r\n async (targetPage: number) => {\r\n if (targetPage < 0) return\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: targetPage }))\r\n }\r\n await props.onPageChange?.(targetPage, paginationState.pageSize ?? defaultPageSize)\r\n },\r\n [paginationState.pageSize, props.pagination, props.onPageChange]\r\n )\r\n\r\n const finalValue = props.value || []\r\n\r\n // Token changes whenever props.value reference changes — used to reset scroll in views (client mode only)\r\n const scrollResetToken = featureMode === 'client' ? props.value : undefined\r\n\r\n // Reset page to 0 when the data source changes (e.g. new filtered array passed in) — client mode only\r\n useEffect(() => {\r\n if (featureMode === 'client' && !props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: 0 }))\r\n }\r\n }, [props.value])\r\n\r\n // When running in client feature mode, derive pagination metadata from the full value\r\n const derivedPagination = useMemo<TPagination>(() => {\r\n const page = paginationState.page ?? 0\r\n const pageSize = paginationState.pageSize ?? defaultPageSize\r\n if (featureMode === 'client') {\r\n const total = finalValue.length\r\n const hasNext = pageSize * (page + 1) < total\r\n const hasPrev = page > 0\r\n return { page, pageSize, hasNext, hasPrev, total }\r\n }\r\n return paginationState\r\n }, [paginationState, finalValue.length, featureMode, defaultPageSize])\r\n\r\n // Slice the input value when client-side pagination is enabled\r\n const paginatedValue = useMemo(() => {\r\n if (featureMode === 'client') {\r\n const page = derivedPagination.page ?? 0\r\n const pageSize = derivedPagination.pageSize ?? defaultPageSize\r\n if (loadMode === 'infiniteScroll') {\r\n // accumulate all items from page 0 → current page\r\n return finalValue.slice(0, (page + 1) * pageSize)\r\n }\r\n const start = page * pageSize\r\n return finalValue.slice(start, start + pageSize)\r\n }\r\n return finalValue\r\n }, [finalValue, derivedPagination, featureMode, loadMode, defaultPageSize])\r\n\r\n const isEmptyData = finalValue.length === 0\r\n const isInitialLoading = Boolean(props.loading && isEmptyData)\r\n const isNoData = !props.loading && isEmptyData\r\n const showLoadingOverlay = Boolean(props.loading) && !isEmptyData\r\n\r\n const handleGridPageChange = useCallback(\r\n async (page: number, pageSize: number) => {\r\n if (!props.pagination) {\r\n setInternalPagination({ page, pageSize })\r\n }\r\n await props.onPageChange?.(page, pageSize)\r\n },\r\n [props.pagination, props.onPageChange]\r\n )\r\n\r\n const gridPayload = useMemo<IViewGridLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n scrollResetToken,\r\n ...slots.gridViewProps\r\n }),\r\n [paginatedValue, loadMode, props.loading, derivedPagination, handleGridPageChange, scrollResetToken, slots.gridViewProps]\r\n )\r\n\r\n const gridPayloadRef = useRef<IViewGridLoadingProps<T>>(gridPayload)\r\n gridPayloadRef.current = gridPayload\r\n\r\n const listPayload = useMemo<IViewListLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n renderStrategy: renderStrategy,\r\n selectable: props.selectable ?? config.listConfig?.selectable,\r\n selectedIds: props.selectedIds,\r\n onSelectionChange: props.onSelectionChange,\r\n scrollResetToken,\r\n ...slots.listViewProps\r\n }),\r\n [\r\n paginatedValue,\r\n loadMode,\r\n props.loading,\r\n derivedPagination,\r\n renderStrategy,\r\n handleGridPageChange,\r\n props.selectable,\r\n props.selectedIds,\r\n props.onSelectionChange,\r\n scrollResetToken,\r\n slots.listViewProps\r\n ]\r\n )\r\n\r\n const listPayloadRef = useRef<IViewListLoadingProps<T>>(listPayload)\r\n listPayloadRef.current = listPayload\r\n\r\n const ListViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewListContent: FC<{ value: DataSurfaceViewMode }> = () => <ListLoadingComponent {...listPayloadRef.current} />\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => <GridLoadingComponent {...gridPayloadRef.current} />\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\r\n\r\n const PanelLoadingComponent = useMemo(() => {\r\n return slots.PanelLoading || config?.PanelLoading || PanelLoading\r\n }, [slots.PanelLoading, config.PanelLoading, viewMode])\r\n\r\n const PanelNoDataComponent = useMemo(() => {\r\n return slots.PanelNoData || config?.PanelNoData || PanelNoData\r\n }, [slots.PanelNoData, config.PanelNoData, viewMode])\r\n\r\n const PanelLoadMoreComponent = useMemo(() => {\r\n return slots.PanelLoadMore || config?.PanelLoadMore || PanelLoadMore\r\n }, [slots.PanelLoadMore, config.PanelLoadMore])\r\n\r\n const renderFooter = () => {\r\n if (loadMode === LoadingModeRule.infiniteScroll) {\r\n const footerSlots = props.slots?.footer\r\n return (\r\n <PanelInfiniteScrollFooter\r\n loading={props.loading}\r\n hasNext={derivedPagination.hasNext}\r\n currentCount={paginatedValue.length}\r\n total={derivedPagination.total}\r\n slots={{\r\n statusText: footerSlots?.status,\r\n rangeText: footerSlots?.range\r\n }}\r\n />\r\n )\r\n }\r\n\r\n // pagination mode\r\n return (\r\n <PanelPaginationFooter\r\n page={derivedPagination.page ?? 0}\r\n pageSize={derivedPagination.pageSize ?? defaultPageSize}\r\n total={derivedPagination.total}\r\n hasNext={derivedPagination.hasNext}\r\n hasPrev={(derivedPagination.page ?? 0) > 0}\r\n loading={props.loading}\r\n onPrevPage={handlePrevPage}\r\n onNextPage={handleNextPage}\r\n onPageJump={handlePageJump}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <DataSurfaceStyled sx={props.sx}>\r\n <Box sx={{ flex: 1, minHeight: 0, position: 'relative' }}>\r\n {isInitialLoading && <PanelLoadingComponent viewMode={viewMode} />}\r\n {isNoData && <PanelNoDataComponent viewMode={viewMode} />}\r\n {!isInitialLoading && !isNoData && (\r\n <ViewSwitchTranstionInstance\r\n value={viewMode}\r\n viewA={{ value: 'list', Content: ListViewContent }}\r\n viewB={{ value: 'grid', Content: GridViewContent }}\r\n />\r\n )}\r\n {showLoadingOverlay && <PanelLoadMoreComponent />}\r\n </Box>\r\n {renderFooter()}\r\n </DataSurfaceStyled>\r\n )\r\n }\r\n return DataSurface\r\n}\r\n\r\nexport default createDataSurface\r\n\r\nconst DataSurfaceStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n flex: 1,\r\n minHeight: 0,\r\n backgroundColor: theme.palette.background.default\r\n}))\r\n"],"names":["createDataSurface","config","GridComponent","configInput","gridConfig","getterId","item","index","createViewGrid","ListComponent","listConfig","createViewList","_config$defaultViewMo","defaultViewMode","_config$defaultLoadMo","defaultLoadMode","_config$featureMode","featureMode","ViewSwitchTranstionInstance","createViewSwitchTransition","GridLoadingComponent","createViewGridLoading","ListLoadingComponent","createViewListLoading","props","_ref","_props$pagination$pag","_props$pagination","_props$viewMode","_props$loadMode","slots","defaultPageSize","pagination","pageSize","_useState","useState","page","_useState2","_slicedToArray","internalPagination","setInternalPagination","paginationState","useMemo","_props$pagination2","_p$page","_p$pageSize","_p$hasNext","_p$hasPrev","p","hasNext","hasPrev","total","viewMode","loadMode","renderStrategy","_config$listConfig$re","_config$listConfig","_config$gridConfig$re","_config$gridConfig","handlePrevPage","useCallback","_asyncToGenerator","_regenerator","m","_callee","_paginationState$page","_props$onPageChange","_paginationState$page2","currentPage","prevPage","w","_context","n","a","prev","_objectSpread","onPageChange","call","handleNextPage","_callee2","_paginationState$page3","_props$onPageChange2","_paginationState$page4","nextPage","_context2","handlePageJump","_ref4","_callee3","targetPage","_props$onPageChange3","_paginationState$page5","_context3","_x","apply","this","arguments","finalValue","value","scrollResetToken","undefined","useEffect","derivedPagination","_paginationState$page6","_paginationState$page7","length","paginatedValue","_derivedPagination$pa","_derivedPagination$pa2","slice","start","isEmptyData","isInitialLoading","Boolean","loading","isNoData","showLoadingOverlay","handleGridPageChange","_ref5","_callee4","_props$onPageChange4","_context4","_x2","_x3","gridPayload","gridViewProps","gridPayloadRef","useRef","current","listPayload","_props$selectable","_config$listConfig2","selectable","selectedIds","onSelectionChange","listViewProps","listPayloadRef","ListViewContent","_jsx","GridViewContent","PanelLoadingComponent","PanelLoading","PanelNoDataComponent","PanelNoData","PanelLoadMoreComponent","PanelLoadMore","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","viewA","Content","viewB","_derivedPagination$pa3","_derivedPagination$pa4","_derivedPagination$pa5","LoadingModeRule","infiniteScroll","_props$slots","footerSlots","footer","PanelInfiniteScrollFooter","currentCount","statusText","status","rangeText","range","PanelPaginationFooter","onPrevPage","onNextPage","onPageJump","renderFooter","styled","_ref6","display","flexDirection","width","height","backgroundColor","theme","palette","background"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.create.js","sources":["../../../src/data-surface/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, styled } from '@mui/material'\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { DataSurfaceViewMode, LoadingModeRule, DataSurfaceFeatureMode } from './types'\r\nimport { createViewList, createViewListLoading } from './view-list'\r\nimport { createViewGrid, createViewGridLoading } from './view-grid'\r\nimport { createViewSwitchTransition } from './view-switch-transition'\r\nimport { PanelInfiniteScrollFooter, PanelLoadMore, PanelLoading, PanelNoData, PanelPaginationFooter } from './ui.units'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { IViewGridLoadingProps } from './view-grid'\r\nimport type { IViewGridConfig, IViewGridProps } from './view-grid/types'\r\nimport type { TPagination, TDataSurfaceState, TRenderableNode } from './types'\r\nimport type { IViewListConfig, IViewListLoadingProps, IViewListProps } from './view-list'\r\n\r\nexport interface IDataSurfaceSlots<T> {\r\n listViewProps?: IViewListProps<T>\r\n gridViewProps?: IViewGridProps<T>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n footer?: {\r\n status?: TRenderableNode\r\n range?: TRenderableNode\r\n }\r\n}\r\n\r\nexport interface IDataSurfaceProps<T> {\r\n value?: T[]\r\n /**\r\n * @deprecated No longer used. Use `viewMode` and `loadMode` props directly instead.\r\n * Controlled state. When provided, DataSurface becomes fully controlled.\r\n */\r\n state?: TDataSurfaceState\r\n /**\r\n * @deprecated No longer used. Component now uses uncontrolled mode with props.\r\n * Called on any state change (viewMode, loadMode, page, pageSize).\r\n */\r\n onStateChange?: (state: TDataSurfaceState) => void\r\n viewMode?: DataSurfaceViewMode\r\n /** Pagination metadata shared by both modes. */\r\n pagination?: TPagination\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** True while a page fetch is in flight (shows loading indicator). */\r\n loading?: boolean\r\n /**\r\n * Called when the component needs a new page of data.\r\n * - pagination mode: triggered by user clicking page control\r\n * - infiniteScroll mode: triggered automatically when scrolling near the bottom\r\n * Supports async operations - return a Promise to indicate loading state.\r\n */\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n /** Load orchestration mode. @default 'pagination' */\r\n loadMode?: LoadingModeRule\r\n sx?: BoxProps['sx']\r\n slots?: IDataSurfaceSlots<T>\r\n /** Enable row selection with checkboxes (List view only). */\r\n selectable?: boolean\r\n /** Array of selected row IDs (List view only). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes (List view only). */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n}\r\n\r\nexport interface IDataSurfaceConfig<T> {\r\n /** Feature mode determines the internal optimizations and rendering strategies. @default 'client' */\r\n featureMode?: DataSurfaceFeatureMode\r\n /** Default view mode when not provided via props. @default 'grid' */\r\n defaultViewMode?: DataSurfaceViewMode\r\n /** Default load mode when not provided via props. @default 'pagination' */\r\n defaultLoadMode?: LoadingModeRule\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** Configuration for List view. If not provided, List view will use default settings. */\r\n listConfig?: IViewListConfig<T>\r\n /** Custom List component. If not provided, a default List component will be used. */\r\n ListComponent?: ComponentType<IViewListProps<T>>\r\n /** Configuration for Grid view. If not provided, Grid view will use default settings. */\r\n gridConfig?: IViewGridConfig<T>\r\n /** Custom Grid component. If not provided, a default Grid component will be used. */\r\n GridComponent?: ComponentType<IViewGridProps<T>>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n}\r\n\r\nexport function createDataSurface<T>(config: IDataSurfaceConfig<T>) {\r\n if (!config.GridComponent) {\r\n const configInput: IViewGridConfig<T> = config.gridConfig || { getterId: (item: T, index: number) => index }\r\n config.gridConfig = configInput\r\n config.GridComponent = createViewGrid<T>(configInput)\r\n }\r\n\r\n if (!config.ListComponent) {\r\n const configInput: IViewListConfig<T> = config.listConfig || { getterId: (item: T, index: number) => index }\r\n config.listConfig = configInput\r\n config.ListComponent = createViewList<T>(configInput)\r\n }\r\n\r\n const { defaultViewMode = 'grid', defaultLoadMode = 'pagination', featureMode = 'client' } = config\r\n const ViewSwitchTranstionInstance = createViewSwitchTransition<DataSurfaceViewMode>({})\r\n const GridLoadingComponent = createViewGridLoading<T>(config.GridComponent as ComponentType<IViewGridProps<T>>)\r\n const ListLoadingComponent = createViewListLoading<T>(config.ListComponent as ComponentType<IViewListProps<T>>)\r\n\r\n const DataSurface: FC<IDataSurfaceProps<T>> = (props) => {\r\n const slots = props.slots || {}\r\n const defaultPageSize = props.pagination?.pageSize ?? config.defaultPageSize ?? 20\r\n // separate pagination state\r\n const [internalPagination, setInternalPagination] = useState<TPagination>({ page: 0, pageSize: defaultPageSize })\r\n\r\n // resolved pagination: external takes priority over internal\r\n const paginationState = useMemo<TPagination>(() => {\r\n const p = props.pagination ?? internalPagination\r\n return {\r\n page: p.page ?? 0,\r\n pageSize: p.pageSize ?? defaultPageSize,\r\n hasNext: p.hasNext ?? false,\r\n hasPrev: p.hasPrev ?? false,\r\n total: p.total\r\n }\r\n }, [props.pagination, internalPagination])\r\n\r\n const viewMode = props.viewMode ?? defaultViewMode\r\n const loadMode = props.loadMode ?? defaultLoadMode\r\n\r\n // Determine renderStrategy based on current viewMode\r\n const renderStrategy = useMemo(() => {\r\n if (viewMode === 'grid') {\r\n return config.gridConfig?.renderStrategy ?? 'normal'\r\n }\r\n return config.listConfig?.renderStrategy ?? 'normal'\r\n }, [viewMode])\r\n\r\n const handlePrevPage = useCallback(async () => {\r\n const currentPage = paginationState.page ?? 0\r\n if (currentPage <= 0) return\r\n const prevPage = currentPage - 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: prevPage }))\r\n }\r\n await props.onPageChange?.(prevPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handleNextPage = useCallback(async () => {\r\n if (!paginationState.hasNext) return\r\n const currentPage = paginationState.page ?? 0\r\n const nextPage = currentPage + 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: nextPage }))\r\n }\r\n await props.onPageChange?.(nextPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.hasNext, paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handlePageJump = useCallback(\r\n async (targetPage: number) => {\r\n if (targetPage < 0) return\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: targetPage }))\r\n }\r\n await props.onPageChange?.(targetPage, paginationState.pageSize ?? defaultPageSize)\r\n },\r\n [paginationState.pageSize, props.pagination, props.onPageChange]\r\n )\r\n\r\n const finalValue = props.value || []\r\n\r\n // Token changes whenever props.value reference changes — used to reset scroll in views (client mode only)\r\n const scrollResetToken = featureMode === 'client' ? props.value : undefined\r\n\r\n // Reset page to 0 when the data source changes (e.g. new filtered array passed in) — client mode only\r\n useEffect(() => {\r\n if (featureMode === 'client' && !props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: 0 }))\r\n }\r\n }, [props.value])\r\n\r\n // Server mode, no total: infer hasNext=false when a load completes without adding new items\r\n const prevLoadLengthRef = useRef<number | null>(null)\r\n const [inferredHasNoMore, setInferredHasNoMore] = useState(false)\r\n\r\n useEffect(() => {\r\n if (featureMode !== 'server' || props.pagination?.total !== undefined) return\r\n if (props.loading) {\r\n prevLoadLengthRef.current = finalValue.length\r\n } else if (prevLoadLengthRef.current !== null) {\r\n if (finalValue.length <= prevLoadLengthRef.current) {\r\n setInferredHasNoMore(true)\r\n } else {\r\n setInferredHasNoMore(false)\r\n }\r\n prevLoadLengthRef.current = null\r\n }\r\n }, [props.loading, featureMode, props.pagination?.total, finalValue.length])\r\n\r\n // Reset inferred state when going back to page 0 (e.g. filter change)\r\n useEffect(() => {\r\n if (paginationState.page === 0) setInferredHasNoMore(false)\r\n }, [paginationState.page])\r\n\r\n // When running in client feature mode, derive pagination metadata from the full value\r\n const derivedPagination = useMemo<TPagination>(() => {\r\n const page = paginationState.page ?? 0\r\n const pageSize = paginationState.pageSize ?? defaultPageSize\r\n if (featureMode === 'client') {\r\n const total = finalValue.length\r\n const hasNext = pageSize * (page + 1) < total\r\n const hasPrev = page > 0\r\n return { page, pageSize, hasNext, hasPrev, total }\r\n }\r\n // Server mode without total: override hasNext when we've inferred no more items\r\n if (paginationState.total === undefined && inferredHasNoMore) {\r\n return { ...paginationState, hasNext: false }\r\n }\r\n return paginationState\r\n }, [paginationState, finalValue.length, featureMode, defaultPageSize, inferredHasNoMore])\r\n\r\n // Slice the input value when client-side pagination is enabled\r\n const paginatedValue = useMemo(() => {\r\n if (featureMode === 'client') {\r\n const page = derivedPagination.page ?? 0\r\n const pageSize = derivedPagination.pageSize ?? defaultPageSize\r\n if (loadMode === 'infiniteScroll') {\r\n // accumulate all items from page 0 → current page\r\n return finalValue.slice(0, (page + 1) * pageSize)\r\n }\r\n const start = page * pageSize\r\n return finalValue.slice(start, start + pageSize)\r\n }\r\n return finalValue\r\n }, [finalValue, derivedPagination, featureMode, loadMode, defaultPageSize])\r\n\r\n const isEmptyData = finalValue.length === 0\r\n const isInitialLoading = Boolean(props.loading && isEmptyData)\r\n const isNoData = !props.loading && isEmptyData\r\n const showLoadingOverlay = Boolean(props.loading) && !isEmptyData\r\n\r\n const handleGridPageChange = useCallback(\r\n async (page: number, pageSize: number) => {\r\n if (!props.pagination) {\r\n setInternalPagination({ page, pageSize })\r\n }\r\n await props.onPageChange?.(page, pageSize)\r\n },\r\n [props.pagination, props.onPageChange]\r\n )\r\n\r\n const gridPayload = useMemo<IViewGridLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n scrollResetToken,\r\n ...slots.gridViewProps\r\n }),\r\n [paginatedValue, loadMode, props.loading, derivedPagination, handleGridPageChange, scrollResetToken, slots.gridViewProps]\r\n )\r\n\r\n const gridPayloadRef = useRef<IViewGridLoadingProps<T>>(gridPayload)\r\n gridPayloadRef.current = gridPayload\r\n\r\n const listPayload = useMemo<IViewListLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n renderStrategy: renderStrategy,\r\n selectable: props.selectable ?? config.listConfig?.selectable,\r\n selectedIds: props.selectedIds,\r\n onSelectionChange: props.onSelectionChange,\r\n scrollResetToken,\r\n ...slots.listViewProps\r\n }),\r\n [\r\n paginatedValue,\r\n loadMode,\r\n props.loading,\r\n derivedPagination,\r\n renderStrategy,\r\n handleGridPageChange,\r\n props.selectable,\r\n props.selectedIds,\r\n props.onSelectionChange,\r\n scrollResetToken,\r\n slots.listViewProps\r\n ]\r\n )\r\n\r\n const listPayloadRef = useRef<IViewListLoadingProps<T>>(listPayload)\r\n listPayloadRef.current = listPayload\r\n\r\n const ListViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewListContent: FC<{ value: DataSurfaceViewMode }> = () => <ListLoadingComponent {...listPayloadRef.current} />\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => <GridLoadingComponent {...gridPayloadRef.current} />\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\r\n\r\n const PanelLoadingComponent = useMemo(() => {\r\n return slots.PanelLoading || config?.PanelLoading || PanelLoading\r\n }, [slots.PanelLoading, config.PanelLoading, viewMode])\r\n\r\n const PanelNoDataComponent = useMemo(() => {\r\n return slots.PanelNoData || config?.PanelNoData || PanelNoData\r\n }, [slots.PanelNoData, config.PanelNoData, viewMode])\r\n\r\n const PanelLoadMoreComponent = useMemo(() => {\r\n return slots.PanelLoadMore || config?.PanelLoadMore || PanelLoadMore\r\n }, [slots.PanelLoadMore, config.PanelLoadMore])\r\n\r\n const renderFooter = () => {\r\n if (loadMode === LoadingModeRule.infiniteScroll) {\r\n const footerSlots = props.slots?.footer\r\n return (\r\n <PanelInfiniteScrollFooter\r\n loading={props.loading}\r\n hasNext={derivedPagination.hasNext}\r\n currentCount={paginatedValue.length}\r\n total={derivedPagination.total}\r\n slots={{\r\n statusText: footerSlots?.status,\r\n rangeText: footerSlots?.range\r\n }}\r\n />\r\n )\r\n }\r\n\r\n // pagination mode\r\n return (\r\n <PanelPaginationFooter\r\n page={derivedPagination.page ?? 0}\r\n pageSize={derivedPagination.pageSize ?? defaultPageSize}\r\n total={derivedPagination.total}\r\n hasNext={derivedPagination.hasNext}\r\n hasPrev={(derivedPagination.page ?? 0) > 0}\r\n loading={props.loading}\r\n onPrevPage={handlePrevPage}\r\n onNextPage={handleNextPage}\r\n onPageJump={handlePageJump}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <DataSurfaceStyled sx={props.sx}>\r\n <Box sx={{ flex: 1, minHeight: 0, position: 'relative' }}>\r\n {isInitialLoading && <PanelLoadingComponent viewMode={viewMode} />}\r\n {isNoData && <PanelNoDataComponent viewMode={viewMode} />}\r\n {!isInitialLoading && !isNoData && (\r\n <ViewSwitchTranstionInstance\r\n value={viewMode}\r\n viewA={{ value: 'list', Content: ListViewContent }}\r\n viewB={{ value: 'grid', Content: GridViewContent }}\r\n />\r\n )}\r\n {showLoadingOverlay && <PanelLoadMoreComponent />}\r\n </Box>\r\n {renderFooter()}\r\n </DataSurfaceStyled>\r\n )\r\n }\r\n return DataSurface\r\n}\r\n\r\nexport default createDataSurface\r\n\r\nconst DataSurfaceStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n flex: 1,\r\n minHeight: 0,\r\n backgroundColor: theme.palette.background.default\r\n}))\r\n"],"names":["createDataSurface","config","GridComponent","configInput","gridConfig","getterId","item","index","createViewGrid","ListComponent","listConfig","createViewList","_config$defaultViewMo","defaultViewMode","_config$defaultLoadMo","defaultLoadMode","_config$featureMode","featureMode","ViewSwitchTranstionInstance","createViewSwitchTransition","GridLoadingComponent","createViewGridLoading","ListLoadingComponent","createViewListLoading","props","_ref","_props$pagination$pag","_props$pagination","_props$viewMode","_props$loadMode","_props$pagination4","slots","defaultPageSize","pagination","pageSize","_useState","useState","page","_useState2","_slicedToArray","internalPagination","setInternalPagination","paginationState","useMemo","_props$pagination2","_p$page","_p$pageSize","_p$hasNext","_p$hasPrev","p","hasNext","hasPrev","total","viewMode","loadMode","renderStrategy","_config$listConfig$re","_config$listConfig","_config$gridConfig$re","_config$gridConfig","handlePrevPage","useCallback","_asyncToGenerator","_regenerator","m","_callee","_paginationState$page","_props$onPageChange","_paginationState$page2","currentPage","prevPage","w","_context","n","a","prev","_objectSpread","onPageChange","call","handleNextPage","_callee2","_paginationState$page3","_props$onPageChange2","_paginationState$page4","nextPage","_context2","handlePageJump","_ref4","_callee3","targetPage","_props$onPageChange3","_paginationState$page5","_context3","_x","apply","this","arguments","finalValue","value","scrollResetToken","undefined","useEffect","prevLoadLengthRef","useRef","_useState3","_useState4","inferredHasNoMore","setInferredHasNoMore","_props$pagination3","loading","current","length","derivedPagination","_paginationState$page6","_paginationState$page7","paginatedValue","_derivedPagination$pa","_derivedPagination$pa2","slice","start","isEmptyData","isInitialLoading","Boolean","isNoData","showLoadingOverlay","handleGridPageChange","_ref5","_callee4","_props$onPageChange4","_context4","_x2","_x3","gridPayload","gridViewProps","gridPayloadRef","listPayload","_props$selectable","_config$listConfig2","selectable","selectedIds","onSelectionChange","listViewProps","listPayloadRef","ListViewContent","_jsx","GridViewContent","PanelLoadingComponent","PanelLoading","PanelNoDataComponent","PanelNoData","PanelLoadMoreComponent","PanelLoadMore","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","viewA","Content","viewB","_derivedPagination$pa3","_derivedPagination$pa4","_derivedPagination$pa5","LoadingModeRule","infiniteScroll","_props$slots","footerSlots","footer","PanelInfiniteScrollFooter","currentCount","statusText","status","rangeText","range","PanelPaginationFooter","onPrevPage","onNextPage","onPageJump","renderFooter","styled","_ref6","display","flexDirection","width","height","backgroundColor","theme","palette","background"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as e,defineProperty as r,objectWithoutProperties as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as o}from"react/jsx-runtime";import{colors as i,styled as a,Box as l,alpha as c,typographyClasses as d,Typography as u,Pagination as s,CircularProgress as g,Stack as p}from"@mui/material";var h=["viewMode"],b={padding:"8px",height:"100%",minHeight:180,width:"100%","& > .inner":{width:"100%",height:"100%",padding:"24px 16px",border:"1px dashed ".concat(i.grey[400]),borderRadius:6,display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center"}},m=function(r){r.viewMode;var i=n(r,h);return o(x,e(e({},i),{},{children:t("div",{className:"inner",children:[o(g,{size:24}),o(u,{variant:"body2",color:"primary",children:"Loading..."})]})}))},x=a(l)(e(e({},b),{},{"& > div":{gap:8,borderColor:i.blue[400],backgroundColor:c(i.blue[50],.12)}}));a(l)(e(e({},b),{},{"& > div":{borderColor:i.red[400],backgroundColor:i.red[50],color:i.red[900],flexDirection:"column"}}));var v=function(){return o(f,{children:t("div",{className:"inner",children:[o(u,{variant:"h6",gutterBottom:!0,children:"No data available"}),o(u,{variant:"body2",children:"Try changing the filter or search keyword"})]})})},f=a(l)(e(e({},b),{},{"& > div":{borderColor:i.grey[400],backgroundColor:i.grey[50],color:i.grey[700],flexDirection:"column"}}));a(l)(e(e({},b),{},{"& > div":{borderColor:i.blue[400],backgroundColor:i.blue[50],color:i.blue[900],flexDirection:"column"}})),a(l)(e(e({},b),{},{"& > div":{borderColor:i.red[700],backgroundColor:i.red[50],color:i.red[900],flexDirection:"column"}}));var y=function(){return o(C,{children:o("div",{children:o(g,{size:28,thickness:4})})})},C=a(l)(function(e){return{position:"absolute",inset:0,backgroundColor:"dark"===e.theme.palette.mode?"rgba(0,0,0,0.24)":"rgba(255,255,255,0.24)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:10,backdropFilter:"blur(1.5px)",transition:"opacity 0.2s","& > div":{display:"flex",alignItems:"center",gap:10}}}),k=function(e){var r,n=e.slots,i=e.loading,a=e.hasNext,l=e.currentCount,c=e.total,d=function(e){return"string"!=typeof e?e:o(u,{variant:"caption",color:"text.secondary",children:e})},s=function(e,r){var n="Loading more...",i="Scroll for more",a="No more items";return e?{currentNode:t(p,{flexDirection:"row",alignItems:"center",gap:1,children:[o(g,{color:"primary",size:12,thickness:3}),o(u,{variant:"caption",color:"primary.main",children:n})]}),rawText:n}:r?{currentNode:i,rawText:i}:{currentNode:a,rawText:a}}(i,a),h=s.currentNode;"function"==typeof(null==n?void 0:n.statusText)?h=n.statusText(d(s.currentNode),s.rawText):null!=n&&n.statusText&&(h=n.statusText);var b=l>0?null!=c?"
|
|
1
|
+
import{objectSpread2 as e,defineProperty as r,objectWithoutProperties as n}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as o}from"react/jsx-runtime";import{colors as i,styled as a,Box as l,alpha as c,typographyClasses as d,Typography as u,Pagination as s,CircularProgress as g,Stack as p}from"@mui/material";var h=["viewMode"],b={padding:"8px",height:"100%",minHeight:180,width:"100%","& > .inner":{width:"100%",height:"100%",padding:"24px 16px",border:"1px dashed ".concat(i.grey[400]),borderRadius:6,display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center"}},m=function(r){r.viewMode;var i=n(r,h);return o(x,e(e({},i),{},{children:t("div",{className:"inner",children:[o(g,{size:24}),o(u,{variant:"body2",color:"primary",children:"Loading..."})]})}))},x=a(l)(e(e({},b),{},{"& > div":{gap:8,borderColor:i.blue[400],backgroundColor:c(i.blue[50],.12)}}));a(l)(e(e({},b),{},{"& > div":{borderColor:i.red[400],backgroundColor:i.red[50],color:i.red[900],flexDirection:"column"}}));var v=function(){return o(f,{children:t("div",{className:"inner",children:[o(u,{variant:"h6",gutterBottom:!0,children:"No data available"}),o(u,{variant:"body2",children:"Try changing the filter or search keyword"})]})})},f=a(l)(e(e({},b),{},{"& > div":{borderColor:i.grey[400],backgroundColor:i.grey[50],color:i.grey[700],flexDirection:"column"}}));a(l)(e(e({},b),{},{"& > div":{borderColor:i.blue[400],backgroundColor:i.blue[50],color:i.blue[900],flexDirection:"column"}})),a(l)(e(e({},b),{},{"& > div":{borderColor:i.red[700],backgroundColor:i.red[50],color:i.red[900],flexDirection:"column"}}));var y=function(){return o(C,{children:o("div",{children:o(g,{size:28,thickness:4})})})},C=a(l)(function(e){return{position:"absolute",inset:0,backgroundColor:"dark"===e.theme.palette.mode?"rgba(0,0,0,0.24)":"rgba(255,255,255,0.24)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:10,backdropFilter:"blur(1.5px)",transition:"opacity 0.2s","& > div":{display:"flex",alignItems:"center",gap:10}}}),k=function(e){var r,n=e.slots,i=e.loading,a=e.hasNext,l=e.currentCount,c=e.total,d=function(e){return"string"!=typeof e?e:o(u,{variant:"caption",color:"text.secondary",children:e})},s=function(e,r){var n="Loading more...",i="Scroll for more",a="No more items";return e?{currentNode:t(p,{flexDirection:"row",alignItems:"center",gap:1,children:[o(g,{color:"primary",size:12,thickness:3}),o(u,{variant:"caption",color:"primary.main",children:n})]}),rawText:n}:r?{currentNode:i,rawText:i}:{currentNode:a,rawText:a}}(i,a),h=s.currentNode;"function"==typeof(null==n?void 0:n.statusText)?h=n.statusText(d(s.currentNode),s.rawText):null!=n&&n.statusText&&(h=n.statusText);var b=l>0?null!=c?"".concat(l," of ").concat(c):"".concat(l," results"):"—",m="function"==typeof(null==n?void 0:n.rangeText)?n.rangeText(b,b):null!==(r=null==n?void 0:n.rangeText)&&void 0!==r?r:b;return o(w,{children:t("div",{children:[d(h),d(m)]})})},w=a(l)(function(e){var n=e.theme;return r({"& > div":{display:"flex",alignItems:"center",justifyContent:"space-between",padding:n.spacing(1,1.5),backgroundColor:c(n.palette.grey[500],.08),borderTop:"1px solid ".concat(c(n.palette.common.black,.08))}},".".concat(d.root),{lineHeight:1,fontWeight:500})}),T=function(e){var r=e.page,n=e.pageSize,i=e.total,a=e.hasNext,l=e.loading,c=e.onPrevPage,d=e.onNextPage,g=e.onPageJump,p=r*n+1,h=null!=i?Math.min(p+n-1,i):p+n-1,b=null!=i?Math.ceil(i/n):void 0;return t(N,{children:[o(u,{variant:"caption",color:"text.secondary",children:null!=i?"".concat(p,"–").concat(h," / ").concat(i):"Page ".concat(r+1)}),o(s,{count:b,page:r+1,onChange:function(e,n){var t=n-1;g?g(t):t<r?null==c||c():t>r&&(null==d||d())},disabled:l,size:"small",showFirstButton:null!=b&&b>5,showLastButton:null!=b&&b>5,siblingCount:0,boundaryCount:1,hidePrevButton:null==b&&!a,hideNextButton:null==b&&!a})]})},N=a(l)(function(e){var r=e.theme;return{padding:"8px 16px",display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:r.palette.background.paper,borderTop:"1px solid ".concat("dark"===r.palette.mode?"rgba(255, 255, 255, 0.12)":"rgba(0, 0, 0, 0.12)")}});export{k as PanelInfiniteScrollFooter,y as PanelLoadMore,m as PanelLoading,v as PanelNoData,T as PanelPaginationFooter};
|
|
2
2
|
//# sourceMappingURL=ui.units.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.units.js","sources":["../../../src/data-surface/ui.units.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, CircularProgress, Pagination, Typography, colors, styled, alpha, Stack, typographyClasses } from '@mui/material'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { BoxProps } from '@mui/material'\r\nimport { DataSurfaceViewMode, TRenderableNode } from './types'\r\n\r\nconst stateWrapBase = {\r\n padding: '8px',\r\n height: '100%',\r\n minHeight: 180,\r\n width: '100%',\r\n '& > .inner': {\r\n width: '100%',\r\n height: '100%',\r\n padding: '24px 16px',\r\n border: `1px dashed ${colors.grey[400]}`,\r\n borderRadius: 6,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n textAlign: 'center'\r\n }\r\n} as const\r\n\r\nexport const PanelLoading: FC<BoxProps & { viewMode: DataSurfaceViewMode }> = (props) => {\r\n const { viewMode, ...rest } = props\r\n return (\r\n <PanelLoadingStyled {...rest}>\r\n <div className='inner'>\r\n <CircularProgress size={24} />\r\n <Typography variant='body2' color='primary'>\r\n Loading...\r\n </Typography>\r\n </div>\r\n </PanelLoadingStyled>\r\n )\r\n}\r\n\r\nconst PanelLoadingStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n gap: 8,\r\n borderColor: colors.blue[400],\r\n backgroundColor: alpha(colors.blue[50], 0.12)\r\n }\r\n})\r\n\r\nexport const PanelError: FC<{ error: string }> = ({ error }) => (\r\n <PanelErrorStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' gutterBottom>\r\n An error occurred\r\n </Typography>\r\n {error && <Typography variant='body2'>{error}</Typography>}\r\n </div>\r\n </PanelErrorStyled>\r\n)\r\n\r\nconst PanelErrorStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.red[400],\r\n backgroundColor: colors.red[50],\r\n color: colors.red[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelNoData: FC = () => (\r\n <PanelNoDataStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' gutterBottom>\r\n No data available\r\n </Typography>\r\n <Typography variant='body2'>Try changing the filter or search keyword</Typography>\r\n </div>\r\n </PanelNoDataStyled>\r\n)\r\n\r\nconst PanelNoDataStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.grey[400],\r\n backgroundColor: colors.grey[50],\r\n color: colors.grey[700],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelWaiting: FC = () => (\r\n <PanelWaitingStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' color='text.primary' sx={{ fontWeight: 'bold' }}>\r\n Waiting for data...\r\n </Typography>\r\n <Typography variant='body2' color='text.secondary'>\r\n Please wait while we fetch the data.\r\n </Typography>\r\n </div>\r\n </PanelWaitingStyled>\r\n)\r\n\r\nconst PanelWaitingStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.blue[400],\r\n backgroundColor: colors.blue[50],\r\n color: colors.blue[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelMissingConfig: FC = () => (\r\n <PanelMissingConfigStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' sx={{ fontWeight: 'bold' }}>\r\n Missing Configuration\r\n </Typography>\r\n <Typography variant='body2'>A required configuration is missing for this view to work correctly.</Typography>\r\n </div>\r\n </PanelMissingConfigStyled>\r\n)\r\n\r\nconst PanelMissingConfigStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.red[700],\r\n backgroundColor: colors.red[50],\r\n color: colors.red[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelLoadMore: FC = () => (\r\n <PanelLoadMoreStyled>\r\n <div>\r\n <CircularProgress size={28} thickness={4} />\r\n {/* <Typography variant='body2'>Loading more...</Typography> */}\r\n </div>\r\n </PanelLoadMoreStyled>\r\n)\r\n\r\nconst PanelLoadMoreStyled = styled(Box)(({ theme }) => {\r\n const isDark = theme.palette.mode === 'dark'\r\n const bgColor = isDark ? 'rgba(0,0,0,0.24)' : 'rgba(255,255,255,0.24)'\r\n // const textColor = theme.palette.text.primary\r\n return {\r\n position: 'absolute',\r\n inset: 0,\r\n backgroundColor: bgColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 10,\r\n backdropFilter: 'blur(1.5px)',\r\n transition: 'opacity 0.2s',\r\n '& > div': { display: 'flex', alignItems: 'center', gap: 10 }\r\n // [`.${typographyClasses.root}`]: { color: textColor }\r\n }\r\n})\r\n\r\nexport interface IPanelInfiniteScrollFooterSlots {\r\n statusText?: TRenderableNode\r\n rangeText?: TRenderableNode\r\n}\r\n\r\nexport interface IPanelInfiniteScrollFooterProps {\r\n loading?: boolean\r\n hasNext?: boolean\r\n currentCount: number\r\n total?: number\r\n slots?: IPanelInfiniteScrollFooterSlots\r\n}\r\n\r\nconst mapStatusText = (loading?: boolean, hasNext?: boolean): { currentNode: ReactNode; rawText: string } => {\r\n const mapRawText: Record<string, string> = { loading: 'Loading more...', hasNext: 'Scroll for more', noMore: 'No more items' }\r\n if (loading) {\r\n return {\r\n currentNode: (\r\n <Stack flexDirection='row' alignItems='center' gap={1}>\r\n <CircularProgress color='primary' size={12} thickness={3} />\r\n <Typography variant='caption' color='primary.main'>\r\n {mapRawText.loading}\r\n </Typography>\r\n </Stack>\r\n ),\r\n rawText: mapRawText.loading\r\n }\r\n } else if (hasNext) {\r\n return { currentNode: mapRawText.hasNext, rawText: mapRawText.hasNext }\r\n } else {\r\n return { currentNode: mapRawText.noMore, rawText: mapRawText.noMore }\r\n }\r\n}\r\n\r\nexport const PanelInfiniteScrollFooter: FC<IPanelInfiniteScrollFooterProps> = (props) => {\r\n const { slots, loading, hasNext, currentCount, total } = props\r\n\r\n const renderText = (value: ReactNode) => {\r\n if (typeof value !== 'string') return value\r\n return (\r\n <Typography variant='caption' color='text.secondary'>\r\n {value}\r\n </Typography>\r\n )\r\n }\r\n\r\n // Status text on the left\r\n let obj = mapStatusText(loading, hasNext)\r\n let finalStatusText: ReactNode = obj.currentNode\r\n if (typeof slots?.statusText === 'function') {\r\n finalStatusText = slots.statusText(renderText(obj.currentNode), obj.rawText)\r\n } else if (slots?.statusText) {\r\n finalStatusText = slots.statusText\r\n }\r\n\r\n // Range text on the right\r\n const rangeText = currentCount > 0 ? (total != null ? `1–${currentCount} of ${total}` : `1–${currentCount}`) : '—'\r\n const finalRangeText = typeof slots?.rangeText === 'function' ? slots.rangeText(rangeText, rangeText) : (slots?.rangeText ?? rangeText)\r\n\r\n return (\r\n <PanelInfiniteScrollFooterStyled>\r\n <div>\r\n {renderText(finalStatusText)}\r\n {renderText(finalRangeText)}\r\n </div>\r\n </PanelInfiniteScrollFooterStyled>\r\n )\r\n}\r\n\r\nconst PanelInfiniteScrollFooterStyled = styled(Box)(({ theme }) => ({\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1, 1.5),\r\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\r\n borderTop: `1px solid ${alpha(theme.palette.common.black, 0.08)}`\r\n },\r\n [`.${typographyClasses.root}`]: { lineHeight: 1, fontWeight: 500 }\r\n}))\r\n\r\nexport interface IPanelPaginationFooterProps {\r\n page: number\r\n pageSize: number\r\n total?: number\r\n hasNext?: boolean\r\n hasPrev?: boolean\r\n loading?: boolean\r\n onPrevPage?: () => void\r\n onNextPage?: () => void\r\n onPageJump?: (page: number) => void\r\n}\r\n\r\nexport const PanelPaginationFooter: FC<IPanelPaginationFooterProps> = (props) => {\r\n const { page, pageSize, total, hasNext, loading, onPrevPage, onNextPage, onPageJump } = props\r\n const from = page * pageSize + 1\r\n const to = total != null ? Math.min(from + pageSize - 1, total) : from + pageSize - 1\r\n\r\n // Calculate page count for MUI Pagination (1-indexed)\r\n const pageCount = total != null ? Math.ceil(total / pageSize) : undefined\r\n\r\n const handlePageChange = (_event: any, value: number) => {\r\n // MUI Pagination uses 1-indexed, convert to 0-indexed\r\n const targetPage = value - 1\r\n\r\n if (onPageJump) {\r\n // Use direct page jump if available\r\n onPageJump(targetPage)\r\n } else {\r\n // Fallback to prev/next if no jump handler\r\n if (targetPage < page) {\r\n onPrevPage?.()\r\n } else if (targetPage > page) {\r\n onNextPage?.()\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <PanelPaginationFooterStyled>\r\n <Typography variant='caption' color='text.secondary'>\r\n {total != null ? `${from}–${to} / ${total}` : `Page ${page + 1}`}\r\n </Typography>\r\n <Pagination\r\n count={pageCount}\r\n page={page + 1}\r\n onChange={handlePageChange}\r\n disabled={loading}\r\n size='small'\r\n showFirstButton={pageCount != null && pageCount > 5}\r\n showLastButton={pageCount != null && pageCount > 5}\r\n siblingCount={0}\r\n boundaryCount={1}\r\n hidePrevButton={pageCount == null && !hasNext}\r\n hideNextButton={pageCount == null && !hasNext}\r\n />\r\n </PanelPaginationFooterStyled>\r\n )\r\n}\r\n\r\nconst PanelPaginationFooterStyled = styled(Box)(({ theme }) => ({\r\n padding: '8px 16px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.palette.background.paper,\r\n borderTop: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'}`\r\n}))\r\n"],"names":["stateWrapBase","padding","height","minHeight","width","border","concat","colors","grey","borderRadius","display","alignItems","justifyContent","textAlign","PanelLoading","props","viewMode","rest","_objectWithoutProperties","_excluded","_jsx","PanelLoadingStyled","_objectSpread","children","_jsxs","className","CircularProgress","size","Typography","variant","color","styled","Box","gap","borderColor","blue","backgroundColor","alpha","red","flexDirection","PanelNoData","PanelNoDataStyled","gutterBottom","PanelLoadMore","PanelLoadMoreStyled","thickness","_ref2","position","inset","theme","palette","mode","zIndex","backdropFilter","transition","PanelInfiniteScrollFooter","_slots$rangeText","slots","loading","hasNext","currentCount","total","renderText","value","obj","mapRawText","currentNode","Stack","rawText","mapStatusText","finalStatusText","statusText","rangeText","finalRangeText","PanelInfiniteScrollFooterStyled","_ref3","_defineProperty","spacing","borderTop","common","black","typographyClasses","root","lineHeight","fontWeight","PanelPaginationFooter","page","pageSize","onPrevPage","onNextPage","onPageJump","from","to","Math","min","pageCount","ceil","undefined","PanelPaginationFooterStyled","Pagination","count","onChange","_event","targetPage","disabled","showFirstButton","showLastButton","siblingCount","boundaryCount","hidePrevButton","hideNextButton","_ref5","background","paper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.units.js","sources":["../../../src/data-surface/ui.units.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, CircularProgress, Pagination, Typography, colors, styled, alpha, Stack, typographyClasses } from '@mui/material'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { BoxProps } from '@mui/material'\r\nimport { DataSurfaceViewMode, TRenderableNode } from './types'\r\n\r\nconst stateWrapBase = {\r\n padding: '8px',\r\n height: '100%',\r\n minHeight: 180,\r\n width: '100%',\r\n '& > .inner': {\r\n width: '100%',\r\n height: '100%',\r\n padding: '24px 16px',\r\n border: `1px dashed ${colors.grey[400]}`,\r\n borderRadius: 6,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n textAlign: 'center'\r\n }\r\n} as const\r\n\r\nexport const PanelLoading: FC<BoxProps & { viewMode: DataSurfaceViewMode }> = (props) => {\r\n const { viewMode, ...rest } = props\r\n return (\r\n <PanelLoadingStyled {...rest}>\r\n <div className='inner'>\r\n <CircularProgress size={24} />\r\n <Typography variant='body2' color='primary'>\r\n Loading...\r\n </Typography>\r\n </div>\r\n </PanelLoadingStyled>\r\n )\r\n}\r\n\r\nconst PanelLoadingStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n gap: 8,\r\n borderColor: colors.blue[400],\r\n backgroundColor: alpha(colors.blue[50], 0.12)\r\n }\r\n})\r\n\r\nexport const PanelError: FC<{ error: string }> = ({ error }) => (\r\n <PanelErrorStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' gutterBottom>\r\n An error occurred\r\n </Typography>\r\n {error && <Typography variant='body2'>{error}</Typography>}\r\n </div>\r\n </PanelErrorStyled>\r\n)\r\n\r\nconst PanelErrorStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.red[400],\r\n backgroundColor: colors.red[50],\r\n color: colors.red[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelNoData: FC = () => (\r\n <PanelNoDataStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' gutterBottom>\r\n No data available\r\n </Typography>\r\n <Typography variant='body2'>Try changing the filter or search keyword</Typography>\r\n </div>\r\n </PanelNoDataStyled>\r\n)\r\n\r\nconst PanelNoDataStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.grey[400],\r\n backgroundColor: colors.grey[50],\r\n color: colors.grey[700],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelWaiting: FC = () => (\r\n <PanelWaitingStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' color='text.primary' sx={{ fontWeight: 'bold' }}>\r\n Waiting for data...\r\n </Typography>\r\n <Typography variant='body2' color='text.secondary'>\r\n Please wait while we fetch the data.\r\n </Typography>\r\n </div>\r\n </PanelWaitingStyled>\r\n)\r\n\r\nconst PanelWaitingStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.blue[400],\r\n backgroundColor: colors.blue[50],\r\n color: colors.blue[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelMissingConfig: FC = () => (\r\n <PanelMissingConfigStyled>\r\n <div className='inner'>\r\n <Typography variant='h6' sx={{ fontWeight: 'bold' }}>\r\n Missing Configuration\r\n </Typography>\r\n <Typography variant='body2'>A required configuration is missing for this view to work correctly.</Typography>\r\n </div>\r\n </PanelMissingConfigStyled>\r\n)\r\n\r\nconst PanelMissingConfigStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': {\r\n borderColor: colors.red[700],\r\n backgroundColor: colors.red[50],\r\n color: colors.red[900],\r\n flexDirection: 'column'\r\n }\r\n})\r\n\r\nexport const PanelLoadMore: FC = () => (\r\n <PanelLoadMoreStyled>\r\n <div>\r\n <CircularProgress size={28} thickness={4} />\r\n {/* <Typography variant='body2'>Loading more...</Typography> */}\r\n </div>\r\n </PanelLoadMoreStyled>\r\n)\r\n\r\nconst PanelLoadMoreStyled = styled(Box)(({ theme }) => {\r\n const isDark = theme.palette.mode === 'dark'\r\n const bgColor = isDark ? 'rgba(0,0,0,0.24)' : 'rgba(255,255,255,0.24)'\r\n // const textColor = theme.palette.text.primary\r\n return {\r\n position: 'absolute',\r\n inset: 0,\r\n backgroundColor: bgColor,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 10,\r\n backdropFilter: 'blur(1.5px)',\r\n transition: 'opacity 0.2s',\r\n '& > div': { display: 'flex', alignItems: 'center', gap: 10 }\r\n // [`.${typographyClasses.root}`]: { color: textColor }\r\n }\r\n})\r\n\r\nexport interface IPanelInfiniteScrollFooterSlots {\r\n statusText?: TRenderableNode\r\n rangeText?: TRenderableNode\r\n}\r\n\r\nexport interface IPanelInfiniteScrollFooterProps {\r\n loading?: boolean\r\n hasNext?: boolean\r\n currentCount: number\r\n total?: number\r\n slots?: IPanelInfiniteScrollFooterSlots\r\n}\r\n\r\nconst mapStatusText = (loading?: boolean, hasNext?: boolean): { currentNode: ReactNode; rawText: string } => {\r\n const mapRawText: Record<string, string> = { loading: 'Loading more...', hasNext: 'Scroll for more', noMore: 'No more items' }\r\n if (loading) {\r\n return {\r\n currentNode: (\r\n <Stack flexDirection='row' alignItems='center' gap={1}>\r\n <CircularProgress color='primary' size={12} thickness={3} />\r\n <Typography variant='caption' color='primary.main'>\r\n {mapRawText.loading}\r\n </Typography>\r\n </Stack>\r\n ),\r\n rawText: mapRawText.loading\r\n }\r\n } else if (hasNext) {\r\n return { currentNode: mapRawText.hasNext, rawText: mapRawText.hasNext }\r\n } else {\r\n return { currentNode: mapRawText.noMore, rawText: mapRawText.noMore }\r\n }\r\n}\r\n\r\nexport const PanelInfiniteScrollFooter: FC<IPanelInfiniteScrollFooterProps> = (props) => {\r\n const { slots, loading, hasNext, currentCount, total } = props\r\n\r\n const renderText = (value: ReactNode) => {\r\n if (typeof value !== 'string') return value\r\n return (\r\n <Typography variant='caption' color='text.secondary'>\r\n {value}\r\n </Typography>\r\n )\r\n }\r\n\r\n // Status text on the left\r\n let obj = mapStatusText(loading, hasNext)\r\n let finalStatusText: ReactNode = obj.currentNode\r\n if (typeof slots?.statusText === 'function') {\r\n finalStatusText = slots.statusText(renderText(obj.currentNode), obj.rawText)\r\n } else if (slots?.statusText) {\r\n finalStatusText = slots.statusText\r\n }\r\n\r\n // Range text on the right\r\n const rangeText = currentCount > 0 ? (total != null ? `${currentCount} of ${total}` : `${currentCount} results`) : '—'\r\n const finalRangeText = typeof slots?.rangeText === 'function' ? slots.rangeText(rangeText, rangeText) : (slots?.rangeText ?? rangeText)\r\n\r\n return (\r\n <PanelInfiniteScrollFooterStyled>\r\n <div>\r\n {renderText(finalStatusText)}\r\n {renderText(finalRangeText)}\r\n </div>\r\n </PanelInfiniteScrollFooterStyled>\r\n )\r\n}\r\n\r\nconst PanelInfiniteScrollFooterStyled = styled(Box)(({ theme }) => ({\r\n '& > div': {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1, 1.5),\r\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\r\n borderTop: `1px solid ${alpha(theme.palette.common.black, 0.08)}`\r\n },\r\n [`.${typographyClasses.root}`]: { lineHeight: 1, fontWeight: 500 }\r\n}))\r\n\r\nexport interface IPanelPaginationFooterProps {\r\n page: number\r\n pageSize: number\r\n total?: number\r\n hasNext?: boolean\r\n hasPrev?: boolean\r\n loading?: boolean\r\n onPrevPage?: () => void\r\n onNextPage?: () => void\r\n onPageJump?: (page: number) => void\r\n}\r\n\r\nexport const PanelPaginationFooter: FC<IPanelPaginationFooterProps> = (props) => {\r\n const { page, pageSize, total, hasNext, loading, onPrevPage, onNextPage, onPageJump } = props\r\n const from = page * pageSize + 1\r\n const to = total != null ? Math.min(from + pageSize - 1, total) : from + pageSize - 1\r\n\r\n // Calculate page count for MUI Pagination (1-indexed)\r\n const pageCount = total != null ? Math.ceil(total / pageSize) : undefined\r\n\r\n const handlePageChange = (_event: any, value: number) => {\r\n // MUI Pagination uses 1-indexed, convert to 0-indexed\r\n const targetPage = value - 1\r\n\r\n if (onPageJump) {\r\n // Use direct page jump if available\r\n onPageJump(targetPage)\r\n } else {\r\n // Fallback to prev/next if no jump handler\r\n if (targetPage < page) {\r\n onPrevPage?.()\r\n } else if (targetPage > page) {\r\n onNextPage?.()\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <PanelPaginationFooterStyled>\r\n <Typography variant='caption' color='text.secondary'>\r\n {total != null ? `${from}–${to} / ${total}` : `Page ${page + 1}`}\r\n </Typography>\r\n <Pagination\r\n count={pageCount}\r\n page={page + 1}\r\n onChange={handlePageChange}\r\n disabled={loading}\r\n size='small'\r\n showFirstButton={pageCount != null && pageCount > 5}\r\n showLastButton={pageCount != null && pageCount > 5}\r\n siblingCount={0}\r\n boundaryCount={1}\r\n hidePrevButton={pageCount == null && !hasNext}\r\n hideNextButton={pageCount == null && !hasNext}\r\n />\r\n </PanelPaginationFooterStyled>\r\n )\r\n}\r\n\r\nconst PanelPaginationFooterStyled = styled(Box)(({ theme }) => ({\r\n padding: '8px 16px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n backgroundColor: theme.palette.background.paper,\r\n borderTop: `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'}`\r\n}))\r\n"],"names":["stateWrapBase","padding","height","minHeight","width","border","concat","colors","grey","borderRadius","display","alignItems","justifyContent","textAlign","PanelLoading","props","viewMode","rest","_objectWithoutProperties","_excluded","_jsx","PanelLoadingStyled","_objectSpread","children","_jsxs","className","CircularProgress","size","Typography","variant","color","styled","Box","gap","borderColor","blue","backgroundColor","alpha","red","flexDirection","PanelNoData","PanelNoDataStyled","gutterBottom","PanelLoadMore","PanelLoadMoreStyled","thickness","_ref2","position","inset","theme","palette","mode","zIndex","backdropFilter","transition","PanelInfiniteScrollFooter","_slots$rangeText","slots","loading","hasNext","currentCount","total","renderText","value","obj","mapRawText","currentNode","Stack","rawText","mapStatusText","finalStatusText","statusText","rangeText","finalRangeText","PanelInfiniteScrollFooterStyled","_ref3","_defineProperty","spacing","borderTop","common","black","typographyClasses","root","lineHeight","fontWeight","PanelPaginationFooter","page","pageSize","onPrevPage","onNextPage","onPageJump","from","to","Math","min","pageCount","ceil","undefined","PanelPaginationFooterStyled","Pagination","count","onChange","_event","targetPage","disabled","showFirstButton","showLastButton","siblingCount","boundaryCount","hidePrevButton","hideNextButton","_ref5","background","paper"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as n,asyncToGenerator as r,regenerator as e,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as i}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{
|
|
1
|
+
import{objectSpread2 as n,asyncToGenerator as r,regenerator as e,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as i}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{useRef as c,useEffect as d,useCallback as s,useMemo as v,useState as f,useLayoutEffect as h}from"react";import{useMergedConfig as p}from"./hooks.js";import{ViewGridStyled as m,viewGridClasses as g}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as M,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as T}from"./helpers.js";function I(r){var e=function(r){return function(e){var o,i=f(!1),s=t(i,2),h=s[0],x=s[1],M=c(null),T=p(e,r),I=T.Component,S=!0===(null===(o=T.normalOptions)||void 0===o?void 0:o.autoHeight),H="client"===e.featureMode,b=v(function(){return e.value},[e.value]);d(function(){H&&!S&&void 0!==e.scrollResetToken&&M.current&&(M.current.scrollTop=0)},[H,S,e.scrollResetToken]);var y=v(function(){var n=[g.root,g.normal];return h&&n.push(g.scrolling),S&&n.push(g.autoHeight),n.join(" ")},[h,S]);return a(m,{className:y,children:a(l,{className:g.scrollContainer,ref:M,onScroll:function(n){var r,t=n.currentTarget;x(t.scrollTop>T.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=T.nearEndThreshold&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:a(u,{container:!0,spacing:"".concat(T.spacing,"px"),className:g.grid,children:b.map(function(e,t){var o,i=null!==(o=r.getterId(e,t))&&void 0!==o?o:t;return a(u,n(n({className:g.gridItem,item:!0},T.sizes),{},{children:a(I,{value:e,index:t})}),i)})})})})}}(r),I=function(n){return function(r){var e=v(function(){return r.value},[r.value]),u=p(r,n),I=u.sizes,S=u.virtualizedOptions,H=u.Component,b=c(null),y=c(new Map),z=c(null),N=c(null),R=c(0),k=c(!1),C=c({startIndex:0,endIndex:-1}),w=c(-1),O=c(0),j=c(!1),A=f(0),E=t(A,2),F=E[0],B=E[1],P=f(0),q=t(P,2),_=q[0],G=q[1],W=f(0),D=t(W,2),J=D[0],K=D[1],L=f(!1),Q=t(L,2),U=Q[0],V=Q[1],X=f(null),Y=t(X,2),Z=Y[0],$=Y[1],nn=Math.max(1,S.overscan),rn=Math.round(x(u.spacing)),en=null!=Z?Z:T;d(function(){"client"===r.featureMode&&void 0!==r.scrollResetToken&&(null!==N.current&&(cancelAnimationFrame(N.current),N.current=null),b.current&&(b.current.scrollTop=0),R.current=0,O.current=0,K(0),k.current&&(k.current=!1,V(!1)))},[r.featureMode,r.scrollResetToken]),h(function(){if(b.current){var n=function(){var n,r,e,t,o=null!==(n=null===(r=b.current)||void 0===r?void 0:r.clientWidth)&&void 0!==n?n:0,a=null!==(e=null===(t=b.current)||void 0===t?void 0:t.clientHeight)&&void 0!==e?e:0;B(function(n){return n===o?n:o}),G(function(n){return n===a?n:a})};n();var r=new ResizeObserver(function(){return n()});return r.observe(b.current),function(){return r.disconnect()}}},[]);var tn=M(F,I),on=en+rn,an=c(on);an.current=on;var ln=c(nn);ln.current=nn;var un=v(function(){var n=e.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var r=Math.ceil(n/tn),t=Math.max(1,_),o=J,a=Math.max(0,Math.floor(o/on)-nn),i=Math.ceil(t/on),l=Math.min(r-1,a+i+2*nn),u=a*tn,c=Math.min(n-1,(l+1)*tn-1);return{startRow:a,endRow:l,topSpacerHeight:a*on,bottomSpacerHeight:Math.max(0,(r-l-1)*on),startIndex:u,endIndex:c}},[tn,e.length,nn,on,J,_]);C.current=un,w.current=un.endIndex;var cn=v(function(){return un.endIndex>=un.startIndex?e.slice(un.startIndex,un.endIndex+1):[]},[e,un.startIndex,un.endIndex]),dn=un.endIndex,sn=v(function(){return{display:"grid",gap:"".concat(rn,"px"),gridTemplateColumns:"repeat(".concat(tn,", minmax(0, 1fr))")}},[tn,rn]),vn=v(function(){return null!==Z?{minHeight:en,height:en}:void 0},[Z,en]),fn=s(function(){null!==z.current&&(cancelAnimationFrame(z.current),z.current=null)},[]),hn=s(function(){j.current||null!==z.current||(z.current=requestAnimationFrame(function(){if(z.current=null,!j.current){var n=C.current.startIndex,r=w.current,e=Array.from(y.current.entries()).filter(function(e){var o=t(e,1)[0];return o>=n&&o<=r}).map(function(n){return t(n,2)[1]});if(0!==e.length){var a,i=0,l=o(e);try{for(l.s();!(a=l.n()).done;){var u=a.value;i=Math.max(i,u.getBoundingClientRect().height)}}catch(n){l.e(n)}finally{l.f()}i<=0||(j.current=!0,$(Math.round(i)))}}}))},[]),pn=s(function(n,r){r?y.current.set(n,r):y.current.delete(n)},[]);h(function(){if(!j.current){var n=Array.from(y.current.entries()).filter(function(n){var r=t(n,1)[0];return r>=un.startIndex&&r<=dn}).map(function(n){return t(n,2)[1]});if(0!==n.length){hn();var r,e=new ResizeObserver(function(){hn()}),a=o(n);try{for(a.s();!(r=a.n()).done;){var i=r.value;e.observe(i)}}catch(n){a.e(n)}finally{a.f()}return function(){e.disconnect(),fn()}}}},[un.startIndex,dn,hn,fn]),h(function(){return function(){fn()}},[fn]),d(function(){return function(){null!==N.current&&(cancelAnimationFrame(N.current),N.current=null)}},[]);var mn=[g.root,g.virtualized];return U&&mn.push(g.scrolling),a(m,{className:mn.filter(Boolean).join(" "),children:i(l,{ref:b,className:g.scrollContainer,onScroll:function(n){var e,t=n.currentTarget,o=Math.round(t.scrollTop);R.current=o,t.scrollHeight-t.scrollTop-t.clientHeight<=u.nearEndThreshold&&(null===(e=r.onNearEnd)||void 0===e||e.call(r)),null===N.current&&(N.current=requestAnimationFrame(function(){var n,r;N.current=null;var e=Math.round(null!==(n=null===(r=b.current)||void 0===r?void 0:r.scrollTop)&&void 0!==n?n:R.current);R.current=e;var t=e>u.scrollingThreshold;t!==k.current&&(k.current=t,V(t));var o=Math.max(0,Math.floor(O.current/an.current)-ln.current);Math.max(0,Math.floor(e/an.current)-ln.current)!==o&&(O.current=e,K(e))}))},children:[un.topSpacerHeight>0?a(l,{sx:{height:un.topSpacerHeight}}):null,a(l,{sx:sn,className:g.grid,children:cn.map(function(r,e){var t,o=un.startIndex+e,i=null!==(t=n.getterId(r,o))&&void 0!==t?t:o;return a(l,{className:g.gridItem,ref:j.current?void 0:function(n){return pn(o,n)},sx:vn,children:a(H,{value:r,index:o})},i)})}),un.bottomSpacerHeight>0?a(l,{sx:{height:un.bottomSpacerHeight}}):null]})})}}(r);return function(t){var o,i,l=null!==(o=null!==(i=t.renderStrategy)&&void 0!==i?i:r.renderStrategy)&&void 0!==o?o:"normal";return a("virtualized"===l?I:e,n({},t))}}function S(n){return function(t){var o,i,l,u=c(!1);d(function(){t.loading||(u.current=!1)},[t.loading]);var v=s(r(e().m(function n(){var r,o,a,i,l,c,d,s,v;return e().w(function(n){for(;;)switch(n.p=n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(r=t.pagination)&&void 0!==r&&r.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:if(!u.current){n.n=4;break}return n.a(2);case 4:return u.current=!0,n.p=5,d=null!==(o=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==o?o:0,s=null!==(i=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==i?i:20,v=d+1,n.n=6,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,v,s);case 6:return n.p=6,u.current=!1,n.f(6);case 7:return n.a(2)}},n,null,[[5,,6,7]])})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(i=t.pagination)||void 0===i?void 0:i.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return a(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?v: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 // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const isScrollingRef = useRef(false)\r\n // windowedRef / measurementEndIndexRef let scheduleMeasuredHeightUpdate read the current\r\n // window without capturing it in a closure, so the callback never needs to be recreated.\r\n const windowedRef = useRef({ startIndex: 0, endIndex: -1 })\r\n const measurementEndIndexRef = useRef(-1)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders (e.g.\r\n // after measurement) cannot reset the reference point into a stale state-coordinate value.\r\n const lastFiredScrollTopRef = useRef(0)\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 [isScrolling, setIsScrolling] = useState(false)\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 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 // Cancel any pending scroll RAF before resetting so it cannot overwrite the reset state.\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n setScrollTopState(0)\r\n if (isScrollingRef.current) {\r\n isScrollingRef.current = false\r\n setIsScrolling(false)\r\n }\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 // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowHeightRef = useRef(rowHeight)\r\n rowHeightRef.current = rowHeight\r\n const overscanRef = useRef(overscan)\r\n overscanRef.current = overscan\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 // NOTE: The bottom-clamp that previously pinned startRow when endRow===totalRows-1\r\n // has been removed. That clamp decoupled startRow from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → startRow changed even\r\n // though scrollTopState was unchanged). Total virtual height equals totalRows*rowHeight\r\n // regardless of startRow, so there is no oscillation feedback loop without the clamp.\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 // Keep refs in sync so RAF callbacks and scheduleMeasuredHeightUpdate read the current\r\n // window without capturing it in a closure (avoids recreating those callbacks on scroll).\r\n windowedRef.current = windowed\r\n measurementEndIndexRef.current = windowed.endIndex\r\n\r\n const visibleItems = useMemo(\r\n () => (windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []),\r\n [finalItems, windowed.startIndex, windowed.endIndex]\r\n )\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 // Memoize the item-height sx object so MUI doesn't re-process styles on every render.\r\n const gridItemSx = useMemo<BoxProps['sx']>(\r\n () => (measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined),\r\n [measuredItemHeight, effectiveItemHeight]\r\n )\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n // Multiple scroll events in the same frame are collapsed into one RAF.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Only setState for isScrolling when the boolean value actually flips.\r\n const nextIsScrolling = domScrollTop > mergedConfig.scrollingThreshold\r\n if (nextIsScrolling !== isScrollingRef.current) {\r\n isScrollingRef.current = nextIsScrolling\r\n setIsScrolling(nextIsScrolling)\r\n }\r\n\r\n // Skip scroll state update if the virtual window (startRow) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders (e.g. after measurement) cannot reset the dead zone into a stale state.\r\n const lastFiredStartRow = Math.max(0, Math.floor(lastFiredScrollTopRef.current / rowHeightRef.current) - overscanRef.current)\r\n const newStartRow = Math.max(0, Math.floor(domScrollTop / rowHeightRef.current) - overscanRef.current)\r\n if (newStartRow === lastFiredStartRow) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\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 // Reads windowed bounds from refs so this callback is stable (deps=[]) and never recreated.\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 { startIndex } = windowedRef.current\r\n const endIndex = measurementEndIndexRef.current\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= startIndex && index <= endIndex)\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 }, [])\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 // Once measured, the effect is a cheap no-op on every subsequent scroll.\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 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 // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\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={gridItemSx}\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","scrollRafRef","latestScrollTopRef","isScrollingRef","windowedRef","startIndex","endIndex","measurementEndIndexRef","lastFiredScrollTopRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","_useState1","_useState10","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","round","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","cancelAnimationFrame","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","rowHeightRef","overscanRef","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","gridItemSx","minHeight","height","cancelScheduledMeasurement","useCallback","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","newScrollTop","_wrapRef$current$scro","_wrapRef$current3","domScrollTop","nextIsScrolling","lastFiredStartRow","sx","offset","_config$getterId2","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 // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const isScrollingRef = useRef(false)\r\n // windowedRef / measurementEndIndexRef let scheduleMeasuredHeightUpdate read the current\r\n // window without capturing it in a closure, so the callback never needs to be recreated.\r\n const windowedRef = useRef({ startIndex: 0, endIndex: -1 })\r\n const measurementEndIndexRef = useRef(-1)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders (e.g.\r\n // after measurement) cannot reset the reference point into a stale state-coordinate value.\r\n const lastFiredScrollTopRef = useRef(0)\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 [isScrolling, setIsScrolling] = useState(false)\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 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 // Cancel any pending scroll RAF before resetting so it cannot overwrite the reset state.\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n setScrollTopState(0)\r\n if (isScrollingRef.current) {\r\n isScrollingRef.current = false\r\n setIsScrolling(false)\r\n }\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 // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowHeightRef = useRef(rowHeight)\r\n rowHeightRef.current = rowHeight\r\n const overscanRef = useRef(overscan)\r\n overscanRef.current = overscan\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 // NOTE: The bottom-clamp that previously pinned startRow when endRow===totalRows-1\r\n // has been removed. That clamp decoupled startRow from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → startRow changed even\r\n // though scrollTopState was unchanged). Total virtual height equals totalRows*rowHeight\r\n // regardless of startRow, so there is no oscillation feedback loop without the clamp.\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 // Keep refs in sync so RAF callbacks and scheduleMeasuredHeightUpdate read the current\r\n // window without capturing it in a closure (avoids recreating those callbacks on scroll).\r\n windowedRef.current = windowed\r\n measurementEndIndexRef.current = windowed.endIndex\r\n\r\n const visibleItems = useMemo(\r\n () => (windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []),\r\n [finalItems, windowed.startIndex, windowed.endIndex]\r\n )\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 // Memoize the item-height sx object so MUI doesn't re-process styles on every render.\r\n const gridItemSx = useMemo<BoxProps['sx']>(\r\n () => (measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined),\r\n [measuredItemHeight, effectiveItemHeight]\r\n )\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n // Multiple scroll events in the same frame are collapsed into one RAF.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Only setState for isScrolling when the boolean value actually flips.\r\n const nextIsScrolling = domScrollTop > mergedConfig.scrollingThreshold\r\n if (nextIsScrolling !== isScrollingRef.current) {\r\n isScrollingRef.current = nextIsScrolling\r\n setIsScrolling(nextIsScrolling)\r\n }\r\n\r\n // Skip scroll state update if the virtual window (startRow) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders (e.g. after measurement) cannot reset the dead zone into a stale state.\r\n const lastFiredStartRow = Math.max(0, Math.floor(lastFiredScrollTopRef.current / rowHeightRef.current) - overscanRef.current)\r\n const newStartRow = Math.max(0, Math.floor(domScrollTop / rowHeightRef.current) - overscanRef.current)\r\n if (newStartRow === lastFiredStartRow) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\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 // Reads windowed bounds from refs so this callback is stable (deps=[]) and never recreated.\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 { startIndex } = windowedRef.current\r\n const endIndex = measurementEndIndexRef.current\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= startIndex && index <= endIndex)\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 }, [])\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 // Once measured, the effect is a cheap no-op on every subsequent scroll.\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 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 // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\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={gridItemSx}\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 // Guard against duplicate calls during the window between onPageChange and loading=true propagating back\r\n const pendingRef = useRef(false)\r\n\r\n // Sync pendingRef when loading resets externally (e.g. error path where onPageChange didn't resolve)\r\n useEffect(() => {\r\n if (!props.loading) pendingRef.current = false\r\n }, [props.loading])\r\n\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 if (pendingRef.current) return\r\n\r\n pendingRef.current = true\r\n try {\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 } finally {\r\n pendingRef.current = false\r\n }\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","scrollRafRef","latestScrollTopRef","isScrollingRef","windowedRef","startIndex","endIndex","measurementEndIndexRef","lastFiredScrollTopRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","_useState1","_useState10","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","round","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","cancelAnimationFrame","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","rowHeightRef","overscanRef","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","gridItemSx","minHeight","height","cancelScheduledMeasurement","useCallback","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","newScrollTop","_wrapRef$current$scro","_wrapRef$current3","domScrollTop","nextIsScrolling","lastFiredStartRow","sx","offset","_config$getterId2","createViewGridVirtualized","_ref9","_props$renderStrategy","renderStrategy","createViewGridLoading","GridComponent","_props$pagination4","_props$pagination5","_props$pagination6","pendingRef","loading","handleNearEnd","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","p","loadMode","a","pagination","hasNext","page","pageSize","onPageChange"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as e,asyncToGenerator as n,regenerator as r,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{
|
|
1
|
+
import{objectSpread2 as e,asyncToGenerator as n,regenerator as r,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{useRef as i,useEffect as o,useCallback as c,useState as u,useLayoutEffect as d,useMemo as s}from"react";import{TableContainer as h,Table as g,TableHead as v,TableRow as m,TableCell as f,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as H,useListSelection as C}from"./hooks.js";import{ViewListStyled as N,viewListClasses as M}from"./styled.js";import{CHECKBOX_COL_WIDTH as w,LIST_HEADER_HEIGHT as T,resolveListSpacerHeight as y,resolveFlexColumnWidths as k,mapSxTableCell as R}from"./helpers.js";function z(e,n,r){var t=n[e.field],a=e.valueGetter?e.valueGetter(t,n,r):t,i={value:a,row:n,index:r,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return l(x,{variant:"body2",noWrap:!0,title:o,children:o})}function I(e,n){return a("colgroup",{children:[n&&l("col",{style:{width:w}}),e.map(function(e,n){return l("col",{style:void 0!==e?{width:e}:void 0},n)})]})}function j(n){var r=function(e){return function(n){var r=H(e,n),c=(r.selectable?w:0)+r.columns.reduce(function(e,n){var r;return void 0!==n.width?e+("number"==typeof n.width?n.width:0):e+(null!==(r=n.minWidth)&&void 0!==r?r:0)},0),x=1==r.normalOptions.autoHeight,T=n.onSelectionChange,y=i(null),j=u(0),A=t(j,2),O=A[0],W=A[1];d(function(){if(y.current){var e=y.current,n=function(){return W(function(n){var r=e.clientWidth;return n===r?n:r})};n();var r=new ResizeObserver(n);return r.observe(e),function(){return r.disconnect()}}},[]);var B=s(function(){return k(r.columns,r.selectable,O)},[r.columns,r.selectable,O]);o(function(){x||void 0===n.scrollResetToken||y.current&&(y.current.scrollTop=0)},[n.scrollResetToken]);var E=C(n.value,e.getterId,r.selectable,n.selectedIds,T),P=E.selectedIds,F=E.isAllSelected,G=E.isSomeSelected,_=E.handleToggleAll,q=E.handleToggleRow,D=s(function(){var e=[M.root,M.normal];return x&&e.push(M.autoHeight),e.join(" ")},[x]);return l(N,{className:D,style:r.rootStyle,children:l(h,{ref:y,className:M.scrollContainer,onScroll:function(e){if(!x){var t,l=e.currentTarget;l.scrollHeight-l.scrollTop-l.clientHeight<=r.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))}},children:a(g,{size:"small",className:M.table,sx:{minWidth:c},children:[I(B,r.selectable),l(v,{className:M.tableHeader,children:a(m,{children:[r.selectable&&l(f,{padding:"checkbox",className:M.tableHeaderCell,children:l(p,{checked:F,indeterminate:G,onChange:_})}),r.columns.map(function(e,n){var r;return l(f,{className:M.tableHeaderCell,align:e.align,sx:R(e,B[n]),children:null!==(r=e.label)&&void 0!==r?r:String(e.field)},String(e.field))})]})}),l(b,{children:n.value.map(function(n,t){var i,o=null!==(i=e.getterId(n,t))&&void 0!==i?i:t,c=P.includes(o),u=r.rowHeight,d=r.cellPadding;return a(m,{hover:!0,sx:{height:u},selected:c,children:[r.selectable&&l(f,{padding:"checkbox",className:M.tableBodyCell,sx:{height:u,padding:d},children:l(p,{checked:c,onChange:function(){return q(o)}})}),r.columns.map(function(e,r){return l(f,{className:M.tableBodyCell,align:e.align,sx:R(e,B[r],{height:u,padding:d}),children:l(S,{className:M.tableCellContent,children:z(e,n,t)})},"".concat(String(o),"-").concat(String(e.field)))})]},o)})})]})})})}}(n),c=function(e){return function(n){var r=H(e,n),c=(r.selectable?w:0)+r.columns.reduce(function(e,n){var r;return void 0!==n.width?e+("number"==typeof n.width?n.width:0):e+(null!==(r=n.minWidth)&&void 0!==r?r:0)},0),x=n.onSelectionChange,j=C(n.value,e.getterId,r.selectable,n.selectedIds,x),A=j.selectedIds,O=j.isAllSelected,W=j.isSomeSelected,B=j.handleToggleAll,E=j.handleToggleRow,P=i(null),F=i(null),G=i(!1),_=i(null),q=i(0),D=u(0),J=t(D,2),K=J[0],L=J[1],Q=u(0),U=t(Q,2),V=U[0],X=U[1],Y=u(0),Z=t(Y,2),$=Z[0],ee=Z[1],ne=u(T),re=t(ne,2),te=re[0],le=re[1],ae=Math.max(1,r.virtualizedOptions.overscan),ie=i(0),oe=i(T),ce=i(ae),ue=i(0);o(function(){void 0!==n.scrollResetToken&&(P.current&&(P.current.scrollTop=0),q.current=0,ue.current=0,null!==_.current&&(cancelAnimationFrame(_.current),_.current=null),ee(0))},[n.scrollResetToken]),o(function(){return function(){null!==_.current&&(cancelAnimationFrame(_.current),_.current=null)}},[]),d(function(){if(P.current){var e=P.current.scrollTop;if(e>0){var n=Math.round(e);ue.current=n,ee(n)}var r=function(){var e=P.current;if(e){var n=e.clientHeight,r=e.clientWidth;L(function(e){return e===n?e:n}),X(function(e){return e===r?e:r})}};r();var t=new ResizeObserver(function(){return r()});return t.observe(P.current),function(){return t.disconnect()}}},[]),d(function(){G.current=!1},[r.columns.length]),d(function(){var e,n;if(!G.current){var r=null!==(e=null===(n=F.current)||void 0===n?void 0:n.offsetHeight)&&void 0!==e?e:0;r>0&&(G.current=!0,le(r))}},[r.columns.length]);var de=s(function(){var e=n.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};if(0===K){var t=2*ae+1;return{start:0,end:Math.min(e-1,t),topSpacerHeight:0,bottomSpacerHeight:0}}var l=r.rowHeight,a=r.rowSpacing,i=Math.round(l),o=Math.round(a),c=i+o,u=$,d=Math.max(1,K-te),s=Math.max(0,u-te),h=Math.ceil(d/c),g=Math.max(0,Math.floor(s/c)-ae),v=Math.min(e-1,g+h+2*ae);return{start:g,end:v,topSpacerHeight:y(g,i,o),bottomSpacerHeight:y(e-v-1,i,o)}},[n.value.length,te,ae,r,$,K]);ie.current=Math.round(r.rowHeight)+Math.round(r.rowSpacing),oe.current=te,ce.current=ae;var se=s(function(){return k(r.columns,r.selectable,V)},[r.columns,r.selectable,V]),he=s(function(){return de.end>=de.start?n.value.slice(de.start,de.end+1):[]},[n.value,de.start,de.end]),ge=[M.root,M.virtualized].filter(Boolean).join(" ");return l(N,{className:ge,style:r.rootStyle,children:l(h,{ref:P,className:M.scrollContainer,onScroll:function(e){var t,l=e.currentTarget,a=Math.round(l.scrollTop);q.current=a,l.scrollHeight-l.scrollTop-l.clientHeight<=r.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n)),null===_.current&&(_.current=requestAnimationFrame(function(){var e,n;_.current=null;var r=Math.round(null!==(e=null===(n=P.current)||void 0===n?void 0:n.scrollTop)&&void 0!==e?e:q.current);q.current=r;var t=ie.current,l=Math.max(0,ue.current-oe.current),a=t>0?Math.max(0,Math.floor(l/t)-ce.current):0,i=Math.max(0,r-oe.current);(t>0?Math.max(0,Math.floor(i/t)-ce.current):0)!==a&&(ue.current=r,ee(r))}))},children:a(g,{size:"small",className:M.table,sx:{minWidth:c},children:[I(se,r.selectable),l(v,{className:M.tableHeader,children:a(m,{ref:F,children:[r.selectable&&l(f,{padding:"checkbox",className:M.tableHeaderCell,children:l(p,{checked:O,indeterminate:W,onChange:B})}),r.columns.map(function(e,n){var r;return l(f,{className:M.tableHeaderCell,align:e.align,sx:R(e,se[n]),children:null!==(r=e.label)&&void 0!==r?r:String(e.field)},String(e.field))})]})}),a(b,{children:[de.topSpacerHeight>0?l(m,{className:M.tableSpacerRow,children:l(f,{colSpan:r.columns.length+(r.selectable?1:0),className:M.tableSpacerCell,sx:{height:de.topSpacerHeight,padding:0,border:0}})}):null,he.map(function(n,t){var i,o=de.start+t,c=null!==(i=e.getterId(n,o))&&void 0!==i?i:o,u=A.includes(c),d=r.rowHeight,s=r.cellPadding;return a(m,{hover:!0,sx:{height:d},selected:u,children:[r.selectable&&l(f,{padding:"checkbox",className:M.tableBodyCell,sx:{height:d,padding:s},children:l(p,{checked:u,onChange:function(){return E(c)}})}),r.columns.map(function(e,r){return l(f,{className:M.tableBodyCell,align:e.align,sx:R(e,se[r],{height:d,padding:s}),children:l(S,{className:M.tableCellContent,children:z(e,n,o)})},"".concat(String(c),"-").concat(String(e.field)))})]},c)}),de.bottomSpacerHeight>0?l(m,{className:M.tableSpacerRow,children:l(f,{colSpan:r.columns.length+(r.selectable?1:0),className:M.tableSpacerCell,sx:{height:de.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(n);return function(t){var a,i,o=null!==(a=null!==(i=t.renderStrategy)&&void 0!==i?i:n.renderStrategy)&&void 0!==a?a:"normal";return l("virtualized"===o?c:r,e({},t))}}function A(e){return function(t){var a,u,d,s=i(!1);o(function(){t.loading||(s.current=!1)},[t.loading]);var h=c(n(r().m(function e(){var n,l,a,i,o,c,u,d,h;return r().w(function(e){for(;;)switch(e.p=e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(n=t.pagination)&&void 0!==n&&n.hasNext){e.n=2;break}return e.a(2);case 2:if(!t.loading){e.n=3;break}return e.a(2);case 3:if(!s.current){e.n=4;break}return e.a(2);case 4:return s.current=!0,e.p=5,u=null!==(l=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==l?l:0,d=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,h=u+1,e.n=6,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,h,d);case 6:return e.p=6,s.current=!1,e.f(6);case 7:return e.a(2)}},e,null,[[5,,6,7]])})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(u=t.pagination)||void 0===u?void 0:u.page,null===(d=t.pagination)||void 0===d?void 0:d.pageSize,t.loading,t.onPageChange]);return l(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?h:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{j as createViewList,A as createViewListLoading,j 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, CHECKBOX_COL_WIDTH, mapSxTableCell, resolveFlexColumnWidths, 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\nfunction renderColGroup(resolvedWidths: Array<number | string | undefined>, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {resolvedWidths.map((w, i) => (\r\n <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n ))}\r\n </colgroup>\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 tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n\r\n useLayoutEffect(() => {\r\n if (!scrollContainerRef.current) return\r\n const el = scrollContainerRef.current\r\n const update = () =>\r\n setContainerWidth((prev) => {\r\n const next = el.clientWidth\r\n return prev === next ? prev : next\r\n })\r\n update()\r\n const observer = new ResizeObserver(update)\r\n observer.observe(el)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [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} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\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, colIndex) => (\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, resolvedWidths[colIndex], { 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 tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 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 // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [containerWidth, setContainerWidth] = 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 // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowStrideRef = useRef(0)\r\n const headerHeightScrollRef = useRef(LIST_HEADER_HEIGHT)\r\n const overscanScrollRef = useRef(overscan)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders cannot\r\n // reset the reference point into a stale state-coordinate value (causing a stuck dead zone).\r\n const lastFiredScrollTopRef = useRef(0)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Skip scroll state update if the virtual window (start row) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders cannot reset the dead zone into a stale state-coordinate value.\r\n const rs = rowStrideRef.current\r\n const lastFiredAdj = Math.max(0, lastFiredScrollTopRef.current - headerHeightScrollRef.current)\r\n const lastFiredStart = rs > 0 ? Math.max(0, Math.floor(lastFiredAdj / rs) - overscanScrollRef.current) : 0\r\n const adjustedScrollTop = Math.max(0, domScrollTop - headerHeightScrollRef.current)\r\n const newStart = rs > 0 ? Math.max(0, Math.floor(adjustedScrollTop / rs) - overscanScrollRef.current) : 0\r\n if (newStart === lastFiredStart) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\r\n })\r\n }\r\n\r\n // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) {\r\n const rounded = Math.round(domScrollTop)\r\n lastFiredScrollTopRef.current = rounded\r\n setScrollTopState(rounded)\r\n }\r\n\r\n const updateSize = () => {\r\n const el = wrapRef.current\r\n if (!el) return\r\n const nextHeight = el.clientHeight\r\n const nextWidth = el.clientWidth\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\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 // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), 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 // NOTE: The bottom-clamp that previously pinned start when end===totalItems-1\r\n // has been removed. That clamp decoupled start from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → start changed even\r\n // though scrollTopState was unchanged).\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 // Keep refs in sync for RAF window-change detection (read in handleScroll, never during render).\r\n rowStrideRef.current = Math.round(mergedConfig.rowHeight) + Math.round(mergedConfig.rowSpacing)\r\n headerHeightScrollRef.current = headerHeight\r\n overscanScrollRef.current = overscan\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n const rowsToRender = useMemo(\r\n () => (windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []),\r\n [props.value, windowed.start, windowed.end]\r\n )\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} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\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, colIndex) => (\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, resolvedWidths[colIndex], { 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","renderColGroup","resolvedWidths","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","w","i","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","tableMinWidth","columns","reduce","sum","col","_col$minWidth","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","_useState","useState","_useState2","_slicedToArray","containerWidth","setContainerWidth","useLayoutEffect","current","el","update","prev","next","clientWidth","observer","ResizeObserver","observe","disconnect","useMemo","resolveFlexColumnWidths","useEffect","scrollResetToken","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","sx","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","colIndex","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_col$minWidth2","wrapRef","headerRowRef","hasHeaderMeasuredRef","scrollRafRef","latestScrollTopRef","_useState3","_useState4","containerHeight","setContainerHeight","_useState5","_useState6","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","LIST_HEADER_HEIGHT","_useState0","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","rowStrideRef","headerHeightScrollRef","overscanScrollRef","lastFiredScrollTopRef","cancelAnimationFrame","domScrollTop","rounded","round","updateSize","nextHeight","nextWidth","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","newScrollTop","requestAnimationFrame","_wrapRef$current$scro","_wrapRef$current","rs","lastFiredAdj","lastFiredStart","_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","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"muBAiBA,SAASA,EAAmBC,EAAwBC,EAAQC,GAC1D,IAAMC,EAAgBF,EAAYD,EAAOI,OACnCC,EAAQL,EAAOM,YAAcN,EAAOM,YAAYH,EAAcF,EAAKC,GAASC,EAC5EI,EAA6B,CAAEF,MAAAA,EAAOJ,IAAAA,EAAKC,MAAAA,EAAOE,MAAOJ,EAAOI,OACtE,GAAIJ,EAAOQ,WAAY,OAAOR,EAAOQ,WAAWD,GAChD,IAAME,EAAaC,OAAOL,QAAAA,EAAS,IACnC,OACEM,EAACC,EAAW,CAAAC,QAAQ,QAAQC,QAAM,EAACC,MAAON,WACvCA,GAGP,CAEA,SAASO,EAAeC,EAAoDC,GAC1E,OACEC,wBACGD,GAAcP,SAAKS,MAAO,CAAEC,MAAOC,KACnCL,EAAeM,IAAI,SAACC,EAAGC,GAAC,OACvBd,EAAa,MAAA,CAAAS,WAAaM,IAANF,EAAkB,CAAEH,MAAOG,QAAaE,GAAlDD,EAA+D,KAIjF,CAuYM,SAAUE,EAAkBC,GAChC,IAAMC,EApYR,SAAiCD,GAmH/B,OAlH8C,SAACE,GAC7C,IAAMC,EAAeC,EAAgBJ,EAAQE,GACvCG,GACHF,EAAab,WAAaI,EAAqB,GAChDS,EAAaG,QAAQC,OAAO,SAACC,EAAKC,GAAO,IAAAC,EACvC,YAAkBZ,IAAdW,EAAIhB,MAA4Be,GAA4B,iBAAdC,EAAIhB,MAAqBgB,EAAIhB,MAAQ,GAChFe,GAAmB,QAAhBE,EAAID,EAAIE,gBAAQ,IAAAD,EAAAA,EAAI,EAC/B,EAAE,GAGCE,EAA2C,GADvBT,EAAlBU,cAC2BC,WAE7BC,EAAoBb,EAAMa,kBAC1BC,EAAqBC,EAA8B,MACzDC,EAA4CC,EAAS,GAAEC,EAAAC,EAAAH,EAAA,GAAhDI,EAAcF,EAAA,GAAEG,EAAiBH,EAAA,GAExCI,EAAgB,WACd,GAAKR,EAAmBS,QAAxB,CACA,IAAMC,EAAKV,EAAmBS,QACxBE,EAAS,WAAH,OACVJ,EAAkB,SAACK,GACjB,IAAMC,EAAOH,EAAGI,YAChB,OAAOF,IAASC,EAAOD,EAAOC,CAChC,EAAE,EACJF,IACA,IAAMI,EAAW,IAAIC,eAAeL,GAEpC,OADAI,EAASE,QAAQP,GACV,WAAA,OAAMK,EAASG,YAAY,CAVD,CAWlC,EAAE,IAEH,IAAM7C,EAAiB8C,EACrB,WAAA,OAAMC,EAAwBjC,EAAaG,QAASH,EAAab,WAAYgC,IAC7E,CAACnB,EAAaG,QAASH,EAAab,WAAYgC,IAIlDe,EAAU,WACJzB,QAA2Cd,IAA3BI,EAAMoC,kBACtBtB,EAAmBS,UAAST,EAAmBS,QAAQc,UAAY,EACzE,EAAG,CAACrC,EAAMoC,mBAEV,IASME,EAAYC,EAAiBvC,EAAMzB,MAAOuB,EAAO0C,SAAUvC,EAAab,WAAYY,EAAMyC,YAAa5B,GACrG4B,EAAiFH,EAAjFG,YAAaC,EAAoEJ,EAApEI,cAAeC,EAAqDL,EAArDK,eAAgBC,EAAqCN,EAArCM,gBAAiBC,EAAoBP,EAApBO,gBAE/DC,EAAcb,EAAQ,WAC1B,IAAMc,EAAI,CAACC,EAAQC,KAAMD,EAAQE,QAEjC,OADIxC,GAAcqC,EAAEI,KAAKH,EAAQpC,YAC1BmC,EAAEK,KAAK,IAChB,EAAG,CAAC1C,IAEJ,OACE7B,EAACwE,GAAeC,UAAWR,EAAaxD,MAAOW,EAAasD,UAC1DC,SAAA3E,EAAC4E,EAAe,CAAAC,IAAK5C,EAAoBwC,UAAWN,EAAQW,gBAAiBC,SApB3B,SAACC,GACrD,IAAInD,EAAJ,CACA,IACoFoD,EAD9EC,EAAIF,EAAEG,cACRD,EAAEE,aAAeF,EAAE1B,UAAY0B,EAAEG,cAAgBjE,EAAakE,mBACjD,QAAfL,EAAA9D,EAAMoE,iBAAS,IAAAN,GAAfA,EAAAO,KAAArE,GAHgB,CAKnB,WAeKX,EAACiF,GAAMC,KAAK,QAAQjB,UAAWN,EAAQwB,MAAOC,GAAI,CAAEhE,SAAUN,aAC3DjB,EAAeC,EAAgBc,EAAab,YAC7CP,EAAC6F,GAAUpB,UAAWN,EAAQ2B,qBAC5BtF,EAACuF,aACE3E,EAAab,YACZP,EAACgG,EAAS,CAACC,QAAQ,WAAWxB,UAAWN,EAAQ+B,yBAC/ClG,EAACmG,GAASC,QAASvC,EAAewC,cAAevC,EAAgBwC,SAAUvC,MAG9E3C,EAAaG,QAAQX,IAAI,SAACc,EAAK6E,GAAQ,IAAAC,EAAA,OACtCxG,EAACgG,EAAS,CAERvB,UAAWN,EAAQ+B,gBACnBO,MAAO/E,EAAI+E,MACXb,GAAIc,EAAehF,EAAKpB,EAAeiG,IAAU5B,SAEvC,QAFuC6B,EAEhD9E,EAAIiF,aAAK,IAAAH,EAAAA,EAAIzG,OAAO2B,EAAIjC,QALpBM,OAAO2B,EAAIjC,OAMN,QAIlBO,EAAC4G,EACE,CAAAjC,SAAAxD,EAAMzB,MAAMkB,IAAI,SAACtB,EAAKC,GAAS,IAAAsH,EACxBC,EAAoC,QAA9BD,EAAG5F,EAAO0C,SAASrE,EAAKC,UAAMsH,IAAAA,EAAAA,EAAItH,EACxCwH,EAAanD,EAAYoD,SAASF,GAChCG,EAA2B7F,EAA3B6F,UAAWC,EAAgB9F,EAAhB8F,YACnB,OACE1G,EAACuF,EAAsB,CAAAoB,SAAMvB,GAAI,CAAEwB,OAAQH,GAAaI,SAAUN,EAAUpC,SAAA,CACzEvD,EAAab,YACZP,EAACgG,GAAUC,QAAQ,WAAWxB,UAAWN,EAAQmD,cAAe1B,GAAI,CAAEwB,OAAQH,EAAWhB,QAASiB,GAAavC,SAC7G3E,EAACmG,GAASC,QAASW,EAAYT,SAAU,WAAF,OAAQtC,EAAgB8C,EAAO,MAGzE1F,EAAaG,QAAQX,IAAI,SAACc,EAAK6E,GAAQ,OACtCvG,EAACgG,EAEC,CAAAvB,UAAWN,EAAQmD,cACnBb,MAAO/E,EAAI+E,MACXb,GAAIc,EAAehF,EAAKpB,EAAeiG,GAAW,CAAEa,OAAQH,EAAWhB,QAASiB,IAAcvC,SAE9F3E,EAACuH,GAAI9C,UAAWN,EAAQqD,iBAAmB7C,SAAAvF,EAAgBsC,EAAKpC,EAAKC,SALhEkI,OAAG1H,OAAO+G,GAAO,KAAAW,OAAI1H,OAAO2B,EAAIjC,QAM3B,KAdDqH,EAkBlB,WAMZ,CAEH,CAgRyBY,CAAwBzG,GACzC0G,EA9QR,SAAsC1G,GAwQpC,OAvQmD,SAACE,GAClD,IAAMC,EAAeC,EAAgBJ,EAAQE,GACvCG,GACHF,EAAab,WAAaI,EAAqB,GAChDS,EAAaG,QAAQC,OAAO,SAACC,EAAKC,GAAO,IAAAkG,EACvC,YAAkB7G,IAAdW,EAAIhB,MAA4Be,GAA4B,iBAAdC,EAAIhB,MAAqBgB,EAAIhB,MAAQ,GAChFe,GAAmB,QAAhBmG,EAAIlG,EAAIE,gBAAQ,IAAAgG,EAAAA,EAAI,EAC/B,EAAE,GAEC5F,EAAoBb,EAAMa,kBAG1ByB,EAAYC,EAAiBvC,EAAMzB,MAAOuB,EAAO0C,SAAUvC,EAAab,WAAYY,EAAMyC,YAAa5B,GACrG4B,EAAiFH,EAAjFG,YAAaC,EAAoEJ,EAApEI,cAAeC,EAAqDL,EAArDK,eAAgBC,EAAqCN,EAArCM,gBAAiBC,EAAoBP,EAApBO,gBAE/D6D,EAAU3F,EAA8B,MACxC4F,EAAe5F,EAAmC,MAClD6F,EAAuB7F,GAAO,GAI9B8F,EAAe9F,EAAsB,MACrC+F,EAAqB/F,EAAO,GAClCgG,EAA8C9F,EAAS,GAAE+F,EAAA7F,EAAA4F,EAAA,GAAlDE,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GAC1CG,EAA4ClG,EAAS,GAAEmG,EAAAjG,EAAAgG,EAAA,GAAhD/F,EAAcgG,EAAA,GAAE/F,EAAiB+F,EAAA,GACxCC,EAA4CpG,EAAS,GAAEqG,EAAAnG,EAAAkG,EAAA,GAAhDE,EAAcD,EAAA,GAAEE,GAAiBF,EAAA,GACxCG,GAAwCxG,EAASyG,GAAmBC,GAAAxG,EAAAsG,GAAA,GAA7DG,GAAYD,GAAA,GAAEE,GAAeF,GAAA,GAE9BG,GAAWC,KAAKC,IAAI,EAAG/H,EAAagI,mBAAmBH,UAGvDI,GAAenH,EAAO,GACtBoH,GAAwBpH,EAAO2G,GAC/BU,GAAoBrH,EAAO+G,IAI3BO,GAAwBtH,EAAO,GAGrCoB,EAAU,gBACuBvC,IAA3BI,EAAMoC,mBACNsE,EAAQnF,UAASmF,EAAQnF,QAAQc,UAAY,GACjDyE,EAAmBvF,QAAU,EAC7B8G,GAAsB9G,QAAU,EACH,OAAzBsF,EAAatF,UACf+G,qBAAqBzB,EAAatF,SAClCsF,EAAatF,QAAU,MAEzBiG,GAAkB,GACpB,EAAG,CAACxH,EAAMoC,mBAsCVD,EAAU,WACR,OAAO,WACwB,OAAzB0E,EAAatF,UACf+G,qBAAqBzB,EAAatF,SAClCsF,EAAatF,QAAU,KAE1B,CACF,EAAE,IAEHD,EAAgB,WACd,GAAKoF,EAAQnF,QAAb,CAKA,IAAMgH,EAAe7B,EAAQnF,QAAQc,UACrC,GAAIkG,EAAe,EAAG,CACpB,IAAMC,EAAUT,KAAKU,MAAMF,GAC3BF,GAAsB9G,QAAUiH,EAChChB,GAAkBgB,EACnB,CAED,IAAME,EAAa,WACjB,IAAMlH,EAAKkF,EAAQnF,QACnB,GAAKC,EAAL,CACA,IAAMmH,EAAanH,EAAG0C,aAChB0E,EAAYpH,EAAGI,YACrBsF,EAAmB,SAACxF,GAAI,OAAMA,IAASiH,EAAajH,EAAOiH,CAAU,GACrEtH,EAAkB,SAACK,GAAI,OAAMA,IAASkH,EAAYlH,EAAOkH,CAAS,EAJzD,CAKV,EAEDF,IAEA,IAAM7G,EAAW,IAAIC,eAAe,WAAA,OAAM4G,MAE1C,OADA7G,EAASE,QAAQ2E,EAAQnF,SAClB,WAAA,OAAMM,EAASG,YAAY,CAzBZ,CA0BvB,EAAE,IAEHV,EAAgB,WACdsF,EAAqBrF,SAAU,CAChC,EAAE,CAACtB,EAAaG,QAAQyI,SAEzBvH,EAAgB,WAAK,IAAAwH,EAAAC,EACnB,IAAInC,EAAqBrF,QAAzB,CACA,IAAMyH,EAA6C,QAArCF,EAAuB,QAAvBC,EAAGpC,EAAapF,eAAbwH,IAAoBA,OAApBA,EAAAA,EAAsBE,oBAAYH,IAAAA,EAAAA,EAAI,EACnDE,EAAW,IACbpC,EAAqBrF,SAAU,EAC/BsG,GAAgBmB,GAJgB,CAMnC,EAAE,CAAC/I,EAAaG,QAAQyI,SAEzB,IAAMK,GAAWjH,EAAQ,WACvB,IAAMkH,EAAanJ,EAAMzB,MAAMsK,OAC/B,GAAmB,IAAfM,EACF,MAAO,CAAEC,MAAO,EAAGC,KAAO,EAAEC,gBAAiB,EAAGC,mBAAoB,GAItE,GAAwB,IAApBtC,EAAuB,CACzB,IAAMuC,EAA4B,EAAX1B,GAAe,EACtC,MAAO,CAAEsB,MAAO,EAAGC,IAAKtB,KAAK0B,IAAIN,EAAa,EAAGK,GAAiBF,gBAAiB,EAAGC,mBAAoB,EAC3G,CACD,IAAQzD,EAA0B7F,EAA1B6F,UAAW4D,EAAezJ,EAAfyJ,WACbC,EAAe5B,KAAKU,MAAM3C,GAC1B8D,EAAgB7B,KAAKU,MAAMiB,GAC3BG,EAAYF,EAAeC,EAC3BE,EAAqBvC,EACrBwC,EAAqBhC,KAAKC,IAAI,EAAGf,EAAkBW,IACnDoC,EAAoBjC,KAAKC,IAAI,EAAG8B,EAAqBlC,IACrDqC,EAAelC,KAAKmC,KAAKH,EAAqBF,GAChDT,EAAQrB,KAAKC,IAAI,EAAGD,KAAKoC,MAAMH,EAAoBH,GAAa/B,IAChEuB,EAAMtB,KAAK0B,IAAIN,EAAa,EAAGC,EAAQa,EAA0B,EAAXnC,IAU1D,MAAO,CAAEsB,MAAAA,EAAOC,IAAAA,EAAKC,gBAHGc,EAAwBhB,EAAOO,EAAcC,GAG/BL,mBAFXa,EAAwBjB,EAAaE,EAAM,EAAGM,EAAcC,GAGzF,EAAG,CAAC5J,EAAMzB,MAAMsK,OAAQjB,GAAcE,GAAU7H,EAAcsH,EAAgBN,IAG9EiB,GAAa3G,QAAUwG,KAAKU,MAAMxI,EAAa6F,WAAaiC,KAAKU,MAAMxI,EAAayJ,YACpFvB,GAAsB5G,QAAUqG,GAChCQ,GAAkB7G,QAAUuG,GAE5B,IAAM3I,GAAiB8C,EACrB,WAAA,OAAMC,EAAwBjC,EAAaG,QAASH,EAAab,WAAYgC,IAC7E,CAACnB,EAAaG,QAASH,EAAab,WAAYgC,IAG5CiJ,GAAepI,EACnB,WAAA,OAAOiH,GAASG,KAAOH,GAASE,MAAQpJ,EAAMzB,MAAM+L,MAAMpB,GAASE,MAAOF,GAASG,IAAM,GAAK,EAAE,EAChG,CAACrJ,EAAMzB,MAAO2K,GAASE,MAAOF,GAASG,MAEnCvG,GAAc,CAACE,EAAQC,KAAMD,EAAQuH,aAAaC,OAAOC,SAASrH,KAAK,KAC7E,OACEvE,EAACwE,EAAc,CAACC,UAAWR,GAAaxD,MAAOW,EAAasD,UAASC,SACnE3E,EAAC4E,EAAe,CAAAC,IAAKgD,EAASpD,UAAWN,EAAQW,gBAAiBC,SAzIhB,SAACC,GACrD,IAKoF6G,EAL9E3G,EAAIF,EAAEG,cACN2G,EAAe5C,KAAKU,MAAM1E,EAAE1B,WAClCyE,EAAmBvF,QAAUoJ,EAGzB5G,EAAEE,aAAeF,EAAE1B,UAAY0B,EAAEG,cAAgBjE,EAAakE,mBACjD,QAAfuG,EAAA1K,EAAMoE,iBAAS,IAAAsG,GAAfA,EAAArG,KAAArE,IAI2B,OAAzB6G,EAAatF,UACjBsF,EAAatF,QAAUqJ,sBAAsB,WAAK,IAAAC,EAAAC,EAChDjE,EAAatF,QAAU,KAIvB,IAAMgH,EAAeR,KAAKU,MAAgCoC,QAA3BA,EAAgBC,QAAhBA,EAACpE,EAAQnF,eAARuJ,IAAeA,OAAfA,EAAAA,EAAiBzI,iBAASwI,IAAAA,EAAAA,EAAI/D,EAAmBvF,SACjFuF,EAAmBvF,QAAUgH,EAK7B,IAAMwC,EAAK7C,GAAa3G,QAClByJ,EAAejD,KAAKC,IAAI,EAAGK,GAAsB9G,QAAU4G,GAAsB5G,SACjF0J,EAAiBF,EAAK,EAAIhD,KAAKC,IAAI,EAAGD,KAAKoC,MAAMa,EAAeD,GAAM3C,GAAkB7G,SAAW,EACnGyI,EAAoBjC,KAAKC,IAAI,EAAGO,EAAeJ,GAAsB5G,UAC1DwJ,EAAK,EAAIhD,KAAKC,IAAI,EAAGD,KAAKoC,MAAMH,EAAoBe,GAAM3C,GAAkB7G,SAAW,KACvF0J,IAEjB5C,GAAsB9G,QAAUgH,EAChCf,GAAkBe,GACpB,GACD,EAwG2F/E,SACtFnE,EAACiF,EAAM,CAAAC,KAAK,QAAQjB,UAAWN,EAAQwB,MAAOC,GAAI,CAAEhE,SAAUN,GAC3DqD,SAAA,CAAAtE,EAAeC,GAAgBc,EAAab,YAC7CP,EAAC6F,EAAS,CAACpB,UAAWN,EAAQ2B,YAAWnB,SACvCnE,EAACuF,EAAS,CAAAlB,IAAKiD,EACZnD,SAAA,CAAAvD,EAAab,YACZP,EAACgG,EAAU,CAAAC,QAAQ,WAAWxB,UAAWN,EAAQ+B,yBAC/ClG,EAACmG,EAAS,CAAAC,QAASvC,EAAewC,cAAevC,EAAgBwC,SAAUvC,MAG9E3C,EAAaG,QAAQX,IAAI,SAACc,EAAK6E,GAAQ,IAAA8F,EAAA,OACtCrM,EAACgG,EAEC,CAAAvB,UAAWN,EAAQ+B,gBACnBO,MAAO/E,EAAI+E,MACXb,GAAIc,EAAehF,EAAKpB,GAAeiG,IAEtC5B,SAAS,QAAT0H,EAAA3K,EAAIiF,aAAK,IAAA0F,EAAAA,EAAItM,OAAO2B,EAAIjC,QALpBM,OAAO2B,EAAIjC,OAMN,QAIlBe,EAACoG,EACE,CAAAjC,SAAA,CAAA0F,GAASI,gBAAkB,EAC1BzK,EAAC+F,EAAS,CAAAtB,UAAWN,EAAQmI,eAAc3H,SACzC3E,EAACgG,EACC,CAAAuG,QAASnL,EAAaG,QAAQyI,QAAU5I,EAAab,WAAa,EAAI,GACtEkE,UAAWN,EAAQqI,gBACnB5G,GAAI,CAAEwB,OAAQiD,GAASI,gBAAiBxE,QAAS,EAAGwG,OAAQ,OAG9D,KAEHjB,GAAa5K,IAAI,SAACtB,EAAKoN,GAAU,IAAAC,EAC1BpN,EAAQ8K,GAASE,MAAQmC,EACzB5F,EAAoC,QAA9B6F,EAAG1L,EAAO0C,SAASrE,EAAKC,UAAMoN,IAAAA,EAAAA,EAAIpN,EACxCwH,EAAanD,EAAYoD,SAASF,GAChCG,EAA2B7F,EAA3B6F,UAAWC,EAAgB9F,EAAhB8F,YACnB,OACE1G,EAACuF,EAAsB,CAAAoB,SAAMvB,GAAI,CAAEwB,OAAQH,GAAaI,SAAUN,EAAUpC,SAAA,CACzEvD,EAAab,YACZP,EAACgG,GAAUC,QAAQ,WAAWxB,UAAWN,EAAQmD,cAAe1B,GAAI,CAAEwB,OAAQH,EAAWhB,QAASiB,GAAavC,SAC7G3E,EAACmG,GAASC,QAASW,EAAYT,SAAU,WAAF,OAAQtC,EAAgB8C,EAAO,MAGzE1F,EAAaG,QAAQX,IAAI,SAACc,EAAK6E,GAAQ,OACtCvG,EAACgG,EAEC,CAAAvB,UAAWN,EAAQmD,cACnBb,MAAO/E,EAAI+E,MACXb,GAAIc,EAAehF,EAAKpB,GAAeiG,GAAW,CAAEa,OAAQH,EAAWhB,QAASiB,IAAcvC,SAE9F3E,EAACuH,GAAI9C,UAAWN,EAAQqD,iBAAmB7C,SAAAvF,EAAgBsC,EAAKpC,EAAKC,SALhEkI,OAAG1H,OAAO+G,GAAO,KAAAW,OAAI1H,OAAO2B,EAAIjC,QAM3B,KAdDqH,EAkBlB,GAEAuD,GAASK,mBAAqB,EAC7B1K,EAAC+F,GAAStB,UAAWN,EAAQmI,eAC3B3H,SAAA3E,EAACgG,EACC,CAAAuG,QAASnL,EAAaG,QAAQyI,QAAU5I,EAAab,WAAa,EAAI,GACtEkE,UAAWN,EAAQqI,gBACnB5G,GAAI,CAAEwB,OAAQiD,GAASK,mBAAoBzE,QAAS,EAAGwG,OAAQ,OAGjE,cAMf,CAEH,CAK8BG,CAA6B3L,GASzD,OAPwC,SAACE,GAAS,IAAA0L,EAAAC,EAC1CC,UAAcF,EAAuBC,QAAvBA,EAAG3L,EAAM4L,0BAAcD,EAAAA,EAAI7L,EAAO8L,sBAAc,IAAAF,EAAAA,EAAI,SACxE,OACS7M,EADc,gBAAnB+M,EACMpF,EAEFzG,EAFqB8L,EAAK7L,CAAAA,EAAAA,GAGnC,CAEH,CASM,SAAU8L,EAAyBC,GA+BvC,OA9BsD,SAAC/L,GAAS,IAAAgM,EAAAC,EAAAC,EACxDC,EAAgBC,EAAWC,EAAAC,IAAAC,EAAC,SAAAC,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAX,IAAA5M,EAAA,SAAAwN,GAAA,cAAAA,EAAAC,GAAA,KAAA,EAAA,GACT,mBAAnBnN,EAAMoN,SAA6B,CAAAF,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAG,EAAA,GAAA,KAAA,EAAA,WAAAZ,EAClCzM,EAAMsN,kBAAU,IAAAb,GAAhBA,EAAkBc,QAAO,CAAAL,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAG,EAAA,GAAA,KAAA,EAAA,IAC1BrN,EAAMwN,QAAO,CAAAN,EAAAC,EAAA,EAAA,KAAA,CAAA,OAAAD,EAAAG,EAAA,GAAA,KAAA,EAIe,OAF1BN,EAAoC,QAAzBL,EAAmB,QAAnBC,EAAG3M,EAAMsN,kBAANX,IAAgBA,OAAhBA,EAAAA,EAAkBc,YAAIf,IAAAA,EAAAA,EAAI,EACxCM,EAA4C,QAA7BJ,EAAmB,QAAnBC,EAAG7M,EAAMsN,kBAANT,IAAgBA,OAAhBA,EAAAA,EAAkBa,gBAAQd,IAAAA,EAAAA,EAAI,GAChDK,EAAWF,EAAc,EAACG,EAAAC,EAAA,UAAAL,EAC1B9M,EAAM2N,oBAAY,IAAAb,OAAA,EAAlBA,EAAAzI,KAAArE,EAAqBiN,EAAUD,GAAgB,KAAA,EAAA,OAAAE,EAAAG,EAAA,GAAA,EAAAb,MACpD,CAACxM,EAAMoN,iBAAQpB,EAAEhM,EAAMsN,kBAAU,IAAAtB,OAAA,EAAhBA,EAAkBuB,QAAyBtB,QAAlBA,EAAEjM,EAAMsN,sBAAUrB,SAAhBA,EAAkBwB,KAAsB,QAAlBvB,EAAElM,EAAMsN,kBAAU,IAAApB,OAAA,EAAhBA,EAAkBwB,SAAU1N,EAAMwN,QAASxN,EAAM2N,eAExH,OACE9O,EAACkN,GACCxN,MAAOyB,EAAMzB,MACb6B,QAASJ,EAAMI,QACfwN,QAAS5N,EAAM4N,QACfC,QAAS7N,EAAM6N,QACfjC,eAAgB5L,EAAM4L,eACtBjL,cAAeX,EAAMW,cACrBsH,mBAAoBjI,EAAMiI,mBAC1B7D,UAA8B,mBAAnBpE,EAAMoN,SAAgCjB,OAAgBvM,EACjER,WAAYY,EAAMZ,WAClBqD,YAAazC,EAAMyC,YACnB5B,kBAAmBb,EAAMa,kBACzBuB,iBAAkBpC,EAAMoC,kBAG7B,CAGH"}
|
|
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, CHECKBOX_COL_WIDTH, mapSxTableCell, resolveFlexColumnWidths, 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\nfunction renderColGroup(resolvedWidths: Array<number | string | undefined>, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {resolvedWidths.map((w, i) => (\r\n <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n ))}\r\n </colgroup>\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 tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n\r\n useLayoutEffect(() => {\r\n if (!scrollContainerRef.current) return\r\n const el = scrollContainerRef.current\r\n const update = () =>\r\n setContainerWidth((prev) => {\r\n const next = el.clientWidth\r\n return prev === next ? prev : next\r\n })\r\n update()\r\n const observer = new ResizeObserver(update)\r\n observer.observe(el)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [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} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\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, colIndex) => (\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, resolvedWidths[colIndex], { 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 tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 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 // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [containerWidth, setContainerWidth] = 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 // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowStrideRef = useRef(0)\r\n const headerHeightScrollRef = useRef(LIST_HEADER_HEIGHT)\r\n const overscanScrollRef = useRef(overscan)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders cannot\r\n // reset the reference point into a stale state-coordinate value (causing a stuck dead zone).\r\n const lastFiredScrollTopRef = useRef(0)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Skip scroll state update if the virtual window (start row) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders cannot reset the dead zone into a stale state-coordinate value.\r\n const rs = rowStrideRef.current\r\n const lastFiredAdj = Math.max(0, lastFiredScrollTopRef.current - headerHeightScrollRef.current)\r\n const lastFiredStart = rs > 0 ? Math.max(0, Math.floor(lastFiredAdj / rs) - overscanScrollRef.current) : 0\r\n const adjustedScrollTop = Math.max(0, domScrollTop - headerHeightScrollRef.current)\r\n const newStart = rs > 0 ? Math.max(0, Math.floor(adjustedScrollTop / rs) - overscanScrollRef.current) : 0\r\n if (newStart === lastFiredStart) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\r\n })\r\n }\r\n\r\n // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) {\r\n const rounded = Math.round(domScrollTop)\r\n lastFiredScrollTopRef.current = rounded\r\n setScrollTopState(rounded)\r\n }\r\n\r\n const updateSize = () => {\r\n const el = wrapRef.current\r\n if (!el) return\r\n const nextHeight = el.clientHeight\r\n const nextWidth = el.clientWidth\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\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 // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), 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 // NOTE: The bottom-clamp that previously pinned start when end===totalItems-1\r\n // has been removed. That clamp decoupled start from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → start changed even\r\n // though scrollTopState was unchanged).\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 // Keep refs in sync for RAF window-change detection (read in handleScroll, never during render).\r\n rowStrideRef.current = Math.round(mergedConfig.rowHeight) + Math.round(mergedConfig.rowSpacing)\r\n headerHeightScrollRef.current = headerHeight\r\n overscanScrollRef.current = overscan\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n const rowsToRender = useMemo(\r\n () => (windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []),\r\n [props.value, windowed.start, windowed.end]\r\n )\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} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\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, colIndex) => (\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, resolvedWidths[colIndex], { 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 // Guard against duplicate calls during the window between onPageChange and loading=true propagating back\r\n const pendingRef = useRef(false)\r\n\r\n // Sync pendingRef when loading resets externally (e.g. error path where onPageChange didn't resolve)\r\n useEffect(() => {\r\n if (!props.loading) pendingRef.current = false\r\n }, [props.loading])\r\n\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 if (pendingRef.current) return\r\n\r\n pendingRef.current = true\r\n try {\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 } finally {\r\n pendingRef.current = false\r\n }\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","renderColGroup","resolvedWidths","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","w","i","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","tableMinWidth","columns","reduce","sum","col","_col$minWidth","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","_useState","useState","_useState2","_slicedToArray","containerWidth","setContainerWidth","useLayoutEffect","current","el","update","prev","next","clientWidth","observer","ResizeObserver","observe","disconnect","useMemo","resolveFlexColumnWidths","useEffect","scrollResetToken","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","sx","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","colIndex","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_col$minWidth2","wrapRef","headerRowRef","hasHeaderMeasuredRef","scrollRafRef","latestScrollTopRef","_useState3","_useState4","containerHeight","setContainerHeight","_useState5","_useState6","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","LIST_HEADER_HEIGHT","_useState0","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","rowStrideRef","headerHeightScrollRef","overscanScrollRef","lastFiredScrollTopRef","cancelAnimationFrame","domScrollTop","rounded","round","updateSize","nextHeight","nextWidth","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","newScrollTop","requestAnimationFrame","_wrapRef$current$scro","_wrapRef$current","rs","lastFiredAdj","lastFiredStart","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","pendingRef","loading","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","p","n","loadMode","a","pagination","hasNext","page","pageSize","onPageChange","f","density","spacing"],"mappings":"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"}
|