dinocollab-core 2.2.15 → 2.2.17

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 (56) hide show
  1. package/dist/filter-bar/index.js +1 -1
  2. package/dist/src/data-surface/helpers.js.map +1 -1
  3. package/dist/src/data-surface/view-grid/helpers.js +1 -1
  4. package/dist/src/data-surface/view-grid/helpers.js.map +1 -1
  5. package/dist/src/data-surface/view-grid/hooks.js +1 -1
  6. package/dist/src/data-surface/view-grid/hooks.js.map +1 -1
  7. package/dist/src/data-surface/view-grid/index.js +1 -1
  8. package/dist/src/data-surface/view-grid/index.js.map +1 -1
  9. package/dist/src/filter-bar/components/chip-viewer.js +1 -1
  10. package/dist/src/filter-bar/components/chip-viewer.js.map +1 -1
  11. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  12. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  13. package/dist/src/filter-bar/index.create.js.map +1 -1
  14. package/dist/src/filter-bar/index.dino.js +1 -1
  15. package/dist/src/filter-bar/index.dino.js.map +1 -1
  16. package/dist/src/filter-bar/menu/create-form-field-datetime.js +1 -1
  17. package/dist/src/filter-bar/menu/create-form-field-datetime.js.map +1 -1
  18. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
  19. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
  20. package/dist/src/filter-bar/menu/create-form-field-select.js +1 -1
  21. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -1
  22. package/dist/src/filter-bar/menu/create-form-field-string.js +1 -1
  23. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -1
  24. package/dist/src/filter-bar/menu/create.js +1 -1
  25. package/dist/src/filter-bar/menu/create.js.map +1 -1
  26. package/dist/src/form/create.form-base.js +1 -1
  27. package/dist/src/form/create.form-base.js.map +1 -1
  28. package/dist/src/form/create.form-comfirm.js +1 -1
  29. package/dist/src/form/create.form-comfirm.js.map +1 -1
  30. package/dist/src/form/create.form-grid-layout.js +1 -1
  31. package/dist/src/form/create.form-grid-layout.js.map +1 -1
  32. package/dist/src/form/create.select-with-api.js +1 -1
  33. package/dist/src/form/create.select-with-api.js.map +1 -1
  34. package/dist/src/form/modal-wrapper.js +1 -1
  35. package/dist/src/form/modal-wrapper.js.map +1 -1
  36. package/dist/src/table/create.table.js +1 -1
  37. package/dist/src/table/create.table.js.map +1 -1
  38. package/dist/src/table/ui.buttons.js +1 -1
  39. package/dist/src/table/ui.buttons.js.map +1 -1
  40. package/dist/src/table-grid/create.table-grid.js +1 -1
  41. package/dist/src/table-grid/create.table-grid.js.map +1 -1
  42. package/dist/src/table-grid/item-actions.js +1 -1
  43. package/dist/src/table-grid/item-actions.js.map +1 -1
  44. package/dist/src/table-grid/toolbar-pannel.js +1 -1
  45. package/dist/src/table-grid/toolbar-pannel.js.map +1 -1
  46. package/dist/types/data-surface/view-grid/helpers.d.ts +4 -0
  47. package/dist/types/data-surface/view-grid/hooks.d.ts +1 -0
  48. package/dist/types/data-surface/view-grid/types.d.ts +2 -0
  49. package/dist/types/filter-bar/components/chip-viewer.d.ts +2 -0
  50. package/dist/types/filter-bar/components/filter-summary.types.d.ts +8 -2
  51. package/dist/types/filter-bar/index.d.ts +1 -0
  52. package/dist/types/filter-bar/index.dino.d.ts +2 -1
  53. package/dist/types/filter-bar/menu/create-form-field-datetime.d.ts +10 -2
  54. package/dist/types/filter-bar/menu/create-form-field-select-multiple.d.ts +2 -0
  55. package/dist/types/filter-bar/menu/types.d.ts +10 -0
  56. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- export{KeySpecial}from"../src/filter-bar/types.js";export{createFilterBar}from"../src/filter-bar/index.create.js";export{HintIcon,HintList,createHintIcon}from"../src/filter-bar/components/hint-icon.js";export{TableFileterConverter,createConvertToGraphQL,mapLogic,mapSortDirection}from"../src/filter-bar/convert-to-graphql.js";export{LocalFilterBuilder,createLocalFilterBuilder}from"../src/filter-bar/local-filter-builder.js";export{DinoFilterBar,dinoFilterBar}from"../src/filter-bar/index.dino.js";
1
+ export{KeySpecial}from"../src/filter-bar/types.js";export{createFilterBar}from"../src/filter-bar/index.create.js";export{HintIcon,HintList,createHintIcon}from"../src/filter-bar/components/hint-icon.js";export{TableFileterConverter,createConvertToGraphQL,mapLogic,mapSortDirection}from"../src/filter-bar/convert-to-graphql.js";export{LocalFilterBuilder,createLocalFilterBuilder}from"../src/filter-bar/local-filter-builder.js";export{DinoFilterBar,dinoFilterBar}from"../src/filter-bar/index.dino.js";export{createFormFieldDateTime,formatterDateTime}from"../src/filter-bar/menu/create-form-field-datetime.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/data-surface/helpers.ts"],"sourcesContent":["import { DataSurfaceViewMode, TPagination } from './types'\r\nimport { QueryParam } from '../utils/query-param'\r\n\r\nexport interface IViewDataQueryParams {\r\n mode?: DataSurfaceViewMode\r\n}\r\n\r\nexport function setViewModeToURL(mode?: DataSurfaceViewMode, defaultMode?: DataSurfaceViewMode) {\r\n // If window is undefined (e.g., during SSR), do nothing\r\n if (typeof window === 'undefined') return\r\n try {\r\n const updateParams: IViewDataQueryParams = { mode: mode === defaultMode ? undefined : mode }\r\n\r\n // Update URL with view mode\r\n if (updateParams.mode) {\r\n QueryParam.replacePatch<IViewDataQueryParams>(updateParams)\r\n } else {\r\n // If no view mode to update, remove existing mode from URL\r\n QueryParam.replaceDeletes<IViewDataQueryParams>('mode')\r\n }\r\n } catch (error) {\r\n console.error('Error syncing view mode to URL:', error)\r\n }\r\n}\r\n\r\nexport function getViewModeFromURL(defaultMode?: DataSurfaceViewMode): DataSurfaceViewMode | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultViewMode\r\n if (typeof window === 'undefined') return defaultMode\r\n try {\r\n const q = QueryParam.gets<IViewDataQueryParams>('mode')\r\n return q.mode ? (q.mode as DataSurfaceViewMode) : defaultMode\r\n } catch (error) {\r\n console.error('Error getting view mode from URL:', error)\r\n return defaultMode\r\n }\r\n}\r\n\r\nexport interface IPaginationQueryParams {\r\n page?: string\r\n pageSize?: string\r\n}\r\n\r\n/**\r\n * @en Synchronize pagination to URL query parameters. Each field is handled independently:\r\n * if it differs from default → add to URL; if same or undefined → remove from URL.\r\n * @vi Dong bo pagination vao URL query parameters. Tung field duoc xu ly doc lap:\r\n * neu khac default → them vao URL; neu bang hoac undefined → xoa khoi URL.\r\n *\r\n * @param pagination - Current pagination to sync\r\n * @param defaultPagination - Default pagination values used as baseline\r\n */\r\nexport function setPaginationToURL(pagination?: TPagination, defaultPagination?: TPagination) {\r\n if (typeof window === 'undefined') return\r\n\r\n try {\r\n const patchParams: IPaginationQueryParams = {}\r\n const deleteKeys: (keyof IPaginationQueryParams)[] = []\r\n\r\n // page: differs from default → add to URL; same or missing → remove\r\n if (pagination?.page !== undefined && pagination.page !== defaultPagination?.page) {\r\n patchParams.page = String(pagination.page)\r\n } else {\r\n deleteKeys.push('page')\r\n }\r\n\r\n // pageSize: differs from default → add to URL; same or missing → remove\r\n if (pagination?.pageSize !== undefined && pagination.pageSize !== defaultPagination?.pageSize) {\r\n patchParams.pageSize = String(pagination.pageSize)\r\n } else {\r\n deleteKeys.push('pageSize')\r\n }\r\n\r\n if (Object.keys(patchParams).length > 0) QueryParam.replacePatch<IPaginationQueryParams>(patchParams)\r\n if (deleteKeys.length > 0) QueryParam.replaceDeletes<IPaginationQueryParams>(...deleteKeys)\r\n } catch (error) {\r\n console.error('Error syncing pagination to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * @en Retrieve pagination from URL query parameters.\r\n * @vi Lay pagination tu URL query parameters.\r\n *\r\n * @param defaultPagination - Default pagination to return if URL has no pagination\r\n * @returns Pagination from URL or defaultPagination\r\n */\r\nexport function getPaginationFromURL(defaultPagination?: TPagination): TPagination | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultPagination\r\n if (typeof window === 'undefined') return defaultPagination\r\n\r\n try {\r\n const q = QueryParam.gets<IPaginationQueryParams>('page', 'pageSize')\r\n\r\n // Parse values from URL\r\n const page = q.page ? parseInt(q.page, 10) : undefined\r\n const pageSize = q.pageSize ? parseInt(q.pageSize, 10) : undefined\r\n\r\n // If no pagination in URL, return default\r\n if (page === undefined && pageSize === undefined) {\r\n return defaultPagination\r\n }\r\n\r\n // Merge with default pagination\r\n return {\r\n ...defaultPagination,\r\n page: page !== undefined && !isNaN(page) ? page : defaultPagination?.page,\r\n pageSize: pageSize !== undefined && !isNaN(pageSize) ? pageSize : defaultPagination?.pageSize\r\n }\r\n } catch (error) {\r\n console.error('Error getting pagination from URL:', error)\r\n return defaultPagination\r\n }\r\n}\r\n"],"names":["setViewModeToURL","mode","defaultMode","window","updateParams","undefined","QueryParam","replacePatch","replaceDeletes","error","console","getViewModeFromURL","q","gets","setPaginationToURL","pagination","defaultPagination","patchParams","deleteKeys","page","String","push","pageSize","Object","keys","length","apply","getPaginationFromURL","parseInt","_objectSpread","isNaN"],"mappings":"iIAOgB,SAAAA,EAAiBC,EAA4BC,GAE3D,GAAsB,oBAAXC,OACX,IACE,IAAMC,EAAqC,CAAEH,KAAMA,IAASC,OAAcG,EAAYJ,GAGlFG,EAAaH,KACfK,EAAWC,aAAmCH,GAG9CE,EAAWE,eAAqC,OAEnD,CAAC,MAAOC,GACPC,QAAQD,MAAM,kCAAmCA,EAClD,CACH,CAEM,SAAUE,EAAmBT,GAEjC,GAAsB,oBAAXC,OAAwB,OAAOD,EAC1C,IACE,IAAMU,EAAIN,EAAWO,KAA2B,QAChD,OAAOD,EAAEX,KAAQW,EAAEX,KAA+BC,CACnD,CAAC,MAAOO,GAEP,OADAC,QAAQD,MAAM,oCAAqCA,GAC5CP,CACR,CACH,CAgBgB,SAAAY,EAAmBC,EAA0BC,GAC3D,GAAsB,oBAAXb,OAEX,IACE,IAAMc,EAAsC,CAAE,EACxCC,EAA+C,QAG5Bb,KAArBU,eAAAA,EAAYI,OAAsBJ,EAAWI,QAASH,aAAAA,EAAAA,EAAmBG,MAC3EF,EAAYE,KAAOC,OAAOL,EAAWI,MAErCD,EAAWG,KAAK,aAIWhB,KAAzBU,eAAAA,EAAYO,WAA0BP,EAAWO,YAAaN,aAAAA,EAAAA,EAAmBM,UACnFL,EAAYK,SAAWF,OAAOL,EAAWO,UAEzCJ,EAAWG,KAAK,YAGdE,OAAOC,KAAKP,GAAaQ,OAAS,GAAGnB,EAAWC,aAAqCU,GACrFC,EAAWO,OAAS,GAAGnB,EAAWE,eAAckB,MAAzBpB,EAAqDY,EACjF,CAAC,MAAOT,GACPC,QAAQD,MAAM,mCAAoCA,EACnD,CACH,CASM,SAAUkB,EAAqBX,GAEnC,GAAsB,oBAAXb,OAAwB,OAAOa,EAE1C,IACE,IAAMJ,EAAIN,EAAWO,KAA6B,OAAQ,YAGpDM,EAAOP,EAAEO,KAAOS,SAAShB,EAAEO,KAAM,SAAMd,EACvCiB,EAAWV,EAAEU,SAAWM,SAAShB,EAAEU,SAAU,SAAMjB,EAGzD,YAAaA,IAATc,QAAmCd,IAAbiB,EACjBN,EAITa,EAAAA,EAAA,CAAA,EACKb,GAAiB,CAAA,EAAA,CACpBG,UAAed,IAATc,GAAuBW,MAAMX,GAAeH,aAAAA,EAAAA,EAAmBG,KAA1BA,EAC3CG,cAAuBjB,IAAbiB,GAA2BQ,MAAMR,GAAuBN,aAAiB,EAAjBA,EAAmBM,SAA9BA,GAE1D,CAAC,MAAOb,GAEP,OADAC,QAAQD,MAAM,qCAAsCA,GAC7CO,CACR,CACH"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/data-surface/helpers.ts"],"sourcesContent":["import { QueryParam } from '../utils/query-param'\r\nimport { DataSurfaceViewMode, TPagination } from './types'\r\n\r\nexport interface IViewDataQueryParams {\r\n mode?: DataSurfaceViewMode\r\n}\r\n\r\nexport function setViewModeToURL(mode?: DataSurfaceViewMode, defaultMode?: DataSurfaceViewMode) {\r\n // If window is undefined (e.g., during SSR), do nothing\r\n if (typeof window === 'undefined') return\r\n try {\r\n const updateParams: IViewDataQueryParams = { mode: mode === defaultMode ? undefined : mode }\r\n\r\n // Update URL with view mode\r\n if (updateParams.mode) {\r\n QueryParam.replacePatch<IViewDataQueryParams>(updateParams)\r\n } else {\r\n // If no view mode to update, remove existing mode from URL\r\n QueryParam.replaceDeletes<IViewDataQueryParams>('mode')\r\n }\r\n } catch (error) {\r\n console.error('Error syncing view mode to URL:', error)\r\n }\r\n}\r\n\r\nexport function getViewModeFromURL(defaultMode?: DataSurfaceViewMode): DataSurfaceViewMode | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultViewMode\r\n if (typeof window === 'undefined') return defaultMode\r\n try {\r\n const q = QueryParam.gets<IViewDataQueryParams>('mode')\r\n return q.mode ? (q.mode as DataSurfaceViewMode) : defaultMode\r\n } catch (error) {\r\n console.error('Error getting view mode from URL:', error)\r\n return defaultMode\r\n }\r\n}\r\n\r\nexport interface IPaginationQueryParams {\r\n page?: string\r\n pageSize?: string\r\n}\r\n\r\n/**\r\n * @en Synchronize pagination to URL query parameters. Each field is handled independently:\r\n * if it differs from default → add to URL; if same or undefined → remove from URL.\r\n * @vi Dong bo pagination vao URL query parameters. Tung field duoc xu ly doc lap:\r\n * neu khac default → them vao URL; neu bang hoac undefined → xoa khoi URL.\r\n *\r\n * @param pagination - Current pagination to sync\r\n * @param defaultPagination - Default pagination values used as baseline\r\n */\r\nexport function setPaginationToURL(pagination?: TPagination, defaultPagination?: TPagination) {\r\n if (typeof window === 'undefined') return\r\n\r\n try {\r\n const patchParams: IPaginationQueryParams = {}\r\n const deleteKeys: (keyof IPaginationQueryParams)[] = []\r\n\r\n // page: differs from default → add to URL; same or missing → remove\r\n if (pagination?.page !== undefined && pagination.page !== defaultPagination?.page) {\r\n patchParams.page = String(pagination.page)\r\n } else {\r\n deleteKeys.push('page')\r\n }\r\n\r\n // pageSize: differs from default → add to URL; same or missing → remove\r\n if (pagination?.pageSize !== undefined && pagination.pageSize !== defaultPagination?.pageSize) {\r\n patchParams.pageSize = String(pagination.pageSize)\r\n } else {\r\n deleteKeys.push('pageSize')\r\n }\r\n\r\n if (Object.keys(patchParams).length > 0) QueryParam.replacePatch<IPaginationQueryParams>(patchParams)\r\n if (deleteKeys.length > 0) QueryParam.replaceDeletes<IPaginationQueryParams>(...deleteKeys)\r\n } catch (error) {\r\n console.error('Error syncing pagination to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * @en Retrieve pagination from URL query parameters.\r\n * @vi Lay pagination tu URL query parameters.\r\n *\r\n * @param defaultPagination - Default pagination to return if URL has no pagination\r\n * @returns Pagination from URL or defaultPagination\r\n */\r\nexport function getPaginationFromURL(defaultPagination?: TPagination): TPagination | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultPagination\r\n if (typeof window === 'undefined') return defaultPagination\r\n\r\n try {\r\n const q = QueryParam.gets<IPaginationQueryParams>('page', 'pageSize')\r\n\r\n // Parse values from URL\r\n const page = q.page ? parseInt(q.page, 10) : undefined\r\n const pageSize = q.pageSize ? parseInt(q.pageSize, 10) : undefined\r\n\r\n // If no pagination in URL, return default\r\n if (page === undefined && pageSize === undefined) {\r\n return defaultPagination\r\n }\r\n\r\n // Merge with default pagination\r\n return {\r\n ...defaultPagination,\r\n page: page !== undefined && !isNaN(page) ? page : defaultPagination?.page,\r\n pageSize: pageSize !== undefined && !isNaN(pageSize) ? pageSize : defaultPagination?.pageSize\r\n }\r\n } catch (error) {\r\n console.error('Error getting pagination from URL:', error)\r\n return defaultPagination\r\n }\r\n}\r\n"],"names":["setViewModeToURL","mode","defaultMode","window","updateParams","undefined","QueryParam","replacePatch","replaceDeletes","error","console","getViewModeFromURL","q","gets","setPaginationToURL","pagination","defaultPagination","patchParams","deleteKeys","page","String","push","pageSize","Object","keys","length","apply","getPaginationFromURL","parseInt","_objectSpread","isNaN"],"mappings":"iIAOgB,SAAAA,EAAiBC,EAA4BC,GAE3D,GAAsB,oBAAXC,OACX,IACE,IAAMC,EAAqC,CAAEH,KAAMA,IAASC,OAAcG,EAAYJ,GAGlFG,EAAaH,KACfK,EAAWC,aAAmCH,GAG9CE,EAAWE,eAAqC,OAEnD,CAAC,MAAOC,GACPC,QAAQD,MAAM,kCAAmCA,EAClD,CACH,CAEM,SAAUE,EAAmBT,GAEjC,GAAsB,oBAAXC,OAAwB,OAAOD,EAC1C,IACE,IAAMU,EAAIN,EAAWO,KAA2B,QAChD,OAAOD,EAAEX,KAAQW,EAAEX,KAA+BC,CACnD,CAAC,MAAOO,GAEP,OADAC,QAAQD,MAAM,oCAAqCA,GAC5CP,CACR,CACH,CAgBgB,SAAAY,EAAmBC,EAA0BC,GAC3D,GAAsB,oBAAXb,OAEX,IACE,IAAMc,EAAsC,CAAE,EACxCC,EAA+C,QAG5Bb,KAArBU,eAAAA,EAAYI,OAAsBJ,EAAWI,QAASH,aAAAA,EAAAA,EAAmBG,MAC3EF,EAAYE,KAAOC,OAAOL,EAAWI,MAErCD,EAAWG,KAAK,aAIWhB,KAAzBU,eAAAA,EAAYO,WAA0BP,EAAWO,YAAaN,aAAAA,EAAAA,EAAmBM,UACnFL,EAAYK,SAAWF,OAAOL,EAAWO,UAEzCJ,EAAWG,KAAK,YAGdE,OAAOC,KAAKP,GAAaQ,OAAS,GAAGnB,EAAWC,aAAqCU,GACrFC,EAAWO,OAAS,GAAGnB,EAAWE,eAAckB,MAAzBpB,EAAqDY,EACjF,CAAC,MAAOT,GACPC,QAAQD,MAAM,mCAAoCA,EACnD,CACH,CASM,SAAUkB,EAAqBX,GAEnC,GAAsB,oBAAXb,OAAwB,OAAOa,EAE1C,IACE,IAAMJ,EAAIN,EAAWO,KAA6B,OAAQ,YAGpDM,EAAOP,EAAEO,KAAOS,SAAShB,EAAEO,KAAM,SAAMd,EACvCiB,EAAWV,EAAEU,SAAWM,SAAShB,EAAEU,SAAU,SAAMjB,EAGzD,YAAaA,IAATc,QAAmCd,IAAbiB,EACjBN,EAITa,EAAAA,EAAA,CAAA,EACKb,GAAiB,CAAA,EAAA,CACpBG,UAAed,IAATc,GAAuBW,MAAMX,GAAeH,aAAAA,EAAAA,EAAmBG,KAA1BA,EAC3CG,cAAuBjB,IAAbiB,GAA2BQ,MAAMR,GAAuBN,aAAiB,EAAjBA,EAAmBM,SAA9BA,GAE1D,CAAC,MAAOb,GAEP,OADAC,QAAQD,MAAM,qCAAsCA,GAC7CO,CACR,CACH"}
@@ -1,2 +1,2 @@
1
- import{toConsumableArray as l}from"../../../_virtual/_rollupPluginBabelHelpers.js";var n=8,u=function(){for(var n=arguments.length,u=new Array(n),r=0;r<n;r++)u[r]=arguments[r];var t=u.filter(function(l){return"number"==typeof l});return 0===t.length?8:Math.max.apply(Math,[0].concat(l(t.map(function(l){return null!=l?l:8}))))},r=80,t=function(){for(var n=arguments.length,u=new Array(n),r=0;r<n;r++)u[r]=arguments[r];var t=u.filter(function(l){return"number"==typeof l});return 0===t.length?80:Math.max.apply(Math,[0].concat(l(t.map(function(l){return null!=l?l:80}))))},o=120,a={xs:12,sm:6,md:4,lg:3},i=function(l){return null!=l?l:a},e=function(l){var n,u,r,t,o,i,e,v,m,d,f,c,s,x,h,p=null!=l?l:{},g=p.xs,M=p.sm,y=p.md,b=p.lg,A=p.xl;return{xs:null!==(n=null!=g?g:a.xs)&&void 0!==n?n:12,sm:null!==(u=null!==(r=null!=M?M:g)&&void 0!==r?r:a.sm)&&void 0!==u?u:6,md:null!==(t=null!==(o=null!==(i=null!=y?y:M)&&void 0!==i?i:g)&&void 0!==o?o:a.md)&&void 0!==t?t:4,lg:null!==(e=null!==(v=null!==(m=null!==(d=null!=b?b:y)&&void 0!==d?d:M)&&void 0!==m?m:g)&&void 0!==v?v:a.lg)&&void 0!==e?e:3,xl:null!==(f=null!==(c=null!==(s=null!==(x=null!==(h=null!=A?A:b)&&void 0!==h?h:y)&&void 0!==x?x:M)&&void 0!==s?s:g)&&void 0!==c?c:a.xl)&&void 0!==f?f:3}},v=function(l,n){var u,r=e(n),t=function(l){return l>=1536?"xl":l>=1200?"lg":l>=900?"md":l>=600?"sm":"xs"}(l),o=null!==(u=r[t])&&void 0!==u?u:12,a=Math.min(12,Math.max(1,o));return Math.max(1,Math.floor(12/a))};export{o as DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE,a as DEFAULT_GRID_ITEM_SIZES,r as DEFAULT_GRID_SCROLLING_THRESHOLD_PX,n as DEFAULT_GRID_SPACING_PX,i as getGridItemSizes,e as normalizeGridSizes,v as resolveGridColumnsFromWidth,t as resolveGridScrollingThreshold,u as resolveGridSpacing};
1
+ import{toConsumableArray as n}from"../../../_virtual/_rollupPluginBabelHelpers.js";var l=8,r=function(){for(var l=arguments.length,r=new Array(l),u=0;u<l;u++)r[u]=arguments[u];var t=r.filter(function(n){return"number"==typeof n});return 0===t.length?8:Math.max.apply(Math,[0].concat(n(t.map(function(n){return null!=n?n:8}))))},u=80,t=function(){for(var l=arguments.length,r=new Array(l),u=0;u<l;u++)r[u]=arguments[u];var t=r.filter(function(n){return"number"==typeof n});return 0===t.length?80:Math.max.apply(Math,[0].concat(n(t.map(function(n){return null!=n?n:80}))))},o=80,a=function(){for(var l=arguments.length,r=new Array(l),u=0;u<l;u++)r[u]=arguments[u];var t=r.filter(function(n){return"number"==typeof n});return 0===t.length?80:Math.max.apply(Math,[0].concat(n(t.map(function(n){return null!=n?n:80}))))},e=120,i={xs:12,sm:6,md:4,lg:3},v=function(n){return null!=n?n:i},m=function(n){var l,r,u,t,o,a,e,v,m,f,d,c,h,p,x,s=null!=n?n:{},g=s.xs,y=s.sm,M=s.md,b=s.lg,A=s.xl;return{xs:null!==(l=null!=g?g:i.xs)&&void 0!==l?l:12,sm:null!==(r=null!==(u=null!=y?y:g)&&void 0!==u?u:i.sm)&&void 0!==r?r:6,md:null!==(t=null!==(o=null!==(a=null!=M?M:y)&&void 0!==a?a:g)&&void 0!==o?o:i.md)&&void 0!==t?t:4,lg:null!==(e=null!==(v=null!==(m=null!==(f=null!=b?b:M)&&void 0!==f?f:y)&&void 0!==m?m:g)&&void 0!==v?v:i.lg)&&void 0!==e?e:3,xl:null!==(d=null!==(c=null!==(h=null!==(p=null!==(x=null!=A?A:b)&&void 0!==x?x:M)&&void 0!==p?p:y)&&void 0!==h?h:g)&&void 0!==c?c:i.xl)&&void 0!==d?d:3}},f=function(n,l){var r,u=m(l),t=function(n){return n>=1536?"xl":n>=1200?"lg":n>=900?"md":n>=600?"sm":"xs"}(n),o=null!==(r=u[t])&&void 0!==r?r:12,a=Math.min(12,Math.max(1,o));return Math.max(1,Math.floor(12/a))};export{e as DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE,i as DEFAULT_GRID_ITEM_SIZES,o as DEFAULT_GRID_NEAR_END_THRESHOLD_PX,u as DEFAULT_GRID_SCROLLING_THRESHOLD_PX,l as DEFAULT_GRID_SPACING_PX,v as getGridItemSizes,m as normalizeGridSizes,f as resolveGridColumnsFromWidth,a as resolveGridNearEndThreshold,t as resolveGridScrollingThreshold,r as resolveGridSpacing};
2
2
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../../src/data-surface/view-grid/helpers.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport type { TGridSizes } from './types'\r\n\r\n/** Default spacing between grid items in pixels. */\r\nexport const DEFAULT_GRID_SPACING_PX = 8\r\n/** Resolves the final grid spacing from multiple optional values. */\r\nexport const resolveGridSpacing = (...spacing: (number | undefined)[]) => {\r\n const finalSpacing = spacing.filter((value) => typeof value === 'number')\r\n if (finalSpacing.length === 0) return DEFAULT_GRID_SPACING_PX\r\n return Math.max(0, ...finalSpacing.map((value) => value ?? DEFAULT_GRID_SPACING_PX))\r\n}\r\n/** Default scrolling threshold in pixels for triggering near-end events. */\r\nexport const DEFAULT_GRID_SCROLLING_THRESHOLD_PX = 80\r\n/** Resolves the final scrolling threshold from multiple optional values. */\r\nexport const resolveGridScrollingThreshold = (...threshold: (number | undefined)[]) => {\r\n const finalThreshold = threshold.filter((value) => typeof value === 'number')\r\n if (finalThreshold.length === 0) return DEFAULT_GRID_SCROLLING_THRESHOLD_PX\r\n return Math.max(0, ...finalThreshold.map((value) => value ?? DEFAULT_GRID_SCROLLING_THRESHOLD_PX))\r\n}\r\n/** Default grid item height estimate in pixels, used for virtualization calculations. */\r\nexport const DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE = 120\r\n/** Default grid item sizes for each breakpoint. */\r\nexport const DEFAULT_GRID_ITEM_SIZES: TGridSizes = { xs: 12, sm: 6, md: 4, lg: 3 }\r\n/** Returns the grid item sizes, falling back to defaults if not provided. */\r\nexport const getGridItemSizes = (sizes?: TGridSizes): TGridSizes => {\r\n return sizes ?? DEFAULT_GRID_ITEM_SIZES\r\n}\r\n/** Normalizes grid item sizes, ensuring all breakpoints have a value. */\r\nexport const normalizeGridSizes = (sizes?: TGridSizes): Required<TGridSizes> => {\r\n const { xs, sm, md, lg, xl } = sizes ?? {}\r\n return {\r\n xs: xs ?? DEFAULT_GRID_ITEM_SIZES.xs ?? 12,\r\n sm: sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.sm ?? 6,\r\n md: md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.md ?? 4,\r\n lg: lg ?? md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.lg ?? 3,\r\n xl: xl ?? lg ?? md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.xl ?? 3\r\n }\r\n}\r\n/** Resolves the active breakpoint based on the container width. */\r\nconst resolveActiveBreakpoint = (width: number): keyof TGridSizes => {\r\n if (width >= 1536) return 'xl'\r\n if (width >= 1200) return 'lg'\r\n if (width >= 900) return 'md'\r\n if (width >= 600) return 'sm'\r\n return 'xs'\r\n}\r\n/** Resolves the number of grid columns based on the container width and item sizes. */\r\nexport const resolveGridColumnsFromWidth = (width: number, sizes?: TGridSizes): number => {\r\n const normalized = normalizeGridSizes(sizes)\r\n const breakpoint = resolveActiveBreakpoint(width)\r\n const span = normalized[breakpoint] ?? 12\r\n const safeSpan = Math.min(12, Math.max(1, span))\r\n return Math.max(1, Math.floor(12 / safeSpan))\r\n}\r\n"],"names":["DEFAULT_GRID_SPACING_PX","resolveGridSpacing","_len","arguments","length","spacing","Array","_key","finalSpacing","filter","value","Math","max","apply","concat","_toConsumableArray","map","DEFAULT_GRID_SCROLLING_THRESHOLD_PX","resolveGridScrollingThreshold","_len2","threshold","_key2","finalThreshold","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","DEFAULT_GRID_ITEM_SIZES","xs","sm","md","lg","getGridItemSizes","sizes","normalizeGridSizes","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","_ref","xl","resolveGridColumnsFromWidth","width","_normalized$breakpoin","normalized","breakpoint","resolveActiveBreakpoint","span","safeSpan","min","floor"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../../src/data-surface/view-grid/helpers.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport type { TGridSizes } from './types'\r\n\r\n/** Default spacing between grid items in pixels. */\r\nexport const DEFAULT_GRID_SPACING_PX = 8\r\n/** Resolves the final grid spacing from multiple optional values. */\r\nexport const resolveGridSpacing = (...spacing: (number | undefined)[]) => {\r\n const finalSpacing = spacing.filter((value) => typeof value === 'number')\r\n if (finalSpacing.length === 0) return DEFAULT_GRID_SPACING_PX\r\n return Math.max(0, ...finalSpacing.map((value) => value ?? DEFAULT_GRID_SPACING_PX))\r\n}\r\n/** Default scrolling threshold in pixels for triggering near-end events. */\r\nexport const DEFAULT_GRID_SCROLLING_THRESHOLD_PX = 80\r\n/** Resolves the final scrolling threshold from multiple optional values. */\r\nexport const resolveGridScrollingThreshold = (...threshold: (number | undefined)[]) => {\r\n const finalThreshold = threshold.filter((value) => typeof value === 'number')\r\n if (finalThreshold.length === 0) return DEFAULT_GRID_SCROLLING_THRESHOLD_PX\r\n return Math.max(0, ...finalThreshold.map((value) => value ?? DEFAULT_GRID_SCROLLING_THRESHOLD_PX))\r\n}\r\n/** Default near-end threshold in pixels for triggering near-end events. */\r\nexport const DEFAULT_GRID_NEAR_END_THRESHOLD_PX = 80\r\n/** Resolves the final near-end threshold from multiple optional values. */\r\nexport const resolveGridNearEndThreshold = (...threshold: (number | undefined)[]) => {\r\n const finalThreshold = threshold.filter((value) => typeof value === 'number')\r\n if (finalThreshold.length === 0) return DEFAULT_GRID_NEAR_END_THRESHOLD_PX\r\n return Math.max(0, ...finalThreshold.map((value) => value ?? DEFAULT_GRID_NEAR_END_THRESHOLD_PX))\r\n}\r\n/** Default grid item height estimate in pixels, used for virtualization calculations. */\r\nexport const DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE = 120\r\n/** Default grid item sizes for each breakpoint. */\r\nexport const DEFAULT_GRID_ITEM_SIZES: TGridSizes = { xs: 12, sm: 6, md: 4, lg: 3 }\r\n/** Returns the grid item sizes, falling back to defaults if not provided. */\r\nexport const getGridItemSizes = (sizes?: TGridSizes): TGridSizes => {\r\n return sizes ?? DEFAULT_GRID_ITEM_SIZES\r\n}\r\n/** Normalizes grid item sizes, ensuring all breakpoints have a value. */\r\nexport const normalizeGridSizes = (sizes?: TGridSizes): Required<TGridSizes> => {\r\n const { xs, sm, md, lg, xl } = sizes ?? {}\r\n return {\r\n xs: xs ?? DEFAULT_GRID_ITEM_SIZES.xs ?? 12,\r\n sm: sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.sm ?? 6,\r\n md: md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.md ?? 4,\r\n lg: lg ?? md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.lg ?? 3,\r\n xl: xl ?? lg ?? md ?? sm ?? xs ?? DEFAULT_GRID_ITEM_SIZES.xl ?? 3\r\n }\r\n}\r\n/** Resolves the active breakpoint based on the container width. */\r\nconst resolveActiveBreakpoint = (width: number): keyof TGridSizes => {\r\n if (width >= 1536) return 'xl'\r\n if (width >= 1200) return 'lg'\r\n if (width >= 900) return 'md'\r\n if (width >= 600) return 'sm'\r\n return 'xs'\r\n}\r\n/** Resolves the number of grid columns based on the container width and item sizes. */\r\nexport const resolveGridColumnsFromWidth = (width: number, sizes?: TGridSizes): number => {\r\n const normalized = normalizeGridSizes(sizes)\r\n const breakpoint = resolveActiveBreakpoint(width)\r\n const span = normalized[breakpoint] ?? 12\r\n const safeSpan = Math.min(12, Math.max(1, span))\r\n return Math.max(1, Math.floor(12 / safeSpan))\r\n}\r\n"],"names":["DEFAULT_GRID_SPACING_PX","resolveGridSpacing","_len","arguments","length","spacing","Array","_key","finalSpacing","filter","value","Math","max","apply","concat","_toConsumableArray","map","DEFAULT_GRID_SCROLLING_THRESHOLD_PX","resolveGridScrollingThreshold","_len2","threshold","_key2","finalThreshold","DEFAULT_GRID_NEAR_END_THRESHOLD_PX","resolveGridNearEndThreshold","_len3","_key3","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","DEFAULT_GRID_ITEM_SIZES","xs","sm","md","lg","getGridItemSizes","sizes","normalizeGridSizes","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","_ref","xl","resolveGridColumnsFromWidth","width","_normalized$breakpoin","normalized","breakpoint","resolveActiveBreakpoint","span","safeSpan","min","floor"],"mappings":"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"}
@@ -1,2 +1,2 @@
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};
1
+ import{useMemo as n}from"react";import{GridItemDefault as o}from"./ui.units.js";import{getGridItemSizes as i,resolveGridNearEndThreshold as r,resolveGridScrollingThreshold as s,resolveGridSpacing as e}from"./helpers.js";var t=function(t,l){return n(function(){var n,a,p;return{spacing:e(t.spacing,l.spacing),scrollingThreshold:s(t.scrollingThreshold,l.scrollingThreshold),nearEndThreshold:r(t.nearEndThreshold,l.nearEndThreshold),sizes:i(null!==(n=t.sizes)&&void 0!==n?n:l.sizes),Component:null!==(a=null!==(p=t.Component)&&void 0!==p?p:l.Component)&&void 0!==a?a:o,normalOptions:Object.assign({autoHeight:!1},l.normalOptions,t.normalOptions),virtualizedOptions:Object.assign({overscan:4},l.virtualizedOptions,t.virtualizedOptions)}},[t,l])};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 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
+ {"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, resolveGridNearEndThreshold, 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 nearEndThreshold: resolveGridNearEndThreshold(props.nearEndThreshold, config.nearEndThreshold),\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","nearEndThreshold","resolveGridNearEndThreshold","sizes","getGridItemSizes","Component","GridItemDefault","normalOptions","Object","assign","autoHeight","virtualizedOptions","overscan"],"mappings":"4NAUO,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,iBAAkBC,EAA4BX,EAAMU,iBAAkBT,EAAOS,kBAC7EE,MAAOC,EAA4BV,QAAZA,EAACH,EAAMY,iBAAKT,EAAAA,EAAIF,EAAOW,OAC9CE,kBAASV,EAAiBC,QAAjBA,EAAEL,EAAMc,qBAAST,EAAAA,EAAIJ,EAAOa,iBAAS,IAAAV,EAAAA,EAAIW,EAClDC,cAAeC,OAAOC,OAAO,CAAEC,YAAY,GAASlB,EAAOe,cAAehB,EAAMgB,eAChFI,mBAAoBH,OAAOC,OAAO,CAAEG,SAAU,GAAKpB,EAAOmB,mBAAoBpB,EAAMoB,oBAExF,EAAG,CAACpB,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 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};
1
+ import{objectSpread2 as n,asyncToGenerator as e,regenerator as r,slicedToArray as t,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{Box as l,Grid as u}from"@mui/material";import{useCallback as c,useMemo as s,useRef as d,useState as v,useEffect as f,useLayoutEffect as h}from"react";import{useMergedConfig as p}from"./hooks.js";import{ViewGridStyled as g,viewGridClasses as m}from"./styleds.js";import{resolveGridSpacing as x,resolveGridColumnsFromWidth as T,DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE as I}from"./helpers.js";function S(e){var r=function(e){return function(r){var o,a=v(!1),c=t(a,2),h=c[0],x=c[1],T=d(null),I=p(r,e),S=I.Component,H=!0===(null===(o=I.normalOptions)||void 0===o?void 0:o.autoHeight),M="client"===r.featureMode,y=s(function(){return r.value},[r.value]);f(function(){M&&!H&&void 0!==r.scrollResetToken&&T.current&&(T.current.scrollTop=0)},[M,H,r.scrollResetToken]);var b=s(function(){var n=[m.root,m.normal];return h&&n.push(m.scrolling),H&&n.push(m.autoHeight),n.join(" ")},[h,H]);return i(g,{className:b,children:i(l,{className:m.scrollContainer,ref:T,onScroll:function(n){var e,t=n.currentTarget;x(t.scrollTop>I.scrollingThreshold),t.scrollHeight-t.scrollTop-t.clientHeight<=I.nearEndThreshold&&(null===(e=r.onNearEnd)||void 0===e||e.call(r))},children:i(u,{container:!0,spacing:"".concat(I.spacing,"px"),className:m.grid,children:y.map(function(r,t){var o,a=null!==(o=e.getterId(r,t))&&void 0!==o?o:t;return i(u,n(n({className:m.gridItem,item:!0},I.sizes),{},{children:i(S,{value:r,index:t})}),a)})})})})}}(e),S=function(n){return function(e){var r=s(function(){return e.value},[e.value]),u=p(e,n),S=u.sizes,H=u.virtualizedOptions,M=u.Component,y=d(null),b=d(new Map),z=d(null),N=d(!1),R=v(0),k=t(R,2),C=k[0],w=k[1],O=v(0),j=t(O,2),E=j[0],A=j[1],B=v(0),F=t(B,2),P=F[0],_=F[1],q=v(null),G=t(q,2),W=G[0],D=G[1],J=Math.max(1,H.overscan),K=x(u.spacing),L=P>u.scrollingThreshold,Q=null!=W?W:I;f(function(){"client"===e.featureMode&&void 0!==e.scrollResetToken&&(y.current&&(y.current.scrollTop=0),_(0))},[e.featureMode,e.scrollResetToken]),h(function(){if(y.current){var n=function(){var n,e,r,t,o=null!==(n=null===(e=y.current)||void 0===e?void 0:e.clientWidth)&&void 0!==n?n:0,i=null!==(r=null===(t=y.current)||void 0===t?void 0:t.clientHeight)&&void 0!==r?r:0;w(function(n){return n===o?n:o}),A(function(n){return n===i?n:i})};n();var e=new ResizeObserver(function(){return n()});return e.observe(y.current),function(){return e.disconnect()}}},[]);var U=T(C,S),V=Q+K,X=s(function(){var n=r.length;if(0===n)return{startRow:0,endRow:-1,topSpacerHeight:0,bottomSpacerHeight:0,startIndex:0,endIndex:-1};var e=Math.ceil(n/U),t=Math.max(1,E),o=P,i=Math.max(0,Math.floor(o/V)-J),a=Math.ceil(t/V),l=Math.min(e-1,i+a+2*J),u=i*U,c=Math.min(n-1,(l+1)*U-1);return{startRow:i,endRow:l,topSpacerHeight:i*V,bottomSpacerHeight:Math.max(0,(e-l-1)*V),startIndex:u,endIndex:c}},[U,r.length,J,V,P,E]),Y=X.endIndex>=X.startIndex?r.slice(X.startIndex,X.endIndex+1):[],Z=X.endIndex,$=s(function(){return{display:"grid",gap:"".concat(K,"px"),gridTemplateColumns:"repeat(".concat(U,", minmax(0, 1fr))")}},[U,K]),nn=c(function(){null!==z.current&&(cancelAnimationFrame(z.current),z.current=null)},[]),en=c(function(){N.current||null!==z.current||(z.current=requestAnimationFrame(function(){if(z.current=null,!N.current){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length){var e,r=0,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r=Math.max(r,a.getBoundingClientRect().height)}}catch(n){i.e(n)}finally{i.f()}r<=0||(N.current=!0,D(r))}}}))},[Z,X.startIndex]),rn=c(function(n,e){e?b.current.set(n,e):b.current.delete(n)},[]);h(function(){var n=Array.from(b.current.entries()).filter(function(n){var e=t(n,1)[0];return e>=X.startIndex&&e<=Z}).map(function(n){return t(n,2)[1]});if(0!==n.length&&!N.current){en();var e,r=new ResizeObserver(function(){en()}),i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;r.observe(a)}}catch(n){i.e(n)}finally{i.f()}return function(){r.disconnect(),nn()}}},[X.startIndex,Z,en,nn]),h(function(){return function(){nn()}},[nn]);var tn=[m.root,m.virtualized];return L&&tn.push(m.scrolling),i(g,{className:tn.filter(Boolean).join(" "),children:a(l,{ref:y,className:m.scrollContainer,onScroll:function(n){var r,t=n.currentTarget;_(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=u.nearEndThreshold&&(null===(r=e.onNearEnd)||void 0===r||r.call(e))},children:[X.topSpacerHeight>0?i(l,{sx:{height:X.topSpacerHeight}}):null,i(l,{sx:$,className:m.grid,children:Y.map(function(e,r){var t,o=X.startIndex+r,a=null!==(t=n.getterId(e,o))&&void 0!==t?t:o;return i(l,{className:m.gridItem,ref:N.current?void 0:function(n){return rn(o,n)},sx:null!==W?{minHeight:Q,height:Q}:void 0,children:i(M,{value:e,index:o})},a)})}),X.bottomSpacerHeight>0?i(l,{sx:{height:X.bottomSpacerHeight}}):null]})})}}(e);return function(t){var o,a,l=null!==(o=null!==(a=t.renderStrategy)&&void 0!==a?a:e.renderStrategy)&&void 0!==o?o:"normal";return i("virtualized"===l?S:r,n({},t))}}function H(n){return function(t){var o,a,l,u=c(e(r().m(function n(){var e,o,i,a,l,u,c,s,d;return r().w(function(n){for(;;)switch(n.n){case 0:if("infiniteScroll"===t.loadMode){n.n=1;break}return n.a(2);case 1:if(null!==(e=t.pagination)&&void 0!==e&&e.hasNext){n.n=2;break}return n.a(2);case 2:if(!t.loading){n.n=3;break}return n.a(2);case 3:return c=null!==(o=null===(i=t.pagination)||void 0===i?void 0:i.page)&&void 0!==o?o:0,s=null!==(a=null===(l=t.pagination)||void 0===l?void 0:l.pageSize)&&void 0!==a?a:20,d=c+1,n.n=4,null===(u=t.onPageChange)||void 0===u?void 0:u.call(t,d,s);case 4:return n.a(2)}},n)})),[t.loadMode,null===(o=t.pagination)||void 0===o?void 0:o.hasNext,null===(a=t.pagination)||void 0===a?void 0:a.page,null===(l=t.pagination)||void 0===l?void 0:l.pageSize,t.loading,t.onPageChange]);return i(n,{value:t.value,spacing:t.spacing,sizes:t.sizes,renderStrategy:t.renderStrategy,Component:t.Component,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?u:void 0,nearEndThreshold:t.nearEndThreshold,scrollResetToken:t.scrollResetToken})}}export{S as createViewGrid,H as createViewGridLoading,S as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-grid/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, Grid } from '@mui/material'\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { useMergedConfig } from './hooks'\r\nimport { ViewGridStyled, viewGridClasses as classes } from './styleds'\r\nimport { DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE, resolveGridColumnsFromWidth, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n// re-exports\r\nexport * from './types'\r\n\r\n//#region Normal\r\n/**\r\n * Creates a Grid view component that renders all items in the DOM. Suitable for small datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridNormal<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal: FC<IViewGridProps<T>> = (props) => {\r\n const [isScrolling, setIsScrolling] = useState(false)\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const ItemComponent = mergedConfig.Component\r\n const isAutoHeight = mergedConfig.normalOptions?.autoHeight === true\r\n const isClient = props.featureMode === 'client'\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [isClient, isAutoHeight, props.scrollResetToken])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setIsScrolling(t.scrollTop > mergedConfig.scrollingThreshold)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 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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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-grid/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, Grid } from '@mui/material'\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { useMergedConfig } from './hooks'\r\nimport { ViewGridStyled, viewGridClasses as classes } from './styleds'\r\nimport { DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE, resolveGridColumnsFromWidth, resolveGridSpacing } from './helpers'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IViewGridConfig, IViewGridProps } from './types'\r\n// re-exports\r\nexport * from './types'\r\n\r\n//#region Normal\r\n/**\r\n * Creates a Grid view component that renders all items in the DOM. Suitable for small datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridNormal<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal: FC<IViewGridProps<T>> = (props) => {\r\n const [isScrolling, setIsScrolling] = useState(false)\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const ItemComponent = mergedConfig.Component\r\n const isAutoHeight = mergedConfig.normalOptions?.autoHeight === true\r\n const isClient = props.featureMode === 'client'\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [isClient, isAutoHeight, props.scrollResetToken])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setIsScrolling(t.scrollTop > mergedConfig.scrollingThreshold)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isScrolling) l.push(classes.scrolling)\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isScrolling, isAutoHeight])\r\n\r\n return (\r\n <ViewGridStyled className={rootClasses}>\r\n <Box className={classes.scrollContainer} ref={scrollContainerRef} onScroll={handleScroll}>\r\n <Grid container spacing={`${mergedConfig.spacing}px`} className={classes.grid}>\r\n {finalItems.map((item, index) => {\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Grid key={key} className={classes.gridItem} item {...mergedConfig.sizes}>\r\n <ItemComponent value={item} index={index} />\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridNormal\r\n}\r\n//#endregion\r\n//#region Virtualized\r\n/**\r\n * Creates a Grid view component that virtualizes items, rendering only those visible in the viewport. Suitable for large datasets.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a virtualized grid view based on the provided configuration and props.\r\n */\r\nfunction createViewGridVirtualized<T>(config: IViewGridConfig<T>) {\r\n const ViewGridVirtualized: FC<IViewGridProps<T>> = (props) => {\r\n const finalItems = useMemo(() => props.value, [props.value])\r\n\r\n const mergedConfig = useMergedConfig<T>(props, config)\r\n const { sizes, virtualizedOptions } = mergedConfig\r\n const ItemComponent = mergedConfig.Component\r\n\r\n // Track container geometry and the first measured item height used for virtualization math.\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const measuredItemsRef = useRef(new Map<number, HTMLDivElement>())\r\n const measurementRafRef = useRef<number | null>(null)\r\n const hasMeasuredDatasetRef = useRef(false)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [measuredItemHeight, setMeasuredItemHeight] = useState<number | null>(null)\r\n\r\n const overscan = Math.max(1, virtualizedOptions.overscan)\r\n const spacingPx = resolveGridSpacing(mergedConfig.spacing)\r\n const isScrolling = scrollTopState > mergedConfig.scrollingThreshold\r\n const effectiveItemHeight = measuredItemHeight ?? DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n // Keep viewport dimensions in sync so column count and window size react to container resize.\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextWidth = wrapRef.current?.clientWidth ?? 0\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const columns = resolveGridColumnsFromWidth(containerWidth, sizes)\r\n const rowHeight = effectiveItemHeight + spacingPx\r\n\r\n // Convert scroll position into a virtual row window plus spacer heights above and below.\r\n const windowed = useMemo(() => {\r\n const totalItems = finalItems.length\r\n if (totalItems === 0) {\r\n return { startRow: 0, endRow: -1, topSpacerHeight: 0, bottomSpacerHeight: 0, startIndex: 0, endIndex: -1 }\r\n }\r\n\r\n const totalRows = Math.ceil(totalItems / columns)\r\n const safeViewportHeight = Math.max(1, containerHeight)\r\n const effectiveScrollTop = scrollTopState\r\n const startRow = Math.max(0, Math.floor(effectiveScrollTop / rowHeight) - overscan)\r\n const visibleRows = Math.ceil(safeViewportHeight / rowHeight)\r\n const endRow = Math.min(totalRows - 1, startRow + visibleRows + overscan * 2)\r\n const startIndex = startRow * columns\r\n const endIndex = Math.min(totalItems - 1, (endRow + 1) * columns - 1)\r\n const topSpacerHeight = startRow * rowHeight\r\n const bottomSpacerHeight = Math.max(0, (totalRows - endRow - 1) * rowHeight)\r\n\r\n return { startRow, endRow, topSpacerHeight, bottomSpacerHeight, startIndex, endIndex }\r\n }, [columns, finalItems.length, overscan, rowHeight, scrollTopState, containerHeight])\r\n\r\n const visibleItems = windowed.endIndex >= windowed.startIndex ? finalItems.slice(windowed.startIndex, windowed.endIndex + 1) : []\r\n const measurementEndIndex = windowed.endIndex\r\n const contentSx = useMemo<BoxProps['sx']>(() => {\r\n return {\r\n display: 'grid',\r\n gap: `${spacingPx}px`,\r\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`\r\n }\r\n }, [columns, spacingPx])\r\n\r\n const handleScroll: BoxProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n const cancelScheduledMeasurement = useCallback(() => {\r\n if (measurementRafRef.current === null) return\r\n cancelAnimationFrame(measurementRafRef.current)\r\n measurementRafRef.current = null\r\n }, [])\r\n\r\n // Measure the largest item in the first rendered window once, then reuse it permanently.\r\n const scheduleMeasuredHeightUpdate = useCallback(() => {\r\n if (hasMeasuredDatasetRef.current || measurementRafRef.current !== null) return\r\n\r\n measurementRafRef.current = requestAnimationFrame(() => {\r\n measurementRafRef.current = null\r\n if (hasMeasuredDatasetRef.current) return\r\n\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0) return\r\n\r\n let nextHeight = 0\r\n for (const element of elements) {\r\n nextHeight = Math.max(nextHeight, element.getBoundingClientRect().height)\r\n }\r\n\r\n if (nextHeight <= 0) return\r\n\r\n hasMeasuredDatasetRef.current = true\r\n setMeasuredItemHeight(nextHeight)\r\n })\r\n }, [measurementEndIndex, windowed.startIndex])\r\n\r\n const setMeasuredItemRef = useCallback((index: number, node: HTMLDivElement | null) => {\r\n if (node) {\r\n measuredItemsRef.current.set(index, node)\r\n return\r\n }\r\n\r\n measuredItemsRef.current.delete(index)\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const elements = Array.from(measuredItemsRef.current.entries())\r\n .filter(([index]) => index >= windowed.startIndex && index <= measurementEndIndex)\r\n .map(([, element]) => element)\r\n\r\n if (elements.length === 0 || hasMeasuredDatasetRef.current) return\r\n\r\n scheduleMeasuredHeightUpdate()\r\n\r\n const observer = new ResizeObserver(() => {\r\n scheduleMeasuredHeightUpdate()\r\n })\r\n\r\n for (const element of elements) {\r\n observer.observe(element)\r\n }\r\n\r\n return () => {\r\n observer.disconnect()\r\n cancelScheduledMeasurement()\r\n }\r\n }, [windowed.startIndex, measurementEndIndex, scheduleMeasuredHeightUpdate, cancelScheduledMeasurement])\r\n\r\n useLayoutEffect(() => {\r\n return () => {\r\n cancelScheduledMeasurement()\r\n }\r\n }, [cancelScheduledMeasurement])\r\n\r\n const rootClasses = [classes.root, classes.virtualized]\r\n if (isScrolling) rootClasses.push(classes.scrolling)\r\n return (\r\n <ViewGridStyled className={rootClasses.filter(Boolean).join(' ')}>\r\n <Box ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n {/* Spacer keeps total scroll height stable for rows rendered before the current window. */}\r\n {windowed.topSpacerHeight > 0 ? <Box sx={{ height: windowed.topSpacerHeight }} /> : null}\r\n\r\n <Box sx={contentSx} className={classes.grid}>\r\n {visibleItems.map((item, offset) => {\r\n const index = windowed.startIndex + offset\r\n const key = config.getterId(item, index) ?? index\r\n return (\r\n <Box\r\n key={key}\r\n className={classes.gridItem}\r\n ref={!hasMeasuredDatasetRef.current ? (node) => setMeasuredItemRef(index, node as HTMLDivElement | null) : undefined}\r\n sx={measuredItemHeight !== null ? { minHeight: effectiveItemHeight, height: effectiveItemHeight } : undefined}\r\n >\r\n <ItemComponent value={item} index={index} />\r\n </Box>\r\n )\r\n })}\r\n </Box>\r\n\r\n {/* Spacer keeps total scroll height stable for rows rendered after the current window. */}\r\n {windowed.bottomSpacerHeight > 0 ? <Box sx={{ height: windowed.bottomSpacerHeight }} /> : null}\r\n </Box>\r\n </ViewGridStyled>\r\n )\r\n }\r\n return ViewGridVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\n/**\r\n * Factory function to create a Grid view component that can switch between normal and virtualized rendering strategies based on props and configuration.\r\n * @param config - The configuration object for the grid view, containing default settings and required properties.\r\n * @returns A React functional component that renders a grid view based on the provided configuration and props, supporting both normal and virtualized rendering strategies.\r\n */\r\nexport function createViewGrid<T>(config: IViewGridConfig<T>) {\r\n const ViewGridNormal = createViewGridNormal<T>(config)\r\n const ViewGridVirtualized = createViewGridVirtualized<T>(config)\r\n\r\n const ViewGrid: FC<IViewGridProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewGridVirtualized {...props} />\r\n }\r\n return <ViewGridNormal {...props} />\r\n }\r\n return ViewGrid\r\n}\r\n\r\nexport interface IViewGridLoadingProps<T> extends IViewGridProps<T> {\r\n value: T[]\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewGridLoading<T>(GridComponent: ComponentType<IViewGridProps<T>>) {\r\n const ViewGridLoading: FC<IViewGridLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <GridComponent\r\n value={props.value}\r\n spacing={props.spacing}\r\n sizes={props.sizes}\r\n renderStrategy={props.renderStrategy}\r\n Component={props.Component}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n nearEndThreshold={props.nearEndThreshold}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewGridLoading\r\n}\r\n\r\nexport default createViewGrid\r\n//#endregion\r\n"],"names":["createViewGrid","config","ViewGridNormal","props","_mergedConfig$normalO","_useState","useState","_useState2","_slicedToArray","isScrolling","setIsScrolling","scrollContainerRef","useRef","mergedConfig","useMergedConfig","ItemComponent","Component","isAutoHeight","normalOptions","autoHeight","isClient","featureMode","finalItems","useMemo","value","useEffect","undefined","scrollResetToken","current","scrollTop","rootClasses","l","classes","root","normal","push","scrolling","join","_jsx","ViewGridStyled","className","children","Box","scrollContainer","ref","onScroll","e","_props$onNearEnd","t","currentTarget","scrollingThreshold","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Grid","container","spacing","concat","grid","map","item","index","_config$getterId","key","getterId","_objectSpread","gridItem","sizes","createViewGridNormal","ViewGridVirtualized","virtualizedOptions","wrapRef","measuredItemsRef","Map","measurementRafRef","hasMeasuredDatasetRef","_useState3","_useState4","containerWidth","setContainerWidth","_useState5","_useState6","containerHeight","setContainerHeight","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","_useState0","measuredItemHeight","setMeasuredItemHeight","overscan","Math","max","spacingPx","resolveGridSpacing","effectiveItemHeight","DEFAULT_GRID_ITEM_HEIGHT_ESTIMATE","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","_wrapRef$current$clie2","_wrapRef$current2","nextWidth","clientWidth","nextHeight","prev","observer","ResizeObserver","observe","disconnect","columns","resolveGridColumnsFromWidth","rowHeight","windowed","totalItems","length","startRow","endRow","topSpacerHeight","bottomSpacerHeight","startIndex","endIndex","totalRows","ceil","safeViewportHeight","effectiveScrollTop","floor","visibleRows","min","visibleItems","slice","measurementEndIndex","contentSx","display","gap","gridTemplateColumns","cancelScheduledMeasurement","useCallback","cancelAnimationFrame","scheduleMeasuredHeightUpdate","requestAnimationFrame","elements","Array","from","entries","filter","_ref","_ref3","_step","_iterator","_createForOfIteratorHelper","s","n","done","element","getBoundingClientRect","height","err","f","setMeasuredItemRef","node","set","_ref5","_ref7","_step2","_iterator2","virtualized","Boolean","_jsxs","_props$onNearEnd2","sx","offset","_config$getterId2","minHeight","createViewGridVirtualized","_ref9","_props$renderStrategy","renderStrategy","createViewGridLoading","GridComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,slicedToArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as n,Fragment as a}from"react/jsx-runtime";import{useMemo as r,useState as o}from"react";import{styled as l,Box as c,Typography as m,Tooltip as p,Chip as s}from"@mui/material";import u from"@mui/icons-material/MoreHoriz";function h(){var e=function(e){var i=e.item,t=e.group,a=e.onRemove,r=t.field,o=t.label,l=i.label||i.value.toString();return n(s,{size:"small",title:l,label:l,className:d.itemChip,onDelete:a?function(){return a(r,i.value)}:void 0},"".concat(o,"-").concat(i.value))},l=function(r){var l=o(!1),c=i(l,2),m=c[0],h=c[1],f=r.group,g=r.onRemove,v=r.enableMinimalesticView,b=f.items;if(v&&b.length>1&&!m)return t(a,{children:[n(p,{title:"".concat(b.length-1," more, click to expand"),placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),label:"".concat(b.length-1,"+"),size:"small",className:d.itemChip,style:{opacity:.7},onClick:function(){return h(!0)}})}),n(e,{item:b[b.length-1],group:f,onRemove:g})]});var C=m&&b.length>1;return t(a,{children:[C&&n(p,{title:"Show less",placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),size:"small",className:d.itemChip,sx:{opacity:.7,".MuiChip-label":{pl:0}},onClick:function(){return h(!1)}})}),b.map(function(i){return n(e,{item:i,group:f,onRemove:g},i.value.toString())})]})};return function(e){var i=e.value,a=void 0===i?[]:i,o=e.onRemove,c=e.placement,p=e.label,s=e.enableMinimalesticView,u=[d.item];"vertical"===c?u.push(d.itemVertical):"horizontal"===c&&u.push(d.itemHorizontal);var h=r(function(){return a?(Array.isArray(a)?a:[a]).filter(function(e){return e.items&&e.items.length>0}):[]},[a]);return 0===h.length?null:t(f,{sx:e.sx,className:u.filter(Boolean).join(" "),children:[Boolean(p)&&t(m,{variant:"caption",className:d.itemLabel,children:[p||"ChipViewer",":"]}),n("div",{className:d.itemContent,children:h.map(function(e){var i=e.field,a=e.label;return t("div",{className:d.itemGroup,children:[a&&t(m,{variant:"caption",className:d.itemLabel,children:[a,":"]}),n(l,{group:e,onRemove:o,enableMinimalesticView:s})]},i.toString())})})]})}}var d={item:"DinoChipViewer-item",itemLabel:"DinoChipViewer-itemLabel",itemChip:"DinoChipViewer-itemChip",itemGroup:"DinoChipViewer-itemGroup",itemContent:"DinoChipViewer-itemContent",sort:"DinoChipViewer-sort",itemVertical:"DinoChipViewer-itemVertical",itemHorizontal:"DinoChipViewer-itemHorizontal"},f=l(c)(function(i){var t=i.theme;return e(e(e(e(e({},".".concat(d.itemLabel),{fontWeight:700,marginLeft:t.spacing(.5),lineHeight:1}),".".concat(d.itemChip),{borderRadius:"4px",maxWidth:"100px","& .MuiChip-label":{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}),".".concat(d.itemGroup),{display:"flex",flexWrap:"wrap",border:"dashed 1px ".concat(t.palette.divider),borderRadius:t.shape.borderRadius,alignItems:"center",padding:t.spacing(.25),gap:t.spacing(.5)}),".".concat(d.itemContent),e({display:"flex",flexWrap:"wrap",gap:t.spacing(.5)},".".concat(d.itemLabel),{fontWeight:500,color:t.palette.text.secondary})),"&.".concat(d.item),e(e({display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(1),padding:t.spacing(.25,.5),"&:last-child":{marginBottom:0,borderBottom:"none",paddingBottom:0}},"&.".concat(d.sort),{".MuiChip-label > div":{display:"flex",alignItems:"center",gap:4},".MuiSvgIcon-root":{fontSize:12}}),"&.".concat(d.itemVertical),{flexDirection:"column",alignItems:"flex-start"}))});export{h as createChipViewers};
1
+ import{defineProperty as e,slicedToArray as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsxs as t,jsx as n,Fragment as o}from"react/jsx-runtime";import{useMemo as a,useState as r}from"react";import{styled as l,Box as c,Typography as m,Tooltip as p,Chip as s}from"@mui/material";import u from"@mui/icons-material/MoreHoriz";function h(){var e=function(e){var i=e.item,t=e.group,o=e.onRemove,a=t.field,r=t.label,l=t.chipMinWidth,c=i.label||i.value.toString();return n(s,{size:"small",title:c,label:c,className:d.itemChip,sx:l?{minWidth:l}:void 0,onDelete:o?function(){return o(a,i.value)}:void 0},"".concat(r,"-").concat(i.value))},l=function(a){var l=r(!1),c=i(l,2),m=c[0],h=c[1],f=a.group,g=a.onRemove,v=a.enableMinimalesticView,w=a.forceShowAll,b=f.items;if(v&&b.length>1&&!m&&!w)return t(o,{children:[n(p,{title:"".concat(b.length-1," more, click to expand"),placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),label:"".concat(b.length-1,"+"),size:"small",className:d.itemChip,style:{opacity:.7},onClick:function(){return h(!0)}})}),n(e,{item:b[b.length-1],group:f,onRemove:g})]});var C=m&&b.length>1;return t(o,{children:[C&&n(p,{title:"Show less",placement:"top",arrow:!0,children:n(s,{icon:n(u,{fontSize:"small"}),size:"small",className:d.itemChip,sx:{opacity:.7,".MuiChip-label":{pl:0}},onClick:function(){return h(!1)}})}),b.map(function(i){return n(e,{item:i,group:f,onRemove:g},i.value.toString())})]})};return function(e){var i=e.value,o=void 0===i?[]:i,r=e.onRemove,c=e.placement,p=e.label,s=e.enableMinimalesticView,u=e.forceShowAll,h=[d.item];"vertical"===c?h.push(d.itemVertical):"horizontal"===c&&h.push(d.itemHorizontal);var g=a(function(){return o?(Array.isArray(o)?o:[o]).filter(function(e){return e.items&&e.items.length>0}):[]},[o]);return 0===g.length?null:t(f,{sx:e.sx,className:h.filter(Boolean).join(" "),children:[Boolean(p)&&t(m,{variant:"caption",className:d.itemLabel,children:[p||"ChipViewer",":"]}),n("div",{className:d.itemContent,children:g.map(function(e){var i=e.field,o=e.label;return t("div",{className:d.itemGroup,children:[o&&t(m,{variant:"caption",className:d.itemLabel,children:[o,":"]}),n(l,{group:e,onRemove:r,enableMinimalesticView:s,forceShowAll:u})]},i.toString())})})]})}}var d={item:"DinoChipViewer-item",itemLabel:"DinoChipViewer-itemLabel",itemChip:"DinoChipViewer-itemChip",itemGroup:"DinoChipViewer-itemGroup",itemContent:"DinoChipViewer-itemContent",sort:"DinoChipViewer-sort",itemVertical:"DinoChipViewer-itemVertical",itemHorizontal:"DinoChipViewer-itemHorizontal"},f=l(c)(function(i){var t=i.theme;return e(e(e(e(e({},".".concat(d.itemLabel),{fontWeight:700,marginLeft:t.spacing(.5),lineHeight:1}),".".concat(d.itemChip),{borderRadius:"4px",maxWidth:"100px","& .MuiChip-label":{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}}),".".concat(d.itemGroup),{display:"flex",flexWrap:"wrap",border:"dashed 1px ".concat(t.palette.divider),borderRadius:t.shape.borderRadius,alignItems:"center",padding:t.spacing(.25),gap:t.spacing(.5)}),".".concat(d.itemContent),e({display:"flex",flexWrap:"wrap",gap:t.spacing(.5)},".".concat(d.itemLabel),{fontWeight:500,color:t.palette.text.secondary})),"&.".concat(d.item),e(e({display:"flex",flexDirection:"row",alignItems:"center",gap:t.spacing(1),padding:t.spacing(.25,.5),"&:last-child":{marginBottom:0,borderBottom:"none",paddingBottom:0}},"&.".concat(d.sort),{".MuiChip-label > div":{display:"flex",alignItems:"center",gap:4},".MuiSvgIcon-root":{fontSize:12}}),"&.".concat(d.itemVertical),{flexDirection:"column",alignItems:"flex-start"}))});export{h as createChipViewers};
2
2
  //# sourceMappingURL=chip-viewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chip-viewer.js","sources":["../../../../src/filter-bar/components/chip-viewer.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Chip, styled, Tooltip, Typography } from '@mui/material'\r\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { SxProps, Theme } from '@mui/material'\r\nimport type { TFieldType, TFieldValid } from '../types'\r\n\r\nexport interface IChipViewerItem<O = any> {\r\n value: TFieldValid\r\n label?: string\r\n other?: O\r\n}\r\n\r\nexport interface TChipViewerGroup<T, O = any> {\r\n field: TFieldType<T>\r\n label?: string\r\n items: IChipViewerItem<O>[]\r\n}\r\n\r\nexport type TOnRemoveFilterFunc<T> = (field: TFieldType<T>, value: TFieldValid) => void\r\n\r\ninterface IChipViewerProps<T> {\r\n value?: TChipViewerGroup<T> | TChipViewerGroup<T>[]\r\n onRemove?: TOnRemoveFilterFunc<T>\r\n placement?: 'vertical' | 'horizontal'\r\n /** Option to set a custom label for the group. */\r\n label?: string | boolean\r\n /** Enable minimalistic view: only show the last item, hide the rest as an icon at the start */\r\n enableMinimalesticView?: boolean\r\n sx?: SxProps<Theme>\r\n}\r\n\r\ninterface IChipItemProps<T> extends Pick<IChipViewerProps<T>, 'onRemove'> {\r\n item: IChipViewerItem\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\ninterface IChipListProps<T> extends Pick<IChipViewerProps<T>, 'onRemove' | 'enableMinimalesticView'> {\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\nexport function createChipViewers<T>() {\r\n const ChipItem: FC<IChipItemProps<T>> = (props) => {\r\n const { item, group, onRemove } = props\r\n const { field, label } = group\r\n const itemLabel = item.label || item.value.toString()\r\n return (\r\n <Chip\r\n key={`${label}-${item.value}`}\r\n size='small'\r\n title={itemLabel}\r\n label={itemLabel}\r\n className={classes.itemChip}\r\n onDelete={onRemove ? () => onRemove(field, item.value) : undefined}\r\n />\r\n )\r\n }\r\n\r\n const ChipList: FC<IChipListProps<T>> = (props) => {\r\n const [expanded, setExpanded] = useState<boolean>(false)\r\n const { group, onRemove, enableMinimalesticView } = props\r\n const { items } = group\r\n const isMinimalistic = enableMinimalesticView && items.length > 1 && !expanded\r\n if (isMinimalistic) {\r\n return (\r\n <>\r\n <Tooltip title={`${items.length - 1} more, click to expand`} placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n label={`${items.length - 1}+`}\r\n size='small'\r\n className={classes.itemChip}\r\n style={{ opacity: 0.7 }}\r\n onClick={() => setExpanded(true)}\r\n />\r\n </Tooltip>\r\n <ChipItem item={items[items.length - 1]} group={group} onRemove={onRemove} />\r\n </>\r\n )\r\n }\r\n const isBtnShowLess = expanded && items.length > 1\r\n return (\r\n <>\r\n {isBtnShowLess && (\r\n <Tooltip title='Show less' placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n // label={false}\r\n size='small'\r\n className={classes.itemChip}\r\n sx={{ opacity: 0.7, '.MuiChip-label': { pl: 0 } }}\r\n onClick={() => setExpanded(false)}\r\n />\r\n </Tooltip>\r\n )}\r\n {items.map((item) => (\r\n <ChipItem key={item.value.toString()} item={item} group={group} onRemove={onRemove} />\r\n ))}\r\n </>\r\n )\r\n }\r\n\r\n const ChipViewer: FC<IChipViewerProps<T>> = (props) => {\r\n const { value = [], onRemove, placement, label, enableMinimalesticView } = props\r\n\r\n const rootClasses = [classes.item]\r\n if (placement === 'vertical') rootClasses.push(classes.itemVertical)\r\n else if (placement === 'horizontal') rootClasses.push(classes.itemHorizontal)\r\n\r\n const data = useMemo(() => {\r\n if (!value) return []\r\n const valueArray = Array.isArray(value) ? value : [value]\r\n return valueArray.filter((group) => group.items && group.items.length > 0)\r\n }, [value])\r\n\r\n if (data.length === 0) return null\r\n\r\n return (\r\n <ItemStyled sx={props.sx} className={rootClasses.filter(Boolean).join(' ')}>\r\n {Boolean(label) && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label || 'ChipViewer'}:\r\n </Typography>\r\n )}\r\n <div className={classes.itemContent}>\r\n {data.map((group) => {\r\n const { field, label } = group\r\n return (\r\n <div key={field.toString()} className={classes.itemGroup}>\r\n {label && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label}:\r\n </Typography>\r\n )}\r\n <ChipList group={group} onRemove={onRemove} enableMinimalesticView={enableMinimalesticView} />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </ItemStyled>\r\n )\r\n }\r\n\r\n return ChipViewer\r\n}\r\n\r\n//#region styles\r\nconst chipViewerClasses = {\r\n root: 'DinoChipViewer-root',\r\n item: 'DinoChipViewer-item',\r\n itemLabel: 'DinoChipViewer-itemLabel',\r\n itemChip: 'DinoChipViewer-itemChip',\r\n itemGroup: 'DinoChipViewer-itemGroup',\r\n itemContent: 'DinoChipViewer-itemContent',\r\n sort: 'DinoChipViewer-sort',\r\n itemVertical: 'DinoChipViewer-itemVertical',\r\n itemHorizontal: 'DinoChipViewer-itemHorizontal'\r\n}\r\n\r\nconst classes = chipViewerClasses\r\n\r\nconst ItemStyled = styled(Box)(({ theme }) => ({\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 700,\r\n marginLeft: theme.spacing(0.5),\r\n lineHeight: 1\r\n },\r\n [`.${classes.itemChip}`]: {\r\n borderRadius: '4px',\r\n maxWidth: '100px',\r\n '& .MuiChip-label': { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\r\n },\r\n [`.${classes.itemGroup}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n border: `dashed 1px ${theme.palette.divider}`,\r\n borderRadius: theme.shape.borderRadius,\r\n alignItems: 'center',\r\n padding: theme.spacing(0.25),\r\n gap: theme.spacing(0.5)\r\n },\r\n [`.${classes.itemContent}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: theme.spacing(0.5),\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 500,\r\n color: theme.palette.text.secondary\r\n }\r\n },\r\n [`&.${classes.item}`]: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(0.25, 0.5),\r\n // borderBottom: `1px solid ${theme.palette.grey[100]}`,\r\n '&:last-child': { marginBottom: 0, borderBottom: 'none', paddingBottom: 0 },\r\n [`&.${classes.sort}`]: {\r\n '.MuiChip-label > div': { display: 'flex', alignItems: 'center', gap: 4 },\r\n '.MuiSvgIcon-root': { fontSize: 12 }\r\n },\r\n [`&.${classes.itemVertical}`]: { flexDirection: 'column', alignItems: 'flex-start' }\r\n // [`&.${classes.itemHorizontal}`]: { flexDirection: 'row', alignItems: 'center' }\r\n }\r\n}))\r\n//#endregion\r\n"],"names":["createChipViewers","ChipItem","props","item","group","onRemove","field","label","itemLabel","value","toString","_jsx","Chip","size","title","className","classes","itemChip","onDelete","undefined","concat","ChipList","_useState","useState","_useState2","_slicedToArray","expanded","setExpanded","enableMinimalesticView","items","length","_jsxs","Tooltip","placement","arrow","children","icon","MoreHorizIcon","fontSize","style","opacity","onClick","isBtnShowLess","_Fragment","sx","pl","map","_props$value","rootClasses","push","itemVertical","itemHorizontal","data","useMemo","Array","isArray","filter","ItemStyled","Boolean","join","Typography","variant","itemContent","itemGroup","sort","styled","Box","_ref","theme","_defineProperty","fontWeight","marginLeft","spacing","lineHeight","borderRadius","maxWidth","whiteSpace","overflow","textOverflow","display","flexWrap","border","palette","divider","shape","alignItems","padding","gap","color","text","secondary","flexDirection","marginBottom","borderBottom","paddingBottom"],"mappings":"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"}
1
+ {"version":3,"file":"chip-viewer.js","sources":["../../../../src/filter-bar/components/chip-viewer.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Chip, styled, Tooltip, Typography } from '@mui/material'\r\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { SxProps, Theme } from '@mui/material'\r\nimport type { TFieldType, TFieldValid } from '../types'\r\n\r\nexport interface IChipViewerItem<O = any> {\r\n value: TFieldValid\r\n label?: string\r\n other?: O\r\n}\r\n\r\nexport interface TChipViewerGroup<T, O = any> {\r\n field: TFieldType<T>\r\n label?: string\r\n items: IChipViewerItem<O>[]\r\n chipMinWidth?: number | string\r\n}\r\n\r\nexport type TOnRemoveFilterFunc<T> = (field: TFieldType<T>, value: TFieldValid) => void\r\n\r\ninterface IChipViewerProps<T> {\r\n value?: TChipViewerGroup<T> | TChipViewerGroup<T>[]\r\n onRemove?: TOnRemoveFilterFunc<T>\r\n placement?: 'vertical' | 'horizontal'\r\n /** Option to set a custom label for the group. */\r\n label?: string | boolean\r\n /** Enable minimalistic view: only show the last item, hide the rest as an icon at the start */\r\n enableMinimalesticView?: boolean\r\n sx?: SxProps<Theme>\r\n forceShowAll?: boolean\r\n}\r\n\r\ninterface IChipItemProps<T> extends Pick<IChipViewerProps<T>, 'onRemove'> {\r\n item: IChipViewerItem\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\ninterface IChipListProps<T> extends Pick<IChipViewerProps<T>, 'onRemove' | 'enableMinimalesticView' | 'forceShowAll'> {\r\n group: TChipViewerGroup<T>\r\n}\r\n\r\nexport function createChipViewers<T>() {\r\n const ChipItem: FC<IChipItemProps<T>> = (props) => {\r\n const { item, group, onRemove } = props\r\n const { field, label, chipMinWidth } = group\r\n const itemLabel = item.label || item.value.toString()\r\n return (\r\n <Chip\r\n key={`${label}-${item.value}`}\r\n size='small'\r\n title={itemLabel}\r\n label={itemLabel}\r\n className={classes.itemChip}\r\n sx={chipMinWidth ? { minWidth: chipMinWidth } : undefined}\r\n onDelete={onRemove ? () => onRemove(field, item.value) : undefined}\r\n />\r\n )\r\n }\r\n\r\n const ChipList: FC<IChipListProps<T>> = (props) => {\r\n const [expanded, setExpanded] = useState<boolean>(false)\r\n const { group, onRemove, enableMinimalesticView, forceShowAll } = props\r\n const { items } = group\r\n const isMinimalistic = enableMinimalesticView && items.length > 1 && !expanded && !forceShowAll\r\n if (isMinimalistic) {\r\n return (\r\n <>\r\n <Tooltip title={`${items.length - 1} more, click to expand`} placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n label={`${items.length - 1}+`}\r\n size='small'\r\n className={classes.itemChip}\r\n style={{ opacity: 0.7 }}\r\n onClick={() => setExpanded(true)}\r\n />\r\n </Tooltip>\r\n <ChipItem item={items[items.length - 1]} group={group} onRemove={onRemove} />\r\n </>\r\n )\r\n }\r\n const isBtnShowLess = expanded && items.length > 1\r\n return (\r\n <>\r\n {isBtnShowLess && (\r\n <Tooltip title='Show less' placement='top' arrow>\r\n <Chip\r\n icon={<MoreHorizIcon fontSize='small' />}\r\n // label={false}\r\n size='small'\r\n className={classes.itemChip}\r\n sx={{ opacity: 0.7, '.MuiChip-label': { pl: 0 } }}\r\n onClick={() => setExpanded(false)}\r\n />\r\n </Tooltip>\r\n )}\r\n {items.map((item) => (\r\n <ChipItem key={item.value.toString()} item={item} group={group} onRemove={onRemove} />\r\n ))}\r\n </>\r\n )\r\n }\r\n\r\n const ChipViewer: FC<IChipViewerProps<T>> = (props) => {\r\n const { value = [], onRemove, placement, label, enableMinimalesticView, forceShowAll } = props\r\n\r\n const rootClasses = [classes.item]\r\n if (placement === 'vertical') rootClasses.push(classes.itemVertical)\r\n else if (placement === 'horizontal') rootClasses.push(classes.itemHorizontal)\r\n\r\n const data = useMemo(() => {\r\n if (!value) return []\r\n const valueArray = Array.isArray(value) ? value : [value]\r\n return valueArray.filter((group) => group.items && group.items.length > 0)\r\n }, [value])\r\n\r\n if (data.length === 0) return null\r\n\r\n return (\r\n <ItemStyled sx={props.sx} className={rootClasses.filter(Boolean).join(' ')}>\r\n {Boolean(label) && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label || 'ChipViewer'}:\r\n </Typography>\r\n )}\r\n <div className={classes.itemContent}>\r\n {data.map((group) => {\r\n const { field, label } = group\r\n return (\r\n <div key={field.toString()} className={classes.itemGroup}>\r\n {label && (\r\n <Typography variant='caption' className={classes.itemLabel}>\r\n {label}:\r\n </Typography>\r\n )}\r\n <ChipList group={group} onRemove={onRemove} enableMinimalesticView={enableMinimalesticView} forceShowAll={forceShowAll} />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </ItemStyled>\r\n )\r\n }\r\n\r\n return ChipViewer\r\n}\r\n\r\n//#region styles\r\nconst chipViewerClasses = {\r\n root: 'DinoChipViewer-root',\r\n item: 'DinoChipViewer-item',\r\n itemLabel: 'DinoChipViewer-itemLabel',\r\n itemChip: 'DinoChipViewer-itemChip',\r\n itemGroup: 'DinoChipViewer-itemGroup',\r\n itemContent: 'DinoChipViewer-itemContent',\r\n sort: 'DinoChipViewer-sort',\r\n itemVertical: 'DinoChipViewer-itemVertical',\r\n itemHorizontal: 'DinoChipViewer-itemHorizontal'\r\n}\r\n\r\nconst classes = chipViewerClasses\r\n\r\nconst ItemStyled = styled(Box)(({ theme }) => ({\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 700,\r\n marginLeft: theme.spacing(0.5),\r\n lineHeight: 1\r\n },\r\n [`.${classes.itemChip}`]: {\r\n borderRadius: '4px',\r\n maxWidth: '100px',\r\n '& .MuiChip-label': { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }\r\n },\r\n [`.${classes.itemGroup}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n border: `dashed 1px ${theme.palette.divider}`,\r\n borderRadius: theme.shape.borderRadius,\r\n alignItems: 'center',\r\n padding: theme.spacing(0.25),\r\n gap: theme.spacing(0.5)\r\n },\r\n [`.${classes.itemContent}`]: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n gap: theme.spacing(0.5),\r\n [`.${classes.itemLabel}`]: {\r\n fontWeight: 500,\r\n color: theme.palette.text.secondary\r\n }\r\n },\r\n [`&.${classes.item}`]: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n padding: theme.spacing(0.25, 0.5),\r\n // borderBottom: `1px solid ${theme.palette.grey[100]}`,\r\n '&:last-child': { marginBottom: 0, borderBottom: 'none', paddingBottom: 0 },\r\n [`&.${classes.sort}`]: {\r\n '.MuiChip-label > div': { display: 'flex', alignItems: 'center', gap: 4 },\r\n '.MuiSvgIcon-root': { fontSize: 12 }\r\n },\r\n [`&.${classes.itemVertical}`]: { flexDirection: 'column', alignItems: 'flex-start' }\r\n // [`&.${classes.itemHorizontal}`]: { flexDirection: 'row', alignItems: 'center' }\r\n }\r\n}))\r\n//#endregion\r\n"],"names":["createChipViewers","ChipItem","props","item","group","onRemove","field","label","chipMinWidth","itemLabel","value","toString","_jsx","Chip","size","title","className","classes","itemChip","sx","minWidth","undefined","onDelete","concat","ChipList","_useState","useState","_useState2","_slicedToArray","expanded","setExpanded","enableMinimalesticView","forceShowAll","items","length","_jsxs","Tooltip","placement","arrow","children","icon","MoreHorizIcon","fontSize","style","opacity","onClick","isBtnShowLess","_Fragment","pl","map","_props$value","rootClasses","push","itemVertical","itemHorizontal","data","useMemo","Array","isArray","filter","ItemStyled","Boolean","join","Typography","variant","itemContent","itemGroup","sort","styled","Box","_ref","theme","_defineProperty","fontWeight","marginLeft","spacing","lineHeight","borderRadius","maxWidth","whiteSpace","overflow","textOverflow","display","flexWrap","border","palette","divider","shape","alignItems","padding","gap","color","text","secondary","flexDirection","marginBottom","borderBottom","paddingBottom"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as r,objectSpread2 as l}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useContext as o,useMemo as a}from"react";import{styled as i,iconButtonClasses as n,buttonClasses as c,Collapse as s,Box as u,Button as m,IconButton as d}from"@mui/material";import p from"@mui/icons-material/ClearAll";import{KeySpecial as b}from"../types.js";import{useFilterActions as f}from"../hooks.js";import{mapSpecialLabel as h}from"../helpers.js";import{createChipViewers as v}from"./chip-viewer.js";import{FilterBarContext as g}from"../index.context.js";function x(r){var i=k,n=v();return function(c){var v=o(g),x=v.filterState,k=f(v),C=a(function(){return function(r,e){var t,o=r.fields,a=r.enableQuickSearch,i=void 0===a||a,n=l({},o),c=b.quickSearch;return i?n[c]?null!==(t=n[c])&&void 0!==t&&t.label||(n[c]=l(l({},n[c]),{},{label:h[c]})):n[c]={label:h[c]}:delete n[c],Object.keys(e||{}).reduce(function(r,l){var t,o=null==n?void 0:n[l],a=(null==o?void 0:o.label)||l.toString(),i=null==e||null===(t=e[l])||void 0===t?void 0:t.values,c=(Array.isArray(i)?i:[]).filter(Boolean).map(function(r){var l;return{value:r.toString(),label:null==o||null===(l=o.labelFormatter)||void 0===l?void 0:l.call(o,r)}});return c.length>0&&r.push({field:l,label:a,items:c}),r},[]).sort(function(r,l){return r.field===c?-1:l.field===c?1:0})}(r,x.storeFilter)},[x,r]);return e(s,{in:C.length>0,timeout:"auto",unmountOnExit:!0,children:t(y,{className:i.root,sx:c.sx,children:[e("div",{className:i.scrollHorizontal,children:e(n,{label:"Filters",value:C,placement:"horizontal",onRemove:k.removeFilterByFieldValue})}),t(u,{children:[e(m,{size:"small",color:"error",variant:"text",onClick:k.clearAllFilters,className:i.buttonClearAll,startIcon:e(p,{}),"aria-label":"Clear all filters",children:"Clear All"}),e(d,{size:"small",color:"error",onClick:k.clearAllFilters,className:i.buttonClearAll,"aria-label":"Clear all filters",children:e(p,{})})]})]})})}}var k={root:"DinoFilterSummary-root",scrollHorizontal:"DinoFilterSummary-scrollHorizontal",buttonClearAll:"DinoFilterSummary-buttonClearAll"},y=i("div")(function(l){var e=l.theme;return r(r(r({},"&.".concat(k.root),{display:"flex",alignItems:"center",padding:e.spacing(0,1.5)}),".".concat(k.scrollHorizontal),{overflowX:"auto",overflowY:"hidden",WebkitOverflowScrolling:"touch",scrollbarHeight:"thin",display:"flex",flexWrap:"nowrap",minWidth:0,flex:1,"& > *":{minWidth:"max-content",flexShrink:0},"&::-webkit-scrollbar":{height:"8px",background:"transparent"},"&::-webkit-scrollbar-thumb":{background:e.palette.grey[300],borderRadius:"8px",minHeight:"8px",transition:"background 0.2s"},"&::-webkit-scrollbar-thumb:hover":{background:e.palette.primary.light},"&::-webkit-scrollbar-track":{background:e.palette.grey[100],borderRadius:"8px"},scrollbarColor:"".concat(e.palette.grey[300]," ").concat(e.palette.grey[100]),scrollbarWidth:"thin"}),".".concat(k.buttonClearAll),r(r(r({marginLeft:e.spacing(1)},"&:not(.".concat(n.root,")"),{textTransform:"none",fontWeight:500,lineHeight:2,padding:e.spacing(0,1)}),"&.".concat(n.root),{display:"none"}),e.breakpoints.down("md"),r(r({},"&.".concat(c.root),{display:"none"}),"&.".concat(n.root),{display:"flex"})))});export{x as createFilterSummary};
1
+ import{defineProperty as l,objectSpread2 as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useContext as o,useMemo as i}from"react";import{styled as a,iconButtonClasses as n,buttonClasses as c,Collapse as s,Box as u,Button as d,IconButton as m}from"@mui/material";import p from"@mui/icons-material/ClearAll";import{KeySpecial as f}from"../types.js";import{useFilterActions as h}from"../hooks.js";import{mapSpecialLabel as b}from"../helpers.js";import{createChipViewers as v}from"./chip-viewer.js";import{FilterBarContext as g}from"../index.context.js";var x="__field__";function k(l){var a=y,n=v();return function(c){var v=o(g),k=v.filterState,y=h(v),S=i(function(){return function(l,e){var t,o=l.fields,i=l.enableQuickSearch,a=void 0===i||i,n=r({},o),c=f.quickSearch;return a?n[c]?null!==(t=n[c])&&void 0!==t&&t.label||(n[c]=r(r({},n[c]),{},{label:b[c]})):n[c]={label:b[c]}:delete n[c],Object.keys(e||{}).reduce(function(l,r){var t,o=null==n?void 0:n[r],i=(null==o?void 0:o.label)||r.toString(),a=null==e||null===(t=e[r])||void 0===t?void 0:t.values,c=(Array.isArray(a)?a:[]).filter(Boolean).map(function(l,t){var i;return{value:l.toString(),label:null==o||null===(i=o.labelFormatter)||void 0===i?void 0:i.call(o,l,t,null==e?void 0:e[r])}});if(c.length>0)if(null!=o&&o.singleChip){var s,u=null!==(s=o.singleChipSeparator)&&void 0!==s?s:", ",d=c.map(function(l){var r;return null!==(r=l.label)&&void 0!==r?r:l.value.toString()}).join(u);l.push({field:r,label:i,items:[{value:x,label:d}],chipMinWidth:o.chipMinWidth})}else l.push({field:r,label:i,items:c,chipMinWidth:null==o?void 0:o.chipMinWidth});return l},[]).sort(function(l,r){return l.field===c?-1:r.field===c?1:0})}(l,k.storeFilter)},[k,l]);return e(s,{in:S.length>0,timeout:"auto",unmountOnExit:!0,children:t(C,{className:a.root,sx:c.sx,children:[e("div",{className:a.scrollHorizontal,children:e(n,{label:"Filters",value:S,placement:"horizontal",onRemove:function(l,r){return r===x?y.removeFilter(l):y.removeFilterByFieldValue(l,r)}})}),t(u,{children:[e(d,{size:"small",color:"error",variant:"text",onClick:y.clearAllFilters,className:a.buttonClearAll,startIcon:e(p,{}),"aria-label":"Clear all filters",children:"Clear All"}),e(m,{size:"small",color:"error",onClick:y.clearAllFilters,className:a.buttonClearAll,"aria-label":"Clear all filters",children:e(p,{})})]})]})})}}var y={root:"DinoFilterSummary-root",scrollHorizontal:"DinoFilterSummary-scrollHorizontal",buttonClearAll:"DinoFilterSummary-buttonClearAll"},C=a("div")(function(r){var e=r.theme;return l(l(l({},"&.".concat(y.root),{display:"flex",alignItems:"center",padding:e.spacing(0,1.5)}),".".concat(y.scrollHorizontal),{overflowX:"auto",overflowY:"hidden",WebkitOverflowScrolling:"touch",scrollbarHeight:"thin",display:"flex",flexWrap:"nowrap",minWidth:0,flex:1,"& > *":{minWidth:"max-content",flexShrink:0},"&::-webkit-scrollbar":{height:"8px",background:"transparent"},"&::-webkit-scrollbar-thumb":{background:e.palette.grey[300],borderRadius:"8px",minHeight:"8px",transition:"background 0.2s"},"&::-webkit-scrollbar-thumb:hover":{background:e.palette.primary.light},"&::-webkit-scrollbar-track":{background:e.palette.grey[100],borderRadius:"8px"},scrollbarColor:"".concat(e.palette.grey[300]," ").concat(e.palette.grey[100]),scrollbarWidth:"thin"}),".".concat(y.buttonClearAll),l(l(l({marginLeft:e.spacing(1)},"&:not(.".concat(n.root,")"),{textTransform:"none",fontWeight:500,lineHeight:2,padding:e.spacing(0,1)}),"&.".concat(n.root),{display:"none"}),e.breakpoints.down("md"),l(l({},"&.".concat(c.root),{display:"none"}),"&.".concat(n.root),{display:"flex"})))});export{k as createFilterSummary};
2
2
  //# sourceMappingURL=filter-summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-summary.js","sources":["../../../../src/filter-bar/components/filter-summary.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useContext, useMemo } from 'react'\r\nimport { Box, Button, buttonClasses, Collapse, IconButton, iconButtonClasses, styled } from '@mui/material'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { mapSpecialLabel } from '../helpers'\r\nimport { createChipViewers } from './chip-viewer'\r\nimport { FilterBarContext } from '../index.context'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { TFieldStore, TFieldValid } from '../types'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { IChipViewerItem, TChipViewerGroup } from './chip-viewer'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps, TFieldSummaryConfigs } from './filter-summary.types'\r\n\r\nfunction mapFilterStateToFilterData<T>(config: IFilterSummaryConfig<T>, store?: TFieldStore<T>): TChipViewerGroup<T>[] {\r\n const { fields, enableQuickSearch = true } = config\r\n\r\n // Ensure 'quickSearch' is always included in the summary, even if it's not in the config or store\r\n // If enableQuickSearch is false, it will not be added to the summary or removed if it exists in the config\r\n const mergedConfig: TFieldSummaryConfigs<T> = { ...fields }\r\n const qsKey = KeySpecial.quickSearch\r\n if (enableQuickSearch) {\r\n if (!mergedConfig[qsKey]) {\r\n mergedConfig[qsKey] = { label: mapSpecialLabel[qsKey] }\r\n } else if (!mergedConfig[qsKey]?.label) {\r\n mergedConfig[qsKey] = { ...mergedConfig[qsKey], label: mapSpecialLabel[qsKey] }\r\n }\r\n } else {\r\n delete mergedConfig[qsKey]\r\n }\r\n\r\n const keys = Object.keys(store || {}) as (keyof TFieldStore<T>)[]\r\n const groups = keys.reduce<TChipViewerGroup<T>[]>((acc, key) => {\r\n const fieldConfig = mergedConfig?.[key]\r\n const label = fieldConfig?.label || key.toString()\r\n const values = store?.[key]?.values as TFieldValid[] | undefined\r\n const items = Array.isArray(values) ? values : []\r\n const summaryItems = items.filter(Boolean).map<IChipViewerItem<T>>((item) => {\r\n return { value: item.toString(), label: fieldConfig?.labelFormatter?.(item) }\r\n })\r\n if (summaryItems.length > 0) {\r\n acc.push({ field: key, label, items: summaryItems })\r\n }\r\n return acc\r\n }, [])\r\n const finalGroups = groups.sort((a, b) => {\r\n if (a.field === qsKey) return -1\r\n if (b.field === qsKey) return 1\r\n return 0\r\n })\r\n return finalGroups\r\n}\r\n\r\nexport function createFilterSummary<T>(config: IFilterSummaryConfig<T>) {\r\n const classes = filterSummaryClasses\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FilterSummary: FC<IFilterSummaryProps<T>> = (props) => {\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const { filterState } = context\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const filterData = useMemo(() => {\r\n return mapFilterStateToFilterData(config, filterState.storeFilter)\r\n }, [filterState, config])\r\n\r\n // Old logic to calculate filterData, now moved to useMemo above\r\n // if (filterData.length === 0) return null\r\n\r\n return (\r\n <Collapse in={filterData.length > 0} timeout='auto' unmountOnExit>\r\n <FilterSummaryStyled className={classes.root} sx={props.sx}>\r\n <div className={classes.scrollHorizontal}>\r\n <ChipViewers label='Filters' value={filterData} placement='horizontal' onRemove={filterActions.removeFilterByFieldValue} />\r\n </div>\r\n <Box>\r\n <Button\r\n size='small'\r\n color='error'\r\n variant='text'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n startIcon={<ClearAllIcon />}\r\n aria-label='Clear all filters'\r\n >\r\n Clear All\r\n </Button>\r\n <IconButton\r\n size='small'\r\n color='error'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n aria-label='Clear all filters'\r\n >\r\n <ClearAllIcon />\r\n </IconButton>\r\n </Box>\r\n </FilterSummaryStyled>\r\n </Collapse>\r\n )\r\n }\r\n\r\n return FilterSummary\r\n}\r\n\r\nconst filterSummaryClasses = {\r\n root: 'DinoFilterSummary-root',\r\n scrollHorizontal: 'DinoFilterSummary-scrollHorizontal',\r\n fieldItem: 'DinoFilterSummary-fieldItem',\r\n fieldLabel: 'DinoFilterSummary-fieldLabel',\r\n fieldValue: 'DinoFilterSummary-fieldValue',\r\n buttonClearAll: 'DinoFilterSummary-buttonClearAll'\r\n}\r\n\r\nconst FilterSummaryStyled = styled('div')(({ theme }) => ({\r\n [`&.${filterSummaryClasses.root}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 1.5)\r\n },\r\n [`.${filterSummaryClasses.scrollHorizontal}`]: {\r\n overflowX: 'auto',\r\n overflowY: 'hidden',\r\n WebkitOverflowScrolling: 'touch',\r\n scrollbarHeight: 'thin',\r\n // The content doesn't wrap to the next line and is wider than the container, displaying a horizontal scroll bar.\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n minWidth: 0,\r\n flex: 1,\r\n '& > *': { minWidth: 'max-content', flexShrink: 0 },\r\n // Custom scrollbar\r\n '&::-webkit-scrollbar': { height: '8px', background: 'transparent' },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: theme.palette.grey[300],\r\n borderRadius: '8px',\r\n minHeight: '8px',\r\n transition: 'background 0.2s'\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': { background: theme.palette.primary.light },\r\n '&::-webkit-scrollbar-track': { background: theme.palette.grey[100], borderRadius: '8px' },\r\n // Firefox\r\n scrollbarColor: `${theme.palette.grey[300]} ${theme.palette.grey[100]}`,\r\n scrollbarWidth: 'thin'\r\n },\r\n [`.${filterSummaryClasses.buttonClearAll}`]: {\r\n marginLeft: theme.spacing(1),\r\n [`&:not(.${iconButtonClasses.root})`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 2,\r\n padding: theme.spacing(0, 1)\r\n },\r\n [`&.${iconButtonClasses.root}`]: { display: 'none' },\r\n [theme.breakpoints.down('md')]: {\r\n [`&.${buttonClasses.root}`]: { display: 'none' },\r\n [`&.${iconButtonClasses.root}`]: { display: 'flex' }\r\n }\r\n }\r\n}))\r\n"],"names":["createFilterSummary","config","classes","filterSummaryClasses","ChipViewers","createChipViewers","props","context","useContext","FilterBarContext","filterState","filterActions","useFilterActions","filterData","useMemo","store","_mergedConfig$qsKey","fields","_config$enableQuickSe","enableQuickSearch","mergedConfig","_objectSpread","qsKey","KeySpecial","quickSearch","label","mapSpecialLabel","Object","keys","reduce","acc","key","_store$key","fieldConfig","toString","values","summaryItems","Array","isArray","filter","Boolean","map","item","_fieldConfig$labelFor","value","labelFormatter","call","length","push","field","items","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","placement","onRemove","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","padding","spacing","overflowX","overflowY","WebkitOverflowScrolling","scrollbarHeight","flexWrap","minWidth","flex","flexShrink","height","background","palette","grey","borderRadius","minHeight","transition","primary","light","scrollbarColor","scrollbarWidth","marginLeft","iconButtonClasses","textTransform","fontWeight","lineHeight","breakpoints","down","buttonClasses"],"mappings":"ymBAyDM,SAAUA,EAAuBC,GACrC,IAAMC,EAAUC,EACVC,EAAcC,IA+CpB,OA7CkD,SAACC,GACjD,IAAMC,EAAUC,EAAWC,GACnBC,EAAgBH,EAAhBG,YACFC,EAAgBC,EAAoBL,GAEpCM,EAAaC,EAAQ,WACzB,OAjDN,SAAuCb,EAAiCc,GACtE,IAMuBC,EANfC,EAAqChB,EAArCgB,OAAMC,EAA+BjB,EAA7BkB,kBAAAA,OAAoB,IAAHD,GAAOA,EAIlCE,EAAYC,EAAA,CAAA,EAAiCJ,GAC7CK,EAAQC,EAAWC,YA8BzB,OA7BIL,EACGC,EAAaE,WAEPN,EAACI,EAAaE,UAAM,IAAAN,GAAnBA,EAAqBS,QAC/BL,EAAaE,GAAMD,EAAAA,EAAQD,CAAAA,EAAAA,EAAaE,IAAM,GAAA,CAAEG,MAAOC,EAAgBJ,MAFvEF,EAAaE,GAAS,CAAEG,MAAOC,EAAgBJ,WAK1CF,EAAaE,GAGTK,OAAOC,KAAKb,GAAS,CAAA,GACdc,OAA8B,SAACC,EAAKC,GAAO,IAAAC,EACvDC,EAAcb,aAAAA,EAAAA,EAAeW,GAC7BN,GAAQQ,aAAW,EAAXA,EAAaR,QAASM,EAAIG,WAClCC,EAASpB,SAAY,QAAPiB,EAALjB,EAAQgB,UAARC,IAAYA,OAAZA,EAAAA,EAAcG,OAEvBC,GADQC,MAAMC,QAAQH,GAAUA,EAAS,IACpBI,OAAOC,SAASC,IAAwB,SAACC,GAAQ,IAAAC,EAC1E,MAAO,CAAEC,MAAOF,EAAKR,WAAYT,MAAOQ,SAA2BU,QAAhBA,EAAXV,EAAaY,0BAAcF,SAA3BA,EAAAG,KAAAb,EAA8BS,GACxE,GAIA,OAHIN,EAAaW,OAAS,GACxBjB,EAAIkB,KAAK,CAAEC,MAAOlB,EAAKN,MAAAA,EAAOyB,MAAOd,IAEhCN,CACR,EAAE,IACwBqB,KAAK,SAACC,EAAGC,GAClC,OAAID,EAAEH,QAAU3B,GAAgB,EAC5B+B,EAAEJ,QAAU3B,EAAc,EACvB,CACT,EAEF,CAYagC,CAA2BrD,EAAQS,EAAY6C,YACxD,EAAG,CAAC7C,EAAaT,IAKjB,OACEuD,EAACC,EAAQ,CAACC,GAAI7C,EAAWkC,OAAS,EAAGY,QAAQ,OAAOC,eAClD,EAAAC,SAAAC,EAACC,EAAmB,CAACC,UAAW9D,EAAQ+D,KAAMC,GAAI5D,EAAM4D,GACtDL,SAAA,CAAAL,EAAA,MAAA,CAAKQ,UAAW9D,EAAQiE,iBAAgBN,SACtCL,EAACpD,EAAY,CAAAqB,MAAM,UAAUmB,MAAO/B,EAAYuD,UAAU,aAAaC,SAAU1D,EAAc2D,6BAEjGR,EAACS,EACC,CAAAV,SAAA,CAAAL,EAACgB,EAAM,CACLC,KAAK,QACLC,MAAM,QACNC,QAAQ,OACRC,QAASjE,EAAckE,gBACvBb,UAAW9D,EAAQ4E,eACnBC,UAAWvB,EAACwB,EAAe,IAAA,aAChB,oBAGJnB,SAAA,cACTL,EAACyB,EACC,CAAAR,KAAK,QACLC,MAAM,QACNE,QAASjE,EAAckE,gBACvBb,UAAW9D,EAAQ4E,eAAc,aACtB,oBAEXjB,SAAAL,EAACwB,EAAY,CAAA,YAMxB,CAGH,CAEA,IAAM7E,EAAuB,CAC3B8D,KAAM,yBACNE,iBAAkB,qCAIlBW,eAAgB,oCAGZf,EAAsBmB,EAAO,MAAPA,CAAc,SAAAC,GAAA,IAAGC,EAAKD,EAALC,MAAK,OAAAC,EAAAA,EAAAA,EAAAC,CAAAA,EAAAA,KAAAA,OAC1CnF,EAAqB8D,MAAS,CAClCsB,QAAS,OACTC,WAAY,SACZC,QAASL,EAAMM,QAAQ,EAAG,WAC3BJ,OACInF,EAAqBgE,kBAAqB,CAC7CwB,UAAW,OACXC,UAAW,SACXC,wBAAyB,QACzBC,gBAAiB,OAEjBP,QAAS,OACTQ,SAAU,SACVC,SAAU,EACVC,KAAM,EACN,QAAS,CAAED,SAAU,cAAeE,WAAY,GAEhD,uBAAwB,CAAEC,OAAQ,MAAOC,WAAY,eACrD,6BAA8B,CAC5BA,WAAYhB,EAAMiB,QAAQC,KAAK,KAC/BC,aAAc,MACdC,UAAW,MACXC,WAAY,mBAEd,mCAAoC,CAAEL,WAAYhB,EAAMiB,QAAQK,QAAQC,OACxE,6BAA8B,CAAEP,WAAYhB,EAAMiB,QAAQC,KAAK,KAAMC,aAAc,OAEnFK,eAAc,GAAAtB,OAAKF,EAAMiB,QAAQC,KAAK,UAAIhB,OAAIF,EAAMiB,QAAQC,KAAK,MACjEO,eAAgB,SACjB,IAAAvB,OACInF,EAAqB2E,gBAAcO,EAAAA,EAAAA,EAAA,CACtCyB,WAAY1B,EAAMM,QAAQ,IAAE,UAAAJ,OACjByB,EAAkB9C,KAAU,KAAA,CACrC+C,cAAe,OACfC,WAAY,IACZC,WAAY,EACZzB,QAASL,EAAMM,QAAQ,EAAG,UAC3BJ,OACKyB,EAAkB9C,MAAS,CAAEsB,QAAS,SAC3CH,EAAM+B,YAAYC,KAAK,MAAK/B,EAAAA,EAAAC,CAAAA,EAAAA,KAAAA,OACrB+B,EAAcpD,MAAS,CAAEsB,QAAS,cAAQD,OAC1CyB,EAAkB9C,MAAS,CAAEsB,QAAS,UAAQ"}
1
+ {"version":3,"file":"filter-summary.js","sources":["../../../../src/filter-bar/components/filter-summary.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useContext, useMemo } from 'react'\r\nimport { Box, Button, buttonClasses, Collapse, IconButton, iconButtonClasses, styled } from '@mui/material'\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { mapSpecialLabel } from '../helpers'\r\nimport { createChipViewers } from './chip-viewer'\r\nimport { FilterBarContext } from '../index.context'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { TFieldStore, TFieldValid } from '../types'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { IChipViewerItem, TChipViewerGroup } from './chip-viewer'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps, TFieldSummaryConfigs } from './filter-summary.types'\r\n\r\n/** Sentinel value used when singleChip mode collapses all values into one chip. */\r\nconst SINGLE_CHIP_SENTINEL = '__field__'\r\n\r\nfunction mapFilterStateToFilterData<T>(config: IFilterSummaryConfig<T>, store?: TFieldStore<T>): TChipViewerGroup<T>[] {\r\n const { fields, enableQuickSearch = true } = config\r\n\r\n // Ensure 'quickSearch' is always included in the summary, even if it's not in the config or store\r\n // If enableQuickSearch is false, it will not be added to the summary or removed if it exists in the config\r\n const mergedConfig: TFieldSummaryConfigs<T> = { ...fields }\r\n const qsKey = KeySpecial.quickSearch\r\n if (enableQuickSearch) {\r\n if (!mergedConfig[qsKey]) {\r\n mergedConfig[qsKey] = { label: mapSpecialLabel[qsKey] }\r\n } else if (!mergedConfig[qsKey]?.label) {\r\n mergedConfig[qsKey] = { ...mergedConfig[qsKey], label: mapSpecialLabel[qsKey] }\r\n }\r\n } else {\r\n delete mergedConfig[qsKey]\r\n }\r\n\r\n const keys = Object.keys(store || {}) as (keyof TFieldStore<T>)[]\r\n const groups = keys.reduce<TChipViewerGroup<T>[]>((acc, key) => {\r\n const fieldConfig = mergedConfig?.[key]\r\n const label = fieldConfig?.label || key.toString()\r\n const values = store?.[key]?.values as TFieldValid[] | undefined\r\n const items = Array.isArray(values) ? values : []\r\n const summaryItems = items.filter(Boolean).map<IChipViewerItem<T>>((item, index) => {\r\n return { value: item.toString(), label: fieldConfig?.labelFormatter?.(item, index, store?.[key]!) }\r\n })\r\n if (summaryItems.length > 0) {\r\n if (fieldConfig?.singleChip) {\r\n const separator = fieldConfig.singleChipSeparator ?? ', '\r\n const combinedLabel = summaryItems.map((item) => item.label ?? item.value.toString()).join(separator)\r\n acc.push({ field: key, label, items: [{ value: SINGLE_CHIP_SENTINEL, label: combinedLabel }], chipMinWidth: fieldConfig.chipMinWidth })\r\n } else {\r\n acc.push({ field: key, label, items: summaryItems, chipMinWidth: fieldConfig?.chipMinWidth })\r\n }\r\n }\r\n return acc\r\n }, [])\r\n const finalGroups = groups.sort((a, b) => {\r\n if (a.field === qsKey) return -1\r\n if (b.field === qsKey) return 1\r\n return 0\r\n })\r\n return finalGroups\r\n}\r\n\r\nexport function createFilterSummary<T>(config: IFilterSummaryConfig<T>) {\r\n const classes = filterSummaryClasses\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FilterSummary: FC<IFilterSummaryProps<T>> = (props) => {\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const { filterState } = context\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const filterData = useMemo(() => {\r\n return mapFilterStateToFilterData(config, filterState.storeFilter)\r\n }, [filterState, config])\r\n\r\n // Old logic to calculate filterData, now moved to useMemo above\r\n // if (filterData.length === 0) return null\r\n\r\n return (\r\n <Collapse in={filterData.length > 0} timeout='auto' unmountOnExit>\r\n <FilterSummaryStyled className={classes.root} sx={props.sx}>\r\n <div className={classes.scrollHorizontal}>\r\n <ChipViewers\r\n label='Filters'\r\n value={filterData}\r\n placement='horizontal'\r\n onRemove={(field, value) =>\r\n value === SINGLE_CHIP_SENTINEL ? filterActions.removeFilter(field) : filterActions.removeFilterByFieldValue(field, value)\r\n }\r\n />\r\n </div>\r\n <Box>\r\n <Button\r\n size='small'\r\n color='error'\r\n variant='text'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n startIcon={<ClearAllIcon />}\r\n aria-label='Clear all filters'\r\n >\r\n Clear All\r\n </Button>\r\n <IconButton\r\n size='small'\r\n color='error'\r\n onClick={filterActions.clearAllFilters}\r\n className={classes.buttonClearAll}\r\n aria-label='Clear all filters'\r\n >\r\n <ClearAllIcon />\r\n </IconButton>\r\n </Box>\r\n </FilterSummaryStyled>\r\n </Collapse>\r\n )\r\n }\r\n\r\n return FilterSummary\r\n}\r\n\r\nconst filterSummaryClasses = {\r\n root: 'DinoFilterSummary-root',\r\n scrollHorizontal: 'DinoFilterSummary-scrollHorizontal',\r\n fieldItem: 'DinoFilterSummary-fieldItem',\r\n fieldLabel: 'DinoFilterSummary-fieldLabel',\r\n fieldValue: 'DinoFilterSummary-fieldValue',\r\n buttonClearAll: 'DinoFilterSummary-buttonClearAll'\r\n}\r\n\r\nconst FilterSummaryStyled = styled('div')(({ theme }) => ({\r\n [`&.${filterSummaryClasses.root}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n padding: theme.spacing(0, 1.5)\r\n },\r\n [`.${filterSummaryClasses.scrollHorizontal}`]: {\r\n overflowX: 'auto',\r\n overflowY: 'hidden',\r\n WebkitOverflowScrolling: 'touch',\r\n scrollbarHeight: 'thin',\r\n // The content doesn't wrap to the next line and is wider than the container, displaying a horizontal scroll bar.\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n minWidth: 0,\r\n flex: 1,\r\n '& > *': { minWidth: 'max-content', flexShrink: 0 },\r\n // Custom scrollbar\r\n '&::-webkit-scrollbar': { height: '8px', background: 'transparent' },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: theme.palette.grey[300],\r\n borderRadius: '8px',\r\n minHeight: '8px',\r\n transition: 'background 0.2s'\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': { background: theme.palette.primary.light },\r\n '&::-webkit-scrollbar-track': { background: theme.palette.grey[100], borderRadius: '8px' },\r\n // Firefox\r\n scrollbarColor: `${theme.palette.grey[300]} ${theme.palette.grey[100]}`,\r\n scrollbarWidth: 'thin'\r\n },\r\n [`.${filterSummaryClasses.buttonClearAll}`]: {\r\n marginLeft: theme.spacing(1),\r\n [`&:not(.${iconButtonClasses.root})`]: {\r\n textTransform: 'none',\r\n fontWeight: 500,\r\n lineHeight: 2,\r\n padding: theme.spacing(0, 1)\r\n },\r\n [`&.${iconButtonClasses.root}`]: { display: 'none' },\r\n [theme.breakpoints.down('md')]: {\r\n [`&.${buttonClasses.root}`]: { display: 'none' },\r\n [`&.${iconButtonClasses.root}`]: { display: 'flex' }\r\n }\r\n }\r\n}))\r\n"],"names":["SINGLE_CHIP_SENTINEL","createFilterSummary","config","classes","filterSummaryClasses","ChipViewers","createChipViewers","props","context","useContext","FilterBarContext","filterState","filterActions","useFilterActions","filterData","useMemo","store","_mergedConfig$qsKey","fields","_config$enableQuickSe","enableQuickSearch","mergedConfig","_objectSpread","qsKey","KeySpecial","quickSearch","label","mapSpecialLabel","Object","keys","reduce","acc","key","_store$key","fieldConfig","toString","values","summaryItems","Array","isArray","filter","Boolean","map","item","index","_fieldConfig$labelFor","value","labelFormatter","call","length","singleChip","_fieldConfig$singleCh","separator","singleChipSeparator","combinedLabel","_item$label","join","push","field","items","chipMinWidth","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","placement","onRemove","removeFilter","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","padding","spacing","overflowX","overflowY","WebkitOverflowScrolling","scrollbarHeight","flexWrap","minWidth","flex","flexShrink","height","background","palette","grey","borderRadius","minHeight","transition","primary","light","scrollbarColor","scrollbarWidth","marginLeft","iconButtonClasses","textTransform","fontWeight","lineHeight","breakpoints","down","buttonClasses"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { fetchDelay } from '../utils'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await fetchDelay(async () => props.onChange?.(filterState), debounceDelay)\r\n setIsLoading(false)\r\n } catch (error) {\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s)\r\n } else {\r\n handleChange(s, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n //TODO - add panel: định vị trí, ẩn hiện, trạng thái,...\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","useEffect","current","clearTimeout","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee2","state","_t","w","_context2","p","n","prev","_state$filterState","fetchDelay","_callee","_props$onChange","_context","a","onChange","call","v","_x","_x2","apply","this","arguments","contextValue","setFilterState","window","setTimeout","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref3","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
1
+ {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { fetchDelay } from '../utils'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await fetchDelay(async () => props.onChange?.(filterState), debounceDelay)\r\n setIsLoading(false)\r\n } catch (error) {\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s)\r\n } else {\r\n handleChange(s, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","useEffect","current","clearTimeout","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee2","state","_t","w","_context2","p","n","prev","_state$filterState","fetchDelay","_callee","_props$onChange","_context","a","onChange","call","v","_x","_x2","apply","this","arguments","contextValue","setFilterState","window","setTimeout","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref3","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}