@lobehub/ui 5.62.1 → 5.63.1
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.
- package/es/ThemeProvider/GlobalStyle/essential.mjs +12 -0
- package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -1
- package/es/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/Pagination/Pagination.mjs +20 -3
- package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
- package/es/base-ui/Pagination/style.mjs +47 -3
- package/es/base-ui/Pagination/style.mjs.map +1 -1
- package/es/base-ui/ProTable/FieldControl.mjs +10 -3
- package/es/base-ui/ProTable/FieldControl.mjs.map +1 -1
- package/es/base-ui/ProTable/LightFilter.mjs +6 -3
- package/es/base-ui/ProTable/LightFilter.mjs.map +1 -1
- package/es/base-ui/ProTable/ProTable.d.mts +4 -5
- package/es/base-ui/ProTable/ProTable.mjs +38 -31
- package/es/base-ui/ProTable/ProTable.mjs.map +1 -1
- package/es/base-ui/ProTable/SearchForm.mjs +59 -6
- package/es/base-ui/ProTable/SearchForm.mjs.map +1 -1
- package/es/base-ui/ProTable/index.d.mts +3 -2
- package/es/base-ui/ProTable/index.mjs +3 -1
- package/es/base-ui/ProTable/locale.d.mts +18 -0
- package/es/base-ui/ProTable/locale.mjs +68 -0
- package/es/base-ui/ProTable/locale.mjs.map +1 -0
- package/es/base-ui/ProTable/style.mjs +38 -0
- package/es/base-ui/ProTable/style.mjs.map +1 -1
- package/es/base-ui/ProTable/type.d.mts +66 -10
- package/es/base-ui/ProTable/useColumnRequest.mjs +61 -0
- package/es/base-ui/ProTable/useColumnRequest.mjs.map +1 -0
- package/es/base-ui/ProTable/useFetchData.mjs.map +1 -1
- package/es/base-ui/Select/Select.mjs +3 -1
- package/es/base-ui/Select/Select.mjs.map +1 -1
- package/es/base-ui/Select/hooks.mjs +8 -4
- package/es/base-ui/Select/hooks.mjs.map +1 -1
- package/es/base-ui/Select/type.d.mts +7 -0
- package/es/base-ui/Table/Table.mjs +3 -1
- package/es/base-ui/Table/Table.mjs.map +1 -1
- package/es/base-ui/Table/style.mjs +173 -28
- package/es/base-ui/Table/style.mjs.map +1 -1
- package/es/base-ui/Text/style.d.mts +1 -1
- package/es/dashboard/ConsoleNav/style.mjs +2 -2
- package/es/dashboard/ConsoleNav/style.mjs.map +1 -1
- package/es/dashboard/FilterSidebar/style.mjs +2 -2
- package/es/dashboard/FilterSidebar/style.mjs.map +1 -1
- package/es/dashboard/FilterStrip/style.mjs +1 -1
- package/es/dashboard/FilterStrip/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/style.mjs +1 -1
- package/es/dashboard/MetricStrip/style.mjs.map +1 -1
- package/es/dashboard/PageSkeleton/style.mjs +2 -1
- package/es/dashboard/PageSkeleton/style.mjs.map +1 -1
- package/es/dashboard/Surface/Surface.mjs +1 -2
- package/es/dashboard/Surface/Surface.mjs.map +1 -1
- package/es/dashboard/Surface/link.d.mts +1 -1
- package/es/dashboard/Surface/link.mjs +1 -1
- package/es/dashboard/Surface/link.mjs.map +1 -1
- package/es/dashboard/Surface/style.d.mts +14 -8
- package/es/dashboard/Surface/style.mjs +25 -20
- package/es/dashboard/Surface/style.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.mjs","names":["tableMessages","RcVirtualTable"],"sources":["../../../src/base-ui/Table/Table.tsx"],"sourcesContent":["'use client';\n\nimport RcTable, {\n type ColumnsType as RcColumnsType,\n convertChildrenToColumns,\n EXPAND_COLUMN,\n type ExpandableConfig as RcExpandableConfig,\n INTERNAL_HOOKS,\n type Reference as RcReference,\n Summary,\n VirtualTable as RcVirtualTable,\n} from '@rc-component/table';\nimport { cx } from 'antd-style';\nimport { ArrowDownFromLine, ArrowUpDown, ArrowUpToLine, Inbox } from 'lucide-react';\nimport {\n type HTMLAttributes,\n type Key,\n memo,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Pagination, { type PaginationAlign } from '@/base-ui/Pagination';\nimport Spin from '@/base-ui/Spin';\nimport Tooltip from '@/base-ui/Tooltip';\nimport Empty from '@/Empty';\nimport { useEventCallback } from '@/hooks/useEventCallback';\nimport tableMessages from '@/i18n/resources/en/table';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport Column from './Column';\nimport ColumnGroup from './ColumnGroup';\nimport {\n assertColumnKeys,\n fillColumns,\n flattenColumns,\n getColumnId,\n getColumnPos,\n isColumnGroup,\n isColumnVisibleAt,\n renderColumnTitle,\n} from './columnUtils';\nimport renderExpandIcon from './ExpandIcon';\nimport FilterDropdown, { TableMeasureRowContext } from './FilterDropdown';\nimport TableLoadingSkeleton from './LoadingSkeleton';\nimport {\n isPlainObject,\n SELECTION_ALL,\n SELECTION_COLUMN,\n SELECTION_INVERT,\n SELECTION_NONE,\n} from './selectionUtils';\nimport { normalizeClassNames, normalizeStyles, resolveSemantic } from './semantic';\nimport {\n EXPAND_COLUMN_WIDTH,\n PREFIX_CLS,\n SELECTION_COLUMN_WIDTH,\n SELECTION_DROPDOWN_WIDTH,\n styles,\n} from './style';\nimport type {\n SortOrder,\n TableColumn,\n TableColumnType,\n TableLocale,\n TableProps,\n TableRef,\n TableScrollToConfig,\n TableSize,\n TableSorterTooltipProps,\n} from './type';\nimport { useBreakpoint } from './useBreakpoint';\nimport { useSelection } from './useSelection';\nimport { DEFAULT_SORT_DIRECTIONS, getMultiplePriority, getNextSortOrder } from './useSorter';\nimport { useTableState } from './useTableState';\n\nconst EMPTY_DATA: any[] = [];\nconst DEFAULT_INDENT_SIZE = 15;\nconst DEFAULT_SORTER_TOOLTIP: TableSorterTooltipProps = { target: 'full-header' };\n\n/**\n * Estimated `virtual` row height per size, like antd: padding × 2 + 14px × 22/14 line + 1px border.\n * rc-virtual-list still measures the real rows; this only seeds the scroll range.\n */\nconst VIRTUAL_ROW_HEIGHT: Record<TableSize, number> = {\n large: 16 * 2 + 22 + 1,\n medium: 12 * 2 + 22 + 1,\n middle: 12 * 2 + 22 + 1,\n small: 8 * 2 + 22 + 1,\n};\n\nconst sizeClassName: Record<TableSize, string> = {\n large: styles.sizeLarge,\n medium: styles.sizeMedium,\n middle: styles.sizeMedium,\n small: styles.sizeSmall,\n};\n\nconst sortTipOf = (next: SortOrder | undefined, locale: TableLocale) =>\n next === 'descend'\n ? locale.triggerDesc\n : next === 'ascend'\n ? locale.triggerAsc\n : locale.cancelSort;\n\nconst ariaSortOf = (order: SortOrder | undefined) =>\n order === 'ascend' ? 'ascending' : order === 'descend' ? 'descending' : 'none';\n\nconst paginationAlignClassName: Record<PaginationAlign, string> = {\n center: styles.paginationCenter,\n end: styles.paginationEnd,\n start: styles.paginationStart,\n};\n\n/** antd `normalizePlacement`: `topLeft` / `bottomStart` → `start`, `*Center` → `center`, else `end`. */\nconst normalizePlacement = (placement: string): PaginationAlign => {\n const lower = placement.toLowerCase();\n if (lower.includes('center')) return 'center';\n return lower.includes('left') || lower.includes('start') ? 'start' : 'end';\n};\n\n// Only a static filter trigger renders in rc-table's hidden measure row, like antd.\nconst wrapMeasureRow = (measureRow: ReactNode) => (\n <TableMeasureRowContext value={true}>{measureRow}</TableMeasureRowContext>\n);\n\n/** antd's ref shape: the root element itself, extended with `nativeElement` and `scrollTo`. */\nconst toTableRef = (\n element: HTMLDivElement,\n scrollTo: (config: TableScrollToConfig) => void,\n): TableRef => {\n const extra = { nativeElement: element, scrollTo };\n return new Proxy(element, {\n get(target, prop) {\n if (prop in extra) return extra[prop as keyof typeof extra];\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n }) as TableRef;\n};\n\nlet warnedBordered = false;\n\n/** `bordered` (pre-5.61) → `variant`: `true` is `outlined`; an explicit `variant` wins. */\nexport const resolveTableVariant = (\n variant: TableProps<unknown>['variant'],\n bordered: boolean | undefined,\n): NonNullable<TableProps<unknown>['variant']> => {\n if (bordered !== undefined && process.env.NODE_ENV !== 'production' && !warnedBordered) {\n warnedBordered = true;\n console.warn('[Table] `bordered` is deprecated. Please use `variant=\"outlined\"` instead.');\n }\n return variant ?? (bordered ? 'outlined' : 'borderless');\n};\n\nconst TableInner = <T,>(props: TableProps<T>) => {\n const {\n bordered,\n variant: variantProp,\n children,\n childrenColumnName: legacyChildrenColumnName,\n className,\n classNames,\n column: columnDefaults,\n columns: columnsProp,\n components,\n dataSource = EMPTY_DATA as T[],\n emptyText,\n expandable,\n expandedRowRender: legacyExpandedRowRender,\n expandIcon: legacyExpandIcon,\n expandIconColumnIndex: legacyExpandIconColumnIndex,\n footer,\n getPopupContainer,\n indentSize: legacyIndentSize,\n loading = false,\n locale,\n measureRowRender,\n onChange,\n onHeaderRow,\n onRow,\n onScroll,\n pagination,\n ref,\n rootClassName,\n rowClassName,\n rowHoverable = true,\n rowKey = 'key',\n rowSelection,\n scroll,\n showHeader,\n showSorterTooltip: tableShowSorterTooltip = DEFAULT_SORTER_TOOLTIP,\n size: sizeProp,\n sortDirections: tableSortDirections = DEFAULT_SORT_DIRECTIONS,\n sticky,\n style,\n styles: customStyles,\n summary,\n tableLayout,\n title,\n virtual,\n } = props;\n const variant = resolveTableVariant(variantProp, bordered);\n const size: TableSize = sizeProp ?? 'middle';\n\n // =============================== Locale ===============================\n const { t } = useTranslation(tableMessages);\n const tableLocale = useMemo(\n (): TableLocale => ({\n cancelSort: t('table.cancelSort'),\n collapse: t('table.collapse'),\n expand: t('table.expand'),\n filterCheckAll: t('table.filterCheckAll'),\n filterConfirm: t('table.filterConfirm'),\n filterEmptyText: t('table.filterEmptyText'),\n filterReset: t('table.filterReset'),\n filterSearchPlaceholder: t('table.filterSearchPlaceholder'),\n filterTitle: t('table.filterTitle'),\n selectAll: t('table.selectAll'),\n selectInvert: t('table.selectInvert'),\n selectNone: t('table.selectNone'),\n selectionAll: t('table.selectionAll'),\n sortTitle: t('table.sortTitle'),\n triggerAsc: t('table.triggerAsc'),\n triggerDesc: t('table.triggerDesc'),\n ...(locale?.filterCheckall !== undefined && { filterCheckAll: locale.filterCheckall }),\n ...locale,\n }),\n [t, locale],\n );\n\n // ============================ Semantic DOM ============================\n const semanticInfo = { props };\n const mergedClassNames = normalizeClassNames(resolveSemantic(classNames, semanticInfo));\n const mergedStyles = normalizeStyles(resolveSemantic(customStyles, semanticInfo));\n\n const rawColumns = useMemo(\n () => columnsProp ?? (convertChildrenToColumns(children) as TableColumn<T>[]),\n [columnsProp, children],\n );\n const columns = useMemo(\n () => fillColumns(rawColumns, columnDefaults),\n [rawColumns, columnDefaults],\n );\n\n assertColumnKeys(columns);\n\n const needResponsive = useMemo(\n () => flattenColumns(columns).some(({ column }) => column.responsive),\n [columns],\n );\n const screens = useBreakpoint(needResponsive);\n\n // ============================= Expandable =============================\n const hasRowSelection = Boolean(rowSelection);\n const childrenColumnName =\n expandable?.childrenColumnName ?? legacyChildrenColumnName ?? 'children';\n const expandType = useMemo(() => {\n if (dataSource.some((record) => isPlainObject(record) && record[childrenColumnName])) {\n return 'nest';\n }\n if (legacyExpandedRowRender || expandable?.expandedRowRender) return 'row';\n return null;\n }, [childrenColumnName, dataSource, legacyExpandedRowRender, expandable?.expandedRowRender]);\n\n // Like antd: legacy top-level props sit under `expandable`, which always wins.\n const mergedExpandable = useMemo((): RcExpandableConfig<any> => {\n const config: RcExpandableConfig<any> = {\n childrenColumnName: legacyChildrenColumnName,\n expandedRowRender: legacyExpandedRowRender,\n expandIconColumnIndex: legacyExpandIconColumnIndex,\n ...(expandable as RcExpandableConfig<any>),\n expandIcon: (expandable?.expandIcon ??\n legacyExpandIcon ??\n ((iconProps: any) => renderExpandIcon(iconProps, tableLocale))) as any,\n };\n // Like antd: tree toggles sit after the selection column; legacy indexes skip it.\n if (expandType === 'nest' && config.expandIconColumnIndex === undefined) {\n config.expandIconColumnIndex = hasRowSelection ? 1 : 0;\n } else if ((config.expandIconColumnIndex ?? 0) > 0 && hasRowSelection) {\n config.expandIconColumnIndex = config.expandIconColumnIndex! - 1;\n }\n // Virtual rows are flex boxes sized from numeric widths; the CSS `col` width never reaches them.\n if (virtual && config.columnWidth === undefined) config.columnWidth = EXPAND_COLUMN_WIDTH;\n if (typeof config.indentSize !== 'number') {\n config.indentSize =\n typeof legacyIndentSize === 'number' ? legacyIndentSize : DEFAULT_INDENT_SIZE;\n }\n return config;\n }, [\n expandable,\n legacyChildrenColumnName,\n legacyExpandedRowRender,\n legacyExpandIcon,\n legacyExpandIconColumnIndex,\n legacyIndentSize,\n expandType,\n hasRowSelection,\n virtual,\n tableLocale,\n ]);\n\n // ================================ Refs ================================\n const rootRef = useRef<HTMLDivElement>(null);\n const rcRef = useRef<RcReference>(null);\n useImperativeHandle(\n ref as Ref<TableRef>,\n () => toTableRef(rootRef.current!, (config) => rcRef.current?.scrollTo(config)),\n [],\n );\n\n // ======================== Sort / Filter / Page ========================\n const state = useTableState({\n childrenColumnName,\n columns,\n dataSource,\n onChange,\n // Like antd: on by default once `scroll` is set.\n onTableChange: () => {\n if (scroll && scroll.scrollToFirstRowOnChange !== false) rcRef.current?.scrollTo({ top: 0 });\n },\n pagination,\n });\n const {\n config: paginationConfig,\n data: allRows,\n filterStates,\n page,\n sortStates,\n titleProps,\n } = state;\n const { pageIndex, pageSize } = page;\n const { total } = state;\n\n // Like antd: async data (fewer rows than `total`, at most one page) is shown as given.\n const rows = useMemo(() => {\n if (pagination === false) return allRows;\n if (allRows.length < total && allRows.length <= pageSize) return allRows;\n return allRows.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize);\n }, [allRows, pagination, pageIndex, pageSize, total]);\n\n // ============================== Selection ==============================\n const getRowKey = useMemo(\n () =>\n typeof rowKey === 'function'\n ? rowKey\n : (record: T) => (record as Record<PropertyKey, unknown>)?.[rowKey as PropertyKey] as Key,\n [rowKey],\n );\n const recordMap = useMemo(() => {\n const map = new Map<Key, T>();\n const dig = (records: readonly T[]) => {\n records.forEach((record, index) => {\n map.set(getRowKey(record, index), record);\n const children = isPlainObject(record) ? record[childrenColumnName] : undefined;\n if (Array.isArray(children)) dig(children as T[]);\n });\n };\n dig(dataSource);\n return map;\n }, [dataSource, childrenColumnName, getRowKey]);\n const getRecordByKey = useCallback((key: Key) => recordMap.get(key), [recordMap]);\n // Same as the expand column: give virtual rows the selection column's CSS width as a number.\n const mergedRowSelection = useMemo(() => {\n if (!virtual || !rowSelection || rowSelection.columnWidth !== undefined) return rowSelection;\n const withDropdown = Boolean(rowSelection.selections) && rowSelection.type !== 'radio';\n return {\n ...rowSelection,\n columnWidth:\n SELECTION_COLUMN_WIDTH +\n (withDropdown ? SELECTION_DROPDOWN_WIDTH : 0) +\n (variant === 'outlined' ? 16 : 0),\n };\n }, [virtual, rowSelection, variant]);\n const [transformSelectionColumns, selectedKeySet] = useSelection<T>(\n {\n childrenColumnName,\n data: allRows,\n expandType,\n getRecordByKey,\n getRowKey,\n locale: tableLocale,\n pageData: rows,\n },\n mergedRowSelection,\n );\n const mergedRowClassName = useCallback(\n (record: T, index: number, indent: number) =>\n cx(\n selectedKeySet.has(getRowKey(record, index)) && `${PREFIX_CLS}-row-selected`,\n typeof rowClassName === 'function' ? rowClassName(record, index, indent) : rowClassName,\n ),\n [selectedKeySet, getRowKey, rowClassName],\n );\n\n const clientPaginated = pagination !== false && paginationConfig?.total === undefined;\n const syncClampedPage = useEventCallback(() => state.clampPage(pageIndex));\n\n useEffect(() => {\n if (clientPaginated && pageIndex !== state.rawPageIndex) syncClampedPage();\n }, [clientPaginated, pageIndex, state.rawPageIndex, syncClampedPage]);\n\n // ============================== Loading ===============================\n const {\n spinning: isLoading = true,\n tip,\n variant: spinVariant = 'network',\n ...spinRest\n } = typeof loading === 'object' ? loading : { spinning: loading };\n const spinProps = { variant: spinVariant, ...spinRest };\n\n // =============================== Columns ==============================\n const triggerSort = useEventCallback(state.triggerSort);\n const triggerFilter = useEventCallback(state.triggerFilter);\n\n const rcColumns = useMemo(() => {\n const transform = (list: readonly TableColumn<T>[], parentPos?: string): RcColumnsType<any> =>\n list.flatMap((column, index) => {\n // The placeholders must reach rc-table by identity.\n if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return [column];\n // Positions (and so fallback ids) come from the full tree, before responsive filtering.\n const pos = getColumnPos(index, parentPos);\n if (!isColumnVisibleAt(column, screens)) return [];\n\n const id = getColumnId(column, pos);\n const {\n defaultFilteredValue: _defaultFilteredValue,\n defaultSortOrder: _defaultSortOrder,\n filterDropdown,\n filterDropdownOpen: _filterDropdownOpen,\n filterDropdownProps: _filterDropdownProps,\n filtered: _filtered,\n filteredValue: _filteredValue,\n filterIcon: _filterIcon,\n filterMode: _filterMode,\n filterMultiple: _filterMultiple,\n filterOnClose: _filterOnClose,\n filterResetToDefaultFilteredValue: _filterResetToDefaultFilteredValue,\n filters: columnFilters,\n filterSearch: _filterSearch,\n onFilter: _onFilter,\n onFilterDropdownOpenChange: _onFilterDropdownOpenChange,\n onHeaderCell,\n responsive: _responsive,\n showSorterTooltip: columnShowSorterTooltip,\n sortDirections: columnSortDirections,\n sortIcon,\n sortOrder: _sortOrder,\n sorter,\n title: columnTitle,\n ...rest\n } = column as TableColumnType<T>;\n const order = sorter ? sortStates.find(({ key }) => key === id)?.sortOrder : undefined;\n\n const titleNode = renderColumnTitle(columnTitle, titleProps);\n const titleText =\n typeof titleNode === 'string' || typeof titleNode === 'number'\n ? String(titleNode)\n : undefined;\n // A single-text wrapper lets rc-table derive the header `title` and truncate it.\n const titleContent = column.ellipsis ? (\n <span className={cx(styles.columnTitle, `${PREFIX_CLS}-column-title`)}>{titleNode}</span>\n ) : (\n titleNode\n );\n\n const filterNode =\n columnFilters || filterDropdown ? (\n <FilterDropdown<T>\n column={column as TableColumnType<T>}\n columnKey={id}\n filterState={filterStates.find(({ key }) => key === id)}\n getPopupContainer={getPopupContainer}\n label={titleText ?? id}\n locale={tableLocale}\n triggerFilter={triggerFilter}\n />\n ) : null;\n const hasControls = Boolean(sorter) || Boolean(filterNode);\n\n let sorterNode: ReactNode = null;\n if (sorter) {\n const sortDirections = columnSortDirections ?? tableSortDirections;\n const nextOrder = getNextSortOrder(sortDirections, order);\n const showTooltip = columnShowSorterTooltip ?? tableShowSorterTooltip;\n const { target, ...tooltipOptions } =\n typeof showTooltip === 'object' ? showTooltip : ({} as TableSorterTooltipProps);\n const tooltipProps = { title: sortTipOf(nextOrder, tableLocale), ...tooltipOptions };\n const withTooltip = (node: ReactNode) => <Tooltip {...tooltipProps}>{node}</Tooltip>;\n\n const iconOnlyTooltip = Boolean(showTooltip) && target === 'sorter-icon';\n const onSort = () =>\n triggerSort({\n column,\n key: id,\n multiplePriority: getMultiplePriority(column),\n sortOrder: nextOrder,\n });\n // ActionIcon owns the click (same as the filter trigger). The title stays a plain\n // span so we never nest a button inside a button; clicking the title still sorts.\n const sortAction = (\n <ActionIcon\n active={Boolean(order)}\n className={cx(styles.sortCaret, `${PREFIX_CLS}-column-sorter`)}\n data-order={order ?? undefined}\n size=\"small\"\n icon={\n sortIcon\n ? sortIcon({ sortOrder: order ?? null })\n : order === 'ascend'\n ? ArrowUpToLine\n : order === 'descend'\n ? ArrowDownFromLine\n : ArrowUpDown\n }\n {...(iconOnlyTooltip && showTooltip\n ? { title: tooltipProps.title, tooltipProps: tooltipOptions }\n : {})}\n onClick={(event) => {\n event.stopPropagation();\n onSort();\n }}\n />\n );\n const group = (\n <span\n className={cx(styles.sortButton, `${PREFIX_CLS}-column-sorters`)}\n // Without a tooltip, the native title still says the header sorts.\n title={showTooltip ? undefined : tableLocale.sortTitle}\n >\n <span className={styles.sortTitle} onClick={onSort}>\n {titleContent}\n </span>\n {sortAction}\n </span>\n );\n sorterNode = showTooltip && !iconOnlyTooltip ? withTooltip(group) : group;\n }\n\n return {\n ...rest,\n className: cx(\n rest.className,\n order ? [`${PREFIX_CLS}-column-sort`, styles.sortedColumn] : undefined,\n ),\n children: isColumnGroup(column) ? transform(column.children, pos) : undefined,\n key: id,\n onHeaderCell: () => {\n const cell = onHeaderCell?.(column);\n return {\n ...(sorter && { 'aria-sort': ariaSortOf(order) }),\n ...(column.ellipsis && hasControls && titleText && { title: titleText }),\n ...cell,\n className: cx(sorter && `${PREFIX_CLS}-column-has-sorters`, cell?.className),\n };\n },\n title: hasControls ? (\n <span className={styles.headerInner}>\n {sorterNode ?? titleContent}\n {filterNode}\n </span>\n ) : (\n titleContent\n ),\n };\n }) as RcColumnsType<any>;\n\n return transform(columns);\n }, [\n columns,\n screens,\n sortStates,\n filterStates,\n titleProps,\n getPopupContainer,\n triggerFilter,\n triggerSort,\n tableSortDirections,\n tableShowSorterTooltip,\n tableLocale,\n ]);\n\n // ============================== Rows ==============================\n const mergedOnRow = useMemo(\n () =>\n (record: T, index?: number): HTMLAttributes<HTMLElement> => {\n const rowProps = onRow?.(record, index ?? 0) ?? {};\n return {\n ...rowProps,\n className: cx(rowProps.onClick && styles.clickable, rowProps.className),\n };\n },\n [onRow],\n );\n\n // antd defaults to `fixed` layout once a column is pinned; `max-content` keeps sizing to content.\n const hasFixedColumn = useMemo(\n () =>\n Boolean(rowSelection?.fixed) ||\n flattenColumns(columns).some(({ column }) => column.fixed && !column.hidden),\n [columns, rowSelection?.fixed],\n );\n const mergedTableLayout =\n tableLayout ?? (hasFixedColumn && scroll?.x !== 'max-content' ? 'fixed' : undefined);\n\n // ============================= Pagination =============================\n let topPagination: ReactNode = null;\n let bottomPagination: ReactNode = null;\n if (paginationConfig && total > 0) {\n const {\n current: _current,\n defaultCurrent: _defaultCurrent,\n defaultPageSize: _defaultPageSize,\n onChange: _onChange,\n onShowSizeChange: _onShowSizeChange,\n pageSize: _pageSize,\n placement,\n position,\n total: _total,\n className: paginationClassName,\n classNames: paginationClassNames,\n size: paginationSize,\n styles: paginationStyles,\n ...paginationRest\n } = paginationConfig;\n const pageCount = Math.ceil(total / pageSize);\n const renderPagination = (align: PaginationAlign, side: 'top' | 'bottom') => (\n <div\n className={cx(\n styles.pagination,\n side === 'top' && styles.paginationTop,\n paginationAlignClassName[align],\n `${PREFIX_CLS}-pagination-wrapper`,\n )}\n >\n <Pagination\n {...paginationRest}\n current={pageIndex + 1}\n pageSize={pageSize}\n // Like antd: `small` / `medium` tables get a small pager unless one is set.\n size={paginationSize ?? (sizeProp && sizeProp !== 'large' ? 'small' : undefined)}\n total={total}\n className={cx(\n `${PREFIX_CLS}-pagination`,\n `${PREFIX_CLS}-pagination-${align}`,\n paginationClassName,\n )}\n classNames={{\n item: cx(mergedClassNames.pagination.item, paginationClassNames?.item),\n root: cx(mergedClassNames.pagination.root, paginationClassNames?.root),\n }}\n styles={{\n item: { ...paginationStyles?.item, ...mergedStyles.pagination.item },\n root: { ...paginationStyles?.root, ...mergedStyles.pagination.root },\n }}\n onChange={(next, nextPageSize) =>\n state.onPaginationChange({ pageIndex: next - 1, pageSize: nextPageSize })\n }\n />\n </div>\n );\n\n if (!(paginationRest.hideOnSinglePage && pageCount <= 1)) {\n const mergedPlacement = placement ?? position;\n if (Array.isArray(mergedPlacement)) {\n const find = (side: string) =>\n (mergedPlacement as string[]).find((item) => item.includes(side));\n const top = find('top');\n const bottom = find('bottom');\n const none = mergedPlacement.every((item) => item === 'none');\n if (top) topPagination = renderPagination(normalizePlacement(top), 'top');\n if (bottom) bottomPagination = renderPagination(normalizePlacement(bottom), 'bottom');\n if (!top && !bottom && !none) bottomPagination = renderPagination('end', 'bottom');\n } else {\n bottomPagination = renderPagination('end', 'bottom');\n }\n }\n }\n\n // Like antd: `locale.emptyText` (here also the `emptyText` alias) replaces the default empty state.\n const customEmpty = locale?.emptyText ?? emptyText;\n const emptyNode = isLoading ? (\n <TableLoadingSkeleton\n columns={columns}\n expandColumn={Boolean(expandType)}\n rows={pagination === false ? 5 : Math.min(5, pageSize)}\n screens={screens}\n selectionColumn={hasRowSelection}\n size={size}\n />\n ) : customEmpty === undefined ? (\n <Empty description={t('table.emptyText')} icon={Inbox} imageSize={40} />\n ) : typeof customEmpty === 'function' ? (\n customEmpty()\n ) : (\n customEmpty\n );\n\n // Like antd: `virtual` swaps in rc-table's VirtualTable (rc-virtual-list body).\n const TableComponent = (virtual ? RcVirtualTable : RcTable) as typeof RcTable;\n\n return (\n <div\n ref={rootRef}\n style={{ ...mergedStyles.root, ...style }}\n className={cx(\n styles.root,\n `${PREFIX_CLS}-wrapper`,\n rootClassName,\n className,\n mergedClassNames.root,\n )}\n >\n {topPagination}\n <div className={styles.spinContainer} data-table-wrapper=\"\">\n <TableComponent<any>\n {...(virtual && { listItemHeight: VIRTUAL_ROW_HEIGHT[size] })}\n columns={rcColumns}\n components={components as any}\n data={rows as any[]}\n emptyText={emptyNode}\n expandable={mergedExpandable}\n footer={footer as any}\n internalHooks={INTERNAL_HOOKS}\n prefixCls={PREFIX_CLS}\n ref={rcRef}\n rowClassName={mergedRowClassName as any}\n rowHoverable={rowHoverable}\n rowKey={rowKey as string | ((record: T) => Key)}\n scroll={scroll}\n showHeader={showHeader}\n sticky={sticky}\n summary={summary as any}\n tableLayout={mergedTableLayout}\n title={title as any}\n transformColumns={transformSelectionColumns}\n className={cx(\n styles.table,\n sizeClassName[size],\n `${PREFIX_CLS}-${size === 'middle' ? 'medium' : size}`,\n variant === 'outlined' && styles.outlined,\n variant === 'filled' && styles.filled,\n `${PREFIX_CLS}-${variant}`,\n rowHoverable && styles.hoverable,\n )}\n classNames={{\n body: mergedClassNames.body,\n content: mergedClassNames.content,\n footer: mergedClassNames.footer,\n header: mergedClassNames.header,\n section: mergedClassNames.section,\n title: mergedClassNames.title,\n }}\n measureRowRender={(measureRow) =>\n wrapMeasureRow(measureRowRender ? measureRowRender(measureRow) : measureRow)\n }\n styles={{\n body: mergedStyles.body,\n content: mergedStyles.content,\n footer: mergedStyles.footer,\n header: mergedStyles.header,\n section: mergedStyles.section,\n title: mergedStyles.title,\n }}\n onHeaderRow={onHeaderRow as any}\n onRow={mergedOnRow as any}\n onScroll={onScroll}\n />\n {isLoading && (\n <div className={styles.loading} data-table-loading=\"\">\n <Spin {...spinProps} />\n {tip}\n </div>\n )}\n </div>\n {bottomPagination}\n </div>\n );\n};\n\ntype TableComponent = (<T>(props: TableProps<T>) => ReactNode) & {\n Column: typeof Column;\n ColumnGroup: typeof ColumnGroup;\n displayName?: string;\n /** Placeholder in `columns` marking where the expand column goes. */\n EXPAND_COLUMN: TableColumn<any>;\n /** `rowSelection.selections` preset: select every row of every page. */\n SELECTION_ALL: typeof SELECTION_ALL;\n /** Placeholder in `columns` marking where the selection column goes. */\n SELECTION_COLUMN: TableColumn<any>;\n /** Rows rendered by `summary`: `Table.Summary` (`fixed`), `.Row` and `.Cell` (`index`, `colSpan`). */\n Summary: typeof Summary;\n /** `rowSelection.selections` preset: invert the current page. */\n SELECTION_INVERT: typeof SELECTION_INVERT;\n /** `rowSelection.selections` preset: clear the selection. */\n SELECTION_NONE: typeof SELECTION_NONE;\n};\n\nconst Table = memo(TableInner) as unknown as TableComponent;\n\nTable.displayName = 'Table';\nTable.Column = Column;\nTable.ColumnGroup = ColumnGroup;\nTable.EXPAND_COLUMN = EXPAND_COLUMN as TableColumn<any>;\nTable.SELECTION_COLUMN = SELECTION_COLUMN;\nTable.SELECTION_ALL = SELECTION_ALL;\nTable.SELECTION_INVERT = SELECTION_INVERT;\nTable.SELECTION_NONE = SELECTION_NONE;\nTable.Summary = Summary;\n\nexport { TableInner };\n\nexport default Table;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.mjs","names":["tableMessages","RcVirtualTable"],"sources":["../../../src/base-ui/Table/Table.tsx"],"sourcesContent":["'use client';\n\nimport RcTable, {\n type ColumnsType as RcColumnsType,\n convertChildrenToColumns,\n EXPAND_COLUMN,\n type ExpandableConfig as RcExpandableConfig,\n INTERNAL_HOOKS,\n type Reference as RcReference,\n Summary,\n VirtualTable as RcVirtualTable,\n} from '@rc-component/table';\nimport { cx } from 'antd-style';\nimport { ArrowDownFromLine, ArrowUpDown, ArrowUpToLine, Inbox } from 'lucide-react';\nimport {\n type HTMLAttributes,\n type Key,\n memo,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Pagination, { type PaginationAlign } from '@/base-ui/Pagination';\nimport Spin from '@/base-ui/Spin';\nimport Tooltip from '@/base-ui/Tooltip';\nimport Empty from '@/Empty';\nimport { useEventCallback } from '@/hooks/useEventCallback';\nimport tableMessages from '@/i18n/resources/en/table';\nimport { useTranslation } from '@/i18n/useTranslation';\n\nimport Column from './Column';\nimport ColumnGroup from './ColumnGroup';\nimport {\n assertColumnKeys,\n fillColumns,\n flattenColumns,\n getColumnId,\n getColumnPos,\n isColumnGroup,\n isColumnVisibleAt,\n renderColumnTitle,\n} from './columnUtils';\nimport renderExpandIcon from './ExpandIcon';\nimport FilterDropdown, { TableMeasureRowContext } from './FilterDropdown';\nimport TableLoadingSkeleton from './LoadingSkeleton';\nimport {\n isPlainObject,\n SELECTION_ALL,\n SELECTION_COLUMN,\n SELECTION_INVERT,\n SELECTION_NONE,\n} from './selectionUtils';\nimport { normalizeClassNames, normalizeStyles, resolveSemantic } from './semantic';\nimport {\n EXPAND_COLUMN_WIDTH,\n PREFIX_CLS,\n SELECTION_COLUMN_WIDTH,\n SELECTION_DROPDOWN_WIDTH,\n styles,\n} from './style';\nimport type {\n SortOrder,\n TableColumn,\n TableColumnType,\n TableLocale,\n TableProps,\n TableRef,\n TableScrollToConfig,\n TableSize,\n TableSorterTooltipProps,\n} from './type';\nimport { useBreakpoint } from './useBreakpoint';\nimport { useSelection } from './useSelection';\nimport { DEFAULT_SORT_DIRECTIONS, getMultiplePriority, getNextSortOrder } from './useSorter';\nimport { useTableState } from './useTableState';\n\nconst EMPTY_DATA: any[] = [];\nconst DEFAULT_INDENT_SIZE = 15;\nconst DEFAULT_SORTER_TOOLTIP: TableSorterTooltipProps = { target: 'full-header' };\n\n/**\n * Estimated `virtual` row height per size, like antd: padding × 2 + 14px × 22/14 line + 1px border.\n * rc-virtual-list still measures the real rows; this only seeds the scroll range.\n */\nconst VIRTUAL_ROW_HEIGHT: Record<TableSize, number> = {\n large: 16 * 2 + 22 + 1,\n medium: 12 * 2 + 22 + 1,\n middle: 12 * 2 + 22 + 1,\n small: 8 * 2 + 22 + 1,\n};\n\nconst sizeClassName: Record<TableSize, string> = {\n large: styles.sizeLarge,\n medium: styles.sizeMedium,\n middle: styles.sizeMedium,\n small: styles.sizeSmall,\n};\n\nconst sortTipOf = (next: SortOrder | undefined, locale: TableLocale) =>\n next === 'descend'\n ? locale.triggerDesc\n : next === 'ascend'\n ? locale.triggerAsc\n : locale.cancelSort;\n\nconst ariaSortOf = (order: SortOrder | undefined) =>\n order === 'ascend' ? 'ascending' : order === 'descend' ? 'descending' : 'none';\n\nconst paginationAlignClassName: Record<PaginationAlign, string> = {\n center: styles.paginationCenter,\n end: styles.paginationEnd,\n start: styles.paginationStart,\n};\n\n/** antd `normalizePlacement`: `topLeft` / `bottomStart` → `start`, `*Center` → `center`, else `end`. */\nconst normalizePlacement = (placement: string): PaginationAlign => {\n const lower = placement.toLowerCase();\n if (lower.includes('center')) return 'center';\n return lower.includes('left') || lower.includes('start') ? 'start' : 'end';\n};\n\n// Only a static filter trigger renders in rc-table's hidden measure row, like antd.\nconst wrapMeasureRow = (measureRow: ReactNode) => (\n <TableMeasureRowContext value={true}>{measureRow}</TableMeasureRowContext>\n);\n\n/** antd's ref shape: the root element itself, extended with `nativeElement` and `scrollTo`. */\nconst toTableRef = (\n element: HTMLDivElement,\n scrollTo: (config: TableScrollToConfig) => void,\n): TableRef => {\n const extra = { nativeElement: element, scrollTo };\n return new Proxy(element, {\n get(target, prop) {\n if (prop in extra) return extra[prop as keyof typeof extra];\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n }) as TableRef;\n};\n\nlet warnedBordered = false;\n\n/** `bordered` (pre-5.61) → `variant`: `true` is `outlined`; an explicit `variant` wins. */\nexport const resolveTableVariant = (\n variant: TableProps<unknown>['variant'],\n bordered: boolean | undefined,\n): NonNullable<TableProps<unknown>['variant']> => {\n if (bordered !== undefined && process.env.NODE_ENV !== 'production' && !warnedBordered) {\n warnedBordered = true;\n console.warn('[Table] `bordered` is deprecated. Please use `variant=\"outlined\"` instead.');\n }\n return variant ?? (bordered ? 'outlined' : 'borderless');\n};\n\nconst TableInner = <T,>(props: TableProps<T>) => {\n const {\n bordered,\n variant: variantProp,\n children,\n childrenColumnName: legacyChildrenColumnName,\n className,\n classNames,\n column: columnDefaults,\n columns: columnsProp,\n components,\n dataSource = EMPTY_DATA as T[],\n emptyText,\n expandable,\n expandedRowRender: legacyExpandedRowRender,\n expandIcon: legacyExpandIcon,\n expandIconColumnIndex: legacyExpandIconColumnIndex,\n footer,\n getPopupContainer,\n indentSize: legacyIndentSize,\n loading = false,\n locale,\n measureRowRender,\n onChange,\n onHeaderRow,\n onRow,\n onScroll,\n pagination,\n ref,\n rootClassName,\n rowClassName,\n rowHoverable = true,\n rowKey = 'key',\n rowSelection,\n scroll,\n showHeader,\n showSorterTooltip: tableShowSorterTooltip = DEFAULT_SORTER_TOOLTIP,\n size: sizeProp,\n sortDirections: tableSortDirections = DEFAULT_SORT_DIRECTIONS,\n sticky,\n style,\n styles: customStyles,\n summary,\n tableLayout,\n title,\n virtual,\n } = props;\n const variant = resolveTableVariant(variantProp, bordered);\n const size: TableSize = sizeProp ?? 'middle';\n\n // =============================== Locale ===============================\n const { t } = useTranslation(tableMessages);\n const tableLocale = useMemo(\n (): TableLocale => ({\n cancelSort: t('table.cancelSort'),\n collapse: t('table.collapse'),\n expand: t('table.expand'),\n filterCheckAll: t('table.filterCheckAll'),\n filterConfirm: t('table.filterConfirm'),\n filterEmptyText: t('table.filterEmptyText'),\n filterReset: t('table.filterReset'),\n filterSearchPlaceholder: t('table.filterSearchPlaceholder'),\n filterTitle: t('table.filterTitle'),\n selectAll: t('table.selectAll'),\n selectInvert: t('table.selectInvert'),\n selectNone: t('table.selectNone'),\n selectionAll: t('table.selectionAll'),\n sortTitle: t('table.sortTitle'),\n triggerAsc: t('table.triggerAsc'),\n triggerDesc: t('table.triggerDesc'),\n ...(locale?.filterCheckall !== undefined && { filterCheckAll: locale.filterCheckall }),\n ...locale,\n }),\n [t, locale],\n );\n\n // ============================ Semantic DOM ============================\n const semanticInfo = { props };\n const mergedClassNames = normalizeClassNames(resolveSemantic(classNames, semanticInfo));\n const mergedStyles = normalizeStyles(resolveSemantic(customStyles, semanticInfo));\n\n const rawColumns = useMemo(\n () => columnsProp ?? (convertChildrenToColumns(children) as TableColumn<T>[]),\n [columnsProp, children],\n );\n const columns = useMemo(\n () => fillColumns(rawColumns, columnDefaults),\n [rawColumns, columnDefaults],\n );\n\n assertColumnKeys(columns);\n /** Multi-level headers get column dividers; plain tables never do. */\n const grouped = useMemo(\n () =>\n columns.some(\n (column) => Array.isArray((column as any).children) && (column as any).children.length > 0,\n ),\n [columns],\n );\n\n const needResponsive = useMemo(\n () => flattenColumns(columns).some(({ column }) => column.responsive),\n [columns],\n );\n const screens = useBreakpoint(needResponsive);\n\n // ============================= Expandable =============================\n const hasRowSelection = Boolean(rowSelection);\n const childrenColumnName =\n expandable?.childrenColumnName ?? legacyChildrenColumnName ?? 'children';\n const expandType = useMemo(() => {\n if (dataSource.some((record) => isPlainObject(record) && record[childrenColumnName])) {\n return 'nest';\n }\n if (legacyExpandedRowRender || expandable?.expandedRowRender) return 'row';\n return null;\n }, [childrenColumnName, dataSource, legacyExpandedRowRender, expandable?.expandedRowRender]);\n\n // Like antd: legacy top-level props sit under `expandable`, which always wins.\n const mergedExpandable = useMemo((): RcExpandableConfig<any> => {\n const config: RcExpandableConfig<any> = {\n childrenColumnName: legacyChildrenColumnName,\n expandedRowRender: legacyExpandedRowRender,\n expandIconColumnIndex: legacyExpandIconColumnIndex,\n ...(expandable as RcExpandableConfig<any>),\n expandIcon: (expandable?.expandIcon ??\n legacyExpandIcon ??\n ((iconProps: any) => renderExpandIcon(iconProps, tableLocale))) as any,\n };\n // Like antd: tree toggles sit after the selection column; legacy indexes skip it.\n if (expandType === 'nest' && config.expandIconColumnIndex === undefined) {\n config.expandIconColumnIndex = hasRowSelection ? 1 : 0;\n } else if ((config.expandIconColumnIndex ?? 0) > 0 && hasRowSelection) {\n config.expandIconColumnIndex = config.expandIconColumnIndex! - 1;\n }\n // Virtual rows are flex boxes sized from numeric widths; the CSS `col` width never reaches them.\n if (virtual && config.columnWidth === undefined) config.columnWidth = EXPAND_COLUMN_WIDTH;\n if (typeof config.indentSize !== 'number') {\n config.indentSize =\n typeof legacyIndentSize === 'number' ? legacyIndentSize : DEFAULT_INDENT_SIZE;\n }\n return config;\n }, [\n expandable,\n legacyChildrenColumnName,\n legacyExpandedRowRender,\n legacyExpandIcon,\n legacyExpandIconColumnIndex,\n legacyIndentSize,\n expandType,\n hasRowSelection,\n virtual,\n tableLocale,\n ]);\n\n // ================================ Refs ================================\n const rootRef = useRef<HTMLDivElement>(null);\n const rcRef = useRef<RcReference>(null);\n useImperativeHandle(\n ref as Ref<TableRef>,\n () => toTableRef(rootRef.current!, (config) => rcRef.current?.scrollTo(config)),\n [],\n );\n\n // ======================== Sort / Filter / Page ========================\n const state = useTableState({\n childrenColumnName,\n columns,\n dataSource,\n onChange,\n // Like antd: on by default once `scroll` is set.\n onTableChange: () => {\n if (scroll && scroll.scrollToFirstRowOnChange !== false) rcRef.current?.scrollTo({ top: 0 });\n },\n pagination,\n });\n const {\n config: paginationConfig,\n data: allRows,\n filterStates,\n page,\n sortStates,\n titleProps,\n } = state;\n const { pageIndex, pageSize } = page;\n const { total } = state;\n\n // Like antd: async data (fewer rows than `total`, at most one page) is shown as given.\n const rows = useMemo(() => {\n if (pagination === false) return allRows;\n if (allRows.length < total && allRows.length <= pageSize) return allRows;\n return allRows.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize);\n }, [allRows, pagination, pageIndex, pageSize, total]);\n\n // ============================== Selection ==============================\n const getRowKey = useMemo(\n () =>\n typeof rowKey === 'function'\n ? rowKey\n : (record: T) => (record as Record<PropertyKey, unknown>)?.[rowKey as PropertyKey] as Key,\n [rowKey],\n );\n const recordMap = useMemo(() => {\n const map = new Map<Key, T>();\n const dig = (records: readonly T[]) => {\n records.forEach((record, index) => {\n map.set(getRowKey(record, index), record);\n const children = isPlainObject(record) ? record[childrenColumnName] : undefined;\n if (Array.isArray(children)) dig(children as T[]);\n });\n };\n dig(dataSource);\n return map;\n }, [dataSource, childrenColumnName, getRowKey]);\n const getRecordByKey = useCallback((key: Key) => recordMap.get(key), [recordMap]);\n // Same as the expand column: give virtual rows the selection column's CSS width as a number.\n const mergedRowSelection = useMemo(() => {\n if (!virtual || !rowSelection || rowSelection.columnWidth !== undefined) return rowSelection;\n const withDropdown = Boolean(rowSelection.selections) && rowSelection.type !== 'radio';\n return {\n ...rowSelection,\n columnWidth:\n SELECTION_COLUMN_WIDTH +\n (withDropdown ? SELECTION_DROPDOWN_WIDTH : 0) +\n (variant === 'outlined' ? 16 : 0),\n };\n }, [virtual, rowSelection, variant]);\n const [transformSelectionColumns, selectedKeySet] = useSelection<T>(\n {\n childrenColumnName,\n data: allRows,\n expandType,\n getRecordByKey,\n getRowKey,\n locale: tableLocale,\n pageData: rows,\n },\n mergedRowSelection,\n );\n const mergedRowClassName = useCallback(\n (record: T, index: number, indent: number) =>\n cx(\n selectedKeySet.has(getRowKey(record, index)) && `${PREFIX_CLS}-row-selected`,\n typeof rowClassName === 'function' ? rowClassName(record, index, indent) : rowClassName,\n ),\n [selectedKeySet, getRowKey, rowClassName],\n );\n\n const clientPaginated = pagination !== false && paginationConfig?.total === undefined;\n const syncClampedPage = useEventCallback(() => state.clampPage(pageIndex));\n\n useEffect(() => {\n if (clientPaginated && pageIndex !== state.rawPageIndex) syncClampedPage();\n }, [clientPaginated, pageIndex, state.rawPageIndex, syncClampedPage]);\n\n // ============================== Loading ===============================\n const {\n spinning: isLoading = true,\n tip,\n variant: spinVariant = 'network',\n ...spinRest\n } = typeof loading === 'object' ? loading : { spinning: loading };\n const spinProps = { variant: spinVariant, ...spinRest };\n\n // =============================== Columns ==============================\n const triggerSort = useEventCallback(state.triggerSort);\n const triggerFilter = useEventCallback(state.triggerFilter);\n\n const rcColumns = useMemo(() => {\n const transform = (list: readonly TableColumn<T>[], parentPos?: string): RcColumnsType<any> =>\n list.flatMap((column, index) => {\n // The placeholders must reach rc-table by identity.\n if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return [column];\n // Positions (and so fallback ids) come from the full tree, before responsive filtering.\n const pos = getColumnPos(index, parentPos);\n if (!isColumnVisibleAt(column, screens)) return [];\n\n const id = getColumnId(column, pos);\n const {\n defaultFilteredValue: _defaultFilteredValue,\n defaultSortOrder: _defaultSortOrder,\n filterDropdown,\n filterDropdownOpen: _filterDropdownOpen,\n filterDropdownProps: _filterDropdownProps,\n filtered: _filtered,\n filteredValue: _filteredValue,\n filterIcon: _filterIcon,\n filterMode: _filterMode,\n filterMultiple: _filterMultiple,\n filterOnClose: _filterOnClose,\n filterResetToDefaultFilteredValue: _filterResetToDefaultFilteredValue,\n filters: columnFilters,\n filterSearch: _filterSearch,\n onFilter: _onFilter,\n onFilterDropdownOpenChange: _onFilterDropdownOpenChange,\n onHeaderCell,\n responsive: _responsive,\n showSorterTooltip: columnShowSorterTooltip,\n sortDirections: columnSortDirections,\n sortIcon,\n sortOrder: _sortOrder,\n sorter,\n title: columnTitle,\n ...rest\n } = column as TableColumnType<T>;\n const order = sorter ? sortStates.find(({ key }) => key === id)?.sortOrder : undefined;\n\n const titleNode = renderColumnTitle(columnTitle, titleProps);\n const titleText =\n typeof titleNode === 'string' || typeof titleNode === 'number'\n ? String(titleNode)\n : undefined;\n // A single-text wrapper lets rc-table derive the header `title` and truncate it.\n const titleContent = column.ellipsis ? (\n <span className={cx(styles.columnTitle, `${PREFIX_CLS}-column-title`)}>{titleNode}</span>\n ) : (\n titleNode\n );\n\n const filterNode =\n columnFilters || filterDropdown ? (\n <FilterDropdown<T>\n column={column as TableColumnType<T>}\n columnKey={id}\n filterState={filterStates.find(({ key }) => key === id)}\n getPopupContainer={getPopupContainer}\n label={titleText ?? id}\n locale={tableLocale}\n triggerFilter={triggerFilter}\n />\n ) : null;\n const hasControls = Boolean(sorter) || Boolean(filterNode);\n\n let sorterNode: ReactNode = null;\n if (sorter) {\n const sortDirections = columnSortDirections ?? tableSortDirections;\n const nextOrder = getNextSortOrder(sortDirections, order);\n const showTooltip = columnShowSorterTooltip ?? tableShowSorterTooltip;\n const { target, ...tooltipOptions } =\n typeof showTooltip === 'object' ? showTooltip : ({} as TableSorterTooltipProps);\n const tooltipProps = { title: sortTipOf(nextOrder, tableLocale), ...tooltipOptions };\n const withTooltip = (node: ReactNode) => <Tooltip {...tooltipProps}>{node}</Tooltip>;\n\n const iconOnlyTooltip = Boolean(showTooltip) && target === 'sorter-icon';\n const onSort = () =>\n triggerSort({\n column,\n key: id,\n multiplePriority: getMultiplePriority(column),\n sortOrder: nextOrder,\n });\n // ActionIcon owns the click (same as the filter trigger). The title stays a plain\n // span so we never nest a button inside a button; clicking the title still sorts.\n const sortAction = (\n <ActionIcon\n active={Boolean(order)}\n className={cx(styles.sortCaret, `${PREFIX_CLS}-column-sorter`)}\n data-order={order ?? undefined}\n size=\"small\"\n icon={\n sortIcon\n ? sortIcon({ sortOrder: order ?? null })\n : order === 'ascend'\n ? ArrowUpToLine\n : order === 'descend'\n ? ArrowDownFromLine\n : ArrowUpDown\n }\n {...(iconOnlyTooltip && showTooltip\n ? { title: tooltipProps.title, tooltipProps: tooltipOptions }\n : {})}\n onClick={(event) => {\n event.stopPropagation();\n onSort();\n }}\n />\n );\n const group = (\n <span\n className={cx(styles.sortButton, `${PREFIX_CLS}-column-sorters`)}\n // Without a tooltip, the native title still says the header sorts.\n title={showTooltip ? undefined : tableLocale.sortTitle}\n >\n <span className={styles.sortTitle} onClick={onSort}>\n {titleContent}\n </span>\n {sortAction}\n </span>\n );\n sorterNode = showTooltip && !iconOnlyTooltip ? withTooltip(group) : group;\n }\n\n return {\n ...rest,\n className: cx(\n rest.className,\n order ? [`${PREFIX_CLS}-column-sort`, styles.sortedColumn] : undefined,\n ),\n children: isColumnGroup(column) ? transform(column.children, pos) : undefined,\n key: id,\n onHeaderCell: () => {\n const cell = onHeaderCell?.(column);\n return {\n ...(sorter && { 'aria-sort': ariaSortOf(order) }),\n ...(column.ellipsis && hasControls && titleText && { title: titleText }),\n ...cell,\n className: cx(sorter && `${PREFIX_CLS}-column-has-sorters`, cell?.className),\n };\n },\n title: hasControls ? (\n <span className={styles.headerInner}>\n {sorterNode ?? titleContent}\n {filterNode}\n </span>\n ) : (\n titleContent\n ),\n };\n }) as RcColumnsType<any>;\n\n return transform(columns);\n }, [\n columns,\n screens,\n sortStates,\n filterStates,\n titleProps,\n getPopupContainer,\n triggerFilter,\n triggerSort,\n tableSortDirections,\n tableShowSorterTooltip,\n tableLocale,\n ]);\n\n // ============================== Rows ==============================\n const mergedOnRow = useMemo(\n () =>\n (record: T, index?: number): HTMLAttributes<HTMLElement> => {\n const rowProps = onRow?.(record, index ?? 0) ?? {};\n return {\n ...rowProps,\n className: cx(rowProps.onClick && styles.clickable, rowProps.className),\n };\n },\n [onRow],\n );\n\n // antd defaults to `fixed` layout once a column is pinned; `max-content` keeps sizing to content.\n const hasFixedColumn = useMemo(\n () =>\n Boolean(rowSelection?.fixed) ||\n flattenColumns(columns).some(({ column }) => column.fixed && !column.hidden),\n [columns, rowSelection?.fixed],\n );\n const mergedTableLayout =\n tableLayout ?? (hasFixedColumn && scroll?.x !== 'max-content' ? 'fixed' : undefined);\n\n // ============================= Pagination =============================\n let topPagination: ReactNode = null;\n let bottomPagination: ReactNode = null;\n if (paginationConfig && total > 0) {\n const {\n current: _current,\n defaultCurrent: _defaultCurrent,\n defaultPageSize: _defaultPageSize,\n onChange: _onChange,\n onShowSizeChange: _onShowSizeChange,\n pageSize: _pageSize,\n placement,\n position,\n total: _total,\n className: paginationClassName,\n classNames: paginationClassNames,\n size: paginationSize,\n styles: paginationStyles,\n ...paginationRest\n } = paginationConfig;\n const pageCount = Math.ceil(total / pageSize);\n const renderPagination = (align: PaginationAlign, side: 'top' | 'bottom') => (\n <div\n className={cx(\n styles.pagination,\n side === 'top' && styles.paginationTop,\n paginationAlignClassName[align],\n `${PREFIX_CLS}-pagination-wrapper`,\n )}\n >\n <Pagination\n {...paginationRest}\n current={pageIndex + 1}\n pageSize={pageSize}\n // Like antd: `small` / `medium` tables get a small pager unless one is set.\n size={paginationSize ?? (sizeProp && sizeProp !== 'large' ? 'small' : undefined)}\n total={total}\n className={cx(\n `${PREFIX_CLS}-pagination`,\n `${PREFIX_CLS}-pagination-${align}`,\n paginationClassName,\n )}\n classNames={{\n item: cx(mergedClassNames.pagination.item, paginationClassNames?.item),\n root: cx(mergedClassNames.pagination.root, paginationClassNames?.root),\n }}\n styles={{\n item: { ...paginationStyles?.item, ...mergedStyles.pagination.item },\n root: { ...paginationStyles?.root, ...mergedStyles.pagination.root },\n }}\n onChange={(next, nextPageSize) =>\n state.onPaginationChange({ pageIndex: next - 1, pageSize: nextPageSize })\n }\n />\n </div>\n );\n\n if (!(paginationRest.hideOnSinglePage && pageCount <= 1)) {\n const mergedPlacement = placement ?? position;\n if (Array.isArray(mergedPlacement)) {\n const find = (side: string) =>\n (mergedPlacement as string[]).find((item) => item.includes(side));\n const top = find('top');\n const bottom = find('bottom');\n const none = mergedPlacement.every((item) => item === 'none');\n if (top) topPagination = renderPagination(normalizePlacement(top), 'top');\n if (bottom) bottomPagination = renderPagination(normalizePlacement(bottom), 'bottom');\n if (!top && !bottom && !none) bottomPagination = renderPagination('end', 'bottom');\n } else {\n bottomPagination = renderPagination('end', 'bottom');\n }\n }\n }\n\n // Like antd: `locale.emptyText` (here also the `emptyText` alias) replaces the default empty state.\n const customEmpty = locale?.emptyText ?? emptyText;\n const emptyNode = isLoading ? (\n <TableLoadingSkeleton\n columns={columns}\n expandColumn={Boolean(expandType)}\n rows={pagination === false ? 5 : Math.min(5, pageSize)}\n screens={screens}\n selectionColumn={hasRowSelection}\n size={size}\n />\n ) : customEmpty === undefined ? (\n <Empty description={t('table.emptyText')} icon={Inbox} imageSize={40} />\n ) : typeof customEmpty === 'function' ? (\n customEmpty()\n ) : (\n customEmpty\n );\n\n // Like antd: `virtual` swaps in rc-table's VirtualTable (rc-virtual-list body).\n const TableComponent = (virtual ? RcVirtualTable : RcTable) as typeof RcTable;\n\n return (\n <div\n ref={rootRef}\n style={{ ...mergedStyles.root, ...style }}\n className={cx(\n styles.root,\n `${PREFIX_CLS}-wrapper`,\n rootClassName,\n className,\n mergedClassNames.root,\n )}\n >\n {topPagination}\n <div className={styles.spinContainer} data-table-wrapper=\"\">\n <TableComponent<any>\n {...(virtual && { listItemHeight: VIRTUAL_ROW_HEIGHT[size] })}\n columns={rcColumns}\n components={components as any}\n data={rows as any[]}\n emptyText={emptyNode}\n expandable={mergedExpandable}\n footer={footer as any}\n internalHooks={INTERNAL_HOOKS}\n prefixCls={PREFIX_CLS}\n ref={rcRef}\n rowClassName={mergedRowClassName as any}\n rowHoverable={rowHoverable}\n rowKey={rowKey as string | ((record: T) => Key)}\n scroll={scroll}\n showHeader={showHeader}\n sticky={sticky}\n summary={summary as any}\n tableLayout={mergedTableLayout}\n title={title as any}\n transformColumns={transformSelectionColumns}\n className={cx(\n styles.table,\n sizeClassName[size],\n `${PREFIX_CLS}-${size === 'middle' ? 'medium' : size}`,\n variant === 'borderless' && styles.borderless,\n variant === 'outlined' && styles.outlined,\n grouped && styles.grouped,\n variant === 'filled' && styles.filled,\n `${PREFIX_CLS}-${variant}`,\n rowHoverable && styles.hoverable,\n )}\n classNames={{\n body: mergedClassNames.body,\n content: mergedClassNames.content,\n footer: mergedClassNames.footer,\n header: mergedClassNames.header,\n section: mergedClassNames.section,\n title: mergedClassNames.title,\n }}\n measureRowRender={(measureRow) =>\n wrapMeasureRow(measureRowRender ? measureRowRender(measureRow) : measureRow)\n }\n styles={{\n body: mergedStyles.body,\n content: mergedStyles.content,\n footer: mergedStyles.footer,\n header: mergedStyles.header,\n section: mergedStyles.section,\n title: mergedStyles.title,\n }}\n onHeaderRow={onHeaderRow as any}\n onRow={mergedOnRow as any}\n onScroll={onScroll}\n />\n {isLoading && (\n <div className={styles.loading} data-table-loading=\"\">\n <Spin {...spinProps} />\n {tip}\n </div>\n )}\n </div>\n {bottomPagination}\n </div>\n );\n};\n\ntype TableComponent = (<T>(props: TableProps<T>) => ReactNode) & {\n Column: typeof Column;\n ColumnGroup: typeof ColumnGroup;\n displayName?: string;\n /** Placeholder in `columns` marking where the expand column goes. */\n EXPAND_COLUMN: TableColumn<any>;\n /** `rowSelection.selections` preset: select every row of every page. */\n SELECTION_ALL: typeof SELECTION_ALL;\n /** Placeholder in `columns` marking where the selection column goes. */\n SELECTION_COLUMN: TableColumn<any>;\n /** Rows rendered by `summary`: `Table.Summary` (`fixed`), `.Row` and `.Cell` (`index`, `colSpan`). */\n Summary: typeof Summary;\n /** `rowSelection.selections` preset: invert the current page. */\n SELECTION_INVERT: typeof SELECTION_INVERT;\n /** `rowSelection.selections` preset: clear the selection. */\n SELECTION_NONE: typeof SELECTION_NONE;\n};\n\nconst Table = memo(TableInner) as unknown as TableComponent;\n\nTable.displayName = 'Table';\nTable.Column = Column;\nTable.ColumnGroup = ColumnGroup;\nTable.EXPAND_COLUMN = EXPAND_COLUMN as TableColumn<any>;\nTable.SELECTION_COLUMN = SELECTION_COLUMN;\nTable.SELECTION_ALL = SELECTION_ALL;\nTable.SELECTION_INVERT = SELECTION_INVERT;\nTable.SELECTION_NONE = SELECTION_NONE;\nTable.Summary = Summary;\n\nexport { TableInner };\n\nexport default Table;\n"],"mappings":"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"}
|
|
@@ -15,7 +15,21 @@ const ownRows = [
|
|
|
15
15
|
].map((section) => `& > ${p}-container > ${p}-${section} > table > * > tr`).join(", ");
|
|
16
16
|
const ownCells = (cell) => ownRows.split(", ").map((row) => `${row} > ${cell}`).join(", ");
|
|
17
17
|
const styles = createStaticStyles(({ css, cssVar }) => {
|
|
18
|
-
const
|
|
18
|
+
const borderColor = `var(--lobe-fill-border, ${cssVar.colorFill})`;
|
|
19
|
+
const border = `1px solid ${borderColor}`;
|
|
20
|
+
const surface = (light) => `var(--lobe-table-surface, ${light})`;
|
|
21
|
+
const cellBg = `var(--lobe-table-cell, ${cssVar.colorBgContainer})`;
|
|
22
|
+
const fill = "var(--lobe-table-fill, transparent)";
|
|
23
|
+
const solid = "var(--lobe-table-solid)";
|
|
24
|
+
const solidWith = (...fills) => `${fills.map((f) => `linear-gradient(${f}, ${f})`).join(", ")}, ${solid}`;
|
|
25
|
+
const variantVars = `
|
|
26
|
+
--lobe-table-solid: var(
|
|
27
|
+
--lobe-table-canvas,
|
|
28
|
+
var(--lobe-surface-bg-solid, var(--lobe-table-canvas-default, ${cssVar.colorBgContainer}))
|
|
29
|
+
);
|
|
30
|
+
--lobe-table-cell: var(--lobe-table-cell-bg, ${cssVar.colorBgContainer});
|
|
31
|
+
--lobe-table-fill: var(--lobe-table-surface, transparent);
|
|
32
|
+
`;
|
|
19
33
|
const fixShadowBase = `
|
|
20
34
|
pointer-events: none;
|
|
21
35
|
content: '';
|
|
@@ -29,6 +43,20 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
29
43
|
return {
|
|
30
44
|
outlined: css`
|
|
31
45
|
&${p}-outlined {
|
|
46
|
+
${variantVars}
|
|
47
|
+
/* The square root must not paint behind the rounded frame: the clipped container
|
|
48
|
+
is the ONE layer carrying the body (light colorBgContainer, dark
|
|
49
|
+
colorFillQuaternary). Title / footer are siblings, so they paint it once too. */
|
|
50
|
+
background: transparent;
|
|
51
|
+
|
|
52
|
+
& > ${p}-container {
|
|
53
|
+
background: ${surface(cssVar.colorBgContainer)};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
& > ${p}-title, & > ${p}-footer {
|
|
57
|
+
background: ${surface(cssVar.colorBgContainer)};
|
|
58
|
+
}
|
|
59
|
+
|
|
32
60
|
& > ${p}-title {
|
|
33
61
|
border: ${border};
|
|
34
62
|
border-block-end: 0;
|
|
@@ -36,13 +64,18 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
36
64
|
border-start-end-radius: ${cssVar.borderRadiusLG};
|
|
37
65
|
}
|
|
38
66
|
|
|
39
|
-
/*
|
|
40
|
-
|
|
67
|
+
/* The container draws the top and both side edges; the last row draws the bottom.
|
|
68
|
+
No column dividers (grouped headers included): rows are split horizontally only. */
|
|
41
69
|
& > ${p}-container {
|
|
42
70
|
overflow: clip;
|
|
71
|
+
|
|
43
72
|
border-block-start: ${border};
|
|
44
|
-
border-inline
|
|
73
|
+
border-inline: ${border};
|
|
45
74
|
border-radius: ${cssVar.borderRadiusLG};
|
|
75
|
+
|
|
76
|
+
/* Same lift as the dashboard Surface card (both modes). Outer shadow on the framed
|
|
77
|
+
container is not clipped by its own overflow. */
|
|
78
|
+
box-shadow: rgb(0 0 0 / 4%) 0 1px 2px 0;
|
|
46
79
|
}
|
|
47
80
|
|
|
48
81
|
& > ${p}-title + ${p}-container {
|
|
@@ -62,27 +95,47 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
62
95
|
border-end-end-radius: ${cssVar.borderRadiusLG};
|
|
63
96
|
}
|
|
64
97
|
|
|
65
|
-
${ownCells("th")}, ${ownCells("td")} {
|
|
66
|
-
border-inline-end: ${border};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
98
|
/* Every header row (including the last) draws one bottom edge — no inset
|
|
70
99
|
shadow underneath, or group headers look double-thick. */
|
|
71
100
|
& > ${p}-container > * > table > thead > tr > th {
|
|
72
101
|
border-block-end: ${border};
|
|
102
|
+
|
|
103
|
+
/* Extra FillQuaternary layer on top of the container fill. */
|
|
104
|
+
background: ${cellBg};
|
|
73
105
|
box-shadow: inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
74
106
|
}
|
|
75
107
|
|
|
76
|
-
|
|
77
|
-
|
|
108
|
+
/* Fixed cells: opaque canvas (--lobe-table-solid) + the container fill once. */
|
|
109
|
+
& ${p}-tbody > tr > td${p}-cell-fix, & ${p}-tbody-virtual ${p}-cell${p}-cell-fix {
|
|
110
|
+
background: ${solidWith(fill)};
|
|
111
|
+
box-shadow: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Header: container fill + one Quaternary wash (box-shadow), like other th. */
|
|
115
|
+
& ${p}-thead > tr > th${p}-cell-fix, & ${p}-thead > tr > td${p}-cell-fix {
|
|
116
|
+
background: ${solidWith(fill)};
|
|
117
|
+
box-shadow: inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
78
118
|
}
|
|
79
119
|
}
|
|
80
120
|
`,
|
|
81
121
|
filled: css`
|
|
82
122
|
&${p}-filled {
|
|
123
|
+
${variantVars}
|
|
124
|
+
/* Filled owns its fill in both modes (Block filled = colorFillTertiary; dark uses the
|
|
125
|
+
Quaternary surface) and its opaque base is the page behind it, not colorBgContainer. */
|
|
126
|
+
--lobe-table-fill: var(--lobe-table-surface, ${cssVar.colorFillTertiary});
|
|
127
|
+
--lobe-table-solid: var(
|
|
128
|
+
--lobe-table-canvas,
|
|
129
|
+
var(--lobe-surface-bg-solid, ${cssVar.colorBgLayout})
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
/* Root stays clear (square box, would bleed past the rounded corners); the clipped
|
|
133
|
+
container is the ONE fill layer: light FillTertiary, dark colorFillQuaternary. */
|
|
134
|
+
background: transparent;
|
|
135
|
+
|
|
83
136
|
& > ${p}-title, & > ${p}-footer {
|
|
84
137
|
border-radius: ${cssVar.borderRadiusLG};
|
|
85
|
-
background: ${
|
|
138
|
+
background: ${fill};
|
|
86
139
|
}
|
|
87
140
|
|
|
88
141
|
& > ${p}-title {
|
|
@@ -98,7 +151,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
98
151
|
& > ${p}-container {
|
|
99
152
|
overflow: clip;
|
|
100
153
|
border-radius: ${cssVar.borderRadiusLG};
|
|
101
|
-
background: ${
|
|
154
|
+
background: ${fill};
|
|
102
155
|
}
|
|
103
156
|
|
|
104
157
|
& > ${p}-title + ${p}-container {
|
|
@@ -111,30 +164,112 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
111
164
|
border-end-end-radius: 0;
|
|
112
165
|
}
|
|
113
166
|
|
|
114
|
-
/*
|
|
115
|
-
FillQuaternary inset wash borderless/outlined use — light layering, not a
|
|
116
|
-
heavy Secondary fill. Sticky thead keeps an opaque Tertiary base so rows
|
|
117
|
-
do not show through while scrolling. */
|
|
167
|
+
/* Header band: one extra FillQuaternary wash over the container fill. */
|
|
118
168
|
& ${p}-thead > tr > th,
|
|
119
169
|
& ${p}-thead > tr > td {
|
|
120
|
-
background:
|
|
170
|
+
background: transparent;
|
|
121
171
|
box-shadow:
|
|
122
|
-
inset 0 -1px 0 ${
|
|
172
|
+
inset 0 -1px 0 ${borderColor},
|
|
123
173
|
inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
124
174
|
}
|
|
125
175
|
|
|
176
|
+
/* Row dividers stay on (base border rule); body is clear over the container fill. */
|
|
126
177
|
& ${p}-tbody > tr > td,
|
|
127
178
|
& ${p}-tbody > tr > th,
|
|
128
179
|
& ${p}-tbody-virtual ${p}-cell {
|
|
129
180
|
background: transparent;
|
|
130
181
|
}
|
|
131
182
|
|
|
183
|
+
/* Fixed cells must be opaque: canvas (--lobe-table-solid) + the same fill; header adds one wash. */
|
|
132
184
|
& ${p}-thead > tr > th${p}-cell-fix, & ${p}-thead > tr > td${p}-cell-fix {
|
|
133
|
-
background: ${
|
|
185
|
+
background: ${solidWith(fill)};
|
|
134
186
|
box-shadow:
|
|
135
|
-
inset 0 -1px 0 ${
|
|
187
|
+
inset 0 -1px 0 ${borderColor},
|
|
136
188
|
inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
137
189
|
}
|
|
190
|
+
|
|
191
|
+
& ${p}-tbody > tr > td${p}-cell-fix {
|
|
192
|
+
background: ${solidWith(fill)};
|
|
193
|
+
box-shadow: none;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
`,
|
|
197
|
+
/**
|
|
198
|
+
* Borderless: everything but the header is see-through, so the table sits on whatever
|
|
199
|
+
* surface hosts it. Hover / selected rows are translucent fills. Fixed (sticky) cells
|
|
200
|
+
* stay opaque in colorBgContainer so scrolled content never shows underneath them.
|
|
201
|
+
*/
|
|
202
|
+
borderless: css`
|
|
203
|
+
&& {
|
|
204
|
+
background: transparent;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
&& ${p}-tbody > tr > td,
|
|
208
|
+
&& ${p}-tbody > tr > th,
|
|
209
|
+
&& ${p}-tbody-virtual ${p}-cell, && ${p}-summary, && ${p}-summary > tr > td,
|
|
210
|
+
&& ${p}-summary > tr > th,
|
|
211
|
+
&& > ${p}-footer {
|
|
212
|
+
background: transparent;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
&& ${p}-tbody > tr > td${p}-cell-row-hover, && ${p}-tbody-virtual ${p}-row:hover > ${p}-cell {
|
|
216
|
+
background: color-mix(in srgb, ${cssVar.colorText} 3%, transparent);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
&& ${p}-tbody > tr${p}-row-selected > td {
|
|
220
|
+
background: color-mix(in srgb, ${cssVar.colorPrimary} 6%, transparent);
|
|
221
|
+
|
|
222
|
+
&${p}-cell-row-hover {
|
|
223
|
+
background: color-mix(in srgb, ${cssVar.colorPrimary} 10%, transparent);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
&&
|
|
228
|
+
${p}-tbody
|
|
229
|
+
> tr
|
|
230
|
+
> td${p}-cell-fix,
|
|
231
|
+
&&
|
|
232
|
+
${p}-tbody
|
|
233
|
+
> tr
|
|
234
|
+
> th${p}-cell-fix,
|
|
235
|
+
&&
|
|
236
|
+
${p}-tbody-virtual
|
|
237
|
+
${p}-cell${p}-cell-fix {
|
|
238
|
+
background: ${cssVar.colorBgContainer};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
&& ${p}-tbody > tr > td${p}-cell-fix${p}-cell-row-hover {
|
|
242
|
+
background: color-mix(in srgb, ${cssVar.colorBgContainer}, ${cssVar.colorText} 3%);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
&& ${p}-tbody > tr${p}-row-selected > td${p}-cell-fix {
|
|
246
|
+
background: color-mix(in srgb, ${cssVar.colorBgContainer}, ${cssVar.colorPrimary} 6%);
|
|
247
|
+
|
|
248
|
+
&${p}-cell-row-hover {
|
|
249
|
+
background: color-mix(in srgb, ${cssVar.colorBgContainer}, ${cssVar.colorPrimary} 10%);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
`,
|
|
253
|
+
/**
|
|
254
|
+
* Grouped (multi-level) headers only: column dividers in header and body so the
|
|
255
|
+
* group spans stay readable. Plain tables never get vertical dividers.
|
|
256
|
+
*/
|
|
257
|
+
grouped: css`
|
|
258
|
+
${ownCells("th")}, ${ownCells("td")} {
|
|
259
|
+
border-inline-end: ${border};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
& ${p}-tbody-virtual ${p}-cell {
|
|
263
|
+
border-inline-end: ${border};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* Outlined: the container already draws the trailing edge. Other variants: the
|
|
267
|
+
rightmost body cell and first header row cell stop at the table edge. */
|
|
268
|
+
&:not(${p}-outlined) ${p}-tbody > tr > td:last-child,
|
|
269
|
+
&:not(${p}-outlined) ${p}-thead > tr:first-child > th:last-child,
|
|
270
|
+
&${p}-outlined ${p}-tbody > tr > td:last-child,
|
|
271
|
+
&${p}-outlined ${p}-thead > tr:first-child > th:last-child {
|
|
272
|
+
border-inline-end: 0;
|
|
138
273
|
}
|
|
139
274
|
`,
|
|
140
275
|
clickable: css`
|
|
@@ -294,7 +429,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
294
429
|
|
|
295
430
|
width: 100%;
|
|
296
431
|
min-width: 0;
|
|
297
|
-
border-block-end: 1px solid ${
|
|
432
|
+
border-block-end: 1px solid ${borderColor};
|
|
298
433
|
|
|
299
434
|
&:last-child {
|
|
300
435
|
border-block-end: 0;
|
|
@@ -393,6 +528,11 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
393
528
|
position: relative;
|
|
394
529
|
`,
|
|
395
530
|
table: css`
|
|
531
|
+
/* Reset per root so nested / borderless tables never inherit a parent's variant vars. */
|
|
532
|
+
--lobe-table-cell: ${cssVar.colorBgContainer};
|
|
533
|
+
--lobe-table-fill: transparent;
|
|
534
|
+
--lobe-table-solid: ${cssVar.colorBgContainer};
|
|
535
|
+
|
|
396
536
|
font-size: 14px;
|
|
397
537
|
color: ${cssVar.colorText};
|
|
398
538
|
background: ${cssVar.colorBgContainer};
|
|
@@ -422,9 +562,10 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
422
562
|
color: ${cssVar.colorTextSecondary};
|
|
423
563
|
text-align: start;
|
|
424
564
|
|
|
425
|
-
|
|
565
|
+
/* Clear in dark (outlined) so the container fill shows; Quaternary is the extra header layer. */
|
|
566
|
+
background: ${cellBg};
|
|
426
567
|
box-shadow:
|
|
427
|
-
inset 0 -1px 0 ${
|
|
568
|
+
inset 0 -1px 0 ${borderColor},
|
|
428
569
|
inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
429
570
|
|
|
430
571
|
&[colspan]:not([colspan='1']) {
|
|
@@ -441,7 +582,8 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
441
582
|
font-variant-numeric: tabular-nums;
|
|
442
583
|
text-align: start;
|
|
443
584
|
|
|
444
|
-
|
|
585
|
+
/* Clear in dark (outlined) so the container fill shows through. */
|
|
586
|
+
background: ${cellBg};
|
|
445
587
|
|
|
446
588
|
transition: background-color ${cssVar.motionDurationMid};
|
|
447
589
|
}
|
|
@@ -573,7 +715,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
573
715
|
& ${p}-sticky-holder {
|
|
574
716
|
position: sticky;
|
|
575
717
|
z-index: calc(var(--columns-count, 1) * 2 + ${Z_FIXED} + 1);
|
|
576
|
-
background: ${
|
|
718
|
+
background: ${solidWith(fill)};
|
|
577
719
|
}
|
|
578
720
|
|
|
579
721
|
& ${p}-sticky-scroll {
|
|
@@ -717,6 +859,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
717
859
|
border-block: 0;
|
|
718
860
|
border-inline-end: 0;
|
|
719
861
|
border-radius: 0;
|
|
862
|
+
box-shadow: none;
|
|
720
863
|
}
|
|
721
864
|
|
|
722
865
|
& > ${p}-title + ${p}-container {
|
|
@@ -737,7 +880,9 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
737
880
|
& ${p}-summary {
|
|
738
881
|
position: relative;
|
|
739
882
|
z-index: ${Z_FIXED};
|
|
740
|
-
|
|
883
|
+
|
|
884
|
+
/* Opaque: canvas + the variant fill once. */
|
|
885
|
+
background: ${solidWith(fill)};
|
|
741
886
|
|
|
742
887
|
& > tr > th,
|
|
743
888
|
& > tr > td {
|
|
@@ -746,7 +891,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
746
891
|
}
|
|
747
892
|
|
|
748
893
|
& div${p}-summary {
|
|
749
|
-
box-shadow: 0 -1px 0 ${
|
|
894
|
+
box-shadow: 0 -1px 0 ${borderColor};
|
|
750
895
|
}
|
|
751
896
|
|
|
752
897
|
/* A fixed summary under \`sticky\` is a sticky holder too; keep it sticky (antd orders sticky last). */
|
|
@@ -780,7 +925,7 @@ const styles = createStaticStyles(({ css, cssVar }) => {
|
|
|
780
925
|
|
|
781
926
|
& ${p}-cell {
|
|
782
927
|
border-block-end: ${border};
|
|
783
|
-
background: ${
|
|
928
|
+
background: ${cellBg};
|
|
784
929
|
transition: background-color ${cssVar.motionDurationMid};
|
|
785
930
|
}
|
|
786
931
|
|