@wordrhyme/auto-crud 1.3.6 → 1.3.8

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/README.md CHANGED
@@ -268,7 +268,7 @@ interface AutoCrudTableProps<TSchema> {
268
268
  batchFields?: (string | BatchUpdateField)[]; // 批量更新字段
269
269
  /** @deprecated 新代码请使用 actions.batch */
270
270
  batchActions?: BatchActionConfig<z.output<TSchema>>;
271
- defaultSort?: any[]; // 默认排序
271
+ defaultSort?: any[]; // 手动 resource 的 UI 默认排序;useAutoCrudResource 请配置 options.defaultSort
272
272
  };
273
273
  form?: {
274
274
  overrides?: Record<string, any>; // 表单覆盖配置
@@ -280,11 +280,13 @@ interface AutoCrudTableProps<TSchema> {
280
280
  * 旧写法 actions={[...]} 仍表示行操作;
281
281
  * 新写法 actions={{ toolbar, row, batch }} 可集中配置三类操作。
282
282
  */
283
- actions?: RowActionConfig<z.output<TSchema>> | {
284
- toolbar?: ToolbarActionConfig;
285
- row?: RowActionConfig<z.output<TSchema>>;
286
- batch?: BatchActionConfig<z.output<TSchema>>;
287
- };
283
+ actions?:
284
+ | RowActionConfig<z.output<TSchema>>
285
+ | {
286
+ toolbar?: ToolbarActionConfig;
287
+ row?: RowActionConfig<z.output<TSchema>>;
288
+ batch?: BatchActionConfig<z.output<TSchema>>;
289
+ };
288
290
  /** @deprecated 新代码请使用 actions.toolbar */
289
291
  toolbar?: ToolbarActionConfig;
290
292
  /** @deprecated 新代码请使用 actions.toolbar */
@@ -302,6 +304,11 @@ interface AutoCrudTableProps<TSchema> {
302
304
  interface UseAutoCrudResourceConfig<TData> {
303
305
  dataSource: DataSource<TData>; // 数据源
304
306
  schema: z.ZodType<TData>; // Zod Schema
307
+ options?: {
308
+ defaultSort?: Array<{ id: string; desc: boolean }> | false;
309
+ // undefined: schema 有 createdAt 时默认 createdAt desc
310
+ // false: 不应用默认排序
311
+ };
305
312
  }
306
313
  ```
307
314
 
@@ -776,7 +783,12 @@ crudActions.register({
776
783
  actions={{
777
784
  row: [
778
785
  { type: 'custom', label: '分配', onClick: (row) => assign(row.id) },
779
- { type: 'custom', label: '预览', onClick: (row) => preview(row), position: 'start' },
786
+ {
787
+ type: 'custom',
788
+ label: '预览',
789
+ onClick: (row) => preview(row),
790
+ position: 'start',
791
+ },
780
792
  ],
781
793
  }}
782
794
  />
@@ -849,7 +861,9 @@ type RowCustomActionItem<T> = ActionMeta & {
849
861
  type: 'custom';
850
862
  label?: string;
851
863
  onClick?: (row: T) => void;
852
- component?: React.ReactNode | ((context: AutoCrudRowActionContext<T>) => React.ReactNode);
864
+ component?:
865
+ | React.ReactNode
866
+ | ((context: AutoCrudRowActionContext<T>) => React.ReactNode);
853
867
  position?: 'start' | 'end'; // 仅无内置项时生效,默认 end
854
868
  separator?: boolean;
855
869
  variant?: 'default' | 'destructive';
@@ -992,7 +1006,7 @@ import {
992
1006
  createSelectColumn, // 创建选择列
993
1007
  createActionsColumn, // 创建操作列
994
1008
  createFormSchema, // Zod Schema → Formily Schema
995
- createEditFormSchema, // 创建编辑表单 Schema(排除 id, createdAt, updatedAt)
1009
+ createEditFormSchema, // 创建编辑表单 Schema(排除平台托管字段)
996
1010
  } from '@wordrhyme/auto-crud';
997
1011
  ```
998
1012
 
@@ -1254,7 +1268,15 @@ function CustomCrudPage() {
1254
1268
  });
1255
1269
 
1256
1270
  const formSchema = createFormSchema(taskSchema, {
1257
- exclude: ["id", "createdAt", "updatedAt"],
1271
+ exclude: [
1272
+ "id",
1273
+ "createdAt",
1274
+ "updatedAt",
1275
+ "createdBy",
1276
+ "createdByType",
1277
+ "updatedBy",
1278
+ "updatedByType",
1279
+ ],
1258
1280
  });
1259
1281
 
1260
1282
  return (
package/dist/index.cjs CHANGED
@@ -4207,6 +4207,15 @@ function FormModal({ open, onOpenChange, title, description, children, variant =
4207
4207
 
4208
4208
  //#endregion
4209
4209
  //#region src/lib/schema-bridge/zod-to-formily.ts
4210
+ const DEFAULT_FORM_MANAGED_FIELDS = [
4211
+ "id",
4212
+ "createdAt",
4213
+ "updatedAt",
4214
+ "createdBy",
4215
+ "createdByType",
4216
+ "updatedBy",
4217
+ "updatedByType"
4218
+ ];
4210
4219
  /**
4211
4220
  * 将字符串转为人类可读格式
4212
4221
  */
@@ -4289,16 +4298,12 @@ function createFormSchema(schema, options) {
4289
4298
  };
4290
4299
  }
4291
4300
  /**
4292
- * 为编辑模式创建 Form Schema(排除 id, createdAt, updatedAt)
4301
+ * 为编辑模式创建 Form Schema(排除平台托管字段)
4293
4302
  */
4294
4303
  function createEditFormSchema(schema, options) {
4295
4304
  return createFormSchema(schema, {
4296
4305
  ...options,
4297
- exclude: [
4298
- "id",
4299
- "createdAt",
4300
- "updatedAt"
4301
- ]
4306
+ exclude: [...DEFAULT_FORM_MANAGED_FIELDS]
4302
4307
  });
4303
4308
  }
4304
4309
 
@@ -5632,6 +5637,15 @@ function ImportDialog({ open, onOpenChange, onImport, columns = [], title, local
5632
5637
  });
5633
5638
  }
5634
5639
 
5640
+ //#endregion
5641
+ //#region src/lib/default-sorting.ts
5642
+ function getDefaultSortingForSchema(schema) {
5643
+ return Object.prototype.hasOwnProperty.call(schema.shape, "createdAt") ? [{
5644
+ id: "createdAt",
5645
+ desc: true
5646
+ }] : [];
5647
+ }
5648
+
5635
5649
  //#endregion
5636
5650
  //#region src/lib/crud-actions.ts
5637
5651
  const entries = /* @__PURE__ */ new Map();
@@ -5781,6 +5795,29 @@ const crudActions = {
5781
5795
 
5782
5796
  //#endregion
5783
5797
  //#region src/components/auto-crud/auto-crud-table.tsx
5798
+ const DEFAULT_IMPORT_MANAGED_FIELDS = [
5799
+ "createdAt",
5800
+ "updatedAt",
5801
+ "createdBy",
5802
+ "createdByType",
5803
+ "updatedBy",
5804
+ "updatedByType"
5805
+ ];
5806
+ const DEFAULT_HIDDEN_AUDIT_FIELDS = [
5807
+ "createdBy",
5808
+ "createdByType",
5809
+ "updatedBy",
5810
+ "updatedByType"
5811
+ ];
5812
+ function isDefaultHiddenAuditField(key) {
5813
+ return DEFAULT_HIDDEN_AUDIT_FIELDS.includes(key);
5814
+ }
5815
+ function isFieldTableExplicitlyVisible(config) {
5816
+ return config?.hidden === false || config?.table !== false && typeof config?.table === "object" && config.table.hidden === false;
5817
+ }
5818
+ function isTableOverrideExplicitlyVisible(config) {
5819
+ return config?.hidden === false;
5820
+ }
5784
5821
  let autoCrudToolbarResolver = null;
5785
5822
  function setToolbarResolver(resolver) {
5786
5823
  autoCrudToolbarResolver = resolver;
@@ -6232,10 +6269,18 @@ function buildTableOverrides(fields, legacyOverrides, dynamicFilterState) {
6232
6269
  /**
6233
6270
  * 从统一配置生成隐藏列列表
6234
6271
  */
6235
- function buildHiddenColumns(fields, legacyHidden, denyFields) {
6236
- const hidden = new Set([...legacyHidden ?? [], ...denyFields ?? []]);
6237
- if (fields) {
6238
- for (const [key, config] of Object.entries(fields)) if (config.hidden) hidden.add(key);
6272
+ function buildHiddenColumns(fields, legacyHidden, denyFields, legacyOverrides) {
6273
+ const legacyHiddenSet = new Set(legacyHidden ?? []);
6274
+ const denySet = new Set(denyFields ?? []);
6275
+ const hidden = new Set([
6276
+ ...DEFAULT_HIDDEN_AUDIT_FIELDS,
6277
+ ...legacyHiddenSet,
6278
+ ...denySet
6279
+ ]);
6280
+ for (const key of DEFAULT_HIDDEN_AUDIT_FIELDS) if (!legacyHiddenSet.has(key) && !denySet.has(key) && isTableOverrideExplicitlyVisible(legacyOverrides?.[key])) hidden.delete(key);
6281
+ if (fields) for (const [key, config] of Object.entries(fields)) {
6282
+ if (isDefaultHiddenAuditField(key) && !legacyHiddenSet.has(key) && !denySet.has(key) && isFieldTableExplicitlyVisible(config)) hidden.delete(key);
6283
+ if (config.hidden) hidden.add(key);
6239
6284
  else if (config.table === false) hidden.add(key);
6240
6285
  else if (config.table && typeof config.table === "object" && config.table.hidden) hidden.add(key);
6241
6286
  }
@@ -6339,7 +6384,10 @@ function ViewModal({ open, onOpenChange, variant, data, schema, fields: fieldCon
6339
6384
  className: "grid gap-4 py-4",
6340
6385
  children: Object.entries(shape).filter(([key]) => {
6341
6386
  if (denySet.has(key)) return false;
6342
- return !(fieldConfig?.[key])?.hidden;
6387
+ const config = fieldConfig?.[key];
6388
+ if (config?.hidden) return false;
6389
+ if (isDefaultHiddenAuditField(key) && !isFieldTableExplicitlyVisible(config)) return false;
6390
+ return true;
6343
6391
  }).map(([key, fieldSchema]) => {
6344
6392
  const parsed = parseZodField(fieldSchema);
6345
6393
  const label = fieldConfig?.[key]?.label ?? humanize(key);
@@ -6552,7 +6600,7 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6552
6600
  const resolvedToolbarActions = resolveToolbarActionsWithResolver(id, registryToolbarActions, toolbarContext);
6553
6601
  const importColumns = react.useMemo(() => {
6554
6602
  const shape = resolvedSchema.shape;
6555
- const denySet = new Set(denyFields ?? []);
6603
+ const denySet = new Set([...DEFAULT_IMPORT_MANAGED_FIELDS, ...denyFields ?? []]);
6556
6604
  return Object.keys(shape).filter((key) => !denySet.has(key));
6557
6605
  }, [resolvedSchema, denyFields]);
6558
6606
  const handleExport = react.useCallback(async (mode) => {
@@ -6591,15 +6639,21 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6591
6639
  tableConfig?.overrides,
6592
6640
  dynamicFilterOptions
6593
6641
  ]);
6642
+ const defaultSort = react.useMemo(() => resource.defaultSort ?? tableConfig?.defaultSort ?? getDefaultSortingForSchema(resolvedSchema), [
6643
+ resource.defaultSort,
6644
+ resolvedSchema,
6645
+ tableConfig?.defaultSort
6646
+ ]);
6594
6647
  const formOverrides = react.useMemo(() => buildFormOverrides(resolvedFields, formConfig?.overrides, denyFields), [
6595
6648
  resolvedFields,
6596
6649
  formConfig?.overrides,
6597
6650
  denyFields
6598
6651
  ]);
6599
- const hiddenColumns = react.useMemo(() => buildHiddenColumns(resolvedFields, tableConfig?.hidden, denyFields), [
6652
+ const hiddenColumns = react.useMemo(() => buildHiddenColumns(resolvedFields, tableConfig?.hidden, denyFields, tableConfig?.overrides), [
6600
6653
  resolvedFields,
6601
6654
  tableConfig?.hidden,
6602
- denyFields
6655
+ denyFields,
6656
+ tableConfig?.overrides
6603
6657
  ]);
6604
6658
  const searchConfig = react.useMemo(() => {
6605
6659
  const tableSearch = tableConfig?.search;
@@ -6747,7 +6801,7 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6747
6801
  deleteConfirmation: locale.bulkDeleteModal,
6748
6802
  enableExport: canExport,
6749
6803
  showDefaultExport: false,
6750
- initialSorting: tableConfig?.defaultSort,
6804
+ initialSorting: defaultSort,
6751
6805
  onSelectedRowsChange: handleSelectedRowsChange,
6752
6806
  getSelectedRows: getSelectedRowsRef
6753
6807
  }),
@@ -7549,7 +7603,7 @@ function modalReducer(state, action$1) {
7549
7603
  * Hook 主函数
7550
7604
  */
7551
7605
  function useAutoCrudResource({ router, schema, query: queryTransform, options = {} }) {
7552
- const { idKey = "id", defaultVariant = "dialog", hooks, toast: toastAdapter, exportFetcher } = options;
7606
+ const { idKey = "id", defaultVariant = "dialog", hooks, toast: toastAdapter, exportFetcher, defaultSort: defaultSortOption } = options;
7553
7607
  const toast = (0, react.useMemo)(() => toastAdapter === false ? noopToastAdapter : toastAdapter ?? defaultToastAdapter, [toastAdapter]);
7554
7608
  const hooksRef = (0, react.useRef)(hooks);
7555
7609
  (0, react.useEffect)(() => {
@@ -7557,12 +7611,13 @@ function useAutoCrudResource({ router, schema, query: queryTransform, options =
7557
7611
  }, [hooks]);
7558
7612
  const metadata = (router.meta?.useQuery(void 0, { staleTime: 3e4 }))?.data;
7559
7613
  const resolvedSchema = (0, react.useMemo)(() => mergeMetadataSchema(schema, metadata?.schema), [schema, metadata?.schema]);
7614
+ const defaultSorting = (0, react.useMemo)(() => defaultSortOption === false ? [] : defaultSortOption ?? getDefaultSortingForSchema(resolvedSchema), [defaultSortOption, resolvedSchema]);
7560
7615
  const metadataFields = (0, react.useMemo)(() => readMetadataFields(metadata?.fields), [metadata?.fields]);
7561
7616
  const columns = (0, react.useMemo)(() => createTableSchema(resolvedSchema), [resolvedSchema]);
7562
7617
  const [urlParams] = useQueryStates({
7563
7618
  page: parseAsInteger.withDefault(1),
7564
7619
  perPage: parseAsInteger.withDefault(10),
7565
- sort: getSortingStateParser().withDefault([]),
7620
+ sort: getSortingStateParser().withDefault(defaultSorting),
7566
7621
  joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"),
7567
7622
  search: parseAsString.withDefault("")
7568
7623
  }, { shallow: false });
@@ -7850,6 +7905,7 @@ function useAutoCrudResource({ router, schema, query: queryTransform, options =
7850
7905
  },
7851
7906
  schema: resolvedSchema,
7852
7907
  fields: metadataFields,
7908
+ defaultSort: defaultSorting,
7853
7909
  modal,
7854
7910
  mutations: {
7855
7911
  isCreating: createMutation.isPending,
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime0 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime5 from "react/jsx-runtime";
2
2
  import { z } from "zod";
3
3
  import { JsonSchemaFormScope } from "@wordrhyme/formily-shadcn";
4
4
  import * as _tanstack_react_table0 from "@tanstack/react-table";
@@ -9,6 +9,12 @@ import { DropdownMenuTrigger, PopoverContent } from "@wordrhyme/shadcn";
9
9
  import { MultiCombobox, MultiComboboxOption, MultiComboboxProps, MultiComboboxTriggerRenderProps, Select, SelectMode, SelectOption, SelectProps, SelectSearchableDynamicProps, SelectSearchableMultipleProps, SelectSearchableProps, SelectSearchableSingleProps, SelectSimpleProps, SelectTriggerRenderProps } from "@wordrhyme/shadcn-ui";
10
10
  import { ClassValue } from "clsx";
11
11
 
12
+ //#region src/lib/default-sorting.d.ts
13
+ type AutoCrudSorting = Array<{
14
+ id: string;
15
+ desc: boolean;
16
+ }>;
17
+ //#endregion
12
18
  //#region src/hooks/use-auto-crud-resource.d.ts
13
19
  /**
14
20
  * Toast 适配器接口
@@ -103,6 +109,12 @@ interface UseAutoCrudResourceOptions<TSchema extends z.ZodObject<z.ZodRawShape>,
103
109
  total: number;
104
110
  hasMore: boolean;
105
111
  }>;
112
+ /**
113
+ * 默认排序。
114
+ * - undefined: schema 有 createdAt 时默认 createdAt desc
115
+ * - false: 不应用默认排序
116
+ */
117
+ defaultSort?: AutoCrudSorting | false;
106
118
  }
107
119
  /**
108
120
  * 导入结果类型(与服务端保持一致)
@@ -133,6 +145,8 @@ interface UseAutoCrudResourceReturn<TSchema extends z.ZodObject<z.ZodRawShape>,
133
145
  schema?: z.ZodObject<z.ZodRawShape>;
134
146
  /** Optional field config override from host metadata. */
135
147
  fields?: Fields;
148
+ /** Default sorting used by this resource's list query. */
149
+ defaultSort?: AutoCrudSorting;
136
150
  modal: ModalState<TListItem>;
137
151
  mutations: {
138
152
  isCreating: boolean;
@@ -381,7 +395,7 @@ declare function AutoTableActionBar<TData>({
381
395
  extraActions,
382
396
  actions,
383
397
  deleteConfirmation
384
- }: AutoTableActionBarProps<TData>): react_jsx_runtime0.JSX.Element;
398
+ }: AutoTableActionBarProps<TData>): react_jsx_runtime5.JSX.Element;
385
399
  //#endregion
386
400
  //#region src/lib/schema-bridge/types.d.ts
387
401
  /**
@@ -557,7 +571,7 @@ declare function AutoTable<T extends z.ZodObject<z.ZodRawShape>>({
557
571
  onSelectedCountChange,
558
572
  onSelectedRowsChange,
559
573
  getSelectedRows
560
- }: AutoTableProps<T>): react_jsx_runtime0.JSX.Element;
574
+ }: AutoTableProps<T>): react_jsx_runtime5.JSX.Element;
561
575
  //#endregion
562
576
  //#region src/i18n/locale.d.ts
563
577
  /**
@@ -1037,7 +1051,7 @@ declare function AutoCrudTable<TSchema extends z.ZodObject<z.ZodRawShape>>({
1037
1051
  toolbarActions,
1038
1052
  locale: localeProp,
1039
1053
  onCreate
1040
- }: AutoCrudTableProps<TSchema>): react_jsx_runtime0.JSX.Element;
1054
+ }: AutoCrudTableProps<TSchema>): react_jsx_runtime5.JSX.Element;
1041
1055
  //#endregion
1042
1056
  //#region src/components/auto-crud/auto-form.d.ts
1043
1057
  interface AutoFormProps<T extends z.ZodObject<z.ZodRawShape>> {
@@ -1076,7 +1090,7 @@ declare function AutoFormInner<T extends z.ZodObject<z.ZodRawShape>>({
1076
1090
  labelAlign,
1077
1091
  labelWidth,
1078
1092
  showSubmitButton
1079
- }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime0.JSX.Element;
1093
+ }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime5.JSX.Element;
1080
1094
  declare const AutoForm: <T extends z.ZodObject<z.ZodRawShape>>(props: AutoFormProps<T> & {
1081
1095
  ref?: React.Ref<AutoFormRef>;
1082
1096
  }) => ReturnType<typeof AutoFormInner>;
@@ -1392,7 +1406,7 @@ declare function AutoTableSimpleFilters<TData>({
1392
1406
  filters: externalFilters,
1393
1407
  onFiltersChange,
1394
1408
  leading
1395
- }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime0.JSX.Element | null;
1409
+ }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime5.JSX.Element | null;
1396
1410
  //#endregion
1397
1411
  //#region src/components/auto-crud/form-modal.d.ts
1398
1412
  type ModalVariant = "dialog" | "sheet";
@@ -1436,7 +1450,7 @@ declare function CrudFormModal<T extends z.ZodObject<z.ZodRawShape>>({
1436
1450
  labelAlign,
1437
1451
  labelWidth,
1438
1452
  className
1439
- }: CrudFormModalProps<T>): react_jsx_runtime0.JSX.Element;
1453
+ }: CrudFormModalProps<T>): react_jsx_runtime5.JSX.Element;
1440
1454
  //#endregion
1441
1455
  //#region src/components/auto-crud/import-dialog.d.ts
1442
1456
  interface ImportDialogProps {
@@ -1458,7 +1472,7 @@ declare function ImportDialog({
1458
1472
  columns,
1459
1473
  title,
1460
1474
  locale
1461
- }: ImportDialogProps): react_jsx_runtime0.JSX.Element;
1475
+ }: ImportDialogProps): react_jsx_runtime5.JSX.Element;
1462
1476
  //#endregion
1463
1477
  //#region src/components/auto-crud/export-dialog.d.ts
1464
1478
  type ExportMode = "selected" | "filtered";
@@ -1478,7 +1492,7 @@ declare function ExportDialog({
1478
1492
  selectedCount,
1479
1493
  onExport,
1480
1494
  canExportFiltered
1481
- }: ExportDialogProps): react_jsx_runtime0.JSX.Element;
1495
+ }: ExportDialogProps): react_jsx_runtime5.JSX.Element;
1482
1496
  //#endregion
1483
1497
  //#region src/components/data-table/data-table.d.ts
1484
1498
  interface DataTableProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1491,7 +1505,7 @@ declare function DataTable<TData>({
1491
1505
  children,
1492
1506
  className,
1493
1507
  ...props
1494
- }: DataTableProps<TData>): react_jsx_runtime0.JSX.Element;
1508
+ }: DataTableProps<TData>): react_jsx_runtime5.JSX.Element;
1495
1509
  //#endregion
1496
1510
  //#region src/components/data-table/data-table-advanced-toolbar.d.ts
1497
1511
  interface DataTableAdvancedToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1502,7 +1516,7 @@ declare function DataTableAdvancedToolbar<TData>({
1502
1516
  children,
1503
1517
  className,
1504
1518
  ...props
1505
- }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime0.JSX.Element;
1519
+ }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime5.JSX.Element;
1506
1520
  //#endregion
1507
1521
  //#region src/components/data-table/data-table-column-header.d.ts
1508
1522
  interface DataTableColumnHeaderProps<TData, TValue> extends React.ComponentProps<typeof DropdownMenuTrigger> {
@@ -1514,7 +1528,7 @@ declare function DataTableColumnHeader<TData, TValue>({
1514
1528
  label,
1515
1529
  className,
1516
1530
  ...props
1517
- }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime0.JSX.Element;
1531
+ }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime5.JSX.Element;
1518
1532
  //#endregion
1519
1533
  //#region src/components/data-table/data-table-faceted-filter.d.ts
1520
1534
  interface DataTableFacetedFilterProps<TData, TValue> {
@@ -1528,7 +1542,7 @@ declare function DataTableFacetedFilter<TData, TValue>({
1528
1542
  title,
1529
1543
  options,
1530
1544
  multiple
1531
- }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime0.JSX.Element;
1545
+ }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime5.JSX.Element;
1532
1546
  //#endregion
1533
1547
  //#region src/components/data-table/data-table-pagination.d.ts
1534
1548
  interface DataTablePaginationProps<TData> extends React.ComponentProps<"div"> {
@@ -1540,7 +1554,7 @@ declare function DataTablePagination<TData>({
1540
1554
  pageSizeOptions,
1541
1555
  className,
1542
1556
  ...props
1543
- }: DataTablePaginationProps<TData>): react_jsx_runtime0.JSX.Element;
1557
+ }: DataTablePaginationProps<TData>): react_jsx_runtime5.JSX.Element;
1544
1558
  //#endregion
1545
1559
  //#region src/components/data-table/data-table-toolbar.d.ts
1546
1560
  interface DataTableToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1551,7 +1565,7 @@ declare function DataTableToolbar<TData>({
1551
1565
  children,
1552
1566
  className,
1553
1567
  ...props
1554
- }: DataTableToolbarProps<TData>): react_jsx_runtime0.JSX.Element;
1568
+ }: DataTableToolbarProps<TData>): react_jsx_runtime5.JSX.Element;
1555
1569
  //#endregion
1556
1570
  //#region src/components/data-table/data-table-view-options.d.ts
1557
1571
  interface DataTableViewOptionsProps<TData> extends React$1.ComponentProps<typeof PopoverContent> {
@@ -1562,7 +1576,7 @@ declare function DataTableViewOptions<TData>({
1562
1576
  table,
1563
1577
  disabled,
1564
1578
  ...props
1565
- }: DataTableViewOptionsProps<TData>): react_jsx_runtime0.JSX.Element;
1579
+ }: DataTableViewOptionsProps<TData>): react_jsx_runtime5.JSX.Element;
1566
1580
  //#endregion
1567
1581
  //#region src/lib/crud-actions.d.ts
1568
1582
  type CrudActionZone = 'toolbar' | 'row' | 'batch';
@@ -1644,7 +1658,7 @@ declare function useReadableFilters<TData>(columns: ColumnLike<TData>[], options
1644
1658
  */
1645
1659
  declare function createFormSchema<T extends z.ZodObject<z.ZodRawShape>>(schema: T, options?: CreateFormSchemaOptions): ISchema;
1646
1660
  /**
1647
- * 为编辑模式创建 Form Schema(排除 id, createdAt, updatedAt)
1661
+ * 为编辑模式创建 Form Schema(排除平台托管字段)
1648
1662
  */
1649
1663
  declare function createEditFormSchema<T extends z.ZodObject<z.ZodRawShape>>(schema: T, options?: Omit<CreateFormSchemaOptions, 'exclude'>): ISchema;
1650
1664
  //#endregion
package/dist/index.d.ts CHANGED
@@ -3,12 +3,18 @@ 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 "@wordrhyme/shadcn";
5
5
  import { ClassValue } from "clsx";
6
- import * as react_jsx_runtime0 from "react/jsx-runtime";
6
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
7
7
  import { MultiCombobox, MultiComboboxOption, MultiComboboxProps, MultiComboboxTriggerRenderProps, Select, SelectMode, SelectOption, SelectProps, SelectSearchableDynamicProps, SelectSearchableMultipleProps, SelectSearchableProps, SelectSearchableSingleProps, SelectSimpleProps, SelectTriggerRenderProps } from "@wordrhyme/shadcn-ui";
8
8
  import { z } from "zod";
9
9
  import { JsonSchemaFormScope } from "@wordrhyme/formily-shadcn";
10
10
  import { ISchema } from "@formily/json-schema";
11
11
 
12
+ //#region src/lib/default-sorting.d.ts
13
+ type AutoCrudSorting = Array<{
14
+ id: string;
15
+ desc: boolean;
16
+ }>;
17
+ //#endregion
12
18
  //#region src/hooks/use-auto-crud-resource.d.ts
13
19
  /**
14
20
  * Toast 适配器接口
@@ -103,6 +109,12 @@ interface UseAutoCrudResourceOptions<TSchema extends z.ZodObject<z.ZodRawShape>,
103
109
  total: number;
104
110
  hasMore: boolean;
105
111
  }>;
112
+ /**
113
+ * 默认排序。
114
+ * - undefined: schema 有 createdAt 时默认 createdAt desc
115
+ * - false: 不应用默认排序
116
+ */
117
+ defaultSort?: AutoCrudSorting | false;
106
118
  }
107
119
  /**
108
120
  * 导入结果类型(与服务端保持一致)
@@ -133,6 +145,8 @@ interface UseAutoCrudResourceReturn<TSchema extends z.ZodObject<z.ZodRawShape>,
133
145
  schema?: z.ZodObject<z.ZodRawShape>;
134
146
  /** Optional field config override from host metadata. */
135
147
  fields?: Fields;
148
+ /** Default sorting used by this resource's list query. */
149
+ defaultSort?: AutoCrudSorting;
136
150
  modal: ModalState<TListItem>;
137
151
  mutations: {
138
152
  isCreating: boolean;
@@ -381,7 +395,7 @@ declare function AutoTableActionBar<TData>({
381
395
  extraActions,
382
396
  actions,
383
397
  deleteConfirmation
384
- }: AutoTableActionBarProps<TData>): react_jsx_runtime0.JSX.Element;
398
+ }: AutoTableActionBarProps<TData>): react_jsx_runtime2.JSX.Element;
385
399
  //#endregion
386
400
  //#region src/lib/schema-bridge/types.d.ts
387
401
  /**
@@ -557,7 +571,7 @@ declare function AutoTable<T extends z.ZodObject<z.ZodRawShape>>({
557
571
  onSelectedCountChange,
558
572
  onSelectedRowsChange,
559
573
  getSelectedRows
560
- }: AutoTableProps<T>): react_jsx_runtime0.JSX.Element;
574
+ }: AutoTableProps<T>): react_jsx_runtime2.JSX.Element;
561
575
  //#endregion
562
576
  //#region src/i18n/locale.d.ts
563
577
  /**
@@ -1037,7 +1051,7 @@ declare function AutoCrudTable<TSchema extends z.ZodObject<z.ZodRawShape>>({
1037
1051
  toolbarActions,
1038
1052
  locale: localeProp,
1039
1053
  onCreate
1040
- }: AutoCrudTableProps<TSchema>): react_jsx_runtime0.JSX.Element;
1054
+ }: AutoCrudTableProps<TSchema>): react_jsx_runtime2.JSX.Element;
1041
1055
  //#endregion
1042
1056
  //#region src/components/auto-crud/auto-form.d.ts
1043
1057
  interface AutoFormProps<T extends z.ZodObject<z.ZodRawShape>> {
@@ -1076,7 +1090,7 @@ declare function AutoFormInner<T extends z.ZodObject<z.ZodRawShape>>({
1076
1090
  labelAlign,
1077
1091
  labelWidth,
1078
1092
  showSubmitButton
1079
- }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime0.JSX.Element;
1093
+ }: AutoFormProps<T>, ref: React.Ref<AutoFormRef>): react_jsx_runtime2.JSX.Element;
1080
1094
  declare const AutoForm: <T extends z.ZodObject<z.ZodRawShape>>(props: AutoFormProps<T> & {
1081
1095
  ref?: React.Ref<AutoFormRef>;
1082
1096
  }) => ReturnType<typeof AutoFormInner>;
@@ -1392,7 +1406,7 @@ declare function AutoTableSimpleFilters<TData>({
1392
1406
  filters: externalFilters,
1393
1407
  onFiltersChange,
1394
1408
  leading
1395
- }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime0.JSX.Element | null;
1409
+ }: AutoTableSimpleFiltersProps<TData>): react_jsx_runtime2.JSX.Element | null;
1396
1410
  //#endregion
1397
1411
  //#region src/components/auto-crud/form-modal.d.ts
1398
1412
  type ModalVariant = "dialog" | "sheet";
@@ -1436,7 +1450,7 @@ declare function CrudFormModal<T extends z.ZodObject<z.ZodRawShape>>({
1436
1450
  labelAlign,
1437
1451
  labelWidth,
1438
1452
  className
1439
- }: CrudFormModalProps<T>): react_jsx_runtime0.JSX.Element;
1453
+ }: CrudFormModalProps<T>): react_jsx_runtime2.JSX.Element;
1440
1454
  //#endregion
1441
1455
  //#region src/components/auto-crud/import-dialog.d.ts
1442
1456
  interface ImportDialogProps {
@@ -1458,7 +1472,7 @@ declare function ImportDialog({
1458
1472
  columns,
1459
1473
  title,
1460
1474
  locale
1461
- }: ImportDialogProps): react_jsx_runtime0.JSX.Element;
1475
+ }: ImportDialogProps): react_jsx_runtime2.JSX.Element;
1462
1476
  //#endregion
1463
1477
  //#region src/components/auto-crud/export-dialog.d.ts
1464
1478
  type ExportMode = "selected" | "filtered";
@@ -1478,7 +1492,7 @@ declare function ExportDialog({
1478
1492
  selectedCount,
1479
1493
  onExport,
1480
1494
  canExportFiltered
1481
- }: ExportDialogProps): react_jsx_runtime0.JSX.Element;
1495
+ }: ExportDialogProps): react_jsx_runtime2.JSX.Element;
1482
1496
  //#endregion
1483
1497
  //#region src/components/data-table/data-table.d.ts
1484
1498
  interface DataTableProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1491,7 +1505,7 @@ declare function DataTable<TData>({
1491
1505
  children,
1492
1506
  className,
1493
1507
  ...props
1494
- }: DataTableProps<TData>): react_jsx_runtime0.JSX.Element;
1508
+ }: DataTableProps<TData>): react_jsx_runtime2.JSX.Element;
1495
1509
  //#endregion
1496
1510
  //#region src/components/data-table/data-table-advanced-toolbar.d.ts
1497
1511
  interface DataTableAdvancedToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1502,7 +1516,7 @@ declare function DataTableAdvancedToolbar<TData>({
1502
1516
  children,
1503
1517
  className,
1504
1518
  ...props
1505
- }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime0.JSX.Element;
1519
+ }: DataTableAdvancedToolbarProps<TData>): react_jsx_runtime2.JSX.Element;
1506
1520
  //#endregion
1507
1521
  //#region src/components/data-table/data-table-column-header.d.ts
1508
1522
  interface DataTableColumnHeaderProps<TData, TValue> extends React.ComponentProps<typeof DropdownMenuTrigger> {
@@ -1514,7 +1528,7 @@ declare function DataTableColumnHeader<TData, TValue>({
1514
1528
  label,
1515
1529
  className,
1516
1530
  ...props
1517
- }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime0.JSX.Element;
1531
+ }: DataTableColumnHeaderProps<TData, TValue>): react_jsx_runtime2.JSX.Element;
1518
1532
  //#endregion
1519
1533
  //#region src/components/data-table/data-table-faceted-filter.d.ts
1520
1534
  interface DataTableFacetedFilterProps<TData, TValue> {
@@ -1528,7 +1542,7 @@ declare function DataTableFacetedFilter<TData, TValue>({
1528
1542
  title,
1529
1543
  options,
1530
1544
  multiple
1531
- }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime0.JSX.Element;
1545
+ }: DataTableFacetedFilterProps<TData, TValue>): react_jsx_runtime2.JSX.Element;
1532
1546
  //#endregion
1533
1547
  //#region src/components/data-table/data-table-pagination.d.ts
1534
1548
  interface DataTablePaginationProps<TData> extends React.ComponentProps<"div"> {
@@ -1540,7 +1554,7 @@ declare function DataTablePagination<TData>({
1540
1554
  pageSizeOptions,
1541
1555
  className,
1542
1556
  ...props
1543
- }: DataTablePaginationProps<TData>): react_jsx_runtime0.JSX.Element;
1557
+ }: DataTablePaginationProps<TData>): react_jsx_runtime2.JSX.Element;
1544
1558
  //#endregion
1545
1559
  //#region src/components/data-table/data-table-toolbar.d.ts
1546
1560
  interface DataTableToolbarProps<TData> extends React$1.ComponentProps<"div"> {
@@ -1551,7 +1565,7 @@ declare function DataTableToolbar<TData>({
1551
1565
  children,
1552
1566
  className,
1553
1567
  ...props
1554
- }: DataTableToolbarProps<TData>): react_jsx_runtime0.JSX.Element;
1568
+ }: DataTableToolbarProps<TData>): react_jsx_runtime2.JSX.Element;
1555
1569
  //#endregion
1556
1570
  //#region src/components/data-table/data-table-view-options.d.ts
1557
1571
  interface DataTableViewOptionsProps<TData> extends React$1.ComponentProps<typeof PopoverContent> {
@@ -1562,7 +1576,7 @@ declare function DataTableViewOptions<TData>({
1562
1576
  table,
1563
1577
  disabled,
1564
1578
  ...props
1565
- }: DataTableViewOptionsProps<TData>): react_jsx_runtime0.JSX.Element;
1579
+ }: DataTableViewOptionsProps<TData>): react_jsx_runtime2.JSX.Element;
1566
1580
  //#endregion
1567
1581
  //#region src/lib/crud-actions.d.ts
1568
1582
  type CrudActionZone = 'toolbar' | 'row' | 'batch';
@@ -1644,7 +1658,7 @@ declare function useReadableFilters<TData>(columns: ColumnLike<TData>[], options
1644
1658
  */
1645
1659
  declare function createFormSchema<T extends z.ZodObject<z.ZodRawShape>>(schema: T, options?: CreateFormSchemaOptions): ISchema;
1646
1660
  /**
1647
- * 为编辑模式创建 Form Schema(排除 id, createdAt, updatedAt)
1661
+ * 为编辑模式创建 Form Schema(排除平台托管字段)
1648
1662
  */
1649
1663
  declare function createEditFormSchema<T extends z.ZodObject<z.ZodRawShape>>(schema: T, options?: Omit<CreateFormSchemaOptions, 'exclude'>): ISchema;
1650
1664
  //#endregion
package/dist/index.js CHANGED
@@ -4170,6 +4170,15 @@ function FormModal({ open, onOpenChange, title, description, children, variant =
4170
4170
 
4171
4171
  //#endregion
4172
4172
  //#region src/lib/schema-bridge/zod-to-formily.ts
4173
+ const DEFAULT_FORM_MANAGED_FIELDS = [
4174
+ "id",
4175
+ "createdAt",
4176
+ "updatedAt",
4177
+ "createdBy",
4178
+ "createdByType",
4179
+ "updatedBy",
4180
+ "updatedByType"
4181
+ ];
4173
4182
  /**
4174
4183
  * 将字符串转为人类可读格式
4175
4184
  */
@@ -4252,16 +4261,12 @@ function createFormSchema(schema, options) {
4252
4261
  };
4253
4262
  }
4254
4263
  /**
4255
- * 为编辑模式创建 Form Schema(排除 id, createdAt, updatedAt)
4264
+ * 为编辑模式创建 Form Schema(排除平台托管字段)
4256
4265
  */
4257
4266
  function createEditFormSchema(schema, options) {
4258
4267
  return createFormSchema(schema, {
4259
4268
  ...options,
4260
- exclude: [
4261
- "id",
4262
- "createdAt",
4263
- "updatedAt"
4264
- ]
4269
+ exclude: [...DEFAULT_FORM_MANAGED_FIELDS]
4265
4270
  });
4266
4271
  }
4267
4272
 
@@ -5595,6 +5600,15 @@ function ImportDialog({ open, onOpenChange, onImport, columns = [], title, local
5595
5600
  });
5596
5601
  }
5597
5602
 
5603
+ //#endregion
5604
+ //#region src/lib/default-sorting.ts
5605
+ function getDefaultSortingForSchema(schema) {
5606
+ return Object.prototype.hasOwnProperty.call(schema.shape, "createdAt") ? [{
5607
+ id: "createdAt",
5608
+ desc: true
5609
+ }] : [];
5610
+ }
5611
+
5598
5612
  //#endregion
5599
5613
  //#region src/lib/crud-actions.ts
5600
5614
  const entries = /* @__PURE__ */ new Map();
@@ -5744,6 +5758,29 @@ const crudActions = {
5744
5758
 
5745
5759
  //#endregion
5746
5760
  //#region src/components/auto-crud/auto-crud-table.tsx
5761
+ const DEFAULT_IMPORT_MANAGED_FIELDS = [
5762
+ "createdAt",
5763
+ "updatedAt",
5764
+ "createdBy",
5765
+ "createdByType",
5766
+ "updatedBy",
5767
+ "updatedByType"
5768
+ ];
5769
+ const DEFAULT_HIDDEN_AUDIT_FIELDS = [
5770
+ "createdBy",
5771
+ "createdByType",
5772
+ "updatedBy",
5773
+ "updatedByType"
5774
+ ];
5775
+ function isDefaultHiddenAuditField(key) {
5776
+ return DEFAULT_HIDDEN_AUDIT_FIELDS.includes(key);
5777
+ }
5778
+ function isFieldTableExplicitlyVisible(config) {
5779
+ return config?.hidden === false || config?.table !== false && typeof config?.table === "object" && config.table.hidden === false;
5780
+ }
5781
+ function isTableOverrideExplicitlyVisible(config) {
5782
+ return config?.hidden === false;
5783
+ }
5747
5784
  let autoCrudToolbarResolver = null;
5748
5785
  function setToolbarResolver(resolver) {
5749
5786
  autoCrudToolbarResolver = resolver;
@@ -6195,10 +6232,18 @@ function buildTableOverrides(fields, legacyOverrides, dynamicFilterState) {
6195
6232
  /**
6196
6233
  * 从统一配置生成隐藏列列表
6197
6234
  */
6198
- function buildHiddenColumns(fields, legacyHidden, denyFields) {
6199
- const hidden = new Set([...legacyHidden ?? [], ...denyFields ?? []]);
6200
- if (fields) {
6201
- for (const [key, config] of Object.entries(fields)) if (config.hidden) hidden.add(key);
6235
+ function buildHiddenColumns(fields, legacyHidden, denyFields, legacyOverrides) {
6236
+ const legacyHiddenSet = new Set(legacyHidden ?? []);
6237
+ const denySet = new Set(denyFields ?? []);
6238
+ const hidden = new Set([
6239
+ ...DEFAULT_HIDDEN_AUDIT_FIELDS,
6240
+ ...legacyHiddenSet,
6241
+ ...denySet
6242
+ ]);
6243
+ for (const key of DEFAULT_HIDDEN_AUDIT_FIELDS) if (!legacyHiddenSet.has(key) && !denySet.has(key) && isTableOverrideExplicitlyVisible(legacyOverrides?.[key])) hidden.delete(key);
6244
+ if (fields) for (const [key, config] of Object.entries(fields)) {
6245
+ if (isDefaultHiddenAuditField(key) && !legacyHiddenSet.has(key) && !denySet.has(key) && isFieldTableExplicitlyVisible(config)) hidden.delete(key);
6246
+ if (config.hidden) hidden.add(key);
6202
6247
  else if (config.table === false) hidden.add(key);
6203
6248
  else if (config.table && typeof config.table === "object" && config.table.hidden) hidden.add(key);
6204
6249
  }
@@ -6302,7 +6347,10 @@ function ViewModal({ open, onOpenChange, variant, data, schema, fields: fieldCon
6302
6347
  className: "grid gap-4 py-4",
6303
6348
  children: Object.entries(shape).filter(([key]) => {
6304
6349
  if (denySet.has(key)) return false;
6305
- return !(fieldConfig?.[key])?.hidden;
6350
+ const config = fieldConfig?.[key];
6351
+ if (config?.hidden) return false;
6352
+ if (isDefaultHiddenAuditField(key) && !isFieldTableExplicitlyVisible(config)) return false;
6353
+ return true;
6306
6354
  }).map(([key, fieldSchema]) => {
6307
6355
  const parsed = parseZodField(fieldSchema);
6308
6356
  const label = fieldConfig?.[key]?.label ?? humanize(key);
@@ -6515,7 +6563,7 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6515
6563
  const resolvedToolbarActions = resolveToolbarActionsWithResolver(id, registryToolbarActions, toolbarContext);
6516
6564
  const importColumns = React.useMemo(() => {
6517
6565
  const shape = resolvedSchema.shape;
6518
- const denySet = new Set(denyFields ?? []);
6566
+ const denySet = new Set([...DEFAULT_IMPORT_MANAGED_FIELDS, ...denyFields ?? []]);
6519
6567
  return Object.keys(shape).filter((key) => !denySet.has(key));
6520
6568
  }, [resolvedSchema, denyFields]);
6521
6569
  const handleExport = React.useCallback(async (mode) => {
@@ -6554,15 +6602,21 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6554
6602
  tableConfig?.overrides,
6555
6603
  dynamicFilterOptions
6556
6604
  ]);
6605
+ const defaultSort = React.useMemo(() => resource.defaultSort ?? tableConfig?.defaultSort ?? getDefaultSortingForSchema(resolvedSchema), [
6606
+ resource.defaultSort,
6607
+ resolvedSchema,
6608
+ tableConfig?.defaultSort
6609
+ ]);
6557
6610
  const formOverrides = React.useMemo(() => buildFormOverrides(resolvedFields, formConfig?.overrides, denyFields), [
6558
6611
  resolvedFields,
6559
6612
  formConfig?.overrides,
6560
6613
  denyFields
6561
6614
  ]);
6562
- const hiddenColumns = React.useMemo(() => buildHiddenColumns(resolvedFields, tableConfig?.hidden, denyFields), [
6615
+ const hiddenColumns = React.useMemo(() => buildHiddenColumns(resolvedFields, tableConfig?.hidden, denyFields, tableConfig?.overrides), [
6563
6616
  resolvedFields,
6564
6617
  tableConfig?.hidden,
6565
- denyFields
6618
+ denyFields,
6619
+ tableConfig?.overrides
6566
6620
  ]);
6567
6621
  const searchConfig = React.useMemo(() => {
6568
6622
  const tableSearch = tableConfig?.search;
@@ -6710,7 +6764,7 @@ function AutoCrudTable({ id, title, description, schema, resource, fields, table
6710
6764
  deleteConfirmation: locale.bulkDeleteModal,
6711
6765
  enableExport: canExport,
6712
6766
  showDefaultExport: false,
6713
- initialSorting: tableConfig?.defaultSort,
6767
+ initialSorting: defaultSort,
6714
6768
  onSelectedRowsChange: handleSelectedRowsChange,
6715
6769
  getSelectedRows: getSelectedRowsRef
6716
6770
  }),
@@ -7512,7 +7566,7 @@ function modalReducer(state, action$1) {
7512
7566
  * Hook 主函数
7513
7567
  */
7514
7568
  function useAutoCrudResource({ router, schema, query: queryTransform, options = {} }) {
7515
- const { idKey = "id", defaultVariant = "dialog", hooks, toast: toastAdapter, exportFetcher } = options;
7569
+ const { idKey = "id", defaultVariant = "dialog", hooks, toast: toastAdapter, exportFetcher, defaultSort: defaultSortOption } = options;
7516
7570
  const toast$1 = useMemo(() => toastAdapter === false ? noopToastAdapter : toastAdapter ?? defaultToastAdapter, [toastAdapter]);
7517
7571
  const hooksRef = useRef(hooks);
7518
7572
  useEffect(() => {
@@ -7520,12 +7574,13 @@ function useAutoCrudResource({ router, schema, query: queryTransform, options =
7520
7574
  }, [hooks]);
7521
7575
  const metadata = (router.meta?.useQuery(void 0, { staleTime: 3e4 }))?.data;
7522
7576
  const resolvedSchema = useMemo(() => mergeMetadataSchema(schema, metadata?.schema), [schema, metadata?.schema]);
7577
+ const defaultSorting = useMemo(() => defaultSortOption === false ? [] : defaultSortOption ?? getDefaultSortingForSchema(resolvedSchema), [defaultSortOption, resolvedSchema]);
7523
7578
  const metadataFields = useMemo(() => readMetadataFields(metadata?.fields), [metadata?.fields]);
7524
7579
  const columns = useMemo(() => createTableSchema(resolvedSchema), [resolvedSchema]);
7525
7580
  const [urlParams] = useQueryStates({
7526
7581
  page: parseAsInteger.withDefault(1),
7527
7582
  perPage: parseAsInteger.withDefault(10),
7528
- sort: getSortingStateParser().withDefault([]),
7583
+ sort: getSortingStateParser().withDefault(defaultSorting),
7529
7584
  joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"),
7530
7585
  search: parseAsString.withDefault("")
7531
7586
  }, { shallow: false });
@@ -7813,6 +7868,7 @@ function useAutoCrudResource({ router, schema, query: queryTransform, options =
7813
7868
  },
7814
7869
  schema: resolvedSchema,
7815
7870
  fields: metadataFields,
7871
+ defaultSort: defaultSorting,
7816
7872
  modal,
7817
7873
  mutations: {
7818
7874
  isCreating: createMutation.isPending,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wordrhyme/auto-crud",
3
3
  "type": "module",
4
- "version": "1.3.6",
4
+ "version": "1.3.8",
5
5
  "description": "Schema-first CRUD components with auto-generated tables and forms",
6
6
  "author": "wordrhyme",
7
7
  "license": "MIT",
@@ -63,8 +63,8 @@
63
63
  "tailwind-merge": "^3.5.0",
64
64
  "vaul": "^1.1.2",
65
65
  "@wordrhyme/formily-shadcn": "1.12.9",
66
- "@wordrhyme/shadcn-ui": "1.32.4",
67
- "@wordrhyme/shadcn": "1.3.2"
66
+ "@wordrhyme/shadcn": "1.3.2",
67
+ "@wordrhyme/shadcn-ui": "1.32.4"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@tanstack/react-query": "^5.90.15",