@lobehub/ui 5.62.1 → 5.63.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/es/ThemeProvider/GlobalStyle/essential.mjs +12 -0
  2. package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -1
  3. package/es/base-ui/Input/style.d.mts +1 -1
  4. package/es/base-ui/Pagination/Pagination.mjs +20 -3
  5. package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
  6. package/es/base-ui/Pagination/style.mjs +47 -3
  7. package/es/base-ui/Pagination/style.mjs.map +1 -1
  8. package/es/base-ui/ProTable/FieldControl.mjs +10 -3
  9. package/es/base-ui/ProTable/FieldControl.mjs.map +1 -1
  10. package/es/base-ui/ProTable/LightFilter.mjs +6 -3
  11. package/es/base-ui/ProTable/LightFilter.mjs.map +1 -1
  12. package/es/base-ui/ProTable/ProTable.d.mts +4 -5
  13. package/es/base-ui/ProTable/ProTable.mjs +38 -31
  14. package/es/base-ui/ProTable/ProTable.mjs.map +1 -1
  15. package/es/base-ui/ProTable/SearchForm.mjs +59 -6
  16. package/es/base-ui/ProTable/SearchForm.mjs.map +1 -1
  17. package/es/base-ui/ProTable/index.d.mts +3 -2
  18. package/es/base-ui/ProTable/index.mjs +3 -1
  19. package/es/base-ui/ProTable/locale.d.mts +18 -0
  20. package/es/base-ui/ProTable/locale.mjs +68 -0
  21. package/es/base-ui/ProTable/locale.mjs.map +1 -0
  22. package/es/base-ui/ProTable/style.mjs +38 -0
  23. package/es/base-ui/ProTable/style.mjs.map +1 -1
  24. package/es/base-ui/ProTable/type.d.mts +66 -10
  25. package/es/base-ui/ProTable/useColumnRequest.mjs +61 -0
  26. package/es/base-ui/ProTable/useColumnRequest.mjs.map +1 -0
  27. package/es/base-ui/ProTable/useFetchData.mjs.map +1 -1
  28. package/es/base-ui/Select/Select.mjs +3 -1
  29. package/es/base-ui/Select/Select.mjs.map +1 -1
  30. package/es/base-ui/Select/hooks.mjs +8 -4
  31. package/es/base-ui/Select/hooks.mjs.map +1 -1
  32. package/es/base-ui/Select/type.d.mts +7 -0
  33. package/es/base-ui/Table/Table.mjs +3 -1
  34. package/es/base-ui/Table/Table.mjs.map +1 -1
  35. package/es/base-ui/Table/style.mjs +173 -28
  36. package/es/base-ui/Table/style.mjs.map +1 -1
  37. package/es/base-ui/Text/style.d.mts +1 -1
  38. package/es/dashboard/ConsoleNav/style.mjs +2 -2
  39. package/es/dashboard/ConsoleNav/style.mjs.map +1 -1
  40. package/es/dashboard/FilterSidebar/style.mjs +2 -2
  41. package/es/dashboard/FilterSidebar/style.mjs.map +1 -1
  42. package/es/dashboard/FilterStrip/style.mjs +1 -1
  43. package/es/dashboard/FilterStrip/style.mjs.map +1 -1
  44. package/es/dashboard/MetricStrip/style.mjs +1 -1
  45. package/es/dashboard/MetricStrip/style.mjs.map +1 -1
  46. package/es/dashboard/PageSkeleton/style.mjs +2 -1
  47. package/es/dashboard/PageSkeleton/style.mjs.map +1 -1
  48. package/es/dashboard/Surface/Surface.mjs +1 -2
  49. package/es/dashboard/Surface/Surface.mjs.map +1 -1
  50. package/es/dashboard/Surface/link.d.mts +1 -1
  51. package/es/dashboard/Surface/link.mjs +1 -1
  52. package/es/dashboard/Surface/link.mjs.map +1 -1
  53. package/es/dashboard/Surface/style.d.mts +14 -8
  54. package/es/dashboard/Surface/style.mjs +25 -20
  55. package/es/dashboard/Surface/style.mjs.map +1 -1
  56. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProTable.mjs","names":["Input"],"sources":["../../../src/base-ui/ProTable/ProTable.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Check, CircleHelp, Fullscreen, Minimize, RotateCw, Rows3, Settings } from 'lucide-react';\nimport {\n type Key,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport ActionIconGroup, { type ActionIconGroupItemType } from '@/ActionIconGroup';\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Button from '@/base-ui/Button';\nimport Input from '@/base-ui/Input/Input';\nimport Table from '@/base-ui/Table';\nimport type {\n SortOrder,\n TableColumn,\n TableFilters,\n TablePaginationConfig,\n TableSorterResult,\n} from '@/base-ui/Table/type';\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport ColumnSetting, { type SettingColumn } from './ColumnSetting';\nimport LightFilter from './LightFilter';\nimport OptionPopover from './OptionPopover';\nimport { CopyableText, renderValue } from './renderValue';\nimport SearchForm from './SearchForm';\nimport { PRO_PREFIX_CLS, styles } from './style';\nimport type {\n ProColumnType,\n ProTableActionType,\n ProTableColumnsStateMap,\n ProTableDensity,\n ProTableFormInstance,\n ProTableLocale,\n ProTablePageInfo,\n ProTableProps,\n} from './type';\nimport { useFetchData } from './useFetchData';\nimport { getSearchFields, useSearchForm } from './useSearchForm';\nimport {\n getByPath,\n getProColumnKey,\n isEmptyValue,\n readPersistedState,\n resolveValueEnum,\n resolveValueType,\n valueEnumToList,\n writePersistedState,\n} from './utils';\n\nexport const DEFAULT_PRO_TABLE_LOCALE: Required<Omit<ProTableLocale, 'alertSelected'>> & {\n alertSelected: (count: number) => ReactNode;\n} = {\n alertClear: 'Clear',\n alertSelected: (count) => `${count} selected`,\n collapse: 'Collapse',\n columnSetting: 'Column settings',\n columnSettingReset: 'Reset',\n columnSettingTitle: 'Columns',\n copy: 'Copy',\n density: 'Density',\n densityLarge: 'Large',\n densityMedium: 'Medium',\n densitySmall: 'Compact',\n expand: 'Expand',\n fixedEnd: 'Pin to end',\n fixedEndTitle: 'Pinned to end',\n fixedStart: 'Pin to start',\n fixedStartTitle: 'Pinned to start',\n fullScreen: 'Full screen',\n moveDown: 'Move down',\n moveUp: 'Move up',\n noFixed: 'Unpin',\n reload: 'Reload',\n reset: 'Reset',\n search: 'Search',\n searchPlaceholder: 'Please enter',\n selectPlaceholder: 'Please select',\n unfixedTitle: 'Not pinned',\n};\n\nconst assignRef = <V,>(ref: Ref<V> | undefined, value: V) => {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: V }).current = value;\n};\n\nconst stableKey = (value: unknown) => {\n try {\n return JSON.stringify(value, (_key, item) =>\n item instanceof Date ? item.toISOString() : item,\n );\n } catch {\n return String(Math.random());\n }\n};\n\nconst isGroup = (column: ProColumnType<any>) => !!column.children?.length;\n\nconst ProTable = <\n T extends Record<string, any> = any,\n Params extends Record<string, any> = Record<string, any>,\n>(\n props: ProTableProps<T, Params>,\n) => {\n const {\n actionRef,\n beforeSearchSubmit,\n cardBordered,\n className,\n columnEmptyText = '-',\n columns: columnsProp = [],\n columnsState,\n dataSource,\n dateFormatter = 'string',\n debounceTime = 10,\n defaultData,\n defaultSize,\n form: formConfig,\n formRef,\n ghost: _ghost,\n headerTitle,\n loading: loadingProp,\n locale: localeProp,\n manualRequest = false,\n onChange,\n onDataSourceChange,\n onLoad,\n onLoadingChange,\n onRequestError,\n onReset,\n onSizeChange,\n onSubmit,\n options,\n pagination: paginationProp,\n params,\n polling,\n postData,\n request,\n rowSelection,\n search,\n searchFormRender,\n size: sizeProp,\n style,\n tableAlertOptionRender,\n tableAlertRender,\n tableClassName,\n tableExtraRender,\n tableRender,\n tableStyle,\n toolbar,\n toolBarRender,\n tooltip,\n variant,\n ...tableProps\n } = props;\n\n const locale = { ...DEFAULT_PRO_TABLE_LOCALE, ...localeProp };\n const rootRef = useRef<HTMLDivElement>(null);\n const actionHolderRef = useRef<ProTableActionType | undefined>(undefined);\n\n // ============================== Density ==============================\n const [innerSize, setInnerSize] = useState<ProTableDensity>(defaultSize ?? 'medium');\n const size = sizeProp ?? innerSize;\n const setSize = (next: ProTableDensity) => {\n setInnerSize(next);\n onSizeChange?.(next);\n };\n\n // ============================ Fullscreen =============================\n const [fullscreen, setFullscreen] = useState(false);\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const sync = () => setFullscreen(document.fullscreenElement === rootRef.current);\n document.addEventListener('fullscreenchange', sync);\n return () => document.removeEventListener('fullscreenchange', sync);\n }, []);\n const toggleFullScreen = useEventCallback(() => {\n const node = rootRef.current;\n if (!node || typeof document === 'undefined') return;\n if (document.fullscreenElement) void document.exitFullscreen?.();\n else void node.requestFullscreen?.();\n });\n\n // =========================== Columns state ===========================\n const persistKey = columnsState?.persistenceKey;\n const persistType = columnsState?.persistenceType;\n const defaultColumnsState = useMemo(() => {\n const map: ProTableColumnsStateMap = {};\n columnsProp.forEach((column, index) => {\n const key = getProColumnKey(column, index);\n if (column.fixed) map[key] = { fixed: column.fixed };\n });\n return { ...map, ...columnsState?.defaultValue };\n }, []);\n const [innerColumnsState, setInnerColumnsState] = useState<ProTableColumnsStateMap>(\n () => readPersistedState(persistKey, persistType) ?? defaultColumnsState,\n );\n const columnsStateMap = columnsState?.value ?? innerColumnsState;\n const setColumnsStateMap = (next: ProTableColumnsStateMap) => {\n setInnerColumnsState(next);\n writePersistedState(persistKey, persistType, next);\n columnsState?.onChange?.(next);\n };\n const resetColumnsState = () => {\n writePersistedState(persistKey, persistType, undefined);\n setInnerColumnsState(defaultColumnsState);\n columnsState?.onChange?.(defaultColumnsState);\n };\n\n // ============================ Pagination =============================\n const paginationConfig: TablePaginationConfig | false =\n paginationProp === false ? false : (paginationProp ?? {});\n const [pageInfo, setPageInfoState] = useState<ProTablePageInfo>(() => ({\n current:\n (paginationConfig && (paginationConfig.current ?? paginationConfig.defaultCurrent)) || 1,\n pageSize:\n (paginationConfig && (paginationConfig.pageSize ?? paginationConfig.defaultPageSize)) || 10,\n total: 0,\n }));\n const mergedPageInfo: ProTablePageInfo = {\n ...pageInfo,\n ...(paginationConfig &&\n paginationConfig.current !== undefined && { current: paginationConfig.current }),\n ...(paginationConfig &&\n paginationConfig.pageSize !== undefined && { pageSize: paginationConfig.pageSize }),\n };\n const setPageInfo = useEventCallback((next: Partial<ProTablePageInfo>) =>\n setPageInfoState((prev) => ({ ...prev, ...next })),\n );\n\n // ========================== Sort / filter ============================\n const [sort, setSort] = useState<Record<string, SortOrder>>({});\n const [filter, setFilter] = useState<Record<string, (string | number | boolean)[] | null>>({});\n\n // =========================== Search form =============================\n const searchFields = useMemo(() => getSearchFields(columnsProp), [columnsProp]);\n const [formParams, setFormParams] = useState<Record<string, any>>({});\n const [keyword, setKeyword] = useState<string | undefined>(undefined);\n const formReadyRef = useRef(false);\n\n const handleSubmit = useEventCallback((formatted: Record<string, any>) => {\n const next = beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted;\n formReadyRef.current = true;\n setFormParams(next);\n setPageInfo({ current: 1 });\n onSubmit?.(next);\n void fetcher.reload();\n });\n\n const { form } = useSearchForm({\n dateFormatter,\n fields: searchFields,\n initialValues: formConfig?.initialValues,\n onSubmit: handleSubmit,\n onValuesChange: formConfig?.onValuesChange,\n validateOn: formConfig?.validateOn,\n });\n // The first request already carries the initial form values (Pro submits the form on mount).\n const initialFormParams = useMemo(() => form.getFieldsFormatValue(), [form]);\n const effectiveFormParams = formReadyRef.current ? formParams : initialFormParams;\n\n useImperativeHandle(formRef as Ref<ProTableFormInstance>, () => form, [form]);\n\n // ============================== Fetching =============================\n const keywordName =\n options && typeof options.search === 'object' ? (options.search.name ?? 'keyword') : 'keyword';\n const getParams = () => ({\n ...effectiveFormParams,\n ...params,\n ...(keyword !== undefined && keyword !== '' && { [keywordName]: keyword }),\n });\n\n const fetcher = useFetchData<T>({\n debounceTime,\n defaultData,\n depsKey: stableKey([effectiveFormParams, params, keyword, sort, filter]),\n filter,\n getParams,\n manual: manualRequest,\n onDataSourceChange,\n onLoad,\n onLoadingChange,\n onRequestError,\n pageInfo: mergedPageInfo,\n paginated: paginationConfig !== false,\n polling,\n postData,\n request,\n setTotal: (total) => setPageInfo({ total }),\n sort,\n });\n\n // `params` changes go back to page 1 (Pro).\n const paramsKey = stableKey(params);\n const firstParamsRef = useRef(true);\n useEffect(() => {\n if (firstParamsRef.current) {\n firstParamsRef.current = false;\n return;\n }\n setPageInfo({ current: 1 });\n }, [paramsKey, setPageInfo]);\n\n const rows: T[] = request ? fetcher.data : (dataSource ?? defaultData ?? []);\n const loading = loadingProp ?? fetcher.loading;\n\n // ============================= Selection =============================\n const selectionEnabled = !!rowSelection;\n const [innerSelectedKeys, setInnerSelectedKeys] = useState<Key[]>(\n (rowSelection && rowSelection.defaultSelectedRowKeys) || [],\n );\n const selectedRowKeys = (rowSelection && rowSelection.selectedRowKeys) || innerSelectedKeys;\n const selectedRowsCacheRef = useRef(new Map<Key, T>());\n const rowKeyProp = tableProps.rowKey ?? 'key';\n const getRowKey = useCallback(\n (record: T, index?: number): Key =>\n typeof rowKeyProp === 'function'\n ? rowKeyProp(record, index)\n : (record[rowKeyProp as string] as Key),\n [rowKeyProp],\n );\n rows.forEach((record, index) =>\n selectedRowsCacheRef.current.set(getRowKey(record, index), record),\n );\n const selectedRows = selectedRowKeys\n .map((key) => selectedRowsCacheRef.current.get(key))\n .filter((row): row is T => row !== undefined);\n\n const clearSelected = useEventCallback(() => {\n setInnerSelectedKeys([]);\n if (rowSelection) rowSelection.onChange?.([], [], { type: 'none' });\n });\n\n // ============================== Actions ==============================\n const reload = useEventCallback(async (resetPageIndex?: boolean) => {\n if (resetPageIndex) setPageInfo({ current: 1 });\n await fetcher.reload();\n });\n\n const action: ProTableActionType = {\n clearSelected,\n fullScreen: toggleFullScreen,\n getSortFilter: () => ({ filter, sort }),\n nativeElement: rootRef.current,\n pageInfo: mergedPageInfo,\n reload,\n reloadAndRest: async () => {\n clearSelected();\n await reload(true);\n },\n reset: () => {\n form.resetFields();\n const formatted = form.getFieldsFormatValue();\n formReadyRef.current = true;\n setFormParams(beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted);\n setPageInfo({ current: 1 });\n void fetcher.reload();\n },\n setPageInfo,\n };\n actionHolderRef.current = action;\n useEffect(() => {\n assignRef(actionRef as Ref<ProTableActionType>, actionHolderRef.current as ProTableActionType);\n });\n\n const handleReset = useEventCallback(() => {\n form.resetFields();\n const formatted = form.getFieldsFormatValue();\n formReadyRef.current = true;\n const next = beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted;\n setFormParams(next);\n setPageInfo({ current: 1 });\n onReset?.();\n void fetcher.reload();\n });\n\n // ============================== Columns ==============================\n const settingColumns: SettingColumn[] = [];\n const tableColumns = useMemo(() => {\n const offset = (mergedPageInfo.current - 1) * mergedPageInfo.pageSize;\n\n const convert = (\n column: ProColumnType<T>,\n index: number,\n top: boolean,\n ): TableColumn<T> | null => {\n const key = getProColumnKey(column, index);\n const state = top ? columnsStateMap[key] : undefined;\n if (column.hideInTable || state?.show === false) return null;\n\n const {\n children,\n colSize: _colSize,\n copyable,\n disable: _disable,\n fieldProps,\n filters,\n formItemProps: _formItemProps,\n hideInForm: _hideInForm,\n hideInSearch: _hideInSearch,\n hideInSetting: _hideInSetting,\n hideInTable: _hideInTable,\n initialValue: _initialValue,\n onFilter,\n order: _order,\n render,\n renderFormItem: _renderFormItem,\n renderText,\n search: _search,\n sorter,\n title,\n tooltip: columnTooltip,\n valueEnum: _valueEnum,\n valueType: _valueType,\n ...rest\n } = column;\n\n const titleNode: ReactNode = columnTooltip ? (\n <span className={styles.titleTooltip}>\n {title}\n <ActionIcon icon={CircleHelp} size=\"small\" title={columnTooltip} />\n </span>\n ) : (\n title\n );\n\n if (children?.length) {\n const childColumns = children\n .map((child, childIndex) => convert(child, childIndex, false))\n .filter((child): child is TableColumn<T> => child !== null);\n return { ...(rest as any), children: childColumns, key, title: titleNode };\n }\n\n const valueType = resolveValueType(column);\n const staticEnum = typeof column.valueEnum === 'function' ? undefined : column.valueEnum;\n const resolvedFilters =\n filters === true\n ? valueEnumToList(staticEnum).map((item) => ({ text: item.text, value: item.value }))\n : filters || undefined;\n const resolvedOnFilter =\n onFilter === true\n ? (value: unknown, record: T) =>\n String(getByPath(record, column.dataIndex)) === String(value)\n : onFilter || undefined;\n\n const fixed = state?.fixed ?? rest.fixed;\n const converted: TableColumn<T> = {\n ...(rest as any),\n ...(valueType === 'option' && rest.align === undefined && { align: 'end' }),\n ...((valueType === 'index' || valueType === 'indexBorder') &&\n rest.width === undefined && { width: 56 }),\n filters: resolvedFilters,\n fixed: fixed === 'left' ? 'start' : fixed === 'right' ? 'end' : fixed,\n key,\n onFilter: resolvedOnFilter,\n // A string sorter is the server field name (see `sort` below); the table only needs `true`.\n sorter: typeof sorter === 'string' ? true : sorter,\n title: titleNode,\n render: (value: any, record: T, rowIndex: number) => {\n const current = actionHolderRef.current;\n const text = renderText ? renderText(value, record, rowIndex, current) : value;\n let dom: ReactNode = renderValue(text, {\n emptyText: columnEmptyText === false ? null : columnEmptyText,\n fieldProps,\n rowIndex: offset + rowIndex,\n valueEnum: resolveValueEnum(column, record),\n valueType: resolveValueType(column, record),\n });\n if (copyable && !isEmptyValue(text)) {\n dom = (\n <CopyableText label={locale.copy} text={String(text)}>\n {dom}\n </CopyableText>\n );\n }\n if (!render) return dom;\n const result = render(dom, record, rowIndex, current, column);\n if (valueType === 'option' && Array.isArray(result)) {\n return <div className={styles.optionCell}>{result}</div>;\n }\n return result;\n },\n };\n return converted;\n };\n\n const indexed = columnsProp.map((column, index) => ({\n column,\n index,\n key: getProColumnKey(column, index),\n }));\n indexed.sort((a, b) => {\n const orderA = columnsStateMap[a.key]?.order ?? a.index;\n const orderB = columnsStateMap[b.key]?.order ?? b.index;\n return orderA - orderB;\n });\n return indexed\n .map(({ column, index }) => convert(column, index, true))\n .filter((column): column is TableColumn<T> => column !== null);\n }, [\n columnsProp,\n columnsStateMap,\n columnEmptyText,\n mergedPageInfo.current,\n mergedPageInfo.pageSize,\n ]);\n\n // Columns listed in the setting panel, in display order.\n [...columnsProp]\n .map((column, index) => ({ column, index, key: getProColumnKey(column, index) }))\n .sort(\n (a, b) =>\n (columnsStateMap[a.key]?.order ?? a.index) - (columnsStateMap[b.key]?.order ?? b.index),\n )\n .forEach(({ column, key }) => {\n if (column.hideInTable || column.hideInSetting) return;\n const disable =\n columnsStateMap[key]?.disable ??\n (typeof column.disable === 'object' ? column.disable.checkbox : column.disable);\n settingColumns.push({ disabled: !!disable, key, title: column.title ?? key });\n });\n\n // Server-side sort field names: a string `sorter` renames the field.\n const sortFieldOf = useMemo(() => {\n const map = new Map<string, string>();\n const walk = (list: ProColumnType<T>[]) =>\n list.forEach((column, index) => {\n if (isGroup(column)) walk(column.children!);\n const key = getProColumnKey(column, index);\n if (typeof column.sorter === 'string') map.set(key, column.sorter);\n else if (Array.isArray(column.dataIndex)) map.set(key, column.dataIndex.join('.'));\n else if (column.dataIndex !== undefined) map.set(key, String(column.dataIndex));\n });\n walk(columnsProp);\n return map;\n }, [columnsProp]);\n\n const handleTableChange = useEventCallback(\n (\n pagination: TablePaginationConfig,\n filters: TableFilters,\n sorter: TableSorterResult<T> | TableSorterResult<T>[],\n extra: Parameters<NonNullable<ProTableProps<T>['onChange']>>[3],\n ) => {\n if (extra.action === 'sort') {\n const list = Array.isArray(sorter) ? sorter : [sorter];\n const next: Record<string, SortOrder> = {};\n list.forEach((item) => {\n if (!item.order || item.columnKey === undefined) return;\n const columnKey = String(item.columnKey);\n next[sortFieldOf.get(columnKey) ?? columnKey] = item.order;\n });\n setSort(next);\n }\n if (extra.action === 'filter') {\n const next: Record<string, (string | number | boolean)[] | null> = {};\n Object.entries(filters).forEach(([columnKey, value]) => {\n next[sortFieldOf.get(columnKey) ?? columnKey] = value;\n });\n setFilter(next);\n }\n onChange?.(pagination, filters, sorter, extra);\n },\n );\n\n // ============================== Toolbar ==============================\n const optionConfig =\n options === false\n ? false\n : { density: true, fullScreen: false, reload: true, setting: true, ...options };\n const reloadOption = optionConfig && optionConfig.reload;\n const fullScreenOption = optionConfig && optionConfig.fullScreen;\n const settingOption = optionConfig && optionConfig.setting;\n const searchOption = optionConfig && optionConfig.search;\n\n const [openOption, setOpenOption] = useState<{ anchor: HTMLElement; key: string } | null>(null);\n const toggleOption = (key: string, event: unknown) => {\n const anchor = (event as { currentTarget?: HTMLElement } | undefined)?.currentTarget ?? null;\n setOpenOption((prev) => (prev?.key === key || !anchor ? null : { anchor, key }));\n };\n const closeOption = () => setOpenOption(null);\n\n const optionItems: ActionIconGroupItemType[] = [];\n if (optionConfig) {\n if (reloadOption) {\n optionItems.push({\n icon: RotateCw,\n key: 'reload',\n label: locale.reload,\n loading: !!loading && !!request,\n onClick: () => (typeof reloadOption === 'function' ? reloadOption() : void reload()),\n });\n }\n if (optionConfig.density) {\n optionItems.push({\n icon: Rows3,\n key: 'density',\n label: locale.density,\n onClick: ((event: unknown) => toggleOption('density', event)) as any,\n });\n }\n if (fullScreenOption) {\n optionItems.push({\n icon: fullscreen ? Minimize : Fullscreen,\n key: 'fullScreen',\n label: locale.fullScreen,\n onClick: () =>\n typeof fullScreenOption === 'function' ? fullScreenOption() : toggleFullScreen(),\n });\n }\n if (settingOption) {\n optionItems.push({\n icon: Settings,\n key: 'setting',\n label: locale.columnSetting,\n onClick: ((event: unknown) => toggleOption('setting', event)) as any,\n });\n }\n }\n\n const settingProps = settingOption && typeof settingOption === 'object' ? settingOption : {};\n const optionNodes: ReactNode[] =\n optionItems.length > 0\n ? [\n <ActionIconGroup\n className={`${PRO_PREFIX_CLS}-options`}\n items={optionItems}\n key=\"options\"\n size=\"small\"\n variant=\"outlined\"\n />,\n <OptionPopover\n anchor={openOption?.key === 'density' ? openOption.anchor : null}\n key=\"density-popover\"\n open={openOption?.key === 'density'}\n onOpenChange={(next) => !next && closeOption()}\n >\n <div className={styles.density} data-pro-table-density=\"\" role=\"menu\">\n {(['large', 'medium', 'small'] as ProTableDensity[]).map((item) => (\n <button\n aria-checked={size === item}\n className={styles.densityItem}\n key={item}\n role=\"menuitemradio\"\n type=\"button\"\n onClick={() => {\n setSize(item);\n closeOption();\n }}\n >\n <span>\n {item === 'large'\n ? locale.densityLarge\n : item === 'medium'\n ? locale.densityMedium\n : locale.densitySmall}\n </span>\n {size === item && <Check size={14} />}\n </button>\n ))}\n </div>\n </OptionPopover>,\n <OptionPopover\n anchor={openOption?.key === 'setting' ? openOption.anchor : null}\n key=\"setting-popover\"\n open={openOption?.key === 'setting'}\n onOpenChange={(next) => !next && closeOption()}\n >\n <ColumnSetting\n checkable={settingProps.checkable}\n columns={settingColumns}\n draggable={settingProps.draggable}\n locale={locale}\n showListItemOption={settingProps.showListItemOption}\n state={columnsStateMap}\n onChange={setColumnsStateMap}\n onReset={resetColumnsState}\n />\n </OptionPopover>,\n ]\n : [];\n\n const lightMode = search !== false && search?.filterType === 'light';\n const lightFilterDom =\n lightMode && searchFields.length > 0 ? (\n <LightFilter\n fields={searchFields}\n form={form}\n placeholder={{ input: locale.searchPlaceholder, select: locale.selectPlaceholder }}\n />\n ) : null;\n\n const keywordDom = searchOption ? (\n <Input\n allowClear\n key=\"keyword\"\n style={{ width: 200 }}\n placeholder={\n (typeof searchOption === 'object' && searchOption.placeholder) || locale.searchPlaceholder\n }\n onClear={() => {\n setKeyword(undefined);\n setPageInfo({ current: 1 });\n }}\n onPressEnter={(event) => {\n const value = (event.target as HTMLInputElement).value;\n if (typeof searchOption === 'object' && searchOption.onSearch?.(value) === false) return;\n setKeyword(value);\n setPageInfo({ current: 1 });\n }}\n />\n ) : null;\n\n const actionNodes =\n toolBarRender === false\n ? []\n : [\n ...(toolbar?.actions ?? []),\n ...(toolBarRender?.(actionHolderRef.current, { selectedRowKeys, selectedRows }) ?? []),\n ];\n const titleNode = headerTitle ?? toolbar?.title;\n const titleTooltip = tooltip ?? toolbar?.tooltip;\n const settingsNodes = toolbar?.settings ?? optionNodes;\n\n const hasToolbar =\n toolBarRender !== false &&\n (titleNode !== undefined ||\n actionNodes.length > 0 ||\n settingsNodes.length > 0 ||\n !!lightFilterDom ||\n !!keywordDom);\n\n const toolbarDom = hasToolbar ? (\n <div className={cx(styles.toolbar, `${PRO_PREFIX_CLS}-toolbar`)}>\n {(titleNode !== undefined || toolbar?.subTitle) && (\n <div className={styles.title}>\n {titleNode}\n {titleTooltip && <ActionIcon icon={CircleHelp} size=\"small\" title={titleTooltip} />}\n {toolbar?.subTitle && <span className={styles.titleSub}>{toolbar.subTitle}</span>}\n </div>\n )}\n <div className={styles.toolbarActions}>\n {lightFilterDom}\n {keywordDom}\n {actionNodes}\n {settingsNodes.length > 0 && <div className={styles.toolbarOptions}>{settingsNodes}</div>}\n </div>\n </div>\n ) : null;\n\n // =============================== Alert ===============================\n const alwaysShowAlert = rowSelection ? rowSelection.alwaysShowAlert : false;\n const alertProps = { onCleanSelected: clearSelected, selectedRowKeys, selectedRows };\n const alertInfo =\n tableAlertRender === false\n ? false\n : tableAlertRender\n ? tableAlertRender(alertProps)\n : locale.alertSelected(selectedRowKeys.length);\n const alertOption =\n tableAlertOptionRender === false ? null : tableAlertOptionRender ? (\n tableAlertOptionRender(alertProps)\n ) : (\n <Button size=\"small\" type=\"link\" onClick={clearSelected}>\n {locale.alertClear}\n </Button>\n );\n const alertDom =\n selectionEnabled && alertInfo !== false && (selectedRowKeys.length > 0 || alwaysShowAlert) ? (\n <div className={cx(styles.alert, `${PRO_PREFIX_CLS}-alert`)} role=\"status\">\n <div className={styles.alertInfo}>{alertInfo}</div>\n {alertOption && <div className={styles.alertOption}>{alertOption}</div>}\n </div>\n ) : null;\n\n // =============================== Table ===============================\n const mergedRowSelection = rowSelection\n ? (() => {\n const { alwaysShowAlert: _always, ...restSelection } = rowSelection;\n return {\n ...restSelection,\n onChange: (keys: Key[], selected: T[], info: { type: any }) => {\n setInnerSelectedKeys(keys);\n restSelection.onChange?.(keys, selected, info);\n },\n // Keep keys across pages of a server table (Pro default).\n preserveSelectedRowKeys: restSelection.preserveSelectedRowKeys ?? !!request,\n selectedRowKeys,\n };\n })()\n : undefined;\n\n const tablePagination: TablePaginationConfig | false =\n paginationConfig === false\n ? false\n : {\n ...paginationConfig,\n current: mergedPageInfo.current,\n onChange: (page, pageSize) => {\n setPageInfo({ current: page, pageSize });\n paginationConfig.onChange?.(page, pageSize);\n },\n pageSize: mergedPageInfo.pageSize,\n ...(request && { total: mergedPageInfo.total }),\n };\n\n const tableDom = (\n <Table<T>\n {...tableProps}\n className={tableClassName}\n columns={tableColumns}\n dataSource={rows}\n loading={loading}\n pagination={tablePagination}\n rowSelection={mergedRowSelection}\n size={size}\n style={tableStyle}\n variant={variant}\n onChange={handleTableChange}\n />\n );\n\n // No card container: the form and the table sit flat. `cardBordered` opts back into a framed\n // part (border, radius, padding); `ghost` is kept for compatibility and has nothing to remove.\n const cardBorder = (part: 'search' | 'table') =>\n typeof cardBordered === 'object' ? !!cardBordered[part] : !!cardBordered;\n const cardClass = (part: 'search' | 'table') =>\n cx(styles.part, cardBorder(part) && styles.partBordered, `${PRO_PREFIX_CLS}-${part}`);\n\n const tableBody = (\n <>\n {toolbarDom}\n {alertDom}\n {tableDom}\n </>\n );\n const tableCard = (\n <div className={cardClass('table')}>\n {tableRender\n ? tableRender(props, tableBody, { alert: alertDom, table: tableDom, toolbar: toolbarDom })\n : tableBody}\n </div>\n );\n\n let searchDom: ReactNode = null;\n if (search !== false && !lightMode && searchFields.length > 0) {\n const formDom = (\n <div className={cardClass('search')}>\n <SearchForm\n config={search ?? {}}\n fields={searchFields}\n form={form}\n loading={!!loading && !!request}\n locale={{\n collapse: locale.collapse,\n expand: locale.expand,\n inputPlaceholder: locale.searchPlaceholder,\n reset: locale.reset,\n search: locale.search,\n selectPlaceholder: locale.selectPlaceholder,\n }}\n onReset={handleReset}\n />\n </div>\n );\n searchDom = searchFormRender ? searchFormRender(props, formDom) : formDom;\n }\n\n return (\n <div\n className={cx(styles.root, PRO_PREFIX_CLS, className)}\n data-fullscreen={fullscreen || undefined}\n ref={rootRef}\n style={style}\n >\n {searchDom}\n {tableExtraRender?.(props, rows)}\n {tableCard}\n </div>\n );\n};\n\nProTable.displayName = 'ProTable';\n\nexport default ProTable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProTable.mjs","names":["Input"],"sources":["../../../src/base-ui/ProTable/ProTable.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { Check, CircleHelp, Fullscreen, Minimize, RotateCw, Rows3, Settings } from 'lucide-react';\nimport {\n type Key,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport ActionIconGroup, { type ActionIconGroupItemType } from '@/ActionIconGroup';\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Button from '@/base-ui/Button';\nimport Input from '@/base-ui/Input/Input';\nimport Table from '@/base-ui/Table';\nimport type {\n SortOrder,\n TableColumn,\n TableFilters,\n TableLoadingConfig,\n TableLocale,\n TablePaginationConfig,\n TableSorterResult,\n} from '@/base-ui/Table/type';\nimport { useI18n } from '@/ConfigProvider';\nimport { useEventCallback } from '@/hooks/useEventCallback';\n\nimport ColumnSetting, { type SettingColumn } from './ColumnSetting';\nimport LightFilter from './LightFilter';\nimport { PRO_TABLE_LOCALE_EN_US, resolveProTableLocale } from './locale';\nimport OptionPopover from './OptionPopover';\nimport { CopyableText, renderValue } from './renderValue';\nimport SearchForm from './SearchForm';\nimport { PRO_PREFIX_CLS, styles } from './style';\nimport type {\n ProColumnType,\n ProTableActionType,\n ProTableColumnsStateMap,\n ProTableDensity,\n ProTableFormInstance,\n ProTablePageInfo,\n ProTableProps,\n} from './type';\nimport { useFetchData } from './useFetchData';\nimport { getSearchFields, useSearchForm } from './useSearchForm';\nimport {\n getByPath,\n getProColumnKey,\n isEmptyValue,\n readPersistedState,\n resolveValueEnum,\n resolveValueType,\n valueEnumToList,\n writePersistedState,\n} from './utils';\n\n/** English texts; ProTable picks the preset from ConfigProvider `locale` (see `./locale`). */\nexport const DEFAULT_PRO_TABLE_LOCALE = PRO_TABLE_LOCALE_EN_US;\n\nconst assignRef = <V,>(ref: Ref<V> | undefined, value: V) => {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: V }).current = value;\n};\n\nconst stableKey = (value: unknown) => {\n try {\n return JSON.stringify(value, (_key, item) =>\n item instanceof Date ? item.toISOString() : item,\n );\n } catch {\n return String(Math.random());\n }\n};\n\n/** `value`, but switching on only after it stayed on for `delay` ms (off is immediate). */\nconst useDelayedFlag = (value: boolean, delay: number | undefined) => {\n const [delayed, setDelayed] = useState(value && !delay);\n useEffect(() => {\n if (!value || !delay) {\n setDelayed(value);\n return;\n }\n const timer = setTimeout(() => setDelayed(true), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return delay ? value && delayed : value;\n};\n\nconst isGroup = (column: ProColumnType<any>) => !!column.children?.length;\n\nconst ProTable = <\n T extends Record<string, any> = any,\n Params extends Record<string, any> = Record<string, any>,\n>(\n props: ProTableProps<T, Params>,\n) => {\n const {\n actionRef,\n beforeSearchSubmit,\n cardBordered,\n className,\n columnEmptyText = '-',\n columns: columnsProp = [],\n columnsState,\n dataSource,\n dateFormatter = 'string',\n debounceTime = 10,\n defaultData,\n defaultSize,\n form: formConfig,\n formRef,\n ghost: _ghost,\n headerTitle,\n loading: loadingProp,\n locale: localeProp,\n manualRequest = false,\n onChange,\n onDataSourceChange,\n onLoad,\n onLoadingChange,\n onRequestError,\n onReset,\n onSizeChange,\n onSubmit,\n options,\n pagination: paginationProp,\n params,\n polling,\n postData,\n request,\n rowSelection,\n search,\n searchFormRender,\n size: sizeProp,\n style,\n tableAlertOptionRender,\n tableAlertRender,\n tableClassName,\n tableExtraRender,\n tableRender,\n tableStyle,\n toolbar,\n toolBarRender,\n tooltip,\n variant,\n ...tableProps\n } = props;\n\n const i18n = useI18n();\n const locale = { ...resolveProTableLocale(i18n?.locale), ...localeProp };\n /** Table-level texts (emptyText, filter / sort / selection labels) go on to the base-ui Table. */\n const tableLocale = useMemo(() => {\n if (!localeProp) return undefined;\n const entries = Object.entries(localeProp).filter(([key]) => !(key in PRO_TABLE_LOCALE_EN_US));\n return entries.length > 0 ? (Object.fromEntries(entries) as TableLocale) : undefined;\n }, [localeProp]);\n const rootRef = useRef<HTMLDivElement>(null);\n const actionHolderRef = useRef<ProTableActionType | undefined>(undefined);\n\n // ============================== Density ==============================\n const [innerSize, setInnerSize] = useState<ProTableDensity>(defaultSize ?? 'medium');\n const size = sizeProp ?? innerSize;\n const setSize = (next: ProTableDensity) => {\n setInnerSize(next);\n onSizeChange?.(next);\n };\n\n // ============================ Fullscreen =============================\n const [fullscreen, setFullscreen] = useState(false);\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const sync = () => setFullscreen(document.fullscreenElement === rootRef.current);\n document.addEventListener('fullscreenchange', sync);\n return () => document.removeEventListener('fullscreenchange', sync);\n }, []);\n const toggleFullScreen = useEventCallback(() => {\n const node = rootRef.current;\n if (!node || typeof document === 'undefined') return;\n if (document.fullscreenElement) void document.exitFullscreen?.();\n else void node.requestFullscreen?.();\n });\n\n // =========================== Columns state ===========================\n const persistKey = columnsState?.persistenceKey;\n const persistType = columnsState?.persistenceType;\n const defaultColumnsState = useMemo(() => {\n const map: ProTableColumnsStateMap = {};\n columnsProp.forEach((column, index) => {\n const key = getProColumnKey(column, index);\n if (column.fixed) map[key] = { fixed: column.fixed };\n });\n return { ...map, ...columnsState?.defaultValue };\n }, []);\n const [innerColumnsState, setInnerColumnsState] = useState<ProTableColumnsStateMap>(\n () => readPersistedState(persistKey, persistType) ?? defaultColumnsState,\n );\n const columnsStateMap = columnsState?.value ?? innerColumnsState;\n const setColumnsStateMap = (next: ProTableColumnsStateMap) => {\n setInnerColumnsState(next);\n writePersistedState(persistKey, persistType, next);\n columnsState?.onChange?.(next);\n };\n const resetColumnsState = () => {\n writePersistedState(persistKey, persistType, undefined);\n setInnerColumnsState(defaultColumnsState);\n columnsState?.onChange?.(defaultColumnsState);\n };\n\n // ============================ Pagination =============================\n const paginationConfig: TablePaginationConfig | false =\n paginationProp === false ? false : (paginationProp ?? {});\n const [pageInfo, setPageInfoState] = useState<ProTablePageInfo>(() => ({\n current:\n (paginationConfig && (paginationConfig.current ?? paginationConfig.defaultCurrent)) || 1,\n pageSize:\n (paginationConfig && (paginationConfig.pageSize ?? paginationConfig.defaultPageSize)) || 10,\n total: 0,\n }));\n const mergedPageInfo: ProTablePageInfo = {\n ...pageInfo,\n ...(paginationConfig &&\n paginationConfig.current !== undefined && { current: paginationConfig.current }),\n ...(paginationConfig &&\n paginationConfig.pageSize !== undefined && { pageSize: paginationConfig.pageSize }),\n };\n const setPageInfo = useEventCallback((next: Partial<ProTablePageInfo>) =>\n setPageInfoState((prev) => ({ ...prev, ...next })),\n );\n\n // ========================== Sort / filter ============================\n const [sort, setSort] = useState<Record<string, SortOrder>>({});\n const [filter, setFilter] = useState<Record<string, (string | number | boolean)[] | null>>({});\n\n // =========================== Search form =============================\n const searchFields = useMemo(() => getSearchFields(columnsProp), [columnsProp]);\n const [formParams, setFormParams] = useState<Record<string, any>>({});\n const [keyword, setKeyword] = useState<string | undefined>(undefined);\n const formReadyRef = useRef(false);\n\n const handleSubmit = useEventCallback((formatted: Record<string, any>) => {\n const next = beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted;\n formReadyRef.current = true;\n setFormParams(next);\n setPageInfo({ current: 1 });\n onSubmit?.(next);\n void fetcher.reload();\n });\n\n const { form } = useSearchForm({\n dateFormatter,\n fields: searchFields,\n initialValues: formConfig?.initialValues,\n onSubmit: handleSubmit,\n onValuesChange: formConfig?.onValuesChange,\n validateOn: formConfig?.validateOn,\n });\n // The first request already carries the initial form values (Pro submits the form on mount).\n const initialFormParams = useMemo(() => form.getFieldsFormatValue(), [form]);\n const effectiveFormParams = formReadyRef.current ? formParams : initialFormParams;\n\n useImperativeHandle(formRef as Ref<ProTableFormInstance>, () => form, [form]);\n\n // ============================== Fetching =============================\n const keywordName =\n options && typeof options.search === 'object' ? (options.search.name ?? 'keyword') : 'keyword';\n const getParams = () => ({\n ...effectiveFormParams,\n ...params,\n ...(keyword !== undefined && keyword !== '' && { [keywordName]: keyword }),\n });\n\n const fetcher = useFetchData<T>({\n debounceTime,\n defaultData,\n depsKey: stableKey([effectiveFormParams, params, keyword, sort, filter]),\n filter,\n getParams,\n manual: manualRequest,\n onDataSourceChange,\n onLoad,\n onLoadingChange,\n onRequestError,\n pageInfo: mergedPageInfo,\n paginated: paginationConfig !== false,\n polling,\n postData,\n request,\n setTotal: (total) => setPageInfo({ total }),\n sort,\n });\n\n // `params` changes go back to page 1 (Pro).\n const paramsKey = stableKey(params);\n const firstParamsRef = useRef(true);\n useEffect(() => {\n if (firstParamsRef.current) {\n firstParamsRef.current = false;\n return;\n }\n setPageInfo({ current: 1 });\n }, [paramsKey, setPageInfo]);\n\n const rows: T[] = request ? fetcher.data : (dataSource ?? defaultData ?? []);\n // `loading` object: Spin options (+ `delay`); without `spinning` it follows the request state.\n const loadingConfig = typeof loadingProp === 'object' ? loadingProp : undefined;\n const { delay: loadingDelay, ...loadingSpin } = loadingConfig ?? {};\n const rawLoading =\n loadingConfig === undefined\n ? ((loadingProp as boolean | undefined) ?? fetcher.loading)\n : (loadingConfig.spinning ?? (request ? fetcher.loading : true));\n const loading = useDelayedFlag(rawLoading, loadingDelay);\n const tableLoading: boolean | TableLoadingConfig = loadingConfig\n ? { ...loadingSpin, spinning: loading }\n : loading;\n\n // ============================= Selection =============================\n const selectionEnabled = !!rowSelection;\n const [innerSelectedKeys, setInnerSelectedKeys] = useState<Key[]>(\n (rowSelection && rowSelection.defaultSelectedRowKeys) || [],\n );\n const selectedRowKeys = (rowSelection && rowSelection.selectedRowKeys) || innerSelectedKeys;\n const selectedRowsCacheRef = useRef(new Map<Key, T>());\n const rowKeyProp = tableProps.rowKey ?? 'key';\n const getRowKey = useCallback(\n (record: T, index?: number): Key =>\n typeof rowKeyProp === 'function'\n ? rowKeyProp(record, index)\n : (record[rowKeyProp as string] as Key),\n [rowKeyProp],\n );\n rows.forEach((record, index) =>\n selectedRowsCacheRef.current.set(getRowKey(record, index), record),\n );\n const selectedRows = selectedRowKeys\n .map((key) => selectedRowsCacheRef.current.get(key))\n .filter((row): row is T => row !== undefined);\n\n const clearSelected = useEventCallback(() => {\n setInnerSelectedKeys([]);\n if (rowSelection) rowSelection.onChange?.([], [], { type: 'none' });\n });\n\n // ============================== Actions ==============================\n const reload = useEventCallback(async (resetPageIndex?: boolean) => {\n if (resetPageIndex) setPageInfo({ current: 1 });\n await fetcher.reload();\n });\n\n const action: ProTableActionType = {\n clearSelected,\n fullScreen: toggleFullScreen,\n getSortFilter: () => ({ filter, sort }),\n nativeElement: rootRef.current,\n pageInfo: mergedPageInfo,\n reload,\n reloadAndRest: async () => {\n clearSelected();\n await reload(true);\n },\n reset: () => {\n form.resetFields();\n const formatted = form.getFieldsFormatValue();\n formReadyRef.current = true;\n setFormParams(beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted);\n setPageInfo({ current: 1 });\n void fetcher.reload();\n },\n setPageInfo,\n };\n actionHolderRef.current = action;\n useEffect(() => {\n assignRef(actionRef as Ref<ProTableActionType>, actionHolderRef.current as ProTableActionType);\n });\n\n const handleReset = useEventCallback(() => {\n form.resetFields();\n const formatted = form.getFieldsFormatValue();\n formReadyRef.current = true;\n const next = beforeSearchSubmit ? beforeSearchSubmit(formatted) : formatted;\n setFormParams(next);\n setPageInfo({ current: 1 });\n onReset?.();\n void fetcher.reload();\n });\n\n // ============================== Columns ==============================\n const settingColumns: SettingColumn[] = [];\n const tableColumns = useMemo(() => {\n const offset = (mergedPageInfo.current - 1) * mergedPageInfo.pageSize;\n\n const convert = (\n column: ProColumnType<T>,\n index: number,\n top: boolean,\n ): TableColumn<T> | null => {\n const key = getProColumnKey(column, index);\n const state = top ? columnsStateMap[key] : undefined;\n if (column.hideInTable || state?.show === false) return null;\n\n const {\n children,\n colSize: _colSize,\n copyable,\n disable: _disable,\n fieldProps,\n filters,\n formItemProps: _formItemProps,\n hideInForm: _hideInForm,\n hideInSearch: _hideInSearch,\n hideInSetting: _hideInSetting,\n hideInTable: _hideInTable,\n initialValue: _initialValue,\n onFilter,\n order: _order,\n render,\n renderFormItem: _renderFormItem,\n renderText,\n search: _search,\n sorter,\n title,\n tooltip: columnTooltip,\n valueEnum: _valueEnum,\n valueType: _valueType,\n ...rest\n } = column;\n\n const titleNode: ReactNode = columnTooltip ? (\n <span className={styles.titleTooltip}>\n {title}\n <ActionIcon icon={CircleHelp} size=\"small\" title={columnTooltip} />\n </span>\n ) : (\n title\n );\n\n if (children?.length) {\n const childColumns = children\n .map((child, childIndex) => convert(child, childIndex, false))\n .filter((child): child is TableColumn<T> => child !== null);\n return { ...(rest as any), children: childColumns, key, title: titleNode };\n }\n\n const valueType = resolveValueType(column);\n const staticEnum = typeof column.valueEnum === 'function' ? undefined : column.valueEnum;\n const resolvedFilters =\n filters === true\n ? valueEnumToList(staticEnum).map((item) => ({ text: item.text, value: item.value }))\n : filters || undefined;\n const resolvedOnFilter =\n onFilter === true\n ? (value: unknown, record: T) =>\n String(getByPath(record, column.dataIndex)) === String(value)\n : onFilter || undefined;\n\n const fixed = state?.fixed ?? rest.fixed;\n const converted: TableColumn<T> = {\n ...(rest as any),\n ...(valueType === 'option' && rest.align === undefined && { align: 'end' }),\n ...((valueType === 'index' || valueType === 'indexBorder') &&\n rest.width === undefined && { width: 56 }),\n filters: resolvedFilters,\n fixed: fixed === 'left' ? 'start' : fixed === 'right' ? 'end' : fixed,\n key,\n onFilter: resolvedOnFilter,\n // A string sorter is the server field name (see `sort` below); the table only needs `true`.\n sorter: typeof sorter === 'string' ? true : sorter,\n title: titleNode,\n render: (value: any, record: T, rowIndex: number) => {\n const current = actionHolderRef.current;\n const text = renderText ? renderText(value, record, rowIndex, current) : value;\n let dom: ReactNode = renderValue(text, {\n emptyText: columnEmptyText === false ? null : columnEmptyText,\n fieldProps,\n rowIndex: offset + rowIndex,\n valueEnum: resolveValueEnum(column, record),\n valueType: resolveValueType(column, record),\n });\n if (copyable && !isEmptyValue(text)) {\n dom = (\n <CopyableText label={locale.copy} text={String(text)}>\n {dom}\n </CopyableText>\n );\n }\n if (!render) return dom;\n const result = render(dom, record, rowIndex, current, column);\n if (valueType === 'option' && Array.isArray(result)) {\n return <div className={styles.optionCell}>{result}</div>;\n }\n return result;\n },\n };\n return converted;\n };\n\n const indexed = columnsProp.map((column, index) => ({\n column,\n index,\n key: getProColumnKey(column, index),\n }));\n indexed.sort((a, b) => {\n const orderA = columnsStateMap[a.key]?.order ?? a.index;\n const orderB = columnsStateMap[b.key]?.order ?? b.index;\n return orderA - orderB;\n });\n return indexed\n .map(({ column, index }) => convert(column, index, true))\n .filter((column): column is TableColumn<T> => column !== null);\n }, [\n columnsProp,\n columnsStateMap,\n columnEmptyText,\n mergedPageInfo.current,\n mergedPageInfo.pageSize,\n ]);\n\n // Columns listed in the setting panel, in display order.\n [...columnsProp]\n .map((column, index) => ({ column, index, key: getProColumnKey(column, index) }))\n .sort(\n (a, b) =>\n (columnsStateMap[a.key]?.order ?? a.index) - (columnsStateMap[b.key]?.order ?? b.index),\n )\n .forEach(({ column, key }) => {\n if (column.hideInTable || column.hideInSetting) return;\n const disable =\n columnsStateMap[key]?.disable ??\n (typeof column.disable === 'object' ? column.disable.checkbox : column.disable);\n settingColumns.push({ disabled: !!disable, key, title: column.title ?? key });\n });\n\n // Server-side sort field names: a string `sorter` renames the field.\n const sortFieldOf = useMemo(() => {\n const map = new Map<string, string>();\n const walk = (list: ProColumnType<T>[]) =>\n list.forEach((column, index) => {\n if (isGroup(column)) walk(column.children!);\n const key = getProColumnKey(column, index);\n if (typeof column.sorter === 'string') map.set(key, column.sorter);\n else if (Array.isArray(column.dataIndex)) map.set(key, column.dataIndex.join('.'));\n else if (column.dataIndex !== undefined) map.set(key, String(column.dataIndex));\n });\n walk(columnsProp);\n return map;\n }, [columnsProp]);\n\n const handleTableChange = useEventCallback(\n (\n pagination: TablePaginationConfig,\n filters: TableFilters,\n sorter: TableSorterResult<T> | TableSorterResult<T>[],\n extra: Parameters<NonNullable<ProTableProps<T>['onChange']>>[3],\n ) => {\n if (extra.action === 'sort') {\n const list = Array.isArray(sorter) ? sorter : [sorter];\n const next: Record<string, SortOrder> = {};\n list.forEach((item) => {\n if (!item.order || item.columnKey === undefined) return;\n const columnKey = String(item.columnKey);\n next[sortFieldOf.get(columnKey) ?? columnKey] = item.order;\n });\n setSort(next);\n }\n if (extra.action === 'filter') {\n const next: Record<string, (string | number | boolean)[] | null> = {};\n Object.entries(filters).forEach(([columnKey, value]) => {\n next[sortFieldOf.get(columnKey) ?? columnKey] = value;\n });\n setFilter(next);\n }\n onChange?.(pagination, filters, sorter, extra);\n },\n );\n\n // ============================== Toolbar ==============================\n const optionConfig =\n options === false\n ? false\n : { density: true, fullScreen: false, reload: true, setting: true, ...options };\n const reloadOption = optionConfig && optionConfig.reload;\n const fullScreenOption = optionConfig && optionConfig.fullScreen;\n const settingOption = optionConfig && optionConfig.setting;\n const searchOption = optionConfig && optionConfig.search;\n\n const [openOption, setOpenOption] = useState<{ anchor: HTMLElement; key: string } | null>(null);\n const toggleOption = (key: string, event: unknown) => {\n const anchor = (event as { currentTarget?: HTMLElement } | undefined)?.currentTarget ?? null;\n setOpenOption((prev) => (prev?.key === key || !anchor ? null : { anchor, key }));\n };\n const closeOption = () => setOpenOption(null);\n\n const optionItems: ActionIconGroupItemType[] = [];\n if (optionConfig) {\n if (reloadOption) {\n optionItems.push({\n icon: RotateCw,\n key: 'reload',\n label: locale.reload,\n loading: !!loading && !!request,\n onClick: () => (typeof reloadOption === 'function' ? reloadOption() : void reload()),\n });\n }\n if (optionConfig.density) {\n optionItems.push({\n icon: Rows3,\n key: 'density',\n label: locale.density,\n onClick: ((event: unknown) => toggleOption('density', event)) as any,\n });\n }\n if (fullScreenOption) {\n optionItems.push({\n icon: fullscreen ? Minimize : Fullscreen,\n key: 'fullScreen',\n label: locale.fullScreen,\n onClick: () =>\n typeof fullScreenOption === 'function' ? fullScreenOption() : toggleFullScreen(),\n });\n }\n if (settingOption) {\n optionItems.push({\n icon: Settings,\n key: 'setting',\n label: locale.columnSetting,\n onClick: ((event: unknown) => toggleOption('setting', event)) as any,\n });\n }\n }\n\n const settingProps = settingOption && typeof settingOption === 'object' ? settingOption : {};\n const optionNodes: ReactNode[] =\n optionItems.length > 0\n ? [\n <ActionIconGroup\n className={`${PRO_PREFIX_CLS}-options`}\n items={optionItems}\n key=\"options\"\n size=\"small\"\n variant=\"outlined\"\n />,\n <OptionPopover\n anchor={openOption?.key === 'density' ? openOption.anchor : null}\n key=\"density-popover\"\n open={openOption?.key === 'density'}\n onOpenChange={(next) => !next && closeOption()}\n >\n <div className={styles.density} data-pro-table-density=\"\" role=\"menu\">\n {(['large', 'medium', 'small'] as ProTableDensity[]).map((item) => (\n <button\n aria-checked={size === item}\n className={styles.densityItem}\n key={item}\n role=\"menuitemradio\"\n type=\"button\"\n onClick={() => {\n setSize(item);\n closeOption();\n }}\n >\n <span>\n {item === 'large'\n ? locale.densityLarge\n : item === 'medium'\n ? locale.densityMedium\n : locale.densitySmall}\n </span>\n {size === item && <Check size={14} />}\n </button>\n ))}\n </div>\n </OptionPopover>,\n <OptionPopover\n anchor={openOption?.key === 'setting' ? openOption.anchor : null}\n key=\"setting-popover\"\n open={openOption?.key === 'setting'}\n onOpenChange={(next) => !next && closeOption()}\n >\n <ColumnSetting\n checkable={settingProps.checkable}\n columns={settingColumns}\n draggable={settingProps.draggable}\n locale={locale}\n showListItemOption={settingProps.showListItemOption}\n state={columnsStateMap}\n onChange={setColumnsStateMap}\n onReset={resetColumnsState}\n />\n </OptionPopover>,\n ]\n : [];\n\n const lightMode = search !== false && search?.filterType === 'light';\n const lightFilterDom =\n lightMode && searchFields.length > 0 ? (\n <LightFilter\n fields={searchFields}\n form={form}\n ignoreRules={formConfig?.ignoreRules}\n placeholder={{ input: locale.searchPlaceholder, select: locale.selectPlaceholder }}\n />\n ) : null;\n\n const keywordDom = searchOption ? (\n <Input\n allowClear\n key=\"keyword\"\n style={{ width: 200 }}\n placeholder={\n (typeof searchOption === 'object' && searchOption.placeholder) || locale.searchPlaceholder\n }\n onClear={() => {\n setKeyword(undefined);\n setPageInfo({ current: 1 });\n }}\n onPressEnter={(event) => {\n const value = (event.target as HTMLInputElement).value;\n if (typeof searchOption === 'object' && searchOption.onSearch?.(value) === false) return;\n setKeyword(value);\n setPageInfo({ current: 1 });\n }}\n />\n ) : null;\n\n const actionNodes =\n toolBarRender === false\n ? []\n : [\n ...(toolbar?.actions ?? []),\n ...(toolBarRender?.(actionHolderRef.current, { selectedRowKeys, selectedRows }) ?? []),\n ];\n const titleNode = headerTitle ?? toolbar?.title;\n const titleTooltip = tooltip ?? toolbar?.tooltip;\n const settingsNodes = toolbar?.settings ?? optionNodes;\n\n const hasToolbar =\n toolBarRender !== false &&\n (titleNode !== undefined ||\n actionNodes.length > 0 ||\n settingsNodes.length > 0 ||\n !!lightFilterDom ||\n !!keywordDom);\n\n const toolbarDom = hasToolbar ? (\n <div className={cx(styles.toolbar, `${PRO_PREFIX_CLS}-toolbar`)}>\n {(titleNode !== undefined || toolbar?.subTitle) && (\n <div className={styles.title}>\n {titleNode}\n {titleTooltip && <ActionIcon icon={CircleHelp} size=\"small\" title={titleTooltip} />}\n {toolbar?.subTitle && <span className={styles.titleSub}>{toolbar.subTitle}</span>}\n </div>\n )}\n <div className={styles.toolbarActions}>\n {lightFilterDom}\n {keywordDom}\n {actionNodes}\n {settingsNodes.length > 0 && <div className={styles.toolbarOptions}>{settingsNodes}</div>}\n </div>\n </div>\n ) : null;\n\n // =============================== Alert ===============================\n const alwaysShowAlert = rowSelection ? rowSelection.alwaysShowAlert : false;\n const alertProps = { onCleanSelected: clearSelected, selectedRowKeys, selectedRows };\n const alertInfo =\n tableAlertRender === false\n ? false\n : tableAlertRender\n ? tableAlertRender(alertProps)\n : locale.alertSelected(selectedRowKeys.length);\n const alertOption =\n tableAlertOptionRender === false ? null : tableAlertOptionRender ? (\n tableAlertOptionRender(alertProps)\n ) : (\n <Button size=\"small\" type=\"link\" onClick={clearSelected}>\n {locale.alertClear}\n </Button>\n );\n const alertDom =\n selectionEnabled && alertInfo !== false && (selectedRowKeys.length > 0 || alwaysShowAlert) ? (\n <div className={cx(styles.alert, `${PRO_PREFIX_CLS}-alert`)} role=\"status\">\n <div className={styles.alertInfo}>{alertInfo}</div>\n {alertOption && <div className={styles.alertOption}>{alertOption}</div>}\n </div>\n ) : null;\n\n // =============================== Table ===============================\n const mergedRowSelection = rowSelection\n ? (() => {\n const { alwaysShowAlert: _always, ...restSelection } = rowSelection;\n return {\n ...restSelection,\n onChange: (keys: Key[], selected: T[], info: { type: any }) => {\n setInnerSelectedKeys(keys);\n restSelection.onChange?.(keys, selected, info);\n },\n // Keep keys across pages of a server table (Pro default).\n preserveSelectedRowKeys: restSelection.preserveSelectedRowKeys ?? !!request,\n selectedRowKeys,\n };\n })()\n : undefined;\n\n const tablePagination: TablePaginationConfig | false =\n paginationConfig === false\n ? false\n : {\n ...paginationConfig,\n current: mergedPageInfo.current,\n onChange: (page, pageSize) => {\n setPageInfo({ current: page, pageSize });\n paginationConfig.onChange?.(page, pageSize);\n },\n pageSize: mergedPageInfo.pageSize,\n ...(request && { total: mergedPageInfo.total }),\n };\n\n const tableDom = (\n <Table<T>\n {...tableProps}\n className={tableClassName}\n columns={tableColumns}\n dataSource={rows}\n loading={tableLoading}\n locale={tableLocale}\n pagination={tablePagination}\n rowSelection={mergedRowSelection}\n size={size}\n style={tableStyle}\n variant={variant}\n onChange={handleTableChange}\n />\n );\n\n // No card container: the form and the table sit flat. `cardBordered` opts back into a framed\n // part (border, radius, padding); `ghost` is kept for compatibility and has nothing to remove.\n const cardBorder = (part: 'search' | 'table') =>\n typeof cardBordered === 'object' ? !!cardBordered[part] : !!cardBordered;\n const cardClass = (part: 'search' | 'table') =>\n cx(styles.part, cardBorder(part) && styles.partBordered, `${PRO_PREFIX_CLS}-${part}`);\n\n const tableBody = (\n <>\n {toolbarDom}\n {alertDom}\n {tableDom}\n </>\n );\n const tableCard = (\n <div className={cardClass('table')}>\n {tableRender\n ? tableRender(props, tableBody, { alert: alertDom, table: tableDom, toolbar: toolbarDom })\n : tableBody}\n </div>\n );\n\n let searchDom: ReactNode = null;\n if (search !== false && !lightMode && searchFields.length > 0) {\n const formDom = (\n <div className={cardClass('search')}>\n <SearchForm\n config={search ?? {}}\n fields={searchFields}\n form={form}\n ignoreRules={formConfig?.ignoreRules}\n layout={formConfig?.layout}\n loading={!!loading && !!request}\n locale={{\n collapse: locale.collapse,\n expand: locale.expand,\n inputPlaceholder: locale.searchPlaceholder,\n reset: locale.reset,\n search: locale.search,\n selectPlaceholder: locale.selectPlaceholder,\n }}\n onReset={handleReset}\n />\n </div>\n );\n searchDom = searchFormRender ? searchFormRender(props, formDom) : formDom;\n }\n\n return (\n <div\n className={cx(styles.root, PRO_PREFIX_CLS, className)}\n data-fullscreen={fullscreen || undefined}\n ref={rootRef}\n style={style}\n >\n {searchDom}\n {tableExtraRender?.(props, rows)}\n {tableCard}\n </div>\n );\n};\n\nProTable.displayName = 'ProTable';\n\nexport default ProTable;\n"],"mappings":"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"}
@@ -15,6 +15,33 @@ const colsForWidth = (width) => {
15
15
  if (width < 1200) return 3;
16
16
  return 4;
17
17
  };
18
+ /** Min form width of each `span` breakpoint (antd Grid sizes), largest first. */
19
+ const SPAN_BREAKPOINTS = [
20
+ ["xxl", 1600],
21
+ ["xl", 1200],
22
+ ["lg", 992],
23
+ ["md", 768],
24
+ ["sm", 576],
25
+ ["xs", 0]
26
+ ];
27
+ /**
28
+ * Resolve `search.span` for the form width: a number is used as is; an object takes the entry of
29
+ * the largest breakpoint the width reaches, falling back to the nearest smaller defined one, then
30
+ * the nearest larger one. `undefined` means "derive the columns from the width".
31
+ */
32
+ const resolveSpan = (span, width) => {
33
+ if (span === void 0 || typeof span === "number") return span || void 0;
34
+ const reached = SPAN_BREAKPOINTS.findIndex(([, min]) => width >= min);
35
+ const start = reached === -1 ? SPAN_BREAKPOINTS.length - 1 : reached;
36
+ for (let i = start; i < SPAN_BREAKPOINTS.length; i++) {
37
+ const value = span[SPAN_BREAKPOINTS[i][0]];
38
+ if (value) return value;
39
+ }
40
+ for (let i = start - 1; i >= 0; i--) {
41
+ const value = span[SPAN_BREAKPOINTS[i][0]];
42
+ if (value) return value;
43
+ }
44
+ };
18
45
  const useWidth = () => {
19
46
  const ref = useRef(null);
20
47
  const [width, setWidth] = useState(0);
@@ -30,8 +57,27 @@ const useWidth = () => {
30
57
  width
31
58
  };
32
59
  };
60
+ /** Label text; the label cell ellipsizes it and the full text shows as `title` when cut off. */
61
+ const SearchLabel = ({ text }) => /* @__PURE__ */ jsx("span", {
62
+ className: styles.searchLabelText,
63
+ onMouseEnter: (event) => {
64
+ const el = event.currentTarget;
65
+ const box = el.closest("label") ?? el;
66
+ if (box.scrollWidth > box.clientWidth) el.title = text;
67
+ else el.removeAttribute("title");
68
+ },
69
+ children: text
70
+ });
71
+ /** Pro `QueryFilter` vertical breakpoints: <576 → 1, <768 → 2, <1200 → 3, else 4 per row. */
72
+ const verticalColsForWidth = (width) => {
73
+ if (width <= 0) return 3;
74
+ if (width < 576) return 1;
75
+ if (width < 768) return 2;
76
+ if (width < 1200) return 3;
77
+ return 4;
78
+ };
33
79
  /** The query form: a base-ui `Form` laid out as a collapsible grid of `Form.Field`s. */
34
- const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
80
+ const SearchForm = ({ config, fields, form, ignoreRules, layout: formLayout, loading, locale, onReset }) => {
35
81
  const { ref, width } = useWidth();
36
82
  const [innerCollapsed, setInnerCollapsed] = useState(config.defaultCollapsed ?? true);
37
83
  const collapsed = config.collapsed ?? innerCollapsed;
@@ -39,8 +85,9 @@ const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
39
85
  setInnerCollapsed(next);
40
86
  config.onCollapse?.(next);
41
87
  };
42
- const cols = config.span ? Math.max(1, Math.round(24 / config.span)) : colsForWidth(width);
43
- const layout = config.layout ?? (cols === 1 ? "vertical" : "horizontal");
88
+ const span = resolveSpan(config.span, width);
89
+ const cols = span ? Math.max(1, Math.round(24 / span)) : config.layout === "vertical" ? verticalColsForWidth(width) : colsForWidth(width);
90
+ const layout = config.layout ?? formLayout ?? (cols === 1 ? "vertical" : "horizontal");
44
91
  const labelWidth = config.labelWidth ?? 80;
45
92
  const visibleCount = config.defaultColsNumber ?? Math.max(1, cols - 1);
46
93
  let used = 0;
@@ -75,7 +122,9 @@ const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
75
122
  }, "collapse");
76
123
  const gridStyle = {
77
124
  "--lobe-pro-table-label-width": layout === "vertical" || labelWidth === "auto" ? "auto" : `${labelWidth}px`,
125
+ "columnGap": 24,
78
126
  "display": "grid",
127
+ "rowGap": 16,
79
128
  "gridTemplateColumns": `repeat(${cols}, minmax(0, 1fr))`
80
129
  };
81
130
  return /* @__PURE__ */ jsxs(Form, {
@@ -90,7 +139,10 @@ const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
90
139
  fields.map(({ column, name }, index) => {
91
140
  if (!visibility[index]) return null;
92
141
  const label = column.formItemProps?.label ?? column.title;
93
- const { required, validate } = rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);
142
+ const { required, validate } = ignoreRules ? {
143
+ required: void 0,
144
+ validate: void 0
145
+ } : rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);
94
146
  return /* @__PURE__ */ jsx("div", {
95
147
  className: styles.searchField,
96
148
  "data-layout": layout,
@@ -100,7 +152,7 @@ const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
100
152
  },
101
153
  children: /* @__PURE__ */ jsx(Form.Field, {
102
154
  extra: column.formItemProps?.extra,
103
- label,
155
+ label: typeof label === "string" ? /* @__PURE__ */ jsx(SearchLabel, { text: label }) : label,
104
156
  layout,
105
157
  name,
106
158
  required,
@@ -127,12 +179,13 @@ const SearchForm = ({ config, fields, form, loading, locale, onReset }) => {
127
179
  }),
128
180
  (buttons.length > 0 || collapseDom) && /* @__PURE__ */ jsxs("div", {
129
181
  className: styles.searchActions,
182
+ "data-layout": layout,
130
183
  children: [buttons, collapseDom]
131
184
  })
132
185
  ]
133
186
  });
134
187
  };
135
188
  //#endregion
136
- export { SearchForm as default };
189
+ export { SearchLabel, SearchForm as default, resolveSpan };
137
190
 
138
191
  //# sourceMappingURL=SearchForm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchForm.mjs","names":[],"sources":["../../../src/base-ui/ProTable/SearchForm.tsx"],"sourcesContent":["import Form from '@lobehub/ui/base-ui/form';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport Button from '@/base-ui/Button';\n\nimport FieldControl from './FieldControl';\nimport { styles } from './style';\nimport type { ProTableFormInstance, ProTableLocale, ProTableSearchConfig } from './type';\nimport { rulesToFieldProps, type SearchFieldSchema } from './useSearchForm';\n\nexport interface SearchFormProps {\n config: ProTableSearchConfig;\n fields: SearchFieldSchema[];\n form: ProTableFormInstance;\n loading?: boolean;\n locale: Required<Pick<ProTableLocale, 'collapse' | 'expand' | 'reset' | 'search'>> & {\n inputPlaceholder: string;\n selectPlaceholder: string;\n };\n onReset: () => void;\n}\n\n/** Pro `QueryFilter` breakpoints: columns per row for the form width. */\nconst colsForWidth = (width: number) => {\n if (width <= 0) return 3;\n if (width < 576) return 1;\n if (width < 900) return 2;\n if (width < 1200) return 3;\n return 4;\n};\n\nconst useWidth = () => {\n const ref = useRef<HTMLFormElement>(null);\n const [width, setWidth] = useState(0);\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n return { ref, width };\n};\n\n/** The query form: a base-ui `Form` laid out as a collapsible grid of `Form.Field`s. */\nconst SearchForm = ({ config, fields, form, loading, locale, onReset }: SearchFormProps) => {\n const { ref, width } = useWidth();\n const [innerCollapsed, setInnerCollapsed] = useState(config.defaultCollapsed ?? true);\n const collapsed = config.collapsed ?? innerCollapsed;\n const setCollapsed = (next: boolean) => {\n setInnerCollapsed(next);\n config.onCollapse?.(next);\n };\n\n const cols = config.span ? Math.max(1, Math.round(24 / config.span)) : colsForWidth(width);\n const layout = config.layout ?? (cols === 1 ? 'vertical' : 'horizontal');\n const labelWidth = config.labelWidth ?? 80;\n\n // Collapsed: one row, the action cell takes the last slot (Pro `defaultColsNumber`).\n const visibleCount = config.defaultColsNumber ?? Math.max(1, cols - 1);\n let used = 0;\n const visibility = fields.map(({ column }) => {\n used += Math.min(column.colSize ?? 1, cols);\n return !collapsed || used <= visibleCount;\n });\n const collapsible =\n fields.reduce((sum, { column }) => sum + Math.min(column.colSize ?? 1, cols), 0) > visibleCount;\n\n const submit = () => void form.submit();\n\n const resetDom = (\n <Button key=\"reset\" onClick={onReset}>\n {config.resetText ?? locale.reset}\n </Button>\n );\n const submitDom = (\n <Button htmlType=\"submit\" key=\"submit\" loading={loading} type=\"primary\">\n {config.searchText ?? config.submitText ?? locale.search}\n </Button>\n );\n const buttons: ReactNode[] =\n config.optionRender === false\n ? []\n : config.optionRender\n ? config.optionRender({ form, onReset, onSubmit: submit }, [resetDom, submitDom])\n : [resetDom, submitDom];\n\n let collapseDom: ReactNode = null;\n if (collapsible && config.collapseRender !== false) {\n collapseDom = (\n <Button\n icon={collapsed ? ChevronDown : ChevronUp}\n iconPosition=\"end\"\n key=\"collapse\"\n type=\"link\"\n onClick={() => setCollapsed(!collapsed)}\n >\n {config.collapseRender\n ? config.collapseRender(collapsed)\n : collapsed\n ? locale.expand\n : locale.collapse}\n </Button>\n );\n }\n\n const gridStyle = {\n '--lobe-pro-table-label-width':\n layout === 'vertical' || labelWidth === 'auto' ? 'auto' : `${labelWidth}px`,\n 'display': 'grid',\n 'gridTemplateColumns': `repeat(${cols}, minmax(0, 1fr))`,\n } as CSSProperties;\n\n return (\n <Form\n className={styles.search}\n data-pro-table-search=\"\"\n form={form}\n layout={layout}\n ref={ref}\n style={gridStyle}\n variant=\"borderless\"\n >\n {fields.map(({ column, name }, index) => {\n if (!visibility[index]) return null;\n const label = column.formItemProps?.label ?? column.title;\n const { required, validate } = rulesToFieldProps(\n column.formItemProps?.rules,\n column.formItemProps?.required,\n );\n return (\n <div\n className={styles.searchField}\n data-layout={layout}\n key={name}\n style={{\n gridColumn: `span ${Math.min(column.colSize ?? 1, cols)}`,\n ...column.formItemProps?.style,\n }}\n >\n <Form.Field\n extra={column.formItemProps?.extra}\n label={label}\n layout={layout}\n name={name}\n required={required}\n validate={validate}\n render={({ value, onChange, onBlur }) => (\n <div onBlur={onBlur}>\n <FieldControl\n column={column}\n form={form}\n value={value}\n placeholder={{\n input: locale.inputPlaceholder,\n select: locale.selectPlaceholder,\n }}\n onChange={onChange}\n />\n </div>\n )}\n />\n </div>\n );\n })}\n {/* Enter in a text field submits even without a visible submit button. */}\n <button hidden type=\"submit\" />\n {(buttons.length > 0 || collapseDom) && (\n <div className={styles.searchActions}>\n {buttons}\n {collapseDom}\n </div>\n )}\n </Form>\n );\n};\n\nexport default SearchForm;\n"],"mappings":"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"}
1
+ {"version":3,"file":"SearchForm.mjs","names":[],"sources":["../../../src/base-ui/ProTable/SearchForm.tsx"],"sourcesContent":["import Form from '@lobehub/ui/base-ui/form';\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport Button from '@/base-ui/Button';\n\nimport FieldControl from './FieldControl';\nimport { styles } from './style';\nimport type {\n ProTableFormInstance,\n ProTableLocale,\n ProTableSearchConfig,\n ProTableSpanBreakpoint,\n ProTableSpanConfig,\n} from './type';\nimport { rulesToFieldProps, type SearchFieldSchema } from './useSearchForm';\n\nexport interface SearchFormProps {\n config: ProTableSearchConfig;\n fields: SearchFieldSchema[];\n form: ProTableFormInstance;\n /** `form.ignoreRules`: render the fields without validation. */\n ignoreRules?: boolean;\n /** `form.layout`, used when `search.layout` is not set. */\n layout?: 'horizontal' | 'vertical';\n loading?: boolean;\n locale: Required<Pick<ProTableLocale, 'collapse' | 'expand' | 'reset' | 'search'>> & {\n inputPlaceholder: string;\n selectPlaceholder: string;\n };\n onReset: () => void;\n}\n\n/** Pro `QueryFilter` breakpoints: columns per row for the form width. */\nconst colsForWidth = (width: number) => {\n if (width <= 0) return 3;\n if (width < 576) return 1;\n if (width < 900) return 2;\n if (width < 1200) return 3;\n return 4;\n};\n\n/** Min form width of each `span` breakpoint (antd Grid sizes), largest first. */\nconst SPAN_BREAKPOINTS: [ProTableSpanBreakpoint, number][] = [\n ['xxl', 1600],\n ['xl', 1200],\n ['lg', 992],\n ['md', 768],\n ['sm', 576],\n ['xs', 0],\n];\n\n/**\n * Resolve `search.span` for the form width: a number is used as is; an object takes the entry of\n * the largest breakpoint the width reaches, falling back to the nearest smaller defined one, then\n * the nearest larger one. `undefined` means \"derive the columns from the width\".\n */\nexport const resolveSpan = (\n span: number | ProTableSpanConfig | undefined,\n width: number,\n): number | undefined => {\n if (span === undefined || typeof span === 'number') return span || undefined;\n const reached = SPAN_BREAKPOINTS.findIndex(([, min]) => width >= min);\n const start = reached === -1 ? SPAN_BREAKPOINTS.length - 1 : reached;\n for (let i = start; i < SPAN_BREAKPOINTS.length; i++) {\n const value = span[SPAN_BREAKPOINTS[i][0]];\n if (value) return value;\n }\n for (let i = start - 1; i >= 0; i--) {\n const value = span[SPAN_BREAKPOINTS[i][0]];\n if (value) return value;\n }\n return undefined;\n};\n\nconst useWidth = () => {\n const ref = useRef<HTMLFormElement>(null);\n const [width, setWidth] = useState(0);\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n return { ref, width };\n};\n\n/** Label text; the label cell ellipsizes it and the full text shows as `title` when cut off. */\nexport const SearchLabel = ({ text }: { text: string }) => (\n <span\n className={styles.searchLabelText}\n onMouseEnter={(event) => {\n const el = event.currentTarget;\n const box = el.closest('label') ?? el;\n if (box.scrollWidth > box.clientWidth) el.title = text;\n else el.removeAttribute('title');\n }}\n >\n {text}\n </span>\n);\n\n/** Pro `QueryFilter` vertical breakpoints: <576 → 1, <768 → 2, <1200 → 3, else 4 per row. */\nconst verticalColsForWidth = (width: number) => {\n if (width <= 0) return 3;\n if (width < 576) return 1;\n if (width < 768) return 2;\n if (width < 1200) return 3;\n return 4;\n};\n\n/** The query form: a base-ui `Form` laid out as a collapsible grid of `Form.Field`s. */\nconst SearchForm = ({\n config,\n fields,\n form,\n ignoreRules,\n layout: formLayout,\n loading,\n locale,\n onReset,\n}: SearchFormProps) => {\n const { ref, width } = useWidth();\n const [innerCollapsed, setInnerCollapsed] = useState(config.defaultCollapsed ?? true);\n const collapsed = config.collapsed ?? innerCollapsed;\n const setCollapsed = (next: boolean) => {\n setInnerCollapsed(next);\n config.onCollapse?.(next);\n };\n\n const span = resolveSpan(config.span, width);\n const cols = span\n ? Math.max(1, Math.round(24 / span))\n : config.layout === 'vertical'\n ? verticalColsForWidth(width)\n : colsForWidth(width);\n const layout = config.layout ?? formLayout ?? (cols === 1 ? 'vertical' : 'horizontal');\n // Pro default: an 80px label column, long labels end in an ellipsis; 'auto' sizes to the text.\n const labelWidth = config.labelWidth ?? 80;\n\n // Collapsed: one row, the action cell takes the last slot (Pro `defaultColsNumber`).\n const visibleCount = config.defaultColsNumber ?? Math.max(1, cols - 1);\n let used = 0;\n const visibility = fields.map(({ column }) => {\n used += Math.min(column.colSize ?? 1, cols);\n return !collapsed || used <= visibleCount;\n });\n const collapsible =\n fields.reduce((sum, { column }) => sum + Math.min(column.colSize ?? 1, cols), 0) > visibleCount;\n\n const submit = () => void form.submit();\n\n const resetDom = (\n <Button key=\"reset\" onClick={onReset}>\n {config.resetText ?? locale.reset}\n </Button>\n );\n const submitDom = (\n <Button htmlType=\"submit\" key=\"submit\" loading={loading} type=\"primary\">\n {config.searchText ?? config.submitText ?? locale.search}\n </Button>\n );\n const buttons: ReactNode[] =\n config.optionRender === false\n ? []\n : config.optionRender\n ? config.optionRender({ form, onReset, onSubmit: submit }, [resetDom, submitDom])\n : [resetDom, submitDom];\n\n let collapseDom: ReactNode = null;\n if (collapsible && config.collapseRender !== false) {\n collapseDom = (\n <Button\n icon={collapsed ? ChevronDown : ChevronUp}\n iconPosition=\"end\"\n key=\"collapse\"\n type=\"link\"\n onClick={() => setCollapsed(!collapsed)}\n >\n {config.collapseRender\n ? config.collapseRender(collapsed)\n : collapsed\n ? locale.expand\n : locale.collapse}\n </Button>\n );\n }\n\n const gridStyle = {\n '--lobe-pro-table-label-width':\n layout === 'vertical' || labelWidth === 'auto' ? 'auto' : `${labelWidth}px`,\n 'columnGap': 24,\n 'display': 'grid',\n 'rowGap': 16,\n 'gridTemplateColumns': `repeat(${cols}, minmax(0, 1fr))`,\n } as CSSProperties;\n\n return (\n <Form\n className={styles.search}\n data-pro-table-search=\"\"\n form={form}\n layout={layout}\n ref={ref}\n style={gridStyle}\n variant=\"borderless\"\n >\n {fields.map(({ column, name }, index) => {\n if (!visibility[index]) return null;\n const label = column.formItemProps?.label ?? column.title;\n const { required, validate } = ignoreRules\n ? { required: undefined, validate: undefined }\n : rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);\n return (\n <div\n className={styles.searchField}\n data-layout={layout}\n key={name}\n style={{\n gridColumn: `span ${Math.min(column.colSize ?? 1, cols)}`,\n ...column.formItemProps?.style,\n }}\n >\n <Form.Field\n extra={column.formItemProps?.extra}\n label={typeof label === 'string' ? <SearchLabel text={label} /> : label}\n layout={layout}\n name={name}\n required={required}\n validate={validate}\n render={({ value, onChange, onBlur }) => (\n <div onBlur={onBlur}>\n <FieldControl\n column={column}\n form={form}\n value={value}\n placeholder={{\n input: locale.inputPlaceholder,\n select: locale.selectPlaceholder,\n }}\n onChange={onChange}\n />\n </div>\n )}\n />\n </div>\n );\n })}\n {/* Enter in a text field submits even without a visible submit button. */}\n <button hidden type=\"submit\" />\n {(buttons.length > 0 || collapseDom) && (\n <div className={styles.searchActions} data-layout={layout}>\n {buttons}\n {collapseDom}\n </div>\n )}\n </Form>\n );\n};\n\nexport default SearchForm;\n"],"mappings":";;;;;;;;;;AAkCA,MAAM,gBAAgB,UAAkB;CACtC,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,QAAQ,KAAK,OAAO;CACxB,IAAI,QAAQ,KAAK,OAAO;CACxB,IAAI,QAAQ,MAAM,OAAO;CACzB,OAAO;AACT;;AAGA,MAAM,mBAAuD;CAC3D,CAAC,OAAO,IAAI;CACZ,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,CAAC;AACV;;;;;;AAOA,MAAa,eACX,MACA,UACuB;CACvB,IAAI,SAAS,KAAA,KAAa,OAAO,SAAS,UAAU,OAAO,QAAQ,KAAA;CACnE,MAAM,UAAU,iBAAiB,WAAW,GAAG,SAAS,SAAS,GAAG;CACpE,MAAM,QAAQ,YAAY,KAAK,iBAAiB,SAAS,IAAI;CAC7D,KAAK,IAAI,IAAI,OAAO,IAAI,iBAAiB,QAAQ,KAAK;EACpD,MAAM,QAAQ,KAAK,iBAAiB,EAAE,CAAC;EACvC,IAAI,OAAO,OAAO;CACpB;CACA,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;EACnC,MAAM,QAAQ,KAAK,iBAAiB,EAAE,CAAC;EACvC,IAAI,OAAO,OAAO;CACpB;AAEF;AAEA,MAAM,iBAAiB;CACrB,MAAM,MAAM,OAAwB,IAAI;CACxC,MAAM,CAAC,OAAO,YAAY,SAAS,CAAC;CACpC,gBAAgB;EACd,MAAM,OAAO,IAAI;EACjB,IAAI,CAAC,QAAQ,OAAO,mBAAmB,aAAa;EACpD,MAAM,WAAW,IAAI,gBAAgB,CAAC,WAAW,SAAS,MAAM,YAAY,KAAK,CAAC;EAClF,SAAS,QAAQ,IAAI;EACrB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,CAAC;CACL,OAAO;EAAE;EAAK;CAAM;AACtB;;AAGA,MAAa,eAAe,EAAE,WAC5B,oBAAC,QAAD;CACE,WAAW,OAAO;CAClB,eAAe,UAAU;EACvB,MAAM,KAAK,MAAM;EACjB,MAAM,MAAM,GAAG,QAAQ,OAAO,KAAK;EACnC,IAAI,IAAI,cAAc,IAAI,aAAa,GAAG,QAAQ;OAC7C,GAAG,gBAAgB,OAAO;CACjC;CAEC,UAAA;AACG,CAAA;;AAIR,MAAM,wBAAwB,UAAkB;CAC9C,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,QAAQ,KAAK,OAAO;CACxB,IAAI,QAAQ,KAAK,OAAO;CACxB,IAAI,QAAQ,MAAM,OAAO;CACzB,OAAO;AACT;;AAGA,MAAM,cAAc,EAClB,QACA,QACA,MACA,aACA,QAAQ,YACR,SACA,QACA,cACqB;CACrB,MAAM,EAAE,KAAK,UAAU,SAAS;CAChC,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,OAAO,oBAAoB,IAAI;CACpF,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,gBAAgB,SAAkB;EACtC,kBAAkB,IAAI;EACtB,OAAO,aAAa,IAAI;CAC1B;CAEA,MAAM,OAAO,YAAY,OAAO,MAAM,KAAK;CAC3C,MAAM,OAAO,OACT,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,CAAC,IACjC,OAAO,WAAW,aAChB,qBAAqB,KAAK,IAC1B,aAAa,KAAK;CACxB,MAAM,SAAS,OAAO,UAAU,eAAe,SAAS,IAAI,aAAa;CAEzE,MAAM,aAAa,OAAO,cAAc;CAGxC,MAAM,eAAe,OAAO,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC;CACrE,IAAI,OAAO;CACX,MAAM,aAAa,OAAO,KAAK,EAAE,aAAa;EAC5C,QAAQ,KAAK,IAAI,OAAO,WAAW,GAAG,IAAI;EAC1C,OAAO,CAAC,aAAa,QAAQ;CAC/B,CAAC;CACD,MAAM,cACJ,OAAO,QAAQ,KAAK,EAAE,aAAa,MAAM,KAAK,IAAI,OAAO,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI;CAErF,MAAM,eAAe,KAAK,KAAK,OAAO;CAEtC,MAAM,WACJ,oBAAC,QAAD;EAAoB,SAAS;EAC1B,UAAA,OAAO,aAAa,OAAO;CACtB,GAFI,OAEJ;CAEV,MAAM,YACJ,oBAAC,QAAD;EAAQ,UAAS;EAA+B;EAAS,MAAK;EAC3D,UAAA,OAAO,cAAc,OAAO,cAAc,OAAO;CAC5C,GAFsB,QAEtB;CAEV,MAAM,UACJ,OAAO,iBAAiB,QACpB,CAAC,IACD,OAAO,eACL,OAAO,aAAa;EAAE;EAAM;EAAS,UAAU;CAAO,GAAG,CAAC,UAAU,SAAS,CAAC,IAC9E,CAAC,UAAU,SAAS;CAE5B,IAAI,cAAyB;CAC7B,IAAI,eAAe,OAAO,mBAAmB,OAC3C,cACE,oBAAC,QAAD;EACE,MAAM,YAAY,cAAc;EAChC,cAAa;EAEb,MAAK;EACL,eAAe,aAAa,CAAC,SAAS;EAErC,UAAA,OAAO,iBACJ,OAAO,eAAe,SAAS,IAC/B,YACE,OAAO,SACP,OAAO;CACP,GATF,UASE;CAIZ,MAAM,YAAY;EAChB,gCACE,WAAW,cAAc,eAAe,SAAS,SAAS,GAAG,WAAW;EAC1E,aAAa;EACb,WAAW;EACX,UAAU;EACV,uBAAuB,UAAU,KAAK;CACxC;CAEA,OACE,qBAAC,MAAD;EACE,WAAW,OAAO;EAClB,yBAAsB;EAChB;EACE;EACH;EACL,OAAO;EACP,SAAQ;EAPV,UAAA;GASG,OAAO,KAAK,EAAE,QAAQ,QAAQ,UAAU;IACvC,IAAI,CAAC,WAAW,QAAQ,OAAO;IAC/B,MAAM,QAAQ,OAAO,eAAe,SAAS,OAAO;IACpD,MAAM,EAAE,UAAU,aAAa,cAC3B;KAAE,UAAU,KAAA;KAAW,UAAU,KAAA;IAAU,IAC3C,kBAAkB,OAAO,eAAe,OAAO,OAAO,eAAe,QAAQ;IACjF,OACE,oBAAC,OAAD;KACE,WAAW,OAAO;KAClB,eAAa;KAEb,OAAO;MACL,YAAY,QAAQ,KAAK,IAAI,OAAO,WAAW,GAAG,IAAI;MACtD,GAAG,OAAO,eAAe;KAC3B;KAEA,UAAA,oBAAC,KAAK,OAAN;MACE,OAAO,OAAO,eAAe;MAC7B,OAAO,OAAO,UAAU,WAAW,oBAAC,aAAD,EAAa,MAAM,MAAQ,CAAA,IAAI;MAC1D;MACF;MACI;MACA;MACV,SAAS,EAAE,OAAO,UAAU,aAC1B,oBAAC,OAAD;OAAa;OACX,UAAA,oBAAC,cAAD;QACU;QACF;QACC;QACP,aAAa;SACX,OAAO,OAAO;SACd,QAAQ,OAAO;QACjB;QACU;OACX,CAAA;MACE,CAAA;KAER,CAAA;IACE,GA5BE,IA4BF;GAET,CAAC;GAED,oBAAC,UAAD;IAAQ,QAAA;IAAO,MAAK;GAAU,CAAA;IAC5B,QAAQ,SAAS,KAAK,gBACtB,qBAAC,OAAD;IAAK,WAAW,OAAO;IAAe,eAAa;IAAnD,UAAA,CACG,SACA,WACE;;EAEH;;AAEV"}
@@ -1,3 +1,4 @@
1
- import { ProColumnType, ProColumns, ProTableActionType, ProTableAlertRender, ProTableAlertRenderProps, ProTableColumnsState, ProTableColumnsStateItem, ProTableColumnsStateMap, ProTableDensity, ProTableFormInstance, ProTableLocale, ProTableOptionConfig, ProTablePageInfo, ProTableProps, ProTableRequest, ProTableRequestData, ProTableSchemaConfig, ProTableSearchConfig, ProTableSearchTransform, ProTableStatus, ProTableToolbarConfig, ProTableValueEnum, ProTableValueEnumItem, ProTableValueType } from "./type.mjs";
1
+ import { ProColumnRequest, ProColumnType, ProColumns, ProTableActionType, ProTableAlertRender, ProTableAlertRenderProps, ProTableColumnsState, ProTableColumnsStateItem, ProTableColumnsStateMap, ProTableDensity, ProTableFormInstance, ProTableLoadingConfig, ProTableLocale, ProTableOptionConfig, ProTablePageInfo, ProTableProps, ProTableRequest, ProTableRequestData, ProTableRequestFilter, ProTableRequestOption, ProTableRequestSort, ProTableSchemaConfig, ProTableSearchConfig, ProTableSearchTransform, ProTableSpanBreakpoint, ProTableSpanConfig, ProTableStatus, ProTableToolbarConfig, ProTableValueEnum, ProTableValueEnumItem, ProTableValueType } from "./type.mjs";
2
+ import { PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, ProTableLocaleResolved, resolveProTableLocale } from "./locale.mjs";
2
3
  import ProTable, { DEFAULT_PRO_TABLE_LOCALE } from "./ProTable.mjs";
3
- export { DEFAULT_PRO_TABLE_LOCALE, type ProColumnType, type ProColumns, ProTable, type ProTableActionType, type ProTableAlertRender, type ProTableAlertRenderProps, type ProTableColumnsState, type ProTableColumnsStateItem, type ProTableColumnsStateMap, type ProTableDensity, type ProTableFormInstance, type ProTableLocale, type ProTableOptionConfig, type ProTablePageInfo, type ProTableProps, type ProTableRequest, type ProTableRequestData, type ProTableSchemaConfig, type ProTableSearchConfig, type ProTableSearchTransform, type ProTableStatus, type ProTableToolbarConfig, type ProTableValueEnum, type ProTableValueEnumItem, type ProTableValueType, ProTable as default };
4
+ export { DEFAULT_PRO_TABLE_LOCALE, PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, type ProColumnRequest, type ProColumnType, type ProColumns, ProTable, type ProTableActionType, type ProTableAlertRender, type ProTableAlertRenderProps, type ProTableColumnsState, type ProTableColumnsStateItem, type ProTableColumnsStateMap, type ProTableDensity, type ProTableFormInstance, type ProTableLoadingConfig, type ProTableLocale, type ProTableLocaleResolved, type ProTableOptionConfig, type ProTablePageInfo, type ProTableProps, type ProTableRequest, type ProTableRequestData, type ProTableRequestFilter, type ProTableRequestOption, type ProTableRequestSort, type ProTableSchemaConfig, type ProTableSearchConfig, type ProTableSearchTransform, type ProTableSpanBreakpoint, type ProTableSpanConfig, type ProTableStatus, type ProTableToolbarConfig, type ProTableValueEnum, type ProTableValueEnumItem, type ProTableValueType, ProTable as default, resolveProTableLocale };
@@ -1 +1,3 @@
1
- export { DEFAULT_PRO_TABLE_LOCALE, default as ProTable, default } from "./ProTable.mjs";
1
+ import { PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, resolveProTableLocale } from "./locale.mjs";
2
+ import ProTable, { DEFAULT_PRO_TABLE_LOCALE } from "./ProTable.mjs";
3
+ export { DEFAULT_PRO_TABLE_LOCALE, PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, ProTable, ProTable as default, resolveProTableLocale };
@@ -0,0 +1,18 @@
1
+ import { ProTableLocale } from "./type.mjs";
2
+ import { ReactNode } from "react";
3
+ //#region src/base-ui/ProTable/locale.d.ts
4
+ type ProTableLocaleResolved = Required<Omit<ProTableLocale, 'alertSelected'>> & {
5
+ alertSelected: (count: number) => ReactNode;
6
+ };
7
+ declare const PRO_TABLE_LOCALE_EN_US: ProTableLocaleResolved;
8
+ declare const PRO_TABLE_LOCALE_ZH_CN: ProTableLocaleResolved;
9
+ /** Built-in presets keyed by BCP 47 tag. */
10
+ declare const PRO_TABLE_LOCALES: {
11
+ readonly 'en-US': ProTableLocaleResolved;
12
+ readonly 'zh-CN': ProTableLocaleResolved;
13
+ };
14
+ /** Picks the preset for a ConfigProvider `locale` (`zh`, `zh-CN`, `zh_TW` … → zh-CN; else en-US). */
15
+ declare const resolveProTableLocale: (language?: string) => ProTableLocaleResolved;
16
+ //#endregion
17
+ export { PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, ProTableLocaleResolved, resolveProTableLocale };
18
+ //# sourceMappingURL=locale.d.mts.map
@@ -0,0 +1,68 @@
1
+ //#region src/base-ui/ProTable/locale.ts
2
+ const PRO_TABLE_LOCALE_EN_US = {
3
+ alertClear: "Clear",
4
+ alertSelected: (count) => `${count} selected`,
5
+ collapse: "Collapse",
6
+ columnSetting: "Column settings",
7
+ columnSettingReset: "Reset",
8
+ columnSettingTitle: "Columns",
9
+ copy: "Copy",
10
+ density: "Density",
11
+ densityLarge: "Large",
12
+ densityMedium: "Medium",
13
+ densitySmall: "Compact",
14
+ expand: "Expand",
15
+ fixedEnd: "Pin to end",
16
+ fixedEndTitle: "Pinned to end",
17
+ fixedStart: "Pin to start",
18
+ fixedStartTitle: "Pinned to start",
19
+ fullScreen: "Full screen",
20
+ moveDown: "Move down",
21
+ moveUp: "Move up",
22
+ noFixed: "Unpin",
23
+ reload: "Reload",
24
+ reset: "Reset",
25
+ search: "Search",
26
+ searchPlaceholder: "Please enter",
27
+ selectPlaceholder: "Please select",
28
+ unfixedTitle: "Not pinned"
29
+ };
30
+ const PRO_TABLE_LOCALE_ZH_CN = {
31
+ alertClear: "取消选择",
32
+ alertSelected: (count) => `已选择 ${count} 项`,
33
+ collapse: "收起",
34
+ columnSetting: "列设置",
35
+ columnSettingReset: "重置",
36
+ columnSettingTitle: "列展示",
37
+ copy: "复制",
38
+ density: "密度",
39
+ densityLarge: "宽松",
40
+ densityMedium: "中等",
41
+ densitySmall: "紧凑",
42
+ expand: "展开",
43
+ fixedEnd: "固定在列尾",
44
+ fixedEndTitle: "固定在右侧",
45
+ fixedStart: "固定在列首",
46
+ fixedStartTitle: "固定在左侧",
47
+ fullScreen: "全屏",
48
+ moveDown: "下移",
49
+ moveUp: "上移",
50
+ noFixed: "取消固定",
51
+ reload: "刷新",
52
+ reset: "重置",
53
+ search: "查询",
54
+ searchPlaceholder: "请输入",
55
+ selectPlaceholder: "请选择",
56
+ unfixedTitle: "不固定"
57
+ };
58
+ /** Built-in presets keyed by BCP 47 tag. */
59
+ const PRO_TABLE_LOCALES = {
60
+ "en-US": PRO_TABLE_LOCALE_EN_US,
61
+ "zh-CN": PRO_TABLE_LOCALE_ZH_CN
62
+ };
63
+ /** Picks the preset for a ConfigProvider `locale` (`zh`, `zh-CN`, `zh_TW` … → zh-CN; else en-US). */
64
+ const resolveProTableLocale = (language) => language && /^zh/i.test(language) ? PRO_TABLE_LOCALE_ZH_CN : PRO_TABLE_LOCALE_EN_US;
65
+ //#endregion
66
+ export { PRO_TABLE_LOCALES, PRO_TABLE_LOCALE_EN_US, PRO_TABLE_LOCALE_ZH_CN, resolveProTableLocale };
67
+
68
+ //# sourceMappingURL=locale.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.mjs","names":[],"sources":["../../../src/base-ui/ProTable/locale.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport type { ProTableLocale } from './type';\n\nexport type ProTableLocaleResolved = Required<Omit<ProTableLocale, 'alertSelected'>> & {\n alertSelected: (count: number) => ReactNode;\n};\n\nexport const PRO_TABLE_LOCALE_EN_US: ProTableLocaleResolved = {\n alertClear: 'Clear',\n alertSelected: (count) => `${count} selected`,\n collapse: 'Collapse',\n columnSetting: 'Column settings',\n columnSettingReset: 'Reset',\n columnSettingTitle: 'Columns',\n copy: 'Copy',\n density: 'Density',\n densityLarge: 'Large',\n densityMedium: 'Medium',\n densitySmall: 'Compact',\n expand: 'Expand',\n fixedEnd: 'Pin to end',\n fixedEndTitle: 'Pinned to end',\n fixedStart: 'Pin to start',\n fixedStartTitle: 'Pinned to start',\n fullScreen: 'Full screen',\n moveDown: 'Move down',\n moveUp: 'Move up',\n noFixed: 'Unpin',\n reload: 'Reload',\n reset: 'Reset',\n search: 'Search',\n searchPlaceholder: 'Please enter',\n selectPlaceholder: 'Please select',\n unfixedTitle: 'Not pinned',\n};\n\nexport const PRO_TABLE_LOCALE_ZH_CN: ProTableLocaleResolved = {\n alertClear: '取消选择',\n alertSelected: (count) => `已选择 ${count} 项`,\n collapse: '收起',\n columnSetting: '列设置',\n columnSettingReset: '重置',\n columnSettingTitle: '列展示',\n copy: '复制',\n density: '密度',\n densityLarge: '宽松',\n densityMedium: '中等',\n densitySmall: '紧凑',\n expand: '展开',\n fixedEnd: '固定在列尾',\n fixedEndTitle: '固定在右侧',\n fixedStart: '固定在列首',\n fixedStartTitle: '固定在左侧',\n fullScreen: '全屏',\n moveDown: '下移',\n moveUp: '上移',\n noFixed: '取消固定',\n reload: '刷新',\n reset: '重置',\n search: '查询',\n searchPlaceholder: '请输入',\n selectPlaceholder: '请选择',\n unfixedTitle: '不固定',\n};\n\n/** Built-in presets keyed by BCP 47 tag. */\nexport const PRO_TABLE_LOCALES = {\n 'en-US': PRO_TABLE_LOCALE_EN_US,\n 'zh-CN': PRO_TABLE_LOCALE_ZH_CN,\n} as const;\n\n/** Picks the preset for a ConfigProvider `locale` (`zh`, `zh-CN`, `zh_TW` … → zh-CN; else en-US). */\nexport const resolveProTableLocale = (language?: string): ProTableLocaleResolved =>\n language && /^zh/i.test(language) ? PRO_TABLE_LOCALE_ZH_CN : PRO_TABLE_LOCALE_EN_US;\n"],"mappings":";AAQA,MAAa,yBAAiD;CAC5D,YAAY;CACZ,gBAAgB,UAAU,GAAG,MAAM;CACnC,UAAU;CACV,eAAe;CACf,oBAAoB;CACpB,oBAAoB;CACpB,MAAM;CACN,SAAS;CACT,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,UAAU;CACV,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,UAAU;CACV,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;AAChB;AAEA,MAAa,yBAAiD;CAC5D,YAAY;CACZ,gBAAgB,UAAU,OAAO,MAAM;CACvC,UAAU;CACV,eAAe;CACf,oBAAoB;CACpB,oBAAoB;CACpB,MAAM;CACN,SAAS;CACT,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,UAAU;CACV,eAAe;CACf,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,UAAU;CACV,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,mBAAmB;CACnB,cAAc;AAChB;;AAGA,MAAa,oBAAoB;CAC/B,SAAS;CACT,SAAS;AACX;;AAGA,MAAa,yBAAyB,aACpC,YAAY,OAAO,KAAK,QAAQ,IAAI,yBAAyB"}
@@ -164,6 +164,11 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
164
164
  gap: 16px;
165
165
  min-width: 0;
166
166
 
167
+ /* Query form → toolbar / table: 24px (16px gap + 8px), parts below keep 16px. */
168
+ & > :has(> [data-pro-table-search]) {
169
+ margin-block-end: 8px;
170
+ }
171
+
167
172
  &[data-fullscreen] {
168
173
  overflow: auto;
169
174
  padding: 16px;
@@ -182,6 +187,21 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
182
187
  gap: 8px;
183
188
  align-items: center;
184
189
  justify-content: flex-end;
190
+
191
+ /* Vertical: buttons sit on the control line of the last row (Pro adds a blank label). */
192
+ &[data-layout='vertical'] {
193
+ align-self: end;
194
+ }
195
+ `,
196
+ searchLabelText: css`
197
+ overflow: hidden;
198
+ display: block;
199
+
200
+ min-width: 0;
201
+ max-width: 100%;
202
+
203
+ text-overflow: ellipsis;
204
+ white-space: nowrap;
185
205
  `,
186
206
  searchField: css`
187
207
  min-width: 0;
@@ -207,6 +227,24 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
207
227
  text-align: end;
208
228
  }
209
229
 
230
+ /* A long label never leaves the form: a block label clips and ellipsizes at the END of
231
+ the text (text-align only moves short labels; it never shifts overflow to the start). */
232
+ && > div > label {
233
+ min-width: 0;
234
+ max-width: 100%;
235
+ }
236
+
237
+ && > div > label * {
238
+ min-width: 0;
239
+ max-width: 100%;
240
+ }
241
+
242
+ /* Vertical (Pro QueryFilter vertical): label on its own line, full-width control. */
243
+ &[data-layout='vertical'] > div > label {
244
+ width: 100%;
245
+ text-align: start;
246
+ }
247
+
210
248
  & > div > div {
211
249
  flex: 1;
212
250
  align-items: stretch;