import React from 'react';
import { RecordJSON, ResourceJSON, PropertyJSON, PropertyPlace } from '../../interfaces/index.js';
import { BasePropertyJSON } from '../../interfaces/property-json/property-json.interface.js';
export type SelectRecord = {
    value: string | number;
    label: string;
};
/**
 * Props which are passed to all your custom property components
 *
 *
 * Example
 * ```
 * // AdminJSOptions
 * const AdminJS = require('adminjs')
 * const ResourceModel = require('./resource-model')
 * const AdminJSOptions = {
 *   resources: [{
 *     resource: ResourceModel
 *     options: {
 *       properties: {
 *         name: {
 *           components: {
 *             show: 'MyReactComponent',
 *           },
 *         },
 *       },
 *     },
 *   }],
 * }
 *
 * // my-react-component.tsx
 * const MyReactComponent = (props: BasePropertyProps) => {
 *   const { record, property } = props
 *   const value = record.params[property.path] === 'foo' ? 'bar' : 'zoe'
 *   return (
 *     <PropertyInShow property={property}>
 *       {value}
 *     </PropertyInShow>
 *   )
 * }
 *
 * ```
 *
 * @memberof BasePropertyComponent
 * @alias BasePropertyProps
 */
export type BasePropertyProps = {
    /**
     * Property JSON representation
     */
    property: PropertyJSON;
    /**
     * Resource JSON representation
     */
    resource: ResourceJSON;
    /**
     * Record JSON representation. Null for filter
     */
    record?: RecordJSON;
    /**
     * callback function which should indicate change of the field value. You can use it
     * when overriding edit properties.
    */
    onChange?: OnPropertyChange;
    /**
     * Filter object taken from the query params. It is used on the _filter_ components.
     */
    filter?: any;
    /**
     * Where given property should be rendered. Either of 'show' | 'list' | 'edit' | 'filter'.
     */
    where: PropertyPlace;
};
export type BasePropertyComponentProps = Omit<BasePropertyProps, 'property'> & {
    property: BasePropertyJSON;
};
export type BasePropertyPropsExtended = BasePropertyProps & {
    ItemComponent: typeof React.Component;
    testId: string;
};
/**
 * Props which are passed to all your custom property components in filter
 *
 * @memberof BasePropertyComponent
 * @alias BasePropertyFilterProps
 * @extends BasePropertyProps
 */
export type FilterPropertyProps = BasePropertyProps & {
    /**
     * Filter object taken from the query params. It is used on the _filter_ components
     */
    filter: any;
    /**
     * callback function which should indicate change of the filter value.
    */
    onChange: OnPropertyChange;
    record: undefined;
};
/**
 * Props which are passed to all your custom property components in show
 *
 * @memberof BasePropertyComponent
 * @alias EditPropertyProps
 * @extends BasePropertyProps
 */
export type EditPropertyProps = BasePropertyProps & {
    /**
     * callback function which should indicate change of the field value.
    */
    onChange: OnPropertyChange;
    /**
     * Record JSON representation. Null for filter
     */
    record: RecordJSON;
};
export type EditPropertyPropsInArray = EditPropertyProps & {
    ItemComponent: typeof React.Component;
    testId: string;
};
/**
 * Props which are passed to all your custom property components in show
 *
 * @memberof BasePropertyComponent
 * @alias BasePropertyEditProps
 * @extends BasePropertyProps
 */
export type ShowPropertyProps = {
    /**
     * Property JSON representation
     */
    property: PropertyJSON;
    /**
     * Resource JSON representation
     */
    resource: ResourceJSON;
    /**
     * Record JSON representation. Null for filter
     */
    record: RecordJSON;
};
/**
 * @load ./docs/on-property-change.doc.md
 * @memberof BasePropertyComponent
 * @alias OnPropertyChange
 */
export type OnPropertyChange = (
/**
 * property.path or updated RecordJSON object
 */
propertyOrRecord: RecordJSON | string, 
/**
 * when propertyOrRecord is a property.path, here should be an updated value.
 */
value?: any, 
/**
 * In case of "reference" fields (with select), when they change they pass selected record object.
 * This is mostly for an internal use - you probably wont have to use that.
 */
selectedRecord?: RecordJSON) => void;
