fix(editor): 数据源列表中依赖的key会重复出现

This commit is contained in:
roymondchen 2023-11-03 14:58:19 +08:00
parent 801399777b
commit 2d5b7726ef
4 changed files with 33 additions and 19 deletions

View File

@ -75,6 +75,26 @@ const getNodeTreeConfig = (id: string, dep: Dep[string], type?: string) => ({
children: getKeyTreeConfig(dep, type),
});
/**
* 生成tree中依赖节点的数据
* @param children 节点
* @param deps 依赖
* @param type 依赖类型
*/
const mergeChildren = (children: any[], deps: Dep, type?: string) => {
Object.entries(deps).forEach(([id, dep]) => {
//
const nodeItem = children.find((item) => item.id === id);
// key
if (nodeItem) {
nodeItem.children = nodeItem.children.concat(getKeyTreeConfig(dep, type));
} else {
//
children.push(getNodeTreeConfig(id, dep, type));
}
});
};
const list = computed(() =>
dataSources.value.map((ds) => {
const dsDeps = dsDep.value[ds.id].deps;
@ -82,21 +102,10 @@ const list = computed(() =>
const dsCondDeps = dsCondDep.value[ds.id].deps;
const children: any[] = [];
const mergeChildren = (deps: Dep, type?: string) => {
Object.entries(deps).forEach(([id, dep]) => {
const nodeItem = children.find((item) => item.id === id);
if (nodeItem) {
nodeItem.children = nodeItem.children.concat(getKeyTreeConfig(dep, type));
} else {
children.push(getNodeTreeConfig(id, dep, type));
}
});
};
mergeChildren(dsDeps);
mergeChildren(dsMethodDeps, 'method');
mergeChildren(dsCondDeps, 'cond');
// key/nodemethodcond
mergeChildren(children, dsDeps);
mergeChildren(children, dsMethodDeps, 'method');
mergeChildren(children, dsCondDeps, 'cond');
return {
id: ds.id,

View File

@ -299,7 +299,7 @@ export class Watcher extends EventEmitter {
const keyIsItems = key === 'items';
const fullKey = prop ? `${prop}.${key}` : key;
if (target.isTarget(key, value)) {
if (target.isTarget(fullKey, value)) {
target.updateDep(node, fullKey);
this.emit('update-dep', node, fullKey);
} else if (!keyIsItems && Array.isArray(value)) {

View File

@ -58,8 +58,13 @@ export const createDataSourceCondTarget = (id: string) =>
new Target({
type: DepTargetType.DATA_SOURCE_COND,
id,
isTarget: (key: string | number, value: any) =>
Array.isArray(value) && value[0] === id && Boolean(dataSourceService.getDataSourceById(id)),
isTarget: (key: string | number, value: any) => {
if (!Array.isArray(value) || value[0] !== id || !`${key}`.startsWith('displayConds')) return false;
const ds = dataSourceService.getDataSourceById(id);
return Boolean(ds?.fields?.find((field) => field.name === value[1]));
},
});
export const createDataSourceMethodTarget = (id: string) =>

View File

@ -96,7 +96,7 @@ describe('depService', () => {
type: 'target',
id: 'collect_2',
name: 'test2',
isTarget: (key: string | number, value: any) => key === 'text1' && value === 'text',
isTarget: (key: string | number, value: any) => `${key}`.includes('text1') && value === 'text',
}),
);