/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from "react"; import { useParams, useHistory } from "react-router-dom"; import Link from "../components/Link"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCopy } from "@fortawesome/free-solid-svg-icons"; import { useTranslation } from "react-i18next"; import { useDashboard, useDashboardVersions, useWindowSize } from "../hooks"; import { Dashboard, DashboardState, LocationState, Widget, WidgetType } from "../models"; import BackendService from "../services/BackendService"; import WidgetRender from "../components/WidgetRender"; import Button from "../components/Button"; import Alert from "../components/Alert"; import Breadcrumbs from "../components/Breadcrumbs"; import Modal from "../components/Modal"; import Spinner from "../components/Spinner"; import DashboardHeader from "../components/DashboardHeader"; import UtilsService from "../services/UtilsService"; import PrimaryActionBar from "../components/PrimaryActionBar"; import "./ViewDashboardAdmin.css"; import Navigation from "../components/Navigation"; import { Waypoint } from "react-waypoint"; import Dropdown from "../components/Dropdown"; import AlertContainer from "./AlertContainer"; import DropdownMenu from "../components/DropdownMenu"; import PublishDashboardModal from "../components/PublishDashboardModal"; interface PathParams { dashboardId: string; } const { MenuItem } = DropdownMenu; function ViewDashboardAdmin() { const history = useHistory(); const { dashboardId } = useParams(); const { dashboard, loading } = useDashboard(dashboardId); const { versions } = useDashboardVersions(dashboard?.parentDashboardId); const [isOpenUpdateModal, setIsOpenUpdateModal] = useState(false); const [isOpenArchiveModal, setIsOpenArchiveModal] = useState(false); const [isOpenRepublishModal, setIsOpenRepublishModal] = useState(false); const [isOpenPublishModal, setIsOpenPublishModal] = useState(false); const [showVersionNotes, setShowVersionNotes] = useState(false); const [showMobilePreview, setShowMobilePreview] = useState(false); const [activeWidgetId, setActiveWidgetId] = useState(""); const [activeTabId, setActiveTabId] = useState(""); const [isOpenCopyModal, setIsOpenCopyModal] = useState(false); const draftOrPublishPending = versions.find( (v) => v.state === DashboardState.Draft || v.state === DashboardState.PublishPending, ); const windowSize = useWindowSize(); const { t } = useTranslation(); const mobilePreviewWidth = 400; const maxMobileViewportWidth = 450; const moveNavBarWidth = 1280; const isMobile = windowSize.width <= 600; const onClosePreview = () => { history.push(UtilsService.getDashboardUrlPath(dashboard)); }; const [published, setPublished] = useState(false); const dashboardPublished = async () => { setPublished(true); }; const closePublishModal = async () => { setIsOpenPublishModal(false); if (published) { history.push("/admin/dashboards?tab=published"); } }; const onUpdateDashboard = async () => { setIsOpenUpdateModal(false); try { const draft = await BackendService.createDraft(dashboardId); history.push(`/admin/dashboard/edit/${draft.id}`, { alert: { type: "success", message: t("NewDraftDashboardCreated", { dashboardName: draft.name, }), }, id: "top-alert", }); } catch (err) { console.log("Failed to create draft", err); } }; const onArchiveDashboard = async () => { setIsOpenArchiveModal(false); if (!dashboard) { return; } await BackendService.archive(dashboard.id, dashboard.updatedAt); history.push("/admin/dashboards?tab=archived", { alert: { type: "success", message: `${dashboard.name} ${t("DashboardWasArchived")}`, }, }); }; const onDashboardHistory = () => { if (dashboard) { history.push(`/admin/dashboard/${dashboard.id}/history`); } }; const closeCopyModal = () => { setIsOpenCopyModal(false); }; const onCopyDashboard = () => { setIsOpenCopyModal(true); }; const copyDashboard = async () => { closeCopyModal(); if (dashboard) { await BackendService.copyDashboard(dashboard.id); history.push("/admin/dashboards?tab=draft", { alert: { type: "success", message: `${dashboard.name} ${t("ViewDashboardAdmin.Dashboard")} ${t("ViewDashboardAdmin.SuccessfullyCopied")}`, }, }); } }; const onArchivePublishedDashboard = () => { setIsOpenArchiveModal(true); }; const onRepublishDashboard = async () => { setIsOpenRepublishModal(false); if (dashboard) { await BackendService.publishDashboard( dashboard.id, dashboard.updatedAt, dashboard.releaseNotes || "", ); history.push(`/admin/dashboards?tab=published`, { alert: { type: "success", message: `${dashboard.name} ${t("DashboardWasRepublished")}`, to: `/${dashboardId}`, linkLabel: t("ViewPublishedDashboard"), }, }); } }; const handleVersionChange = (event: React.FormEvent) => { const target = event.target as HTMLInputElement; const version = versions.find((v) => String(v.version) === target.value); if (version) { history.push(`/admin/dashboard/${version.id}`); } }; const getSectionWithTabs = (widget: Widget, dashboard: Dashboard): string => { const section: Widget | undefined = dashboard.widgets.find((w) => w.id === widget.section); if (section) { return section.content.showWithTabs ? section.id : ""; } return ""; }; const onClickHandler = (active: string) => { setActiveTabId(active); setActiveWidgetId(active); }; const onBottomOfThePage = (bottom: string) => { const widget = dashboard?.widgets.find((w: Widget) => w.id === bottom); if (widget) { if (widget.section) { const parent = dashboard?.widgets.find((w: Widget) => w.id === widget.section); if (parent) { setActiveWidgetId(parent.id); } } else { setActiveWidgetId(bottom); } } }; const dashboardListUrl = (dashboard: Dashboard) => { switch (dashboard.state) { case DashboardState.Published: return "/admin/dashboards?tab=published"; case DashboardState.Archived: return "/admin/dashboards?tab=archived"; case DashboardState.PublishPending: return "/admin/dashboards?tab=pending"; default: return "/admin/dashboards"; } }; if (loading || !dashboard || !versions || !versions.length) { return ; } const statusAndVersion = (
  • {t(dashboard.state)}
  • {(dashboard.state === DashboardState.Draft || dashboard.state === DashboardState.PublishPending) && ( )} {(dashboard.state === DashboardState.Draft || dashboard.state === DashboardState.PublishPending) && t("ViewDashboardAlertVersion")}{" "} {(dashboard.state === DashboardState.Draft || dashboard.state === DashboardState.PublishPending) && dashboard.version} {(dashboard.state === DashboardState.Published || dashboard.state === DashboardState.Archived || dashboard.state === DashboardState.Inactive) && ( version.state !== DashboardState.Draft && version.state !== DashboardState.PublishPending, ) .map((v) => { return { value: `${v.version}`, label: `${t("ViewDashboardAlertVersion")} ${v.version}${ v.state === DashboardState.Published ? ` (${t("Current")}) ` : "" }`, }; })} value={`${dashboard.version}`} className={isMobile ? "margin-top-0" : "margin-top-neg-2"} onChange={handleVersionChange} /> )}
  • {(dashboard.state === DashboardState.Published || dashboard.state === DashboardState.Inactive || dashboard.state === DashboardState.Archived) && (
    setShowVersionNotes(!showVersionNotes)} onChange={() => setShowVersionNotes(!showVersionNotes)} />
    )}
); const buttons = ( <> {dashboard.state === DashboardState.Published && ( <> {isMobile && (
{t("ViewHistoryLink")} {t("ViewDashboardAlertButton.Archive")} {t("CopyButton")}
)} {!isMobile && ( <> {t("ViewHistoryLink")} {t("ViewDashboardAlertButton.Archive")} {t("CopyButton")} )} )} {dashboard.state === DashboardState.Archived && ( <> {isMobile && (
{t("ViewHistoryLink")} {t("CopyButton")}
)} {!isMobile && ( <> {t("ViewHistoryLink")} {t("CopyButton")} )} )} {(dashboard.state === DashboardState.Draft || dashboard.state === DashboardState.PublishPending) && ( <> {isMobile && (
{dashboard.state === DashboardState.Draft && ( )}
)} {!isMobile && ( <> {dashboard.state === DashboardState.Draft && ( )} )} )} ); return ( <> setIsOpenUpdateModal(false)} title={t("CreateDraftDashboardModalTitle", { dashboardName: dashboard.name, })} message={t("CreateDraftDashboardModalMessage")} buttonType={t("CreateDraftDashboardModalButton")} buttonAction={onUpdateDashboard} /> setIsOpenArchiveModal(false)} title={t("ArchiveDashboardModalTitle", { dashboardName: dashboard.name, })} message={t("ArchiveDashboardModalMessage", { dashboardName: dashboard.name, })} buttonType={t("ArchiveDashboardModalButton")} buttonAction={onArchiveDashboard} /> setIsOpenRepublishModal(false)} title={t("RepublishDashboardModalTitle", { dashboardName: dashboard.name, })} message={t("RepublishDashboardModalMessage")} buttonType={t("RepublishDashboardModalButton")} buttonAction={onRepublishDashboard} /> {(dashboard.state === DashboardState.Published || dashboard.state === DashboardState.Inactive) && draftOrPublishPending && ( {t("OnlyOneDraftDashboardAtATime")}
{`${ draftOrPublishPending.state === DashboardState.Draft ? `${t("EditOrPublishDraft.Edit")}` : `${t("EditOrPublishDraft.Publish")}` } ${t("EditOrPublishDraft.Draft")}`}
} hideIcon slim /> )} {(dashboard.state === DashboardState.Draft || dashboard.state === DashboardState.PublishPending) && (
{t("DashboardPreviewPublishedMessage")}
)} {dashboard.state === DashboardState.Archived && (
{t("RepublishDashboardToView")}
)} {isMobile && ( <>
{statusAndVersion}
{showVersionNotes && ( <>
{t("ViewDashboardAlertVersionNotesFrom", { version: dashboard.version, })} {` ${dashboard.publishedBy}`}
{dashboard.releaseNotes}
)}
{buttons}
)} {!isMobile && ( <>
{statusAndVersion}
{buttons}
{showVersionNotes && ( <>
{t("ViewDashboardAlertVersionNotesFrom", { version: dashboard.version, })} {` ${dashboard.publishedBy}`}
{dashboard.releaseNotes}
)} )}
{loading ? ( ) : ( <>
{ return { name: widget.name, id: widget.id, isInsideSection: !!widget.section, sectionWithTabs: getSectionWithTabs(widget, dashboard), }; })} activeWidgetId={activeWidgetId} onBottomOfThePage={onBottomOfThePage} isTop={showMobilePreview || windowSize.width <= moveNavBarWidth} displayTableOfContents={dashboard.displayTableOfContents} onClick={onClickHandler} /> {dashboard.widgets .filter((w) => !w.section) .map((widget, index) => { return (
{widget.widgetType === WidgetType.Section && !widget.content.showWithTabs ? (
) : ( { setActiveWidgetId(widget.id); }} topOffset="240px" bottomOffset={`${windowSize.height - 250}px`} fireOnRapidScroll={false} >
)}
); })} )}
); } export default ViewDashboardAdmin;