import React, { useState, useEffect, useCallback } from "react"; import PropTypes from "prop-types"; import { find, has } from "lodash"; import { react2angular } from "react2angular"; import moment from "moment"; import { markdown } from "markdown"; import Button from "antd/lib/button"; import Dropdown from "antd/lib/dropdown"; import Icon from "antd/lib/icon"; import Menu from "antd/lib/menu"; import Tooltip from "antd/lib/tooltip"; import { $location, $routeParams } from "@/services/ng"; import { formatDateTime } from "@/filters/datetime"; import HtmlContent from "@/components/HtmlContent"; import { Parameters } from "@/components/Parameters"; import { Moment } from "@/components/proptypes"; import { TimeAgo } from "@/components/TimeAgo"; import { Timer } from "@/components/Timer"; import QueryResultsLink from "@/components/EditVisualizationButton/QueryResultsLink"; import VisualizationName from "@/visualizations/VisualizationName"; import { VisualizationRenderer } from "@/visualizations/VisualizationRenderer"; import { VisualizationType } from "@/visualizations"; import logoUrl from "@/assets/images/redash_icon_small.png"; function VisualizationEmbedHeader({ queryName, queryDescription, visualization }) { return (

Redash Logo {queryName} {queryDescription && ( {markdown.toHTML(queryDescription || "")} )}

); } VisualizationEmbedHeader.propTypes = { queryName: PropTypes.string.isRequired, queryDescription: PropTypes.string, visualization: VisualizationType.isRequired, }; VisualizationEmbedHeader.defaultProps = { queryDescription: "" }; function VisualizationEmbedFooter({ query, queryResults, updatedAt, refreshStartedAt, queryUrl }) { const downloadMenu = ( Download as CSV File Download as TSV File Download as Excel File ); return (
{" "} {refreshStartedAt ? : } {formatDateTime(updatedAt)} {queryUrl && ( {!query.hasParameters() && ( )} )}
); } VisualizationEmbedFooter.propTypes = { query: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types queryResults: PropTypes.object, // eslint-disable-line react/forbid-prop-types updatedAt: PropTypes.string, refreshStartedAt: Moment, queryUrl: PropTypes.string, }; VisualizationEmbedFooter.defaultProps = { queryResults: null, updatedAt: null, refreshStartedAt: null, queryUrl: null, }; function VisualizationEmbed({ query }) { const [error, setError] = useState(null); const [refreshStartedAt, setRefreshStartedAt] = useState(null); const [queryResults, setQueryResults] = useState(null); const hideHeader = has($location.search(), "hide_header"); const hideParametersUI = has($location.search(), "hide_parameters"); const hideQueryLink = has($location.search(), "hide_link"); const showQueryDescription = has($location.search(), "showDescription"); const visualizationId = parseInt($routeParams.visualizationId, 10); const visualization = find(query.visualizations, vis => vis.id === visualizationId); const refreshQueryResults = useCallback(() => { setError(null); setRefreshStartedAt(moment()); query .getQueryResultPromise() .then(result => { setQueryResults(result); }) .catch(err => { setError(err.getError()); }) .finally(() => setRefreshStartedAt(null)); }, [query]); useEffect(() => { document.querySelector("body").classList.add("headless"); refreshQueryResults(); }, [refreshQueryResults]); return (
{!hideHeader && ( )}
{!hideParametersUI && query.hasParameters() && (
)} {error &&
{`Error: ${error}`}
} {!error && queryResults && ( )} {!queryResults && refreshStartedAt && (
)}
); } VisualizationEmbed.propTypes = { query: PropTypes.object.isRequired }; // eslint-disable-line react/forbid-prop-types export default function init(ngModule) { ngModule.component("visualizationEmbed", react2angular(VisualizationEmbed)); function loadSession($route, Auth) { const apiKey = $route.current.params.api_key; Auth.setApiKey(apiKey); return Auth.loadConfig(); } function loadQuery($route, Auth, Query) { "ngInject"; return loadSession($route, Auth).then(() => Query.get({ id: $route.current.params.queryId }).$promise); } ngModule.config($routeProvider => { $routeProvider.when("/embed/query/:queryId/visualization/:visualizationId", { resolve: { query: loadQuery, }, reloadOnSearch: false, template: '', }); }); } init.init = true;