import { DeepObject } from '../../utility/deepObject';
import { Field, FieldComponent, FieldConfig } from '../field';
import { GlobalConfig, SelectiveEditor } from '../editor';
import { SortableFieldComponent } from '../../mixins/sortable';
import { TemplateResult } from 'lit-html';
import { Actions } from '../../utility/actions';
import { Base } from '../../mixins';
import { FieldsComponent } from '../fields';
import { PreviewTypes } from '../../utility/preview';
import { Types } from '../types';
export interface ListFieldConfig extends FieldConfig {
    /**
     * Label for adding more list items.
     */
    addLabel?: string;
    /**
     * Label for when the list is empty.
     */
    emptyLabel?: string;
    /**
     * Are the fields complex?
     *
     * When set to true, the list will not use the 'Simple' mode
     * for showing list items when there is only one field configured
     * in the fields config.
     */
    isComplex?: boolean;
    /**
     * Field definitions for each item in the list.
     */
    fields?: Array<FieldConfig>;
    /**
     * Preview field key.
     *
     * When showing a preview of the list items, use this key to determine
     * the value to show for the preview.
     */
    previewField?: string;
    /**
     * Preview field keys.
     *
     * When showing a preview of the list items, use these keys to determine
     * the value to show for the preview.
     */
    previewFields?: Array<string>;
    /**
     * Control how the editor displays the preview for the list items.
     */
    previewType?: PreviewTypes;
}
export interface ListFieldComponent extends FieldComponent {
    /**
     * Allow simple display for fields in the list.
     *
     * For complex fields it is better to not allow the simple view
     * since it makes the list crowded and hard to read. (ex: media field)
     */
    allowSimple: boolean;
    /**
     * Can the list add more items?
     */
    allowAdd?: boolean;
    /**
     * Can the list remove items?
     */
    allowRemove?: boolean;
    /**
     * Handle adding a new item to the list.
     * @param evt Event triggering the add.
     * @param editor Editor instance.
     * @param data Data object.
     */
    handleAddItem(evt: Event, editor: SelectiveEditor, data: DeepObject): void;
    /**
     * Event handler for deleting items.
     *
     * @param evt Click event from delete action.
     * @param index Item index being deleted.
     */
    handleDeleteItem(evt: Event, index: number): void;
    /**
     * Number of items in the list.
     */
    length: number;
}
export interface ListItemComponent {
    listField: ListFieldComponent & SortableFieldComponent;
    fields: FieldsComponent;
    /**
     * Event handler for hovering off an item.
     *
     * @param evt Event from mouse action.
     * @param index Item index.
     */
    handleHoverOffItem(evt: MouseEvent, index: number): void;
    /**
     * Event handler for hovering over an item.
     *
     * @param evt Event from mouse action.
     * @param index Item index.
     */
    handleHoverOnItem(evt: MouseEvent, index: number): void;
    isExpanded: boolean;
    template: (editor: SelectiveEditor, data: DeepObject, index: number) => TemplateResult;
    uid: string;
}
export interface ListItemConstructor {
    new (listField: ListFieldComponent & SortableFieldComponent, fields: FieldsComponent): ListItemComponent;
}
declare const ListField_base: {
    new (...args: any[]): {
        _sortableUi?: import("../../mixins/sortable").SortableUiComponent | undefined;
        sortableUi: import("../../mixins/sortable").SortableUiComponent;
    };
} & typeof Field;
export declare class ListField extends ListField_base implements ListFieldComponent {
    config: ListFieldConfig;
    protected items: Array<ListItemComponent> | null;
    protected ListItemCls: ListItemConstructor;
    usingAutoFields: boolean;
    constructor(types: Types, config: ListFieldConfig, globalConfig: GlobalConfig, fieldType?: string);
    get allowAdd(): boolean;
    get allowRemove(): boolean;
    /**
     * Does the list allow for showing simple fields?
     */
    get allowSimple(): boolean;
    protected createFields(fieldConfigs: Array<any>): FieldsComponent;
    protected ensureItems(editor: SelectiveEditor): Array<ListItemComponent>;
    handleAddItem(evt: Event, editor: SelectiveEditor, data: DeepObject): void;
    handleDeleteItem(evt: Event, index: number): void;
    handleSort(startIndex: number, endIndex: number): void;
    get isClean(): boolean;
    /**
     * Check if the data format is invalid for what the field expects to edit.
     */
    get isDataFormatValid(): boolean;
    get isValid(): boolean;
    /**
     * Length of the list.
     */
    get length(): number;
    templateEmpty(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
    templateFooter(editor: SelectiveEditor, data: DeepObject): TemplateResult;
    templateHeader(editor: SelectiveEditor, data: DeepObject): TemplateResult;
    templateInput(editor: SelectiveEditor, data: DeepObject): TemplateResult;
    get value(): any;
}
declare const ListFieldItem_base: {
    new (...args: any[]): {
        _uuid?: string | undefined;
        readonly uuid: string;
        readonly uid: string;
    };
} & typeof Base;
export declare class ListFieldItem extends ListFieldItem_base implements ListItemComponent {
    listField: ListFieldComponent & SortableFieldComponent;
    fields: FieldsComponent;
    isExpanded: boolean;
    constructor(listField: ListFieldComponent & SortableFieldComponent, fields: FieldsComponent);
    actionsCollapsedPre(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    actionsCollapsedPost(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    actionsExpandedPre(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    actionsExpandedPost(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    actionsSimplePre(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    actionsSimplePost(editor: SelectiveEditor, data: DeepObject, index: number): Actions;
    classesCollpased(editor: SelectiveEditor, data: DeepObject, index: number): Record<string, boolean>;
    classesExpanded(editor: SelectiveEditor, data: DeepObject, index: number): Record<string, boolean>;
    classesSimple(editor: SelectiveEditor, data: DeepObject, index: number): Record<string, boolean>;
    handleCollapseItem(): void;
    handleExpandItem(): void;
    handleHoverOffItem(evt: MouseEvent, index: number): void;
    handleHoverOnItem(evt: MouseEvent, index: number): void;
    template(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
    templateCollapsed(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
    templateExpanded(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
    /**
     * Template for how to render a preview.
     *
     * @param editor Selective editor used to render the template.
     * @param data Data provided to render the template.
     */
    templatePreviewValue(editor: SelectiveEditor, data: DeepObject, index?: number): TemplateResult;
    templateRemove(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
    templateSimple(editor: SelectiveEditor, data: DeepObject, index: number): TemplateResult;
}
export {};
