amis-model-design
Version:
amis模型设计器
284 lines (283 loc) • 9.6 kB
TypeScript
import type { Schema } from 'amis-core';
import type { RendererInfo } from 'amis-editor';
import { Manager } from '../base/Manager';
import { ModelStore } from '../base/ModelStore';
import { ApiStrategyInterface } from './ApiStrategyInterface';
import { SharedContext } from './SharedContext';
import type { EditorPanel } from '../component/SchemaBuilderEditor';
import type { FieldItem, ModelItem, ExtraField, FeatType, ModelEntityApiSchema } from '../type';
export interface EditorView {
label: string;
value: string;
}
export interface SchemaBuilderInterface<T = any> {
readonly manager: Manager;
readonly model: ModelItem;
readonly modelStore: ModelStore;
readonly apiStrategy: ApiStrategyInterface;
readonly sharedContext: SharedContext;
makeDefaultOptions: (behavior?: string) => T | Promise<T>;
guessOptionsFromSchema?: (schema: any, behavior?: string) => T;
build: (options?: T, schema?: any, sharedContext?: SharedContext) => Promise<Schema> | Schema;
dispose: () => void;
/**
* 从生成好的 schema 里面,猜测字段的配置项
*/
guessFieldOptionsFromSchema?: (field: FieldItem, schema: any, region?: '') => any;
/**
* 构建字段的配置面板
* @param field
* @param options
* @returns
*/
buildFieldSettingForm?: (field: FieldItem, options?: any) => any;
/**
* 基于配置项构建字段的 amis schema
* @param field
* @param options
* @returns
*/
makeFieldSchema?: (field: FieldItem, options?: any, originSchema?: any) => any;
/**
* 设置成追踪模式,可以根据 schema 追踪出来是哪个场景的哪个字段
* @param value
* @returns
*/
setTraceMode: (value: boolean) => void;
/**
* 根据值知道当前配置有哪些编辑器视图
* 比如:列表视图,新增视图,编辑视图等等
* @param options
* @returns
*/
getEditorViews?: (options: T) => Array<EditorView>;
/**
* 构建部分视图,给
* @param options
* @param editorView
* @returns
*/
buildPartialView?: (options: T, editorView: string) => Promise<Schema> | Schema;
/**
* 根据 traceId 构建配置面板
* @param traceId
* @param editorView
* @returns
*/
buildEditorPanel?: (options: T, traceId: string, editorView: string) => Promise<void | undefined | EditorPanel | EditorPanel[]>;
/**
* 干预 amis editor 里面的 node 配置,让其表现不一样
* @param traceId
* @param info
* @returns
*/
overrideAMISEditorNodeInfo?: (options: T, traceId: string, info: RendererInfo, editorView: string) => void;
getDataByTraceId?: (options: T, traceId: string) => any;
setDataByTraceId?: (options: T, traceId: string, value: any) => any;
/**
* 拖入字段
* @param options 配置信息
* @param field 字段信息
* @param hostTraceId 拖入的父级 trceId
* @param beforeTraceId 拖入的位置信息
* @returns
*/
insertField?: (options: T, field: FieldItem, hostTraceId: string, region: string, beforeTraceId?: string) => any;
/**
* 删除字段
* @param options
* @param traceId
* @param hostTraceId
* @returns
*/
deleteField?: (options: T, traceId: string, hostTraceId: string) => any;
/**
* 移动字段
* @param options
* @param hostTraceId
* @param sourceTraceId
* @param beforeTraceId
* @returns
*/
moveField?: (options: T, hostTraceId: string, sourceTraceId: string, beforeTraceId?: string) => any;
/**
* 模型组件脚手架表单生成
* @param options
* @param schema
* @returns
*/
genScaffoldForm?: () => Promise<Array<any>>;
/**
* 模型右侧编辑面板表单生成
* @param options
* @param schema
* @returns
*/
genPanelForm?: (options: T, schema: any) => Promise<Array<any>>;
/**
* 模型字段右侧编辑面板构建
* @param options
* @param schema
* @returns
*/
genFieldPanelForm?: (options: T, field: FieldItem, region?: string, schema?: any) => Promise<Array<any>>;
/**
* 过滤配置
* @param options
* @returns
*/
buildFieldSchema?: (options: T, field: FieldItem, fieldOptions: any, region: string, schema: any) => any;
}
/**
* 可编辑节点相关配置
*/
export interface SchemaBuilderNode<T = any> {
key?: string;
/**
* 决定要不要使用这个面板
*
* @param ns
* @param id
* @returns
*/
test: (ns: string, id?: string) => any;
/**
* 编辑器点选的时候,配置这个点选节点的属性
* 比如:是否可以接收拖入节点,是否可被删除等等
*
* @param options
* @param info
* @returns
*/
overrideEditorNodeInfo?: (info: RendererInfo, options: T, id?: string) => void;
/**
* 构建面板表单
* @param options
* @returns
*/
buildForm: (builder: BaseSchemaBuilder, options: T, id?: string) => Promise<Omit<EditorPanel, 'traceId'>> | Omit<EditorPanel, 'traceId'>;
/**
* 获取面板数据
* @param options
* @returns
*/
getData?: (options: T, id?: string) => any;
/**
* 设置面板数据
* @param options
* @param values
* @returns
*/
setData?: (options: T, values: any, id?: string) => T;
/**
* 这个节点下面插入元素的时候调用
* @param options
* @param child
* @param beforeTraceId
* @returns
*/
insert?: (options: T, child: any, beforeTraceId?: string) => T | void;
/**
* 这个节点下面移动元素的时候调用
* @param options
* @param sourceId
* @param beforeTraceId
* @returns
*/
moveChild?: (options: T, sourceId: string, beforeTraceId?: string) => T | void;
/**
* 这个节点移除元素的时候调用
* @param options
* @param id
* @returns
*/
removeChild?: (options: T, id: string) => T | void;
}
export declare abstract class BaseSchemaBuilder<T = any> implements SchemaBuilderInterface<T> {
readonly model: ModelItem;
readonly apiStrategy: ApiStrategyInterface;
readonly manager: Manager;
readonly sharedContext: SharedContext;
readonly modelStore: ModelStore;
isTraceMode: boolean;
readonly nodes: Array<SchemaBuilderNode<T>>;
/** 已注册字段类型映射集合 */
fieldTypeMap: Record<string, string>;
constructor(model: ModelItem, apiStrategy: ApiStrategyInterface, manager: Manager, sharedContext: SharedContext);
makeDefaultOptions(behavior?: string | string[]): T | Promise<T>;
build(options?: T, schema?: Schema): Schema | Promise<Schema>;
dispose(): void;
initEditor(): void;
/**
* 开启后生成 schema 的时候会打标记。
* 根据标记让编辑器
* @param value
*/
setTraceMode(value: boolean): void;
/**
* 返回 [namespace, id]
* @param id
* @returns
*/
parseTraceId(id?: string): string[];
/**
* 干预 amis editor 里面的 node 配置,让其表现不一样
* @param traceId
* @param info
* @returns
*/
overrideAMISEditorNodeInfo(options: T, traceId: string, info: RendererInfo, editorView: string): void;
/**
* 根据 traceId 构建配置面板
* @param traceId
* @param editorView
* @returns
*/
buildEditorPanel(options: T, traceId: string, editorView: string): Promise<void | undefined | EditorPanel | EditorPanel[]>;
/**
* 根据 traceId 获取面板配置数据
*/
getDataByTraceId(options: T, traceId: string): any;
/**
* 根据 traceId 设置面板配置数据
*/
setDataByTraceId(options: T, traceId: string, values: any): any;
insertField(options: T, field: FieldItem, hostTraceId: string, region: string, beforeTraceId?: string): any;
deleteField(options: T, traceId: string): any;
moveField(options: T, hostTraceId: string, sourceTraceId: string, beforeTraceId?: string): any;
getFilterableFields(): Promise<{
data: any;
simple: any;
advanced: any;
}[]>;
/**
* -----------------------
* 前端脚手架构建使用
* -----------------------
*/
/** 初始化注册的字段类型 */
getFeildTypeMap(): {
/** 补充一下关系字段具体名称 */
'1:1': string;
'1:n': string;
'n:1': string;
'n:n': string;
};
/** 获取字段类型名称 */
getTypeLabel(field: ExtraField): string;
/** 获取可以使用的字段集合 */
getAvailableFields(model: ModelStore, config?: {
defaultChecked?: boolean;
/** 是否返回ConditionBuilder的相关信息 */
enableCB?: boolean;
feat?: FeatType;
}): Promise<ExtraField[]>;
/** 给API Schema添加一些公共属性 */
getApiSBaseSchema(model: ModelStore, feat: FeatType, fields?: ExtraField[]): ModelEntityApiSchema;
}
export interface SchemaBuilderClass {
new (model: ModelItem, apiStrategy: ApiStrategyInterface, manager: Manager, sharedContext?: SharedContext): SchemaBuilderInterface;
id: string;
}
export declare function registerBuilder(factory: SchemaBuilderClass): void;
export declare function makeSchemaBuilder(manager: Manager, model: ModelItem | string, apiStrategy: ApiStrategyInterface, kind: string, sharedContext?: SharedContext): SchemaBuilderInterface<any>;