From aceba98aa13c2edfdd2f713a6a3d947e2b084d0d Mon Sep 17 00:00:00 2001 From: Robert Luby Date: Tue, 16 Jun 2026 16:04:37 +0200 Subject: [PATCH] SRVOCF-850: Editor Page layout and UX improvements --- .../function-edit/FunctionEditPage.test.tsx | 13 +++++++ src/pages/function-edit/FunctionEditPage.tsx | 39 ++++++++++++------- .../components/FileTreeView.test.tsx | 17 ++++++++ .../function-edit/components/FileTreeView.tsx | 7 +++- 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/pages/function-edit/FunctionEditPage.test.tsx b/src/pages/function-edit/FunctionEditPage.test.tsx index 7a65709..c730a39 100644 --- a/src/pages/function-edit/FunctionEditPage.test.tsx +++ b/src/pages/function-edit/FunctionEditPage.test.tsx @@ -122,6 +122,19 @@ describe('FunctionEditPage', () => { expect(screen.getByRole('button', { name: /Back to Functions/ })).toBeInTheDocument(); }); + it('shows info bar with function name and repo link after loading', async () => { + setupFetchHandlers(); + + renderEditPage('my-func'); + + await waitFor(() => { + expect(screen.getByText('func.yaml')).toBeInTheDocument(); + }); + + const repoLink = screen.getByRole('link', { name: 'twoGiants/my-func' }); + expect(repoLink).toHaveAttribute('target', '_blank'); + }); + it('auto-selects handler file based on runtime from func.yaml', async () => { setupFetchHandlers(); diff --git a/src/pages/function-edit/FunctionEditPage.tsx b/src/pages/function-edit/FunctionEditPage.tsx index 00c92d4..3a45b14 100644 --- a/src/pages/function-edit/FunctionEditPage.tsx +++ b/src/pages/function-edit/FunctionEditPage.tsx @@ -1,6 +1,15 @@ import { CodeEditor, DocumentTitle, ListPageHeader } from '@openshift-console/dynamic-plugin-sdk'; import type { Language } from '@patternfly/react-code-editor'; -import { EmptyState, EmptyStateBody, Flex, FlexItem, PageSection } from '@patternfly/react-core'; +import { + Content, + ContentVariants, + EmptyState, + EmptyStateBody, + PageSection, + Sidebar, + SidebarContent, + SidebarPanel, +} from '@patternfly/react-core'; import { CodeIcon } from '@patternfly/react-icons'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -40,15 +49,17 @@ function FunctionEditPageContent() { - - + {state.repoMetadata && ( + + {state.repoMetadata.name} + {' ยท '} + + {state.repoMetadata.owner}/{state.repoMetadata.name} + + + )} + + - - + + - - + + ); diff --git a/src/pages/function-edit/components/FileTreeView.test.tsx b/src/pages/function-edit/components/FileTreeView.test.tsx index bd69181..fecf174 100644 --- a/src/pages/function-edit/components/FileTreeView.test.tsx +++ b/src/pages/function-edit/components/FileTreeView.test.tsx @@ -174,6 +174,23 @@ describe('FileTreeView', () => { expect(screen.queryByText('No files')).not.toBeInTheDocument(); }); + it('renders folder icons on directory nodes but not files', () => { + render( + , + ); + + const testDir = screen.getByText('test').closest('[role="treeitem"]'); + expect(testDir?.querySelector('.pf-v6-c-tree-view__node-icon')).toBeInTheDocument(); + + const fileItem = screen.getByText('index.js').closest('[role="treeitem"]'); + expect(fileItem?.querySelector('.pf-v6-c-tree-view__node-icon')).not.toBeInTheDocument(); + }); + it('shows dirty indicator for modified files', () => { render( ): TreeViewDat name: dirtyPaths.has(id) ? `${name} \u25CF` : name, defaultExpanded: true, }; - if (isDir) item.children = []; + if (isDir) { + item.children = []; + item.icon = ; + item.expandedIcon = ; + } items.push(item); }