dinocollab-core 2.2.25 → 2.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as e,asyncToGenerator as n,regenerator as l,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as m,TableRow as v,TableCell as f,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as H}from"./hooks.js";import{ViewListStyled as N,viewListClasses as y}from"./styled.js";import{CHECKBOX_COL_WIDTH as T,LIST_HEADER_HEIGHT as w,resolveListSpacerHeight as k,mapSxTableCell as M,getColumnWidth as R}from"./helpers.js";function z(e,n,l){var t=n[e.field],a=e.valueGetter?e.valueGetter(t,n,l):t,i={value:a,row:n,index:l,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function I(e,n,l,t){return a("colgroup",{children:[t&&r("col",{style:{width:T}}),e.map(function(e,t){var a=R(e,l,n);return r("col",{style:void 0!==a?{width:a}:void 0},t)})]})}function j(n){var l=function(e){return function(n){var l=C(e,n),t=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),i=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),c=(l.selectable?T:0)+i,s=1==l.normalOptions.autoHeight,x=n.onSelectionChange,w=o(null);d(function(){s||void 0===n.scrollResetToken||w.current&&(w.current.scrollTop=0)},[n.scrollResetToken]);var k=H(n.value,e.getterId,l.selectable,n.selectedIds,x),R=k.selectedIds,j=k.isAllSelected,O=k.isSomeSelected,B=k.handleToggleAll,A=k.handleToggleRow,E=u(function(){var e=[y.root,y.normal];return s&&e.push(y.autoHeight),e.join(" ")},[s]);return r(N,{className:E,style:l.rootStyle,children:r(h,{ref:w,className:y.scrollContainer,onScroll:function(e){if(!s){var t,r=e.currentTarget;r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))}},children:a(g,{size:"small",className:y.table,children:[I(l.columns,t,c,l.selectable),r(m,{className:y.tableHeader,children:a(v,{children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:j,indeterminate:O,onChange:B})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,t,c),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),r(b,{children:n.value.map(function(n,i){var o,d=null!==(o=e.getterId(n,i))&&void 0!==o?o:i,s=R.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return A(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,t,c,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,i)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)})})]})})})}}(n),i=function(e){return function(n){var l=C(e,n),i=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),x=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),R=(l.selectable?T:0)+x,j=n.onSelectionChange,O=H(n.value,e.getterId,l.selectable,n.selectedIds,j),B=O.selectedIds,A=O.isAllSelected,E=O.isSomeSelected,P=O.handleToggleAll,W=O.handleToggleRow,G=o(null),_=o(null),q=o(!1),D=c(0),F=t(D,2),J=F[0],K=F[1],L=c(0),Q=t(L,2),U=Q[0],V=Q[1],X=c(w),Y=t(X,2),Z=Y[0],$=Y[1],ee=Math.max(1,l.virtualizedOptions.overscan);d(function(){void 0!==n.scrollResetToken&&(G.current&&(G.current.scrollTop=0),V(0))},[n.scrollResetToken]),s(function(){if(G.current){var e=G.current.scrollTop;e>0&&V(Math.round(e));var n=function(){var e,n,l=null!==(e=null===(n=G.current)||void 0===n?void 0:n.clientHeight)&&void 0!==e?e:0;K(function(e){return e===l?e:l})};n();var l=new ResizeObserver(function(){return n()});return l.observe(G.current),function(){return l.disconnect()}}},[]),s(function(){q.current=!1},[l.columns.length]),s(function(){var e,n;if(!q.current){var l=null!==(e=null===(n=_.current)||void 0===n?void 0:n.offsetHeight)&&void 0!==e?e:0;l>0&&(q.current=!0,$(l))}},[l.columns.length]);var ne=u(function(){var e=n.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};if(0===J){var t=2*ee+1;return{start:0,end:Math.min(e-1,t),topSpacerHeight:0,bottomSpacerHeight:0}}var r=l.rowHeight,a=l.rowSpacing,i=Math.round(r),o=Math.round(a),c=i+o,d=U,s=Math.max(1,J-Z),u=Math.max(0,d-Z),h=Math.ceil(s/c),g=Math.max(0,Math.floor(u/c)-ee),m=Math.min(e-1,g+h+2*ee);return m===e-1&&(g=Math.max(0,e-h-2*ee)),{start:g,end:m,topSpacerHeight:k(g,i,o),bottomSpacerHeight:k(e-m-1,i,o)}},[n.value.length,Z,ee,l,U,J]),le=ne.end>=ne.start?n.value.slice(ne.start,ne.end+1):[],te=[y.root,y.virtualized].filter(Boolean).join(" ");return r(N,{className:te,style:l.rootStyle,children:r(h,{ref:G,className:y.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;V(Math.round(r.scrollTop)),r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))},children:a(g,{size:"small",className:y.table,children:[I(l.columns,i,R,l.selectable),r(m,{className:y.tableHeader,children:a(v,{ref:_,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:A,indeterminate:E,onChange:P})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,i,R),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),a(b,{children:[ne.topSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.topSpacerHeight,padding:0,border:0}})}):null,le.map(function(n,t){var o,c=ne.start+t,d=null!==(o=e.getterId(n,c))&&void 0!==o?o:c,s=B.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return W(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,i,R,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),ne.bottomSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(n);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:n.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:l,e({},t))}}function O(e){return function(t){var a,o,c,d=i(n(l().m(function e(){var n,r,a,i,o,c,d,s,u;return l().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(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:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{j as createViewList,O as createViewListLoading,j as default};
|
|
1
|
+
import{objectSpread2 as e,asyncToGenerator as n,regenerator as l,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as m,TableRow as v,TableCell as f,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as H}from"./hooks.js";import{ViewListStyled as N,viewListClasses as y}from"./styled.js";import{CHECKBOX_COL_WIDTH as T,LIST_HEADER_HEIGHT as w,resolveListSpacerHeight as k,mapSxTableCell as M,getColumnWidth as R}from"./helpers.js";function z(e,n,l){var t=n[e.field],a=e.valueGetter?e.valueGetter(t,n,l):t,i={value:a,row:n,index:l,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function I(e,n,l,t){return a("colgroup",{children:[t&&r("col",{style:{width:T}}),e.map(function(e,t){var a=R(e,l,n);return r("col",{style:void 0!==a?{width:a}:void 0},t)})]})}function j(n){var l=function(e){return function(n){var l=C(e,n),t=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),i=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),c=(l.selectable?T:0)+i,s=1==l.normalOptions.autoHeight,x=n.onSelectionChange,w=o(null);d(function(){s||void 0===n.scrollResetToken||w.current&&(w.current.scrollTop=0)},[n.scrollResetToken]);var k=H(n.value,e.getterId,l.selectable,n.selectedIds,x),R=k.selectedIds,j=k.isAllSelected,O=k.isSomeSelected,B=k.handleToggleAll,A=k.handleToggleRow,E=u(function(){var e=[y.root,y.normal];return s&&e.push(y.autoHeight),e.join(" ")},[s]);return r(N,{className:E,style:l.rootStyle,children:r(h,{ref:w,className:y.scrollContainer,onScroll:function(e){if(!s){var t,r=e.currentTarget;r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))}},children:a(g,{size:"small",className:y.table,children:[I(l.columns,t,c,l.selectable),r(m,{className:y.tableHeader,children:a(v,{children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:j,indeterminate:O,onChange:B})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,t,c),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),r(b,{children:n.value.map(function(n,i){var o,d=null!==(o=e.getterId(n,i))&&void 0!==o?o:i,s=R.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return A(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,t,c,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,i)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)})})]})})})}}(n),i=function(e){return function(n){var l=C(e,n),i=l.columns.reduce(function(e,n){return e+(n.flex&&n.flex>0?n.flex:0)},0),x=l.columns.reduce(function(e,n){return"number"==typeof n.width?e+n.width:void 0===n.width&&void 0===n.flex&&"number"==typeof n.minWidth?e+n.minWidth:e},0),R=(l.selectable?T:0)+x,j=n.onSelectionChange,O=H(n.value,e.getterId,l.selectable,n.selectedIds,j),B=O.selectedIds,A=O.isAllSelected,E=O.isSomeSelected,P=O.handleToggleAll,W=O.handleToggleRow,G=o(null),_=o(null),q=o(!1),D=c(0),F=t(D,2),J=F[0],K=F[1],L=c(0),Q=t(L,2),U=Q[0],V=Q[1],X=c(w),Y=t(X,2),Z=Y[0],$=Y[1],ee=Math.max(1,l.virtualizedOptions.overscan);d(function(){void 0!==n.scrollResetToken&&(G.current&&(G.current.scrollTop=0),V(0))},[n.scrollResetToken]),s(function(){if(G.current){var e=G.current.scrollTop;e>0&&V(Math.round(e));var n=function(){var e,n,l=null!==(e=null===(n=G.current)||void 0===n?void 0:n.clientHeight)&&void 0!==e?e:0;K(function(e){return e===l?e:l})};n();var l=new ResizeObserver(function(){return n()});return l.observe(G.current),function(){return l.disconnect()}}},[]),s(function(){q.current=!1},[l.columns.length]),s(function(){var e,n;if(!q.current){var l=null!==(e=null===(n=_.current)||void 0===n?void 0:n.offsetHeight)&&void 0!==e?e:0;l>0&&(q.current=!0,$(l))}},[l.columns.length]);var ne=u(function(){var e=n.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};if(0===J){var t=2*ee+1;return{start:0,end:Math.min(e-1,t),topSpacerHeight:0,bottomSpacerHeight:0}}var r=l.rowHeight,a=l.rowSpacing,i=Math.round(r),o=Math.round(a),c=i+o,d=U,s=Math.max(1,J-Z),u=Math.max(0,d-Z),h=Math.ceil(s/c),g=Math.max(0,Math.floor(u/c)-ee),m=Math.min(e-1,g+h+2*ee);return m===e-1&&u>0&&(g=Math.max(0,e-h-2*ee)),{start:g,end:m,topSpacerHeight:k(g,i,o),bottomSpacerHeight:k(e-m-1,i,o)}},[n.value.length,Z,ee,l,U,J]),le=ne.end>=ne.start?n.value.slice(ne.start,ne.end+1):[],te=[y.root,y.virtualized].filter(Boolean).join(" ");return r(N,{className:te,style:l.rootStyle,children:r(h,{ref:G,className:y.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;V(Math.round(r.scrollTop)),r.scrollHeight-r.scrollTop-r.clientHeight<=l.nearEndThreshold&&(null===(t=n.onNearEnd)||void 0===t||t.call(n))},children:a(g,{size:"small",className:y.table,children:[I(l.columns,i,R,l.selectable),r(m,{className:y.tableHeader,children:a(v,{ref:_,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableHeaderCell,children:r(p,{checked:A,indeterminate:E,onChange:P})}),l.columns.map(function(e){var n;return r(f,{className:y.tableHeaderCell,align:e.align,sx:M(e,i,R),children:null!==(n=e.label)&&void 0!==n?n:String(e.field)},String(e.field))})]})}),a(b,{children:[ne.topSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.topSpacerHeight,padding:0,border:0}})}):null,le.map(function(n,t){var o,c=ne.start+t,d=null!==(o=e.getterId(n,c))&&void 0!==o?o:c,s=B.includes(d),u=l.rowHeight,h=l.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[l.selectable&&r(f,{padding:"checkbox",className:y.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return W(d)}})}),l.columns.map(function(e){return r(f,{className:y.tableBodyCell,align:e.align,sx:M(e,i,R,{height:u,padding:h}),children:r(S,{className:y.tableCellContent,children:z(e,n,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),ne.bottomSpacerHeight>0?r(v,{className:y.tableSpacerRow,children:r(f,{colSpan:l.columns.length+(l.selectable?1:0),className:y.tableSpacerCell,sx:{height:ne.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(n);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:n.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:l,e({},t))}}function O(e){return function(t){var a,o,c,d=i(n(l().m(function e(){var n,r,a,i,o,c,d,s,u;return l().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(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:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{j as createViewList,O 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, getColumnWidth, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup<T>(cols: TListColumn<T>[], totalFlex: number, totalFixedPx: number, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {cols.map((col, i) => {\r\n const w = getColumnWidth(col, totalFixedPx, totalFlex)\r\n return <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 totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\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\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}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, 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) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\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) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\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 setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // 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) setScrollTopState(Math.round(domScrollTop))\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // 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 // When clamped at the bottom, pin start to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n if (end === totalItems - 1) {\r\n start = Math.max(0, totalItems - visibleCount - overscan * 2)\r\n }\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, 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) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\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) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { 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","cols","totalFlex","totalFixedPx","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","col","i","w","getColumnWidth","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","columns","reduce","sum","flex","totalFixedPxRaw","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","useEffect","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","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","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","_col$label","align","sx","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","domScrollTop","round","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, CHECKBOX_COL_WIDTH, getColumnWidth, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup<T>(cols: TListColumn<T>[], totalFlex: number, totalFixedPx: number, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {cols.map((col, i) => {\r\n const w = getColumnWidth(col, totalFixedPx, totalFlex)\r\n return <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 totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\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\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}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, 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) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\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) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n const totalFixedPxRaw = mergedConfig.columns.reduce((sum, col) => {\r\n if (typeof col.width === 'number') return sum + col.width\r\n if (col.width === undefined && col.flex === undefined && typeof col.minWidth === 'number') return sum + col.minWidth\r\n return sum\r\n }, 0)\r\n const totalFixedPx = (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) + totalFixedPxRaw\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\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 setScrollTopState(Math.round(t.scrollTop))\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // 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) setScrollTopState(Math.round(domScrollTop))\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // 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 // When clamped at the bottom, pin start to a fixed value so that topSpacerHeight\r\n // does not change with small scrollTop fluctuations (sub-pixel zoom oscillation fix).\r\n // Guard: only apply when user has actually scrolled (adjustedScrollTop > 0).\r\n // Without this guard the clamp incorrectly sets start > 0 when scrollTop = 0\r\n // and totalItems is just enough to trigger end === totalItems-1 (e.g. 24 items, 11 visible).\r\n if (end === totalItems - 1 && adjustedScrollTop > 0) {\r\n start = Math.max(0, totalItems - visibleCount - overscan * 2)\r\n }\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n {renderColGroup(mergedConfig.columns, totalFlex, totalFixedPx, 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) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx)}\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) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, totalFixedPx, { 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","cols","totalFlex","totalFixedPx","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","col","i","w","getColumnWidth","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","columns","reduce","sum","flex","totalFixedPxRaw","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","useEffect","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","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","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","_col$label","align","sx","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","domScrollTop","round","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
|