feat: improve code

This commit is contained in:
chenos 2022-03-06 16:19:18 +08:00
parent ad700c61b8
commit c410c188a3
16 changed files with 90 additions and 71 deletions

View File

@ -37,6 +37,7 @@ const api = new Application({
});
const plugins = [
'@nocobase/plugin-error-handler',
'@nocobase/plugin-collection-manager',
'@nocobase/plugin-ui-schema-storage',
'@nocobase/plugin-ui-routes-storage',

View File

@ -2,6 +2,7 @@ import { LockOutlined } from '@ant-design/icons';
import { ISchema, useForm } from '@formily/react';
import { uid } from '@formily/shared';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { PluginManager } from '../plugin-manager';
import { ActionContext, SchemaComponent, useActionContext } from '../schema-component';
import * as components from './Configuration';
@ -25,7 +26,7 @@ const schema: ISchema = {
[uid()]: {
'x-component': 'Action.Drawer',
type: 'void',
title: '角色配置',
title: '{{t("Roles & Permissions")}}',
properties: {
hello1: {
type: 'void',
@ -38,11 +39,12 @@ const schema: ISchema = {
export const ACLShortcut = () => {
const [visible, setVisible] = useState(false);
const { t } = useTranslation();
return (
<ActionContext.Provider value={{ visible, setVisible }}>
<PluginManager.Toolbar.Item
icon={<LockOutlined />}
title={'角色和权限'}
title={t('Roles & Permissions')}
onClick={() => {
setVisible(true);
}}

View File

@ -2,6 +2,7 @@ import { DatabaseOutlined } from '@ant-design/icons';
import { ISchema } from '@formily/react';
import { uid } from '@formily/shared';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { PluginManager } from '../plugin-manager';
import { ActionContext, SchemaComponent } from '../schema-component';
import { AddFieldAction, ConfigurationTable, EditFieldAction } from './Configuration';
@ -12,7 +13,7 @@ const schema: ISchema = {
[uid()]: {
'x-component': 'Action.Drawer',
type: 'void',
title: '数据表配置',
title: '{{t("Collections & Fields")}}',
properties: {
configuration: {
'x-component': 'ConfigurationTable',
@ -24,11 +25,12 @@ const schema: ISchema = {
export const CollectionManagerShortcut = () => {
const [visible, setVisible] = useState(false);
const { t } = useTranslation();
return (
<ActionContext.Provider value={{ visible, setVisible }}>
<PluginManager.Toolbar.Item
icon={<DatabaseOutlined />}
title={'数据表配置'}
title={t('Collections & Fields')}
onClick={() => {
setVisible(true);
}}

View File

@ -5,6 +5,7 @@ import { uid } from '@formily/shared';
import { Button, Dropdown, Menu } from 'antd';
import { cloneDeep } from 'lodash';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useRequest } from '../../api-client';
import { ActionContext, SchemaComponent, useCompile } from '../../schema-component';
import { useCreateAction } from '../action-hooks';
@ -102,6 +103,7 @@ export const AddFieldAction = () => {
const [visible, setVisible] = useState(false);
const [schema, setSchema] = useState({});
const compile = useCompile();
const { t } = useTranslation();
return (
<ActionContext.Provider value={{ visible, setVisible }}>
<Dropdown
@ -132,7 +134,7 @@ export const AddFieldAction = () => {
}
>
<Button icon={<PlusOutlined />} type={'primary'}>
{t('Add field')}
</Button>
</Dropdown>
<SchemaComponent schema={schema} components={{ ArrayTable }} scope={{ useCreateCollectionField }} />

View File

@ -5,6 +5,7 @@ import { uid } from '@formily/shared';
import { Button, Dropdown, Menu } from 'antd';
import { cloneDeep } from 'lodash';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useRequest } from '../../api-client';
import { RecordProvider } from '../../record-provider';
import { ActionContext, SchemaComponent, useActionContext, useCompile } from '../../schema-component';
@ -98,6 +99,7 @@ export const AddSubFieldAction = () => {
const [visible, setVisible] = useState(false);
const [schema, setSchema] = useState({});
const compile = useCompile();
const { t } = useTranslation();
return (
<ActionContext.Provider value={{ visible, setVisible }}>
<Dropdown
@ -122,7 +124,7 @@ export const AddSubFieldAction = () => {
}
>
<Button icon={<PlusOutlined />} type={'primary'}>
{t('Add field')}
</Button>
</Dropdown>
<RecordProvider record={{}}>

View File

@ -1,10 +1,12 @@
import { ISchema, useField, useFieldSchema } from '@formily/react';
import React from 'react';
import { useTranslation } from 'react-i18next';
import { GeneralSchemaDesigner, SchemaSettings, useDesignable } from '../../../';
const InsertMenuItems = (props) => {
const { dn, refresh } = useDesignable();
const { eventKey, title, insertPosition } = props;
const { t } = useTranslation();
const { dn } = useDesignable();
const fieldSchema = useFieldSchema();
const isSubMenu = fieldSchema['x-component'] === 'Menu.SubMenu';
if (!isSubMenu && insertPosition === 'beforeEnd') {
@ -14,21 +16,21 @@ const InsertMenuItems = (props) => {
<SchemaSettings.SubMenu eventKey={eventKey} title={title}>
<SchemaSettings.ModalItem
eventKey={`${insertPosition}group`}
title={'分组'}
title={t('Group')}
schema={
{
type: 'object',
title: `${title}分组`,
title: t('Add group'),
properties: {
title: {
'x-decorator': 'FormItem',
'x-component': 'Input',
title: '分组名称',
title: t('Menu item title'),
'x-component-props': {},
// description: `原字段标题:${collectionField?.uiSchema?.title}`,
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
@ -48,21 +50,20 @@ const InsertMenuItems = (props) => {
/>
<SchemaSettings.ModalItem
eventKey={`${insertPosition}page`}
title={'页面'}
title={t('Page')}
schema={
{
type: 'object',
title: `${title}页面`,
title: t('Add page'),
properties: {
title: {
'x-decorator': 'FormItem',
'x-component': 'Input',
title: '菜单项名称',
title: t('Menu item title'),
'x-component-props': {},
// description: `原字段标题:${collectionField?.uiSchema?.title}`,
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
@ -97,27 +98,27 @@ const InsertMenuItems = (props) => {
/>
<SchemaSettings.ModalItem
eventKey={`${insertPosition}link`}
title={'链接'}
title={t('Link')}
schema={
{
type: 'object',
title: `${title}链接`,
title: t('Add link'),
properties: {
title: {
title: '链接文字',
'x-component': 'Input',
'x-decorator': 'FormItem',
},
href: {
title: '链接',
title: t('Menu item title'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
href: {
title: t('Link'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
},
} as ISchema
}
@ -141,24 +142,24 @@ export const MenuDesigner = () => {
const field = useField();
const fieldSchema = useFieldSchema();
const { dn, refresh } = useDesignable();
const { t } = useTranslation();
return (
<GeneralSchemaDesigner>
<SchemaSettings.ModalItem
title={'编辑'}
title={t('Edit')}
schema={
{
type: 'object',
title: '编辑菜单项',
title: t('Edit menu item'),
properties: {
title: {
title: t('Menu item title'),
'x-decorator': 'FormItem',
'x-component': 'Input',
title: '菜单项名称',
'x-component-props': {},
// description: `原字段标题:${collectionField?.uiSchema?.title}`,
},
icon: {
title: '图标',
title: t('Menu item icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
@ -189,11 +190,15 @@ export const MenuDesigner = () => {
}}
/>
<SchemaSettings.Divider />
<InsertMenuItems eventKey={'insertbeforeBegin'} title={'在前面插入'} insertPosition={'beforeBegin'} />
<InsertMenuItems eventKey={'insertafterEnd'} title={'在后面插入'} insertPosition={'afterEnd'} />
<InsertMenuItems eventKey={'insertbeforeEnd'} title={'在里面插入'} insertPosition={'beforeEnd'} />
<InsertMenuItems eventKey={'insertbeforeBegin'} title={t('Insert before')} insertPosition={'beforeBegin'} />
<InsertMenuItems eventKey={'insertafterEnd'} title={t('Insert after')} insertPosition={'afterEnd'} />
<InsertMenuItems eventKey={'insertbeforeEnd'} title={t('Insert inner')} insertPosition={'beforeEnd'} />
<SchemaSettings.Divider />
<SchemaSettings.Remove />
<SchemaSettings.Remove
confirm={{
title: t('Delete menu item'),
}}
/>
</GeneralSchemaDesigner>
);
};

View File

@ -46,7 +46,7 @@ export const GroupItem = itemWrap((props) => {
<SchemaInitializer.Item
{...props}
onClick={async () => {
const values = await FormDialog('添加分组', () => {
const values = await FormDialog(t('Add group'), () => {
return (
<SchemaComponentOptions scope={options.scope} components={{ ...options.components }}>
<FormLayout layout={'vertical'}>
@ -54,12 +54,12 @@ export const GroupItem = itemWrap((props) => {
schema={{
properties: {
title: {
title: '分组标题',
title: t('Menu item title'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
@ -94,7 +94,7 @@ export const PageMenuItem = itemWrap((props) => {
<SchemaInitializer.Item
{...props}
onClick={async () => {
const values = await FormDialog('添加页面', () => {
const values = await FormDialog(t('Add page'), () => {
return (
<SchemaComponentOptions scope={options.scope} components={{ ...options.components }}>
<FormLayout layout={'vertical'}>
@ -102,12 +102,12 @@ export const PageMenuItem = itemWrap((props) => {
schema={{
properties: {
title: {
title: '页面标题',
title: t('Menu item title'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
@ -157,7 +157,7 @@ export const LinkMenuItem = itemWrap((props) => {
<SchemaInitializer.Item
{...props}
onClick={async () => {
const values = await FormDialog('添加链接', () => {
const values = await FormDialog(t('Add link'), () => {
return (
<SchemaComponentOptions scope={options.scope} components={{ ...options.components }}>
<FormLayout layout={'vertical'}>
@ -165,20 +165,20 @@ export const LinkMenuItem = itemWrap((props) => {
schema={{
properties: {
title: {
title: '链接文字',
'x-component': 'Input',
'x-decorator': 'FormItem',
},
href: {
title: '链接',
title: t('Menu item title'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
icon: {
title: '图标',
title: t('Icon'),
'x-component': 'IconPicker',
'x-decorator': 'FormItem',
},
href: {
title: t('Link'),
'x-component': 'Input',
'x-decorator': 'FormItem',
},
},
}}
/>

View File

@ -29,6 +29,7 @@ export const useSchemaSettings = () => {
};
interface RemoveProps {
confirm?: any;
removeParentsIfNoChildren?: boolean;
breakRemoveOn?: ISchema | ((s: ISchema) => boolean);
}

View File

@ -2,6 +2,7 @@ import { SettingOutlined } from '@ant-design/icons';
import { ISchema, useForm } from '@formily/react';
import { uid } from '@formily/shared';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSystemSettings } from '.';
import { PluginManager, useAPIClient, useRequest } from '..';
import { ActionContext, SchemaComponent, useActionContext } from '../schema-component';
@ -54,7 +55,7 @@ const schema: ISchema = {
},
'x-component': 'Action.Drawer',
type: 'void',
title: '系统设置',
title: '{{t("System settings")}}',
properties: {
title: {
type: 'string',
@ -69,7 +70,8 @@ const schema: ISchema = {
'x-decorator': 'FormItem',
'x-component': 'Upload.Attachment',
'x-component-props': {
'action': 'attachments:upload'
action: 'attachments:upload',
multiple: false,
// accept: 'jpg,png'
},
},
@ -84,15 +86,15 @@ const schema: ISchema = {
],
},
allowSignUp: {
type: 'string',
title: '{{t("Allow sign up")}}',
type: 'boolean',
default: true,
'x-content': '{{t("Allow sign up")}}',
'x-component': 'Checkbox',
'x-decorator': 'FormItem',
default: true,
},
footer1: {
'x-component': 'Action.Drawer.Footer',
type: 'void',
'x-component': 'Action.Drawer.Footer',
properties: {
cancel: {
title: 'Cancel',
@ -118,6 +120,7 @@ const schema: ISchema = {
export const SystemSettingsShortcut = () => {
const [visible, setVisible] = useState(false);
const { t } = useTranslation();
return (
<ActionContext.Provider value={{ visible, setVisible }}>
<PluginManager.Toolbar.Item
@ -126,7 +129,7 @@ export const SystemSettingsShortcut = () => {
setVisible(true);
}}
icon={<SettingOutlined />}
title={'系统设置'}
title={t('System settings')}
/>
<SchemaComponent
scope={{ useSaveSystemSettingsValues, useSystemSettingsValues, useCloseAction }}

View File

@ -42,22 +42,22 @@ const schema: ISchema = {
'x-decorator': 'Form',
'x-component': 'Action.Drawer',
type: 'void',
title: '修改密码',
title: '{{t("Change password")}}',
properties: {
oldPassword: {
type: 'string',
title: '{{t("Old Password")}}',
title: '{{t("Old password")}}',
required: true,
'x-component': 'Password',
'x-decorator': 'FormItem',
},
newPassword: {
type: 'string',
title: '{{t("New Password")}}',
title: '{{t("New password")}}',
required: true,
'x-component': 'Password',
'x-decorator': 'FormItem',
'x-component-props': { placeholder: '{{t("New Password")}}', checkStrength: true, style: {} },
'x-component-props': { checkStrength: true, style: {} },
'x-reactions': [
{
dependencies: ['.confirmPassword'],
@ -72,10 +72,10 @@ const schema: ISchema = {
confirmPassword: {
type: 'string',
required: true,
title: '{{t("Confirm Password")}}',
title: '{{t("Confirm password")}}',
'x-component': 'Password',
'x-decorator': 'FormItem',
'x-component-props': { placeholder: '{{t("Confirm password")}}', checkStrength: true, style: {} },
'x-component-props': { checkStrength: true, style: {} },
'x-reactions': [
{
dependencies: ['.newPassword'],

View File

@ -46,7 +46,7 @@ const schema: ISchema = {
},
'x-component': 'Action.Drawer',
type: 'void',
title: '个人资料',
title: '{{t("Edit profile")}}',
properties: {
nickname: {
type: 'string',

View File

@ -27,6 +27,7 @@ export class ErrorHandler {
try {
await next();
} catch (err) {
console.error(err);
for (const handler of self.handlers) {
if (handler.guard(err)) {
return handler.render(err, ctx);
@ -34,7 +35,6 @@ export class ErrorHandler {
}
self.defaultHandler(err, ctx);
console.error(err);
}
};
}

View File

@ -0,0 +1 @@
export { PluginErrorHandler as default } from './server';

View File

@ -1,10 +1,10 @@
import { Plugin } from '@nocobase/server';
import { ErrorHandler } from './error-handler';
import { BaseError } from 'sequelize';
import zhCN from './locale/zh_CN';
import enUS from './locale/en_US';
import lodash from 'lodash';
import { compile } from '@formily/json-schema/lib/compiler';
import { Plugin } from '@nocobase/server';
import lodash from 'lodash';
import { BaseError } from 'sequelize';
import { ErrorHandler } from './error-handler';
import enUS from './locale/en_US';
import zhCN from './locale/zh_CN';
export class PluginErrorHandler extends Plugin {
errorHandler: ErrorHandler = new ErrorHandler();