import { BehaviorSubject, Observable } from 'rxjs';
import { FieldModel } from './FieldModel';
import FormModel from './FormModel';
import { FormStyle, PartialFormStyle } from './FormStyle';
export interface FormElementOptions {
    key?: string;
    form: FormModel;
    style?: PartialFormStyle;
}
export interface ErrorOptions {
    editedOnly?: boolean;
}
export interface EditableFieldModel {
    edited: BehaviorSubject<boolean>;
}
export default abstract class FormElement {
    key: string;
    style?: PartialFormStyle;
    sectionIndex: number;
    rowIndex: number;
    fieldIndex: number;
    private _formRef?;
    constructor(options: FormElementOptions);
    get form(): FormModel;
    set form(form: FormModel);
    modify(callback: (element: this) => any): this;
    validateAll(options?: {
        focusOnInvalid?: boolean;
    }): boolean;
    valid(): boolean;
    valid$(): Observable<boolean>;
    fieldsWithErrors({ editedOnly }?: ErrorOptions): FieldModel[];
    fieldsWithErrors$({ editedOnly }?: ErrorOptions): Observable<FieldModel[]>;
    flattenedErrors$(options?: ErrorOptions): Observable<Error[]>;
    flattenedFormattedErrors$(options?: ErrorOptions & {
        formatter?: (errors: Error[]) => string;
    }): Observable<string>;
    allFields(): FieldModel[];
    visibleFields$(): Observable<FieldModel[]>;
    iterateFields(): Generator<FieldModel>;
    iterateNextFields(): Generator<FieldModel>;
    resolveStyle(theme?: PartialFormStyle): Required<FormStyle>;
    resolveStyleValue<K extends keyof FormStyle>(key: K, theme?: PartialFormStyle): FormStyle[K];
    private static _mergeStyleValues;
}
