feat(greenhouse): add Exposed Services dashboard#1585
feat(greenhouse): add Exposed Services dashboard#1585guoda-puidokaite wants to merge 20 commits intomainfrom
Conversation
🦋 Changeset detectedLatest commit: 7370283 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
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 |
There was a problem hiding this comment.
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-servicesroute, 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
DataGridToolbarfor 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.
Yes, it should. |
There was a problem hiding this comment.
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-servicesroute + 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.
There was a problem hiding this comment.
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-servicesroute 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.
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. |
|
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 |
ArtieReus
left a comment
There was a problem hiding this comment.
Gooooood work! 🎉
just please remember to link the issue with the follow up improvements. Thanks!!
b1dea01 to
0291790
Compare
| className="cursor-pointer" | ||
| > | ||
| <Stack gap="2" alignment="center"> | ||
| <div className="mr-2">{displayName}</div> |
There was a problem hiding this comment.
with the gap on the Stack you won't need the margin here anymore.
| <div className="mr-2">{displayName}</div> | |
| <div>{displayName}</div> |
| <> | ||
| {flattenedExposedServices.map((service, index) => ( | ||
| <DataGridRow key={`${service.serviceName}-${index}`}> | ||
| <DataGridCell className="inline-block"> |
There was a problem hiding this comment.
The inline-block isn't needed anymore after going back to Stack.
| <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>
…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>
c66dedb to
7370283
Compare





Summary
Add a list of exposed services for all clusters to
GreenhouseunderExposed Servicesnavigation tabExposed Services
Filters by
supportGroupas default. This has all filters cleared.EXPOSED SERVICES LIST
PLUGIN INSTANCE DETAIL PAGE
Before
After
Changes Made
DetailsPluginPresetspage to useDataGridToolbarNOTE Will raise a separate issues for:
Exposed Servicespage, navigating to its detail pageRelated Issues
Screenshots (if applicable)
Testing Instructions
Checklist
PR Manifesto
Review the PR Manifesto for best practises.