index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import 'antd/dist/antd.less'
  2. import { useMemo } from 'react'
  3. import {
  4. Designer, // 设计器根组件,主要用于下发上下文
  5. DesignerToolsWidget, // 画板工具挂件
  6. ViewToolsWidget, // 视图切换工具挂件
  7. Workspace, // 工作区组件,核心组件,用于管理工作区内的拖拽行为,树节点数据等等...
  8. OutlineTreeWidget, // 大纲树组件,它会自动识别当前工作区,展示出工作区内树节点
  9. ResourceWidget, // 拖拽源挂件
  10. HistoryWidget, // 历史记录挂件
  11. StudioPanel, // 主布局面板
  12. CompositePanel, // 左侧组合布局面板
  13. WorkspacePanel, // 工作区布局面板
  14. ToolbarPanel, // 工具栏布局面板
  15. ViewportPanel, // 视口布局面板
  16. ViewPanel, // 视图布局面板
  17. SettingsPanel, // 右侧配置表单布局面板
  18. ComponentTreeWidget // 组件树渲染器
  19. } from '@designable/react'
  20. import { SettingsForm } from '@designable/react-settings-form'
  21. import { createDesigner, GlobalRegistry, Shortcut, KeyCode } from '@designable/core'
  22. import { ActionsWidget, PreviewWidget, SchemaEditorWidget, MarkupSchemaWidget } from './widgets'
  23. import { saveSchema } from './service'
  24. import {
  25. Form,
  26. Input,
  27. Select,
  28. TreeSelect,
  29. Cascader,
  30. Radio,
  31. Checkbox,
  32. Transfer,
  33. DatePicker,
  34. TimePicker,
  35. Upload,
  36. Switch
  37. } from 'antd'
  38. GlobalRegistry.registerDesignerLocales({
  39. 'zh-CN': {
  40. sources: {
  41. Inputs: '输入控件',
  42. Layouts: '布局组件',
  43. Arrays: '自增组件',
  44. Displays: '展示组件'
  45. }
  46. }
  47. })
  48. const Designable = () => {
  49. const engine = useMemo(
  50. () =>
  51. createDesigner({
  52. shortcuts: [
  53. new Shortcut({
  54. codes: [
  55. [KeyCode.Meta, KeyCode.S],
  56. [KeyCode.Control, KeyCode.S]
  57. ],
  58. handler(ctx) {
  59. saveSchema(ctx.engine)
  60. }
  61. })
  62. ],
  63. rootComponentName: 'Form'
  64. }),
  65. []
  66. )
  67. return (
  68. <Designer engine={engine}>
  69. <StudioPanel actions={<ActionsWidget />}>
  70. <CompositePanel>
  71. <CompositePanel.Item title="panels.Component" icon="Component">
  72. <ResourceWidget
  73. title="sources.Inputs"
  74. sources={[
  75. Input,
  76. Select,
  77. TreeSelect,
  78. Cascader,
  79. Transfer,
  80. Checkbox,
  81. Radio,
  82. DatePicker,
  83. TimePicker,
  84. Upload,
  85. Switch
  86. ]}
  87. />
  88. </CompositePanel.Item>
  89. <CompositePanel.Item title="panels.OutlinedTree" icon="Outline">
  90. <OutlineTreeWidget />
  91. </CompositePanel.Item>
  92. <CompositePanel.Item title="panels.History" icon="History">
  93. <HistoryWidget />
  94. </CompositePanel.Item>
  95. </CompositePanel>
  96. <Workspace id="form">
  97. <WorkspacePanel>
  98. <ToolbarPanel>
  99. <DesignerToolsWidget />
  100. <ViewToolsWidget use={['DESIGNABLE', 'JSONTREE', 'MARKUP', 'PREVIEW']} />
  101. </ToolbarPanel>
  102. <ViewportPanel>
  103. <ViewPanel type="DESIGNABLE">
  104. {() => (
  105. <ComponentTreeWidget
  106. components={{
  107. Form,
  108. Input,
  109. Select,
  110. TreeSelect,
  111. Cascader,
  112. Radio,
  113. Checkbox,
  114. DatePicker,
  115. TimePicker,
  116. Upload,
  117. Switch
  118. }}
  119. />
  120. )}
  121. </ViewPanel>
  122. <ViewPanel type="JSONTREE" scrollable={false}>
  123. {(tree, onChange) => <SchemaEditorWidget tree={tree} onChange={onChange} />}
  124. </ViewPanel>
  125. <ViewPanel type="MARKUP" scrollable={false}>
  126. {tree => <MarkupSchemaWidget tree={tree} />}
  127. </ViewPanel>
  128. <ViewPanel type="PREVIEW">{tree => <PreviewWidget tree={tree} />}</ViewPanel>
  129. </ViewportPanel>
  130. </WorkspacePanel>
  131. </Workspace>
  132. <SettingsPanel title="panels.PropertySettings">
  133. <SettingsForm uploadAction="https://www.mocky.io/v2/5cc8019d300000980a055e76" />
  134. </SettingsPanel>
  135. </StudioPanel>
  136. </Designer>
  137. )
  138. }
  139. export default Designable