/// <reference path="../../index.d.ts" />
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
import type MapView from "@arcgis/core/views/MapView.js";
import type { AppLayout, IDeleteIds, IMapInfo } from "../../utils/interfaces.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { T9nMeta } from "@arcgis/lumina/controllers";

export abstract class LayerTable extends LitElement {
  /**
   * Contains the translations for this component.
   * All UI strings should be defined here.
   *
   * @internal
   */
  protected _translations: {
      clearSelection: string;
      delete: string;
      exportCSV: string;
      filter: string;
      filters: string;
      hideField: string;
      more: string;
      selectAll: string;
      share: string;
      showSelected: string;
      switchSelected: string;
      zoom: string;
      editMultiple: string;
      fetchingData: string;
      refresh: string;
      showAll: string;
      recordsSelected: string;
      recordsTotal: string;
      moreOptions: string;
      showHideColumns: string;
      searchPlaceholder: string;
      photosAndFiles: string;
      attachments: string;
      relatedRecords: string;
      featureEditLimitNotice: string;
      copy: string;
      paste: string;
  } & T9nMeta<{
      clearSelection: string;
      delete: string;
      exportCSV: string;
      filter: string;
      filters: string;
      hideField: string;
      more: string;
      selectAll: string;
      share: string;
      showSelected: string;
      switchSelected: string;
      zoom: string;
      editMultiple: string;
      fetchingData: string;
      refresh: string;
      showAll: string;
      recordsSelected: string;
      recordsTotal: string;
      moreOptions: string;
      showHideColumns: string;
      searchPlaceholder: string;
      photosAndFiles: string;
      attachments: string;
      relatedRecords: string;
      featureEditLimitNotice: string;
      copy: string;
      paste: string;
  }>;
  /** AppLayout: the current app layout */
  accessor appLayout: AppLayout | undefined;
  /** string: Global ID of the feature to select */
  accessor defaultGlobalId: string[];
  /**
   * string: when provided this layer ID will be used when the app loads
   *
   * @default ''
   */
  accessor defaultLayerId: string;
  /** number: when provided this will be used to select a feature in the table by default */
  accessor defaultOid: number[];
  /**
   * boolean: when true the layer table will auto refresh the data
   *
   * @default false
   */
  accessor enableAutoRefresh: boolean;
  /**
   * boolean: when true the layer table will support drag/drop of columns to adjust order
   *
   * @default true
   */
  accessor enableColumnReorder: boolean;
  /**
   * boolean: when true the export to csv button will be available
   *
   * @default false
   */
  accessor enableCSV: boolean;
  /**
   * boolean: when true edits can be applied directly within the table
   *
   * @default false
   */
  accessor enableInlineEdit: boolean;
  /**
   * boolean: when true the share widget will be available
   *
   * @default false
   */
  accessor enableShare: boolean;
  /**
   * boolean: when true the inline editing will be auto saved
   *
   * @default true
   */
  accessor enableTableAutosave: boolean;
  /**
   * string: Selection mode for the feature selection
   *
   * @default 'multiple'
   */
  accessor featureSelectionMode: string;
  /**
   * boolean: when true we will honor field order and visibility that may have been defined
   * in the map viewer if no field order is defined in the mapInfo.
   *
   * Field order defined in the mapInfo as would be the case for Instant App configurations
   * will always override this map level setting.
   *
   * @default false
   */
  accessor honorMapFieldSettings: boolean;
  /**
   * When true the component will render an optimized view for mobile devices
   *
   * @default false
   */
  accessor isMobile: boolean;
  /** string[]: list of layer ids allowed for adding event listeners when editing applied */
  accessor layerIds: string[];
  /**
   * boolean: when true the map is hidden and map specific controls should be hidden
   *
   * @default false
   */
  accessor mapHidden: boolean;
  /** IMapInfo: key configuration details about the current map */
  accessor mapInfo: IMapInfo | undefined;
  /** esri/views/View: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html */
  accessor mapView: MapView | undefined;
  /**
   * boolean: When true the paste action will be enabled
   *
   * @default false
   */
  accessor pasteEnabled: boolean;
  /** number[]: A list of ids that are currently selected */
  accessor selectedIds: (number | string)[];
  /** number[]: A list of ids selected ids from related records */
  accessor selectedRelatedIds: number[];
  /**
   * boolean: When true the share options will include embed option
   *
   * @default false
   */
  accessor shareIncludeEmbed: boolean;
  /**
   * boolean: When true the share options will include social media sharing
   *
   * @default false
   */
  accessor shareIncludeSocial: boolean;
  /**
   * boolean: When true the copy and paste actions will be shown
   *
   * @default false
   */
  accessor showCopyPasteActions: boolean;
  /**
   * boolean: when true the table will be sorted by objectid in descending order by default
   *
   * @default false
   */
  accessor showNewestFirst: boolean;
  /**
   * boolean: When true only editable layers that support the update capability will be available
   *
   * @default false
   */
  accessor showOnlyUpdatableLayers: boolean;
  /**
   * boolean: When true the selected feature will zoomed to in the map and the row will be scrolled to within the table
   *
   * @default false
   */
  accessor zoomAndScrollToSelected: boolean;
  /** number: default scale to zoom to when zooming to a single point feature */
  accessor zoomToScale: number | undefined;
  /** Closes the filter */
  closeFilter(): Promise<void>;
  /** Reset the filter */
  filterReset(): Promise<void>;
  /**
   * Updates the filter
   *
   * @param filterActive
   * @param keepTableUpdatingOnMapExtentChange
   */
  filterUpdate(filterActive: boolean, keepTableUpdatingOnMapExtentChange?: boolean): Promise<void>;
  /** refresh the feature table */
  refresh(): Promise<void>;
  /**
   * Set column templates with an ordered collection
   *
   * @param columnTemplates
   */
  setColumnOrder(columnTemplates: any): Promise<void>;
  /** Validate if the editor has any pending edits */
  validateActiveEdits(): Promise<boolean>;
  /**
   * Validate if the table should update
   *
   * @param shouldUpdateTableOnExtentChange
   */
  validateTableUpdate(shouldUpdateTableOnExtentChange: boolean): Promise<void>;
  /** Emitted before the feature selection changes */
  readonly beforeFeatureSelectionChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted when the user click/drags a column */
  readonly columnReorder: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted when the continue editing is clicked when discard message is shown */
  readonly continueEditing: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted on demand when copy action is clicked */
  readonly copyFeatures: import("@arcgis/lumina").TargetedEvent<this, {
      featuresIds: (number | string)[];
      layerId: string | undefined;
  }>;
  /** Emitted on demand when edit multiple action is clicked */
  readonly editMultipleFeatures: import("@arcgis/lumina").TargetedEvent<this, (number | string)[]>;
  /** Emitted when features are added to the layer */
  readonly featuresAdded: import("@arcgis/lumina").TargetedEvent<this, (number | string)[]>;
  /** Emitted on demand when a layer is selected */
  readonly featureSelectionChange: import("@arcgis/lumina").TargetedEvent<this, (number | string)[]>;
  /** Emitted when the create feature component should be shown */
  readonly initCreateComponent: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted on demand when paste action is clicked */
  readonly pasteFeatures: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted when related record toggled from related table */
  readonly relatedRecordToggled: import("@arcgis/lumina").TargetedEvent<this, FeatureLayer>;
  /** Emitter when features are pasted to different layer and requested layer selection change */
  readonly requestLayerSelectionChange: import("@arcgis/lumina").TargetedEvent<this, string>;
  /** Emitted on demand when when the delete dialog should be shown */
  readonly showDelete: import("@arcgis/lumina").TargetedEvent<this, IDeleteIds>;
  /** Emitted on demand when filter action is clicked */
  readonly toggleFilter: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    beforeFeatureSelectionChange: LayerTable["beforeFeatureSelectionChange"]["detail"];
    columnReorder: LayerTable["columnReorder"]["detail"];
    continueEditing: LayerTable["continueEditing"]["detail"];
    copyFeatures: LayerTable["copyFeatures"]["detail"];
    editMultipleFeatures: LayerTable["editMultipleFeatures"]["detail"];
    featuresAdded: LayerTable["featuresAdded"]["detail"];
    featureSelectionChange: LayerTable["featureSelectionChange"]["detail"];
    initCreateComponent: LayerTable["initCreateComponent"]["detail"];
    pasteFeatures: LayerTable["pasteFeatures"]["detail"];
    relatedRecordToggled: LayerTable["relatedRecordToggled"]["detail"];
    requestLayerSelectionChange: LayerTable["requestLayerSelectionChange"]["detail"];
    showDelete: LayerTable["showDelete"]["detail"];
    toggleFilter: LayerTable["toggleFilter"]["detail"];
  };
}