@lobehub/ui 5.60.0 → 5.61.0
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/EmojiPicker/AvatarUploader.mjs +1 -1
- package/es/Form/components/FormSubmitFooter.mjs +1 -1
- package/es/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/Pagination/Pagination.mjs +158 -41
- package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
- package/es/base-ui/Pagination/helpers.mjs +3 -3
- package/es/base-ui/Pagination/helpers.mjs.map +1 -1
- package/es/base-ui/Pagination/index.d.mts +2 -2
- package/es/base-ui/Pagination/style.mjs +39 -0
- package/es/base-ui/Pagination/style.mjs.map +1 -1
- package/es/base-ui/Pagination/type.d.mts +42 -4
- package/es/base-ui/QRCode/QRCode.mjs +1 -1
- package/es/base-ui/Table/Column.d.mts +9 -0
- package/es/base-ui/Table/Column.mjs +7 -0
- package/es/base-ui/Table/Column.mjs.map +1 -0
- package/es/base-ui/Table/ColumnGroup.d.mts +12 -0
- package/es/base-ui/Table/ColumnGroup.mjs +7 -0
- package/es/base-ui/Table/ColumnGroup.mjs.map +1 -0
- package/es/base-ui/Table/ExpandIcon.mjs +33 -0
- package/es/base-ui/Table/ExpandIcon.mjs.map +1 -0
- package/es/base-ui/Table/FilterDropdown.mjs +284 -0
- package/es/base-ui/Table/FilterDropdown.mjs.map +1 -0
- package/es/base-ui/Table/LoadingSkeleton.mjs +83 -0
- package/es/base-ui/Table/LoadingSkeleton.mjs.map +1 -0
- package/es/base-ui/Table/Table.d.mts +21 -3
- package/es/base-ui/Table/Table.mjs +444 -97
- package/es/base-ui/Table/Table.mjs.map +1 -1
- package/es/base-ui/Table/columnUtils.mjs +56 -0
- package/es/base-ui/Table/columnUtils.mjs.map +1 -0
- package/es/base-ui/Table/index.d.mts +4 -2
- package/es/base-ui/Table/selectionUtils.d.mts +9 -0
- package/es/base-ui/Table/selectionUtils.mjs +128 -0
- package/es/base-ui/Table/selectionUtils.mjs.map +1 -0
- package/es/base-ui/Table/semantic.mjs +55 -0
- package/es/base-ui/Table/semantic.mjs.map +1 -0
- package/es/base-ui/Table/style.mjs +801 -161
- package/es/base-ui/Table/style.mjs.map +1 -1
- package/es/base-ui/Table/type.d.mts +471 -37
- package/es/base-ui/Table/useBreakpoint.mjs +41 -0
- package/es/base-ui/Table/useBreakpoint.mjs.map +1 -0
- package/es/base-ui/Table/useFilter.mjs +64 -0
- package/es/base-ui/Table/useFilter.mjs.map +1 -0
- package/es/base-ui/Table/useSelection.mjs +421 -0
- package/es/base-ui/Table/useSelection.mjs.map +1 -0
- package/es/base-ui/Table/useSorter.mjs +152 -0
- package/es/base-ui/Table/useSorter.mjs.map +1 -0
- package/es/base-ui/Table/useTableState.mjs +82 -55
- package/es/base-ui/Table/useTableState.mjs.map +1 -1
- package/es/base-ui/index.d.mts +6 -4
- package/es/base-ui/index.mjs +9 -9
- package/es/chat/EditableMessageList/EditableMessageList.mjs +1 -1
- package/es/chat/MessageInput/MessageInput.mjs +1 -1
- package/es/chat/MessageModal/MessageModal.mjs +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +1 -1
- package/es/i18n/resources/en/index.d.mts +3 -2
- package/es/i18n/resources/en/index.mjs +4 -2
- package/es/i18n/resources/en/index.mjs.map +1 -1
- package/es/i18n/resources/en/table.d.mts +23 -0
- package/es/i18n/resources/en/table.mjs +24 -0
- package/es/i18n/resources/en/table.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +3 -2
- package/es/i18n/resources/zhCn/index.mjs +4 -2
- package/es/i18n/resources/zhCn/index.mjs.map +1 -1
- package/es/i18n/resources/zhCn/table.d.mts +23 -0
- package/es/i18n/resources/zhCn/table.mjs +24 -0
- package/es/i18n/resources/zhCn/table.mjs.map +1 -0
- package/es/i18n/types.d.mts +2 -1
- package/es/index.mjs +2 -2
- package/package.json +2 -2
- package/es/base-ui/Table/FilterMenu.mjs +0 -45
- package/es/base-ui/Table/FilterMenu.mjs.map +0 -1
- package/es/base-ui/Table/TableBody.mjs +0 -59
- package/es/base-ui/Table/TableBody.mjs.map +0 -1
- package/es/base-ui/Table/TableHead.mjs +0 -50
- package/es/base-ui/Table/TableHead.mjs.map +0 -1
- package/es/base-ui/Table/features.mjs +0 -12
- package/es/base-ui/Table/features.mjs.map +0 -1
- package/es/base-ui/Table/fixedOffsets.mjs +0 -29
- package/es/base-ui/Table/fixedOffsets.mjs.map +0 -1
- package/es/base-ui/Table/toColumnDefs.mjs +0 -26
- package/es/base-ui/Table/toColumnDefs.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.mjs","names":[],"sources":["../../../src/base-ui/Table/Table.tsx"],"sourcesContent":["'use client';\n\nimport { type RowData, useTable } from '@tanstack/react-table';\nimport { cx } from 'antd-style';\nimport { type Key, memo, type ReactNode, useEffect, useMemo } from 'react';\n\nimport Pagination from '@/base-ui/Pagination';\nimport Spin from '@/base-ui/Spin';\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport { tableFeatureSet } from './features';\nimport FilterMenu from './FilterMenu';\nimport { getFixedOffsets } from './fixedOffsets';\nimport { styles } from './style';\nimport TableBody from './TableBody';\nimport TableHead from './TableHead';\nimport { toColumnDefs } from './toColumnDefs';\nimport type { FilterValue, TableColumn, TableProps } from './type';\nimport { useTableState } from './useTableState';\n\nconst EMPTY_DATA: any[] = [];\n\nexport interface TableInternalProps<T> extends TableProps<T> {\n renderFilter?: (column: TableColumn<T>, id: string, table: any) => ReactNode;\n}\n\nconst TableInner = <T extends RowData>(props: TableInternalProps<T>) => {\n const {\n bordered = false,\n className,\n classNames,\n columns,\n dataSource = EMPTY_DATA as T[],\n emptyText,\n loading = false,\n onChange,\n onRow,\n pagination,\n ref,\n renderFilter,\n rowClassName,\n rowKey,\n scroll,\n size = 'middle',\n style,\n styles: customStyles,\n tableLayout,\n } = props;\n\n const state = useTableState({ columns, onChange, pagination });\n const columnDefs = useMemo(() => toColumnDefs(columns), [columns]);\n const fixedOffsets = useMemo(() => getFixedOffsets(columns), [columns]);\n\n const table = useTable({\n columns: columnDefs,\n data: dataSource,\n enableMultiSort: false,\n enableSortingRemoval: true,\n features: tableFeatureSet,\n getRowId: (record: T) =>\n String(typeof rowKey === 'function' ? rowKey(record) : (record[rowKey] as Key)),\n manualSorting: state.manualSorting,\n onColumnFiltersChange: state.onColumnFiltersChange,\n onSortingChange: state.onSortingChange,\n state: {\n columnFilters: state.columnFilters,\n sorting: state.sorting,\n },\n } as any);\n\n const allRows = table.getRowModel().rows as unknown as { id: Key; original: T }[];\n const { page } = state;\n const clientPaginated = pagination !== false && state.config?.total === undefined;\n const total = state.config?.total ?? allRows.length;\n const pageCount = Math.max(1, Math.ceil(total / page.pageSize));\n const pageIndex = Math.min(page.pageIndex, pageCount - 1);\n const rows = clientPaginated\n ? allRows.slice(pageIndex * page.pageSize, (pageIndex + 1) * page.pageSize)\n : allRows;\n\n const syncClampedPage = useEventCallback(() => state.clampPage(pageIndex));\n\n useEffect(() => {\n if (clientPaginated && pageIndex !== page.pageIndex) syncClampedPage();\n }, [clientPaginated, pageIndex, page.pageIndex, syncClampedPage]);\n\n const minWidth = scroll?.x === 'max-content' ? '100%' : scroll?.x;\n\n return (\n <div className={cx(styles.root, className)} ref={ref} style={style}>\n <div\n className={cx(styles.wrapper, bordered && styles.bordered, classNames?.wrapper)}\n data-table-wrapper=\"\"\n style={{ maxHeight: scroll?.y, ...customStyles?.wrapper }}\n >\n <table\n className={cx(styles.table, size === 'small' ? styles.small : styles.middle)}\n style={{\n minWidth,\n tableLayout,\n width: scroll?.x === 'max-content' ? 'max-content' : '100%',\n }}\n >\n <TableHead\n classNames={classNames}\n columnIds={state.columnIds}\n columns={columns}\n fixedOffsets={fixedOffsets}\n getColumn={(id) => table.getColumn(id) as any}\n styles={customStyles}\n renderFilter={(column, id) => {\n if (renderFilter) return renderFilter(column, id, table);\n const tableColumn = table.getColumn(id) as any;\n const value = (tableColumn?.getFilterValue() as FilterValue[] | undefined) ?? [];\n return (\n <FilterMenu\n filters={column.filters ?? []}\n label={typeof column.title === 'string' ? column.title : id}\n value={value}\n onChange={(next) =>\n tableColumn?.setFilterValue(next.length > 0 ? next : undefined)\n }\n />\n );\n }}\n />\n <TableBody\n classNames={classNames}\n columnIds={state.columnIds}\n columns={columns}\n emptyText={emptyText}\n fixedOffsets={fixedOffsets}\n loading={loading}\n rowClassName={rowClassName}\n rows={rows}\n styles={customStyles}\n onRow={onRow}\n />\n </table>\n {loading && rows.length > 0 && (\n <div className={styles.loading} data-table-loading=\"\">\n <Spin />\n </div>\n )}\n </div>\n {pagination !== false && total > 0 && (\n <div className={styles.pagination}>\n <Pagination\n current={pageIndex + 1}\n pageSize={page.pageSize}\n pageSizeOptions={state.config?.pageSizeOptions}\n showSizeChanger={state.config?.showSizeChanger}\n total={total}\n onChange={(next, pageSize) =>\n state.onPaginationChange({ pageIndex: next - 1, pageSize })\n }\n />\n </div>\n )}\n </div>\n );\n};\n\nconst Table = memo(TableInner) as unknown as (<T extends RowData>(\n props: TableProps<T>,\n) => ReactNode) & {\n displayName?: string;\n};\n\nTable.displayName = 'Table';\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 } 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\nconst TableInner = <T,>(props: TableProps<T>) => {\n const {\n variant = 'borderless',\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 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')} />\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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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { SELECTION_COLUMN } from "./selectionUtils.mjs";
|
|
2
|
+
import { EXPAND_COLUMN } from "@rc-component/table";
|
|
3
|
+
//#region src/base-ui/Table/columnUtils.ts
|
|
4
|
+
const isColumnGroup = (column) => "children" in column && Array.isArray(column.children);
|
|
5
|
+
const dataIndexOf = (column) => "dataIndex" in column ? column.dataIndex : void 0;
|
|
6
|
+
/** Position path of a column in the tree: `2` at the top level, `2-0` for its first child. */
|
|
7
|
+
const getColumnPos = (index, parentPos) => parentPos === void 0 ? String(index) : `${parentPos}-${index}`;
|
|
8
|
+
/** `key`, then `dataIndex` (paths joined with `.`), then a positional id. */
|
|
9
|
+
const getColumnId = (column, pos) => {
|
|
10
|
+
if (column.key != null) return String(column.key);
|
|
11
|
+
const dataIndex = dataIndexOf(column);
|
|
12
|
+
if (Array.isArray(dataIndex)) {
|
|
13
|
+
if (dataIndex.length > 0) return dataIndex.join(".");
|
|
14
|
+
} else if (dataIndex != null && dataIndex !== "") return String(dataIndex);
|
|
15
|
+
return `__column_${pos}`;
|
|
16
|
+
};
|
|
17
|
+
/** Every column and group in pre-order, with the id that keys its sort / filter state. */
|
|
18
|
+
const flattenColumns = (columns, parentPos) => {
|
|
19
|
+
const list = [];
|
|
20
|
+
columns.forEach((column, index) => {
|
|
21
|
+
if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return;
|
|
22
|
+
const pos = getColumnPos(index, parentPos);
|
|
23
|
+
list.push({
|
|
24
|
+
column,
|
|
25
|
+
id: getColumnId(column, pos)
|
|
26
|
+
});
|
|
27
|
+
if (isColumnGroup(column)) list.push(...flattenColumns(column.children, pos));
|
|
28
|
+
});
|
|
29
|
+
return list;
|
|
30
|
+
};
|
|
31
|
+
/** Sort and filter state is keyed by column id, so those columns need a stable one. */
|
|
32
|
+
const assertColumnKeys = (columns) => {
|
|
33
|
+
for (const { column } of flattenColumns(columns)) if ((Boolean(column.sorter) || Boolean(column.filters) || column.filterDropdown !== void 0) && column.key == null && dataIndexOf(column) == null) throw new Error("[Table] sortable or filterable columns need a `key` or `dataIndex`");
|
|
34
|
+
};
|
|
35
|
+
/** Merges the table-level `column` defaults under every column; groups keep their `children`. */
|
|
36
|
+
const fillColumns = (columns, defaults) => {
|
|
37
|
+
if (!defaults) return columns;
|
|
38
|
+
const { children: _children, ...base } = defaults;
|
|
39
|
+
return columns.map((column) => {
|
|
40
|
+
if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return column;
|
|
41
|
+
const merged = { ...base };
|
|
42
|
+
for (const [key, value] of Object.entries(column)) if (value !== void 0) merged[key] = value;
|
|
43
|
+
if (isColumnGroup(column)) merged.children = fillColumns(column.children, defaults);
|
|
44
|
+
return merged;
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Drops columns whose `responsive` breakpoints are all inactive. `screens === null` means the
|
|
49
|
+
* breakpoints are unknown (SSR / no `matchMedia`), so every column stays.
|
|
50
|
+
*/
|
|
51
|
+
const isColumnVisibleAt = (column, screens) => !column.responsive || !screens || column.responsive.some((point) => screens.has(point));
|
|
52
|
+
const renderColumnTitle = (title, props) => typeof title === "function" ? title(props) : title;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { assertColumnKeys, fillColumns, flattenColumns, getColumnId, getColumnPos, isColumnGroup, isColumnVisibleAt, renderColumnTitle };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=columnUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnUtils.mjs","names":[],"sources":["../../../src/base-ui/Table/columnUtils.ts"],"sourcesContent":["import { EXPAND_COLUMN } from '@rc-component/table';\n\nimport { SELECTION_COLUMN } from './selectionUtils';\nimport type {\n TableBreakpoint,\n TableColumn,\n TableColumnGroupType,\n TableColumnTitle,\n TableColumnTitleProps,\n TableColumnType,\n} from './type';\n\ntype DataIndexOf<T> = TableColumnType<T>['dataIndex'];\n\nexport const isColumnGroup = <T>(column: TableColumn<T>): column is TableColumnGroupType<T> =>\n 'children' in column && Array.isArray(column.children);\n\nconst dataIndexOf = <T>(column: TableColumn<T>): DataIndexOf<T> =>\n 'dataIndex' in column ? column.dataIndex : undefined;\n\n/** Position path of a column in the tree: `2` at the top level, `2-0` for its first child. */\nexport const getColumnPos = (index: number, parentPos?: string) =>\n parentPos === undefined ? String(index) : `${parentPos}-${index}`;\n\n/** `key`, then `dataIndex` (paths joined with `.`), then a positional id. */\nexport const getColumnId = (column: TableColumn<any>, pos: number | string): string => {\n if (column.key != null) return String(column.key);\n const dataIndex = dataIndexOf(column);\n if (Array.isArray(dataIndex)) {\n if (dataIndex.length > 0) return dataIndex.join('.');\n } else if (dataIndex != null && dataIndex !== '') {\n return String(dataIndex);\n }\n return `__column_${pos}`;\n};\n\nexport const getPathValue = (record: unknown, path: DataIndexOf<any>): unknown => {\n if (path == null || path === '') return undefined;\n const keys = Array.isArray(path) ? path : [path];\n let value: any = record;\n for (const key of keys) {\n if (value == null) return undefined;\n value = value[key as PropertyKey];\n }\n return value;\n};\n\nexport const getCellValue = <T>(record: T, column: TableColumn<T>): unknown =>\n getPathValue(record, dataIndexOf(column));\n\nexport interface FlatColumn<T> {\n column: TableColumn<T>;\n id: string;\n}\n\n/** Every column and group in pre-order, with the id that keys its sort / filter state. */\nexport const flattenColumns = <T>(columns: readonly TableColumn<T>[], parentPos?: string) => {\n const list: FlatColumn<T>[] = [];\n columns.forEach((column, index) => {\n if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return;\n const pos = getColumnPos(index, parentPos);\n list.push({ column, id: getColumnId(column, pos) });\n if (isColumnGroup(column)) list.push(...flattenColumns(column.children, pos));\n });\n return list;\n};\n\n/** Sort and filter state is keyed by column id, so those columns need a stable one. */\nexport const assertColumnKeys = (columns: readonly TableColumn<any>[]) => {\n for (const { column } of flattenColumns(columns)) {\n const needsStableId =\n Boolean(column.sorter) || Boolean(column.filters) || column.filterDropdown !== undefined;\n if (needsStableId && column.key == null && dataIndexOf(column) == null) {\n throw new Error('[Table] sortable or filterable columns need a `key` or `dataIndex`');\n }\n }\n};\n\n/** Merges the table-level `column` defaults under every column; groups keep their `children`. */\nexport const fillColumns = <T>(\n columns: readonly TableColumn<T>[],\n defaults: Partial<TableColumnType<T>> | undefined,\n): TableColumn<T>[] => {\n if (!defaults) return columns as TableColumn<T>[];\n const { children: _children, ...base } = defaults as Partial<TableColumnGroupType<T>>;\n return columns.map((column) => {\n if (column === EXPAND_COLUMN || column === SELECTION_COLUMN) return column;\n const merged = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(column)) {\n if (value !== undefined) merged[key] = value;\n }\n if (isColumnGroup(column)) merged.children = fillColumns(column.children, defaults);\n return merged as unknown as TableColumn<T>;\n });\n};\n\n/**\n * Drops columns whose `responsive` breakpoints are all inactive. `screens === null` means the\n * breakpoints are unknown (SSR / no `matchMedia`), so every column stays.\n */\nexport const isColumnVisibleAt = (\n column: TableColumn<any>,\n screens: ReadonlySet<TableBreakpoint> | null,\n) => !column.responsive || !screens || column.responsive.some((point) => screens.has(point));\n\nexport const renderColumnTitle = <T>(\n title: TableColumnTitle<T>,\n props: TableColumnTitleProps<T>,\n) => (typeof title === 'function' ? title(props) : title);\n"],"mappings":";;;AAcA,MAAa,iBAAoB,WAC/B,cAAc,UAAU,MAAM,QAAQ,OAAO,QAAQ;AAEvD,MAAM,eAAkB,WACtB,eAAe,SAAS,OAAO,YAAY,KAAA;;AAG7C,MAAa,gBAAgB,OAAe,cAC1C,cAAc,KAAA,IAAY,OAAO,KAAK,IAAI,GAAG,UAAU,GAAG;;AAG5D,MAAa,eAAe,QAA0B,QAAiC;CACrF,IAAI,OAAO,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG;CAChD,MAAM,YAAY,YAAY,MAAM;CACpC,IAAI,MAAM,QAAQ,SAAS,GACrB;MAAA,UAAU,SAAS,GAAG,OAAO,UAAU,KAAK,GAAG;CAAA,OAC9C,IAAI,aAAa,QAAQ,cAAc,IAC5C,OAAO,OAAO,SAAS;CAEzB,OAAO,YAAY;AACrB;;AAsBA,MAAa,kBAAqB,SAAoC,cAAuB;CAC3F,MAAM,OAAwB,CAAC;CAC/B,QAAQ,SAAS,QAAQ,UAAU;EACjC,IAAI,WAAW,iBAAiB,WAAW,kBAAkB;EAC7D,MAAM,MAAM,aAAa,OAAO,SAAS;EACzC,KAAK,KAAK;GAAE;GAAQ,IAAI,YAAY,QAAQ,GAAG;EAAE,CAAC;EAClD,IAAI,cAAc,MAAM,GAAG,KAAK,KAAK,GAAG,eAAe,OAAO,UAAU,GAAG,CAAC;CAC9E,CAAC;CACD,OAAO;AACT;;AAGA,MAAa,oBAAoB,YAAyC;CACxE,KAAK,MAAM,EAAE,YAAY,eAAe,OAAO,GAG7C,KADE,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO,OAAO,KAAK,OAAO,mBAAmB,KAAA,MAC5D,OAAO,OAAO,QAAQ,YAAY,MAAM,KAAK,MAChE,MAAM,IAAI,MAAM,oEAAoE;AAG1F;;AAGA,MAAa,eACX,SACA,aACqB;CACrB,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,EAAE,UAAU,WAAW,GAAG,SAAS;CACzC,OAAO,QAAQ,KAAK,WAAW;EAC7B,IAAI,WAAW,iBAAiB,WAAW,kBAAkB,OAAO;EACpE,MAAM,SAAS,EAAE,GAAG,KAAK;EACzB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO;EAEzC,IAAI,cAAc,MAAM,GAAG,OAAO,WAAW,YAAY,OAAO,UAAU,QAAQ;EAClF,OAAO;CACT,CAAC;AACH;;;;;AAMA,MAAa,qBACX,QACA,YACG,CAAC,OAAO,cAAc,CAAC,WAAW,OAAO,WAAW,MAAM,UAAU,QAAQ,IAAI,KAAK,CAAC;AAE3F,MAAa,qBACX,OACA,UACI,OAAO,UAAU,aAAa,MAAM,KAAK,IAAI"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { FilterValue, SortOrder, TableColumn, TableFilters, TablePaginationConfig, TableProps, TableSemanticName, TableSorterResult } from "./type.mjs";
|
|
1
|
+
import { FilterValue, SortOrder, TableBreakpoint, TableCellAttributes, TableClassNames, TableColumn, TableColumnEllipsis, TableColumnFilterItem, TableColumnFixed, TableColumnGroupType, TableColumnSorter, TableColumnTitle, TableColumnTitleProps, TableColumnType, TableColumnsType, TableCompareFn, TableComponents, TableComponentsSemanticName, TableCurrentDataSource, TableExpandIconProps, TableExpandableConfig, TableExpandedRowRender, TableFilterDropdownPopupProps, TableFilterDropdownProps, TableFilters, TableHeaderCellAttributes, TableLegacySemanticName, TableLoadingConfig, TableLocale, TablePaginationConfig, TablePaginationPlacement, TablePaginationPosition, TableProps, TableRef, TableRenderedCell, TableRowClassName, TableRowSelectMethod, TableRowSelection, TableRowSelectionCheckboxProps, TableRowSelectionType, TableScrollToConfig, TableSelectionItem, TableSelectionPreset, TableSemanticInfo, TableSemanticName, TableSize, TableSorterResult, TableSorterTooltipProps, TableSticky, TableStyles, TableSummaryCellProps, TableSummaryProps, TableSummaryRowProps, TableVariant } from "./type.mjs";
|
|
2
|
+
import { TableColumnProps } from "./Column.mjs";
|
|
3
|
+
import { TableColumnGroupProps } from "./ColumnGroup.mjs";
|
|
2
4
|
import Table from "./Table.mjs";
|
|
3
|
-
export { type FilterValue, type SortOrder, type TableColumn, type TableFilters, type TablePaginationConfig, type TableProps, type TableSemanticName, type TableSorterResult, Table as default };
|
|
5
|
+
export { type FilterValue, type SortOrder, type TableBreakpoint, type TableCellAttributes, type TableClassNames, type TableColumn, type TableColumnEllipsis, type TableColumnFilterItem, type TableColumnFixed, type TableColumnGroupProps, type TableColumnGroupType, type TableColumnProps, type TableColumnSorter, type TableColumnTitle, type TableColumnTitleProps, type TableColumnType, type TableColumnsType, type TableCompareFn, type TableComponents, type TableComponentsSemanticName, type TableCurrentDataSource, type TableExpandIconProps, type TableExpandableConfig, type TableExpandedRowRender, type TableFilterDropdownPopupProps, type TableFilterDropdownProps, type TableFilters, type TableHeaderCellAttributes, type TableLegacySemanticName, type TableLoadingConfig, type TableLocale, type TablePaginationConfig, type TablePaginationPlacement, type TablePaginationPosition, type TableProps, type TableRef, type TableRenderedCell, type TableRowClassName, type TableRowSelectMethod, type TableRowSelection, type TableRowSelectionCheckboxProps, type TableRowSelectionType, type TableScrollToConfig, type TableSelectionItem, type TableSelectionPreset, type TableSemanticInfo, type TableSemanticName, type TableSize, type TableSorterResult, type TableSorterTooltipProps, type TableSticky, type TableStyles, type TableSummaryCellProps, type TableSummaryProps, type TableSummaryRowProps, type TableVariant, Table as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import "./type.mjs";
|
|
2
|
+
import { Key } from "react";
|
|
3
|
+
//#region src/base-ui/Table/selectionUtils.d.ts
|
|
4
|
+
declare const SELECTION_ALL: "SELECT_ALL";
|
|
5
|
+
declare const SELECTION_INVERT: "SELECT_INVERT";
|
|
6
|
+
declare const SELECTION_NONE: "SELECT_NONE";
|
|
7
|
+
//#endregion
|
|
8
|
+
export { SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE };
|
|
9
|
+
//# sourceMappingURL=selectionUtils.d.mts.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
//#region src/base-ui/Table/selectionUtils.ts
|
|
2
|
+
/** Placeholder in `columns` marking where the selection column goes. */
|
|
3
|
+
const SELECTION_COLUMN = {};
|
|
4
|
+
const SELECTION_ALL = "SELECT_ALL";
|
|
5
|
+
const SELECTION_INVERT = "SELECT_INVERT";
|
|
6
|
+
const SELECTION_NONE = "SELECT_NONE";
|
|
7
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
/** Every record of `data`, tree children included, in display order. */
|
|
9
|
+
const flattenData = (childrenColumnName, data) => {
|
|
10
|
+
const list = [];
|
|
11
|
+
const dig = (records) => {
|
|
12
|
+
(records || []).forEach((record) => {
|
|
13
|
+
list.push(record);
|
|
14
|
+
if (isPlainObject(record) && childrenColumnName in record) dig(record[childrenColumnName]);
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
dig(data);
|
|
18
|
+
return list;
|
|
19
|
+
};
|
|
20
|
+
/** rc-tree `convertDataToEntities`, keyed by row key. */
|
|
21
|
+
const convertDataToEntities = (data, getRowKey, childrenColumnName) => {
|
|
22
|
+
const entities = /* @__PURE__ */ new Map();
|
|
23
|
+
const dig = (records, level, parent) => {
|
|
24
|
+
records.forEach((record, index) => {
|
|
25
|
+
const entity = {
|
|
26
|
+
children: [],
|
|
27
|
+
key: getRowKey(record, index),
|
|
28
|
+
level,
|
|
29
|
+
parent,
|
|
30
|
+
record
|
|
31
|
+
};
|
|
32
|
+
entities.set(entity.key, entity);
|
|
33
|
+
parent?.children.push(entity);
|
|
34
|
+
const children = isPlainObject(record) ? record[childrenColumnName] : void 0;
|
|
35
|
+
if (Array.isArray(children)) dig(children, level + 1, entity);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
dig(data, 0);
|
|
39
|
+
return entities;
|
|
40
|
+
};
|
|
41
|
+
const groupByLevel = (entities) => {
|
|
42
|
+
const levels = /* @__PURE__ */ new Map();
|
|
43
|
+
let maxLevel = 0;
|
|
44
|
+
entities.forEach((entity) => {
|
|
45
|
+
const list = levels.get(entity.level);
|
|
46
|
+
if (list) list.push(entity);
|
|
47
|
+
else levels.set(entity.level, [entity]);
|
|
48
|
+
maxLevel = Math.max(maxLevel, entity.level);
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
levels,
|
|
52
|
+
maxLevel
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
/** Bottom-up pass shared by fill and clean: decides each parent from its enabled children. */
|
|
56
|
+
const conductUp = (checkedKeys, levels, maxLevel, isDisabled, mode) => {
|
|
57
|
+
const halfCheckedKeys = /* @__PURE__ */ new Set();
|
|
58
|
+
const visited = /* @__PURE__ */ new Set();
|
|
59
|
+
for (let level = maxLevel; level >= 0; level -= 1) for (const { parent, record } of levels.get(level) ?? []) {
|
|
60
|
+
if (isDisabled(record) || !parent || visited.has(parent.key)) continue;
|
|
61
|
+
visited.add(parent.key);
|
|
62
|
+
if (isDisabled(parent.record)) continue;
|
|
63
|
+
let allChecked = true;
|
|
64
|
+
let partialChecked = false;
|
|
65
|
+
for (const child of parent.children) {
|
|
66
|
+
if (isDisabled(child.record)) continue;
|
|
67
|
+
const checked = checkedKeys.has(child.key);
|
|
68
|
+
if (!checked) allChecked = false;
|
|
69
|
+
if (checked || halfCheckedKeys.has(child.key)) partialChecked = true;
|
|
70
|
+
}
|
|
71
|
+
if (mode === "fill" && allChecked) checkedKeys.add(parent.key);
|
|
72
|
+
if (mode === "clean" && !allChecked) checkedKeys.delete(parent.key);
|
|
73
|
+
if (partialChecked) halfCheckedKeys.add(parent.key);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
checkedKeys: [...checkedKeys],
|
|
77
|
+
halfCheckedKeys: [...halfCheckedKeys].filter((key) => !checkedKeys.has(key))
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* rc-tree `conductCheck`: `true` fills in descendants and fully-checked ancestors of `keyList`;
|
|
82
|
+
* `{ checked: false, halfCheckedKeys }` cleans up after a key was removed. Disabled rows neither
|
|
83
|
+
* pass the check on nor count toward their parent. Keys missing from `entities` are dropped.
|
|
84
|
+
*/
|
|
85
|
+
const conductCheck = (keyList, checked, entities, isDisabled) => {
|
|
86
|
+
const checkedKeys = new Set(keyList.filter((key) => entities.has(key)));
|
|
87
|
+
const { levels, maxLevel } = groupByLevel(entities);
|
|
88
|
+
if (checked === true) {
|
|
89
|
+
for (let level = 0; level <= maxLevel; level += 1) for (const { children, key, record } of levels.get(level) ?? []) {
|
|
90
|
+
if (!checkedKeys.has(key) || isDisabled(record)) continue;
|
|
91
|
+
for (const child of children) if (!isDisabled(child.record)) checkedKeys.add(child.key);
|
|
92
|
+
}
|
|
93
|
+
return conductUp(checkedKeys, levels, maxLevel, isDisabled, "fill");
|
|
94
|
+
}
|
|
95
|
+
const halfKeys = new Set(checked.halfCheckedKeys);
|
|
96
|
+
for (let level = 0; level <= maxLevel; level += 1) for (const { children, key, record } of levels.get(level) ?? []) {
|
|
97
|
+
if (checkedKeys.has(key) || halfKeys.has(key) || isDisabled(record)) continue;
|
|
98
|
+
for (const child of children) if (!isDisabled(child.record)) checkedKeys.delete(child.key);
|
|
99
|
+
}
|
|
100
|
+
return conductUp(checkedKeys, levels, maxLevel, isDisabled, "clean");
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* antd `useMultipleSelect`: Shift-click toggles the range between the previous click and
|
|
104
|
+
* `currentIndex` in `keys`, mutating `selectedKeys`. Returns the changed keys and the next anchor.
|
|
105
|
+
*/
|
|
106
|
+
const selectRange = (prevIndex, currentIndex, keys, selectedKeys) => {
|
|
107
|
+
const anchor = prevIndex ?? currentIndex;
|
|
108
|
+
const start = Math.min(anchor || 0, currentIndex);
|
|
109
|
+
const end = Math.max(anchor || 0, currentIndex);
|
|
110
|
+
const rangeKeys = keys.slice(start, end + 1);
|
|
111
|
+
const shouldSelect = rangeKeys.some((key) => !selectedKeys.has(key));
|
|
112
|
+
const changedKeys = [];
|
|
113
|
+
for (const key of rangeKeys) if (shouldSelect) {
|
|
114
|
+
if (!selectedKeys.has(key)) changedKeys.push(key);
|
|
115
|
+
selectedKeys.add(key);
|
|
116
|
+
} else {
|
|
117
|
+
selectedKeys.delete(key);
|
|
118
|
+
changedKeys.push(key);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
changedKeys,
|
|
122
|
+
nextAnchor: shouldSelect ? end : null
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
//#endregion
|
|
126
|
+
export { SELECTION_ALL, SELECTION_COLUMN, SELECTION_INVERT, SELECTION_NONE, conductCheck, convertDataToEntities, flattenData, isPlainObject, selectRange };
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=selectionUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionUtils.mjs","names":[],"sources":["../../../src/base-ui/Table/selectionUtils.ts"],"sourcesContent":["import type { Key } from 'react';\n\nimport type { TableColumn } from './type';\n\n/** Placeholder in `columns` marking where the selection column goes. */\nexport const SELECTION_COLUMN = {} as TableColumn<any>;\nexport const SELECTION_ALL = 'SELECT_ALL' as const;\nexport const SELECTION_INVERT = 'SELECT_INVERT' as const;\nexport const SELECTION_NONE = 'SELECT_NONE' as const;\n\n/** A tree record with its position, for `checkStrictly: false` cascading. */\nexport interface SelectionEntity<T> {\n children: SelectionEntity<T>[];\n key: Key;\n level: number;\n parent?: SelectionEntity<T>;\n record: T;\n}\n\nexport type SelectionEntities<T> = Map<Key, SelectionEntity<T>>;\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** Every record of `data`, tree children included, in display order. */\nexport const flattenData = <T>(childrenColumnName: string, data: readonly T[] | undefined) => {\n const list: T[] = [];\n const dig = (records: readonly T[] | undefined) => {\n (records || []).forEach((record) => {\n list.push(record);\n if (isPlainObject(record) && childrenColumnName in record) {\n dig(record[childrenColumnName] as T[]);\n }\n });\n };\n dig(data);\n return list;\n};\n\n/** rc-tree `convertDataToEntities`, keyed by row key. */\nexport const convertDataToEntities = <T>(\n data: readonly T[],\n getRowKey: (record: T, index: number) => Key,\n childrenColumnName: string,\n): SelectionEntities<T> => {\n const entities: SelectionEntities<T> = new Map();\n const dig = (records: readonly T[], level: number, parent?: SelectionEntity<T>) => {\n records.forEach((record, index) => {\n const entity: SelectionEntity<T> = {\n children: [],\n key: getRowKey(record, index),\n level,\n parent,\n record,\n };\n entities.set(entity.key, entity);\n parent?.children.push(entity);\n const children = isPlainObject(record) ? record[childrenColumnName] : undefined;\n if (Array.isArray(children)) dig(children as T[], level + 1, entity);\n });\n };\n dig(data, 0);\n return entities;\n};\n\ntype IsDisabled<T> = (record: T) => boolean;\n\nconst groupByLevel = <T>(entities: SelectionEntities<T>) => {\n const levels = new Map<number, SelectionEntity<T>[]>();\n let maxLevel = 0;\n entities.forEach((entity) => {\n const list = levels.get(entity.level);\n if (list) list.push(entity);\n else levels.set(entity.level, [entity]);\n maxLevel = Math.max(maxLevel, entity.level);\n });\n return { levels, maxLevel };\n};\n\n/** Bottom-up pass shared by fill and clean: decides each parent from its enabled children. */\nconst conductUp = <T>(\n checkedKeys: Set<Key>,\n levels: Map<number, SelectionEntity<T>[]>,\n maxLevel: number,\n isDisabled: IsDisabled<T>,\n mode: 'fill' | 'clean',\n) => {\n const halfCheckedKeys = new Set<Key>();\n const visited = new Set<Key>();\n for (let level = maxLevel; level >= 0; level -= 1) {\n for (const { parent, record } of levels.get(level) ?? []) {\n if (isDisabled(record) || !parent || visited.has(parent.key)) continue;\n visited.add(parent.key);\n if (isDisabled(parent.record)) continue;\n\n let allChecked = true;\n let partialChecked = false;\n for (const child of parent.children) {\n if (isDisabled(child.record)) continue;\n const checked = checkedKeys.has(child.key);\n if (!checked) allChecked = false;\n if (checked || halfCheckedKeys.has(child.key)) partialChecked = true;\n }\n if (mode === 'fill' && allChecked) checkedKeys.add(parent.key);\n if (mode === 'clean' && !allChecked) checkedKeys.delete(parent.key);\n if (partialChecked) halfCheckedKeys.add(parent.key);\n }\n }\n return {\n checkedKeys: [...checkedKeys],\n halfCheckedKeys: [...halfCheckedKeys].filter((key) => !checkedKeys.has(key)),\n };\n};\n\n/**\n * rc-tree `conductCheck`: `true` fills in descendants and fully-checked ancestors of `keyList`;\n * `{ checked: false, halfCheckedKeys }` cleans up after a key was removed. Disabled rows neither\n * pass the check on nor count toward their parent. Keys missing from `entities` are dropped.\n */\nexport const conductCheck = <T>(\n keyList: readonly Key[],\n checked: true | { checked: false; halfCheckedKeys: Key[] },\n entities: SelectionEntities<T>,\n isDisabled: IsDisabled<T>,\n) => {\n const checkedKeys = new Set(keyList.filter((key) => entities.has(key)));\n const { levels, maxLevel } = groupByLevel(entities);\n\n if (checked === true) {\n for (let level = 0; level <= maxLevel; level += 1) {\n for (const { children, key, record } of levels.get(level) ?? []) {\n if (!checkedKeys.has(key) || isDisabled(record)) continue;\n for (const child of children) {\n if (!isDisabled(child.record)) checkedKeys.add(child.key);\n }\n }\n }\n return conductUp(checkedKeys, levels, maxLevel, isDisabled, 'fill');\n }\n\n const halfKeys = new Set(checked.halfCheckedKeys);\n for (let level = 0; level <= maxLevel; level += 1) {\n for (const { children, key, record } of levels.get(level) ?? []) {\n if (checkedKeys.has(key) || halfKeys.has(key) || isDisabled(record)) continue;\n for (const child of children) {\n if (!isDisabled(child.record)) checkedKeys.delete(child.key);\n }\n }\n }\n return conductUp(checkedKeys, levels, maxLevel, isDisabled, 'clean');\n};\n\n/**\n * antd `useMultipleSelect`: Shift-click toggles the range between the previous click and\n * `currentIndex` in `keys`, mutating `selectedKeys`. Returns the changed keys and the next anchor.\n */\nexport const selectRange = (\n prevIndex: number | null,\n currentIndex: number,\n keys: readonly Key[],\n selectedKeys: Set<Key>,\n) => {\n const anchor = prevIndex ?? currentIndex;\n const start = Math.min(anchor || 0, currentIndex);\n const end = Math.max(anchor || 0, currentIndex);\n const rangeKeys = keys.slice(start, end + 1);\n const shouldSelect = rangeKeys.some((key) => !selectedKeys.has(key));\n const changedKeys: Key[] = [];\n for (const key of rangeKeys) {\n if (shouldSelect) {\n if (!selectedKeys.has(key)) changedKeys.push(key);\n selectedKeys.add(key);\n } else {\n selectedKeys.delete(key);\n changedKeys.push(key);\n }\n }\n return { changedKeys, nextAnchor: shouldSelect ? end : null };\n};\n"],"mappings":";;AAKA,MAAa,mBAAmB,CAAC;AACjC,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;AAChC,MAAa,iBAAiB;AAa9B,MAAa,iBAAiB,UAC5B,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;;AAGrE,MAAa,eAAkB,oBAA4B,SAAmC;CAC5F,MAAM,OAAY,CAAC;CACnB,MAAM,OAAO,YAAsC;EACjD,CAAC,WAAW,CAAC,EAAA,CAAG,SAAS,WAAW;GAClC,KAAK,KAAK,MAAM;GAChB,IAAI,cAAc,MAAM,KAAK,sBAAsB,QACjD,IAAI,OAAO,mBAA0B;EAEzC,CAAC;CACH;CACA,IAAI,IAAI;CACR,OAAO;AACT;;AAGA,MAAa,yBACX,MACA,WACA,uBACyB;CACzB,MAAM,2BAAiC,IAAI,IAAI;CAC/C,MAAM,OAAO,SAAuB,OAAe,WAAgC;EACjF,QAAQ,SAAS,QAAQ,UAAU;GACjC,MAAM,SAA6B;IACjC,UAAU,CAAC;IACX,KAAK,UAAU,QAAQ,KAAK;IAC5B;IACA;IACA;GACF;GACA,SAAS,IAAI,OAAO,KAAK,MAAM;GAC/B,QAAQ,SAAS,KAAK,MAAM;GAC5B,MAAM,WAAW,cAAc,MAAM,IAAI,OAAO,sBAAsB,KAAA;GACtE,IAAI,MAAM,QAAQ,QAAQ,GAAG,IAAI,UAAiB,QAAQ,GAAG,MAAM;EACrE,CAAC;CACH;CACA,IAAI,MAAM,CAAC;CACX,OAAO;AACT;AAIA,MAAM,gBAAmB,aAAmC;CAC1D,MAAM,yBAAS,IAAI,IAAkC;CACrD,IAAI,WAAW;CACf,SAAS,SAAS,WAAW;EAC3B,MAAM,OAAO,OAAO,IAAI,OAAO,KAAK;EACpC,IAAI,MAAM,KAAK,KAAK,MAAM;OACrB,OAAO,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC;EACtC,WAAW,KAAK,IAAI,UAAU,OAAO,KAAK;CAC5C,CAAC;CACD,OAAO;EAAE;EAAQ;CAAS;AAC5B;;AAGA,MAAM,aACJ,aACA,QACA,UACA,YACA,SACG;CACH,MAAM,kCAAkB,IAAI,IAAS;CACrC,MAAM,0BAAU,IAAI,IAAS;CAC7B,KAAK,IAAI,QAAQ,UAAU,SAAS,GAAG,SAAS,GAC9C,KAAK,MAAM,EAAE,QAAQ,YAAY,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG;EACxD,IAAI,WAAW,MAAM,KAAK,CAAC,UAAU,QAAQ,IAAI,OAAO,GAAG,GAAG;EAC9D,QAAQ,IAAI,OAAO,GAAG;EACtB,IAAI,WAAW,OAAO,MAAM,GAAG;EAE/B,IAAI,aAAa;EACjB,IAAI,iBAAiB;EACrB,KAAK,MAAM,SAAS,OAAO,UAAU;GACnC,IAAI,WAAW,MAAM,MAAM,GAAG;GAC9B,MAAM,UAAU,YAAY,IAAI,MAAM,GAAG;GACzC,IAAI,CAAC,SAAS,aAAa;GAC3B,IAAI,WAAW,gBAAgB,IAAI,MAAM,GAAG,GAAG,iBAAiB;EAClE;EACA,IAAI,SAAS,UAAU,YAAY,YAAY,IAAI,OAAO,GAAG;EAC7D,IAAI,SAAS,WAAW,CAAC,YAAY,YAAY,OAAO,OAAO,GAAG;EAClE,IAAI,gBAAgB,gBAAgB,IAAI,OAAO,GAAG;CACpD;CAEF,OAAO;EACL,aAAa,CAAC,GAAG,WAAW;EAC5B,iBAAiB,CAAC,GAAG,eAAe,CAAC,CAAC,QAAQ,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC;CAC7E;AACF;;;;;;AAOA,MAAa,gBACX,SACA,SACA,UACA,eACG;CACH,MAAM,cAAc,IAAI,IAAI,QAAQ,QAAQ,QAAQ,SAAS,IAAI,GAAG,CAAC,CAAC;CACtE,MAAM,EAAE,QAAQ,aAAa,aAAa,QAAQ;CAElD,IAAI,YAAY,MAAM;EACpB,KAAK,IAAI,QAAQ,GAAG,SAAS,UAAU,SAAS,GAC9C,KAAK,MAAM,EAAE,UAAU,KAAK,YAAY,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG;GAC/D,IAAI,CAAC,YAAY,IAAI,GAAG,KAAK,WAAW,MAAM,GAAG;GACjD,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,WAAW,MAAM,MAAM,GAAG,YAAY,IAAI,MAAM,GAAG;EAE5D;EAEF,OAAO,UAAU,aAAa,QAAQ,UAAU,YAAY,MAAM;CACpE;CAEA,MAAM,WAAW,IAAI,IAAI,QAAQ,eAAe;CAChD,KAAK,IAAI,QAAQ,GAAG,SAAS,UAAU,SAAS,GAC9C,KAAK,MAAM,EAAE,UAAU,KAAK,YAAY,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG;EAC/D,IAAI,YAAY,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,MAAM,GAAG;EACrE,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,WAAW,MAAM,MAAM,GAAG,YAAY,OAAO,MAAM,GAAG;CAE/D;CAEF,OAAO,UAAU,aAAa,QAAQ,UAAU,YAAY,OAAO;AACrE;;;;;AAMA,MAAa,eACX,WACA,cACA,MACA,iBACG;CACH,MAAM,SAAS,aAAa;CAC5B,MAAM,QAAQ,KAAK,IAAI,UAAU,GAAG,YAAY;CAChD,MAAM,MAAM,KAAK,IAAI,UAAU,GAAG,YAAY;CAC9C,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,CAAC;CAC3C,MAAM,eAAe,UAAU,MAAM,QAAQ,CAAC,aAAa,IAAI,GAAG,CAAC;CACnE,MAAM,cAAqB,CAAC;CAC5B,KAAK,MAAM,OAAO,WAChB,IAAI,cAAc;EAChB,IAAI,CAAC,aAAa,IAAI,GAAG,GAAG,YAAY,KAAK,GAAG;EAChD,aAAa,IAAI,GAAG;CACtB,OAAO;EACL,aAAa,OAAO,GAAG;EACvB,YAAY,KAAK,GAAG;CACtB;CAEF,OAAO;EAAE;EAAa,YAAY,eAAe,MAAM;CAAK;AAC9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { cx } from "antd-style";
|
|
2
|
+
//#region src/base-ui/Table/semantic.ts
|
|
3
|
+
const COMPONENT_KEYS = [
|
|
4
|
+
"cell",
|
|
5
|
+
"row",
|
|
6
|
+
"wrapper"
|
|
7
|
+
];
|
|
8
|
+
/** A `header` / `body` style object is nested when it uses `wrapper` / `row` / `cell` keys. */
|
|
9
|
+
const isComponentsStyles = (value) => COMPONENT_KEYS.some((key) => key in value);
|
|
10
|
+
/** antd `classNames` / `styles` accept a function of `{ props }`. */
|
|
11
|
+
const resolveSemantic = (value, info) => typeof value === "function" ? value(info) : value;
|
|
12
|
+
const mergeClassName = (...names) => cx(...names) || void 0;
|
|
13
|
+
const mergeStyle = (...styles) => styles.some(Boolean) ? Object.assign({}, ...styles) : void 0;
|
|
14
|
+
/**
|
|
15
|
+
* Folds the legacy flat keys into the antd 6 structure: `wrapper` → `section`,
|
|
16
|
+
* `header` (string) → `header.cell`, `body` (string) → `body.wrapper`, `row` → `body.row`,
|
|
17
|
+
* `cell` → `body.cell`.
|
|
18
|
+
*/
|
|
19
|
+
const normalizeClassNames = (classNames) => {
|
|
20
|
+
const { body, cell, header, pagination, row, section, wrapper, ...rest } = classNames ?? {};
|
|
21
|
+
const headerNames = typeof header === "string" ? { cell: header } : header;
|
|
22
|
+
const bodyNames = typeof body === "string" ? { wrapper: body } : body;
|
|
23
|
+
return {
|
|
24
|
+
...rest,
|
|
25
|
+
body: {
|
|
26
|
+
cell: mergeClassName(cell, bodyNames?.cell),
|
|
27
|
+
row: mergeClassName(row, bodyNames?.row),
|
|
28
|
+
wrapper: bodyNames?.wrapper
|
|
29
|
+
},
|
|
30
|
+
header: { ...headerNames },
|
|
31
|
+
pagination: { ...pagination },
|
|
32
|
+
section: mergeClassName(wrapper, section)
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/** Same as `normalizeClassNames`; a `header` / `body` without component keys is a flat style. */
|
|
36
|
+
const normalizeStyles = (styles) => {
|
|
37
|
+
const { body, cell, header, pagination, row, section, wrapper, ...rest } = styles ?? {};
|
|
38
|
+
const headerStyles = header && !isComponentsStyles(header) ? { cell: header } : header;
|
|
39
|
+
const bodyStyles = body && !isComponentsStyles(body) ? { wrapper: body } : body;
|
|
40
|
+
return {
|
|
41
|
+
...rest,
|
|
42
|
+
body: {
|
|
43
|
+
cell: mergeStyle(cell, bodyStyles?.cell),
|
|
44
|
+
row: mergeStyle(row, bodyStyles?.row),
|
|
45
|
+
wrapper: bodyStyles?.wrapper
|
|
46
|
+
},
|
|
47
|
+
header: { ...headerStyles },
|
|
48
|
+
pagination: { ...pagination },
|
|
49
|
+
section: mergeStyle(wrapper, section)
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
export { normalizeClassNames, normalizeStyles, resolveSemantic };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=semantic.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.mjs","names":[],"sources":["../../../src/base-ui/Table/semantic.ts"],"sourcesContent":["import { cx } from 'antd-style';\nimport type { CSSProperties } from 'react';\n\nimport type { PaginationSemanticName } from '@/base-ui/Pagination/type';\n\nimport type {\n TableClassNames,\n TableComponentsSemanticName,\n TableSemanticInfo,\n TableStyles,\n} from './type';\n\ntype Components<V> = Partial<Record<TableComponentsSemanticName, V>>;\n\n/** antd 6 Semantic DOM shape, once legacy flat keys are folded in. */\nexport interface NormalizedSemantic<V> {\n body: Components<V>;\n content?: V;\n footer?: V;\n header: Components<V>;\n pagination: Partial<Record<PaginationSemanticName, V>>;\n root?: V;\n section?: V;\n title?: V;\n}\n\nconst COMPONENT_KEYS: TableComponentsSemanticName[] = ['cell', 'row', 'wrapper'];\n\n/** A `header` / `body` style object is nested when it uses `wrapper` / `row` / `cell` keys. */\nconst isComponentsStyles = (value: object): value is Components<CSSProperties> =>\n COMPONENT_KEYS.some((key) => key in value);\n\n/** antd `classNames` / `styles` accept a function of `{ props }`. */\nexport const resolveSemantic = <V, T>(\n value: V | ((info: TableSemanticInfo<T>) => V) | undefined,\n info: TableSemanticInfo<T>,\n): V | undefined =>\n typeof value === 'function' ? (value as (info: TableSemanticInfo<T>) => V)(info) : value;\n\nconst mergeClassName = (...names: (string | undefined)[]) => cx(...names) || undefined;\n\nconst mergeStyle = (...styles: (CSSProperties | undefined)[]) =>\n styles.some(Boolean) ? Object.assign({}, ...styles) : undefined;\n\n/**\n * Folds the legacy flat keys into the antd 6 structure: `wrapper` → `section`,\n * `header` (string) → `header.cell`, `body` (string) → `body.wrapper`, `row` → `body.row`,\n * `cell` → `body.cell`.\n */\nexport const normalizeClassNames = (\n classNames: TableClassNames | undefined,\n): NormalizedSemantic<string> => {\n const { body, cell, header, pagination, row, section, wrapper, ...rest } = classNames ?? {};\n const headerNames = typeof header === 'string' ? { cell: header } : header;\n const bodyNames = typeof body === 'string' ? { wrapper: body } : body;\n return {\n ...rest,\n body: {\n cell: mergeClassName(cell, bodyNames?.cell),\n row: mergeClassName(row, bodyNames?.row),\n wrapper: bodyNames?.wrapper,\n },\n header: { ...headerNames },\n pagination: { ...pagination },\n section: mergeClassName(wrapper, section),\n };\n};\n\n/** Same as `normalizeClassNames`; a `header` / `body` without component keys is a flat style. */\nexport const normalizeStyles = (\n styles: TableStyles | undefined,\n): NormalizedSemantic<CSSProperties> => {\n const { body, cell, header, pagination, row, section, wrapper, ...rest } = styles ?? {};\n const headerStyles = header && !isComponentsStyles(header) ? { cell: header } : header;\n const bodyStyles = body && !isComponentsStyles(body) ? { wrapper: body } : body;\n return {\n ...rest,\n body: {\n cell: mergeStyle(cell, (bodyStyles as Components<CSSProperties>)?.cell),\n row: mergeStyle(row, (bodyStyles as Components<CSSProperties>)?.row),\n wrapper: (bodyStyles as Components<CSSProperties>)?.wrapper,\n },\n header: { ...(headerStyles as Components<CSSProperties>) },\n pagination: { ...pagination },\n section: mergeStyle(wrapper, section),\n };\n};\n"],"mappings":";;AA0BA,MAAM,iBAAgD;CAAC;CAAQ;CAAO;AAAS;;AAG/E,MAAM,sBAAsB,UAC1B,eAAe,MAAM,QAAQ,OAAO,KAAK;;AAG3C,MAAa,mBACX,OACA,SAEA,OAAO,UAAU,aAAc,MAA4C,IAAI,IAAI;AAErF,MAAM,kBAAkB,GAAG,UAAkC,GAAG,GAAG,KAAK,KAAK,KAAA;AAE7E,MAAM,cAAc,GAAG,WACrB,OAAO,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,GAAG,GAAG,MAAM,IAAI,KAAA;;;;;;AAOxD,MAAa,uBACX,eAC+B;CAC/B,MAAM,EAAE,MAAM,MAAM,QAAQ,YAAY,KAAK,SAAS,SAAS,GAAG,SAAS,cAAc,CAAC;CAC1F,MAAM,cAAc,OAAO,WAAW,WAAW,EAAE,MAAM,OAAO,IAAI;CACpE,MAAM,YAAY,OAAO,SAAS,WAAW,EAAE,SAAS,KAAK,IAAI;CACjE,OAAO;EACL,GAAG;EACH,MAAM;GACJ,MAAM,eAAe,MAAM,WAAW,IAAI;GAC1C,KAAK,eAAe,KAAK,WAAW,GAAG;GACvC,SAAS,WAAW;EACtB;EACA,QAAQ,EAAE,GAAG,YAAY;EACzB,YAAY,EAAE,GAAG,WAAW;EAC5B,SAAS,eAAe,SAAS,OAAO;CAC1C;AACF;;AAGA,MAAa,mBACX,WACsC;CACtC,MAAM,EAAE,MAAM,MAAM,QAAQ,YAAY,KAAK,SAAS,SAAS,GAAG,SAAS,UAAU,CAAC;CACtF,MAAM,eAAe,UAAU,CAAC,mBAAmB,MAAM,IAAI,EAAE,MAAM,OAAO,IAAI;CAChF,MAAM,aAAa,QAAQ,CAAC,mBAAmB,IAAI,IAAI,EAAE,SAAS,KAAK,IAAI;CAC3E,OAAO;EACL,GAAG;EACH,MAAM;GACJ,MAAM,WAAW,MAAO,YAA0C,IAAI;GACtE,KAAK,WAAW,KAAM,YAA0C,GAAG;GACnE,SAAU,YAA0C;EACtD;EACA,QAAQ,EAAE,GAAI,aAA2C;EACzD,YAAY,EAAE,GAAG,WAAW;EAC5B,SAAS,WAAW,SAAS,OAAO;CACtC;AACF"}
|