dinocollab-core 2.2.10 → 2.2.11

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 (35) hide show
  1. package/README.md +0 -22
  2. package/dist/data-surface/index.js +1 -1
  3. package/dist/filter-bar/index.js +1 -1
  4. package/dist/src/data-surface/index.create.js +1 -1
  5. package/dist/src/data-surface/index.create.js.map +1 -1
  6. package/dist/src/data-surface/index.dino.js +1 -1
  7. package/dist/src/data-surface/index.dino.js.map +1 -1
  8. package/dist/src/data-surface/types.js +1 -1
  9. package/dist/src/data-surface/types.js.map +1 -1
  10. package/dist/src/data-surface/ui.units.js +1 -1
  11. package/dist/src/data-surface/view-grid/index.js +1 -1
  12. package/dist/src/data-surface/view-grid/index.js.map +1 -1
  13. package/dist/src/data-surface/view-list/index.js +1 -1
  14. package/dist/src/data-surface/view-list/index.js.map +1 -1
  15. package/dist/src/data-surface/view-list/types.js.map +1 -1
  16. package/dist/src/data-surface/view-switch-transition.js.map +1 -1
  17. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  18. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  19. package/dist/src/filter-bar/convert-to-graphql.js +1 -1
  20. package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
  21. package/dist/src/filter-bar/index.dino.js +1 -1
  22. package/dist/src/filter-bar/index.dino.js.map +1 -1
  23. package/dist/src/filter-bar/local-filter-builder.js +2 -0
  24. package/dist/src/filter-bar/local-filter-builder.js.map +1 -0
  25. package/dist/types/data-surface/index.create.d.ts +12 -4
  26. package/dist/types/data-surface/index.dino.d.ts +2 -0
  27. package/dist/types/data-surface/types.d.ts +5 -0
  28. package/dist/types/data-surface/view-grid/types.d.ts +2 -0
  29. package/dist/types/data-surface/view-list/types.d.ts +2 -0
  30. package/dist/types/data-surface/view-switch-transition.d.ts +1 -1
  31. package/dist/types/filter-bar/convert-to-graphql.d.ts +8 -0
  32. package/dist/types/filter-bar/index.d.ts +1 -0
  33. package/dist/types/filter-bar/index.dino.d.ts +2 -1
  34. package/dist/types/filter-bar/local-filter-builder.d.ts +39 -0
  35. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n return (\r\n <ViewListStyled className={classes.root} style={mergedConfig.rootStyle}>\r\n <TableContainer className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, props.overscan ?? config.overscan ?? 6)\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0 && measured !== headerHeight) {\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length, headerHeight])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const rowStride = rowHeight + rowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n const end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, rowHeight, rowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, rowHeight, rowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n overscan={props.overscan}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","ViewListStyled","className","classes","root","style","rootStyle","children","TableContainer","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","scrollTop","clientHeight","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_ref","_props$overscan","wrapRef","useRef","headerRowRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","useLayoutEffect","current","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","length","windowed","useMemo","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","floor","visibleCount","ceil","min","resolveListSpacerHeight","rowsToRender","slice","rootClasses","virtualized","filter","Boolean","join","ref","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref2","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n return (\r\n <ViewListStyled className={classes.root} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, props.overscan ?? config.overscan ?? 6)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= 80) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0 && measured !== headerHeight) {\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length, headerHeight])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const rowStride = rowHeight + rowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n const end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, rowHeight, rowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, rowHeight, rowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n overscan={props.overscan}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","scrollContainerRef","useRef","useEffect","undefined","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","ViewListStyled","className","classes","root","style","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_ref","_props$overscan","wrapRef","headerRowRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","length","windowed","useMemo","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","floor","visibleCount","ceil","min","resolveListSpacerHeight","rowsToRender","slice","rootClasses","virtualized","filter","Boolean","join","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref2","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../src/data-surface/view-list/types.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\nimport type { ReactNode } from 'react'\r\nimport { RenderStrategyRule, TGetterId } from '../types'\r\n\r\n/**\r\n * Props received by the custom render function for each row in List view.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface IViewListItemProps<T> {\r\n /** The data object for this list row. */\r\n value: T\r\n /** Zero-based position of this item in the data array. */\r\n index: number\r\n /** Whether this row is currently selected. */\r\n selected?: boolean\r\n}\r\n\r\n/** Horizontal alignment for list cell content. */\r\nexport type TListAlign = 'left' | 'right' | 'center'\r\n\r\n/**\r\n * Context passed to a column's render callback.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface IListCellParams<T> {\r\n /** Resolved cell value (after valueGetter if provided). */\r\n value: any\r\n /** The full row object. */\r\n row: T\r\n /** Zero-based row index. */\r\n index: number\r\n /** The column field key this cell belongs to. */\r\n field: keyof T\r\n}\r\n\r\n/**\r\n * Definition of a single column in List view.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface TListColumn<T> {\r\n /** Key of the row object this column maps to. */\r\n field: keyof T\r\n /** Column header label shown in the header. */\r\n label?: string\r\n /** Explicit column width. Accepts px number or CSS string (e.g. '120px', '20%'). */\r\n width?: number | string\r\n /** Minimum column width in pixels. */\r\n minWidth?: number\r\n /** Maximum column width in pixels. */\r\n maxWidth?: number\r\n /** Flex grow ratio used when no explicit width is set. */\r\n flex?: number\r\n /** Horizontal alignment of the cell content. */\r\n align?: TListAlign\r\n /** Custom cell render function - receives CellParams, returns ReactNode. */\r\n renderCell?: (params: IListCellParams<T>) => ReactNode\r\n /** Derives a value from the row before it is passed to the render step. */\r\n valueGetter?: (value: string, row: T, index: number) => any\r\n}\r\n/** Columns configuration for List view. */\r\nexport type TListColumns<T> = Partial<Record<keyof T, Omit<TListColumn<T>, 'field'>>>\r\n\r\n/**\r\n * Row density preset for List view.\r\n * Controls the row height and cell padding.\r\n */\r\nexport const ListDensity = {\r\n compact: 'compact',\r\n standard: 'standard',\r\n comfortable: 'comfortable'\r\n} as const\r\nexport type ListDensity = keyof typeof ListDensity\r\n\r\n/** Base configuration for List view. */\r\nexport interface IViewListBase<T> {\r\n /** Custom render function for list rows. If not provided, a default row layout will be used. */\r\n columns?: TListColumns<T>\r\n /** Row height preset or an explicit row height in pixels. @default 'standard' */\r\n density?: number | ListDensity\r\n /** Spacing between rows in pixels. @default 4 */\r\n spacing?: number\r\n /**\r\n * Controls how the list is rendered into the DOM.\r\n * - `normal` — all rows are mounted (suitable for small datasets)\r\n * - `virtualized` — only visible rows are mounted (optimized for large datasets)\r\n * @default 'normal'\r\n */\r\n renderStrategy?: RenderStrategyRule\r\n /** Enable row selection with checkboxes. */\r\n selectable?: boolean\r\n /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 6 */\r\n overscan?: number\r\n}\r\n\r\n/** Configuration for List view. */\r\nexport interface IViewListConfig<T> extends IViewListBase<T> {\r\n /** Function to extract unique row ID from a data item. Required for selection and virtualization. */\r\n getterId: TGetterId<T>\r\n}\r\n\r\n/** Props for List view component. */\r\nexport interface IViewListProps<T> extends IViewListBase<T> {\r\n /** The array of data items to display in the list. */\r\n value: T[]\r\n /** Called when user scrolls near the bottom of the list. Use this to trigger pagination or infinity load. */\r\n onNearEnd?: () => void\r\n /** Array of selected row IDs (controlled). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes. */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n}\r\n"],"names":["ListDensity","compact","standard","comfortable"],"mappings":"AAmEO,IAAMA,EAAc,CACzBC,QAAS,UACTC,SAAU,WACVC,YAAa"}
1
+ {"version":3,"file":"types.js","sources":["../../../../src/data-surface/view-list/types.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\nimport type { ReactNode } from 'react'\r\nimport { RenderStrategyRule, TGetterId } from '../types'\r\n\r\n/**\r\n * Props received by the custom render function for each row in List view.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface IViewListItemProps<T> {\r\n /** The data object for this list row. */\r\n value: T\r\n /** Zero-based position of this item in the data array. */\r\n index: number\r\n /** Whether this row is currently selected. */\r\n selected?: boolean\r\n}\r\n\r\n/** Horizontal alignment for list cell content. */\r\nexport type TListAlign = 'left' | 'right' | 'center'\r\n\r\n/**\r\n * Context passed to a column's render callback.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface IListCellParams<T> {\r\n /** Resolved cell value (after valueGetter if provided). */\r\n value: any\r\n /** The full row object. */\r\n row: T\r\n /** Zero-based row index. */\r\n index: number\r\n /** The column field key this cell belongs to. */\r\n field: keyof T\r\n}\r\n\r\n/**\r\n * Definition of a single column in List view.\r\n * @template T - The shape of a single data row object.\r\n */\r\nexport interface TListColumn<T> {\r\n /** Key of the row object this column maps to. */\r\n field: keyof T\r\n /** Column header label shown in the header. */\r\n label?: string\r\n /** Explicit column width. Accepts px number or CSS string (e.g. '120px', '20%'). */\r\n width?: number | string\r\n /** Minimum column width in pixels. */\r\n minWidth?: number\r\n /** Maximum column width in pixels. */\r\n maxWidth?: number\r\n /** Flex grow ratio used when no explicit width is set. */\r\n flex?: number\r\n /** Horizontal alignment of the cell content. */\r\n align?: TListAlign\r\n /** Custom cell render function - receives CellParams, returns ReactNode. */\r\n renderCell?: (params: IListCellParams<T>) => ReactNode\r\n /** Derives a value from the row before it is passed to the render step. */\r\n valueGetter?: (value: string, row: T, index: number) => any\r\n}\r\n/** Columns configuration for List view. */\r\nexport type TListColumns<T> = Partial<Record<keyof T, Omit<TListColumn<T>, 'field'>>>\r\n\r\n/**\r\n * Row density preset for List view.\r\n * Controls the row height and cell padding.\r\n */\r\nexport const ListDensity = {\r\n compact: 'compact',\r\n standard: 'standard',\r\n comfortable: 'comfortable'\r\n} as const\r\nexport type ListDensity = keyof typeof ListDensity\r\n\r\n/** Base configuration for List view. */\r\nexport interface IViewListBase<T> {\r\n /** Custom render function for list rows. If not provided, a default row layout will be used. */\r\n columns?: TListColumns<T>\r\n /** Row height preset or an explicit row height in pixels. @default 'standard' */\r\n density?: number | ListDensity\r\n /** Spacing between rows in pixels. @default 4 */\r\n spacing?: number\r\n /**\r\n * Controls how the list is rendered into the DOM.\r\n * - `normal` — all rows are mounted (suitable for small datasets)\r\n * - `virtualized` — only visible rows are mounted (optimized for large datasets)\r\n * @default 'normal'\r\n */\r\n renderStrategy?: RenderStrategyRule\r\n /** Enable row selection with checkboxes. */\r\n selectable?: boolean\r\n /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 6 */\r\n overscan?: number\r\n}\r\n\r\n/** Configuration for List view. */\r\nexport interface IViewListConfig<T> extends IViewListBase<T> {\r\n /** Function to extract unique row ID from a data item. Required for selection and virtualization. */\r\n getterId: TGetterId<T>\r\n}\r\n\r\n/** Props for List view component. */\r\nexport interface IViewListProps<T> extends IViewListBase<T> {\r\n /** The array of data items to display in the list. */\r\n value: T[]\r\n /** Called when user scrolls near the bottom of the list. Use this to trigger pagination or infinity load. */\r\n onNearEnd?: () => void\r\n /** Array of selected row IDs (controlled). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes. */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n /** When this value changes, the scroll position resets to top (virtualized mode only). */\r\n scrollResetToken?: unknown\r\n}\r\n"],"names":["ListDensity","compact","standard","comfortable"],"mappings":"AAmEO,IAAMA,EAAc,CACzBC,QAAS,UACTC,SAAU,WACVC,YAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"view-switch-transition.js","sources":["../../../src/data-surface/view-switch-transition.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { CombinedTransition, DEFAULT_ANIMATION, ViewDefault } from './view-switch-transition.units'\r\nimport { viewSwitchTransitionClasses, ViewSwitchTransitionStyled } from './view-switch-transition.units'\r\n// types\r\nimport type { FC, ReactNode, ComponentType } from 'react'\r\nimport { TAnimationConfig } from './view-switch-transition.units'\r\n\r\ntype TViewSwitchTransitionConfig<T extends string = string> = {\r\n value: T\r\n label?: string\r\n Content: ComponentType<{ value: T }>\r\n icon?: ReactNode\r\n}\r\n\r\ntype TViewSwitchTransitionParam<T extends string = string> = {\r\n viewA?: TViewSwitchTransitionConfig<T>\r\n viewB?: TViewSwitchTransitionConfig<T>\r\n transitionConfig?: TAnimationConfig\r\n}\r\n\r\ninterface IViewSwitchTransitionProps<T extends string = string> {\r\n value?: T\r\n viewA?: TViewSwitchTransitionConfig<T>\r\n viewB?: TViewSwitchTransitionConfig<T>\r\n transitionConfig?: TAnimationConfig\r\n}\r\n\r\nexport function createViewSwitchTransition<T extends string = string>(config?: TViewSwitchTransitionParam<T>) {\r\n const classes = viewSwitchTransitionClasses\r\n const viewAClass = `${classes.view} ${classes.viewA}`\r\n const viewBClass = `${classes.view} ${classes.viewB}`\r\n\r\n const ViewSwitchTransition: FC<IViewSwitchTransitionProps<T>> = (props) => {\r\n const wrapperRef = useRef<HTMLDivElement | null>(null)\r\n const viewARef = useRef<HTMLDivElement | null>(null)\r\n const viewBRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const [mountedMode, setMountedMode] = useState<T | undefined>(props.value ?? config?.viewA?.value)\r\n const [mountedOpen, setMountedOpen] = useState<boolean>(true)\r\n\r\n const pendingModeRef = useRef<T | null>(null)\r\n const exitTimerRef = useRef<number | null>(null)\r\n\r\n const finalConfig = useMemo(() => {\r\n return {\r\n viewA: props.viewA ?? config?.viewA,\r\n viewB: props.viewB ?? config?.viewB\r\n }\r\n }, [props.viewA, props.viewB, config?.viewA, config?.viewB])\r\n\r\n const animations = useMemo(() => {\r\n return Object.assign({}, DEFAULT_ANIMATION, config?.transitionConfig, props.transitionConfig ?? {})\r\n }, [config?.transitionConfig, props.transitionConfig])\r\n\r\n useEffect(() => {\r\n if (props.value === mountedMode) return\r\n\r\n if (exitTimerRef.current) {\r\n window.clearTimeout(exitTimerRef.current)\r\n exitTimerRef.current = null\r\n }\r\n\r\n pendingModeRef.current = props.value ?? null\r\n\r\n const currentHeight = wrapperRef.current?.offsetHeight\r\n if (wrapperRef.current && typeof currentHeight === 'number') {\r\n wrapperRef.current.style.height = `${currentHeight}px`\r\n wrapperRef.current.style.transition = `height ${animations.enter}ms ${animations.ease}`\r\n }\r\n\r\n setMountedOpen(false)\r\n\r\n exitTimerRef.current = window.setTimeout(() => {\r\n const nextMode = pendingModeRef.current\r\n pendingModeRef.current = null\r\n\r\n if (nextMode) {\r\n setMountedMode(nextMode)\r\n requestAnimationFrame(() => {\r\n const targetRef = nextMode === finalConfig.viewA?.value ? viewARef : viewBRef\r\n const nextHeight = targetRef.current?.offsetHeight ?? wrapperRef.current?.offsetHeight ?? 0\r\n setMountedOpen(true)\r\n\r\n if (wrapperRef.current) {\r\n wrapperRef.current.style.height = `${nextHeight}px`\r\n window.setTimeout(() => {\r\n if (wrapperRef.current) wrapperRef.current.style.height = ''\r\n }, animations.enter)\r\n }\r\n })\r\n }\r\n\r\n exitTimerRef.current = null\r\n }, animations.exit + animations.hold)\r\n\r\n return () => {\r\n if (exitTimerRef.current) {\r\n window.clearTimeout(exitTimerRef.current)\r\n exitTimerRef.current = null\r\n }\r\n }\r\n }, [animations, props.value, mountedMode])\r\n\r\n const ViewAContent = useMemo(() => {\r\n return finalConfig.viewA?.Content ?? ViewDefault\r\n }, [finalConfig.viewA?.Content])\r\n\r\n const ViewBContent = useMemo(() => {\r\n return finalConfig.viewB?.Content ?? ViewDefault\r\n }, [finalConfig.viewB?.Content])\r\n\r\n return (\r\n <ViewSwitchTransitionStyled className={classes.root}>\r\n <div ref={wrapperRef} className={classes.viewWrapper}>\r\n {mountedMode === finalConfig.viewA?.value && (\r\n <CombinedTransition\r\n open={mountedOpen}\r\n timeout={{ enter: animations.enter, exit: animations.exit }}\r\n mountDelay={animations.mountDelay}\r\n animationConfig={animations}\r\n style={{ transformOrigin: animations.transformOriginGrid }}\r\n >\r\n <div ref={viewARef} className={viewAClass}>\r\n <ViewAContent value={finalConfig.viewA?.value!} />\r\n </div>\r\n </CombinedTransition>\r\n )}\r\n\r\n {mountedMode === finalConfig.viewB?.value && (\r\n <CombinedTransition\r\n open={mountedOpen}\r\n timeout={{ enter: animations.enter, exit: animations.exit }}\r\n mountDelay={animations.mountDelay}\r\n animationConfig={animations}\r\n style={{ transformOrigin: animations.transformOriginTable }}\r\n >\r\n <div ref={viewBRef} className={viewBClass}>\r\n <ViewBContent value={finalConfig.viewB?.value!} />\r\n </div>\r\n </CombinedTransition>\r\n )}\r\n </div>\r\n </ViewSwitchTransitionStyled>\r\n )\r\n }\r\n\r\n return ViewSwitchTransition\r\n}\r\n\r\nexport const ViewSwitchTransition = createViewSwitchTransition({})\r\n\r\nexport default ViewSwitchTransition\r\n"],"names":["createViewSwitchTransition","config","classes","viewSwitchTransitionClasses","viewAClass","concat","view","viewA","viewBClass","viewB","props","_props$value","_config$viewA","_finalConfig$viewA3","_finalConfig$viewB2","_finalConfig$viewA4","_finalConfig$viewA5","_finalConfig$viewB3","_finalConfig$viewB4","wrapperRef","useRef","viewARef","viewBRef","_useState","useState","value","_useState2","_slicedToArray","mountedMode","setMountedMode","_useState3","_useState4","mountedOpen","setMountedOpen","pendingModeRef","exitTimerRef","finalConfig","useMemo","_props$viewA","_props$viewB","animations","_props$transitionConf","Object","assign","DEFAULT_ANIMATION","transitionConfig","useEffect","_props$value2","_wrapperRef$current","current","window","clearTimeout","currentHeight","offsetHeight","style","height","transition","enter","ease","setTimeout","nextMode","requestAnimationFrame","_finalConfig$viewA","_ref","_targetRef$current$of","_targetRef$current","_wrapperRef$current2","nextHeight","exit","hold","ViewAContent","_finalConfig$viewA$Co","_finalConfig$viewA2","Content","ViewDefault","ViewBContent","_finalConfig$viewB$Co","_finalConfig$viewB","_jsx","ViewSwitchTransitionStyled","className","root","children","_jsxs","ref","viewWrapper","CombinedTransition","open","timeout","mountDelay","animationConfig","transformOrigin","transformOriginGrid","transformOriginTable"],"mappings":"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"}
1
+ {"version":3,"file":"view-switch-transition.js","sources":["../../../src/data-surface/view-switch-transition.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { CombinedTransition, DEFAULT_ANIMATION, ViewDefault } from './view-switch-transition.units'\r\nimport { viewSwitchTransitionClasses, ViewSwitchTransitionStyled } from './view-switch-transition.units'\r\n// types\r\nimport type { FC, ReactNode, ComponentType } from 'react'\r\nimport type { TAnimationConfig } from './view-switch-transition.units'\r\n\r\ntype TViewSwitchTransitionConfig<T extends string = string> = {\r\n value: T\r\n label?: string\r\n Content: ComponentType<{ value: T }>\r\n icon?: ReactNode\r\n}\r\n\r\ntype TViewSwitchTransitionParam<T extends string = string> = {\r\n viewA?: TViewSwitchTransitionConfig<T>\r\n viewB?: TViewSwitchTransitionConfig<T>\r\n transitionConfig?: TAnimationConfig\r\n}\r\n\r\ninterface IViewSwitchTransitionProps<T extends string = string> {\r\n value?: T\r\n viewA?: TViewSwitchTransitionConfig<T>\r\n viewB?: TViewSwitchTransitionConfig<T>\r\n transitionConfig?: TAnimationConfig\r\n}\r\n\r\nexport function createViewSwitchTransition<T extends string = string>(config?: TViewSwitchTransitionParam<T>) {\r\n const classes = viewSwitchTransitionClasses\r\n const viewAClass = `${classes.view} ${classes.viewA}`\r\n const viewBClass = `${classes.view} ${classes.viewB}`\r\n\r\n const ViewSwitchTransition: FC<IViewSwitchTransitionProps<T>> = (props) => {\r\n const wrapperRef = useRef<HTMLDivElement | null>(null)\r\n const viewARef = useRef<HTMLDivElement | null>(null)\r\n const viewBRef = useRef<HTMLDivElement | null>(null)\r\n\r\n const [mountedMode, setMountedMode] = useState<T | undefined>(props.value ?? config?.viewA?.value)\r\n const [mountedOpen, setMountedOpen] = useState<boolean>(true)\r\n\r\n const pendingModeRef = useRef<T | null>(null)\r\n const exitTimerRef = useRef<number | null>(null)\r\n\r\n const finalConfig = useMemo(() => {\r\n return {\r\n viewA: props.viewA ?? config?.viewA,\r\n viewB: props.viewB ?? config?.viewB\r\n }\r\n }, [props.viewA, props.viewB, config?.viewA, config?.viewB])\r\n\r\n const animations = useMemo(() => {\r\n return Object.assign({}, DEFAULT_ANIMATION, config?.transitionConfig, props.transitionConfig ?? {})\r\n }, [config?.transitionConfig, props.transitionConfig])\r\n\r\n useEffect(() => {\r\n if (props.value === mountedMode) return\r\n\r\n if (exitTimerRef.current) {\r\n window.clearTimeout(exitTimerRef.current)\r\n exitTimerRef.current = null\r\n }\r\n\r\n pendingModeRef.current = props.value ?? null\r\n\r\n const currentHeight = wrapperRef.current?.offsetHeight\r\n if (wrapperRef.current && typeof currentHeight === 'number') {\r\n wrapperRef.current.style.height = `${currentHeight}px`\r\n wrapperRef.current.style.transition = `height ${animations.enter}ms ${animations.ease}`\r\n }\r\n\r\n setMountedOpen(false)\r\n\r\n exitTimerRef.current = window.setTimeout(() => {\r\n const nextMode = pendingModeRef.current\r\n pendingModeRef.current = null\r\n\r\n if (nextMode) {\r\n setMountedMode(nextMode)\r\n requestAnimationFrame(() => {\r\n const targetRef = nextMode === finalConfig.viewA?.value ? viewARef : viewBRef\r\n const nextHeight = targetRef.current?.offsetHeight ?? wrapperRef.current?.offsetHeight ?? 0\r\n setMountedOpen(true)\r\n\r\n if (wrapperRef.current) {\r\n wrapperRef.current.style.height = `${nextHeight}px`\r\n window.setTimeout(() => {\r\n if (wrapperRef.current) wrapperRef.current.style.height = ''\r\n }, animations.enter)\r\n }\r\n })\r\n }\r\n\r\n exitTimerRef.current = null\r\n }, animations.exit + animations.hold)\r\n\r\n return () => {\r\n if (exitTimerRef.current) {\r\n window.clearTimeout(exitTimerRef.current)\r\n exitTimerRef.current = null\r\n }\r\n }\r\n }, [animations, props.value, mountedMode])\r\n\r\n const ViewAContent = useMemo(() => {\r\n return finalConfig.viewA?.Content ?? ViewDefault\r\n }, [finalConfig.viewA?.Content])\r\n\r\n const ViewBContent = useMemo(() => {\r\n return finalConfig.viewB?.Content ?? ViewDefault\r\n }, [finalConfig.viewB?.Content])\r\n\r\n return (\r\n <ViewSwitchTransitionStyled className={classes.root}>\r\n <div ref={wrapperRef} className={classes.viewWrapper}>\r\n {mountedMode === finalConfig.viewA?.value && (\r\n <CombinedTransition\r\n open={mountedOpen}\r\n timeout={{ enter: animations.enter, exit: animations.exit }}\r\n mountDelay={animations.mountDelay}\r\n animationConfig={animations}\r\n style={{ transformOrigin: animations.transformOriginGrid }}\r\n >\r\n <div ref={viewARef} className={viewAClass}>\r\n <ViewAContent value={finalConfig.viewA?.value!} />\r\n </div>\r\n </CombinedTransition>\r\n )}\r\n\r\n {mountedMode === finalConfig.viewB?.value && (\r\n <CombinedTransition\r\n open={mountedOpen}\r\n timeout={{ enter: animations.enter, exit: animations.exit }}\r\n mountDelay={animations.mountDelay}\r\n animationConfig={animations}\r\n style={{ transformOrigin: animations.transformOriginTable }}\r\n >\r\n <div ref={viewBRef} className={viewBClass}>\r\n <ViewBContent value={finalConfig.viewB?.value!} />\r\n </div>\r\n </CombinedTransition>\r\n )}\r\n </div>\r\n </ViewSwitchTransitionStyled>\r\n )\r\n }\r\n\r\n return ViewSwitchTransition\r\n}\r\n\r\nexport const ViewSwitchTransition = createViewSwitchTransition({})\r\n\r\nexport default ViewSwitchTransition\r\n"],"names":["createViewSwitchTransition","config","classes","viewSwitchTransitionClasses","viewAClass","concat","view","viewA","viewBClass","viewB","props","_props$value","_config$viewA","_finalConfig$viewA3","_finalConfig$viewB2","_finalConfig$viewA4","_finalConfig$viewA5","_finalConfig$viewB3","_finalConfig$viewB4","wrapperRef","useRef","viewARef","viewBRef","_useState","useState","value","_useState2","_slicedToArray","mountedMode","setMountedMode","_useState3","_useState4","mountedOpen","setMountedOpen","pendingModeRef","exitTimerRef","finalConfig","useMemo","_props$viewA","_props$viewB","animations","_props$transitionConf","Object","assign","DEFAULT_ANIMATION","transitionConfig","useEffect","_props$value2","_wrapperRef$current","current","window","clearTimeout","currentHeight","offsetHeight","style","height","transition","enter","ease","setTimeout","nextMode","requestAnimationFrame","_finalConfig$viewA","_ref","_targetRef$current$of","_targetRef$current","_wrapperRef$current2","nextHeight","exit","hold","ViewAContent","_finalConfig$viewA$Co","_finalConfig$viewA2","Content","ViewDefault","ViewBContent","_finalConfig$viewB$Co","_finalConfig$viewB","_jsx","ViewSwitchTransitionStyled","className","root","children","_jsxs","ref","viewWrapper","CombinedTransition","open","timeout","mountDelay","animationConfig","transformOrigin","transformOriginGrid","transformOriginTable"],"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 f}from"../types.js";import{useFilterActions as b}from"../hooks.js";import{mapSpecialLabel as h}from"../helpers.js";import{createChipViewers as g}from"./chip-viewer.js";import{FilterBarContext as v}from"../index.context.js";function x(r){var i=k,n=g();return function(c){var g=o(v),x=g.filterState,k=b(g),C=a(function(){return function(r,e){var t,o=r.fields,a=r.enableQuickSearch,i=void 0===a||a,n=l({},o),c=f.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){return{value:r.toString()}});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.Group,{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",paddingLeft:e.spacing(1),paddingRight:e.spacing(.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 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 g}from"./chip-viewer.js";import{FilterBarContext as v}from"../index.context.js";function x(r){var i=k,n=g();return function(c){var g=o(v),x=g.filterState,k=f(g),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){return{value:r.toString()}});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.Group,{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",marginTop:e.spacing(1),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};
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) => ({ value: item.toString() }))\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.Group 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 paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(0.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","value","length","push","field","items","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","Group","placement","onRemove","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","paddingLeft","spacing","paddingRight","overflowX","overflowY","WebkitOverflowScrolling","scrollbarHeight","flexWrap","minWidth","flex","flexShrink","height","background","palette","grey","borderRadius","minHeight","transition","primary","light","scrollbarColor","scrollbarWidth","marginLeft","iconButtonClasses","textTransform","fontWeight","lineHeight","padding","breakpoints","down","buttonClasses"],"mappings":"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"}
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) => ({ value: item.toString() }))\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.Group 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 marginTop: theme.spacing(1),\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","value","length","push","field","items","sort","a","b","mapFilterStateToFilterData","storeFilter","_jsx","Collapse","in","timeout","unmountOnExit","children","_jsxs","FilterSummaryStyled","className","root","sx","scrollHorizontal","Group","placement","onRemove","removeFilterByFieldValue","Box","Button","size","color","variant","onClick","clearAllFilters","buttonClearAll","startIcon","ClearAllIcon","IconButton","styled","_ref","theme","_defineProperty","concat","display","alignItems","marginTop","spacing","padding","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,2 +1,2 @@
1
- import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{createRequestBuilder as l}from"../http-service/graphql/request-param.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as a}from"./helpers.js";var u=function(t){return"or"===t?"Or":"And"},s=function(t){return"asc"===t?"ASC":"DESC"},f=function(){return t(function t(i){var o=this;e(this,t),r(this,"graphqlBuilder",l({ignoreEmpty:!0})),r(this,"autoMap",function(t){(o.currentObjectMap=t,o.state.storeFilter)&&Object.keys(o.state.storeFilter).forEach(function(e){var r,i=t[e],l=null===(r=o.state.storeFilter)||void 0===r?void 0:r[e];if(i){var n=i.targetfield,a=i.operation;if(i.custom)return void i.custom(o.graphqlBuilder,l,o.state.storeFilter);"equal"===a?o.fillterEqual(e,n):"contains"===a&&o.fillterContains(e,n)}});return o}),r(this,"prebuild",function(t){return o.prebuildFunc=t,o}),this.state=i},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"and",l=u(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"fillterEqual",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t,r){for(var i=0;i<n.length;i++){var l=n[i];"string"==typeof l?t.filter(e,l,{logic:a}):("number"==typeof l||"boolean"==typeof l)&&t.filter(e,l.toString(),{logic:a})}},r),this}},{key:"fillterContains",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t){for(var r=0;r<n.length;r++){var i=n[r];"string"==typeof i?t.filterContains(e,i,{logic:a}):("number"==typeof i||"boolean"==typeof i)&&t.filter(e,i.toString(),{logic:a})}},r),this}},{key:"sort",value:function(t){var e,r,l=this.state.storeSort,u=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},f=u.targetField,c=u.autoSave,v=void 0!==c&&c,h=f?null===(r=this.currentObjectMap)||void 0===r?void 0:r[f]:void 0,d=o();if((null==l?void 0:l.field)===i.sortShuffle){if(null==h||!h.targetfield)return this;var p=null!=d?d:(new Date).getTime().toString();this.graphqlBuilder.seed(h.targetfield,p),v&&n(p)}else{var g;d&&a();var y=null!=l&&l.field?null===(g=this.currentObjectMap)||void 0===g?void 0:g[null==l?void 0:l.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:s(null==l?void 0:l.direction)})}return this}},{key:"quickSearch",value:function(t){var e,r,i=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var l=null!==(e=null===(r=this.state.storeFilter)||void 0===r?void 0:r.quickSearch)&&void 0!==e?e:{values:[],logic:"or"},o=Array.isArray(l.values)?l.values:[l.values];if(!o||o.length<1)return this;var n=u(l.logic),a=Array.isArray(t)?t:[t];return this.filterScope(function(t){a.forEach(function(e){var r,a=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(a&&o&&o.length>0)if(a.custom)a.custom(t,l,i.state.storeFilter);else if(a.targetfield)for(var u=0;u<o.length;u++){var s=o[u];"string"==typeof s?t.filterContains(a.targetfield,s,{logic:n}):("number"==typeof s||"boolean"==typeof s)&&t.filter(a.targetfield,s.toString(),{logic:n})}})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),c=function(t){return new f(t)};export{f as TableFileterConverter,c as createConvertToGraphQL,u as mapLogic,s as mapSortDirection};
1
+ import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{createRequestBuilder as l}from"../http-service/graphql/request-param.js";import{getSeedFromURL as o,setSeedToURL as n,removeSeedFromURL as a}from"./helpers.js";var u=function(t){return"or"===t?"Or":"And"},s=function(t){return"asc"===t?"ASC":"DESC"},f=function(){return t(function t(i){var o=this;e(this,t),r(this,"graphqlBuilder",l({ignoreEmpty:!0})),r(this,"autoMap",function(t){(o.currentObjectMap=t,o.state.storeFilter)&&Object.keys(o.state.storeFilter).forEach(function(e){var r,i=t[e],l=null===(r=o.state.storeFilter)||void 0===r?void 0:r[e];if(i){var n=i.targetfield,a=i.operation;return i.custom?void i.custom(o.graphqlBuilder,l,o.state.storeFilter):"equal"===a?void o.fillterEqual(e,n):void o.fillterContains(e,n)}});return o}),r(this,"prebuild",function(t){return o.prebuildFunc=t,o}),this.state=i},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"and",l=u(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"fillterEqual",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t,r){for(var i=0;i<n.length;i++){var l=n[i];"string"==typeof l?t.filter(e,l,{logic:a}):("number"==typeof l||"boolean"==typeof l)&&t.filter(e,l.toString(),{logic:a})}},r),this}},{key:"fillterContains",value:function(t,e,r){var i,l,o=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!e)return this;var a=u(o.logic);return this.filterScope(function(t){for(var r=0;r<n.length;r++){var i=n[r];"string"==typeof i?t.filterContains(e,i,{logic:a}):("number"==typeof i||"boolean"==typeof i)&&t.filter(e,i.toString(),{logic:a})}},r),this}},{key:"sort",value:function(t){var e,r,l=this.state.storeSort,u=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},f=u.targetField,v=u.autoSave,c=void 0!==v&&v,d=f?null===(r=this.currentObjectMap)||void 0===r?void 0:r[f]:void 0,h=o();if((null==l?void 0:l.field)===i.sortShuffle){if(null==d||!d.targetfield)return this;var p=null!=h?h:(new Date).getTime().toString();this.graphqlBuilder.seed(d.targetfield,p),c&&n(p)}else{var g;h&&a();var y=null!=l&&l.field?null===(g=this.currentObjectMap)||void 0===g?void 0:g[null==l?void 0:l.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:s(null==l?void 0:l.direction)})}return this}},{key:"quickSearch",value:function(t){var e,r,i=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var l=null!==(e=null===(r=this.state.storeFilter)||void 0===r?void 0:r.quickSearch)&&void 0!==e?e:{values:[],logic:"or"},o=Array.isArray(l.values)?l.values:[l.values];if(!o||o.length<1)return this;var n=u(l.logic),a=Array.isArray(t)?t:[t];return this.filterScope(function(t){a.forEach(function(e){var r,a=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(a&&o&&o.length>0)if(a.custom)a.custom(t,l,i.state.storeFilter);else if(a.targetfield)for(var u=0;u<o.length;u++){var s=o[u];"string"==typeof s?t.filterContains(a.targetfield,s,{logic:n}):("number"==typeof s||"boolean"==typeof s)&&t.filter(a.targetfield,s.toString(),{logic:n})}})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),v=function(t){return new f(t)};export{f as TableFileterConverter,v as createConvertToGraphQL,u as mapLogic,s as mapSortDirection};
2
2
  //# sourceMappingURL=convert-to-graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { createRequestBuilder, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object> = (\r\n currentBuilder: RequestParam<TTarget>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object> = {\r\n targetfield?: keyof TTarget\r\n operation?: 'equal' | 'contains'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {\r\n private state: TFilterState<TSource>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n }\r\n private graphqlBuilder = createRequestBuilder<TTarget>({ ignoreEmpty: true })\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n fillterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder, value) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filter(targetField, element, { logic })\r\n } else if (typeof element === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n fillterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const val = values[index]\r\n if (typeof val === 'string') {\r\n builder.filterContains(targetField, val, { logic: finalLogic })\r\n } else if (typeof val === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n } else if (typeof val === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filterContains(fieldMap.targetfield, element, { logic })\r\n } else if (typeof element === 'number') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n if (operation === 'equal') {\r\n this.fillterEqual(key, targetfield)\r\n } else if (operation === 'contains') {\r\n this.fillterContains(key, targetfield)\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n private prebuildFunc?: (rp: RequestParam<TTarget>) => RequestParam<TTarget>\r\n prebuild = (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => {\r\n return new TableFileterConverter<TSource, TTarget>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","createRequestBuilder","ignoreEmpty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","fillterEqual","fillterContains","func","prebuildFunc","value","fn","options","_this2","mergedLogic","filterLogic","scope","b","field","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","builder","index","element","filter","toString","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","val","filterContains","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref","seed","seedTargetField","_ref$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt6","_this$state$storeFilt7","_this3","console","warn","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"qUA6CaA,EAAW,SAACC,GACvB,MAAiB,OAAVA,EAAiB,KAAO,KACjC,EAEaC,EAAmB,SAACC,GAC/B,MAAqB,QAAdA,EAAsB,MAAQ,MACvC,EAEaC,EAAqB,WAI/B,OAAAC,EAFD,SAAAD,EAAYE,GAA4B,IAAAC,EAAAC,KAAAC,OAAAL,GAAAM,EAAAF,KAAA,iBAGfG,EAA8B,CAAEC,aAAa,KAAOF,EAAAF,KAAA,UAqHnE,SAACK,IACTN,EAAKO,iBAAmBD,EAEpBN,EAAKD,MAAMS,cACAC,OAAOC,KAAKV,EAAKD,MAAMS,aAE/BG,QAAQ,SAACC,GAAO,IAAAC,EACbC,EAAYR,EAAOM,GACnBG,UAAUF,EAA4Bb,EAAKD,MAAMS,mBAAW,IAAAK,OAAA,EAAtBA,EAAyBD,GACrE,GAAIE,EAAW,CACb,IAAQE,EAA2BF,EAA3BE,YAAaC,EAAcH,EAAdG,UACrB,GAAIH,EAAUI,OAEZ,YADAJ,EAAUI,OAAOlB,EAAKmB,eAAgBJ,EAAYf,EAAKD,MAAMS,aAG7C,UAAdS,EACFjB,EAAKoB,aAAaR,EAAKI,GACA,aAAdC,GACTjB,EAAKqB,gBAAgBT,EAAKI,EAE7B,CACH,GAEF,OAAOhB,IACRG,EAAAF,KAAA,WAEU,SAACqB,GAEV,OADAtB,EAAKuB,aAAeD,EACbtB,IAnJPC,KAAKF,MAAQA,CACf,EAAC,CAAA,CAAAa,IAAA,cAAAY,MAED,SAAYC,EAAsCC,GAAuB,IAAAC,EAAA1B,KACvE,GAAIA,KAAKF,MAAMS,YAAa,CAC1B,IAAMoB,GAAcF,aAAAA,EAAAA,EAAShC,QAASO,KAAKF,MAAM8B,aAAe,MAC1DnC,EAAQD,EAASmC,GACvB3B,KAAKkB,eAAeW,MAClB,SAACC,GAEC,OADAN,EAAGM,EAAGJ,EAAK5B,MAAMS,aACVuB,CACT,EACA,CAAErC,MAAAA,GAEL,CACD,OAAOO,IACT,GAAC,CAAAW,IAAA,eAAAY,MACD,SAAaQ,EAA4BC,EAA6BP,GAAuB,IAAAQ,EAAAC,EACrFpB,EAAyDmB,QAA/CA,UAAAC,EAAgBlC,KAAKF,MAAMS,mBAAW,IAAA2B,OAAA,EAAtBA,EAAyBH,UAAME,IAAAA,EAAAA,EAAI,CAAEE,OAAQ,IACvEA,EAASC,MAAMC,QAAQvB,EAAWqB,QAAUrB,EAAWqB,OAAS,CAACrB,EAAWqB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAOhC,KAEzC,IAAMP,EAAQD,EAASsB,EAAWrB,OAgBlC,OADAO,KAAKuC,YAdwC,SAACC,EAASjB,GACrD,IAAK,IAAIkB,EAAQ,EAAGA,EAAQN,EAAOG,OAAQG,IAAS,CAClD,IAAMC,EAAUP,EAAOM,GACA,iBAAZC,EACTF,EAAQG,OAAOX,EAAaU,EAAS,CAAEjD,MAAAA,KACX,iBAAZiD,GAGY,kBAAZA,IADhBF,EAAQG,OAAOX,EAAaU,EAAQE,WAAY,CAAEnD,MAAAA,GAKrD,CACF,EACoBgC,GACdzB,IACT,GAAC,CAAAW,IAAA,kBAAAY,MACD,SAAgBQ,EAA4BC,EAA6BP,GAAuB,IAAAoB,EAAAC,EACxFhC,EAAyD+B,QAA/CA,UAAAC,EAAgB9C,KAAKF,MAAMS,mBAAW,IAAAuC,OAAA,EAAtBA,EAAyBf,UAAMc,IAAAA,EAAAA,EAAI,CAAEV,OAAQ,IACvEA,EAASC,MAAMC,QAAQvB,EAAWqB,QAAUrB,EAAWqB,OAAS,CAACrB,EAAWqB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAOhC,KAEzC,IAAM+C,EAAavD,EAASsB,EAAWrB,OAgBvC,OADAO,KAAKuC,YAdwC,SAACC,GAC5C,IAAK,IAAIC,EAAQ,EAAGA,EAAQN,EAAOG,OAAQG,IAAS,CAClD,IAAMO,EAAMb,EAAOM,GACA,iBAARO,EACTR,EAAQS,eAAejB,EAAagB,EAAK,CAAEvD,MAAOsD,KAC1B,iBAARC,GAGQ,kBAARA,IADhBR,EAAQG,OAAOX,EAAagB,EAAIJ,WAAY,CAAEnD,MAAOsD,GAKxD,CACF,EACoBtB,GACdzB,IACT,GAAC,CAAAW,IAAA,OAAAY,MACD,SAAK2B,GAA2E,IAAAC,EAAAC,EACxEC,EAAQrD,KAAKF,MAAMwD,UACzBC,EAAsEJ,QAAtEA,EAA2DD,aAAK,EAALA,EAAOM,gBAAIL,EAAAA,EAAI,CAAE,EAAvDM,EAAeF,EAA5BvB,YAAW0B,EAAAH,EAAmBI,SAAAA,OAAW,IAAHD,GAAQA,EAChDE,EAAYH,EAAuC,QAAxBL,EAAGpD,KAAKM,wBAAL8C,IAAqBA,OAArBA,EAAAA,EAAwBK,QAAmBI,EACzEC,EAAcC,IACpB,IAAIV,aAAAA,EAAAA,EAAOtB,SAAUiC,EAAWC,YAAa,CAC3C,GAAKL,UAAAA,EAAW7C,YAAa,OAAOf,KACpC,IAAMkE,EAAYJ,QAAAA,GAAe,IAAIK,MAAOC,UAAUxB,WACtD5C,KAAKkB,eAAesC,KAAKI,EAAU7C,YAAamD,GAC5CP,GAAUU,EAAaH,EAC5B,KAAM,CAAA,IAAAI,EACDR,GAAaS,IACjB,IAAMxC,EAAQsB,SAAAA,EAAOtB,MAA6B,QAAxBuC,EAAGtE,KAAKM,wBAAgB,IAAAgE,OAAA,EAArBA,EAAwBjB,aAAK,EAALA,EAAOtB,YAAS8B,EACrE,GAAK9B,UAAAA,EAAOhB,YAAa,OAAOf,KAChCA,KAAKkB,eAAesD,KAAKzC,EAAMhB,YAAa,CAAEpB,UAAWD,EAAiB2D,aAAK,EAALA,EAAO1D,YAClF,CACD,OAAOK,IACT,GAAC,CAAAW,IAAA,cAAAY,MACD,SAAYkD,GAAmD,IAAAC,EAAAC,EAAAC,EAAA5E,KACxDA,KAAKM,kBACRuE,QAAQC,KAAK,8FAEf,IAAMhE,EAA6D4D,QAAnDA,EAAsCC,QAAtCA,EAAgB3E,KAAKF,MAAMS,uBAAWoE,SAAtBA,EAAwBI,mBAAWL,IAAAA,EAAAA,EAAI,CAAEvC,OAAQ,GAAI1C,MAAO,MACtF0C,EAASC,MAAMC,QAAQvB,EAAWqB,QAAUrB,EAAWqB,OAAS,CAACrB,EAAWqB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,EAC9B,OAAOtC,KAEzB,IAAMP,EAAQD,EAASsB,EAAWrB,OAC5BuF,EAAe5C,MAAMC,QAAQoC,GAAUA,EAAS,CAACA,GAuBvD,OADAzE,KAAKuC,YArBwC,SAACC,GAC5CwC,EAAatE,QAAQ,SAACqB,GAAS,IAAAkD,EACvBC,EAAgC,QAAxBD,EAAGL,EAAKtE,wBAAgB,IAAA2E,OAAA,EAArBA,EAAwBlD,GACzC,GAAImD,GAAY/C,GAAUA,EAAOG,OAAS,EACxC,GAAI4C,EAASjE,OACXiE,EAASjE,OAAOuB,EAAS1B,EAAY8D,EAAK9E,MAAMS,kBAC3C,GAAI2E,EAASnE,YAClB,IAAK,IAAI0B,EAAQ,EAAGA,EAAQN,EAAOG,OAAQG,IAAS,CAClD,IAAMC,EAAUP,EAAOM,GACA,iBAAZC,EACTF,EAAQS,eAAeiC,EAASnE,YAAa2B,EAAS,CAAEjD,MAAAA,KAC5B,iBAAZiD,GAEY,kBAAZA,IADhBF,EAAQG,OAAOuC,EAASnE,YAAa2B,EAAQE,WAAY,CAAEnD,MAAAA,GAI9D,CAGP,EACD,GAEMO,IACT,GAAC,CAAAW,IAAA,QAAAY,MAiCD,WAEE,OADIvB,KAAKsB,cAActB,KAAKsB,aAAatB,KAAKkB,gBACvClB,KAAKkB,eAAeiE,OAC7B,IAAC,CA5J+B,GA+JrBC,EAAyB,SAA8DtF,GAClG,OAAO,IAAIF,EAAwCE,EACrD"}
1
+ {"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { createRequestBuilder, RequestParam } from '../http-service/graphql/request-param'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, store?: TFieldStore<TSource>) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object> = (\r\n currentBuilder: RequestParam<TTarget>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. Can be 'equal' or 'contains'. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal' hoặc 'contains'. @default 'contains'\r\n */\r\n operation?: 'equal' | 'contains'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object> {\r\n private state: TFilterState<TSource>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n }\r\n private graphqlBuilder = createRequestBuilder<TTarget>({ ignoreEmpty: true })\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n fillterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder, value) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filter(targetField, element, { logic })\r\n } else if (typeof element === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n fillterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n const val = values[index]\r\n if (typeof val === 'string') {\r\n builder.filterContains(targetField, val, { logic: finalLogic })\r\n } else if (typeof val === 'number') {\r\n //TODO: for number type, we can only do equal filter, so we treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n } else if (typeof val === 'boolean') {\r\n //TODO: for boolean type, we also treat it as equal filter\r\n builder.filter(targetField, val.toString(), { logic: finalLogic })\r\n }\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n const element = values[index]\r\n if (typeof element === 'string') {\r\n builder.filterContains(fieldMap.targetfield, element, { logic })\r\n } else if (typeof element === 'number') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n } else if (typeof element === 'boolean') {\r\n builder.filter(fieldMap.targetfield, element.toString(), { logic })\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget>) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.fillterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.fillterContains(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n private prebuildFunc?: (rp: RequestParam<TTarget>) => RequestParam<TTarget>\r\n prebuild = (func: (requestParam: RequestParam<TTarget>) => RequestParam<TTarget>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object>(state: TFilterState<TSource>) => {\r\n return new TableFileterConverter<TSource, TTarget>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","createRequestBuilder","ignoreEmpty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","fillterEqual","fillterContains","func","prebuildFunc","value","fn","options","_this2","mergedLogic","filterLogic","scope","b","field","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","builder","index","element","filter","toString","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","val","filterContains","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref","seed","seedTargetField","_ref$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt6","_this$state$storeFilt7","_this3","console","warn","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{createConvertToGraphQL as i,mapLogic as s,mapSortDirection as a}from"./convert-to-graphql.js";import{isEmptyFilterState as l,removeNullValues as o,isFilterStateEqual as h,setFilterToURL as p,getFilterFromURL as m}from"./helpers.js";import{createFilterBar as c}from"./index.create.js";var n=t(function t(){e(this,t),r(this,"createFilterBar",c),r(this,"createConvertToGraphQL",i),r(this,"mapLogic",s),r(this,"mapDirection",a),r(this,"isEmptyFilterState",l),r(this,"removeNullValues",o),r(this,"isFilterStateEqual",h),r(this,"setFilterToURL",p),r(this,"getFilterFromURL",m)}),u=new n;export{n as DinoFilterBar,u as dinoFilterBar};
1
+ import{createClass as t,classCallCheck as e,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{createFilterBar as i}from"./index.create.js";import{createLocalFilterBuilder as s}from"./local-filter-builder.js";import{createConvertToGraphQL as l,mapLogic as a,mapSortDirection as o}from"./convert-to-graphql.js";import{isEmptyFilterState as h,removeNullValues as m,isFilterStateEqual as p,setFilterToURL as c,getFilterFromURL as n}from"./helpers.js";var u=t(function t(){e(this,t),r(this,"createFilterBar",i),r(this,"createConvertToGraphQL",l),r(this,"createLocalFilterBuilder",s),r(this,"mapLogic",a),r(this,"mapDirection",o),r(this,"isEmptyFilterState",h),r(this,"removeNullValues",m),r(this,"isFilterStateEqual",p),r(this,"setFilterToURL",c),r(this,"getFilterFromURL",n)}),f=new u;export{u as DinoFilterBar,f as dinoFilterBar};
2
2
  //# sourceMappingURL=index.dino.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\nimport { createFilterBar } from './index.create'\r\n\r\nexport class DinoFilterBar {\r\n createFilterBar = createFilterBar as typeof createFilterBar\r\n createConvertToGraphQL = createConvertToGraphQL as typeof createConvertToGraphQL\r\n\r\n // support\r\n mapLogic = mapLogic\r\n mapDirection = mapSortDirection\r\n\r\n // helpers\r\n isEmptyFilterState = isEmptyFilterState\r\n removeNullValues = removeNullValues\r\n isFilterStateEqual = isFilterStateEqual\r\n setFilterToURL = setFilterToURL\r\n getFilterFromURL = getFilterFromURL\r\n}\r\n\r\nexport const dinoFilterBar = new DinoFilterBar()\r\n"],"names":["DinoFilterBar","_createClass","_classCallCheck","_defineProperty","createFilterBar","createConvertToGraphQL","mapLogic","mapSortDirection","isEmptyFilterState","removeNullValues","isFilterStateEqual","setFilterToURL","getFilterFromURL","dinoFilterBar"],"mappings":"qZAIA,IAAaA,EAAaC,EAAA,SAAAD,IAAAE,OAAAF,GAAAG,yBACNC,GAAyCD,gCAClCE,GAEzBF,kBACWG,GAAQH,sBACJI,GAEfJ,4BACqBK,GAAkBL,0BACpBM,GAAgBN,4BACdO,GAAkBP,wBACtBQ,GAAcR,0BACZS,EAAgB,GAGxBC,EAAgB,IAAIb"}
1
+ {"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createFilterBar } from './index.create'\r\nimport { createLocalFilterBuilder } from './local-filter-builder'\r\nimport { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\n\r\nexport class DinoFilterBar {\r\n createFilterBar = createFilterBar\r\n createConvertToGraphQL = createConvertToGraphQL\r\n createLocalFilterBuilder = createLocalFilterBuilder\r\n\r\n // support\r\n mapLogic = mapLogic\r\n mapDirection = mapSortDirection\r\n\r\n // helpers\r\n isEmptyFilterState = isEmptyFilterState\r\n removeNullValues = removeNullValues\r\n isFilterStateEqual = isFilterStateEqual\r\n setFilterToURL = setFilterToURL\r\n getFilterFromURL = getFilterFromURL\r\n}\r\n\r\nexport const dinoFilterBar = new DinoFilterBar()\r\n"],"names":["DinoFilterBar","_createClass","_classCallCheck","_defineProperty","createFilterBar","createConvertToGraphQL","createLocalFilterBuilder","mapLogic","mapSortDirection","isEmptyFilterState","removeNullValues","isFilterStateEqual","setFilterToURL","getFilterFromURL","dinoFilterBar"],"mappings":"0dAKA,IAAaA,EAAaC,EAAA,SAAAD,IAAAE,OAAAF,GAAAG,yBACNC,GAAeD,gCACRE,GAAsBF,kCACpBG,GAE3BH,kBACWI,GAAQJ,sBACJK,GAEfL,4BACqBM,GAAkBN,0BACpBO,GAAgBP,4BACdQ,GAAkBR,wBACtBS,GAAcT,0BACZU,EAAgB,GAGxBC,EAAgB,IAAId"}
@@ -0,0 +1,2 @@
1
+ import{createClass as t,objectSpread2 as e,toConsumableArray as i,typeof as r,classCallCheck as a,defineProperty as n}from"../../_virtual/_rollupPluginBabelHelpers.js";var l=function(){return t(function t(e,i){a(this,t),n(this,"operation","contains"),n(this,"dataFiltered",[]),n(this,"filterState",{}),n(this,"autoMapConfigs",{}),this.data=e,this.filterState=i,this.dataFiltered=e.slice()},[{key:"autoMap",value:function(t){return t&&(this.autoMapConfigs=t),this}},{key:"filter",value:function(t){return null!=t&&t.fields&&(this.autoMapConfigs.fields=e(e({},this.autoMapConfigs.fields),t.fields)),this}},{key:"handleFilter",value:function(){var t,i=this,r=e({},this.autoMapConfigs.fields),a=this.filterState.storeFilter||{},n=null!==(t=this.filterState.filterLogic)&&void 0!==t?t:"and",l=Object.keys(a).filter(function(t){return"quickSearch"!==t&&r[t]});this.dataFiltered=this.dataFiltered.filter(function(t){var e=l.map(function(e){var n,l,o=r[e],s=a[e];if(!o||!s||!s.values||0===s.values.length)return null;var u=null!==(n=o.operation)&&void 0!==n?n:i.operation,f=Array.isArray(s.values)?s.values:[s.values],d=null!==(l=s.logic)&&void 0!==l?l:"and",c=t[e],h=f.map(function(t){return"contains"===u&&"string"==typeof c&&"string"==typeof t?c.toLowerCase().includes(t.toString().toLowerCase()):c===t});return"and"===d?h.every(Boolean):h.some(Boolean)}).filter(function(t){return null!==t});return 0===e.length||("and"===n?e.every(Boolean):e.some(Boolean))})}},{key:"quickSearch",value:function(t){if(null!=t&&t.fields){var e,r=new Set([].concat(i(null!==(e=this.autoMapConfigs.quickSearchFields)&&void 0!==e?e:[]),i(t.fields)));this.autoMapConfigs.quickSearchFields=Array.from(r)}return this}},{key:"handleQuickSearch",value:function(){var t,e,i=null!==(t=this.autoMapConfigs.quickSearchFields)&&void 0!==t?t:[],r=(this.filterState.storeFilter||{}).quickSearch;if(r&&0!==i.length){var a=Array.isArray(r.values)?r.values:[r.values];if(a&&0!==a.length){var n=null!==(e=r.logic)&&void 0!==e?e:"or";this.dataFiltered=this.dataFiltered.filter(function(t){var e=a.map(function(e){return i.some(function(i){var r=t[i];return"string"==typeof r&&"string"==typeof e?r.toLowerCase().includes(e.toString().toLowerCase()):r===e})});return"and"===n?e.every(Boolean):e.some(Boolean)})}}}},{key:"sort",value:function(t){var e;return null!=t&&t.sortFields&&(this.autoMapConfigs.sortFields=[].concat(i(null!==(e=this.autoMapConfigs.sortFields)&&void 0!==e?e:[]),i(t.sortFields))),this}},{key:"handleSort",value:function(){var t,e,i=this.filterState.storeSort,a=(null!==(t=this.autoMapConfigs.sortFields)&&void 0!==t?t:[]).map(String);if(i&&i.field){var n=String(i.field);if(a.includes(n)){var l="asc"===(null!==(e=i.direction)&&void 0!==e?e:"desc")?1:-1;this.dataFiltered.sort(function(t,e){var i=t[n],a=e[n];if(null==i&&null==a)return 0;if(null==i)return-1*l;if(null==a)return 1*l;var o=r(i);return"string"===o&&"string"==typeof a?i.localeCompare(a)*l:"number"===o&&"number"==typeof a?(i-a)*l:"boolean"===o&&"boolean"==typeof a?((i?1:0)-(a?1:0))*l:String(i).localeCompare(String(a))*l})}}}},{key:"build",value:function(){return this.dataFiltered=this.data.slice(),this.handleFilter(),this.handleQuickSearch(),this.handleSort(),this.dataFiltered}}])}(),o=function(t,e){return new l(t,e)};export{l as LocalFilterBuilder,o as createLocalFilterBuilder};
2
+ //# sourceMappingURL=local-filter-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-filter-builder.js","sources":["../../../src/filter-bar/local-filter-builder.ts"],"sourcesContent":["import { TFieldValue, TFilterState } from './types'\r\n\r\ntype TOperation = 'equal' | 'contains'\r\n\r\ntype TAutoMapField = {\r\n /** The operation to use for filtering. 'equal' for exact match, 'contains' for partial match. @default 'contains' */\r\n operation?: TOperation\r\n}\r\n\r\ntype TAutoMapFields<T> = Partial<Record<keyof T, TAutoMapField>>\r\n\r\ntype TAutoMapConfigs<T> = {\r\n fields?: TAutoMapFields<T>\r\n sortFields?: (keyof T)[]\r\n quickSearchFields?: (keyof T)[]\r\n}\r\n\r\nexport class LocalFilterBuilder<T> {\r\n private operation: TOperation = 'contains'\r\n private data: T[]\r\n private dataFiltered: T[] = []\r\n private filterState: TFilterState<T> = {}\r\n constructor(data: T[], filterState: TFilterState<T>) {\r\n this.data = data\r\n this.filterState = filterState\r\n this.dataFiltered = data.slice()\r\n }\r\n\r\n private autoMapConfigs: TAutoMapConfigs<T> = {}\r\n autoMap(configs?: TAutoMapConfigs<T>) {\r\n if (configs) this.autoMapConfigs = configs\r\n return this\r\n }\r\n\r\n //#region filter\r\n /** Register field filter config. Merged with autoMap.fields. */\r\n filter(config?: { fields?: TAutoMapFields<T> }) {\r\n if (config?.fields) this.autoMapConfigs.fields = { ...this.autoMapConfigs.fields, ...config.fields }\r\n return this\r\n }\r\n\r\n private handleFilter() {\r\n const fieldsMap = { ...this.autoMapConfigs.fields } as Record<string, TAutoMapField>\r\n const storeFilter = this.filterState.storeFilter || {}\r\n const globalLogic = this.filterState.filterLogic ?? 'and'\r\n // exclude 'quickSearch' — handled by handleQuickSearch\r\n const activeKeys = Object.keys(storeFilter).filter((k) => k !== 'quickSearch' && fieldsMap[k])\r\n\r\n this.dataFiltered = this.dataFiltered.filter((item) => {\r\n const perFieldResults = activeKeys.map((key) => {\r\n const fieldDef = fieldsMap[key]\r\n const fieldStore: TFieldValue = storeFilter[key as keyof typeof storeFilter]\r\n if (!fieldDef || !fieldStore || !fieldStore.values || fieldStore.values.length === 0) return null\r\n\r\n const op = fieldDef.operation ?? this.operation\r\n const values = Array.isArray(fieldStore.values) ? fieldStore.values : [fieldStore.values]\r\n const fieldLogic = fieldStore.logic ?? 'and'\r\n const itemValue = (item as any)[key]\r\n\r\n const matches = values.map((v) => {\r\n if (op === 'contains' && typeof itemValue === 'string' && typeof v === 'string') {\r\n return itemValue.toLowerCase().includes(v.toString().toLowerCase())\r\n }\r\n return itemValue === v\r\n })\r\n\r\n if (fieldLogic === 'and') return matches.every(Boolean)\r\n return matches.some(Boolean)\r\n })\r\n\r\n const validResults = perFieldResults.filter((r) => r !== null) as boolean[]\r\n if (validResults.length === 0) return true\r\n if (globalLogic === 'and') return validResults.every(Boolean)\r\n return validResults.some(Boolean)\r\n })\r\n }\r\n //#endregion\r\n\r\n //#region quick search\r\n /** Register quickSearch config. Merged with autoMap.quickSearchFields. */\r\n quickSearch(config?: { fields?: (keyof T)[] }) {\r\n if (config?.fields) {\r\n const fieldSet = new Set([...(this.autoMapConfigs.quickSearchFields ?? []), ...config.fields])\r\n this.autoMapConfigs.quickSearchFields = Array.from(fieldSet)\r\n }\r\n return this\r\n }\r\n\r\n private handleQuickSearch() {\r\n const quickFields = (this.autoMapConfigs.quickSearchFields ?? []) as string[]\r\n const storeFilter = this.filterState.storeFilter || {}\r\n const quickStore: TFieldValue = storeFilter['quickSearch' as keyof typeof storeFilter]\r\n\r\n if (!quickStore || quickFields.length === 0) return\r\n const qValues = Array.isArray(quickStore.values) ? quickStore.values : [quickStore.values]\r\n if (!qValues || qValues.length === 0) return\r\n\r\n const qLogic = quickStore.logic ?? 'or'\r\n\r\n this.dataFiltered = this.dataFiltered.filter((item) => {\r\n const matchesForAllQuick = qValues.map((qv) =>\r\n quickFields.some((kf) => {\r\n const val = (item as any)[kf]\r\n if (typeof val === 'string' && typeof qv === 'string') {\r\n return val.toLowerCase().includes(qv.toString().toLowerCase())\r\n }\r\n return val === qv\r\n })\r\n )\r\n return qLogic === 'and' ? matchesForAllQuick.every(Boolean) : matchesForAllQuick.some(Boolean)\r\n })\r\n }\r\n //#endregion\r\n\r\n //#region sort\r\n /** Register sort config. Merged with autoMap.sortFields. */\r\n sort(config?: { sortFields?: (keyof T)[] }) {\r\n if (config?.sortFields) this.autoMapConfigs.sortFields = [...(this.autoMapConfigs.sortFields ?? []), ...config.sortFields]\r\n return this\r\n }\r\n\r\n private handleSort() {\r\n const sortDef = this.filterState.storeSort\r\n const allowedSort = (this.autoMapConfigs.sortFields ?? []).map(String)\r\n\r\n if (!sortDef || !sortDef.field) return\r\n const sortField = String(sortDef.field)\r\n if (!allowedSort.includes(sortField)) return\r\n\r\n const dir = sortDef.direction ?? 'desc'\r\n const multiplier = dir === 'asc' ? 1 : -1\r\n\r\n this.dataFiltered.sort((a, b) => {\r\n const va = (a as any)[sortField]\r\n const vb = (b as any)[sortField]\r\n\r\n if (va == null && vb == null) return 0\r\n if (va == null) return -1 * multiplier\r\n if (vb == null) return 1 * multiplier\r\n\r\n const ta = typeof va\r\n if (ta === 'string' && typeof vb === 'string') return va.localeCompare(vb) * multiplier\r\n if (ta === 'number' && typeof vb === 'number') return (va - vb) * multiplier\r\n if (ta === 'boolean' && typeof vb === 'boolean') return ((va ? 1 : 0) - (vb ? 1 : 0)) * multiplier\r\n return String(va).localeCompare(String(vb)) * multiplier\r\n })\r\n }\r\n //#endregion\r\n\r\n build(): T[] {\r\n this.dataFiltered = this.data.slice()\r\n this.handleFilter()\r\n this.handleQuickSearch()\r\n this.handleSort()\r\n return this.dataFiltered\r\n }\r\n}\r\n\r\nexport const createLocalFilterBuilder = <T>(data: T[], filterState: TFilterState<T>) => {\r\n return new LocalFilterBuilder(data, filterState)\r\n}\r\n"],"names":["LocalFilterBuilder","_createClass","data","filterState","_classCallCheck","_defineProperty","this","dataFiltered","slice","key","value","configs","autoMapConfigs","config","fields","_objectSpread","_this$filterState$fil","_this","fieldsMap","storeFilter","globalLogic","filterLogic","activeKeys","Object","keys","filter","k","item","validResults","map","_fieldDef$operation","_fieldStore$logic","fieldDef","fieldStore","values","length","op","operation","Array","isArray","fieldLogic","logic","itemValue","matches","v","toLowerCase","includes","toString","every","Boolean","some","r","_this$autoMapConfigs$","fieldSet","Set","concat","_toConsumableArray","quickSearchFields","from","_this$autoMapConfigs$2","_quickStore$logic","quickFields","quickStore","qValues","qLogic","matchesForAllQuick","qv","kf","val","_this$autoMapConfigs$3","sortFields","_this$autoMapConfigs$4","_sortDef$direction","sortDef","storeSort","allowedSort","String","field","sortField","multiplier","direction","sort","a","b","va","vb","ta","_typeof","localeCompare","handleFilter","handleQuickSearch","handleSort","createLocalFilterBuilder"],"mappings":"wKAiBA,IAAaA,EAAkB,WAS5B,OAAAC,EAJD,SAAAD,EAAYE,EAAWC,GAA4BC,OAAAJ,GAAAK,mBAJnB,YAAUA,sBAEd,IAAEA,EAAAC,KAAA,cACS,IAAED,EAAAC,KAAA,iBAOI,IAL3CA,KAAKJ,KAAOA,EACZI,KAAKH,YAAcA,EACnBG,KAAKC,aAAeL,EAAKM,OAC3B,EAAC,CAAA,CAAAC,IAAA,UAAAC,MAGD,SAAQC,GAEN,OADIA,IAASL,KAAKM,eAAiBD,GAC5BL,IACT,GAGA,CAAAG,IAAA,SAAAC,MACA,SAAOG,GAEL,OADIA,SAAAA,EAAQC,SAAQR,KAAKM,eAAeE,OAAMC,EAAAA,EAAQ,CAAA,EAAAT,KAAKM,eAAeE,QAAWD,EAAOC,SACrFR,IACT,GAAC,CAAAG,IAAA,eAAAC,MAEO,WAAY,IAAAM,EAAAC,EAAAX,KACZY,EAASH,EAAA,CAAA,EAAQT,KAAKM,eAAeE,QACrCK,EAAcb,KAAKH,YAAYgB,aAAe,CAAE,EAChDC,EAA0CJ,QAA/BA,EAAGV,KAAKH,YAAYkB,mBAAWL,IAAAA,EAAAA,EAAI,MAE9CM,EAAaC,OAAOC,KAAKL,GAAaM,OAAO,SAACC,GAAC,MAAW,gBAANA,GAAuBR,EAAUQ,KAE3FpB,KAAKC,aAAeD,KAAKC,aAAakB,OAAO,SAACE,GAC5C,IAqBMC,EArBkBN,EAAWO,IAAI,SAACpB,GAAO,IAAAqB,EAAAC,EACvCC,EAAWd,EAAUT,GACrBwB,EAA0Bd,EAAYV,GAC5C,IAAKuB,IAAaC,IAAeA,EAAWC,QAAuC,IAA7BD,EAAWC,OAAOC,OAAc,OAAO,KAE7F,IAAMC,EAAuBN,QAArBA,EAAGE,EAASK,iBAASP,IAAAA,EAAAA,EAAIb,EAAKoB,UAChCH,EAASI,MAAMC,QAAQN,EAAWC,QAAUD,EAAWC,OAAS,CAACD,EAAWC,QAC5EM,EAA6B,QAAnBT,EAAGE,EAAWQ,aAAK,IAAAV,EAAAA,EAAI,MACjCW,EAAaf,EAAalB,GAE1BkC,EAAUT,EAAOL,IAAI,SAACe,GAC1B,MAAW,aAAPR,GAA0C,iBAAdM,GAAuC,iBAANE,EACxDF,EAAUG,cAAcC,SAASF,EAAEG,WAAWF,eAEhDH,IAAcE,CACvB,GAEA,MAAmB,QAAfJ,EAA6BG,EAAQK,MAAMC,SACxCN,EAAQO,KAAKD,QACtB,GAEqCxB,OAAO,SAAC0B,GAAC,OAAW,OAANA,IACnD,OAA4B,IAAxBvB,EAAaO,SACG,QAAhBf,EAA8BQ,EAAaoB,MAAMC,SAC9CrB,EAAasB,KAAKD,SAC3B,EACF,GAIA,CAAAxC,IAAA,cAAAC,MACA,SAAYG,GACV,GAAIA,SAAAA,EAAQC,OAAQ,CAAA,IAAAsC,EACZC,EAAW,IAAIC,IAAGC,GAAAA,OAAAC,EAA2CJ,QAA3CA,EAAM9C,KAAKM,eAAe6C,yBAAiBL,IAAAA,EAAAA,EAAI,IAAEI,EAAM3C,EAAOC,UACtFR,KAAKM,eAAe6C,kBAAoBnB,MAAMoB,KAAKL,EACpD,CACD,OAAO/C,IACT,GAAC,CAAAG,IAAA,oBAAAC,MAEO,WAAiB,IAAAiD,EAAAC,EACjBC,EAAoDF,QAAzCA,EAAIrD,KAAKM,eAAe6C,yBAAiBE,IAAAA,EAAAA,EAAI,GAExDG,GADcxD,KAAKH,YAAYgB,aAAe,CAAE,GAC+B,YAErF,GAAK2C,GAAqC,IAAvBD,EAAY1B,OAA/B,CACA,IAAM4B,EAAUzB,MAAMC,QAAQuB,EAAW5B,QAAU4B,EAAW5B,OAAS,CAAC4B,EAAW5B,QACnF,GAAK6B,GAA8B,IAAnBA,EAAQ5B,OAAxB,CAEA,IAAM6B,EAAyB,QAAnBJ,EAAGE,EAAWrB,aAAK,IAAAmB,EAAAA,EAAI,KAEnCtD,KAAKC,aAAeD,KAAKC,aAAakB,OAAO,SAACE,GAC5C,IAAMsC,EAAqBF,EAAQlC,IAAI,SAACqC,GAAE,OACxCL,EAAYX,KAAK,SAACiB,GAChB,IAAMC,EAAOzC,EAAawC,GAC1B,MAAmB,iBAARC,GAAkC,iBAAPF,EAC7BE,EAAIvB,cAAcC,SAASoB,EAAGnB,WAAWF,eAE3CuB,IAAQF,CACjB,KAEF,MAAkB,QAAXF,EAAmBC,EAAmBjB,MAAMC,SAAWgB,EAAmBf,KAAKD,QACxF,EAfsC,CAFO,CAkB/C,GAIA,CAAAxC,IAAA,OAAAC,MACA,SAAKG,GAAqC,IAAAwD,EAExC,OADIxD,SAAAA,EAAQyD,aAAYhE,KAAKM,eAAe0D,WAAUf,GAAAA,OAAAC,UAAAa,EAAQ/D,KAAKM,eAAe0D,kBAAU,IAAAD,EAAAA,EAAI,IAAEb,EAAM3C,EAAOyD,cACxGhE,IACT,GAAC,CAAAG,IAAA,aAAAC,MAEO,WAAU,IAAA6D,EAAAC,EACVC,EAAUnE,KAAKH,YAAYuE,UAC3BC,WAAcJ,EAACjE,KAAKM,eAAe0D,kBAAU,IAAAC,EAAAA,EAAI,IAAI1C,IAAI+C,QAE/D,GAAKH,GAAYA,EAAQI,MAAzB,CACA,IAAMC,EAAYF,OAAOH,EAAQI,OACjC,GAAKF,EAAY7B,SAASgC,GAA1B,CAEA,IACMC,EAAqB,SADE,QAApBP,EAAGC,EAAQO,iBAAS,IAAAR,EAAAA,EAAI,QACE,GAAM,EAEzClE,KAAKC,aAAa0E,KAAK,SAACC,EAAGC,GACzB,IAAMC,EAAMF,EAAUJ,GAChBO,EAAMF,EAAUL,GAEtB,GAAU,MAANM,GAAoB,MAANC,EAAY,OAAO,EACrC,GAAU,MAAND,EAAY,OAAO,EAAKL,EAC5B,GAAU,MAANM,EAAY,OAAO,EAAIN,EAE3B,IAAMO,EAAEC,EAAUH,GAClB,MAAW,WAAPE,GAAiC,iBAAPD,EAAwBD,EAAGI,cAAcH,GAAMN,EAClE,WAAPO,GAAiC,iBAAPD,GAAyBD,EAAKC,GAAMN,EACvD,YAAPO,GAAkC,kBAAPD,IAA2BD,EAAK,EAAI,IAAMC,EAAK,EAAI,IAAMN,EACjFH,OAAOQ,GAAII,cAAcZ,OAAOS,IAAON,CAChD,EAlBsC,CAFN,CAqBlC,GACA,CAAAtE,IAAA,QAAAC,MAEA,WAKE,OAJAJ,KAAKC,aAAeD,KAAKJ,KAAKM,QAC9BF,KAAKmF,eACLnF,KAAKoF,oBACLpF,KAAKqF,aACErF,KAAKC,YACd,IAAC,CA1I4B,GA6IlBqF,EAA2B,SAAI1F,EAAWC,GACrD,OAAO,IAAIH,EAAmBE,EAAMC,EACtC"}
@@ -1,4 +1,4 @@
1
- import { DataSurfaceViewMode, LoadingModeRule } from './types';
1
+ import { DataSurfaceViewMode, LoadingModeRule, DataSurfaceFeatureMode } from './types';
2
2
  import type { BoxProps } from '@mui/material';
3
3
  import type { ComponentType, FC } from 'react';
4
4
  import type { IViewGridConfig, IViewGridProps } from './view-grid/types';
@@ -25,6 +25,8 @@ export interface IDataSurfaceProps<T> {
25
25
  viewMode?: DataSurfaceViewMode;
26
26
  /** Pagination metadata shared by both modes. */
27
27
  pagination?: TPagination;
28
+ /** Default page size. @default 20 */
29
+ defaultPageSize?: number;
28
30
  /** True while a page fetch is in flight (shows loading indicator). */
29
31
  loading?: boolean;
30
32
  /**
@@ -40,21 +42,27 @@ export interface IDataSurfaceProps<T> {
40
42
  slots?: IDataSurfaceSlots;
41
43
  /** Enable row selection with checkboxes (List view only). */
42
44
  selectable?: boolean;
43
- /** Array of selected row IDs (controlled). */
45
+ /** Array of selected row IDs (List view only). */
44
46
  selectedIds?: (string | number)[];
45
- /** Callback when selection changes. */
47
+ /** Callback when selection changes (List view only). */
46
48
  onSelectionChange?: (selectedIds: (string | number)[]) => void;
47
49
  }
48
50
  export interface IDataSurfaceConfig<T> {
51
+ /** Feature mode determines the internal optimizations and rendering strategies. @default 'client' */
52
+ featureMode?: DataSurfaceFeatureMode;
53
+ /** Default view mode when not provided via props. @default 'grid' */
49
54
  defaultViewMode?: DataSurfaceViewMode;
50
55
  /** Default load mode when not provided via props. @default 'pagination' */
51
56
  defaultLoadMode?: LoadingModeRule;
52
57
  /** Default page size. @default 20 */
53
58
  defaultPageSize?: number;
54
- enableSingleViewTransition?: boolean;
59
+ /** Configuration for List view. If not provided, List view will use default settings. */
55
60
  listConfig?: IViewListConfig<T>;
61
+ /** Custom List component. If not provided, a default List component will be used. */
56
62
  ListComponent?: ComponentType<IViewListProps<T>>;
63
+ /** Configuration for Grid view. If not provided, Grid view will use default settings. */
57
64
  gridConfig?: IViewGridConfig<T>;
65
+ /** Custom Grid component. If not provided, a default Grid component will be used. */
58
66
  GridComponent?: ComponentType<IViewGridProps<T>>;
59
67
  }
60
68
  export declare function createDataSurface<T>(config: IDataSurfaceConfig<T>): FC<IDataSurfaceProps<T>>;
@@ -9,6 +9,8 @@ export declare class DinoDataSurFace {
9
9
  createViewList: typeof createViewList;
10
10
  ButtonSwitch: import("react").FC<import("./button-switch").IButtonSwitchProps>;
11
11
  createButtonSwitch: () => import("react").FC<import("./button-switch").IButtonSwitchProps>;
12
+ PanelPaginationFooter: import("react").FC<import("./ui.units").IPanelPaginationFooterProps>;
13
+ createPanelPaginationFooter: () => import("react").FC<import("./ui.units").IPanelPaginationFooterProps>;
12
14
  setViewModeToURL: typeof setViewModeToURL;
13
15
  getViewModeFromURL: typeof getViewModeFromURL;
14
16
  setPaginationToURL: typeof setPaginationToURL;
@@ -8,6 +8,11 @@ export type TPagination = {
8
8
  hasPrev?: boolean;
9
9
  total?: number;
10
10
  };
11
+ export declare const DataSurfaceFeatureMode: {
12
+ readonly client: "client";
13
+ readonly server: "server";
14
+ };
15
+ export type DataSurfaceFeatureMode = keyof typeof DataSurfaceFeatureMode;
11
16
  /**
12
17
  * Controls how the list is rendered into the DOM.
13
18
  * - `normal` — all rows are mounted (suitable for small datasets)
@@ -36,4 +36,6 @@ export interface IViewGridProps<T> extends IViewGridBase<T> {
36
36
  value: T[];
37
37
  /** Called when user scrolls near the bottom of the list. Use this to trigger pagination or infinity load. */
38
38
  onNearEnd?: () => void;
39
+ /** When this value changes, the scroll position resets to top (virtualized mode only). */
40
+ scrollResetToken?: unknown;
39
41
  }
@@ -99,4 +99,6 @@ export interface IViewListProps<T> extends IViewListBase<T> {
99
99
  selectedIds?: (string | number)[];
100
100
  /** Callback when selection changes. */
101
101
  onSelectionChange?: (selectedIds: (string | number)[]) => void;
102
+ /** When this value changes, the scroll position resets to top (virtualized mode only). */
103
+ scrollResetToken?: unknown;
102
104
  }
@@ -1,5 +1,5 @@
1
1
  import type { FC, ReactNode, ComponentType } from 'react';
2
- import { TAnimationConfig } from './view-switch-transition.units';
2
+ import type { TAnimationConfig } from './view-switch-transition.units';
3
3
  type TViewSwitchTransitionConfig<T extends string = string> = {
4
4
  value: T;
5
5
  label?: string;