dinocollab-core 2.2.21 → 2.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.create.js","sources":["../../../src/data-surface/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, styled } from '@mui/material'\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { DataSurfaceViewMode, LoadingModeRule, DataSurfaceFeatureMode } from './types'\r\nimport { createViewList, createViewListLoading } from './view-list'\r\nimport { createViewGrid, createViewGridLoading } from './view-grid'\r\nimport { createViewSwitchTransition } from './view-switch-transition'\r\nimport { PanelInfiniteScrollFooter, PanelLoadMore, PanelLoading, PanelNoData, PanelPaginationFooter } from './ui.units'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { IViewGridLoadingProps } from './view-grid'\r\nimport type { IViewGridConfig, IViewGridProps } from './view-grid/types'\r\nimport type { TPagination, TDataSurfaceState, TRenderableNode } from './types'\r\nimport type { IViewListConfig, IViewListLoadingProps, IViewListProps } from './view-list'\r\n\r\nexport interface IDataSurfaceSlots<T> {\r\n listViewProps?: IViewListProps<T>\r\n gridViewProps?: IViewGridProps<T>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n footer?: {\r\n status?: TRenderableNode\r\n range?: TRenderableNode\r\n }\r\n}\r\n\r\nexport interface IDataSurfaceProps<T> {\r\n value?: T[]\r\n /**\r\n * @deprecated No longer used. Use `viewMode` and `loadMode` props directly instead.\r\n * Controlled state. When provided, DataSurface becomes fully controlled.\r\n */\r\n state?: TDataSurfaceState\r\n /**\r\n * @deprecated No longer used. Component now uses uncontrolled mode with props.\r\n * Called on any state change (viewMode, loadMode, page, pageSize).\r\n */\r\n onStateChange?: (state: TDataSurfaceState) => void\r\n viewMode?: DataSurfaceViewMode\r\n /** Pagination metadata shared by both modes. */\r\n pagination?: TPagination\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** True while a page fetch is in flight (shows loading indicator). */\r\n loading?: boolean\r\n /**\r\n * Called when the component needs a new page of data.\r\n * - pagination mode: triggered by user clicking page control\r\n * - infiniteScroll mode: triggered automatically when scrolling near the bottom\r\n * Supports async operations - return a Promise to indicate loading state.\r\n */\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n /** Load orchestration mode. @default 'pagination' */\r\n loadMode?: LoadingModeRule\r\n sx?: BoxProps['sx']\r\n slots?: IDataSurfaceSlots<T>\r\n /** Enable row selection with checkboxes (List view only). */\r\n selectable?: boolean\r\n /** Array of selected row IDs (List view only). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes (List view only). */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n}\r\n\r\nexport interface IDataSurfaceConfig<T> {\r\n /** Feature mode determines the internal optimizations and rendering strategies. @default 'client' */\r\n featureMode?: DataSurfaceFeatureMode\r\n /** Default view mode when not provided via props. @default 'grid' */\r\n defaultViewMode?: DataSurfaceViewMode\r\n /** Default load mode when not provided via props. @default 'pagination' */\r\n defaultLoadMode?: LoadingModeRule\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** Configuration for List view. If not provided, List view will use default settings. */\r\n listConfig?: IViewListConfig<T>\r\n /** Custom List component. If not provided, a default List component will be used. */\r\n ListComponent?: ComponentType<IViewListProps<T>>\r\n /** Configuration for Grid view. If not provided, Grid view will use default settings. */\r\n gridConfig?: IViewGridConfig<T>\r\n /** Custom Grid component. If not provided, a default Grid component will be used. */\r\n GridComponent?: ComponentType<IViewGridProps<T>>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n}\r\n\r\nexport function createDataSurface<T>(config: IDataSurfaceConfig<T>) {\r\n if (!config.GridComponent) {\r\n const configInput: IViewGridConfig<T> = config.gridConfig || { getterId: (item: T, index: number) => index }\r\n config.gridConfig = configInput\r\n config.GridComponent = createViewGrid<T>(configInput)\r\n }\r\n\r\n if (!config.ListComponent) {\r\n const configInput: IViewListConfig<T> = config.listConfig || { getterId: (item: T, index: number) => index }\r\n config.listConfig = configInput\r\n config.ListComponent = createViewList<T>(configInput)\r\n }\r\n\r\n const { defaultViewMode = 'grid', defaultLoadMode = 'pagination', featureMode = 'client' } = config\r\n const ViewSwitchTranstionInstance = createViewSwitchTransition<DataSurfaceViewMode>({})\r\n const GridLoadingComponent = createViewGridLoading<T>(config.GridComponent as ComponentType<IViewGridProps<T>>)\r\n const ListLoadingComponent = createViewListLoading<T>(config.ListComponent as ComponentType<IViewListProps<T>>)\r\n\r\n const DataSurface: FC<IDataSurfaceProps<T>> = (props) => {\r\n const slots = props.slots || {}\r\n const defaultPageSize = props.pagination?.pageSize ?? config.defaultPageSize ?? 20\r\n // separate pagination state\r\n const [internalPagination, setInternalPagination] = useState<TPagination>({ page: 0, pageSize: defaultPageSize })\r\n\r\n // resolved pagination: external takes priority over internal\r\n const paginationState = useMemo<TPagination>(() => {\r\n const p = props.pagination ?? internalPagination\r\n return {\r\n page: p.page ?? 0,\r\n pageSize: p.pageSize ?? defaultPageSize,\r\n hasNext: p.hasNext ?? false,\r\n hasPrev: p.hasPrev ?? false,\r\n total: p.total\r\n }\r\n }, [props.pagination, internalPagination])\r\n\r\n const viewMode = props.viewMode ?? defaultViewMode\r\n const loadMode = props.loadMode ?? defaultLoadMode\r\n\r\n // Determine renderStrategy based on current viewMode\r\n const renderStrategy = useMemo(() => {\r\n if (viewMode === 'grid') {\r\n return config.gridConfig?.renderStrategy ?? 'normal'\r\n }\r\n return config.listConfig?.renderStrategy ?? 'normal'\r\n }, [viewMode])\r\n\r\n const handlePrevPage = useCallback(async () => {\r\n const currentPage = paginationState.page ?? 0\r\n if (currentPage <= 0) return\r\n const prevPage = currentPage - 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: prevPage }))\r\n }\r\n await props.onPageChange?.(prevPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handleNextPage = useCallback(async () => {\r\n if (!paginationState.hasNext) return\r\n const currentPage = paginationState.page ?? 0\r\n const nextPage = currentPage + 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: nextPage }))\r\n }\r\n await props.onPageChange?.(nextPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.hasNext, paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handlePageJump = useCallback(\r\n async (targetPage: number) => {\r\n if (targetPage < 0) return\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: targetPage }))\r\n }\r\n await props.onPageChange?.(targetPage, paginationState.pageSize ?? defaultPageSize)\r\n },\r\n [paginationState.pageSize, props.pagination, props.onPageChange]\r\n )\r\n\r\n const finalValue = props.value || []\r\n\r\n // Token changes whenever props.value reference changes — used to reset scroll in views (client mode only)\r\n const scrollResetToken = featureMode === 'client' ? props.value : undefined\r\n\r\n // Reset page to 0 when the data source changes (e.g. new filtered array passed in) — client mode only\r\n useEffect(() => {\r\n if (featureMode === 'client' && !props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: 0 }))\r\n }\r\n }, [props.value])\r\n\r\n // When running in client feature mode, derive pagination metadata from the full value\r\n const derivedPagination = useMemo<TPagination>(() => {\r\n const page = paginationState.page ?? 0\r\n const pageSize = paginationState.pageSize ?? defaultPageSize\r\n if (featureMode === 'client') {\r\n const total = finalValue.length\r\n const hasNext = pageSize * (page + 1) < total\r\n const hasPrev = page > 0\r\n return { page, pageSize, hasNext, hasPrev, total }\r\n }\r\n return paginationState\r\n }, [paginationState, finalValue.length, featureMode, defaultPageSize])\r\n\r\n // Slice the input value when client-side pagination is enabled\r\n const paginatedValue = useMemo(() => {\r\n if (featureMode === 'client') {\r\n const page = derivedPagination.page ?? 0\r\n const pageSize = derivedPagination.pageSize ?? defaultPageSize\r\n if (loadMode === 'infiniteScroll') {\r\n // accumulate all items from page 0 → current page\r\n return finalValue.slice(0, (page + 1) * pageSize)\r\n }\r\n const start = page * pageSize\r\n return finalValue.slice(start, start + pageSize)\r\n }\r\n return finalValue\r\n }, [finalValue, derivedPagination, featureMode, loadMode, defaultPageSize])\r\n\r\n const isEmptyData = finalValue.length === 0\r\n const isInitialLoading = Boolean(props.loading && isEmptyData)\r\n const isNoData = !props.loading && isEmptyData\r\n const showLoadingOverlay = Boolean(props.loading) && !isEmptyData\r\n\r\n const handleGridPageChange = useCallback(\r\n async (page: number, pageSize: number) => {\r\n if (!props.pagination) {\r\n setInternalPagination({ page, pageSize })\r\n }\r\n await props.onPageChange?.(page, pageSize)\r\n },\r\n [props.pagination, props.onPageChange]\r\n )\r\n\r\n const gridPayload = useMemo<IViewGridLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n scrollResetToken,\r\n ...slots.gridViewProps\r\n }),\r\n [paginatedValue, loadMode, props.loading, derivedPagination, handleGridPageChange, scrollResetToken, slots.gridViewProps]\r\n )\r\n\r\n const gridPayloadRef = useRef<IViewGridLoadingProps<T>>(gridPayload)\r\n gridPayloadRef.current = gridPayload\r\n\r\n const listPayload = useMemo<IViewListLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n renderStrategy: renderStrategy,\r\n selectable: props.selectable ?? config.listConfig?.selectable,\r\n selectedIds: props.selectedIds,\r\n onSelectionChange: props.onSelectionChange,\r\n scrollResetToken,\r\n ...slots.listViewProps\r\n }),\r\n [\r\n paginatedValue,\r\n loadMode,\r\n props.loading,\r\n derivedPagination,\r\n renderStrategy,\r\n handleGridPageChange,\r\n props.selectable,\r\n props.selectedIds,\r\n props.onSelectionChange,\r\n scrollResetToken,\r\n slots.listViewProps\r\n ]\r\n )\r\n\r\n const listPayloadRef = useRef<IViewListLoadingProps<T>>(listPayload)\r\n listPayloadRef.current = listPayload\r\n\r\n const ListViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewListContent: FC<{ value: DataSurfaceViewMode }> = () => {\r\n return <ListLoadingComponent {...listPayloadRef.current} />\r\n }\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => {\r\n return <GridLoadingComponent {...gridPayloadRef.current} />\r\n }\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\r\n\r\n const PanelLoadingComponent = useMemo(() => {\r\n return slots.PanelLoading || config?.PanelLoading || PanelLoading\r\n }, [slots.PanelLoading, config.PanelLoading, viewMode])\r\n\r\n const PanelNoDataComponent = useMemo(() => {\r\n return slots.PanelNoData || config?.PanelNoData || PanelNoData\r\n }, [slots.PanelNoData, config.PanelNoData, viewMode])\r\n\r\n const PanelLoadMoreComponent = useMemo(() => {\r\n return slots.PanelLoadMore || config?.PanelLoadMore || PanelLoadMore\r\n }, [slots.PanelLoadMore, config.PanelLoadMore])\r\n\r\n const renderFooter = () => {\r\n if (loadMode === LoadingModeRule.infiniteScroll) {\r\n const footerSlots = props.slots?.footer\r\n return (\r\n <PanelInfiniteScrollFooter\r\n loading={props.loading}\r\n hasNext={derivedPagination.hasNext}\r\n currentCount={paginatedValue.length}\r\n total={derivedPagination.total}\r\n slots={{\r\n statusText: footerSlots?.status,\r\n rangeText: footerSlots?.range\r\n }}\r\n />\r\n )\r\n }\r\n\r\n // pagination mode\r\n return (\r\n <PanelPaginationFooter\r\n page={derivedPagination.page ?? 0}\r\n pageSize={derivedPagination.pageSize ?? defaultPageSize}\r\n total={derivedPagination.total}\r\n hasNext={derivedPagination.hasNext}\r\n hasPrev={(derivedPagination.page ?? 0) > 0}\r\n loading={props.loading}\r\n onPrevPage={handlePrevPage}\r\n onNextPage={handleNextPage}\r\n onPageJump={handlePageJump}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <DataSurfaceStyled sx={props.sx}>\r\n <Box sx={{ flex: 1, minHeight: 0, position: 'relative' }}>\r\n {isInitialLoading && <PanelLoadingComponent viewMode={viewMode} />}\r\n {isNoData && <PanelNoDataComponent viewMode={viewMode} />}\r\n {!isInitialLoading && !isNoData && (\r\n <ViewSwitchTranstionInstance\r\n value={viewMode}\r\n viewA={{ value: 'list', Content: ListViewContent }}\r\n viewB={{ value: 'grid', Content: GridViewContent }}\r\n />\r\n )}\r\n {showLoadingOverlay && <PanelLoadMoreComponent />}\r\n </Box>\r\n {renderFooter()}\r\n </DataSurfaceStyled>\r\n )\r\n }\r\n return DataSurface\r\n}\r\n\r\nexport default createDataSurface\r\n\r\nconst DataSurfaceStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n flex: 1,\r\n minHeight: 0,\r\n backgroundColor: theme.palette.background.default\r\n}))\r\n"],"names":["createDataSurface","config","GridComponent","configInput","gridConfig","getterId","item","index","createViewGrid","ListComponent","listConfig","createViewList","_config$defaultViewMo","defaultViewMode","_config$defaultLoadMo","defaultLoadMode","_config$featureMode","featureMode","ViewSwitchTranstionInstance","createViewSwitchTransition","GridLoadingComponent","createViewGridLoading","ListLoadingComponent","createViewListLoading","props","_ref","_props$pagination$pag","_props$pagination","_props$viewMode","_props$loadMode","slots","defaultPageSize","pagination","pageSize","_useState","useState","page","_useState2","_slicedToArray","internalPagination","setInternalPagination","paginationState","useMemo","_props$pagination2","_p$page","_p$pageSize","_p$hasNext","_p$hasPrev","p","hasNext","hasPrev","total","viewMode","loadMode","renderStrategy","_config$listConfig$re","_config$listConfig","_config$gridConfig$re","_config$gridConfig","handlePrevPage","useCallback","_asyncToGenerator","_regenerator","m","_callee","_paginationState$page","_props$onPageChange","_paginationState$page2","currentPage","prevPage","w","_context","n","a","prev","_objectSpread","onPageChange","call","handleNextPage","_callee2","_paginationState$page3","_props$onPageChange2","_paginationState$page4","nextPage","_context2","handlePageJump","_ref4","_callee3","targetPage","_props$onPageChange3","_paginationState$page5","_context3","_x","apply","this","arguments","finalValue","value","scrollResetToken","undefined","useEffect","derivedPagination","_paginationState$page6","_paginationState$page7","length","paginatedValue","_derivedPagination$pa","_derivedPagination$pa2","slice","start","isEmptyData","isInitialLoading","Boolean","loading","isNoData","showLoadingOverlay","handleGridPageChange","_ref5","_callee4","_props$onPageChange4","_context4","_x2","_x3","gridPayload","gridViewProps","gridPayloadRef","useRef","current","listPayload","_props$selectable","_config$listConfig2","selectable","selectedIds","onSelectionChange","listViewProps","listPayloadRef","ListViewContent","_jsx","GridViewContent","PanelLoadingComponent","PanelLoading","PanelNoDataComponent","PanelNoData","PanelLoadMoreComponent","PanelLoadMore","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","viewA","Content","viewB","_derivedPagination$pa3","_derivedPagination$pa4","_derivedPagination$pa5","LoadingModeRule","infiniteScroll","_props$slots","footerSlots","footer","PanelInfiniteScrollFooter","currentCount","statusText","status","rangeText","range","PanelPaginationFooter","onPrevPage","onNextPage","onPageJump","renderFooter","styled","_ref6","display","flexDirection","width","height","backgroundColor","theme","palette","background"],"mappings":"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"}
1
+ {"version":3,"file":"index.create.js","sources":["../../../src/data-surface/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { Box, styled } from '@mui/material'\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\r\nimport { DataSurfaceViewMode, LoadingModeRule, DataSurfaceFeatureMode } from './types'\r\nimport { createViewList, createViewListLoading } from './view-list'\r\nimport { createViewGrid, createViewGridLoading } from './view-grid'\r\nimport { createViewSwitchTransition } from './view-switch-transition'\r\nimport { PanelInfiniteScrollFooter, PanelLoadMore, PanelLoading, PanelNoData, PanelPaginationFooter } from './ui.units'\r\n// types\r\nimport type { BoxProps } from '@mui/material'\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { IViewGridLoadingProps } from './view-grid'\r\nimport type { IViewGridConfig, IViewGridProps } from './view-grid/types'\r\nimport type { TPagination, TDataSurfaceState, TRenderableNode } from './types'\r\nimport type { IViewListConfig, IViewListLoadingProps, IViewListProps } from './view-list'\r\n\r\nexport interface IDataSurfaceSlots<T> {\r\n listViewProps?: IViewListProps<T>\r\n gridViewProps?: IViewGridProps<T>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n footer?: {\r\n status?: TRenderableNode\r\n range?: TRenderableNode\r\n }\r\n}\r\n\r\nexport interface IDataSurfaceProps<T> {\r\n value?: T[]\r\n /**\r\n * @deprecated No longer used. Use `viewMode` and `loadMode` props directly instead.\r\n * Controlled state. When provided, DataSurface becomes fully controlled.\r\n */\r\n state?: TDataSurfaceState\r\n /**\r\n * @deprecated No longer used. Component now uses uncontrolled mode with props.\r\n * Called on any state change (viewMode, loadMode, page, pageSize).\r\n */\r\n onStateChange?: (state: TDataSurfaceState) => void\r\n viewMode?: DataSurfaceViewMode\r\n /** Pagination metadata shared by both modes. */\r\n pagination?: TPagination\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** True while a page fetch is in flight (shows loading indicator). */\r\n loading?: boolean\r\n /**\r\n * Called when the component needs a new page of data.\r\n * - pagination mode: triggered by user clicking page control\r\n * - infiniteScroll mode: triggered automatically when scrolling near the bottom\r\n * Supports async operations - return a Promise to indicate loading state.\r\n */\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n /** Load orchestration mode. @default 'pagination' */\r\n loadMode?: LoadingModeRule\r\n sx?: BoxProps['sx']\r\n slots?: IDataSurfaceSlots<T>\r\n /** Enable row selection with checkboxes (List view only). */\r\n selectable?: boolean\r\n /** Array of selected row IDs (List view only). */\r\n selectedIds?: (string | number)[]\r\n /** Callback when selection changes (List view only). */\r\n onSelectionChange?: (selectedIds: (string | number)[]) => void\r\n}\r\n\r\nexport interface IDataSurfaceConfig<T> {\r\n /** Feature mode determines the internal optimizations and rendering strategies. @default 'client' */\r\n featureMode?: DataSurfaceFeatureMode\r\n /** Default view mode when not provided via props. @default 'grid' */\r\n defaultViewMode?: DataSurfaceViewMode\r\n /** Default load mode when not provided via props. @default 'pagination' */\r\n defaultLoadMode?: LoadingModeRule\r\n /** Default page size. @default 20 */\r\n defaultPageSize?: number\r\n /** Configuration for List view. If not provided, List view will use default settings. */\r\n listConfig?: IViewListConfig<T>\r\n /** Custom List component. If not provided, a default List component will be used. */\r\n ListComponent?: ComponentType<IViewListProps<T>>\r\n /** Configuration for Grid view. If not provided, Grid view will use default settings. */\r\n gridConfig?: IViewGridConfig<T>\r\n /** Custom Grid component. If not provided, a default Grid component will be used. */\r\n GridComponent?: ComponentType<IViewGridProps<T>>\r\n /** Custom loading component. If not provided, a default loading component will be used. */\r\n PanelLoading?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom no data component. If not provided, a default no data component will be used. */\r\n PanelNoData?: ComponentType<{ viewMode: DataSurfaceViewMode }>\r\n /** Custom load more component for infinite scroll mode. If not provided, a default loading indicator will be shown when fetching the next page. */\r\n PanelLoadMore?: ComponentType\r\n}\r\n\r\nexport function createDataSurface<T>(config: IDataSurfaceConfig<T>) {\r\n if (!config.GridComponent) {\r\n const configInput: IViewGridConfig<T> = config.gridConfig || { getterId: (item: T, index: number) => index }\r\n config.gridConfig = configInput\r\n config.GridComponent = createViewGrid<T>(configInput)\r\n }\r\n\r\n if (!config.ListComponent) {\r\n const configInput: IViewListConfig<T> = config.listConfig || { getterId: (item: T, index: number) => index }\r\n config.listConfig = configInput\r\n config.ListComponent = createViewList<T>(configInput)\r\n }\r\n\r\n const { defaultViewMode = 'grid', defaultLoadMode = 'pagination', featureMode = 'client' } = config\r\n const ViewSwitchTranstionInstance = createViewSwitchTransition<DataSurfaceViewMode>({})\r\n const GridLoadingComponent = createViewGridLoading<T>(config.GridComponent as ComponentType<IViewGridProps<T>>)\r\n const ListLoadingComponent = createViewListLoading<T>(config.ListComponent as ComponentType<IViewListProps<T>>)\r\n\r\n const DataSurface: FC<IDataSurfaceProps<T>> = (props) => {\r\n const slots = props.slots || {}\r\n const defaultPageSize = props.pagination?.pageSize ?? config.defaultPageSize ?? 20\r\n // separate pagination state\r\n const [internalPagination, setInternalPagination] = useState<TPagination>({ page: 0, pageSize: defaultPageSize })\r\n\r\n // resolved pagination: external takes priority over internal\r\n const paginationState = useMemo<TPagination>(() => {\r\n const p = props.pagination ?? internalPagination\r\n return {\r\n page: p.page ?? 0,\r\n pageSize: p.pageSize ?? defaultPageSize,\r\n hasNext: p.hasNext ?? false,\r\n hasPrev: p.hasPrev ?? false,\r\n total: p.total\r\n }\r\n }, [props.pagination, internalPagination])\r\n\r\n const viewMode = props.viewMode ?? defaultViewMode\r\n const loadMode = props.loadMode ?? defaultLoadMode\r\n\r\n // Determine renderStrategy based on current viewMode\r\n const renderStrategy = useMemo(() => {\r\n if (viewMode === 'grid') {\r\n return config.gridConfig?.renderStrategy ?? 'normal'\r\n }\r\n return config.listConfig?.renderStrategy ?? 'normal'\r\n }, [viewMode])\r\n\r\n const handlePrevPage = useCallback(async () => {\r\n const currentPage = paginationState.page ?? 0\r\n if (currentPage <= 0) return\r\n const prevPage = currentPage - 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: prevPage }))\r\n }\r\n await props.onPageChange?.(prevPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handleNextPage = useCallback(async () => {\r\n if (!paginationState.hasNext) return\r\n const currentPage = paginationState.page ?? 0\r\n const nextPage = currentPage + 1\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: nextPage }))\r\n }\r\n await props.onPageChange?.(nextPage, paginationState.pageSize ?? defaultPageSize)\r\n }, [paginationState.hasNext, paginationState.page, paginationState.pageSize, props.pagination, props.onPageChange])\r\n\r\n const handlePageJump = useCallback(\r\n async (targetPage: number) => {\r\n if (targetPage < 0) return\r\n if (!props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: targetPage }))\r\n }\r\n await props.onPageChange?.(targetPage, paginationState.pageSize ?? defaultPageSize)\r\n },\r\n [paginationState.pageSize, props.pagination, props.onPageChange]\r\n )\r\n\r\n const finalValue = props.value || []\r\n\r\n // Token changes whenever props.value reference changes — used to reset scroll in views (client mode only)\r\n const scrollResetToken = featureMode === 'client' ? props.value : undefined\r\n\r\n // Reset page to 0 when the data source changes (e.g. new filtered array passed in) — client mode only\r\n useEffect(() => {\r\n if (featureMode === 'client' && !props.pagination) {\r\n setInternalPagination((prev) => ({ ...prev, page: 0 }))\r\n }\r\n }, [props.value])\r\n\r\n // When running in client feature mode, derive pagination metadata from the full value\r\n const derivedPagination = useMemo<TPagination>(() => {\r\n const page = paginationState.page ?? 0\r\n const pageSize = paginationState.pageSize ?? defaultPageSize\r\n if (featureMode === 'client') {\r\n const total = finalValue.length\r\n const hasNext = pageSize * (page + 1) < total\r\n const hasPrev = page > 0\r\n return { page, pageSize, hasNext, hasPrev, total }\r\n }\r\n return paginationState\r\n }, [paginationState, finalValue.length, featureMode, defaultPageSize])\r\n\r\n // Slice the input value when client-side pagination is enabled\r\n const paginatedValue = useMemo(() => {\r\n if (featureMode === 'client') {\r\n const page = derivedPagination.page ?? 0\r\n const pageSize = derivedPagination.pageSize ?? defaultPageSize\r\n if (loadMode === 'infiniteScroll') {\r\n // accumulate all items from page 0 → current page\r\n return finalValue.slice(0, (page + 1) * pageSize)\r\n }\r\n const start = page * pageSize\r\n return finalValue.slice(start, start + pageSize)\r\n }\r\n return finalValue\r\n }, [finalValue, derivedPagination, featureMode, loadMode, defaultPageSize])\r\n\r\n const isEmptyData = finalValue.length === 0\r\n const isInitialLoading = Boolean(props.loading && isEmptyData)\r\n const isNoData = !props.loading && isEmptyData\r\n const showLoadingOverlay = Boolean(props.loading) && !isEmptyData\r\n\r\n const handleGridPageChange = useCallback(\r\n async (page: number, pageSize: number) => {\r\n if (!props.pagination) {\r\n setInternalPagination({ page, pageSize })\r\n }\r\n await props.onPageChange?.(page, pageSize)\r\n },\r\n [props.pagination, props.onPageChange]\r\n )\r\n\r\n const gridPayload = useMemo<IViewGridLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n scrollResetToken,\r\n ...slots.gridViewProps\r\n }),\r\n [paginatedValue, loadMode, props.loading, derivedPagination, handleGridPageChange, scrollResetToken, slots.gridViewProps]\r\n )\r\n\r\n const gridPayloadRef = useRef<IViewGridLoadingProps<T>>(gridPayload)\r\n gridPayloadRef.current = gridPayload\r\n\r\n const listPayload = useMemo<IViewListLoadingProps<T>>(\r\n () => ({\r\n value: paginatedValue,\r\n loadMode,\r\n loading: props.loading,\r\n pagination: derivedPagination,\r\n onPageChange: handleGridPageChange,\r\n renderStrategy: renderStrategy,\r\n selectable: props.selectable ?? config.listConfig?.selectable,\r\n selectedIds: props.selectedIds,\r\n onSelectionChange: props.onSelectionChange,\r\n scrollResetToken,\r\n ...slots.listViewProps\r\n }),\r\n [\r\n paginatedValue,\r\n loadMode,\r\n props.loading,\r\n derivedPagination,\r\n renderStrategy,\r\n handleGridPageChange,\r\n props.selectable,\r\n props.selectedIds,\r\n props.onSelectionChange,\r\n scrollResetToken,\r\n slots.listViewProps\r\n ]\r\n )\r\n\r\n const listPayloadRef = useRef<IViewListLoadingProps<T>>(listPayload)\r\n listPayloadRef.current = listPayload\r\n\r\n const ListViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewListContent: FC<{ value: DataSurfaceViewMode }> = () => <ListLoadingComponent {...listPayloadRef.current} />\r\n return ViewListContent\r\n }, [ListLoadingComponent])\r\n\r\n const GridViewContent = useMemo<ComponentType<{ value: DataSurfaceViewMode }>>(() => {\r\n const ViewGridContent: FC<{ value: DataSurfaceViewMode }> = () => <GridLoadingComponent {...gridPayloadRef.current} />\r\n return ViewGridContent\r\n }, [GridLoadingComponent])\r\n\r\n const PanelLoadingComponent = useMemo(() => {\r\n return slots.PanelLoading || config?.PanelLoading || PanelLoading\r\n }, [slots.PanelLoading, config.PanelLoading, viewMode])\r\n\r\n const PanelNoDataComponent = useMemo(() => {\r\n return slots.PanelNoData || config?.PanelNoData || PanelNoData\r\n }, [slots.PanelNoData, config.PanelNoData, viewMode])\r\n\r\n const PanelLoadMoreComponent = useMemo(() => {\r\n return slots.PanelLoadMore || config?.PanelLoadMore || PanelLoadMore\r\n }, [slots.PanelLoadMore, config.PanelLoadMore])\r\n\r\n const renderFooter = () => {\r\n if (loadMode === LoadingModeRule.infiniteScroll) {\r\n const footerSlots = props.slots?.footer\r\n return (\r\n <PanelInfiniteScrollFooter\r\n loading={props.loading}\r\n hasNext={derivedPagination.hasNext}\r\n currentCount={paginatedValue.length}\r\n total={derivedPagination.total}\r\n slots={{\r\n statusText: footerSlots?.status,\r\n rangeText: footerSlots?.range\r\n }}\r\n />\r\n )\r\n }\r\n\r\n // pagination mode\r\n return (\r\n <PanelPaginationFooter\r\n page={derivedPagination.page ?? 0}\r\n pageSize={derivedPagination.pageSize ?? defaultPageSize}\r\n total={derivedPagination.total}\r\n hasNext={derivedPagination.hasNext}\r\n hasPrev={(derivedPagination.page ?? 0) > 0}\r\n loading={props.loading}\r\n onPrevPage={handlePrevPage}\r\n onNextPage={handleNextPage}\r\n onPageJump={handlePageJump}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <DataSurfaceStyled sx={props.sx}>\r\n <Box sx={{ flex: 1, minHeight: 0, position: 'relative' }}>\r\n {isInitialLoading && <PanelLoadingComponent viewMode={viewMode} />}\r\n {isNoData && <PanelNoDataComponent viewMode={viewMode} />}\r\n {!isInitialLoading && !isNoData && (\r\n <ViewSwitchTranstionInstance\r\n value={viewMode}\r\n viewA={{ value: 'list', Content: ListViewContent }}\r\n viewB={{ value: 'grid', Content: GridViewContent }}\r\n />\r\n )}\r\n {showLoadingOverlay && <PanelLoadMoreComponent />}\r\n </Box>\r\n {renderFooter()}\r\n </DataSurfaceStyled>\r\n )\r\n }\r\n return DataSurface\r\n}\r\n\r\nexport default createDataSurface\r\n\r\nconst DataSurfaceStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n flex: 1,\r\n minHeight: 0,\r\n backgroundColor: theme.palette.background.default\r\n}))\r\n"],"names":["createDataSurface","config","GridComponent","configInput","gridConfig","getterId","item","index","createViewGrid","ListComponent","listConfig","createViewList","_config$defaultViewMo","defaultViewMode","_config$defaultLoadMo","defaultLoadMode","_config$featureMode","featureMode","ViewSwitchTranstionInstance","createViewSwitchTransition","GridLoadingComponent","createViewGridLoading","ListLoadingComponent","createViewListLoading","props","_ref","_props$pagination$pag","_props$pagination","_props$viewMode","_props$loadMode","slots","defaultPageSize","pagination","pageSize","_useState","useState","page","_useState2","_slicedToArray","internalPagination","setInternalPagination","paginationState","useMemo","_props$pagination2","_p$page","_p$pageSize","_p$hasNext","_p$hasPrev","p","hasNext","hasPrev","total","viewMode","loadMode","renderStrategy","_config$listConfig$re","_config$listConfig","_config$gridConfig$re","_config$gridConfig","handlePrevPage","useCallback","_asyncToGenerator","_regenerator","m","_callee","_paginationState$page","_props$onPageChange","_paginationState$page2","currentPage","prevPage","w","_context","n","a","prev","_objectSpread","onPageChange","call","handleNextPage","_callee2","_paginationState$page3","_props$onPageChange2","_paginationState$page4","nextPage","_context2","handlePageJump","_ref4","_callee3","targetPage","_props$onPageChange3","_paginationState$page5","_context3","_x","apply","this","arguments","finalValue","value","scrollResetToken","undefined","useEffect","derivedPagination","_paginationState$page6","_paginationState$page7","length","paginatedValue","_derivedPagination$pa","_derivedPagination$pa2","slice","start","isEmptyData","isInitialLoading","Boolean","loading","isNoData","showLoadingOverlay","handleGridPageChange","_ref5","_callee4","_props$onPageChange4","_context4","_x2","_x3","gridPayload","gridViewProps","gridPayloadRef","useRef","current","listPayload","_props$selectable","_config$listConfig2","selectable","selectedIds","onSelectionChange","listViewProps","listPayloadRef","ListViewContent","_jsx","GridViewContent","PanelLoadingComponent","PanelLoading","PanelNoDataComponent","PanelNoData","PanelLoadMoreComponent","PanelLoadMore","_jsxs","DataSurfaceStyled","sx","children","Box","flex","minHeight","position","viewA","Content","viewB","_derivedPagination$pa3","_derivedPagination$pa4","_derivedPagination$pa5","LoadingModeRule","infiniteScroll","_props$slots","footerSlots","footer","PanelInfiniteScrollFooter","currentCount","statusText","status","rangeText","range","PanelPaginationFooter","onPrevPage","onNextPage","onPageJump","renderFooter","styled","_ref6","display","flexDirection","width","height","backgroundColor","theme","palette","background"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{styled as o,Box as t,alpha as e}from"@mui/material";var r={root:"DinoViewGrid-root",normal:"DinoViewGrid-normal",autoHeight:"DinoViewGrid-autoHeight",virtualized:"DinoViewGrid-virtualized",scrollContainer:"DinoViewGrid-scrollContainer",grid:"DinoViewGrid-grid",gridItem:"DinoViewGrid-item",scrolling:"DinoViewGrid-scrolling"},n=r,a=o(t)(function(o){var t=o.theme;return i(i(i(i({display:"flex",flex:1,minHeight:0,minWidth:0,position:"relative",width:"100%",height:"100%",overflow:"hidden",boxSizing:"border-box"},".".concat(n.scrollContainer),{width:"100%",height:"100%",overflowY:"auto",padding:t.spacing(.5),"&::-webkit-scrollbar":{width:8,height:8},"&::-webkit-scrollbar-thumb":{backgroundColor:t.palette.grey[300],borderRadius:4},"&::-webkit-scrollbar-thumb:hover":{backgroundColor:t.palette.grey[500]}}),".".concat(n.scrollContainer,"::before"),{content:'""',position:"absolute",top:0,left:0,right:0,height:t.spacing(1.5),background:"linear-gradient(\n to bottom,\n ".concat(t.palette.background.paper," 0%,\n ").concat(e(t.palette.background.paper,.16)," 30%,\n transparent 100%\n )"),pointerEvents:"none",opacity:0,visibility:"hidden",transition:"all 0.3s ease-out",zIndex:t.zIndex.appBar-1}),"&.".concat(n.scrolling," .").concat(n.scrollContainer,"::before"),{opacity:1,visibility:"visible"}),"&.".concat(n.normal,".").concat(n.autoHeight),i({height:"auto",overflow:"visible"},".".concat(n.scrollContainer),{position:"static",inset:"auto",overflowY:"visible"}))});export{a as ViewGridStyled,r as viewGridClasses};
1
+ import{defineProperty as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{styled as o,Box as r,alpha as t}from"@mui/material";var e={root:"DinoViewGrid-root",normal:"DinoViewGrid-normal",autoHeight:"DinoViewGrid-autoHeight",virtualized:"DinoViewGrid-virtualized",scrollContainer:"DinoViewGrid-scrollContainer",grid:"DinoViewGrid-grid",gridItem:"DinoViewGrid-item",scrolling:"DinoViewGrid-scrolling"},n=e,a=o(r)(function(o){var r=o.theme;return i(i(i(i({display:"flex",flex:1,minHeight:0,minWidth:0,position:"relative",width:"100%",height:"100%",overflow:"hidden",boxSizing:"border-box"},".".concat(n.scrollContainer),{width:"100%",height:"100%",overflowY:"auto",padding:r.spacing(.5),"&::-webkit-scrollbar":{width:6,height:6},"&::-webkit-scrollbar-thumb":{backgroundColor:r.palette.grey[400]},"&::-webkit-scrollbar-thumb:hover":{backgroundColor:r.palette.grey[600]},"&::-webkit-scrollbar-track":{backgroundColor:r.palette.grey[200],borderRadius:4},"&::-webkit-scrollbar-track:hover":{backgroundColor:r.palette.grey[300]}}),".".concat(n.scrollContainer,"::before"),{content:'""',position:"absolute",top:0,left:0,right:0,height:r.spacing(1.5),background:"linear-gradient(\n to bottom,\n ".concat(r.palette.background.paper," 0%,\n ").concat(t(r.palette.background.paper,.16)," 30%,\n transparent 100%\n )"),pointerEvents:"none",opacity:0,visibility:"hidden",transition:"all 0.3s ease-out",zIndex:r.zIndex.appBar-1}),"&.".concat(n.scrolling," .").concat(n.scrollContainer,"::before"),{opacity:1,visibility:"visible"}),"&.".concat(n.normal,".").concat(n.autoHeight),i({height:"auto",overflow:"visible"},".".concat(n.scrollContainer),{position:"static",inset:"auto",overflowY:"visible"}))});export{a as ViewGridStyled,e as viewGridClasses};
2
2
  //# sourceMappingURL=styleds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styleds.js","sources":["../../../../src/data-surface/view-grid/styleds.tsx"],"sourcesContent":["import { alpha, Box, styled } from '@mui/material'\r\n\r\nexport const viewGridClasses = {\r\n root: 'DinoViewGrid-root',\r\n normal: 'DinoViewGrid-normal',\r\n autoHeight: 'DinoViewGrid-autoHeight',\r\n virtualized: 'DinoViewGrid-virtualized',\r\n scrollContainer: 'DinoViewGrid-scrollContainer',\r\n grid: 'DinoViewGrid-grid',\r\n gridItem: 'DinoViewGrid-item',\r\n // Statuses\r\n scrolling: 'DinoViewGrid-scrolling'\r\n}\r\nconst classes = viewGridClasses\r\n\r\nexport const ViewGridStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flex: 1,\r\n minHeight: 0,\r\n minWidth: 0,\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n boxSizing: 'border-box',\r\n [`.${classes.scrollContainer}`]: {\r\n width: '100%',\r\n height: '100%',\r\n overflowY: 'auto',\r\n padding: theme.spacing(0.5),\r\n // Scrollbar styling\r\n '&::-webkit-scrollbar': { width: 8, height: 8 },\r\n '&::-webkit-scrollbar-thumb': { backgroundColor: theme.palette.grey[300], borderRadius: 4 },\r\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: theme.palette.grey[500] }\r\n },\r\n [`.${classes.scrollContainer}::before`]: {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n height: theme.spacing(1.5),\r\n background: `linear-gradient(\r\n to bottom,\r\n ${theme.palette.background.paper} 0%,\r\n ${alpha(theme.palette.background.paper, 0.16)} 30%,\r\n transparent 100%\r\n )`,\r\n pointerEvents: 'none',\r\n // animation\r\n opacity: 0,\r\n visibility: 'hidden',\r\n transition: 'all 0.3s ease-out',\r\n zIndex: theme.zIndex.appBar - 1\r\n },\r\n [`&.${classes.scrolling} .${classes.scrollContainer}::before`]: {\r\n opacity: 1,\r\n visibility: 'visible'\r\n },\r\n // Auto-height variant: disable the internal scroll container and let the\r\n // component size expand with content. This makes the table render all\r\n // rows and removes the internal scrollbar used in 'normal' modes.\r\n [`&.${classes.normal}.${classes.autoHeight}`]: {\r\n height: 'auto',\r\n overflow: 'visible',\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'static',\r\n inset: 'auto',\r\n overflowY: 'visible'\r\n }\r\n }\r\n}))\r\n"],"names":["viewGridClasses","root","normal","autoHeight","virtualized","scrollContainer","grid","gridItem","scrolling","classes","ViewGridStyled","styled","Box","_ref","theme","_defineProperty","display","flex","minHeight","minWidth","position","width","height","overflow","boxSizing","concat","overflowY","padding","spacing","backgroundColor","palette","grey","borderRadius","content","top","left","right","background","paper","alpha","pointerEvents","opacity","visibility","transition","zIndex","appBar","inset"],"mappings":"2IAEO,IAAMA,EAAkB,CAC7BC,KAAM,oBACNC,OAAQ,sBACRC,WAAY,0BACZC,YAAa,2BACbC,gBAAiB,+BACjBC,KAAM,oBACNC,SAAU,oBAEVC,UAAW,0BAEPC,EAAUT,EAEHU,EAAiBC,EAAOC,EAAPD,CAAY,SAAAE,GAAA,IAAGC,EAAKD,EAALC,MAAK,OAAAC,EAAAA,EAAAA,EAAAA,EAAA,CAChDC,QAAS,OACTC,KAAM,EACNC,UAAW,EACXC,SAAU,EACVC,SAAU,WACVC,MAAO,OACPC,OAAQ,OACRC,SAAU,SACVC,UAAW,cAAY,IAAAC,OAClBhB,EAAQJ,iBAAoB,CAC/BgB,MAAO,OACPC,OAAQ,OACRI,UAAW,OACXC,QAASb,EAAMc,QAAQ,IAEvB,uBAAwB,CAAEP,MAAO,EAAGC,OAAQ,GAC5C,6BAA8B,CAAEO,gBAAiBf,EAAMgB,QAAQC,KAAK,KAAMC,aAAc,GACxF,mCAAoC,CAAEH,gBAAiBf,EAAMgB,QAAQC,KAAK,YAC3EN,OACIhB,EAAQJ,gBAA4B,YAAA,CACvC4B,QAAS,KACTb,SAAU,WACVc,IAAK,EACLC,KAAM,EACNC,MAAO,EACPd,OAAQR,EAAMc,QAAQ,KACtBS,WAAU,6CAAAZ,OAENX,EAAMgB,QAAQO,WAAWC,MAAKb,gBAAAA,OAC9Bc,EAAMzB,EAAMgB,QAAQO,WAAWC,MAAO,KAExC,wCACFE,cAAe,OAEfC,QAAS,EACTC,WAAY,SACZC,WAAY,oBACZC,OAAQ9B,EAAM8B,OAAOC,OAAS,IAC/BpB,KAAAA,OACKhB,EAAQD,UAASiB,MAAAA,OAAKhB,EAAQJ,gBAA4B,YAAA,CAC9DoC,QAAS,EACTC,WAAY,YACbjB,KAAAA,OAIKhB,EAAQP,OAAMuB,KAAAA,OAAIhB,EAAQN,YAAUY,EAAA,CACxCO,OAAQ,OACRC,SAAU,WAAS,IAAAE,OACdhB,EAAQJ,iBAAoB,CAC/Be,SAAU,SACV0B,MAAO,OACPpB,UAAW,YACZ"}
1
+ {"version":3,"file":"styleds.js","sources":["../../../../src/data-surface/view-grid/styleds.tsx"],"sourcesContent":["import { alpha, Box, styled } from '@mui/material'\r\n\r\nexport const viewGridClasses = {\r\n root: 'DinoViewGrid-root',\r\n normal: 'DinoViewGrid-normal',\r\n autoHeight: 'DinoViewGrid-autoHeight',\r\n virtualized: 'DinoViewGrid-virtualized',\r\n scrollContainer: 'DinoViewGrid-scrollContainer',\r\n grid: 'DinoViewGrid-grid',\r\n gridItem: 'DinoViewGrid-item',\r\n // Statuses\r\n scrolling: 'DinoViewGrid-scrolling'\r\n}\r\nconst classes = viewGridClasses\r\n\r\nexport const ViewGridStyled = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flex: 1,\r\n minHeight: 0,\r\n minWidth: 0,\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n boxSizing: 'border-box',\r\n [`.${classes.scrollContainer}`]: {\r\n width: '100%',\r\n height: '100%',\r\n overflowY: 'auto',\r\n padding: theme.spacing(0.5),\r\n // Scrollbar styling\r\n '&::-webkit-scrollbar': { width: 6, height: 6 },\r\n '&::-webkit-scrollbar-thumb': { backgroundColor: theme.palette.grey[400] },\r\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: theme.palette.grey[600] },\r\n '&::-webkit-scrollbar-track': { backgroundColor: theme.palette.grey[200], borderRadius: 4 },\r\n '&::-webkit-scrollbar-track:hover': { backgroundColor: theme.palette.grey[300] }\r\n },\r\n [`.${classes.scrollContainer}::before`]: {\r\n content: '\"\"',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n height: theme.spacing(1.5),\r\n background: `linear-gradient(\r\n to bottom,\r\n ${theme.palette.background.paper} 0%,\r\n ${alpha(theme.palette.background.paper, 0.16)} 30%,\r\n transparent 100%\r\n )`,\r\n pointerEvents: 'none',\r\n // animation\r\n opacity: 0,\r\n visibility: 'hidden',\r\n transition: 'all 0.3s ease-out',\r\n zIndex: theme.zIndex.appBar - 1\r\n },\r\n [`&.${classes.scrolling} .${classes.scrollContainer}::before`]: {\r\n opacity: 1,\r\n visibility: 'visible'\r\n },\r\n // Auto-height variant: disable the internal scroll container and let the\r\n // component size expand with content. This makes the table render all\r\n // rows and removes the internal scrollbar used in 'normal' modes.\r\n [`&.${classes.normal}.${classes.autoHeight}`]: {\r\n height: 'auto',\r\n overflow: 'visible',\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'static',\r\n inset: 'auto',\r\n overflowY: 'visible'\r\n }\r\n }\r\n}))\r\n"],"names":["viewGridClasses","root","normal","autoHeight","virtualized","scrollContainer","grid","gridItem","scrolling","classes","ViewGridStyled","styled","Box","_ref","theme","_defineProperty","display","flex","minHeight","minWidth","position","width","height","overflow","boxSizing","concat","overflowY","padding","spacing","backgroundColor","palette","grey","borderRadius","content","top","left","right","background","paper","alpha","pointerEvents","opacity","visibility","transition","zIndex","appBar","inset"],"mappings":"2IAEO,IAAMA,EAAkB,CAC7BC,KAAM,oBACNC,OAAQ,sBACRC,WAAY,0BACZC,YAAa,2BACbC,gBAAiB,+BACjBC,KAAM,oBACNC,SAAU,oBAEVC,UAAW,0BAEPC,EAAUT,EAEHU,EAAiBC,EAAOC,EAAPD,CAAY,SAAAE,GAAA,IAAGC,EAAKD,EAALC,MAAK,OAAAC,EAAAA,EAAAA,EAAAA,EAAA,CAChDC,QAAS,OACTC,KAAM,EACNC,UAAW,EACXC,SAAU,EACVC,SAAU,WACVC,MAAO,OACPC,OAAQ,OACRC,SAAU,SACVC,UAAW,cAAY,IAAAC,OAClBhB,EAAQJ,iBAAoB,CAC/BgB,MAAO,OACPC,OAAQ,OACRI,UAAW,OACXC,QAASb,EAAMc,QAAQ,IAEvB,uBAAwB,CAAEP,MAAO,EAAGC,OAAQ,GAC5C,6BAA8B,CAAEO,gBAAiBf,EAAMgB,QAAQC,KAAK,MACpE,mCAAoC,CAAEF,gBAAiBf,EAAMgB,QAAQC,KAAK,MAC1E,6BAA8B,CAAEF,gBAAiBf,EAAMgB,QAAQC,KAAK,KAAMC,aAAc,GACxF,mCAAoC,CAAEH,gBAAiBf,EAAMgB,QAAQC,KAAK,YAC3EN,OACIhB,EAAQJ,gBAA4B,YAAA,CACvC4B,QAAS,KACTb,SAAU,WACVc,IAAK,EACLC,KAAM,EACNC,MAAO,EACPd,OAAQR,EAAMc,QAAQ,KACtBS,WAAU,6CAAAZ,OAENX,EAAMgB,QAAQO,WAAWC,MAAKb,gBAAAA,OAC9Bc,EAAMzB,EAAMgB,QAAQO,WAAWC,MAAO,KAExC,wCACFE,cAAe,OAEfC,QAAS,EACTC,WAAY,SACZC,WAAY,oBACZC,OAAQ9B,EAAM8B,OAAOC,OAAS,IAC/BpB,KAAAA,OACKhB,EAAQD,UAASiB,MAAAA,OAAKhB,EAAQJ,gBAA4B,YAAA,CAC9DoC,QAAS,EACTC,WAAY,YACbjB,KAAAA,OAIKhB,EAAQP,OAAMuB,KAAAA,OAAIhB,EAAQN,YAAUY,EAAA,CACxCO,OAAQ,OACRC,SAAU,WAAS,IAAAE,OACdhB,EAAQJ,iBAAoB,CAC/Be,SAAU,SACV0B,MAAO,OACPpB,UAAW,YACZ"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as e,asyncToGenerator as l,regenerator as n,slicedToArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as v,TableRow as f,TableCell as m,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as N}from"./hooks.js";import{ViewListStyled as H,viewListClasses as T}from"./styled.js";import{LIST_HEADER_HEIGHT as k,resolveListSpacerHeight as y,mapSxTableCell as w}from"./helpers.js";function M(e,l,n){var t=l[e.field],a=e.valueGetter?e.valueGetter(t,l,n):t,i={value:a,row:l,index:n,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return r(x,{variant:"body2",noWrap:!0,title:o,children:o})}function R(l){var n=function(e){return function(l){var n=C(e,l),t=1==n.normalOptions.autoHeight,i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),c=l.onSelectionChange,s=o(null);d(function(){"client"===l.featureMode&&!t&&void 0!==l.scrollResetToken&&s.current&&(s.current.scrollTop=0)},[l.featureMode,l.scrollResetToken]);var x=N(l.value,e.getterId,n.selectable,l.selectedIds,c),k=x.selectedIds,y=x.isAllSelected,R=x.isSomeSelected,z=x.handleToggleAll,I=x.handleToggleRow,j=u(function(){var e=[T.root,T.normal];return t&&e.push(T.autoHeight),e.join(" ")},[t]);return r(H,{className:j,style:n.rootStyle,children:r(h,{ref:s,className:T.scrollContainer,onScroll:function(e){if(!t){var r,a=e.currentTarget;a.scrollHeight-a.scrollTop-a.clientHeight<=n.nearEndThreshold&&(null===(r=l.onNearEnd)||void 0===r||r.call(l))}},children:a(g,{size:"small",className:T.table,children:[r(v,{className:T.tableHeader,children:a(f,{children:[n.selectable&&r(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:r(p,{checked:y,indeterminate:R,onChange:z})}),n.columns.map(function(e){var l;return r(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),r(b,{children:l.value.map(function(l,t){var o,c=null!==(o=e.getterId(l,t))&&void 0!==o?o:t,d=k.includes(c),s=n.rowHeight,u=n.cellPadding;return a(f,{hover:!0,sx:{height:s},selected:d,children:[n.selectable&&r(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:s,padding:u},children:r(p,{checked:d,onChange:function(){return I(c)}})}),n.columns.map(function(e){return r(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:s,padding:u}),children:r(S,{className:T.tableCellContent,children:M(e,l,t)})},"".concat(String(c),"-").concat(String(e.field)))})]},c)})})]})})})}}(l),i=function(e){return function(l){var n=C(e,l),i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),x=l.onSelectionChange,R=N(l.value,e.getterId,n.selectable,l.selectedIds,x),z=R.selectedIds,I=R.isAllSelected,j=R.isSomeSelected,O=R.handleToggleAll,B=R.handleToggleRow,A=o(null),E=o(null),P=c(0),G=t(P,2),_=G[0],W=G[1],q=c(0),D=t(q,2),F=D[0],J=D[1],K=c(k),L=t(K,2),Q=L[0],U=L[1],V=Math.max(1,n.virtualizedOptions.overscan);d(function(){"client"===l.featureMode&&void 0!==l.scrollResetToken&&(A.current&&(A.current.scrollTop=0),J(0))},[l.featureMode,l.scrollResetToken]),s(function(){if(A.current){var e=function(){var e,l,n=null!==(e=null===(l=A.current)||void 0===l?void 0:l.clientHeight)&&void 0!==e?e:0;W(function(e){return e===n?e:n})};e();var l=new ResizeObserver(function(){return e()});return l.observe(A.current),function(){return l.disconnect()}}},[]),s(function(){var e,l,n=null!==(e=null===(l=E.current)||void 0===l?void 0:l.offsetHeight)&&void 0!==e?e:0;n>0&&n!==Q&&U(n)},[n.columns.length,Q]);var X=u(function(){var e=l.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};var t=n.rowHeight,r=n.rowSpacing,a=t+r,i=F,o=Math.max(1,_-Q),c=Math.max(0,i-Q),d=Math.max(0,Math.floor(c/a)-V),s=Math.ceil(o/a),u=Math.min(e-1,d+s+2*V);return{start:d,end:u,topSpacerHeight:y(d,t,r),bottomSpacerHeight:y(e-u-1,t,r)}},[l.value.length,Q,V,n,F,_]),Y=X.end>=X.start?l.value.slice(X.start,X.end+1):[],Z=[T.root,T.virtualized].filter(Boolean).join(" ");return r(H,{className:Z,style:n.rootStyle,children:r(h,{ref:A,className:T.scrollContainer,onScroll:function(e){var t,r=e.currentTarget;J(r.scrollTop),r.scrollHeight-r.scrollTop-r.clientHeight<=n.nearEndThreshold&&(null===(t=l.onNearEnd)||void 0===t||t.call(l))},children:a(g,{size:"small",className:T.table,children:[r(v,{className:T.tableHeader,children:a(f,{ref:E,children:[n.selectable&&r(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:r(p,{checked:I,indeterminate:j,onChange:O})}),n.columns.map(function(e){var l;return r(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),a(b,{children:[X.topSpacerHeight>0?r(f,{className:T.tableSpacerRow,children:r(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:X.topSpacerHeight,padding:0,border:0}})}):null,Y.map(function(l,t){var o,c=X.start+t,d=null!==(o=e.getterId(l,c))&&void 0!==o?o:c,s=z.includes(d),u=n.rowHeight,h=n.cellPadding;return a(f,{hover:!0,sx:{height:u},selected:s,children:[n.selectable&&r(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:u,padding:h},children:r(p,{checked:s,onChange:function(){return B(d)}})}),n.columns.map(function(e){return r(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:u,padding:h}),children:r(S,{className:T.tableCellContent,children:M(e,l,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),X.bottomSpacerHeight>0?r(f,{className:T.tableSpacerRow,children:r(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:X.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(l);return function(t){var a,o,c=null!==(a=null!==(o=t.renderStrategy)&&void 0!==o?o:l.renderStrategy)&&void 0!==a?a:"normal";return r("virtualized"===c?i:n,e({},t))}}function z(e){return function(t){var a,o,c,d=i(l(n().m(function e(){var l,r,a,i,o,c,d,s,u;return n().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===t.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(l=t.pagination)&&void 0!==l&&l.hasNext){e.n=2;break}return e.a(2);case 2:if(!t.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(r=null===(a=t.pagination)||void 0===a?void 0:a.page)&&void 0!==r?r:0,s=null!==(i=null===(o=t.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=t.onPageChange)||void 0===c?void 0:c.call(t,u,s);case 4:return e.a(2)}},e)})),[t.loadMode,null===(a=t.pagination)||void 0===a?void 0:a.hasNext,null===(o=t.pagination)||void 0===o?void 0:o.page,null===(c=t.pagination)||void 0===c?void 0:c.pageSize,t.loading,t.onPageChange]);return r(e,{value:t.value,columns:t.columns,density:t.density,spacing:t.spacing,renderStrategy:t.renderStrategy,normalOptions:t.normalOptions,virtualizedOptions:t.virtualizedOptions,onNearEnd:"infiniteScroll"===t.loadMode?d:void 0,selectable:t.selectable,selectedIds:t.selectedIds,onSelectionChange:t.onSelectionChange,scrollResetToken:t.scrollResetToken})}}export{R as createViewList,z as createViewListLoading,R as default};
1
+ import{objectSpread2 as e,asyncToGenerator as l,regenerator as n,slicedToArray as r}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useCallback as i,useRef as o,useState as c,useEffect as d,useLayoutEffect as s,useMemo as u}from"react";import{TableContainer as h,Table as g,TableHead as f,TableRow as v,TableCell as m,Checkbox as p,TableBody as b,Box as S,Typography as x}from"@mui/material";import{useMergedConfig as C,useListSelection as N}from"./hooks.js";import{ViewListStyled as H,viewListClasses as T}from"./styled.js";import{LIST_HEADER_HEIGHT as k,resolveListSpacerHeight as y,mapSxTableCell as w}from"./helpers.js";function M(e,l,n){var r=l[e.field],a=e.valueGetter?e.valueGetter(r,l,n):r,i={value:a,row:l,index:n,field:e.field};if(e.renderCell)return e.renderCell(i);var o=String(null!=a?a:"");return t(x,{variant:"body2",noWrap:!0,title:o,children:o})}function R(l){var n=function(e){return function(l){var n=C(e,l),r=1==n.normalOptions.autoHeight,i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),c=l.onSelectionChange,s=o(null);d(function(){"client"===l.featureMode&&!r&&void 0!==l.scrollResetToken&&s.current&&(s.current.scrollTop=0)},[l.featureMode,l.scrollResetToken]);var x=N(l.value,e.getterId,n.selectable,l.selectedIds,c),k=x.selectedIds,y=x.isAllSelected,R=x.isSomeSelected,z=x.handleToggleAll,I=x.handleToggleRow,j=u(function(){var e=[T.root,T.normal];return r&&e.push(T.autoHeight),e.join(" ")},[r]);return t(H,{className:j,style:n.rootStyle,children:t(h,{ref:s,className:T.scrollContainer,onScroll:function(e){if(!r){var t,a=e.currentTarget;a.scrollHeight-a.scrollTop-a.clientHeight<=n.nearEndThreshold&&(null===(t=l.onNearEnd)||void 0===t||t.call(l))}},children:a(g,{size:"small",className:T.table,children:[t(f,{className:T.tableHeader,children:a(v,{children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:t(p,{checked:y,indeterminate:R,onChange:z})}),n.columns.map(function(e){var l;return t(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),t(b,{children:l.value.map(function(l,r){var o,c=null!==(o=e.getterId(l,r))&&void 0!==o?o:r,d=k.includes(c),s=n.rowHeight,u=n.cellPadding;return a(v,{hover:!0,sx:{height:s},selected:d,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:s,padding:u},children:t(p,{checked:d,onChange:function(){return I(c)}})}),n.columns.map(function(e){return t(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:s,padding:u}),children:t(S,{className:T.tableCellContent,children:M(e,l,r)})},"".concat(String(c),"-").concat(String(e.field)))})]},c)})})]})})})}}(l),i=function(e){return function(l){var n=C(e,l),i=n.columns.reduce(function(e,l){return e+(l.flex&&l.flex>0?l.flex:0)},0),x=l.onSelectionChange,R=N(l.value,e.getterId,n.selectable,l.selectedIds,x),z=R.selectedIds,I=R.isAllSelected,j=R.isSomeSelected,O=R.handleToggleAll,B=R.handleToggleRow,A=o(null),E=o(null),P=o(!1),G=c(0),_=r(G,2),W=_[0],q=_[1],D=c(0),F=r(D,2),J=F[0],K=F[1],L=c(k),Q=r(L,2),U=Q[0],V=Q[1],X=Math.max(1,n.virtualizedOptions.overscan);d(function(){"client"===l.featureMode&&void 0!==l.scrollResetToken&&(A.current&&(A.current.scrollTop=0),K(0))},[l.featureMode,l.scrollResetToken]),s(function(){if(A.current){var e=function(){var e,l,n=null!==(e=null===(l=A.current)||void 0===l?void 0:l.clientHeight)&&void 0!==e?e:0;q(function(e){return e===n?e:n})};e();var l=new ResizeObserver(function(){return e()});return l.observe(A.current),function(){return l.disconnect()}}},[]),s(function(){P.current=!1},[n.columns.length]),s(function(){var e,l;if(!P.current){var n=null!==(e=null===(l=E.current)||void 0===l?void 0:l.offsetHeight)&&void 0!==e?e:0;n>0&&(P.current=!0,V(n))}},[n.columns.length]);var Y=u(function(){var e=l.value.length;if(0===e)return{start:0,end:-1,topSpacerHeight:0,bottomSpacerHeight:0};var r=n.rowHeight,t=n.rowSpacing,a=r+t,i=J,o=Math.max(1,W-U),c=Math.max(0,i-U),d=Math.max(0,Math.floor(c/a)-X),s=Math.ceil(o/a),u=Math.min(e-1,d+s+2*X);return{start:d,end:u,topSpacerHeight:y(d,r,t),bottomSpacerHeight:y(e-u-1,r,t)}},[l.value.length,U,X,n,J,W]),Z=Y.end>=Y.start?l.value.slice(Y.start,Y.end+1):[],$=[T.root,T.virtualized].filter(Boolean).join(" ");return t(H,{className:$,style:n.rootStyle,children:t(h,{ref:A,className:T.scrollContainer,onScroll:function(e){var r,t=e.currentTarget;K(t.scrollTop),t.scrollHeight-t.scrollTop-t.clientHeight<=n.nearEndThreshold&&(null===(r=l.onNearEnd)||void 0===r||r.call(l))},children:a(g,{size:"small",className:T.table,children:[t(f,{className:T.tableHeader,children:a(v,{ref:E,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableHeaderCell,sx:{width:48},children:t(p,{checked:I,indeterminate:j,onChange:O})}),n.columns.map(function(e){var l;return t(m,{className:T.tableHeaderCell,align:e.align,sx:w(e,i),children:null!==(l=e.label)&&void 0!==l?l:String(e.field)},String(e.field))})]})}),a(b,{children:[Y.topSpacerHeight>0?t(v,{className:T.tableSpacerRow,children:t(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.topSpacerHeight,padding:0,border:0}})}):null,Z.map(function(l,r){var o,c=Y.start+r,d=null!==(o=e.getterId(l,c))&&void 0!==o?o:c,s=z.includes(d),u=n.rowHeight,h=n.cellPadding;return a(v,{hover:!0,sx:{height:u},selected:s,children:[n.selectable&&t(m,{padding:"checkbox",className:T.tableBodyCell,sx:{height:u,padding:h},children:t(p,{checked:s,onChange:function(){return B(d)}})}),n.columns.map(function(e){return t(m,{className:T.tableBodyCell,align:e.align,sx:w(e,i,{height:u,padding:h}),children:t(S,{className:T.tableCellContent,children:M(e,l,c)})},"".concat(String(d),"-").concat(String(e.field)))})]},d)}),Y.bottomSpacerHeight>0?t(v,{className:T.tableSpacerRow,children:t(m,{colSpan:n.columns.length+(n.selectable?1:0),className:T.tableSpacerCell,sx:{height:Y.bottomSpacerHeight,padding:0,border:0}})}):null]})]})})})}}(l);return function(r){var a,o,c=null!==(a=null!==(o=r.renderStrategy)&&void 0!==o?o:l.renderStrategy)&&void 0!==a?a:"normal";return t("virtualized"===c?i:n,e({},r))}}function z(e){return function(r){var a,o,c,d=i(l(n().m(function e(){var l,t,a,i,o,c,d,s,u;return n().w(function(e){for(;;)switch(e.n){case 0:if("infiniteScroll"===r.loadMode){e.n=1;break}return e.a(2);case 1:if(null!==(l=r.pagination)&&void 0!==l&&l.hasNext){e.n=2;break}return e.a(2);case 2:if(!r.loading){e.n=3;break}return e.a(2);case 3:return d=null!==(t=null===(a=r.pagination)||void 0===a?void 0:a.page)&&void 0!==t?t:0,s=null!==(i=null===(o=r.pagination)||void 0===o?void 0:o.pageSize)&&void 0!==i?i:20,u=d+1,e.n=4,null===(c=r.onPageChange)||void 0===c?void 0:c.call(r,u,s);case 4:return e.a(2)}},e)})),[r.loadMode,null===(a=r.pagination)||void 0===a?void 0:a.hasNext,null===(o=r.pagination)||void 0===o?void 0:o.page,null===(c=r.pagination)||void 0===c?void 0:c.pageSize,r.loading,r.onPageChange]);return t(e,{value:r.value,columns:r.columns,density:r.density,spacing:r.spacing,renderStrategy:r.renderStrategy,normalOptions:r.normalOptions,virtualizedOptions:r.virtualizedOptions,onNearEnd:"infiniteScroll"===r.loadMode?d:void 0,selectable:r.selectable,selectedIds:r.selectedIds,onSelectionChange:r.onSelectionChange,scrollResetToken:r.scrollResetToken})}}export{R as createViewList,z as createViewListLoading,R as default};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data-surface/view-list/index.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Checkbox, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'\r\nimport { useListSelection, useMergedConfig } from './hooks'\r\nimport { ViewListStyled, viewListClasses as classes } from './styled'\r\nimport { LIST_HEADER_HEIGHT, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n const isClient = props.featureMode === 'client'\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0 && measured !== headerHeight) {\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length, headerHeight])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const rowStride = rowHeight + rowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n const end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, rowHeight, rowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, rowHeight, rowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n 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","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","isAutoHeight","normalOptions","autoHeight","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","scrollContainerRef","useRef","useEffect","featureMode","undefined","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","style","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","length","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","floor","visibleCount","ceil","min","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_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, mapSxTableCell, resolveListSpacerHeight } from './helpers'\r\n// types\r\nimport type { TableContainerProps } from '@mui/material'\r\nimport type { ComponentType, FC, ReactNode } from 'react'\r\nimport type { LoadingModeRule, TPagination } from '../types'\r\nimport type { IListCellParams, IViewListConfig, IViewListProps, TListColumn } from './types'\r\n\r\nexport * from './types'\r\n\r\n//#region Helpers\r\nfunction renderCellValue<T>(column: TListColumn<T>, row: T, index: number): ReactNode {\r\n const currentValue = (row as any)[column.field]\r\n const value = column.valueGetter ? column.valueGetter(currentValue, row, index) : currentValue\r\n const params: IListCellParams<T> = { value, row, index, field: column.field }\r\n if (column.renderCell) return column.renderCell(params)\r\n const valueLabel = String(value ?? '')\r\n return (\r\n <Typography variant='body2' noWrap title={valueLabel}>\r\n {valueLabel}\r\n </Typography>\r\n )\r\n}\r\n\r\n//#endregion\r\n//#region Normal List\r\nfunction createViewListNormal<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const { normalOptions } = mergedConfig\r\n const isAutoHeight = normalOptions.autoHeight == true\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n const scrollContainerRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n const isClient = props.featureMode === 'client'\r\n if (!isClient || isAutoHeight || props.scrollResetToken === undefined) return\r\n if (scrollContainerRef.current) scrollContainerRef.current.scrollTop = 0\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n if (isAutoHeight) return\r\n const t = e.currentTarget\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const rootClasses = useMemo(() => {\r\n const l = [classes.root, classes.normal]\r\n if (isAutoHeight) l.push(classes.autoHeight)\r\n return l.join(' ')\r\n }, [isAutoHeight])\r\n\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={scrollContainerRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.value.map((row, index) => {\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListNormal\r\n}\r\n//#endregion\r\n//#region Virtualized List\r\nfunction createViewListVirtualized<T>(config: IViewListConfig<T>) {\r\n const ViewListVirtualized: FC<IViewListProps<T>> = (props) => {\r\n const mergedConfig = useMergedConfig(config, props)\r\n const totalFlex = mergedConfig.columns.reduce((sum, col) => sum + (col.flex && col.flex > 0 ? col.flex : 0), 0)\r\n\r\n const onSelectionChange = props.onSelectionChange\r\n\r\n // Use selection hook to manage checkbox state and handlers\r\n const selection = useListSelection(props.value, config.getterId, mergedConfig.selectable, props.selectedIds, onSelectionChange)\r\n const { selectedIds, isAllSelected, isSomeSelected, handleToggleAll, handleToggleRow } = selection\r\n\r\n const wrapRef = useRef<HTMLDivElement | null>(null)\r\n const headerRowRef = useRef<HTMLTableRowElement | null>(null)\r\n const hasHeaderMeasuredRef = useRef(false)\r\n const [containerHeight, setContainerHeight] = useState(0)\r\n const [scrollTopState, setScrollTopState] = useState(0)\r\n const [headerHeight, setHeaderHeight] = useState(LIST_HEADER_HEIGHT)\r\n\r\n const overscan = Math.max(1, mergedConfig.virtualizedOptions.overscan)\r\n\r\n // Reset scroll to top when token changes (client-side filter reset)\r\n useEffect(() => {\r\n if (props.featureMode !== 'client' || props.scrollResetToken === undefined) return\r\n if (wrapRef.current) wrapRef.current.scrollTop = 0\r\n setScrollTopState(0)\r\n }, [props.featureMode, props.scrollResetToken])\r\n\r\n const handleScroll: TableContainerProps['onScroll'] = (e) => {\r\n const t = e.currentTarget\r\n setScrollTopState(t.scrollTop)\r\n if (t.scrollHeight - t.scrollTop - t.clientHeight <= mergedConfig.nearEndThreshold) {\r\n props.onNearEnd?.()\r\n }\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!wrapRef.current) return\r\n\r\n const updateSize = () => {\r\n const nextHeight = wrapRef.current?.clientHeight ?? 0\r\n setContainerHeight((prev) => (prev === nextHeight ? prev : nextHeight))\r\n }\r\n\r\n updateSize()\r\n\r\n const observer = new ResizeObserver(() => updateSize())\r\n observer.observe(wrapRef.current)\r\n return () => observer.disconnect()\r\n }, [])\r\n\r\n useLayoutEffect(() => {\r\n hasHeaderMeasuredRef.current = false\r\n }, [mergedConfig.columns.length])\r\n\r\n useLayoutEffect(() => {\r\n if (hasHeaderMeasuredRef.current) return\r\n const measured = headerRowRef.current?.offsetHeight ?? 0\r\n if (measured > 0) {\r\n hasHeaderMeasuredRef.current = true\r\n setHeaderHeight(measured)\r\n }\r\n }, [mergedConfig.columns.length])\r\n\r\n const windowed = useMemo(() => {\r\n const totalItems = props.value.length\r\n if (totalItems === 0) {\r\n return { start: 0, end: -1, topSpacerHeight: 0, bottomSpacerHeight: 0 }\r\n }\r\n const { rowHeight, rowSpacing } = mergedConfig\r\n const rowStride = rowHeight + rowSpacing\r\n const effectiveScrollTop = scrollTopState\r\n const safeViewportHeight = Math.max(1, containerHeight - headerHeight)\r\n const adjustedScrollTop = Math.max(0, effectiveScrollTop - headerHeight)\r\n const start = Math.max(0, Math.floor(adjustedScrollTop / rowStride) - overscan)\r\n const visibleCount = Math.ceil(safeViewportHeight / rowStride)\r\n const end = Math.min(totalItems - 1, start + visibleCount + overscan * 2)\r\n\r\n const topSpacerHeight = resolveListSpacerHeight(start, rowHeight, rowSpacing)\r\n const bottomSpacerHeight = resolveListSpacerHeight(totalItems - end - 1, rowHeight, rowSpacing)\r\n\r\n return { start, end, topSpacerHeight, bottomSpacerHeight }\r\n }, [props.value.length, headerHeight, overscan, mergedConfig, scrollTopState, containerHeight])\r\n\r\n const rowsToRender = windowed.end >= windowed.start ? props.value.slice(windowed.start, windowed.end + 1) : []\r\n const rootClasses = [classes.root, classes.virtualized].filter(Boolean).join(' ')\r\n return (\r\n <ViewListStyled className={rootClasses} style={mergedConfig.rootStyle}>\r\n <TableContainer ref={wrapRef} className={classes.scrollContainer} onScroll={handleScroll}>\r\n <Table size='small' className={classes.table}>\r\n <TableHead className={classes.tableHeader}>\r\n <TableRow ref={headerRowRef}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableHeaderCell} sx={{ width: 48 }}>\r\n <Checkbox checked={isAllSelected} indeterminate={isSomeSelected} onChange={handleToggleAll} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell key={String(col.field)} className={classes.tableHeaderCell} align={col.align} sx={mapSxTableCell(col, totalFlex)}>\r\n {col.label ?? String(col.field)}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {windowed.topSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.topSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n\r\n {rowsToRender.map((row, offset) => {\r\n const index = windowed.start + offset\r\n const rowKey = config.getterId(row, index) ?? index\r\n const isSelected = selectedIds.includes(rowKey)\r\n const { rowHeight, cellPadding } = mergedConfig\r\n return (\r\n <TableRow key={rowKey} hover sx={{ height: rowHeight }} selected={isSelected}>\r\n {mergedConfig.selectable && (\r\n <TableCell padding='checkbox' className={classes.tableBodyCell} sx={{ height: rowHeight, padding: cellPadding }}>\r\n <Checkbox checked={isSelected} onChange={() => handleToggleRow(rowKey)} />\r\n </TableCell>\r\n )}\r\n {mergedConfig.columns.map((col) => (\r\n <TableCell\r\n key={`${String(rowKey)}-${String(col.field)}`}\r\n className={classes.tableBodyCell}\r\n align={col.align}\r\n sx={mapSxTableCell(col, totalFlex, { height: rowHeight, padding: cellPadding })}\r\n >\r\n <Box className={classes.tableCellContent}>{renderCellValue(col, row, index)}</Box>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )\r\n })}\r\n\r\n {windowed.bottomSpacerHeight > 0 ? (\r\n <TableRow className={classes.tableSpacerRow}>\r\n <TableCell\r\n colSpan={mergedConfig.columns.length + (mergedConfig.selectable ? 1 : 0)}\r\n className={classes.tableSpacerCell}\r\n sx={{ height: windowed.bottomSpacerHeight, padding: 0, border: 0 }}\r\n />\r\n </TableRow>\r\n ) : null}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </ViewListStyled>\r\n )\r\n }\r\n return ViewListVirtualized\r\n}\r\n//#endregion\r\n//#region Main\r\nexport function createViewList<T>(config: IViewListConfig<T>) {\r\n const ViewListNormal = createViewListNormal<T>(config)\r\n const ViewListVirtualized = createViewListVirtualized<T>(config)\r\n\r\n const ViewList: FC<IViewListProps<T>> = (props) => {\r\n const renderStrategy = props.renderStrategy ?? config.renderStrategy ?? 'normal'\r\n if (renderStrategy === 'virtualized') {\r\n return <ViewListVirtualized {...props} />\r\n }\r\n return <ViewListNormal {...props} />\r\n }\r\n return ViewList\r\n}\r\n\r\nexport interface IViewListLoadingProps<T> extends IViewListProps<T> {\r\n loadMode: LoadingModeRule\r\n loading?: boolean\r\n pagination?: TPagination\r\n onPageChange?: (page: number, pageSize: number) => void | Promise<void>\r\n}\r\n\r\nexport function createViewListLoading<T>(ListComponent: ComponentType<IViewListProps<T>>) {\r\n const ViewListLoading: FC<IViewListLoadingProps<T>> = (props) => {\r\n const handleNearEnd = useCallback(async () => {\r\n if (props.loadMode !== 'infiniteScroll') return\r\n if (!props.pagination?.hasNext) return\r\n if (props.loading) return\r\n\r\n const currentPage = props.pagination?.page ?? 0\r\n const currentPageSize = props.pagination?.pageSize ?? 20\r\n const nextPage = currentPage + 1\r\n await props.onPageChange?.(nextPage, currentPageSize)\r\n }, [props.loadMode, props.pagination?.hasNext, props.pagination?.page, props.pagination?.pageSize, props.loading, props.onPageChange])\r\n\r\n return (\r\n <ListComponent\r\n value={props.value}\r\n columns={props.columns}\r\n density={props.density}\r\n spacing={props.spacing}\r\n renderStrategy={props.renderStrategy}\r\n 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","createViewList","config","ViewListNormal","props","mergedConfig","useMergedConfig","isAutoHeight","normalOptions","autoHeight","totalFlex","columns","reduce","sum","col","flex","onSelectionChange","scrollContainerRef","useRef","useEffect","featureMode","undefined","scrollResetToken","current","scrollTop","selection","useListSelection","getterId","selectable","selectedIds","isAllSelected","isSomeSelected","handleToggleAll","handleToggleRow","rootClasses","useMemo","l","classes","root","normal","push","join","ViewListStyled","className","style","rootStyle","children","TableContainer","ref","scrollContainer","onScroll","e","_props$onNearEnd","t","currentTarget","scrollHeight","clientHeight","nearEndThreshold","onNearEnd","call","_jsxs","Table","size","table","TableHead","tableHeader","TableRow","TableCell","padding","tableHeaderCell","sx","width","Checkbox","checked","indeterminate","onChange","map","_col$label","align","mapSxTableCell","label","TableBody","_config$getterId","rowKey","isSelected","includes","rowHeight","cellPadding","hover","height","selected","tableBodyCell","Box","tableCellContent","concat","createViewListNormal","ViewListVirtualized","wrapRef","headerRowRef","hasHeaderMeasuredRef","_useState","useState","_useState2","_slicedToArray","containerHeight","setContainerHeight","_useState3","_useState4","scrollTopState","setScrollTopState","_useState5","LIST_HEADER_HEIGHT","_useState6","headerHeight","setHeaderHeight","overscan","Math","max","virtualizedOptions","useLayoutEffect","updateSize","_wrapRef$current$clie","_wrapRef$current","nextHeight","prev","observer","ResizeObserver","observe","disconnect","length","_headerRowRef$current","_headerRowRef$current2","measured","offsetHeight","windowed","totalItems","start","end","topSpacerHeight","bottomSpacerHeight","rowSpacing","rowStride","effectiveScrollTop","safeViewportHeight","adjustedScrollTop","floor","visibleCount","ceil","min","resolveListSpacerHeight","rowsToRender","slice","virtualized","filter","Boolean","_props$onNearEnd2","_col$label2","tableSpacerRow","colSpan","tableSpacerCell","border","offset","_config$getterId2","createViewListVirtualized","_ref","_props$renderStrategy","renderStrategy","_objectSpread","createViewListLoading","ListComponent","_props$pagination4","_props$pagination5","_props$pagination6","handleNearEnd","useCallback","_asyncToGenerator","_regenerator","m","_callee","_props$pagination","_props$pagination$pag","_props$pagination2","_props$pagination$pag2","_props$pagination3","_props$onPageChange","currentPage","currentPageSize","nextPage","w","_context","n","loadMode","a","pagination","hasNext","loading","page","pageSize","onPageChange","density","spacing"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{styled as t,Box as o,alpha as a}from"@mui/material";var i="--DinoViewList-rowSpacing",r={root:"DinoViewList-root",normal:"DinoViewList-normal",virtualized:"DinoViewList-virtualized",autoHeight:"DinoViewList-autoHeight",scrollContainer:"DinoViewList-scrollContainer",table:"DinoViewList-table",tableHeader:"DinoViewList-tableHeader",tableHeaderCell:"DinoViewList-tableHeaderCell",tableBodyCell:"DinoViewList-tableBodyCell",tableSpacerRow:"DinoViewList-tableSpacerRow",tableSpacerCell:"DinoViewList-tableSpacerCell",tableCellContent:"DinoViewList-tableCellContent"},l=r,n=t(o)(function(t){var o=t.theme,r=o.palette.mode,n=a(o.palette.common.black,"dark"===r?.24:.08),c="dark"===r?o.palette.grey[800]:o.palette.grey[50];return e(e(e(e(e(e(e(e(e({},"&.".concat(l.root),{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),".".concat(l.scrollContainer),{position:"absolute",inset:0,overflowY:"auto",padding:o.spacing(0,.5),margin:o.spacing(0,-.5),"&::-webkit-scrollbar":{width:8,height:8},"&::-webkit-scrollbar-thumb":{backgroundColor:o.palette.grey[300],borderRadius:4},"&::-webkit-scrollbar-thumb:hover":{backgroundColor:o.palette.grey[500]}}),".".concat(l.table),{tableLayout:"auto",width:"100%",borderCollapse:"separate",borderSpacing:"0 var(".concat(i,", ").concat(o.spacing(.5),")"),marginTop:"calc(var(".concat(i,", ").concat(o.spacing(.5),") * -1)")}),".".concat(l.tableHeader),{position:"sticky",top:0,zIndex:2,backgroundColor:c}),".".concat(l.tableHeaderCell),{fontWeight:500,paddingTop:o.spacing(1.5),paddingBottom:o.spacing(1.5),overflow:"hidden",borderBottom:"unset"}),".".concat(l.tableBodyCell),{overflow:"hidden",borderTop:"0.5px dashed ".concat(n),borderBottom:"0.5px dashed ".concat(n),"&:first-of-type":{borderLeft:"0.5px dashed ".concat(n),borderRadius:o.spacing(.5,0,0,.5)},"&:last-of-type":{borderRight:"0.5px dashed ".concat(n),borderRadius:o.spacing(0,.5,.5,0)}}),".".concat(l.tableCellContent),{minWidth:0,width:"100%"}),"&.".concat(l.virtualized),{boxSizing:"border-box"}),"&.".concat(l.normal,".").concat(l.autoHeight),e({height:"auto",overflow:"visible"},".".concat(l.scrollContainer),{position:"static",inset:"auto",overflowY:"visible"}))});export{i as VIEW_LIST_ROW_SPACING_VAR,n as ViewListStyled,r as viewListClasses};
1
+ import{defineProperty as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{styled as t,Box as o,alpha as a}from"@mui/material";var i="--DinoViewList-rowSpacing",r={root:"DinoViewList-root",normal:"DinoViewList-normal",virtualized:"DinoViewList-virtualized",autoHeight:"DinoViewList-autoHeight",scrollContainer:"DinoViewList-scrollContainer",table:"DinoViewList-table",tableHeader:"DinoViewList-tableHeader",tableHeaderCell:"DinoViewList-tableHeaderCell",tableBodyCell:"DinoViewList-tableBodyCell",tableSpacerRow:"DinoViewList-tableSpacerRow",tableSpacerCell:"DinoViewList-tableSpacerCell",tableCellContent:"DinoViewList-tableCellContent"},l=r,n=t(o)(function(t){var o=t.theme,r=o.palette.mode,n=a(o.palette.common.black,"dark"===r?.24:.08),c="dark"===r?o.palette.grey[800]:o.palette.grey[50];return e(e(e(e(e(e(e(e(e({},"&.".concat(l.root),{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),".".concat(l.scrollContainer),{position:"absolute",inset:0,overflowY:"auto",padding:o.spacing(0,.5),margin:o.spacing(0,-.5),"&::-webkit-scrollbar":{width:6,height:6},"&::-webkit-scrollbar-thumb":{backgroundColor:o.palette.grey[400]},"&::-webkit-scrollbar-thumb:hover":{backgroundColor:o.palette.grey[600]},"&::-webkit-scrollbar-track":{backgroundColor:o.palette.grey[200],borderRadius:4},"&::-webkit-scrollbar-track:hover":{backgroundColor:o.palette.grey[300]}}),".".concat(l.table),{tableLayout:"auto",width:"100%",borderCollapse:"separate",borderSpacing:"0 var(".concat(i,", ").concat(o.spacing(.5),")"),marginTop:"calc(var(".concat(i,", ").concat(o.spacing(.5),") * -1)")}),".".concat(l.tableHeader),{position:"sticky",top:0,zIndex:2,backgroundColor:c}),".".concat(l.tableHeaderCell),{fontWeight:500,paddingTop:o.spacing(1.5),paddingBottom:o.spacing(1.5),overflow:"hidden",borderBottom:"unset"}),".".concat(l.tableBodyCell),{overflow:"hidden",borderTop:"0.5px dashed ".concat(n),borderBottom:"0.5px dashed ".concat(n),"&:first-of-type":{borderLeft:"0.5px dashed ".concat(n),borderRadius:o.spacing(.5,0,0,.5)},"&:last-of-type":{borderRight:"0.5px dashed ".concat(n),borderRadius:o.spacing(0,.5,.5,0)}}),".".concat(l.tableCellContent),{minWidth:0,width:"100%"}),"&.".concat(l.virtualized),{boxSizing:"border-box"}),"&.".concat(l.normal,".").concat(l.autoHeight),e({height:"auto",overflow:"visible"},".".concat(l.scrollContainer),{position:"static",inset:"auto",overflowY:"visible"}))});export{i as VIEW_LIST_ROW_SPACING_VAR,n as ViewListStyled,r as viewListClasses};
2
2
  //# sourceMappingURL=styled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styled.js","sources":["../../../../src/data-surface/view-list/styled.tsx"],"sourcesContent":["import { alpha, Box, styled } from '@mui/material'\r\n\r\nexport const VIEW_LIST_ROW_SPACING_VAR = '--DinoViewList-rowSpacing'\r\n\r\nexport const viewListClasses = {\r\n root: 'DinoViewList-root',\r\n normal: 'DinoViewList-normal',\r\n virtualized: 'DinoViewList-virtualized',\r\n autoHeight: 'DinoViewList-autoHeight',\r\n scrollContainer: 'DinoViewList-scrollContainer',\r\n table: 'DinoViewList-table',\r\n tableHeader: 'DinoViewList-tableHeader',\r\n tableHeaderCell: 'DinoViewList-tableHeaderCell',\r\n tableBodyCell: 'DinoViewList-tableBodyCell',\r\n tableSpacerRow: 'DinoViewList-tableSpacerRow',\r\n tableSpacerCell: 'DinoViewList-tableSpacerCell',\r\n tableCellContent: 'DinoViewList-tableCellContent'\r\n}\r\nconst classes = viewListClasses\r\n\r\nexport const ViewListStyled = styled(Box)(({ theme }) => {\r\n const mode = theme.palette.mode\r\n const borderColor = alpha(theme.palette.common.black, mode === 'dark' ? 0.24 : 0.08)\r\n const bgHeader = mode === 'dark' ? theme.palette.grey[800] : theme.palette.grey[50]\r\n\r\n return {\r\n [`&.${classes.root}`]: {\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden'\r\n },\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n overflowY: 'auto',\r\n padding: theme.spacing(0, 0.5),\r\n margin: theme.spacing(0, -0.5),\r\n // Scrollbar styling\r\n '&::-webkit-scrollbar': { width: 8, height: 8 },\r\n '&::-webkit-scrollbar-thumb': { backgroundColor: theme.palette.grey[300], borderRadius: 4 },\r\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: theme.palette.grey[500] }\r\n },\r\n [`.${classes.table}`]: {\r\n tableLayout: 'auto',\r\n width: '100%',\r\n borderCollapse: 'separate',\r\n borderSpacing: `0 var(${VIEW_LIST_ROW_SPACING_VAR}, ${theme.spacing(0.5)})`,\r\n marginTop: `calc(var(${VIEW_LIST_ROW_SPACING_VAR}, ${theme.spacing(0.5)}) * -1)`\r\n },\r\n [`.${classes.tableHeader}`]: {\r\n position: 'sticky',\r\n top: 0,\r\n zIndex: 2,\r\n backgroundColor: bgHeader\r\n },\r\n [`.${classes.tableHeaderCell}`]: {\r\n fontWeight: 500,\r\n paddingTop: theme.spacing(1.5),\r\n paddingBottom: theme.spacing(1.5),\r\n overflow: 'hidden',\r\n borderBottom: 'unset'\r\n // borderTop: `1px dashed ${borderColor}`,\r\n // borderBottom: `1px dashed ${borderColor}`,\r\n // '&:first-of-type': { borderLeft: `1px dashed ${borderColor}` },\r\n // '&:last-of-type': { borderRight: `1px dashed ${borderColor}` }\r\n },\r\n [`.${classes.tableBodyCell}`]: {\r\n overflow: 'hidden',\r\n borderTop: `0.5px dashed ${borderColor}`,\r\n borderBottom: `0.5px dashed ${borderColor}`,\r\n '&:first-of-type': {\r\n borderLeft: `0.5px dashed ${borderColor}`,\r\n borderRadius: theme.spacing(0.5, 0, 0, 0.5)\r\n },\r\n '&:last-of-type': {\r\n borderRight: `0.5px dashed ${borderColor}`,\r\n borderRadius: theme.spacing(0, 0.5, 0.5, 0)\r\n }\r\n },\r\n [`.${classes.tableCellContent}`]: {\r\n minWidth: 0, // Allow shrinking below content size\r\n width: '100%' // Fill parent TableCell\r\n },\r\n // Virtualized styles\r\n [`&.${classes.virtualized}`]: {\r\n boxSizing: 'border-box'\r\n },\r\n // Auto-height variant: disable the internal scroll container and let the\r\n // component size expand with content. This makes the table render all\r\n // rows and removes the internal scrollbar used in 'normal' modes.\r\n [`&.${classes.normal}.${classes.autoHeight}`]: {\r\n height: 'auto',\r\n overflow: 'visible',\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'static',\r\n inset: 'auto',\r\n overflowY: 'visible'\r\n }\r\n }\r\n }\r\n})\r\n"],"names":["VIEW_LIST_ROW_SPACING_VAR","viewListClasses","root","normal","virtualized","autoHeight","scrollContainer","table","tableHeader","tableHeaderCell","tableBodyCell","tableSpacerRow","tableSpacerCell","tableCellContent","classes","ViewListStyled","styled","Box","_ref","theme","mode","palette","borderColor","alpha","common","black","bgHeader","grey","_defineProperty","concat","position","width","height","overflow","inset","overflowY","padding","spacing","margin","backgroundColor","borderRadius","tableLayout","borderCollapse","borderSpacing","marginTop","top","zIndex","fontWeight","paddingTop","paddingBottom","borderBottom","borderTop","borderLeft","borderRight","minWidth","boxSizing"],"mappings":"2IAEO,IAAMA,EAA4B,4BAE5BC,EAAkB,CAC7BC,KAAM,oBACNC,OAAQ,sBACRC,YAAa,2BACbC,WAAY,0BACZC,gBAAiB,+BACjBC,MAAO,qBACPC,YAAa,2BACbC,gBAAiB,+BACjBC,cAAe,6BACfC,eAAgB,8BAChBC,gBAAiB,+BACjBC,iBAAkB,iCAEdC,EAAUb,EAEHc,EAAiBC,EAAOC,EAAPD,CAAY,SAAAE,GAAc,IAAXC,EAAKD,EAALC,MACrCC,EAAOD,EAAME,QAAQD,KACrBE,EAAcC,EAAMJ,EAAME,QAAQG,OAAOC,MAAgB,SAATL,EAAkB,IAAO,KACzEM,EAAoB,SAATN,EAAkBD,EAAME,QAAQM,KAAK,KAAOR,EAAME,QAAQM,KAAK,IAEhF,OAAAC,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAA,CAAA,EAAA,KAAAC,OACQf,EAAQZ,MAAS,CACrB4B,SAAU,WACVC,MAAO,OACPC,OAAQ,OACRC,SAAU,eACXJ,OACIf,EAAQR,iBAAoB,CAC/BwB,SAAU,WACVI,MAAO,EACPC,UAAW,OACXC,QAASjB,EAAMkB,QAAQ,EAAG,IAC1BC,OAAQnB,EAAMkB,QAAQ,GAAG,IAEzB,uBAAwB,CAAEN,MAAO,EAAGC,OAAQ,GAC5C,6BAA8B,CAAEO,gBAAiBpB,EAAME,QAAQM,KAAK,KAAMa,aAAc,GACxF,mCAAoC,CAAED,gBAAiBpB,EAAME,QAAQM,KAAK,YAC3EE,OACIf,EAAQP,OAAU,CACrBkC,YAAa,OACbV,MAAO,OACPW,eAAgB,WAChBC,cAAad,SAAAA,OAAW7B,EAAyB6B,MAAAA,OAAKV,EAAMkB,QAAQ,IAAO,KAC3EO,UAASf,YAAAA,OAAc7B,EAAyB6B,MAAAA,OAAKV,EAAMkB,QAAQ,IAAI,iBACxER,OACIf,EAAQN,aAAgB,CAC3BsB,SAAU,SACVe,IAAK,EACLC,OAAQ,EACRP,gBAAiBb,QAClBG,OACIf,EAAQL,iBAAoB,CAC/BsC,WAAY,IACZC,WAAY7B,EAAMkB,QAAQ,KAC1BY,cAAe9B,EAAMkB,QAAQ,KAC7BJ,SAAU,SACViB,aAAc,cAKfrB,OACIf,EAAQJ,eAAkB,CAC7BuB,SAAU,SACVkB,UAAStB,gBAAAA,OAAkBP,GAC3B4B,aAAYrB,gBAAAA,OAAkBP,GAC9B,kBAAmB,CACjB8B,WAAUvB,gBAAAA,OAAkBP,GAC5BkB,aAAcrB,EAAMkB,QAAQ,GAAK,EAAG,EAAG,KAEzC,iBAAkB,CAChBgB,YAAWxB,gBAAAA,OAAkBP,GAC7BkB,aAAcrB,EAAMkB,QAAQ,EAAG,GAAK,GAAK,UAE5CR,OACIf,EAAQD,kBAAqB,CAChCyC,SAAU,EACVvB,MAAO,cACRF,OAEKf,EAAQV,aAAgB,CAC5BmD,UAAW,eACZ1B,KAAAA,OAIKf,EAAQX,OAAM0B,KAAAA,OAAIf,EAAQT,YAAUuB,EAAA,CACxCI,OAAQ,OACRC,SAAU,WAAS,IAAAJ,OACdf,EAAQR,iBAAoB,CAC/BwB,SAAU,SACVI,MAAO,OACPC,UAAW,YAInB"}
1
+ {"version":3,"file":"styled.js","sources":["../../../../src/data-surface/view-list/styled.tsx"],"sourcesContent":["import { alpha, Box, styled } from '@mui/material'\r\n\r\nexport const VIEW_LIST_ROW_SPACING_VAR = '--DinoViewList-rowSpacing'\r\n\r\nexport const viewListClasses = {\r\n root: 'DinoViewList-root',\r\n normal: 'DinoViewList-normal',\r\n virtualized: 'DinoViewList-virtualized',\r\n autoHeight: 'DinoViewList-autoHeight',\r\n scrollContainer: 'DinoViewList-scrollContainer',\r\n table: 'DinoViewList-table',\r\n tableHeader: 'DinoViewList-tableHeader',\r\n tableHeaderCell: 'DinoViewList-tableHeaderCell',\r\n tableBodyCell: 'DinoViewList-tableBodyCell',\r\n tableSpacerRow: 'DinoViewList-tableSpacerRow',\r\n tableSpacerCell: 'DinoViewList-tableSpacerCell',\r\n tableCellContent: 'DinoViewList-tableCellContent'\r\n}\r\nconst classes = viewListClasses\r\n\r\nexport const ViewListStyled = styled(Box)(({ theme }) => {\r\n const mode = theme.palette.mode\r\n const borderColor = alpha(theme.palette.common.black, mode === 'dark' ? 0.24 : 0.08)\r\n const bgHeader = mode === 'dark' ? theme.palette.grey[800] : theme.palette.grey[50]\r\n\r\n return {\r\n [`&.${classes.root}`]: {\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden'\r\n },\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n overflowY: 'auto',\r\n padding: theme.spacing(0, 0.5),\r\n margin: theme.spacing(0, -0.5),\r\n // Scrollbar styling\r\n '&::-webkit-scrollbar': { width: 6, height: 6 },\r\n '&::-webkit-scrollbar-thumb': { backgroundColor: theme.palette.grey[400] },\r\n '&::-webkit-scrollbar-thumb:hover': { backgroundColor: theme.palette.grey[600] },\r\n '&::-webkit-scrollbar-track': { backgroundColor: theme.palette.grey[200], borderRadius: 4 },\r\n '&::-webkit-scrollbar-track:hover': { backgroundColor: theme.palette.grey[300] }\r\n },\r\n [`.${classes.table}`]: {\r\n tableLayout: 'auto',\r\n width: '100%',\r\n borderCollapse: 'separate',\r\n borderSpacing: `0 var(${VIEW_LIST_ROW_SPACING_VAR}, ${theme.spacing(0.5)})`,\r\n marginTop: `calc(var(${VIEW_LIST_ROW_SPACING_VAR}, ${theme.spacing(0.5)}) * -1)`\r\n },\r\n [`.${classes.tableHeader}`]: {\r\n position: 'sticky',\r\n top: 0,\r\n zIndex: 2,\r\n backgroundColor: bgHeader\r\n },\r\n [`.${classes.tableHeaderCell}`]: {\r\n fontWeight: 500,\r\n paddingTop: theme.spacing(1.5),\r\n paddingBottom: theme.spacing(1.5),\r\n overflow: 'hidden',\r\n borderBottom: 'unset'\r\n // borderTop: `1px dashed ${borderColor}`,\r\n // borderBottom: `1px dashed ${borderColor}`,\r\n // '&:first-of-type': { borderLeft: `1px dashed ${borderColor}` },\r\n // '&:last-of-type': { borderRight: `1px dashed ${borderColor}` }\r\n },\r\n [`.${classes.tableBodyCell}`]: {\r\n overflow: 'hidden',\r\n borderTop: `0.5px dashed ${borderColor}`,\r\n borderBottom: `0.5px dashed ${borderColor}`,\r\n '&:first-of-type': {\r\n borderLeft: `0.5px dashed ${borderColor}`,\r\n borderRadius: theme.spacing(0.5, 0, 0, 0.5)\r\n },\r\n '&:last-of-type': {\r\n borderRight: `0.5px dashed ${borderColor}`,\r\n borderRadius: theme.spacing(0, 0.5, 0.5, 0)\r\n }\r\n },\r\n [`.${classes.tableCellContent}`]: {\r\n minWidth: 0, // Allow shrinking below content size\r\n width: '100%' // Fill parent TableCell\r\n },\r\n // Virtualized styles\r\n [`&.${classes.virtualized}`]: {\r\n boxSizing: 'border-box'\r\n },\r\n // Auto-height variant: disable the internal scroll container and let the\r\n // component size expand with content. This makes the table render all\r\n // rows and removes the internal scrollbar used in 'normal' modes.\r\n [`&.${classes.normal}.${classes.autoHeight}`]: {\r\n height: 'auto',\r\n overflow: 'visible',\r\n [`.${classes.scrollContainer}`]: {\r\n position: 'static',\r\n inset: 'auto',\r\n overflowY: 'visible'\r\n }\r\n }\r\n }\r\n})\r\n"],"names":["VIEW_LIST_ROW_SPACING_VAR","viewListClasses","root","normal","virtualized","autoHeight","scrollContainer","table","tableHeader","tableHeaderCell","tableBodyCell","tableSpacerRow","tableSpacerCell","tableCellContent","classes","ViewListStyled","styled","Box","_ref","theme","mode","palette","borderColor","alpha","common","black","bgHeader","grey","_defineProperty","concat","position","width","height","overflow","inset","overflowY","padding","spacing","margin","backgroundColor","borderRadius","tableLayout","borderCollapse","borderSpacing","marginTop","top","zIndex","fontWeight","paddingTop","paddingBottom","borderBottom","borderTop","borderLeft","borderRight","minWidth","boxSizing"],"mappings":"2IAEO,IAAMA,EAA4B,4BAE5BC,EAAkB,CAC7BC,KAAM,oBACNC,OAAQ,sBACRC,YAAa,2BACbC,WAAY,0BACZC,gBAAiB,+BACjBC,MAAO,qBACPC,YAAa,2BACbC,gBAAiB,+BACjBC,cAAe,6BACfC,eAAgB,8BAChBC,gBAAiB,+BACjBC,iBAAkB,iCAEdC,EAAUb,EAEHc,EAAiBC,EAAOC,EAAPD,CAAY,SAAAE,GAAc,IAAXC,EAAKD,EAALC,MACrCC,EAAOD,EAAME,QAAQD,KACrBE,EAAcC,EAAMJ,EAAME,QAAQG,OAAOC,MAAgB,SAATL,EAAkB,IAAO,KACzEM,EAAoB,SAATN,EAAkBD,EAAME,QAAQM,KAAK,KAAOR,EAAME,QAAQM,KAAK,IAEhF,OAAAC,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAA,CAAA,EAAA,KAAAC,OACQf,EAAQZ,MAAS,CACrB4B,SAAU,WACVC,MAAO,OACPC,OAAQ,OACRC,SAAU,eACXJ,OACIf,EAAQR,iBAAoB,CAC/BwB,SAAU,WACVI,MAAO,EACPC,UAAW,OACXC,QAASjB,EAAMkB,QAAQ,EAAG,IAC1BC,OAAQnB,EAAMkB,QAAQ,GAAG,IAEzB,uBAAwB,CAAEN,MAAO,EAAGC,OAAQ,GAC5C,6BAA8B,CAAEO,gBAAiBpB,EAAME,QAAQM,KAAK,MACpE,mCAAoC,CAAEY,gBAAiBpB,EAAME,QAAQM,KAAK,MAC1E,6BAA8B,CAAEY,gBAAiBpB,EAAME,QAAQM,KAAK,KAAMa,aAAc,GACxF,mCAAoC,CAAED,gBAAiBpB,EAAME,QAAQM,KAAK,YAC3EE,OACIf,EAAQP,OAAU,CACrBkC,YAAa,OACbV,MAAO,OACPW,eAAgB,WAChBC,cAAad,SAAAA,OAAW7B,EAAyB6B,MAAAA,OAAKV,EAAMkB,QAAQ,IAAO,KAC3EO,UAASf,YAAAA,OAAc7B,EAAyB6B,MAAAA,OAAKV,EAAMkB,QAAQ,IAAI,iBACxER,OACIf,EAAQN,aAAgB,CAC3BsB,SAAU,SACVe,IAAK,EACLC,OAAQ,EACRP,gBAAiBb,QAClBG,OACIf,EAAQL,iBAAoB,CAC/BsC,WAAY,IACZC,WAAY7B,EAAMkB,QAAQ,KAC1BY,cAAe9B,EAAMkB,QAAQ,KAC7BJ,SAAU,SACViB,aAAc,cAKfrB,OACIf,EAAQJ,eAAkB,CAC7BuB,SAAU,SACVkB,UAAStB,gBAAAA,OAAkBP,GAC3B4B,aAAYrB,gBAAAA,OAAkBP,GAC9B,kBAAmB,CACjB8B,WAAUvB,gBAAAA,OAAkBP,GAC5BkB,aAAcrB,EAAMkB,QAAQ,GAAK,EAAG,EAAG,KAEzC,iBAAkB,CAChBgB,YAAWxB,gBAAAA,OAAkBP,GAC7BkB,aAAcrB,EAAMkB,QAAQ,EAAG,GAAK,GAAK,UAE5CR,OACIf,EAAQD,kBAAqB,CAChCyC,SAAU,EACVvB,MAAO,cACRF,OAEKf,EAAQV,aAAgB,CAC5BmD,UAAW,eACZ1B,KAAAA,OAIKf,EAAQX,OAAM0B,KAAAA,OAAIf,EAAQT,YAAUuB,EAAA,CACxCI,OAAQ,OACRC,SAAU,WAAS,IAAAJ,OACdf,EAAQR,iBAAoB,CAC/BwB,SAAU,SACVI,MAAO,OACPC,UAAW,YAInB"}
@@ -1,2 +1,2 @@
1
- import{slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as i}from"react/jsx-runtime";import{useMemo as o,useState as n,createRef as r}from"react";import{styled as t,TextField as a,Button as s,Box as u}from"@mui/material";import{createChipViewers as c}from"../components/chip-viewer.js";import{getErrorMessage as v,convertFormDataToJson as d}from"../../form/helpers.js";import{ButtonBack as m,ChipDark as f,FilterLogicToggle as p}from"../components/ui.units.js";import{PopperContent as b,PopperBody as g,PopperFooter as h}from"../components/popper-custom.js";function y(t){var y=c();return function(c){var C,j,z=o(function(){return Object.assign({},c.currentConfig,null==t?void 0:t.config)},[null==t?void 0:t.config,c.currentConfig]),A=r(),k=c.value,T=void 0===k?{values:[],logic:null!==(C=null==z?void 0:z.defaultLogic)&&void 0!==C?C:"and"}:k,B=n(T.logic),F=e(B,2),R=F[0],S=F[1],w=null!==(j=null==z?void 0:z.label)&&void 0!==j?j:z.field.toString(),I=n({}),L=e(I,2),V=L[0],D=L[1],E=function(e){c.onSubmit(z.field,e,z)},H=v(V,z.field),M=o(function(){var e=Array.isArray(T.values)?T.values:[T.values];return{field:z.field,items:e.map(function(e){return{value:e}})}},[z.field,T]),O=[];return c.isLoading&&O.push("disabled"),l(x,{className:O.join(" "),noValidate:!0,onSubmit:function(e){var l;e.preventDefault(),e.stopPropagation();var i=new FormData(e.currentTarget),o=d(i),n=null===(l=c.validator)||void 0===l?void 0:l.run(o);if(D(n||{}),!n||0===Object.keys(n).length){var r=z.field,t=Array.isArray(o[r])?o[r]:[o[r]];E({values:t,logic:R}),A.current&&(A.current.blur(),A.current.value="")}},children:i(b,{title:"Filter by ".concat(w),onClose:c.onClose,slots:{beforeTitle:l(m,{size:"small",onClick:c.onBack}),afterTitle:z.singleValue?l(f,{sx:{ml:1.5},size:"small",label:"Last value only"}):!T.values||T.values.length<2?null:l(p,{sx:{ml:1},value:R,onChange:function(e,l){return function(e){S(e);var l={values:T.values,logic:e};E(l)}(l)}})},children:[i(g,{children:[l(y,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:M,onRemove:c.onRemove}),l(a,{inputRef:A,autoFocus:!0,name:z.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter value",error:H.error,helperText:H.message,sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),i(h,{children:[l(s,{size:"small",color:"error",variant:"text",disabled:!T.values||0===T.values.length,onClick:function(){var e,l;null===(e=c.onRemoveField)||void 0===e||e.call(c,z.field),!1!==(null==t||null===(l=t.config)||void 0===l?void 0:l.closeAfterClear)&&c.onClose()},children:"Clear All"}),l(u,{sx:{flex:1}}),l(s,{size:"small",color:"inherit",variant:"text",onClick:c.onClose,children:"Cancel"}),l(s,{size:"small",type:"submit",color:"primary",variant:"contained",children:"Apply"})]})]})})}}var x=t("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"}}});export{y as default};
1
+ import{slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as i}from"react/jsx-runtime";import{useMemo as o,useState as n,createRef as r}from"react";import{styled as t,Typography as a,TextField as s,Button as u,Box as c}from"@mui/material";import{createChipViewers as d}from"../components/chip-viewer.js";import{getErrorMessage as v,convertFormDataToJson as m}from"../../form/helpers.js";import{ButtonBack as p,ChipDark as f,FilterLogicToggle as b}from"../components/ui.units.js";import{PopperContent as g,PopperBody as h,PopperFooter as y}from"../components/popper-custom.js";function x(t){var x=d();return function(d){var j,z,A=o(function(){return Object.assign({},d.currentConfig,null==t?void 0:t.config)},[null==t?void 0:t.config,d.currentConfig]),k=r(),T=d.value,B=void 0===T?{values:[],logic:null!==(j=null==A?void 0:A.defaultLogic)&&void 0!==j?j:"and"}:T,F=n(B.logic),R=e(F,2),S=R[0],w=R[1],I=null!==(z=null==A?void 0:A.label)&&void 0!==z?z:A.field.toString(),L=n({}),V=e(L,2),D=V[0],E=V[1],H=function(e){d.onSubmit(A.field,e,A)},M=v(D,A.field),O=o(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:A.field,items:e.map(function(e){return{value:e}})}},[A.field,B]),P=[];return d.isLoading&&P.push("disabled"),l(C,{className:P.join(" "),noValidate:!0,onSubmit:function(e){var l;e.preventDefault(),e.stopPropagation();var i=new FormData(e.currentTarget),o=m(i),n=null===(l=d.validator)||void 0===l?void 0:l.run(o);if(E(n||{}),!n||0===Object.keys(n).length){var r=A.field,t=Array.isArray(o[r])?o[r]:[o[r]];H({values:t,logic:S}),k.current&&(k.current.blur(),k.current.value="")}},children:i(g,{title:"Filter by ".concat(I),onClose:d.onClose,slots:{beforeTitle:l(p,{size:"small",onClick:d.onBack}),afterTitle:A.singleValue?l(f,{sx:{ml:1.5},size:"small",label:"Last value only"}):!B.values||B.values.length<2?null:l(b,{sx:{ml:1},value:S,onChange:function(e,l){return function(e){w(e);var l={values:B.values,logic:e};H(l)}(l)}})},children:[i(h,{children:[A.description&&l(a,{variant:"caption",color:"text.secondary",sx:{display:"block",mb:1},children:A.description}),l(x,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:O,onRemove:d.onRemove}),l(s,{inputRef:k,autoFocus:!0,name:A.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter value",error:M.error,helperText:M.message,sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),i(y,{children:[l(u,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e,l;null===(e=d.onRemoveField)||void 0===e||e.call(d,A.field),!1!==(null==t||null===(l=t.config)||void 0===l?void 0:l.closeAfterClear)&&d.onClose()},children:"Clear All"}),l(c,{sx:{flex:1}}),l(u,{size:"small",color:"inherit",variant:"text",onClick:d.onClose,children:"Cancel"}),l(u,{size:"small",type:"submit",color:"primary",variant:"contained",children:"Apply"})]})]})})}}var C=t("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"}}});export{x as default};
2
2
  //# sourceMappingURL=create-form-field-string.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-form-field-string.js","sources":["../../../../src/filter-bar/menu/create-form-field-string.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useMemo, useState } from 'react'\r\nimport { Box, Button, styled, TextField } from '@mui/material'\r\nimport { createChipViewers } from '../components/chip-viewer'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TChipViewerGroup } from '../components/chip-viewer'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\n/** Props for the `FormFieldString` component returned by `createFormFieldString`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\n/** Parameters passed to `createFormFieldString` to configure the generated component. */\r\nexport interface IFormFieldStringParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldString` filter-menu component.\r\n *\r\n * The generated component renders a free-text input inside a popper/menu panel,\r\n * letting the user type arbitrary string values as filter criteria. It supports:\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Auto-focus and input reset after each successful submission\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (optional field config override)\r\n * @returns A React FC ready to be used as a free-text filter-menu field component\r\n */\r\nfunction createFormFieldString<T>(params?: IFormFieldStringParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FormFieldString: FC<IFormFieldStringProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const refInput = createRef<HTMLInputElement>()\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'and' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault() // Prevent default form submission behavior\r\n event.stopPropagation() // Stop the event from bubbling up to parent elements (like Popper) which might cause it to close prematurely\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const { field } = mergedConfig\r\n const newValues = (Array.isArray(obj[field]) ? obj[field] : [obj[field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n\r\n if (refInput.current) {\r\n refInput.current.blur()\r\n refInput.current.value = ''\r\n }\r\n }\r\n }\r\n\r\n const error = getErrorMessage(errorData, mergedConfig.field)\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <TextField\r\n inputRef={refInput}\r\n autoFocus\r\n name={mergedConfig.field.toString()}\r\n size='small'\r\n fullWidth\r\n placeholder='Enter value'\r\n error={error.error}\r\n helperText={error.message}\r\n sx={{ '.MuiInputBase-root': { minHeight: '42px' } }}\r\n />\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldString\r\n}\r\n\r\nexport default createFormFieldString\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n})\r\n"],"names":["createFormFieldString","params","ChipViewers","createChipViewers","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","refInput","createRef","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","_useState3","_useState4","errorData","setErrorData","handleSubmit","newValue","onSubmit","error","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","stopPropagation","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","keys","length","newValues","current","blur","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","mb","borderBottom","placement","enableMinimalesticView","onRemove","TextField","inputRef","autoFocus","name","fullWidth","placeholder","helperText","message","minHeight","PopperFooter","Button","color","variant","disabled","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","display","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
1
+ {"version":3,"file":"create-form-field-string.js","sources":["../../../../src/filter-bar/menu/create-form-field-string.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useMemo, useState } from 'react'\r\nimport { Box, Button, styled, TextField, Typography } from '@mui/material'\r\nimport { createChipViewers } from '../components/chip-viewer'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { TChipViewerGroup } from '../components/chip-viewer'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\n/** Props for the `FormFieldString` component returned by `createFormFieldString`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\n/** Parameters passed to `createFormFieldString` to configure the generated component. */\r\nexport interface IFormFieldStringParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldString` filter-menu component.\r\n *\r\n * The generated component renders a free-text input inside a popper/menu panel,\r\n * letting the user type arbitrary string values as filter criteria. It supports:\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Auto-focus and input reset after each successful submission\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (optional field config override)\r\n * @returns A React FC ready to be used as a free-text filter-menu field component\r\n */\r\nfunction createFormFieldString<T>(params?: IFormFieldStringParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FormFieldString: FC<IFormFieldStringProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const refInput = createRef<HTMLInputElement>()\r\n const { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'and' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault() // Prevent default form submission behavior\r\n event.stopPropagation() // Stop the event from bubbling up to parent elements (like Popper) which might cause it to close prematurely\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const { field } = mergedConfig\r\n const newValues = (Array.isArray(obj[field]) ? obj[field] : [obj[field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n\r\n if (refInput.current) {\r\n refInput.current.blur()\r\n refInput.current.value = ''\r\n }\r\n }\r\n }\r\n\r\n const error = getErrorMessage(errorData, mergedConfig.field)\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: mergedConfig.field, items: items.map((v) => ({ value: v })) }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ display: 'block', mb: 1 }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <TextField\r\n inputRef={refInput}\r\n autoFocus\r\n name={mergedConfig.field.toString()}\r\n size='small'\r\n fullWidth\r\n placeholder='Enter value'\r\n error={error.error}\r\n helperText={error.message}\r\n sx={{ '.MuiInputBase-root': { minHeight: '42px' } }}\r\n />\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldString\r\n}\r\n\r\nexport default createFormFieldString\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n})\r\n"],"names":["createFormFieldString","params","ChipViewers","createChipViewers","props","_mergedConfig$default","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","refInput","createRef","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","_useState3","_useState4","errorData","setErrorData","handleSubmit","newValue","onSubmit","error","getErrorMessage","filterViewerValue","items","Array","isArray","map","v","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","stopPropagation","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","keys","length","newValues","current","blur","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","newLogic","handleChangeLogic","PopperBody","description","Typography","variant","color","display","mb","borderBottom","placement","enableMinimalesticView","onRemove","TextField","inputRef","autoFocus","name","fullWidth","placeholder","helperText","message","minHeight","PopperFooter","Button","disabled","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,objectWithoutProperties as n,objectSpread2 as r,slicedToArray as o,asyncToGenerator as t,regenerator as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{useState as u,useContext as c,useMemo as s,createRef as d}from"react";import{styled as m,Box as f,MenuList as p,Tooltip as v,IconButton as b,Badge as h,MenuItem as g,Typography as y,Button as j}from"@mui/material";import F from"@mui/icons-material/FilterList";import C from"@mui/material/ClickAwayListener";import{KeySpecial as k}from"../types.js";import{useFilterActions as I}from"../hooks.js";import{FilterBarContext as S}from"../index.context.js";import{FilterMenuNoField as x}from"../components/ui.units.js";import{mapSpecialLabel as w,mapSpecialTexts as P}from"../helpers.js";import{SingleRuleValidate as A,FormValidator as R}from"../../form/validator.js";import{PopperCustom as q,PopperContent as T,PopperBody as B,PopperFooter as O}from"../components/popper-custom.js";import M from"./create-form-field-string.js";var D=["fields","validation","enableQuickSearch"];function L(m){var f=N,p=function(e){var o=e.fields,t=e.validation,i=e.enableQuickSearch,l=void 0===i||i,a=n(e,D),u=k.quickSearch,c=r({},o);if(l){var s=c[u],d=null!=s&&s.label?s.label:w[u],m=Object.assign({},c[u],{field:u,label:d,singleValue:!0});c[u]=m}else delete c[u];var f=Object.keys(c),p=f.reduce(function(e,n){var o=c[n];return o?(e[n]=r(r({},o),{},{field:n}),e):e},{}),v=r({},t);return f.forEach(function(e){var n,r,o,t=v[e],i=null!==(n=null!==(r=null==t?void 0:t.label)&&void 0!==r?r:null===(o=c[e])||void 0===o?void 0:o.label)&&void 0!==n?n:e.toString();t?t.Rules.some(function(e){return e.rule===A.Required})||(t.label=i,t.Rules.push({rule:A.Required})):v[e]={Rules:[{rule:A.Required}],label:i}}),r(r({},a),{},{fields:p,validation:v,enableQuickSearch:l})}(m),L=function(n){return Object.keys(n.fields).reduce(function(r,o){var t,i=o,l=null===(t=n.validation)||void 0===t?void 0:t[i];return l&&(r[i]=new R(e({},i,l))),r},{})}(p),z=function(e){var n=e.fields;return Object.keys(n).reduce(function(e,r){var o,t=r,i=n[t];return i&&(e[t]=null!==(o=i.FormComponent)&&void 0!==o?o:M()),e},{})}(p),E=m.quickSearchHint;return function(e){var n=d(),w=u(null),A=o(w,2),R=A[0],M=A[1],D=Boolean(R),N=c(S),G=I(N),H=u(null),_=o(H,2),W=_[0],J=_[1],K=s(function(){var n=m.popperProps,r=m.rootProps;return Object.assign({},{popperProps:n,rootProps:r},e.slots)},[m,e.slots]),U=function(){M(null),setTimeout(function(){J(null)},300)},X=function(){G.clearAllFilters(),U()},Y=function(){var e=t(i().m(function e(n,r,o){return i().w(function(e){for(;;)switch(e.n){case 0:if(r){e.n=1;break}return e.a(2);case 1:null!=o&&o.singleValue||null!=o&&o.replaceValue?G.replaceFilter(n,r,{logic:r.logic}):G.upsertManyFilter(n,r,{logic:r.logic}),!1!==(null==m?void 0:m.closeAfterSubmit)&&!1!==(null==o?void 0:o.closeAfterSubmit)&&U();case 2:return e.a(2)}},e)}));return function(n,r,o){return e.apply(this,arguments)}}(),Z=s(function(){var e=Object.values(p.fields);return Array.from(e)},[p.fields]),$=G.getTotalCount(),ee="".concat($," Filter").concat(1!==$?"s":"");return l(C,{onClickAway:U,children:a(V,r(r({className:f.root},K.rootProps),{},{children:[l(v,{title:ee,arrow:!0,placement:"top",children:l(b,{size:"small",ref:n,onClick:function(){J(null),M(n.current)},children:l(h,{badgeContent:$,color:"primary",invisible:0===$,children:l(F,{fontSize:"small"})})})}),l(q,r(r({open:D,anchorEl:R,placement:"bottom",transition:!0,disablePortal:!0},K.popperProps),{},{children:function(){if(0===Z.length)return l(x,{onClose:U});var e=W?p.fields[W]:void 0;if(W&&e){var n,o=z[W];if(!o)return null;var t=r({},e);null!=t&&t.FormComponent&&delete t.FormComponent;var i=null===(n=N.filterState.storeFilter)||void 0===n?void 0:n[W];return l(o,{currentConfig:t,value:i,isLoading:N.isLoading,onRemove:G.removeFilterByFieldValue,validator:L[W],onSubmit:Y,onClose:U,onRemoveField:function(e){return G.removeFilter(e)},onBack:function(){return J(null)}})}return a(T,{title:"Filter by",onClose:U,children:[l(B,{disableGutter:!0,children:l(Q,{className:f.menu,children:Z.map(function(e){var n,r,o=e.field.toString();if(!o)return null;var t=G.getFieldInfo(e.field),i=null!==(n=null==t?void 0:t.values.join(", "))&&void 0!==n?n:"",u=t?t.values.length:0,c=u>0?" (".concat(u,")"):"",s=null!==(r=e.label)&&void 0!==r?r:o.toString(),d=u>0?"Filter by ".concat(s,": ").concat(i):void 0;if(e.field===k.quickSearch){var m=P.qsTooltip;d="function"==typeof E?E(m):null!=E?E:m}else if(e.tooltip){var p,b="function"==typeof e.tooltip?e.tooltip(null==t?void 0:t.values):e.tooltip;d=(null!==(p=null==t?void 0:t.values.length)&&void 0!==p?p:0)>0?b:void 0}return l(g,{className:f.menuItem,sx:{justifyContent:"space-between"},onClick:function(){return n=e.field,void J(n);var n},children:l(v,{title:d,placement:"right",arrow:!0,children:a("div",{className:f.menuItemInner,children:[l(y,{variant:"body2",children:s}),l(y,{variant:"caption",sx:{ml:1,color:"text.secondary"},children:c})]})})},o)})})}),l(O,{children:l(j,{color:"error",disabled:0===$,onClick:X,children:"Clear All"})})]})}()}))]}))})}}var N={root:"DinoFilterMenu-root",menu:"DinoFilterMenu-menu",menuItem:"DinoFilterMenu-menuItem",menuItemInner:"DinoFilterMenu-menuItemInner"},V=m(f)(e({},"&.".concat(N.root),{display:"inline-flex",justifyContent:"center",alignItems:"center",flex:"0 0 auto"})),Q=m(p)(e(e({},".".concat(N.menuItem),{paddingTop:0,paddingBottom:0}),".".concat(N.menuItemInner),{display:"flex",justifyContent:"space-between",alignItems:"center",width:"100%",gap:"4px",paddingTop:"6px",paddingBottom:"6px"}));export{L as createFilterMenu,N as filterMenuClasses};
1
+ import{defineProperty as e,objectWithoutProperties as n,objectSpread2 as r,slicedToArray as t,asyncToGenerator as o,regenerator as i}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{useState as u,useContext as c,useMemo as s,createRef as d}from"react";import{styled as m,Box as f,MenuList as p,Tooltip as v,IconButton as h,Badge as b,MenuItem as g,Typography as y,Button as j}from"@mui/material";import F from"@mui/icons-material/FilterList";import k from"@mui/material/ClickAwayListener";import{KeySpecial as C}from"../types.js";import{useFilterActions as x}from"../hooks.js";import{FilterBarContext as S}from"../index.context.js";import{FilterMenuNoField as I}from"../components/ui.units.js";import{mapSpecialLabel as P,mapSpecialTexts as q}from"../helpers.js";import{SingleRuleValidate as w,FormValidator as A}from"../../form/validator.js";import{PopperCustom as R,PopperContent as T,PopperBody as B,PopperFooter as O}from"../components/popper-custom.js";import M from"./create-form-field-string.js";var D=["fields","validation","enableQuickSearch"];var L=function(e){var n=q.qsTooltip;return e?"function"==typeof e?e(n):e:n};function N(m){var f=V,p=function(e){var t=e.fields,o=e.validation,i=e.enableQuickSearch,l=void 0===i||i,a=n(e,D),u=C.quickSearch,c=r({},t);if(l){var s=c[u],d={field:u,label:null!=s&&s.label?s.label:P[u],singleValue:!0,description:L(e.quickSearchHint)},m=Object.assign({},c[u],d);c[u]=m}else delete c[u];var f=Object.keys(c),p=f.reduce(function(e,n){var t=c[n];return t?(e[n]=r(r({},t),{},{field:n}),e):e},{}),v=r({},o);return f.forEach(function(e){var n,r,t,o=v[e],i=null!==(n=null!==(r=null==o?void 0:o.label)&&void 0!==r?r:null===(t=c[e])||void 0===t?void 0:t.label)&&void 0!==n?n:e.toString();o?o.Rules.some(function(e){return e.rule===w.Required})||(o.label=i,o.Rules.push({rule:w.Required})):v[e]={Rules:[{rule:w.Required}],label:i}}),r(r({},a),{},{fields:p,validation:v,enableQuickSearch:l})}(m),q=function(n){return Object.keys(n.fields).reduce(function(r,t){var o,i=t,l=null===(o=n.validation)||void 0===o?void 0:o[i];return l&&(r[i]=new A(e({},i,l))),r},{})}(p),N=function(e){var n=e.fields;return Object.keys(n).reduce(function(e,r){var t,o=r,i=n[o];return i&&(e[o]=null!==(t=i.FormComponent)&&void 0!==t?t:M()),e},{})}(p),z=m.quickSearchHint;return function(e){var n=d(),P=u(null),w=t(P,2),A=w[0],M=w[1],D=Boolean(A),V=c(S),E=x(V),G=u(null),_=t(G,2),W=_[0],J=_[1],K=s(function(){var n=m.popperProps,r=m.rootProps;return Object.assign({},{popperProps:n,rootProps:r},e.slots)},[m,e.slots]),U=function(){M(null),setTimeout(function(){J(null)},300)},X=function(){E.clearAllFilters(),U()},Y=function(){var e=o(i().m(function e(n,r,t){return i().w(function(e){for(;;)switch(e.n){case 0:if(r){e.n=1;break}return e.a(2);case 1:null!=t&&t.singleValue||null!=t&&t.replaceValue?E.replaceFilter(n,r,{logic:r.logic}):E.upsertManyFilter(n,r,{logic:r.logic}),!1!==(null==m?void 0:m.closeAfterSubmit)&&!1!==(null==t?void 0:t.closeAfterSubmit)&&U();case 2:return e.a(2)}},e)}));return function(n,r,t){return e.apply(this,arguments)}}(),Z=s(function(){var e=Object.values(p.fields);return Array.from(e)},[p.fields]),$=E.getTotalCount(),ee="".concat($," Filter").concat(1!==$?"s":"");return l(k,{onClickAway:U,children:a(H,r(r({className:f.root},K.rootProps),{},{children:[l(v,{title:ee,arrow:!0,placement:"top",children:l(h,{size:"small",ref:n,onClick:function(){J(null),M(n.current)},children:l(b,{badgeContent:$,color:"primary",invisible:0===$,children:l(F,{fontSize:"small"})})})}),l(R,r(r({open:D,anchorEl:A,placement:"bottom",transition:!0,disablePortal:!0},K.popperProps),{},{children:function(){if(0===Z.length)return l(I,{onClose:U});var e=W?p.fields[W]:void 0;if(W&&e){var n,t=N[W];if(!t)return null;var o=r({},e);null!=o&&o.FormComponent&&delete o.FormComponent;var i=null===(n=V.filterState.storeFilter)||void 0===n?void 0:n[W];return l(t,{currentConfig:o,value:i,isLoading:V.isLoading,onRemove:E.removeFilterByFieldValue,validator:q[W],onSubmit:Y,onClose:U,onRemoveField:function(e){return E.removeFilter(e)},onBack:function(){return J(null)}})}return a(T,{title:"Filter by",onClose:U,children:[l(B,{disableGutter:!0,children:l(Q,{className:f.menu,children:Z.map(function(e){var n,r,t=e.field.toString();if(!t)return null;var o=E.getFieldInfo(e.field),i=null!==(n=null==o?void 0:o.values.join(", "))&&void 0!==n?n:"",u=o?o.values.length:0,c=u>0?" (".concat(u,")"):"",s=null!==(r=e.label)&&void 0!==r?r:t.toString(),d=u>0?"Filter by ".concat(s,": ").concat(i):void 0;if(e.field===C.quickSearch)d=L(z);else if(e.tooltip){var m,p="function"==typeof e.tooltip?e.tooltip(null==o?void 0:o.values):e.tooltip;d=(null!==(m=null==o?void 0:o.values.length)&&void 0!==m?m:0)>0?p:void 0}return l(g,{className:f.menuItem,sx:{justifyContent:"flex-start"},onClick:function(){return n=e.field,void J(n);var n},children:l(v,{title:d,placement:"right",arrow:!0,children:a("div",{className:f.menuItemInner,children:[e.before||null,l(y,{variant:"body2",sx:{flex:1},children:s}),l(y,{variant:"caption",sx:{ml:1,color:"text.secondary"},children:c}),e.after||null]})})},t)})})}),l(O,{children:l(j,{color:"error",disabled:0===$,onClick:X,children:"Clear All"})})]})}()}))]}))})}}var V={root:"DinoFilterMenu-root",menu:"DinoFilterMenu-menu",menuItem:"DinoFilterMenu-menuItem",menuItemInner:"DinoFilterMenu-menuItemInner"},H=m(f)(e({},"&.".concat(V.root),{display:"inline-flex",justifyContent:"center",alignItems:"center",flex:"0 0 auto"})),Q=m(p)(e(e({},".".concat(V.menuItem),{paddingTop:0,paddingBottom:0}),".".concat(V.menuItemInner),{display:"flex",justifyContent:"flex-start",alignItems:"center",width:"100%",gap:"4px",paddingTop:"6px",paddingBottom:"6px"}));export{N as createFilterMenu,V as filterMenuClasses};
2
2
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sources":["../../../../src/filter-bar/menu/create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useContext, useMemo, useState } from 'react'\r\nimport { Badge, Box, Button, IconButton, MenuItem, MenuList, styled, Tooltip, Typography } from '@mui/material'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ClickAwayListener from '@mui/material/ClickAwayListener'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { FilterBarContext } from '../index.context'\r\nimport { FilterMenuNoField } from '../components/ui.units'\r\nimport { mapSpecialLabel, mapSpecialTexts } from '../helpers'\r\nimport { FormValidator, SingleRuleValidate } from '../../form/validator'\r\nimport { PopperBody, PopperContent, PopperCustom, PopperFooter } from '../components/popper-custom'\r\nimport createFormFieldString from './create-form-field-string'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { TFieldModelValid, TFieldType, TFieldValue } from '../types'\r\nimport type { IConfigValue, IFormValidatorConfig } from '../../form/validator'\r\nimport type { IFilterMenuConfigInternal, TFieldMenuConfigsInternal } from './types'\r\nimport type { IFilterMenuProps, IFilterMenuSlots, TFieldMenuConfigs } from './types'\r\nimport type { IFieldMenuConfig, IFilterMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n// #region utils\r\n/**\r\n * Builds a map of `FormValidator` instances keyed by field name.\r\n * Each validator is constructed from the validation rules defined in `config.validation`.\r\n * Fields with no validation config are skipped.\r\n *\r\n * @internal\r\n */\r\nfunction generateValidatorMap<T>(config: IFilterMenuConfig<T>) {\r\n const keys = Object.keys(config.fields) as TFieldType<T>[]\r\n const validateMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = config.validation?.[fieldKey]\r\n if (fieldConfig) {\r\n acc[fieldKey] = new FormValidator({ [fieldKey]: fieldConfig } as IFormValidatorConfig<Partial<TFieldModelValid<T>>>)\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, FormValidator<Partial<TFieldModelValid<T>>>>\r\n )\r\n return validateMaps\r\n}\r\n\r\n/**\r\n * Builds a map of form input components keyed by field name.\r\n * If a field defines a custom `FormComponent`, that is used; otherwise falls back to\r\n * the default `createFormFieldString()` free-text component.\r\n *\r\n * @internal\r\n */\r\nfunction generateFormInputMap<T>(config: IFilterMenuConfig<T>) {\r\n const { fields } = config\r\n const keys = Object.keys(fields) as TFieldType<T>[]\r\n const formInputMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = fields[fieldKey] as IFieldMenuConfig<T>\r\n if (fieldConfig) {\r\n acc[fieldKey] = fieldConfig.FormComponent ?? createFormFieldString()\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, React.ComponentType<IFilterMenuFormProps<T>>>\r\n )\r\n return formInputMaps\r\n}\r\n\r\n/**\r\n * Normalises a raw `IFilterMenuConfig` into the internal format used by the menu:\r\n * - Injects the quick-search pseudo-field when `enableQuickSearch` is `true` (default)\r\n * - Stamps each field entry with its own `field` key\r\n * - Ensures every field has at least a `Required` validation rule\r\n *\r\n * @internal\r\n */\r\nfunction generateConfigs<T>(config: IFilterMenuConfig<T>): IFilterMenuConfigInternal<T> {\r\n const { fields, validation, enableQuickSearch = true, ...rest } = config\r\n const qsKey = KeySpecial.quickSearch\r\n\r\n // Merge quick search field if enabled\r\n const mergedFields: TFieldMenuConfigs<T> = { ...fields }\r\n if (enableQuickSearch) {\r\n const item = mergedFields[qsKey]\r\n const label = item?.label ? item.label : mapSpecialLabel[qsKey]\r\n const temp = Object.assign({}, mergedFields[qsKey], { field: qsKey, label, singleValue: true })\r\n mergedFields[qsKey] = temp\r\n } else {\r\n delete mergedFields[qsKey]\r\n }\r\n\r\n const keys = Object.keys(mergedFields) as TFieldType<T>[]\r\n const finalFields = keys.reduce<TFieldMenuConfigsInternal<T>>((acc, key) => {\r\n const fieldConfig = mergedFields[key]\r\n if (!fieldConfig) return acc\r\n acc[key] = { ...fieldConfig, field: key }\r\n return acc\r\n }, {} as TFieldMenuConfigsInternal<T>)\r\n\r\n // Merge validation config with default required rule\r\n const mergedValidation: IFormValidatorConfig<Partial<TFieldModelValid<T>>> = { ...validation }\r\n keys.forEach((key) => {\r\n const item: IConfigValue<Partial<TFieldModelValid<T>>> | undefined = mergedValidation[key]\r\n const label = item?.label ?? mergedFields[key]?.label ?? key.toString()\r\n if (!item) {\r\n mergedValidation[key] = { Rules: [{ rule: SingleRuleValidate.Required }], label }\r\n } else if (!item.Rules.some((r) => r.rule === SingleRuleValidate.Required)) {\r\n item.label = label\r\n item.Rules.push({ rule: SingleRuleValidate.Required })\r\n }\r\n })\r\n\r\n return { ...rest, fields: finalFields, validation: mergedValidation, enableQuickSearch }\r\n}\r\n// #endregion\r\n\r\n// #region main\r\n/**\r\n * Factory function that creates a `FilterMenu` component from a static field configuration.\r\n *\r\n * The generated component renders a badge icon button that opens a popper panel with:\r\n * - A **field list** view — lists all configured filter fields with applied-value counts\r\n * - A **field form** view — renders the appropriate input component for the selected field\r\n * - A **quick-search** field (opt-out via `enableQuickSearch: false`)\r\n * - OR / AND logic toggle support per field\r\n * - \"Clear All\" action to reset all active filters at once\r\n *\r\n * All state (open/close, selected field) is local; filter values are read/written through\r\n * `FilterBarContext` via `useFilterActions`.\r\n *\r\n * @param config - Static filter-menu configuration (fields, validation, slots, etc.)\r\n * @returns A React FC ready to be dropped anywhere inside a `FilterBarProvider`\r\n */\r\nexport function createFilterMenu<T>(config: IFilterMenuConfig<T>) {\r\n const classes = filterMenuClasses\r\n const mergedConfigs = generateConfigs(config)\r\n const validateMaps = generateValidatorMap(mergedConfigs)\r\n const formInputMaps = generateFormInputMap(mergedConfigs)\r\n const quickSearchHint = config.quickSearchHint\r\n\r\n // Component\r\n const FilterMenu: FC<IFilterMenuProps<T>> = (props) => {\r\n const refButton = createRef<HTMLButtonElement>()\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const [fieldSelected, setFieldSelected] = useState<TFieldType<T> | null>(null)\r\n\r\n const mergedSlots = useMemo<IFilterMenuSlots>(() => {\r\n const { popperProps, rootProps } = config\r\n return Object.assign({}, { popperProps, rootProps }, props.slots)\r\n }, [config, props.slots])\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null)\r\n setTimeout(() => {\r\n setFieldSelected(null)\r\n }, 300)\r\n }\r\n\r\n const handleOpen = () => {\r\n setFieldSelected(null)\r\n setAnchorEl(refButton.current)\r\n }\r\n\r\n const handleMenuItemClick = (field: TFieldType<T>) => {\r\n setFieldSelected(field)\r\n }\r\n\r\n const handleClearAll = () => {\r\n filterActions.clearAllFilters()\r\n handleClose()\r\n }\r\n\r\n const handleSubmit = async (key: TFieldType<T>, value?: TFieldValue, fieldConfig?: IFieldMenuConfig<T>) => {\r\n if (!value) return\r\n if (fieldConfig?.singleValue || fieldConfig?.replaceValue) {\r\n filterActions.replaceFilter(key, value, { logic: value.logic })\r\n } else {\r\n filterActions.upsertManyFilter(key, value, { logic: value.logic })\r\n }\r\n if (config?.closeAfterSubmit !== false && fieldConfig?.closeAfterSubmit !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const data = useMemo(() => {\r\n const keys = Object.values(mergedConfigs.fields)\r\n return Array.from(keys) as IFieldMenuConfig<T>[]\r\n }, [mergedConfigs.fields])\r\n\r\n const renderContent = () => {\r\n if (data.length === 0) {\r\n return <FilterMenuNoField onClose={handleClose} />\r\n }\r\n const currentConfig = fieldSelected ? mergedConfigs.fields[fieldSelected] : undefined\r\n\r\n if (fieldSelected && currentConfig) {\r\n const FormComponent = formInputMaps[fieldSelected] as React.ComponentType<IFilterMenuFormProps<T>>\r\n if (!FormComponent) return null\r\n\r\n const config: IFieldMenuConfig<T> = { ...currentConfig }\r\n // Remove FormComponent from config before passing to form, as it's not needed there and can cause unnecessary re-renders\r\n if (config?.FormComponent) delete config.FormComponent\r\n\r\n const value = context.filterState.storeFilter?.[fieldSelected]\r\n return (\r\n <FormComponent\r\n currentConfig={config}\r\n value={value}\r\n isLoading={context.isLoading}\r\n onRemove={filterActions.removeFilterByFieldValue}\r\n validator={validateMaps[fieldSelected]}\r\n onSubmit={handleSubmit}\r\n onClose={handleClose}\r\n onRemoveField={(f) => filterActions.removeFilter(f)}\r\n onBack={() => setFieldSelected(null)}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <PopperContent title='Filter by' onClose={handleClose}>\r\n <PopperBody disableGutter>\r\n <MenuListCustom className={classes.menu}>\r\n {data.map((item) => {\r\n const key = item.field.toString()\r\n if (!key) return null\r\n const info = filterActions.getFieldInfo(item.field)\r\n const note = info?.values.join(', ') ?? ''\r\n const fieldCount = info ? info.values.length : 0\r\n const suffix = fieldCount > 0 ? ` (${fieldCount})` : ''\r\n const label = item.label ?? key.toString()\r\n let tooltipTitle = fieldCount > 0 ? `Filter by ${label}: ${note}` : undefined\r\n if (item.field === KeySpecial.quickSearch) {\r\n const txt = mapSpecialTexts.qsTooltip\r\n tooltipTitle = typeof quickSearchHint === 'function' ? quickSearchHint(txt) : (quickSearchHint ?? txt)\r\n } else if (item.tooltip) {\r\n const tooltip = typeof item.tooltip === 'function' ? item.tooltip(info?.values) : item.tooltip\r\n tooltipTitle = (info?.values.length ?? 0) > 0 ? tooltip : undefined\r\n }\r\n return (\r\n <MenuItem\r\n key={key}\r\n className={classes.menuItem}\r\n sx={{ justifyContent: 'space-between' }}\r\n onClick={() => handleMenuItemClick(item.field)}\r\n >\r\n <Tooltip title={tooltipTitle} placement='right' arrow>\r\n <div className={classes.menuItemInner}>\r\n <Typography variant='body2'>{label}</Typography>\r\n <Typography variant='caption' sx={{ ml: 1, color: 'text.secondary' }}>\r\n {suffix}\r\n </Typography>\r\n </div>\r\n </Tooltip>\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button color='error' disabled={filterCount === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n )\r\n }\r\n\r\n const filterCount = filterActions.getTotalCount()\r\n const iconTitle = `${filterCount} Filter${filterCount !== 1 ? 's' : ''}`\r\n return (\r\n <ClickAwayListener onClickAway={handleClose}>\r\n <FilterInputStyled className={classes.root} {...mergedSlots.rootProps}>\r\n <Tooltip title={iconTitle} arrow placement='top'>\r\n <IconButton size='small' ref={refButton} onClick={handleOpen}>\r\n <Badge badgeContent={filterCount} color='primary' invisible={filterCount === 0}>\r\n <FilterListIcon fontSize='small' />\r\n </Badge>\r\n </IconButton>\r\n </Tooltip>\r\n <PopperCustom open={isOpen} anchorEl={anchorEl} placement='bottom' transition disablePortal {...mergedSlots.popperProps}>\r\n {renderContent()}\r\n </PopperCustom>\r\n </FilterInputStyled>\r\n </ClickAwayListener>\r\n )\r\n }\r\n return FilterMenu\r\n}\r\n// #endregion\r\n\r\n// #region styles\r\n/** CSS class names used by the `FilterMenu` component for external style overrides. */\r\nexport const filterMenuClasses = {\r\n root: 'DinoFilterMenu-root',\r\n input: 'DinoFilterMenu-input',\r\n beforeInput: 'DinoFilterMenu-beforeInput',\r\n menu: 'DinoFilterMenu-menu',\r\n menuItem: 'DinoFilterMenu-menuItem',\r\n menuItemInner: 'DinoFilterMenu-menuItemInner'\r\n}\r\n\r\nconst FilterInputStyled = styled(Box)({\r\n [`&.${filterMenuClasses.root}`]: {\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: '0 0 auto'\r\n }\r\n})\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n [`.${filterMenuClasses.menuItem}`]: { paddingTop: 0, paddingBottom: 0 },\r\n [`.${filterMenuClasses.menuItemInner}`]: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '4px',\r\n paddingTop: '6px',\r\n paddingBottom: '6px'\r\n }\r\n})\r\n// #endregion\r\n"],"names":["createFilterMenu","config","classes","filterMenuClasses","mergedConfigs","fields","validation","_config$enableQuickSe","enableQuickSearch","rest","_objectWithoutProperties","_excluded","qsKey","KeySpecial","quickSearch","mergedFields","_objectSpread","item","label","mapSpecialLabel","temp","Object","assign","field","singleValue","keys","finalFields","reduce","acc","key","fieldConfig","mergedValidation","forEach","_ref","_item$label","_mergedFields$key","toString","Rules","some","r","rule","SingleRuleValidate","Required","push","generateConfigs","validateMaps","_config$validation","fieldKey","FormValidator","_defineProperty","generateValidatorMap","formInputMaps","_fieldConfig$FormComp","FormComponent","createFormFieldString","generateFormInputMap","quickSearchHint","props","refButton","createRef","_useState","useState","_useState2","_slicedToArray","anchorEl","setAnchorEl","isOpen","Boolean","context","useContext","FilterBarContext","filterActions","useFilterActions","_useState3","_useState4","fieldSelected","setFieldSelected","mergedSlots","useMemo","popperProps","rootProps","slots","handleClose","setTimeout","handleClearAll","clearAllFilters","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","value","w","_context","n","a","replaceValue","replaceFilter","logic","upsertManyFilter","closeAfterSubmit","_x","_x2","_x3","apply","this","arguments","data","values","Array","from","filterCount","getTotalCount","iconTitle","concat","_jsx","ClickAwayListener","onClickAway","children","_jsxs","FilterInputStyled","className","root","Tooltip","title","arrow","placement","IconButton","size","ref","onClick","current","Badge","badgeContent","color","invisible","FilterListIcon","fontSize","PopperCustom","open","transition","disablePortal","length","FilterMenuNoField","onClose","currentConfig","undefined","_context$filterState$","filterState","storeFilter","isLoading","onRemove","removeFilterByFieldValue","validator","onSubmit","onRemoveField","f","removeFilter","onBack","PopperContent","PopperBody","disableGutter","MenuListCustom","menu","map","_info$values$join","_item$label2","info","getFieldInfo","note","join","fieldCount","suffix","tooltipTitle","txt","mapSpecialTexts","qsTooltip","tooltip","_info$values$length","MenuItem","menuItem","sx","justifyContent","menuItemInner","Typography","variant","ml","PopperFooter","Button","disabled","renderContent","styled","Box","display","alignItems","flex","MenuList","paddingTop","paddingBottom","width","gap"],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sources":["../../../../src/filter-bar/menu/create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useContext, useMemo, useState } from 'react'\r\nimport { Badge, Box, Button, IconButton, MenuItem, MenuList, styled, Tooltip, Typography } from '@mui/material'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ClickAwayListener from '@mui/material/ClickAwayListener'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { FilterBarContext } from '../index.context'\r\nimport { FilterMenuNoField } from '../components/ui.units'\r\nimport { mapSpecialLabel, mapSpecialTexts } from '../helpers'\r\nimport { FormValidator, SingleRuleValidate } from '../../form/validator'\r\nimport { PopperBody, PopperContent, PopperCustom, PopperFooter } from '../components/popper-custom'\r\nimport createFormFieldString from './create-form-field-string'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { TFieldModelValid, TFieldType, TFieldValue } from '../types'\r\nimport type { IConfigValue, IFormValidatorConfig } from '../../form/validator'\r\nimport type { IFilterMenuConfigInternal, TFieldMenuConfigsInternal } from './types'\r\nimport type { IFilterMenuProps, IFilterMenuSlots, TFieldMenuConfigs } from './types'\r\nimport type { IFieldMenuConfig, IFilterMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n// #region utils\r\n/**\r\n * Builds a map of `FormValidator` instances keyed by field name.\r\n * Each validator is constructed from the validation rules defined in `config.validation`.\r\n * Fields with no validation config are skipped.\r\n *\r\n * @internal\r\n */\r\nfunction generateValidatorMap<T>(config: IFilterMenuConfig<T>) {\r\n const keys = Object.keys(config.fields) as TFieldType<T>[]\r\n const validateMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = config.validation?.[fieldKey]\r\n if (fieldConfig) {\r\n acc[fieldKey] = new FormValidator({ [fieldKey]: fieldConfig } as IFormValidatorConfig<Partial<TFieldModelValid<T>>>)\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, FormValidator<Partial<TFieldModelValid<T>>>>\r\n )\r\n return validateMaps\r\n}\r\n\r\n/**\r\n * Builds a map of form input components keyed by field name.\r\n * If a field defines a custom `FormComponent`, that is used; otherwise falls back to\r\n * the default `createFormFieldString()` free-text component.\r\n *\r\n * @internal\r\n */\r\nfunction generateFormInputMap<T>(config: IFilterMenuConfig<T>) {\r\n const { fields } = config\r\n const keys = Object.keys(fields) as TFieldType<T>[]\r\n const formInputMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = fields[fieldKey] as IFieldMenuConfig<T>\r\n if (fieldConfig) {\r\n acc[fieldKey] = fieldConfig.FormComponent ?? createFormFieldString()\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, React.ComponentType<IFilterMenuFormProps<T>>>\r\n )\r\n return formInputMaps\r\n}\r\n\r\nconst getQuickSearchTooltip = (currentHint?: string | ((currentHint: string) => string)) => {\r\n const defaultHint = mapSpecialTexts.qsTooltip\r\n if (!currentHint) return defaultHint\r\n return typeof currentHint === 'function' ? currentHint(defaultHint) : currentHint\r\n}\r\n/**\r\n * Normalises a raw `IFilterMenuConfig` into the internal format used by the menu:\r\n * - Injects the quick-search pseudo-field when `enableQuickSearch` is `true` (default)\r\n * - Stamps each field entry with its own `field` key\r\n * - Ensures every field has at least a `Required` validation rule\r\n *\r\n * @internal\r\n */\r\nfunction generateConfigs<T>(config: IFilterMenuConfig<T>): IFilterMenuConfigInternal<T> {\r\n const { fields, validation, enableQuickSearch = true, ...rest } = config\r\n const qsKey = KeySpecial.quickSearch\r\n\r\n // Merge quick search field if enabled\r\n const mergedFields: TFieldMenuConfigs<T> = { ...fields }\r\n if (enableQuickSearch) {\r\n const item = mergedFields[qsKey]\r\n const label = item?.label ? item.label : mapSpecialLabel[qsKey]\r\n const qsTooltip = getQuickSearchTooltip(config.quickSearchHint)\r\n const quiclkSearchConfig: IFieldMenuConfig<T> = { field: qsKey, label, singleValue: true, description: qsTooltip }\r\n const temp = Object.assign({}, mergedFields[qsKey], quiclkSearchConfig)\r\n mergedFields[qsKey] = temp\r\n } else {\r\n delete mergedFields[qsKey]\r\n }\r\n\r\n const keys = Object.keys(mergedFields) as TFieldType<T>[]\r\n const finalFields = keys.reduce<TFieldMenuConfigsInternal<T>>((acc, key) => {\r\n const fieldConfig = mergedFields[key]\r\n if (!fieldConfig) return acc\r\n acc[key] = { ...fieldConfig, field: key }\r\n return acc\r\n }, {} as TFieldMenuConfigsInternal<T>)\r\n\r\n // Merge validation config with default required rule\r\n const mergedValidation: IFormValidatorConfig<Partial<TFieldModelValid<T>>> = { ...validation }\r\n keys.forEach((key) => {\r\n const item: IConfigValue<Partial<TFieldModelValid<T>>> | undefined = mergedValidation[key]\r\n const label = item?.label ?? mergedFields[key]?.label ?? key.toString()\r\n if (!item) {\r\n mergedValidation[key] = { Rules: [{ rule: SingleRuleValidate.Required }], label }\r\n } else if (!item.Rules.some((r) => r.rule === SingleRuleValidate.Required)) {\r\n item.label = label\r\n item.Rules.push({ rule: SingleRuleValidate.Required })\r\n }\r\n })\r\n\r\n return { ...rest, fields: finalFields, validation: mergedValidation, enableQuickSearch }\r\n}\r\n// #endregion\r\n\r\n// #region main\r\n/**\r\n * Factory function that creates a `FilterMenu` component from a static field configuration.\r\n *\r\n * The generated component renders a badge icon button that opens a popper panel with:\r\n * - A **field list** view — lists all configured filter fields with applied-value counts\r\n * - A **field form** view — renders the appropriate input component for the selected field\r\n * - A **quick-search** field (opt-out via `enableQuickSearch: false`)\r\n * - OR / AND logic toggle support per field\r\n * - \"Clear All\" action to reset all active filters at once\r\n *\r\n * All state (open/close, selected field) is local; filter values are read/written through\r\n * `FilterBarContext` via `useFilterActions`.\r\n *\r\n * @param config - Static filter-menu configuration (fields, validation, slots, etc.)\r\n * @returns A React FC ready to be dropped anywhere inside a `FilterBarProvider`\r\n */\r\nexport function createFilterMenu<T>(config: IFilterMenuConfig<T>) {\r\n const classes = filterMenuClasses\r\n const mergedConfigs = generateConfigs(config)\r\n const validateMaps = generateValidatorMap(mergedConfigs)\r\n const formInputMaps = generateFormInputMap(mergedConfigs)\r\n const quickSearchHint = config.quickSearchHint\r\n\r\n // Component\r\n const FilterMenu: FC<IFilterMenuProps<T>> = (props) => {\r\n const refButton = createRef<HTMLButtonElement>()\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const [fieldSelected, setFieldSelected] = useState<TFieldType<T> | null>(null)\r\n\r\n const mergedSlots = useMemo<IFilterMenuSlots>(() => {\r\n const { popperProps, rootProps } = config\r\n return Object.assign({}, { popperProps, rootProps }, props.slots)\r\n }, [config, props.slots])\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null)\r\n setTimeout(() => {\r\n setFieldSelected(null)\r\n }, 300)\r\n }\r\n\r\n const handleOpen = () => {\r\n setFieldSelected(null)\r\n setAnchorEl(refButton.current)\r\n }\r\n\r\n const handleMenuItemClick = (field: TFieldType<T>) => {\r\n setFieldSelected(field)\r\n }\r\n\r\n const handleClearAll = () => {\r\n filterActions.clearAllFilters()\r\n handleClose()\r\n }\r\n\r\n const handleSubmit = async (key: TFieldType<T>, value?: TFieldValue, fieldConfig?: IFieldMenuConfig<T>) => {\r\n if (!value) return\r\n if (fieldConfig?.singleValue || fieldConfig?.replaceValue) {\r\n filterActions.replaceFilter(key, value, { logic: value.logic })\r\n } else {\r\n filterActions.upsertManyFilter(key, value, { logic: value.logic })\r\n }\r\n if (config?.closeAfterSubmit !== false && fieldConfig?.closeAfterSubmit !== false) {\r\n handleClose()\r\n }\r\n }\r\n\r\n const data = useMemo(() => {\r\n const keys = Object.values(mergedConfigs.fields)\r\n return Array.from(keys) as IFieldMenuConfig<T>[]\r\n }, [mergedConfigs.fields])\r\n\r\n const renderContent = () => {\r\n if (data.length === 0) {\r\n return <FilterMenuNoField onClose={handleClose} />\r\n }\r\n const currentConfig = fieldSelected ? mergedConfigs.fields[fieldSelected] : undefined\r\n\r\n if (fieldSelected && currentConfig) {\r\n const FormComponent = formInputMaps[fieldSelected] as React.ComponentType<IFilterMenuFormProps<T>>\r\n if (!FormComponent) return null\r\n\r\n const config: IFieldMenuConfig<T> = { ...currentConfig }\r\n // Remove FormComponent from config before passing to form, as it's not needed there and can cause unnecessary re-renders\r\n if (config?.FormComponent) delete config.FormComponent\r\n\r\n const value = context.filterState.storeFilter?.[fieldSelected]\r\n return (\r\n <FormComponent\r\n currentConfig={config}\r\n value={value}\r\n isLoading={context.isLoading}\r\n onRemove={filterActions.removeFilterByFieldValue}\r\n validator={validateMaps[fieldSelected]}\r\n onSubmit={handleSubmit}\r\n onClose={handleClose}\r\n onRemoveField={(f) => filterActions.removeFilter(f)}\r\n onBack={() => setFieldSelected(null)}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <PopperContent title='Filter by' onClose={handleClose}>\r\n <PopperBody disableGutter>\r\n <MenuListCustom className={classes.menu}>\r\n {data.map((item) => {\r\n const key = item.field.toString()\r\n if (!key) return null\r\n const info = filterActions.getFieldInfo(item.field)\r\n const note = info?.values.join(', ') ?? ''\r\n const fieldCount = info ? info.values.length : 0\r\n const suffix = fieldCount > 0 ? ` (${fieldCount})` : ''\r\n const label = item.label ?? key.toString()\r\n let tooltipTitle = fieldCount > 0 ? `Filter by ${label}: ${note}` : undefined\r\n if (item.field === KeySpecial.quickSearch) {\r\n tooltipTitle = getQuickSearchTooltip(quickSearchHint)\r\n } else if (item.tooltip) {\r\n const tooltip = typeof item.tooltip === 'function' ? item.tooltip(info?.values) : item.tooltip\r\n tooltipTitle = (info?.values.length ?? 0) > 0 ? tooltip : undefined\r\n }\r\n return (\r\n <MenuItem\r\n key={key}\r\n className={classes.menuItem}\r\n sx={{ justifyContent: 'flex-start' }}\r\n onClick={() => handleMenuItemClick(item.field)}\r\n >\r\n <Tooltip title={tooltipTitle} placement='right' arrow>\r\n <div className={classes.menuItemInner}>\r\n {item.before || null}\r\n <Typography variant='body2' sx={{ flex: 1 }}>\r\n {label}\r\n </Typography>\r\n <Typography variant='caption' sx={{ ml: 1, color: 'text.secondary' }}>\r\n {suffix}\r\n </Typography>\r\n {item.after || null}\r\n </div>\r\n </Tooltip>\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button color='error' disabled={filterCount === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n )\r\n }\r\n\r\n const filterCount = filterActions.getTotalCount()\r\n const iconTitle = `${filterCount} Filter${filterCount !== 1 ? 's' : ''}`\r\n return (\r\n <ClickAwayListener onClickAway={handleClose}>\r\n <FilterInputStyled className={classes.root} {...mergedSlots.rootProps}>\r\n <Tooltip title={iconTitle} arrow placement='top'>\r\n <IconButton size='small' ref={refButton} onClick={handleOpen}>\r\n <Badge badgeContent={filterCount} color='primary' invisible={filterCount === 0}>\r\n <FilterListIcon fontSize='small' />\r\n </Badge>\r\n </IconButton>\r\n </Tooltip>\r\n <PopperCustom open={isOpen} anchorEl={anchorEl} placement='bottom' transition disablePortal {...mergedSlots.popperProps}>\r\n {renderContent()}\r\n </PopperCustom>\r\n </FilterInputStyled>\r\n </ClickAwayListener>\r\n )\r\n }\r\n return FilterMenu\r\n}\r\n// #endregion\r\n\r\n// #region styles\r\n/** CSS class names used by the `FilterMenu` component for external style overrides. */\r\nexport const filterMenuClasses = {\r\n root: 'DinoFilterMenu-root',\r\n input: 'DinoFilterMenu-input',\r\n beforeInput: 'DinoFilterMenu-beforeInput',\r\n menu: 'DinoFilterMenu-menu',\r\n menuItem: 'DinoFilterMenu-menuItem',\r\n menuItemInner: 'DinoFilterMenu-menuItemInner'\r\n}\r\n\r\nconst FilterInputStyled = styled(Box)({\r\n [`&.${filterMenuClasses.root}`]: {\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: '0 0 auto'\r\n }\r\n})\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n [`.${filterMenuClasses.menuItem}`]: { paddingTop: 0, paddingBottom: 0 },\r\n [`.${filterMenuClasses.menuItemInner}`]: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '4px',\r\n paddingTop: '6px',\r\n paddingBottom: '6px'\r\n }\r\n})\r\n// #endregion\r\n"],"names":["getQuickSearchTooltip","currentHint","defaultHint","mapSpecialTexts","qsTooltip","createFilterMenu","config","classes","filterMenuClasses","mergedConfigs","fields","validation","_config$enableQuickSe","enableQuickSearch","rest","_objectWithoutProperties","_excluded","qsKey","KeySpecial","quickSearch","mergedFields","_objectSpread","item","quiclkSearchConfig","field","label","mapSpecialLabel","singleValue","description","quickSearchHint","temp","Object","assign","keys","finalFields","reduce","acc","key","fieldConfig","mergedValidation","forEach","_ref","_item$label","_mergedFields$key","toString","Rules","some","r","rule","SingleRuleValidate","Required","push","generateConfigs","validateMaps","_config$validation","fieldKey","FormValidator","_defineProperty","generateValidatorMap","formInputMaps","_fieldConfig$FormComp","FormComponent","createFormFieldString","generateFormInputMap","props","refButton","createRef","_useState","useState","_useState2","_slicedToArray","anchorEl","setAnchorEl","isOpen","Boolean","context","useContext","FilterBarContext","filterActions","useFilterActions","_useState3","_useState4","fieldSelected","setFieldSelected","mergedSlots","useMemo","popperProps","rootProps","slots","handleClose","setTimeout","handleClearAll","clearAllFilters","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","value","w","_context","n","a","replaceValue","replaceFilter","logic","upsertManyFilter","closeAfterSubmit","_x","_x2","_x3","apply","this","arguments","data","values","Array","from","filterCount","getTotalCount","iconTitle","concat","_jsx","ClickAwayListener","onClickAway","children","_jsxs","FilterInputStyled","className","root","Tooltip","title","arrow","placement","IconButton","size","ref","onClick","current","Badge","badgeContent","color","invisible","FilterListIcon","fontSize","PopperCustom","open","transition","disablePortal","length","FilterMenuNoField","onClose","currentConfig","undefined","_context$filterState$","filterState","storeFilter","isLoading","onRemove","removeFilterByFieldValue","validator","onSubmit","onRemoveField","f","removeFilter","onBack","PopperContent","PopperBody","disableGutter","MenuListCustom","menu","map","_info$values$join","_item$label2","info","getFieldInfo","note","join","fieldCount","suffix","tooltipTitle","tooltip","_info$values$length","MenuItem","menuItem","sx","justifyContent","menuItemInner","before","Typography","variant","flex","ml","after","PopperFooter","Button","disabled","renderContent","styled","Box","display","alignItems","MenuList","paddingTop","paddingBottom","width","gap"],"mappings":"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"}
@@ -1,10 +1,14 @@
1
- import type { ComponentType } from 'react';
1
+ import type { ComponentType, ReactNode } from 'react';
2
2
  import type { BoxProps, PopperProps } from '@mui/material';
3
3
  import type { FormValidator, IFormValidatorConfig } from '../../form/validator';
4
4
  import type { TFieldModelValid, TFieldType, TFieldValid, TFieldValue, TLogic } from '../types';
5
5
  export interface IFieldMenuConfig<T> {
6
+ /** The field this menu config applies to. Should be unique across all configs in the same menu. */
6
7
  field: TFieldType<T>;
8
+ /** Label for the field, shown in the menu and chip viewers. Defaults to the field name if not provided. */
7
9
  label?: string;
10
+ /** Optional description for the field, shown as a subtitle in the menu and as tooltip in chip viewers */
11
+ description?: string;
8
12
  /** If true, the form will only allow a single value to be added for the field */
9
13
  singleValue?: boolean;
10
14
  /** If true, the form will replace the existing value with the new value */
@@ -19,6 +23,10 @@ export interface IFieldMenuConfig<T> {
19
23
  tooltip?: string | ((values?: TFieldValid[]) => string);
20
24
  /** Default form component for the field is `String` */
21
25
  FormComponent?: ComponentType<IFilterMenuFormProps<T>>;
26
+ /** Element to render before the form component */
27
+ before?: ReactNode;
28
+ /** Element to render after the form component */
29
+ after?: ReactNode;
22
30
  }
23
31
  export type TFieldMenuConfigs<T> = Partial<Record<TFieldType<T>, Omit<IFieldMenuConfig<T>, 'field'>>>;
24
32
  export type TFieldMenuConfigsInternal<T> = Partial<Record<TFieldType<T>, IFieldMenuConfig<T>>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.2.21",
3
+ "version": "2.2.22",
4
4
  "description": "Dinocollab core - libraries for building collaborative applications with React 18",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",