/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from "react"; import dayjs from "dayjs"; import { useHistory, useParams } from "react-router-dom"; import Link from "../components/Link"; import { useDashboard, useDashboardVersions, useChangeBackgroundColor, useWindowSize, } from "../hooks"; import { Widget, LocationState, WidgetType, DashboardState } from "../models"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCopy, faExternalLinkAlt } from "@fortawesome/free-solid-svg-icons"; import BackendService from "../services/BackendService"; import Breadcrumbs from "../components/Breadcrumbs"; import Button from "../components/Button"; import Modal from "../components/Modal"; import PublishDashboardModal from "../components/PublishDashboardModal"; import Spinner from "../components/Spinner"; import Tooltip from "../components/Tooltip"; import AlertContainer from "../containers/AlertContainer"; import DashboardHeader from "../components/DashboardHeader"; import PrimaryActionBar from "../components/PrimaryActionBar"; import { useTranslation } from "react-i18next"; import WidgetTree from "../components/WidgetTree"; interface PathParams { dashboardId: string; } function EditDashboard() { const { t } = useTranslation(); const windowSize = useWindowSize(); const history = useHistory(); const { dashboardId } = useParams(); const { dashboard, reloadDashboard, setDashboard, loading } = useDashboard(dashboardId); const [isOpenPublishModal, setIsOpenPublishModal] = useState(false); const [isOpenDeleteModal, setIsOpenDeleteModal] = useState(false); const [reordering, setReordering] = useState(false); const [widgetToDelete, setWidgetToDelete] = useState(undefined); const { versions } = useDashboardVersions(dashboard?.parentDashboardId); const publishedOrArchived = versions.find( (v) => v.state === DashboardState.Published || v.state === DashboardState.Archived, ); const isMobile = windowSize.width <= 600; const onAddContent = async () => { history.push(`/admin/dashboard/${dashboardId}/add-content`); }; const onPreview = () => { history.push(`/admin/dashboard/${dashboardId}`); }; const [published, setPublished] = useState(false); const dashboardPublished = async () => { setPublished(true); }; const closePublishModal = async () => { setIsOpenPublishModal(false); if (published) { history.push("/admin/dashboards?tab=published"); } }; const closeDeleteModal = () => { setIsOpenDeleteModal(false); }; const onPublishDashboard = () => { setIsOpenPublishModal(true); }; const onDeleteWidget = (widget: Widget) => { setWidgetToDelete(widget); setIsOpenDeleteModal(true); }; const onDuplicateWidget = async (widget: Widget) => { if (dashboard && widget) { await BackendService.duplicateWidget( dashboardId, widget.id, widget.updatedAt, t("Copy"), ); history.replace(`/admin/dashboard/edit/${dashboardId}`, { alert: { type: "success", message: `${t( widget.widgetType === WidgetType.Chart ? widget.content.chartType : widget.widgetType, )} '${widget.name}' ${t("DashboardWasCopied")}`, }, }); await reloadDashboard(); } }; const deleteWidget = async () => { closeDeleteModal(); if (dashboard && widgetToDelete) { await BackendService.deleteWidget(dashboardId, widgetToDelete.id); history.replace(`/admin/dashboard/edit/${dashboardId}`, { alert: { type: "success", message: `${t( widgetToDelete.widgetType === WidgetType.Chart ? widgetToDelete.content.chartType : widgetToDelete.widgetType, )} '${widgetToDelete.name}' ${t("DashboardWasDeleted")}`, }, }); await reloadDashboard(); } }; const onDrag = async (widgets: Widget[]) => { if (dashboard && !reordering) { setReordering(true); try { setDashboard({ ...dashboard, widgets }); await BackendService.setWidgetOrder(dashboardId, widgets); } finally { await reloadDashboard(false); setReordering(false); } } }; useChangeBackgroundColor(); const statusAndVersion = (
  • {t("Draft")}
  • {t("Version")} {dashboard?.version} {publishedOrArchived && ( (

    {t("VersionDashboard")}
    {publishedOrArchived.state.toLowerCase()}.

    {t("ViewVersion", { state: publishedOrArchived.state.toLowerCase(), })}
    )} clickable /> )}
); const lastSavedAndButtons = ( <> {dashboard && `${t("LastSaved")} ${dayjs(dashboard.updatedAt) .locale(window.navigator.language.toLowerCase()) .fromNow()}`} {isMobile && (
{t("PrepareDashboardForPublishing")}
)} {!isMobile && ( <> {t("PrepareDashboardForPublishing")} )} ); return ( <> {loading || !versions ? ( ) : ( <> {isMobile && ( {statusAndVersion}
{lastSavedAndButtons}
)} {!isMobile && (
{statusAndVersion}
{lastSavedAndButtons}
)} {t("EditHeader")} } isMobile={isMobile} /> )} ); } export default EditDashboard;