formily/next/playground/main.tsx (226 lines of code) (raw):

import 'antd/dist/antd.less' import '@alifd/next/dist/next.css' import React, { useMemo } from 'react' import ReactDOM from 'react-dom' import { Designer, DesignerToolsWidget, ViewToolsWidget, Workspace, OutlineTreeWidget, ResourceWidget, HistoryWidget, StudioPanel, CompositePanel, WorkspacePanel, ToolbarPanel, ViewportPanel, ViewPanel, SettingsPanel, ComponentTreeWidget, } from '@designable/react' import { SettingsForm } from '@designable/react-settings-form' import { createDesigner, GlobalRegistry, Shortcut, KeyCode, } from '@designable/core' import { LogoWidget, ActionsWidget, PreviewWidget, SchemaEditorWidget, MarkupSchemaWidget, } from './widgets' import { saveSchema } from './service' import { Form, Field, Input, Select, TreeSelect, Cascader, Radio, Checkbox, Range, Rating, NumberPicker, Transfer, Password, DatePicker, TimePicker, Upload, Switch, Text, Card, ArrayCards, ObjectContainer, ArrayTable, Space, FormTab, FormCollapse, FormLayout, FormGrid, } from '../src' GlobalRegistry.registerDesignerLocales({ 'zh-CN': { sources: { Inputs: '输入控件', Layouts: '布局组件', Arrays: '自增组件', Displays: '展示组件', }, }, 'en-US': { sources: { Inputs: 'Inputs', Layouts: 'Layouts', Arrays: 'Arrays', Displays: 'Displays', }, }, 'ko-KR': { sources: { Inputs: '입력', Layouts: '레이아웃', Arrays: '배열', Displays: '디스플레이', }, }, }) const App = () => { const engine = useMemo( () => createDesigner({ shortcuts: [ new Shortcut({ codes: [ [KeyCode.Meta, KeyCode.S], [KeyCode.Control, KeyCode.S], ], handler(ctx) { saveSchema(ctx.engine) }, }), ], rootComponentName: 'Form', }), [] ) return ( <Designer engine={engine}> <StudioPanel logo={<LogoWidget />} actions={<ActionsWidget />}> <CompositePanel> <CompositePanel.Item title="panels.Component" icon="Component"> <ResourceWidget title="sources.Inputs" sources={[ Input, Password, NumberPicker, Rating, Range, Select, TreeSelect, Cascader, Transfer, Checkbox, Radio, DatePicker, TimePicker, Upload, Switch, ObjectContainer, ]} /> <ResourceWidget title="sources.Layouts" sources={[ Card, FormGrid, FormTab, FormLayout, FormCollapse, Space, ]} /> <ResourceWidget title="sources.Arrays" sources={[ArrayCards, ArrayTable]} /> <ResourceWidget title="sources.Displays" sources={[Text]} /> </CompositePanel.Item> <CompositePanel.Item title="panels.OutlinedTree" icon="Outline"> <OutlineTreeWidget /> </CompositePanel.Item> <CompositePanel.Item title="panels.History" icon="History"> <HistoryWidget /> </CompositePanel.Item> </CompositePanel> <Workspace id="form"> <WorkspacePanel> <ToolbarPanel> <DesignerToolsWidget /> <ViewToolsWidget use={['DESIGNABLE', 'JSONTREE', 'MARKUP', 'PREVIEW']} /> </ToolbarPanel> <ViewportPanel style={{ height: '100%' }}> <ViewPanel type="DESIGNABLE"> {() => ( <ComponentTreeWidget components={{ Form, Field, Input, Select, TreeSelect, Cascader, Radio, Checkbox, Range, Rating, NumberPicker, Transfer, Password, DatePicker, TimePicker, Upload, Switch, Text, Card, ArrayCards, ArrayTable, Space, FormTab, FormCollapse, FormGrid, FormLayout, ObjectContainer, }} /> )} </ViewPanel> <ViewPanel type="JSONTREE" scrollable={false}> {(tree, onChange) => ( <SchemaEditorWidget tree={tree} onChange={onChange} /> )} </ViewPanel> <ViewPanel type="MARKUP" scrollable={false}> {(tree) => <MarkupSchemaWidget tree={tree} />} </ViewPanel> <ViewPanel type="PREVIEW"> {(tree) => <PreviewWidget tree={tree} />} </ViewPanel> </ViewportPanel> </WorkspacePanel> </Workspace> <SettingsPanel title="panels.PropertySettings"> <SettingsForm uploadAction="https://www.mocky.io/v2/5cc8019d300000980a055e76" /> </SettingsPanel> </StudioPanel> </Designer> ) } ReactDOM.render(<App />, document.getElementById('root'))