import type CodedValueDomain from "../../../layers/support/CodedValueDomain.js";
import type RangeDomain from "../../../layers/support/RangeDomain.js";
import type ColumnTemplateBase from "./ColumnTemplateBase.js";
import type { ColumnTemplateBaseProperties } from "./ColumnTemplateBase.js";
import type { EditableColumnTemplateMixinProperties, EditableColumnTemplateMixin } from "./EditableColumnTemplateMixin.js";
import type { FieldValueFormatFunction } from "./types.js";
import type { RangeDomainProperties } from "../../../layers/support/RangeDomain.js";
import type { CodedValueDomainProperties } from "../../../layers/support/CodedValueDomain.js";

export interface FieldColumnTemplateProperties extends ColumnTemplateBaseProperties, EditableColumnTemplateMixinProperties {
  /** The [coded value domain](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-CodedValueDomain.html) or a [range domain](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-RangeDomain.html) of the associated field. */
  domain?: (CodedValueDomainProperties & { type: "coded-value" }) | (RangeDomainProperties & { type: "range" }) | null;
  /**
   * Custom function for rendering cell content. Accepts a string, number, an HTML element or equivalent node type (e.g. a Calcite component).
   *
   * @since 4.30
   * @example
   * // The following example demonstrates how to use the formatFunction property to create a custom cell renderer that displays a progress bar in the cell. The progress bar can be used to show the progress of a task.
   * columnTemplate.formatFunction = ({ column, feature, index, value })=> {
   *   const progress = document.createElement("progress");
   *   progress.max = 100;
   *   progress.value = value;
   *   return progress;
   * };
   */
  formatFunction?: FieldValueFormatFunction | null;
  /**
   * Indicates whether the field column can be sorted.
   *
   * @default true
   */
  sortable?: boolean;
}

/**
 * A FieldColumnTemplate formats and defines the structure of a [FieldColumn](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-FieldColumn.html) within a
 * [FeatureTable](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable.html) widget.
 *
 * The FieldColumnTemplate is set directly on the table's [template](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-TableTemplate.html) or its [view model](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-FeatureTableViewModel.html#tableTemplate).
 * The [FeatureTable's tableTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-TableTemplate.html) contains a collection of [field and/or group column templates](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-TableTemplate.html#columnTemplates).
 *
 * @since 4.24
 * @see [FeatureTable](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable.html)
 * @see [TableTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-TableTemplate.html)
 * @see [GroupColumnTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-GroupColumnTemplate.html)
 * @see [Sample - FeatureTable with a map](https://developers.arcgis.com/javascript/latest/sample-code/widgets-featuretable-map/)
 * @see [Sample - FeatureTable with related records](https://developers.arcgis.com/javascript/latest/sample-code/widgets-featuretable-relates/)
 * @see [Sample - FeatureTable with row highlights](https://developers.arcgis.com/javascript/latest/sample-code/widgets-featuretable-row-highlights/)
 * @example
 * const fieldColumnTemplate = new FieldColumnTemplate({
 *   fieldName: "full_name",
 *   label: "Full name",
 *   direction: "asc", // In order to use initialSortPriority, make sure direction is set
 *   initialSortPriority: 0 // This field's sort order takes the highest priority.
 * });
 */
export default class FieldColumnTemplate extends FieldColumnTemplateSuperclass {
  constructor(properties?: FieldColumnTemplateProperties);
  /** The [coded value domain](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-CodedValueDomain.html) or a [range domain](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-RangeDomain.html) of the associated field. */
  get domain(): CodedValueDomain | RangeDomain | null | undefined;
  set domain(value: (CodedValueDomainProperties & { type: "coded-value" }) | (RangeDomainProperties & { type: "range" }) | null | undefined);
  /**
   * Custom function for rendering cell content. Accepts a string, number, an HTML element or equivalent node type (e.g. a Calcite component).
   *
   * @since 4.30
   * @example
   * // The following example demonstrates how to use the formatFunction property to create a custom cell renderer that displays a progress bar in the cell. The progress bar can be used to show the progress of a task.
   * columnTemplate.formatFunction = ({ column, feature, index, value })=> {
   *   const progress = document.createElement("progress");
   *   progress.max = 100;
   *   progress.value = value;
   *   return progress;
   * };
   */
  accessor formatFunction: FieldValueFormatFunction | null | undefined;
  /**
   * Indicates whether the field column can be sorted.
   *
   * @default true
   */
  accessor sortable: boolean;
  /**
   * The type of column that the template represents.
   *
   * > [!WARNING]
   * >
   * > This property must be set to `field` when creating a new FieldColumnTemplate within a [TableTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FeatureTable-support-TableTemplate.html).
   */
  get type(): "field";
}
declare const FieldColumnTemplateSuperclass: typeof ColumnTemplateBase & typeof EditableColumnTemplateMixin