diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx index 5a490cdd2c38e7..65119d3978ee6b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx @@ -43,8 +43,7 @@ export const cardinalityOperation: OperationDefinition { - const c = column as CardinalityIndexPatternColumn; - const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField); + const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField); return Boolean( newField && @@ -76,13 +75,13 @@ export const cardinalityOperation: OperationDefinition { return { - ...(oldColumn as CardinalityIndexPatternColumn), + ...oldColumn, label: ofName(field.displayName), sourceField: field.name, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx index de5b50f5be9085..cdf1a6b7604930 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx @@ -27,7 +27,7 @@ export const countOperation: OperationDefinition { return { - ...(oldColumn as CountIndexPatternColumn), + ...oldColumn, label: field.displayName, sourceField: field.name, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx index 911c40e84edd9b..185f44405bb4b1 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx @@ -81,8 +81,7 @@ export const dateHistogramOperation: OperationDefinition< }; }, isTransferable: (column, newIndexPattern) => { - const c = column as DateHistogramIndexPatternColumn; - const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField); + const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField); return Boolean( newField && @@ -92,8 +91,7 @@ export const dateHistogramOperation: OperationDefinition< ); }, transfer: (column, newIndexPattern) => { - const col = column as DateHistogramIndexPatternColumn; - const newField = newIndexPattern.fields.find((field) => field.name === col.sourceField); + const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField); if ( newField && newField.aggregationRestrictions && @@ -102,9 +100,9 @@ export const dateHistogramOperation: OperationDefinition< const restrictions = newField.aggregationRestrictions.date_histogram; return { - ...col, + ...column, params: { - ...col.params, + ...column.params, timeZone: restrictions.time_zone, // TODO this rewrite logic is simplified - if the current interval is a multiple of // the restricted interval, we could carry it over directly. However as the current @@ -115,28 +113,27 @@ export const dateHistogramOperation: OperationDefinition< }; } - return col; + return column; }, onFieldChange: (oldColumn, indexPattern, field) => { return { - ...(oldColumn as DateHistogramIndexPatternColumn), + ...oldColumn, label: field.displayName, sourceField: field.name, }; }, toEsAggsConfig: (column, columnId, indexPattern) => { - const c = column as DateHistogramIndexPatternColumn; - const usedField = indexPattern.fields.find((field) => field.name === c.sourceField); + const usedField = indexPattern.fields.find((field) => field.name === column.sourceField); return { id: columnId, enabled: true, type: 'date_histogram', schema: 'segment', params: { - field: c.sourceField, - time_zone: c.params.timeZone, + field: column.sourceField, + time_zone: column.params.timeZone, useNormalizedEsInterval: !usedField || !usedField.aggregationRestrictions?.date_histogram, - interval: c.params.interval, + interval: column.params.interval, drop_partials: false, min_doc_count: 0, extended_bounds: {}, @@ -144,16 +141,15 @@ export const dateHistogramOperation: OperationDefinition< }; }, paramEditor: ({ state, setState, currentColumn, layerId, dateRange, data }) => { - const column = currentColumn as DateHistogramIndexPatternColumn; const field = - column && + currentColumn && state.indexPatterns[state.layers[layerId].indexPatternId].fields.find( - (currentField) => currentField.name === column.sourceField + (currentField) => currentField.name === currentColumn.sourceField ); const intervalIsRestricted = field!.aggregationRestrictions && field!.aggregationRestrictions.date_histogram; - const interval = parseInterval(column.params.interval); + const interval = parseInterval(currentColumn.params.interval); // We force the interval value to 1 if it's empty, since that is the ES behavior, // and the isValidInterval function doesn't handle the empty case properly. Fixing @@ -194,13 +190,13 @@ export const dateHistogramOperation: OperationDefinition< label={i18n.translate('xpack.lens.indexPattern.dateHistogram.autoInterval', { defaultMessage: 'Customize time interval', })} - checked={column.params.interval !== autoInterval} + checked={currentColumn.params.interval !== autoInterval} onChange={onChangeAutoInterval} compressed /> )} - {column.params.interval !== autoInterval && ( + {currentColumn.params.interval !== autoInterval && ( ) : ( diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx index 8dfa548cd62a78..ad0b9f2dbb0ab0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx @@ -112,7 +112,7 @@ export const filtersOperation: OperationDefinition { - const validFilters = (column as FiltersIndexPatternColumn).params.filters?.filter((f: Filter) => + const validFilters = column.params.filters?.filter((f: Filter) => isQueryValid(f.input, indexPattern) ); return { @@ -128,7 +128,7 @@ export const filtersOperation: OperationDefinition { const indexPattern = state.indexPatterns[state.layers[layerId].indexPatternId]; - const filters = (currentColumn as FiltersIndexPatternColumn).params.filters; + const filters = currentColumn.params.filters; const setFilters = (newFilters: Filter[]) => setState( diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index 75d22bf6c40eaf..57b439c5268a04 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -73,8 +73,8 @@ export { countOperation } from './count'; /** * Properties passed to the operation-specific part of the popover editor */ -export interface ParamEditorProps { - currentColumn: IndexPatternColumn; +export interface ParamEditorProps { + currentColumn: C; state: IndexPatternPrivateState; setState: StateSetter; columnId: string; @@ -107,34 +107,30 @@ interface BaseOperationDefinitionProps { * return an updated column. If not implemented, the `id` function is used instead. */ onOtherColumnChanged?: ( - currentColumn: IndexPatternColumn, + currentColumn: C, columns: Partial> ) => C; /** * React component for operation specific settings shown in the popover editor */ - paramEditor?: React.ComponentType; + paramEditor?: React.ComponentType>; /** * Function turning a column into an agg config passed to the `esaggs` function * together with the agg configs returned from other columns. */ - toEsAggsConfig: ( - column: IndexPatternColumn, - columnId: string, - indexPattern: IndexPattern - ) => unknown; + toEsAggsConfig: (column: C, columnId: string, indexPattern: IndexPattern) => unknown; /** * Returns true if the `column` can also be used on `newIndexPattern`. * If this function returns false, the column is removed when switching index pattern * for a layer */ - isTransferable: (column: IndexPatternColumn, newIndexPattern: IndexPattern) => boolean; + isTransferable: (column: C, newIndexPattern: IndexPattern) => boolean; /** * Transfering a column to another index pattern. This can be used to * adjust operation specific settings such as reacting to aggregation restrictions * present on the new index pattern. */ - transfer?: (column: IndexPatternColumn, newIndexPattern: IndexPattern) => C; + transfer?: (column: C, newIndexPattern: IndexPattern) => C; } interface BaseBuildColumnArgs { @@ -174,7 +170,8 @@ interface FieldBasedOperationDefinition { buildColumn: ( arg: BaseBuildColumnArgs & { field: IndexPatternField; - previousColumn?: IndexPatternColumn; + // previousColumn?: IndexPatternColumn; + previousColumn?: C; } ) => C; /** @@ -194,7 +191,8 @@ interface FieldBasedOperationDefinition { * @param field The field that the user changed to. */ onFieldChange: ( - oldColumn: FieldBasedIndexPatternColumn, + // oldColumn: FieldBasedIndexPatternColumn, + oldColumn: C, indexPattern: IndexPattern, field: IndexPatternField ) => C; @@ -229,10 +227,6 @@ export type GenericOperationDefinition = | OperationDefinition | OperationDefinition; -export type OperationTypeFromDefinition< - GenericOperationDefinition -> = GenericOperationDefinition extends BaseOperationDefinitionProps ? P : never; - /** * List of all available operation definitions */ @@ -249,7 +243,11 @@ export const operationDefinitions = internalOperationDefinitions as GenericOpera * (e.g. `import { termsOperation } from './operations/definitions'`). This map is * intended to be used in situations where the operation type is not known during compile time. */ -export const operationDefinitionMap = internalOperationDefinitions.reduce( +export const operationDefinitionMap: Record< + string, + GenericOperationDefinition +> = internalOperationDefinitions.reduce( (definitionMap, definition) => ({ ...definitionMap, [definition.type]: definition }), - {} as Record + // {} as Record + {} ); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx index b9bffd1fb94068..c02f7bcb7d2cda 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx @@ -43,8 +43,7 @@ function buildMetricOperation>({ } }, isTransferable: (column, newIndexPattern) => { - const c = column as T; - const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField); + const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField); return Boolean( newField && @@ -77,7 +76,7 @@ function buildMetricOperation>({ type: column.operationType, schema: 'metric', params: { - field: (column as T).sourceField, + field: column.sourceField, missing: 0, }, }), diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx index 530c2e962759b8..1971fb2875bed5 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx @@ -76,12 +76,13 @@ function getEsAggsParams({ sourceField, params }: RangeIndexPatternColumn) { }; } -export const rangeOperation: OperationDefinition = { +export const rangeOperation: OperationDefinition = { type: 'range', displayName: i18n.translate('xpack.lens.indexPattern.ranges', { defaultMessage: 'Ranges', }), priority: 4, // Higher than terms, so numbers get histogram + input: 'field', getPossibleOperationForField: ({ aggregationRestrictions, aggregatable, type }) => { if ( type === 'number' && diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx index 4971019d1973f2..c147029bbd3c77 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx @@ -65,8 +65,7 @@ export const termsOperation: OperationDefinition { - const c = column as TermsIndexPatternColumn; - const newField = newIndexPattern.fields.find((field) => field.name === c.sourceField); + const newField = newIndexPattern.fields.find((field) => field.name === column.sourceField); return Boolean( newField && @@ -98,17 +97,17 @@ export const termsOperation: OperationDefinition { - const c = column as TermsIndexPatternColumn; return { id: columnId, enabled: true, type: 'terms', schema: 'segment', params: { - field: c.sourceField, - orderBy: c.params.orderBy.type === 'alphabetical' ? '_key' : c.params.orderBy.columnId, - order: c.params.orderDirection, - size: c.params.size, + field: column.sourceField, + orderBy: + column.params.orderBy.type === 'alphabetical' ? '_key' : column.params.orderBy.columnId, + order: column.params.orderDirection, + size: column.params.size, otherBucket: false, otherBucketLabel: 'Other', missingBucket: false, @@ -118,31 +117,29 @@ export const termsOperation: OperationDefinition { return { - ...(oldColumn as TermsIndexPatternColumn), + ...oldColumn, label: ofName(field.displayName), sourceField: field.name, }; }, onOtherColumnChanged: (currentColumn, columns) => { - const column = currentColumn as TermsIndexPatternColumn; - if (column.params.orderBy.type === 'column') { + if (currentColumn.params.orderBy.type === 'column') { // check whether the column is still there and still a metric - const columnSortedBy = columns[column.params.orderBy.columnId]; + const columnSortedBy = columns[currentColumn.params.orderBy.columnId]; if (!columnSortedBy || !isSortableByColumn(columnSortedBy)) { return { - ...column, + ...currentColumn, params: { - ...column.params, + ...currentColumn.params, orderBy: { type: 'alphabetical' }, orderDirection: 'asc', }, }; } } - return column; + return currentColumn; }, paramEditor: ({ state, setState, currentColumn, layerId }) => { - const col = currentColumn as TermsIndexPatternColumn; const SEPARATOR = '$$$'; function toValue(orderBy: TermsIndexPatternColumn['params']['orderBy']) { if (orderBy.type === 'alphabetical') { @@ -189,7 +186,7 @@ export const termsOperation: OperationDefinition) => setState( updateColumnParam({ @@ -263,7 +260,7 @@ export const termsOperation: OperationDefinition) => setState( updateColumnParam({