import { OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
import { AbstractControl } from "@angular/forms";
import { Subject } from "rxjs";
import { ValidationMessageService } from "../core/validation-message.service";
import { FormGroupHelper } from '../shared/form-group.helper';
export declare type ControlLabelPosition = "top" | "bottom" | "left";
/**
 * Base class for Reactive Form Controls, containing ECI-specific shared properties
 */
export declare abstract class FormControlBase implements OnInit, OnDestroy, OnChanges {
    protected validationMessageService: ValidationMessageService;
    protected formGroupHelper: FormGroupHelper;
    /**
     * If true, will focus the control's input when the view is intialized
     */
    autofocus?: boolean;
    /**
     * UI-oriented form model that retains the states and values of the HTML controls on screen.
     * Can be a {@link FormControl} or a {@link FormGroup}
     */
    formModel: AbstractControl;
    /**
     * The form control label
     */
    label?: string;
    /**
     * The position of the form control label (top|bottom)
     */
    labelPosition?: ControlLabelPosition;
    /**
     * The id of the component. We use this to identify a control on focus events and help.
     */
    id: string;
    /**
     * The pending status of the control, can be used to tell the user the control is
     * awaiting data via a spinner or animation
     */
    pending?: boolean;
    /**
     * Whether the input is a required field or not
     * @todo: Sometime in the future Angular makes it sound like this will be handled via the Reactive form When that happens this property can be removed
     */
    required?: boolean;
    /**
     * The tabindex of the control
     */
    tabindex?: number;
    /**
     * Disable the control and display the value
     */
    readonly?: boolean;
    /**
     * Conditionally show a tooltip on the form control's input.
     */
    tooltip?: string;
    /**
     * All current validation errors
     */
    validationErrors: string;
    /**
     * The id of the form controls input, getnerated from the components id.
     */
    inputId: string;
    /**
     * Notifies component subscriptions that component is destroyed.
     * Use with `takeUntil()` when subscribing to complete subscriptions
     * automatically.
     *
     * See:
     * [RxJs]{@link http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-takeUntil}
     * [and this]{@link https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87}
     * [and this]{@link https://netbasal.com/when-to-unsubscribe-in-angular-d61c6b21bad3}
     * [and this]{@link http://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/}
     */
    protected componentDestroyed: Subject<any>;
    /**
     * Creates an instance of FormControlBase.
     */
    constructor(validationMessageService: ValidationMessageService, formGroupHelper: FormGroupHelper);
    /**
     * Angular onChange lifecyle hook
     */
    ngOnChanges(changes: SimpleChanges): void;
    /**
     * Angular onInit lifecycle hook.
     */
    ngOnInit(): void;
    /**
     * Angular onDestroy lifecyle hook.
     * Unsubscribe from any observables
     */
    ngOnDestroy(): void;
    /**
     * Function that subscribes to the formModel's valueChanges Observable
     * to take any erros and translate them
     */
    protected translateValidationMessages(data?: any): Promise<void>;
}
