Skip to content

feat(greenhouse): add Exposed Services dashboard#1585

Open
guoda-puidokaite wants to merge 20 commits intomainfrom
guoda-exposed-services
Open

feat(greenhouse): add Exposed Services dashboard#1585
guoda-puidokaite wants to merge 20 commits intomainfrom
guoda-exposed-services

Conversation

@guoda-puidokaite
Copy link
Copy Markdown
Contributor

@guoda-puidokaite guoda-puidokaite commented Apr 8, 2026

Summary

Add a list of exposed services for all clusters to Greenhouse under Exposed Services navigation tab

Exposed Services

Filters by supportGroup as default. This has all filters cleared.

EXPOSED SERVICES LIST

Screenshot 2026-04-19 at 23 49 46

PLUGIN INSTANCE DETAIL PAGE

Before

Screenshot 2026-04-19 at 23 15 05

After

Screenshot 2026-04-19 at 23 16 00

Changes Made

  • Added a list of exposed services, see ACs
  • Removed list of exposed services from Plugin Instance detail page and added them as a list in Details
  • Updated PluginPresets page to use DataGridToolbar

NOTE Will raise a separate issues for:

  • Selected filters should be removed from the dropdown cross pages
  • Cross page linking e.g. when you press on a cluster in Exposed Services page, navigating to its detail page

Related Issues

Screenshots (if applicable)

Testing Instructions

  1. Review ACs
  2. Test Greenhouse preview link

Checklist

  • I have performed a self-review of my code.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have added tests that prove my fix is effective or that my feature works.
  • New and existing unit tests pass locally with my changes.
  • I have made corresponding changes to the documentation (if applicable).
  • My changes generate no new warnings or errors.
  • I have created a changeset for my changes.

PR Manifesto

Review the PR Manifesto for best practises.

@guoda-puidokaite guoda-puidokaite self-assigned this Apr 8, 2026
@guoda-puidokaite guoda-puidokaite added greenhouse Greenhouse core related task greenhouse-pr-preview Builds a PR preview for greenhouse shell app and plugins. labels Apr 8, 2026
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 8, 2026

🦋 Changeset detected

Latest commit: 7370283

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@cloudoperators/juno-app-greenhouse Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@guoda-puidokaite guoda-puidokaite linked an issue Apr 8, 2026 that may be closed by this pull request
7 tasks
@guoda-puidokaite guoda-puidokaite changed the title exposed services feat(greenhouse): add Exposed Services Apr 20, 2026
@guoda-puidokaite guoda-puidokaite marked this pull request as ready for review April 20, 2026 07:39
@guoda-puidokaite guoda-puidokaite requested a review from a team as a code owner April 20, 2026 07:39
Copy link
Copy Markdown
Collaborator

@ArtieReus ArtieReus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Short question... I see that not just the link is clickable instead the whole cell. Is this intentionally? and if yes is this agreed? we don't have this pattern implemented. From my point of view it should be just the link and not the whole cell.

Image

Copy link
Copy Markdown
Collaborator

@ArtieReus ArtieReus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't the selected filter be removed from the available filters in the dropdown?

Image

Copy link
Copy Markdown
Collaborator

@ArtieReus ArtieReus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Icon seems to float away from string

Image

@guoda-puidokaite
Copy link
Copy Markdown
Contributor Author

guoda-puidokaite commented Apr 20, 2026

Shouldn't the selected filter be removed from the available filters in the dropdown?

Image

(Future Improvement, Existing Functionality)
I think it would be better... I already noted this as a general improvement across views (updated PR description). However, it's something we'll need to to discuss. This is how it works across views right now e.g. check PluginPresets. Instead of this, in the code we currently keep all options and check "if filter isn't already applied, apply it".

@guoda-puidokaite
Copy link
Copy Markdown
Contributor Author

guoda-puidokaite commented Apr 20, 2026

Short question... I see that not just the link is clickable instead the whole cell. Is this intentionally? and if yes is this agreed? we don't have this pattern implemented. From my point of view it should be just the link and not the whole cell.

Image

(Overwrote Default Span Behaviour)
Good catch, needed to override default flex behaviour which spanned the link across the entire cell. But I think this is self explanatory, it's a link that should be clickable, not the cell. Thank You!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Greenhouse Admin page to list services exposed by plugins across clusters, and refactors plugin instance details to show exposed services as compact links rather than a separate grid.

Changes:

  • Added /admin/exposed-services route, navigation entry, data grid, filters, and API fetch helpers for exposed services.
  • Moved exposed-services rendering out of the Plugin Instance “Overview” section and into the “Details” table as link(s).
  • Updated the PluginPresets page to use DataGridToolbar for its header/refresh area.

Reviewed changes

Copilot reviewed 20 out of 21 changed files in this pull request and generated 19 comments.

Show a summary per file
File Description
apps/greenhouse/src/routes/admin/exposed-services.tsx Adds new admin route and loader output for Exposed Services page.
apps/greenhouse/src/routeTree.gen.ts Registers the new route in the generated TanStack Router tree.
apps/greenhouse/src/components/admin/constants.ts Adds cluster + exposed-services selector constants and a new filter id.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Fetches plugin resources with exposed services and applies filtering/sorting.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts Fetches filter value lists for the Exposed Services page.
apps/greenhouse/src/components/admin/ExposedServices/* Implements page layout, filters UI, and the exposed-services data grid.
apps/greenhouse/src/components/admin/mocks/exposedServices.ts Adds mock response data for exposed services tests.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/*.test.tsx Adds initial unit test coverage for the new data grid.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx Removes the dedicated Exposed Services section from the instance overview.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Adds exposed services link list into the instance “Details” table.
apps/greenhouse/src/components/admin/Layout/Navigation.tsx Adds “Exposed Services” entry to the admin nav.
apps/greenhouse/src/components/admin/PluginPresets/index.tsx Switches header area to DataGridToolbar.
apps/greenhouse/src/components/admin/types/schema.d.ts Introduces a new ExposedServices schema type.
apps/greenhouse/src/components/admin/types/k8sTypes.ts Exports ExposedServices type alias from the schema.
.changeset/wide-cups-beam.md Adds changeset entry for the new feature/refactor.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Outdated
Comment thread apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Outdated
Comment thread apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Outdated
Comment thread apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Outdated
Comment thread .changeset/wide-cups-beam.md Outdated
@edda
Copy link
Copy Markdown
Contributor

edda commented Apr 20, 2026

Shouldn't the selected filter be removed from the available filters in the dropdown?

Yes, it should.

Comment thread apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Outdated
Comment thread apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an Admin “Exposed Services” view in the Greenhouse app to list services exposed by plugins across clusters, and adjusts existing pages to reflect the new central location for this information.

Changes:

  • Introduces /admin/exposed-services route + navigation entry and new Exposed Services page (filters + datagrid).
  • Adds API fetch utilities to query plugins with exposed services (labelSelector-based) and derives filter options.
  • Removes the Exposed Services datagrid from plugin instance overview and surfaces exposed service links inline under “Details”; updates PluginPresets toolbar usage.

Reviewed changes

Copilot reviewed 20 out of 21 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
apps/greenhouse/src/routes/admin/exposed-services.tsx New admin route with search validation and default-filter redirect behavior.
apps/greenhouse/src/routeTree.gen.ts Generated route tree updated to include the new exposed-services route.
apps/greenhouse/src/components/admin/types/schema.d.ts Adds schema typing for plugins filtered to those with exposed services.
apps/greenhouse/src/components/admin/types/k8sTypes.ts Exposes PluginsWithExposedServices type alias from the schema.
apps/greenhouse/src/components/admin/constants.ts Adds constants for exposed-services label selector, filter IDs, and default “no value” marker.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts New API helper to fetch plugins-with-exposed-services and derive filter dropdown values.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts New API helper to fetch, flatten, filter, and sort exposed services for the grid.
apps/greenhouse/src/components/admin/mocks/exposedServices.ts Mock response data for exposed services used by new UI tests.
apps/greenhouse/src/components/admin/PluginPresets/index.tsx Switches the PluginPresets page header area to use DataGridToolbar.
apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx Uses SUPPORT_GROUP_LABEL constant for the owning team label lookup.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx Removes the dedicated Exposed Services section from plugin instance overview.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx Removes the old per-plugin exposed services datagrid component.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx Removes tests for the deleted ExposedServices component.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Adds inline exposed service links under “Details” for plugin instances.
apps/greenhouse/src/components/admin/Layout/Navigation.tsx Adds “Exposed Services” to the admin navigation.
apps/greenhouse/src/components/admin/ExposedServices/index.tsx New Exposed Services overview page (heading + refresh toolbar + grid + filters).
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx Filter controls for exposed services (selected filters + search).
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx Exposed services datagrid wrapper with Suspense + error handling.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx RTL test coverage for exposed services rendering/link behavior.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx Suspense-driven datagrid rows fetching and rendering service entries.
.changeset/wide-cups-beam.md Changeset documenting the new admin feature and UI move.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Greenhouse admin page to list all plugin-exposed services across clusters, while refactoring the plugin instance detail page to show exposed services inline within the Details section.

Changes:

  • Introduce /admin/exposed-services route with filters (cluster/plugin/support group) and a DataGrid listing flattened exposed services.
  • Move exposed-services display out of the plugin instance “Overview” section into the “Details” table as link(s).
  • Refine existing admin UI pages (PluginPresets toolbar) and extend shared admin constants/types/utilities.

Reviewed changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
apps/greenhouse/src/routes/admin/exposed-services.tsx New route with search validation, default filter redirect, and loader-provided filter settings + crumb.
apps/greenhouse/src/routeTree.gen.ts Registers the new admin route in the generated route tree.
apps/greenhouse/src/components/admin/utils.ts Adds getSafeExternalUrl helper for sanitizing external links.
apps/greenhouse/src/components/admin/types/schema.d.ts Adds a PluginsWithExposedServices schema type used by the new feature.
apps/greenhouse/src/components/admin/types/k8sTypes.ts Exposes PluginsWithExposedServices type alias.
apps/greenhouse/src/components/admin/constants.ts Adds exposed-services label selector, new filter IDs, and a default placeholder constant.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts Fetches plugins with exposed services and derives filter value lists.
apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Fetches plugins with exposed services, flattens/sorts/services, and applies filters/search.
apps/greenhouse/src/components/admin/mocks/exposedServices.ts Adds mock API response data for tests.
apps/greenhouse/src/components/admin/PluginPresets/index.tsx Switches the header area to DataGridToolbar.
apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx Uses the shared SUPPORT_GROUP_LABEL constant for owning team display.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx Removes the dedicated Exposed Services section from the overview layout.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx Removes the old per-plugin exposed-services DataGrid component.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx Removes tests that covered the deleted per-plugin DataGrid component.
apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Adds inline “Exposed Services” row with safe external links + icon.
apps/greenhouse/src/components/admin/Layout/Navigation.tsx Adds “Exposed Services” item to admin navigation.
apps/greenhouse/src/components/admin/ExposedServices/index.tsx New page container with toolbar + refresh and integration with filters/grid.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx New filters/search UI wired to URL state and filter API query.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx New DataGrid shell with suspense + error boundary.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx Adds a test verifying exposed services render and link behavior.
apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx Suspense-powered row rendering using the flattened exposed services query.
.changeset/wide-cups-beam.md Changeset for the new exposed-services feature.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread apps/greenhouse/src/components/admin/constants.ts Outdated
Comment thread apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts Outdated
Comment thread apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx Outdated
@guoda-puidokaite
Copy link
Copy Markdown
Contributor Author

guoda-puidokaite commented Apr 30, 2026

As I mentioned in today’s meeting, there’s an issue with the ComboBox search: after selecting an item, the internal search state is not reset. As a result, users cannot see the full list of items for a filter type—even when switching back and forth between options. See video:

Screen.Recording.2026-04-27.at.14.07.43.mov
You can fix it remounting the ComboBox with a dynamic key on item selected: https://github.com/cloudoperators/juno/pull/1619/changes#diff-5b0ce3c24c269122c31734a2ed542d7a33c0820ea6e87e5864e516abd9f5b57aR38

I already addressed the next steps for this issue #1585 (comment). I want to fix cross-tab bugs and inconsistencies together, keeping this PR on-topic of new functionality.

@guoda-puidokaite
Copy link
Copy Markdown
Contributor Author

Thank You so much @edda and @ArtieReus for the thorough review. 🚀 I left comments on all the recent feedback. All issues that are cross-tab and not related to new functionality will be addressed in the next PR, keeping this one clean with only new functionality (besides one small change in PagePresets to use DataGridToolbar).

ArtieReus
ArtieReus previously approved these changes Apr 30, 2026
Copy link
Copy Markdown
Collaborator

@ArtieReus ArtieReus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gooooood work! 🎉
just please remember to link the issue with the follow up improvements. Thanks!!

ArtieReus
ArtieReus previously approved these changes May 5, 2026
className="cursor-pointer"
>
<Stack gap="2" alignment="center">
<div className="mr-2">{displayName}</div>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

with the gap on the Stack you won't need the margin here anymore.

Suggested change
<div className="mr-2">{displayName}</div>
<div>{displayName}</div>

<>
{flattenedExposedServices.map((service, index) => (
<DataGridRow key={`${service.serviceName}-${index}`}>
<DataGridCell className="inline-block">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The inline-block isn't needed anymore after going back to Stack.

Suggested change
<DataGridCell className="inline-block">
<DataGridCell>

Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
…ault

Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
Signed-off-by: I531348 <guoda.puidokaite@sap.com>
@guoda-puidokaite guoda-puidokaite force-pushed the guoda-exposed-services branch from c66dedb to 7370283 Compare May 5, 2026 12:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

greenhouse Greenhouse core related task greenhouse-pr-preview Builds a PR preview for greenhouse shell app and plugins.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Task](greenhouse): add exposed services list

4 participants