| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | // Libraries
 | 
					
						
							|  |  |  | import React, { PureComponent } from 'react'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Types
 | 
					
						
							| 
									
										
										
										
											2021-09-15 23:26:23 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |   CoreApp, | 
					
						
							|  |  |  |   DataQuery, | 
					
						
							|  |  |  |   DataSourceInstanceSettings, | 
					
						
							|  |  |  |   EventBusExtended, | 
					
						
							|  |  |  |   HistoryItem, | 
					
						
							|  |  |  |   PanelData, | 
					
						
							|  |  |  | } from '@grafana/data'; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | import { QueryEditorRow } from './QueryEditorRow'; | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  | import { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd'; | 
					
						
							| 
									
										
										
										
											2021-04-29 21:10:14 +08:00
										 |  |  | import { getDataSourceSrv } from '@grafana/runtime'; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | interface Props { | 
					
						
							|  |  |  |   // The query configuration
 | 
					
						
							|  |  |  |   queries: DataQuery[]; | 
					
						
							| 
									
										
										
										
											2020-12-04 21:24:55 +08:00
										 |  |  |   dsSettings: DataSourceInstanceSettings; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Query editing
 | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  |   onQueriesChange: (queries: DataQuery[]) => void; | 
					
						
							|  |  |  |   onAddQuery: (query: DataQuery) => void; | 
					
						
							|  |  |  |   onRunQueries: () => void; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Query Response Data
 | 
					
						
							|  |  |  |   data: PanelData; | 
					
						
							| 
									
										
										
										
											2021-09-15 23:26:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Misc
 | 
					
						
							|  |  |  |   app?: CoreApp; | 
					
						
							|  |  |  |   history?: Array<HistoryItem<DataQuery>>; | 
					
						
							|  |  |  |   eventBus?: EventBusExtended; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export class QueryEditorRows extends PureComponent<Props> { | 
					
						
							|  |  |  |   onRemoveQuery = (query: DataQuery) => { | 
					
						
							| 
									
										
										
										
											2021-01-20 14:59:48 +08:00
										 |  |  |     this.props.onQueriesChange(this.props.queries.filter((item) => item !== query)); | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   onChangeQuery(query: DataQuery, index: number) { | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  |     const { queries, onQueriesChange } = this.props; | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // update query in array
 | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  |     onQueriesChange( | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  |       queries.map((item, itemIndex) => { | 
					
						
							|  |  |  |         if (itemIndex === index) { | 
					
						
							|  |  |  |           return query; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return item; | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-29 21:10:14 +08:00
										 |  |  |   onDataSourceChange(dataSource: DataSourceInstanceSettings, index: number) { | 
					
						
							|  |  |  |     const { queries, onQueriesChange } = this.props; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     onQueriesChange( | 
					
						
							|  |  |  |       queries.map((item, itemIndex) => { | 
					
						
							|  |  |  |         if (itemIndex !== index) { | 
					
						
							|  |  |  |           return item; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (item.datasource) { | 
					
						
							|  |  |  |           const previous = getDataSourceSrv().getInstanceSettings(item.datasource); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if (previous?.type === dataSource.type) { | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |               ...item, | 
					
						
							|  |  |  |               datasource: dataSource.name, | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |           refId: item.refId, | 
					
						
							|  |  |  |           hide: item.hide, | 
					
						
							|  |  |  |           datasource: dataSource.name, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  |   onDragEnd = (result: DropResult) => { | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  |     const { queries, onQueriesChange } = this.props; | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!result || !result.destination) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const startIndex = result.source.index; | 
					
						
							|  |  |  |     const endIndex = result.destination.index; | 
					
						
							|  |  |  |     if (startIndex === endIndex) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const update = Array.from(queries); | 
					
						
							|  |  |  |     const [removed] = update.splice(startIndex, 1); | 
					
						
							|  |  |  |     update.splice(endIndex, 0, removed); | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  |     onQueriesChange(update); | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  |   render() { | 
					
						
							| 
									
										
										
										
											2021-09-15 23:26:23 +08:00
										 |  |  |     const { dsSettings, data, queries, app, history, eventBus } = this.props; | 
					
						
							| 
									
										
										
										
											2020-12-02 22:42:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  |     return ( | 
					
						
							|  |  |  |       <DragDropContext onDragEnd={this.onDragEnd}> | 
					
						
							|  |  |  |         <Droppable droppableId="transformations-list" direction="vertical"> | 
					
						
							| 
									
										
										
										
											2021-01-20 14:59:48 +08:00
										 |  |  |           {(provided) => { | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  |             return ( | 
					
						
							|  |  |  |               <div ref={provided.innerRef} {...provided.droppableProps}> | 
					
						
							| 
									
										
										
										
											2021-04-29 21:10:14 +08:00
										 |  |  |                 {queries.map((query, index) => { | 
					
						
							|  |  |  |                   const dataSourceSettings = getDataSourceSettings(query, dsSettings); | 
					
						
							|  |  |  |                   const onChangeDataSourceSettings = dsSettings.meta.mixed | 
					
						
							|  |  |  |                     ? (settings: DataSourceInstanceSettings) => this.onDataSourceChange(settings, index) | 
					
						
							|  |  |  |                     : undefined; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   return ( | 
					
						
							|  |  |  |                     <QueryEditorRow | 
					
						
							|  |  |  |                       id={query.refId} | 
					
						
							|  |  |  |                       index={index} | 
					
						
							|  |  |  |                       key={query.refId} | 
					
						
							|  |  |  |                       data={data} | 
					
						
							|  |  |  |                       query={query} | 
					
						
							|  |  |  |                       dataSource={dataSourceSettings} | 
					
						
							|  |  |  |                       onChangeDataSource={onChangeDataSourceSettings} | 
					
						
							|  |  |  |                       onChange={(query) => this.onChangeQuery(query, index)} | 
					
						
							|  |  |  |                       onRemoveQuery={this.onRemoveQuery} | 
					
						
							|  |  |  |                       onAddQuery={this.props.onAddQuery} | 
					
						
							|  |  |  |                       onRunQuery={this.props.onRunQueries} | 
					
						
							|  |  |  |                       queries={queries} | 
					
						
							| 
									
										
										
										
											2021-09-15 23:26:23 +08:00
										 |  |  |                       app={app} | 
					
						
							|  |  |  |                       history={history} | 
					
						
							|  |  |  |                       eventBus={eventBus} | 
					
						
							| 
									
										
										
										
											2021-04-29 21:10:14 +08:00
										 |  |  |                     /> | 
					
						
							|  |  |  |                   ); | 
					
						
							|  |  |  |                 })} | 
					
						
							| 
									
										
										
										
											2020-09-20 20:18:09 +08:00
										 |  |  |                 {provided.placeholder} | 
					
						
							| 
									
										
										
										
											2020-09-14 14:54:42 +08:00
										 |  |  |               </div> | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |           }} | 
					
						
							|  |  |  |         </Droppable> | 
					
						
							|  |  |  |       </DragDropContext> | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2019-10-18 19:09:55 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-04-29 21:10:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const getDataSourceSettings = ( | 
					
						
							|  |  |  |   query: DataQuery, | 
					
						
							|  |  |  |   groupSettings: DataSourceInstanceSettings | 
					
						
							|  |  |  | ): DataSourceInstanceSettings => { | 
					
						
							|  |  |  |   if (!query.datasource) { | 
					
						
							|  |  |  |     return groupSettings; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   const querySettings = getDataSourceSrv().getInstanceSettings(query.datasource); | 
					
						
							|  |  |  |   return querySettings || groupSettings; | 
					
						
							|  |  |  | }; |