import type { AgFormatFieldValueFunc, AgWidgetField } from './agField'; import type { AgFilter, AgFilterCondition } from './agFilter'; import type { AgLimit } from './agLimit'; import type { AgSort } from './agSort'; import type { AgWidgetSort } from './agWidgetParams'; export type AgWidgetCrossFilter = 'filter' | 'highlight' | 'none'; export interface AgWidgetDataQuery { /** List of fields to return in the query. Unaggregated fields will automatically be used for grouping. */ fields: AgWidgetField[]; /** Sort the result based on the provided fields. */ sort?: AgSort[]; /** * Additional filter to apply. * Page-level filters and widget-level filters (including from filter widgets and cross filters) * will be automatically applied. */ filter?: AgFilter[]; /** * Limit the number of rows returned, or for pagination. */ limit?: AgLimit; } export interface AgWidgetExportCsvRequest { fields: AgWidgetField[]; sort?: AgWidgetSort[]; requestOptions?: AgWidgetDataRequestOptions; transformRow?: (row: Record) => Record; } export interface AgWidgetExportCsvParams { requests: AgWidgetExportCsvRequest[]; } export interface AgWidgetResultMetadata { rowCount: number; /** Total row count before any Limit operation was applied. Equals `rowCount` when no limit is used. */ totalRowCount?: number; } export interface AgWidgetRowsResult { rows: Record[]; metadata?: AgWidgetResultMetadata; } /** * Widget-level data response. * Contains primary result in the requested shape and optional cross-filter result. */ export interface AgWidgetDataResponse { /** * Primary query result in the requested shape. */ results: AgWidgetRowsResult; /** * Optional cross-filter query result (when crossFilter flag was true). * Same shape as primary result but with cross-filter applied. */ crossFilter?: AgWidgetRowsResult; } export interface AgWidgetToolbarActionEvent { type: 'toolbarAction'; id: string; startTransition(callback: () => Promise): Promise; } export interface AgWidgetPointerDownEvent { type: 'pointerDown'; pointerEvent: PointerEvent; preventDefault(): void; } export interface AgWidgetMountedEvent { type: 'widgetMounted'; } export type AgWidgetEvent = AgWidgetToolbarActionEvent | AgWidgetPointerDownEvent | AgWidgetMountedEvent; export type AgWidgetEventType = AgWidgetEvent['type']; export type AgWidgetEventListener = (event: AgWidgetEvent & { type: TEvent; }) => void; interface BaseWidgetCrossFilterParams { field: AgWidgetField; reset?: boolean; } export interface AgWidgetCrossFilterValueParams extends BaseWidgetCrossFilterParams { type: 'value'; value: TValue; } export interface AgWidgetCrossFilterRangeParams extends BaseWidgetCrossFilterParams { type: 'range'; from?: TValue; to?: TValue; } export type AgWidgetCrossFilterParams = AgWidgetCrossFilterValueParams | AgWidgetCrossFilterRangeParams; export interface AgWidgetDataRequestOptions { /** * Set to `false` to prevent filters from filter widgets being applied. * @default true */ filter?: boolean; /** * Configure cross-filtering for this request. * - `filter` - return a single filtered dataset * - `highlight` - return the unfiltered dataset and the filtered dataset * - `none` - return the unfiltered dataset * @default 'filter' */ crossFilter?: AgWidgetCrossFilter; /** * Distinguishes independent queries from the same widget so that one * does not cancel the other. For example, a grid widget issues both a * `'rows'` query and a `'grandTotal'` query — without distinct IDs the * second call would abort the first. */ queryId?: string; /** * When `true`, the query aggregates all measure fields into a single * grand-total row. Dimension fields are still included for join * resolution but are not grouped on and return `null` in the output. */ grandTotal?: boolean; } export interface AgCrossFilterSelectionValues { type: 'value'; field: AgWidgetField; values: TValue[]; } export interface AgCrossFilterSelectionRange { type: 'range'; field: AgWidgetField; from?: TValue; to?: TValue; } export type AgCrossFilterSelection = AgCrossFilterSelectionValues | AgCrossFilterSelectionRange; export interface AgWidgetDisplayLoadingState { prominent?: boolean; } export interface AgWidgetDisplayState { loading: AgWidgetDisplayLoadingState; noData: any; incompleteDataMapping: any; displayed: any; } export interface AgWidgetApi { /** Retrieve data */ getData: (query: AgWidgetDataQuery, options?: AgWidgetDataRequestOptions) => Promise; /** Used for filter widgets. Set a page filter. */ applyFilter: (filter: AgFilterCondition | null) => void; /** Used for filter widgets. Get the applied filter. */ getFilter(): AgFilterCondition | null; /** Set a cross filter. */ toggleCrossFilter: (params: AgWidgetCrossFilterParams) => void; /** Clear cross filter. */ resetCrossFilter: () => void; /** Get the current cross filter for this widget. */ getCrossFilterSelections: () => AgCrossFilterSelection[] | undefined; /** @returns `true` if the provided field is being used for grouping. */ isGroupingField: (field: AgWidgetField) => boolean; /** * Add a listener for widget events. Only one listener is allowed per event type. * Additional listeners will overwrite the previous listeners. * Listeners are automatically removed when the widget is destroyed. */ addEventListener: (eventType: TEventType, listener: AgWidgetEventListener) => void; /** Remove a listener for widget events. Listeners are automatically removed when the widget is destroyed. */ removeEventListener: (eventType: TEventType) => void; /** * Set the display state of the widget. Studio will display the relevant overlay. * @param state The new display state. * @param metadata Used to pass metadata back to Studio. For `loading`, `prominent` defaults to `true` * (a full loading overlay that hides toolbar buttons); set `prominent: false` for an unobtrusive * refresh indicator that keeps toolbar buttons visible. */ setDisplayState: (state: TStateKey, metadata?: AgWidgetDisplayState[TStateKey]) => void; /** Update the widget sort (e.g. from column header clicks). The new sort is persisted to * widget state, equivalent to setting the sort from the compose panel. */ setSort: (sort: AgWidgetSort[] | undefined) => void; /** Export widget data as a CSV file. The widget provides its own field set and sort so * the exported data matches what the widget displays. */ exportCsv: (params: AgWidgetExportCsvParams) => Promise; /** Format field value using the field's `valueFormatter`, `option` and `blankValue` */ formatFieldValue: AgFormatFieldValueFunc; } export {};