UNPKG

jjb-lc-designable

Version:

基于alibaba-designable源码二次封装的表单设计器。

86 lines 3.02 kB
import React, { useMemo } from 'react'; import { createForm } from 'jjb-lc-formily/core'; import { Form } from 'jjb-lc-formily/antd'; import { observer } from 'jjb-lc-formily/react'; import { requestIdle, cancelIdle } from 'jjb-lc-designable/shared'; import { usePrefix, useSelected, useOperation, useSelectedNode, useWorkbench, IconWidget, NodePathWidget } from 'jjb-lc-designable/react'; import { SchemaField } from './SchemaField'; import { SettingsFormContext } from './shared/context'; import { useLocales, useSnapshot } from './effects'; import { Empty } from 'antd'; import cls from 'classnames'; import './styles.less'; const GlobalState = { idleRequest: null }; export const SettingsForm = observer(props => { const workbench = useWorkbench(); const currentWorkspace = workbench?.activeWorkspace || workbench?.currentWorkspace; const currentWorkspaceId = currentWorkspace?.id; const operation = useOperation(currentWorkspaceId); const node = useSelectedNode(currentWorkspaceId); const selected = useSelected(currentWorkspaceId); const prefix = usePrefix('settings-form'); const schema = node?.designerProps?.propsSchema; const isEmpty = !(node && node.designerProps?.propsSchema && selected.length === 1); const form = useMemo(() => { return createForm({ initialValues: node?.designerProps?.defaultProps, values: node?.props, effects(form) { useLocales(node); useSnapshot(operation); props.effects?.(form); } }); }, [node, node?.props, schema, operation, isEmpty]); const render = () => { if (!isEmpty) { return /*#__PURE__*/React.createElement("div", { className: cls(prefix, props.className), style: props.style, key: node.id }, /*#__PURE__*/React.createElement(SettingsFormContext.Provider, { value: props }, /*#__PURE__*/React.createElement(Form, { form: form, colon: false, labelWidth: 120, labelAlign: "left", wrapperAlign: "right", feedbackLayout: "none", tooltipLayout: "text" }, /*#__PURE__*/React.createElement(SchemaField, { schema: schema, components: props.components, scope: { $node: node, ...props.scope } })))); } return /*#__PURE__*/React.createElement("div", { className: prefix + '-empty' }, /*#__PURE__*/React.createElement(Empty, null)); }; return ( /*#__PURE__*/ // @ts-ignore React.createElement(IconWidget.Provider, { tooltip: true }, /*#__PURE__*/React.createElement("div", { className: prefix + '-wrapper' }, !isEmpty && /*#__PURE__*/React.createElement(NodePathWidget, { workspaceId: currentWorkspaceId }), /*#__PURE__*/React.createElement("div", { className: prefix + '-content' }, render()))) ); }, { scheduler: update => { cancelIdle(GlobalState.idleRequest); GlobalState.idleRequest = requestIdle(update, { timeout: 500 }); } });