dinocollab-core 2.2.31 → 2.2.33

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 (28) hide show
  1. package/dist/src/data-surface/index.create.js +1 -1
  2. package/dist/src/data-surface/index.create.js.map +1 -1
  3. package/dist/src/data-surface/ui.units.js +1 -1
  4. package/dist/src/data-surface/ui.units.js.map +1 -1
  5. package/dist/src/data-surface/view-grid/index.js +1 -1
  6. package/dist/src/data-surface/view-grid/index.js.map +1 -1
  7. package/dist/src/data-surface/view-list/index.js +1 -1
  8. package/dist/src/data-surface/view-list/index.js.map +1 -1
  9. package/dist/src/filter-bar/convert-to-graphql.js +1 -1
  10. package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
  11. package/dist/src/filter-bar/index.create.js +1 -1
  12. package/dist/src/filter-bar/index.create.js.map +1 -1
  13. package/dist/src/filter-bar/local-filter-builder.js +1 -1
  14. package/dist/src/filter-bar/local-filter-builder.js.map +1 -1
  15. package/dist/src/filter-bar/menu/create-form-field-number.js +1 -1
  16. package/dist/src/filter-bar/menu/create-form-field-number.js.map +1 -1
  17. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
  18. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
  19. package/dist/src/filter-bar/menu/create-form-field-select.js +1 -1
  20. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -1
  21. package/dist/src/filter-bar/menu/create-form-field-string.js +1 -1
  22. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -1
  23. package/dist/src/filter-bar/types.js.map +1 -1
  24. package/dist/types/filter-bar/index.create.d.ts +1 -1
  25. package/dist/types/filter-bar/menu/create-form-field-select.d.ts +2 -0
  26. package/dist/types/filter-bar/menu/types.d.ts +1 -1
  27. package/dist/types/filter-bar/types.d.ts +2 -2
  28. 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, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, CHECKBOX_COL_WIDTH, mapSxTableCell, resolveFlexColumnWidths, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup(resolvedWidths: Array<number | string | undefined>, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {resolvedWidths.map((w, i) => (\r\n <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n ))}\r\n </colgroup>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n\r\n useLayoutEffect(() => {\r\n if (!scrollContainerRef.current) return\r\n const el = scrollContainerRef.current\r\n const update = () =>\r\n setContainerWidth((prev) => {\r\n const next = el.clientWidth\r\n return prev === next ? prev : next\r\n })\r\n update()\r\n const observer = new ResizeObserver(update)\r\n observer.observe(el)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex], { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowStrideRef = useRef(0)\r\n const headerHeightScrollRef = useRef(LIST_HEADER_HEIGHT)\r\n const overscanScrollRef = useRef(overscan)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders cannot\r\n // reset the reference point into a stale state-coordinate value (causing a stuck dead zone).\r\n const lastFiredScrollTopRef = useRef(0)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Skip scroll state update if the virtual window (start row) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders cannot reset the dead zone into a stale state-coordinate value.\r\n const rs = rowStrideRef.current\r\n const lastFiredAdj = Math.max(0, lastFiredScrollTopRef.current - headerHeightScrollRef.current)\r\n const lastFiredStart = rs > 0 ? Math.max(0, Math.floor(lastFiredAdj / rs) - overscanScrollRef.current) : 0\r\n const adjustedScrollTop = Math.max(0, domScrollTop - headerHeightScrollRef.current)\r\n const newStart = rs > 0 ? Math.max(0, Math.floor(adjustedScrollTop / rs) - overscanScrollRef.current) : 0\r\n if (newStart === lastFiredStart) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\r\n })\r\n }\r\n\r\n // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) {\r\n const rounded = Math.round(domScrollTop)\r\n lastFiredScrollTopRef.current = rounded\r\n setScrollTopState(rounded)\r\n }\r\n\r\n const updateSize = () => {\r\n const el = wrapRef.current\r\n if (!el) return\r\n const nextHeight = el.clientHeight\r\n const nextWidth = el.clientWidth\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const intRowHeight = Math.round(rowHeight)\r\n const intRowSpacing = Math.round(rowSpacing)\r\n const rowStride = intRowHeight + intRowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n let start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n let end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n // NOTE: The bottom-clamp that previously pinned start when end===totalItems-1\r\n // has been removed. That clamp decoupled start from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → start changed even\r\n // though scrollTopState was unchanged).\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n // Keep refs in sync for RAF window-change detection (read in handleScroll, never during render).\r\n rowStrideRef.current = Math.round(mergedConfig.rowHeight) + Math.round(mergedConfig.rowSpacing)\r\n headerHeightScrollRef.current = headerHeight\r\n overscanScrollRef.current = overscan\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n const rowsToRender = useMemo(\r\n () => (windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []),\r\n [props.value, windowed.start, windowed.end]\r\n )\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex], { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","renderColGroup","resolvedWidths","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","w","i","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","tableMinWidth","columns","reduce","sum","col","_col$minWidth","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","_useState","useState","_useState2","_slicedToArray","containerWidth","setContainerWidth","useLayoutEffect","current","el","update","prev","next","clientWidth","observer","ResizeObserver","observe","disconnect","useMemo","resolveFlexColumnWidths","useEffect","scrollResetToken","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","sx","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","colIndex","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_col$minWidth2","wrapRef","headerRowRef","hasHeaderMeasuredRef","scrollRafRef","latestScrollTopRef","_useState3","_useState4","containerHeight","setContainerHeight","_useState5","_useState6","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","LIST_HEADER_HEIGHT","_useState0","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","rowStrideRef","headerHeightScrollRef","overscanScrollRef","lastFiredScrollTopRef","cancelAnimationFrame","domScrollTop","rounded","round","updateSize","nextHeight","nextWidth","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","newScrollTop","requestAnimationFrame","_wrapRef$current$scro","_wrapRef$current","rs","lastFiredAdj","lastFiredStart","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, CHECKBOX_COL_WIDTH, mapSxTableCell, resolveFlexColumnWidths, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\nfunction renderColGroup(resolvedWidths: Array<number | string | undefined>, selectable: boolean) {\r\n return (\r\n <colgroup>\r\n {selectable && <col style={{ width: CHECKBOX_COL_WIDTH }} />}\r\n {resolvedWidths.map((w, i) => (\r\n <col key={i} style={w !== undefined ? { width: w as any } : undefined} />\r\n ))}\r\n </colgroup>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n\r\n useLayoutEffect(() => {\r\n if (!scrollContainerRef.current) return\r\n const el = scrollContainerRef.current\r\n const update = () =>\r\n setContainerWidth((prev) => {\r\n const next = el.clientWidth\r\n return prev === next ? prev : next\r\n })\r\n update()\r\n const observer = new ResizeObserver(update)\r\n observer.observe(el)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex], { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const tableMinWidth =\r\n (mergedConfig.selectable ? CHECKBOX_COL_WIDTH : 0) +\r\n mergedConfig.columns.reduce((sum, col) => {\r\n if (col.width !== undefined) return sum + (typeof col.width === 'number' ? col.width : 0)\r\n return sum + (col.minWidth ?? 0)\r\n }, 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n // Refs for RAF-throttled scroll: scrollRafRef guards duplicate frames, latestScrollTopRef\r\n // always holds the most recent scrollTop so the RAF reads the freshest value even if\r\n // intermediate scroll events were skipped.\r\n const scrollRafRef = useRef<number | null>(null)\r\n const latestScrollTopRef = useRef(0)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n // Refs for window-change detection — updated on every render so the handleScroll RAF reads fresh values\r\n // without needing to re-create the callback. The initial value is overwritten immediately on first render.\r\n const rowStrideRef = useRef(0)\r\n const headerHeightScrollRef = useRef(LIST_HEADER_HEIGHT)\r\n const overscanScrollRef = useRef(overscan)\r\n // lastFiredScrollTopRef tracks the DOM scrollTop at the last actual setScrollTopState call.\r\n // The skip check compares both sides in DOM-coordinate space so non-scroll renders cannot\r\n // reset the reference point into a stale state-coordinate value (causing a stuck dead zone).\r\n const lastFiredScrollTopRef = useRef(0)\r\n\r\n // Reset scroll to top when token changes\r\n useEffect(() => {\r\n if (props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n latestScrollTopRef.current = 0\r\n lastFiredScrollTopRef.current = 0\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n setScrollTopState(0)\r\n }, [props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n const newScrollTop = Math.round(t.scrollTop)\r\n latestScrollTopRef.current = newScrollTop\r\n\r\n // nearEnd check is urgent — fire immediately outside RAF\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n\r\n // Throttle virtualization state updates to one per animation frame.\r\n if (scrollRafRef.current !== null) return\r\n scrollRafRef.current = requestAnimationFrame(() => {\r\n scrollRafRef.current = null\r\n // Always read the real DOM scrollTop inside the RAF — do NOT rely on latestScrollTopRef.\r\n // latestScrollTopRef can be stale if browser scroll-anchoring silently adjusts scrollTop\r\n // (e.g. when bottomSpacer grows after loadMore) without firing a new scroll event.\r\n const domScrollTop = Math.round(wrapRef.current?.scrollTop ?? latestScrollTopRef.current)\r\n latestScrollTopRef.current = domScrollTop\r\n\r\n // Skip scroll state update if the virtual window (start row) wouldn't change.\r\n // Both sides are computed from DOM-coordinate values (lastFiredScrollTopRef and domScrollTop)\r\n // so non-scroll renders cannot reset the dead zone into a stale state-coordinate value.\r\n const rs = rowStrideRef.current\r\n const lastFiredAdj = Math.max(0, lastFiredScrollTopRef.current - headerHeightScrollRef.current)\r\n const lastFiredStart = rs > 0 ? Math.max(0, Math.floor(lastFiredAdj / rs) - overscanScrollRef.current) : 0\r\n const adjustedScrollTop = Math.max(0, domScrollTop - headerHeightScrollRef.current)\r\n const newStart = rs > 0 ? Math.max(0, Math.floor(adjustedScrollTop / rs) - overscanScrollRef.current) : 0\r\n if (newStart === lastFiredStart) return\r\n\r\n lastFiredScrollTopRef.current = domScrollTop\r\n setScrollTopState(domScrollTop)\r\n })\r\n }\r\n\r\n // Cancel any pending scroll RAF on unmount to prevent setState on an unmounted component.\r\n useEffect(() => {\r\n return () => {\r\n if (scrollRafRef.current !== null) {\r\n cancelAnimationFrame(scrollRafRef.current)\r\n scrollRafRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n // Sync scrollTopState from actual DOM scroll position on mount.\r\n // Guards against stale state when the component is reused across navigations\r\n // (browser may have preserved a non-zero scrollTop while React state reset to 0).\r\n const domScrollTop = wrapRef.current.scrollTop\r\n if (domScrollTop > 0) {\r\n const rounded = Math.round(domScrollTop)\r\n lastFiredScrollTopRef.current = rounded\r\n setScrollTopState(rounded)\r\n }\r\n\r\n const updateSize = () => {\r\n const el = wrapRef.current\r\n if (!el) return\r\n const nextHeight = el.clientHeight\r\n const nextWidth = el.clientWidth\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n setContainerWidth((prev) => (prev === nextWidth ? prev : nextWidth))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n // Container not yet measured — render from start with no spacers to avoid\r\n // the bottom-clamp formula producing start > 0 with a stale visibleCount of 1.\r\n if (containerHeight === 0) {\r\n const defaultVisible = overscan * 2 + 1\r\n return { start: 0, end: Math.min(totalItems - 1, defaultVisible), topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const intRowHeight = Math.round(rowHeight)\r\n const intRowSpacing = Math.round(rowSpacing)\r\n const rowStride = intRowHeight + intRowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n let start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n let end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n // NOTE: The bottom-clamp that previously pinned start when end===totalItems-1\r\n // has been removed. That clamp decoupled start from scrollTopState, causing a\r\n // visual jump when loadMore added items (clamp released → start changed even\r\n // though scrollTopState was unchanged).\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, intRowHeight, intRowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, intRowHeight, intRowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n // Keep refs in sync for RAF window-change detection (read in handleScroll, never during render).\r\n rowStrideRef.current = Math.round(mergedConfig.rowHeight) + Math.round(mergedConfig.rowSpacing)\r\n headerHeightScrollRef.current = headerHeight\r\n overscanScrollRef.current = overscan\r\n\r\n const resolvedWidths = useMemo(\r\n () => resolveFlexColumnWidths(mergedConfig.columns, mergedConfig.selectable, containerWidth),\r\n [mergedConfig.columns, mergedConfig.selectable, containerWidth]\r\n )\r\n\r\n const rowsToRender = useMemo(\r\n () => (windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []),\r\n [props.value, windowed.start, windowed.end]\r\n )\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table} sx={{ minWidth: tableMinWidth }}>\r\n {renderColGroup(resolvedWidths, mergedConfig.selectable)}\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={String(col.field)}\r\n className={classes.tableHeaderCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex])}\r\n >\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col, colIndex) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, resolvedWidths[colIndex], { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n // Guard against duplicate calls during the window between onPageChange and loading=true propagating back\r\n const pendingRef = useRef(false)\r\n\r\n // Sync pendingRef when loading resets externally (e.g. error path where onPageChange didn't resolve)\r\n useEffect(() => {\r\n if (!props.loading) pendingRef.current = false\r\n }, [props.loading])\r\n\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n if (pendingRef.current) return\r\n\r\n pendingRef.current = true\r\n try {\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n } finally {\r\n pendingRef.current = false\r\n }\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n normalOptions={props.normalOptions}\r\n virtualizedOptions={props.virtualizedOptions}\r\n onNearEnd={props.loadMode === 'infiniteScroll' ? handleNearEnd : undefined}\r\n selectable={props.selectable}\r\n selectedIds={props.selectedIds}\r\n onSelectionChange={props.onSelectionChange}\r\n scrollResetToken={props.scrollResetToken}\r\n />\r\n )\r\n }\r\n\r\n return ViewListLoading\r\n}\r\n\r\nexport default createViewList\r\n//#endregion\r\n"],"names":["renderCellValue","column","row","index","currentValue","field","value","valueGetter","params","renderCell","valueLabel","String","_jsx","Typography","variant","noWrap","title","renderColGroup","resolvedWidths","selectable","_jsxs","style","width","CHECKBOX_COL_WIDTH","map","w","i","undefined","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","tableMinWidth","columns","reduce","sum","col","_col$minWidth","minWidth","isAutoHeight","normalOptions","autoHeight","onSelectionChange","scrollContainerRef","useRef","_useState","useState","_useState2","_slicedToArray","containerWidth","setContainerWidth","useLayoutEffect","current","el","update","prev","next","clientWidth","observer","ResizeObserver","observe","disconnect","useMemo","resolveFlexColumnWidths","useEffect","scrollResetToken","scrollTop","selection","useListSelection","getterId","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","l","classes","root","normal","push","join","ViewListStyled","className","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","Table","size","table","sx","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","Checkbox","checked","indeterminate","onChange","colIndex","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","_col$minWidth2","wrapRef","headerRowRef","hasHeaderMeasuredRef","scrollRafRef","latestScrollTopRef","_useState3","_useState4","containerHeight","setContainerHeight","_useState5","_useState6","_useState7","_useState8","scrollTopState","setScrollTopState","_useState9","LIST_HEADER_HEIGHT","_useState0","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","rowStrideRef","headerHeightScrollRef","overscanScrollRef","lastFiredScrollTopRef","cancelAnimationFrame","domScrollTop","rounded","round","updateSize","nextHeight","nextWidth","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","defaultVisible","min","rowSpacing","intRowHeight","intRowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","visibleCount","ceil","floor","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","newScrollTop","requestAnimationFrame","_wrapRef$current$scro","_wrapRef$current","rs","lastFiredAdj","lastFiredStart","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","pendingRef","loading","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","_context","p","n","loadMode","a","pagination","hasNext","page","pageSize","onPageChange","f","density","spacing"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createClass as t,createForOfIteratorHelper as e,objectWithoutProperties as r,typeof as i,classCallCheck as l,defineProperty as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as o}from"./types.js";import{getSeedFromURL as n,setSeedToURL as u,removeSeedFromURL as s}from"./helpers.js";import{createRequestBuilder as f}from"../http-service/graphql/request-param.js";import{decodeNumberValue as c}from"./menu/create-form-field-number.js";var v=["mode"],d=function(t){return"or"===t?"Or":"And"},h=function(t){return"asc"===t?"ASC":"DESC"};function g(t,e,l,a){var o=a||{},n=o.mode,u=r(o,v),s=i(l);switch(s){case"string":"equal"===n?e.filter(t,l.toString(),u):e.filterContains(t,l.toString(),u);break;case"number":e.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var p=function(){return t(function t(e){var r=this;l(this,t),a(this,"autoMap",function(t){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(e){var i,l=t[e],a=null===(i=r.state.storeFilter)||void 0===i?void 0:i[e];if(l){var o=l.targetfield,n=l.operation;if(l.custom)return void l.custom(r.graphqlBuilder,a,r.state.storeFilter);switch(n){case"equal":return void r.filterEqual(e,o);case"equalAndAny":return void r.filterEqual(e,o,{isAny:!0});case"datetime":return void r.filterDatetime(e,o);case"number":return void r.filterNumber(e,o);default:return void r.filterContains(e,o)}}});return r}),a(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e,this.graphqlBuilder=f({ignoreEmpty:!0})},[{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=d(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){if(null!=r&&r.isAny)t.filterCustom("".concat(null==e?void 0:e.toString(),".isAny(").concat(JSON.stringify(o),")"),{logic:n});else for(var i=0;i<o.length;i++)g(e,t,o[i],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)g(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLessEqual(e,o[0].toString());break;case"after":t.filterGreaterEqual(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"filterNumber",value:function(t,r,i){var l,a,o=null!==(l=null===(a=this.state.storeFilter)||void 0===a?void 0:a[t])&&void 0!==l?l:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!r)return this;var u={eq:"==",lt:"<",lte:"<=",gt:">",gte:">="},s=d(o.logic);return this.filterScope(function(t){var i,l=e(n);try{for(l.s();!(i=l.n()).done;){var a=i.value,o=c(a);if(o){var f=u[o.operator];t.filterNumber(r,f,o.num.toString(),{logic:s})}}}catch(t){l.e(t)}finally{l.f()}},i),this}},{key:"sort",value:function(t){var e,r,i=this.state.storeSort,l=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},a=l.targetField,f=l.autoSave,c=void 0!==f&&f,v=a?null===(r=this.currentObjectMap)||void 0===r?void 0:r[a]:void 0,d=n();if((null==i?void 0:i.field)===o.sortShuffle){if(null==v||!v.targetfield)return this;var g=null!=d?d:(new Date).getTime().toString();this.graphqlBuilder.seed(v.targetfield,g),c&&u(g)}else{var p;d&&s();var m=null!=i&&i.field?null===(p=this.currentObjectMap)||void 0===p?void 0:p[null==i?void 0:i.field]:void 0;if(null==m||!m.targetfield)return this;this.graphqlBuilder.sort(m.targetfield,{direction:h(null==i?void 0:i.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"},a=Array.isArray(l.values)?l.values:[l.values];if(!a||a.length<1)return this;var o=d(l.logic),n=Array.isArray(t)?t:[t];return this.filterScope(function(t){n.forEach(function(e){var r,n=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(n&&a.length>0)if(n.custom)n.custom(t,l,i.state.storeFilter);else if(n.targetfield)for(var u=0;u<a.length;u++)g(n.targetfield,t,a[u],{logic:o})})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),m=function(t){return new p(t)};export{p as TableFileterConverter,m as createConvertToGraphQL,d as mapLogic,h as mapSortDirection};
1
+ import{createClass as t,createForOfIteratorHelper as e,objectWithoutProperties as r,typeof as i,classCallCheck as l,defineProperty as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as o}from"./types.js";import{getSeedFromURL as n,setSeedToURL as u,removeSeedFromURL as s}from"./helpers.js";import{createRequestBuilder as f}from"../http-service/graphql/request-param.js";import{decodeNumberValue as c}from"./menu/create-form-field-number.js";var v=["mode"],d=function(t){return"or"===t?"Or":"And"},h=function(t){return"asc"===t?"ASC":"DESC"};function g(t,e,l,a){var o=a||{},n=o.mode,u=r(o,v),s=i(l);switch(s){case"string":"equal"===n?e.filter(t,l.toString(),u):e.filterContains(t,l.toString(),u);break;case"number":e.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var p=function(){return t(function t(e){var r=this;l(this,t),a(this,"autoMap",function(t){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(e){var i,l=t[e],a=null===(i=r.state.storeFilter)||void 0===i?void 0:i[e];if(l){var o=l.targetfield,n=l.operation;if(l.custom)return void l.custom(r.graphqlBuilder,a,r.state.storeFilter);switch(n){case"equal":return void r.filterEqual(e,o);case"equalAndAny":return void r.filterEqual(e,o,{isAny:!0});case"datetime":return void r.filterDatetime(e,o);case"number":return void r.filterNumber(e,o);default:return void r.filterContains(e,o)}}});return r}),a(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e,this.graphqlBuilder=f({ignoreEmpty:!0})},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"or",l=d(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){if(null!=r&&r.isAny)t.filterCustom("".concat(null==e?void 0:e.toString(),".isAny(").concat(JSON.stringify(o),")"),{logic:n});else for(var i=0;i<o.length;i++)g(e,t,o[i],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)g(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLessEqual(e,o[0].toString());break;case"after":t.filterGreaterEqual(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"filterNumber",value:function(t,r,i){var l,a,o=null!==(l=null===(a=this.state.storeFilter)||void 0===a?void 0:a[t])&&void 0!==l?l:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!r)return this;var u={eq:"==",lt:"<",lte:"<=",gt:">",gte:">="},s=d(o.logic);return this.filterScope(function(t){var i,l=e(n);try{for(l.s();!(i=l.n()).done;){var a=i.value,o=c(a);if(o){var f=u[o.operator];t.filterNumber(r,f,o.num.toString(),{logic:s})}}}catch(t){l.e(t)}finally{l.f()}},i),this}},{key:"sort",value:function(t){var e,r,i=this.state.storeSort,l=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},a=l.targetField,f=l.autoSave,c=void 0!==f&&f,v=a?null===(r=this.currentObjectMap)||void 0===r?void 0:r[a]:void 0,d=n();if((null==i?void 0:i.field)===o.sortShuffle){if(null==v||!v.targetfield)return this;var g=null!=d?d:(new Date).getTime().toString();this.graphqlBuilder.seed(v.targetfield,g),c&&u(g)}else{var p;d&&s();var m=null!=i&&i.field?null===(p=this.currentObjectMap)||void 0===p?void 0:p[null==i?void 0:i.field]:void 0;if(null==m||!m.targetfield)return this;this.graphqlBuilder.sort(m.targetfield,{direction:h(null==i?void 0:i.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"},a=Array.isArray(l.values)?l.values:[l.values];if(!a||a.length<1)return this;var o=d(l.logic),n=Array.isArray(t)?t:[t];return this.filterScope(function(t){n.forEach(function(e){var r,n=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(n&&a.length>0)if(n.custom)n.custom(t,l,i.state.storeFilter);else if(n.targetfield)for(var u=0;u<a.length;u++)g(n.targetfield,t,a[u],{logic:o})})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),m=function(t){return new p(t)};export{p as TableFileterConverter,m as createConvertToGraphQL,d as mapLogic,h 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.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 { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\nimport { decodeNumberValue } from './menu/create-form-field-number'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic, TNumberOperator } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n store?: TFieldStore<TSource>\r\n) => 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, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\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, U 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. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. @default 'contains'\r\n */\r\n operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number'\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, U>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>\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\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object, U extends object = {}>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget, U>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {\r\n private state: TFilterState<TSource>\r\n private graphqlBuilder: RequestParam<TTarget, U>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n this.graphqlBuilder = createRequestBuilder<TTarget, U>({ ignoreEmpty: true })\r\n }\r\n\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, 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 as unknown as RequestParam<TTarget, U>, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & { isAny?: boolean }) {\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, U> = (builder) => {\r\n if (options?.isAny) {\r\n builder.filterCustom(`${targetField?.toString()}.isAny(${JSON.stringify(values)})`, { logic })\r\n } else {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(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, U> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(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 if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLessEqual(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreaterEqual(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n filterNumber(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 operatorMap: Record<TNumberOperator, string> = {\r\n eq: '==',\r\n lt: '<',\r\n lte: '<=',\r\n gt: '>',\r\n gte: '>='\r\n }\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (const encoded of values) {\r\n const decoded = decodeNumberValue(encoded)\r\n if (!decoded) continue\r\n const op = operatorMap[decoded.operator]\r\n builder.filterNumber(targetField, op, decoded.num.toString(), { logic })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\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\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, U> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && 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 filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>) => {\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.filterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { isAny: true })\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'number':\r\n this.filterNumber(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.filterContains(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\r\n private prebuildFunc?: (rp: RequestParam<TTarget, U>) => RequestParam<TTarget, U>\r\n prebuild = (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => {\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, U extends object = {}>(\r\n state: TFilterState<TSource>\r\n) => {\r\n return new TableFileterConverter<TSource, TTarget, U>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","isAny","filterDatetime","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","options","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","filterCustom","JSON","stringify","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","_this$state$storeFilt8","_this$state$storeFilt9","operatorMap","eq","lt","lte","gt","gte","_step","_iterator","_createForOfIteratorHelper","s","n","done","encoded","decoded","decodeNumberValue","op","operator","num","err","e","f","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt0","_this$state$storeFilt1","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"+dAyDaA,EAAW,SAACC,GACvB,MAAiB,OAAVA,EAAiB,KAAO,KACjC,EAEaC,EAAmB,SAACC,GAC/B,MAAqB,QAAdA,EAAsB,MAAQ,MACvC,EAMA,SAASC,EACPC,EACAC,EACAC,EACAC,GAEA,IAAAC,EAAgCD,GAAU,CAAE,EAApCE,EAAID,EAAJC,KAASC,EAAUC,EAAAH,EAAAI,GACrBC,EAASC,EAAUR,GACzB,OAAQO,GACN,IAAK,SACU,UAATJ,EACFJ,EAAQU,OAAOX,EAAOE,EAAMU,WAAYN,GAExCL,EAAQY,eAAeb,EAAOE,EAAMU,WAAYN,GAElD,MACF,IAAK,SACHL,EAAQa,aAAad,EAAO,KAAME,EAAMU,WAAYN,GACpD,MACF,QACES,QAAQC,KAAIC,yCAAAA,OAA0CR,EAAS,YAAYP,GAEjF,CAEA,IAAagB,EAAqB,WAM/B,OAAAC,EAHD,SAAAD,EAAYE,GAA4B,IAAAC,EAAAC,KAAAC,OAAAL,GAAAM,EAAAF,KAAA,UAqK9B,SAACG,IACTJ,EAAKK,iBAAmBD,EAEpBJ,EAAKD,MAAMO,cACAC,OAAOC,KAAKR,EAAKD,MAAMO,aAE/BG,QAAQ,SAACC,GAAO,IAAAC,EACbC,EAAYR,EAAOM,GACnBG,UAAUF,EAA4BX,EAAKD,MAAMO,mBAAW,IAAAK,OAAA,EAAtBA,EAAyBD,GACrE,GAAIE,EAAW,CACb,IAAQE,EAA2BF,EAA3BE,YAAaC,EAAcH,EAAdG,UACrB,GAAIH,EAAUI,OAEZ,YADAJ,EAAUI,OAAOhB,EAAKiB,eAAgBJ,EAAYb,EAAKD,MAAMO,aAG/D,OAAQS,GACN,IAAK,QAEH,YADAf,EAAKkB,YAAYR,EAAKI,GAExB,IAAK,cAEH,YADAd,EAAKkB,YAAYR,EAAKI,EAAa,CAAEK,OAAO,IAE9C,IAAK,WAEH,YADAnB,EAAKoB,eAAeV,EAAKI,GAE3B,IAAK,SAEH,YADAd,EAAKP,aAAaiB,EAAKI,GAGzB,QAEE,YADAd,EAAKR,eAAekB,EAAKI,GAG9B,CACH,GAEF,OAAOd,IACRG,EAAAF,KAAA,WAGU,SAACoB,GAEV,OADArB,EAAKsB,aAAeD,EACbrB,IA9MPC,KAAKF,MAAQA,EACbE,KAAKgB,eAAiBM,EAAiC,CAAEC,aAAa,GACxE,EAAC,CAAA,CAAAd,IAAA,cAAA7B,MAED,SAAY4C,EAAyCC,GAAuB,IAAAC,EAAA1B,KAC1E,GAAIA,KAAKF,MAAMO,YAAa,CAC1B,IAAMsB,GAAcF,aAAAA,EAAAA,EAASnD,QAAS0B,KAAKF,MAAM8B,aAAe,MAC1DtD,EAAQD,EAASsD,GACvB3B,KAAKgB,eAAea,MAClB,SAACC,GAEC,OADAN,EAAGM,EAA0CJ,EAAK5B,MAAMO,aACjDyB,CACT,EACA,CAAExD,MAAAA,GAEL,CACD,OAAO0B,IACT,GAAC,CAAAS,IAAA,cAAA7B,MAED,SAAYF,EAA4BqD,EAA6BN,GAA6C,IAAAO,EAAAC,EAC1GrB,EAAyDoB,QAA/CA,UAAAC,EAAgBjC,KAAKF,MAAMO,mBAAW,IAAA4B,OAAA,EAAtBA,EAAyBvD,UAAMsD,IAAAA,EAAAA,EAAI,CAAEE,OAAQ,IACvEA,EAASC,MAAMC,QAAQxB,EAAWsB,QAAUtB,EAAWsB,OAAS,CAACtB,EAAWsB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAO/B,KAEzC,IAAM1B,EAAQD,EAASuC,EAAWtC,OAYlC,OADA0B,KAAKsC,YAV2C,SAAC3D,GAC/C,GAAI8C,SAAAA,EAASP,MACXvC,EAAQ4D,aAAY5C,GAAAA,OAAIoC,aAAW,EAAXA,EAAazC,WAAUK,WAAAA,OAAU6C,KAAKC,UAAUP,GAAY,KAAA,CAAE5D,MAAAA,SAEtF,IAAK,IAAIoE,EAAQ,EAAGA,EAAQR,EAAOG,OAAQK,IACzCjE,EAAasD,EAAapD,EAASuD,EAAOQ,GAAQ,CAAEpE,MAAAA,EAAOS,KAAM,SAGtE,EAEoB0C,GACdzB,IACT,GAAC,CAAAS,IAAA,iBAAA7B,MAED,SAAeF,EAA4BqD,EAA6BN,GAAuB,IAAAkB,EAAAC,EACvFhC,EAAyD+B,QAA/CA,UAAAC,EAAgB5C,KAAKF,MAAMO,mBAAW,IAAAuC,OAAA,EAAtBA,EAAyBlE,UAAMiE,IAAAA,EAAAA,EAAI,CAAET,OAAQ,IACvEA,EAASC,MAAMC,QAAQxB,EAAWsB,QAAUtB,EAAWsB,OAAS,CAACtB,EAAWsB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAO/B,KAEzC,IAAM6C,EAAaxE,EAASuC,EAAWtC,OAOvC,OADA0B,KAAKsC,YAL2C,SAAC3D,GAC/C,IAAK,IAAI+D,EAAQ,EAAGA,EAAQR,EAAOG,OAAQK,IACzCjE,EAAasD,EAAapD,EAASuD,EAAOQ,GAAQ,CAAEpE,MAAOuE,EAAY9D,KAAM,YAEhF,EACoB0C,GACdzB,IACT,GAAC,CAAAS,IAAA,iBAAA7B,MAED,SAAeF,EAA4BqD,EAA6BN,GAAuB,IAAAqB,EAAAC,EACvFnC,EAAyDkC,QAA/CA,UAAAC,EAAgB/C,KAAKF,MAAMO,mBAAW,IAAA0C,OAAA,EAAtBA,EAAyBrE,UAAMoE,IAAAA,EAAAA,EAAI,CAAEZ,OAAQ,IACvEA,EAASC,MAAMC,QAAQxB,EAAWsB,QAAUtB,EAAWsB,OAAS,CAACtB,EAAWsB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAO/B,KAEzC,GAA6B,UAAzBY,EAAWoC,WAAyBd,EAAOG,QAAU,EAAG,CAK1DrC,KAAKsC,YAJ2C,SAAC3D,GAC/CA,EAAQsE,mBAAmBlB,EAAaG,EAAO,GAAG5C,WAAY,IAC9DX,EAAQuE,gBAAgBnB,EAAaG,EAAO,GAAG5C,WAAY,CAAEhB,MAAO,OACrE,EACoBmD,EACtB,MAAM,GAAqB,GAAjBS,EAAOG,OAAa,CAe7BrC,KAAKsC,YAd2C,SAAC3D,GAC/C,OAAQiC,EAAWoC,WACjB,IAAK,SACHrE,EAAQuE,gBAAgBnB,EAAaG,EAAO,GAAG5C,YAC/C,MACF,IAAK,QACHX,EAAQsE,mBAAmBlB,EAAaG,EAAO,GAAG5C,YAClD,MAEF,QACEX,EAAQsC,YAAYc,EAAaG,EAAO,GAAG5C,YAGhD,EACoBmC,EACtB,CACD,OAAOzB,IACT,GAAC,CAAAS,IAAA,eAAA7B,MAED,SAAaF,EAA4BqD,EAA6BN,GAAuB,IAAA0B,EAAAC,EACrFxC,EAAyDuC,QAA/CA,UAAAC,EAAgBpD,KAAKF,MAAMO,mBAAW,IAAA+C,OAAA,EAAtBA,EAAyB1E,UAAMyE,IAAAA,EAAAA,EAAI,CAAEjB,OAAQ,IACvEA,EAASC,MAAMC,QAAQxB,EAAWsB,QAAUtB,EAAWsB,OAAS,CAACtB,EAAWsB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,IAC3BN,EAAa,OAAO/B,KAEzC,IAAMqD,EAA+C,CACnDC,GAAI,KACJC,GAAI,IACJC,IAAK,KACLC,GAAI,IACJC,IAAK,MAGDpF,EAAQD,EAASuC,EAAWtC,OAUlC,OADA0B,KAAKsC,YAR2C,SAAC3D,GAAW,IAC9BgF,EAD8BC,EAAAC,EACpC3B,GAAM,IAA5B,IAAA0B,EAAAE,MAAAH,EAAAC,EAAAG,KAAAC,MAA8B,CAAA,IAAnBC,EAAON,EAAA/E,MACVsF,EAAUC,EAAkBF,GAClC,GAAKC,EAAL,CACA,IAAME,EAAKf,EAAYa,EAAQG,UAC/B1F,EAAQa,aAAauC,EAAaqC,EAAIF,EAAQI,IAAIhF,WAAY,CAAEhB,MAAAA,GAFlD,CAGf,CAAA,CAAA,MAAAiG,GAAAX,EAAAY,EAAAD,EAAA,CAAA,QAAAX,EAAAa,GAAA,CACF,EACoBhD,GACdzB,IACT,GAAC,CAAAS,IAAA,OAAA7B,MAED,SAAK8F,GAA2E,IAAAC,EAAAC,EACxEC,EAAQ7E,KAAKF,MAAMgF,UACzBC,EAAsEJ,QAAtEA,EAA2DD,aAAK,EAALA,EAAOM,gBAAIL,EAAAA,EAAI,CAAE,EAAvDM,EAAeF,EAA5BhD,YAAWmD,EAAAH,EAAmBI,SAAAA,OAAW,IAAHD,GAAQA,EAChDE,EAAYH,EAAuC,QAAxBL,EAAG5E,KAAKI,wBAALwE,IAAqBA,OAArBA,EAAAA,EAAwBK,QAAmBI,EACzEC,EAAcC,IACpB,IAAIV,aAAAA,EAAAA,EAAOnG,SAAU8G,EAAWC,YAAa,CAC3C,GAAKL,UAAAA,EAAWvE,YAAa,OAAOb,KACpC,IAAM0F,EAAYJ,QAAAA,GAAe,IAAIK,MAAOC,UAAUtG,WACtDU,KAAKgB,eAAegE,KAAKI,EAAUvE,YAAa6E,GAC5CP,GAAUU,EAAaH,EAC5B,KAAM,CAAA,IAAAI,EACDR,GAAaS,IACjB,IAAMrH,EAAQmG,SAAAA,EAAOnG,MAA6B,QAAxBoH,EAAG9F,KAAKI,wBAAgB,IAAA0F,OAAA,EAArBA,EAAwBjB,aAAK,EAALA,EAAOnG,YAAS2G,EACrE,GAAK3G,UAAAA,EAAOmC,YAAa,OAAOb,KAChCA,KAAKgB,eAAegF,KAAKtH,EAAMmC,YAAa,CAAErC,UAAWD,EAAiBsG,aAAK,EAALA,EAAOrG,YAClF,CACD,OAAOwB,IACT,GAAC,CAAAS,IAAA,cAAA7B,MAED,SAAYqH,GAAmD,IAAAC,EAAAC,EAAAC,EAAApG,KACxDA,KAAKI,kBACRX,QAAQC,KAAK,8FAEf,IAAMkB,EAA6DsF,QAAnDA,EAAsCC,QAAtCA,EAAgBnG,KAAKF,MAAMO,uBAAW8F,SAAtBA,EAAwBE,mBAAWH,IAAAA,EAAAA,EAAI,CAAEhE,OAAQ,GAAI5D,MAAO,MACtF4D,EAASC,MAAMC,QAAQxB,EAAWsB,QAAUtB,EAAWsB,OAAS,CAACtB,EAAWsB,QAElF,IADsBA,GAAUA,EAAOG,OAAS,EAC9B,OAAOrC,KAEzB,IAAM1B,EAAQD,EAASuC,EAAWtC,OAC5BgI,EAAenE,MAAMC,QAAQ6D,GAAUA,EAAS,CAACA,GAgBvD,OADAjG,KAAKsC,YAd2C,SAAC3D,GAC/C2H,EAAa9F,QAAQ,SAAC9B,GAAS,IAAA6H,EACvBC,EAAgC,QAAxBD,EAAGH,EAAKhG,wBAAgB,IAAAmG,OAAA,EAArBA,EAAwB7H,GACzC,GAAI8H,GAAYtE,EAAOG,OAAS,EAC9B,GAAImE,EAASzF,OACXyF,EAASzF,OAAOpC,EAASiC,EAAYwF,EAAKtG,MAAMO,kBAC3C,GAAImG,EAAS3F,YAClB,IAAK,IAAI6B,EAAQ,EAAGA,EAAQR,EAAOG,OAAQK,IACzCjE,EAAa+H,EAAS3F,YAAalC,EAASuD,EAAOQ,GAAQ,CAAEpE,MAAAA,GAIrE,EACD,GAEM0B,IACT,GAAC,CAAAS,IAAA,QAAA7B,MAgDD,WAEE,OADIoB,KAAKqB,cAAcrB,KAAKqB,aAAarB,KAAKgB,gBACvChB,KAAKgB,eAAeyF,OAC7B,IAAC,CAxN+B,GA2NrBC,EAAyB,SACpC5G,GAEA,OAAO,IAAIF,EAA2CE,EACxD"}
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 { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\nimport { decodeNumberValue } from './menu/create-form-field-number'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic, TNumberOperator } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n store?: TFieldStore<TSource>\r\n) => 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, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\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, U 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. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. @default 'contains'\r\n */\r\n operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number'\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, U>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>\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\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object, U extends object = {}>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget, U>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {\r\n private state: TFilterState<TSource>\r\n private graphqlBuilder: RequestParam<TTarget, U>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n this.graphqlBuilder = createRequestBuilder<TTarget, U>({ ignoreEmpty: true })\r\n }\r\n\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'or'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b as unknown as RequestParam<TTarget, U>, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & { isAny?: boolean }) {\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, U> = (builder) => {\r\n if (options?.isAny) {\r\n builder.filterCustom(`${targetField?.toString()}.isAny(${JSON.stringify(values)})`, { logic })\r\n } else {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(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, U> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(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 if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLessEqual(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreaterEqual(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n filterNumber(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 operatorMap: Record<TNumberOperator, string> = {\r\n eq: '==',\r\n lt: '<',\r\n lte: '<=',\r\n gt: '>',\r\n gte: '>='\r\n }\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (const encoded of values) {\r\n const decoded = decodeNumberValue(encoded)\r\n if (!decoded) continue\r\n const op = operatorMap[decoded.operator]\r\n builder.filterNumber(targetField, op, decoded.num.toString(), { logic })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\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\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, U> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && 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 filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>) => {\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.filterEqual(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { isAny: true })\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield)\r\n return // break is not needed here because of the return statement\r\n case 'number':\r\n this.filterNumber(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.filterContains(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\r\n private prebuildFunc?: (rp: RequestParam<TTarget, U>) => RequestParam<TTarget, U>\r\n prebuild = (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => {\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, U extends object = {}>(\r\n state: TFilterState<TSource>\r\n) => {\r\n return new TableFileterConverter<TSource, TTarget, U>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","objMap","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","isAny","filterDatetime","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","options","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","filterCustom","JSON","stringify","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","_this$state$storeFilt8","_this$state$storeFilt9","operatorMap","eq","lt","lte","gt","gte","_step","_iterator","_createForOfIteratorHelper","s","n","done","encoded","decoded","decodeNumberValue","op","operator","num","err","e","f","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt0","_this$state$storeFilt1","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as r,slicedToArray as e,objectSpread2 as n,asyncToGenerator as t,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as l}from"react/jsx-runtime";import{useState as i,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,useTheme as f,useMediaQuery as p}from"@mui/material";import{createFilterMenu as d}from"./menu/create.js";import{createFilterBarContext as v}from"./index.context.js";import{createFilterSort as g}from"./components/filter-sort.js";import{createFilterInput as b}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function S(r){var s,S=null!==(s=r.debounceDelay)&&void 0!==s?s:300;if(!r.InputComponent){var h=r.inputConfig||{fields:{}};r.inputConfig=h,r.InputComponent=b(h)}if(!r.MenuComponent){var j=r.menuConfig||{fields:{}};r.menuConfig=j,r.MenuComponent=d(j)}if(!r.SummaryComponent&&!1!==r.enableSummary){var P=r.summaryConfig||{fields:{}};r.summaryConfig=P,r.SummaryComponent=C(P)}if(!r.SortComponent){var w=r.sortConfig||{fields:{}};r.sortConfig=w,r.SortComponent=g(w)}var F=r.defaultFilterLogic||"and",I=v();return function(s){var d,v=s.slots,g=r.InputComponent,b=r.MenuComponent,C=r.SummaryComponent,h=r.SortComponent,j=function(){return Object.assign({filterLogic:F},r.defaultFilterState,s.defaultValue)},P=i(function(){return s.value?{filterState:s.value}:{filterState:j()}}),w=e(P,2),k=w[0],B=w[1],T=i(!1),D=e(T,2),A=D[0],L=D[1],M=u(null),N=u(null),W=u(null);m(function(){return function(){var r;M.current&&(clearTimeout(M.current),M.current=null),null===(r=W.current)||void 0===r||r.abort(),W.current=null}},[]),m(function(){s.value&&B({filterState:s.value})},[s.value]);var _=function(){var r=t(o().m(function r(e,n,t){var a,l;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,B(function(r){var e;return{filterState:null!==(e=null==t?void 0:t.filterState)&&void 0!==e?e:r.filterState}}),L(!0),r.n=1,null===(a=s.onChange)||void 0===a?void 0:a.call(s,e,n);case 1:if(!n.aborted){r.n=2;break}return r.a(2);case 2:L(!1),r.n=5;break;case 3:if(r.p=3,l=r.v,!n.aborted){r.n=4;break}return r.a(2);case 4:throw L(!1),l;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,n,t){return r.apply(this,arguments)}}(),z={filterState:s.value||k.filterState,defaultFilterState:j(),isLoading:s.loading||A,setFilterState:function(r){N.current=r,s.value||B({filterState:r}),M.current&&clearTimeout(M.current),M.current=window.setTimeout(function(){var r;null===(r=W.current)||void 0===r||r.abort();var e=new AbortController;W.current=e;var n=N.current;s.value?_(n,e.signal):_(n,e.signal,{filterState:n}),M.current=null,N.current=null},S)}},G=f(),H=p(G.breakpoints.down("md"));return a(I.Provider,{value:z,children:l(x,{className:y.root,sx:s.sx,children:[l(c,{className:y.inner,children:[(null==v?void 0:v.before)||null,l("div",{className:y.action,children:[a(b,{slots:{popperProps:{placement:"bottom-start"}}}),a(h,{slots:{popperProps:{placement:"bottom-start"}}})]}),a(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),l(c,n(n({},null==v?void 0:v.summaryWrapProps),{},{sx:n({display:"flex",alignItems:"center"},null==v||null===(d=v.summaryWrapProps)||void 0===d?void 0:d.sx),children:[(null==v?void 0:v.summaryBefore)||null,a(c,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&a(C,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var y={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},x=s(c)(function(e){var n=e.theme;return r(r(r({},"&.".concat(y.root),{backgroundColor:n.palette.background.paper,boxSizing:"border-box"}),".".concat(y.inner),{display:"flex",alignItems:"center",gap:n.spacing(1)}),".".concat(y.action),{display:"flex",alignItems:"center"})});export{S as createFilterBar};
1
+ import{defineProperty as r,slicedToArray as e,objectSpread2 as t,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as l}from"react/jsx-runtime";import{useState as i,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,useTheme as f,useMediaQuery as p}from"@mui/material";import{createFilterMenu as d}from"./menu/create.js";import{createFilterBarContext as v}from"./index.context.js";import{createFilterSort as g}from"./components/filter-sort.js";import{createFilterInput as b}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function S(r){var s,S=null!==(s=r.debounceDelay)&&void 0!==s?s:300;if(!r.InputComponent){var h=r.inputConfig||{fields:{}};r.inputConfig=h,r.InputComponent=b(h)}if(!r.MenuComponent){var j=r.menuConfig||{fields:{}};r.menuConfig=j,r.MenuComponent=d(j)}if(!r.SummaryComponent&&!1!==r.enableSummary){var P=r.summaryConfig||{fields:{}};r.summaryConfig=P,r.SummaryComponent=C(P)}if(!r.SortComponent){var w=r.sortConfig||{fields:{}};r.sortConfig=w,r.SortComponent=g(w)}var F=r.defaultFilterLogic||"or",I=v();return function(s){var d,v=s.slots,g=r.InputComponent,b=r.MenuComponent,C=r.SummaryComponent,h=r.SortComponent,j=function(){return Object.assign({filterLogic:F},r.defaultFilterState,s.defaultValue)},P=i(function(){return s.value?{filterState:s.value}:{filterState:j()}}),w=e(P,2),k=w[0],B=w[1],T=i(!1),D=e(T,2),A=D[0],L=D[1],M=u(null),N=u(null),W=u(null);m(function(){return function(){var r;M.current&&(clearTimeout(M.current),M.current=null),null===(r=W.current)||void 0===r||r.abort(),W.current=null}},[]),m(function(){s.value&&B({filterState:s.value})},[s.value]);var _=function(){var r=n(o().m(function r(e,t,n){var a,l;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,B(function(r){var e;return{filterState:null!==(e=null==n?void 0:n.filterState)&&void 0!==e?e:r.filterState}}),L(!0),r.n=1,null===(a=s.onChange)||void 0===a?void 0:a.call(s,e,t);case 1:if(!t.aborted){r.n=2;break}return r.a(2);case 2:L(!1),r.n=5;break;case 3:if(r.p=3,l=r.v,!t.aborted){r.n=4;break}return r.a(2);case 4:throw L(!1),l;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,t,n){return r.apply(this,arguments)}}(),z={filterState:s.value||k.filterState,defaultFilterState:j(),isLoading:s.loading||A,setFilterState:function(r){N.current=r,s.value||B({filterState:r}),M.current&&clearTimeout(M.current),M.current=window.setTimeout(function(){var r;null===(r=W.current)||void 0===r||r.abort();var e=new AbortController;W.current=e;var t=N.current;s.value?_(t,e.signal):_(t,e.signal,{filterState:t}),M.current=null,N.current=null},S)}},G=f(),H=p(G.breakpoints.down("md"));return a(I.Provider,{value:z,children:l(x,{className:y.root,sx:s.sx,children:[l(c,{className:y.inner,children:[(null==v?void 0:v.before)||null,l("div",{className:y.action,children:[a(b,{slots:{popperProps:{placement:"bottom-start"}}}),a(h,{slots:{popperProps:{placement:"bottom-start"}}})]}),a(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),l(c,t(t({},null==v?void 0:v.summaryWrapProps),{},{sx:t({display:"flex",alignItems:"center"},null==v||null===(d=v.summaryWrapProps)||void 0===d?void 0:d.sx),children:[(null==v?void 0:v.summaryBefore)||null,a(c,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&a(C,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var y={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},x=s(c)(function(e){var t=e.theme;return r(r(r({},"&.".concat(y.root),{backgroundColor:t.palette.background.paper,boxSizing:"border-box"}),".".concat(y.inner),{display:"flex",alignItems:"center",gap:t.spacing(1)}),".".concat(y.action),{display:"flex",alignItems:"center"})});export{S as createFilterBar};
2
2
  //# sourceMappingURL=index.create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>, signal?: AbortSignal) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n loading?: boolean\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, signal: AbortSignal, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await props.onChange?.(filterState, signal)\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n } catch (error) {\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n // abort previous in-flight request before starting a new one\r\n abortControllerRef.current?.abort()\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s, controller.signal)\r\n } else {\r\n handleChange(s, controller.signal, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: props.loading || isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","abortControllerRef","useEffect","_abortControllerRef$c","current","clearTimeout","abort","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee","signal","state","_props$onChange","_t","w","_context","p","n","prev","_state$filterState","onChange","call","aborted","a","v","_x","_x2","_x3","apply","this","arguments","contextValue","loading","setFilterState","window","setTimeout","_abortControllerRef$c2","controller","AbortController","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref2","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"8oBAwDM,SAAUA,EAAmBC,GAA6B,IAAAC,EACxDC,EAAqC,QAAxBD,EAAGD,EAAQE,qBAAa,IAAAD,EAAAA,EAAI,IAE/C,IAAKD,EAAQG,eAAgB,CAC3B,IAAMC,EAAcJ,EAAQK,aAAe,CAAEC,OAAQ,CAAA,GACrDN,EAAQK,YAAcD,EACtBJ,EAAQG,eAAiBI,EAAqBH,EAC/C,CACD,IAAKJ,EAAQQ,cAAe,CAC1B,IAAMC,EAAaT,EAAQU,YAAc,CAAEJ,OAAQ,CAAA,GACnDN,EAAQU,WAAaD,EACrBT,EAAQQ,cAAgBG,EAAoBF,EAC7C,CACD,IAAKT,EAAQY,mBAA8C,IAA1BZ,EAAQa,cAAyB,CAChE,IAAMC,EAAyCd,EAAQe,eAAiB,CAAET,OAAQ,CAAA,GAClFN,EAAQe,cAAgBD,EACxBd,EAAQY,iBAAmBI,EAAuBF,EACnD,CACD,IAAKd,EAAQiB,cAAe,CAC1B,IAAMC,EAAmClB,EAAQmB,YAAc,CAAEb,OAAQ,CAAA,GACzEN,EAAQmB,WAAaD,EACrBlB,EAAQiB,cAAgBG,EAAoBF,EAC7C,CAED,IAAMG,EAAqBrB,EAAQqB,oBAAsB,MACnDC,EAAUC,IAoHhB,OAlH0C,SAACC,GAAS,IAAAC,EAC1CC,EAAUF,EAAVE,MACFvB,EAAiBH,EAAQG,eACzBK,EAAgBR,EAAQQ,cACxBI,EAAmBZ,EAAQY,iBAC3BK,EAAgBjB,EAAQiB,cAExBU,EAAwB,WAC5B,OAAOC,OAAOC,OAAO,CAAEC,YAAaT,GAAsBrB,EAAQ+B,mBAAoBP,EAAMQ,aAC7F,EAODC,EAAoCC,EALb,WACrB,OAAIV,EAAMW,MAAc,CAAEC,YAAaZ,EAAMW,OACtC,CAAEC,YAAaT,IACvB,GAE+EU,EAAAC,EAAAL,EAAA,GAAzEM,EAAUF,EAAA,GAAEG,EAAaH,EAAA,GAChCI,EAAkCP,GAAkB,GAAMQ,EAAAJ,EAAAG,EAAA,GAAnDE,EAASD,EAAA,GAAEE,EAAYF,EAAA,GACxBG,EAAgBC,EAAsB,MACtCC,EAAkBD,EAA+B,MACjDE,EAAqBF,EAA+B,MAE1DG,EAAU,WACR,OAAO,WAAK,IAAAC,EACNL,EAAcM,UAChBC,aAAaP,EAAcM,SAC3BN,EAAcM,QAAU,MAEA,QAA1BD,EAAAF,EAAmBG,eAAO,IAAAD,GAA1BA,EAA4BG,QAC5BL,EAAmBG,QAAU,IAC9B,CACF,EAAE,IAEHF,EAAU,WAEJzB,EAAMW,OAAOK,EAAc,CAAEJ,YAAaZ,EAAMW,OACtD,EAAG,CAACX,EAAMW,QAEV,IAAMmB,EAAY,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,EAAG,SAAAC,EAAOvB,EAA8BwB,EAAqBC,GAAmC,IAAAC,EAAAC,EAAA,OAAAN,IAAAO,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAG5F,OAH4FF,EAAAC,EAAA,EAE9G1B,EAAc,SAAC4B,GAAI,IAAAC,EAAA,MAAM,CAAEjC,oBAAWiC,EAAER,aAAAA,EAAAA,EAAOzB,mBAAW,IAAAiC,EAAAA,EAAID,EAAKhC,YAAa,GAChFQ,GAAa,GAAKqB,EAAAE,EAAA,UAAAL,EACZtC,EAAM8C,gBAAQ,IAAAR,OAAA,EAAdA,EAAAS,KAAA/C,EAAiBY,EAAawB,GAAO,KAAA,EAAA,IACvCA,EAAOY,QAAO,CAAAP,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAQ,EAAA,GAAA,KAAA,EAClB7B,GAAa,GAAMqB,EAAAE,EAAA,EAAA,MAAA,KAAA,EAAA,GAAAF,EAAAC,EAAA,EAAAH,EAAAE,EAAAS,GAEfd,EAAOY,QAAO,CAAAP,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAQ,EAAA,GAAA,KAAA,EACC,MAAnB7B,GAAa,GAAMmB,EAAA,KAAA,EAAA,OAAAE,EAAAQ,EAAA,GAAA,EAAAd,EAAA,KAAA,CAAA,CAAA,EAAA,QAGtB,OAAA,SAZiBgB,EAAAC,EAAAC,GAAA,OAAAtB,EAAAuB,MAAAC,KAAAC,UAAA,EAAA,GA4CZC,EAAqC,CACzC7C,YAAaZ,EAAMW,OAASI,EAAWH,YACvCL,mBAAoBJ,IACpBgB,UAAWnB,EAAM0D,SAAWvC,EAC5BwC,eAhCqB,SAACtB,GAEtBd,EAAgBI,QAAUU,EAGrBrC,EAAMW,OACTK,EAAc,CAAEJ,YAAayB,IAI3BhB,EAAcM,SAASC,aAAaP,EAAcM,SACtDN,EAAcM,QAAUiC,OAAOC,WAAW,WAAK,IAAAC,EAEnB,QAA1BA,EAAAtC,EAAmBG,eAAO,IAAAmC,GAA1BA,EAA4BjC,QAC5B,IAAMkC,EAAa,IAAIC,gBACvBxC,EAAmBG,QAAUoC,EAE7B,IAAME,EAAI1C,EAAgBI,QACtB3B,EAAMW,MACRmB,EAAamC,EAAGF,EAAW3B,QAE3BN,EAAamC,EAAGF,EAAW3B,OAAQ,CAAExB,YAAaqD,IAEpD5C,EAAcM,QAAU,KACxBJ,EAAgBI,QAAU,IAC3B,EAAEjD,EACJ,GASKwF,EAAQC,IACRC,EAAUC,EAAcH,EAAMI,YAAYC,KAAK,OAErD,OACEC,EAAC1E,EAAQ2E,SAAQ,CAAC9D,MAAO8C,EACvBiB,SAAAC,EAACC,EAAgB,CAAAC,UAAWC,EAAiBC,KAAMC,GAAIhF,EAAMgF,GAAEN,SAAA,CAC7DC,EAACM,EAAG,CAACJ,UAAWC,EAAiBI,iBAC9BhF,aAAAA,EAAAA,EAAOiF,SAAU,KAClBR,EAAK,MAAA,CAAAE,UAAWC,EAAiBM,OAAMV,SAAA,CACrCF,EAACxF,EAAa,CAACkB,MAAO,CAAEmF,YAAa,CAAEC,UAAW,mBAClDd,EAAC/E,EAAa,CAACS,MAAO,CAAEmF,YAAa,CAAEC,UAAW,sBAEpDd,EAAC7F,EAAe,CAAAuB,MAAO,CAAEqF,aAAcnB,EAASiB,YAAa,CAAEC,UAAW,oBACzEpF,aAAK,EAALA,EAAOsF,QAAS,QAEnBb,EAACM,EAAGQ,EAAAA,EAAA,CAAA,EAAKvF,aAAAA,EAAAA,EAAOwF,kBAAgB,CAAA,EAAA,CAAEV,GAAES,EAAA,CAAIE,QAAS,OAAQC,WAAY,UAAa1F,iBAAKD,EAALC,EAAOwF,wBAAgB,IAAAzF,OAAA,EAAvBA,EAAyB+E,IAAIN,SAAA,EAC5GxE,aAAAA,EAAAA,EAAO2F,gBAAiB,KACzBrB,EAACS,EAAG,CAACD,GAAI,CAAEc,KAAM,EAAGC,SAAU,GAAMrB,UAA0B,IAA1BlG,EAAQa,eAA2BmF,EAACpF,EAAmB,CAAA,MAC1Fc,aAAK,EAALA,EAAO8F,eAAgB,aAKjC,CAGH,CAEA,IAAMlB,EAAmB,CACvBC,KAAM,qBACNG,MAAO,sBACPE,OAAQ,wBAGJR,EAAkBqB,EAAOhB,EAAPgB,CAAY,SAAAC,GAAA,IAAGhC,EAAKgC,EAALhC,MAAK,OAAAiC,EAAAA,EAAAA,EAAAC,CAAAA,EAAAA,KAAAA,OACpCtB,EAAiBC,MAAS,CAC9BsB,gBAAiBnC,EAAMoC,QAAQC,WAAWC,MAC1CC,UAAW,mBACZL,OACItB,EAAiBI,OAAU,CAC9BS,QAAS,OACTC,WAAY,SACZc,IAAKxC,EAAMyC,QAAQ,SACpBP,OACItB,EAAiBM,QAAW,CAC/BO,QAAS,OACTC,WAAY,UACb"}
1
+ {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"or\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>, signal?: AbortSignal) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n loading?: boolean\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'or'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, signal: AbortSignal, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await props.onChange?.(filterState, signal)\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n } catch (error) {\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n // abort previous in-flight request before starting a new one\r\n abortControllerRef.current?.abort()\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s, controller.signal)\r\n } else {\r\n handleChange(s, controller.signal, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: props.loading || isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","abortControllerRef","useEffect","_abortControllerRef$c","current","clearTimeout","abort","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee","signal","state","_props$onChange","_t","w","_context","p","n","prev","_state$filterState","onChange","call","aborted","a","v","_x","_x2","_x3","apply","this","arguments","contextValue","loading","setFilterState","window","setTimeout","_abortControllerRef$c2","controller","AbortController","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","_objectSpread","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref2","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
@@ -1,2 +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};
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:"or",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
2
  //# sourceMappingURL=local-filter-builder.js.map
@@ -1 +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
+ {"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 ?? 'or'\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":"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"}
@@ -1,2 +1,2 @@
1
- import{slicedToArray as e,defineProperty as l}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as o,useState as r,createRef as t}from"react";import{styled as a,Typography as u,ToggleButtonGroup as s,ToggleButton as c,TextField as d,Button as v,Box as p}from"@mui/material";import{createChipViewers as f}from"../components/chip-viewer.js";import{getErrorMessage as m}from"../../form/helpers.js";import{ButtonBack as g,FilterLogicToggle as b}from"../components/ui.units.js";import{PopperContent as h,PopperBody as x,PopperFooter as y}from"../components/popper-custom.js";var C={eq:"=",lt:"<",lte:"≤",gt:">",gte:"≥"},z=["eq","lt","lte","gt","gte"];function j(e,l){return"".concat(e,":").concat(l)}function k(e){if("string"!=typeof e)return null;var l=e.indexOf(":");if(-1===l)return null;var i=e.slice(0,l),n=parseFloat(e.slice(l+1));return!z.includes(i)||isNaN(n)?null:{operator:i,num:n}}function A(e){var l=k(e);return l?"".concat(C[l.operator]," ").concat(l.num):String(e)}function N(a){var k=f();return function(f){var N,S,B,T,O=o(function(){return Object.assign({},f.currentConfig,null==a?void 0:a.config)},[null==a?void 0:a.config,f.currentConfig]),P=t(),R=f.value,q=void 0===R?{values:[],logic:null!==(N=null==O?void 0:O.defaultLogic)&&void 0!==N?N:"and"}:R,w=r(q.logic),I=e(w,2),M=I[0],V=I[1],E=r(null!==(S=null==a?void 0:a.defaultOperator)&&void 0!==S?S:"eq"),H=e(E,2),L=H[0],_=H[1],D=r(""),W=e(D,2),G=W[0],J=W[1],K=null!==(B=null==O?void 0:O.label)&&void 0!==B?B:O.field.toString(),Q=r({}),U=e(Q,2),X=U[0],Y=U[1],Z=function(e){f.onSubmit(O.field,e,O)},$=q.values.length>=2&&M!==q.logic,ee=m(X,O.field),le=o(function(){var e=Array.isArray(q.values)?q.values:[q.values];return{field:O.field,items:e.map(function(e){return{value:e,label:A(e)}})}},[O.field,q]),ie=!(""!==G.trim()&&!isNaN(parseFloat(G)))&&!$,ne=[];return f.isLoading&&ne.push("disabled"),i(F,{className:ne.join(" "),noValidate:!0,onSubmit:function(e){var i,n,o;e.preventDefault(),e.stopPropagation();var r=parseFloat(null!==(i=null===(n=P.current)||void 0===n?void 0:n.value)&&void 0!==i?i:"");if(isNaN(r))$&&Z({values:q.values,logic:M});else{var t=l({},O.field,r),a=null===(o=f.validator)||void 0===o?void 0:o.run(t);if(Y(a||{}),!a||0===Object.keys(a).length){var u=j(L,r);Z({values:[u],logic:M}),P.current&&(P.current.blur(),P.current.value=""),J("")}}},children:n(h,{title:"Filter by ".concat(K),onClose:f.onClose,slots:{beforeTitle:i(g,{size:"small",onClick:f.onBack}),afterTitle:O.singleValue||!q.values||q.values.length<2?null:i(b,{sx:{ml:1},value:M,onChange:function(e,l){V(l)}})},children:[n(x,{children:[O.description&&i(u,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:O.description}),i(k,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:le,onRemove:f.onRemove}),i(s,{exclusive:!0,size:"small",value:L,onChange:function(e,l){l&&_(l)},sx:{mb:1,width:"100%",".MuiToggleButton-root":{flex:1,py:.25,fontSize:"0.8rem"}},children:z.map(function(e){return i(c,{value:e,children:C[e]},e)})}),i(d,{inputRef:P,autoFocus:!0,type:"number",name:O.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter number",error:ee.error,helperText:ee.message,inputProps:{step:null!==(T=null==a?void 0:a.step)&&void 0!==T?T:1,min:null==a?void 0:a.min,max:null==a?void 0:a.max},onChange:function(e){return J(e.target.value)},sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),n(y,{children:[i(v,{size:"small",color:"error",variant:"text",disabled:!q.values||0===q.values.length,onClick:function(){var e,l;null===(e=f.onRemoveField)||void 0===e||e.call(f,O.field),!1!==(null==a||null===(l=a.config)||void 0===l?void 0:l.closeAfterClear)&&f.onClose()},children:"Clear All"}),i(p,{sx:{flex:1}}),i(v,{size:"small",color:"inherit",variant:"text",onClick:f.onClose,children:"Cancel"}),i(v,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:ie,children:"Apply"})]})]})})}}var F=a("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});function S(){return function(e){return A(e)}}export{k as decodeNumberValue,N as default,j as encodeNumberValue,A as formatNumberChipLabel,S as formatterNumber};
1
+ import{slicedToArray as e,defineProperty as l}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as o,useState as r,createRef as t}from"react";import{styled as a,Typography as u,ToggleButtonGroup as s,ToggleButton as c,TextField as d,Button as v,Box as p}from"@mui/material";import{createChipViewers as f}from"../components/chip-viewer.js";import{getErrorMessage as m}from"../../form/helpers.js";import{ButtonBack as g,FilterLogicToggle as b}from"../components/ui.units.js";import{PopperContent as h,PopperBody as x,PopperFooter as y}from"../components/popper-custom.js";var C={eq:"=",lt:"<",lte:"≤",gt:">",gte:"≥"},z=["eq","lt","lte","gt","gte"];function j(e,l){return"".concat(e,":").concat(l)}function k(e){if("string"!=typeof e)return null;var l=e.indexOf(":");if(-1===l)return null;var i=e.slice(0,l),n=parseFloat(e.slice(l+1));return!z.includes(i)||isNaN(n)?null:{operator:i,num:n}}function A(e){var l=k(e);return l?"".concat(C[l.operator]," ").concat(l.num):String(e)}function N(a){var k=f();return function(f){var N,S,B,T,O=o(function(){return Object.assign({},f.currentConfig,null==a?void 0:a.config)},[null==a?void 0:a.config,f.currentConfig]),P=t(),R=f.value,q=void 0===R?{values:[],logic:null!==(N=null==O?void 0:O.defaultLogic)&&void 0!==N?N:"or"}:R,w=r(q.logic),I=e(w,2),M=I[0],V=I[1],E=r(null!==(S=null==a?void 0:a.defaultOperator)&&void 0!==S?S:"eq"),H=e(E,2),L=H[0],_=H[1],D=r(""),W=e(D,2),G=W[0],J=W[1],K=null!==(B=null==O?void 0:O.label)&&void 0!==B?B:O.field.toString(),Q=r({}),U=e(Q,2),X=U[0],Y=U[1],Z=function(e){f.onSubmit(O.field,e,O)},$=M!==q.logic,ee=m(X,O.field),le=o(function(){var e=Array.isArray(q.values)?q.values:[q.values];return{field:O.field,items:e.map(function(e){return{value:e,label:A(e)}})}},[O.field,q]),ie=!(""!==G.trim()&&!isNaN(parseFloat(G)))&&!$,ne=[];return f.isLoading&&ne.push("disabled"),i(F,{className:ne.join(" "),noValidate:!0,onSubmit:function(e){var i,n,o;e.preventDefault(),e.stopPropagation();var r=parseFloat(null!==(i=null===(n=P.current)||void 0===n?void 0:n.value)&&void 0!==i?i:"");if(isNaN(r))$&&Z({values:q.values,logic:M});else{var t=l({},O.field,r),a=null===(o=f.validator)||void 0===o?void 0:o.run(t);if(Y(a||{}),!a||0===Object.keys(a).length){var u=j(L,r);Z({values:[u],logic:M}),P.current&&(P.current.blur(),P.current.value=""),J("")}}},children:n(h,{title:"Filter by ".concat(K),onClose:f.onClose,slots:{beforeTitle:i(g,{size:"small",onClick:f.onBack}),afterTitle:O.singleValue?null:i(b,{sx:{ml:1},value:M,onChange:function(e,l){V(l)}})},children:[n(x,{children:[O.description&&i(u,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:O.description}),i(k,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:le,onRemove:f.onRemove}),i(s,{exclusive:!0,size:"small",value:L,onChange:function(e,l){l&&_(l)},sx:{mb:1,width:"100%",".MuiToggleButton-root":{flex:1,py:.25,fontSize:"0.8rem"}},children:z.map(function(e){return i(c,{value:e,children:C[e]},e)})}),i(d,{inputRef:P,autoFocus:!0,type:"number",name:O.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter number",error:ee.error,helperText:ee.message,inputProps:{step:null!==(T=null==a?void 0:a.step)&&void 0!==T?T:1,min:null==a?void 0:a.min,max:null==a?void 0:a.max},onChange:function(e){return J(e.target.value)},sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),n(y,{children:[i(v,{size:"small",color:"error",variant:"text",disabled:!q.values||0===q.values.length,onClick:function(){var e,l;null===(e=f.onRemoveField)||void 0===e||e.call(f,O.field),!1!==(null==a||null===(l=a.config)||void 0===l?void 0:l.closeAfterClear)&&f.onClose()},children:"Clear All"}),i(p,{sx:{flex:1}}),i(v,{size:"small",color:"inherit",variant:"text",onClick:f.onClose,children:"Cancel"}),i(v,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:ie,children:"Apply"})]})]})})}}var F=a("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});function S(){return function(e){return A(e)}}export{k as decodeNumberValue,N as default,j as encodeNumberValue,A as formatNumberChipLabel,S as formatterNumber};
2
2
  //# sourceMappingURL=create-form-field-number.js.map