From 17fbb2dbb2357417d81de01308264031606a661f Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Fri, 10 Feb 2023 13:46:13 -0500 Subject: [PATCH] fix: Menu items are not disappearing when deleting a dashboard (#23039) --- .../views/CRUD/dashboard/DashboardCard.tsx | 51 ++++--------------- .../views/CRUD/dashboard/DashboardList.tsx | 35 ++++++++++--- .../src/views/CRUD/welcome/DashboardTable.tsx | 34 +++++++++++-- 3 files changed, 70 insertions(+), 50 deletions(-) diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx index cadb2ed965dfe..0a46749a017ac 100644 --- a/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx +++ b/superset-frontend/src/views/CRUD/dashboard/DashboardCard.tsx @@ -19,11 +19,10 @@ import React from 'react'; import { Link, useHistory } from 'react-router-dom'; import { t, useTheme } from '@superset-ui/core'; -import { handleDashboardDelete, CardStyles } from 'src/views/CRUD/utils'; +import { CardStyles } from 'src/views/CRUD/utils'; import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags'; import { AntdDropdown } from 'src/components'; import { Menu } from 'src/components/Menu'; -import ConfirmStatusChange from 'src/components/ConfirmStatusChange'; import ListViewCard from 'src/components/ListViewCard'; import Icons from 'src/components/Icons'; import Label from 'src/components/Label'; @@ -36,33 +35,27 @@ interface DashboardCardProps { dashboard: Dashboard; hasPerm: (name: string) => boolean; bulkSelectEnabled: boolean; - refreshData: () => void; loading: boolean; - addDangerToast: (msg: string) => void; - addSuccessToast: (msg: string) => void; openDashboardEditModal?: (d: Dashboard) => void; saveFavoriteStatus: (id: number, isStarred: boolean) => void; favoriteStatus: boolean; - dashboardFilter?: string; userId?: string | number; showThumbnails?: boolean; handleBulkDashboardExport: (dashboardsToExport: Dashboard[]) => void; + onDelete: (dashboard: Dashboard) => void; } function DashboardCard({ dashboard, hasPerm, bulkSelectEnabled, - dashboardFilter, - refreshData, userId, - addDangerToast, - addSuccessToast, openDashboardEditModal, favoriteStatus, saveFavoriteStatus, showThumbnails, handleBulkDashboardExport, + onDelete, }: DashboardCardProps) { const history = useHistory(); const canEdit = hasPerm('can_write'); @@ -100,37 +93,15 @@ function DashboardCard({ )} {canDelete && ( - - {t('Are you sure you want to delete')}{' '} - {dashboard.dashboard_title}? - - } - onConfirm={() => - handleDashboardDelete( - dashboard, - refreshData, - addSuccessToast, - addDangerToast, - dashboardFilter, - userId, - ) - } +
onDelete(dashboard)} + data-test="dashboard-card-option-delete-button" > - {confirmDelete => ( -
- {t('Delete')} -
- )} - + {t('Delete')} +
)} diff --git a/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx b/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx index 6fe5bf2b202be..d892b24fa1b9c 100644 --- a/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx +++ b/superset-frontend/src/views/CRUD/dashboard/DashboardList.tsx @@ -42,12 +42,14 @@ import Owner from 'src/types/Owner'; import withToasts from 'src/components/MessageToasts/withToasts'; import FacePile from 'src/components/FacePile'; import Icons from 'src/components/Icons'; +import DeleteModal from 'src/components/DeleteModal'; import FaveStar from 'src/components/FaveStar'; import PropertiesModal from 'src/dashboard/components/PropertiesModal'; import { Tooltip } from 'src/components/Tooltip'; import ImportModelsModal from 'src/components/ImportModal/index'; import Dashboard from 'src/dashboard/containers/Dashboard'; +import { Dashboard as CRUDDashboard } from 'src/views/CRUD/types'; import CertifiedBadge from 'src/components/CertifiedBadge'; import getBootstrapData from 'src/utils/getBootstrapData'; import DashboardCard from './DashboardCard'; @@ -131,6 +133,8 @@ function DashboardList(props: DashboardListProps) { const [dashboardToEdit, setDashboardToEdit] = useState( null, ); + const [dashboardToDelete, setDashboardToDelete] = + useState(null); const [importingDashboard, showImportModal] = useState(false); const [passwordFields, setPasswordFields] = useState([]); @@ -575,7 +579,6 @@ function DashboardList(props: DashboardListProps) { dashboard={dashboard} hasPerm={hasPerm} bulkSelectEnabled={bulkSelectEnabled} - refreshData={refreshData} showThumbnails={ userKey ? userKey.thumbnails @@ -583,23 +586,19 @@ function DashboardList(props: DashboardListProps) { } userId={userId} loading={loading} - addDangerToast={addDangerToast} - addSuccessToast={addSuccessToast} openDashboardEditModal={openDashboardEditModal} saveFavoriteStatus={saveFavoriteStatus} favoriteStatus={favoriteStatus[dashboard.id]} handleBulkDashboardExport={handleBulkDashboardExport} + onDelete={dashboard => setDashboardToDelete(dashboard)} /> ), [ - addDangerToast, - addSuccessToast, bulkSelectEnabled, favoriteStatus, hasPerm, loading, userId, - refreshData, saveFavoriteStatus, userKey, ], @@ -681,6 +680,30 @@ function DashboardList(props: DashboardListProps) { onSubmit={handleDashboardEdit} /> )} + {dashboardToDelete && ( + + {t('Are you sure you want to delete')}{' '} + {dashboardToDelete.dashboard_title}? + + } + onConfirm={() => { + handleDashboardDelete( + dashboardToDelete, + refreshData, + addSuccessToast, + addDangerToast, + undefined, + userId, + ); + setDashboardToDelete(null); + }} + onHide={() => setDashboardToDelete(null)} + open={!!dashboardToDelete} + title={t('Please confirm')} + /> + )} bulkActions={bulkActions} bulkSelectEnabled={bulkSelectEnabled} diff --git a/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx b/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx index 0a13dde2cfddc..e4a31bdf4f6de 100644 --- a/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx +++ b/superset-frontend/src/views/CRUD/welcome/DashboardTable.tsx @@ -34,9 +34,11 @@ import { createErrorHandler, getFilterValues, PAGE_SIZE, + handleDashboardDelete, } from 'src/views/CRUD/utils'; import withToasts from 'src/components/MessageToasts/withToasts'; import Loading from 'src/components/Loading'; +import DeleteModal from 'src/components/DeleteModal'; import PropertiesModal from 'src/dashboard/components/PropertiesModal'; import DashboardCard from 'src/views/CRUD/dashboard/DashboardCard'; import SubMenu from 'src/views/components/SubMenu'; @@ -90,6 +92,9 @@ function DashboardTable({ const [activeTab, setActiveTab] = useState(defaultTab); const [preparingExport, setPreparingExport] = useState(false); const [loaded, setLoaded] = useState(false); + const [dashboardToDelete, setDashboardToDelete] = useState( + null, + ); const getData = (tab: TableTab) => fetchData({ @@ -217,6 +222,30 @@ function DashboardTable({ onSubmit={handleDashboardEdit} /> )} + {dashboardToDelete && ( + + {t('Are you sure you want to delete')}{' '} + {dashboardToDelete.dashboard_title}? + + } + onConfirm={() => { + handleDashboardDelete( + dashboardToDelete, + refreshData, + addSuccessToast, + addDangerToast, + activeTab, + user?.userId, + ); + setDashboardToDelete(null); + }} + onHide={() => setDashboardToDelete(null)} + open={!!dashboardToDelete} + title={t('Please confirm')} + /> + )} {dashboards.length > 0 && ( {dashboards.map(e => ( @@ -226,10 +255,6 @@ function DashboardTable({ hasPerm={hasPerm} bulkSelectEnabled={false} showThumbnails={showThumbnails} - dashboardFilter={activeTab} - refreshData={refreshData} - addDangerToast={addDangerToast} - addSuccessToast={addSuccessToast} userId={user?.userId} loading={loading} openDashboardEditModal={(dashboard: Dashboard) => @@ -238,6 +263,7 @@ function DashboardTable({ saveFavoriteStatus={saveFavoriteStatus} favoriteStatus={favoriteStatus[e.id]} handleBulkDashboardExport={handleBulkDashboardExport} + onDelete={dashboard => setDashboardToDelete(dashboard)} /> ))}