lowcode-engine icon indicating copy to clipboard operation
lowcode-engine copied to clipboard

自定义Antd Menu物料能在大纲面板中选中,而无法在画布中选中。

Open beautiful-boyyy opened this issue 1 year ago • 1 comments

克隆官方物料仓库,更改的文件如下 build.lowcode.js,升级antd和引擎版本

const { name, version } = require("./package.json");

const library = 'AntdLowcode';

module.exports = {
  sourceMap: false,
  alias: {
    '@': './src',
    lowcode: './lowcode'
  },
  plugins: [
    [
      '@alifd/build-plugin-lowcode',
      {
        noParse: true,
        engineScope: '@alilc',
        library,
        staticResources: {
          engineCoreCssUrl:
            'https://alifd.alicdn.com/npm/@alilc/[email protected]/dist/css/engine-core.css',
          engineExtCssUrl:
            'https://alifd.alicdn.com/npm/@alilc/[email protected]/dist/css/engine-ext.css',
          engineCoreJsUrl:
            'https://alifd.alicdn.com/npm/@alilc/[email protected]/dist/js/engine-core.js',
          engineExtJsUrl:
            'https://alifd.alicdn.com/npm/@alilc/[email protected]/dist/js/engine-ext.js',
        },
        npmInfo: {
          package: name,
          version,
        },
        lowcodeDir: 'lowcode',
        entryPath: 'src/index.tsx',
        categories: ['通用', '导航', '信息输入', '信息展示', '信息反馈'],
        baseUrl: {
          prod: `https://alifd.alicdn.com/npm/${name}@${version}`,
          daily: `https://alifd.alicdn.com/npm/${name}@${version}`,
        },
        builtinAssets: [
          {
            packages: [
              {
                package: 'moment',
                version: '2.24.0',
                urls: ['https://g.alicdn.com/mylib/moment/2.24.0/min/moment.min.js'],
                library: 'moment',
              },
              {
                package: 'lodash',
                library: '_',
                urls: ['https://g.alicdn.com/platform/c/lodash/4.6.1/lodash.min.js'],
              },
              {
                package: 'iconfont-icons',
                urls: '//at.alicdn.com/t/font_2369445_ukrtsovd92r.js',
              },
              {
                package: '@ant-design/icons',
                version: '4.7.0',
                urls: [`//g.alicdn.com/code/npm/@ali/ant-design-icons-cdn/4.5.0/index.umd.min.js`],
                library: 'icons',
              },
              {
                package: 'antd',
                version: '4.23.0',
                urls: [
                  `//g.alicdn.com/code/lib/antd/4.23.0/antd.min.js`,
                  `//g.alicdn.com/code/lib/antd/4.23.0/antd.min.css`,
                ],
                library: 'antd',
              },
            ],
            components: [],
          },
        ],
      },
    ],
  ],
};

lowcode/menu/meta.ts

import {uuid} from '../_utils/utils';
import {itemsExtraProps} from './utils';

import snippets from './snippets';

export default {
  snippets,
  componentName: 'Menu',
  title: '导航菜单',
  category: '导航',
  props: [
    {
      name: 'items',
      title: '菜单项',
      setter: {
        componentName: 'ArraySetter',
        props: {
          itemSetter: {
            componentName: 'ObjectSetter',
            props: {
              config: {
                items: [
                  {
                    name: 'type',
                    title: {
                      label: '类型',
                      tip: '菜单项类型',
                    },
                    propType: {
                      type: 'oneOf',
                      value: ['Menu.Item', 'Menu.SubMenu', 'Menu.ItemGroup', 'Mneu.Divider'],
                    },
                    setter: [
                      {
                        componentName: 'RadioGroupSetter',
                        props: {
                          options: [
                            {
                              title: 'MenuItem',
                              value: 'Menu.Item',
                            },
                            {
                              title: 'SubMenu',
                              value: 'Menu.SubMenu',
                            },
                            {
                              title: 'ItemGroup',
                              value: 'Menu.ItemGroup',
                            },
                            {
                              title: 'Divider',
                              value: 'Menu.MenuDivider'
                            }
                          ],
                        },
                      },
                      'VariableSetter',
                    ],
                  },
                  {
                    name: 'key',
                    title: 'key',
                    setter: 'StringSetter',
                    initialValue: (val) => val || uuid(),
                  },
                  {
                    name: 'label',
                    title: '菜单名称',
                    setter: 'StringSetter',
                  },
                ],
              },
            },
            initialValue: () => {
              return {
                type: 'Menu.Item',
                key: 'item-' + uuid(),
                label: '菜单名',
              };
            },
          },
        },
      },
      extraProps: itemsExtraProps,
    },
    {
      name: 'defaultOpenKeys',
      title: {
        label: '初始展开菜单项',
        tip: '初始展开的 SubMenu 菜单项 key 数组',
      },
      propType: {type: 'arrayOf', value: 'string'},
    },
    {
      name: 'defaultSelectedKeys',
      title: {label: '初始选中的菜单项', tip: '初始选中的菜单项 key 数组'},
      propType: {type: 'arrayOf', value: 'string'},
    },
    {
      name: 'forceSubMenuRender',
      title: {
        label: '子菜单预渲染',
        tip: '在子菜单展示之前就渲染进 DOM',
      },
      propType: 'bool',
      defaultValue: false,
    },
    {
      name: 'inlineCollapsed',
      title: {label: '是否收起', tip: 'inline 时菜单是否收起状态'},
      propType: 'bool',
    },
    {
      name: 'inlineIndent',
      title: {label: '缩进宽度', tip: 'inline 模式的菜单缩进宽度'},
      propType: 'number',
    },
    {
      name: 'mode',
      title: {
        label: '菜单类型',
        tip: '菜单类型,现在支持垂直、水平、和内嵌模式三种',
      },
      propType: {type: 'oneOf', value: ['vertical', 'horizontal', 'inline']},
    },
    {
      name: 'multiple',
      title: {label: '是否允许多选', tip: '是否允许多选'},
      propType: 'bool',
      defaultValue: false,
    },
    {
      name: 'openKeys',
      title: {
        label: '当前展开的菜单项',
        tip: '当前展开的 SubMenu 菜单项 key 数组',
      },
      propType: {type: 'arrayOf', value: 'string'},
    },
    {
      name: 'selectable',
      title: {label: '是否允许选中', tip: '是否允许选中'},
      propType: 'bool',
      defaultValue: true,
    },
    {
      name: 'selectedKeys',
      title: {label: '当前选中项', tip: '当前选中的菜单项 key 数组'},
      propType: {type: 'arrayOf', value: 'string'},
    },
    {
      name: 'style',
      title: {label: '根节点样式', tip: '根节点样式'},
      propType: 'object',
    },
    {
      name: 'subMenuCloseDelay',
      title: {
        label: '关闭延时',
        tip: '用户鼠标离开子菜单后关闭延时,单位:秒',
      },
      propType: 'number',
    },
    {
      name: 'subMenuOpenDelay',
      title: {
        label: '开启延时',
        tip: '用户鼠标进入子菜单后开启延时,单位:秒',
      },
      propType: 'number',
    },
    {
      name: 'theme',
      title: {label: '主题颜色', tip: '主题颜色'},
      propType: {type: 'oneOf', value: ['light', 'dark']},
    },
    {
      name: 'onClick',
      title: {label: '点击 MenuItem 调用函数', tip: '点击 MenuItem 调用函数'},
      propType: 'func',
    },
    {
      name: 'onDeselect',
      title: {
        label: '取消选中时调用函数',
        tip: '取消选中时调用,仅在 multiple 生效',
      },
      propType: 'func',
    },
    {
      name: 'triggerSubMenuAction',
      title: {
        label: '触发方式',
        tip: '展开/关闭的触发行为',
      },
      propType: {type: 'oneOf', value: ['hover', 'click']},
    },
    {
      name: 'onOpenChange',
      title: {label: 'SubMenu 展开/关闭的回调', tip: '展开/关闭的回调'},
      propType: 'func',
    },
    {
      name: 'onSelect',
      title: {label: '被选中时调用函数', tip: '被选中时调用函数'},
      propType: 'func',
    },
    {
      name: 'overflowedIndicator',
      title: {label: '折叠图标', tip: '自定义 Menu 折叠时的图标'},
      propType: 'node',
    },
  ],
  configure: {
    supports: {
      style: true,
      events: [
        {
          name: 'onClick',
          template:
            "onClick({item,key,keyPath,domEvent},${extParams}){\n// 点击 MenuItem 调用此函数\nconsole.log('onClick',item,key,keyPath,domEvent);}",
        },
        {
          name: 'onDeselect',
          template:
            "onDeselect({item,key,keyPath,selectedKeys,domEvent},${extParams}){\n// 取消选中时调用,仅在 multiple 生效\nconsole.log('onDeselect',item,key,keyPath,selectedKeys,domEvent);}",
        },
        {
          name: 'onOpenChange',
          template:
            "onOpenChange(openKeys,${extParams}){\n// SubMenu 展开/关闭的回调\nconsole.log('onOpenChange',openKeys);}",
        },
        {
          name: 'onSelect',
          template:
            "onSelect({item,key,keyPath,selectedKeys,domEvent},${extParams}){\n// 被选中时调用\nconsole.log('onSelect',item,key,keyPath,selectedKeys,domEvent);}",
        },
      ],
    },
  },
};

/lowcode/menu/snippets.ts

import {uuid} from '../_utils/utils';

export default [
  {
    title: '导航菜单',
    screenshot: 'https://alifd.alicdn.com/fusion-cool/icons/icon-antd/menu-1.jpg',
    schema: {
      componentName: 'Menu',
      props: {
        mode: 'inline',
        defaultSelectedKeys: ['1'],
        defaultOpenKeys: ['sub1'],
        theme: 'dark',
        items: [
          {
            key: 'item-' + uuid(),
            type: 'Menu.Item',
            label: '菜单名',
          },
        ],
      },
    },
  },
];

/lowcode/menu.item/meta.ts

import snippets from './snippets';

export default {
  snippets,
  componentName: 'Menu.Item',
  title: '菜单项',
  props: [
    {
      name: 'label',
      title: { label: '菜单项标题', tip: '菜单项标题' },
      propType: 'string'
    },
    {
      name: 'danger',
      title: { label: '错误状态', tip: '展示错误状态样式' },
      propType: 'bool',
      defaultValue: false,
    },
    {
      name: 'disabled',
      title: { label: '是否禁用', tip: '是否为禁用状态' },
      propType: 'bool',
      defaultValue: false,
    },
    {
      name: 'icon',
      title: { label: '菜单图标', tip: '菜单图标' },
      propType: { type: 'oneOfType', value: ['string', 'node'] },
      defaultValue: false,
    },
    {
      name: 'key',
      title: { label: '唯一标志', tip: 'item 的唯一标志' },
      propType: 'string',
    },
    {
      name: 'title',
      title: {
        label: '悬浮标题',
        tip: '设置收缩时展示的悬浮标题',
      },
      propType: 'string',
    },
  ],
  configure: {
    component: {
      isContainer: true,
      nestingRule: { parentWhitelist: ['Menu'] },
    },
    supports: { style: true },
  },
};

行为如下: Kapture 2023-03-07 at 17 47 28

beautiful-boyyy avatar Mar 07 '23 09:03 beautiful-boyyy

一个组件能否被选中是在哪个模块设定的?

beautiful-boyyy avatar Mar 14 '23 06:03 beautiful-boyyy

遇到同样的问题了,楼主解决了嘛

GYunZhi avatar Jun 19 '23 01:06 GYunZhi

组件外面包个div看看?

callmejustice avatar Aug 03 '23 10:08 callmejustice