@jerry-fd/ui 0.4.2 → 0.4.4

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.
@@ -0,0 +1,377 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { g as FiltersState, F as FilterColumnDef, k as ColumnDataTypes } from './helpers-Bv-Ixm5L.js';
3
+ export { C as CascaderConfig, a as CascaderFieldNames, b as CascaderOption, c as DATE_FORMATS, d as DateDisplayFormat, e as DatePickerConfig, f as FilterColumnOption, I as InputNumberConfig, P as PickerType, R as RangeDatePickerConfig, S as SingleDatePickerConfig, h as formatDateRange, i as getDateDisplayFormat, j as getPickerInputFormat, u as useTransition } from './helpers-Bv-Ixm5L.js';
4
+ import { I as IconType } from './icon-BmaneZ4I.js';
5
+ import { a as Button } from './button-DMIeJ1gB.js';
6
+ import React__default, { ReactNode, Dispatch, SetStateAction } from 'react';
7
+ import * as antd from 'antd';
8
+ import { TableProps } from 'antd';
9
+ import { ColumnType } from 'antd/es/table';
10
+ import * as antd_es_table_interface from 'antd/es/table/interface';
11
+ import { TableCurrentDataSource, SorterResult } from 'antd/es/table/interface';
12
+ import * as _rc_component_pagination_lib_Options from '@rc-component/pagination/lib/Options';
13
+ import * as antd_es_pagination_Pagination from 'antd/es/pagination/Pagination';
14
+ import * as _rc_component_pagination from '@rc-component/pagination';
15
+ import * as antd_es_button from 'antd/es/button';
16
+ import * as _rc_component_table_lib_interface from '@rc-component/table/lib/interface';
17
+ import * as zustand from 'zustand';
18
+ import 'dayjs';
19
+ import 'antd/es/date-picker';
20
+ import 'tailwind-variants';
21
+
22
+ type ProgressHandler = (args: {
23
+ loaded: number;
24
+ /** Content-Length 可知时为实际字节数,否则为 0 */
25
+ total: number;
26
+ /** false 时表示服务端未返回 Content-Length(如 chunked 传输),total 不可信 */
27
+ lengthComputable: boolean;
28
+ /** lengthComputable 为 true 时为 0-100 的整数,否则为 null */
29
+ percentage: number | null;
30
+ }) => void;
31
+ type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
32
+ interface XhrRequestInit<T = unknown> extends RequestInit {
33
+ headers?: Record<string, string>;
34
+ method?: Method;
35
+ timeout?: number;
36
+ responseType?: XMLHttpRequestResponseType;
37
+ withCredentials?: boolean;
38
+ onUploadProgress?: ProgressHandler;
39
+ onDownloadProgress?: ProgressHandler;
40
+ validateResponse?: (response: T) => boolean;
41
+ /** 为 true 时 resolve 值携带 status 和 headers,方便取 Content-Disposition 等响应头 */
42
+ withResponseHeaders?: boolean;
43
+ }
44
+ declare class RequestError extends Error {
45
+ static ETIMEDOUT: string;
46
+ static ERR_NETWORK: string;
47
+ static ERR_BAD_OPTION_VALUE: string;
48
+ static ERR_BAD_OPTION: string;
49
+ static ECONNABORTED: string;
50
+ static ERR_FR_TOO_MANY_REDIRECTS: string;
51
+ static ERR_DEPRECATED: string;
52
+ static ERR_BAD_RESPONSE: string;
53
+ static ERR_BAD_REQUEST: string;
54
+ static ERR_CANCELED: string;
55
+ static REQUEST_CANCELED: string;
56
+ static ERR_NOT_SUPPORT: string;
57
+ static ERR_INVALID_URL: string;
58
+ message: string;
59
+ code?: string | number;
60
+ data?: unknown;
61
+ constructor(message: string, code?: string | number, data?: unknown);
62
+ }
63
+
64
+ type DataTableState = {
65
+ activeTabId: string;
66
+ tabs: Record<string, PerTabState>;
67
+ /** 状态变更版本号,subscribe 用于检测变化 */
68
+ stateVersion: number;
69
+ /** 最近一次变更原因 */
70
+ changeReason: TableChangeReason;
71
+ };
72
+ type TabExternal = Pick<PerTabState, 'loading' | 'syncing' | 'exporting' | 'disabled'>;
73
+ type DataTableActions = {
74
+ setActiveTab: (tabId: string) => void;
75
+ initTab: (tabId: string, initial: Partial<PerTabState>) => void;
76
+ /** 同步外部状态 (不递增 stateVersion,不触发 onTableChange) */
77
+ syncTabExternal: (tabId: string, external: TabExternal) => void;
78
+ setFilters: (tabId: string, filters: FiltersState) => void;
79
+ setPagination: (tabId: string, current: number, pageSize: number) => void;
80
+ setTableChange: (tabId: string, sorter: SorterState, extra: TableCurrentDataSource<BaseRecord>) => void;
81
+ setTableSize: (size: TableSize) => void;
82
+ setColumnVisibility: (key: string, visible: boolean) => void;
83
+ setColumnVisibilityState: (updater: ColumnVisibilityUpdater) => void;
84
+ toggleColumnVisibility: (key: string) => void;
85
+ resetTabUIState: (tabId?: string) => void;
86
+ };
87
+ type DataTableStoreState = DataTableState & DataTableActions;
88
+
89
+ type UseDataTableProps<TData extends BaseRecord = BaseRecord> = ReturnType<typeof useDataTable<TData>>;
90
+ declare function useDataTable<TData extends BaseRecord = BaseRecord>(options: UseDataTableOptions<TData>): {
91
+ store: zustand.StoreApi<DataTableStoreState>;
92
+ activeTabId: string;
93
+ tabList: TabMeta[];
94
+ columns: DataTableColumnType<TData>[];
95
+ filterColumns: FilterColumnDef<BaseRecord>[];
96
+ tableColumns: DataTableColumnType<TData>[];
97
+ tableProps: {
98
+ dataSource: TData[] | undefined;
99
+ rowKey: string | keyof TData | _rc_component_table_lib_interface.GetRowKey<TData> | undefined;
100
+ size: antd_es_button.ButtonSize;
101
+ pagination: false;
102
+ scroll: ({
103
+ x?: number | true | string;
104
+ y?: number | string;
105
+ } & {
106
+ scrollToFirstRowOnChange?: boolean;
107
+ }) | undefined;
108
+ virtual: boolean | undefined;
109
+ onChange: (pagination: antd.TablePaginationConfig, filters: Record<string, antd_es_table_interface.FilterValue | null>, sorter: antd_es_table_interface.SorterResult<TData> | antd_es_table_interface.SorterResult<TData>[], extra: TableCurrentDataSource<TData>) => void;
110
+ };
111
+ paginationProps: {
112
+ current: number;
113
+ pageSize: number;
114
+ total: number | undefined;
115
+ onChange: (current: number, pageSize: number) => void;
116
+ onShowSizeChange: (current: number, pageSize: number) => void;
117
+ size?: antd_es_button.ButtonSize;
118
+ className?: string | undefined;
119
+ style?: React__default.CSSProperties | undefined;
120
+ disabled?: boolean | undefined;
121
+ role?: string;
122
+ "aria-activedescendant"?: string | undefined;
123
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
124
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
125
+ "aria-braillelabel"?: string | undefined;
126
+ "aria-brailleroledescription"?: string | undefined;
127
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
128
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
129
+ "aria-colcount"?: number | undefined;
130
+ "aria-colindex"?: number | undefined;
131
+ "aria-colindextext"?: string | undefined;
132
+ "aria-colspan"?: number | undefined;
133
+ "aria-controls"?: string | undefined;
134
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
135
+ "aria-describedby"?: string | undefined;
136
+ "aria-description"?: string | undefined;
137
+ "aria-details"?: string | undefined;
138
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
139
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
140
+ "aria-errormessage"?: string | undefined;
141
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
142
+ "aria-flowto"?: string | undefined;
143
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
144
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
145
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
146
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
147
+ "aria-keyshortcuts"?: string | undefined;
148
+ "aria-label"?: string | undefined;
149
+ "aria-labelledby"?: string | undefined;
150
+ "aria-level"?: number | undefined;
151
+ "aria-live"?: "off" | "assertive" | "polite" | undefined;
152
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
153
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
154
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
155
+ "aria-orientation"?: "horizontal" | "vertical" | undefined;
156
+ "aria-owns"?: string | undefined;
157
+ "aria-placeholder"?: string | undefined;
158
+ "aria-posinset"?: number | undefined;
159
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
160
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
161
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
162
+ "aria-required"?: (boolean | "true" | "false") | undefined;
163
+ "aria-roledescription"?: string | undefined;
164
+ "aria-rowcount"?: number | undefined;
165
+ "aria-rowindex"?: number | undefined;
166
+ "aria-rowindextext"?: string | undefined;
167
+ "aria-rowspan"?: number | undefined;
168
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
169
+ "aria-setsize"?: number | undefined;
170
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
171
+ "aria-valuemax"?: number | undefined;
172
+ "aria-valuemin"?: number | undefined;
173
+ "aria-valuenow"?: number | undefined;
174
+ "aria-valuetext"?: string | undefined;
175
+ align?: "center" | "end" | "start" | undefined;
176
+ locale?: _rc_component_pagination.PaginationLocale | undefined;
177
+ classNames?: antd_es_pagination_Pagination.PaginationClassNamesType;
178
+ styles?: antd_es_pagination_Pagination.PaginationStylesType;
179
+ prevIcon?: React__default.ComponentType | React__default.ReactNode;
180
+ nextIcon?: React__default.ComponentType | React__default.ReactNode;
181
+ prefixCls?: string | undefined;
182
+ rootClassName?: string;
183
+ showSizeChanger?: boolean | antd.SelectProps;
184
+ pageSizeOptions?: (string | number)[];
185
+ selectPrefixCls?: string | undefined;
186
+ defaultCurrent?: number | undefined;
187
+ totalBoundaryShowSizeChanger?: number;
188
+ defaultPageSize?: number | undefined;
189
+ hideOnSinglePage?: boolean | undefined;
190
+ sizeChangerRender?: _rc_component_pagination_lib_Options.SizeChangerRender;
191
+ showLessItems?: boolean | undefined;
192
+ showPrevNextJumpers?: boolean | undefined;
193
+ showQuickJumper?: boolean | {
194
+ goButton?: React__default.ReactNode;
195
+ };
196
+ showTitle?: boolean | undefined;
197
+ simple?: boolean | {
198
+ readOnly?: boolean;
199
+ } | undefined;
200
+ jumpPrevIcon?: React__default.ComponentType | React__default.ReactNode;
201
+ jumpNextIcon?: React__default.ComponentType | React__default.ReactNode;
202
+ itemRender?: (page: number, type: "page" | "prev" | "next" | "jump-prev" | "jump-next", element: React__default.ReactNode) => React__default.ReactNode;
203
+ showTotal?: (total: number, range: [number, number]) => React__default.ReactNode;
204
+ responsive?: boolean;
205
+ selectComponentClass?: any;
206
+ };
207
+ defaultFilters: FiltersState;
208
+ onFiltersChange: React__default.Dispatch<React__default.SetStateAction<FiltersState>>;
209
+ toolbarItems: false | ToolbarItemConfig<any>[] | undefined;
210
+ onToolbarAction: (action: ToolbarAction) => void;
211
+ isCustomTab: boolean;
212
+ customRender: ((ctx: TabRenderContext) => React__default.ReactNode) | undefined;
213
+ tabRenderCtx: TabRenderContext;
214
+ enableTableAutoScrollSizer: boolean;
215
+ };
216
+
217
+ type BaseRecord = Record<string, unknown>;
218
+ type TableSize = TableProps['size'];
219
+ type ColumnVisibilityState = Record<string, boolean>;
220
+ type SorterState = SorterResult<BaseRecord> | SorterResult<BaseRecord>[];
221
+ type PaginationState = {
222
+ current: number;
223
+ pageSize: number;
224
+ };
225
+ type TableChangeReason = 'filter' | 'paginate' | 'sort' | 'tab_switch' | 'mount';
226
+ /** 单个 Tab 的完整状态 */
227
+ type PerTabState = {
228
+ pagination: PaginationState;
229
+ filters: FiltersState;
230
+ sorter: SorterState;
231
+ extra: TableCurrentDataSource<BaseRecord>;
232
+ tableSize: TableSize;
233
+ columnVisibility: ColumnVisibilityState;
234
+ loading?: boolean;
235
+ syncing?: boolean;
236
+ exporting?: boolean;
237
+ disabled?: boolean;
238
+ };
239
+ type ColumnVisibilityUpdater = ColumnVisibilityState | ((prev: ColumnVisibilityState) => ColumnVisibilityState);
240
+ type ToolbarAction<T extends BaseRecord = BaseRecord> = {
241
+ action: string;
242
+ payload?: T;
243
+ };
244
+ type DataTableFilterConfig = ColumnDataTypes & {
245
+ displayName?: string;
246
+ icon?: IconType;
247
+ pin?: boolean;
248
+ };
249
+ type SkeletonVariant = 'text' | 'avatar' | 'double-line' | 'group';
250
+ type DataTableColumnType<TData> = Omit<ColumnType<TData>, 'filterMode' | 'filterIcon' | 'defaultFilteredValue' | 'filteredValue' | 'filterMultiple' | 'filterOnClose' | 'filterDropdown' | 'filters' | 'filtered' | 'filterSearch' | 'onFilter' | 'filterDropdownProps' | 'filterDropdownOpen' | 'onFilterDropdownOpenChange' | 'filterResetToDefaultFilteredValue'> & {
251
+ /** 隐藏该列不在table里面显示, 如果有配置 filter 那么它仅会在 filter popover中显示 */
252
+ hidden?: boolean;
253
+ filter?: DataTableFilterConfig;
254
+ skeleton?: SkeletonVariant;
255
+ };
256
+ /** 传给 custom tab render 函数的上下文 */
257
+ type TabRenderContext = {
258
+ loading?: boolean;
259
+ syncing?: boolean;
260
+ exporting?: boolean;
261
+ disabled?: boolean;
262
+ filters: FiltersState;
263
+ pagination: PaginationState;
264
+ onFiltersChange: Dispatch<SetStateAction<FiltersState>>;
265
+ onPaginationChange: (current: number, pageSize: number) => void;
266
+ };
267
+ type TabConfigBase = {
268
+ id: string;
269
+ label: ReactNode;
270
+ value: string;
271
+ loading?: boolean;
272
+ syncing?: boolean;
273
+ exporting?: boolean;
274
+ disabled?: boolean;
275
+ total?: number;
276
+ defaultPagination?: PaginationState;
277
+ defaultFilters?: FiltersState;
278
+ toolbarItems?: false | ToolbarItemConfig<any>[];
279
+ enableTableAutoScrollSizer?: boolean;
280
+ };
281
+ type TableTabConfig<TData extends BaseRecord = BaseRecord> = TabConfigBase & {
282
+ type?: 'table';
283
+ rowKey?: TableProps<TData>['rowKey'];
284
+ columns: DataTableColumnType<TData>[];
285
+ dataSource?: TData[];
286
+ scroll?: TableProps<TData>['scroll'];
287
+ bordered?: boolean;
288
+ virtual?: boolean;
289
+ defaultSorter?: SorterState;
290
+ };
291
+ type CustomTabConfig = TabConfigBase & {
292
+ type: 'custom';
293
+ /** 显式提供,不从 columns 派生 */
294
+ filterColumns?: FilterColumnDef<BaseRecord>[];
295
+ render: (ctx: TabRenderContext) => ReactNode;
296
+ };
297
+ type TabConfig<TData extends BaseRecord = BaseRecord> = TableTabConfig<TData> | CustomTabConfig;
298
+ type UseDataTableOptions<TData extends BaseRecord = BaseRecord> = {
299
+ fireOnMount?: boolean;
300
+ storageKey?: string;
301
+ tabList: TabConfig<TData>[];
302
+ onTabChange?: (tabId: string) => void;
303
+ onTableChange?: (tabId: string, tabState: TableChangeState, reason: TableChangeReason) => void;
304
+ onToolbarAction?: (tabId: string, action: ToolbarAction) => void | Promise<void>;
305
+ };
306
+ /** Tab 元数据 (用于渲染 tab 列表) */
307
+ type TabMeta = Pick<TabConfig, 'id' | 'label' | 'value'>;
308
+ type NamedClass = 'root' | 'cardHeader' | 'cardHeading' | 'cardIcon' | 'cardToolbar' | 'cardContent' | 'cardSummary' | 'cardFooter' | 'tableSummary';
309
+ type DataTableProps<TData extends BaseRecord = BaseRecord> = UseDataTableProps<TData> & {
310
+ ref?: React.Ref<HTMLDivElement>;
311
+ size?: TableProps['size'];
312
+ variant?: 'default' | 'accent';
313
+ cardTitle?: React.ReactNode;
314
+ cardIcon?: React.ReactNode;
315
+ cardDescription?: React.ReactNode;
316
+ alwaysShowingColumns?: string[];
317
+ style?: React.CSSProperties & {
318
+ [key: `--${string}`]: string | number;
319
+ };
320
+ classNames?: Partial<Record<NamedClass, string>>;
321
+ slots?: Partial<Record<'cardSummary' | 'cardFooter' | 'tableSummary', React.ReactNode>>;
322
+ };
323
+ type ToolbarBuiltInActionType = 'data_refresh' | 'size_setting' | 'column_setting' | 'data_export' | 'data_import' | 'filter_btn';
324
+ /** 内置 toolbar item 配置 (data_import 专属字段在其他 type 下会被忽略) */
325
+ type BuiltInToolbarItem = {
326
+ type: Exclude<ToolbarBuiltInActionType, 'data_import'>;
327
+ key?: string;
328
+ btnProps?: Omit<React.ComponentProps<typeof Button>, 'onClick'>;
329
+ tooltip?: string;
330
+ hidden?: boolean;
331
+ };
332
+ type BuiltInToolbarImportItem = Omit<BuiltInToolbarItem, 'type'> & {
333
+ type: 'data_import';
334
+ /** accept 仅支持 mime 类型 eg: text/csv */
335
+ accept?: string;
336
+ acceptHint?: string;
337
+ onBeforeUpload?: (files: File[]) => boolean | Promise<File[]>;
338
+ requestConfig: Omit<XhrRequestInit, 'body'> & {
339
+ /** 上传地址 */
340
+ url: string;
341
+ /** 文件名 */
342
+ fieldName?: string;
343
+ body?: Record<string, unknown> | FormData;
344
+ onSuccess?: (response: unknown) => void;
345
+ onFailed?: (error: RequestError) => void;
346
+ /** 自定义验证服务端响应的数据是否正确 */
347
+ validateResponse?: (response: unknown) => boolean;
348
+ };
349
+ };
350
+ /** 自定义 toolbar item */
351
+ type CustomToolbarItem<TData = unknown> = {
352
+ type: 'custom';
353
+ key: string;
354
+ render: (ctx: ToolbarRenderContext<TData>) => React.ReactNode;
355
+ hidden?: boolean;
356
+ };
357
+ /** 渲染 context,传递给自定义组件 */
358
+ interface ToolbarRenderContext<TData = unknown> {
359
+ disabled?: boolean;
360
+ loading?: boolean;
361
+ syncing?: boolean;
362
+ exporting?: boolean;
363
+ columns: DataTableColumnType<TData>[];
364
+ onAction: (action: ToolbarAction) => void | Promise<void>;
365
+ }
366
+ type ToolbarItemConfig<TData = any> = ToolbarBuiltInActionType | BuiltInToolbarItem | BuiltInToolbarImportItem | CustomToolbarItem<TData>;
367
+ type TableChangeState = {
368
+ pagination: PaginationState;
369
+ filters: FiltersState;
370
+ sorter: SorterState;
371
+ };
372
+
373
+ declare function DataTable<TData extends BaseRecord = BaseRecord>(props: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
374
+
375
+ declare const DEFAULT_TOOLBAR_ITEMS: ToolbarItemConfig[];
376
+
377
+ export { DEFAULT_TOOLBAR_ITEMS, DataTable, type DataTableColumnType, FilterColumnDef, FiltersState, type PaginationState, type SorterState, type TabConfig, type TabMeta, type ToolbarItemConfig, type UseDataTableOptions, useDataTable };
package/data-table.js ADDED
@@ -0,0 +1,2 @@
1
+ import {e,b as b$1,c as c$1,j,f,g,h,l as l$1,d}from'./chunk-EM7GIZXE.js';import {O,V,k,l,p,s,c,r,t,q,U,n,T,m as m$1,o,M,i,D as D$1,E,v,F,w,x,z,y,A,B}from'./chunk-VZDC732G.js';export{P as DATE_FORMATS,R as formatDateRange,Q as getDateDisplayFormat,S as getPickerInputFormat,O as useTransition}from'./chunk-VZDC732G.js';import {b}from'./chunk-M7AD2PUT.js';import {Table,Pagination,Checkbox}from'antd';import {AnimatePresence,m}from'motion/react';import P,{useState,useCallback}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {create,useStore,createStore}from'zustand';import {useShallow}from'zustand/react/shallow';import {persist}from'zustand/middleware';import {immer}from'zustand/middleware/immer';import {Check,Upload,Download,RefreshCw,FolderUp}from'lucide-react';import {Progress,Portal}from'radix-ui';function mt(t){P.useEffect(t,[]);}var ca={initial:{opacity:0},animate:{opacity:1},exit:{opacity:0}},le={variants:ca,initial:"initial",animate:"animate",exit:"exit"},da={initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0}},ce={variants:da,initial:"initial",animate:"animate",exit:"exit"},pa={initial:{opacity:0,y:24},animate:{opacity:1,y:0},exit:{opacity:0,y:-24}},de={variants:pa,initial:"initial",animate:"animate",exit:"exit"};var ma={small:"min-h-22",medium:"min-h-26",middle:"min-h-30",large:"min-h-38"};function me({count:t,size:n="small",classNames:a,columns:e,scroll:o}){let r=P.useCallback(()=>ba(e,ma[n]),[e,n]);return jsx(Table,{rowKey:"id",size:n,rowHoverable:false,classNames:a,dataSource:Array.from({length:t},(s,c)=>({id:c})),pagination:false,scroll:o,children:e.map((s,c)=>jsx(Table.Column,{dataIndex:s.dataIndex,width:s.width,title:jsx(j,{className:"h-22 w-full animate-none bg-bg-antd"}),render:r,onCell:()=>c===0?{colSpan:e.length}:{colSpan:0}},s.key||s.dataIndex))})}var ue=16;function ba(t,n){let a=t.length,o=`calc((100% - ${ue*(a-1)}px) / ${a})`,r=t.some(s=>s.skeleton==="avatar"||s.skeleton==="double-line");return jsx("div",{className:c("flex items-center",n),style:{gap:`${ue}px`},children:t.map((s,c)=>{let l=s?.key??c;return jsx("div",{style:{width:o},children:fa(s.skeleton,r)},l)})})}function fa(t,n){switch(t){case "avatar":return jsx(ga,{});case "double-line":return jsx(ya,{});case "group":return jsx(Ca,{needAlignment:n});default:return jsx(Ta,{needAlignment:n})}}function Ta({needAlignment:t}){return jsxs("div",{className:"grid h-full gap-4",children:[t&&jsx("div",{className:"h-12 w-1"}),jsx(j,{className:"h-10"})]})}function ga(){return jsxs("div",{className:"flex w-full items-center gap-6",children:[jsx(j,{className:"shrink-0 rounded-full",style:{width:"var(--avatar-size, 32px)",height:"var(--avatar-size, 32px)"}}),jsxs("div",{className:"grid flex-1 gap-4",children:[jsx(j,{className:"h-12 w-[60%]"}),jsx(j,{className:"h-10"})]})]})}function ya(){return jsxs("div",{className:"grid h-full w-full gap-4 py-4",children:[jsx(j,{className:"h-12 w-[60%]"}),jsx(j,{className:"h-10"})]})}function Ca({needAlignment:t}){return jsxs("div",{className:"grid h-full gap-4",children:[t&&jsx("div",{className:"h-12 w-1"}),jsxs("div",{className:"flex w-full items-center gap-4",children:[jsx(j,{className:"h-10 w-[20%]"}),jsx(j,{className:"h-10 w-[20%]"}),jsx(j,{className:"h-10 w-[20%]"}),jsx(j,{className:"h-10 w-[20%]"}),jsx(j,{className:"h-10 w-[20%]"})]})]})}var $={pagination:{current:1,pageSize:10},filters:[],sorter:{},extra:{action:"paginate",currentDataSource:[]},tableSize:"middle",columnVisibility:{},exporting:false,loading:false,syncing:false,disabled:false},Q=(t,n)=>(t.tabs[n]||(t.tabs[n]={...$}),t.tabs[n]),Sa="APP_UI_TABLE_CONFIG",xa=(t,n)=>({activeTabId:n,tabs:{},stateVersion:0,changeReason:"mount",setActiveTab:a=>t(e=>{e.activeTabId=a,Q(e,a),e.changeReason="tab_switch",e.stateVersion++;}),syncTabExternal:(a,e)=>t(o=>{let r=o.tabs[a];r&&(r.loading=e.loading,r.syncing=e.syncing,r.exporting=e.exporting,r.disabled=e.disabled);}),initTab:(a,e)=>t(o=>{let r=o.tabs[a];r?(e.pagination&&(r.pagination=e.pagination),e.filters&&(r.filters=e.filters),e.sorter&&(r.sorter=e.sorter),r.loading=e.loading,r.syncing=e.syncing,r.exporting=e.exporting,r.disabled=e.disabled):o.tabs[a]={...$,...e};}),setFilters:(a,e)=>t(o=>{let r=Q(o,a);r.filters=e,r.pagination.current=1,o.changeReason="filter",o.stateVersion++;}),setPagination:(a,e,o)=>t(r=>{let s=Q(r,a);s.pagination={current:e,pageSize:o},r.changeReason="paginate",r.stateVersion++;}),setTableChange:(a,e,o)=>t(r=>{let s=Q(r,a);s.sorter=e,s.extra=o,r.changeReason="sort",r.stateVersion++;}),setTableSize:a=>t(e=>{Q(e,e.activeTabId).tableSize=a;}),setColumnVisibility:(a,e)=>t(o=>{Q(o,o.activeTabId).columnVisibility[a]=e;}),setColumnVisibilityState:a=>t(e=>{let o=Q(e,e.activeTabId);o.columnVisibility=typeof a=="function"?a(o.columnVisibility):a;}),toggleColumnVisibility:a=>t(e=>{let o=Q(e,e.activeTabId);o.columnVisibility[a]=!o.columnVisibility[a];}),resetTabUIState:a=>t(e=>{let o=a??e.activeTabId,r=e.tabs[o];r&&(r.tableSize=$.tableSize,r.columnVisibility={});})}),be=(t,n=Sa)=>createStore()(persist(immer(a=>xa(a,t)),{name:n,partialize:a=>({tableUIStatus:Object.fromEntries(Object.entries(a.tabs).map(([e,o])=>[e,{tableSize:o.tableSize,columnVisibility:o.columnVisibility}]))}),merge:(a,e)=>{let o=a,r={...e};if(!o?.tableUIStatus)return r;for(let[s,c]of Object.entries(o.tableUIStatus)){let l=r.tabs[s];l?(c.tableSize&&(l.tableSize=c.tableSize),c.columnVisibility&&(l.columnVisibility=c.columnVisibility)):r.tabs[s]={...$,tableSize:c.tableSize??$.tableSize,columnVisibility:c.columnVisibility??{}};}return r}}));var Te=P.createContext(null),ge=["id","action","actions"],ye=P.createContext({alwaysShowingColumns:ge});function Ce({store:t,tabList:n,alwaysShowingColumns:a,children:e}){let o=P.useMemo(()=>({tabList:n,alwaysShowingColumns:a??ge}),[n,a]);return jsx(ye.Provider,{value:o,children:jsx(Te.Provider,{value:t,children:e})})}function ft(){let t=P.useContext(Te);if(!t)throw new Error("useDataTableStoreApi must be used within DataTableProvider");return t}function J(t){let n=ft();return useStore(n,t)}function De(){let t=ft();return useStore(t,useShallow(n=>n.tabs[n.activeTabId]??$))}function he(){return J(t=>t.tabs[t.activeTabId]?.tableSize??$.tableSize)}function ve(){let t=ft();return useStore(t,useShallow(n=>n.tabs[n.activeTabId]?.columnVisibility??$.columnVisibility))}function Se(){let t=ft();return useStore(t,useShallow(n=>{let a=n.tabs[n.activeTabId];return {loading:a?.loading??false,syncing:a?.syncing??false,exporting:a?.exporting??false,disabled:a?.disabled??false}}))}function ot(){return P.useContext(ye)}function xe(t){let{tabList:n$1}=ot(),a=J(o=>o.activeTabId),e=J(o=>o.setActiveTab);return !n$1||!n$1?.length||n$1.length===1?null:jsx(n,{...t,children:jsx(f,{className:c("w-full"),value:a,onValueChange:e,children:jsx(g,{variant:"line",size:"medium",className:"w-full px-12",children:n$1.map(o=>jsx(h,{value:o.value,className:"py-8",children:o.label},o.id))})})})}var Z=create((t,n)=>({activeTableId:"",tasks:{},updateTableId:a=>t(()=>({activeTableId:a})),addTask:a=>t(e=>{let o=e.activeTableId;return {tasks:{...e.tasks,[o]:[...e.tasks[o]??[],a]}}}),removeTask:a=>t(e=>{let o=e.activeTableId;return {tasks:{...e.tasks,[o]:(e.tasks[o]??[]).filter(r=>r.localTaskId!==a)}}}),updateTask:(a,e)=>t(o=>{let r=o.activeTableId;return {tasks:{...o.tasks,[r]:(o.tasks[r]??[]).map(s=>s.localTaskId===a?{...s,...e}:s)}}}),getTasks:()=>{let a=n();return a.tasks[a.activeTableId]??[]}})),gt=()=>Z(useShallow(t=>t.tasks[t.activeTableId]??[]));function Re({className:t,...n}){let a=O(),[e,o]=P.useState(false),r=J(l=>l.setTableSize),s=he(),c$1=P.useMemo(()=>[{groupType:"radio",value:s,options:[{label:a("large"),value:"large"},{label:a("middle"),value:"middle"},{label:a("compact"),value:"small"}],onValueChange:r}],[r,a,s]);return jsx(l$1,{side:"bottom",align:"end",collisionPadding:6,items:c$1,className:"min-w-100",open:e,onOpenChange:o,children:jsxs(M,{mode:"stroke",variant:"neutral",size:"small",className:c("gap-0",t,e&&"active"),...n,children:[jsx(i,{content:a("density"),size:"small",children:jsx("div",{className:"absolute inset-0"})}),jsx("svg",{xmlns:"http://www.w3.org/2000/svg",className:"size-16",viewBox:"0 0 1024 1024",children:jsx("path",{d:"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 0 0-11.3 0L403.6 366.3a7.23 7.23 0 0 0 5.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z"})})]})})}function Pe(t,n){return new Promise((a,e)=>{let r=Object.assign({},{method:"GET",responseType:"json"},n),{method:s,timeout:c,responseType:l,headers:p,body:i,validateResponse:f}=r,h;function g(){r.signal&&r.signal.removeEventListener("abort",h);}if(r.signal&&r.signal.aborted)return e(new D("Aborted"));let m=new XMLHttpRequest,b=null,u=null;m.open(s.toUpperCase(),t,true),m.timeout=c||0,m.withCredentials=r.withCredentials===true,m.onloadend=function(){if(!m)return;let S=m.status,N=m.getResponseHeader("Content-Type")??"",F=l&&l!=="text"&&l!=="json",k=F?m.response:m.responseText,q=m.getAllResponseHeaders().split(`\r
2
+ `).reduce((y,x)=>{let V=x.indexOf(": ");return V!==-1&&(y[x.slice(0,V).toLowerCase()]=x.slice(V+2)),y},{});function L(y){if(b){b.cancel();let x=y instanceof Blob?y.size:y instanceof ArrayBuffer?y.byteLength:typeof y=="string"?y.length:0;r.onDownloadProgress?.({loaded:x,total:x,lengthComputable:true,percentage:100});}r.withResponseHeaders?a({data:y,status:S,headers:q}):a(y);}if(S>=200&&S<300)if(l==="json"){let y=k;try{let x=y!==""?JSON.parse(y):null;if(!(f?.(x)??!0))throw new D("invalid response");L(x);}catch(x){e(x);}}else f?.(k)??true?L(k):e(new D("invalid response"));else {let y=null;if(!F)if(N.includes("application/json"))try{y=k!==""?JSON.parse(k):null;}catch{}else y=k||null;e(new D("Xhr Request failed",S,y));}g(),m=null;},m.onabort=function(){m&&(b?.cancel(),u?.cancel(),e(new D(D.ECONNABORTED)),g(),m=null);},m.onerror=function(){b?.cancel(),u?.cancel(),e(new D("Network Error",D.ERR_NETWORK)),g(),m=null;},m.ontimeout=function(){b?.cancel(),u?.cancel(),e(new D("Timeout exceeded",D.ETIMEDOUT)),g(),m=null;},typeof p=="object"&&Object.keys(p).forEach(R=>{m?.setRequestHeader(R,p[R]);}),i==null&&m.setRequestHeader("Content-Type",""),l&&l!=="json"&&(m.responseType=l),r.onDownloadProgress&&(b=Ee(r.onDownloadProgress),m.addEventListener("progress",b)),r.onUploadProgress&&m.upload&&(u=Ee(r.onUploadProgress),m.upload.addEventListener("progress",u),m.upload.addEventListener("loadend",R=>{u?.cancel(),r.onUploadProgress?.({loaded:R.loaded,total:R.loaded,lengthComputable:true,percentage:100});})),r.signal&&(h=()=>{m&&(e(new D(D.REQUEST_CANCELED,D.REQUEST_CANCELED)),m.abort(),m=null);},r.signal.aborted?h():r.signal.addEventListener("abort",h)),m.send(i??null);})}function Ee(t){return d(a=>{t({loaded:a.loaded,total:a.lengthComputable?a.total:0,lengthComputable:a.lengthComputable,percentage:a.lengthComputable&&a.total>0?Math.round(a.loaded/a.total*100):null});},250)}var D=class extends Error{constructor(a,e,o){super(a);b(this,"message");b(this,"code");b(this,"data");this.name="RequestError",this.message=a,e&&(this.code=e),o!==void 0&&(this.data=o);}};b(D,"ETIMEDOUT","ETIMEDOUT"),b(D,"ERR_NETWORK","ERR_NETWORK"),b(D,"ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION_VALUE"),b(D,"ERR_BAD_OPTION","ERR_BAD_OPTION"),b(D,"ECONNABORTED","ECONNABORTED"),b(D,"ERR_FR_TOO_MANY_REDIRECTS","ERR_FR_TOO_MANY_REDIRECTS"),b(D,"ERR_DEPRECATED","ERR_DEPRECATED"),b(D,"ERR_BAD_RESPONSE","ERR_BAD_RESPONSE"),b(D,"ERR_BAD_REQUEST","ERR_BAD_REQUEST"),b(D,"ERR_CANCELED","ERR_CANCELED"),b(D,"REQUEST_CANCELED","REQUEST_CANCELED"),b(D,"ERR_NOT_SUPPORT","ERR_NOT_SUPPORT"),b(D,"ERR_INVALID_URL","ERR_INVALID_URL");var we=(t=false)=>{let[n,a]=useState(t),e=useCallback(()=>{a(true);},[]),o=useCallback(()=>{a(false);},[]);return [n,e,o]};var Ae=150,yt={ease:[.26,.08,.25,1],duration:.25},_a={initial:{opacity:0,scale:.95},visible:{opacity:1,scale:1,transition:{...yt,when:"beforeChildren"}},hidden:{opacity:0,scale:1.05,transition:{...yt,when:"afterChildren"}}},La={initial:{y:10,opacity:0},visible:{y:0,opacity:1,transition:yt},hidden:{y:-10,opacity:0,transition:yt}};function _e({containerRef:t,accept:n,acceptHint:a,onFileSelect:e}){let o=P.useRef(null),r=P.useRef(null),[s,c,l]=we(false),p=P.useCallback(g=>{g.stopPropagation();let{target:m,relatedTarget:b}=g;m.matches(".data-drop-target, .data-drop-area")&&(!b||!b.matches(".data-drop-target, .data-drop-area"))&&(o.current=window.setTimeout(()=>{l();},Ae));},[l]),i=P.useCallback(()=>{o.current&&window.clearTimeout(o.current);},[]),f=P.useCallback(()=>{o.current&&window.clearTimeout(o.current),o.current=window.setTimeout(()=>{l();},Ae);},[l]),h=P.useEffectEvent(async g=>{let{dataTransfer:m}=g,b=[];m.files&&m.files.length>0&&(b=b.concat(Array.from(m.files))),b.length&&(r.current&&window.clearTimeout(r.current),r.current=window.setTimeout(()=>{e?.(b);},600));});return mt(()=>{if(!t?.current)return;let g=t.current;return g.addEventListener("dragenter",c),()=>{g.removeEventListener("dragenter",c),o.current&&window.clearTimeout(o.current),r.current&&window.clearTimeout(r.current);}}),jsx(Portal.Root,{container:t?.current,asChild:true,children:jsx(AnimatePresence,{children:s&&jsx(m.div,{className:"data-drop-area absolute inset-0 bottom-8 z-10 flex items-center justify-center select-none",onDragLeave:p,onDragOver:i,onDrop:f,initial:"hidden",animate:"visible",exit:"hidden",variants:_a,children:jsx(Oa,{accept:n,acceptHint:a,onFileSelect:h})})})})}function Oa({accept:t,acceptHint:n,onFileSelect:a}){let e=O(),[o,r]=P.useState(false),s=P.useCallback(p=>{if(!t||!p.dataTransfer.items.length){r(false);return}let i=[...p.dataTransfer.items].every(f=>Ma(f.type,t));r(!i);},[t]),c$1=P.useCallback(p=>{let{relatedTarget:i,currentTarget:f}=p;i&&f.contains(i)&&p.stopPropagation();},[]),l=P.useCallback(p=>{if(o){p.preventDefault();return}a(p);},[o,a]);return jsxs("div",{"data-dropzone":true,onDragEnter:s,onDrop:l,onDragLeave:c$1,className:"data-drop-target relative flex h-full w-full items-center justify-center rounded-[8px] bg-bg-weak p-16",children:[jsx("svg",{className:c("pointer-events-none absolute top-16 left-16 h-[calc(100%-32px)] w-[calc(100%-32px)] overflow-visible",o?"text-error-base":"text-primary-base"),children:jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",rx:"8",fill:"none",stroke:"currentColor",strokeDasharray:"11, 8",strokeDashoffset:"0",strokeLinecap:"round",strokeWidth:"2",children:jsx("animate",{attributeName:"stroke-dashoffset",from:"0",to:"-19",dur:"0.5s",repeatCount:"indefinite"})})}),jsxs(m.div,{className:c("pointer-events-none flex flex-col items-center gap-4",o?"text-error-base":"text-primary-base"),variants:La,children:[jsxs("div",{className:"flex flex-col items-center",children:[jsx(FolderUp,{className:"size-48"}),jsx("strong",{className:"text-title-h6",children:e(o?"file_type_rejected":"drop_file_hint")})]}),jsx("span",{className:"text-text-soft",children:n?e("file_support_list",{formats:n}):e("file_support_all")})]})]})}function Ma(t,n,a=""){if(!n||n==="*")return true;if(!t&&!a)return false;let e=n.split(",").map(s=>s.trim().toLowerCase()),o=(t||"").toLowerCase(),r=(a||"").toLowerCase();return e.some(s=>{if(s.startsWith("."))return r.endsWith(s);if(s.endsWith("/*")){let c=s.slice(0,-1);return o.startsWith(c)}return o===s})}function Le(t=""){return `${t}-${Date.now().toString(36)+Math.random().toString(36).slice(2)}`}function Oe(t){return t?t.filter(n=>n.filter!==void 0).map(n=>{let{filter:a,dataIndex:e,title:o}=n,r=Array.isArray(e)?e.join("."):e,s=a.displayName??(typeof o=="string"?o:r);return {...a,columnId:r,displayName:s}}):[]}function Me(t){return t.key?String(t.key):Array.isArray(t.dataIndex)?t.dataIndex.join("."):String(t.dataIndex)}function Ba(t){return typeof t=="string"&&t.length>0}function Be(t){return [Array.isArray(t.dataIndex)?t.dataIndex.join(" "):typeof t.dataIndex=="string"?t.dataIndex:null,typeof t.title=="string"?t.title:null,t.key!==null?String(t.key):null].filter(Ba)}function Fe(t,n=22){if(!t)return "";if(t.length<=n)return t;let a=Math.floor(n/2.5),e=t.lastIndexOf("."),o,r;if(e>0?(o=t.substring(0,e),r=t.substring(e)):(o=t,r=""),o.length<=a*2)return t;let s=o.substring(0,a),c=o.substring(o.length-a);return `${s}\u2026${c}${r}`}function Ve(t,n){return {type:"import",localTaskId:Le(n?`import-file-${n}`:"import-file"),status:"pending",progress:0,file:t}}function He({tooltip:t,btnProps:n,disabled:a,loading:e,containerRef:o,accept:r,acceptHint:s,requestConfig:c,onBeforeUpload:l}){let p=O(),i$1=P.useId(),f=Z(b=>b.addTask),h=Z(b=>b.updateTask),g=a||e,m=P.useCallback(async b=>{if(b=[b[0]],l&&typeof l=="function"){let u=await l(b);if(u===false)return;Array.isArray(u)&&(b=u);}b.forEach((u,R)=>{let S=new AbortController,N={...Ve(u,R),abortController:S};if(f(N),!c)throw Error("requestConfig is required.");let{url:F,method:k="POST",fieldName:q="file",body:L,onSuccess:y,onFailed:x,onUploadProgress:V,...K}=c,O=new FormData;O.append(q,u),L instanceof FormData?L.forEach((_,H)=>O.append(H,_)):L&&Object.keys(L).forEach(_=>{O.append(_,L[_]);}),Pe(F,{...K,onUploadProgress:_=>{V?.(_),h(N.localTaskId,{status:"importing",progress:_.percentage??0});},method:k,body:O,signal:S.signal}).then(_=>{y?.(_),h(N.localTaskId,{status:"done"});}).catch(_=>{x?.(_),h(N.localTaskId,{status:"failed"});});});},[c,l,f,h]);return jsxs(Fragment,{children:[jsx(_e,{containerRef:o,onFileSelect:m,accept:r,acceptHint:s}),jsx("input",{type:"file",id:i$1,accept:r,multiple:false,onChange:b=>{let u=Array.from(b.target.files??[]);u.length&&(m(u),b.target.value="");},className:"invisible absolute -top-9999 -left-9999"}),jsx(i,{content:t??p("import_tooltip"),children:jsx("label",{htmlFor:i$1,className:"m-0 inline-flex cursor-pointer p-0 leading-none",children:jsx(M,{variant:"neutral",mode:"stroke",loading:e,startContent:jsx(Upload,{}),disabled:g,className:"pointer-events-none",...n,children:p("data_import")})})})]})}function $e({disabled:t,columns:n}){let a=O(),{alwaysShowingColumns:e}=ot(),[o,r]=P.useState(false),s=ve(),c$1=J(p=>p.setColumnVisibilityState),l=P.useCallback((p,i)=>{c$1(f=>({...f,[p]:i}));},[c$1]);return jsxs(D$1,{open:o,onOpenChange:r,children:[jsx(E,{asChild:true,children:jsx(M,{mode:"stroke",variant:"neutral",size:"small",className:c(o&&"active","relative gap-0"),disabled:t,startContent:jsx(v,{}),children:jsx(i,{content:a("column_set"),children:jsx("div",{className:"absolute inset-0"})})})}),jsx(F,{align:"end",side:"bottom",arrow:false,className:"w-fit rounded-xl p-0",sideOffset:6,children:jsxs(w,{children:[jsx(x,{autoFocus:true,placeholder:"Search..."}),jsx(z,{children:a("no_results")}),jsx(y,{className:"max-h-256",children:jsx(A,{children:n.map(p=>{let i=Me(p),f=s[i]!==false,h=typeof p.title=="string"&&p.title?.trim()==="",g=h?p.key:p.title;return jsxs(B,{keywords:Be(p),onSelect:()=>l(i,!f),className:"group flex items-center gap-6",value:i,disabled:e?.includes(i),children:[jsx(Checkbox,{checked:f,tabIndex:-1,className:c("mr-4 opacity-100")}),jsx("span",{className:c(h&&"capitalize"),children:g})]},i)})})})]})})]})}var Ke=["data_refresh","size_setting","column_setting","filter_btn"];function Ka({btnProps:t,disabled:n,loading:a,onAction:e}){let o=O();return jsx(M,{variant:"primary",startContent:jsx(Download,{}),loading:a,disabled:n||a,onClick:()=>e({action:"data_export"}),...t,children:o("data_export")})}var Wa={initial:{opacity:0,scale:.85,x:10,originX:1},animate:{opacity:1,scale:1,x:0,originX:1},exit:{opacity:0,scale:.85,x:10,originX:1}},ja={ease:[.26,.08,.25,1],duration:.25};function We({containerRef:t,columns:n,filter:a,items:e=Ke,className:o,onAction:r,...s}){let{loading:c$1,syncing:l,exporting:p,disabled:i}=De(),f=P.useMemo(()=>e.map(u=>Ga(u)),[e]),h=P.useMemo(()=>f.filter(u=>!u.hidden),[f]),g=P.useCallback(u=>{r?.(u);},[r]),m$1=P.useMemo(()=>({disabled:i,loading:c$1,syncing:l,exporting:p,columns:n,onAction:g}),[i,c$1,p,l,n,g]),b=u=>{let R={btnProps:u.btnProps,tooltip:u.tooltip,disabled:i||l||c$1,loading:c$1,onAction:g};switch(u.type){case "data_refresh":return jsx(qa,{...R,syncing:l});case "size_setting":return jsx(Re,{...u.btnProps});case "column_setting":return jsx($e,{...u.btnProps,columns:n});case "data_export":return jsx(Ka,{...R,loading:p});case "data_import":return jsx(He,{...R,loading:p,containerRef:t,requestConfig:u.requestConfig,onBeforeUpload:u.onBeforeUpload,acceptHint:u.acceptHint,accept:u.accept});case "custom":return u.render?.(m$1);case "filter_btn":return a;default:return null}};return jsx(m.div,{"data-slot":"data-table-toolbar",className:c("flex items-center gap-8 transition-opacity",o),...s,children:jsx(AnimatePresence,{mode:"popLayout",initial:false,children:h.map(u=>jsx(m.div,{layout:true,variants:Wa,initial:"initial",animate:"animate",exit:"exit",className:"leading-none",transition:ja,children:b(u)},u.key))})})}function qa({btnProps:t,tooltip:n,disabled:a,loading:e,syncing:o,onAction:r}){let s=O(),c=n??s("refresh");return jsx(i,{content:c,children:jsx(M,{mode:"stroke",variant:"neutral",startContent:jsx(RefreshCw,{}),loading:o||e,disabled:a||e||o,className:"gap-0",onClick:()=>r({action:"data_refresh"}),...t})})}function Ga(t){return typeof t=="string"?{type:t,key:t}:t.type==="custom"?{type:"custom",key:t.key,hidden:t.hidden,render:t.render}:t.type==="data_import"?{type:"data_import",key:t.key??t.type,hidden:t.hidden,btnProps:t.btnProps,tooltip:t.tooltip,accept:t.accept,acceptHint:t.acceptHint,requestConfig:t.requestConfig,onBeforeUpload:t.onBeforeUpload}:{type:t.type,key:t.key??t.type,hidden:t.hidden,btnProps:t.btnProps,tooltip:t.tooltip}}function Ge({className:t,value:n,...a}){return jsx(Progress.Root,{"data-slot":"progress",className:c("relative flex h-4 w-full items-center overflow-x-hidden rounded-full bg-bg-soft",t),...a,children:jsx(Progress.Indicator,{"data-slot":"progress-indicator",className:"size-full flex-1 bg-primary-base transition-all",style:{transform:`translateX(-${100-(n||0)}%)`}})})}function Ye({onAction:t,...n}){let a=gt();return jsx(m.div,{"data-slot":"data-table-taskbar",className:"w-fit items-center justify-center bg-bg-white select-none",...n,children:a.map(e=>e.type==="import"?jsx(Ja,{...e,onSuccess:()=>{t?.({action:"import_done"});}},e.localTaskId):jsx(Za,{...e},e.localTaskId))})}function Ja(t){let n=O(),a=Z(s=>s.removeTask),e=t.status==="failed",o=t.status==="done";return jsxs("div",{className:"flex h-full items-center gap-8",children:[jsxs("span",{className:c("truncate text-md font-medium",o?"text-success-base":e?"text-error-base":"text-text-strong"),children:[n(e?"import_failed":o?"import_done":t.status)," ",Fe(t.file.name)]}),jsxs("span",{className:"min-w-34 shrink-0 text-right text-sm text-text-sub",children:[t.progress,"%"]}),jsx(M,{variant:"neutral",mode:"ghost",size:"xsmall",className:"min-w-28 rounded-full px-0",onClick:()=>{t.abortController?.signal.aborted===false&&!e&&!o&&t.abortController?.abort("User canceled"),a(t.localTaskId),o&&t.onSuccess?.(t.localTaskId);},startContent:o?jsx(Check,{className:"text-success-base"}):jsx(to,{})})]})}function Za(t){return jsxs("div",{className:"flex w-fit min-w-220 flex-col justify-center gap-6",children:[jsxs("div",{className:"lable flex items-center justify-center gap-12",children:[jsx("span",{className:"font-medium text-text-strong",children:"Task Name"}),jsx("span",{className:"ml-auto text-sm text-text-sub",children:t.progress})]}),jsx(Ge,{value:66})]})}function to(){return jsxs("svg",{width:"0.8em",height:"0.8em",viewBox:"0 0 12 12",fill:"none",children:[jsx("path",{d:"M10.4854 1.99998L2.00007 10.4853",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"}),jsx("path",{d:"M10.4854 10.4844L2.00007 1.99908",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})]})}var Qe={initial:{y:10,opacity:0},animate:{y:0,opacity:1},exit:{y:-10,opacity:0}},Je={ease:[.26,.08,.25,1],duration:.25};function Ze({containerRef:t,items:n,filter:a,columns:e,onAction:o}){let r=gt();return jsx(AnimatePresence,{initial:false,mode:"popLayout",children:r.length?jsx(Ye,{variants:Qe,initial:"initial",animate:"animate",exit:"exit",transition:Je,onAction:o},"task-bar"):jsx(We,{variants:Qe,initial:"initial",animate:"animate",exit:"exit",transition:Je,containerRef:t,onAction:o,filter:a,columns:e,items:n},"toolbar")})}var ao=26,ta=44,oo=200,ro=250,no={},so=t=>t.querySelector(".ant-table-thead")?.offsetHeight??ta,kt=(t,n)=>{if(!t)return 0;let a=t.querySelectorAll(':scope [data-id^="data-table-card-"]'),e=0;return a.forEach(o=>{let r=o.getAttribute("data-id")==="data-table-card-content";e+=r?0:o.clientHeight;}),document.documentElement.clientHeight-n-window.scrollY-ao-so(t)-e-3};function ea(t,n,{x:a,y:e,...o}=no,r,s,c){let[l,p]=P.useState(e),i=P.useRef(0),f=P.useRef(null);if(P.useLayoutEffect(()=>{if(!s)return;i.current=t.current?.offsetTop??0,f.current||(f.current=c$1(()=>{i.current=t.current?.offsetTop??0,p(kt(t.current,i.current));},oo,false,true)),window.addEventListener("resize",f.current);let g=null;return t.current&&(g=new MutationObserver(f.current),g.observe(t.current,{childList:true,subtree:true,attributes:true,attributeFilter:["style","class","hidden"]})),()=>{f.current&&(window.removeEventListener("resize",f.current),f.current.cancel()),g?.disconnect();}},[t,s]),P.useEffect(()=>{if(!s||e!==void 0)return;p(kt(t.current,i.current));let g=setTimeout(()=>{p(kt(t.current,i.current));},ro);return ()=>{clearTimeout(g);}},[e,n,t,s]),!s)return {x:a,y:e,...o};let h=l&&typeof l=="number"?l+(r?ta:0):l;return {x:c&&!a?1280:a??"max-content",y:c&&!h?620:h,...o}}var co={ease:[.26,.08,.25,1],duration:.3},po={},uo={root:"m-0 flex w-full [&_.ant-pagination-total-text]:ps-6 [&_.ant-pagination-total-text]:mr-auto"};function mo(t){let{store:n,tabList:a,alwaysShowingColumns:e,...o}=t;return mt(()=>{let r=document.body,s=l=>{l.preventDefault(),l.dataTransfer&&(l.target.closest("[data-dropzone]")?l.dataTransfer.dropEffect="copy":l.dataTransfer.dropEffect="none");},c=l=>{l.preventDefault();};return r.addEventListener("drop",c),r.addEventListener("dragover",s),r.addEventListener("dragenter",s),()=>{r.removeEventListener("drop",c),r.removeEventListener("dragover",s),r.removeEventListener("dragenter",s);}}),jsx(Ce,{store:n,tabList:a,alwaysShowingColumns:e,children:jsx(bo,{...o})})}function bo(t$1){let{ref:n$1,activeTabId:a,variant:e$1,style:o$1,cardTitle:r$1,cardIcon:s$1,cardDescription:c$1,classNames:l$1,enableTableAutoScrollSizer:p$1,slots:i,columns:f,filterColumns:h,tableColumns:g,defaultFilters:m$2,tableProps:b,paginationProps:u,toolbarItems:R,isCustomTab:S,tabRenderCtx:N,customRender:F,onToolbarAction:k$1,onFiltersChange:q$1}=t$1,L=O(),y=P.useRef(null),x=P.useRef(null),{tabList:V$1}=ot(),{syncing:K,loading:O$1}=Se(),_=Z(E=>E.updateTableId),[H,ut]=V({filters:m$2,onFiltersChange:q$1});P.useEffect(()=>{_(a);},[a]);let tt=H&&H.length!==0,ht=!!(O$1&&g.some(E=>E.skeleton)),vt=Math.min(u.pageSize,15),St=P.useCallback(E=>L("pagination_total").replace("{total}",String(E)),[L]),st=ea(x,`${H?.length}-${a}`,b.scroll,S,p$1,b.virtual),d=ht?jsx(me,{id:`${a}-skeleton`,columns:g,size:b.size,count:vt,scroll:st}):jsx(Table,{id:`${a}-data-table`,columns:g,loading:O$1,showSorterTooltip:false,...b,scroll:st}),T$1=!!u.total&&(u.hideOnSinglePage!==true||u.total>u.pageSize);return jsxs(k,{ref:e([x,n$1]),style:o$1,className:c("relative rounded-[16px]",p$1&&"h-full max-h-[calc(100vh-var(--offset-top))] overflow-hidden",l$1?.root),variant:e$1,children:[jsxs(l,{"data-id":"data-table-card-header",className:c("data-table-card-header relative min-h-56 grow-0 px-14 pt-12 pb-10",e$1==="accent"&&"pt-10",V$1&&V$1?.length>1&&"border-b-0",l$1?.cardHeader),children:[jsxs(p,{className:c("flex items-center gap-12",l$1?.cardHeading),children:[s$1&&jsx(s,{className:c("size-34 border border-stone-200 bg-stone-100 text-text-sub",!!(r$1&&c$1)&&"size-44 [&_svg]:size-24",l$1?.cardIcon),children:s$1}),r$1&&jsxs("div",{className:c(c$1&&"flex flex-col gap-4"),children:[jsx(r,{children:r$1}),c$1&&jsx(t,{children:c$1})]})]}),jsx(AnimatePresence,{initial:false,children:R!==false&&jsx(q,{as:m.div,className:l$1?.cardToolbar,...le,children:jsx(Ze,{containerRef:y,items:R,columns:f,onAction:k$1,filter:h.length!==0&&jsx(U,{columns:h,filters:H,actions:ut,disabled:O$1||K,align:"end",enableAutoBack:true},`${a}-filter`)})})})]}),i?.cardSummary&&jsx(n,{"data-id":"data-table-card-summary",className:c("grow-0 p-12",l$1?.cardSummary),children:i.cardSummary}),jsx(xe,{"data-id":"data-table-card-tabs",className:"grow-0 p-0"}),jsx(AnimatePresence,{initial:false,children:tt&&jsx(m.div,{"data-id":"data-table-card-filter-values",...ce,children:jsx(n,{className:"p-0",children:jsx(T,{columns:h,filters:H,actions:ut,"data-id":"data-table-active-filters",className:"flex flex-wrap gap-10 px-12 pt-16",disabled:K||O$1,enableAutoClose:true})})},a)}),jsxs(m$1,{"data-id":"data-table-card-content",className:c("relative grow p-12 pb-0",(K||O$1)&&"pointer-events-none",p$1&&"overflow-hidden",l$1?.cardContent),children:[i?.tableSummary&&jsx(n,{"data-id":"data-table-card-table-summary",className:c("grow-0 p-0 pb-12",l$1?.tableSummary),children:i.tableSummary}),jsx(AnimatePresence,{mode:"popLayout",initial:false,children:jsx(m.div,{ref:y,className:c("relative w-full",S&&p$1&&"overflow-auto"),style:S&&p$1?{maxHeight:st.y}:po,...de,transition:co,children:S?F?.(N):d},a)})]}),T$1&&jsx(o,{"data-id":"data-table-card-pager",className:"flex min-h-44 w-full grow-0 items-center justify-between",children:jsx(Pagination,{classNames:uo,disabled:O$1||K,size:"small",showTotal:St,...u})}),i?.cardFooter&&jsx(o,{"data-id":"data-table-card-footer",className:c("grow-0 px-16 py-12",l$1?.cardFooter),children:i.cardFooter})]})}function To(t){let{tabList:n,fireOnMount:a=true,storageKey:e,onTabChange:o,onTableChange:r,onToolbarAction:s}=t,{pagination:c,tableStateStorageKey:l}=b$1(),p=P.useRef(new Set),[i]=P.useState(()=>{let d=be(n[0].id,e??l);for(let T of n)d.getState().initTab(T.id,oa(T)),p.current.add(T.id);return d}),f=P.useRef({onTabChange:o,onTableChange:r,onToolbarAction:s});f.current={onTabChange:o,onTableChange:r,onToolbarAction:s};let h=P.useRef(new Map);h.current=new Map(n.map(d=>[d.id,d]));let g=n.map(d=>d.id).join(),m=P.useRef(true);P.useEffect(()=>{if(m.current){m.current=false;return}for(let d of n)p.current.has(d.id)||(i.getState().initTab(d.id,oa(d)),p.current.add(d.id));},[i,g]);let b=n.map(d=>`${d.id}:${d.loading}:${d.syncing}:${d.exporting}:${d.disabled}`).join();P.useEffect(()=>{let{syncTabExternal:d}=i.getState();for(let T of n)d(T.id,{loading:T.loading,syncing:T.syncing,exporting:T.exporting,disabled:T.disabled});},[i,b]),P.useEffect(()=>{let d=i.getState().stateVersion;return i.subscribe(T=>{if(T.stateVersion===d)return;d=T.stateVersion;let E=T.activeTabId,G=T.tabs[E];if(!G)return;let it={pagination:G.pagination,filters:G.filters,sorter:G.sorter},Nt=T.changeReason;Nt==="tab_switch"&&f.current.onTabChange?.(E),f.current.onTableChange?.(E,it,Nt);})},[i]);let u=P.useRef(false);P.useEffect(()=>{if(u.current||(u.current=true,!a))return;let d=i.getState(),T=d.activeTabId,E=d.tabs[T];E&&f.current.onTableChange?.(T,E,"mount");},[i,a]);let R=useStore(i,d=>d.activeTabId),S=useStore(i,useShallow(d=>d.tabs[d.activeTabId]??$)),N=h.current.get(R),F=N?.type==="custom",k=F?void 0:N,q=F?N:void 0,{columnVisibility:L,pagination:y}=S,x=k?.columns,V=q?.filterColumns,K=P.useMemo(()=>x?x.filter(d=>!d.hidden):[],[x]),O=P.useMemo(()=>F?V??[]:Oe(x),[F,V,x]),_=P.useMemo(()=>K.filter(d=>{let T=d.key??d.dataIndex;return !T||L[T]!==false}),[K,L]),H=P.useCallback(d=>{let T=i.getState(),E=T.activeTabId,G=T.tabs[E]?.filters??[],it=typeof d=="function"?d(G):d;T.setFilters(E,it);},[i]),ut=P.useCallback((d,T,E,G)=>{let it=i.getState().activeTabId;i.getState().setTableChange(it,E,G);},[i]),tt=P.useCallback((d,T)=>{let E=i.getState().activeTabId;i.getState().setPagination(E,d,T);},[i]),ht=P.useCallback(d=>{let T=i.getState().activeTabId;f.current.onToolbarAction?.(T,d);},[i]),vt=P.useMemo(()=>({...c,current:y.current,pageSize:y.pageSize,total:N?.total,onChange:tt,onShowSizeChange:tt}),[c,y,N?.total,tt]),St=P.useMemo(()=>({loading:S.loading,syncing:S.syncing,exporting:S.exporting,disabled:S.disabled,filters:S.filters,pagination:y,onFiltersChange:H,onPaginationChange:tt}),[S,y,H,tt]),st=P.useMemo(()=>n.map(({id:d,label:T,value:E})=>({id:d,label:T,value:E})),[g]);return {store:i,activeTabId:R,tabList:st,columns:K,filterColumns:O,tableColumns:_,tableProps:{dataSource:k?.dataSource,rowKey:k?.rowKey,size:S.tableSize,pagination:false,scroll:k?.scroll,virtual:k?.virtual,onChange:ut},paginationProps:vt,defaultFilters:S.filters,onFiltersChange:H,toolbarItems:N?.toolbarItems,onToolbarAction:ht,isCustomTab:F,customRender:q?.render,tabRenderCtx:St,enableTableAutoScrollSizer:k?.enableTableAutoScrollSizer??q?.enableTableAutoScrollSizer??true}}function oa(t){return {pagination:t.defaultPagination,filters:t.defaultFilters,sorter:t.type!=="custom"?t.defaultSorter:void 0,loading:t.loading,syncing:t.syncing,exporting:t.exporting,disabled:t.disabled}}export{Ke as DEFAULT_TOOLBAR_ITEMS,mo as DataTable,To as useDataTable};
@@ -1,14 +1,7 @@
1
- import React__default from 'react';
1
+ import { Dayjs } from 'dayjs';
2
+ import { I as IconType } from './icon-BmaneZ4I.js';
2
3
  import { DatePickerProps } from 'antd';
3
4
  import { RangePickerProps } from 'antd/es/date-picker';
4
- import { Dayjs } from 'dayjs';
5
-
6
- type IconSize = number | string;
7
- type IconBaseProps = {
8
- size?: IconSize;
9
- className?: string;
10
- };
11
- type IconType<P extends IconBaseProps = IconBaseProps> = React__default.ComponentType<P> | React__default.ReactElement<P>;
12
5
 
13
6
  interface FilterColumnOption {
14
7
  key?: React.Key;
@@ -141,4 +134,103 @@ type DataFilterProps<T> = UseDataFiltersProps & {
141
134
  columns: FilterColumnDef<T>[];
142
135
  } & DataFilterUiProps;
143
136
 
144
- export type { CascaderConfig as C, DataFilterProps as D, FilterColumnDef as F, IconType as I, RangeDatePickerConfig as R, SingleDatePickerConfig as S, DatePickerConfig as a, CascaderFieldNames as b, CascaderOption as c, FilterColumnOption as d, FiltersState as e, InputNumberConfig as f, ColumnDataTypes as g };
137
+ var filter = "Add Filters";
138
+ var search_keywords = "Search...";
139
+ var no_results = "No results";
140
+ var to = "to";
141
+ var input_number = "Input Number";
142
+ var min = "Min";
143
+ var max = "Max";
144
+ var apply = "Apply Filter";
145
+ var clear = "Clear Filter";
146
+ var clear_all = "Clear";
147
+ var pagination_total = "Total {total} items";
148
+ var refresh = "Refresh";
149
+ var column_set = "Table Settings";
150
+ var density = "Density";
151
+ var large = "Large";
152
+ var middle = "Middle";
153
+ var compact = "Compact";
154
+ var pinned = "Pinned";
155
+ var data_export = "Export Data";
156
+ var data_import = "Import Data";
157
+ var ok = "Ok";
158
+ var close = "Close";
159
+ var copy = "Copy";
160
+ var copied = "Copied";
161
+ var drop_file_hint = "Drop file here to upload";
162
+ var file_support_all = "All file formats are supported";
163
+ var file_support_list = "Supported formats: {formats}";
164
+ var file_type_rejected = "This file type is not supported";
165
+ var import_tooltip = "Drag and drop files into the table area to import";
166
+ var pending = "Pending";
167
+ var importing = "Importing";
168
+ var exporting = "Exporting";
169
+ var import_failed = "Import Failed";
170
+ var import_done = "Done";
171
+ var done = "Done";
172
+ var enUS = {
173
+ filter: filter,
174
+ search_keywords: search_keywords,
175
+ no_results: no_results,
176
+ to: to,
177
+ input_number: input_number,
178
+ min: min,
179
+ max: max,
180
+ apply: apply,
181
+ clear: clear,
182
+ clear_all: clear_all,
183
+ pagination_total: pagination_total,
184
+ refresh: refresh,
185
+ column_set: column_set,
186
+ density: density,
187
+ large: large,
188
+ middle: middle,
189
+ compact: compact,
190
+ pinned: pinned,
191
+ "delete": "Delete",
192
+ data_export: data_export,
193
+ data_import: data_import,
194
+ ok: ok,
195
+ close: close,
196
+ copy: copy,
197
+ copied: copied,
198
+ drop_file_hint: drop_file_hint,
199
+ file_support_all: file_support_all,
200
+ file_support_list: file_support_list,
201
+ file_type_rejected: file_type_rejected,
202
+ import_tooltip: import_tooltip,
203
+ pending: pending,
204
+ importing: importing,
205
+ exporting: exporting,
206
+ import_failed: import_failed,
207
+ import_done: import_done,
208
+ done: done
209
+ };
210
+
211
+ type LocaleKey = keyof typeof enUS;
212
+ declare function useTransition(): (key: LocaleKey, params?: Record<string, string | number>) => string;
213
+
214
+ type PickerType = 'date' | 'week' | 'month' | 'quarter' | 'year';
215
+ interface DateDisplayFormat {
216
+ full: string;
217
+ withoutYear: string;
218
+ timeFormat: string | null;
219
+ }
220
+ declare const DATE_FORMATS: Record<PickerType, {
221
+ cn: {
222
+ full: string;
223
+ withoutYear: string;
224
+ };
225
+ en: {
226
+ full: string;
227
+ withoutYear: string;
228
+ };
229
+ }>;
230
+ declare function getDateDisplayFormat(config: DatePickerConfig | undefined, locale: string): DateDisplayFormat;
231
+ declare function formatDateRange(start: Dayjs, end: Dayjs, isCn: boolean, format: DateDisplayFormat, picker: PickerType): string;
232
+ declare function getPickerInputFormat(picker: PickerType | undefined, locale: string, showTime?: boolean | {
233
+ format: string;
234
+ }): string;
235
+
236
+ export { type CascaderConfig as C, type DataFilterProps as D, type FilterColumnDef as F, type InputNumberConfig as I, type PickerType as P, type RangeDatePickerConfig as R, type SingleDatePickerConfig as S, type CascaderFieldNames as a, type CascaderOption as b, DATE_FORMATS as c, type DateDisplayFormat as d, type DatePickerConfig as e, type FilterColumnOption as f, type FiltersState as g, formatDateRange as h, getDateDisplayFormat as i, getPickerInputFormat as j, type ColumnDataTypes as k, useTransition as u };
@@ -0,0 +1,10 @@
1
+ import React__default from 'react';
2
+
3
+ type IconSize = number | string;
4
+ type IconBaseProps = {
5
+ size?: IconSize;
6
+ className?: string;
7
+ };
8
+ type IconType<P extends IconBaseProps = IconBaseProps> = React__default.ComponentType<P> | React__default.ReactElement<P>;
9
+
10
+ export type { IconType as I };