@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 +32 -10
- package/dist/index.cjs +73 -17
- package/dist/index.d.cts +31 -17
- package/dist/index.d.ts +31 -17
- package/dist/index.js +73 -17
- package/package.json +3 -3
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?:
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
{
|
|
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?:
|
|
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
|
|
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: [
|
|
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
|
|
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
|
|
6237
|
-
|
|
6238
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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):
|
|
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):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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
|
|
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
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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):
|
|
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):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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>):
|
|
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
|
|
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
|
|
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
|
|
6200
|
-
|
|
6201
|
-
|
|
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
|
-
|
|
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:
|
|
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.
|
|
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
|
|
67
|
-
"@wordrhyme/shadcn": "1.
|
|
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",
|