@lobehub/ui 5.61.1 → 5.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/es/base-ui/ProTable/ColumnSetting.mjs +156 -0
  2. package/es/base-ui/ProTable/ColumnSetting.mjs.map +1 -0
  3. package/es/base-ui/ProTable/FieldControl.mjs +108 -0
  4. package/es/base-ui/ProTable/FieldControl.mjs.map +1 -0
  5. package/es/base-ui/ProTable/LightFilter.mjs +71 -0
  6. package/es/base-ui/ProTable/LightFilter.mjs.map +1 -0
  7. package/es/base-ui/ProTable/OptionPopover.mjs +21 -0
  8. package/es/base-ui/ProTable/OptionPopover.mjs.map +1 -0
  9. package/es/base-ui/ProTable/ProTable.d.mts +13 -0
  10. package/es/base-ui/ProTable/ProTable.mjs +651 -0
  11. package/es/base-ui/ProTable/ProTable.mjs.map +1 -0
  12. package/es/base-ui/ProTable/SearchForm.mjs +138 -0
  13. package/es/base-ui/ProTable/SearchForm.mjs.map +1 -0
  14. package/es/base-ui/ProTable/index.d.mts +3 -0
  15. package/es/base-ui/ProTable/index.mjs +1 -0
  16. package/es/base-ui/ProTable/renderValue.mjs +118 -0
  17. package/es/base-ui/ProTable/renderValue.mjs.map +1 -0
  18. package/es/base-ui/ProTable/style.mjs +373 -0
  19. package/es/base-ui/ProTable/style.mjs.map +1 -0
  20. package/es/base-ui/ProTable/type.d.mts +343 -0
  21. package/es/base-ui/ProTable/useFetchData.mjs +98 -0
  22. package/es/base-ui/ProTable/useFetchData.mjs.map +1 -0
  23. package/es/base-ui/ProTable/useSearchForm.mjs +151 -0
  24. package/es/base-ui/ProTable/useSearchForm.mjs.map +1 -0
  25. package/es/base-ui/ProTable/utils.mjs +102 -0
  26. package/es/base-ui/ProTable/utils.mjs.map +1 -0
  27. package/es/base-ui/Table/Table.mjs +6 -2
  28. package/es/base-ui/Table/Table.mjs.map +1 -1
  29. package/es/base-ui/Text/style.d.mts +1 -1
  30. package/es/dashboard/ConsoleShell/style.mjs +3 -1
  31. package/es/dashboard/ConsoleShell/style.mjs.map +1 -1
  32. package/es/dashboard/MetricStrip/MetricCell.mjs +25 -14
  33. package/es/dashboard/MetricStrip/MetricCell.mjs.map +1 -1
  34. package/es/dashboard/MetricStrip/style.mjs +14 -0
  35. package/es/dashboard/MetricStrip/style.mjs.map +1 -1
  36. package/es/dashboard/MetricStrip/type.d.mts +2 -0
  37. package/es/dashboard/StatCard/StatCard.d.mts +1 -1
  38. package/es/dashboard/StatCard/StatCard.mjs +2 -1
  39. package/es/dashboard/StatCard/StatCard.mjs.map +1 -1
  40. package/es/dashboard/StatCard/type.d.mts +2 -0
  41. package/es/dashboard/Surface/style.d.mts +3 -2
  42. package/es/dashboard/Surface/style.mjs +7 -3
  43. package/es/dashboard/Surface/style.mjs.map +1 -1
  44. package/package.json +5 -1
@@ -0,0 +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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"}
@@ -0,0 +1,138 @@
1
+ import Button from "../Button/Button.mjs";
2
+ import { Form } from "../FormKit/index.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import FieldControl from "./FieldControl.mjs";
5
+ import { rulesToFieldProps } from "./useSearchForm.mjs";
6
+ import { useEffect, useRef, useState } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { ChevronDown, ChevronUp } from "lucide-react";
9
+ //#region src/base-ui/ProTable/SearchForm.tsx
10
+ /** Pro `QueryFilter` breakpoints: columns per row for the form width. */
11
+ const colsForWidth = (width) => {
12
+ if (width <= 0) return 3;
13
+ if (width < 576) return 1;
14
+ if (width < 900) return 2;
15
+ if (width < 1200) return 3;
16
+ return 4;
17
+ };
18
+ const useWidth = () => {
19
+ const ref = useRef(null);
20
+ const [width, setWidth] = useState(0);
21
+ useEffect(() => {
22
+ const node = ref.current;
23
+ if (!node || typeof ResizeObserver === "undefined") return;
24
+ const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));
25
+ observer.observe(node);
26
+ return () => observer.disconnect();
27
+ }, []);
28
+ return {
29
+ ref,
30
+ width
31
+ };
32
+ };
33
+ /** 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 }) => {
35
+ const { ref, width } = useWidth();
36
+ const [innerCollapsed, setInnerCollapsed] = useState(config.defaultCollapsed ?? true);
37
+ const collapsed = config.collapsed ?? innerCollapsed;
38
+ const setCollapsed = (next) => {
39
+ setInnerCollapsed(next);
40
+ config.onCollapse?.(next);
41
+ };
42
+ const cols = config.span ? Math.max(1, Math.round(24 / config.span)) : colsForWidth(width);
43
+ const layout = config.layout ?? (cols === 1 ? "vertical" : "horizontal");
44
+ const labelWidth = config.labelWidth ?? 80;
45
+ const visibleCount = config.defaultColsNumber ?? Math.max(1, cols - 1);
46
+ let used = 0;
47
+ const visibility = fields.map(({ column }) => {
48
+ used += Math.min(column.colSize ?? 1, cols);
49
+ return !collapsed || used <= visibleCount;
50
+ });
51
+ const collapsible = fields.reduce((sum, { column }) => sum + Math.min(column.colSize ?? 1, cols), 0) > visibleCount;
52
+ const submit = () => void form.submit();
53
+ const resetDom = /* @__PURE__ */ jsx(Button, {
54
+ onClick: onReset,
55
+ children: config.resetText ?? locale.reset
56
+ }, "reset");
57
+ const submitDom = /* @__PURE__ */ jsx(Button, {
58
+ htmlType: "submit",
59
+ loading,
60
+ type: "primary",
61
+ children: config.searchText ?? config.submitText ?? locale.search
62
+ }, "submit");
63
+ const buttons = config.optionRender === false ? [] : config.optionRender ? config.optionRender({
64
+ form,
65
+ onReset,
66
+ onSubmit: submit
67
+ }, [resetDom, submitDom]) : [resetDom, submitDom];
68
+ let collapseDom = null;
69
+ if (collapsible && config.collapseRender !== false) collapseDom = /* @__PURE__ */ jsx(Button, {
70
+ icon: collapsed ? ChevronDown : ChevronUp,
71
+ iconPosition: "end",
72
+ type: "link",
73
+ onClick: () => setCollapsed(!collapsed),
74
+ children: config.collapseRender ? config.collapseRender(collapsed) : collapsed ? locale.expand : locale.collapse
75
+ }, "collapse");
76
+ const gridStyle = {
77
+ "--lobe-pro-table-label-width": layout === "vertical" || labelWidth === "auto" ? "auto" : `${labelWidth}px`,
78
+ "display": "grid",
79
+ "gridTemplateColumns": `repeat(${cols}, minmax(0, 1fr))`
80
+ };
81
+ return /* @__PURE__ */ jsxs(Form, {
82
+ className: styles.search,
83
+ "data-pro-table-search": "",
84
+ form,
85
+ layout,
86
+ ref,
87
+ style: gridStyle,
88
+ variant: "borderless",
89
+ children: [
90
+ fields.map(({ column, name }, index) => {
91
+ if (!visibility[index]) return null;
92
+ const label = column.formItemProps?.label ?? column.title;
93
+ const { required, validate } = rulesToFieldProps(column.formItemProps?.rules, column.formItemProps?.required);
94
+ return /* @__PURE__ */ jsx("div", {
95
+ className: styles.searchField,
96
+ "data-layout": layout,
97
+ style: {
98
+ gridColumn: `span ${Math.min(column.colSize ?? 1, cols)}`,
99
+ ...column.formItemProps?.style
100
+ },
101
+ children: /* @__PURE__ */ jsx(Form.Field, {
102
+ extra: column.formItemProps?.extra,
103
+ label,
104
+ layout,
105
+ name,
106
+ required,
107
+ validate,
108
+ render: ({ value, onChange, onBlur }) => /* @__PURE__ */ jsx("div", {
109
+ onBlur,
110
+ children: /* @__PURE__ */ jsx(FieldControl, {
111
+ column,
112
+ form,
113
+ value,
114
+ placeholder: {
115
+ input: locale.inputPlaceholder,
116
+ select: locale.selectPlaceholder
117
+ },
118
+ onChange
119
+ })
120
+ })
121
+ })
122
+ }, name);
123
+ }),
124
+ /* @__PURE__ */ jsx("button", {
125
+ hidden: true,
126
+ type: "submit"
127
+ }),
128
+ (buttons.length > 0 || collapseDom) && /* @__PURE__ */ jsxs("div", {
129
+ className: styles.searchActions,
130
+ children: [buttons, collapseDom]
131
+ })
132
+ ]
133
+ });
134
+ };
135
+ //#endregion
136
+ export { SearchForm as default };
137
+
138
+ //# sourceMappingURL=SearchForm.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,3 @@
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";
2
+ 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 };
@@ -0,0 +1 @@
1
+ export { DEFAULT_PRO_TABLE_LOCALE, default as ProTable, default } from "./ProTable.mjs";
@@ -0,0 +1,118 @@
1
+ import ActionIcon from "../ActionIcon/ActionIcon.mjs";
2
+ import Progress from "../Progress/Progress.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import { findValueEnum, formatDate, isEmptyValue, isNil, toDate } from "./utils.mjs";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { cx } from "antd-style";
7
+ import { Copy } from "lucide-react";
8
+ //#region src/base-ui/ProTable/renderValue.tsx
9
+ const STATUS_COLOR = {
10
+ Default: "var(--lobe-pro-table-status-default)",
11
+ Error: "var(--lobe-pro-table-status-error)",
12
+ Processing: "var(--lobe-pro-table-status-processing)",
13
+ Success: "var(--lobe-pro-table-status-success)",
14
+ Warning: "var(--lobe-pro-table-status-warning)"
15
+ };
16
+ const StatusText = ({ color, status, text }) => {
17
+ if (!status && !color) return /* @__PURE__ */ jsx(Fragment, { children: text });
18
+ return /* @__PURE__ */ jsxs("span", {
19
+ className: styles.status,
20
+ children: [/* @__PURE__ */ jsx("span", {
21
+ className: cx(styles.statusDot, status === "Processing" && styles.statusProcessing),
22
+ "data-status": status,
23
+ style: { background: color ?? STATUS_COLOR[status ?? "Default"] }
24
+ }), text]
25
+ });
26
+ };
27
+ const renderEnum = (valueEnum, value) => {
28
+ if (Array.isArray(value)) return /* @__PURE__ */ jsx("span", {
29
+ className: styles.enumList,
30
+ children: value.map((item) => /* @__PURE__ */ jsx("span", { children: renderEnum(valueEnum, item) }, String(item)))
31
+ });
32
+ const item = findValueEnum(valueEnum, value);
33
+ if (!item) return String(value);
34
+ return /* @__PURE__ */ jsx(StatusText, {
35
+ color: item.color,
36
+ status: item.status,
37
+ text: item.text
38
+ });
39
+ };
40
+ const formatNumber = (value, precision) => value.toLocaleString("en-US", {
41
+ maximumFractionDigits: precision ?? 20,
42
+ minimumFractionDigits: precision ?? 0
43
+ });
44
+ /** The cell rendering of a value for a `valueType` / `valueEnum` (Pro "read" mode). */
45
+ const renderValue = (value, options) => {
46
+ const { emptyText, fieldProps = {}, rowIndex, valueEnum, valueType } = options;
47
+ if (valueType === "index") return rowIndex + 1;
48
+ if (valueType === "indexBorder") return /* @__PURE__ */ jsx("span", {
49
+ className: styles.indexBorder,
50
+ "data-top": rowIndex < 3 ? "" : void 0,
51
+ children: rowIndex + 1
52
+ });
53
+ if (valueType === "option") return value;
54
+ if (isEmptyValue(value)) return emptyText;
55
+ if (valueEnum) return renderEnum(valueEnum, value);
56
+ switch (valueType) {
57
+ case "password": return "********";
58
+ case "digit": return typeof value === "number" ? formatNumber(value, fieldProps.precision) : value;
59
+ case "money": {
60
+ const symbol = fieldProps.customSymbol ?? "¥";
61
+ const number = Number(value);
62
+ if (Number.isNaN(number)) return value;
63
+ return `${number < 0 ? "-" : ""}${symbol}${formatNumber(Math.abs(number), fieldProps.precision ?? 2)}`;
64
+ }
65
+ case "percent": {
66
+ const number = Number(value);
67
+ if (Number.isNaN(number)) return value;
68
+ return `${formatNumber(number, fieldProps.precision)}%`;
69
+ }
70
+ case "progress": {
71
+ const number = Number(value);
72
+ return /* @__PURE__ */ jsx(Progress, {
73
+ percent: Number.isNaN(number) ? 0 : number,
74
+ size: "small",
75
+ style: { minWidth: 100 }
76
+ });
77
+ }
78
+ case "switch": return value ? fieldProps.checkedChildren ?? "On" : fieldProps.unCheckedChildren ?? "Off";
79
+ case "date":
80
+ case "dateTime":
81
+ case "time": {
82
+ const date = toDate(value);
83
+ if (!date) return String(value);
84
+ return formatDate(date, valueType === "dateTime", valueType === "time");
85
+ }
86
+ case "dateRange":
87
+ case "dateTimeRange":
88
+ if (!Array.isArray(value)) return String(value);
89
+ return value.map((item) => {
90
+ const date = toDate(item);
91
+ return date ? formatDate(date, valueType === "dateTimeRange") : "";
92
+ }).join(" ~ ");
93
+ case "code": return /* @__PURE__ */ jsx("code", {
94
+ className: styles.code,
95
+ children: String(value)
96
+ });
97
+ default: return isNil(value) || typeof value === "object" ? value : String(value);
98
+ }
99
+ };
100
+ const CopyableText = ({ children, label, text }) => /* @__PURE__ */ jsxs("span", {
101
+ className: styles.copyable,
102
+ children: [/* @__PURE__ */ jsx("span", {
103
+ className: styles.copyableText,
104
+ children
105
+ }), /* @__PURE__ */ jsx(ActionIcon, {
106
+ icon: Copy,
107
+ size: "small",
108
+ title: label,
109
+ onClick: (event) => {
110
+ event.stopPropagation();
111
+ navigator.clipboard?.writeText(text);
112
+ }
113
+ })]
114
+ });
115
+ //#endregion
116
+ export { CopyableText, StatusText, renderValue };
117
+
118
+ //# sourceMappingURL=renderValue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderValue.mjs","names":[],"sources":["../../../src/base-ui/ProTable/renderValue.tsx"],"sourcesContent":["import { cx } from 'antd-style';\nimport { Copy } from 'lucide-react';\nimport { type ReactNode } from 'react';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport Progress from '@/base-ui/Progress';\n\nimport { styles } from './style';\nimport type { ProTableStatus, ProTableValueEnum, ProTableValueType } from './type';\nimport { findValueEnum, formatDate, isEmptyValue, isNil, toDate } from './utils';\n\nconst STATUS_COLOR: Record<ProTableStatus, string> = {\n Default: 'var(--lobe-pro-table-status-default)',\n Error: 'var(--lobe-pro-table-status-error)',\n Processing: 'var(--lobe-pro-table-status-processing)',\n Success: 'var(--lobe-pro-table-status-success)',\n Warning: 'var(--lobe-pro-table-status-warning)',\n};\n\nexport const StatusText = ({\n color,\n status,\n text,\n}: {\n color?: string;\n status?: ProTableStatus;\n text: ReactNode;\n}) => {\n if (!status && !color) return <>{text}</>;\n return (\n <span className={styles.status}>\n <span\n className={cx(styles.statusDot, status === 'Processing' && styles.statusProcessing)}\n data-status={status}\n style={{ background: color ?? STATUS_COLOR[status ?? 'Default'] }}\n />\n {text}\n </span>\n );\n};\n\nconst renderEnum = (valueEnum: ProTableValueEnum, value: unknown): ReactNode => {\n if (Array.isArray(value)) {\n return (\n <span className={styles.enumList}>\n {value.map((item) => (\n <span key={String(item)}>{renderEnum(valueEnum, item)}</span>\n ))}\n </span>\n );\n }\n const item = findValueEnum(valueEnum, value);\n if (!item) return String(value);\n return <StatusText color={item.color} status={item.status} text={item.text} />;\n};\n\nexport interface RenderValueOptions {\n copyText?: string;\n emptyText: ReactNode;\n fieldProps?: Record<string, any>;\n /** Row position across pages, for `index` / `indexBorder`. */\n rowIndex: number;\n valueEnum?: ProTableValueEnum;\n valueType?: ProTableValueType;\n}\n\nconst formatNumber = (value: number, precision?: number) =>\n value.toLocaleString('en-US', {\n maximumFractionDigits: precision ?? 20,\n minimumFractionDigits: precision ?? 0,\n });\n\n/** The cell rendering of a value for a `valueType` / `valueEnum` (Pro \"read\" mode). */\nexport const renderValue = (value: any, options: RenderValueOptions): ReactNode => {\n const { emptyText, fieldProps = {}, rowIndex, valueEnum, valueType } = options;\n\n if (valueType === 'index') return rowIndex + 1;\n if (valueType === 'indexBorder')\n return (\n <span className={styles.indexBorder} data-top={rowIndex < 3 ? '' : undefined}>\n {rowIndex + 1}\n </span>\n );\n if (valueType === 'option') return value;\n\n if (isEmptyValue(value)) return emptyText;\n if (valueEnum) return renderEnum(valueEnum, value);\n\n switch (valueType) {\n case 'password': {\n return '********';\n }\n case 'digit': {\n return typeof value === 'number' ? formatNumber(value, fieldProps.precision) : value;\n }\n case 'money': {\n const symbol = fieldProps.customSymbol ?? '¥';\n const number = Number(value);\n if (Number.isNaN(number)) return value;\n return `${number < 0 ? '-' : ''}${symbol}${formatNumber(Math.abs(number), fieldProps.precision ?? 2)}`;\n }\n case 'percent': {\n const number = Number(value);\n if (Number.isNaN(number)) return value;\n return `${formatNumber(number, fieldProps.precision)}%`;\n }\n case 'progress': {\n const number = Number(value);\n return (\n <Progress\n percent={Number.isNaN(number) ? 0 : number}\n size=\"small\"\n style={{ minWidth: 100 }}\n />\n );\n }\n case 'switch': {\n return value ? (fieldProps.checkedChildren ?? 'On') : (fieldProps.unCheckedChildren ?? 'Off');\n }\n case 'date':\n case 'dateTime':\n case 'time': {\n const date = toDate(value);\n if (!date) return String(value);\n return formatDate(date, valueType === 'dateTime', valueType === 'time');\n }\n case 'dateRange':\n case 'dateTimeRange': {\n if (!Array.isArray(value)) return String(value);\n return value\n .map((item) => {\n const date = toDate(item);\n return date ? formatDate(date, valueType === 'dateTimeRange') : '';\n })\n .join(' ~ ');\n }\n case 'code': {\n return <code className={styles.code}>{String(value)}</code>;\n }\n default: {\n return isNil(value) || typeof value === 'object' ? value : String(value);\n }\n }\n};\n\nexport const CopyableText = ({\n children,\n label,\n text,\n}: {\n children: ReactNode;\n label: string;\n text: string;\n}) => (\n <span className={styles.copyable}>\n <span className={styles.copyableText}>{children}</span>\n <ActionIcon\n icon={Copy}\n size=\"small\"\n title={label}\n onClick={(event) => {\n event.stopPropagation();\n void navigator.clipboard?.writeText(text);\n }}\n />\n </span>\n);\n"],"mappings":"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"}