import * as React from "react";
import { IGXE } from "@intelligentgraphics/igd.core";
import { Session, ApplicationStateValue } from "@intelligentgraphics/igd.productdata";
import { WithSessionContext } from "../SessionContext";
import { PropertyGrouper } from "./Groupers";
export interface IPropertyEditorProperty extends IGXE.IProperty {
    /**
     * Describes wether a property value can be applied to other objects in the scene
     *
     * @type {boolean}
     */
    Transferable: boolean;
    /**
     * The text that belongs to the selected value of a property
     *
     * @type {string[]}
     */
    ValueText: string[];
    SubProperties: IPropertyEditorProperty[];
    Identifier: string;
}
export interface PropertyEditorViewProps {
    groups: ResultPropertyGroup[];
    /**
     * A flat list of all the property ids
     *
     * @type {string[]}
     */
    properties: string[];
    getPropertyByIdentifier(identifier: string): IPropertyEditorProperty | undefined;
}
export interface ResultPropertyGroup {
    id: string;
    label: string;
    /**
     * A list of property ids
     *
     * @type {string[]}
     */
    properties: string[];
    /**
     * Specifies wether this group is the result of a merge operation or just the grouping of an article's properties
     *
     * @type {boolean}
     */
    isMerged?: boolean;
}
export declare enum PropertyEditorSubPropertyBehaviour {
    /**
     * Keep sub properties on their parent properties
     */
    Depth = "depth",
    /**
     * Extract available properties and add them the to normal list of properties
     */
    ShowInline = "showInline"
}
export declare enum PropertyEditorMode {
    /**
     * Display articles of the session
     */
    AllArticles = "AllArticles",
    /**
     * Display articles of the session application state selection
     */
    Selection = "Selection",
    /**
     * Display articles provided via prop
     */
    ProvidedArticles = "ProvidedArticles",
    /**
     * Display provided articles or the session application state selection, if no articles are provided
     */
    Auto = "Auto"
}
declare const _default: (props: Pick<IPropertyEditorProps & WithSessionContext<Session<ApplicationStateValue, import("@intelligentgraphics/igd.productdata").NotificationPayloads<ApplicationStateValue>>>, "children" | "units" | "subPropertyBehaviour" | "mode" | "articles" | "transferTargets" | "createPropertyGroups" | "setPropertyValue"> & {
    children?: React.ReactNode;
} & Partial<WithSessionContext<Session<ApplicationStateValue, import("@intelligentgraphics/igd.productdata").NotificationPayloads<ApplicationStateValue>>>>) => React.ReactElement<IPropertyEditorProps & WithSessionContext<Session<ApplicationStateValue, import("@intelligentgraphics/igd.productdata").NotificationPayloads<ApplicationStateValue>>>, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)>;
export default _default;
export interface IPropertyEditorProps {
    children: React.FunctionComponent<PropertyEditorViewProps>;
    subPropertyBehaviour?: PropertyEditorSubPropertyBehaviour;
    /**
     * Specification of units that should be used for numeric properties
     *
     * @type {Record<string, IGXE.EPropertyValueUnit>}
     */
    units?: Record<string, IGXE.EPropertyValueUnit>;
    /**
     * Determines the mode of articles that are displayed inside the property editor
     *
     * @type {PropertyEditorMode}
     */
    mode?: PropertyEditorMode;
    /**
     * Specifies which comIds (articles) should be used as source for the property list. Will only be used when mode is set to ProvidedArticles or Auto
     *
     * @type {string[]}
     */
    articles?: string[];
    /**
     * Specifies which comIds (articles) can be used as targets for apply all functionality
     *
     * @type {string[]}
     */
    transferTargets?: string[];
    /**
     * Can be used to provide custom grouping for properties and articles
     *
     * @type {PropertyGrouper}
     */
    createPropertyGroups?: PropertyGrouper;
    setPropertyValue?(session: Session, articles: string[], propKey: string, propValue: IGXE.TPropertyValue): Promise<void>;
}
export interface IPropertyEditorState {
    groups: ResultPropertyGroup[];
    properties: Record<string, IPropertyEditorProperty>;
    groupReferences: Record<string, string[] | string>;
}
