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

nestingRule.ancestorWhitelist 祖父节点类型白名单 无效

Open try2020-code opened this issue 1 year ago • 13 comments

Describe the bug (required) / 详细描述 bug(必填)

根据物料协议规范 https://lowcode-engine.cn/site/docs/specs/material-spec 中的 2.2.2.4.3 组件能力配置 component 设置了无效,详细看代码

/** 此插件对编辑进行控制 比如节点是否能拖到某节点下, 父节点变更处理 等*/
const EditNodeControl = (ctx: IPublicModelPluginContext) => {
    return {
        async init() {
            

            // 1:所依懒的上级控件改变(如拖动改变了上级找不到上级了, 上级邦定的单据改变了等)

            //注册setter
            const { setters, project, canvas, material, config } = ctx;
            let iniView = config.get('iniView') as t_view & { ActionType: ActionType };
            //组件的拖入控制是  通过设置物料描述信息的 nestingRule 来设置的  相关文档 https://lowcode-engine.cn/site/docs/faq/faq022

            /**
             * 所以思路是当邦定了业务对像时. 就要自动设置支持映射字段的物料进行 nestingRule 控制
             * 对于子单据 就只有一种..
             */
            if (iniView.FormType == FormType.动态表单) {
                return; //动态表单完全自由。 不需要进行下面的操作了
            }
            material.registerMetadataTransducer((e) => {
                console.log('物料进入了', e);
                //e.configure.component?.nestingRule
                /*
                要根据物料类型进行控制 如果被映射了字段 就要设置祖父节点类型白名单的白名单了
                nestingRule(A)	嵌套控制:防止错误的节点嵌套,比如 a 嵌套 a, FormField 只能在 Form 容器下,Column 只能在 Table 下等	Object
                nestingRule.childWhitelist	子节点类型白名单	String\|Function
                nestingRule.parentWhitelist	父节点类型白名单	String\|Function
                nestingRule.descendantBlacklist	后裔节点类型黑名单	String\|Function
                nestingRule.ancestorWhitelist	祖父节点类型白名单	String\|Function
                */

                //容器只能放业务对像下, 映射字段只能放单据里, 按扭可随便放
                if (e.configure.component) {
                    e.configure.component.nestingRule ??= {};
                    console.log('已注册 ancestorWhitelist', e);
                    // e.configure.component.nestingRule.parentWhitelist = (testNode: IPublicModelNode, currentNode: IPublicModelNode) => {
                    //     console.log('父节点类型白名单:testNode', testNode, 'currentNode:', currentNode);
                    //     return false;
                    // };
                    //不起作用
                    e.configure.component.nestingRule.ancestorWhitelist = (testNode: IPublicModelNode, currentNode: IPublicModelNode) => {
                        console.log('控制祖父节点类型白名单:testNode', testNode, 'currentNode:', currentNode);

                        return false;
                    };
                }

                return e;
            });
            project.currentDocument?.onAddNode((e) => {
                console.log('新增节点', e);
            });
            project.currentDocument?.onChangeNodeProp((e) => {
                /*
                如果被映射了字段 就要设置父节点的白名单了
                */
                console.log('节点属性更改:', e);
            });
            canvas.dragon?.onDragend((e) => {
                console.log('拖动结束', e);
            });
        },
    };
};

e.configure.component.nestingRule.parentWhitelist 这个属性就有效. 返回false 之后, 不能拖入到任何容器下,但 e.configure.component.nestingRule.ancestorWhitelist 下就无效了.没反应了

A clear and concise description of what the bug is. / 请提供清晰且精确的 bug 描述


To Reproduce (required) / 如何复现 bug?(必填,非常重要)

Steps to reproduce the behavior: / 详细复现步骤:


Expected behavior (required) / 预期行为(必填,非常重要)

A clear and concise description of what did you expect to happen. / 请清晰和精确的描述你预期的行为 预期行为应该是 只要一个节点设置了祖白名单 .我的函数是永远false 哪就跟 parentWhitelist 一样的效果才是,不管我上面有多少层父

Screenshots (optional) / bug 截图(可选)

Sceenshots for further information. (If applicable.) / 一些有用的截图将会帮助我们更好的明确以及定位问题


Environments (please complete the following information) (required): / 请提供如下信息(必填)

  • AliLowCodeEngine version: [e.g. 1.2.2-beta.3] / 低代码引擎版本
  • AliLowCodeEngineExt version: [e.g. 1.2.2-beta.3] / 低代码引擎扩展包版本
  • Browser [e.g. edge] / 浏览器版本
  • materials / plugins / tools / 其他物料 / 插件 / 工具链版本

(this information can be collected via the manual plugin / 版本信息可通过低代码用户手册插件收集)

Additional context (optional) / 更多额外信息(可选)

Any other context of the problem here. / 可以追加更多的额外信息,帮助定位问题

try2020-code avatar Nov 27 '23 08:11 try2020-code

通过 API 来更新协议内容,直接赋值是无效的。

https://lowcode-engine.cn/site/docs/api/material#loadincrementalassets

liujuping avatar Nov 27 '23 08:11 liujuping

通过 API 来更新协议内容,直接赋值是无效的。

https://lowcode-engine.cn/site/docs/api/material#loadincrementalassets

可是为什么这个可以呢

  e.configure.component.nestingRule.parentWhitelist = (testNode: IPublicModelNode, currentNode: IPublicModelNode) => {
      console.log('父节点类型白名单:testNode', testNode, 'currentNode:', currentNode);
      return false;
  };

try2020-code avatar Nov 27 '23 11:11 try2020-code

先用 API 来更新协议,看一下是否可行哈。

至于差异化的原因,很有可能是实现的不一致导致的差异,这块后续可能会修复。使用 API 来操作才是稳定可靠的方式。

liujuping avatar Nov 27 '23 12:11 liujuping

先用 API 来更新协议,看一下是否可行哈。

至于差异化的原因,很有可能是实现的不一致导致的差异,这块后续可能会修复。使用 API 来操作才是稳定可靠的方式。

目前就是要在 loadincrementalassets 之后进行hook 动态处理呢..这样管道函数就失去存在的意义了

try2020-code avatar Nov 27 '23 13:11 try2020-code

看了一下代码,ancestorWhitelist 没有实现。。。。

liujuping avatar Nov 27 '23 13:11 liujuping

现在只实现了 childWhitelist、parentWhitelist

liujuping avatar Nov 27 '23 13:11 liujuping

现在只实现了 childWhitelist、parentWhitelist

这两个的触发时机也有问题.. 应该在鼠标放开.也就是拖动结束后产生.. 现在是只要移动就产生.. 或者也应该增加一个鼠标放开时判断能不能放入的事件

try2020-code avatar Nov 28 '23 07:11 try2020-code

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

liujuping avatar Nov 29 '23 06:11 liujuping

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

但问题是大多数应用场景都只是需要在拖入到目标区域放开才去判断能不能放到这个组件中.. 拖动的过程反馈 体验是很好的, 但我们一开始就应该假设未设置"childWhitelist、parentWhitelist" 为"函数" 的情况下任何组件都能接收, 具体判断childWhitelist、parentWhitelist 时应是鼠标放开....

我觉得增加个事件回调是最好的,以鼠标放开为准. 我尝试介入拖拽对像,也是无法实现我的业务

try2020-code avatar Nov 29 '23 07:11 try2020-code

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

但问题是大多数应用场景都只是需要在拖入到目标区域放开才去判断能不能放到这个组件中.. 拖动的过程反馈 体验是很好的, 但我们一开始就应该假设未设置"childWhitelist、parentWhitelist" 为"函数" 的情况下任何组件都能接收, 具体判断childWhitelist、parentWhitelist 时应是鼠标放开....

我觉得增加个事件回调是最好的,以鼠标放开为准. 我尝试介入拖拽对像,也是无法实现我的业务

什么样的场景是放开鼠标才去判断?假设我是一个用户,我如果在放开鼠标的时候,才发现没有办法拖入,我就需要重新回到组件列表中拖入到其他的容器中。我更需要在拖入容器的过程中,就知道这个容器无法拖入,我直接换一个容器拖入。

liujuping avatar Nov 29 '23 07:11 liujuping

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

但问题是大多数应用场景都只是需要在拖入到目标区域放开才去判断能不能放到这个组件中.. 拖动的过程反馈 体验是很好的, 但我们一开始就应该假设未设置"childWhitelist、parentWhitelist" 为"函数" 的情况下任何组件都能接收, 具体判断childWhitelist、parentWhitelist 时应是鼠标放开.... 我觉得增加个事件回调是最好的,以鼠标放开为准. 我尝试介入拖拽对像,也是无法实现我的业务

什么样的场景是放开鼠标才去判断?假设我是一个用户,我如果在放开鼠标的时候,才发现没有办法拖入,我就需要重新回到组件列表中拖入到其他的容器中。我更需要在拖入容器的过程中,就知道这个容器无法拖入,我直接换一个容器拖入。

不是从组件列表中拖入, 是将一个节点托到另一个节点下,比如有两个box a节点在box1 下。 我现在将a托到box2 下。 但box2 是动态判断白名单子孙的。。 当不符合时。 我可以提示用户后,。 然后让被托的节点回归原位

try2020-code avatar Nov 29 '23 12:11 try2020-code

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

但问题是大多数应用场景都只是需要在拖入到目标区域放开才去判断能不能放到这个组件中.. 拖动的过程反馈 体验是很好的, 但我们一开始就应该假设未设置"childWhitelist、parentWhitelist" 为"函数" 的情况下任何组件都能接收, 具体判断childWhitelist、parentWhitelist 时应是鼠标放开.... 我觉得增加个事件回调是最好的,以鼠标放开为准. 我尝试介入拖拽对像,也是无法实现我的业务

什么样的场景是放开鼠标才去判断?假设我是一个用户,我如果在放开鼠标的时候,才发现没有办法拖入,我就需要重新回到组件列表中拖入到其他的容器中。我更需要在拖入容器的过程中,就知道这个容器无法拖入,我直接换一个容器拖入。

不是从组件列表中拖入, 是将一个节点托到另一个节点下,比如有两个box a节点在box1 下。 我现在将a托到box2 下。 但box2 是动态判断白名单子孙的。。 当不符合时。 我可以提示用户后,。 然后让被托的节点回归原位

对于用户来说拖入 box2 的时候就知道 box2 不能拖入是 OK 的,用户要么取消拖入,要么换一个容器重新拖入。有没有现有的拖入目标就进行判断的问题呢?比如性能问题,或者没有办法实现的场景之类的。

liujuping avatar Nov 30 '23 01:11 liujuping

鼠标放开时候才判断的话,没有拖入过程的反馈,放开就消失了,也没有办法继续调整,需要多次拖入,用户体验不太好。

但问题是大多数应用场景都只是需要在拖入到目标区域放开才去判断能不能放到这个组件中.. 拖动的过程反馈 体验是很好的, 但我们一开始就应该假设未设置"childWhitelist、parentWhitelist" 为"函数" 的情况下任何组件都能接收, 具体判断childWhitelist、parentWhitelist 时应是鼠标放开.... 我觉得增加个事件回调是最好的,以鼠标放开为准. 我尝试介入拖拽对像,也是无法实现我的业务

什么样的场景是放开鼠标才去判断?假设我是一个用户,我如果在放开鼠标的时候,才发现没有办法拖入,我就需要重新回到组件列表中拖入到其他的容器中。我更需要在拖入容器的过程中,就知道这个容器无法拖入,我直接换一个容器拖入。

不是从组件列表中拖入, 是将一个节点托到另一个节点下,比如有两个box a节点在box1 下。 我现在将a托到box2 下。 但box2 是动态判断白名单子孙的。。 当不符合时。 我可以提示用户后,。 然后让被托的节点回归原位

对于用户来说拖入 box2 的时候就知道 box2 不能拖入是 OK 的,用户要么取消拖入,要么换一个容器重新拖入。有没有现有的拖入目标就进行判断的问题呢?比如性能问题,或者没有办法实现的场景之类的。

业务上都要考虑用户啥都不知道, 性能问题是很明显的 鼠标每移动一个像素都会回调白名单函数 ,具体场景就是 当判断到不能拖入时, 就要弹出消息框告诉用户为什么不能放在这个容器里, 但每移动一个像素就会弹出一个消息框。。 整个屏幕都占满了

try2020-code avatar Nov 30 '23 04:11 try2020-code