/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import React from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; import { Table } from 'reactable-arc'; import { Label, ProgressBar, Well } from 'react-bootstrap'; import { t } from '@superset-ui/translation'; import Link from '../../components/Link'; import ResultSet from './ResultSet'; import ModalTrigger from '../../components/ModalTrigger'; import HighlightedSql from './HighlightedSql'; import { fDuration } from '../../modules/dates'; import { storeQuery } from '../../utils/common'; import QueryStateLabel from './QueryStateLabel'; const propTypes = { columns: PropTypes.array, actions: PropTypes.object, queries: PropTypes.array, onUserClicked: PropTypes.func, onDbClicked: PropTypes.func, displayLimit: PropTypes.number.isRequired, }; const defaultProps = { columns: ['started', 'duration', 'rows'], queries: [], onUserClicked: () => {}, onDbClicked: () => {}, }; class QueryTable extends React.PureComponent { constructor(props) { super(props); const uri = window.location.toString(); const cleanUri = uri.substring(0, uri.indexOf('#')); this.state = { cleanUri, showVisualizeModal: false, activeQuery: null, }; } callback(url) { window.open(url); } openQuery(dbId, schema, sql) { const newQuery = { dbId, title: t('Untitled Query'), schema, sql, }; storeQuery(newQuery).then(url => this.callback(url)); } hideVisualizeModal() { this.setState({ showVisualizeModal: false }); } showVisualizeModal(query) { this.setState({ activeQuery: query, showVisualizeModal: true }); } restoreSql(query) { this.props.actions.queryEditorSetSql({ id: query.sqlEditorId }, query.sql); } openQueryInNewTab(query) { this.props.actions.cloneQueryToNewTab(query, true); } openAsyncResults(query, displayLimit) { this.props.actions.fetchQueryResults(query, displayLimit); } clearQueryResults(query) { this.props.actions.clearQueryResults(query); } removeQuery(query) { this.props.actions.removeQuery(query); } render() { const data = this.props.queries .map(query => { const q = { ...query }; if (q.endDttm) { q.duration = fDuration(q.startDttm, q.endDttm); } const time = moment(q.startDttm) .format() .split('T'); q.time = (