1
0
mirror of synced 2026-04-02 22:18:39 +08:00

feat(dats-source,editor,form,schema,ui): 迭代器容器支持配置子项显示条件

This commit is contained in:
roymondchen
2024-06-28 17:44:04 +08:00
parent 0c5485b1d0
commit a164e2be62
18 changed files with 400 additions and 159 deletions

View File

@@ -1,7 +1,7 @@
import { cloneDeep, template } from 'lodash-es';
import { isDataSourceTemplate, isUseDataSourceField, Target, Watcher } from '@tmagic/dep';
import type { MApp, MNode, MPage, MPageFragment } from '@tmagic/schema';
import type { DisplayCond, DisplayCondItem, MApp, MNode, MPage, MPageFragment } from '@tmagic/schema';
import {
compiledCond,
compiledNode,
@@ -15,29 +15,69 @@ import {
import type { AsyncDataSourceResolveResult, DataSourceManagerData } from './types';
/**
* 编译显示条件
* @param cond 条件配置
* @param data 上下文数据(数据源数据)
* @returns boolean
*/
export const compiledCondition = (cond: DisplayCondItem[], data: DataSourceManagerData) => {
let result = true;
for (const { op, value, range, field } of cond) {
const [sourceId, ...fields] = field;
const dsData = data[sourceId];
if (!dsData || !fields.length) {
break;
}
const fieldValue = getValueByKeyPath(fields.join('.'), dsData);
if (!compiledCond(op, fieldValue, value, range)) {
result = false;
break;
}
}
return result;
};
/**
* 编译数据源条件组
* @param node dsl节点
* @param data 数据源数据
* @returns boolean
*/
export const compliedConditions = (node: MNode, data: DataSourceManagerData) => {
export const compliedConditions = (node: { displayConds?: DisplayCond[] }, data: DataSourceManagerData) => {
if (!node.displayConds || !Array.isArray(node.displayConds) || !node.displayConds.length) return true;
for (const { cond } of node.displayConds) {
if (!cond) continue;
if (compiledCondition(cond, data)) {
return true;
}
}
return false;
};
/**
* 编译迭代器容器子项显示条件
* @param displayConds 条件组配置
* @param data 迭代器容器的迭代数据项
* @returns boolean
*/
export const compliedIteratorItemConditions = (displayConds: DisplayCond[] = [], data: DataSourceManagerData) => {
if (!displayConds || !Array.isArray(displayConds) || !displayConds.length) return true;
for (const { cond } of displayConds) {
if (!cond) continue;
let result = true;
for (const { op, value, range, field } of cond) {
const [sourceId, ...fields] = field;
const dsData = data[sourceId];
if (!dsData || !fields.length) {
break;
}
const fieldValue = getValueByKeyPath(fields.join('.'), data[sourceId]);
const fieldValue = getValueByKeyPath(field.join('.'), data);
if (!compiledCond(op, fieldValue, value, range)) {
result = false;
@@ -45,9 +85,7 @@ export const compliedConditions = (node: MNode, data: DataSourceManagerData) =>
}
}
if (result) {
return true;
}
return result;
}
return false;