@gadmin2n/prisma-react-generator 0.0.35
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/LICENSE +177 -0
- package/README.md +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +4 -0
- package/dist/generator/field-classifiers.d.ts +13 -0
- package/dist/generator/field-classifiers.js +45 -0
- package/dist/generator/generate-config-props.d.ts +21 -0
- package/dist/generator/generate-config-props.js +198 -0
- package/dist/generator/generate-create-page.d.ts +13 -0
- package/dist/generator/generate-create-page.js +129 -0
- package/dist/generator/generate-edit-page.d.ts +13 -0
- package/dist/generator/generate-edit-page.js +138 -0
- package/dist/generator/generate-index-page.d.ts +13 -0
- package/dist/generator/generate-index-page.js +16 -0
- package/dist/generator/generate-list-page.d.ts +13 -0
- package/dist/generator/generate-list-page.js +262 -0
- package/dist/generator/generate-model-props.d.ts +14 -0
- package/dist/generator/generate-model-props.js +78 -0
- package/dist/generator/generate-models-index.d.ts +9 -0
- package/dist/generator/generate-models-index.js +19 -0
- package/dist/generator/generate-resources.d.ts +8 -0
- package/dist/generator/generate-resources.js +33 -0
- package/dist/generator/generate-show-page.d.ts +13 -0
- package/dist/generator/generate-show-page.js +71 -0
- package/dist/generator/generate-ui-config.d.ts +2 -0
- package/dist/generator/generate-ui-config.js +354 -0
- package/dist/generator/helpers.d.ts +55 -0
- package/dist/generator/helpers.js +356 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.js +131 -0
- package/dist/generator/template-helpers.d.ts +27 -0
- package/dist/generator/template-helpers.js +78 -0
- package/dist/generator/types.d.ts +27 -0
- package/dist/generator/types.js +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +53 -0
- package/package.json +79 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateEditPage = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const { readFileSync } = require('fs');
|
|
7
|
+
const generateEditPage = ({ model, templateHelpers: t, uiConfig, allModels, }) => {
|
|
8
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
9
|
+
const gameAngle = (0, helpers_1.isGameAngle)(model);
|
|
10
|
+
return `
|
|
11
|
+
import {
|
|
12
|
+
FieldDataType,
|
|
13
|
+
handleInitialValues,
|
|
14
|
+
handleOnFinish,
|
|
15
|
+
ModelType,
|
|
16
|
+
produceModel,
|
|
17
|
+
} from "@gadmin2/react-common";
|
|
18
|
+
import { Edit, ListButton, RefreshButton, useFileUploadState, useForm } from "@refinedev/antd";
|
|
19
|
+
import { Form } from "antd";
|
|
20
|
+
import { IResourceComponentsProps, useApiUrl, useParsed, useTranslate } from "@refinedev/core";
|
|
21
|
+
import { getFormItem, onFormValuesChange } from "../../helpers";
|
|
22
|
+
import React, { useContext, useState } from "react";
|
|
23
|
+
|
|
24
|
+
import { modelsMap, modelsEnum } from "../../generated/models.index";
|
|
25
|
+
import {
|
|
26
|
+
${instanceName}FormConfig as formConfig,
|
|
27
|
+
${instanceName}FormPrismaSelect as formPrismaSelect,
|
|
28
|
+
} from "../../generated/props/${instanceName}/config";
|
|
29
|
+
import {
|
|
30
|
+
${instanceName}Model,
|
|
31
|
+
useRelation,
|
|
32
|
+
} from "../../generated/props/${instanceName}/model";
|
|
33
|
+
import { ${model.name} } from "../../generated/types/prisma.types";
|
|
34
|
+
import { ${model.name}Form as transformClass } from "../../generated/props/${instanceName}/form.validator";
|
|
35
|
+
import { BusinessContext } from 'components/contexts/business';
|
|
36
|
+
|
|
37
|
+
export const ${model.name}Edit: React.FC<IResourceComponentsProps> = () => {
|
|
38
|
+
const resourceName = "${instanceName}";
|
|
39
|
+
const t = useTranslate();
|
|
40
|
+
${gameAngle
|
|
41
|
+
? 'const {business: { gameId }} = useContext(BusinessContext);'
|
|
42
|
+
: ''}
|
|
43
|
+
|
|
44
|
+
const [[fields, model]] = useState(() => {
|
|
45
|
+
const model: ModelType = produceModel(
|
|
46
|
+
${instanceName}Model,
|
|
47
|
+
{
|
|
48
|
+
// all formItem attrs surport, https://ant.design/components/form#formitem
|
|
49
|
+
// description : { component : <MDEditor data-color-mode="light" /> },
|
|
50
|
+
// status : { normalize : (value: any) => value ? "1" : "0" },
|
|
51
|
+
// cron: {validator: { validator: runCronValidator },},
|
|
52
|
+
},
|
|
53
|
+
transformClass
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const fields: FieldDataType[] = formConfig.fields
|
|
57
|
+
.map((fieldName: string) => model[fieldName])
|
|
58
|
+
.filter((field: FieldDataType) => field);
|
|
59
|
+
|
|
60
|
+
return [fields, model] as const;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const { formProps, saveButtonProps, onFinish, form } =
|
|
64
|
+
useForm<${model.name}>({
|
|
65
|
+
meta: { select: formPrismaSelect},
|
|
66
|
+
});
|
|
67
|
+
formProps.initialValues = handleInitialValues(
|
|
68
|
+
formProps.initialValues || {},
|
|
69
|
+
fields
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const apiUrl = useApiUrl();
|
|
73
|
+
const { isLoading, onChange } = useFileUploadState();
|
|
74
|
+
|
|
75
|
+
const relationSelectProps = useRelation(modelsMap);
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<Edit
|
|
79
|
+
saveButtonProps={{
|
|
80
|
+
...saveButtonProps,
|
|
81
|
+
disabled: isLoading,
|
|
82
|
+
}}
|
|
83
|
+
headerButtons={
|
|
84
|
+
<>
|
|
85
|
+
<ListButton />
|
|
86
|
+
<RefreshButton
|
|
87
|
+
meta={{ select: formPrismaSelect}}
|
|
88
|
+
/>
|
|
89
|
+
</>
|
|
90
|
+
}
|
|
91
|
+
>
|
|
92
|
+
<Form
|
|
93
|
+
{...formProps}
|
|
94
|
+
validateTrigger="onBlur"
|
|
95
|
+
onFinish={(values) => {
|
|
96
|
+
onFinish(
|
|
97
|
+
handleOnFinish(
|
|
98
|
+
{
|
|
99
|
+
...values,
|
|
100
|
+
${gameAngle
|
|
101
|
+
? 'gameId: gameId === "-1" ? undefined : gameId,'
|
|
102
|
+
: ''}
|
|
103
|
+
id: undefined,
|
|
104
|
+
},
|
|
105
|
+
fields,
|
|
106
|
+
"edit"
|
|
107
|
+
)
|
|
108
|
+
);
|
|
109
|
+
}}
|
|
110
|
+
layout="vertical"
|
|
111
|
+
form={form}
|
|
112
|
+
onValuesChange={onFormValuesChange(
|
|
113
|
+
form,
|
|
114
|
+
formConfig.reaction,
|
|
115
|
+
)}
|
|
116
|
+
>
|
|
117
|
+
{fields.map((field) => {
|
|
118
|
+
return getFormItem(
|
|
119
|
+
field,
|
|
120
|
+
resourceName,
|
|
121
|
+
t,
|
|
122
|
+
form,
|
|
123
|
+
formConfig.reaction,
|
|
124
|
+
modelsEnum,
|
|
125
|
+
model,
|
|
126
|
+
apiUrl,
|
|
127
|
+
relationSelectProps,
|
|
128
|
+
onChange
|
|
129
|
+
);
|
|
130
|
+
})}
|
|
131
|
+
</Form>
|
|
132
|
+
</Edit>
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
`;
|
|
137
|
+
};
|
|
138
|
+
exports.generateEditPage = generateEditPage;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateIndexPage {
|
|
4
|
+
model: DMMF.Model;
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
uiConfig: {
|
|
7
|
+
modelsConfig: any;
|
|
8
|
+
pageActions: any;
|
|
9
|
+
};
|
|
10
|
+
allModels: DMMF.Model[];
|
|
11
|
+
}
|
|
12
|
+
export declare const generateIndexPage: ({ model, templateHelpers: t, uiConfig, allModels, }: GenerateIndexPage) => string;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateIndexPage = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const generateIndexPage = ({ model, templateHelpers: t, uiConfig, allModels, }) => {
|
|
7
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
8
|
+
return `
|
|
9
|
+
export * from "./list";
|
|
10
|
+
export * from "./create";
|
|
11
|
+
export * from "./edit";
|
|
12
|
+
export * from "./show";
|
|
13
|
+
|
|
14
|
+
`;
|
|
15
|
+
};
|
|
16
|
+
exports.generateIndexPage = generateIndexPage;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateListPage {
|
|
4
|
+
model: DMMF.Model;
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
uiConfig: {
|
|
7
|
+
modelsConfig: any;
|
|
8
|
+
pageActions: any;
|
|
9
|
+
};
|
|
10
|
+
allModels: DMMF.Model[];
|
|
11
|
+
}
|
|
12
|
+
export declare const generateListPage: ({ model, templateHelpers: t, uiConfig, allModels, }: GenerateListPage) => string;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateListPage = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const generateListPage = ({ model, templateHelpers: t, uiConfig, allModels, }) => {
|
|
7
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
8
|
+
const gameAngle = (0, helpers_1.isGameAngle)(model);
|
|
9
|
+
return `
|
|
10
|
+
/**
|
|
11
|
+
* ${model.name} List Page
|
|
12
|
+
*
|
|
13
|
+
* Generated using simplified pattern with @gadmin2/react-common hooks and components.
|
|
14
|
+
*
|
|
15
|
+
* Flexibility Levels:
|
|
16
|
+
* 1. Basic usage - Use components with defaults (this file)
|
|
17
|
+
* 2. Render props - Customize specific buttons/elements
|
|
18
|
+
* 3. Children function - Complete UI control
|
|
19
|
+
* 4. Core hooks - No UI assumptions, full control
|
|
20
|
+
*
|
|
21
|
+
* See: examples/ListPageExamples.tsx for all patterns
|
|
22
|
+
*/
|
|
23
|
+
import React, { useMemo } from 'react';
|
|
24
|
+
import { Table } from 'antd';
|
|
25
|
+
import { List, useTable, useImport } from '@refinedev/antd';
|
|
26
|
+
import {
|
|
27
|
+
HttpError,
|
|
28
|
+
IResourceComponentsProps,
|
|
29
|
+
parseTableParams,
|
|
30
|
+
useExport,
|
|
31
|
+
useTranslate,
|
|
32
|
+
useApiUrl,
|
|
33
|
+
} from '@refinedev/core';
|
|
34
|
+
import { useLocation } from 'react-router-dom';
|
|
35
|
+
import {
|
|
36
|
+
getColumns,
|
|
37
|
+
ModelType,
|
|
38
|
+
produceModel,
|
|
39
|
+
tableSearchBar,
|
|
40
|
+
} from '@gadmin2/react-common';
|
|
41
|
+
|
|
42
|
+
// Generated imports
|
|
43
|
+
import { modelsEnum, modelsMap } from 'generated/models.index';
|
|
44
|
+
import {
|
|
45
|
+
${instanceName}TableConfig as tableConfig,
|
|
46
|
+
${instanceName}TablePrismaSelect as prismaSelect,
|
|
47
|
+
} from 'generated/props/${instanceName}/config';
|
|
48
|
+
import { ${instanceName}Model, useRelation } from 'generated/props/${instanceName}/model';
|
|
49
|
+
import type { ${model.name} } from 'generated/types/prisma.types';
|
|
50
|
+
|
|
51
|
+
// Local imports
|
|
52
|
+
import {
|
|
53
|
+
BulkActions,
|
|
54
|
+
ListPageHeader,
|
|
55
|
+
RowActions,
|
|
56
|
+
SearchBar,
|
|
57
|
+
} from 'components';
|
|
58
|
+
import { getRowActionsColumnProps } from 'components/agentPanel';
|
|
59
|
+
import { LogButton } from 'components/auditLog';
|
|
60
|
+
import { requestHeaders } from 'helpers/login';
|
|
61
|
+
import { useBatchOperations } from 'hooks';
|
|
62
|
+
import {
|
|
63
|
+
createSearchFormOnFinish,
|
|
64
|
+
getSearchFormInitialValues,
|
|
65
|
+
getTableColumnV2,
|
|
66
|
+
TableColumnContext
|
|
67
|
+
} from 'helpers';
|
|
68
|
+
${gameAngle
|
|
69
|
+
? "import { BusinessContext } from 'components/contexts/business';"
|
|
70
|
+
: ''}
|
|
71
|
+
|
|
72
|
+
const { placeholder: searchPlaceholder, getSearchFilters } = tableSearchBar(
|
|
73
|
+
tableConfig['toolbar']['searchBar'],
|
|
74
|
+
${instanceName}Model,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// https://refine.dev/docs/api-reference/antd/hooks/table/useTable/
|
|
78
|
+
export const ${model.name}List: React.FC<IResourceComponentsProps> = () => {
|
|
79
|
+
const resourceName = '${instanceName}';
|
|
80
|
+
const t = useTranslate();
|
|
81
|
+
const apiUrl = useApiUrl();
|
|
82
|
+
const { search } = useLocation();
|
|
83
|
+
const { parsedSorter, parsedFilters } = parseTableParams(search);
|
|
84
|
+
${gameAngle
|
|
85
|
+
? 'const { business: { gameId } } = React.useContext(BusinessContext);'
|
|
86
|
+
: ''}
|
|
87
|
+
|
|
88
|
+
// Relations
|
|
89
|
+
const relationSelectProps = useRelation(modelsMap);
|
|
90
|
+
|
|
91
|
+
// Model with customizations
|
|
92
|
+
const [columns, model] = useMemo(() => {
|
|
93
|
+
const model: ModelType = produceModel(${instanceName}Model, {
|
|
94
|
+
// Custom column renderers can be added here
|
|
95
|
+
// cron: { render: (value) => humanizeCronInChinese(value) },
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const columns = getColumns('${model.name}', tableConfig.fields, {
|
|
99
|
+
...modelsMap,
|
|
100
|
+
${model.name}: { model, meta: modelsMap['${model.name}'].meta },
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return [columns, model] as const;
|
|
104
|
+
}, []);
|
|
105
|
+
|
|
106
|
+
// Table hook
|
|
107
|
+
const {
|
|
108
|
+
tableProps,
|
|
109
|
+
sorters: sorter,
|
|
110
|
+
setCurrent,
|
|
111
|
+
setFilters,
|
|
112
|
+
filters,
|
|
113
|
+
tableQueryResult,
|
|
114
|
+
searchFormProps,
|
|
115
|
+
} = useTable<${model.name}, HttpError>({
|
|
116
|
+
meta: { transformQFn: getSearchFilters, select: prismaSelect },
|
|
117
|
+
filters: { initial: parsedFilters, defaultBehavior: 'merge' },
|
|
118
|
+
sorters: { initial: parsedSorter },
|
|
119
|
+
${gameAngle
|
|
120
|
+
? `permanentFilter: [{ field: 'gameId', operator: 'eq', value: gameId === '-1' ? undefined : gameId }],`
|
|
121
|
+
: ''}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// initialValues: 从 URL 的 parsedFilters 中恢复 q(搜索关键词)和 createdAt(日期范围)
|
|
125
|
+
// onFinish: 将表单值转换为 CrudFilters 并更新筛选条件
|
|
126
|
+
// 有 createdAt 字段的模型(默认)
|
|
127
|
+
searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters);
|
|
128
|
+
searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters);
|
|
129
|
+
|
|
130
|
+
// 没有 createdAt 字段的模型
|
|
131
|
+
// searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters, { dateField: null });
|
|
132
|
+
// searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters, { dateField: null });
|
|
133
|
+
|
|
134
|
+
// 使用其他日期字段(如 updatedAt)
|
|
135
|
+
// searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters, { dateField: 'updatedAt' });
|
|
136
|
+
// searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters, { dateField: 'updatedAt' });
|
|
137
|
+
|
|
138
|
+
// Batch operations (selection, update, delete)
|
|
139
|
+
const batchOps = useBatchOperations({
|
|
140
|
+
resourceName,
|
|
141
|
+
apiUrl,
|
|
142
|
+
requestHeaders,
|
|
143
|
+
onSuccess: () => tableQueryResult.refetch(),
|
|
144
|
+
t,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Export all
|
|
148
|
+
const { triggerExport, isLoading: exportLoading } = useExport<${model.name}>({
|
|
149
|
+
maxItemCount: 200,
|
|
150
|
+
pageSize: 100,
|
|
151
|
+
${gameAngle
|
|
152
|
+
? `meta: { where: { gameId: { equals: gameId === '-1' ? undefined : gameId } } },`
|
|
153
|
+
: ''}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Export selected
|
|
157
|
+
const { triggerExport: triggerExportSelected, isLoading: exportSelectedLoading } =
|
|
158
|
+
useExport<${model.name}>({
|
|
159
|
+
pageSize: 100,
|
|
160
|
+
meta: { where: { id: { in: batchOps.selectedRowKeys.map(Number) } } },
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Import
|
|
164
|
+
const importProps = useImport<${model.name}>({
|
|
165
|
+
mapData: (item: any) => ({
|
|
166
|
+
...item,
|
|
167
|
+
${gameAngle ? "gameId: gameId === '-1' ? undefined : gameId," : ''}
|
|
168
|
+
}),
|
|
169
|
+
batchSize: 1,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Context for table columns
|
|
173
|
+
const columnContext: TableColumnContext = {
|
|
174
|
+
resourceName,
|
|
175
|
+
t,
|
|
176
|
+
model,
|
|
177
|
+
modelsEnum,
|
|
178
|
+
modelsMap,
|
|
179
|
+
tableConfig,
|
|
180
|
+
sorter,
|
|
181
|
+
filters,
|
|
182
|
+
relationSelectProps,
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<List
|
|
187
|
+
headerProps={{
|
|
188
|
+
subTitle: batchOps.hasSelected && (
|
|
189
|
+
<BulkActions
|
|
190
|
+
selectedRowKeys={batchOps.selectedRowKeys}
|
|
191
|
+
actions={tableConfig.rowSelection.actions}
|
|
192
|
+
onUpdateSelected={batchOps.updateSelectedItems}
|
|
193
|
+
onDeleteSelected={batchOps.deleteSelectedItems}
|
|
194
|
+
onExportSelected={triggerExportSelected}
|
|
195
|
+
updateLoading={batchOps.updateManyIsLoading}
|
|
196
|
+
deleteLoading={batchOps.deleteManyIsLoading}
|
|
197
|
+
exportLoading={exportSelectedLoading}
|
|
198
|
+
t={t}
|
|
199
|
+
resourceName={resourceName}
|
|
200
|
+
// Render props examples (uncomment to customize):
|
|
201
|
+
// renderDeleteButton={(onClick, loading) => <Button danger onClick={onClick} loading={loading}>Delete</Button>}
|
|
202
|
+
// renderSelectionCount={(count) => <Badge count={count}><Tag>Selected</Tag></Badge>}
|
|
203
|
+
// extraActions={<Button>Custom Action</Button>}
|
|
204
|
+
/>
|
|
205
|
+
),
|
|
206
|
+
extra: (
|
|
207
|
+
<ListPageHeader
|
|
208
|
+
importProps={importProps}
|
|
209
|
+
onExport={triggerExport}
|
|
210
|
+
exportLoading={exportLoading}
|
|
211
|
+
/>
|
|
212
|
+
),
|
|
213
|
+
}}
|
|
214
|
+
>
|
|
215
|
+
{/* Search Bar */}
|
|
216
|
+
<SearchBar
|
|
217
|
+
formProps={searchFormProps}
|
|
218
|
+
t={t}
|
|
219
|
+
resourceName={resourceName}
|
|
220
|
+
searchPlaceholder={searchPlaceholder}
|
|
221
|
+
// Render props examples (uncomment to customize):
|
|
222
|
+
// renderKeywordInput={(field, defaultInput) => <Input.Search placeholder={field.placeholder} />}
|
|
223
|
+
// renderSubmitButton={(defaultButton) => <Space>{defaultButton}<Button>Reset</Button></Space>}
|
|
224
|
+
// extraActions={<Button type="link">Advanced</Button>}
|
|
225
|
+
/>
|
|
226
|
+
|
|
227
|
+
{/* Data Table */}
|
|
228
|
+
<Table {...tableProps} rowKey="id" rowSelection={batchOps.rowSelection}>
|
|
229
|
+
{columns.map((col) => getTableColumnV2({ col, context: columnContext }))}
|
|
230
|
+
|
|
231
|
+
{/* Actions Column */}
|
|
232
|
+
<Table.Column<${model.name}>
|
|
233
|
+
title={t('table.actions')}
|
|
234
|
+
dataIndex="actions"
|
|
235
|
+
{...getRowActionsColumnProps(resourceName)}
|
|
236
|
+
render={(_, record) => (
|
|
237
|
+
<RowActions
|
|
238
|
+
record={record}
|
|
239
|
+
actions={tableConfig.rowActions.actions}
|
|
240
|
+
onUpdate={batchOps.updateOne}
|
|
241
|
+
updateLoading={batchOps.updateManyIsLoading}
|
|
242
|
+
t={t}
|
|
243
|
+
resourceName={resourceName}
|
|
244
|
+
LogButton={LogButton}
|
|
245
|
+
// Render props examples (uncomment to customize):
|
|
246
|
+
// showClone={false}
|
|
247
|
+
// showDelete={false}
|
|
248
|
+
// renderEditButton={(id) => <Button type="link" size="small">Quick Edit</Button>}
|
|
249
|
+
// renderDeleteButton={(id) => <Popconfirm title="Sure?"><Button danger size="small">Remove</Button></Popconfirm>}
|
|
250
|
+
// extraPrimaryActions={<Button type="text" size="small">Quick View</Button>}
|
|
251
|
+
/>
|
|
252
|
+
)}
|
|
253
|
+
/>
|
|
254
|
+
</Table>
|
|
255
|
+
</List>
|
|
256
|
+
);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
export default ${model.name}List;
|
|
260
|
+
`;
|
|
261
|
+
};
|
|
262
|
+
exports.generateListPage = generateListPage;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateModelProps {
|
|
4
|
+
dmmf: DMMF.Document;
|
|
5
|
+
model: DMMF.Model;
|
|
6
|
+
templateHelpers: TemplateHelpers;
|
|
7
|
+
uiConfig: {
|
|
8
|
+
modelsConfig: any;
|
|
9
|
+
pageActions: any;
|
|
10
|
+
};
|
|
11
|
+
allModels: DMMF.Model[];
|
|
12
|
+
}
|
|
13
|
+
export declare const generateModelProps: ({ dmmf, model, templateHelpers: t, uiConfig, allModels, }: GenerateModelProps) => string;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateModelProps = void 0;
|
|
4
|
+
const template_helpers_1 = require("./template-helpers");
|
|
5
|
+
const case_1 = require("case");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const generateModelProps = ({ dmmf, model, templateHelpers: t, uiConfig, allModels, }) => {
|
|
8
|
+
const instanceName = (0, case_1.camel)(model.name);
|
|
9
|
+
return `
|
|
10
|
+
import { ModelsFieldsTypeMap, ModelType } from "@gadmin2/react-common";
|
|
11
|
+
import { useSelect } from "@refinedev/antd";
|
|
12
|
+
${t.each(dmmf.datamodel.models, (model) => `import type { ${model.name} } from '../../types/prisma.types';`, '\n')}
|
|
13
|
+
import { modelsMap } from '../../models.index';
|
|
14
|
+
|
|
15
|
+
export const ${instanceName}Model: ModelType = ${JSON.stringify(model.fields.reduce((acc, curField) => {
|
|
16
|
+
curField.uiType = (0, helpers_1.parseDocumentation)(curField.documentation || '', curField);
|
|
17
|
+
curField.tsType =
|
|
18
|
+
curField.kind === 'scalar' ? (0, template_helpers_1.scalarToTS)(curField.type) : 'undefined';
|
|
19
|
+
if (curField.kind === 'enum') {
|
|
20
|
+
curField.tsType = 'string';
|
|
21
|
+
}
|
|
22
|
+
acc[curField.name] = curField;
|
|
23
|
+
if (curField.kind === 'object') {
|
|
24
|
+
if (curField.isList) {
|
|
25
|
+
acc[`_count.${curField.name}`] = {
|
|
26
|
+
...curField,
|
|
27
|
+
name: `_count.${curField.name}`,
|
|
28
|
+
kind: 'scalar',
|
|
29
|
+
isList: false,
|
|
30
|
+
isRequired: false,
|
|
31
|
+
isUnique: false,
|
|
32
|
+
isId: false,
|
|
33
|
+
isReadOnly: true,
|
|
34
|
+
hasDefaultValue: false,
|
|
35
|
+
type: 'Int',
|
|
36
|
+
isGenerated: false,
|
|
37
|
+
isUpdatedAt: false,
|
|
38
|
+
documentation: '',
|
|
39
|
+
tsType: 'number',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
acc[`${curField.name}.connect`] = {
|
|
43
|
+
...curField,
|
|
44
|
+
name: `${curField.name}.connect`,
|
|
45
|
+
};
|
|
46
|
+
acc[`${curField.name}.create`] = {
|
|
47
|
+
...curField,
|
|
48
|
+
name: `${curField.name}.create`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return acc;
|
|
52
|
+
}, {}))};
|
|
53
|
+
|
|
54
|
+
export function useRelation(modelsMap: ModelsFieldsTypeMap) {
|
|
55
|
+
${t.each(model.fields.filter((field) => field.kind === 'object'), (field) => `
|
|
56
|
+
const nameKey${field.type} = modelsMap['${field.type}']['meta']['nameKeys'][0] || 'id';
|
|
57
|
+
const { selectProps: ${(0, case_1.camel)(field.type)}SelectProps } = useSelect<${field.type}>({
|
|
58
|
+
resource: "${(0, case_1.camel)(field.type)}",
|
|
59
|
+
optionLabel: nameKey${field.type} || "id",
|
|
60
|
+
optionValue: nameKey${field.type} || "id",
|
|
61
|
+
onSearch: (value: string) => [
|
|
62
|
+
{
|
|
63
|
+
field: nameKey${field.type},
|
|
64
|
+
operator: "contains",
|
|
65
|
+
value,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
`, '\n')}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
${t.each(model.fields.filter((field) => field.kind === 'object'), (field) => `${field.name}: ${(0, case_1.camel)(field.type)}SelectProps,`, '\n')}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
};
|
|
78
|
+
exports.generateModelProps = generateModelProps;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateModelsIndexParam {
|
|
4
|
+
models: DMMF.Model[];
|
|
5
|
+
enums: DMMF.SchemaEnum[];
|
|
6
|
+
templateHelpers: TemplateHelpers;
|
|
7
|
+
}
|
|
8
|
+
export declare const generateModelsIndex: ({ models, enums, templateHelpers: t, }: GenerateModelsIndexParam) => string;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateModelsIndex = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const generateModelsIndex = ({ models, enums, templateHelpers: t, }) => `
|
|
7
|
+
${t.each(models, (model) => `
|
|
8
|
+
import { ${(0, case_1.camel)(model.name)}Model } from "./props/${(0, case_1.camel)(model.name)}/model";
|
|
9
|
+
import { ${(0, case_1.camel)(model.name)}Metadata } from "./props/${(0, case_1.camel)(model.name)}/config";
|
|
10
|
+
`, '')}
|
|
11
|
+
|
|
12
|
+
export const modelsEnum = ${JSON.stringify((0, helpers_1.getModelsEnum)(enums || []))};
|
|
13
|
+
|
|
14
|
+
export const modelsMap = {
|
|
15
|
+
${t.each(models, (model) => `${model.name}: { model: ${(0, case_1.camel)(model.name)}Model , meta: ${(0, case_1.camel)(model.name)}Metadata },`, '\n')}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
`;
|
|
19
|
+
exports.generateModelsIndex = generateModelsIndex;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GenerateResources {
|
|
4
|
+
models: DMMF.Model[];
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
}
|
|
7
|
+
export declare const generateResources: ({ models, templateHelpers: t, }: GenerateResources) => string;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateResources = void 0;
|
|
4
|
+
const case_1 = require("case");
|
|
5
|
+
const generateResources = ({ models, templateHelpers: t, }) => `
|
|
6
|
+
import { ResourceProps } from "@refinedev/core";
|
|
7
|
+
|
|
8
|
+
${t.each(models, (model) => `import { ${model.name}List, ${model.name}Create, ${model.name}Edit, ${model.name}Show } from "../pages/${(0, case_1.camel)(model.name)}";`, '\n')}
|
|
9
|
+
|
|
10
|
+
const resources: ResourceProps[] = [
|
|
11
|
+
${t.each(models, (model) => `{
|
|
12
|
+
name: "${(0, case_1.camel)(model.name)}",
|
|
13
|
+
list: '/${(0, case_1.camel)(model.name)}',
|
|
14
|
+
create: "/${(0, case_1.camel)(model.name)}/create",
|
|
15
|
+
edit: "/${(0, case_1.camel)(model.name)}/edit/:id",
|
|
16
|
+
clone: "/${(0, case_1.camel)(model.name)}/clone/:id",
|
|
17
|
+
show: "/${(0, case_1.camel)(model.name)}/show/:id",
|
|
18
|
+
meta: {
|
|
19
|
+
canDelete: true,
|
|
20
|
+
components: {
|
|
21
|
+
list: ${model.name}List,
|
|
22
|
+
create: ${model.name}Create,
|
|
23
|
+
edit: ${model.name}Edit,
|
|
24
|
+
show: ${model.name}Show,
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
},`, '\n')}
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export default resources;
|
|
31
|
+
|
|
32
|
+
`;
|
|
33
|
+
exports.generateResources = generateResources;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TemplateHelpers } from './template-helpers';
|
|
2
|
+
import { DMMF } from '@prisma/generator-helper';
|
|
3
|
+
interface GeneratePageShow {
|
|
4
|
+
model: DMMF.Model;
|
|
5
|
+
templateHelpers: TemplateHelpers;
|
|
6
|
+
uiConfig: {
|
|
7
|
+
modelsConfig: any;
|
|
8
|
+
pageActions: any;
|
|
9
|
+
};
|
|
10
|
+
allModels: DMMF.Model[];
|
|
11
|
+
}
|
|
12
|
+
export declare const generatePageShow: ({ model, templateHelpers: t, uiConfig, allModels, }: GeneratePageShow) => string;
|
|
13
|
+
export {};
|