import { css } from '@emotion/css'; import { ISchema, observer } from '@formily/react'; import { Button, Dropdown, Menu, Switch } from 'antd'; import classNames from 'classnames'; import React, { createContext, useContext, useState } from 'react'; import { Icon } from '../icon'; import { useCompile, useDesignable } from '../schema-component/hooks'; import './style.less'; import { SchemaInitializerButtonProps, SchemaInitializerItemComponent, SchemaInitializerItemOptions, SchemaInitializerItemProps, } from './types'; const defaultWrap = (s: ISchema) => s; export const SchemaInitializerItemContext = createContext(null); export const SchemaInitializerButtonContext = createContext({}); export const SchemaInitializer = () => null; const menuItemGroupCss = 'nb-menu-item-group'; SchemaInitializer.Button = observer((props: SchemaInitializerButtonProps) => { const { title, insert, wrap = defaultWrap, items = [], insertPosition = 'beforeEnd', dropdown, component, style, icon, onSuccess, ...others } = props; const compile = useCompile(); let { insertAdjacent, findComponent, designable } = useDesignable(); const [visible, setVisible] = useState(false); const insertSchema = (schema) => { if (props.insert) { props.insert(wrap(schema)); } else { insertAdjacent(insertPosition, wrap(schema), { onSuccess }); } }; const renderItems = (items: any) => { return items .filter((v) => { return v && (v?.visible ? v.visible() : true); }) ?.map((item, indexA) => { if (item.type === 'divider') { return ; } if (item.type === 'item' && item.component) { const Component = findComponent(item.component); item.key = `${item.key || item.title}-${indexA}`; return ( Component && ( ) ); } if (item.type === 'itemGroup') { return ( !!item.children?.length && ( {renderItems(item.children)} ) ); } if (item.type === 'subMenu') { return ( !!item.children?.length && ( {renderItems(item.children)} ) ); } }); }; const menu = {renderItems(items)}; if (!designable && props.designable !== true) { return null; } return ( { setVisible(visible); }} {...dropdown} overlay={menu} > {component ? ( component ) : ( )} ); }); SchemaInitializer.Item = (props: SchemaInitializerItemProps) => { const { index, info } = useContext(SchemaInitializerItemContext); const compile = useCompile(); const { eventKey, items = [], children = info?.title, icon, onClick, ...others } = props; if (items?.length > 0) { const renderMenuItem = (items: SchemaInitializerItemOptions[]) => { if (!items?.length) { return null; } return items.map((item, indexA) => { if (item.type === 'divider') { return ; } if (item.type === 'itemGroup') { return ( {renderMenuItem(item.children)} ); } if (item.type === 'subMenu') { return ( {renderMenuItem(item.children)} ); } return ( { item?.clearKeywords?.(); if (item.onClick) { item.onClick({ ...info, item }); } else { onClick({ ...info, item }); } }} > {compile(item.title)} ); }); }; return ( : icon} > {renderMenuItem(items)} ); } return ( : icon} onClick={(opts) => { info?.clearKeywords?.(); onClick({ ...opts, item: info }); }} > {compile(children)} ); }; SchemaInitializer.itemWrap = (component?: SchemaInitializerItemComponent) => { return component; }; SchemaInitializer.SwitchItem = (props) => { return (
{props.title}
); };