diff --git a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/Panel.tsx b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/Panel.tsx
index b5d2ae3a91e..26b9f526097 100644
--- a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/Panel.tsx
+++ b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/Panel.tsx
@@ -6,6 +6,10 @@ import { EllipsisVertical } from '@signozhq/icons';
import type { DashboardtypesPanelDTO } from 'api/generated/services/sigNoz.schemas';
import cx from 'classnames';
+import type { DashboardSection } from '../../utils';
+import type { DeletePanelArgs } from './hooks/useDeletePanel';
+import type { MovePanelArgs } from './hooks/useMovePanelToSection';
+import PanelActionsMenu from './PanelActionsMenu/PanelActionsMenu';
import styles from './Panel.module.scss';
interface Props {
@@ -17,9 +21,22 @@ interface Props {
* data. Currently unused on purpose.
*/
isVisible?: boolean;
+ /** Section actions — present only in editable sectioned mode. */
+ currentLayoutIndex?: number;
+ sections?: DashboardSection[];
+ onMovePanel?: (args: MovePanelArgs) => void;
+ onDeletePanel?: (args: DeletePanelArgs) => void;
}
-function Panel({ panel, panelId, isVisible }: Props): JSX.Element {
+function Panel({
+ panel,
+ panelId,
+ isVisible,
+ currentLayoutIndex,
+ sections,
+ onMovePanel,
+ onDeletePanel,
+}: Props): JSX.Element {
const name = panel?.spec?.display?.name || `Panel ${panelId.slice(0, 6)}`;
const description = panel?.spec?.display?.description;
const kind = panel?.spec?.plugin?.kind?.replace(/^signoz\//, '') ?? 'unknown';
@@ -48,7 +65,17 @@ function Panel({ panel, panelId, isVisible }: Props): JSX.Element {
{kind}
-
+ {currentLayoutIndex !== undefined && (onMovePanel || onDeletePanel) ? (
+
+ ) : (
+
+ )}
diff --git a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.module.scss b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.module.scss
new file mode 100644
index 00000000000..8bd080b577f
--- /dev/null
+++ b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.module.scss
@@ -0,0 +1,16 @@
+.trigger {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 2px;
+ background: transparent;
+ border: none;
+ border-radius: 2px;
+ color: var(--bg-vanilla-400, #8993ae);
+ cursor: pointer;
+
+ &:hover {
+ color: var(--bg-vanilla-100, #fff);
+ background: var(--bg-slate-400, #1d212d);
+ }
+}
diff --git a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.tsx b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.tsx
new file mode 100644
index 00000000000..8465801c552
--- /dev/null
+++ b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Panel/PanelActionsMenu/PanelActionsMenu.tsx
@@ -0,0 +1,95 @@
+import { useMemo } from 'react';
+import { EllipsisVertical, FolderInput, Trash2 } from '@signozhq/icons';
+import { DropdownMenuSimple } from '@signozhq/ui/dropdown-menu';
+import type { MenuItem } from '@signozhq/ui/dropdown-menu';
+
+import type { DashboardSection } from '../../../utils';
+import type { DeletePanelArgs } from '../hooks/useDeletePanel';
+import type { MovePanelArgs } from '../hooks/useMovePanelToSection';
+import styles from './PanelActionsMenu.module.scss';
+
+interface Props {
+ panelId: string;
+ currentLayoutIndex: number;
+ sections: DashboardSection[];
+ onMovePanel?: (args: MovePanelArgs) => void;
+ onDeletePanel?: (args: DeletePanelArgs) => void;
+}
+
+function PanelActionsMenu({
+ panelId,
+ currentLayoutIndex,
+ sections,
+ onMovePanel,
+ onDeletePanel,
+}: Props): JSX.Element {
+ const items = useMemo
);
}
diff --git a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.module.scss b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.module.scss
new file mode 100644
index 00000000000..8bd080b577f
--- /dev/null
+++ b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.module.scss
@@ -0,0 +1,16 @@
+.trigger {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 2px;
+ background: transparent;
+ border: none;
+ border-radius: 2px;
+ color: var(--bg-vanilla-400, #8993ae);
+ cursor: pointer;
+
+ &:hover {
+ color: var(--bg-vanilla-100, #fff);
+ background: var(--bg-slate-400, #1d212d);
+ }
+}
diff --git a/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.tsx b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.tsx
new file mode 100644
index 00000000000..b01c156f2bf
--- /dev/null
+++ b/frontend/src/pages/DashboardPageV2/DashboardContainer/PanelsAndSectionsLayout/Section/SectionActionsMenu/SectionActionsMenu.tsx
@@ -0,0 +1,68 @@
+import { useMemo } from 'react';
+import { EllipsisVertical, PenLine, Plus, Trash2 } from '@signozhq/icons';
+import { DropdownMenuSimple } from '@signozhq/ui/dropdown-menu';
+import type { MenuItem } from '@signozhq/ui/dropdown-menu';
+
+import styles from './SectionActionsMenu.module.scss';
+
+interface Props {
+ sectionId: string;
+ onAddPanel?: () => void;
+ onRename?: () => void;
+ onDeleteSection?: () => void;
+}
+
+function SectionActionsMenu({
+ sectionId,
+ onAddPanel,
+ onRename,
+ onDeleteSection,
+}: Props): JSX.Element {
+ const items = useMemo