feat(dats-source,editor,form,schema,ui): 迭代器容器支持配置子项显示条件
This commit is contained in:
@@ -20,13 +20,13 @@ import EventEmitter from 'events';
|
||||
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
import type { AppCore, DataSourceSchema, Id, MNode } from '@tmagic/schema';
|
||||
import type { AppCore, DataSourceSchema, DisplayCond, Id, MNode } from '@tmagic/schema';
|
||||
import { compiledNode } from '@tmagic/utils';
|
||||
|
||||
import { SimpleObservedData } from './observed-data/SimpleObservedData';
|
||||
import { DataSource, HttpDataSource } from './data-sources';
|
||||
import type { ChangeEvent, DataSourceManagerData, DataSourceManagerOptions, ObservedDataClass } from './types';
|
||||
import { compiledNodeField, compliedConditions, compliedIteratorItems } from './utils';
|
||||
import { compiledNodeField, compliedConditions, compliedIteratorItemConditions, compliedIteratorItems } from './utils';
|
||||
|
||||
class DataSourceManager extends EventEmitter {
|
||||
private static dataSourceClassMap = new Map<string, typeof DataSource>();
|
||||
@@ -214,6 +214,10 @@ class DataSourceManager extends EventEmitter {
|
||||
return compliedConditions(node, this.data);
|
||||
}
|
||||
|
||||
public compliedIteratorItemConds(itemData: any, displayConds: DisplayCond[] = []) {
|
||||
return compliedIteratorItemConditions(displayConds, itemData);
|
||||
}
|
||||
|
||||
public compliedIteratorItems(itemData: any, items: MNode[], dataSourceField: string[] = []) {
|
||||
const [dsId, ...keys] = dataSourceField;
|
||||
const ds = this.get(dsId);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user