@lobehub/ui 5.51.2 → 5.53.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/Accordion/Accordion.mjs +1 -1
- package/es/Accordion/Accordion.mjs.map +1 -1
- package/es/ActionIconGroup/type.d.mts +2 -1
- package/es/Alert/Alert.mjs +1 -1
- package/es/AutoComplete/Select.mjs +1 -1
- package/es/Avatar/Avatar.mjs +2 -2
- package/es/Burger/Burger.mjs +2 -2
- package/es/Burger/Burger.mjs.map +1 -1
- package/es/Button/Button.mjs +1 -1
- package/es/CodeDiff/DiffPanel.mjs +1 -1
- package/es/CodeDiff/DiffPanel.mjs.map +1 -1
- package/es/Collapse/Collapse.mjs +1 -1
- package/es/ColorSwatches/ColorSwatches.mjs +21 -21
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/ColorSwatches/style.mjs +3 -12
- package/es/ColorSwatches/style.mjs.map +1 -1
- package/es/DatePicker/DatePicker.mjs +1 -1
- package/es/DraggablePanel/DraggablePanel.mjs +1 -1
- package/es/Drawer/Drawer.mjs +1 -1
- package/es/EditableText/ControlInput.d.mts +2 -2
- package/es/EditableText/ControlInput.mjs +1 -1
- package/es/EditableText/ControlInput.mjs.map +1 -1
- package/es/EditableText/EditableText.mjs +1 -0
- package/es/EditableText/EditableText.mjs.map +1 -1
- package/es/EditableText/type.d.mts +5 -1
- package/es/EmojiPicker/AvatarUploader.mjs +76 -71
- package/es/EmojiPicker/AvatarUploader.mjs.map +1 -1
- package/es/EmojiPicker/EmojiPicker.mjs +12 -6
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/EmojiPicker/style.mjs +32 -9
- package/es/EmojiPicker/style.mjs.map +1 -1
- package/es/EmojiPicker/type.d.mts +2 -1
- package/es/Form/Form.mjs +1 -1
- package/es/Form/components/FormDivider.mjs +1 -1
- package/es/Form/components/FormItem.mjs +1 -1
- package/es/Form/components/FormSubmitFooter.mjs +1 -1
- package/es/Form/components/FormTitle.mjs +1 -1
- package/es/GroupAvatar/GroupAvatar.mjs +1 -1
- package/es/GroupAvatar/GroupAvatar.mjs.map +1 -1
- package/es/GroupAvatar/type.d.mts +2 -1
- package/es/Highlighter/Highlighter.mjs +1 -1
- package/es/Highlighter/Highlighter.mjs.map +1 -1
- package/es/Highlighter/LangSelect.mjs +23 -13
- package/es/Highlighter/LangSelect.mjs.map +1 -1
- package/es/Highlighter/style.mjs +1 -1
- package/es/Highlighter/style.mjs.map +1 -1
- package/es/HtmlPreview/HtmlPreview.mjs +28 -1
- package/es/HtmlPreview/HtmlPreview.mjs.map +1 -1
- package/es/Image/viewer/ImageViewer.mjs +1 -1
- package/es/Image/viewer/ImageViewer.mjs.map +1 -1
- package/es/Image/viewer/Toolbar.mjs +1 -1
- package/es/Input/Input.mjs +1 -1
- package/es/Input/InputNumber.mjs +1 -1
- package/es/Input/InputOPT.mjs +1 -1
- package/es/Input/InputPassword.mjs +1 -1
- package/es/Input/TextArea.mjs +1 -1
- package/es/Menu/Menu.mjs +1 -1
- package/es/Menu/index.d.mts +2 -1
- package/es/Menu/index.mjs +1 -1
- package/es/Menu/itemInterface.d.mts +71 -0
- package/es/Menu/type.d.mts +8 -8
- package/es/Mermaid/Mermaid.mjs +1 -1
- package/es/Mermaid/Mermaid.mjs.map +1 -1
- package/es/Modal/Modal.mjs +1 -1
- package/es/SearchBar/SearchBar.mjs +1 -1
- package/es/SearchBar/SearchBar.mjs.map +1 -1
- package/es/SearchBar/type.d.mts +2 -2
- package/es/Segmented/Segmented.mjs +1 -1
- package/es/Select/Select.mjs +1 -1
- package/es/SliderWithInput/SliderWithInput.mjs +1 -1
- package/es/Tabs/Tabs.mjs +1 -1
- package/es/Tag/Tag.mjs +1 -1
- package/es/ThemeProvider/ConfigProvider.mjs +1 -1
- package/es/ThemeProvider/ThemeProvider.mjs +1 -1
- package/es/ThemeSwitch/ThemeSwitch.mjs +1 -1
- package/es/Toc/Toc.mjs +1 -1
- package/es/Toc/TocMobile.mjs +1 -1
- package/es/awesome/AgentSkillCard/AgentSkillCard.mjs +1 -1
- package/es/awesome/Hero/Hero.mjs +1 -1
- package/es/awesome/LandingSection/LandingSection.mjs +1 -1
- package/es/base-ui/Anchor/Anchor.d.mts +6 -0
- package/es/base-ui/Anchor/Anchor.mjs +141 -0
- package/es/base-ui/Anchor/Anchor.mjs.map +1 -0
- package/es/base-ui/Anchor/index.d.mts +3 -0
- package/es/base-ui/Anchor/style.mjs +80 -0
- package/es/base-ui/Anchor/style.mjs.map +1 -0
- package/es/base-ui/Anchor/type.d.mts +20 -0
- package/es/base-ui/AutoComplete/AutoComplete.mjs.map +1 -1
- package/es/base-ui/Avatar/Avatar.mjs +1 -1
- package/es/base-ui/Breadcrumb/Breadcrumb.d.mts +6 -0
- package/es/base-ui/Breadcrumb/Breadcrumb.mjs +58 -0
- package/es/base-ui/Breadcrumb/Breadcrumb.mjs.map +1 -0
- package/es/base-ui/Breadcrumb/index.d.mts +3 -0
- package/es/base-ui/Breadcrumb/style.mjs +65 -0
- package/es/base-ui/Breadcrumb/style.mjs.map +1 -0
- package/es/base-ui/Breadcrumb/type.d.mts +24 -0
- package/es/base-ui/Burger/Burger.d.mts +6 -0
- package/es/base-ui/Burger/Burger.mjs +69 -0
- package/es/base-ui/Burger/Burger.mjs.map +1 -0
- package/es/base-ui/Burger/index.d.mts +3 -0
- package/es/base-ui/Burger/style.mjs +63 -0
- package/es/base-ui/Burger/style.mjs.map +1 -0
- package/es/base-ui/Burger/type.d.mts +23 -0
- package/es/base-ui/Carousel/Carousel.d.mts +6 -0
- package/es/base-ui/Carousel/Carousel.mjs +157 -0
- package/es/base-ui/Carousel/Carousel.mjs.map +1 -0
- package/es/base-ui/Carousel/index.d.mts +3 -0
- package/es/base-ui/Carousel/style.mjs +88 -0
- package/es/base-ui/Carousel/style.mjs.map +1 -0
- package/es/base-ui/Carousel/type.d.mts +23 -0
- package/es/base-ui/ColorPicker/ColorPicker.d.mts +6 -0
- package/es/base-ui/ColorPicker/ColorPicker.mjs +227 -0
- package/es/base-ui/ColorPicker/ColorPicker.mjs.map +1 -0
- package/es/base-ui/ColorPicker/SaturationArea.mjs +64 -0
- package/es/base-ui/ColorPicker/SaturationArea.mjs.map +1 -0
- package/es/base-ui/ColorPicker/color.mjs +28 -0
- package/es/base-ui/ColorPicker/color.mjs.map +1 -0
- package/es/base-ui/ColorPicker/index.d.mts +3 -0
- package/es/base-ui/ColorPicker/style.mjs +180 -0
- package/es/base-ui/ColorPicker/style.mjs.map +1 -0
- package/es/base-ui/ColorPicker/type.d.mts +20 -0
- package/es/base-ui/ContextMenu/ContextMenuHost.mjs.map +1 -1
- package/es/base-ui/ContextMenu/renderItems.d.mts +0 -1
- package/es/base-ui/ContextMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/DatePicker/CalendarPanel.mjs +188 -0
- package/es/base-ui/DatePicker/CalendarPanel.mjs.map +1 -0
- package/es/base-ui/DatePicker/DatePicker.d.mts +6 -0
- package/es/base-ui/DatePicker/DatePicker.mjs +88 -0
- package/es/base-ui/DatePicker/DatePicker.mjs.map +1 -0
- package/es/base-ui/DatePicker/DateRangePicker.d.mts +6 -0
- package/es/base-ui/DatePicker/DateRangePicker.mjs +128 -0
- package/es/base-ui/DatePicker/DateRangePicker.mjs.map +1 -0
- package/es/base-ui/DatePicker/PickerShell.mjs +43 -0
- package/es/base-ui/DatePicker/PickerShell.mjs.map +1 -0
- package/es/base-ui/DatePicker/calendar.d.mts +5 -0
- package/es/base-ui/DatePicker/calendar.mjs +46 -0
- package/es/base-ui/DatePicker/calendar.mjs.map +1 -0
- package/es/base-ui/DatePicker/index.d.mts +5 -0
- package/es/base-ui/DatePicker/style.mjs +193 -0
- package/es/base-ui/DatePicker/style.mjs.map +1 -0
- package/es/base-ui/DatePicker/type.d.mts +35 -0
- package/es/base-ui/Descriptions/Descriptions.d.mts +6 -0
- package/es/base-ui/Descriptions/Descriptions.mjs +62 -0
- package/es/base-ui/Descriptions/Descriptions.mjs.map +1 -0
- package/es/base-ui/Descriptions/index.d.mts +3 -0
- package/es/base-ui/Descriptions/style.mjs +64 -0
- package/es/base-ui/Descriptions/style.mjs.map +1 -0
- package/es/base-ui/Descriptions/type.d.mts +28 -0
- package/es/base-ui/Divider/Divider.d.mts +6 -0
- package/es/base-ui/Divider/Divider.mjs +30 -0
- package/es/base-ui/Divider/Divider.mjs.map +1 -0
- package/es/base-ui/Divider/index.d.mts +3 -0
- package/es/base-ui/Divider/style.mjs +59 -0
- package/es/base-ui/Divider/style.mjs.map +1 -0
- package/es/base-ui/Divider/type.d.mts +12 -0
- package/es/base-ui/Drawer/atoms.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/atoms.mjs +1 -1
- package/es/base-ui/DropdownMenu/atoms.mjs.map +1 -1
- package/es/base-ui/DropdownMenu/renderItems.d.mts +0 -1
- package/es/base-ui/DropdownMenu/renderItems.mjs.map +1 -1
- package/es/base-ui/Form/components/FormTitle.mjs +1 -1
- package/es/base-ui/Form/components/FormTitle.mjs.map +1 -1
- package/es/base-ui/Form/type.d.mts +2 -2
- package/es/base-ui/Input/ClearButton.mjs +32 -0
- package/es/base-ui/Input/ClearButton.mjs.map +1 -0
- package/es/base-ui/Input/Input.mjs +30 -4
- package/es/base-ui/Input/Input.mjs.map +1 -1
- package/es/base-ui/Input/InputNumber.mjs +43 -22
- package/es/base-ui/Input/InputNumber.mjs.map +1 -1
- package/es/base-ui/Input/TextArea.mjs +50 -13
- package/es/base-ui/Input/TextArea.mjs.map +1 -1
- package/es/base-ui/Input/clearNativeValue.mjs +12 -0
- package/es/base-ui/Input/clearNativeValue.mjs.map +1 -0
- package/es/base-ui/Input/pressEnter.mjs +6 -0
- package/es/base-ui/Input/pressEnter.mjs.map +1 -0
- package/es/base-ui/Input/style.d.mts +5 -1
- package/es/base-ui/Input/style.mjs +67 -4
- package/es/base-ui/Input/style.mjs.map +1 -1
- package/es/base-ui/Input/type.d.mts +13 -2
- package/es/base-ui/List/List.d.mts +6 -0
- package/es/base-ui/List/List.mjs +50 -0
- package/es/base-ui/List/List.mjs.map +1 -0
- package/es/base-ui/List/ListRow.mjs +74 -0
- package/es/base-ui/List/ListRow.mjs.map +1 -0
- package/es/base-ui/List/index.d.mts +3 -0
- package/es/base-ui/List/style.mjs +146 -0
- package/es/base-ui/List/style.mjs.map +1 -0
- package/es/base-ui/List/type.d.mts +48 -0
- package/es/base-ui/Modal/atoms.mjs.map +1 -1
- package/es/base-ui/Modal/imperative.mjs +1 -1
- package/es/base-ui/Modal/imperative.mjs.map +1 -1
- package/es/base-ui/Modal/type.d.mts +1 -0
- package/es/base-ui/Popover/PopoverPortal.mjs.map +1 -1
- package/es/base-ui/Progress/Progress.mjs +16 -14
- package/es/base-ui/Progress/Progress.mjs.map +1 -1
- package/es/base-ui/Progress/style.mjs +16 -25
- package/es/base-ui/Progress/style.mjs.map +1 -1
- package/es/base-ui/QRCode/QRCode.d.mts +6 -0
- package/es/base-ui/QRCode/QRCode.mjs +105 -0
- package/es/base-ui/QRCode/QRCode.mjs.map +1 -0
- package/es/base-ui/QRCode/index.d.mts +3 -0
- package/es/base-ui/QRCode/qrPath.mjs +16 -0
- package/es/base-ui/QRCode/qrPath.mjs.map +1 -0
- package/es/base-ui/QRCode/style.mjs +52 -0
- package/es/base-ui/QRCode/style.mjs.map +1 -0
- package/es/base-ui/QRCode/type.d.mts +19 -0
- package/es/base-ui/Rate/Rate.d.mts +6 -0
- package/es/base-ui/Rate/Rate.mjs +111 -0
- package/es/base-ui/Rate/Rate.mjs.map +1 -0
- package/es/base-ui/Rate/index.d.mts +3 -0
- package/es/base-ui/Rate/style.mjs +81 -0
- package/es/base-ui/Rate/style.mjs.map +1 -0
- package/es/base-ui/Rate/type.d.mts +19 -0
- package/es/base-ui/Select/atoms.mjs.map +1 -1
- package/es/base-ui/Select/hooks.mjs.map +1 -1
- package/es/base-ui/Statistic/Statistic.d.mts +6 -0
- package/es/base-ui/Statistic/Statistic.mjs +42 -0
- package/es/base-ui/Statistic/Statistic.mjs.map +1 -0
- package/es/base-ui/Statistic/formatValue.d.mts +5 -0
- package/es/base-ui/Statistic/formatValue.mjs +23 -0
- package/es/base-ui/Statistic/formatValue.mjs.map +1 -0
- package/es/base-ui/Statistic/index.d.mts +4 -0
- package/es/base-ui/Statistic/style.mjs +34 -0
- package/es/base-ui/Statistic/style.mjs.map +1 -0
- package/es/base-ui/Statistic/type.d.mts +23 -0
- package/es/base-ui/Steps/Steps.d.mts +6 -0
- package/es/base-ui/Steps/Steps.mjs +74 -0
- package/es/base-ui/Steps/Steps.mjs.map +1 -0
- package/es/base-ui/Steps/index.d.mts +3 -0
- package/es/base-ui/Steps/style.mjs +155 -0
- package/es/base-ui/Steps/style.mjs.map +1 -0
- package/es/base-ui/Steps/type.d.mts +32 -0
- package/es/base-ui/Table/FilterMenu.mjs +45 -0
- package/es/base-ui/Table/FilterMenu.mjs.map +1 -0
- package/es/base-ui/Table/Table.d.mts +10 -0
- package/es/base-ui/Table/Table.mjs +134 -0
- package/es/base-ui/Table/Table.mjs.map +1 -0
- package/es/base-ui/Table/TableBody.mjs +59 -0
- package/es/base-ui/Table/TableBody.mjs.map +1 -0
- package/es/base-ui/Table/TableHead.mjs +50 -0
- package/es/base-ui/Table/TableHead.mjs.map +1 -0
- package/es/base-ui/Table/features.mjs +12 -0
- package/es/base-ui/Table/features.mjs.map +1 -0
- package/es/base-ui/Table/fixedOffsets.mjs +29 -0
- package/es/base-ui/Table/fixedOffsets.mjs.map +1 -0
- package/es/base-ui/Table/index.d.mts +3 -0
- package/es/base-ui/Table/style.mjs +168 -0
- package/es/base-ui/Table/style.mjs.map +1 -0
- package/es/base-ui/Table/toColumnDefs.mjs +26 -0
- package/es/base-ui/Table/toColumnDefs.mjs.map +1 -0
- package/es/base-ui/Table/type.d.mts +68 -0
- package/es/base-ui/Table/useTableState.mjs +99 -0
- package/es/base-ui/Table/useTableState.mjs.map +1 -0
- package/es/base-ui/Toast/imperative.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipGroup.mjs.map +1 -1
- package/es/base-ui/Tooltip/TooltipStandalone.mjs.map +1 -1
- package/es/base-ui/index.d.mts +66 -21
- package/es/base-ui/index.mjs +42 -26
- package/es/base-ui/panelStyles.mjs +95 -0
- package/es/base-ui/panelStyles.mjs.map +1 -0
- package/es/chat/ChatList/components/HistoryDivider.mjs +9 -6
- package/es/chat/ChatList/components/HistoryDivider.mjs.map +1 -1
- package/es/chat/MessageModal/MessageModal.mjs +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +1 -1
- package/es/color/CssVar/VarRow.mjs +1 -1
- package/es/color/CssVar/index.mjs +1 -1
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs +1 -1
- package/es/eslint/index.mjs +100 -0
- package/es/eslint/index.mjs.map +1 -1
- package/es/i18n/resources/en/burger.d.mts +8 -0
- package/es/i18n/resources/en/burger.mjs +9 -0
- package/es/i18n/resources/en/burger.mjs.map +1 -0
- package/es/i18n/resources/en/colorPicker.d.mts +12 -0
- package/es/i18n/resources/en/colorPicker.mjs +13 -0
- package/es/i18n/resources/en/colorPicker.mjs.map +1 -0
- package/es/i18n/resources/en/common.d.mts +1 -0
- package/es/i18n/resources/en/common.mjs +1 -0
- package/es/i18n/resources/en/common.mjs.map +1 -1
- package/es/i18n/resources/en/datePicker.d.mts +13 -0
- package/es/i18n/resources/en/datePicker.mjs +14 -0
- package/es/i18n/resources/en/datePicker.mjs.map +1 -0
- package/es/i18n/resources/en/index.d.mts +15 -11
- package/es/i18n/resources/en/index.mjs +9 -1
- package/es/i18n/resources/en/index.mjs.map +1 -1
- package/es/i18n/resources/en/qrCode.d.mts +9 -0
- package/es/i18n/resources/en/qrCode.mjs +10 -0
- package/es/i18n/resources/en/qrCode.mjs.map +1 -0
- package/es/i18n/resources/zhCn/burger.d.mts +8 -0
- package/es/i18n/resources/zhCn/burger.mjs +9 -0
- package/es/i18n/resources/zhCn/burger.mjs.map +1 -0
- package/es/i18n/resources/zhCn/colorPicker.d.mts +12 -0
- package/es/i18n/resources/zhCn/colorPicker.mjs +13 -0
- package/es/i18n/resources/zhCn/colorPicker.mjs.map +1 -0
- package/es/i18n/resources/zhCn/common.d.mts +1 -0
- package/es/i18n/resources/zhCn/common.mjs +1 -0
- package/es/i18n/resources/zhCn/common.mjs.map +1 -1
- package/es/i18n/resources/zhCn/datePicker.d.mts +13 -0
- package/es/i18n/resources/zhCn/datePicker.mjs +14 -0
- package/es/i18n/resources/zhCn/datePicker.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +15 -11
- package/es/i18n/resources/zhCn/index.mjs +9 -1
- package/es/i18n/resources/zhCn/index.mjs.map +1 -1
- package/es/i18n/resources/zhCn/qrCode.d.mts +9 -0
- package/es/i18n/resources/zhCn/qrCode.mjs +10 -0
- package/es/i18n/resources/zhCn/qrCode.mjs.map +1 -0
- package/es/i18n/types.d.mts +14 -10
- package/es/index.d.mts +12 -11
- package/es/index.mjs +23 -23
- package/es/mdx/Cards/Card.d.mts +2 -2
- package/es/mdx/Cards/Card.mjs +1 -1
- package/es/mdx/Cards/Card.mjs.map +1 -1
- package/es/mdx/Mdx/index.mjs +1 -1
- package/es/mdx/Mdx/index.mjs.map +1 -1
- package/es/mdx/Tabs/index.d.mts +2 -2
- package/es/mdx/Tabs/index.mjs +7 -2
- package/es/mdx/Tabs/index.mjs.map +1 -1
- package/es/mdx/Tabs/style.mjs +33 -1
- package/es/mdx/Tabs/style.mjs.map +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs +1 -1
- package/es/mdx/mdxComponents/Citation/PopoverPanel.mjs.map +1 -1
- package/es/node_modules/.pnpm/unist-util-visit@5.1.0/node_modules/unist-util-visit/lib/index.mjs.map +1 -1
- package/es/static-css/baseline.mjs +1 -4
- package/es/static-css/baseline.mjs.map +1 -1
- package/es/static-css/buildAntdStaticCss.mjs +1 -1
- package/package.json +3 -1
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import Spin from "../Spin/Spin.mjs";
|
|
3
|
+
import Empty from "../../Empty/Empty.mjs";
|
|
4
|
+
import { styles } from "./style.mjs";
|
|
5
|
+
import { getCellValue } from "./toColumnDefs.mjs";
|
|
6
|
+
import { createElement } from "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { cx } from "antd-style";
|
|
9
|
+
//#region src/base-ui/Table/TableBody.tsx
|
|
10
|
+
const TableBody = ({ classNames, columnIds, columns, emptyText, fixedOffsets, loading, onRow, rowClassName, rows, styles: customStyles }) => {
|
|
11
|
+
if (rows.length === 0) return /* @__PURE__ */ jsx("tbody", {
|
|
12
|
+
className: classNames?.body,
|
|
13
|
+
style: customStyles?.body,
|
|
14
|
+
children: /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", {
|
|
15
|
+
className: styles.empty,
|
|
16
|
+
colSpan: columns.length,
|
|
17
|
+
children: loading ? /* @__PURE__ */ jsx(Spin, {}) : emptyText ?? /* @__PURE__ */ jsx(Empty, { description: "No data" })
|
|
18
|
+
}) })
|
|
19
|
+
});
|
|
20
|
+
return /* @__PURE__ */ jsx("tbody", {
|
|
21
|
+
className: classNames?.body,
|
|
22
|
+
style: customStyles?.body,
|
|
23
|
+
children: rows.map((row, rowIndex) => {
|
|
24
|
+
const record = row.original;
|
|
25
|
+
const rowProps = onRow?.(record, rowIndex) ?? {};
|
|
26
|
+
const extraClassName = typeof rowClassName === "function" ? rowClassName(record, rowIndex) : rowClassName;
|
|
27
|
+
return /* @__PURE__ */ createElement("tr", {
|
|
28
|
+
...rowProps,
|
|
29
|
+
key: row.id,
|
|
30
|
+
style: {
|
|
31
|
+
...customStyles?.row,
|
|
32
|
+
...rowProps.style
|
|
33
|
+
},
|
|
34
|
+
className: cx(styles.row, rowProps.onClick && styles.clickable, extraClassName, classNames?.row, rowProps.className)
|
|
35
|
+
}, columns.map((column, columnIndex) => {
|
|
36
|
+
const value = getCellValue(record, column);
|
|
37
|
+
const cellProps = column.onCell?.(record, rowIndex) ?? {};
|
|
38
|
+
const content = column.render ? column.render(value, record, rowIndex) : value;
|
|
39
|
+
return /* @__PURE__ */ createElement("td", {
|
|
40
|
+
...cellProps,
|
|
41
|
+
key: columnIds[columnIndex],
|
|
42
|
+
title: column.ellipsis && typeof content === "string" ? content : cellProps.title,
|
|
43
|
+
className: cx(styles.cell, column.ellipsis && styles.ellipsis, column.fixed && styles.fixed, column.className, classNames?.cell, cellProps.className),
|
|
44
|
+
style: {
|
|
45
|
+
textAlign: column.align,
|
|
46
|
+
width: column.width,
|
|
47
|
+
...fixedOffsets[columnIndex],
|
|
48
|
+
...customStyles?.cell,
|
|
49
|
+
...cellProps.style
|
|
50
|
+
}
|
|
51
|
+
}, content);
|
|
52
|
+
}));
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { TableBody as default };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=TableBody.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableBody.mjs","names":[],"sources":["../../../src/base-ui/Table/TableBody.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport type { CSSProperties, Key, ReactNode } from 'react';\n\nimport Spin from '@/base-ui/Spin';\nimport Empty from '@/Empty';\n\nimport { styles } from './style';\nimport { getCellValue } from './toColumnDefs';\nimport type { TableColumn, TableProps } from './type';\n\ninterface TableBodyProps<T> {\n classNames?: TableProps<T>['classNames'];\n columnIds: string[];\n columns: TableColumn<T>[];\n emptyText?: ReactNode;\n fixedOffsets: (CSSProperties | undefined)[];\n loading: boolean;\n onRow?: TableProps<T>['onRow'];\n rowClassName?: TableProps<T>['rowClassName'];\n rows: { id: Key; original: T }[];\n styles?: TableProps<T>['styles'];\n}\n\nconst TableBody = <T,>({\n classNames,\n columnIds,\n columns,\n emptyText,\n fixedOffsets,\n loading,\n onRow,\n rowClassName,\n rows,\n styles: customStyles,\n}: TableBodyProps<T>) => {\n if (rows.length === 0) {\n return (\n <tbody className={classNames?.body} style={customStyles?.body}>\n <tr>\n <td className={styles.empty} colSpan={columns.length}>\n {loading ? <Spin /> : (emptyText ?? <Empty description=\"No data\" />)}\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody className={classNames?.body} style={customStyles?.body}>\n {rows.map((row, rowIndex) => {\n const record = row.original;\n const rowProps = onRow?.(record, rowIndex) ?? {};\n const extraClassName =\n typeof rowClassName === 'function' ? rowClassName(record, rowIndex) : rowClassName;\n\n return (\n <tr\n {...rowProps}\n key={row.id}\n style={{ ...customStyles?.row, ...rowProps.style }}\n className={cx(\n styles.row,\n rowProps.onClick && styles.clickable,\n extraClassName,\n classNames?.row,\n rowProps.className,\n )}\n >\n {columns.map((column, columnIndex) => {\n const value = getCellValue(record, column);\n const cellProps = column.onCell?.(record, rowIndex) ?? {};\n const content = column.render\n ? column.render(value, record, rowIndex)\n : (value as ReactNode);\n\n return (\n <td\n {...cellProps}\n key={columnIds[columnIndex]}\n title={column.ellipsis && typeof content === 'string' ? content : cellProps.title}\n className={cx(\n styles.cell,\n column.ellipsis && styles.ellipsis,\n column.fixed && styles.fixed,\n column.className,\n classNames?.cell,\n cellProps.className,\n )}\n style={{\n textAlign: column.align,\n width: column.width,\n ...fixedOffsets[columnIndex],\n ...customStyles?.cell,\n ...cellProps.style,\n }}\n >\n {content}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n );\n};\n\nexport default TableBody;\n"],"mappings":";;;;;;;;;AAyBA,MAAM,aAAiB,EACrB,YACA,WACA,SACA,WACA,cACA,SACA,OACA,cACA,MACA,QAAQ,mBACe;CACvB,IAAI,KAAK,WAAW,GAClB,OACE,oBAAC,SAAD;EAAO,WAAW,YAAY;EAAM,OAAO,cAAc;EACvD,UAAA,oBAAC,MAAD,EAAA,UACE,oBAAC,MAAD;GAAI,WAAW,OAAO;GAAO,SAAS,QAAQ;GAC3C,UAAA,UAAU,oBAAC,MAAD,CAAO,CAAA,IAAK,aAAa,oBAAC,OAAD,EAAO,aAAY,UAAW,CAAA;EAChE,CAAA,EACF,CAAA;CACC,CAAA;CAIX,OACE,oBAAC,SAAD;EAAO,WAAW,YAAY;EAAM,OAAO,cAAc;EACtD,UAAA,KAAK,KAAK,KAAK,aAAa;GAC3B,MAAM,SAAS,IAAI;GACnB,MAAM,WAAW,QAAQ,QAAQ,QAAQ,KAAK,CAAC;GAC/C,MAAM,iBACJ,OAAO,iBAAiB,aAAa,aAAa,QAAQ,QAAQ,IAAI;GAExE,OACE,8BAAC,MAAD;IACE,GAAI;IACJ,KAAK,IAAI;IACT,OAAO;KAAE,GAAG,cAAc;KAAK,GAAG,SAAS;IAAM;IACjD,WAAW,GACT,OAAO,KACP,SAAS,WAAW,OAAO,WAC3B,gBACA,YAAY,KACZ,SAAS,SACX;GAkCE,GAhCD,QAAQ,KAAK,QAAQ,gBAAgB;IACpC,MAAM,QAAQ,aAAa,QAAQ,MAAM;IACzC,MAAM,YAAY,OAAO,SAAS,QAAQ,QAAQ,KAAK,CAAC;IACxD,MAAM,UAAU,OAAO,SACnB,OAAO,OAAO,OAAO,QAAQ,QAAQ,IACpC;IAEL,OACE,8BAAC,MAAD;KACE,GAAI;KACJ,KAAK,UAAU;KACf,OAAO,OAAO,YAAY,OAAO,YAAY,WAAW,UAAU,UAAU;KAC5E,WAAW,GACT,OAAO,MACP,OAAO,YAAY,OAAO,UAC1B,OAAO,SAAS,OAAO,OACvB,OAAO,WACP,YAAY,MACZ,UAAU,SACZ;KACA,OAAO;MACL,WAAW,OAAO;MAClB,OAAO,OAAO;MACd,GAAG,aAAa;MAChB,GAAG,cAAc;MACjB,GAAG,UAAU;KACf;IAGE,GADD,OACC;GAER,CAAC,CACC;EAER,CAAC;CACI,CAAA;AAEX"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import Icon from "../../Icon/Icon.mjs";
|
|
3
|
+
import { styles } from "./style.mjs";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { cx } from "antd-style";
|
|
6
|
+
import { ChevronDown, ChevronUp } from "lucide-react";
|
|
7
|
+
//#region src/base-ui/Table/TableHead.tsx
|
|
8
|
+
const ariaSortOf = (sorted) => sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none";
|
|
9
|
+
const TableHead = ({ classNames, columnIds, columns, fixedOffsets, getColumn, renderFilter, styles: customStyles }) => /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: columns.map((column, index) => {
|
|
10
|
+
const id = columnIds[index];
|
|
11
|
+
const tableColumn = getColumn(id);
|
|
12
|
+
const sorted = column.sorter ? tableColumn?.getIsSorted() ?? false : false;
|
|
13
|
+
return /* @__PURE__ */ jsx("th", {
|
|
14
|
+
"aria-sort": column.sorter ? ariaSortOf(sorted) : void 0,
|
|
15
|
+
scope: "col",
|
|
16
|
+
className: cx(styles.header, column.fixed && styles.fixed, column.className, classNames?.header),
|
|
17
|
+
style: {
|
|
18
|
+
textAlign: column.align,
|
|
19
|
+
width: column.width,
|
|
20
|
+
...fixedOffsets[index],
|
|
21
|
+
...customStyles?.header,
|
|
22
|
+
...column.fixed ? { zIndex: 3 } : void 0
|
|
23
|
+
},
|
|
24
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
25
|
+
className: styles.headerInner,
|
|
26
|
+
children: [column.sorter ? /* @__PURE__ */ jsxs("button", {
|
|
27
|
+
className: styles.sortButton,
|
|
28
|
+
type: "button",
|
|
29
|
+
onClick: tableColumn?.getToggleSortingHandler(),
|
|
30
|
+
children: [column.title, /* @__PURE__ */ jsxs("span", {
|
|
31
|
+
"aria-hidden": "true",
|
|
32
|
+
className: styles.sortCaret,
|
|
33
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
34
|
+
"data-active": sorted === "asc",
|
|
35
|
+
icon: ChevronUp,
|
|
36
|
+
size: 10
|
|
37
|
+
}), /* @__PURE__ */ jsx(Icon, {
|
|
38
|
+
"data-active": sorted === "desc",
|
|
39
|
+
icon: ChevronDown,
|
|
40
|
+
size: 10
|
|
41
|
+
})]
|
|
42
|
+
})]
|
|
43
|
+
}) : column.title, column.filters?.length ? renderFilter?.(column, id) : null]
|
|
44
|
+
})
|
|
45
|
+
}, id);
|
|
46
|
+
}) }) });
|
|
47
|
+
//#endregion
|
|
48
|
+
export { TableHead as default };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=TableHead.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableHead.mjs","names":[],"sources":["../../../src/base-ui/Table/TableHead.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\n\nimport Icon from '@/Icon';\n\nimport { styles } from './style';\nimport type { TableColumn, TableProps } from './type';\n\ntype SortState = false | 'asc' | 'desc';\n\ninterface HeadColumn {\n getIsSorted: () => SortState;\n getToggleSortingHandler: () => undefined | ((event: unknown) => void);\n}\n\ninterface TableHeadProps<T> {\n classNames?: TableProps<T>['classNames'];\n columnIds: string[];\n columns: TableColumn<T>[];\n fixedOffsets: (CSSProperties | undefined)[];\n getColumn: (id: string) => HeadColumn | undefined;\n renderFilter?: (column: TableColumn<T>, id: string) => ReactNode;\n styles?: TableProps<T>['styles'];\n}\n\nconst ariaSortOf = (sorted: SortState) =>\n sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : 'none';\n\nconst TableHead = <T,>({\n classNames,\n columnIds,\n columns,\n fixedOffsets,\n getColumn,\n renderFilter,\n styles: customStyles,\n}: TableHeadProps<T>) => (\n <thead>\n <tr>\n {columns.map((column, index) => {\n const id = columnIds[index];\n const tableColumn = getColumn(id);\n const sorted: SortState = column.sorter ? (tableColumn?.getIsSorted() ?? false) : false;\n\n return (\n <th\n aria-sort={column.sorter ? ariaSortOf(sorted) : undefined}\n key={id}\n scope=\"col\"\n className={cx(\n styles.header,\n column.fixed && styles.fixed,\n column.className,\n classNames?.header,\n )}\n style={{\n textAlign: column.align,\n width: column.width,\n ...fixedOffsets[index],\n ...customStyles?.header,\n ...(column.fixed ? { zIndex: 3 } : undefined),\n }}\n >\n <span className={styles.headerInner}>\n {column.sorter ? (\n <button\n className={styles.sortButton}\n type=\"button\"\n onClick={tableColumn?.getToggleSortingHandler()}\n >\n {column.title}\n <span aria-hidden=\"true\" className={styles.sortCaret}>\n <Icon data-active={sorted === 'asc'} icon={ChevronUp} size={10} />\n <Icon data-active={sorted === 'desc'} icon={ChevronDown} size={10} />\n </span>\n </button>\n ) : (\n column.title\n )}\n {column.filters?.length ? renderFilter?.(column, id) : null}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n);\n\nexport default TableHead;\n"],"mappings":";;;;;;;AA4BA,MAAM,cAAc,WAClB,WAAW,QAAQ,cAAc,WAAW,SAAS,eAAe;AAEtE,MAAM,aAAiB,EACrB,YACA,WACA,SACA,cACA,WACA,cACA,QAAQ,mBAER,oBAAC,SAAD,EAAA,UACE,oBAAC,MAAD,EAAA,UACG,QAAQ,KAAK,QAAQ,UAAU;CAC9B,MAAM,KAAK,UAAU;CACrB,MAAM,cAAc,UAAU,EAAE;CAChC,MAAM,SAAoB,OAAO,SAAU,aAAa,YAAY,KAAK,QAAS;CAElF,OACE,oBAAC,MAAD;EACE,aAAW,OAAO,SAAS,WAAW,MAAM,IAAI,KAAA;EAEhD,OAAM;EACN,WAAW,GACT,OAAO,QACP,OAAO,SAAS,OAAO,OACvB,OAAO,WACP,YAAY,MACd;EACA,OAAO;GACL,WAAW,OAAO;GAClB,OAAO,OAAO;GACd,GAAG,aAAa;GAChB,GAAG,cAAc;GACjB,GAAI,OAAO,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAA;EACrC;EAEA,UAAA,qBAAC,QAAD;GAAM,WAAW,OAAO;GAAxB,UAAA,CACG,OAAO,SACN,qBAAC,UAAD;IACE,WAAW,OAAO;IAClB,MAAK;IACL,SAAS,aAAa,wBAAwB;IAHhD,UAAA,CAKG,OAAO,OACR,qBAAC,QAAD;KAAM,eAAY;KAAO,WAAW,OAAO;KAA3C,UAAA,CACE,oBAAC,MAAD;MAAM,eAAa,WAAW;MAAO,MAAM;MAAW,MAAM;KAAK,CAAA,GACjE,oBAAC,MAAD;MAAM,eAAa,WAAW;MAAQ,MAAM;MAAa,MAAM;KAAK,CAAA,CAChE;IACA,CAAA,CAAA;GAER,CAAA,IAAA,OAAO,OAER,OAAO,SAAS,SAAS,eAAe,QAAQ,EAAE,IAAI,IACnD;;CACJ,GAlCG,EAkCH;AAER,CAAC,EACC,CAAA,EACC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { columnFilteringFeature, createFilteredRowModel, createSortedRowModel, rowSortingFeature, tableFeatures } from "@tanstack/react-table";
|
|
2
|
+
//#region src/base-ui/Table/features.ts
|
|
3
|
+
const tableFeatureSet = tableFeatures({
|
|
4
|
+
columnFilteringFeature,
|
|
5
|
+
filteredRowModel: createFilteredRowModel(),
|
|
6
|
+
rowSortingFeature,
|
|
7
|
+
sortedRowModel: createSortedRowModel()
|
|
8
|
+
});
|
|
9
|
+
//#endregion
|
|
10
|
+
export { tableFeatureSet };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=features.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.mjs","names":[],"sources":["../../../src/base-ui/Table/features.ts"],"sourcesContent":["import {\n columnFilteringFeature,\n createFilteredRowModel,\n createSortedRowModel,\n rowSortingFeature,\n tableFeatures,\n} from '@tanstack/react-table';\n\nexport const tableFeatureSet = tableFeatures({\n columnFilteringFeature,\n filteredRowModel: createFilteredRowModel(),\n rowSortingFeature,\n sortedRowModel: createSortedRowModel(),\n});\n\nexport type TableFeatureSet = typeof tableFeatureSet;\n"],"mappings":";;AAQA,MAAa,kBAAkB,cAAc;CAC3C;CACA,kBAAkB,uBAAuB;CACzC;CACA,gBAAgB,qBAAqB;AACvC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/base-ui/Table/fixedOffsets.ts
|
|
2
|
+
const widthOf = (column) => typeof column.width === "number" ? column.width : 0;
|
|
3
|
+
const getFixedOffsets = (columns) => {
|
|
4
|
+
const offsets = columns.map(() => void 0);
|
|
5
|
+
let left = 0;
|
|
6
|
+
columns.forEach((column, index) => {
|
|
7
|
+
if (column.fixed !== "left") return;
|
|
8
|
+
offsets[index] = {
|
|
9
|
+
left,
|
|
10
|
+
position: "sticky"
|
|
11
|
+
};
|
|
12
|
+
left += widthOf(column);
|
|
13
|
+
});
|
|
14
|
+
let right = 0;
|
|
15
|
+
for (let index = columns.length - 1; index >= 0; index--) {
|
|
16
|
+
const column = columns[index];
|
|
17
|
+
if (column.fixed !== "right") continue;
|
|
18
|
+
offsets[index] = {
|
|
19
|
+
position: "sticky",
|
|
20
|
+
right
|
|
21
|
+
};
|
|
22
|
+
right += widthOf(column);
|
|
23
|
+
}
|
|
24
|
+
return offsets;
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { getFixedOffsets };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=fixedOffsets.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixedOffsets.mjs","names":[],"sources":["../../../src/base-ui/Table/fixedOffsets.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport type { TableColumn } from './type';\n\nconst widthOf = (column: TableColumn<any>) => (typeof column.width === 'number' ? column.width : 0);\n\nexport const getFixedOffsets = (columns: TableColumn<any>[]): (CSSProperties | undefined)[] => {\n const offsets: (CSSProperties | undefined)[] = columns.map(() => undefined);\n\n let left = 0;\n columns.forEach((column, index) => {\n if (column.fixed !== 'left') return;\n offsets[index] = { left, position: 'sticky' };\n left += widthOf(column);\n });\n\n let right = 0;\n for (let index = columns.length - 1; index >= 0; index--) {\n const column = columns[index];\n if (column.fixed !== 'right') continue;\n offsets[index] = { position: 'sticky', right };\n right += widthOf(column);\n }\n\n return offsets;\n};\n"],"mappings":";AAIA,MAAM,WAAW,WAA8B,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAEjG,MAAa,mBAAmB,YAA+D;CAC7F,MAAM,UAAyC,QAAQ,UAAU,KAAA,CAAS;CAE1E,IAAI,OAAO;CACX,QAAQ,SAAS,QAAQ,UAAU;EACjC,IAAI,OAAO,UAAU,QAAQ;EAC7B,QAAQ,SAAS;GAAE;GAAM,UAAU;EAAS;EAC5C,QAAQ,QAAQ,MAAM;CACxB,CAAC;CAED,IAAI,QAAQ;CACZ,KAAK,IAAI,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS;EACxD,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,UAAU,SAAS;EAC9B,QAAQ,SAAS;GAAE,UAAU;GAAU;EAAM;EAC7C,SAAS,QAAQ,MAAM;CACzB;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { FilterValue, SortOrder, TableColumn, TableFilters, TablePaginationConfig, TableProps, TableSemanticName, TableSorterResult } from "./type.mjs";
|
|
2
|
+
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 };
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { focusRing } from "../focusRing.mjs";
|
|
2
|
+
import { createStaticStyles } from "antd-style";
|
|
3
|
+
//#region src/base-ui/Table/style.ts
|
|
4
|
+
const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
5
|
+
bordered: css`
|
|
6
|
+
border: 1px solid ${cssVar.colorBorderSecondary};
|
|
7
|
+
border-radius: ${cssVar.borderRadiusLG};
|
|
8
|
+
|
|
9
|
+
& th,
|
|
10
|
+
& td {
|
|
11
|
+
border-inline-end: 1px solid ${cssVar.colorBorderSecondary};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
& th:last-child,
|
|
15
|
+
& td:last-child {
|
|
16
|
+
border-inline-end: 0;
|
|
17
|
+
}
|
|
18
|
+
`,
|
|
19
|
+
cell: css`
|
|
20
|
+
border-block-end: 1px solid ${cssVar.colorBorderSecondary};
|
|
21
|
+
font-variant-numeric: tabular-nums;
|
|
22
|
+
background: ${cssVar.colorBgContainer};
|
|
23
|
+
`,
|
|
24
|
+
clickable: css`
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
`,
|
|
27
|
+
ellipsis: css`
|
|
28
|
+
overflow: hidden;
|
|
29
|
+
max-width: 0;
|
|
30
|
+
text-overflow: ellipsis;
|
|
31
|
+
white-space: nowrap;
|
|
32
|
+
`,
|
|
33
|
+
empty: css`
|
|
34
|
+
padding-block: 32px;
|
|
35
|
+
color: ${cssVar.colorTextDescription};
|
|
36
|
+
text-align: center;
|
|
37
|
+
`,
|
|
38
|
+
filterActive: css`
|
|
39
|
+
color: ${cssVar.colorPrimary};
|
|
40
|
+
`,
|
|
41
|
+
filterButton: css`
|
|
42
|
+
${focusRing};
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
|
|
45
|
+
display: inline-flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: center;
|
|
48
|
+
|
|
49
|
+
padding: 2px;
|
|
50
|
+
border: 0;
|
|
51
|
+
border-radius: 4px;
|
|
52
|
+
|
|
53
|
+
color: ${cssVar.colorTextQuaternary};
|
|
54
|
+
|
|
55
|
+
background: none;
|
|
56
|
+
|
|
57
|
+
&:hover {
|
|
58
|
+
color: ${cssVar.colorText};
|
|
59
|
+
background: ${cssVar.colorFillTertiary};
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
fixed: css`
|
|
63
|
+
z-index: 1;
|
|
64
|
+
background: ${cssVar.colorBgContainer};
|
|
65
|
+
`,
|
|
66
|
+
header: css`
|
|
67
|
+
position: sticky;
|
|
68
|
+
z-index: 2;
|
|
69
|
+
inset-block-start: 0;
|
|
70
|
+
|
|
71
|
+
font-size: 13px;
|
|
72
|
+
font-weight: 500;
|
|
73
|
+
color: ${cssVar.colorTextSecondary};
|
|
74
|
+
text-align: start;
|
|
75
|
+
|
|
76
|
+
background: ${cssVar.colorBgContainer};
|
|
77
|
+
box-shadow:
|
|
78
|
+
inset 0 -1px 0 ${cssVar.colorBorderSecondary},
|
|
79
|
+
inset 0 999px 0 ${cssVar.colorFillQuaternary};
|
|
80
|
+
`,
|
|
81
|
+
headerInner: css`
|
|
82
|
+
display: inline-flex;
|
|
83
|
+
gap: 6px;
|
|
84
|
+
align-items: center;
|
|
85
|
+
`,
|
|
86
|
+
loading: css`
|
|
87
|
+
position: absolute;
|
|
88
|
+
z-index: 3;
|
|
89
|
+
inset: 0;
|
|
90
|
+
|
|
91
|
+
display: flex;
|
|
92
|
+
align-items: center;
|
|
93
|
+
justify-content: center;
|
|
94
|
+
|
|
95
|
+
background: color-mix(in srgb, ${cssVar.colorBgContainer} 60%, transparent);
|
|
96
|
+
`,
|
|
97
|
+
middle: css`
|
|
98
|
+
& th,
|
|
99
|
+
& td {
|
|
100
|
+
padding-block: 12px;
|
|
101
|
+
padding-inline: 16px;
|
|
102
|
+
}
|
|
103
|
+
`,
|
|
104
|
+
pagination: css`
|
|
105
|
+
display: flex;
|
|
106
|
+
justify-content: flex-end;
|
|
107
|
+
margin-block-start: 12px;
|
|
108
|
+
`,
|
|
109
|
+
root: css`
|
|
110
|
+
min-width: 0;
|
|
111
|
+
`,
|
|
112
|
+
row: css`
|
|
113
|
+
&:hover > td {
|
|
114
|
+
background: color-mix(in srgb, ${cssVar.colorBgContainer}, ${cssVar.colorText} 3%);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
&:last-child > td {
|
|
118
|
+
border-block-end: 0;
|
|
119
|
+
}
|
|
120
|
+
`,
|
|
121
|
+
small: css`
|
|
122
|
+
& th,
|
|
123
|
+
& td {
|
|
124
|
+
padding-block: 8px;
|
|
125
|
+
padding-inline: 12px;
|
|
126
|
+
}
|
|
127
|
+
`,
|
|
128
|
+
sortButton: css`
|
|
129
|
+
${focusRing};
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
|
|
132
|
+
display: inline-flex;
|
|
133
|
+
gap: 6px;
|
|
134
|
+
align-items: center;
|
|
135
|
+
|
|
136
|
+
padding: 0;
|
|
137
|
+
border: 0;
|
|
138
|
+
border-radius: 4px;
|
|
139
|
+
|
|
140
|
+
font: inherit;
|
|
141
|
+
color: inherit;
|
|
142
|
+
|
|
143
|
+
background: none;
|
|
144
|
+
`,
|
|
145
|
+
sortCaret: css`
|
|
146
|
+
display: inline-flex;
|
|
147
|
+
flex-direction: column;
|
|
148
|
+
color: ${cssVar.colorTextQuaternary};
|
|
149
|
+
|
|
150
|
+
& > [data-active='true'] {
|
|
151
|
+
color: ${cssVar.colorText};
|
|
152
|
+
}
|
|
153
|
+
`,
|
|
154
|
+
table: css`
|
|
155
|
+
border-spacing: 0;
|
|
156
|
+
border-collapse: separate;
|
|
157
|
+
width: 100%;
|
|
158
|
+
font-size: 14px;
|
|
159
|
+
`,
|
|
160
|
+
wrapper: css`
|
|
161
|
+
position: relative;
|
|
162
|
+
overflow: auto;
|
|
163
|
+
`
|
|
164
|
+
}));
|
|
165
|
+
//#endregion
|
|
166
|
+
export { styles };
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/Table/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nimport { focusRing } from '@/base-ui/focusRing';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n bordered: css`\n border: 1px solid ${cssVar.colorBorderSecondary};\n border-radius: ${cssVar.borderRadiusLG};\n\n & th,\n & td {\n border-inline-end: 1px solid ${cssVar.colorBorderSecondary};\n }\n\n & th:last-child,\n & td:last-child {\n border-inline-end: 0;\n }\n `,\n cell: css`\n border-block-end: 1px solid ${cssVar.colorBorderSecondary};\n font-variant-numeric: tabular-nums;\n background: ${cssVar.colorBgContainer};\n `,\n clickable: css`\n cursor: pointer;\n `,\n ellipsis: css`\n overflow: hidden;\n max-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n empty: css`\n padding-block: 32px;\n color: ${cssVar.colorTextDescription};\n text-align: center;\n `,\n filterActive: css`\n color: ${cssVar.colorPrimary};\n `,\n filterButton: css`\n ${focusRing};\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 2px;\n border: 0;\n border-radius: 4px;\n\n color: ${cssVar.colorTextQuaternary};\n\n background: none;\n\n &:hover {\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillTertiary};\n }\n `,\n fixed: css`\n z-index: 1;\n background: ${cssVar.colorBgContainer};\n `,\n header: css`\n position: sticky;\n z-index: 2;\n inset-block-start: 0;\n\n font-size: 13px;\n font-weight: 500;\n color: ${cssVar.colorTextSecondary};\n text-align: start;\n\n background: ${cssVar.colorBgContainer};\n box-shadow:\n inset 0 -1px 0 ${cssVar.colorBorderSecondary},\n inset 0 999px 0 ${cssVar.colorFillQuaternary};\n `,\n headerInner: css`\n display: inline-flex;\n gap: 6px;\n align-items: center;\n `,\n loading: css`\n position: absolute;\n z-index: 3;\n inset: 0;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background: color-mix(in srgb, ${cssVar.colorBgContainer} 60%, transparent);\n `,\n middle: css`\n & th,\n & td {\n padding-block: 12px;\n padding-inline: 16px;\n }\n `,\n pagination: css`\n display: flex;\n justify-content: flex-end;\n margin-block-start: 12px;\n `,\n root: css`\n min-width: 0;\n `,\n row: css`\n &:hover > td {\n background: color-mix(in srgb, ${cssVar.colorBgContainer}, ${cssVar.colorText} 3%);\n }\n\n &:last-child > td {\n border-block-end: 0;\n }\n `,\n small: css`\n & th,\n & td {\n padding-block: 8px;\n padding-inline: 12px;\n }\n `,\n sortButton: css`\n ${focusRing};\n cursor: pointer;\n\n display: inline-flex;\n gap: 6px;\n align-items: center;\n\n padding: 0;\n border: 0;\n border-radius: 4px;\n\n font: inherit;\n color: inherit;\n\n background: none;\n `,\n sortCaret: css`\n display: inline-flex;\n flex-direction: column;\n color: ${cssVar.colorTextQuaternary};\n\n & > [data-active='true'] {\n color: ${cssVar.colorText};\n }\n `,\n table: css`\n border-spacing: 0;\n border-collapse: separate;\n width: 100%;\n font-size: 14px;\n `,\n wrapper: css`\n position: relative;\n overflow: auto;\n `,\n}));\n"],"mappings":";;;AAIA,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc;CAC7D,UAAU,GAAG;wBACS,OAAO,qBAAqB;qBAC/B,OAAO,eAAe;;;;qCAIN,OAAO,qBAAqB;;;;;;;;CAQ/D,MAAM,GAAG;kCACuB,OAAO,qBAAqB;;kBAE5C,OAAO,iBAAiB;;CAExC,WAAW,GAAG;;;CAGd,UAAU,GAAG;;;;;;CAMb,OAAO,GAAG;;aAEC,OAAO,qBAAqB;;;CAGvC,cAAc,GAAG;aACN,OAAO,aAAa;;CAE/B,cAAc,GAAG;MACb,UAAU;;;;;;;;;;;aAWH,OAAO,oBAAoB;;;;;eAKzB,OAAO,UAAU;oBACZ,OAAO,kBAAkB;;;CAG3C,OAAO,GAAG;;kBAEM,OAAO,iBAAiB;;CAExC,QAAQ,GAAG;;;;;;;aAOA,OAAO,mBAAmB;;;kBAGrB,OAAO,iBAAiB;;uBAEnB,OAAO,qBAAqB;wBAC3B,OAAO,oBAAoB;;CAEjD,aAAa,GAAG;;;;;CAKhB,SAAS,GAAG;;;;;;;;;qCASuB,OAAO,iBAAiB;;CAE3D,QAAQ,GAAG;;;;;;;CAOX,YAAY,GAAG;;;;;CAKf,MAAM,GAAG;;;CAGT,KAAK,GAAG;;uCAE6B,OAAO,iBAAiB,IAAI,OAAO,UAAU;;;;;;;CAOlF,OAAO,GAAG;;;;;;;CAOV,YAAY,GAAG;MACX,UAAU;;;;;;;;;;;;;;;;CAgBd,WAAW,GAAG;;;aAGH,OAAO,oBAAoB;;;eAGzB,OAAO,UAAU;;;CAG9B,OAAO,GAAG;;;;;;CAMV,SAAS,GAAG;;;;AAId,EAAE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/base-ui/Table/toColumnDefs.ts
|
|
2
|
+
const getColumnId = (column, index) => String(column.key ?? column.dataIndex ?? `__column_${index}`);
|
|
3
|
+
const getCellValue = (record, column) => column.dataIndex ? record[column.dataIndex] : void 0;
|
|
4
|
+
const isEmptyFilter = (value) => !Array.isArray(value) || value.length === 0;
|
|
5
|
+
const toColumnDefs = (columns) => columns.map((column, index) => {
|
|
6
|
+
if ((Boolean(column.sorter) || Boolean(column.filters?.length)) && column.key == null && column.dataIndex == null) throw new Error("[Table] sortable or filterable columns need a `key` or `dataIndex`");
|
|
7
|
+
const comparator = typeof column.sorter === "function" ? column.sorter : void 0;
|
|
8
|
+
const { onFilter } = column;
|
|
9
|
+
const filterFn = onFilter ? Object.assign((row, _columnId, filterValue) => filterValue.some((value) => onFilter(value, row.original)), { autoRemove: isEmptyFilter }) : void 0;
|
|
10
|
+
return {
|
|
11
|
+
accessorFn: (record) => getCellValue(record, column),
|
|
12
|
+
enableColumnFilter: Boolean(column.filters?.length),
|
|
13
|
+
enableSorting: Boolean(column.sorter),
|
|
14
|
+
filterFn,
|
|
15
|
+
id: getColumnId(column, index),
|
|
16
|
+
sortDescFirst: column.sortDirections?.[0] === "descend",
|
|
17
|
+
...comparator && {
|
|
18
|
+
sortFn: (rowA, rowB) => comparator(rowA.original, rowB.original),
|
|
19
|
+
sortUndefined: false
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { getCellValue, getColumnId, toColumnDefs };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=toColumnDefs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toColumnDefs.mjs","names":[],"sources":["../../../src/base-ui/Table/toColumnDefs.ts"],"sourcesContent":["import type { ColumnDef, RowData } from '@tanstack/react-table';\n\nimport type { TableFeatureSet } from './features';\nimport type { FilterValue, TableColumn } from './type';\n\nexport const getColumnId = (column: TableColumn<any>, index: number): string =>\n String(column.key ?? column.dataIndex ?? `__column_${index}`);\n\nexport const getCellValue = <T>(record: T, column: TableColumn<T>): unknown =>\n column.dataIndex ? record[column.dataIndex] : undefined;\n\nconst isEmptyFilter = (value: unknown) => !Array.isArray(value) || value.length === 0;\n\nexport const toColumnDefs = <T extends RowData>(\n columns: TableColumn<T>[],\n): ColumnDef<TableFeatureSet, T, unknown>[] =>\n columns.map((column, index) => {\n const needsStableId = Boolean(column.sorter) || Boolean(column.filters?.length);\n if (needsStableId && column.key == null && column.dataIndex == null) {\n throw new Error('[Table] sortable or filterable columns need a `key` or `dataIndex`');\n }\n\n const comparator = typeof column.sorter === 'function' ? column.sorter : undefined;\n const { onFilter } = column;\n\n const filterFn = onFilter\n ? Object.assign(\n (row: { original: T }, _columnId: string, filterValue: FilterValue[]) =>\n filterValue.some((value) => onFilter(value, row.original)),\n { autoRemove: isEmptyFilter },\n )\n : undefined;\n\n return {\n accessorFn: (record: T) => getCellValue(record, column),\n enableColumnFilter: Boolean(column.filters?.length),\n enableSorting: Boolean(column.sorter),\n filterFn,\n id: getColumnId(column, index),\n sortDescFirst: column.sortDirections?.[0] === 'descend',\n ...(comparator && {\n sortFn: (rowA: { original: T }, rowB: { original: T }) =>\n comparator(rowA.original, rowB.original),\n sortUndefined: false,\n }),\n } as unknown as ColumnDef<TableFeatureSet, T, unknown>;\n });\n"],"mappings":";AAKA,MAAa,eAAe,QAA0B,UACpD,OAAO,OAAO,OAAO,OAAO,aAAa,YAAY,OAAO;AAE9D,MAAa,gBAAmB,QAAW,WACzC,OAAO,YAAY,OAAO,OAAO,aAAa,KAAA;AAEhD,MAAM,iBAAiB,UAAmB,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAEpF,MAAa,gBACX,YAEA,QAAQ,KAAK,QAAQ,UAAU;CAE7B,KADsB,QAAQ,OAAO,MAAM,KAAK,QAAQ,OAAO,SAAS,MAAM,MACzD,OAAO,OAAO,QAAQ,OAAO,aAAa,MAC7D,MAAM,IAAI,MAAM,oEAAoE;CAGtF,MAAM,aAAa,OAAO,OAAO,WAAW,aAAa,OAAO,SAAS,KAAA;CACzE,MAAM,EAAE,aAAa;CAErB,MAAM,WAAW,WACb,OAAO,QACJ,KAAsB,WAAmB,gBACxC,YAAY,MAAM,UAAU,SAAS,OAAO,IAAI,QAAQ,CAAC,GAC3D,EAAE,YAAY,cAAc,CAC9B,IACA,KAAA;CAEJ,OAAO;EACL,aAAa,WAAc,aAAa,QAAQ,MAAM;EACtD,oBAAoB,QAAQ,OAAO,SAAS,MAAM;EAClD,eAAe,QAAQ,OAAO,MAAM;EACpC;EACA,IAAI,YAAY,QAAQ,KAAK;EAC7B,eAAe,OAAO,iBAAiB,OAAO;EAC9C,GAAI,cAAc;GAChB,SAAS,MAAuB,SAC9B,WAAW,KAAK,UAAU,KAAK,QAAQ;GACzC,eAAe;EACjB;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CSSProperties, HTMLAttributes, Key, ReactNode, Ref, TdHTMLAttributes } from "react";
|
|
2
|
+
//#region src/base-ui/Table/type.d.ts
|
|
3
|
+
type SortOrder = 'ascend' | 'descend';
|
|
4
|
+
type FilterValue = string | number | boolean;
|
|
5
|
+
interface TableColumn<T> {
|
|
6
|
+
align?: 'left' | 'center' | 'right';
|
|
7
|
+
className?: string;
|
|
8
|
+
dataIndex?: Extract<keyof T, string>;
|
|
9
|
+
defaultSortOrder?: SortOrder;
|
|
10
|
+
ellipsis?: boolean;
|
|
11
|
+
filters?: {
|
|
12
|
+
text: ReactNode;
|
|
13
|
+
value: FilterValue;
|
|
14
|
+
}[];
|
|
15
|
+
fixed?: 'left' | 'right';
|
|
16
|
+
key?: Key;
|
|
17
|
+
onCell?: (record: T, index: number) => TdHTMLAttributes<HTMLTableCellElement>;
|
|
18
|
+
onFilter?: (value: FilterValue, record: T) => boolean;
|
|
19
|
+
render?: (value: any, record: T, index: number) => ReactNode;
|
|
20
|
+
sortDirections?: SortOrder[];
|
|
21
|
+
sorter?: boolean | ((a: T, b: T) => number);
|
|
22
|
+
title?: ReactNode;
|
|
23
|
+
width?: number | string;
|
|
24
|
+
}
|
|
25
|
+
interface TablePaginationConfig {
|
|
26
|
+
current?: number;
|
|
27
|
+
defaultCurrent?: number;
|
|
28
|
+
defaultPageSize?: number;
|
|
29
|
+
onChange?: (page: number, pageSize: number) => void;
|
|
30
|
+
onShowSizeChange?: (current: number, size: number) => void;
|
|
31
|
+
pageSize?: number;
|
|
32
|
+
pageSizeOptions?: number[];
|
|
33
|
+
showSizeChanger?: boolean;
|
|
34
|
+
total?: number;
|
|
35
|
+
}
|
|
36
|
+
interface TableSorterResult<T> {
|
|
37
|
+
column?: TableColumn<T>;
|
|
38
|
+
columnKey?: Key;
|
|
39
|
+
order?: SortOrder;
|
|
40
|
+
}
|
|
41
|
+
type TableFilters = Record<string, FilterValue[] | null>;
|
|
42
|
+
type TableSemanticName = 'body' | 'cell' | 'header' | 'row' | 'wrapper';
|
|
43
|
+
interface TableProps<T> {
|
|
44
|
+
bordered?: boolean;
|
|
45
|
+
className?: string;
|
|
46
|
+
classNames?: Partial<Record<TableSemanticName, string>>;
|
|
47
|
+
columns: TableColumn<T>[];
|
|
48
|
+
dataSource?: T[];
|
|
49
|
+
emptyText?: ReactNode;
|
|
50
|
+
loading?: boolean;
|
|
51
|
+
onChange?: (pagination: TablePaginationConfig, filters: TableFilters, sorter: TableSorterResult<T>) => void;
|
|
52
|
+
onRow?: (record: T, index: number) => HTMLAttributes<HTMLTableRowElement>;
|
|
53
|
+
pagination?: false | TablePaginationConfig;
|
|
54
|
+
ref?: Ref<HTMLDivElement>;
|
|
55
|
+
rowClassName?: string | ((record: T, index: number) => string);
|
|
56
|
+
rowKey: Extract<keyof T, string> | ((record: T) => Key);
|
|
57
|
+
scroll?: {
|
|
58
|
+
x?: number | string;
|
|
59
|
+
y?: number | string;
|
|
60
|
+
};
|
|
61
|
+
size?: 'small' | 'middle';
|
|
62
|
+
style?: CSSProperties;
|
|
63
|
+
styles?: Partial<Record<TableSemanticName, CSSProperties>>;
|
|
64
|
+
tableLayout?: 'auto' | 'fixed';
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { FilterValue, SortOrder, TableColumn, TableFilters, TablePaginationConfig, TableProps, TableSemanticName, TableSorterResult };
|
|
68
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { getColumnId } from "./toColumnDefs.mjs";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
//#region src/base-ui/Table/useTableState.ts
|
|
4
|
+
const resolve = (updater, previous) => typeof updater === "function" ? updater(previous) : updater;
|
|
5
|
+
const initialSorting = (columns) => {
|
|
6
|
+
const index = columns.findIndex((column) => column.defaultSortOrder);
|
|
7
|
+
if (index === -1) return [];
|
|
8
|
+
return [{
|
|
9
|
+
desc: columns[index].defaultSortOrder === "descend",
|
|
10
|
+
id: getColumnId(columns[index], index)
|
|
11
|
+
}];
|
|
12
|
+
};
|
|
13
|
+
const useTableState = ({ columns, onChange, pagination }) => {
|
|
14
|
+
const config = pagination === false ? void 0 : pagination ?? {};
|
|
15
|
+
const columnIds = columns.map((column, index) => getColumnId(column, index));
|
|
16
|
+
const [sorting, setSorting] = useState(() => initialSorting(columns));
|
|
17
|
+
const [columnFilters, setColumnFilters] = useState([]);
|
|
18
|
+
const [innerPage, setInnerPage] = useState({
|
|
19
|
+
pageIndex: (config?.defaultCurrent ?? 1) - 1,
|
|
20
|
+
pageSize: config?.defaultPageSize ?? 10
|
|
21
|
+
});
|
|
22
|
+
const page = {
|
|
23
|
+
pageIndex: config?.current === void 0 ? innerPage.pageIndex : config.current - 1,
|
|
24
|
+
pageSize: config?.pageSize ?? innerPage.pageSize
|
|
25
|
+
};
|
|
26
|
+
const toFilters = (state) => Object.fromEntries(columns.map((column, index) => [column, columnIds[index]]).filter(([column]) => column.filters?.length).map(([, id]) => [id, state.find((filter) => filter.id === id)?.value ?? null]));
|
|
27
|
+
const toSorter = (state) => {
|
|
28
|
+
const [active] = state;
|
|
29
|
+
if (!active) return {};
|
|
30
|
+
return {
|
|
31
|
+
column: columns[columnIds.indexOf(active.id)],
|
|
32
|
+
columnKey: active.id,
|
|
33
|
+
order: active.desc ? "descend" : "ascend"
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const toPaginationArg = (next) => config ? {
|
|
37
|
+
...config,
|
|
38
|
+
current: next.pageIndex + 1,
|
|
39
|
+
pageSize: next.pageSize
|
|
40
|
+
} : {};
|
|
41
|
+
const report = (nextPage, nextFilters, nextSorting) => onChange?.(toPaginationArg(nextPage), toFilters(nextFilters), toSorter(nextSorting));
|
|
42
|
+
const changePage = (next) => {
|
|
43
|
+
setInnerPage(next);
|
|
44
|
+
const sizeChanged = next.pageSize !== page.pageSize;
|
|
45
|
+
if (sizeChanged) config?.onShowSizeChange?.(next.pageIndex + 1, next.pageSize);
|
|
46
|
+
if (sizeChanged || next.pageIndex !== page.pageIndex) config?.onChange?.(next.pageIndex + 1, next.pageSize);
|
|
47
|
+
};
|
|
48
|
+
const clampPage = (pageIndex) => {
|
|
49
|
+
if (config?.current === void 0) {
|
|
50
|
+
setInnerPage((previous) => ({
|
|
51
|
+
...previous,
|
|
52
|
+
pageIndex
|
|
53
|
+
}));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
config.onChange?.(pageIndex + 1, page.pageSize);
|
|
57
|
+
};
|
|
58
|
+
const onSortingChange = (updater) => {
|
|
59
|
+
const next = resolve(updater, sorting);
|
|
60
|
+
const firstPage = {
|
|
61
|
+
...page,
|
|
62
|
+
pageIndex: 0
|
|
63
|
+
};
|
|
64
|
+
setSorting(next);
|
|
65
|
+
changePage(firstPage);
|
|
66
|
+
report(firstPage, columnFilters, next);
|
|
67
|
+
};
|
|
68
|
+
const onColumnFiltersChange = (updater) => {
|
|
69
|
+
const next = resolve(updater, columnFilters);
|
|
70
|
+
const firstPage = {
|
|
71
|
+
...page,
|
|
72
|
+
pageIndex: 0
|
|
73
|
+
};
|
|
74
|
+
setColumnFilters(next);
|
|
75
|
+
changePage(firstPage);
|
|
76
|
+
report(firstPage, next, sorting);
|
|
77
|
+
};
|
|
78
|
+
const onPaginationChange = (updater) => {
|
|
79
|
+
const next = resolve(updater, page);
|
|
80
|
+
changePage(next);
|
|
81
|
+
report(next, columnFilters, sorting);
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
clampPage,
|
|
85
|
+
columnFilters,
|
|
86
|
+
columnIds,
|
|
87
|
+
config,
|
|
88
|
+
manualSorting: columns.some((column) => column.sorter === true),
|
|
89
|
+
onColumnFiltersChange,
|
|
90
|
+
onPaginationChange,
|
|
91
|
+
onSortingChange,
|
|
92
|
+
page,
|
|
93
|
+
sorting
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
export { useTableState };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=useTableState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableState.mjs","names":[],"sources":["../../../src/base-ui/Table/useTableState.ts"],"sourcesContent":["import type {\n ColumnFiltersState,\n PaginationState,\n SortingState,\n Updater,\n} from '@tanstack/react-table';\nimport { useState } from 'react';\n\nimport { getColumnId } from './toColumnDefs';\nimport type {\n TableColumn,\n TableFilters,\n TablePaginationConfig,\n TableProps,\n TableSorterResult,\n} from './type';\n\nconst resolve = <S>(updater: Updater<S>, previous: S): S =>\n typeof updater === 'function' ? (updater as (old: S) => S)(previous) : updater;\n\nconst initialSorting = (columns: TableColumn<any>[]): SortingState => {\n const index = columns.findIndex((column) => column.defaultSortOrder);\n if (index === -1) return [];\n return [\n { desc: columns[index].defaultSortOrder === 'descend', id: getColumnId(columns[index], index) },\n ];\n};\n\nexport const useTableState = <T>({\n columns,\n onChange,\n pagination,\n}: Pick<TableProps<T>, 'columns' | 'onChange' | 'pagination'>) => {\n const config: TablePaginationConfig | undefined =\n pagination === false ? undefined : (pagination ?? {});\n const columnIds = columns.map((column, index) => getColumnId(column, index));\n\n const [sorting, setSorting] = useState<SortingState>(() => initialSorting(columns));\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [innerPage, setInnerPage] = useState<PaginationState>({\n pageIndex: (config?.defaultCurrent ?? 1) - 1,\n pageSize: config?.defaultPageSize ?? 10,\n });\n\n const page: PaginationState = {\n pageIndex: config?.current === undefined ? innerPage.pageIndex : config.current - 1,\n pageSize: config?.pageSize ?? innerPage.pageSize,\n };\n\n const toFilters = (state: ColumnFiltersState): TableFilters =>\n Object.fromEntries(\n columns\n .map((column, index) => [column, columnIds[index]] as const)\n .filter(([column]) => column.filters?.length)\n .map(([, id]) => [\n id,\n (state.find((filter) => filter.id === id)?.value as TableFilters[string]) ?? null,\n ]),\n );\n\n const toSorter = (state: SortingState): TableSorterResult<T> => {\n const [active] = state;\n if (!active) return {};\n const index = columnIds.indexOf(active.id);\n return {\n column: columns[index],\n columnKey: active.id,\n order: active.desc ? 'descend' : 'ascend',\n };\n };\n\n const toPaginationArg = (next: PaginationState): TablePaginationConfig =>\n config ? { ...config, current: next.pageIndex + 1, pageSize: next.pageSize } : {};\n\n const report = (\n nextPage: PaginationState,\n nextFilters: ColumnFiltersState,\n nextSorting: SortingState,\n ) => onChange?.(toPaginationArg(nextPage), toFilters(nextFilters), toSorter(nextSorting));\n\n const changePage = (next: PaginationState) => {\n setInnerPage(next);\n const sizeChanged = next.pageSize !== page.pageSize;\n if (sizeChanged) config?.onShowSizeChange?.(next.pageIndex + 1, next.pageSize);\n if (sizeChanged || next.pageIndex !== page.pageIndex) {\n config?.onChange?.(next.pageIndex + 1, next.pageSize);\n }\n };\n\n const clampPage = (pageIndex: number) => {\n if (config?.current === undefined) {\n setInnerPage((previous) => ({ ...previous, pageIndex }));\n return;\n }\n config.onChange?.(pageIndex + 1, page.pageSize);\n };\n\n const onSortingChange = (updater: Updater<SortingState>) => {\n const next = resolve(updater, sorting);\n const firstPage = { ...page, pageIndex: 0 };\n setSorting(next);\n changePage(firstPage);\n report(firstPage, columnFilters, next);\n };\n\n const onColumnFiltersChange = (updater: Updater<ColumnFiltersState>) => {\n const next = resolve(updater, columnFilters);\n const firstPage = { ...page, pageIndex: 0 };\n setColumnFilters(next);\n changePage(firstPage);\n report(firstPage, next, sorting);\n };\n\n const onPaginationChange = (updater: Updater<PaginationState>) => {\n const next = resolve(updater, page);\n changePage(next);\n report(next, columnFilters, sorting);\n };\n\n return {\n clampPage,\n columnFilters,\n columnIds,\n config,\n manualSorting: columns.some((column) => column.sorter === true),\n onColumnFiltersChange,\n onPaginationChange,\n onSortingChange,\n page,\n sorting,\n };\n};\n"],"mappings":"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"}
|