66
77import { Ast } from '@kbn/interpreter/common' ;
88import { i18n } from '@kbn/i18n' ;
9- import { SuggestionRequest , Visualization , VisualizationSuggestion , Operation } from '../types' ;
9+ import {
10+ SuggestionRequest ,
11+ Visualization ,
12+ VisualizationSuggestion ,
13+ Operation ,
14+ DatasourcePublicAPI ,
15+ } from '../types' ;
1016import { LensIconChartDatatable } from '../assets/chart_datatable' ;
1117
1218export interface LayerState {
@@ -128,16 +134,13 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
128134 } ,
129135
130136 getConfiguration ( { state, frame, layerId } ) {
131- const layer = state . layers . find ( ( l ) => l . layerId === layerId ) ;
132- if ( ! layer ) {
137+ const { sortedColumns, datasource } =
138+ getDataSourceAndSortedColumns ( state , frame . datasourceLayers , layerId ) || { } ;
139+
140+ if ( ! sortedColumns ) {
133141 return { groups : [ ] } ;
134142 }
135143
136- const datasource = frame . datasourceLayers [ layer . layerId ] ;
137- const originalOrder = datasource . getTableSpec ( ) . map ( ( { columnId } ) => columnId ) ;
138- // When we add a column it could be empty, and therefore have no order
139- const sortedColumns = Array . from ( new Set ( originalOrder . concat ( layer . columns ) ) ) ;
140-
141144 return {
142145 groups : [
143146 {
@@ -146,7 +149,9 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
146149 defaultMessage : 'Break down by' ,
147150 } ) ,
148151 layerId : state . layers [ 0 ] . layerId ,
149- accessors : sortedColumns . filter ( ( c ) => datasource . getOperationForColumnId ( c ) ?. isBucketed ) ,
152+ accessors : sortedColumns . filter (
153+ ( c ) => datasource ! . getOperationForColumnId ( c ) ?. isBucketed
154+ ) ,
150155 supportsMoreColumns : true ,
151156 filterOperations : ( op ) => op . isBucketed ,
152157 dataTestSubj : 'lnsDatatable_column' ,
@@ -158,7 +163,7 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
158163 } ) ,
159164 layerId : state . layers [ 0 ] . layerId ,
160165 accessors : sortedColumns . filter (
161- ( c ) => ! datasource . getOperationForColumnId ( c ) ?. isBucketed
166+ ( c ) => ! datasource ! . getOperationForColumnId ( c ) ?. isBucketed
162167 ) ,
163168 supportsMoreColumns : true ,
164169 filterOperations : ( op ) => ! op . isBucketed ,
@@ -194,14 +199,19 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
194199 } ;
195200 } ,
196201
197- toExpression ( state , datasourceLayers , { title, description } = { } ) : Ast {
198- const layer = state . layers [ 0 ] ;
199- const datasource = datasourceLayers [ layer . layerId ] ;
200- const originalOrder = datasource . getTableSpec ( ) . map ( ( { columnId } ) => columnId ) ;
201- // When we add a column it could be empty, and therefore have no order
202- const sortedColumns = Array . from ( new Set ( originalOrder . concat ( layer . columns ) ) ) ;
203- const operations = sortedColumns
204- . map ( ( columnId ) => ( { columnId, operation : datasource . getOperationForColumnId ( columnId ) } ) )
202+ toExpression ( state , datasourceLayers , { title, description } = { } ) : Ast | null {
203+ const { sortedColumns, datasource } =
204+ getDataSourceAndSortedColumns ( state , datasourceLayers , state . layers [ 0 ] . layerId ) || { } ;
205+
206+ if (
207+ sortedColumns ?. length &&
208+ sortedColumns . filter ( ( c ) => ! datasource ! . getOperationForColumnId ( c ) ?. isBucketed ) . length === 0
209+ ) {
210+ return null ;
211+ }
212+
213+ const operations = sortedColumns !
214+ . map ( ( columnId ) => ( { columnId, operation : datasource ! . getOperationForColumnId ( columnId ) } ) )
205215 . filter ( ( o ) : o is { columnId : string ; operation : Operation } => ! ! o . operation ) ;
206216
207217 return {
@@ -232,4 +242,24 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
232242 ] ,
233243 } ;
234244 } ,
245+
246+ getErrorMessages ( state , frame ) {
247+ return undefined ;
248+ } ,
235249} ;
250+
251+ function getDataSourceAndSortedColumns (
252+ state : DatatableVisualizationState ,
253+ datasourceLayers : Record < string , DatasourcePublicAPI > ,
254+ layerId : string
255+ ) {
256+ const layer = state . layers . find ( ( l : LayerState ) => l . layerId === layerId ) ;
257+ if ( ! layer ) {
258+ return undefined ;
259+ }
260+ const datasource = datasourceLayers [ layer . layerId ] ;
261+ const originalOrder = datasource . getTableSpec ( ) . map ( ( { columnId } ) => columnId ) ;
262+ // When we add a column it could be empty, and therefore have no order
263+ const sortedColumns = Array . from ( new Set ( originalOrder . concat ( layer . columns ) ) ) ;
264+ return { datasource, sortedColumns } ;
265+ }
0 commit comments