auto-gen-crud 0.1.0 → 0.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.
Files changed (38) hide show
  1. package/API.md +92 -10
  2. package/README.md +87 -48
  3. package/dist/adapters/element-plus.d.ts +1 -1
  4. package/dist/adapters/index.js +1 -1
  5. package/dist/adapters/types.d.ts +14 -0
  6. package/dist/components/{AutoCrud.vue.d.ts → AutoGenCrud.vue.d.ts} +33 -8
  7. package/dist/components/CrudModal.vue.d.ts +3 -0
  8. package/dist/components/DynamicForm.vue.d.ts +3 -0
  9. package/dist/components/DynamicTable.vue.d.ts +11 -3
  10. package/dist/context.d.ts +9 -9
  11. package/dist/core/types.d.ts +184 -14
  12. package/dist/generator/index.js +400 -372
  13. package/dist/generator/index.js.map +1 -1
  14. package/dist/generator/templates.d.ts +1 -1
  15. package/dist/generator/writer.d.ts +1 -1
  16. package/dist/hooks/index.d.ts +1 -0
  17. package/dist/hooks/index.js +5 -3
  18. package/dist/hooks/useCrudPage.d.ts +18 -0
  19. package/dist/hooks/useSearchForm.d.ts +1 -1
  20. package/dist/{index-Dc-solHn.js → index-DQzg4GMa.js} +92 -63
  21. package/dist/index-DQzg4GMa.js.map +1 -0
  22. package/dist/index.d.ts +3 -3
  23. package/dist/index.js +617 -520
  24. package/dist/index.js.map +1 -1
  25. package/dist/plugin.d.ts +4 -4
  26. package/dist/style.css +1 -1
  27. package/dist/useCrudPage-CJTCLLN_.js +390 -0
  28. package/dist/useCrudPage-CJTCLLN_.js.map +1 -0
  29. package/dist/utils/index.js.map +1 -1
  30. package/dist/utils/request.d.ts +1 -1
  31. package/docs/AI_AGENT_GUIDE.md +10 -10
  32. package/mcp/auto-gen-crud-mcp.mjs +13 -13
  33. package/package.json +11 -2
  34. package/skills/auto-gen-crud-agent/SKILL.md +9 -9
  35. package/dist/index-Dc-solHn.js.map +0 -1
  36. package/dist/useTable-BwDSqD1q.js +0 -214
  37. package/dist/useTable-BwDSqD1q.js.map +0 -1
  38. package/mcp/auto-crud-mcp.mjs +0 -502
package/API.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # auto-gen-crud API
2
2
 
3
- ## createAutoCrud
3
+ ## createAutoGenCrud
4
4
 
5
5
  ```ts
6
- createAutoCrud(options?: AutoCrudInstallOptions)
6
+ createAutoGenCrud(options?: AutoGenCrudInstallOptions)
7
7
  ```
8
8
 
9
9
  用于初始化全局配置。UI 只在这里配置一次。
10
10
 
11
- ### AutoCrudInstallOptions
11
+ ### AutoGenCrudInstallOptions
12
12
 
13
13
  | 字段 | 类型 | 默认值 | 说明 |
14
14
  | --- | --- | --- | --- |
@@ -38,6 +38,84 @@ const searchForm = useSearchForm(options)
38
38
  | `addButton` | 是否显示默认新增按钮。 |
39
39
  | `addButtonText` | 默认新增按钮文案。 |
40
40
 
41
+ ## useCrudPage
42
+
43
+ ```ts
44
+ const { searchForm, table, modalForm, actions } = useCrudPage({
45
+ context,
46
+ actions,
47
+ search,
48
+ table,
49
+ modal,
50
+ })
51
+ ```
52
+
53
+ 标准 CRUD 页面组合 hook。它内部复用 `useSearchForm`、`useTable`、`useModalForm`,并内置 `add/edit/view/reload/resetTable/closeModal` 标准动作。
54
+
55
+ ### 约定
56
+
57
+ | 字段 | 说明 |
58
+ | --- | --- |
59
+ | `context` | 页面状态、权限、字典、开关。 |
60
+ | `actions` | 页面业务函数,例如 `getDataList`、`submit`、`delete`。 |
61
+ | `search` | `UseSearchFormOptions` 或返回该 options 的函数。 |
62
+ | `table` | `UseTableOptions` 或返回该 options 的函数。 |
63
+ | `modal` | `UseModalFormOptions` 或返回该 options 的函数。 |
64
+
65
+ `useCrudPage` 不解析接口返回结构,列表请求仍由业务在 `actions.getDataList` 中显式写入 `table.data` 和 `table.pagination.total`。
66
+
67
+ 普通页面推荐直接传 actions 对象:
68
+
69
+ ```ts
70
+ useCrudPage({
71
+ actions: {
72
+ submit,
73
+ getDataList,
74
+ },
75
+ });
76
+ ```
77
+
78
+ 如果业务动作需要在定义时统一接收 `searchForm/table/modalForm/context`,仍可传函数:
79
+
80
+ ```ts
81
+ useCrudPage({
82
+ actions: ({ table }) => ({
83
+ batchDelete() {
84
+ console.log(table.selectedRows);
85
+ },
86
+ }),
87
+ });
88
+ ```
89
+
90
+ ### 生成器 helper
91
+
92
+ 生成器会在 `config/defineConfig.ts` 中用包内 `createCrudPageConfigHelpers` 绑定当前页面类型:
93
+
94
+ ```ts
95
+ import { createCrudPageConfigHelpers } from "auto-gen-crud";
96
+ import type { PageActionsType, PageContextType, RowType, SearchParamsType } from "../api/types";
97
+
98
+ export const {
99
+ defineSearchConfig,
100
+ defineTableConfig,
101
+ defineModalConfig,
102
+ } = createCrudPageConfigHelpers<RowType, SearchParamsType, PageContextType, PageActionsType>();
103
+ ```
104
+
105
+ 业务配置文件推荐写成:
106
+
107
+ ```ts
108
+ import { defineTableConfig } from "./defineConfig";
109
+
110
+ export const getTableConfig = defineTableConfig(({ context, actions }) => ({
111
+ columns: [
112
+ { title: "名称", field: "name" },
113
+ { title: "操作", actions: [{ key: "edit", label: "编辑", onClick: actions.edit }] },
114
+ ],
115
+ getDataList: actions.getDataList,
116
+ }));
117
+ ```
118
+
41
119
  ## useTable
42
120
 
43
121
  ```ts
@@ -49,17 +127,21 @@ const table = useTable(options)
49
127
  ### getDataList
50
128
 
51
129
  ```ts
52
- async function getDataList(context) {
53
- const { pagination, searchData, tabsValue } = context;
54
- return {
55
- data: [],
56
- total: 0,
57
- };
130
+ async function getDataList() {
131
+ const { page, pageSize } = table.pagination;
132
+ const result = await queryList({
133
+ currentPage: page,
134
+ pageSize,
135
+ ...searchForm.data,
136
+ });
137
+
138
+ table.data = result.records;
139
+ table.pagination.total = result.total;
58
140
  }
59
141
  ```
60
142
 
61
143
  设计原因:每个项目接口分页字段和返回结构都不同,所以新包不写死请求逻辑。
62
- 兼容旧写法:你仍然可以在 `getDataList` 内部直接修改 `table.data` 和 `table.pagination.total`。
144
+ 请求完成后由业务明确写入 `table.data` 和 `table.pagination.total`。
63
145
 
64
146
  ## useModalForm
65
147
 
package/README.md CHANGED
@@ -18,29 +18,29 @@
18
18
  默认 Element Plus:
19
19
 
20
20
  ```ts
21
- import { createAutoCrud } from "auto-gen-crud";
21
+ import { createAutoGenCrud } from "auto-gen-crud";
22
22
  import "auto-gen-crud/style.css";
23
23
 
24
- app.use(createAutoCrud());
24
+ app.use(createAutoGenCrud());
25
25
  ```
26
26
 
27
27
  切换 Naive UI:
28
28
 
29
29
  ```ts
30
- app.use(createAutoCrud({ ui: "naive" }));
30
+ app.use(createAutoGenCrud({ ui: "naive" }));
31
31
  ```
32
32
 
33
33
  切换 Ant Design Vue:
34
34
 
35
35
  ```ts
36
- app.use(createAutoCrud({ ui: "ant-design-vue" }));
36
+ app.use(createAutoGenCrud({ ui: "ant-design-vue" }));
37
37
  ```
38
38
 
39
39
  如果需要敏感信息解密:
40
40
 
41
41
  ```ts
42
42
  app.use(
43
- createAutoCrud({
43
+ createAutoGenCrud({
44
44
  decode: async value => {
45
45
  return String(value);
46
46
  },
@@ -55,57 +55,67 @@ app.use(
55
55
 
56
56
  ```vue
57
57
  <script setup lang="ts">
58
- import { AutoCrud, useModalForm, useSearchForm, useTable } from "auto-gen-crud";
58
+ import { AutoGenCrud, useCrudPage, type CrudModalMode } from "auto-gen-crud";
59
59
 
60
- const searchForm = useSearchForm({
61
- columns: [
62
- { label: "名称", prop: "name", component: "input" },
63
- {
64
- label: "状态",
65
- prop: "status",
66
- component: "select",
67
- options: [
68
- { label: "启用", value: 1 },
69
- { label: "禁用", value: 0 },
70
- ],
71
- },
72
- ],
73
- });
60
+ type UserRow = { id?: number; name?: string; status?: number; createdAt?: string };
74
61
 
75
- const modalForm = useModalForm({
76
- columns: [
77
- { label: "名称", prop: "name", component: "input", required: true },
78
- { label: "状态", prop: "status", component: "switch" },
79
- ],
80
- async onSubmit(data, mode) {
81
- console.log("提交", mode, data);
82
- modalForm.close();
83
- await table.load(searchForm.data);
62
+ const { searchForm, table, modalForm } = useCrudPage({
63
+ actions: {
64
+ submit,
65
+ getDataList,
84
66
  },
85
- });
86
-
87
- const table = useTable({
88
- columns: [
89
- { title: "名称", field: "name", copy: true },
90
- { title: "创建时间", field: "createdAt", dateTime: true },
91
- {
92
- title: "操作",
93
- actions: [
94
- { key: "edit", label: "编辑", type: "primary", onClick: row => modalForm.openEdit(row) },
95
- { key: "delete", label: "删除", type: "danger", confirm: true, onClick: row => console.log(row) },
96
- ],
97
- },
98
- ],
99
- async getDataList({ pagination, searchData }) {
100
- console.log("查询", pagination, searchData);
101
- table.data = [];
102
- if (table.pagination) table.pagination.total = 0;
67
+ search: {
68
+ columns: [
69
+ { label: "名称", prop: "name", component: "input" },
70
+ {
71
+ label: "状态",
72
+ prop: "status",
73
+ component: "select",
74
+ options: [
75
+ { label: "启用", value: 1 },
76
+ { label: "禁用", value: 0 },
77
+ ],
78
+ },
79
+ ],
103
80
  },
81
+ modal: ({ actions }) => ({
82
+ columns: [
83
+ { label: "名称", prop: "name", component: "input", required: true },
84
+ { label: "状态", prop: "status", component: "switch" },
85
+ ],
86
+ onSubmit: actions.submit,
87
+ }),
88
+ table: ({ actions }) => ({
89
+ columns: [
90
+ { title: "名称", field: "name", copy: true },
91
+ { title: "创建时间", field: "createdAt", dateTime: true },
92
+ {
93
+ title: "操作",
94
+ actions: [
95
+ { key: "edit", label: "编辑", type: "primary", onClick: actions.edit },
96
+ { key: "delete", label: "删除", type: "danger", confirm: true, onClick: row => console.log(row) },
97
+ ],
98
+ },
99
+ ],
100
+ getDataList: actions.getDataList,
101
+ }),
104
102
  });
103
+
104
+ async function submit(data: UserRow, mode: CrudModalMode) {
105
+ console.log("提交", mode, data);
106
+ modalForm.close();
107
+ await table.load();
108
+ }
109
+
110
+ async function getDataList() {
111
+ console.log("查询", table.pagination, searchForm.data);
112
+ table.data = [];
113
+ table.pagination.total = 0;
114
+ }
105
115
  </script>
106
116
 
107
117
  <template>
108
- <AutoCrud
118
+ <AutoGenCrud
109
119
  title="用户"
110
120
  :search-form-config="searchForm"
111
121
  :table-config="table"
@@ -132,6 +142,35 @@ npm run demo:smoke
132
142
 
133
143
  可运行 demo 数据流冒烟测试,覆盖搜索条件、`useTable` 返回值接收和弹窗编辑数据隔离。
134
144
 
145
+ ## 生成器配置形态
146
+
147
+ 生成器默认使用 `useCrudPage` 组合三个基础 hook,并在 `config/defineConfig.ts` 中绑定当前页面类型;三个 helper 的公共实现由包内 `createCrudPageConfigHelpers` 维护:
148
+
149
+ ```ts
150
+ import { createCrudPageConfigHelpers } from "auto-gen-crud";
151
+ import type { PageActionsType, PageContextType, RowType, SearchParamsType } from "../api/types";
152
+
153
+ export const {
154
+ defineSearchConfig,
155
+ defineTableConfig,
156
+ defineModalConfig,
157
+ } = createCrudPageConfigHelpers<RowType, SearchParamsType, PageContextType, PageActionsType>();
158
+ ```
159
+
160
+ 业务配置文件只需要写 helper 包裹后的 options:
161
+
162
+ ```ts
163
+ import { defineTableConfig } from "./defineConfig";
164
+
165
+ export const getTableConfig = defineTableConfig(({ context, actions }) => ({
166
+ columns: [
167
+ { title: "名称", field: "name" },
168
+ { title: "操作", actions: [{ key: "edit", label: "编辑", onClick: actions.edit }] },
169
+ ],
170
+ getDataList: actions.getDataList,
171
+ }));
172
+ ```
173
+
135
174
  ## 独立 Vue3 消费示例
136
175
 
137
176
  `examples/vue3-consumer` 是一个独立 Vue3 项目,用本地 tarball 安装 `auto-gen-crud`,可切换 UI adapter 验证 npm 包入口、类型声明、样式导出和路由页面渲染。
@@ -2,7 +2,7 @@ import { CrudUIAdapter } from './types';
2
2
  /**
3
3
  * Element Plus Adapter。
4
4
  *
5
- * 默认 Adapter:不传 `createAutoCrud({ ui })` 时使用它。
5
+ * 默认 Adapter:不传 `createAutoGenCrud({ ui })` 时使用它。
6
6
  * 约定使用者已在业务应用中安装并注册 Element Plus。
7
7
  */
8
8
  export declare const elementPlusAdapter: CrudUIAdapter;
@@ -1,4 +1,4 @@
1
- import { a as t, e as r, b as s } from "../index-Dc-solHn.js";
1
+ import { a as t, e as r, b as s } from "../index-DQzg4GMa.js";
2
2
  export {
3
3
  t as antDesignVueAdapter,
4
4
  r as elementPlusAdapter,
@@ -23,6 +23,10 @@ export interface CrudAdapterComponents {
23
23
  popconfirm: CrudAdapterComponent;
24
24
  image: CrudAdapterComponent;
25
25
  tooltip?: CrudAdapterComponent;
26
+ /** 详情只读容器组件,Element Plus 对应 ElDescriptions。 */
27
+ descriptions: CrudAdapterComponent;
28
+ /** 详情只读字段组件,Element Plus 对应 ElDescriptionsItem。 */
29
+ descriptionsItem: CrudAdapterComponent;
26
30
  fields: Record<CrudFormComponent, CrudAdapterComponent>;
27
31
  option?: CrudAdapterComponent;
28
32
  radio?: CrudAdapterComponent;
@@ -53,9 +57,13 @@ export interface CrudFormAdapter {
53
57
  getModelBinding: (component: CrudFormComponent, item: CrudFormItem) => CrudModelBinding;
54
58
  /** 获取字段组件 props。 */
55
59
  getFieldProps: (item: CrudFormItem, input: {
60
+ /** 当前字段值,由 adapter 决定绑定到 modelValue/value 等属性。 */
56
61
  value: unknown;
62
+ /** 组件占位文案,已在核心层按字段类型生成默认值。 */
57
63
  placeholder: string;
64
+ /** 是否禁用当前字段,查看模式和字段级 disabled 都会汇总到这里。 */
58
65
  disabled: boolean;
66
+ /** 下拉、单选、多选等字段的最终选项。 */
59
67
  options?: unknown[];
60
68
  }) => Record<string, unknown>;
61
69
  /** 获取表单布局样式变量。 */
@@ -75,12 +83,17 @@ export interface CrudTableAdapter {
75
83
  data: T[];
76
84
  loading: boolean;
77
85
  rowKey?: string | ((row: T) => string | number);
86
+ selection?: boolean;
87
+ selectedRowKeys?: Array<string | number>;
88
+ onSelectionChange?: (rows: T[]) => void;
78
89
  /** 纵向滚动高度,由 DynamicTable 计算后交给各 UI Adapter 映射成真实组件属性。 */
79
90
  scrollY?: number | string;
80
91
  scrollX?: number | string;
81
92
  }) => Record<string, unknown>;
82
93
  /** 获取表格列 props,用于 Element Plus 这类 TableColumn 组件。 */
83
94
  getTableColumnProps: <T extends Record<string, unknown>>(column: CrudTableColumn<T>) => Record<string, unknown>;
95
+ /** 获取多选列 props,用于 Element Plus 这类子组件列模式。 */
96
+ getSelectionColumnProps: () => Record<string, unknown>;
84
97
  /** 获取分页组件 props。 */
85
98
  getPaginationProps: (pagination: CrudPagination) => Record<string, unknown>;
86
99
  /** 获取分页事件。 */
@@ -106,6 +119,7 @@ export interface CrudRenderAdapter {
106
119
  type?: CrudButtonType;
107
120
  size?: CrudButtonSize;
108
121
  disabled?: boolean;
122
+ loading?: boolean;
109
123
  }) => Record<string, unknown>;
110
124
  /** 映射确认框 props。 */
111
125
  getPopconfirmProps: (input: {
@@ -1,17 +1,22 @@
1
- import { AutoCrudProps, CrudFormItem } from '../core/types';
2
- /** AutoCrud 是组合容器,只负责把搜索表单、表格、弹窗表单三块配置串起来。 */
3
- type __VLS_Props = AutoCrudProps<any>;
1
+ import { AutoGenCrudProps, CrudFormItem } from '../core/types';
2
+ /** AutoGenCrud 是组合容器,只负责把搜索表单、表格、弹窗表单三块配置串起来。 */
3
+ type __VLS_Props = AutoGenCrudProps<any, any>;
4
4
  /** 弹窗 footer 的提交入口,最终会走 DynamicForm 校验,再触发 modalFormConfig.submit。 */
5
5
  declare function handleModalSubmit(): Promise<void>;
6
6
  declare function __VLS_template(): {
7
7
  attrs: Partial<{}>;
8
8
  slots: {
9
9
  searchButtonToolbar?(_: {}): any;
10
- tableToolbar?(_: {}): any;
10
+ tableToolbar?(_: {
11
+ table: import('..').CrudTableConfig<Record<string, unknown>>;
12
+ selectedRows: Record<string, unknown>[];
13
+ selectedRowKeys: (string | number)[];
14
+ }): any;
11
15
  modalFooter?(_: {
12
16
  modalForm: import('..').CrudModalFormConfig<any>;
13
17
  submit: typeof handleModalSubmit;
14
18
  close: () => void;
19
+ submitLoading: boolean;
15
20
  }): any;
16
21
  };
17
22
  refs: {
@@ -24,6 +29,7 @@ declare function __VLS_template(): {
24
29
  readonly modelValue: Record<string, unknown>;
25
30
  readonly layout?: import('..').CrudFormLayout | undefined;
26
31
  readonly disabled?: boolean | undefined;
32
+ readonly searchLoading?: boolean | undefined;
27
33
  readonly onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
28
34
  readonly onReset?: (() => any) | undefined;
29
35
  readonly "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
@@ -48,6 +54,7 @@ declare function __VLS_template(): {
48
54
  modelValue: Record<string, unknown>;
49
55
  layout?: import('..').CrudFormLayout;
50
56
  disabled?: boolean;
57
+ searchLoading?: boolean;
51
58
  }> & Readonly<{
52
59
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
53
60
  onReset?: (() => any) | undefined;
@@ -64,6 +71,7 @@ declare function __VLS_template(): {
64
71
  }, string, {
65
72
  disabled: boolean;
66
73
  formType: "search" | "modal";
74
+ searchLoading: boolean;
67
75
  }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
68
76
  beforeCreate?: (() => void) | (() => void)[];
69
77
  created?: (() => void) | (() => void)[];
@@ -87,17 +95,19 @@ declare function __VLS_template(): {
87
95
  } & Readonly<{
88
96
  disabled: boolean;
89
97
  formType: "search" | "modal";
98
+ searchLoading: boolean;
90
99
  }> & Omit<Readonly<{
91
100
  formType?: "search" | "modal";
92
101
  columns: CrudFormItem[];
93
102
  modelValue: Record<string, unknown>;
94
103
  layout?: import('..').CrudFormLayout;
95
104
  disabled?: boolean;
105
+ searchLoading?: boolean;
96
106
  }> & Readonly<{
97
107
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
98
108
  onReset?: (() => any) | undefined;
99
109
  "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
100
- }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType")> & {
110
+ }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType" | "searchLoading")> & {
101
111
  validate: () => Promise<boolean>;
102
112
  clearValidate: () => void;
103
113
  submit: () => Promise<void>;
@@ -116,6 +126,7 @@ declare function __VLS_template(): {
116
126
  readonly modelValue: Record<string, unknown>;
117
127
  readonly layout?: import('..').CrudFormLayout | undefined;
118
128
  readonly disabled?: boolean | undefined;
129
+ readonly searchLoading?: boolean | undefined;
119
130
  readonly onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
120
131
  readonly onReset?: (() => any) | undefined;
121
132
  readonly "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
@@ -140,6 +151,7 @@ declare function __VLS_template(): {
140
151
  modelValue: Record<string, unknown>;
141
152
  layout?: import('..').CrudFormLayout;
142
153
  disabled?: boolean;
154
+ searchLoading?: boolean;
143
155
  }> & Readonly<{
144
156
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
145
157
  onReset?: (() => any) | undefined;
@@ -156,6 +168,7 @@ declare function __VLS_template(): {
156
168
  }, string, {
157
169
  disabled: boolean;
158
170
  formType: "search" | "modal";
171
+ searchLoading: boolean;
159
172
  }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
160
173
  beforeCreate?: (() => void) | (() => void)[];
161
174
  created?: (() => void) | (() => void)[];
@@ -179,17 +192,19 @@ declare function __VLS_template(): {
179
192
  } & Readonly<{
180
193
  disabled: boolean;
181
194
  formType: "search" | "modal";
195
+ searchLoading: boolean;
182
196
  }> & Omit<Readonly<{
183
197
  formType?: "search" | "modal";
184
198
  columns: CrudFormItem[];
185
199
  modelValue: Record<string, unknown>;
186
200
  layout?: import('..').CrudFormLayout;
187
201
  disabled?: boolean;
202
+ searchLoading?: boolean;
188
203
  }> & Readonly<{
189
204
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
190
205
  onReset?: (() => any) | undefined;
191
206
  "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
192
- }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType")> & {
207
+ }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType" | "searchLoading")> & {
193
208
  validate: () => Promise<boolean>;
194
209
  clearValidate: () => void;
195
210
  submit: () => Promise<void>;
@@ -213,6 +228,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
213
228
  readonly modelValue: Record<string, unknown>;
214
229
  readonly layout?: import('..').CrudFormLayout | undefined;
215
230
  readonly disabled?: boolean | undefined;
231
+ readonly searchLoading?: boolean | undefined;
216
232
  readonly onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
217
233
  readonly onReset?: (() => any) | undefined;
218
234
  readonly "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
@@ -237,6 +253,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
237
253
  modelValue: Record<string, unknown>;
238
254
  layout?: import('..').CrudFormLayout;
239
255
  disabled?: boolean;
256
+ searchLoading?: boolean;
240
257
  }> & Readonly<{
241
258
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
242
259
  onReset?: (() => any) | undefined;
@@ -253,6 +270,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
253
270
  }, string, {
254
271
  disabled: boolean;
255
272
  formType: "search" | "modal";
273
+ searchLoading: boolean;
256
274
  }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
257
275
  beforeCreate?: (() => void) | (() => void)[];
258
276
  created?: (() => void) | (() => void)[];
@@ -276,17 +294,19 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
276
294
  } & Readonly<{
277
295
  disabled: boolean;
278
296
  formType: "search" | "modal";
297
+ searchLoading: boolean;
279
298
  }> & Omit<Readonly<{
280
299
  formType?: "search" | "modal";
281
300
  columns: CrudFormItem[];
282
301
  modelValue: Record<string, unknown>;
283
302
  layout?: import('..').CrudFormLayout;
284
303
  disabled?: boolean;
304
+ searchLoading?: boolean;
285
305
  }> & Readonly<{
286
306
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
287
307
  onReset?: (() => any) | undefined;
288
308
  "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
289
- }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType")> & {
309
+ }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType" | "searchLoading")> & {
290
310
  validate: () => Promise<boolean>;
291
311
  clearValidate: () => void;
292
312
  submit: () => Promise<void>;
@@ -305,6 +325,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
305
325
  readonly modelValue: Record<string, unknown>;
306
326
  readonly layout?: import('..').CrudFormLayout | undefined;
307
327
  readonly disabled?: boolean | undefined;
328
+ readonly searchLoading?: boolean | undefined;
308
329
  readonly onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
309
330
  readonly onReset?: (() => any) | undefined;
310
331
  readonly "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
@@ -329,6 +350,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
329
350
  modelValue: Record<string, unknown>;
330
351
  layout?: import('..').CrudFormLayout;
331
352
  disabled?: boolean;
353
+ searchLoading?: boolean;
332
354
  }> & Readonly<{
333
355
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
334
356
  onReset?: (() => any) | undefined;
@@ -345,6 +367,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
345
367
  }, string, {
346
368
  disabled: boolean;
347
369
  formType: "search" | "modal";
370
+ searchLoading: boolean;
348
371
  }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & {
349
372
  beforeCreate?: (() => void) | (() => void)[];
350
373
  created?: (() => void) | (() => void)[];
@@ -368,17 +391,19 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
368
391
  } & Readonly<{
369
392
  disabled: boolean;
370
393
  formType: "search" | "modal";
394
+ searchLoading: boolean;
371
395
  }> & Omit<Readonly<{
372
396
  formType?: "search" | "modal";
373
397
  columns: CrudFormItem[];
374
398
  modelValue: Record<string, unknown>;
375
399
  layout?: import('..').CrudFormLayout;
376
400
  disabled?: boolean;
401
+ searchLoading?: boolean;
377
402
  }> & Readonly<{
378
403
  onSubmit?: ((value: Record<string, unknown>) => any) | undefined;
379
404
  onReset?: (() => any) | undefined;
380
405
  "onUpdate:modelValue"?: ((value: Record<string, unknown>) => any) | undefined;
381
- }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType")> & {
406
+ }>, "validate" | "submit" | "reset" | "clearValidate" | ("disabled" | "formType" | "searchLoading")> & {
382
407
  validate: () => Promise<boolean>;
383
408
  clearValidate: () => void;
384
409
  submit: () => Promise<void>;
@@ -14,6 +14,8 @@ type __VLS_Props = {
14
14
  submitText?: string;
15
15
  /** 关闭按钮文案。 */
16
16
  cancelText?: string;
17
+ /** 提交按钮 loading,由 useModalForm 内部维护。 */
18
+ submitLoading?: boolean;
17
19
  };
18
20
  declare function __VLS_template(): {
19
21
  attrs: Partial<{}>;
@@ -37,6 +39,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
37
39
  cancelText: string;
38
40
  modalType: CrudModalType;
39
41
  submitText: string;
42
+ submitLoading: boolean;
40
43
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
41
44
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
42
45
  export default _default;
@@ -10,6 +10,8 @@ type __VLS_Props = {
10
10
  layout?: CrudFormLayout;
11
11
  /** 是否整体禁用,查看模式会传 true。 */
12
12
  disabled?: boolean;
13
+ /** 搜索按钮 loading,当前由 AutoGenCrud 复用 tableConfig.loading 传入。 */
14
+ searchLoading?: boolean;
13
15
  };
14
16
  /**
15
17
  * 校验表单。
@@ -51,6 +53,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
51
53
  }>, {
52
54
  disabled: boolean;
53
55
  formType: "search" | "modal";
56
+ searchLoading: boolean;
54
57
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
55
58
  formRef: unknown;
56
59
  }, any>;
@@ -1,16 +1,23 @@
1
- import { CrudTableConfig } from '../core/types';
1
+ import { CrudFormItem, CrudTableConfig } from '../core/types';
2
2
  type __VLS_Props = {
3
3
  /** useTable 返回的表格配置,包含列、数据、分页、加载状态和列表操作方法。 */
4
- tableConfig: CrudTableConfig<any>;
4
+ tableConfig: CrudTableConfig<Record<string, unknown>>;
5
+ /** 弹窗表单字段配置;表格会复用同 prop 字段的 options 做 code 到 label 的映射。 */
6
+ formColumns?: CrudFormItem[];
5
7
  };
6
8
  declare function __VLS_template(): {
7
9
  attrs: Partial<{}>;
8
10
  slots: {
9
- tableToolbar?(_: {}): any;
11
+ tableToolbar?(_: {
12
+ table: CrudTableConfig<Record<string, unknown>>;
13
+ selectedRows: Record<string, unknown>[];
14
+ selectedRowKeys: (string | number)[];
15
+ }): any;
10
16
  };
11
17
  refs: {
12
18
  tableRootRef: HTMLDivElement;
13
19
  tableBodyRef: HTMLDivElement;
20
+ tableRef: unknown;
14
21
  paginationRef: HTMLDivElement;
15
22
  };
16
23
  rootEl: any;
@@ -19,6 +26,7 @@ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
19
26
  declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
20
27
  tableRootRef: HTMLDivElement;
21
28
  tableBodyRef: HTMLDivElement;
29
+ tableRef: unknown;
22
30
  paginationRef: HTMLDivElement;
23
31
  }, any>;
24
32
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;