From ae8826f43e87b813f38bbd1b4b1b0acec725fbf4 Mon Sep 17 00:00:00 2001 From: Olha Tomylko Date: Mon, 13 Apr 2026 15:41:31 +0200 Subject: [PATCH 1/4] feat: add inline editing for dashboard name --- .../GenericHeader/GenericHeader.tsx | 65 +++++++++++++++++-- src/Modules/GenericDashboardPage.tsx | 8 +++ src/api/dashboard-templates.ts | 11 ++++ src/hooks/useDashboardTemplate.ts | 19 ++++++ src/state/dashboardsAtom.ts | 20 ++++++ 5 files changed, 118 insertions(+), 5 deletions(-) diff --git a/src/Components/GenericHeader/GenericHeader.tsx b/src/Components/GenericHeader/GenericHeader.tsx index e26c9be..7e9a83b 100644 --- a/src/Components/GenericHeader/GenericHeader.tsx +++ b/src/Components/GenericHeader/GenericHeader.tsx @@ -1,9 +1,9 @@ import '../Header/Header.scss'; -import { ActionList, ActionListItem, Button } from '@patternfly/react-core'; +import { ActionList, ActionListItem, Button, Flex, FlexItem, TextInput } from '@patternfly/react-core'; import PageHeader from '@patternfly/react-component-groups/dist/dynamic/PageHeader'; -import React from 'react'; -import { PlusCircleIcon } from '@patternfly/react-icons'; +import React, { useState } from 'react'; +import { CheckIcon, PencilAltIcon, PlusCircleIcon, TimesIcon } from '@patternfly/react-icons'; import { useSetAtom } from 'jotai'; import { drawerExpandedAtom } from '../../state/drawerExpandedAtom'; import { DashboardTemplate } from '../../api/dashboard-templates'; @@ -11,14 +11,69 @@ import GenericHeaderDropdown from './GenericHeaderDropdown'; interface GenericHeaderProps { dashboard?: DashboardTemplate; + onRenameDashboard: (dashboardName: string) => Promise; } -const GenericHeader = ({ dashboard }: GenericHeaderProps) => { +const GenericHeader = ({ dashboard, onRenameDashboard }: GenericHeaderProps) => { const toggleOpen = useSetAtom(drawerExpandedAtom); + const [isEditing, setIsEditing] = useState(false); + const [editedName, setEditedName] = useState(dashboard?.dashboardName ?? ''); + + const handleConfirm = async () => { + if (editedName.trim() && dashboard) { + await onRenameDashboard(editedName.trim()); + } + setIsEditing(false); + }; + + const handleCancel = () => { + setEditedName(dashboard?.dashboardName ?? ''); + setIsEditing(false); + }; + + const titleContent = isEditing ? ( + + + setEditedName(value)} + onKeyDown={(event) => { + if (event.key === 'Enter') handleConfirm(); + if (event.key === 'Escape') handleCancel(); + }} + aria-label="Dashboard name" + autoFocus + /> + + +