feat: improve add blocks

This commit is contained in:
gchust 2025-06-24 08:49:09 +08:00
parent 035eeb62be
commit a6d4badc02
2 changed files with 53 additions and 17 deletions

View File

@ -10,6 +10,7 @@
import { Collection, DataSource, DataSourceManager } from '../../data-source';
import { FlowModel } from '../../models/flowModel';
import { ModelConstructor } from '../../types';
import { isInheritedFrom } from '../../utils';
import { SubModelItem, SubModelItemsType } from './AddSubModelButton';
export interface BlockItemsOptions {
@ -73,43 +74,55 @@ async function getDataSourcesWithCollections(model: FlowModel) {
/**
*
*
*
* -
* -
*
* - DataBlockModel
* - FilterBlockModel
* -
*
* @param model FlowModel
* @param options
* @returns SubModelItemsType
*/
export function createBlockItems(model: FlowModel, options: BlockItemsOptions = {}): SubModelItemsType {
const { subModelBaseClass = 'BlockFlowModel', filterBlocks, customBlocks = [] } = options;
const { subModelBaseClass = 'BlockFlowModel', filterBlocks: filterFn, customBlocks = [] } = options;
// 获取所有注册的区块类
const blockClasses = model.flowEngine.filterModelClassByParent(subModelBaseClass);
// 分类区块:数据区块 vs 其他区块
// 获取基础类用于继承检查
const DataBlockModelClass = model.flowEngine.getModelClass('DataBlockModel');
const FilterBlockModelClass = model.flowEngine.getModelClass('FilterBlockModel');
// 分类区块:数据区块, 筛选区块, 其他区块
const dataBlocks: Array<{ className: string; ModelClass: ModelConstructor }> = [];
const filterBlocks: Array<{ className: string; ModelClass: ModelConstructor }> = [];
const otherBlocks: Array<{ className: string; ModelClass: ModelConstructor }> = [];
for (const [className, ModelClass] of blockClasses) {
// 应用过滤器
if (filterBlocks && !filterBlocks(ModelClass, className)) {
if (filterFn && !filterFn(ModelClass, className)) {
continue;
}
// 判断是否为数据区块
const meta = (ModelClass as any).meta;
const isDataBlock =
meta?.category === 'data' ||
meta?.requiresDataSource === true ||
className.toLowerCase().includes('table') ||
className.toLowerCase().includes('form') ||
className.toLowerCase().includes('details') ||
className.toLowerCase().includes('list') ||
className.toLowerCase().includes('grid');
// 排除基类本身
if (className === 'DataBlockModel' || className === 'FilterBlockModel') {
continue;
}
// 使用继承关系判断区块类型
let isDataBlock = false;
let isFilterBlock = false;
if (DataBlockModelClass && isInheritedFrom(ModelClass, DataBlockModelClass)) {
isDataBlock = true;
} else if (FilterBlockModelClass && isInheritedFrom(ModelClass, FilterBlockModelClass)) {
isFilterBlock = true;
}
if (isDataBlock) {
dataBlocks.push({ className, ModelClass });
} else if (isFilterBlock) {
filterBlocks.push({ className, ModelClass });
} else {
otherBlocks.push({ className, ModelClass });
}
@ -159,6 +172,29 @@ export function createBlockItems(model: FlowModel, options: BlockItemsOptions =
});
}
// 筛选区块分组
if (filterBlocks.length > 0) {
const filterBlockItems = filterBlocks.map(({ className, ModelClass }) => {
const meta = (ModelClass as any).meta;
return {
key: className,
label: meta?.title || className,
icon: meta?.icon,
createModelOptions: {
...meta?.defaultOptions,
use: className,
},
};
});
result.push({
key: 'filterBlocks',
label: 'Filter blocks',
type: 'group',
children: filterBlockItems,
});
}
// 其他区块分组
if (otherBlocks.length > 0 || customBlocks.length > 0) {
const otherBlockItems = [

View File

@ -333,7 +333,7 @@ export class FlowEngine {
}
const modelClasses = new Map<string, ModelConstructor>();
for (const [className, ModelClass] of this.modelClasses) {
if (isInheritedFrom(ModelClass, parentModelClass) || ModelClass === parentModelClass) {
if (isInheritedFrom(ModelClass, parentModelClass)) {
modelClasses.set(className, ModelClass);
}
}