2019-09-17 20:57:53 +02:00
|
|
|
/*
|
|
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
2021-02-04 03:12:39 +01:00
|
|
|
* or more contributor license agreements. Licensed under the Elastic License
|
|
|
|
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
|
|
* 2.0.
|
2019-09-17 20:57:53 +02:00
|
|
|
*/
|
|
|
|
|
2019-10-03 19:30:33 +02:00
|
|
|
import { IconType } from '@elastic/eui/src/components/icon/icon';
|
2020-04-15 12:22:37 +02:00
|
|
|
import { CoreSetup } from 'kibana/public';
|
2020-11-04 11:27:52 +01:00
|
|
|
import { PaletteOutput, PaletteRegistry } from 'src/plugins/charts/public';
|
2020-08-21 18:08:25 +02:00
|
|
|
import { SavedObjectReference } from 'kibana/public';
|
2021-01-05 10:11:05 +01:00
|
|
|
import { RowClickContext } from '../../../../src/plugins/ui_actions/public';
|
2020-05-15 12:01:27 +02:00
|
|
|
import {
|
2020-12-10 15:40:50 +01:00
|
|
|
ExpressionAstExpression,
|
2020-05-15 12:01:27 +02:00
|
|
|
ExpressionRendererEvent,
|
|
|
|
IInterpreterRenderHandlers,
|
2020-10-16 18:46:51 +02:00
|
|
|
Datatable,
|
2020-05-15 12:01:27 +02:00
|
|
|
SerializedFieldFormat,
|
|
|
|
} from '../../../../src/plugins/expressions/public';
|
2021-02-01 11:54:16 +01:00
|
|
|
import { DragContextState, DragDropIdentifier } from './drag_drop';
|
2019-09-17 20:57:53 +02:00
|
|
|
import { Document } from './persistence';
|
2020-04-15 12:22:37 +02:00
|
|
|
import { DateRange } from '../common';
|
|
|
|
import { Query, Filter, SavedQuery, IFieldFormat } from '../../../../src/plugins/data/public';
|
2021-01-05 10:11:05 +01:00
|
|
|
import { VisualizeFieldContext } from '../../../../src/plugins/ui_actions/public';
|
|
|
|
import { RangeSelectContext, ValueClickContext } from '../../../../src/plugins/embeddable/public';
|
2021-01-29 12:09:26 +01:00
|
|
|
import {
|
|
|
|
LENS_EDIT_SORT_ACTION,
|
|
|
|
LENS_EDIT_RESIZE_ACTION,
|
2021-02-04 16:22:09 +01:00
|
|
|
LENS_TOGGLE_ACTION,
|
2021-01-29 12:09:26 +01:00
|
|
|
} from './datatable_visualization/components/constants';
|
2020-12-15 12:37:59 +01:00
|
|
|
import type {
|
|
|
|
LensSortActionData,
|
2021-01-29 12:09:26 +01:00
|
|
|
LensResizeActionData,
|
2021-02-04 16:22:09 +01:00
|
|
|
LensToggleActionData,
|
2021-01-29 12:09:26 +01:00
|
|
|
} from './datatable_visualization/components/types';
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
export type ErrorCallback = (e: { message: string }) => void;
|
|
|
|
|
2020-03-25 16:16:11 +01:00
|
|
|
export type FormatFactory = (mapping?: SerializedFieldFormat) => IFieldFormat;
|
|
|
|
|
2019-10-29 17:48:30 +01:00
|
|
|
export interface PublicAPIProps<T> {
|
|
|
|
state: T;
|
|
|
|
layerId: string;
|
|
|
|
}
|
|
|
|
|
2019-09-17 20:57:53 +02:00
|
|
|
export interface EditorFrameProps {
|
|
|
|
onError: ErrorCallback;
|
|
|
|
doc?: Document;
|
2019-10-29 17:48:30 +01:00
|
|
|
dateRange: DateRange;
|
2019-09-17 20:57:53 +02:00
|
|
|
query: Query;
|
2020-02-12 12:22:06 +01:00
|
|
|
filters: Filter[];
|
2019-10-03 17:24:45 +02:00
|
|
|
savedQuery?: SavedQuery;
|
2020-12-29 14:18:30 +01:00
|
|
|
searchSessionId: string;
|
2020-10-06 10:15:41 +02:00
|
|
|
initialContext?: VisualizeFieldContext;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
// Frame loader (app or embeddable) is expected to call this when it loads and updates
|
2020-03-17 14:57:52 +01:00
|
|
|
// This should be replaced with a top-down state
|
2019-10-03 17:24:45 +02:00
|
|
|
onChange: (newState: {
|
2020-08-21 18:08:25 +02:00
|
|
|
filterableIndexPatterns: string[];
|
2019-10-03 17:24:45 +02:00
|
|
|
doc: Document;
|
2020-08-21 18:08:25 +02:00
|
|
|
isSaveable: boolean;
|
2020-11-24 12:37:27 +01:00
|
|
|
activeData?: Record<string, Datatable>;
|
2019-10-03 17:24:45 +02:00
|
|
|
}) => void;
|
2020-07-01 10:08:37 +02:00
|
|
|
showNoDataPopover: () => void;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
export interface EditorFrameInstance {
|
|
|
|
mount: (element: Element, props: EditorFrameProps) => void;
|
|
|
|
unmount: () => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface EditorFrameSetup {
|
|
|
|
// generic type on the API functions to pull the "unknown vs. specific type" error into the implementation
|
2020-09-29 19:00:29 +02:00
|
|
|
registerDatasource: <T, P>(
|
|
|
|
datasource: Datasource<T, P> | (() => Promise<Datasource<T, P>>)
|
|
|
|
) => void;
|
|
|
|
registerVisualization: <T>(
|
|
|
|
visualization: Visualization<T> | (() => Promise<Visualization<T>>)
|
|
|
|
) => void;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface EditorFrameStart {
|
2020-03-17 14:57:52 +01:00
|
|
|
createInstance: () => Promise<EditorFrameInstance>;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface TableSuggestionColumn {
|
|
|
|
columnId: string;
|
|
|
|
operation: Operation;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A possible table a datasource can create. This object is passed to the visualization
|
|
|
|
* which tries to build a meaningful visualization given the shape of the table. If this
|
|
|
|
* is possible, the visualization returns a `VisualizationSuggestion` object
|
|
|
|
*/
|
|
|
|
export interface TableSuggestion {
|
|
|
|
/**
|
|
|
|
* Flag indicating whether the table will include more than one column.
|
|
|
|
* This is not the case for example for a single metric aggregation
|
|
|
|
* */
|
|
|
|
isMultiRow: boolean;
|
|
|
|
/**
|
|
|
|
* The columns of the table. Each column has to be mapped to a dimension in a chart. If a visualization
|
|
|
|
* can't use all columns of a suggestion, it should not return a `VisualizationSuggestion` based on it
|
|
|
|
* because there would be unreferenced columns
|
|
|
|
*/
|
|
|
|
columns: TableSuggestionColumn[];
|
|
|
|
/**
|
|
|
|
* The layer this table will replace. This is only relevant if the visualization this suggestion is passed
|
|
|
|
* is currently active and has multiple layers configured. If this suggestion is applied, the table of this
|
|
|
|
* layer will be replaced by the columns specified in this suggestion
|
|
|
|
*/
|
|
|
|
layerId: string;
|
|
|
|
/**
|
|
|
|
* A label describing the table. This can be used to provide a title for the `VisualizationSuggestion`,
|
|
|
|
* but the visualization can also decide to overwrite it.
|
|
|
|
*/
|
|
|
|
label?: string;
|
|
|
|
/**
|
|
|
|
* The change type indicates what was changed in this table compared to the currently active table of this layer.
|
|
|
|
*/
|
|
|
|
changeType: TableChangeType;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicates what was changed in this table compared to the currently active table of this layer.
|
|
|
|
* * `initial` means the layer associated with this table does not exist in the current configuration
|
|
|
|
* * `unchanged` means the table is the same in the currently active configuration
|
|
|
|
* * `reduced` means the table is a reduced version of the currently active table (some columns dropped, but not all of them)
|
|
|
|
* * `extended` means the table is an extended version of the currently active table (added one or multiple additional columns)
|
2020-04-30 16:52:10 +02:00
|
|
|
* * `reorder` means the table columns have changed order, which change the data as well
|
2019-10-30 00:05:03 +01:00
|
|
|
* * `layers` means the change is a change to the layer structure, not to the table
|
2019-09-17 20:57:53 +02:00
|
|
|
*/
|
2020-04-30 16:52:10 +02:00
|
|
|
export type TableChangeType =
|
|
|
|
| 'initial'
|
|
|
|
| 'unchanged'
|
|
|
|
| 'reduced'
|
|
|
|
| 'extended'
|
|
|
|
| 'reorder'
|
|
|
|
| 'layers';
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2021-02-05 18:17:03 +01:00
|
|
|
export type DropType =
|
|
|
|
| 'field_add'
|
|
|
|
| 'field_replace'
|
|
|
|
| 'reorder'
|
|
|
|
| 'duplicate_in_group'
|
|
|
|
| 'move_compatible'
|
|
|
|
| 'replace_compatible'
|
|
|
|
| 'move_incompatible'
|
|
|
|
| 'replace_incompatible';
|
|
|
|
|
2019-09-17 20:57:53 +02:00
|
|
|
export interface DatasourceSuggestion<T = unknown> {
|
|
|
|
state: T;
|
|
|
|
table: TableSuggestion;
|
2019-10-30 00:05:03 +01:00
|
|
|
keptLayerIds: string[];
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export type StateSetter<T> = (newState: T | ((prevState: T) => T)) => void;
|
|
|
|
|
2021-01-26 19:06:40 +01:00
|
|
|
export interface InitializationOptions {
|
|
|
|
isFullEditor?: boolean;
|
|
|
|
}
|
|
|
|
|
2019-09-17 20:57:53 +02:00
|
|
|
/**
|
|
|
|
* Interface for the datasource registry
|
|
|
|
*/
|
|
|
|
export interface Datasource<T = unknown, P = unknown> {
|
2019-12-04 14:36:21 +01:00
|
|
|
id: string;
|
|
|
|
|
2019-09-17 20:57:53 +02:00
|
|
|
// For initializing, either from an empty state or from persisted state
|
|
|
|
// Because this will be called at runtime, state might have a type of `any` and
|
|
|
|
// datasources should validate their arguments
|
2020-10-06 10:15:41 +02:00
|
|
|
initialize: (
|
|
|
|
state?: P,
|
|
|
|
savedObjectReferences?: SavedObjectReference[],
|
2021-01-26 19:06:40 +01:00
|
|
|
initialContext?: VisualizeFieldContext,
|
|
|
|
options?: InitializationOptions
|
2020-10-06 10:15:41 +02:00
|
|
|
) => Promise<T>;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
// Given the current state, which parts should be saved?
|
2020-08-21 18:08:25 +02:00
|
|
|
getPersistableState: (state: T) => { state: P; savedObjectReferences: SavedObjectReference[] };
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
insertLayer: (state: T, newLayerId: string) => T;
|
|
|
|
removeLayer: (state: T, layerId: string) => T;
|
2020-01-14 18:06:51 +01:00
|
|
|
clearLayer: (state: T, layerId: string) => T;
|
2019-09-17 20:57:53 +02:00
|
|
|
getLayers: (state: T) => string[];
|
2020-03-17 14:57:52 +01:00
|
|
|
removeColumn: (props: { prevState: T; layerId: string; columnId: string }) => T;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
renderDataPanel: (domElement: Element, props: DatasourceDataPanelProps<T>) => void;
|
2020-03-17 14:57:52 +01:00
|
|
|
renderDimensionTrigger: (domElement: Element, props: DatasourceDimensionTriggerProps<T>) => void;
|
|
|
|
renderDimensionEditor: (domElement: Element, props: DatasourceDimensionEditorProps<T>) => void;
|
|
|
|
renderLayerPanel: (domElement: Element, props: DatasourceLayerPanelProps<T>) => void;
|
2021-02-05 18:17:03 +01:00
|
|
|
getDropTypes: (
|
|
|
|
props: DatasourceDimensionDropProps<T> & { groupId: string }
|
|
|
|
) => DropType | undefined;
|
2020-09-04 16:11:41 +02:00
|
|
|
onDrop: (props: DatasourceDimensionDropHandlerProps<T>) => false | true | { deleted: string };
|
2020-12-04 17:00:10 +01:00
|
|
|
updateStateOnCloseDimension?: (props: {
|
|
|
|
layerId: string;
|
|
|
|
columnId: string;
|
|
|
|
state: T;
|
|
|
|
}) => T | undefined;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-12-10 15:40:50 +01:00
|
|
|
toExpression: (state: T, layerId: string) => ExpressionAstExpression | string | null;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
getDatasourceSuggestionsForField: (state: T, field: unknown) => Array<DatasourceSuggestion<T>>;
|
2020-10-06 10:15:41 +02:00
|
|
|
getDatasourceSuggestionsForVisualizeField: (
|
|
|
|
state: T,
|
|
|
|
indexPatternId: string,
|
|
|
|
fieldName: string
|
|
|
|
) => Array<DatasourceSuggestion<T>>;
|
2020-11-06 17:05:34 +01:00
|
|
|
getDatasourceSuggestionsFromCurrentState: (
|
|
|
|
state: T,
|
|
|
|
activeData?: Record<string, Datatable>
|
|
|
|
) => Array<DatasourceSuggestion<T>>;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2019-10-29 17:48:30 +01:00
|
|
|
getPublicAPI: (props: PublicAPIProps<T>) => DatasourcePublicAPI;
|
2020-11-09 15:22:21 +01:00
|
|
|
getErrorMessages: (
|
|
|
|
state: T,
|
|
|
|
layersGroups?: Record<string, VisualizationDimensionGroupConfig[]>
|
|
|
|
) => Array<{ shortMessage: string; longMessage: string }> | undefined;
|
2020-11-03 21:18:44 +01:00
|
|
|
/**
|
|
|
|
* uniqueLabels of dimensions exposed for aria-labels of dragged dimensions
|
|
|
|
*/
|
|
|
|
uniqueLabels: (state: T) => Record<string, string>;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is an API provided to visualizations by the frame, which calls the publicAPI on the datasource
|
|
|
|
*/
|
|
|
|
export interface DatasourcePublicAPI {
|
2020-03-17 14:57:52 +01:00
|
|
|
datasourceId: string;
|
|
|
|
getTableSpec: () => Array<{ columnId: string }>;
|
2019-09-17 20:57:53 +02:00
|
|
|
getOperationForColumnId: (columnId: string) => Operation | null;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface DatasourceDataPanelProps<T = unknown> {
|
|
|
|
state: T;
|
|
|
|
dragDropContext: DragContextState;
|
|
|
|
setState: StateSetter<T>;
|
2020-07-01 10:08:37 +02:00
|
|
|
showNoDataPopover: () => void;
|
2019-09-17 20:57:53 +02:00
|
|
|
core: Pick<CoreSetup, 'http' | 'notifications' | 'uiSettings'>;
|
|
|
|
query: Query;
|
2019-10-29 17:48:30 +01:00
|
|
|
dateRange: DateRange;
|
2020-02-12 12:22:06 +01:00
|
|
|
filters: Filter[];
|
2021-02-01 11:54:16 +01:00
|
|
|
dropOntoWorkspace: (field: DragDropIdentifier) => void;
|
|
|
|
hasSuggestionForField: (field: DragDropIdentifier) => boolean;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
2020-03-17 14:57:52 +01:00
|
|
|
interface SharedDimensionProps {
|
|
|
|
/** Visualizations can restrict operations based on their own rules.
|
|
|
|
* For example, limiting to only bucketed or only numeric operations.
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
filterOperations: (operation: OperationMetadata) => boolean;
|
|
|
|
|
2020-03-17 14:57:52 +01:00
|
|
|
/** Some dimension editors will allow users to change the operation grouping
|
|
|
|
* from the panel, and this lets the visualization hint that it doesn't want
|
|
|
|
* users to have that level of control
|
|
|
|
*/
|
2019-10-16 06:42:58 +02:00
|
|
|
hideGrouping?: boolean;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
2020-03-17 14:57:52 +01:00
|
|
|
export type DatasourceDimensionProps<T> = SharedDimensionProps & {
|
2019-09-17 20:57:53 +02:00
|
|
|
layerId: string;
|
2020-03-17 14:57:52 +01:00
|
|
|
columnId: string;
|
|
|
|
onRemove?: (accessor: string) => void;
|
|
|
|
state: T;
|
2020-11-06 17:05:34 +01:00
|
|
|
activeData?: Record<string, Datatable>;
|
2020-03-17 14:57:52 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
// The only way a visualization has to restrict the query building
|
|
|
|
export type DatasourceDimensionEditorProps<T = unknown> = DatasourceDimensionProps<T> & {
|
2020-12-08 11:29:07 +01:00
|
|
|
// Not a StateSetter because we have this unique use case of determining valid columns
|
2021-01-18 16:58:23 +01:00
|
|
|
setState: (
|
|
|
|
newState: Parameters<StateSetter<T>>[0],
|
|
|
|
publishToVisualization?: { shouldReplaceDimension?: boolean; shouldRemoveDimension?: boolean }
|
|
|
|
) => void;
|
2020-03-17 14:57:52 +01:00
|
|
|
core: Pick<CoreSetup, 'http' | 'notifications' | 'uiSettings'>;
|
|
|
|
dateRange: DateRange;
|
2020-11-09 15:22:21 +01:00
|
|
|
dimensionGroups: VisualizationDimensionGroupConfig[];
|
2020-03-17 14:57:52 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
export type DatasourceDimensionTriggerProps<T> = DatasourceDimensionProps<T> & {
|
|
|
|
dragDropContext: DragContextState;
|
|
|
|
};
|
|
|
|
|
|
|
|
export interface DatasourceLayerPanelProps<T> {
|
|
|
|
layerId: string;
|
|
|
|
state: T;
|
|
|
|
setState: StateSetter<T>;
|
2020-11-06 17:05:34 +01:00
|
|
|
activeData?: Record<string, Datatable>;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
2020-09-04 16:11:41 +02:00
|
|
|
export interface DraggedOperation {
|
|
|
|
layerId: string;
|
|
|
|
groupId: string;
|
|
|
|
columnId: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isDraggedOperation(
|
|
|
|
operationCandidate: unknown
|
|
|
|
): operationCandidate is DraggedOperation {
|
|
|
|
return (
|
|
|
|
typeof operationCandidate === 'object' &&
|
|
|
|
operationCandidate !== null &&
|
|
|
|
'columnId' in operationCandidate
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-03-17 14:57:52 +01:00
|
|
|
export type DatasourceDimensionDropProps<T> = SharedDimensionProps & {
|
|
|
|
layerId: string;
|
|
|
|
columnId: string;
|
|
|
|
state: T;
|
|
|
|
setState: StateSetter<T>;
|
|
|
|
dragDropContext: DragContextState;
|
|
|
|
};
|
|
|
|
|
|
|
|
export type DatasourceDimensionDropHandlerProps<T> = DatasourceDimensionDropProps<T> & {
|
|
|
|
droppedItem: unknown;
|
2021-02-05 18:17:03 +01:00
|
|
|
dropType: DropType;
|
2020-03-17 14:57:52 +01:00
|
|
|
};
|
|
|
|
|
2021-02-16 17:51:03 +01:00
|
|
|
export type FieldOnlyDataType = 'document' | 'ip' | 'histogram';
|
|
|
|
export type DataType = 'string' | 'number' | 'date' | 'boolean' | FieldOnlyDataType;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
|
|
|
// An operation represents a column in a table, not any information
|
|
|
|
// about how the column was created such as whether it is a sum or average.
|
|
|
|
// Visualizations are able to filter based on the output, not based on the
|
|
|
|
// underlying data
|
|
|
|
export interface Operation extends OperationMetadata {
|
|
|
|
// User-facing label for the operation
|
|
|
|
label: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface OperationMetadata {
|
|
|
|
// The output of this operation will have this data type
|
|
|
|
dataType: DataType;
|
|
|
|
// A bucketed operation is grouped by duplicate values, otherwise each row is
|
|
|
|
// treated as unique
|
|
|
|
isBucketed: boolean;
|
2020-08-27 00:27:40 +02:00
|
|
|
/**
|
|
|
|
* ordinal: Each name is a unique value, but the names are in sorted order, like "Top values"
|
|
|
|
* interval: Histogram data, like date or number histograms
|
|
|
|
* ratio: Most number data is rendered as a ratio that includes 0
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
scale?: 'ordinal' | 'interval' | 'ratio';
|
|
|
|
// Extra meta-information like cardinality, color
|
|
|
|
// TODO currently it's not possible to differentiate between a field from a raw
|
|
|
|
// document and an aggregated metric which might be handy in some cases. Once we
|
|
|
|
// introduce a raw document datasource, this should be considered here.
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface LensMultiTable {
|
|
|
|
type: 'lens_multitable';
|
2020-10-16 18:46:51 +02:00
|
|
|
tables: Record<string, Datatable>;
|
2019-10-16 00:14:40 +02:00
|
|
|
dateRange?: {
|
|
|
|
fromDate: Date;
|
|
|
|
toDate: Date;
|
|
|
|
};
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
2020-03-17 14:57:52 +01:00
|
|
|
export interface VisualizationConfigProps<T = unknown> {
|
2020-01-14 18:06:51 +01:00
|
|
|
layerId: string;
|
2021-02-15 13:00:31 +01:00
|
|
|
frame: Pick<FramePublicAPI, 'datasourceLayers' | 'activeData'>;
|
2019-09-17 20:57:53 +02:00
|
|
|
state: T;
|
2020-03-17 14:57:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export type VisualizationLayerWidgetProps<T = unknown> = VisualizationConfigProps<T> & {
|
2019-09-17 20:57:53 +02:00
|
|
|
setState: (newState: T) => void;
|
2020-03-17 14:57:52 +01:00
|
|
|
};
|
|
|
|
|
2020-06-26 09:38:35 +02:00
|
|
|
export interface VisualizationToolbarProps<T = unknown> {
|
|
|
|
setState: (newState: T) => void;
|
|
|
|
frame: FramePublicAPI;
|
|
|
|
state: T;
|
|
|
|
}
|
|
|
|
|
2020-06-01 19:33:23 +02:00
|
|
|
export type VisualizationDimensionEditorProps<T = unknown> = VisualizationConfigProps<T> & {
|
|
|
|
groupId: string;
|
|
|
|
accessor: string;
|
|
|
|
setState: (newState: T) => void;
|
|
|
|
};
|
|
|
|
|
2020-11-17 10:19:13 +01:00
|
|
|
export interface AccessorConfig {
|
|
|
|
columnId: string;
|
2021-02-04 16:22:09 +01:00
|
|
|
triggerIcon?: 'color' | 'disabled' | 'colorBy' | 'none' | 'invisible';
|
2020-11-17 10:19:13 +01:00
|
|
|
color?: string;
|
|
|
|
palette?: string[];
|
|
|
|
}
|
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
export type VisualizationDimensionGroupConfig = SharedDimensionProps & {
|
2020-03-17 14:57:52 +01:00
|
|
|
groupLabel: string;
|
|
|
|
|
|
|
|
/** ID is passed back to visualization. For example, `x` */
|
|
|
|
groupId: string;
|
2020-11-17 10:19:13 +01:00
|
|
|
accessors: AccessorConfig[];
|
2020-03-17 14:57:52 +01:00
|
|
|
supportsMoreColumns: boolean;
|
|
|
|
/** If required, a warning will appear if accessors are empty */
|
|
|
|
required?: boolean;
|
|
|
|
dataTestSubj?: string;
|
2020-06-01 19:33:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* When the dimension editor is enabled for this group, all dimensions in the group
|
|
|
|
* will render the extra tab for the dimension editor
|
|
|
|
*/
|
|
|
|
enableDimensionEditor?: boolean;
|
2020-03-17 14:57:52 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
interface VisualizationDimensionChangeProps<T> {
|
|
|
|
layerId: string;
|
|
|
|
columnId: string;
|
|
|
|
prevState: T;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Object passed to `getSuggestions` of a visualization.
|
|
|
|
* It contains a possible table the current datasource could
|
|
|
|
* provide and the state of the visualization if it is currently active.
|
|
|
|
*
|
|
|
|
* If the current datasource suggests multiple tables, `getSuggestions`
|
|
|
|
* is called multiple times with separate `SuggestionRequest` objects.
|
|
|
|
*/
|
|
|
|
export interface SuggestionRequest<T = unknown> {
|
|
|
|
/**
|
|
|
|
* A table configuration the datasource could provide.
|
|
|
|
*/
|
|
|
|
table: TableSuggestion;
|
|
|
|
/**
|
|
|
|
* State is only passed if the visualization is active.
|
|
|
|
*/
|
|
|
|
state?: T;
|
2020-11-04 11:27:52 +01:00
|
|
|
mainPalette?: PaletteOutput;
|
2019-10-30 00:05:03 +01:00
|
|
|
/**
|
|
|
|
* The visualization needs to know which table is being suggested
|
|
|
|
*/
|
|
|
|
keptLayerIds: string[];
|
2020-04-30 01:14:47 +02:00
|
|
|
/**
|
|
|
|
* Different suggestions can be generated for each subtype of the visualization
|
|
|
|
*/
|
|
|
|
subVisualizationId?: string;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A possible configuration of a given visualization. It is based on a `TableSuggestion`.
|
|
|
|
* Suggestion might be shown in the UI to be chosen by the user directly, but they are
|
|
|
|
* also applied directly under some circumstances (dragging in the first field from the data
|
|
|
|
* panel or switching to another visualization in the chart switcher).
|
|
|
|
*/
|
|
|
|
export interface VisualizationSuggestion<T = unknown> {
|
|
|
|
/**
|
|
|
|
* The score of a suggestion should indicate how valuable the suggestion is. It is used
|
|
|
|
* to rank multiple suggestions of multiple visualizations. The number should be between 0 and 1
|
|
|
|
*/
|
|
|
|
score: number;
|
|
|
|
/**
|
|
|
|
* Flag indicating whether this suggestion should not be advertised to the user. It is still
|
|
|
|
* considered in scenarios where the available suggestion with the highest suggestion is applied
|
|
|
|
* directly.
|
|
|
|
*/
|
|
|
|
hide?: boolean;
|
|
|
|
/**
|
|
|
|
* Descriptive title of the suggestion. Should be as short as possible. This title is shown if
|
|
|
|
* the suggestion is advertised to the user and will also show either the `previewExpression` or
|
|
|
|
* the `previewIcon`
|
|
|
|
*/
|
|
|
|
title: string;
|
|
|
|
/**
|
|
|
|
* The new state of the visualization if this suggestion is applied.
|
|
|
|
*/
|
|
|
|
state: T;
|
|
|
|
/**
|
|
|
|
* An EUI icon type shown instead of the preview expression.
|
|
|
|
*/
|
2019-10-03 19:30:33 +02:00
|
|
|
previewIcon: IconType;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface FramePublicAPI {
|
|
|
|
datasourceLayers: Record<string, DatasourcePublicAPI>;
|
2020-11-06 17:05:34 +01:00
|
|
|
/**
|
|
|
|
* Data of the chart currently rendered in the preview.
|
|
|
|
* This data might be not available (e.g. if the chart can't be rendered) or outdated and belonging to another chart.
|
|
|
|
* If accessing, make sure to check whether expected columns actually exist.
|
|
|
|
*/
|
|
|
|
activeData?: Record<string, Datatable>;
|
2019-10-03 17:24:45 +02:00
|
|
|
|
2019-10-29 17:48:30 +01:00
|
|
|
dateRange: DateRange;
|
2019-09-17 20:57:53 +02:00
|
|
|
query: Query;
|
2020-02-12 12:22:06 +01:00
|
|
|
filters: Filter[];
|
2020-12-29 14:18:30 +01:00
|
|
|
searchSessionId: string;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-11-04 11:27:52 +01:00
|
|
|
/**
|
|
|
|
* A map of all available palettes (keys being the ids).
|
|
|
|
*/
|
|
|
|
availablePalettes: PaletteRegistry;
|
|
|
|
|
2019-09-17 20:57:53 +02:00
|
|
|
// Adds a new layer. This has a side effect of updating the datasource state
|
|
|
|
addNewLayer: () => string;
|
|
|
|
removeLayers: (layerIds: string[]) => void;
|
|
|
|
}
|
|
|
|
|
2020-10-06 17:17:41 +02:00
|
|
|
/**
|
|
|
|
* A visualization type advertised to the user in the chart switcher
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
export interface VisualizationType {
|
2020-10-06 17:17:41 +02:00
|
|
|
/**
|
|
|
|
* Unique id of the visualization type within the visualization defining it
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
id: string;
|
2020-10-06 17:17:41 +02:00
|
|
|
/**
|
|
|
|
* Icon used in the chart switcher
|
|
|
|
*/
|
2020-09-15 11:24:02 +02:00
|
|
|
icon: IconType;
|
2020-10-06 17:17:41 +02:00
|
|
|
/**
|
|
|
|
* Visible label used in the chart switcher and above the workspace panel in collapsed state
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
label: string;
|
2020-10-06 17:17:41 +02:00
|
|
|
/**
|
|
|
|
* Optional label used in chart type search if chart switcher is expanded and for tooltips
|
|
|
|
*/
|
|
|
|
fullLabel?: string;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
|
|
|
|
2020-08-21 18:08:25 +02:00
|
|
|
export interface Visualization<T = unknown> {
|
2020-04-22 23:36:36 +02:00
|
|
|
/** Plugin ID, such as "lnsXY" */
|
2019-09-17 20:57:53 +02:00
|
|
|
id: string;
|
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* Initialize is allowed to modify the state stored in memory. The initialize function
|
|
|
|
* is called with a previous state in two cases:
|
|
|
|
* - Loadingn from a saved visualization
|
|
|
|
* - When using suggestions, the suggested state is passed in
|
|
|
|
*/
|
2020-11-04 11:27:52 +01:00
|
|
|
initialize: (frame: FramePublicAPI, state?: T, mainPalette?: PaletteOutput) => T;
|
|
|
|
|
|
|
|
getMainPalette?: (state: T) => undefined | PaletteOutput;
|
2020-04-22 23:36:36 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Visualizations must provide at least one type for the chart switcher,
|
|
|
|
* but can register multiple subtypes
|
|
|
|
*/
|
2019-09-17 20:57:53 +02:00
|
|
|
visualizationTypes: VisualizationType[];
|
2020-04-30 01:14:47 +02:00
|
|
|
/**
|
|
|
|
* Return the ID of the current visualization. Used to highlight
|
|
|
|
* the active subtype of the visualization.
|
|
|
|
*/
|
|
|
|
getVisualizationTypeId: (state: T) => string;
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* If the visualization has subtypes, update the subtype in state.
|
|
|
|
*/
|
|
|
|
switchVisualizationType?: (visualizationTypeId: string, state: T) => T;
|
|
|
|
/** Description is displayed as the clickable text in the chart switcher */
|
|
|
|
getDescription: (state: T) => { icon?: IconType; label: string };
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/** Frame needs to know which layers the visualization is currently using */
|
2020-01-14 18:06:51 +01:00
|
|
|
getLayerIds: (state: T) => string[];
|
2020-04-22 23:36:36 +02:00
|
|
|
/** Reset button on each layer triggers this */
|
2020-01-14 18:06:51 +01:00
|
|
|
clearLayer: (state: T, layerId: string) => T;
|
2020-04-22 23:36:36 +02:00
|
|
|
/** Optional, if the visualization supports multiple layers */
|
2020-01-14 18:06:51 +01:00
|
|
|
removeLayer?: (state: T, layerId: string) => T;
|
2020-04-22 23:36:36 +02:00
|
|
|
/** Track added layers in internal state */
|
2020-01-14 18:06:51 +01:00
|
|
|
appendLayer?: (state: T, layerId: string) => T;
|
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* For consistency across different visualizations, the dimension configuration UI is standardized
|
|
|
|
*/
|
2020-03-17 14:57:52 +01:00
|
|
|
getConfiguration: (
|
|
|
|
props: VisualizationConfigProps<T>
|
|
|
|
) => { groups: VisualizationDimensionGroupConfig[] };
|
2020-01-14 18:06:51 +01:00
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* Popover contents that open when the user clicks the contextMenuIcon. This can be used
|
|
|
|
* for extra configurability, such as for styling the legend or axis
|
|
|
|
*/
|
|
|
|
renderLayerContextMenu?: (domElement: Element, props: VisualizationLayerWidgetProps<T>) => void;
|
2020-06-26 09:38:35 +02:00
|
|
|
/**
|
|
|
|
* Toolbar rendered above the visualization. This is meant to be used to provide chart-level
|
|
|
|
* settings for the visualization.
|
|
|
|
*/
|
|
|
|
renderToolbar?: (domElement: Element, props: VisualizationToolbarProps<T>) => void;
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* Visualizations can provide a custom icon which will open a layer-specific popover
|
|
|
|
* If no icon is provided, gear icon is default
|
|
|
|
*/
|
2020-11-30 15:45:26 +01:00
|
|
|
getLayerContextMenuIcon?: (opts: {
|
|
|
|
state: T;
|
|
|
|
layerId: string;
|
|
|
|
}) => { icon: IconType | 'gear'; label: string } | undefined;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* The frame is telling the visualization to update or set a dimension based on user interaction
|
|
|
|
* groupId is coming from the groupId provided in getConfiguration
|
|
|
|
*/
|
|
|
|
setDimension: (props: VisualizationDimensionChangeProps<T> & { groupId: string }) => T;
|
|
|
|
/**
|
|
|
|
* The frame is telling the visualization to remove a dimension. The visualization needs to
|
|
|
|
* look at its internal state to determine which dimension is being affected.
|
|
|
|
*/
|
2020-03-17 14:57:52 +01:00
|
|
|
removeDimension: (props: VisualizationDimensionChangeProps<T>) => T;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-06-01 19:33:23 +02:00
|
|
|
/**
|
|
|
|
* Additional editor that gets rendered inside the dimension popover.
|
|
|
|
* This can be used to configure dimension-specific options
|
|
|
|
*/
|
|
|
|
renderDimensionEditor?: (
|
|
|
|
domElement: Element,
|
|
|
|
props: VisualizationDimensionEditorProps<T>
|
|
|
|
) => void;
|
|
|
|
|
2020-04-22 23:36:36 +02:00
|
|
|
/**
|
|
|
|
* The frame will call this function on all visualizations at different times. The
|
|
|
|
* main use cases where visualization suggestions are requested are:
|
|
|
|
* - When dragging a field
|
|
|
|
* - When opening the chart switcher
|
|
|
|
* If the state is provided when requesting suggestions, the visualization is active.
|
|
|
|
* Most visualizations will apply stricter filtering to suggestions when they are active,
|
|
|
|
* because suggestions have the potential to remove the users's work in progress.
|
|
|
|
*/
|
|
|
|
getSuggestions: (context: SuggestionRequest<T>) => Array<VisualizationSuggestion<T>>;
|
2019-09-17 20:57:53 +02:00
|
|
|
|
2020-08-21 18:08:25 +02:00
|
|
|
toExpression: (
|
|
|
|
state: T,
|
2020-10-01 18:02:37 +02:00
|
|
|
datasourceLayers: Record<string, DatasourcePublicAPI>,
|
|
|
|
attributes?: Partial<{ title: string; description: string }>
|
2020-12-10 15:40:50 +01:00
|
|
|
) => ExpressionAstExpression | string | null;
|
[Lens] Transient suggestions (#44234)
* [lens] Initial Commit (#35627)
* [visualization editor] Initial Commit
* [lens] Add more complete initial state
* [lens] Fix type issues
* [lens] Remove feature control
* [lens] Bring back feature control and add tests
* [lens] Update plugin structure and naming per comments
* replace any usage by safe casting
* [lens] Respond to review comments
* [lens] Remove unused EditorFrameState type
* [lens] Initial state for IndexPatternDatasource (#36052)
* [lens] Add first tests to indexpattern data source
* Respond to review comments
* Fix type definitions
* [lens] Editor frame initializes datasources and visualizations (#36060)
* [lens] Editor frame initializes datasources and visualizations
* Respond to review comments
* Fix build issues
* Fix state management issue
* [lens][draft] Lens/drag drop (#36268)
Add basic drag / drop component to Lens
* remove local package (#36456)
* [lens] Native renderer (#36165)
* Add nativerenderer component
* Use native renderer in app and editor frame
* [Lens] No explicit any (#36515)
* [Lens] Implement basic editor frame state handling (#36443)
* [lens] Load index patterns and render in data panel (#36463)
* [lens] Editor frame initializes datasources and visualizations
* Respond to review comments
* Fix build issues
* remove local package
* [lens] Load index patterns into data source
* Redo types for Index Pattern Datasource
* Fix one more type
* Respond to review comments
* [draft] Lens/line chart renderer (#36827)
Expression logic for the Lens xy chart.
* [lens] Index pattern data panel (initial) (#37015)
* [lens] Index pattern switcher
* Respond to review comments
* [Lens] Editor state 2 (#36513)
* [lens] Dimension panel that generates columns (#37117)
* [lens] Dimension panel that generates columns
* Update from review comments
* [lens] Generate esdocs queries from index pattern (#37361)
* [lens] Generate esdocs queries from index pattern
* Remove unused code
* Update yarn.lock from yarn kbn bootstrap
* [Lens] Add basic Lens xy chart suggestions (#37030)
Basic xy chart suggestions
* [Lens] Expression rendering (#37648)
* [Lens] Expression handling (#37876)
* [Lens] Lens/xy config panel (#37391)
Basic xy chart configuration panel
* [Lens] Xy expression building (#37967)
* [Lens] Initialize visualization with datasource api (#38142)
* [lens] Dimension panel lets users select operations and fields individually (#37573)
* [lens] Dimension panel lets users select operations and fields individually
* Split files and add tests
* Fix dimension labeling and add clear button
* Support more aggregations, aggregation nesting, rollups, and clearing
* Fix esaggs expression
* Increase top-level test coverage of dimension panel
* Update from review comments
* [Lens] Rename columns (#38278)
* [Lens] Lens/index pattern drag drop (#37711)
* Basic xy chart suggestions
* Re-apply XY config panel after force merge
* Initial integration of lens drag and drop
* Tweak naming, remove irellevant comment
* Tweaks per Wylie's feedback
* Add xy chart internationalization
Tweak types per Joe's feedback
* Update xy chart i18n implementation
* Fix i18n id
* Add drop tests to the lens index pattern
* improve tests
* [lens] Only allow aggregated dimensions (#38820)
* [lens] Only allow aggregated dimensions
* [lens] Index pattern suggest on drop
* Fully remove value
* Revert "[lens] Index pattern suggest on drop"
This reverts commit 604c6ed68ca394441ddafa662bdfc5f421de300c.
* Fix type errors
* [lens] Suggest on drop (#38848)
* [lens] Index pattern suggest on drop
* Add test for suggestion without date field
* fix merge
* [Lens] Parameter configurations and new dimension config flow (#38863)
* fix eslint failure
* [lens] Fix build by updating saved objects and i18n (#39391)
* [lens] Update location of saved objects code
* Update internatationalization
* Remove added file
* Lens basic metric visualization
* [lens] Fix arguments to esaggs using booleans (#39462)
* [lens] Datatable visualization plugin (#39390)
* [lens] Datatable visualization plugin
* Fix merge issues and add tests
* Update from review
* Fix file locations
* Fix merge issues, localize expression help text
* Add auto-scaling to the lens metric visualization
* Fix unit tests broken by autoscale
* Move autoscale to the new Lens folder
* [lens] Use first suggestion when switching visualizations (#39377)
* [lens] Label each Y axis with its operation label (#39461)
* [lens] Label each Y axis with its operation label
* Remove comment
* Add link to chart issue
* [Lens] Suggestion preview rendering (#39576)
* [Lens] Popover configs (#39565)
* [Lens] Basic layouting (#39587)
* remove datasource public API in suggestions (#39772)
* [Lens] Basic save / load (#39257)
Add basic routing, save, and load to Lens
* [lens] Fix lint error
* [lens] Use node scripts/eslint.js --fix to fix errors
* [lens] Include link to lens from Visualize (#40542)
* [lens] Support stacking in xy visualization (#40546)
* [lens] Support stacking in xy visualization
* Use chart type switcher for stacked and horizontal xy charts
* Clean up remaining isStacked code
* Fix type error
* [Lens] Add xy split series support (#39726)
* Add split series to lens xy chart
* [lens] Lens Filter Ratio (#40196)
* WIP filter ratio
* Fix test issues
* Pass dependencies through plugin like new platform
* Pass props into filter ratio popover editor
* Provide mocks to filter_ratio popover test
* Add another test
* Clean up to prepare for review
* Clean up unnecessary changes
* Respond to review comments
* Fix tests
* [Lens] Terms order direction (#39884)
* fix types
* [Lens] Data panel styling and optimizations (#40787)
Style the data panel (mostly Joe Reuter's doing). Optimize a bunch of the Lens stack.
* Add metric preview icon
* Fix metric vis tests
* Fix metric plugin imports
* Use the operation label as the metric title
* [Lens] Optimize dimension panel flow (#41114)
* [Lens] re-introduce no-explicit-any (#41454)
* [Lens] No results marker (#41450)
* [lens] Support layers for visualizing results of multiple queries (#41290)
* [lens] WIP add support for layers
* [lens] WIP switch to nested tables
* Get basic layering to work
* Load multiple tables and render in one chart
* Fix priority ordering
* Reduce quantity of linting errors
* Ensure that new xy layer state has a split column
* Make the "add" y / split the trailing accessor
* Various fixes for datasource public API and implementation
* Unify datasource deletion and accessor removal
* Fix broken scss
* Fix xy visualization TypeScript errors?
* Build basic suggestions
* Restore save/load and fix typescript bugs
* simplify init routine
* fix save tests
* fix persistence tests
* fix state management tests
* Ensure the data table is aligned to the top
* Add layer support to Lens datatable
* Give xy chart a default layer initially
* Allow deletion of layers in xy charts
* xy: Make split accessor singular
Remove commented code blocks
* Change expression type for lens_merge_tables
* Fix XY chart rendering expression
* Fix type errors relating to `layerId` in table suggestions
* Pass around tables for suggestions with associated layerIds
* fix tests in workspace panel
* fix editor_frame tests
* Fix xy tests, skip inapplicable tests
that will be implemented in a separate PR
* add some tests for multiple datasources and layers
* Suggest that split series comes before X axis in XY chart
* Get datatable suggestion working
* Adjust how xy axis labels are computed
* Datasource suggestions should handle layers and have tests
* Fix linting in XY chart and remove commented code
* Update snapshots from earlier change
* Fix linting errors
* More cleanup
* Remove commented code
* Test the multi-column editor
* XY Visualization does not need to track datasourceId
* Fix various comments
* Remove unused xy prop
Add datasource header to datatable config
* Use operation labels for XY chart
* Adding and removing layers is reflected in the datasource
* rewrote datasource state init
* clean up editor_frame frame api implementation
* clean up editor frame
* [Lens] Embeddable (#41361)
* [lens] Move XY chart config into popover and fix layering (#41927)
* [lens] Move XY chart config into popover and fix layering
* Fix tests
* Update style
* Change wrapping of layer settings popover
* [Lens] Fix bugs in date_histogram and filter ratio (#42046)
* [Lens] Performance improvements (#41784)
* fix type error
* switch default size of terms operation to 3 (#42334)
* [lens] Improve suggestions for split series (#42052)
* [lens] Add chart switcher (#42093)
* solve merge conflicts
* fix test case
* [Lens] Allow only current visualization on field drop in workspace (#42344)
* [Lens] Remove indexpattern id on column (#42429)
* [lens] Implement app-level filtering and time picker (#42031)
* [lens] Implement app-level filtering and time picker
* More integration with filter bar
* Clean up test code and type errors
* Add frame level tests for syncing with app
* Add test coverage for app logic
* Simplify state management from app down
* Fix import errors
* Clarify whether properties are ids or titles for index pattern
* pass new saved object by ref
* add dirty state checking
* Fix tests
* [Lens] Add some tests around document handling in dimension panel (#42670)
* [Lens] Terms operation boolean support (#42817)
* [lens] Minor UX/UI improvements in Lens (#42852)
* Make dimension popover toggle when clicking button
* Without suggestions hide suggestion panel
* Add missing translations (#42921)
* [Lens] Config panel design (#42980)
* Fix up design of config panel
Does not include config popover
* Add metric suggestions, fix tests
* Remove a couple of non-null assertions (#43013)
* Remove a couple of non-null assertions
* Remove orphaned import
* [Lens] Switch indexpattern manually (#42599)
* [Lens] Update frame to put suggestions at the bottom (#42997)
* Back out suggestion changes, in lieu
of Joe's work
* fix type errors
* switch indexpattern on layer if there is only a single empty one (#43079)
* [Lens] Suggest reduced versions of current data table (#42537)
* [Lens] Field formatter support (#38874)
* Fix bugs
* Fix metric autoscale logic
* Register metric as an embeddable
* Fix metric autoscale flicker
* Render mini metric in suggestions panel
* Cache the metric filterOperations function
* fix auto scaling edge cases
* [Lens] Add bucket nesting editor to indexpattern (#42869)
* Modify auto-scale to handle resize events
* use format hints in metric vis
* start cleaning up suggestions
* [Lens] Remove unnecessary fields and indexing from mappings (#43285)
* Tweak metric to only scale down so far, and
scale both the number and the label.
* Fix lens metric tests
* [Lens] Xy scale type (#42142)
* start adding more suggestions
* remove unused imports
* work on suggestions
* work more on suggestions
* work more on suggestions
* work more on suggestions
* [lens] Allow updater function to be used for updating state (#43373)
* [Lens] Lens metric visualization (#39364)
* clean up tests and add new ones
* remove isMetric
* area as default on time dimension
* fix bug in area chart for time
* Fix axis rotation (#43792)
* remove title form layer
* [Lens] Auto date histogram (#43775)
* Add auto date histogram
* Improve documentation and cleanup
* Add tests
* Change test name
* handle state in app
* fix isMetric usages
* fix integration tests
* fix type errors
* fix date handling on submit
* add new suggestion types
* fix test
* do not suggest single tables
* remove unused import
* [Lens] Fix query bar integration (#43865)
* switch order of appending new string column
* resolve merge conflicts
* [Lens] Clean up operations code (#43784)
* fix merge conflicts
* poc implementation
* highlight currently active suggestion and provide button to submit current choice
* [Lens] Functional tests (#44279)
Foundational layer for lens functional tests. Lens-specific page objects are not in this PR.
* [Lens] Add Lens visualizations to Visualize list (#43398)
* [Lens] Suggestion improvements (#43688)
* fix bugs
* [lens] Calculate existence of fields in datasource (#44422)
* [lens] Calculate existence of fields in datasource
* Fix route registration
* Add page object and use existence in functional test
* Simplify layout of filters for index pattern
* Respond to review feedback
* Update class names
* Use new URL constant
* Fix usage of base path
* Fix lint errors
* [Lens ] Preview metric (#43755)
* format filter ratio as percentage (#44625)
* [Lens] Remove datasource suggestion id (#44495)
* [Lens] Make breadcrumbs look and feel like Visualize (#44258)
* [lens] Fix breakage from app-arch movements (#44720)
* Design cleanup
* PR review comments
* fix tests
* small cleanup
* remove unused import
* [lens] Fix type error in test from merge
* [lens] Fix registration of embeddable (#45171)
* keep references stable if table is just extended and add tests
* changed label for stack/unstack
* fix test
* [Lens] Functional tests (#44814)
Basic functional tests for Lens, by no means comprehensive. This is more of a smokescreen test of some normal use cases.
* [lens] Add Lens to CODEOWNERS (#45296)
* [lens] Fix visualization alias registration
* [lens] Fix usage of EUI after typescript upgrade (#45404)
* [lens] Fix usage of EUI after typescript upgrade
* Use local fix instead of workaround
* fix bug and address reviews
* Fix frame tests
2019-09-19 00:28:26 +02:00
|
|
|
/**
|
2020-04-22 23:36:36 +02:00
|
|
|
* Expression to render a preview version of the chart in very constrained space.
|
[Lens] Transient suggestions (#44234)
* [lens] Initial Commit (#35627)
* [visualization editor] Initial Commit
* [lens] Add more complete initial state
* [lens] Fix type issues
* [lens] Remove feature control
* [lens] Bring back feature control and add tests
* [lens] Update plugin structure and naming per comments
* replace any usage by safe casting
* [lens] Respond to review comments
* [lens] Remove unused EditorFrameState type
* [lens] Initial state for IndexPatternDatasource (#36052)
* [lens] Add first tests to indexpattern data source
* Respond to review comments
* Fix type definitions
* [lens] Editor frame initializes datasources and visualizations (#36060)
* [lens] Editor frame initializes datasources and visualizations
* Respond to review comments
* Fix build issues
* Fix state management issue
* [lens][draft] Lens/drag drop (#36268)
Add basic drag / drop component to Lens
* remove local package (#36456)
* [lens] Native renderer (#36165)
* Add nativerenderer component
* Use native renderer in app and editor frame
* [Lens] No explicit any (#36515)
* [Lens] Implement basic editor frame state handling (#36443)
* [lens] Load index patterns and render in data panel (#36463)
* [lens] Editor frame initializes datasources and visualizations
* Respond to review comments
* Fix build issues
* remove local package
* [lens] Load index patterns into data source
* Redo types for Index Pattern Datasource
* Fix one more type
* Respond to review comments
* [draft] Lens/line chart renderer (#36827)
Expression logic for the Lens xy chart.
* [lens] Index pattern data panel (initial) (#37015)
* [lens] Index pattern switcher
* Respond to review comments
* [Lens] Editor state 2 (#36513)
* [lens] Dimension panel that generates columns (#37117)
* [lens] Dimension panel that generates columns
* Update from review comments
* [lens] Generate esdocs queries from index pattern (#37361)
* [lens] Generate esdocs queries from index pattern
* Remove unused code
* Update yarn.lock from yarn kbn bootstrap
* [Lens] Add basic Lens xy chart suggestions (#37030)
Basic xy chart suggestions
* [Lens] Expression rendering (#37648)
* [Lens] Expression handling (#37876)
* [Lens] Lens/xy config panel (#37391)
Basic xy chart configuration panel
* [Lens] Xy expression building (#37967)
* [Lens] Initialize visualization with datasource api (#38142)
* [lens] Dimension panel lets users select operations and fields individually (#37573)
* [lens] Dimension panel lets users select operations and fields individually
* Split files and add tests
* Fix dimension labeling and add clear button
* Support more aggregations, aggregation nesting, rollups, and clearing
* Fix esaggs expression
* Increase top-level test coverage of dimension panel
* Update from review comments
* [Lens] Rename columns (#38278)
* [Lens] Lens/index pattern drag drop (#37711)
* Basic xy chart suggestions
* Re-apply XY config panel after force merge
* Initial integration of lens drag and drop
* Tweak naming, remove irellevant comment
* Tweaks per Wylie's feedback
* Add xy chart internationalization
Tweak types per Joe's feedback
* Update xy chart i18n implementation
* Fix i18n id
* Add drop tests to the lens index pattern
* improve tests
* [lens] Only allow aggregated dimensions (#38820)
* [lens] Only allow aggregated dimensions
* [lens] Index pattern suggest on drop
* Fully remove value
* Revert "[lens] Index pattern suggest on drop"
This reverts commit 604c6ed68ca394441ddafa662bdfc5f421de300c.
* Fix type errors
* [lens] Suggest on drop (#38848)
* [lens] Index pattern suggest on drop
* Add test for suggestion without date field
* fix merge
* [Lens] Parameter configurations and new dimension config flow (#38863)
* fix eslint failure
* [lens] Fix build by updating saved objects and i18n (#39391)
* [lens] Update location of saved objects code
* Update internatationalization
* Remove added file
* Lens basic metric visualization
* [lens] Fix arguments to esaggs using booleans (#39462)
* [lens] Datatable visualization plugin (#39390)
* [lens] Datatable visualization plugin
* Fix merge issues and add tests
* Update from review
* Fix file locations
* Fix merge issues, localize expression help text
* Add auto-scaling to the lens metric visualization
* Fix unit tests broken by autoscale
* Move autoscale to the new Lens folder
* [lens] Use first suggestion when switching visualizations (#39377)
* [lens] Label each Y axis with its operation label (#39461)
* [lens] Label each Y axis with its operation label
* Remove comment
* Add link to chart issue
* [Lens] Suggestion preview rendering (#39576)
* [Lens] Popover configs (#39565)
* [Lens] Basic layouting (#39587)
* remove datasource public API in suggestions (#39772)
* [Lens] Basic save / load (#39257)
Add basic routing, save, and load to Lens
* [lens] Fix lint error
* [lens] Use node scripts/eslint.js --fix to fix errors
* [lens] Include link to lens from Visualize (#40542)
* [lens] Support stacking in xy visualization (#40546)
* [lens] Support stacking in xy visualization
* Use chart type switcher for stacked and horizontal xy charts
* Clean up remaining isStacked code
* Fix type error
* [Lens] Add xy split series support (#39726)
* Add split series to lens xy chart
* [lens] Lens Filter Ratio (#40196)
* WIP filter ratio
* Fix test issues
* Pass dependencies through plugin like new platform
* Pass props into filter ratio popover editor
* Provide mocks to filter_ratio popover test
* Add another test
* Clean up to prepare for review
* Clean up unnecessary changes
* Respond to review comments
* Fix tests
* [Lens] Terms order direction (#39884)
* fix types
* [Lens] Data panel styling and optimizations (#40787)
Style the data panel (mostly Joe Reuter's doing). Optimize a bunch of the Lens stack.
* Add metric preview icon
* Fix metric vis tests
* Fix metric plugin imports
* Use the operation label as the metric title
* [Lens] Optimize dimension panel flow (#41114)
* [Lens] re-introduce no-explicit-any (#41454)
* [Lens] No results marker (#41450)
* [lens] Support layers for visualizing results of multiple queries (#41290)
* [lens] WIP add support for layers
* [lens] WIP switch to nested tables
* Get basic layering to work
* Load multiple tables and render in one chart
* Fix priority ordering
* Reduce quantity of linting errors
* Ensure that new xy layer state has a split column
* Make the "add" y / split the trailing accessor
* Various fixes for datasource public API and implementation
* Unify datasource deletion and accessor removal
* Fix broken scss
* Fix xy visualization TypeScript errors?
* Build basic suggestions
* Restore save/load and fix typescript bugs
* simplify init routine
* fix save tests
* fix persistence tests
* fix state management tests
* Ensure the data table is aligned to the top
* Add layer support to Lens datatable
* Give xy chart a default layer initially
* Allow deletion of layers in xy charts
* xy: Make split accessor singular
Remove commented code blocks
* Change expression type for lens_merge_tables
* Fix XY chart rendering expression
* Fix type errors relating to `layerId` in table suggestions
* Pass around tables for suggestions with associated layerIds
* fix tests in workspace panel
* fix editor_frame tests
* Fix xy tests, skip inapplicable tests
that will be implemented in a separate PR
* add some tests for multiple datasources and layers
* Suggest that split series comes before X axis in XY chart
* Get datatable suggestion working
* Adjust how xy axis labels are computed
* Datasource suggestions should handle layers and have tests
* Fix linting in XY chart and remove commented code
* Update snapshots from earlier change
* Fix linting errors
* More cleanup
* Remove commented code
* Test the multi-column editor
* XY Visualization does not need to track datasourceId
* Fix various comments
* Remove unused xy prop
Add datasource header to datatable config
* Use operation labels for XY chart
* Adding and removing layers is reflected in the datasource
* rewrote datasource state init
* clean up editor_frame frame api implementation
* clean up editor frame
* [Lens] Embeddable (#41361)
* [lens] Move XY chart config into popover and fix layering (#41927)
* [lens] Move XY chart config into popover and fix layering
* Fix tests
* Update style
* Change wrapping of layer settings popover
* [Lens] Fix bugs in date_histogram and filter ratio (#42046)
* [Lens] Performance improvements (#41784)
* fix type error
* switch default size of terms operation to 3 (#42334)
* [lens] Improve suggestions for split series (#42052)
* [lens] Add chart switcher (#42093)
* solve merge conflicts
* fix test case
* [Lens] Allow only current visualization on field drop in workspace (#42344)
* [Lens] Remove indexpattern id on column (#42429)
* [lens] Implement app-level filtering and time picker (#42031)
* [lens] Implement app-level filtering and time picker
* More integration with filter bar
* Clean up test code and type errors
* Add frame level tests for syncing with app
* Add test coverage for app logic
* Simplify state management from app down
* Fix import errors
* Clarify whether properties are ids or titles for index pattern
* pass new saved object by ref
* add dirty state checking
* Fix tests
* [Lens] Add some tests around document handling in dimension panel (#42670)
* [Lens] Terms operation boolean support (#42817)
* [lens] Minor UX/UI improvements in Lens (#42852)
* Make dimension popover toggle when clicking button
* Without suggestions hide suggestion panel
* Add missing translations (#42921)
* [Lens] Config panel design (#42980)
* Fix up design of config panel
Does not include config popover
* Add metric suggestions, fix tests
* Remove a couple of non-null assertions (#43013)
* Remove a couple of non-null assertions
* Remove orphaned import
* [Lens] Switch indexpattern manually (#42599)
* [Lens] Update frame to put suggestions at the bottom (#42997)
* Back out suggestion changes, in lieu
of Joe's work
* fix type errors
* switch indexpattern on layer if there is only a single empty one (#43079)
* [Lens] Suggest reduced versions of current data table (#42537)
* [Lens] Field formatter support (#38874)
* Fix bugs
* Fix metric autoscale logic
* Register metric as an embeddable
* Fix metric autoscale flicker
* Render mini metric in suggestions panel
* Cache the metric filterOperations function
* fix auto scaling edge cases
* [Lens] Add bucket nesting editor to indexpattern (#42869)
* Modify auto-scale to handle resize events
* use format hints in metric vis
* start cleaning up suggestions
* [Lens] Remove unnecessary fields and indexing from mappings (#43285)
* Tweak metric to only scale down so far, and
scale both the number and the label.
* Fix lens metric tests
* [Lens] Xy scale type (#42142)
* start adding more suggestions
* remove unused imports
* work on suggestions
* work more on suggestions
* work more on suggestions
* work more on suggestions
* [lens] Allow updater function to be used for updating state (#43373)
* [Lens] Lens metric visualization (#39364)
* clean up tests and add new ones
* remove isMetric
* area as default on time dimension
* fix bug in area chart for time
* Fix axis rotation (#43792)
* remove title form layer
* [Lens] Auto date histogram (#43775)
* Add auto date histogram
* Improve documentation and cleanup
* Add tests
* Change test name
* handle state in app
* fix isMetric usages
* fix integration tests
* fix type errors
* fix date handling on submit
* add new suggestion types
* fix test
* do not suggest single tables
* remove unused import
* [Lens] Fix query bar integration (#43865)
* switch order of appending new string column
* resolve merge conflicts
* [Lens] Clean up operations code (#43784)
* fix merge conflicts
* poc implementation
* highlight currently active suggestion and provide button to submit current choice
* [Lens] Functional tests (#44279)
Foundational layer for lens functional tests. Lens-specific page objects are not in this PR.
* [Lens] Add Lens visualizations to Visualize list (#43398)
* [Lens] Suggestion improvements (#43688)
* fix bugs
* [lens] Calculate existence of fields in datasource (#44422)
* [lens] Calculate existence of fields in datasource
* Fix route registration
* Add page object and use existence in functional test
* Simplify layout of filters for index pattern
* Respond to review feedback
* Update class names
* Use new URL constant
* Fix usage of base path
* Fix lint errors
* [Lens ] Preview metric (#43755)
* format filter ratio as percentage (#44625)
* [Lens] Remove datasource suggestion id (#44495)
* [Lens] Make breadcrumbs look and feel like Visualize (#44258)
* [lens] Fix breakage from app-arch movements (#44720)
* Design cleanup
* PR review comments
* fix tests
* small cleanup
* remove unused import
* [lens] Fix type error in test from merge
* [lens] Fix registration of embeddable (#45171)
* keep references stable if table is just extended and add tests
* changed label for stack/unstack
* fix test
* [Lens] Functional tests (#44814)
Basic functional tests for Lens, by no means comprehensive. This is more of a smokescreen test of some normal use cases.
* [lens] Add Lens to CODEOWNERS (#45296)
* [lens] Fix visualization alias registration
* [lens] Fix usage of EUI after typescript upgrade (#45404)
* [lens] Fix usage of EUI after typescript upgrade
* Use local fix instead of workaround
* fix bug and address reviews
* Fix frame tests
2019-09-19 00:28:26 +02:00
|
|
|
* If there is no expression provided, the preview icon is used.
|
|
|
|
*/
|
2020-08-21 18:08:25 +02:00
|
|
|
toPreviewExpression?: (
|
|
|
|
state: T,
|
|
|
|
datasourceLayers: Record<string, DatasourcePublicAPI>
|
2020-12-10 15:40:50 +01:00
|
|
|
) => ExpressionAstExpression | string | null;
|
2020-11-04 18:28:00 +01:00
|
|
|
/**
|
|
|
|
* The frame will call this function on all visualizations at few stages (pre-build/build error) in order
|
|
|
|
* to provide more context to the error and show it to the user
|
|
|
|
*/
|
2021-02-15 13:00:31 +01:00
|
|
|
getErrorMessages: (state: T) => Array<{ shortMessage: string; longMessage: string }> | undefined;
|
2020-12-02 19:55:58 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The frame calls this function to display warnings about visualization
|
|
|
|
*/
|
|
|
|
getWarningMessages?: (state: T, frame: FramePublicAPI) => React.ReactNode[] | undefined;
|
2020-12-15 12:37:59 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* On Edit events the frame will call this to know what's going to be the next visualization state
|
|
|
|
*/
|
|
|
|
onEditAction?: (state: T, event: LensEditEvent<LensEditSupportedActions>) => T;
|
2019-09-17 20:57:53 +02:00
|
|
|
}
|
2020-05-15 12:01:27 +02:00
|
|
|
|
|
|
|
export interface LensFilterEvent {
|
|
|
|
name: 'filter';
|
2021-01-05 10:11:05 +01:00
|
|
|
data: ValueClickContext['data'];
|
2020-05-15 12:01:27 +02:00
|
|
|
}
|
2020-12-14 13:28:23 +01:00
|
|
|
|
2020-05-15 12:01:27 +02:00
|
|
|
export interface LensBrushEvent {
|
|
|
|
name: 'brush';
|
2021-01-05 10:11:05 +01:00
|
|
|
data: RangeSelectContext['data'];
|
2020-05-15 12:01:27 +02:00
|
|
|
}
|
|
|
|
|
2020-12-15 12:37:59 +01:00
|
|
|
// Use same technique as TriggerContext
|
|
|
|
interface LensEditContextMapping {
|
|
|
|
[LENS_EDIT_SORT_ACTION]: LensSortActionData;
|
2021-01-29 12:09:26 +01:00
|
|
|
[LENS_EDIT_RESIZE_ACTION]: LensResizeActionData;
|
2021-02-04 16:22:09 +01:00
|
|
|
[LENS_TOGGLE_ACTION]: LensToggleActionData;
|
2020-12-15 12:37:59 +01:00
|
|
|
}
|
|
|
|
type LensEditSupportedActions = keyof LensEditContextMapping;
|
|
|
|
|
|
|
|
export type LensEditPayload<T extends LensEditSupportedActions> = {
|
|
|
|
action: T;
|
|
|
|
} & LensEditContextMapping[T];
|
|
|
|
|
|
|
|
type EditPayloadContext<T> = T extends LensEditSupportedActions ? LensEditPayload<T> : never;
|
|
|
|
|
|
|
|
export interface LensEditEvent<T> {
|
|
|
|
name: 'edit';
|
|
|
|
data: EditPayloadContext<T>;
|
|
|
|
}
|
2020-12-14 13:28:23 +01:00
|
|
|
export interface LensTableRowContextMenuEvent {
|
|
|
|
name: 'tableRowContextMenuClick';
|
2021-01-05 10:11:05 +01:00
|
|
|
data: RowClickContext['data'];
|
2020-12-14 13:28:23 +01:00
|
|
|
}
|
|
|
|
|
2020-05-15 12:01:27 +02:00
|
|
|
export function isLensFilterEvent(event: ExpressionRendererEvent): event is LensFilterEvent {
|
|
|
|
return event.name === 'filter';
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isLensBrushEvent(event: ExpressionRendererEvent): event is LensBrushEvent {
|
|
|
|
return event.name === 'brush';
|
|
|
|
}
|
|
|
|
|
2020-12-15 12:37:59 +01:00
|
|
|
export function isLensEditEvent<T extends LensEditSupportedActions>(
|
|
|
|
event: ExpressionRendererEvent
|
|
|
|
): event is LensEditEvent<T> {
|
|
|
|
return event.name === 'edit';
|
|
|
|
}
|
|
|
|
|
2020-12-14 13:28:23 +01:00
|
|
|
export function isLensTableRowContextMenuClickEvent(
|
|
|
|
event: ExpressionRendererEvent
|
|
|
|
): event is LensBrushEvent {
|
|
|
|
return event.name === 'tableRowContextMenuClick';
|
|
|
|
}
|
|
|
|
|
2020-05-15 12:01:27 +02:00
|
|
|
/**
|
|
|
|
* Expression renderer handlers specifically for lens renderers. This is a narrowed down
|
|
|
|
* version of the general render handlers, specifying supported event types. If this type is
|
|
|
|
* used, dispatched events will be handled correctly.
|
|
|
|
*/
|
|
|
|
export interface ILensInterpreterRenderHandlers extends IInterpreterRenderHandlers {
|
2020-12-15 12:37:59 +01:00
|
|
|
event: (
|
|
|
|
event:
|
|
|
|
| LensFilterEvent
|
|
|
|
| LensBrushEvent
|
|
|
|
| LensEditEvent<LensEditSupportedActions>
|
|
|
|
| LensTableRowContextMenuEvent
|
|
|
|
) => void;
|
2020-05-15 12:01:27 +02:00
|
|
|
}
|