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 (
{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 = (
);
return (
);
}
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;