Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit 81a5325

Browse files
committed
feat: improve code
1 parent 47d26a9 commit 81a5325

File tree

5 files changed

+96
-31
lines changed

5 files changed

+96
-31
lines changed

src/client/PublicSharedForm.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
import { SchemaComponent, SchemaComponentProvider, useRequest } from '@nocobase/client';
1+
import { SchemaComponent, SchemaComponentContext, useRequest } from '@nocobase/client';
22
import { Spin } from 'antd';
3-
import React from 'react';
3+
import React, { useContext } from 'react';
44
import { useParams } from 'react-router';
5+
import { useCreateActionProps } from './useCreateActionProps';
56

67
export function PublicSharedForm() {
78
const params = useParams();
89
const { data, loading } = useRequest<any>({
910
url: `sharedForms:getMeta/${params.name}`,
1011
});
12+
const ctx = useContext(SchemaComponentContext);
1113
if (loading) {
1214
return <Spin />;
1315
}
1416
return (
1517
<div>
16-
<SchemaComponentProvider designable={false}>
17-
<SchemaComponent schema={data?.data?.schema} />
18-
</SchemaComponentProvider>
18+
<SchemaComponentContext.Provider value={{ ...ctx, designable: false }}>
19+
<SchemaComponent schema={data?.data?.schema} scope={{ useCreateActionProps }} />
20+
</SchemaComponentContext.Provider>
1921
</div>
2022
);
2123
}

src/client/SharedFormConfigure.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Breadcrumb, Button, Space } from 'antd';
33
import React from 'react';
44
import { useParams } from 'react-router';
55
import { Link } from 'react-router-dom';
6+
import { useCreateActionProps } from './useCreateActionProps';
67

78
export function SharedFormConfigure() {
89
const params = useParams();
@@ -35,7 +36,7 @@ export function SharedFormConfigure() {
3536
</Space>
3637
</div>
3738
<div style={{ maxWidth: 800, margin: '100px auto' }}>
38-
<RemoteSchemaComponent uid={params.name} />
39+
<RemoteSchemaComponent uid={params.name} scope={{ useCreateActionProps }} />
3940
</div>
4041
</div>
4142
);

src/client/SharedFormTable.tsx

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -81,39 +81,61 @@ const initialSchema = (values) => {
8181
return {
8282
type: 'void',
8383
name: uid(),
84-
'x-toolbar': 'BlockSchemaToolbar',
85-
'x-toolbar-props': {
86-
draggable: false,
87-
},
88-
'x-settings': 'blockSettings:createForm',
89-
'x-component': 'CardItem',
90-
'x-decorator': 'FormBlockProvider',
91-
'x-decorator-props': {
92-
collection: values.collection,
93-
dataSource: values.dataSource || 'main',
94-
},
95-
'x-use-decorator-props': 'useCreateFormBlockDecoratorProps',
9684
properties: {
97-
a69vmspkv8h: {
85+
form: {
9886
type: 'void',
99-
'x-component': 'FormV2',
100-
'x-use-component-props': 'useCreateFormBlockProps',
87+
'x-toolbar': 'BlockSchemaToolbar',
88+
'x-toolbar-props': {
89+
draggable: false,
90+
},
91+
'x-settings': 'blockSettings:createForm',
92+
'x-component': 'CardItem',
93+
'x-decorator': 'FormBlockProvider',
94+
'x-decorator-props': {
95+
collection: values.collection,
96+
dataSource: values.dataSource || 'main',
97+
},
98+
'x-use-decorator-props': 'useCreateFormBlockDecoratorProps',
10199
properties: {
102-
grid: {
100+
a69vmspkv8h: {
103101
type: 'void',
104-
'x-component': 'Grid',
105-
'x-initializer': 'form:configureFields',
106-
},
107-
l9xfwp6cfh1: {
108-
type: 'void',
109-
'x-component': 'ActionBar',
110-
'x-initializer': 'createForm:configureActions',
111-
'x-component-props': {
112-
layout: 'one-column',
102+
'x-component': 'FormV2',
103+
'x-use-component-props': 'useCreateFormBlockProps',
104+
properties: {
105+
grid: {
106+
type: 'void',
107+
'x-component': 'Grid',
108+
'x-initializer': 'form:configureFields',
109+
},
110+
l9xfwp6cfh1: {
111+
type: 'void',
112+
'x-component': 'ActionBar',
113+
'x-initializer': 'createForm:configureActions',
114+
'x-component-props': {
115+
layout: 'one-column',
116+
},
117+
},
113118
},
114119
},
115120
},
116121
},
122+
success: {
123+
type: 'void',
124+
'x-editable': false,
125+
'x-toolbar-props': {
126+
draggable: false,
127+
},
128+
'x-settings': 'blockSettings:markdown',
129+
'x-component': 'Markdown.Void',
130+
'x-decorator': 'CardItem',
131+
'x-component-props': {
132+
content: 'This is a demo text, **supports Markdown syntax**.',
133+
},
134+
'x-decorator-props': {
135+
name: 'markdown',
136+
engine: 'handlebars',
137+
},
138+
},
117139
},
118140
};
119141
};

src/client/useCreateActionProps.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useForm } from '@formily/react';
2+
import { useActionContext, useCollection, useDataBlockRequest, useDataBlockResource } from '@nocobase/client';
3+
import { App as AntdApp } from 'antd';
4+
5+
export const useCreateActionProps = () => {
6+
const { setVisible } = useActionContext();
7+
const { message } = AntdApp.useApp();
8+
const form = useForm();
9+
const resource = useDataBlockResource();
10+
const { runAsync } = useDataBlockRequest();
11+
const collection = useCollection();
12+
return {
13+
type: 'primary',
14+
async onClick() {
15+
await form.submit();
16+
const values = form.values;
17+
if (values[collection.filterTargetKey]) {
18+
await resource.update({
19+
values,
20+
filterByTk: values[collection.filterTargetKey],
21+
});
22+
} else {
23+
await resource.publicSubmit({
24+
values,
25+
});
26+
}
27+
await runAsync();
28+
message.success('Saved successfully!');
29+
setVisible(false);
30+
},
31+
};
32+
};

src/server/plugin.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ export class PluginSharedFormsServer extends Plugin {
77
async beforeLoad() {}
88

99
async load() {
10+
this.app.dataSourceManager.afterAddDataSource((dataSource) => {
11+
dataSource.resourceManager.registerActionHandlers({
12+
publicSubmit: async (ctx, next) => {
13+
ctx.body = 'ok';
14+
await next();
15+
},
16+
});
17+
});
1018
this.app.resourceManager.registerActionHandlers({
1119
'sharedForms:getMeta': async (ctx, next) => {
1220
const { filterByTk } = ctx.action.params;

0 commit comments

Comments
 (0)