From 42fad23cb0c687a5ee1709477ca289d49c7b04ae Mon Sep 17 00:00:00 2001 From: SagarRajput-7 <162284829+SagarRajput-7@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:55:42 +0530 Subject: [PATCH] feat: added feat to add new panel in a section (#6999) * feat: added common util and took possible space available in last row in account * feat: added different test cases * feat: remove console.log * feat: added default value to widgetWidth * feat: added feat to add new panel in a section * feat: added different test cases --- .../DashboardEmptyState.tsx | 2 + .../GridCardLayout/GridCardLayout.styles.scss | 7 +- .../GridCardLayout/GridCardLayout.tsx | 2 + .../container/GridCardLayout/WidgetRow.tsx | 38 +++++- .../DashboardDescription/index.tsx | 2 + .../NewWidget/__test__/NewWidget.test.tsx | 128 +++++++++++++++++- frontend/src/container/NewWidget/index.tsx | 43 +++++- frontend/src/container/NewWidget/utils.ts | 40 ++++++ .../src/providers/Dashboard/Dashboard.tsx | 10 ++ frontend/src/providers/Dashboard/types.ts | 2 + 10 files changed, 266 insertions(+), 8 deletions(-) diff --git a/frontend/src/container/GridCardLayout/DashboardEmptyState/DashboardEmptyState.tsx b/frontend/src/container/GridCardLayout/DashboardEmptyState/DashboardEmptyState.tsx index 099d74411b..29e2defe2a 100644 --- a/frontend/src/container/GridCardLayout/DashboardEmptyState/DashboardEmptyState.tsx +++ b/frontend/src/container/GridCardLayout/DashboardEmptyState/DashboardEmptyState.tsx @@ -17,6 +17,7 @@ export default function DashboardEmptyState(): JSX.Element { selectedDashboard, isDashboardLocked, handleToggleDashboardSlider, + setSelectedRowWidgetId, } = useDashboard(); const { user } = useAppContext(); @@ -34,6 +35,7 @@ export default function DashboardEmptyState(): JSX.Element { const [addPanelPermission] = useComponentPermission(permissions, userRole); const onEmptyWidgetHandler = useCallback(() => { + setSelectedRowWidgetId(null); handleToggleDashboardSlider(true); logEvent('Dashboard Detail: Add new panel clicked', { dashboardId: selectedDashboard?.uuid, diff --git a/frontend/src/container/GridCardLayout/GridCardLayout.styles.scss b/frontend/src/container/GridCardLayout/GridCardLayout.styles.scss index 567bd10470..c450801537 100644 --- a/frontend/src/container/GridCardLayout/GridCardLayout.styles.scss +++ b/frontend/src/container/GridCardLayout/GridCardLayout.styles.scss @@ -133,7 +133,8 @@ .menu-content { .section-1 { - .rename-btn { + .rename-btn, + .new-panel-btn { display: flex; align-items: center; gap: 6px; @@ -150,6 +151,10 @@ margin-inline-end: 0px; } } + + .rename-btn { + padding-bottom: 10px; + } } .section-2 { diff --git a/frontend/src/container/GridCardLayout/GridCardLayout.tsx b/frontend/src/container/GridCardLayout/GridCardLayout.tsx index c61fbcc7bc..6fda3fbc5e 100644 --- a/frontend/src/container/GridCardLayout/GridCardLayout.tsx +++ b/frontend/src/container/GridCardLayout/GridCardLayout.tsx @@ -65,6 +65,7 @@ function GraphLayout(props: GraphLayoutProps): JSX.Element { isDashboardLocked, dashboardQueryRangeCalled, setDashboardQueryRangeCalled, + setSelectedRowWidgetId, } = useDashboard(); const { data } = selectedDashboard || {}; const { pathname } = useLocation(); @@ -174,6 +175,7 @@ function GraphLayout(props: GraphLayoutProps): JSX.Element { updateDashboardMutation.mutate(updatedDashboard, { onSuccess: (updatedDashboard) => { + setSelectedRowWidgetId(null); if (updatedDashboard.payload) { if (updatedDashboard.payload.data.layout) setLayouts(sortLayout(updatedDashboard.payload.data.layout)); diff --git a/frontend/src/container/GridCardLayout/WidgetRow.tsx b/frontend/src/container/GridCardLayout/WidgetRow.tsx index 70e5b64670..d46bff3b5d 100644 --- a/frontend/src/container/GridCardLayout/WidgetRow.tsx +++ b/frontend/src/container/GridCardLayout/WidgetRow.tsx @@ -1,7 +1,12 @@ import { Button, Popover } from 'antd'; -import { EllipsisIcon, PenLine, X } from 'lucide-react'; +import useComponentPermission from 'hooks/useComponentPermission'; +import { EllipsisIcon, PenLine, Plus, X } from 'lucide-react'; +import { useAppContext } from 'providers/App/App'; +import { useDashboard } from 'providers/Dashboard/Dashboard'; import { useState } from 'react'; import { Layout } from 'react-grid-layout'; +import { ROLES, USER_ROLES } from 'types/roles'; +import { ComponentTypes } from 'utils/permission'; interface WidgetRowHeaderProps { rowWidgetProperties: { @@ -27,6 +32,23 @@ export function WidgetRowHeader(props: WidgetRowHeaderProps): JSX.Element { id, } = props; const [isRowSettingsOpen, setIsRowSettingsOpen] = useState(false); + + const { + handleToggleDashboardSlider, + selectedDashboard, + isDashboardLocked, + setSelectedRowWidgetId, + } = useDashboard(); + + const permissions: ComponentTypes[] = ['add_panel']; + const { user } = useAppContext(); + + const userRole: ROLES | null = + selectedDashboard?.created_by === user?.email + ? (USER_ROLES.AUTHOR as ROLES) + : user.role; + const [addPanelPermission] = useComponentPermission(permissions, userRole); + return ( +
+ +
{!rowWidgetProperties.collapsed && (