@wordrhyme/auto-crud 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import * as _tanstack_react_table0 from "@tanstack/react-table";
3
3
  import { Column, ColumnDef, ColumnSort, Row, RowData, Table, TableOptions, TableState } from "@tanstack/react-table";
4
4
  import { DropdownMenuTrigger, PopoverContent } from "@pixpilot/shadcn";
5
5
  import { ClassValue } from "clsx";
6
- import * as react_jsx_runtime3 from "react/jsx-runtime";
6
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
7
7
  import { z } from "zod";
8
8
  import { ISchema } from "@formily/json-schema";
9
9
 
@@ -292,6 +292,38 @@ interface BatchUpdateField {
292
292
  value: string;
293
293
  }>;
294
294
  }
295
+ interface BatchActionContext<TData> {
296
+ /** 选中的原始行数据 */
297
+ rows: TData[];
298
+ /** TanStack Table 实例 */
299
+ table: Table<TData>;
300
+ /** 清空当前选择 */
301
+ clearSelection: () => void;
302
+ }
303
+ type BatchBuiltinActionType = 'batchUpdate' | 'export' | 'delete';
304
+ type BatchBuiltinActionItem<TData> = {
305
+ type: BatchBuiltinActionType;
306
+ /** 替代默认行为 */
307
+ onClick?: (rows: TData[], context: BatchActionContext<TData>, event: React$1.MouseEvent<HTMLButtonElement>) => void;
308
+ /** 替代默认标签,仅对 export/delete 生效 */
309
+ label?: string;
310
+ /** 替代整个内置操作的渲染 */
311
+ component?: React$1.ReactNode | ((context: BatchActionContext<TData>) => React$1.ReactNode);
312
+ };
313
+ type BatchCustomActionItem<TData> = {
314
+ type: 'custom';
315
+ /** 操作文本。传 component 时可省略 */
316
+ label?: string;
317
+ /** 自定义点击行为。传 component 时可省略 */
318
+ onClick?: (rows: TData[], context: BatchActionContext<TData>, event: React$1.MouseEvent<HTMLButtonElement>) => void;
319
+ /** 渲染自定义内容 */
320
+ component?: React$1.ReactNode | ((context: BatchActionContext<TData>) => React$1.ReactNode);
321
+ /** 仅在无内置项时生效:插入到首部还是尾部(默认 end) */
322
+ position?: 'start' | 'end';
323
+ variant?: 'default' | 'destructive';
324
+ };
325
+ type BatchActionItem<TData> = BatchBuiltinActionItem<TData> | BatchCustomActionItem<TData>;
326
+ type BatchActionConfig<TData> = BatchActionItem<TData>[] | ((defaults: BatchBuiltinActionItem<TData>[]) => BatchActionItem<TData>[]);
295
327
  interface AutoTableActionBarProps<TData> {
296
328
  table: Table<TData>;
297
329
  onDeleteSelected?: (rows: TData[]) => void;
@@ -301,10 +333,14 @@ interface AutoTableActionBarProps<TData> {
301
333
  batchUpdateFields?: BatchUpdateField[];
302
334
  /** 是否启用导出功能 */
303
335
  enableExport?: boolean;
336
+ /** 未配置 actions / 只配置 custom actions 时,是否展示默认导出按钮 */
337
+ showDefaultExport?: boolean;
304
338
  /** 是否启用删除功能 */
305
339
  enableDelete?: boolean;
306
340
  /** 额外的操作按钮 */
307
341
  extraActions?: React$1.ReactNode;
342
+ /** 批量操作配置,支持和行操作/顶部工具栏一致的顺序接管语义 */
343
+ actions?: BatchActionConfig<TData>;
308
344
  }
309
345
  declare function AutoTableActionBar<TData>({
310
346
  table,
@@ -312,9 +348,11 @@ declare function AutoTableActionBar<TData>({
312
348
  onUpdateSelected,
313
349
  batchUpdateFields,
314
350
  enableExport,
351
+ showDefaultExport,
315
352
  enableDelete,
316
- extraActions
317
- }: AutoTableActionBarProps<TData>): react_jsx_runtime3.JSX.Element;
353
+ extraActions,
354
+ actions
355
+ }: AutoTableActionBarProps<TData>): react_jsx_runtime2.JSX.Element;
318
356
  //#endregion
319
357
  //#region src/lib/schema-bridge/types.d.ts
320
358
  /**
@@ -414,7 +452,7 @@ declare function createActionsColumn<T>(items: ActionsColumnConfig<T>): ColumnDe
414
452
  //#endregion
415
453
  //#region src/components/auto-crud/auto-table.d.ts
416
454
  /** 过滤模式类型 */
417
- type FilterMode = "simple" | "advanced" | "command";
455
+ type FilterMode = 'simple' | 'advanced' | 'command';
418
456
  interface AutoTableProps<T extends z.ZodObject<z.ZodRawShape>> {
419
457
  schema: T;
420
458
  data: z.infer<T>[];
@@ -443,10 +481,14 @@ interface AutoTableProps<T extends z.ZodObject<z.ZodRawShape>> {
443
481
  batchUpdateFields?: BatchUpdateField[];
444
482
  /** 批量操作栏额外按钮 */
445
483
  actionBarExtra?: React.ReactNode;
484
+ /** 批量悬浮操作配置 */
485
+ actionBarActions?: BatchActionConfig<z.infer<T>>;
446
486
  /** 初始排序 */
447
487
  initialSorting?: any[];
448
488
  /** 是否启用导出功能 (默认 true) */
449
489
  enableExport?: boolean;
490
+ /** 未配置批量 actions / 只配置 custom actions 时,是否展示默认导出按钮 */
491
+ showDefaultExport?: boolean;
450
492
  /** 选中行数变化回调(用于外层组件获知选中状态) */
451
493
  onSelectedCountChange?: (count: number) => void;
452
494
  /** 获取选中行数据的回调(由外层组件调用) */
@@ -466,11 +508,13 @@ declare function AutoTable<T extends z.ZodObject<z.ZodRawShape>>({
466
508
  onUpdateSelected,
467
509
  batchUpdateFields,
468
510
  actionBarExtra,
511
+ actionBarActions,
469
512
  initialSorting,
470
513
  enableExport,
514
+ showDefaultExport,
471
515
  onSelectedCountChange,
472
516
  getSelectedRows
473
- }: AutoTableProps<T>): react_jsx_runtime3.JSX.Element;
517
+ }: AutoTableProps<T>): react_jsx_runtime2.JSX.Element;
474
518
  //#endregion
475
519
  //#region src/i18n/locale.d.ts
476
520
  /**
@@ -571,7 +615,7 @@ interface FilterConfig {
571
615
  /** 是否启用筛选(默认跟随 table.meta.variant 推断) */
572
616
  enabled?: boolean;
573
617
  /** 筛选器类型 */
574
- variant?: "text" | "number" | "range" | "date" | "dateRange" | "boolean" | "select" | "multiSelect";
618
+ variant?: 'text' | 'number' | 'range' | 'date' | 'dateRange' | 'boolean' | 'select' | 'multiSelect';
575
619
  /** select/multiSelect 的选项列表 */
576
620
  options?: Array<{
577
621
  label: string;
@@ -588,7 +632,7 @@ interface FilterConfig {
588
632
  /** 是否在筛选栏中隐藏(隐藏筛选但不影响表格列显示) */
589
633
  hidden?: boolean;
590
634
  /** 控制在哪些筛选模式下显示(未设置则在所有模式显示) */
591
- modes?: Array<"simple" | "advanced" | "command">;
635
+ modes?: Array<'simple' | 'advanced' | 'command'>;
592
636
  }
593
637
  /**
594
638
  * 统一字段配置
@@ -626,17 +670,17 @@ interface Field {
626
670
  */
627
671
  form?: {
628
672
  /** 是否在表单中隐藏 */
629
- "x-hidden"?: boolean;
673
+ 'x-hidden'?: boolean;
630
674
  /** 组件类型 */
631
- "x-component"?: string;
675
+ 'x-component'?: string;
632
676
  /** 组件属性 */
633
- "x-component-props"?: Record<string, unknown>;
677
+ 'x-component-props'?: Record<string, unknown>;
634
678
  /** 其他表单配置 */
635
679
  [key: string]: unknown;
636
680
  } | false;
637
681
  }
638
682
  type Fields = Record<string, Field>;
639
- type BuiltinType = "view" | "edit" | "copy" | "delete";
683
+ type BuiltinType = 'view' | 'edit' | 'copy' | 'delete';
640
684
  /** 内置操作项(覆盖默认行为或调整位置) */
641
685
  type BuiltinActionItem<T> = {
642
686
  type: BuiltinType;
@@ -646,13 +690,13 @@ type BuiltinActionItem<T> = {
646
690
  };
647
691
  /** 自定义操作项 */
648
692
  type CustomActionItem<T> = {
649
- type: "custom";
693
+ type: 'custom';
650
694
  label: string;
651
695
  onClick: (row: T) => void;
652
696
  /** 仅在无内置项时生效:插入到首部还是尾部(默认 end) */
653
- position?: "start" | "end";
697
+ position?: 'start' | 'end';
654
698
  separator?: boolean;
655
- variant?: "default" | "destructive";
699
+ variant?: 'default' | 'destructive';
656
700
  };
657
701
  /**
658
702
  * 行操作项
@@ -666,7 +710,7 @@ type ActionConfig<T> = ActionItem<T>[] | ((defaults: BuiltinActionItem<T>[]) =>
666
710
  * 顶部工具栏内置操作项
667
711
  */
668
712
  type ToolbarBuiltinActionItem = {
669
- type: "create" | "import" | "export";
713
+ type: 'create' | 'import' | 'export';
670
714
  /** 替代默认的行为 */
671
715
  onClick?: () => void;
672
716
  /** 替代默认的标签文本 */
@@ -678,11 +722,11 @@ type ToolbarBuiltinActionItem = {
678
722
  * 顶部工具栏自定义操作项
679
723
  */
680
724
  type ToolbarCustomActionItem = {
681
- type: "custom";
725
+ type: 'custom';
682
726
  /** 渲染自定义内容 */
683
727
  component: React$1.ReactNode;
684
728
  /** 仅在无内置项时生效:插入到首部还是尾部(默认 end) */
685
- position?: "start" | "end";
729
+ position?: 'start' | 'end';
686
730
  };
687
731
  type ToolbarActionItem = ToolbarBuiltinActionItem | ToolbarCustomActionItem;
688
732
  type ToolbarActionConfig = ToolbarActionItem[] | ((defaults: ToolbarBuiltinActionItem[]) => ToolbarActionItem[]);
@@ -721,6 +765,12 @@ interface AutoCrudTableProps<TSchema extends z.ZodObject<z.ZodRawShape>> {
721
765
  * - 也可以传完整配置覆盖 label 或 options
722
766
  */
723
767
  batchFields?: (string | BatchUpdateField)[];
768
+ /**
769
+ * 多选后悬浮批量操作栏配置
770
+ * 用法类同 `actions` 行操作和 `toolbarActions` 顶部工具栏。
771
+ * 只传 custom 时保留默认批量操作;包含任意内置 type 时完全接管顺序。
772
+ */
773
+ batchActions?: BatchActionConfig<z.output<TSchema>>;
724
774
  /** 默认排序 */
725
775
  defaultSort?: any[];
726
776
  };
@@ -797,7 +847,7 @@ declare function AutoCrudTable<TSchema extends z.ZodObject<z.ZodRawShape>>({
797
847
  toolbarActions,
798
848
  locale: localeProp,
799
849
  onCreate
800
- }: AutoCrudTableProps<TSchema>): react_jsx_runtime3.JSX.Element;
850
+ }: AutoCrudTableProps<TSchema>): react_jsx_runtime2.JSX.Element;
801
851
  //#endregion
802
852
  //#region src/components/auto-crud/auto-form.d.ts
803
853
  interface AutoFormProps<T extends z.ZodObject<z.ZodRawShape>> {
@@ -829,7 +879,7 @@ declare function AutoFormInner<T extends z.ZodObject<z.ZodRawShape>>({
829
879
  labelAlign,
830
880
  labelWidth,
831
881
  showSubmitButton
832
- }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime3.JSX.Element;
882
+ }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime2.JSX.Element;
833
883
  declare const AutoForm: <T extends z.ZodObject<z.ZodRawShape>>(props: AutoFormProps<T> & {
834
884
  ref?: React.Ref<AutoFormRef>;
835
885
  }) => ReturnType<typeof AutoFormInner>;
@@ -1043,12 +1093,12 @@ declare const filterItemSchema: z.ZodObject<{
1043
1093
  variant: z.ZodEnum<{
1044
1094
  number: "number";
1045
1095
  boolean: "boolean";
1046
- text: "text";
1047
- range: "range";
1048
1096
  date: "date";
1049
- dateRange: "dateRange";
1097
+ text: "text";
1050
1098
  select: "select";
1051
1099
  multiSelect: "multiSelect";
1100
+ dateRange: "dateRange";
1101
+ range: "range";
1052
1102
  }>;
1053
1103
  operator: z.ZodEnum<{
1054
1104
  iLike: "iLike";
@@ -1127,7 +1177,7 @@ declare function AutoTableSimpleFilters<TData>({
1127
1177
  shallow,
1128
1178
  filters: externalFilters,
1129
1179
  onFiltersChange
1130
- }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime3.JSX.Element | null;
1180
+ }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime2.JSX.Element | null;
1131
1181
  //#endregion
1132
1182
  //#region src/components/auto-crud/form-modal.d.ts
1133
1183
  type ModalVariant = "dialog" | "sheet";
@@ -1169,7 +1219,7 @@ declare function CrudFormModal<T extends z.ZodObject<z.ZodRawShape>>({
1169
1219
  labelAlign,
1170
1220
  labelWidth,
1171
1221
  className
1172
- }: CrudFormModalProps<T>): react_jsx_runtime3.JSX.Element;
1222
+ }: CrudFormModalProps<T>): react_jsx_runtime2.JSX.Element;
1173
1223
  //#endregion
1174
1224
  //#region src/components/auto-crud/import-dialog.d.ts
1175
1225
  interface ImportDialogProps {
@@ -1191,7 +1241,7 @@ declare function ImportDialog({
1191
1241
  columns,
1192
1242
  title,
1193
1243
  locale
1194
- }: ImportDialogProps): react_jsx_runtime3.JSX.Element;
1244
+ }: ImportDialogProps): react_jsx_runtime2.JSX.Element;
1195
1245
  //#endregion
1196
1246
  //#region src/components/auto-crud/export-dialog.d.ts
1197
1247
  type ExportMode = "selected" | "filtered";
@@ -1211,7 +1261,7 @@ declare function ExportDialog({
1211
1261
  selectedCount,
1212
1262
  onExport,
1213
1263
  canExportFiltered
1214
- }: ExportDialogProps): react_jsx_runtime3.JSX.Element;
1264
+ }: ExportDialogProps): react_jsx_runtime2.JSX.Element;
1215
1265
  //#endregion
1216
1266
  //#region src/components/data-table/data-table.d.ts
1217
1267
  interface DataTableProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1224,7 +1274,7 @@ declare function DataTable<TData>({
1224
1274
  children,
1225
1275
  className,
1226
1276
  ...props
1227
- }: DataTableProps<TData>): react_jsx_runtime3.JSX.Element;
1277
+ }: DataTableProps<TData>): react_jsx_runtime2.JSX.Element;
1228
1278
  //#endregion
1229
1279
  //#region src/components/data-table/data-table-advanced-toolbar.d.ts
1230
1280
  interface DataTableAdvancedToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1235,7 +1285,7 @@ declare function DataTableAdvancedToolbar<TData>({
1235
1285
  children,
1236
1286
  className,
1237
1287
  ...props
1238
- }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime3.JSX.Element;
1288
+ }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime2.JSX.Element;
1239
1289
  //#endregion
1240
1290
  //#region src/components/data-table/data-table-column-header.d.ts
1241
1291
  interface DataTableColumnHeaderProps<TData, TValue> extends React.ComponentProps<typeof DropdownMenuTrigger> {
@@ -1247,7 +1297,7 @@ declare function DataTableColumnHeader<TData, TValue>({
1247
1297
  label,
1248
1298
  className,
1249
1299
  ...props
1250
- }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime3.JSX.Element;
1300
+ }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime2.JSX.Element;
1251
1301
  //#endregion
1252
1302
  //#region src/components/data-table/data-table-faceted-filter.d.ts
1253
1303
  interface DataTableFacetedFilterProps<TData, TValue> {
@@ -1261,7 +1311,7 @@ declare function DataTableFacetedFilter<TData, TValue>({
1261
1311
  title,
1262
1312
  options,
1263
1313
  multiple
1264
- }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime3.JSX.Element;
1314
+ }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime2.JSX.Element;
1265
1315
  //#endregion
1266
1316
  //#region src/components/data-table/data-table-pagination.d.ts
1267
1317
  interface DataTablePaginationProps<TData> extends React.ComponentProps<"div"> {
@@ -1273,7 +1323,7 @@ declare function DataTablePagination<TData>({
1273
1323
  pageSizeOptions,
1274
1324
  className,
1275
1325
  ...props
1276
- }: DataTablePaginationProps<TData>): react_jsx_runtime3.JSX.Element;
1326
+ }: DataTablePaginationProps<TData>): react_jsx_runtime2.JSX.Element;
1277
1327
  //#endregion
1278
1328
  //#region src/components/data-table/data-table-toolbar.d.ts
1279
1329
  interface DataTableToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1284,7 +1334,7 @@ declare function DataTableToolbar<TData>({
1284
1334
  children,
1285
1335
  className,
1286
1336
  ...props
1287
- }: DataTableToolbarProps<TData>): react_jsx_runtime3.JSX.Element;
1337
+ }: DataTableToolbarProps<TData>): react_jsx_runtime2.JSX.Element;
1288
1338
  //#endregion
1289
1339
  //#region src/components/data-table/data-table-view-options.d.ts
1290
1340
  interface DataTableViewOptionsProps<TData> extends React$1.ComponentProps<typeof PopoverContent> {
@@ -1295,7 +1345,7 @@ declare function DataTableViewOptions<TData>({
1295
1345
  table,
1296
1346
  disabled,
1297
1347
  ...props
1298
- }: DataTableViewOptionsProps<TData>): react_jsx_runtime3.JSX.Element;
1348
+ }: DataTableViewOptionsProps<TData>): react_jsx_runtime2.JSX.Element;
1299
1349
  //#endregion
1300
1350
  //#region src/hooks/use-data-table.d.ts
1301
1351
  interface UseDataTableProps<TData> extends Omit<TableOptions<TData>, "state" | "pageCount" | "getCoreRowModel" | "manualFiltering" | "manualPagination" | "manualSorting">, Required<Pick<TableOptions<TData>, "pageCount">> {
@@ -1630,4 +1680,4 @@ declare function exportAllToCSV<T extends Record<string, unknown>>(data: T[], op
1630
1680
  */
1631
1681
  declare function downloadCSVTemplate(headers: string[], filename?: string): void;
1632
1682
  //#endregion
1633
- export { type ActionItem, type ActionsColumnConfig, type AutoCrudLocale, AutoCrudTable, type AutoCrudTableProps, AutoForm, type AutoQueryParams, AutoTable, AutoTableActionBar, AutoTableSimpleFilters, type ColumnOverrides, type CreateFormSchemaOptions, type CreateTableSchemaOptions, CrudFormModal, type CrudHooks, type CrudOperationPermissions, type CrudPermissions, type DataSource, DataTable, DataTableAdvancedToolbar, DataTableColumnHeader, DataTableFacetedFilter, DataTablePagination, DataTableRowAction, DataTableToolbar, DataTableViewOptions, type EnumOption, ExportDialog, type ExportDialogProps, type ExportMode, ExtendedColumnFilter, ExtendedColumnSort, type Field, type FieldType, type Fields, type FilterConfig, FilterOperator, type FilterVariant, type FormSchemaOverrides, ImportDialog, type ImportDialogProps, type ImportResult, type JSONSchema, type JSONSchemaProperty, JoinOperator, type ListParams, type ListResult, type LocaleProp, Option, type ParsedImportData, type ParsedZodField, type Parser, QueryKeys, SchemaAdapter, type SimpleFieldConfig, type SimpleFieldsConfig, type ToastAdapter, type ToolbarActionItem, type ToolbarBuiltinActionItem, type ToolbarCustomActionItem, type UnifiedField, type UnifiedSchema, type UrlStateOptions, type UseAutoCrudResourceOptions, type UseAutoCrudResourceParams, type UseAutoCrudResourceReturn, cn, coerceRowValues, createActionsColumn, createEditFormSchema, createFormSchema, createMemoryDataSource, createSelectColumn, createTRPCDataSource, createTableSchema, dataToCSV, deDE, downloadCSVTemplate, enUS, esES, exportAllToCSV, exportTableToCSV, formatDate, frFR, generateCSVTemplate, getUrlParams, humanize, jaJP, koKR, noopToastAdapter, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, parseCSV, parseImportFile, parseJSON, parseZodField, resolveLocale, setSearchParams, useAutoCrudResource, useDataTable, useQueryState, useQueryStates, useReadableFilters, useUrlState, useUrlStates, zhCN };
1683
+ export { type ActionItem, type ActionsColumnConfig, type AutoCrudLocale, AutoCrudTable, type AutoCrudTableProps, AutoForm, type AutoQueryParams, AutoTable, AutoTableActionBar, AutoTableSimpleFilters, type BatchActionConfig, type BatchActionContext, type BatchActionItem, type BatchBuiltinActionItem, type BatchBuiltinActionType, type BatchCustomActionItem, type BatchUpdateField, type ColumnOverrides, type CreateFormSchemaOptions, type CreateTableSchemaOptions, CrudFormModal, type CrudHooks, type CrudOperationPermissions, type CrudPermissions, type DataSource, DataTable, DataTableAdvancedToolbar, DataTableColumnHeader, DataTableFacetedFilter, DataTablePagination, DataTableRowAction, DataTableToolbar, DataTableViewOptions, type EnumOption, ExportDialog, type ExportDialogProps, type ExportMode, ExtendedColumnFilter, ExtendedColumnSort, type Field, type FieldType, type Fields, type FilterConfig, FilterOperator, type FilterVariant, type FormSchemaOverrides, ImportDialog, type ImportDialogProps, type ImportResult, type JSONSchema, type JSONSchemaProperty, JoinOperator, type ListParams, type ListResult, type LocaleProp, Option, type ParsedImportData, type ParsedZodField, type Parser, QueryKeys, SchemaAdapter, type SimpleFieldConfig, type SimpleFieldsConfig, type ToastAdapter, type ToolbarActionItem, type ToolbarBuiltinActionItem, type ToolbarCustomActionItem, type UnifiedField, type UnifiedSchema, type UrlStateOptions, type UseAutoCrudResourceOptions, type UseAutoCrudResourceParams, type UseAutoCrudResourceReturn, cn, coerceRowValues, createActionsColumn, createEditFormSchema, createFormSchema, createMemoryDataSource, createSelectColumn, createTRPCDataSource, createTableSchema, dataToCSV, deDE, downloadCSVTemplate, enUS, esES, exportAllToCSV, exportTableToCSV, formatDate, frFR, generateCSVTemplate, getUrlParams, humanize, jaJP, koKR, noopToastAdapter, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, parseCSV, parseImportFile, parseJSON, parseZodField, resolveLocale, setSearchParams, useAutoCrudResource, useDataTable, useQueryState, useQueryStates, useReadableFilters, useUrlState, useUrlStates, zhCN };
package/dist/index.js CHANGED
@@ -4215,11 +4215,27 @@ function downloadCSV(csvContent, filename) {
4215
4215
 
4216
4216
  //#endregion
4217
4217
  //#region src/components/auto-crud/auto-table-action-bar.tsx
4218
- function AutoTableActionBar({ table, onDeleteSelected, onUpdateSelected, batchUpdateFields, enableExport = true, enableDelete = true, extraActions }) {
4218
+ function isBatchCustomAction(action) {
4219
+ return action.type === "custom";
4220
+ }
4221
+ function AutoTableActionBar({ table, onDeleteSelected, onUpdateSelected, batchUpdateFields, enableExport = true, showDefaultExport = true, enableDelete = true, extraActions, actions }) {
4219
4222
  const rows = table.getFilteredSelectedRowModel().rows;
4220
- const onOpenChange = React.useCallback((open) => {
4221
- if (!open) table.toggleAllRowsSelected(false);
4223
+ const selectedRows = React.useMemo(() => rows.map((row) => row.original), [rows]);
4224
+ const clearSelection = React.useCallback(() => {
4225
+ table.toggleAllRowsSelected(false);
4222
4226
  }, [table]);
4227
+ const actionContext = React.useMemo(() => ({
4228
+ rows: selectedRows,
4229
+ table,
4230
+ clearSelection
4231
+ }), [
4232
+ selectedRows,
4233
+ table,
4234
+ clearSelection
4235
+ ]);
4236
+ const onOpenChange = React.useCallback((open) => {
4237
+ if (!open) clearSelection();
4238
+ }, [clearSelection]);
4223
4239
  const onExport = React.useCallback(() => {
4224
4240
  exportTableToCSV(table, {
4225
4241
  excludeColumns: ["select", "actions"],
@@ -4227,17 +4243,108 @@ function AutoTableActionBar({ table, onDeleteSelected, onUpdateSelected, batchUp
4227
4243
  });
4228
4244
  }, [table]);
4229
4245
  const onDelete = React.useCallback(() => {
4230
- if (onDeleteSelected) onDeleteSelected(rows.map((row) => row.original));
4231
- }, [rows, onDeleteSelected]);
4246
+ if (onDeleteSelected) onDeleteSelected(selectedRows);
4247
+ }, [selectedRows, onDeleteSelected]);
4232
4248
  const handleBatchUpdate = React.useCallback((field, value) => {
4233
4249
  if (onUpdateSelected) {
4234
- onUpdateSelected(rows.map((row) => row.original), { [field]: value });
4235
- table.toggleAllRowsSelected(false);
4250
+ onUpdateSelected(selectedRows, { [field]: value });
4251
+ clearSelection();
4236
4252
  }
4237
4253
  }, [
4238
- rows,
4254
+ selectedRows,
4255
+ onUpdateSelected,
4256
+ clearSelection
4257
+ ]);
4258
+ const renderComponent = React.useCallback((component) => typeof component === "function" ? component(actionContext) : component, [actionContext]);
4259
+ const renderBatchUpdate = React.useCallback((keyPrefix = "batch-update") => batchUpdateFields?.map((fieldConfig) => /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
4260
+ asChild: true,
4261
+ children: /* @__PURE__ */ jsxs(Button, {
4262
+ variant: "ghost",
4263
+ size: "sm",
4264
+ className: "h-7 gap-1 px-2",
4265
+ children: [fieldConfig.label, /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5" })]
4266
+ })
4267
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, {
4268
+ align: "start",
4269
+ children: fieldConfig.options.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, {
4270
+ onClick: () => handleBatchUpdate(fieldConfig.field, option.value),
4271
+ children: option.label
4272
+ }, option.value))
4273
+ })] }, `${keyPrefix}-${fieldConfig.field}`)), [batchUpdateFields, handleBatchUpdate]);
4274
+ const renderBuiltinAction = React.useCallback((action) => {
4275
+ if (!(action.type === "batchUpdate" ? !!onUpdateSelected && !!batchUpdateFields?.length : action.type === "export" ? enableExport : enableDelete && !!onDeleteSelected)) return null;
4276
+ if (action.component) return renderComponent(action.component);
4277
+ if (action.type === "batchUpdate") return renderBatchUpdate(action.type);
4278
+ if (action.type === "export") return /* @__PURE__ */ jsxs(ActionBarItem, {
4279
+ onClick: (event) => action.onClick ? action.onClick(selectedRows, actionContext, event) : onExport(),
4280
+ children: [/* @__PURE__ */ jsx(Download, {}), action.label ?? "Export"]
4281
+ }, "export");
4282
+ if (action.type === "delete") return /* @__PURE__ */ jsxs(ActionBarItem, {
4283
+ variant: "destructive",
4284
+ onClick: (event) => action.onClick ? action.onClick(selectedRows, actionContext, event) : onDelete(),
4285
+ children: [/* @__PURE__ */ jsx(Trash2, {}), action.label ?? "Delete"]
4286
+ }, "delete");
4287
+ return null;
4288
+ }, [
4289
+ actionContext,
4290
+ batchUpdateFields?.length,
4291
+ enableDelete,
4292
+ enableExport,
4293
+ onDelete,
4294
+ onDeleteSelected,
4239
4295
  onUpdateSelected,
4240
- table
4296
+ onExport,
4297
+ renderBatchUpdate,
4298
+ renderComponent,
4299
+ selectedRows
4300
+ ]);
4301
+ const renderCustomAction = React.useCallback((action, index) => {
4302
+ if (action.component) return /* @__PURE__ */ jsx(React.Fragment, { children: renderComponent(action.component) }, `custom-${index}`);
4303
+ if (!action.label || !action.onClick) return null;
4304
+ return /* @__PURE__ */ jsx(ActionBarItem, {
4305
+ variant: action.variant === "destructive" ? "destructive" : "secondary",
4306
+ onClick: (event) => action.onClick?.(selectedRows, actionContext, event),
4307
+ children: action.label
4308
+ }, `custom-${index}`);
4309
+ }, [
4310
+ actionContext,
4311
+ renderComponent,
4312
+ selectedRows
4313
+ ]);
4314
+ const renderedActions = React.useMemo(() => {
4315
+ const resolvedActions = typeof actions === "function" ? actions([
4316
+ { type: "batchUpdate" },
4317
+ { type: "export" },
4318
+ { type: "delete" }
4319
+ ]) : actions;
4320
+ if (!resolvedActions || resolvedActions.length === 0) return /* @__PURE__ */ jsxs(Fragment, { children: [
4321
+ renderBuiltinAction({ type: "batchUpdate" }),
4322
+ extraActions,
4323
+ showDefaultExport && renderBuiltinAction({ type: "export" }),
4324
+ renderBuiltinAction({ type: "delete" })
4325
+ ] });
4326
+ if (!resolvedActions.some((action) => action.type !== "custom")) {
4327
+ const startNodes = resolvedActions.filter(isBatchCustomAction).filter((action) => action.position === "start").map((action, index) => renderCustomAction(action, index));
4328
+ const endNodes = resolvedActions.filter(isBatchCustomAction).filter((action) => action.position !== "start").map((action, index) => renderCustomAction(action, index));
4329
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4330
+ startNodes,
4331
+ renderBuiltinAction({ type: "batchUpdate" }),
4332
+ extraActions,
4333
+ showDefaultExport && renderBuiltinAction({ type: "export" }),
4334
+ renderBuiltinAction({ type: "delete" }),
4335
+ endNodes
4336
+ ] });
4337
+ }
4338
+ return resolvedActions.map((action, index) => {
4339
+ if (action.type === "custom") return renderCustomAction(action, index);
4340
+ return /* @__PURE__ */ jsx(React.Fragment, { children: renderBuiltinAction(action) }, action.type);
4341
+ });
4342
+ }, [
4343
+ actions,
4344
+ extraActions,
4345
+ renderBuiltinAction,
4346
+ renderCustomAction,
4347
+ showDefaultExport
4241
4348
  ]);
4242
4349
  return /* @__PURE__ */ jsxs(ActionBar, {
4243
4350
  open: rows.length > 0,
@@ -4253,33 +4360,7 @@ function AutoTableActionBar({ table, onDeleteSelected, onUpdateSelected, batchUp
4253
4360
  /* @__PURE__ */ jsx(ActionBarClose, { children: /* @__PURE__ */ jsx(X, {}) })
4254
4361
  ] }),
4255
4362
  /* @__PURE__ */ jsx(ActionBarSeparator, {}),
4256
- /* @__PURE__ */ jsxs(ActionBarGroup, { children: [
4257
- batchUpdateFields?.map((fieldConfig) => /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
4258
- asChild: true,
4259
- children: /* @__PURE__ */ jsxs(Button, {
4260
- variant: "ghost",
4261
- size: "sm",
4262
- className: "h-7 gap-1 px-2",
4263
- children: [fieldConfig.label, /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5" })]
4264
- })
4265
- }), /* @__PURE__ */ jsx(DropdownMenuContent, {
4266
- align: "start",
4267
- children: fieldConfig.options.map((option) => /* @__PURE__ */ jsx(DropdownMenuItem, {
4268
- onClick: () => handleBatchUpdate(fieldConfig.field, option.value),
4269
- children: option.label
4270
- }, option.value))
4271
- })] }, fieldConfig.field)),
4272
- extraActions,
4273
- enableExport && /* @__PURE__ */ jsxs(ActionBarItem, {
4274
- onClick: onExport,
4275
- children: [/* @__PURE__ */ jsx(Download, {}), "Export"]
4276
- }),
4277
- enableDelete && onDeleteSelected && /* @__PURE__ */ jsxs(ActionBarItem, {
4278
- variant: "destructive",
4279
- onClick: onDelete,
4280
- children: [/* @__PURE__ */ jsx(Trash2, {}), "Delete"]
4281
- })
4282
- ] })
4363
+ /* @__PURE__ */ jsx(ActionBarGroup, { children: renderedActions })
4283
4364
  ]
4284
4365
  });
4285
4366
  }
@@ -4540,7 +4621,7 @@ const filterModeConfig = {
4540
4621
  tooltip: "Linear-style command filters"
4541
4622
  }
4542
4623
  };
4543
- function AutoTable({ schema, data, pageCount = 1, overrides, enableRowSelection = true, exclude, actions, pinnedColumns, filterMode = "simple", onDeleteSelected, onUpdateSelected, batchUpdateFields, actionBarExtra, initialSorting, enableExport = true, onSelectedCountChange, getSelectedRows }) {
4624
+ function AutoTable({ schema, data, pageCount = 1, overrides, enableRowSelection = true, exclude, actions, pinnedColumns, filterMode = "simple", onDeleteSelected, onUpdateSelected, batchUpdateFields, actionBarExtra, actionBarActions, initialSorting, enableExport = true, showDefaultExport = true, onSelectedCountChange, getSelectedRows }) {
4544
4625
  const modes = filterMode ? Array.isArray(filterMode) ? filterMode : [filterMode] : DEFAULT_MODES;
4545
4626
  const [currentMode, setCurrentMode] = useQueryState("filterMode", parseAsStringEnum(modes).withDefault(modes[0] ?? "simple"));
4546
4627
  const showToggle = modes.length > 1;
@@ -4677,7 +4758,9 @@ function AutoTable({ schema, data, pageCount = 1, overrides, enableRowSelection
4677
4758
  batchUpdateFields,
4678
4759
  enableDelete: !!onDeleteSelected,
4679
4760
  enableExport,
4680
- extraActions: actionBarExtra
4761
+ showDefaultExport,
4762
+ extraActions: actionBarExtra,
4763
+ actions: actionBarActions
4681
4764
  })
4682
4765
  ]
4683
4766
  });
@@ -5931,6 +6014,12 @@ function resolveActions(actionsOrFn, defaults, rowActionsLocale) {
5931
6014
  copy: defaults.copyRow,
5932
6015
  delete: defaults.openDelete
5933
6016
  };
6017
+ const visibleMap = {
6018
+ view: true,
6019
+ edit: !!defaults.openEdit,
6020
+ copy: !!defaults.copyRow,
6021
+ delete: !!defaults.openDelete
6022
+ };
5934
6023
  const variantMap = { delete: "destructive" };
5935
6024
  return items.flatMap((item) => {
5936
6025
  if (item.type === "custom") return [{
@@ -5939,6 +6028,7 @@ function resolveActions(actionsOrFn, defaults, rowActionsLocale) {
5939
6028
  separator: item.separator,
5940
6029
  variant: item.variant
5941
6030
  }];
6031
+ if (!visibleMap[item.type]) return [];
5942
6032
  const handler = item.onClick ?? handlerMap[item.type];
5943
6033
  if (!handler) return [];
5944
6034
  return [{
@@ -6115,7 +6205,9 @@ function AutoCrudTable({ title, description, schema, resource, fields, table: ta
6115
6205
  onDeleteSelected: can.delete ? resource.handlers.deleteMany : void 0,
6116
6206
  onUpdateSelected: can.update ? resource.handlers.updateMany : void 0,
6117
6207
  batchUpdateFields: can.update ? batchFields : void 0,
6118
- enableExport: false,
6208
+ actionBarActions: tableConfig?.batchActions,
6209
+ enableExport: canExport,
6210
+ showDefaultExport: false,
6119
6211
  initialSorting: tableConfig?.defaultSort,
6120
6212
  onSelectedCountChange: setSelectedCount,
6121
6213
  getSelectedRows: getSelectedRowsRef
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wordrhyme/auto-crud",
3
3
  "type": "module",
4
- "version": "1.1.0",
4
+ "version": "1.1.2",
5
5
  "description": "Schema-first CRUD components with auto-generated tables and forms",
6
6
  "author": "wordrhyme",
7
7
  "license": "MIT",
@@ -57,36 +57,36 @@
57
57
  "@radix-ui/react-toggle-group": "^1.1.11",
58
58
  "@radix-ui/react-tooltip": "^1.2.8",
59
59
  "@tanstack/react-table": "^8.21.3",
60
- "@tanstack/react-virtual": "^3.13.18",
60
+ "@tanstack/react-virtual": "^3.13.23",
61
61
  "class-variance-authority": "^0.7.1",
62
62
  "clsx": "^2.1.1",
63
63
  "cmdk": "^1.1.1",
64
64
  "lucide-react": "0.553.0",
65
65
  "nanoid": "^5.1.6",
66
- "tailwind-merge": "^3.4.0",
66
+ "tailwind-merge": "^3.5.0",
67
67
  "vaul": "^1.1.2",
68
- "@pixpilot/formily-shadcn": "1.7.2",
69
- "@pixpilot/shadcn": "1.2.0",
70
- "@pixpilot/shadcn-ui": "1.4.0"
68
+ "@pixpilot/formily-shadcn": "1.11.20",
69
+ "@pixpilot/shadcn": "1.2.7",
70
+ "@pixpilot/shadcn-ui": "1.21.1"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@tanstack/react-query": "^5.90.15",
74
- "@testing-library/react": "^16.3.0",
74
+ "@testing-library/react": "^16.3.2",
75
75
  "@trpc/server": "^11.0.0",
76
- "@types/node": "^22.19.3",
77
- "@types/react": "^19.2.7",
76
+ "@types/node": "^22.19.17",
77
+ "@types/react": "^19.2.14",
78
78
  "@types/react-dom": "^19.2.3",
79
79
  "drizzle-orm": "1.0.0-beta.15-859cf75",
80
- "eslint": "^9.39.2",
80
+ "eslint": "^9.39.4",
81
81
  "react": "19.2.4",
82
82
  "react-dom": "19.2.4",
83
83
  "tsdown": "^0.15.12",
84
84
  "typescript": "^5.9.3",
85
- "@internal/eslint-config": "0.3.0",
86
85
  "@internal/prettier-config": "0.0.1",
87
86
  "@internal/tsconfig": "0.1.0",
88
- "@internal/tsdown-config": "0.1.0",
89
- "@internal/vitest-config": "0.1.0"
87
+ "@internal/eslint-config": "0.3.0",
88
+ "@internal/vitest-config": "0.1.0",
89
+ "@internal/tsdown-config": "0.1.0"
90
90
  },
91
91
  "prettier": "@internal/prettier-config",
92
92
  "scripts": {