@lobehub/ui 5.62.0 → 5.63.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/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/Pagination/Pagination.mjs +20 -3
- package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
- package/es/base-ui/Pagination/style.mjs +47 -3
- package/es/base-ui/Pagination/style.mjs.map +1 -1
- package/es/base-ui/ProTable/FieldControl.mjs +10 -3
- package/es/base-ui/ProTable/FieldControl.mjs.map +1 -1
- package/es/base-ui/ProTable/LightFilter.mjs +6 -3
- package/es/base-ui/ProTable/LightFilter.mjs.map +1 -1
- package/es/base-ui/ProTable/ProTable.d.mts +4 -5
- package/es/base-ui/ProTable/ProTable.mjs +38 -31
- package/es/base-ui/ProTable/ProTable.mjs.map +1 -1
- package/es/base-ui/ProTable/SearchForm.mjs +59 -6
- package/es/base-ui/ProTable/SearchForm.mjs.map +1 -1
- package/es/base-ui/ProTable/index.d.mts +3 -2
- package/es/base-ui/ProTable/index.mjs +3 -1
- package/es/base-ui/ProTable/locale.d.mts +18 -0
- package/es/base-ui/ProTable/locale.mjs +68 -0
- package/es/base-ui/ProTable/locale.mjs.map +1 -0
- package/es/base-ui/ProTable/style.mjs +38 -0
- package/es/base-ui/ProTable/style.mjs.map +1 -1
- package/es/base-ui/ProTable/type.d.mts +66 -10
- package/es/base-ui/ProTable/useColumnRequest.mjs +61 -0
- package/es/base-ui/ProTable/useColumnRequest.mjs.map +1 -0
- package/es/base-ui/ProTable/useFetchData.mjs.map +1 -1
- package/es/base-ui/Select/Select.mjs +3 -1
- package/es/base-ui/Select/Select.mjs.map +1 -1
- package/es/base-ui/Select/hooks.mjs +8 -4
- package/es/base-ui/Select/hooks.mjs.map +1 -1
- package/es/base-ui/Select/type.d.mts +7 -0
- package/es/base-ui/Table/Table.mjs +15 -3
- package/es/base-ui/Table/Table.mjs.map +1 -1
- package/es/base-ui/Table/index.d.mts +2 -2
- package/es/base-ui/Table/style.mjs +109 -18
- package/es/base-ui/Table/style.mjs.map +1 -1
- package/es/base-ui/Table/type.d.mts +21 -5
- package/es/base-ui/Table/useSorter.mjs +13 -1
- package/es/base-ui/Table/useSorter.mjs.map +1 -1
- package/es/base-ui/index.d.mts +2 -2
- package/es/dashboard/FilterStrip/style.mjs +1 -1
- package/es/dashboard/FilterStrip/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/style.mjs +1 -1
- package/es/dashboard/MetricStrip/style.mjs.map +1 -1
- package/es/dashboard/PageSkeleton/style.mjs +2 -1
- package/es/dashboard/PageSkeleton/style.mjs.map +1 -1
- package/es/dashboard/Surface/Surface.mjs +1 -2
- package/es/dashboard/Surface/Surface.mjs.map +1 -1
- package/es/dashboard/Surface/style.d.mts +10 -5
- package/es/dashboard/Surface/style.mjs +17 -13
- package/es/dashboard/Surface/style.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -30,7 +30,7 @@ declare const styles: {
|
|
|
30
30
|
};
|
|
31
31
|
declare const rootVariants: (props?: ({
|
|
32
32
|
shadow?: boolean | null | undefined;
|
|
33
|
-
size?: "
|
|
33
|
+
size?: "small" | "middle" | "large" | null | undefined;
|
|
34
34
|
variant?: "filled" | "outlined" | "borderless" | null | undefined;
|
|
35
35
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
36
36
|
//#endregion
|
|
@@ -8,9 +8,22 @@ import { memo, useEffect, useRef, useState, useSyncExternalStore } from "react";
|
|
|
8
8
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
9
9
|
import { cx } from "antd-style";
|
|
10
10
|
import useMergeState from "use-merge-value";
|
|
11
|
-
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
11
|
+
import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
|
|
12
12
|
//#region src/base-ui/Pagination/Pagination.tsx
|
|
13
13
|
const XS_QUERY = "(max-width: 575px)";
|
|
14
|
+
/** One-line dots that swap to a double chevron on hover / focus of the jump item. */
|
|
15
|
+
const JumpIcon = ({ direction }) => {
|
|
16
|
+
const Icon = direction === "prev" ? ChevronsLeft : ChevronsRight;
|
|
17
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
|
|
18
|
+
"aria-hidden": true,
|
|
19
|
+
className: styles.ellipsisDots,
|
|
20
|
+
children: "•••"
|
|
21
|
+
}), /* @__PURE__ */ jsx(Icon, {
|
|
22
|
+
"aria-hidden": true,
|
|
23
|
+
className: styles.ellipsisIcon,
|
|
24
|
+
size: 14
|
|
25
|
+
})] });
|
|
26
|
+
};
|
|
14
27
|
const canMatchMedia = () => typeof window !== "undefined" && typeof window.matchMedia === "function";
|
|
15
28
|
const subscribeXs = (onChange) => {
|
|
16
29
|
if (!canMatchMedia()) return () => {};
|
|
@@ -173,10 +186,14 @@ const Pagination = memo(({ align, className, classNames, components, current, de
|
|
|
173
186
|
type: "button",
|
|
174
187
|
onClick: () => goTo(item),
|
|
175
188
|
children: render(item, "page", item)
|
|
176
|
-
}, item) : /* @__PURE__ */ jsx("
|
|
189
|
+
}, item) : /* @__PURE__ */ jsx("button", {
|
|
177
190
|
className: ellipsisVariants({ size }),
|
|
191
|
+
"data-pagination-jump": item === "ellipsis-prev" ? "prev" : "next",
|
|
192
|
+
disabled,
|
|
193
|
+
type: "button",
|
|
178
194
|
title: title(item === "ellipsis-prev" ? `Previous ${jumpStep} Pages` : `Next ${jumpStep} Pages`),
|
|
179
|
-
|
|
195
|
+
onClick: () => goTo(item === "ellipsis-prev" ? Math.max(1, displayCurrent - jumpStep) : Math.min(pageCount, displayCurrent + jumpStep)),
|
|
196
|
+
children: item === "ellipsis-prev" ? render(Math.max(1, displayCurrent - jumpStep), "jump-prev", /* @__PURE__ */ jsx(JumpIcon, { direction: "prev" })) : render(Math.min(pageCount, displayCurrent + jumpStep), "jump-next", /* @__PURE__ */ jsx(JumpIcon, { direction: "next" }))
|
|
180
197
|
}, item)),
|
|
181
198
|
nextButton
|
|
182
199
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.mjs","names":["useControlledState","Input"],"sources":["../../../src/base-ui/Pagination/Pagination.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Input } from '@/base-ui/Input';\nimport Select from '@/base-ui/Select';\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport { clampPage, getPageCount, getPaginationItems } from './helpers';\nimport { buttonVariants, ellipsisVariants, styles } from './style';\nimport type { PaginationItemType, PaginationProps } from './type';\n\nconst XS_QUERY = '(max-width: 575px)';\n\nconst canMatchMedia = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n\nconst subscribeXs = (onChange: () => void) => {\n if (!canMatchMedia()) return () => {};\n const query = window.matchMedia(XS_QUERY);\n query.addEventListener?.('change', onChange);\n return () => query.removeEventListener?.('change', onChange);\n};\nconst getXs = () => canMatchMedia() && window.matchMedia(XS_QUERY).matches;\nconst getServerXs = () => false;\n\n/** Whether the viewport is antd's `xs` breakpoint; only tracked when `enabled`. */\nconst useIsXs = (enabled: boolean) => {\n const isXs = useSyncExternalStore(subscribeXs, getXs, getServerXs);\n return enabled && isXs;\n};\n\nconst Pagination = memo<PaginationProps>(\n ({\n align,\n className,\n classNames,\n components,\n current,\n defaultCurrent = 1,\n defaultPageSize = 10,\n disabled,\n hideOnSinglePage,\n itemRender,\n onChange,\n onPageSizeChange,\n pageSize,\n pageSizeOptions = [10, 20, 50, 100],\n ref,\n responsive,\n showLessItems,\n showQuickJumper,\n showSizeChanger,\n showTitle = true,\n showTotal,\n simple,\n size: sizeProp,\n style,\n styles: customStyles,\n total,\n totalBoundaryShowSizeChanger = 50,\n ...rest\n }) => {\n const [mergedPageSize, setMergedPageSize] = useControlledState(defaultPageSize, {\n value: pageSize,\n });\n const pageCount = getPageCount(total, mergedPageSize);\n const [mergedCurrent, setMergedCurrent] = useControlledState(defaultCurrent, {\n value: current,\n });\n const onChangeStable = useEventCallback((nextCurrent: number, nextPageSize: number) => {\n onChange?.(nextCurrent, nextPageSize);\n });\n\n const isXs = useIsXs(!!responsive && !sizeProp);\n const size = sizeProp ?? (isXs ? 'small' : 'middle');\n\n const [jumperValue, setJumperValue] = useState('');\n const [simpleValue, setSimpleValue] = useState<string | null>(null);\n const pendingNotifyRef = useRef<{ current: number; pageSize: number } | null>(null);\n const [prevPageCount, setPrevPageCount] = useState(pageCount);\n\n if (pageCount !== prevPageCount) {\n setPrevPageCount(pageCount);\n\n if (mergedCurrent > pageCount && pageCount >= 1) {\n setMergedCurrent(pageCount);\n pendingNotifyRef.current = { current: pageCount, pageSize: mergedPageSize };\n }\n }\n\n useEffect(() => {\n if (!pendingNotifyRef.current) return;\n\n const { current: nextCurrent, pageSize: nextPageSize } = pendingNotifyRef.current;\n pendingNotifyRef.current = null;\n onChangeStable(nextCurrent, nextPageSize);\n });\n\n const displayCurrent = clampPage(mergedCurrent, pageCount);\n\n if (hideOnSinglePage && pageCount <= 1) return null;\n\n const commitCurrent = (nextCurrent: number, nextPageSize: number) => {\n setMergedCurrent(nextCurrent);\n onChange?.(nextCurrent, nextPageSize);\n };\n\n const goTo = (page: number) => {\n commitCurrent(clampPage(page, pageCount), mergedPageSize);\n };\n\n const handlePageSizeChange = (value: string) => {\n const nextSize = Number(value);\n const nextPageCount = getPageCount(total, nextSize);\n const nextCurrent = clampPage(displayCurrent, nextPageCount);\n\n setMergedPageSize(nextSize);\n commitCurrent(nextCurrent, nextSize);\n onPageSizeChange?.(nextCurrent, nextSize);\n };\n\n // Like rc-pagination: invalid input is ignored, a valid page is clamped, the input is cleared.\n const jump = () => {\n const page = Number(jumperValue);\n setJumperValue('');\n if (jumperValue.trim() === '' || !Number.isInteger(page)) return;\n const nextCurrent = clampPage(page, pageCount);\n if (nextCurrent !== displayCurrent) goTo(nextCurrent);\n };\n const goButton = typeof showQuickJumper === 'object' ? showQuickJumper.goButton : undefined;\n const mergedShowSizeChanger = showSizeChanger ?? total > totalBoundaryShowSizeChanger;\n const sizeChangerProps = typeof showSizeChanger === 'object' ? showSizeChanger : undefined;\n const SizeChanger = components?.sizeChanger ?? Select;\n\n const jumpStep = showLessItems ? 3 : 5;\n const items = getPaginationItems(displayCurrent, pageCount, showLessItems ? 1 : 2);\n const render = (page: number, type: PaginationItemType, element: ReactNode) =>\n itemRender ? itemRender(page, type, element) : element;\n const title = (text: string) => (showTitle ? text : undefined);\n const iconSize = size === 'small' ? 14 : 16;\n\n const prevButton = (\n <button\n aria-label=\"Previous page\"\n className={buttonVariants({ size })}\n disabled={disabled || displayCurrent <= 1}\n title={title('Previous Page')}\n type=\"button\"\n onClick={() => goTo(displayCurrent - 1)}\n >\n {render(Math.max(1, displayCurrent - 1), 'prev', <ChevronLeft size={iconSize} />)}\n </button>\n );\n const nextButton = (\n <button\n aria-label=\"Next page\"\n className={buttonVariants({ size })}\n disabled={disabled || displayCurrent >= pageCount}\n title={title('Next Page')}\n type=\"button\"\n onClick={() => goTo(displayCurrent + 1)}\n >\n {render(Math.min(pageCount, displayCurrent + 1), 'next', <ChevronRight size={iconSize} />)}\n </button>\n );\n\n const simpleConfig = simple ? (typeof simple === 'object' ? simple : {}) : null;\n const commitSimple = () => {\n if (simpleValue === null) return;\n const page = Number(simpleValue);\n setSimpleValue(null);\n if (simpleValue.trim() === '' || !Number.isInteger(page)) return;\n const nextCurrent = clampPage(page, pageCount);\n if (nextCurrent !== displayCurrent) goTo(nextCurrent);\n };\n const rangeStart = total === 0 ? 0 : (displayCurrent - 1) * mergedPageSize + 1;\n const rangeEnd = Math.min(displayCurrent * mergedPageSize, total);\n\n return (\n <nav\n aria-label=\"Pagination\"\n ref={ref}\n role=\"navigation\"\n style={{ ...customStyles?.root, ...style }}\n className={cx(\n styles.root,\n align && styles.aligned,\n align && styles[align],\n classNames?.root,\n className,\n )}\n {...rest}\n >\n {showTotal && (\n <span className={styles.total}>{showTotal(total, [rangeStart, rangeEnd])}</span>\n )}\n {simpleConfig ? (\n <>\n {prevButton}\n <span className={styles.simplePager} title={title(`${displayCurrent}/${pageCount}`)}>\n {simpleConfig.readOnly ? (\n displayCurrent\n ) : (\n <Input\n aria-label=\"Current page\"\n className={styles.jumperInput}\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n value={simpleValue ?? String(displayCurrent)}\n onBlur={commitSimple}\n onChange={(event) => setSimpleValue(event.currentTarget.value)}\n onKeyUp={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') commitSimple();\n }}\n />\n )}\n <span className={styles.simpleSlash}>/</span>\n {pageCount}\n </span>\n {nextButton}\n </>\n ) : (\n <>\n {prevButton}\n {items.map((item) =>\n typeof item === 'number' ? (\n <button\n aria-current={item === displayCurrent ? 'page' : undefined}\n className={cx(buttonVariants({ size }), classNames?.item)}\n disabled={disabled}\n key={item}\n style={customStyles?.item}\n title={title(String(item))}\n type=\"button\"\n onClick={() => goTo(item)}\n >\n {render(item, 'page', item)}\n </button>\n ) : (\n <span\n className={ellipsisVariants({ size })}\n key={item}\n title={title(\n item === 'ellipsis-prev'\n ? `Previous ${jumpStep} Pages`\n : `Next ${jumpStep} Pages`,\n )}\n >\n {item === 'ellipsis-prev'\n ? render(Math.max(1, displayCurrent - jumpStep), 'jump-prev', '···')\n : render(Math.min(pageCount, displayCurrent + jumpStep), 'jump-next', '···')}\n </span>\n ),\n )}\n {nextButton}\n </>\n )}\n {!simpleConfig && mergedShowSizeChanger && (\n <SizeChanger\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n {...sizeChangerProps}\n value={String(mergedPageSize)}\n options={pageSizeOptions.map((option) => ({\n label: `${option} / page`,\n value: String(option),\n }))}\n style={{\n flex: 'none',\n marginInlineStart: 8,\n width: 'auto',\n ...sizeChangerProps?.style,\n }}\n onChange={(value: string) => {\n handlePageSizeChange(value);\n sizeChangerProps?.onChange?.(value);\n }}\n />\n )}\n {!simpleConfig && showQuickJumper && (\n <span className={styles.jumper}>\n Go to\n <Input\n aria-label=\"Go to page\"\n className={styles.jumperInput}\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n value={jumperValue}\n onChange={(event) => setJumperValue(event.currentTarget.value)}\n onBlur={() => {\n if (!goButton) jump();\n }}\n onKeyUp={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') jump();\n }}\n />\n {goButton === true || typeof goButton === 'string' ? (\n <button\n className={buttonVariants({ size })}\n disabled={disabled}\n type=\"button\"\n onClick={jump}\n >\n {goButton === true ? 'Go' : goButton}\n </button>\n ) : goButton ? (\n <span onClick={jump}>{goButton}</span>\n ) : (\n 'Page'\n )}\n </span>\n )}\n </nav>\n );\n },\n);\n\nPagination.displayName = 'Pagination';\n\nexport default Pagination;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.mjs","names":["useControlledState","Input"],"sources":["../../../src/base-ui/Pagination/Pagination.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport useControlledState from 'use-merge-value';\n\nimport { Input } from '@/base-ui/Input';\nimport Select from '@/base-ui/Select';\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport { clampPage, getPageCount, getPaginationItems } from './helpers';\nimport { buttonVariants, ellipsisVariants, styles } from './style';\nimport type { PaginationItemType, PaginationProps } from './type';\n\nconst XS_QUERY = '(max-width: 575px)';\n\n/** One-line dots that swap to a double chevron on hover / focus of the jump item. */\nconst JumpIcon = ({ direction }: { direction: 'next' | 'prev' }) => {\n const Icon = direction === 'prev' ? ChevronsLeft : ChevronsRight;\n return (\n <>\n <span aria-hidden className={styles.ellipsisDots}>\n •••\n </span>\n <Icon aria-hidden className={styles.ellipsisIcon} size={14} />\n </>\n );\n};\n\nconst canMatchMedia = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n\nconst subscribeXs = (onChange: () => void) => {\n if (!canMatchMedia()) return () => {};\n const query = window.matchMedia(XS_QUERY);\n query.addEventListener?.('change', onChange);\n return () => query.removeEventListener?.('change', onChange);\n};\nconst getXs = () => canMatchMedia() && window.matchMedia(XS_QUERY).matches;\nconst getServerXs = () => false;\n\n/** Whether the viewport is antd's `xs` breakpoint; only tracked when `enabled`. */\nconst useIsXs = (enabled: boolean) => {\n const isXs = useSyncExternalStore(subscribeXs, getXs, getServerXs);\n return enabled && isXs;\n};\n\nconst Pagination = memo<PaginationProps>(\n ({\n align,\n className,\n classNames,\n components,\n current,\n defaultCurrent = 1,\n defaultPageSize = 10,\n disabled,\n hideOnSinglePage,\n itemRender,\n onChange,\n onPageSizeChange,\n pageSize,\n pageSizeOptions = [10, 20, 50, 100],\n ref,\n responsive,\n showLessItems,\n showQuickJumper,\n showSizeChanger,\n showTitle = true,\n showTotal,\n simple,\n size: sizeProp,\n style,\n styles: customStyles,\n total,\n totalBoundaryShowSizeChanger = 50,\n ...rest\n }) => {\n const [mergedPageSize, setMergedPageSize] = useControlledState(defaultPageSize, {\n value: pageSize,\n });\n const pageCount = getPageCount(total, mergedPageSize);\n const [mergedCurrent, setMergedCurrent] = useControlledState(defaultCurrent, {\n value: current,\n });\n const onChangeStable = useEventCallback((nextCurrent: number, nextPageSize: number) => {\n onChange?.(nextCurrent, nextPageSize);\n });\n\n const isXs = useIsXs(!!responsive && !sizeProp);\n const size = sizeProp ?? (isXs ? 'small' : 'middle');\n\n const [jumperValue, setJumperValue] = useState('');\n const [simpleValue, setSimpleValue] = useState<string | null>(null);\n const pendingNotifyRef = useRef<{ current: number; pageSize: number } | null>(null);\n const [prevPageCount, setPrevPageCount] = useState(pageCount);\n\n if (pageCount !== prevPageCount) {\n setPrevPageCount(pageCount);\n\n if (mergedCurrent > pageCount && pageCount >= 1) {\n setMergedCurrent(pageCount);\n pendingNotifyRef.current = { current: pageCount, pageSize: mergedPageSize };\n }\n }\n\n useEffect(() => {\n if (!pendingNotifyRef.current) return;\n\n const { current: nextCurrent, pageSize: nextPageSize } = pendingNotifyRef.current;\n pendingNotifyRef.current = null;\n onChangeStable(nextCurrent, nextPageSize);\n });\n\n const displayCurrent = clampPage(mergedCurrent, pageCount);\n\n if (hideOnSinglePage && pageCount <= 1) return null;\n\n const commitCurrent = (nextCurrent: number, nextPageSize: number) => {\n setMergedCurrent(nextCurrent);\n onChange?.(nextCurrent, nextPageSize);\n };\n\n const goTo = (page: number) => {\n commitCurrent(clampPage(page, pageCount), mergedPageSize);\n };\n\n const handlePageSizeChange = (value: string) => {\n const nextSize = Number(value);\n const nextPageCount = getPageCount(total, nextSize);\n const nextCurrent = clampPage(displayCurrent, nextPageCount);\n\n setMergedPageSize(nextSize);\n commitCurrent(nextCurrent, nextSize);\n onPageSizeChange?.(nextCurrent, nextSize);\n };\n\n // Like rc-pagination: invalid input is ignored, a valid page is clamped, the input is cleared.\n const jump = () => {\n const page = Number(jumperValue);\n setJumperValue('');\n if (jumperValue.trim() === '' || !Number.isInteger(page)) return;\n const nextCurrent = clampPage(page, pageCount);\n if (nextCurrent !== displayCurrent) goTo(nextCurrent);\n };\n const goButton = typeof showQuickJumper === 'object' ? showQuickJumper.goButton : undefined;\n const mergedShowSizeChanger = showSizeChanger ?? total > totalBoundaryShowSizeChanger;\n const sizeChangerProps = typeof showSizeChanger === 'object' ? showSizeChanger : undefined;\n const SizeChanger = components?.sizeChanger ?? Select;\n\n const jumpStep = showLessItems ? 3 : 5;\n const items = getPaginationItems(displayCurrent, pageCount, showLessItems ? 1 : 2);\n const render = (page: number, type: PaginationItemType, element: ReactNode) =>\n itemRender ? itemRender(page, type, element) : element;\n const title = (text: string) => (showTitle ? text : undefined);\n const iconSize = size === 'small' ? 14 : 16;\n\n const prevButton = (\n <button\n aria-label=\"Previous page\"\n className={buttonVariants({ size })}\n disabled={disabled || displayCurrent <= 1}\n title={title('Previous Page')}\n type=\"button\"\n onClick={() => goTo(displayCurrent - 1)}\n >\n {render(Math.max(1, displayCurrent - 1), 'prev', <ChevronLeft size={iconSize} />)}\n </button>\n );\n const nextButton = (\n <button\n aria-label=\"Next page\"\n className={buttonVariants({ size })}\n disabled={disabled || displayCurrent >= pageCount}\n title={title('Next Page')}\n type=\"button\"\n onClick={() => goTo(displayCurrent + 1)}\n >\n {render(Math.min(pageCount, displayCurrent + 1), 'next', <ChevronRight size={iconSize} />)}\n </button>\n );\n\n const simpleConfig = simple ? (typeof simple === 'object' ? simple : {}) : null;\n const commitSimple = () => {\n if (simpleValue === null) return;\n const page = Number(simpleValue);\n setSimpleValue(null);\n if (simpleValue.trim() === '' || !Number.isInteger(page)) return;\n const nextCurrent = clampPage(page, pageCount);\n if (nextCurrent !== displayCurrent) goTo(nextCurrent);\n };\n const rangeStart = total === 0 ? 0 : (displayCurrent - 1) * mergedPageSize + 1;\n const rangeEnd = Math.min(displayCurrent * mergedPageSize, total);\n\n return (\n <nav\n aria-label=\"Pagination\"\n ref={ref}\n role=\"navigation\"\n style={{ ...customStyles?.root, ...style }}\n className={cx(\n styles.root,\n align && styles.aligned,\n align && styles[align],\n classNames?.root,\n className,\n )}\n {...rest}\n >\n {showTotal && (\n <span className={styles.total}>{showTotal(total, [rangeStart, rangeEnd])}</span>\n )}\n {simpleConfig ? (\n <>\n {prevButton}\n <span className={styles.simplePager} title={title(`${displayCurrent}/${pageCount}`)}>\n {simpleConfig.readOnly ? (\n displayCurrent\n ) : (\n <Input\n aria-label=\"Current page\"\n className={styles.jumperInput}\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n value={simpleValue ?? String(displayCurrent)}\n onBlur={commitSimple}\n onChange={(event) => setSimpleValue(event.currentTarget.value)}\n onKeyUp={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') commitSimple();\n }}\n />\n )}\n <span className={styles.simpleSlash}>/</span>\n {pageCount}\n </span>\n {nextButton}\n </>\n ) : (\n <>\n {prevButton}\n {items.map((item) =>\n typeof item === 'number' ? (\n <button\n aria-current={item === displayCurrent ? 'page' : undefined}\n className={cx(buttonVariants({ size }), classNames?.item)}\n disabled={disabled}\n key={item}\n style={customStyles?.item}\n title={title(String(item))}\n type=\"button\"\n onClick={() => goTo(item)}\n >\n {render(item, 'page', item)}\n </button>\n ) : (\n <button\n className={ellipsisVariants({ size })}\n data-pagination-jump={item === 'ellipsis-prev' ? 'prev' : 'next'}\n disabled={disabled}\n key={item}\n type=\"button\"\n title={title(\n item === 'ellipsis-prev'\n ? `Previous ${jumpStep} Pages`\n : `Next ${jumpStep} Pages`,\n )}\n onClick={() =>\n goTo(\n item === 'ellipsis-prev'\n ? Math.max(1, displayCurrent - jumpStep)\n : Math.min(pageCount, displayCurrent + jumpStep),\n )\n }\n >\n {item === 'ellipsis-prev'\n ? render(\n Math.max(1, displayCurrent - jumpStep),\n 'jump-prev',\n <JumpIcon direction=\"prev\" />,\n )\n : render(\n Math.min(pageCount, displayCurrent + jumpStep),\n 'jump-next',\n <JumpIcon direction=\"next\" />,\n )}\n </button>\n ),\n )}\n {nextButton}\n </>\n )}\n {!simpleConfig && mergedShowSizeChanger && (\n <SizeChanger\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n {...sizeChangerProps}\n value={String(mergedPageSize)}\n options={pageSizeOptions.map((option) => ({\n label: `${option} / page`,\n value: String(option),\n }))}\n style={{\n flex: 'none',\n marginInlineStart: 8,\n width: 'auto',\n ...sizeChangerProps?.style,\n }}\n onChange={(value: string) => {\n handlePageSizeChange(value);\n sizeChangerProps?.onChange?.(value);\n }}\n />\n )}\n {!simpleConfig && showQuickJumper && (\n <span className={styles.jumper}>\n Go to\n <Input\n aria-label=\"Go to page\"\n className={styles.jumperInput}\n disabled={disabled}\n size={size === 'small' ? 'small' : 'middle'}\n value={jumperValue}\n onChange={(event) => setJumperValue(event.currentTarget.value)}\n onBlur={() => {\n if (!goButton) jump();\n }}\n onKeyUp={(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') jump();\n }}\n />\n {goButton === true || typeof goButton === 'string' ? (\n <button\n className={buttonVariants({ size })}\n disabled={disabled}\n type=\"button\"\n onClick={jump}\n >\n {goButton === true ? 'Go' : goButton}\n </button>\n ) : goButton ? (\n <span onClick={jump}>{goButton}</span>\n ) : (\n 'Page'\n )}\n </span>\n )}\n </nav>\n );\n },\n);\n\nPagination.displayName = 'Pagination';\n\nexport default Pagination;\n"],"mappings":";;;;;;;;;;;;AAuBA,MAAM,WAAW;;AAGjB,MAAM,YAAY,EAAE,gBAAgD;CAClE,MAAM,OAAO,cAAc,SAAS,eAAe;CACnD,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD;EAAM,eAAA;EAAY,WAAW,OAAO;EAAc,UAAA;CAE5C,CAAA,GACN,oBAAC,MAAD;EAAM,eAAA;EAAY,WAAW,OAAO;EAAc,MAAM;CAAK,CAAA,CAC7D,EAAA,CAAA;AAEN;AAEA,MAAM,sBACJ,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe;AAEhE,MAAM,eAAe,aAAyB;CAC5C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;CACpC,MAAM,QAAQ,OAAO,WAAW,QAAQ;CACxC,MAAM,mBAAmB,UAAU,QAAQ;CAC3C,aAAa,MAAM,sBAAsB,UAAU,QAAQ;AAC7D;AACA,MAAM,cAAc,cAAc,KAAK,OAAO,WAAW,QAAQ,CAAC,CAAC;AACnE,MAAM,oBAAoB;;AAG1B,MAAM,WAAW,YAAqB;CACpC,MAAM,OAAO,qBAAqB,aAAa,OAAO,WAAW;CACjE,OAAO,WAAW;AACpB;AAEA,MAAM,aAAa,MAChB,EACC,OACA,WACA,YACA,YACA,SACA,iBAAiB,GACjB,kBAAkB,IAClB,UACA,kBACA,YACA,UACA,kBACA,UACA,kBAAkB;CAAC;CAAI;CAAI;CAAI;AAAG,GAClC,KACA,YACA,eACA,iBACA,iBACA,YAAY,MACZ,WACA,QACA,MAAM,UACN,OACA,QAAQ,cACR,OACA,+BAA+B,IAC/B,GAAG,WACC;CACJ,MAAM,CAAC,gBAAgB,qBAAqBA,cAAmB,iBAAiB,EAC9E,OAAO,SACT,CAAC;CACD,MAAM,YAAY,aAAa,OAAO,cAAc;CACpD,MAAM,CAAC,eAAe,oBAAoBA,cAAmB,gBAAgB,EAC3E,OAAO,QACT,CAAC;CACD,MAAM,iBAAiB,kBAAkB,aAAqB,iBAAyB;EACrF,WAAW,aAAa,YAAY;CACtC,CAAC;CAED,MAAM,OAAO,QAAQ,CAAC,CAAC,cAAc,CAAC,QAAQ;CAC9C,MAAM,OAAO,aAAa,OAAO,UAAU;CAE3C,MAAM,CAAC,aAAa,kBAAkB,SAAS,EAAE;CACjD,MAAM,CAAC,aAAa,kBAAkB,SAAwB,IAAI;CAClE,MAAM,mBAAmB,OAAqD,IAAI;CAClF,MAAM,CAAC,eAAe,oBAAoB,SAAS,SAAS;CAE5D,IAAI,cAAc,eAAe;EAC/B,iBAAiB,SAAS;EAE1B,IAAI,gBAAgB,aAAa,aAAa,GAAG;GAC/C,iBAAiB,SAAS;GAC1B,iBAAiB,UAAU;IAAE,SAAS;IAAW,UAAU;GAAe;EAC5E;CACF;CAEA,gBAAgB;EACd,IAAI,CAAC,iBAAiB,SAAS;EAE/B,MAAM,EAAE,SAAS,aAAa,UAAU,iBAAiB,iBAAiB;EAC1E,iBAAiB,UAAU;EAC3B,eAAe,aAAa,YAAY;CAC1C,CAAC;CAED,MAAM,iBAAiB,UAAU,eAAe,SAAS;CAEzD,IAAI,oBAAoB,aAAa,GAAG,OAAO;CAE/C,MAAM,iBAAiB,aAAqB,iBAAyB;EACnE,iBAAiB,WAAW;EAC5B,WAAW,aAAa,YAAY;CACtC;CAEA,MAAM,QAAQ,SAAiB;EAC7B,cAAc,UAAU,MAAM,SAAS,GAAG,cAAc;CAC1D;CAEA,MAAM,wBAAwB,UAAkB;EAC9C,MAAM,WAAW,OAAO,KAAK;EAC7B,MAAM,gBAAgB,aAAa,OAAO,QAAQ;EAClD,MAAM,cAAc,UAAU,gBAAgB,aAAa;EAE3D,kBAAkB,QAAQ;EAC1B,cAAc,aAAa,QAAQ;EACnC,mBAAmB,aAAa,QAAQ;CAC1C;CAGA,MAAM,aAAa;EACjB,MAAM,OAAO,OAAO,WAAW;EAC/B,eAAe,EAAE;EACjB,IAAI,YAAY,KAAK,MAAM,MAAM,CAAC,OAAO,UAAU,IAAI,GAAG;EAC1D,MAAM,cAAc,UAAU,MAAM,SAAS;EAC7C,IAAI,gBAAgB,gBAAgB,KAAK,WAAW;CACtD;CACA,MAAM,WAAW,OAAO,oBAAoB,WAAW,gBAAgB,WAAW,KAAA;CAClF,MAAM,wBAAwB,mBAAmB,QAAQ;CACzD,MAAM,mBAAmB,OAAO,oBAAoB,WAAW,kBAAkB,KAAA;CACjF,MAAM,cAAc,YAAY,eAAe;CAE/C,MAAM,WAAW,gBAAgB,IAAI;CACrC,MAAM,QAAQ,mBAAmB,gBAAgB,WAAW,gBAAgB,IAAI,CAAC;CACjF,MAAM,UAAU,MAAc,MAA0B,YACtD,aAAa,WAAW,MAAM,MAAM,OAAO,IAAI;CACjD,MAAM,SAAS,SAAkB,YAAY,OAAO,KAAA;CACpD,MAAM,WAAW,SAAS,UAAU,KAAK;CAEzC,MAAM,aACJ,oBAAC,UAAD;EACE,cAAW;EACX,WAAW,eAAe,EAAE,KAAK,CAAC;EAClC,UAAU,YAAY,kBAAkB;EACxC,OAAO,MAAM,eAAe;EAC5B,MAAK;EACL,eAAe,KAAK,iBAAiB,CAAC;EAErC,UAAA,OAAO,KAAK,IAAI,GAAG,iBAAiB,CAAC,GAAG,QAAQ,oBAAC,aAAD,EAAa,MAAM,SAAW,CAAA,CAAC;CAC1E,CAAA;CAEV,MAAM,aACJ,oBAAC,UAAD;EACE,cAAW;EACX,WAAW,eAAe,EAAE,KAAK,CAAC;EAClC,UAAU,YAAY,kBAAkB;EACxC,OAAO,MAAM,WAAW;EACxB,MAAK;EACL,eAAe,KAAK,iBAAiB,CAAC;EAErC,UAAA,OAAO,KAAK,IAAI,WAAW,iBAAiB,CAAC,GAAG,QAAQ,oBAAC,cAAD,EAAc,MAAM,SAAW,CAAA,CAAC;CACnF,CAAA;CAGV,MAAM,eAAe,SAAU,OAAO,WAAW,WAAW,SAAS,CAAC,IAAK;CAC3E,MAAM,qBAAqB;EACzB,IAAI,gBAAgB,MAAM;EAC1B,MAAM,OAAO,OAAO,WAAW;EAC/B,eAAe,IAAI;EACnB,IAAI,YAAY,KAAK,MAAM,MAAM,CAAC,OAAO,UAAU,IAAI,GAAG;EAC1D,MAAM,cAAc,UAAU,MAAM,SAAS;EAC7C,IAAI,gBAAgB,gBAAgB,KAAK,WAAW;CACtD;CACA,MAAM,aAAa,UAAU,IAAI,KAAK,iBAAiB,KAAK,iBAAiB;CAC7E,MAAM,WAAW,KAAK,IAAI,iBAAiB,gBAAgB,KAAK;CAEhE,OACE,qBAAC,OAAD;EACE,cAAW;EACN;EACL,MAAK;EACL,OAAO;GAAE,GAAG,cAAc;GAAM,GAAG;EAAM;EACzC,WAAW,GACT,OAAO,MACP,SAAS,OAAO,SAChB,SAAS,OAAO,QAChB,YAAY,MACZ,SACF;EACA,GAAI;EAZN,UAAA;GAcG,aACC,oBAAC,QAAD;IAAM,WAAW,OAAO;IAAQ,UAAA,UAAU,OAAO,CAAC,YAAY,QAAQ,CAAC;GAAQ,CAAA;GAEhF,eACC,qBAAA,YAAA,EAAA,UAAA;IACG;IACD,qBAAC,QAAD;KAAM,WAAW,OAAO;KAAa,OAAO,MAAM,GAAG,eAAe,GAAG,WAAW;KAAlF,UAAA;MACG,aAAa,WACZ,iBAEA,oBAACC,eAAD;OACE,cAAW;OACX,WAAW,OAAO;OACR;OACV,MAAM,SAAS,UAAU,UAAU;OACnC,OAAO,eAAe,OAAO,cAAc;OAC3C,QAAQ;OACR,WAAW,UAAU,eAAe,MAAM,cAAc,KAAK;OAC7D,UAAU,UAA2C;QACnD,IAAI,MAAM,QAAQ,SAAS,aAAa;OAC1C;MACD,CAAA;MAEH,oBAAC,QAAD;OAAM,WAAW,OAAO;OAAa,UAAA;MAAO,CAAA;MAC3C;KACG;;IACL;GACD,EAAA,CAAA,IAEF,qBAAA,YAAA,EAAA,UAAA;IACG;IACA,MAAM,KAAK,SACV,OAAO,SAAS,WACd,oBAAC,UAAD;KACE,gBAAc,SAAS,iBAAiB,SAAS,KAAA;KACjD,WAAW,GAAG,eAAe,EAAE,KAAK,CAAC,GAAG,YAAY,IAAI;KAC9C;KAEV,OAAO,cAAc;KACrB,OAAO,MAAM,OAAO,IAAI,CAAC;KACzB,MAAK;KACL,eAAe,KAAK,IAAI;KAEvB,UAAA,OAAO,MAAM,QAAQ,IAAI;IACpB,GAPD,IAOC,IAER,oBAAC,UAAD;KACE,WAAW,iBAAiB,EAAE,KAAK,CAAC;KACpC,wBAAsB,SAAS,kBAAkB,SAAS;KAChD;KAEV,MAAK;KACL,OAAO,MACL,SAAS,kBACL,YAAY,SAAS,UACrB,QAAQ,SAAS,OACvB;KACA,eACE,KACE,SAAS,kBACL,KAAK,IAAI,GAAG,iBAAiB,QAAQ,IACrC,KAAK,IAAI,WAAW,iBAAiB,QAAQ,CACnD;KAGD,UAAA,SAAS,kBACN,OACE,KAAK,IAAI,GAAG,iBAAiB,QAAQ,GACrC,aACA,oBAAC,UAAD,EAAU,WAAU,OAAQ,CAAA,CAC9B,IACA,OACE,KAAK,IAAI,WAAW,iBAAiB,QAAQ,GAC7C,aACA,oBAAC,UAAD,EAAU,WAAU,OAAQ,CAAA,CAC9B;IACE,GA1BD,IA0BC,CAEZ;IACC;GACD,EAAA,CAAA;GAEH,CAAC,gBAAgB,yBAChB,oBAAC,aAAD;IACY;IACV,MAAM,SAAS,UAAU,UAAU;IACnC,GAAI;IACJ,OAAO,OAAO,cAAc;IAC5B,SAAS,gBAAgB,KAAK,YAAY;KACxC,OAAO,GAAG,OAAO;KACjB,OAAO,OAAO,MAAM;IACtB,EAAE;IACF,OAAO;KACL,MAAM;KACN,mBAAmB;KACnB,OAAO;KACP,GAAG,kBAAkB;IACvB;IACA,WAAW,UAAkB;KAC3B,qBAAqB,KAAK;KAC1B,kBAAkB,WAAW,KAAK;IACpC;GACD,CAAA;GAEF,CAAC,gBAAgB,mBAChB,qBAAC,QAAD;IAAM,WAAW,OAAO;IAAxB,UAAA;KAAgC;KAE9B,oBAACA,eAAD;MACE,cAAW;MACX,WAAW,OAAO;MACR;MACV,MAAM,SAAS,UAAU,UAAU;MACnC,OAAO;MACP,WAAW,UAAU,eAAe,MAAM,cAAc,KAAK;MAC7D,cAAc;OACZ,IAAI,CAAC,UAAU,KAAK;MACtB;MACA,UAAU,UAA2C;OACnD,IAAI,MAAM,QAAQ,SAAS,KAAK;MAClC;KACD,CAAA;KACA,aAAa,QAAQ,OAAO,aAAa,WACxC,oBAAC,UAAD;MACE,WAAW,eAAe,EAAE,KAAK,CAAC;MACxB;MACV,MAAK;MACL,SAAS;MAER,UAAA,aAAa,OAAO,OAAO;KACtB,CAAA,IACN,WACF,oBAAC,QAAD;MAAM,SAAS;MAAO,UAAA;KAAe,CAAA,IAErC;IAEE;;EAEL;;AAET,CACF;AAEA,WAAW,cAAc"}
|
|
@@ -49,14 +49,57 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
49
49
|
justify-content: center;
|
|
50
50
|
`,
|
|
51
51
|
ellipsis: css`
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
|
|
54
|
+
display: inline-grid;
|
|
55
|
+
flex: none;
|
|
56
|
+
place-items: center;
|
|
55
57
|
|
|
56
58
|
width: 28px;
|
|
59
|
+
height: 28px;
|
|
60
|
+
padding: 0;
|
|
61
|
+
border: none;
|
|
62
|
+
border-radius: ${cssVar.borderRadius};
|
|
57
63
|
|
|
64
|
+
font: inherit;
|
|
65
|
+
line-height: 1;
|
|
58
66
|
color: ${cssVar.colorTextQuaternary};
|
|
67
|
+
white-space: nowrap;
|
|
68
|
+
|
|
69
|
+
background: transparent;
|
|
70
|
+
|
|
71
|
+
& > * {
|
|
72
|
+
grid-area: 1 / 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
&:hover:not(:disabled),
|
|
76
|
+
&:focus-visible {
|
|
77
|
+
color: ${cssVar.colorText};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
&:disabled {
|
|
81
|
+
cursor: default;
|
|
82
|
+
}
|
|
83
|
+
`,
|
|
84
|
+
ellipsisDots: css`
|
|
85
|
+
font-size: 8px;
|
|
86
|
+
|
|
87
|
+
/* Trailing letter-spacing would push the dots off center. */
|
|
88
|
+
text-indent: 2px;
|
|
59
89
|
letter-spacing: 2px;
|
|
90
|
+
|
|
91
|
+
button:hover:not(:disabled) > &,
|
|
92
|
+
button:focus-visible > & {
|
|
93
|
+
visibility: hidden;
|
|
94
|
+
}
|
|
95
|
+
`,
|
|
96
|
+
ellipsisIcon: css`
|
|
97
|
+
visibility: hidden;
|
|
98
|
+
|
|
99
|
+
button:hover:not(:disabled) > &,
|
|
100
|
+
button:focus-visible > & {
|
|
101
|
+
visibility: visible;
|
|
102
|
+
}
|
|
60
103
|
`,
|
|
61
104
|
end: css`
|
|
62
105
|
justify-content: flex-end;
|
|
@@ -100,6 +143,7 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
100
143
|
`,
|
|
101
144
|
smallEllipsis: css`
|
|
102
145
|
width: 24px;
|
|
146
|
+
height: 24px;
|
|
103
147
|
`,
|
|
104
148
|
start: css`
|
|
105
149
|
justify-content: flex-start;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/Pagination/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n aligned: css`\n display: flex;\n width: 100%;\n `,\n button: css`\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n min-width: 28px;\n height: 28px;\n padding-inline: 6px;\n border: none;\n border-radius: ${cssVar.borderRadius};\n\n font-size: 13px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n color: ${cssVar.colorTextSecondary};\n\n background: transparent;\n\n transition: background-color 0.15s;\n\n &:hover:not(:disabled) {\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillTertiary};\n }\n\n &:disabled {\n cursor: default;\n color: ${cssVar.colorTextQuaternary};\n background: transparent;\n }\n\n &[aria-current='page'] {\n font-weight: 600;\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillSecondary};\n }\n `,\n center: css`\n justify-content: center;\n `,\n ellipsis: css`\n display: inline-
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../../src/base-ui/Pagination/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\nimport { cva } from 'class-variance-authority';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n aligned: css`\n display: flex;\n width: 100%;\n `,\n button: css`\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n min-width: 28px;\n height: 28px;\n padding-inline: 6px;\n border: none;\n border-radius: ${cssVar.borderRadius};\n\n font-size: 13px;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n color: ${cssVar.colorTextSecondary};\n\n background: transparent;\n\n transition: background-color 0.15s;\n\n &:hover:not(:disabled) {\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillTertiary};\n }\n\n &:disabled {\n cursor: default;\n color: ${cssVar.colorTextQuaternary};\n background: transparent;\n }\n\n &[aria-current='page'] {\n font-weight: 600;\n color: ${cssVar.colorText};\n background: ${cssVar.colorFillSecondary};\n }\n `,\n center: css`\n justify-content: center;\n `,\n /* Jump item: dots and the double chevron share one grid cell, so the dots never wrap or\n shrink beside a wide page number and hover swaps them in place. */\n ellipsis: css`\n cursor: pointer;\n\n display: inline-grid;\n flex: none;\n place-items: center;\n\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: ${cssVar.borderRadius};\n\n font: inherit;\n line-height: 1;\n color: ${cssVar.colorTextQuaternary};\n white-space: nowrap;\n\n background: transparent;\n\n & > * {\n grid-area: 1 / 1;\n }\n\n &:hover:not(:disabled),\n &:focus-visible {\n color: ${cssVar.colorText};\n }\n\n &:disabled {\n cursor: default;\n }\n `,\n ellipsisDots: css`\n font-size: 8px;\n\n /* Trailing letter-spacing would push the dots off center. */\n text-indent: 2px;\n letter-spacing: 2px;\n\n button:hover:not(:disabled) > &,\n button:focus-visible > & {\n visibility: hidden;\n }\n `,\n ellipsisIcon: css`\n visibility: hidden;\n\n button:hover:not(:disabled) > &,\n button:focus-visible > & {\n visibility: visible;\n }\n `,\n end: css`\n justify-content: flex-end;\n `,\n jumper: css`\n display: inline-flex;\n gap: 6px;\n align-items: center;\n\n margin-inline-start: 8px;\n\n font-size: 13px;\n color: ${cssVar.colorTextSecondary};\n white-space: nowrap;\n `,\n jumperInput: css`\n width: 50px;\n `,\n root: css`\n display: inline-flex;\n gap: 4px;\n align-items: center;\n font-variant-numeric: tabular-nums;\n `,\n simplePager: css`\n display: inline-flex;\n gap: 6px;\n align-items: center;\n\n font-size: 13px;\n color: ${cssVar.colorTextSecondary};\n white-space: nowrap;\n `,\n simpleSlash: css`\n color: ${cssVar.colorTextQuaternary};\n `,\n small: css`\n min-width: 24px;\n height: 24px;\n font-size: 12px;\n `,\n smallEllipsis: css`\n width: 24px;\n height: 24px;\n `,\n start: css`\n justify-content: flex-start;\n `,\n total: css`\n margin-inline-end: 8px;\n font-size: 12px;\n color: ${cssVar.colorTextTertiary};\n white-space: nowrap;\n `,\n}));\n\nexport const buttonVariants = cva(styles.button, {\n defaultVariants: {\n size: 'middle',\n },\n variants: {\n size: {\n middle: null,\n small: styles.small,\n },\n },\n});\n\nexport const ellipsisVariants = cva(styles.ellipsis, {\n defaultVariants: {\n size: 'middle',\n },\n variants: {\n size: {\n middle: null,\n small: styles.smallEllipsis,\n },\n },\n});\n"],"mappings":";;;AAGA,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc;CAC7D,SAAS,GAAG;;;;CAIZ,QAAQ,GAAG;;;;;;;;;;;qBAWQ,OAAO,aAAa;;;;;aAK5B,OAAO,mBAAmB;;;;;;;eAOxB,OAAO,UAAU;oBACZ,OAAO,kBAAkB;;;;;eAK9B,OAAO,oBAAoB;;;;;;eAM3B,OAAO,UAAU;oBACZ,OAAO,mBAAmB;;;CAG5C,QAAQ,GAAG;;;CAKX,UAAU,GAAG;;;;;;;;;;;qBAWM,OAAO,aAAa;;;;aAI5B,OAAO,oBAAoB;;;;;;;;;;;eAWzB,OAAO,UAAU;;;;;;;CAO9B,cAAc,GAAG;;;;;;;;;;;;CAYjB,cAAc,GAAG;;;;;;;;CAQjB,KAAK,GAAG;;;CAGR,QAAQ,GAAG;;;;;;;;aAQA,OAAO,mBAAmB;;;CAGrC,aAAa,GAAG;;;CAGhB,MAAM,GAAG;;;;;;CAMT,aAAa,GAAG;;;;;;aAML,OAAO,mBAAmB;;;CAGrC,aAAa,GAAG;aACL,OAAO,oBAAoB;;CAEtC,OAAO,GAAG;;;;;CAKV,eAAe,GAAG;;;;CAIlB,OAAO,GAAG;;;CAGV,OAAO,GAAG;;;aAGC,OAAO,kBAAkB;;;AAGtC,EAAE;AAEF,MAAa,iBAAiB,IAAI,OAAO,QAAQ;CAC/C,iBAAiB,EACf,MAAM,SACR;CACA,UAAU,EACR,MAAM;EACJ,QAAQ;EACR,OAAO,OAAO;CAChB,EACF;AACF,CAAC;AAED,MAAa,mBAAmB,IAAI,OAAO,UAAU;CACnD,iBAAiB,EACf,MAAM,SACR;CACA,UAAU,EACR,MAAM;EACJ,QAAQ;EACR,OAAO,OAAO;CAChB,EACF;AACF,CAAC"}
|
|
@@ -4,6 +4,7 @@ import InputNumber_default from "../Input/InputNumber.mjs";
|
|
|
4
4
|
import Select from "../Select/Select.mjs";
|
|
5
5
|
import DatePicker from "../DatePicker/DatePicker.mjs";
|
|
6
6
|
import DateRangePicker from "../DatePicker/DateRangePicker.mjs";
|
|
7
|
+
import { useColumnRequest } from "./useColumnRequest.mjs";
|
|
7
8
|
import { resolveValueEnum, resolveValueType, valueEnumToList } from "./utils.mjs";
|
|
8
9
|
import { jsx } from "react/jsx-runtime";
|
|
9
10
|
import { useThemeMode } from "antd-style";
|
|
@@ -22,20 +23,22 @@ const FieldControl = ({ column, form, light, onChange, placeholder, value }) =>
|
|
|
22
23
|
const size = light ? "small" : void 0;
|
|
23
24
|
const { isDarkMode } = useThemeMode();
|
|
24
25
|
const variant = light ? isDarkMode ? "filled" : "outlined" : void 0;
|
|
26
|
+
const remote = useColumnRequest(column);
|
|
25
27
|
if (column.renderFormItem) return column.renderFormItem(column, {
|
|
26
28
|
form,
|
|
27
29
|
isQuery: !light,
|
|
28
30
|
onChange,
|
|
29
31
|
value
|
|
30
32
|
}, form);
|
|
31
|
-
if (valueEnum || SELECT_TYPES.has(valueType)) {
|
|
32
|
-
const options = fieldProps.options ?? valueEnumToList(valueEnum).map((item) => ({
|
|
33
|
+
if (remote.enabled || valueEnum || SELECT_TYPES.has(valueType)) {
|
|
34
|
+
const options = remote.options ?? fieldProps.options ?? valueEnumToList(valueEnum).map((item) => ({
|
|
33
35
|
disabled: item.disabled,
|
|
34
36
|
label: item.text,
|
|
35
37
|
value: item.value
|
|
36
38
|
}));
|
|
37
39
|
return /* @__PURE__ */ jsx(Select, {
|
|
38
40
|
allowClear: true,
|
|
41
|
+
loading: remote.loading,
|
|
39
42
|
mode: valueType === "checkbox" ? "multiple" : void 0,
|
|
40
43
|
options,
|
|
41
44
|
placeholder: light ? label : placeholder.select,
|
|
@@ -44,7 +47,11 @@ const FieldControl = ({ column, form, light, onChange, placeholder, value }) =>
|
|
|
44
47
|
value: value ?? (valueType === "checkbox" ? [] : null),
|
|
45
48
|
variant,
|
|
46
49
|
...fieldProps,
|
|
47
|
-
onChange: (next) => onChange(next ?? void 0)
|
|
50
|
+
onChange: (next) => onChange(next ?? void 0),
|
|
51
|
+
onSearch: remote.onSearch ? (keyWords) => {
|
|
52
|
+
remote.onSearch(keyWords);
|
|
53
|
+
fieldProps.onSearch?.(keyWords);
|
|
54
|
+
} : fieldProps.onSearch
|
|
48
55
|
});
|
|
49
56
|
}
|
|
50
57
|
switch (valueType) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldControl.mjs","names":["InputNumber","Input"],"sources":["../../../src/base-ui/ProTable/FieldControl.tsx"],"sourcesContent":["import { useThemeMode } from 'antd-style';\nimport { type ReactNode } from 'react';\n\nimport DatePicker from '@/base-ui/DatePicker/DatePicker';\nimport DateRangePicker from '@/base-ui/DatePicker/DateRangePicker';\nimport Input from '@/base-ui/Input/Input';\nimport InputNumber from '@/base-ui/Input/InputNumber';\nimport Select from '@/base-ui/Select';\nimport Switch from '@/base-ui/Switch';\n\nimport type { ProColumnType, ProTableFormInstance, ProTableValueType } from './type';\nimport { resolveValueEnum, resolveValueType, valueEnumToList } from './utils';\n\nexport interface FieldControlProps {\n column: ProColumnType<any>;\n form: ProTableFormInstance;\n /** Light filter bar: small controls, outlined in light mode and filled in dark mode. */\n light?: boolean;\n onChange: (value: any) => void;\n placeholder: { input: string; select: string };\n value: any;\n}\n\nconst SELECT_TYPES = new Set<ProTableValueType>(['select', 'radio', 'checkbox']);\n\n/** The search-form control of a column (Pro \"edit\" mode, query flavor). */\nconst FieldControl = ({ column, form, light, onChange, placeholder, value }: FieldControlProps) => {\n const valueType = resolveValueType(column) ?? 'text';\n const valueEnum = resolveValueEnum(column);\n const { fieldProps = {} } = column;\n const label = typeof column.title === 'string' ? column.title : undefined;\n const size = light ? 'small' : undefined;\n const { isDarkMode } = useThemeMode();\n // Light filter: outlined on light backgrounds, filled in dark mode.\n const variant = light ? (isDarkMode ? 'filled' : 'outlined') : undefined;\n\n if (column.renderFormItem) {\n return column.renderFormItem(\n column,\n { form, isQuery: !light, onChange, value },\n form,\n ) as ReactNode;\n }\n\n if (valueEnum || SELECT_TYPES.has(valueType)) {\n const options =\n fieldProps.options ??\n valueEnumToList(valueEnum).map((item) => ({\n disabled: item.disabled,\n label: item.text,\n value: item.value,\n }));\n return (\n <Select\n allowClear\n mode={valueType === 'checkbox' ? 'multiple' : undefined}\n options={options}\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? (valueType === 'checkbox' ? [] : null)}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n\n switch (valueType) {\n case 'digit':\n case 'money':\n case 'percent':\n case 'progress': {\n return (\n <InputNumber\n placeholder={light ? label : placeholder.input}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'switch': {\n return <Switch checked={!!value} {...fieldProps} onChange={(next) => onChange(next)} />;\n }\n case 'date':\n case 'dateTime': {\n return (\n <DatePicker\n allowClear\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'dateRange':\n case 'dateTimeRange': {\n return (\n <DateRangePicker\n allowClear\n size={size}\n style={{ width: '100%' }}\n value={value ?? [null, null]}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next && (next[0] || next[1]) ? next : undefined)}\n />\n );\n }\n default: {\n return (\n <Input\n allowClear\n placeholder={light ? label : placeholder.input}\n size={size}\n type={valueType === 'password' ? 'password' : undefined}\n value={value ?? ''}\n variant={variant}\n {...fieldProps}\n onChange={(event) => onChange(event.target.value === '' ? undefined : event.target.value)}\n onClear={() => {\n onChange(undefined);\n fieldProps.onClear?.();\n }}\n />\n );\n }\n }\n};\n\nexport default FieldControl;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"FieldControl.mjs","names":["InputNumber","Input"],"sources":["../../../src/base-ui/ProTable/FieldControl.tsx"],"sourcesContent":["import { useThemeMode } from 'antd-style';\nimport { type ReactNode } from 'react';\n\nimport DatePicker from '@/base-ui/DatePicker/DatePicker';\nimport DateRangePicker from '@/base-ui/DatePicker/DateRangePicker';\nimport Input from '@/base-ui/Input/Input';\nimport InputNumber from '@/base-ui/Input/InputNumber';\nimport Select from '@/base-ui/Select';\nimport Switch from '@/base-ui/Switch';\n\nimport type { ProColumnType, ProTableFormInstance, ProTableValueType } from './type';\nimport { useColumnRequest } from './useColumnRequest';\nimport { resolveValueEnum, resolveValueType, valueEnumToList } from './utils';\n\nexport interface FieldControlProps {\n column: ProColumnType<any>;\n form: ProTableFormInstance;\n /** Light filter bar: small controls, outlined in light mode and filled in dark mode. */\n light?: boolean;\n onChange: (value: any) => void;\n placeholder: { input: string; select: string };\n value: any;\n}\n\nconst SELECT_TYPES = new Set<ProTableValueType>(['select', 'radio', 'checkbox']);\n\n/** The search-form control of a column (Pro \"edit\" mode, query flavor). */\nconst FieldControl = ({ column, form, light, onChange, placeholder, value }: FieldControlProps) => {\n const valueType = resolveValueType(column) ?? 'text';\n const valueEnum = resolveValueEnum(column);\n const { fieldProps = {} } = column;\n const label = typeof column.title === 'string' ? column.title : undefined;\n const size = light ? 'small' : undefined;\n const { isDarkMode } = useThemeMode();\n // Light filter: outlined on light backgrounds, filled in dark mode.\n const variant = light ? (isDarkMode ? 'filled' : 'outlined') : undefined;\n const remote = useColumnRequest(column);\n\n if (column.renderFormItem) {\n return column.renderFormItem(\n column,\n { form, isQuery: !light, onChange, value },\n form,\n ) as ReactNode;\n }\n\n if (remote.enabled || valueEnum || SELECT_TYPES.has(valueType)) {\n const options =\n remote.options ??\n fieldProps.options ??\n valueEnumToList(valueEnum).map((item) => ({\n disabled: item.disabled,\n label: item.text,\n value: item.value,\n }));\n return (\n <Select\n allowClear\n loading={remote.loading}\n mode={valueType === 'checkbox' ? 'multiple' : undefined}\n options={options as any}\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? (valueType === 'checkbox' ? [] : null)}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n onSearch={\n remote.onSearch\n ? (keyWords: string) => {\n remote.onSearch!(keyWords);\n fieldProps.onSearch?.(keyWords);\n }\n : fieldProps.onSearch\n }\n />\n );\n }\n\n switch (valueType) {\n case 'digit':\n case 'money':\n case 'percent':\n case 'progress': {\n return (\n <InputNumber\n placeholder={light ? label : placeholder.input}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'switch': {\n return <Switch checked={!!value} {...fieldProps} onChange={(next) => onChange(next)} />;\n }\n case 'date':\n case 'dateTime': {\n return (\n <DatePicker\n allowClear\n placeholder={light ? label : placeholder.select}\n size={size}\n style={{ width: '100%' }}\n value={value ?? null}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next ?? undefined)}\n />\n );\n }\n case 'dateRange':\n case 'dateTimeRange': {\n return (\n <DateRangePicker\n allowClear\n size={size}\n style={{ width: '100%' }}\n value={value ?? [null, null]}\n variant={variant}\n {...fieldProps}\n onChange={(next) => onChange(next && (next[0] || next[1]) ? next : undefined)}\n />\n );\n }\n default: {\n return (\n <Input\n allowClear\n placeholder={light ? label : placeholder.input}\n size={size}\n type={valueType === 'password' ? 'password' : undefined}\n value={value ?? ''}\n variant={variant}\n {...fieldProps}\n onChange={(event) => onChange(event.target.value === '' ? undefined : event.target.value)}\n onClear={() => {\n onChange(undefined);\n fieldProps.onClear?.();\n }}\n />\n );\n }\n }\n};\n\nexport default FieldControl;\n"],"mappings":";;;;;;;;;;;AAwBA,MAAM,+BAAe,IAAI,IAAuB;CAAC;CAAU;CAAS;AAAU,CAAC;;AAG/E,MAAM,gBAAgB,EAAE,QAAQ,MAAM,OAAO,UAAU,aAAa,YAA+B;CACjG,MAAM,YAAY,iBAAiB,MAAM,KAAK;CAC9C,MAAM,YAAY,iBAAiB,MAAM;CACzC,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,KAAA;CAChE,MAAM,OAAO,QAAQ,UAAU,KAAA;CAC/B,MAAM,EAAE,eAAe,aAAa;CAEpC,MAAM,UAAU,QAAS,aAAa,WAAW,aAAc,KAAA;CAC/D,MAAM,SAAS,iBAAiB,MAAM;CAEtC,IAAI,OAAO,gBACT,OAAO,OAAO,eACZ,QACA;EAAE;EAAM,SAAS,CAAC;EAAO;EAAU;CAAM,GACzC,IACF;CAGF,IAAI,OAAO,WAAW,aAAa,aAAa,IAAI,SAAS,GAAG;EAC9D,MAAM,UACJ,OAAO,WACP,WAAW,WACX,gBAAgB,SAAS,CAAC,CAAC,KAAK,UAAU;GACxC,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,OAAO,KAAK;EACd,EAAE;EACJ,OACE,oBAAC,QAAD;GACE,YAAA;GACA,SAAS,OAAO;GAChB,MAAM,cAAc,aAAa,aAAa,KAAA;GACrC;GACT,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,UAAU,cAAc,aAAa,CAAC,IAAI;GACxC;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;GAC9C,UACE,OAAO,YACF,aAAqB;IACpB,OAAO,SAAU,QAAQ;IACzB,WAAW,WAAW,QAAQ;GAChC,IACA,WAAW;EAElB,CAAA;CAEL;CAEA,QAAQ,WAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,OACE,oBAACA,qBAAD;GACE,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;EAC/C,CAAA;EAGL,KAAK,UACH,OAAO,oBAAC,QAAD;GAAQ,SAAS,CAAC,CAAC;GAAO,GAAI;GAAY,WAAW,SAAS,SAAS,IAAI;EAAI,CAAA;EAExF,KAAK;EACL,KAAK,YACH,OACE,oBAAC,YAAD;GACE,YAAA;GACA,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,QAAQ,KAAA,CAAS;EAC/C,CAAA;EAGL,KAAK;EACL,KAAK,iBACH,OACE,oBAAC,iBAAD;GACE,YAAA;GACM;GACN,OAAO,EAAE,OAAO,OAAO;GACvB,OAAO,SAAS,CAAC,MAAM,IAAI;GAClB;GACT,GAAI;GACJ,WAAW,SAAS,SAAS,SAAS,KAAK,MAAM,KAAK,MAAM,OAAO,KAAA,CAAS;EAC7E,CAAA;EAGL,SACE,OACE,oBAACC,eAAD;GACE,YAAA;GACA,aAAa,QAAQ,QAAQ,YAAY;GACnC;GACN,MAAM,cAAc,aAAa,aAAa,KAAA;GAC9C,OAAO,SAAS;GACP;GACT,GAAI;GACJ,WAAW,UAAU,SAAS,MAAM,OAAO,UAAU,KAAK,KAAA,IAAY,MAAM,OAAO,KAAK;GACxF,eAAe;IACb,SAAS,KAAA,CAAS;IAClB,WAAW,UAAU;GACvB;EACD,CAAA;CAGP;AACF"}
|
|
@@ -14,7 +14,7 @@ const TEXT_TYPES = /* @__PURE__ */ new Set([
|
|
|
14
14
|
* Pro `LightFilter` (`search.filterType: 'light'`): the same base-ui Form instance rendered as
|
|
15
15
|
* bare inline fields in the toolbar; select-like fields query on change, text fields on Enter / clear.
|
|
16
16
|
*/
|
|
17
|
-
const LightFilter = ({ fields, form, placeholder }) => /* @__PURE__ */ jsxs(Form, {
|
|
17
|
+
const LightFilter = ({ fields, form, ignoreRules, placeholder }) => /* @__PURE__ */ jsxs(Form, {
|
|
18
18
|
className: styles.lightFilter,
|
|
19
19
|
"data-pro-table-light-filter": "",
|
|
20
20
|
form,
|
|
@@ -31,7 +31,7 @@ const LightFilter = ({ fields, form, placeholder }) => /* @__PURE__ */ jsxs(Form
|
|
|
31
31
|
width: "auto"
|
|
32
32
|
},
|
|
33
33
|
children: [fields.map(({ column, name }) => {
|
|
34
|
-
const isText = !column.valueEnum && !column.renderFormItem && (!column.valueType || TEXT_TYPES.has(column.valueType));
|
|
34
|
+
const isText = !column.valueEnum && !column.request && !column.renderFormItem && (!column.valueType || TEXT_TYPES.has(column.valueType));
|
|
35
35
|
const wrapped = isText ? {
|
|
36
36
|
...column,
|
|
37
37
|
fieldProps: {
|
|
@@ -39,7 +39,10 @@ const LightFilter = ({ fields, form, placeholder }) => /* @__PURE__ */ jsxs(Form
|
|
|
39
39
|
onClear: () => void form.submit()
|
|
40
40
|
}
|
|
41
41
|
} : column;
|
|
42
|
-
const { required, validate } =
|
|
42
|
+
const { required, validate } = ignoreRules ? {
|
|
43
|
+
required: void 0,
|
|
44
|
+
validate: void 0
|
|
45
|
+
} : rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);
|
|
43
46
|
return /* @__PURE__ */ jsx("div", {
|
|
44
47
|
className: styles.lightFilterItem,
|
|
45
48
|
children: /* @__PURE__ */ jsx(Form.Field, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightFilter.mjs","names":[],"sources":["../../../src/base-ui/ProTable/LightFilter.tsx"],"sourcesContent":["import Form from '@lobehub/ui/base-ui/form';\n\nimport FieldControl from './FieldControl';\nimport { styles } from './style';\nimport type { ProTableFormInstance } from './type';\nimport { rulesToFieldProps, type SearchFieldSchema } from './useSearchForm';\n\nexport interface LightFilterProps {\n fields: SearchFieldSchema[];\n form: ProTableFormInstance;\n placeholder: { input: string; select: string };\n}\n\nconst TEXT_TYPES = new Set(['text', 'textarea', 'password', 'code']);\n\n/**\n * Pro `LightFilter` (`search.filterType: 'light'`): the same base-ui Form instance rendered as\n * bare inline fields in the toolbar; select-like fields query on change, text fields on Enter / clear.\n */\nconst LightFilter = ({ fields, form, placeholder }: LightFilterProps) => (\n <Form\n className={styles.lightFilter}\n data-pro-table-light-filter=\"\"\n form={form}\n variant=\"borderless\"\n layout=\"horizontal\"\n // The base-ui Form root stacks its children; the light filter is one wrapping row.\n style={{\n alignItems: 'center',\n display: 'flex',\n flex: '0 1 auto',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n minWidth: 0,\n width: 'auto',\n }}\n >\n {fields.map(({ column, name }) => {\n const isText =\n !column.valueEnum &&\n !column.renderFormItem &&\n (!column.valueType || TEXT_TYPES.has(column.valueType as string));\n const wrapped = isText\n ? {\n ...column,\n fieldProps: {\n ...column.fieldProps,\n onClear: () => void form.submit(),\n },\n }\n : column;\n const { required, validate } =
|
|
1
|
+
{"version":3,"file":"LightFilter.mjs","names":[],"sources":["../../../src/base-ui/ProTable/LightFilter.tsx"],"sourcesContent":["import Form from '@lobehub/ui/base-ui/form';\n\nimport FieldControl from './FieldControl';\nimport { styles } from './style';\nimport type { ProTableFormInstance } from './type';\nimport { rulesToFieldProps, type SearchFieldSchema } from './useSearchForm';\n\nexport interface LightFilterProps {\n fields: SearchFieldSchema[];\n form: ProTableFormInstance;\n /** `form.ignoreRules`: render the fields without validation. */\n ignoreRules?: boolean;\n placeholder: { input: string; select: string };\n}\n\nconst TEXT_TYPES = new Set(['text', 'textarea', 'password', 'code']);\n\n/**\n * Pro `LightFilter` (`search.filterType: 'light'`): the same base-ui Form instance rendered as\n * bare inline fields in the toolbar; select-like fields query on change, text fields on Enter / clear.\n */\nconst LightFilter = ({ fields, form, ignoreRules, placeholder }: LightFilterProps) => (\n <Form\n className={styles.lightFilter}\n data-pro-table-light-filter=\"\"\n form={form}\n variant=\"borderless\"\n layout=\"horizontal\"\n // The base-ui Form root stacks its children; the light filter is one wrapping row.\n style={{\n alignItems: 'center',\n display: 'flex',\n flex: '0 1 auto',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 8,\n minWidth: 0,\n width: 'auto',\n }}\n >\n {fields.map(({ column, name }) => {\n const isText =\n !column.valueEnum &&\n !column.request &&\n !column.renderFormItem &&\n (!column.valueType || TEXT_TYPES.has(column.valueType as string));\n const wrapped = isText\n ? {\n ...column,\n fieldProps: {\n ...column.fieldProps,\n onClear: () => void form.submit(),\n },\n }\n : column;\n const { required, validate } = ignoreRules\n ? { required: undefined, validate: undefined }\n : rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);\n return (\n <div className={styles.lightFilterItem} key={name}>\n <Form.Field\n bare\n name={name}\n required={required}\n validate={validate}\n render={({ value, onChange }) => (\n <FieldControl\n light\n column={wrapped}\n form={form}\n placeholder={placeholder}\n value={value}\n onChange={(next) => {\n onChange(next);\n if (!isText) void form.submit();\n }}\n />\n )}\n />\n </div>\n );\n })}\n {/* Text fields query on Enter through the native form submit. */}\n <button hidden type=\"submit\" />\n </Form>\n);\n\nexport default LightFilter;\n"],"mappings":";;;;;;AAeA,MAAM,6BAAa,IAAI,IAAI;CAAC;CAAQ;CAAY;CAAY;AAAM,CAAC;;;;;AAMnE,MAAM,eAAe,EAAE,QAAQ,MAAM,aAAa,kBAChD,qBAAC,MAAD;CACE,WAAW,OAAO;CAClB,+BAA4B;CACtB;CACN,SAAQ;CACR,QAAO;CAEP,OAAO;EACL,YAAY;EACZ,SAAS;EACT,MAAM;EACN,eAAe;EACf,UAAU;EACV,KAAK;EACL,UAAU;EACV,OAAO;CACT;CAhBF,UAAA,CAkBG,OAAO,KAAK,EAAE,QAAQ,WAAW;EAChC,MAAM,SACJ,CAAC,OAAO,aACR,CAAC,OAAO,WACR,CAAC,OAAO,mBACP,CAAC,OAAO,aAAa,WAAW,IAAI,OAAO,SAAmB;EACjE,MAAM,UAAU,SACZ;GACE,GAAG;GACH,YAAY;IACV,GAAG,OAAO;IACV,eAAe,KAAK,KAAK,OAAO;GAClC;EACF,IACA;EACJ,MAAM,EAAE,UAAU,aAAa,cAC3B;GAAE,UAAU,KAAA;GAAW,UAAU,KAAA;EAAU,IAC3C,kBAAkB,OAAO,eAAe,OAAO,OAAO,eAAe,QAAQ;EACjF,OACE,oBAAC,OAAD;GAAK,WAAW,OAAO;GACrB,UAAA,oBAAC,KAAK,OAAN;IACE,MAAA;IACM;IACI;IACA;IACV,SAAS,EAAE,OAAO,eAChB,oBAAC,cAAD;KACE,OAAA;KACA,QAAQ;KACF;KACO;KACN;KACP,WAAW,SAAS;MAClB,SAAS,IAAI;MACb,IAAI,CAAC,QAAQ,KAAU,OAAO;KAChC;IACD,CAAA;GAEJ,CAAA;EACE,GApBwC,IAoBxC;CAET,CAAC,GAED,oBAAC,UAAD;EAAQ,QAAA;EAAO,MAAK;CAAU,CAAA,CAC1B"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ProTableProps } from "./type.mjs";
|
|
2
|
+
import { ProTableLocaleResolved } from "./locale.mjs";
|
|
3
3
|
//#region src/base-ui/ProTable/ProTable.d.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
4
|
+
/** English texts; ProTable picks the preset from ConfigProvider `locale` (see `./locale`). */
|
|
5
|
+
declare const DEFAULT_PRO_TABLE_LOCALE: ProTableLocaleResolved;
|
|
7
6
|
declare const ProTable: {
|
|
8
7
|
<T extends Record<string, any> = any, Params extends Record<string, any> = Record<string, any>>(props: ProTableProps<T, Params>): import("react").JSX.Element;
|
|
9
8
|
displayName: string;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { useI18n } from "../../ConfigProvider/index.mjs";
|
|
2
3
|
import Button from "../Button/Button.mjs";
|
|
3
4
|
import ActionIcon from "../ActionIcon/ActionIcon.mjs";
|
|
4
5
|
import ActionIconGroup from "../../ActionIconGroup/ActionIconGroup.mjs";
|
|
5
6
|
import Input_default from "../Input/Input.mjs";
|
|
6
7
|
import { useEventCallback } from "../../hooks/useEventCallback.mjs";
|
|
7
8
|
import Table from "../Table/Table.mjs";
|
|
9
|
+
import { PRO_TABLE_LOCALE_EN_US, resolveProTableLocale } from "./locale.mjs";
|
|
8
10
|
import { PRO_PREFIX_CLS, styles } from "./style.mjs";
|
|
9
11
|
import ColumnSetting from "./ColumnSetting.mjs";
|
|
10
12
|
import { getByPath, getProColumnKey, isEmptyValue, readPersistedState, resolveValueEnum, resolveValueType, valueEnumToList, writePersistedState } from "./utils.mjs";
|
|
@@ -19,34 +21,8 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
|
19
21
|
import { cx } from "antd-style";
|
|
20
22
|
import { Check, CircleHelp, Fullscreen, Minimize, RotateCw, Rows3, Settings } from "lucide-react";
|
|
21
23
|
//#region src/base-ui/ProTable/ProTable.tsx
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
alertSelected: (count) => `${count} selected`,
|
|
25
|
-
collapse: "Collapse",
|
|
26
|
-
columnSetting: "Column settings",
|
|
27
|
-
columnSettingReset: "Reset",
|
|
28
|
-
columnSettingTitle: "Columns",
|
|
29
|
-
copy: "Copy",
|
|
30
|
-
density: "Density",
|
|
31
|
-
densityLarge: "Large",
|
|
32
|
-
densityMedium: "Medium",
|
|
33
|
-
densitySmall: "Compact",
|
|
34
|
-
expand: "Expand",
|
|
35
|
-
fixedEnd: "Pin to end",
|
|
36
|
-
fixedEndTitle: "Pinned to end",
|
|
37
|
-
fixedStart: "Pin to start",
|
|
38
|
-
fixedStartTitle: "Pinned to start",
|
|
39
|
-
fullScreen: "Full screen",
|
|
40
|
-
moveDown: "Move down",
|
|
41
|
-
moveUp: "Move up",
|
|
42
|
-
noFixed: "Unpin",
|
|
43
|
-
reload: "Reload",
|
|
44
|
-
reset: "Reset",
|
|
45
|
-
search: "Search",
|
|
46
|
-
searchPlaceholder: "Please enter",
|
|
47
|
-
selectPlaceholder: "Please select",
|
|
48
|
-
unfixedTitle: "Not pinned"
|
|
49
|
-
};
|
|
24
|
+
/** English texts; ProTable picks the preset from ConfigProvider `locale` (see `./locale`). */
|
|
25
|
+
const DEFAULT_PRO_TABLE_LOCALE = PRO_TABLE_LOCALE_EN_US;
|
|
50
26
|
const assignRef = (ref, value) => {
|
|
51
27
|
if (!ref) return;
|
|
52
28
|
if (typeof ref === "function") ref(value);
|
|
@@ -59,13 +35,33 @@ const stableKey = (value) => {
|
|
|
59
35
|
return String(Math.random());
|
|
60
36
|
}
|
|
61
37
|
};
|
|
38
|
+
/** `value`, but switching on only after it stayed on for `delay` ms (off is immediate). */
|
|
39
|
+
const useDelayedFlag = (value, delay) => {
|
|
40
|
+
const [delayed, setDelayed] = useState(value && !delay);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!value || !delay) {
|
|
43
|
+
setDelayed(value);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const timer = setTimeout(() => setDelayed(true), delay);
|
|
47
|
+
return () => clearTimeout(timer);
|
|
48
|
+
}, [value, delay]);
|
|
49
|
+
return delay ? value && delayed : value;
|
|
50
|
+
};
|
|
62
51
|
const isGroup = (column) => !!column.children?.length;
|
|
63
52
|
const ProTable = (props) => {
|
|
64
53
|
const { actionRef, beforeSearchSubmit, cardBordered, className, columnEmptyText = "-", columns: columnsProp = [], columnsState, dataSource, dateFormatter = "string", debounceTime = 10, defaultData, defaultSize, form: formConfig, formRef, ghost: _ghost, headerTitle, loading: loadingProp, locale: localeProp, manualRequest = false, onChange, onDataSourceChange, onLoad, onLoadingChange, onRequestError, onReset, onSizeChange, onSubmit, options, pagination: paginationProp, params, polling, postData, request, rowSelection, search, searchFormRender, size: sizeProp, style, tableAlertOptionRender, tableAlertRender, tableClassName, tableExtraRender, tableRender, tableStyle, toolbar, toolBarRender, tooltip, variant, ...tableProps } = props;
|
|
54
|
+
const i18n = useI18n();
|
|
65
55
|
const locale = {
|
|
66
|
-
...
|
|
56
|
+
...resolveProTableLocale(i18n?.locale),
|
|
67
57
|
...localeProp
|
|
68
58
|
};
|
|
59
|
+
/** Table-level texts (emptyText, filter / sort / selection labels) go on to the base-ui Table. */
|
|
60
|
+
const tableLocale = useMemo(() => {
|
|
61
|
+
if (!localeProp) return void 0;
|
|
62
|
+
const entries = Object.entries(localeProp).filter(([key]) => !(key in PRO_TABLE_LOCALE_EN_US));
|
|
63
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
64
|
+
}, [localeProp]);
|
|
69
65
|
const rootRef = useRef(null);
|
|
70
66
|
const actionHolderRef = useRef(void 0);
|
|
71
67
|
const [innerSize, setInnerSize] = useState(defaultSize ?? "medium");
|
|
@@ -193,7 +189,14 @@ const ProTable = (props) => {
|
|
|
193
189
|
setPageInfo({ current: 1 });
|
|
194
190
|
}, [paramsKey, setPageInfo]);
|
|
195
191
|
const rows = request ? fetcher.data : dataSource ?? defaultData ?? [];
|
|
196
|
-
const
|
|
192
|
+
const loadingConfig = typeof loadingProp === "object" ? loadingProp : void 0;
|
|
193
|
+
const { delay: loadingDelay, ...loadingSpin } = loadingConfig ?? {};
|
|
194
|
+
const rawLoading = loadingConfig === void 0 ? loadingProp ?? fetcher.loading : loadingConfig.spinning ?? (request ? fetcher.loading : true);
|
|
195
|
+
const loading = useDelayedFlag(rawLoading, loadingDelay);
|
|
196
|
+
const tableLoading = loadingConfig ? {
|
|
197
|
+
...loadingSpin,
|
|
198
|
+
spinning: loading
|
|
199
|
+
} : loading;
|
|
197
200
|
const selectionEnabled = !!rowSelection;
|
|
198
201
|
const [innerSelectedKeys, setInnerSelectedKeys] = useState(rowSelection && rowSelection.defaultSelectedRowKeys || []);
|
|
199
202
|
const selectedRowKeys = rowSelection && rowSelection.selectedRowKeys || innerSelectedKeys;
|
|
@@ -477,6 +480,7 @@ const ProTable = (props) => {
|
|
|
477
480
|
const lightFilterDom = lightMode && searchFields.length > 0 ? /* @__PURE__ */ jsx(LightFilter, {
|
|
478
481
|
fields: searchFields,
|
|
479
482
|
form,
|
|
483
|
+
ignoreRules: formConfig?.ignoreRules,
|
|
480
484
|
placeholder: {
|
|
481
485
|
input: locale.searchPlaceholder,
|
|
482
486
|
select: locale.selectPlaceholder
|
|
@@ -587,7 +591,8 @@ const ProTable = (props) => {
|
|
|
587
591
|
className: tableClassName,
|
|
588
592
|
columns: tableColumns,
|
|
589
593
|
dataSource: rows,
|
|
590
|
-
loading,
|
|
594
|
+
loading: tableLoading,
|
|
595
|
+
locale: tableLocale,
|
|
591
596
|
pagination: tablePagination,
|
|
592
597
|
rowSelection: mergedRowSelection,
|
|
593
598
|
size,
|
|
@@ -618,6 +623,8 @@ const ProTable = (props) => {
|
|
|
618
623
|
config: search ?? {},
|
|
619
624
|
fields: searchFields,
|
|
620
625
|
form,
|
|
626
|
+
ignoreRules: formConfig?.ignoreRules,
|
|
627
|
+
layout: formConfig?.layout,
|
|
621
628
|
loading: !!loading && !!request,
|
|
622
629
|
locale: {
|
|
623
630
|
collapse: locale.collapse,
|