import { LEVEL_ENUM, Vertex, View, Attr, Directive, Event, ActionOptions, Structure } from '..';
import Variable from '../logic/Variable';
export interface ElementToVueOptions {
    indentStyle?: 'space' | 'tab';
    tabSize?: number;
    indentLevel?: number;
    aslIdAttr?: string | boolean;
    nodePathAttr?: string | boolean;
    getExtraParts?: (element?: Element) => Array<string>;
    attrFormat?: (attr: Attr | Event | Directive, element?: Element, defaultResult?: string) => string;
    finalCode?: boolean;
}
export interface ParseContext {
    variables?: Array<Variable>;
    structures?: Array<Structure>;
    dataSchema?: string;
    [key: string]: any;
}
/**
 * 前端页面元素
 * @example
 * <u-input size="small" v-model="value" @change="onChange"></u-input>
 */
export declare class Element extends Vertex {
    /**
     * 概念类型
     */
    readonly level: LEVEL_ENUM;
    /**
     * 元素类型
     * 去除了 expression 和 text，目前只有一种节点类型
     */
    readonly type: number;
    /**
     * 元素 Id
     */
    readonly id: string;
    /**
     * 元素标签
     */
    readonly tag: string;
    /**
     * 元素名称
     * 用户可以自定义
     * Vue 中的 ref
     */
    readonly name: string;
    /**
     * 属性列表
     * 和原来的 attrsList 不同，注意区分
     */
    readonly attrList?: Array<Attr>;
    /**
     * 事件列表
     */
    readonly eventList?: Array<Event>;
    /**
     * 指令列表
     */
    readonly directiveList?: Array<Directive>;
    /**
     * 插槽目标
     * @example
     * 'cell'
     */
    readonly slotTarget?: string;
    /**
     * 插槽 scope 表达式
     * @example
     * 'scope'
     */
    readonly slotScope?: string;
    /**
     * 静态 class 名
     * 不计划支持动态 class
     */
    readonly staticClass?: string;
    /**
     * 静态 style
     * 不计划支持动态样式
     */
    readonly staticStyle?: string;
    /**
     * 当前节点路径，只在前端动态计算后使用
     */
    nodePath: string;
    /**
     * 所在父元素 Id
     */
    readonly parentId: string;
    /**
     * 所在位置
     */
    _posIndex: number;
    /**
     * 所在父元素
     */
    readonly parent?: Element;
    /**
     * 所在父元素 Id
     */
    readonly viewId: string;
    /**
     * 所在子页面
     */
    readonly view?: View;
    /**
     * 子元素
     */
    readonly children?: Array<Element>;
    /**
     * @param source 需要合并的部分参数
     */
    constructor(source?: Partial<Element>);
    assign(source?: any): void;
    /**
     * 添加元素
     */
    create(none?: void, actionOptions?: ActionOptions): Promise<this>;
    /**
     * 删除元素
     */
    delete(none?: void, actionOptions?: ActionOptions): Promise<this>;
    /**
      * 修改元素
      */
    update(source?: Element, actionOptions?: ActionOptions): Promise<this>;
    move(options: {
        parentId?: string;
        _posIndex?: number;
        nodePath?: string;
        position?: 'append' | 'insertBefore' | 'insertAfter';
    }, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 添加元素副本
     * 在所在父节点的后面添加一个相同的元素
     */
    duplicate(): Promise<void>;
    /**
     * 添加子元素
     * @param child
     */
    addChild(child: string | Element, actionOptions?: ActionOptions): Promise<Element>;
    /**
     * 删除子元素
     * @param child
     */
    removeChild(child: Element, actionOptions?: ActionOptions): Promise<Element>;
    getElementTitle(): string;
    /**
     * 设置组件名称
     */
    setName(name: string): Promise<void>;
    /**
     * 添加组件属性
     */
    addAttr(attr: Attr, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 删除组件属性
     */
    deleteAttr(attr: Attr, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 获取组件属性
     */
    getAttr(name: string): Attr;
    /**
     * 设置组件属性
     */
    setAttr(name: string, type: 'string' | 'static' | 'dynamic', value?: any): Promise<void>;
    /**
     * 添加组件事件
     */
    addEvent(data: Event, actionOptions?: ActionOptions): Promise<Event>;
    /**
     * 删除组件属性
     */
    deleteEvent(event: Event, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 添加组件指令
     */
    addDirective(data: Directive, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 删除组件属性
     */
    deleteDirective(directive: Directive, actionOptions?: ActionOptions): Promise<void>;
    /**
     * 转换成 Vue 的模板格式
     */
    toVue(options?: ElementToVueOptions): string;
    /**
     * 转换成设计器中使用的 Vue 文件
     * @param options
     */
    toDesignerVue(options?: ElementToVueOptions): string;
    /**
     * 同 toVue 方法
     * @param options 缩进等选项
     */
    toHTML(options?: ElementToVueOptions): string;
    /**
     * 根据标签查找元素
     * @param tag
     */
    findElementByTag(tag: string): Element;
    /**
     * 根据属性查找元素
     * @param name
     * @param value
     */
    findElementByAttr(name: string, value: string): Element;
    /**
     * 从 Vue 的 ASTNode 转换成 ASL 元素
     * @param astNode Vue 的 ASTNode
     */
    private static _fromASTNode;
    /**
     * 解析属性中的表达式
     * @param value
     * @param $def 目前 $def 只用来查找 $def.variables 和 $def.structures
     * @param dataSchema
     */
    private static _parseExpression;
    /**
     * 解析 Vue 模板
     * 该方法不会绑定 view 和 parent，如果是添加元素优先使用 fromHTML
     * @param html Vue 的模板
     * @TODO 处理多个元素的问题
     */
    static parse(html: string, context?: ParseContext): Element;
    /**
     * 从模板生成规范的 Element 对象
     */
    static fromHTML(html: string, parent: Element, view: View, context?: ParseContext): Element;
    /**
     * 从后端 JSON 生成规范的 Element 对象
     */
    static from(source: any, parent: Element, view: View, currentElement?: Element): Element;
}
export default Element;
