import { isString } from "lodash"; import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import Modal from "antd/lib/modal"; import Input from "antd/lib/input"; import List from "antd/lib/list"; import Link from "@/components/Link"; import PlainButton from "@/components/PlainButton"; import CloseOutlinedIcon from "@ant-design/icons/CloseOutlined"; import { wrap as wrapDialog, DialogPropType } from "@/components/DialogWrapper"; import { QueryTagsControl } from "@/components/tags-control/TagsControl"; import { Dashboard } from "@/services/dashboard"; import notification from "@/services/notification"; import useSearchResults from "@/lib/hooks/useSearchResults"; import "./add-to-dashboard-dialog.less"; function AddToDashboardDialog({ dialog, visualization }) { const [searchTerm, setSearchTerm] = useState(""); const [doSearch, dashboards, isLoading] = useSearchResults( term => { if (isString(term) && term !== "") { return Dashboard.query({ q: term }) .then(results => results.results) .catch(() => []); } return Promise.resolve([]); }, { initialResults: [] } ); const [selectedDashboard, setSelectedDashboard] = useState(null); const [saveInProgress, setSaveInProgress] = useState(false); useEffect(() => { doSearch(searchTerm); }, [doSearch, searchTerm]); function addWidgetToDashboard() { // Load dashboard with all widgets Dashboard.get(selectedDashboard) .then(dashboard => { dashboard.addWidget(visualization); return dashboard; }) .then(dashboard => { dialog.close(); const key = `notification-${Math.random() .toString(36) .substr(2, 10)}`; notification.success( "Widget added to dashboard", notification.close(key)}> {dashboard.name} , { key } ); }) .catch(() => { notification.error("Widget not added."); }) .finally(() => { setSaveInProgress(false); }); } const items = selectedDashboard ? [selectedDashboard] : dashboards; return ( {!selectedDashboard && ( setSearchTerm(event.target.value)} suffix={ setSearchTerm("")}> } /> )} {(items.length > 0 || isLoading) && ( ( setSelectedDashboard(null)}> , ] : [] } onClick={selectedDashboard ? null : () => setSelectedDashboard(d)}>
{d.name}
)} /> )}
); } AddToDashboardDialog.propTypes = { dialog: DialogPropType.isRequired, visualization: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types }; export default wrapDialog(AddToDashboardDialog);