dinocollab-core 2.2.11 → 2.2.14

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.
Files changed (113) hide show
  1. package/dist/data-surface/index.js +1 -1
  2. package/dist/form/index.js +1 -1
  3. package/dist/src/data-surface/button-switch.js +1 -1
  4. package/dist/src/data-surface/button-switch.js.map +1 -1
  5. package/dist/src/data-surface/index.create.js +1 -1
  6. package/dist/src/data-surface/index.create.js.map +1 -1
  7. package/dist/src/data-surface/ui.units.js +1 -1
  8. package/dist/src/data-surface/ui.units.js.map +1 -1
  9. package/dist/src/data-surface/view-grid/hooks.js +1 -1
  10. package/dist/src/data-surface/view-grid/hooks.js.map +1 -1
  11. package/dist/src/data-surface/view-grid/index.js +1 -1
  12. package/dist/src/data-surface/view-grid/index.js.map +1 -1
  13. package/dist/src/data-surface/view-grid/styleds.js +1 -1
  14. package/dist/src/data-surface/view-grid/styleds.js.map +1 -1
  15. package/dist/src/data-surface/view-list/hooks.js +1 -1
  16. package/dist/src/data-surface/view-list/hooks.js.map +1 -1
  17. package/dist/src/data-surface/view-list/index.js +1 -1
  18. package/dist/src/data-surface/view-list/index.js.map +1 -1
  19. package/dist/src/data-surface/view-list/styled.js +1 -1
  20. package/dist/src/data-surface/view-list/styled.js.map +1 -1
  21. package/dist/src/data-surface/view-list/types.js.map +1 -1
  22. package/dist/src/filter-bar/components/chip-viewer.js +1 -1
  23. package/dist/src/filter-bar/components/chip-viewer.js.map +1 -1
  24. package/dist/src/filter-bar/components/filter-sort.js +1 -1
  25. package/dist/src/filter-bar/components/filter-sort.js.map +1 -1
  26. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  27. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  28. package/dist/src/filter-bar/components/{units.js → icons.js} +1 -1
  29. package/dist/src/filter-bar/components/{units.js.map → icons.js.map} +1 -1
  30. package/dist/src/filter-bar/components/popper-custom.js +1 -1
  31. package/dist/src/filter-bar/components/popper-custom.js.map +1 -1
  32. package/dist/src/filter-bar/components/ui.units.js +2 -0
  33. package/dist/src/filter-bar/components/ui.units.js.map +1 -0
  34. package/dist/src/filter-bar/index.create.js +1 -1
  35. package/dist/src/filter-bar/index.create.js.map +1 -1
  36. package/dist/src/filter-bar/index.dino.js +1 -1
  37. package/dist/src/filter-bar/index.dino.js.map +1 -1
  38. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +2 -0
  39. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -0
  40. package/dist/src/filter-bar/menu/create-form-field-select.js +2 -0
  41. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -0
  42. package/dist/src/filter-bar/menu/create-form-field-string.js +2 -0
  43. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -0
  44. package/dist/src/filter-bar/menu/create.js +2 -0
  45. package/dist/src/filter-bar/menu/create.js.map +1 -0
  46. package/dist/src/form/create.date-expired.js +1 -1
  47. package/dist/src/form/create.date-expired.js.map +1 -1
  48. package/dist/src/form/create.form-base.js +1 -1
  49. package/dist/src/form/create.form-base.js.map +1 -1
  50. package/dist/src/form/create.form-grid-layout.js +1 -1
  51. package/dist/src/form/create.form-grid-layout.js.map +1 -1
  52. package/dist/src/form/create.form-grid-layout.units.js +1 -1
  53. package/dist/src/form/create.form-grid-layout.units.js.map +1 -1
  54. package/dist/src/form/create.select-simple.js +1 -1
  55. package/dist/src/form/create.select-simple.js.map +1 -1
  56. package/dist/src/form/create.select-with-api.js +1 -1
  57. package/dist/src/form/create.select-with-api.js.map +1 -1
  58. package/dist/src/form/create.text-editor.js +1 -1
  59. package/dist/src/form/dino-form.js.map +1 -1
  60. package/dist/src/form/helpers.js +1 -1
  61. package/dist/src/table/create.table.js +1 -1
  62. package/dist/src/table/create.table.js.map +1 -1
  63. package/dist/src/table/csv-export-helper.js +2 -0
  64. package/dist/src/table/csv-export-helper.js.map +1 -0
  65. package/dist/src/table/custom.export-button.js +2 -0
  66. package/dist/src/table/custom.export-button.js.map +1 -0
  67. package/dist/src/table/dino.js +1 -1
  68. package/dist/src/table/dino.js.map +1 -1
  69. package/dist/src/table/toolbar-pannel.js +1 -1
  70. package/dist/src/table/toolbar-pannel.js.map +1 -1
  71. package/dist/src/utils/helpers.js +1 -1
  72. package/dist/src/utils/helpers.js.map +1 -1
  73. package/dist/types/data-surface/button-switch.d.ts +1 -0
  74. package/dist/types/data-surface/index.create.d.ts +10 -2
  75. package/dist/types/data-surface/ui.units.d.ts +4 -2
  76. package/dist/types/data-surface/view-grid/hooks.d.ts +6 -0
  77. package/dist/types/data-surface/view-grid/styleds.d.ts +2 -0
  78. package/dist/types/data-surface/view-grid/types.d.ts +15 -3
  79. package/dist/types/data-surface/view-list/hooks.d.ts +6 -0
  80. package/dist/types/data-surface/view-list/styled.d.ts +2 -0
  81. package/dist/types/data-surface/view-list/types.d.ts +15 -3
  82. package/dist/types/data-view/dino.d.ts +1 -1
  83. package/dist/types/data-view/query-param-url.d.ts +1 -1
  84. package/dist/types/filter-bar/components/chip-viewer.d.ts +1 -3
  85. package/dist/types/filter-bar/components/popper-custom.d.ts +2 -2
  86. package/dist/types/filter-bar/components/ui.units.d.ts +22 -0
  87. package/dist/types/filter-bar/index.create.d.ts +1 -1
  88. package/dist/types/filter-bar/index.dino.d.ts +6 -0
  89. package/dist/types/filter-bar/menu/create-form-field-select-multiple.d.ts +13 -0
  90. package/dist/types/filter-bar/menu/create-form-field-select.d.ts +17 -0
  91. package/dist/types/filter-bar/menu/create-form-field-string.d.ts +10 -0
  92. package/dist/types/filter-bar/{components/filter-menu.d.ts → menu/create.d.ts} +2 -2
  93. package/dist/types/filter-bar/{components/filter-menu.types.d.ts → menu/types.d.ts} +6 -1
  94. package/dist/types/form/create.date-expired.d.ts +10 -5
  95. package/dist/types/form/create.form-base.d.ts +1 -0
  96. package/dist/types/form/create.form-grid-layout.d.ts +6 -4
  97. package/dist/types/form/create.form-grid-layout.units.d.ts +12 -6
  98. package/dist/types/form/create.select-simple.d.ts +13 -3
  99. package/dist/types/form/create.select-with-api.d.ts +56 -4
  100. package/dist/types/form/dino-form.d.ts +4 -3
  101. package/dist/types/form/index.d.ts +2 -1
  102. package/dist/types/table/csv-export-helper.d.ts +20 -0
  103. package/dist/types/table/custom.export-button.d.ts +8 -0
  104. package/dist/types/table/dino.d.ts +1 -0
  105. package/dist/types/table/index.d.ts +1 -0
  106. package/dist/types/table/toolbar-pannel.d.ts +2 -0
  107. package/package.json +1 -1
  108. package/dist/src/filter-bar/components/filter-menu.js +0 -2
  109. package/dist/src/filter-bar/components/filter-menu.js.map +0 -1
  110. package/dist/src/filter-bar/components/filter-menu.units.js +0 -2
  111. package/dist/src/filter-bar/components/filter-menu.units.js.map +0 -1
  112. package/dist/types/filter-bar/components/filter-menu.units.d.ts +0 -18
  113. /package/dist/types/filter-bar/components/{units.d.ts → icons.d.ts} +0 -0
@@ -1,2 +1,2 @@
1
- export{DataSurfaceFeatureMode,DataSurfaceViewMode,LoadingModeRule,RenderStrategyRule}from"../src/data-surface/types.js";export{getPaginationFromURL,getViewModeFromURL,setPaginationToURL,setViewModeToURL}from"../src/data-surface/helpers.js";export{createDataSurface}from"../src/data-surface/index.create.js";export{createViewList,createViewListLoading}from"../src/data-surface/view-list/index.js";export{createViewGrid,createViewGridLoading}from"../src/data-surface/view-grid/index.js";export{DinoDataSurFace,dinoDataSurface}from"../src/data-surface/index.dino.js";export{ButtonSwitch}from"../src/data-surface/button-switch.js";export{ListDensity}from"../src/data-surface/view-list/types.js";
1
+ export{DataSurfaceFeatureMode,DataSurfaceViewMode,LoadingModeRule,RenderStrategyRule}from"../src/data-surface/types.js";export{getPaginationFromURL,getViewModeFromURL,setPaginationToURL,setViewModeToURL}from"../src/data-surface/helpers.js";export{createDataSurface}from"../src/data-surface/index.create.js";export{createViewList,createViewListLoading}from"../src/data-surface/view-list/index.js";export{createViewGrid,createViewGridLoading}from"../src/data-surface/view-grid/index.js";export{DinoDataSurFace,dinoDataSurface}from"../src/data-surface/index.dino.js";export{ButtonSwitch,mapIcons}from"../src/data-surface/button-switch.js";export{ListDensity}from"../src/data-surface/view-list/types.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- export{FormValidator,SingleRuleValidate,createFormValidator,mapRuleOptions}from"../src/form/validator.js";export{default as DinoForm}from"../src/form/dino-form.js";export{convertFormDataToJson,getErrorMessage,validateCsvModel}from"../src/form/helpers.js";export{formField,formPreSubmit,formValidate,getFormFields,getFormPreSubmit,getFormValidators,isFormRegistered,registerForm}from"../src/form/decorator.js";export{DecoratorField,DecoratorForm,createDecoratorForm}from"../src/form/decorator.form.js";
1
+ export{FormValidator,SingleRuleValidate,createFormValidator,mapRuleOptions}from"../src/form/validator.js";export{default as DinoForm}from"../src/form/dino-form.js";export{convertFormDataToJson,getErrorMessage,validateCsvModel}from"../src/form/helpers.js";export{formField,formPreSubmit,formValidate,getFormFields,getFormPreSubmit,getFormValidators,isFormRegistered,registerForm}from"../src/form/decorator.js";export{DecoratorField,DecoratorForm,createDecoratorForm}from"../src/form/decorator.form.js";export{formGridLayoutClasses}from"../src/form/create.form-grid-layout.units.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{useRef as o,useCallback as r}from"react";import{styled as l,ToggleButtonGroup as a,colors as i,Tooltip as t,ToggleButton as n}from"@mui/material";import u from"@mui/icons-material/ViewList";import c from"@mui/icons-material/GridView";import{DataSurfaceViewMode as m}from"./types.js";var s={sm:"small",md:"medium"},d=[{value:m.list,icon:e(u,{fontSize:"small"}),label:"List View"},{value:m.grid,icon:e(c,{fontSize:"small"}),label:"Grid View"}],v=function(l){var a=l.value,i=l.onChange,u=l.size,c=void 0===u?"md":u,m=l.className,v=l.onlyIcon,b=void 0!==v&&v,f=l.reverse,g=void 0!==f&&f,h=s[c]||"small",w=o(null),x=r(function(e){w.current&&clearTimeout(w.current),w.current=setTimeout(function(){null!==e&&e!==a&&(null==i||i(e))},250)},[a,i]),C=g?[].concat(d).reverse():d;return e(p,{className:m,size:h,value:a,exclusive:!0,onChange:function(e,o){return x(o)},"aria-label":"view mode",children:C.map(function(o){return e(t,{title:o.label,arrow:!0,placement:"top",children:e(n,{value:o.value,"aria-label":o.label,size:h,sx:{p:b?"5px":void 0,minWidth:b?"small"===h?36:44:void 0},children:b?o.icon:o.label})},o.value)})})},p=l(a)({flex:"0 0 auto",".MuiToggleButtonGroup-grouped":{"&.Mui-selected":{color:i.common.white,backgroundColor:"var(--color-orange, ".concat(i.blue[600],")"),borderColor:"var(--color-orange, ".concat(i.blue[600],")"),"&.MuiToggleButtonGroup-lastButton":{borderColor:"var(--color-orange, ".concat(i.blue[600],")")},"&:hover":{backgroundColor:"var(--color-orange, ".concat(i.blue[600],")")}}}});export{v as ButtonSwitch,v as default};
1
+ import{defineProperty as e}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as o}from"react/jsx-runtime";import{useRef as r,useCallback as l}from"react";import{styled as i,ToggleButtonGroup as a,colors as t,Tooltip as n,ToggleButton as u}from"@mui/material";import c from"@mui/icons-material/ViewList";import m from"@mui/icons-material/GridView";import{DataSurfaceViewMode as s}from"./types.js";var d={sm:"small",md:"medium"},v=e(e({},s.list,o(c,{fontSize:"small"})),s.grid,o(m,{fontSize:"small"})),p=[{value:s.list,icon:v[s.list],label:"List View"},{value:s.grid,icon:v[s.grid],label:"Grid View"}],f=function(e){var i=e.value,a=e.onChange,t=e.size,c=void 0===t?"md":t,m=e.className,s=e.onlyIcon,v=void 0!==s&&s,f=e.reverse,b=void 0!==f&&f,h=d[c]||"small",w=r(null),x=l(function(e){w.current&&clearTimeout(w.current),w.current=setTimeout(function(){null!==e&&e!==i&&(null==a||a(e))},250)},[i,a]),C=b?[].concat(p).reverse():p;return o(g,{className:m,size:h,value:i,exclusive:!0,onChange:function(e,o){return x(o)},"aria-label":"view mode",children:C.map(function(e){return o(n,{title:e.label,arrow:!0,placement:"top",children:o(u,{value:e.value,"aria-label":e.label,size:h,sx:{p:v?"5px":void 0,minWidth:v?"small"===h?36:44:void 0},children:v?e.icon:e.label})},e.value)})})},g=i(a)({flex:"0 0 auto",".MuiToggleButtonGroup-grouped":{"&.Mui-selected":{color:t.common.white,backgroundColor:"var(--color-orange, ".concat(t.blue[600],")"),borderColor:"var(--color-orange, ".concat(t.blue[600],")"),"&.MuiToggleButtonGroup-lastButton":{borderColor:"var(--color-orange, ".concat(t.blue[600],")")},"&:hover":{backgroundColor:"var(--color-orange, ".concat(t.blue[600],")")}}}});export{f as ButtonSwitch,f as default,v as mapIcons};
2
2
  //# sourceMappingURL=button-switch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"button-switch.js","sources":["../../../src/data-surface/button-switch.tsx"],"sourcesContent":["import { FC, useCallback, useRef } from 'react'\r\nimport { colors, styled, ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material'\r\nimport ViewListIcon from '@mui/icons-material/ViewList'\r\nimport GridViewIcon from '@mui/icons-material/GridView'\r\nimport { DataSurfaceViewMode } from './types'\r\n\r\nexport interface IButtonSwitchProps {\r\n value?: DataSurfaceViewMode\r\n onChange?: (value: DataSurfaceViewMode) => void\r\n size?: 'sm' | 'md'\r\n className?: string\r\n onlyIcon?: boolean\r\n reverse?: boolean\r\n}\r\n\r\nconst sizeMap = { sm: 'small', md: 'medium' } as const\r\n\r\nconst viewModes = [\r\n { value: DataSurfaceViewMode.list, icon: <ViewListIcon fontSize='small' />, label: 'List View' },\r\n { value: DataSurfaceViewMode.grid, icon: <GridViewIcon fontSize='small' />, label: 'Grid View' }\r\n]\r\n\r\nexport const ButtonSwitch: FC<IButtonSwitchProps> = (props) => {\r\n const { value, onChange, size = 'md', className, onlyIcon = false, reverse = false } = props\r\n const muiSize = sizeMap[size] || 'small'\r\n\r\n const changeTimeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n const handleChange = useCallback(\r\n (newValue: DataSurfaceViewMode | null) => {\r\n if (changeTimeoutRef.current) {\r\n clearTimeout(changeTimeoutRef.current)\r\n }\r\n changeTimeoutRef.current = setTimeout(() => {\r\n if (newValue !== null && newValue !== value) {\r\n onChange?.(newValue)\r\n }\r\n }, 250)\r\n },\r\n [value, onChange]\r\n )\r\n\r\n const displayModes = reverse ? [...viewModes].reverse() : viewModes\r\n\r\n return (\r\n <StyledToggleButtonGroup className={className} size={muiSize} value={value} exclusive onChange={(_, v) => handleChange(v)} aria-label='view mode'>\r\n {displayModes.map((mode) => (\r\n <Tooltip key={mode.value} title={mode.label} arrow placement='top'>\r\n <ToggleButton\r\n value={mode.value}\r\n aria-label={mode.label}\r\n size={muiSize}\r\n sx={{\r\n p: onlyIcon ? '5px' : undefined,\r\n minWidth: onlyIcon ? (muiSize === 'small' ? 36 : 44) : undefined\r\n }}\r\n >\r\n {onlyIcon ? mode.icon : mode.label}\r\n </ToggleButton>\r\n </Tooltip>\r\n ))}\r\n </StyledToggleButtonGroup>\r\n )\r\n}\r\n\r\nexport default ButtonSwitch\r\n\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)({\r\n flex: '0 0 auto',\r\n '.MuiToggleButtonGroup-grouped': {\r\n '&.Mui-selected': {\r\n color: colors.common.white,\r\n backgroundColor: `var(--color-orange, ${colors.blue[600]})`,\r\n borderColor: `var(--color-orange, ${colors.blue[600]})`,\r\n '&.MuiToggleButtonGroup-lastButton': {\r\n borderColor: `var(--color-orange, ${colors.blue[600]})`\r\n },\r\n '&:hover': {\r\n backgroundColor: `var(--color-orange, ${colors.blue[600]})`\r\n }\r\n }\r\n }\r\n})\r\n"],"names":["sizeMap","sm","md","viewModes","value","DataSurfaceViewMode","list","icon","_jsx","ViewListIcon","fontSize","label","grid","GridViewIcon","ButtonSwitch","props","onChange","_props$size","size","className","_props$onlyIcon","onlyIcon","_props$reverse","reverse","muiSize","changeTimeoutRef","useRef","handleChange","useCallback","newValue","current","clearTimeout","setTimeout","displayModes","concat","StyledToggleButtonGroup","exclusive","_","v","children","map","mode","Tooltip","title","arrow","placement","ToggleButton","sx","p","undefined","minWidth","styled","ToggleButtonGroup","flex","color","colors","common","white","backgroundColor","blue","borderColor"],"mappings":"0UAeA,IAAMA,EAAU,CAAEC,GAAI,QAASC,GAAI,UAE7BC,EAAY,CAChB,CAAEC,MAAOC,EAAoBC,KAAMC,KAAMC,EAACC,EAAa,CAAAC,SAAS,UAAYC,MAAO,aACnF,CAAEP,MAAOC,EAAoBO,KAAML,KAAMC,EAACK,EAAa,CAAAH,SAAS,UAAYC,MAAO,cAGxEG,EAAuC,SAACC,GACnD,IAAQX,EAA+EW,EAA/EX,MAAOY,EAAwED,EAAxEC,SAAQC,EAAgEF,EAA9DG,KAAAA,OAAO,IAAHD,EAAG,KAAIA,EAAEE,EAAiDJ,EAAjDI,UAASC,EAAwCL,EAAtCM,SAAAA,OAAW,IAAHD,GAAQA,EAAAE,EAAsBP,EAApBQ,QAAAA,OAAU,IAAHD,GAAQA,EAC5EE,EAAUxB,EAAQkB,IAAS,QAE3BO,EAAmBC,EAA8B,MACjDC,EAAeC,EACnB,SAACC,GACKJ,EAAiBK,SACnBC,aAAaN,EAAiBK,SAEhCL,EAAiBK,QAAUE,WAAW,WACnB,OAAbH,GAAqBA,IAAazB,IACpCY,SAAAA,EAAWa,GAEd,EAAE,IACL,EACA,CAACzB,EAAOY,IAGJiB,EAAeV,EAAU,GAAAW,OAAI/B,GAAWoB,UAAYpB,EAE1D,OACEK,EAAC2B,EAAwB,CAAAhB,UAAWA,EAAWD,KAAMM,EAASpB,MAAOA,EAAOgC,WAAS,EAACpB,SAAU,SAACqB,EAAGC,GAAC,OAAKX,EAAaW,EAAE,EAAa,aAAA,YACnIC,SAAAN,EAAaO,IAAI,SAACC,GAAI,OACrBjC,EAACkC,EAAyB,CAAAC,MAAOF,EAAK9B,MAAOiC,OAAK,EAACC,UAAU,MAC3DN,SAAA/B,EAACsC,EACC,CAAA1C,MAAOqC,EAAKrC,MAAK,aACLqC,EAAK9B,MACjBO,KAAMM,EACNuB,GAAI,CACFC,EAAG3B,EAAW,WAAQ4B,EACtBC,SAAU7B,EAAwB,UAAZG,EAAsB,GAAK,QAAMyB,GAGxDV,SAAAlB,EAAWoB,EAAKlC,KAAOkC,EAAK9B,SAVnB8B,EAAKrC,MAapB,IAGP,EAIM+B,EAA0BgB,EAAOC,EAAPD,CAA0B,CACxDE,KAAM,WACN,gCAAiC,CAC/B,iBAAkB,CAChBC,MAAOC,EAAOC,OAAOC,MACrBC,gBAAe,uBAAAxB,OAAyBqB,EAAOI,KAAK,KAAO,KAC3DC,YAAW,uBAAA1B,OAAyBqB,EAAOI,KAAK,KAAO,KACvD,oCAAqC,CACnCC,YAAW,uBAAA1B,OAAyBqB,EAAOI,KAAK,KAAI,MAEtD,UAAW,CACTD,gBAAe,uBAAAxB,OAAyBqB,EAAOI,KAAK,KAAI"}
1
+ {"version":3,"file":"button-switch.js","sources":["../../../src/data-surface/button-switch.tsx"],"sourcesContent":["import { FC, useCallback, useRef } from 'react'\r\nimport { colors, styled, ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material'\r\nimport ViewListIcon from '@mui/icons-material/ViewList'\r\nimport GridViewIcon from '@mui/icons-material/GridView'\r\nimport { DataSurfaceViewMode } from './types'\r\n\r\nexport interface IButtonSwitchProps {\r\n value?: DataSurfaceViewMode\r\n onChange?: (value: DataSurfaceViewMode) => void\r\n size?: 'sm' | 'md'\r\n className?: string\r\n onlyIcon?: boolean\r\n reverse?: boolean\r\n}\r\n\r\nconst sizeMap = { sm: 'small', md: 'medium' } as const\r\n\r\nexport const mapIcons: Record<DataSurfaceViewMode, JSX.Element> = {\r\n [DataSurfaceViewMode.list]: <ViewListIcon fontSize='small' />,\r\n [DataSurfaceViewMode.grid]: <GridViewIcon fontSize='small' />\r\n}\r\n\r\nconst viewModes = [\r\n { value: DataSurfaceViewMode.list, icon: mapIcons[DataSurfaceViewMode.list], label: 'List View' },\r\n { value: DataSurfaceViewMode.grid, icon: mapIcons[DataSurfaceViewMode.grid], label: 'Grid View' }\r\n]\r\n\r\nexport const ButtonSwitch: FC<IButtonSwitchProps> = (props) => {\r\n const { value, onChange, size = 'md', className, onlyIcon = false, reverse = false } = props\r\n const muiSize = sizeMap[size] || 'small'\r\n\r\n const changeTimeoutRef = useRef<NodeJS.Timeout | null>(null)\r\n const handleChange = useCallback(\r\n (newValue: DataSurfaceViewMode | null) => {\r\n if (changeTimeoutRef.current) {\r\n clearTimeout(changeTimeoutRef.current)\r\n }\r\n changeTimeoutRef.current = setTimeout(() => {\r\n if (newValue !== null && newValue !== value) {\r\n onChange?.(newValue)\r\n }\r\n }, 250)\r\n },\r\n [value, onChange]\r\n )\r\n\r\n const displayModes = reverse ? [...viewModes].reverse() : viewModes\r\n\r\n return (\r\n <StyledToggleButtonGroup className={className} size={muiSize} value={value} exclusive onChange={(_, v) => handleChange(v)} aria-label='view mode'>\r\n {displayModes.map((mode) => (\r\n <Tooltip key={mode.value} title={mode.label} arrow placement='top'>\r\n <ToggleButton\r\n value={mode.value}\r\n aria-label={mode.label}\r\n size={muiSize}\r\n sx={{\r\n p: onlyIcon ? '5px' : undefined,\r\n minWidth: onlyIcon ? (muiSize === 'small' ? 36 : 44) : undefined\r\n }}\r\n >\r\n {onlyIcon ? mode.icon : mode.label}\r\n </ToggleButton>\r\n </Tooltip>\r\n ))}\r\n </StyledToggleButtonGroup>\r\n )\r\n}\r\n\r\nexport default ButtonSwitch\r\n\r\nconst StyledToggleButtonGroup = styled(ToggleButtonGroup)({\r\n flex: '0 0 auto',\r\n '.MuiToggleButtonGroup-grouped': {\r\n '&.Mui-selected': {\r\n color: colors.common.white,\r\n backgroundColor: `var(--color-orange, ${colors.blue[600]})`,\r\n borderColor: `var(--color-orange, ${colors.blue[600]})`,\r\n '&.MuiToggleButtonGroup-lastButton': {\r\n borderColor: `var(--color-orange, ${colors.blue[600]})`\r\n },\r\n '&:hover': {\r\n backgroundColor: `var(--color-orange, ${colors.blue[600]})`\r\n }\r\n }\r\n }\r\n})\r\n"],"names":["sizeMap","sm","md","mapIcons","_defineProperty","DataSurfaceViewMode","list","_jsx","ViewListIcon","fontSize","grid","GridViewIcon","viewModes","value","icon","label","ButtonSwitch","props","onChange","_props$size","size","className","_props$onlyIcon","onlyIcon","_props$reverse","reverse","muiSize","changeTimeoutRef","useRef","handleChange","useCallback","newValue","current","clearTimeout","setTimeout","displayModes","concat","StyledToggleButtonGroup","exclusive","_","v","children","map","mode","Tooltip","title","arrow","placement","ToggleButton","sx","p","undefined","minWidth","styled","ToggleButtonGroup","flex","color","colors","common","white","backgroundColor","blue","borderColor"],"mappings":"uZAeA,IAAMA,EAAU,CAAEC,GAAI,QAASC,GAAI,UAEtBC,EAAQC,EAAAA,EAAA,CAAA,EAClBC,EAAoBC,KAAOC,EAACC,EAAa,CAAAC,SAAS,WAClDJ,EAAoBK,KAAOH,EAACI,EAAa,CAAAF,SAAS,WAG/CG,EAAY,CAChB,CAAEC,MAAOR,EAAoBC,KAAMQ,KAAMX,EAASE,EAAoBC,MAAOS,MAAO,aACpF,CAAEF,MAAOR,EAAoBK,KAAMI,KAAMX,EAASE,EAAoBK,MAAOK,MAAO,cAGzEC,EAAuC,SAACC,GACnD,IAAQJ,EAA+EI,EAA/EJ,MAAOK,EAAwED,EAAxEC,SAAQC,EAAgEF,EAA9DG,KAAAA,OAAO,IAAHD,EAAG,KAAIA,EAAEE,EAAiDJ,EAAjDI,UAASC,EAAwCL,EAAtCM,SAAAA,OAAW,IAAHD,GAAQA,EAAAE,EAAsBP,EAApBQ,QAAAA,OAAU,IAAHD,GAAQA,EAC5EE,EAAU1B,EAAQoB,IAAS,QAE3BO,EAAmBC,EAA8B,MACjDC,EAAeC,EACnB,SAACC,GACKJ,EAAiBK,SACnBC,aAAaN,EAAiBK,SAEhCL,EAAiBK,QAAUE,WAAW,WACnB,OAAbH,GAAqBA,IAAalB,IACpCK,SAAAA,EAAWa,GAEd,EAAE,IACL,EACA,CAAClB,EAAOK,IAGJiB,EAAeV,EAAU,GAAAW,OAAIxB,GAAWa,UAAYb,EAE1D,OACEL,EAAC8B,EAAwB,CAAAhB,UAAWA,EAAWD,KAAMM,EAASb,MAAOA,EAAOyB,WAAS,EAACpB,SAAU,SAACqB,EAAGC,GAAC,OAAKX,EAAaW,EAAE,EAAa,aAAA,YACnIC,SAAAN,EAAaO,IAAI,SAACC,GAAI,OACrBpC,EAACqC,EAAyB,CAAAC,MAAOF,EAAK5B,MAAO+B,OAAK,EAACC,UAAU,MAC3DN,SAAAlC,EAACyC,EACC,CAAAnC,MAAO8B,EAAK9B,MAAK,aACL8B,EAAK5B,MACjBK,KAAMM,EACNuB,GAAI,CACFC,EAAG3B,EAAW,WAAQ4B,EACtBC,SAAU7B,EAAwB,UAAZG,EAAsB,GAAK,QAAMyB,GAGxDV,SAAAlB,EAAWoB,EAAK7B,KAAO6B,EAAK5B,SAVnB4B,EAAK9B,MAapB,IAGP,EAIMwB,EAA0BgB,EAAOC,EAAPD,CAA0B,CACxDE,KAAM,WACN,gCAAiC,CAC/B,iBAAkB,CAChBC,MAAOC,EAAOC,OAAOC,MACrBC,gBAAe,uBAAAxB,OAAyBqB,EAAOI,KAAK,KAAO,KAC3DC,YAAW,uBAAA1B,OAAyBqB,EAAOI,KAAK,KAAO,KACvD,oCAAqC,CACnCC,YAAW,uBAAA1B,OAAyBqB,EAAOI,KAAK,KAAI,MAEtD,UAAW,CACTD,gBAAe,uBAAAxB,OAAyBqB,EAAOI,KAAK,KAAI"}
@@ -1,2 +1,2 @@
1
- import{slicedToArray as n,asyncToGenerator as e,regenerator as i,objectSpread2 as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as a}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 s}from"react";import{LoadingModeRule as c}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 C}from"./view-switch-transition.js";import{PanelLoading as S,PanelNoData as x,PanelLoadMore as P,PanelInfiniteScrollFooter as w,PanelPaginationFooter as z}from"./ui.units.js";function b(r){if(!r.GridComponent){var b=r.gridConfig||{getterId:function(n,e){return e}};r.gridConfig=b,r.GridComponent=h(b)}if(!r.ListComponent){var N=r.listConfig||{getterId:function(n,e){return e}};r.listConfig=N,r.ListComponent=p(N)}var j=r.defaultViewMode,k=void 0===j?"grid":j,M=r.defaultLoadMode,T=void 0===M?"pagination":M,I=r.featureMode,B=void 0===I?"client":I,G=C({}),L=m(r.GridComponent),H=f(r.ListComponent);return function(p){var f,h,m,C,b,N=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,j=u({page:0,pageSize:N}),M=n(j,2),I=M[0],A=M[1],R=g(function(){var n,e,i,o,t,a=null!==(n=p.pagination)&&void 0!==n?n:I;return{page:null!==(e=a.page)&&void 0!==e?e:0,pageSize:null!==(i=a.pageSize)&&void 0!==i?i:N,hasNext:null!==(o=a.hasNext)&&void 0!==o&&o,hasPrev:null!==(t=a.hasPrev)&&void 0!==t&&t,total:a.total}},[p.pagination,I]),_=null!==(C=p.viewMode)&&void 0!==C?C:k,D=null!==(b=p.loadMode)&&void 0!==b?b:T,J=g(function(){var n,e,i,o;return"grid"===_?null!==(i=null===(o=r.gridConfig)||void 0===o?void 0:o.renderStrategy)&&void 0!==i?i:"normal":null!==(n=null===(e=r.listConfig)||void 0===e?void 0:e.renderStrategy)&&void 0!==n?n:"normal"},[_]),V=d(e(i().m(function n(){var e,t,a,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 o(o({},n),{},{page:l})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,l,null!==(a=R.pageSize)&&void 0!==a?a:N);case 2:return n.a(2)}},n)})),[R.page,R.pageSize,p.pagination,p.onPageChange]),q=d(e(i().m(function n(){var e,t,a,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 o(o({},n),{},{page:l})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,l,null!==(a=R.pageSize)&&void 0!==a?a:N);case 2:return n.a(2)}},n)})),[R.hasNext,R.page,R.pageSize,p.pagination,p.onPageChange]),E=d(function(){var n=e(i().m(function n(e){var t,a;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 o(o({},n),{},{page:e})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,e,null!==(a=R.pageSize)&&void 0!==a?a:N);case 2:return n.a(2)}},n)}));return function(e){return n.apply(this,arguments)}}(),[R.pageSize,p.pagination,p.onPageChange]),F=p.value||[],K="client"===B?p.value:void 0;v(function(){"client"!==B||p.pagination||A(function(n){return o(o({},n),{},{page:0})})},[p.value]);var O=g(function(){var n,e,i=null!==(n=R.page)&&void 0!==n?n:0,o=null!==(e=R.pageSize)&&void 0!==e?e:N;if("client"===B){var t=F.length;return{page:i,pageSize:o,hasNext:o*(i+1)<t,hasPrev:i>0,total:t}}return R},[R,F.length,B,N]),Q=g(function(){if("client"===B){var n,e,i=null!==(n=O.page)&&void 0!==n?n:0,o=null!==(e=O.pageSize)&&void 0!==e?e:N;if("infiniteScroll"===D)return F.slice(0,(i+1)*o);var t=i*o;return F.slice(t,t+o)}return F},[F,O,B,D,N]),U=0===F.length,W=Boolean(p.loading&&U),X=!p.loading&&U,Y=Boolean(p.loading)&&!U,Z=d(function(){var n=e(i().m(function n(e,o){var t;return i().w(function(n){for(;;)switch(n.n){case 0:return p.pagination||A({page:e,pageSize:o}),n.n=1,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,e,o);case 1:return n.a(2)}},n)}));return function(e,i){return n.apply(this,arguments)}}(),[p.pagination,p.onPageChange]),$=g(function(){return{value:Q,loadMode:D,loading:p.loading,pagination:O,onPageChange:Z,scrollResetToken:K}},[Q,D,p.loading,O,Z,K]),nn=s($);nn.current=$;var en=g(function(){var n,e,i,o,t,a;return{value:Q,loadMode:D,loading:p.loading,pagination:O,onPageChange:Z,columns:null===(n=r.listConfig)||void 0===n?void 0:n.columns,density:null===(e=r.listConfig)||void 0===e?void 0:e.density,spacing:null===(i=r.listConfig)||void 0===i?void 0:i.spacing,renderStrategy:J,overscan:null===(o=r.listConfig)||void 0===o?void 0:o.overscan,selectable:null!==(t=p.selectable)&&void 0!==t?t:null===(a=r.listConfig)||void 0===a?void 0:a.selectable,selectedIds:p.selectedIds,onSelectionChange:p.onSelectionChange,scrollResetToken:K}},[Q,D,p.loading,O,J,Z,p.selectable,p.selectedIds,p.onSelectionChange,K]),on=s(en);on.current=en;var tn=g(function(){return function(){return a(H,o({},on.current))}},[H]),an=g(function(){return function(){return a(L,o({},nn.current))}},[L]);return t(y,{sx:p.sx,children:[t(l,{sx:{flex:1,minHeight:0,position:"relative"},children:[W&&a(S,{}),X&&a(x,{}),!W&&!X&&a(G,{value:_,viewA:{value:"list",Content:tn},viewB:{value:"grid",Content:an}}),Y&&a(P,{})]}),function(){var n,e,i;if(D===c.infiniteScroll){var o,t=null===(o=p.slots)||void 0===o?void 0:o.footer;return a(w,{loading:p.loading,hasNext:O.hasNext,currentCount:Q.length,total:O.total,slots:{statusText:null==t?void 0:t.status,rangeText:null==t?void 0:t.range}})}return a(z,{page:null!==(n=O.page)&&void 0!==n?n:0,pageSize:null!==(e=O.pageSize)&&void 0!==e?e:N,total:O.total,hasNext:O.hasNext,hasPrev:(null!==(i=O.page)&&void 0!==i?i:0)>0,loading:p.loading,onPrevPage:V,onNextPage:q,onPageJump:E})}()]})}}var y=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{b as createDataSurface,b as default};
1
+ import{slicedToArray as n,asyncToGenerator as e,regenerator as i,objectSpread2 as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as o}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 s,useRef as v}from"react";import{LoadingModeRule as c}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 C}from"./view-switch-transition.js";import{PanelLoading as P,PanelNoData as S,PanelLoadMore as w,PanelInfiniteScrollFooter as x,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 y=r.listConfig||{getterId:function(n,e){return e}};r.listConfig=y,r.ListComponent=p(y)}var M=r.defaultViewMode,j=void 0===M?"grid":M,k=r.defaultLoadMode,L=void 0===k?"pagination":k,T=r.featureMode,I=void 0===T?"client":T,V=C({}),B=m(r.GridComponent),G=f(r.ListComponent);return function(p){var f,h,m,C,N,y=p.slots||{},M=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,k=u({page:0,pageSize:M}),T=n(k,2),D=T[0],H=T[1],A=g(function(){var n,e,i,a,t,o=null!==(n=p.pagination)&&void 0!==n?n:D;return{page:null!==(e=o.page)&&void 0!==e?e:0,pageSize:null!==(i=o.pageSize)&&void 0!==i?i:M,hasNext:null!==(a=o.hasNext)&&void 0!==a&&a,hasPrev:null!==(t=o.hasPrev)&&void 0!==t&&t,total:o.total}},[p.pagination,D]),R=null!==(C=p.viewMode)&&void 0!==C?C:j,_=null!==(N=p.loadMode)&&void 0!==N?N:L,J=g(function(){var n,e,i,a;return"grid"===R?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"},[R]),q=d(e(i().m(function n(){var e,t,o,r,l;return i().w(function(n){for(;;)switch(n.n){case 0:if(!((r=null!==(e=A.page)&&void 0!==e?e:0)<=0)){n.n=1;break}return n.a(2);case 1:return l=r-1,p.pagination||H(function(n){return a(a({},n),{},{page:l})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,l,null!==(o=A.pageSize)&&void 0!==o?o:M);case 2:return n.a(2)}},n)})),[A.page,A.pageSize,p.pagination,p.onPageChange]),E=d(e(i().m(function n(){var e,t,o,r,l;return i().w(function(n){for(;;)switch(n.n){case 0:if(A.hasNext){n.n=1;break}return n.a(2);case 1:return r=null!==(e=A.page)&&void 0!==e?e:0,l=r+1,p.pagination||H(function(n){return a(a({},n),{},{page:l})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,l,null!==(o=A.pageSize)&&void 0!==o?o:M);case 2:return n.a(2)}},n)})),[A.hasNext,A.page,A.pageSize,p.pagination,p.onPageChange]),F=d(function(){var n=e(i().m(function n(e){var t,o;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||H(function(n){return a(a({},n),{},{page:e})}),n.n=2,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,e,null!==(o=A.pageSize)&&void 0!==o?o:M);case 2:return n.a(2)}},n)}));return function(e){return n.apply(this,arguments)}}(),[A.pageSize,p.pagination,p.onPageChange]),K=p.value||[],O="client"===I?p.value:void 0;s(function(){"client"!==I||p.pagination||H(function(n){return a(a({},n),{},{page:0})})},[p.value]);var Q=g(function(){var n,e,i=null!==(n=A.page)&&void 0!==n?n:0,a=null!==(e=A.pageSize)&&void 0!==e?e:M;if("client"===I){var t=K.length;return{page:i,pageSize:a,hasNext:a*(i+1)<t,hasPrev:i>0,total:t}}return A},[A,K.length,I,M]),U=g(function(){if("client"===I){var n,e,i=null!==(n=Q.page)&&void 0!==n?n:0,a=null!==(e=Q.pageSize)&&void 0!==e?e:M;if("infiniteScroll"===_)return K.slice(0,(i+1)*a);var t=i*a;return K.slice(t,t+a)}return K},[K,Q,I,_,M]),W=0===K.length,X=Boolean(p.loading&&W),Y=!p.loading&&W,Z=Boolean(p.loading)&&!W,$=d(function(){var n=e(i().m(function n(e,a){var t;return i().w(function(n){for(;;)switch(n.n){case 0:return p.pagination||H({page:e,pageSize:a}),n.n=1,null===(t=p.onPageChange)||void 0===t?void 0:t.call(p,e,a);case 1:return n.a(2)}},n)}));return function(e,i){return n.apply(this,arguments)}}(),[p.pagination,p.onPageChange]),nn=g(function(){return a({value:U,loadMode:_,loading:p.loading,pagination:Q,onPageChange:$,scrollResetToken:O},y.gridViewProps)},[U,_,p.loading,Q,$,O,y.gridViewProps]),en=v(nn);en.current=nn;var an=g(function(){var n,e;return a({value:U,loadMode:_,loading:p.loading,pagination:Q,onPageChange:$,renderStrategy:J,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:O},y.listViewProps)},[U,_,p.loading,Q,J,$,p.selectable,p.selectedIds,p.onSelectionChange,O,y.listViewProps]),tn=v(an);tn.current=an;var on=g(function(){return function(){return o(G,a({},tn.current))}},[G]),rn=g(function(){return function(){return o(B,a({},en.current))}},[B]),ln=g(function(){return y.PanelLoading||P},[y.PanelLoading,R]),un=g(function(){return y.PanelNoData||S},[y.PanelNoData,R]);return t(b,{sx:p.sx,children:[t(l,{sx:{flex:1,minHeight:0,position:"relative"},children:[X&&o(ln,{viewMode:R}),Y&&o(un,{viewMode:R}),!X&&!Y&&o(V,{value:R,viewA:{value:"list",Content:on},viewB:{value:"grid",Content:rn}}),Z&&o(w,{})]}),function(){var n,e,i;if(_===c.infiniteScroll){var a,t=null===(a=p.slots)||void 0===a?void 0:a.footer;return o(x,{loading:p.loading,hasNext:Q.hasNext,currentCount:U.length,total:Q.total,slots:{statusText:null==t?void 0:t.status,rangeText:null==t?void 0:t.range}})}return o(z,{page:null!==(n=Q.page)&&void 0!==n?n:0,pageSize:null!==(e=Q.pageSize)&&void 0!==e?e:M,total:Q.total,hasNext:Q.hasNext,hasPrev:(null!==(i=Q.page)&&void 0!==i?i:0)>0,loading:p.loading,onPrevPage:q,onNextPage:E,onPageJump:F})}()]})}}var b=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 {\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\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}\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 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 }),\r\n [paginatedValue, loadMode, props.loading, derivedPagination, handleGridPageChange, scrollResetToken]\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 columns: config.listConfig?.columns,\r\n density: config.listConfig?.density,\r\n spacing: config.listConfig?.spacing,\r\n renderStrategy: renderStrategy,\r\n overscan: config.listConfig?.overscan,\r\n selectable: props.selectable ?? config.listConfig?.selectable,\r\n selectedIds: props.selectedIds,\r\n onSelectionChange: props.onSelectionChange,\r\n scrollResetToken\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 ]\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 }> = () => {\r\n return <ListLoadingComponent {...listPayloadRef.current} />\r\n }\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => {\r\n return <GridLoadingComponent {...gridPayloadRef.current} />\r\n }\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\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 return (\r\n <DataSurfaceStyled sx={props.sx}>\r\n <Box sx={{ flex: 1, minHeight: 0, position: 'relative' }}>\r\n {isInitialLoading && <PanelLoading />}\r\n {isNoData && <PanelNoData />}\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 && <PanelLoadMore />}\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","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","gridPayloadRef","useRef","current","listPayload","_config$listConfig2","_config$listConfig3","_config$listConfig4","_config$listConfig5","_props$selectable","_config$listConfig6","columns","density","spacing","overscan","selectable","selectedIds","onSelectionChange","listPayloadRef","ListViewContent","_jsx","GridViewContent","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","PanelLoading","PanelNoData","viewA","Content","viewB","PanelLoadMore","_derivedPagination$pa3","_derivedPagination$pa4","_derivedPagination$pa5","LoadingModeRule","infiniteScroll","_props$slots","footerSlots","slots","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 PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\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}\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 }> = () => {\r\n return <ListLoadingComponent {...listPayloadRef.current} />\r\n }\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => {\r\n return <GridLoadingComponent {...gridPayloadRef.current} />\r\n }\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\r\n\r\n const PanelLoadingComponent = useMemo(() => {\r\n return slots.PanelLoading || PanelLoading\r\n }, [slots.PanelLoading, viewMode])\r\n\r\n const PanelNoDataComponent = useMemo(() => {\r\n return slots.PanelNoData || PanelNoData\r\n }, [slots.PanelNoData, viewMode])\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 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 && <PanelLoadMore />}\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","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","viewA","Content","viewB","PanelLoadMore","_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}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as r,jsx as n}from"react/jsx-runtime";import{colors as t,styled as o,Box as i,alpha as a,Typography as l,Pagination as c,CircularProgress as d,Stack as u}from"@mui/material";var s={padding:"8px",height:"100%",minHeight:180,width:"100%","& > .inner":{width:"100%",height:"100%",padding:"24px 16px",border:"1px dashed ".concat(t.grey[400]),borderRadius:6,display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center"}},g=function(t){return n(p,e(e({},t),{},{children:r("div",{className:"inner",children:[n(d,{size:24}),n(l,{variant:"body2",color:"primary",children:"Loading..."})]})}))},p=o(i)(e(e({},s),{},{"& > div":{gap:8,borderColor:t.blue[400],backgroundColor:t.blue[50]}}));o(i)(e(e({},s),{},{"& > div":{borderColor:t.red[400],backgroundColor:t.red[50],color:t.red[900],flexDirection:"column"}}));var h=function(){return n(m,{children:r("div",{className:"inner",children:[n(l,{variant:"h6",gutterBottom:!0,children:"No data available"}),n(l,{variant:"body2",children:"Try changing the filter or search keyword"})]})})},m=o(i)(e(e({},s),{},{"& > div":{borderColor:t.grey[400],backgroundColor:t.grey[50],color:t.grey[700],flexDirection:"column"}}));o(i)(e(e({},s),{},{"& > div":{borderColor:t.blue[400],backgroundColor:t.blue[50],color:t.blue[900],flexDirection:"column"}})),o(i)(e(e({},s),{},{"& > div":{borderColor:t.red[700],backgroundColor:t.red[50],color:t.red[900],flexDirection:"column"}}));var b=function(){return n(x,{children:r("div",{children:[n(d,{size:24,thickness:4}),n(l,{variant:"body2",color:"text.primary",children:"Loading more..."})]})})},x=o(i)(function(e){return{position:"absolute",inset:0,bgcolor:"dark"===e.theme.palette.mode?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:10,backdropFilter:"blur(1px)",transition:"opacity 0.2s","& > div":{display:"flex",alignItems:"center",gap:10}}}),v=function(e){var t,o=e.slots,i=e.loading,a=e.hasNext,c=e.currentCount,s=e.total,g=function(e){return"string"!=typeof e?e:n(l,{variant:"caption",color:"text.secondary",children:e})},p=function(e,t){var o="Loading more...",i="Scroll for more",a="No more items";return e?{currentNode:r(u,{flexDirection:"row",alignItems:"center",gap:1,children:[n(d,{color:"primary",size:12,thickness:3}),n(l,{variant:"caption",color:"primary.main",children:o})]}),rawText:o}:t?{currentNode:i,rawText:i}:{currentNode:a,rawText:a}}(i,a),h=p.currentNode;"function"==typeof(null==o?void 0:o.statusText)?h=o.statusText(g(p.currentNode),p.rawText):null!=o&&o.statusText&&(h=o.statusText);var m=c>0?null!=s?"1–".concat(c," of ").concat(s):"1–".concat(c):"—",b="function"==typeof(null==o?void 0:o.rangeText)?o.rangeText(m,m):null!==(t=null==o?void 0:o.rangeText)&&void 0!==t?t:m;return n(f,{children:r("div",{children:[g(h),g(b)]})})},f=o(i)(function(e){var r=e.theme;return{"& > div":{display:"flex",alignItems:"center",justifyContent:"space-between",padding:r.spacing(1,1.5),backgroundColor:a(r.palette.grey[500],.08),borderTop:"1px solid ".concat(a(r.palette.common.black,.08))},".MuiTypography-root":{lineHeight:1}}}),y=function(e){var t=e.page,o=e.pageSize,i=e.total,a=e.hasNext,d=e.loading,u=e.onPrevPage,s=e.onNextPage,g=e.onPageJump,p=t*o+1,h=null!=i?Math.min(p+o-1,i):p+o-1,m=null!=i?Math.ceil(i/o):void 0;return r(C,{children:[n(l,{variant:"caption",color:"text.secondary",children:null!=i?"".concat(p,"–").concat(h," / ").concat(i):"Page ".concat(t+1)}),n(c,{count:m,page:t+1,onChange:function(e,r){var n=r-1;g?g(n):n<t?null==u||u():n>t&&(null==s||s())},disabled:d,size:"small",showFirstButton:null!=m&&m>5,showLastButton:null!=m&&m>5,siblingCount:0,boundaryCount:1,hidePrevButton:null==m&&!a,hideNextButton:null==m&&!a})]})},C=o(i)(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{v as PanelInfiniteScrollFooter,b as PanelLoadMore,g as PanelLoading,h as PanelNoData,y as PanelPaginationFooter};
1
+ import{objectSpread2 as e,objectWithoutProperties as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as n,jsx as t}from"react/jsx-runtime";import{colors as o,styled as i,Box as a,alpha as l,Typography as c,Pagination as d,CircularProgress as u,Stack as s}from"@mui/material";var g=["viewMode"],p={padding:"8px",height:"100%",minHeight:180,width:"100%","& > .inner":{width:"100%",height:"100%",padding:"24px 16px",border:"1px dashed ".concat(o.grey[400]),borderRadius:6,display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center"}},h=function(o){o.viewMode;var i=r(o,g);return t(b,e(e({},i),{},{children:n("div",{className:"inner",children:[t(u,{size:24}),t(c,{variant:"body2",color:"primary",children:"Loading..."})]})}))},b=i(a)(e(e({},p),{},{"& > div":{gap:8,borderColor:o.blue[400],backgroundColor:o.blue[50]}}));i(a)(e(e({},p),{},{"& > div":{borderColor:o.red[400],backgroundColor:o.red[50],color:o.red[900],flexDirection:"column"}}));var m=function(){return t(x,{children:n("div",{className:"inner",children:[t(c,{variant:"h6",gutterBottom:!0,children:"No data available"}),t(c,{variant:"body2",children:"Try changing the filter or search keyword"})]})})},x=i(a)(e(e({},p),{},{"& > div":{borderColor:o.grey[400],backgroundColor:o.grey[50],color:o.grey[700],flexDirection:"column"}}));i(a)(e(e({},p),{},{"& > div":{borderColor:o.blue[400],backgroundColor:o.blue[50],color:o.blue[900],flexDirection:"column"}})),i(a)(e(e({},p),{},{"& > div":{borderColor:o.red[700],backgroundColor:o.red[50],color:o.red[900],flexDirection:"column"}}));var v=function(){return t(f,{children:n("div",{children:[t(u,{size:24,thickness:4}),t(c,{variant:"body2",color:"text.primary",children:"Loading more..."})]})})},f=i(a)(function(e){return{position:"absolute",inset:0,bgcolor:"dark"===e.theme.palette.mode?"rgba(0,0,0,0.12)":"rgba(255,255,255,0.12)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:10,backdropFilter:"blur(1px)",transition:"opacity 0.2s","& > div":{display:"flex",alignItems:"center",gap:10}}}),y=function(e){var r,o=e.slots,i=e.loading,a=e.hasNext,l=e.currentCount,d=e.total,g=function(e){return"string"!=typeof e?e:t(c,{variant:"caption",color:"text.secondary",children:e})},p=function(e,r){var o="Loading more...",i="Scroll for more",a="No more items";return e?{currentNode:n(s,{flexDirection:"row",alignItems:"center",gap:1,children:[t(u,{color:"primary",size:12,thickness:3}),t(c,{variant:"caption",color:"primary.main",children:o})]}),rawText:o}:r?{currentNode:i,rawText:i}:{currentNode:a,rawText:a}}(i,a),h=p.currentNode;"function"==typeof(null==o?void 0:o.statusText)?h=o.statusText(g(p.currentNode),p.rawText):null!=o&&o.statusText&&(h=o.statusText);var b=l>0?null!=d?"1–".concat(l," of ").concat(d):"1–".concat(l):"—",m="function"==typeof(null==o?void 0:o.rangeText)?o.rangeText(b,b):null!==(r=null==o?void 0:o.rangeText)&&void 0!==r?r:b;return t(C,{children:n("div",{children:[g(h),g(m)]})})},C=i(a)(function(e){var r=e.theme;return{"& > div":{display:"flex",alignItems:"center",justifyContent:"space-between",padding:r.spacing(1,1.5),backgroundColor:l(r.palette.grey[500],.08),borderTop:"1px solid ".concat(l(r.palette.common.black,.08))},".MuiTypography-root":{lineHeight:1}}}),k=function(e){var r=e.page,o=e.pageSize,i=e.total,a=e.hasNext,l=e.loading,u=e.onPrevPage,s=e.onNextPage,g=e.onPageJump,p=r*o+1,h=null!=i?Math.min(p+o-1,i):p+o-1,b=null!=i?Math.ceil(i/o):void 0;return n(T,{children:[t(c,{variant:"caption",color:"text.secondary",children:null!=i?"".concat(p,"–").concat(h," / ").concat(i):"Page ".concat(r+1)}),t(d,{count:b,page:r+1,onChange:function(e,n){var t=n-1;g?g(t):t<r?null==u||u():t>r&&(null==s||s())},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})]})},T=i(a)(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{y as PanelInfiniteScrollFooter,v as PanelLoadMore,h as PanelLoading,m as PanelNoData,k 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 } from '@mui/material'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { BoxProps } from '@mui/material'\r\nimport { 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> = (props) => (\r\n <PanelLoadingStyled {...props}>\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\nconst PanelLoadingStyled = styled(Box)({\r\n ...stateWrapBase,\r\n '& > div': { gap: 8, borderColor: colors.blue[400], backgroundColor: colors.blue[50] }\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={24} thickness={4} />\r\n <Typography variant='body2' color='text.primary'>\r\n Loading more...\r\n </Typography>\r\n </div>\r\n </PanelLoadMoreStyled>\r\n)\r\n\r\nconst PanelLoadMoreStyled = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n inset: 0,\r\n bgcolor: theme.palette.mode === 'dark' ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.12)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 10,\r\n backdropFilter: 'blur(1px)',\r\n transition: 'opacity 0.2s',\r\n '& > div': { display: 'flex', alignItems: 'center', gap: 10 }\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 // padding: theme.spacing(0, 1),\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 '.MuiTypography-root': { lineHeight: 1 }\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","_jsx","PanelLoadingStyled","_objectSpread","children","_jsxs","className","CircularProgress","size","Typography","variant","color","styled","Box","gap","borderColor","blue","backgroundColor","red","flexDirection","PanelNoData","PanelNoDataStyled","gutterBottom","PanelLoadMore","PanelLoadMoreStyled","thickness","_ref2","position","inset","bgcolor","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","spacing","alpha","borderTop","common","black","lineHeight","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","_ref4","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 } 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: colors.blue[50]\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={24} thickness={4} />\r\n <Typography variant='body2' color='text.primary'>\r\n Loading more...\r\n </Typography>\r\n </div>\r\n </PanelLoadMoreStyled>\r\n)\r\n\r\nconst PanelLoadMoreStyled = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n inset: 0,\r\n bgcolor: theme.palette.mode === 'dark' ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.12)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 10,\r\n backdropFilter: 'blur(1px)',\r\n transition: 'opacity 0.2s',\r\n '& > div': { display: 'flex', alignItems: 'center', gap: 10 }\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 // padding: theme.spacing(0, 1),\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 '.MuiTypography-root': { lineHeight: 1 }\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","red","flexDirection","PanelNoData","PanelNoDataStyled","gutterBottom","PanelLoadMore","PanelLoadMoreStyled","thickness","_ref2","position","inset","bgcolor","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","spacing","alpha","borderTop","common","black","lineHeight","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","_ref4","background","paper"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useMemo as o}from"react";import{GridItemDefault as n}from"./ui.units.js";import{getGridItemSizes as s,resolveGridScrollingThreshold as i,resolveGridSpacing as r}from"./helpers.js";var l=function(l,e){return o(function(){var o,p,t;return{spacing:r(l.spacing,e.spacing),scrollingThreshold:i(l.scrollingThreshold,e.scrollingThreshold),sizes:s(null!==(o=l.sizes)&&void 0!==o?o:e.sizes),Component:null!==(p=null!==(t=l.Component)&&void 0!==t?t:e.Component)&&void 0!==p?p:n}},[l.spacing,l.scrollingThreshold,l.sizes,l.Component,e.spacing,e.scrollingThreshold,e.sizes,e.Component])};export{l as useMergedConfig};
1
+ import{useMemo as o}from"react";import{GridItemDefault as i}from"./ui.units.js";import{getGridItemSizes as n,resolveGridScrollingThreshold as s,resolveGridSpacing as r}from"./helpers.js";var t=function(t,e){return o(function(){var o,l,p;return{spacing:r(t.spacing,e.spacing),scrollingThreshold:s(t.scrollingThreshold,e.scrollingThreshold),sizes:n(null!==(o=t.sizes)&&void 0!==o?o:e.sizes),Component:null!==(l=null!==(p=t.Component)&&void 0!==p?p:e.Component)&&void 0!==l?l:i,normalOptions:Object.assign({autoHeight:!1},e.normalOptions,t.normalOptions),virtualizedOptions:Object.assign({overscan:4},e.virtualizedOptions,t.virtualizedOptions)}},[t,e])};export{t as useMergedConfig};
2
2
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["../../../../src/data-surface/view-grid/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo } from 'react'\r\nimport { GridItemDefault } from './ui.units'\r\nimport { getGridItemSizes, resolveGridScrollingThreshold, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n\r\n/** Merges the provided props and config into a single configuration object. */\r\nexport const useMergedConfig = <T>(props: IViewGridProps<T>, config: IViewGridConfig<T>) => {\r\n return useMemo(() => {\r\n return {\r\n spacing: resolveGridSpacing(props.spacing, config.spacing),\r\n scrollingThreshold: resolveGridScrollingThreshold(props.scrollingThreshold, config.scrollingThreshold),\r\n sizes: getGridItemSizes(props.sizes ?? config.sizes),\r\n Component: props.Component ?? config.Component ?? GridItemDefault\r\n }\r\n }, [\r\n props.spacing,\r\n props.scrollingThreshold,\r\n props.sizes,\r\n props.Component,\r\n config.spacing,\r\n config.scrollingThreshold,\r\n config.sizes,\r\n config.Component\r\n ])\r\n}\r\n"],"names":["useMergedConfig","props","config","useMemo","_props$sizes","_ref","_props$Component","spacing","resolveGridSpacing","scrollingThreshold","resolveGridScrollingThreshold","sizes","getGridItemSizes","Component","GridItemDefault"],"mappings":"2LAUO,IAAMA,EAAkB,SAAIC,EAA0BC,GAC3D,OAAOC,EAAQ,WAAK,IAAAC,EAAAC,EAAAC,EAClB,MAAO,CACLC,QAASC,EAAmBP,EAAMM,QAASL,EAAOK,SAClDE,mBAAoBC,EAA8BT,EAAMQ,mBAAoBP,EAAOO,oBACnFE,MAAOC,EAA4BR,QAAZA,EAACH,EAAMU,iBAAKP,EAAAA,EAAIF,EAAOS,OAC9CE,kBAASR,EAAiBC,QAAjBA,EAAEL,EAAMY,qBAASP,EAAAA,EAAIJ,EAAOW,iBAAS,IAAAR,EAAAA,EAAIS,EAEtD,EAAG,CACDb,EAAMM,QACNN,EAAMQ,mBACNR,EAAMU,MACNV,EAAMY,UACNX,EAAOK,QACPL,EAAOO,mBACPP,EAAOS,MACPT,EAAOW,WAEX"}
1
+ {"version":3,"file":"hooks.js","sources":["../../../../src/data-surface/view-grid/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo } from 'react'\r\nimport { GridItemDefault } from './ui.units'\r\nimport { getGridItemSizes, resolveGridScrollingThreshold, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n\r\n/** Merges the provided props and config into a single configuration object. */\r\nexport const useMergedConfig = <T>(props: IViewGridProps<T>, config: IViewGridConfig<T>) => {\r\n return useMemo(() => {\r\n return {\r\n spacing: resolveGridSpacing(props.spacing, config.spacing),\r\n scrollingThreshold: resolveGridScrollingThreshold(props.scrollingThreshold, config.scrollingThreshold),\r\n sizes: getGridItemSizes(props.sizes ?? config.sizes),\r\n Component: props.Component ?? config.Component ?? GridItemDefault,\r\n normalOptions: Object.assign({ autoHeight: false }, config.normalOptions, props.normalOptions),\r\n virtualizedOptions: Object.assign({ overscan: 4 }, config.virtualizedOptions, props.virtualizedOptions)\r\n }\r\n }, [props, config])\r\n}\r\n"],"names":["useMergedConfig","props","config","useMemo","_props$sizes","_ref","_props$Component","spacing","resolveGridSpacing","scrollingThreshold","resolveGridScrollingThreshold","sizes","getGridItemSizes","Component","GridItemDefault","normalOptions","Object","assign","autoHeight","virtualizedOptions","overscan"],"mappings":"2LAUO,IAAMA,EAAkB,SAAIC,EAA0BC,GAC3D,OAAOC,EAAQ,WAAK,IAAAC,EAAAC,EAAAC,EAClB,MAAO,CACLC,QAASC,EAAmBP,EAAMM,QAASL,EAAOK,SAClDE,mBAAoBC,EAA8BT,EAAMQ,mBAAoBP,EAAOO,oBACnFE,MAAOC,EAA4BR,QAAZA,EAACH,EAAMU,iBAAKP,EAAAA,EAAIF,EAAOS,OAC9CE,kBAASR,EAAiBC,QAAjBA,EAAEL,EAAMY,qBAASP,EAAAA,EAAIJ,EAAOW,iBAAS,IAAAR,EAAAA,EAAIS,EAClDC,cAAeC,OAAOC,OAAO,CAAEC,YAAY,GAAShB,EAAOa,cAAed,EAAMc,eAChFI,mBAAoBH,OAAOC,OAAO,CAAEG,SAAU,GAAKlB,EAAOiB,mBAAoBlB,EAAMkB,oBAExF,EAAG,CAAClB,EAAOC,GACb"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as n,asyncToGenerator as e,regenerator as r,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Box as l,Grid as c}from"@mui/material";import{useCallback as u,useMemo as s,useRef as d,useState as v,useEffect as f,useLayoutEffect as g}from"react";import{useMergedConfig as p}from"./hooks.js";import{ViewGridStyled as h,viewGridClasses as m}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as I,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as S}from"./helpers.js";function T(e){var r=function(e){return function(r){var o=p(r,e),a=o.Component,u=v(!1),g=t(u,2),x=g[0],I=g[1],S=d(null),T=s(function(){return r.value},[r.value]);f(function(){void 0!==r.scrollResetToken&&S.current&&(S.current.scrollTop=0)},[r.scrollResetToken]);var H=[m.root];return x&&H.push(m.scrolling),i(h,{className:H.filter(Boolean).join(" "),children:i(l,{className:m.scrollContainer,ref:S,onScroll:function(n){var e,t=n.currentTarget;I(t.scrollTop>o.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=80&&(null===(e=r.onNearEnd)||void 0===e||e.call(r))},children:i(c,{container:!0,spacing:"".concat(o.spacing,"px"),className:m.grid,children:T.map(function(r,t){var l,u=null!==(l=e.getterId(r,t))&&void 0!==l?l:t;return i(c,n(n({className:m.gridItem,item:!0},o.sizes),{},{children:i(a,{value:r,index:t})}),u)})})})})}}(e),T=function(n){return function(e){var r,c,T=s(function(){return e.value},[e.value]),H=p(e,n),y=H.sizes,M=H.Component,b=d(null),N=d(new Map),R=d(null),k=d(!1),z=v(0),C=t(z,2),w=C[0],j=C[1],A=v(0),B=t(A,2),E=B[0],F=B[1],O=v(0),P=t(O,2),_=P[0],q=P[1],G=v(null),W=t(G,2),D=W[0],J=W[1],K=Math.max(1,null!==(r=null!==(c=e.overscan)&&void 0!==c?c:n.overscan)&&void 0!==r?r:4),L=x(H.spacing),Q=_>H.scrollingThreshold,U=null!=D?D:S;f(function(){void 0!==e.scrollResetToken&&(b.current&&(b.current.scrollTop=0),q(0))},[e.scrollResetToken]),g(function(){if(b.current){var n=function(){var n,e,r,t,o=null!==(n=null===(e=b.current)||void 0===e?void 0:e.clientWidth)&&void 0!==n?n:0,i=null!==(r=null===(t=b.current)||void 0===t?void 0:t.clientHeight)&&void 0!==r?r:0;j(function(n){return n===o?n:o}),F(function(n){return n===i?n:i})};n();var e=new ResizeObserver(function(){return n()});return e.observe(b.current),function(){return e.disconnect()}}},[]);var V=I(w,y),X=U+L,Y=s(function(){var n=T.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var e=Math.ceil(n/V),r=Math.max(1,E),t=_,o=Math.max(0,Math.floor(t/X)-K),i=Math.ceil(r/X),a=Math.min(e-1,o+i+2*K),l=o*V,c=Math.min(n-1,(a+1)*V-1);return{startRow:o,endRow:a,topSpacerHeight:o*X,bottomSpacerHeight:Math.max(0,(e-a-1)*X),startIndex:l,endIndex:c}},[V,T.length,K,X,_,E]),Z=Y.endIndex>=Y.startIndex?T.slice(Y.startIndex,Y.endIndex+1):[],$=Y.endIndex,nn=s(function(){return{display:"grid",gap:"".concat(L,"px"),gridTemplateColumns:"repeat(".concat(V,", minmax(0, 1fr))")}},[V,L]),en=u(function(){null!==R.current&&(cancelAnimationFrame(R.current),R.current=null)},[]),rn=u(function(){k.current||null!==R.current||(R.current=requestAnimationFrame(function(){if(R.current=null,!k.current){var n=Array.from(N.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=Y.startIndex&&e<=$}).map(function(n){return t(n,2)[1]});if(0!==n.length){var e,r=0,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r=Math.max(r,a.getBoundingClientRect().height)}}catch(n){i.e(n)}finally{i.f()}r<=0||(k.current=!0,J(r))}}}))},[$,Y.startIndex]),tn=u(function(n,e){e?N.current.set(n,e):N.current.delete(n)},[]);g(function(){var n=Array.from(N.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=Y.startIndex&&e<=$}).map(function(n){return t(n,2)[1]});if(0!==n.length&&!k.current){rn();var e,r=new ResizeObserver(function(){rn()}),i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r.observe(a)}}catch(n){i.e(n)}finally{i.f()}return function(){r.disconnect(),en()}}},[Y.startIndex,$,rn,en]),g(function(){return function(){en()}},[en]);var on=[m.root,m.virtualized];return Q&&on.push(m.scrolling),i(h,{className:on.filter(Boolean).join(" "),children:a(l,{ref:b,className:m.scrollContainer,onScroll:function(n){var r,t=n.currentTarget;q(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=80&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:[Y.topSpacerHeight>0?i(l,{sx:{height:Y.topSpacerHeight}}):null,i(l,{sx:nn,className:m.grid,children:Z.map(function(e,r){var t,o=Y.startIndex+r,a=null!==(t=n.getterId(e,o))&&void 0!==t?t:o;return i(l,{className:m.gridItem,ref:k.current?void 0:function(n){return tn(o,n)},sx:null!==D?{minHeight:U,height:U}:void 0,children:i(M,{value:e,index:o})},a)})}),Y.bottomSpacerHeight>0?i(l,{sx:{height:Y.bottomSpacerHeight}}):null]})})}}(e);return function(t){var o,a,l=null!==(o=null!==(a=t.renderStrategy)&&void 0!==a?a:e.renderStrategy)&&void 0!==o?o:"normal";return i("virtualized"===l?T:r,n({},t))}}function H(n){return function(t){var o,a,l,c=u(e(r().m(function n(){var e,o,i,a,l,c,u,s,d;return r().w(function(n){for(;;)switch(n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(e=t.pagination)&&void 0!==e&&e.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:return u=null!==(o=null===(i=t.pagination)||void 0===i?void 0:i.page)&&void 0!==o?o:0,s=null!==(a=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==a?a:20,d=u+1,n.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,d,s);case 4:return n.a(2)}},n)})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(a=t.pagination)||void 0===a?void 0:a.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return i(n,{value:t.value,spacing:t.spacing,sizes:t.sizes,renderStrategy:t.renderStrategy,Component:t.Component,overscan:t.overscan,onNearEnd:"infiniteScroll"===t.loadMode?c:void 0,scrollResetToken:t.scrollResetToken})}}export{T as createViewGrid,H as createViewGridLoading,T as default};
1
+ import{objectSpread2 as n,asyncToGenerator as e,regenerator as r,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{useCallback as c,useMemo as s,useRef as d,useState as v,useEffect as f,useLayoutEffect as p}from"react";import{useMergedConfig as g}from"./hooks.js";import{ViewGridStyled as m,viewGridClasses as h}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as I,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as S}from"./helpers.js";function T(e){var r=function(e){return function(r){var o,a=v(!1),c=t(a,2),p=c[0],x=c[1],I=d(null),S=g(r,e),T=S.Component,H=!0===(null===(o=S.normalOptions)||void 0===o?void 0:o.autoHeight),M="client"===r.featureMode,y=s(function(){return r.value},[r.value]);f(function(){M&&!H&&void 0!==r.scrollResetToken&&I.current&&(I.current.scrollTop=0)},[M,H,r.scrollResetToken]);var b=s(function(){var n=[h.root,h.normal];return p&&n.push(h.scrolling),H&&n.push(h.autoHeight),n.join(" ")},[p,H]);return i(m,{className:b,children:i(l,{className:h.scrollContainer,ref:I,onScroll:function(n){var e,t=n.currentTarget;x(t.scrollTop>S.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=80&&(null===(e=r.onNearEnd)||void 0===e||e.call(r))},children:i(u,{container:!0,spacing:"".concat(S.spacing,"px"),className:h.grid,children:y.map(function(r,t){var o,a=null!==(o=e.getterId(r,t))&&void 0!==o?o:t;return i(u,n(n({className:h.gridItem,item:!0},S.sizes),{},{children:i(T,{value:r,index:t})}),a)})})})})}}(e),T=function(n){return function(e){var r=s(function(){return e.value},[e.value]),u=g(e,n),T=u.sizes,H=u.virtualizedOptions,M=u.Component,y=d(null),b=d(new Map),z=d(null),N=d(!1),R=v(0),k=t(R,2),C=k[0],w=k[1],O=v(0),j=t(O,2),A=j[0],B=j[1],E=v(0),F=t(E,2),P=F[0],_=F[1],q=v(null),G=t(q,2),W=G[0],D=G[1],J=Math.max(1,H.overscan),K=x(u.spacing),L=P>u.scrollingThreshold,Q=null!=W?W:S;f(function(){"client"===e.featureMode&&void 0!==e.scrollResetToken&&(y.current&&(y.current.scrollTop=0),_(0))},[e.featureMode,e.scrollResetToken]),p(function(){if(y.current){var n=function(){var n,e,r,t,o=null!==(n=null===(e=y.current)||void 0===e?void 0:e.clientWidth)&&void 0!==n?n:0,i=null!==(r=null===(t=y.current)||void 0===t?void 0:t.clientHeight)&&void 0!==r?r:0;w(function(n){return n===o?n:o}),B(function(n){return n===i?n:i})};n();var e=new ResizeObserver(function(){return n()});return e.observe(y.current),function(){return e.disconnect()}}},[]);var U=I(C,T),V=Q+K,X=s(function(){var n=r.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var e=Math.ceil(n/U),t=Math.max(1,A),o=P,i=Math.max(0,Math.floor(o/V)-J),a=Math.ceil(t/V),l=Math.min(e-1,i+a+2*J),u=i*U,c=Math.min(n-1,(l+1)*U-1);return{startRow:i,endRow:l,topSpacerHeight:i*V,bottomSpacerHeight:Math.max(0,(e-l-1)*V),startIndex:u,endIndex:c}},[U,r.length,J,V,P,A]),Y=X.endIndex>=X.startIndex?r.slice(X.startIndex,X.endIndex+1):[],Z=X.endIndex,$=s(function(){return{display:"grid",gap:"".concat(K,"px"),gridTemplateColumns:"repeat(".concat(U,", minmax(0, 1fr))")}},[U,K]),nn=c(function(){null!==z.current&&(cancelAnimationFrame(z.current),z.current=null)},[]),en=c(function(){N.current||null!==z.current||(z.current=requestAnimationFrame(function(){if(z.current=null,!N.current){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length){var e,r=0,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r=Math.max(r,a.getBoundingClientRect().height)}}catch(n){i.e(n)}finally{i.f()}r<=0||(N.current=!0,D(r))}}}))},[Z,X.startIndex]),rn=c(function(n,e){e?b.current.set(n,e):b.current.delete(n)},[]);p(function(){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length&&!N.current){en();var e,r=new ResizeObserver(function(){en()}),i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r.observe(a)}}catch(n){i.e(n)}finally{i.f()}return function(){r.disconnect(),nn()}}},[X.startIndex,Z,en,nn]),p(function(){return function(){nn()}},[nn]);var tn=[h.root,h.virtualized];return L&&tn.push(h.scrolling),i(m,{className:tn.filter(Boolean).join(" "),children:a(l,{ref:y,className:h.scrollContainer,onScroll:function(n){var r,t=n.currentTarget;_(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=80&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:[X.topSpacerHeight>0?i(l,{sx:{height:X.topSpacerHeight}}):null,i(l,{sx:$,className:h.grid,children:Y.map(function(e,r){var t,o=X.startIndex+r,a=null!==(t=n.getterId(e,o))&&void 0!==t?t:o;return i(l,{className:h.gridItem,ref:N.current?void 0:function(n){return rn(o,n)},sx:null!==W?{minHeight:Q,height:Q}:void 0,children:i(M,{value:e,index:o})},a)})}),X.bottomSpacerHeight>0?i(l,{sx:{height:X.bottomSpacerHeight}}):null]})})}}(e);return function(t){var o,a,l=null!==(o=null!==(a=t.renderStrategy)&&void 0!==a?a:e.renderStrategy)&&void 0!==o?o:"normal";return i("virtualized"===l?T:r,n({},t))}}function H(n){return function(t){var o,a,l,u=c(e(r().m(function n(){var e,o,i,a,l,u,c,s,d;return r().w(function(n){for(;;)switch(n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(e=t.pagination)&&void 0!==e&&e.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:return c=null!==(o=null===(i=t.pagination)||void 0===i?void 0:i.page)&&void 0!==o?o:0,s=null!==(a=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==a?a:20,d=c+1,n.n=4,null===(u=t.onPageChange)||void 0===u?void 0:u.call(t,d,s);case 4:return n.a(2)}},n)})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(a=t.pagination)||void 0===a?void 0:a.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return i(n,{value:t.value,spacing:t.spacing,sizes:t.sizes,renderStrategy:t.renderStrategy,Component:t.Component,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?u:void 0,scrollResetToken:t.scrollResetToken})}}export{T as createViewGrid,H as createViewGridLoading,T 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 mergedConfig = useMergedConfig<T>(props, config)\r\n const ItemComponent = mergedConfig.Component\r\n const [isScrolling, setIsScrolling] = useState(false)\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\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 (props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [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 <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const rootClasses = [classes.root]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\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 } = mergedConfig\r\n const ItemComponent = mergedConfig.Component\r\n\r\n // Track container geometry and the first measured item height used for virtualization math.\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const measuredItemsRef = useRef(new Map<number, HTMLDivElement>())\r\n const measurementRafRef = useRef<number | null>(null)\r\n const hasMeasuredDatasetRef = useRef(false)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number | null>(null)\r\n\r\n const overscan = Math.max(1, props.overscan ?? config.overscan ?? 4)\r\n const spacingPx = resolveGridSpacing(mergedConfig.spacing)\r\n const isScrolling = scrollTopState > mergedConfig.scrollingThreshold\r\n const effectiveItemHeight = measuredItemHeight ?? DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n // Keep viewport dimensions in sync so column count and window size react to container resize.\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextWidth = wrapRef.current?.clientWidth ?? 0\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const columns = resolveGridColumnsFromWidth(containerWidth, sizes)\r\n const rowHeight = effectiveItemHeight + spacingPx\r\n\r\n // Convert scroll position into a virtual row window plus spacer heights above and below.\r\n const windowed = useMemo(() => {\r\n const totalItems = finalItems.length\r\n if (totalItems === 0) {\r\n return { startRow: 0, endRow: -1, topSpacerHeight: 0, bottomSpacerHeight: 0, startIndex: 0, endIndex: -1 }\r\n }\r\n\r\n const totalRows = Math.ceil(totalItems / columns)\r\n const safeViewportHeight = Math.max(1, containerHeight)\r\n const effectiveScrollTop = scrollTopState\r\n const startRow = Math.max(0, Math.floor(effectiveScrollTop / rowHeight) - overscan)\r\n const visibleRows = Math.ceil(safeViewportHeight / rowHeight)\r\n const endRow = Math.min(totalRows - 1, startRow + visibleRows + overscan * 2)\r\n const startIndex = startRow * columns\r\n const endIndex = Math.min(totalItems - 1, (endRow + 1) * columns - 1)\r\n const topSpacerHeight = startRow * rowHeight\r\n const bottomSpacerHeight = Math.max(0, (totalRows - endRow - 1) * rowHeight)\r\n\r\n return { startRow, endRow, topSpacerHeight, bottomSpacerHeight, startIndex, endIndex }\r\n }, [columns, finalItems.length, overscan, rowHeight, scrollTopState, containerHeight])\r\n\r\n const visibleItems = windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []\r\n const measurementEndIndex = windowed.endIndex\r\n const contentSx = useMemo<BoxProps['sx']>(() => {\r\n return {\r\n display: 'grid',\r\n gap: `${spacingPx}px`,\r\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`\r\n }\r\n }, [columns, spacingPx])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const cancelScheduledMeasurement = useCallback(() => {\r\n if (measurementRafRef.current === null) return\r\n cancelAnimationFrame(measurementRafRef.current)\r\n measurementRafRef.current = null\r\n }, [])\r\n\r\n // Measure the largest item in the first rendered window once, then reuse it permanently.\r\n const scheduleMeasuredHeightUpdate = useCallback(() => {\r\n if (hasMeasuredDatasetRef.current || measurementRafRef.current !== null) return\r\n\r\n measurementRafRef.current = requestAnimationFrame(() => {\r\n measurementRafRef.current = null\r\n if (hasMeasuredDatasetRef.current) return\r\n\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0) return\r\n\r\n let nextHeight = 0\r\n for (const element of elements) {\r\n nextHeight = Math.max(nextHeight, element.getBoundingClientRect().height)\r\n }\r\n\r\n if (nextHeight <= 0) return\r\n\r\n hasMeasuredDatasetRef.current = true\r\n setMeasuredItemHeight(nextHeight)\r\n })\r\n }, [measurementEndIndex, windowed.startIndex])\r\n\r\n const setMeasuredItemRef = useCallback((index: number, node: HTMLDivElement | null) => {\r\n if (node) {\r\n measuredItemsRef.current.set(index, node)\r\n return\r\n }\r\n\r\n measuredItemsRef.current.delete(index)\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0 || hasMeasuredDatasetRef.current) return\r\n\r\n scheduleMeasuredHeightUpdate()\r\n\r\n const observer = new ResizeObserver(() => {\r\n scheduleMeasuredHeightUpdate()\r\n })\r\n\r\n for (const element of elements) {\r\n observer.observe(element)\r\n }\r\n\r\n return () => {\r\n observer.disconnect()\r\n cancelScheduledMeasurement()\r\n }\r\n }, [windowed.startIndex, measurementEndIndex, scheduleMeasuredHeightUpdate, cancelScheduledMeasurement])\r\n\r\n useLayoutEffect(() => {\r\n return () => {\r\n cancelScheduledMeasurement()\r\n }\r\n }, [cancelScheduledMeasurement])\r\n\r\n const rootClasses = [classes.root, classes.virtualized]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\r\n <Box ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n {/* Spacer keeps total scroll height stable for rows rendered before the current window. */}\r\n {windowed.topSpacerHeight > 0 ? <Box sx={{ height: windowed.topSpacerHeight }} /> : null}\r\n\r\n <Box sx={contentSx} className={classes.grid}>\r\n {visibleItems.map((item, offset) => {\r\n const index = windowed.startIndex + offset\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Box\r\n key={key}\r\n className={classes.gridItem}\r\n ref={!hasMeasuredDatasetRef.current ? (node) => setMeasuredItemRef(index, node as HTMLDivElement | null) : undefined}\r\n sx={measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined}\r\n >\r\n <ItemComponent value={item} index={index} />\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n {/* Spacer keeps total scroll height stable for rows rendered after the current window. */}\r\n {windowed.bottomSpacerHeight > 0 ? <Box sx={{ height: windowed.bottomSpacerHeight }} /> : null}\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\n/**\r\n * Factory function to create a Grid view component that can switch between normal and virtualized rendering strategies based on props and configuration.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props, supporting both normal and virtualized rendering strategies.\r\n */\r\nexport function createViewGrid<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal = createViewGridNormal<T>(config)\r\n const ViewGridVirtualized = createViewGridVirtualized<T>(config)\r\n\r\n const ViewGrid: FC<IViewGridProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewGridVirtualized {...props} />\r\n }\r\n return <ViewGridNormal {...props} />\r\n }\r\n return ViewGrid\r\n}\r\n\r\nexport interface IViewGridLoadingProps<T> extends IViewGridProps<T> {\r\n value: T[]\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewGridLoading<T>(GridComponent: ComponentType<IViewGridProps<T>>) {\r\n const ViewGridLoading: FC<IViewGridLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <GridComponent\r\n value={props.value}\r\n spacing={props.spacing}\r\n sizes={props.sizes}\r\n renderStrategy={props.renderStrategy}\r\n Component={props.Component}\r\n overscan={props.overscan}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\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","useMergedConfig","ItemComponent","Component","_useState","useState","_useState2","_slicedToArray","isScrolling","setIsScrolling","scrollContainerRef","useRef","finalItems","useMemo","value","useEffect","undefined","scrollResetToken","current","scrollTop","rootClasses","classes","root","push","scrolling","_jsx","ViewGridStyled","className","filter","Boolean","join","children","Box","scrollContainer","ref","onScroll","e","_props$onNearEnd","t","currentTarget","scrollingThreshold","scrollHeight","clientHeight","onNearEnd","call","Grid","container","spacing","concat","grid","map","item","index","_config$getterId","key","getterId","_objectSpread","gridItem","sizes","createViewGridNormal","ViewGridVirtualized","_ref","_props$overscan","wrapRef","measuredItemsRef","Map","measurementRafRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","startIndex","endIndex","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","cancelScheduledMeasurement","useCallback","cancelAnimationFrame","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","_ref2","_ref4","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","height","err","f","setMeasuredItemRef","node","set","_ref6","_ref8","_step2","_iterator2","virtualized","_jsxs","_props$onNearEnd2","sx","offset","_config$getterId2","minHeight","createViewGridVirtualized","_ref0","_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 <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isScrolling) l.push(classes.scrolling)\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isScrolling, isAutoHeight])\r\n\r\n return (\r\n <ViewGridStyled className={rootClasses}>\r\n <Box className={classes.scrollContainer} ref={scrollContainerRef} onScroll={handleScroll}>\r\n <Grid container spacing={`${mergedConfig.spacing}px`} className={classes.grid}>\r\n {finalItems.map((item, index) => {\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Grid key={key} className={classes.gridItem} item {...mergedConfig.sizes}>\r\n <ItemComponent value={item} index={index} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridNormal\r\n}\r\n//#endregion\r\n//#region Virtualized\r\n/**\r\n * Creates a Grid view component that virtualizes items, rendering only those visible in the viewport. Suitable for large datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a virtualized grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridVirtualized<T>(config: IViewGridConfig<T>) {\r\n const ViewGridVirtualized: FC<IViewGridProps<T>> = (props) => {\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const { sizes, virtualizedOptions } = mergedConfig\r\n const ItemComponent = mergedConfig.Component\r\n\r\n // Track container geometry and the first measured item height used for virtualization math.\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const measuredItemsRef = useRef(new Map<number, HTMLDivElement>())\r\n const measurementRafRef = useRef<number | null>(null)\r\n const hasMeasuredDatasetRef = useRef(false)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number | null>(null)\r\n\r\n const overscan = Math.max(1, virtualizedOptions.overscan)\r\n const spacingPx = resolveGridSpacing(mergedConfig.spacing)\r\n const isScrolling = scrollTopState > mergedConfig.scrollingThreshold\r\n const effectiveItemHeight = measuredItemHeight ?? DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n // Keep viewport dimensions in sync so column count and window size react to container resize.\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextWidth = wrapRef.current?.clientWidth ?? 0\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const columns = resolveGridColumnsFromWidth(containerWidth, sizes)\r\n const rowHeight = effectiveItemHeight + spacingPx\r\n\r\n // Convert scroll position into a virtual row window plus spacer heights above and below.\r\n const windowed = useMemo(() => {\r\n const totalItems = finalItems.length\r\n if (totalItems === 0) {\r\n return { startRow: 0, endRow: -1, topSpacerHeight: 0, bottomSpacerHeight: 0, startIndex: 0, endIndex: -1 }\r\n }\r\n\r\n const totalRows = Math.ceil(totalItems / columns)\r\n const safeViewportHeight = Math.max(1, containerHeight)\r\n const effectiveScrollTop = scrollTopState\r\n const startRow = Math.max(0, Math.floor(effectiveScrollTop / rowHeight) - overscan)\r\n const visibleRows = Math.ceil(safeViewportHeight / rowHeight)\r\n const endRow = Math.min(totalRows - 1, startRow + visibleRows + overscan * 2)\r\n const startIndex = startRow * columns\r\n const endIndex = Math.min(totalItems - 1, (endRow + 1) * columns - 1)\r\n const topSpacerHeight = startRow * rowHeight\r\n const bottomSpacerHeight = Math.max(0, (totalRows - endRow - 1) * rowHeight)\r\n\r\n return { startRow, endRow, topSpacerHeight, bottomSpacerHeight, startIndex, endIndex }\r\n }, [columns, finalItems.length, overscan, rowHeight, scrollTopState, containerHeight])\r\n\r\n const visibleItems = windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []\r\n const measurementEndIndex = windowed.endIndex\r\n const contentSx = useMemo<BoxProps['sx']>(() => {\r\n return {\r\n display: 'grid',\r\n gap: `${spacingPx}px`,\r\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`\r\n }\r\n }, [columns, spacingPx])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const cancelScheduledMeasurement = useCallback(() => {\r\n if (measurementRafRef.current === null) return\r\n cancelAnimationFrame(measurementRafRef.current)\r\n measurementRafRef.current = null\r\n }, [])\r\n\r\n // Measure the largest item in the first rendered window once, then reuse it permanently.\r\n const scheduleMeasuredHeightUpdate = useCallback(() => {\r\n if (hasMeasuredDatasetRef.current || measurementRafRef.current !== null) return\r\n\r\n measurementRafRef.current = requestAnimationFrame(() => {\r\n measurementRafRef.current = null\r\n if (hasMeasuredDatasetRef.current) return\r\n\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0) return\r\n\r\n let nextHeight = 0\r\n for (const element of elements) {\r\n nextHeight = Math.max(nextHeight, element.getBoundingClientRect().height)\r\n }\r\n\r\n if (nextHeight <= 0) return\r\n\r\n hasMeasuredDatasetRef.current = true\r\n setMeasuredItemHeight(nextHeight)\r\n })\r\n }, [measurementEndIndex, windowed.startIndex])\r\n\r\n const setMeasuredItemRef = useCallback((index: number, node: HTMLDivElement | null) => {\r\n if (node) {\r\n measuredItemsRef.current.set(index, node)\r\n return\r\n }\r\n\r\n measuredItemsRef.current.delete(index)\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0 || hasMeasuredDatasetRef.current) return\r\n\r\n scheduleMeasuredHeightUpdate()\r\n\r\n const observer = new ResizeObserver(() => {\r\n scheduleMeasuredHeightUpdate()\r\n })\r\n\r\n for (const element of elements) {\r\n observer.observe(element)\r\n }\r\n\r\n return () => {\r\n observer.disconnect()\r\n cancelScheduledMeasurement()\r\n }\r\n }, [windowed.startIndex, measurementEndIndex, scheduleMeasuredHeightUpdate, cancelScheduledMeasurement])\r\n\r\n useLayoutEffect(() => {\r\n return () => {\r\n cancelScheduledMeasurement()\r\n }\r\n }, [cancelScheduledMeasurement])\r\n\r\n const rootClasses = [classes.root, classes.virtualized]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\r\n <Box ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n {/* Spacer keeps total scroll height stable for rows rendered before the current window. */}\r\n {windowed.topSpacerHeight > 0 ? <Box sx={{ height: windowed.topSpacerHeight }} /> : null}\r\n\r\n <Box sx={contentSx} className={classes.grid}>\r\n {visibleItems.map((item, offset) => {\r\n const index = windowed.startIndex + offset\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Box\r\n key={key}\r\n className={classes.gridItem}\r\n ref={!hasMeasuredDatasetRef.current ? (node) => setMeasuredItemRef(index, node as HTMLDivElement | null) : undefined}\r\n sx={measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined}\r\n >\r\n <ItemComponent value={item} index={index} />\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n {/* Spacer keeps total scroll height stable for rows rendered after the current window. */}\r\n {windowed.bottomSpacerHeight > 0 ? <Box sx={{ height: windowed.bottomSpacerHeight }} /> : null}\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\n/**\r\n * Factory function to create a Grid view component that can switch between normal and virtualized rendering strategies based on props and configuration.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props, supporting both normal and virtualized rendering strategies.\r\n */\r\nexport function createViewGrid<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal = createViewGridNormal<T>(config)\r\n const ViewGridVirtualized = createViewGridVirtualized<T>(config)\r\n\r\n const ViewGrid: FC<IViewGridProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewGridVirtualized {...props} />\r\n }\r\n return <ViewGridNormal {...props} />\r\n }\r\n return ViewGrid\r\n}\r\n\r\nexport interface IViewGridLoadingProps<T> extends IViewGridProps<T> {\r\n value: T[]\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewGridLoading<T>(GridComponent: ComponentType<IViewGridProps<T>>) {\r\n const ViewGridLoading: FC<IViewGridLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <GridComponent\r\n value={props.value}\r\n spacing={props.spacing}\r\n sizes={props.sizes}\r\n renderStrategy={props.renderStrategy}\r\n Component={props.Component}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n 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","onNearEnd","call","Grid","container","spacing","concat","grid","map","item","index","_config$getterId","key","getterId","_objectSpread","gridItem","sizes","createViewGridNormal","ViewGridVirtualized","virtualizedOptions","wrapRef","measuredItemsRef","Map","measurementRafRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","startIndex","endIndex","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","cancelScheduledMeasurement","useCallback","cancelAnimationFrame","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","height","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","sx","offset","_config$getterId2","minHeight","createViewGridVirtualized","_ref9","_props$renderStrategy","renderStrategy","createViewGridLoading","GridComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange"],"mappings":"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"}