From 512144176716ca5d01d8e6059372c5c3d658d5a4 Mon Sep 17 00:00:00 2001 From: Achintha Jayaweera Date: Tue, 15 Sep 2026 07:26:52 +0530 Subject: [PATCH 1/5] feat(home): add composable home page widget grid Adds a customizable home page grid (Edit/Add Widget/Save/Cancel/ Restore Defaults/Clear All) wiring in Recently Visited, My Projects, Quick Actions, and Recent Deployments widgets from PR #714. Patches @backstage/plugin-home@0.9.6 via yarn patch to fix two upstream bugs in the toolbar: * Save button was hidden whenever the board had zero widgets, making it impossible to persist an intentionally empty board * Resting-state button required both not-editing and zero widgets before showing a clean control, so an empty saved board fell through to the full edit toolbar instead Signed-off-by: Achintha Jayaweera --- .changeset/ready-taxis-prove.md | 5 ++ ...age-plugin-home-npm-0.9.6-5b249fe852.patch | 32 +++++++++ packages/portal-app/package.json | 3 +- .../src/components/Home/HomePage.tsx | 71 ++++++++++--------- .../src/components/Home/homeWidgets.tsx | 56 +++++++++++++++ yarn.lock | 45 +++++++++++- 6 files changed, 174 insertions(+), 38 deletions(-) create mode 100644 .changeset/ready-taxis-prove.md create mode 100644 .yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch create mode 100644 packages/portal-app/src/components/Home/homeWidgets.tsx diff --git a/.changeset/ready-taxis-prove.md b/.changeset/ready-taxis-prove.md new file mode 100644 index 000000000..11f545a2f --- /dev/null +++ b/.changeset/ready-taxis-prove.md @@ -0,0 +1,5 @@ +--- +'@openchoreo/backstage-portal-app': patch +--- + +Add composable home page widget grid (Recently Visited, My Projects, Quick Actions, Recent Deployments) with Edit/Add Widget/Save controls; patches @backstage/plugin-home@0.9.6 to fix inability to save an empty board and incorrect toolbar resting-state diff --git a/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch b/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch new file mode 100644 index 000000000..2b465c857 --- /dev/null +++ b/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch @@ -0,0 +1,32 @@ +diff --git a/dist/components/CustomHomepage/CustomHomepageButtons.esm.js b/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +index 3662bec654e01d8d0b97b58798591c9ea67b9d66..70afbdb10c356feb04194135d8d8172187e3bf28 100644 +--- a/dist/components/CustomHomepage/CustomHomepageButtons.esm.js ++++ b/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +@@ -45,6 +45,18 @@ const CustomHomepageButtons = (props) => { + startIcon: /* @__PURE__ */ jsx(EditIcon, {}), + children: t("customHomepageButtons.edit") + } ++ ) : !editMode ? /* @__PURE__ */ jsx( ++ Button, ++ { ++ variant: "contained", ++ onClick: () => { ++ changeEditMode(true); ++ setAddWidgetDialogOpen(true); ++ }, ++ size: "small", ++ startIcon: /* @__PURE__ */ jsx(AddIcon, {}), ++ children: t("customHomepageButtons.addWidget") ++ } + ) : /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx(Button, { variant: "contained", onClick: cancel, size: "small", children: t("customHomepageButtons.cancel") }), + defaultConfigAvailable && /* @__PURE__ */ jsx( +@@ -81,7 +93,7 @@ const CustomHomepageButtons = (props) => { + children: t("customHomepageButtons.addWidget") + } + ), +- numWidgets > 0 && /* @__PURE__ */ jsx( ++ /* @__PURE__ */ jsx( + Button, + { + className: styles.contentHeaderBtn, diff --git a/packages/portal-app/package.json b/packages/portal-app/package.json index 84263f8f5..04d803d42 100644 --- a/packages/portal-app/package.json +++ b/packages/portal-app/package.json @@ -51,7 +51,8 @@ "@backstage/plugin-catalog-graph": "^0.6.4", "@backstage/plugin-catalog-import": "^0.13.13", "@backstage/plugin-catalog-react": "^3.0.0", - "@backstage/plugin-home": "^0.9.6", + "@backstage/plugin-home": "patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch", + "@backstage/plugin-home-react": "^0.1.38", "@backstage/plugin-kubernetes": "^0.12.19", "@backstage/plugin-org": "^0.7.4", "@backstage/plugin-permission-common": "^0.9.9", diff --git a/packages/portal-app/src/components/Home/HomePage.tsx b/packages/portal-app/src/components/Home/HomePage.tsx index cb30c3dd9..eb6f4ddac 100644 --- a/packages/portal-app/src/components/Home/HomePage.tsx +++ b/packages/portal-app/src/components/Home/HomePage.tsx @@ -1,6 +1,8 @@ import { Content, Page, Header } from '@backstage/core-components'; -import { HomePageStarredEntities } from '@backstage/plugin-home'; -import { RecentlyVisitedCard } from './RecentlyVisitedCard'; +import { + HomePageStarredEntities, + CustomHomepageGrid, +} from '@backstage/plugin-home'; import { HomePageSearchBar } from '@backstage/plugin-search'; import { SearchContextProvider } from '@backstage/plugin-search-react'; import { Grid, Typography, Box } from '@material-ui/core'; @@ -8,6 +10,12 @@ import { useStyles } from './styles'; import { useUserInfo } from '../../hooks'; import { useNamespacePermission } from '@openchoreo/backstage-plugin-react'; import { HomePagePlatformDetailsCard } from '@openchoreo/backstage-plugin-platform-engineer-core'; +import { + RecentlyVisitedHomeWidget, + MyProjectsHomeWidget, + QuickActionsHomeWidget, + RecentDeploymentsHomeWidget, +} from './homeWidgets'; /** * Custom HomePage that shows content based on user permissions @@ -33,47 +41,40 @@ export const HomePage = () => {
- - {/* Search Bar */} - - - + {/* Search Bar */} + + + - {/* Starred Entities and Recently Visited */} - - - - - - - - - - - - - - + {/* Customizable widget grid. */} + + + + + + + - {/* Platform Details - visible only with namespace read permission */} - {canViewPlatformDetails && ( + {/* Platform Details stays outside the grid on purpose. */} + {canViewPlatformDetails && ( + - )} - + + )} ); -}; +}; \ No newline at end of file diff --git a/packages/portal-app/src/components/Home/homeWidgets.tsx b/packages/portal-app/src/components/Home/homeWidgets.tsx new file mode 100644 index 000000000..cfe467619 --- /dev/null +++ b/packages/portal-app/src/components/Home/homeWidgets.tsx @@ -0,0 +1,56 @@ +import { homePlugin } from '@backstage/plugin-home'; +import { createCardExtension } from '@backstage/plugin-home-react'; +import { RecentlyVisitedCard } from './RecentlyVisitedCard'; +import { RecentDeploymentsCard } from './RecentDeploymentsCard'; +import { + MyProjectsWidget, + QuickActionsSection, +} from '@openchoreo/backstage-plugin'; + +export const RecentlyVisitedHomeWidget = homePlugin.provide( + createCardExtension({ + name: 'RecentlyVisited', + title: 'Recently Visited', + components: async () => ({ Content: RecentlyVisitedCard }), + layout: { + height: { minRows: 4 }, + width: { minColumns: 4 }, + }, + }), +); + +export const MyProjectsHomeWidget = homePlugin.provide( + createCardExtension({ + name: 'MyProjects', + title: 'My Projects', + components: async () => ({ Content: MyProjectsWidget }), + layout: { + height: { minRows: 4 }, + width: { minColumns: 4 }, + }, + }), +); + +export const QuickActionsHomeWidget = homePlugin.provide( + createCardExtension({ + name: 'QuickActions', + title: 'Quick Actions', + components: async () => ({ Content: QuickActionsSection }), + layout: { + height: { minRows: 4 }, + width: { minColumns: 4 }, + }, + }), +); + +export const RecentDeploymentsHomeWidget = homePlugin.provide( + createCardExtension({ + name: 'RecentDeployments', + title: 'Recent Deployments', + components: async () => ({ Content: RecentDeploymentsCard }), + layout: { + height: { minRows: 4 }, + width: { minColumns: 4 }, + }, + }), +); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 6cb15d7bb..85890d1d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4302,7 +4302,7 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-home@npm:^0.9.6": +"@backstage/plugin-home@npm:0.9.6": version: 0.9.6 resolution: "@backstage/plugin-home@npm:0.9.6" dependencies: @@ -4342,6 +4342,46 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-home@patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch": + version: 0.9.6 + resolution: "@backstage/plugin-home@patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch::version=0.9.6&hash=ada97e" + dependencies: + "@backstage/catalog-client": "npm:^1.15.1" + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/core-app-api": "npm:^1.20.1" + "@backstage/core-compat-api": "npm:^0.5.11" + "@backstage/core-components": "npm:^0.18.10" + "@backstage/core-plugin-api": "npm:^1.12.6" + "@backstage/frontend-plugin-api": "npm:^0.17.0" + "@backstage/plugin-catalog-react": "npm:^3.0.0" + "@backstage/plugin-home-react": "npm:^0.1.38" + "@backstage/theme": "npm:^0.7.3" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@rjsf/core": "npm:5.24.13" + "@rjsf/material-ui": "npm:5.24.13" + "@rjsf/utils": "npm:5.24.13" + "@rjsf/validator-ajv8": "npm:5.24.13" + lodash: "npm:^4.17.21" + luxon: "npm:^3.4.3" + react-grid-layout: "npm:1.3.4" + react-resizable: "npm:^3.0.4" + react-use: "npm:^17.2.4" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/8a5eb26521c03d1f67b1855815e09879a6f5b71644423f5320991b6ee52d8c4c308b21535ae963f63ab99676d430af9a0cdec3063bf96c4d58ff30b8bc763600 + languageName: node + linkType: hard + "@backstage/plugin-kubernetes-backend@npm:^0.21.4": version: 0.21.4 resolution: "@backstage/plugin-kubernetes-backend@npm:0.21.4" @@ -10347,7 +10387,8 @@ __metadata: "@backstage/plugin-catalog-graph": "npm:^0.6.4" "@backstage/plugin-catalog-import": "npm:^0.13.13" "@backstage/plugin-catalog-react": "npm:^3.0.0" - "@backstage/plugin-home": "npm:^0.9.6" + "@backstage/plugin-home": "patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch" + "@backstage/plugin-home-react": "npm:^0.1.38" "@backstage/plugin-kubernetes": "npm:^0.12.19" "@backstage/plugin-org": "npm:^0.7.4" "@backstage/plugin-permission-common": "npm:^0.9.9" From 22f8ba374381e61063f8f00b34ad04a376b25617 Mon Sep 17 00:00:00 2001 From: Achintha Jayaweera Date: Tue, 15 Sep 2026 11:39:22 +0530 Subject: [PATCH 2/5] fix(home): resolve CI failures - TypeScript errors, formatting, default layout regression Fixes three real issues found in PR #789's CI run: * TypeScript compile error: CustomHomepageGrid no longer receives the unsupported preventDuplicateWidgets prop (confirmed not present on CustomHomepageGridProps in the installed @backstage/plugin-home version; already a documented no-op, now removed for real) * TypeScript compile error: QuickActionsSection's explicit React.FC annotation widened its return type to ReactNode, which is incompatible with createCardExtension's ComponentParts type; removed the annotation to match the existing working pattern used by MyProjectsWidget (implicit return type inference) * Prettier formatting issues in HomePage.tsx and homeWidgets.tsx Also includes the default-layout fix addressing review feedback that the home page should retain a sensible default view: added a defaultLayout config passed to CustomHomepageGrid so first-time users (and the Restore Defaults button) get the five real widgets instead of an empty board. Signed-off-by: Achintha Jayaweera --- .../portal-app/src/components/Home/HomePage.tsx | 13 +++++++++++-- .../portal-app/src/components/Home/homeWidgets.tsx | 2 +- .../HomePage/QuickActionsSection/QuickActions.tsx | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/portal-app/src/components/Home/HomePage.tsx b/packages/portal-app/src/components/Home/HomePage.tsx index eb6f4ddac..0e3372c9b 100644 --- a/packages/portal-app/src/components/Home/HomePage.tsx +++ b/packages/portal-app/src/components/Home/HomePage.tsx @@ -2,6 +2,7 @@ import { Content, Page, Header } from '@backstage/core-components'; import { HomePageStarredEntities, CustomHomepageGrid, + type LayoutConfiguration, } from '@backstage/plugin-home'; import { HomePageSearchBar } from '@backstage/plugin-search'; import { SearchContextProvider } from '@backstage/plugin-search-react'; @@ -20,6 +21,14 @@ import { /** * Custom HomePage that shows content based on user permissions */ +const defaultLayout: LayoutConfiguration[] = [ + { component: 'HomePageStarredEntities', x: 0, y: 0, width: 6, height: 4 }, + { component: 'RecentlyVisited', x: 6, y: 0, width: 6, height: 4 }, + { component: 'MyProjects', x: 0, y: 4, width: 4, height: 4 }, + { component: 'QuickActions', x: 4, y: 4, width: 4, height: 4 }, + { component: 'RecentDeployments', x: 8, y: 4, width: 4, height: 4 }, +]; + export const HomePage = () => { const classes = useStyles(); const { userName, loading } = useUserInfo(); @@ -55,7 +64,7 @@ export const HomePage = () => { {/* Customizable widget grid. */} - + @@ -77,4 +86,4 @@ export const HomePage = () => { ); -}; \ No newline at end of file +}; diff --git a/packages/portal-app/src/components/Home/homeWidgets.tsx b/packages/portal-app/src/components/Home/homeWidgets.tsx index cfe467619..fd7a00a7d 100644 --- a/packages/portal-app/src/components/Home/homeWidgets.tsx +++ b/packages/portal-app/src/components/Home/homeWidgets.tsx @@ -53,4 +53,4 @@ export const RecentDeploymentsHomeWidget = homePlugin.provide( width: { minColumns: 4 }, }, }), -); \ No newline at end of file +); diff --git a/plugins/openchoreo/src/components/HomePage/QuickActionsSection/QuickActions.tsx b/plugins/openchoreo/src/components/HomePage/QuickActionsSection/QuickActions.tsx index 9211cb26c..656695e34 100644 --- a/plugins/openchoreo/src/components/HomePage/QuickActionsSection/QuickActions.tsx +++ b/plugins/openchoreo/src/components/HomePage/QuickActionsSection/QuickActions.tsx @@ -12,7 +12,7 @@ import { Link } from 'react-router-dom'; import { useComponentCreatePermission } from '@openchoreo/backstage-plugin-react'; import { useStyles } from './styles'; -export const QuickActionsSection: React.FC = () => { +export const QuickActionsSection = () => { const classes = useStyles(); const { canCreate, loading: createPermLoading } = useComponentCreatePermission(); From 9d84f09c5a1806da9331dd03859e9109116b1fa8 Mon Sep 17 00:00:00 2001 From: Achintha Jayaweera Date: Tue, 15 Sep 2026 17:07:02 +0530 Subject: [PATCH 3/5] fix(home): remove yarn patch, match default layout to pre-PR home page Per reviewer feedback: - Removed the yarn patch for @backstage/plugin-home@0.9.6 entirely. The two toolbar bugs it fixed are no longer a concern: the reviewer confirmed that not being able to save an empty board is acceptable behavior (the home page shouldn't realistically be empty), so the plain released package is used instead of a patched one. - Changed defaultLayout to exactly match the pre-PR home page (HomePageStarredEntities + RecentlyVisited side by side), instead of showing all five widgets by default. My Projects, Quick Actions, and Recent Deployments remain available via Add Widget, just not shown by default. Signed-off-by: Achintha Jayaweera --- ...age-plugin-home-npm-0.9.6-5b249fe852.patch | 32 -- packages/portal-app/package.json | 2 +- .../src/components/Home/HomePage.tsx | 3 - yarn.lock | 462 ++++++++++++++++-- 4 files changed, 424 insertions(+), 75 deletions(-) delete mode 100644 .yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch diff --git a/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch b/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch deleted file mode 100644 index 2b465c857..000000000 --- a/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/dist/components/CustomHomepage/CustomHomepageButtons.esm.js b/dist/components/CustomHomepage/CustomHomepageButtons.esm.js -index 3662bec654e01d8d0b97b58798591c9ea67b9d66..70afbdb10c356feb04194135d8d8172187e3bf28 100644 ---- a/dist/components/CustomHomepage/CustomHomepageButtons.esm.js -+++ b/dist/components/CustomHomepage/CustomHomepageButtons.esm.js -@@ -45,6 +45,18 @@ const CustomHomepageButtons = (props) => { - startIcon: /* @__PURE__ */ jsx(EditIcon, {}), - children: t("customHomepageButtons.edit") - } -+ ) : !editMode ? /* @__PURE__ */ jsx( -+ Button, -+ { -+ variant: "contained", -+ onClick: () => { -+ changeEditMode(true); -+ setAddWidgetDialogOpen(true); -+ }, -+ size: "small", -+ startIcon: /* @__PURE__ */ jsx(AddIcon, {}), -+ children: t("customHomepageButtons.addWidget") -+ } - ) : /* @__PURE__ */ jsxs(Fragment, { children: [ - /* @__PURE__ */ jsx(Button, { variant: "contained", onClick: cancel, size: "small", children: t("customHomepageButtons.cancel") }), - defaultConfigAvailable && /* @__PURE__ */ jsx( -@@ -81,7 +93,7 @@ const CustomHomepageButtons = (props) => { - children: t("customHomepageButtons.addWidget") - } - ), -- numWidgets > 0 && /* @__PURE__ */ jsx( -+ /* @__PURE__ */ jsx( - Button, - { - className: styles.contentHeaderBtn, diff --git a/packages/portal-app/package.json b/packages/portal-app/package.json index 04d803d42..389d2aeae 100644 --- a/packages/portal-app/package.json +++ b/packages/portal-app/package.json @@ -51,7 +51,7 @@ "@backstage/plugin-catalog-graph": "^0.6.4", "@backstage/plugin-catalog-import": "^0.13.13", "@backstage/plugin-catalog-react": "^3.0.0", - "@backstage/plugin-home": "patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch", + "@backstage/plugin-home": "^0.9.6", "@backstage/plugin-home-react": "^0.1.38", "@backstage/plugin-kubernetes": "^0.12.19", "@backstage/plugin-org": "^0.7.4", diff --git a/packages/portal-app/src/components/Home/HomePage.tsx b/packages/portal-app/src/components/Home/HomePage.tsx index 0e3372c9b..9c5c620c1 100644 --- a/packages/portal-app/src/components/Home/HomePage.tsx +++ b/packages/portal-app/src/components/Home/HomePage.tsx @@ -24,9 +24,6 @@ import { const defaultLayout: LayoutConfiguration[] = [ { component: 'HomePageStarredEntities', x: 0, y: 0, width: 6, height: 4 }, { component: 'RecentlyVisited', x: 6, y: 0, width: 6, height: 4 }, - { component: 'MyProjects', x: 0, y: 4, width: 4, height: 4 }, - { component: 'QuickActions', x: 4, y: 4, width: 4, height: 4 }, - { component: 'RecentDeployments', x: 8, y: 4, width: 4, height: 4 }, ]; export const HomePage = () => { diff --git a/yarn.lock b/yarn.lock index 85890d1d0..92ecbf524 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2297,6 +2297,35 @@ __metadata: languageName: node linkType: hard +"@backstage/catalog-client@npm:^1.16.1": + version: 1.16.1 + resolution: "@backstage/catalog-client@npm:1.16.1" + dependencies: + "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/plugin-catalog-common": "npm:^1.1.10" + cross-fetch: "npm:^4.0.0" + lodash: "npm:^4.17.21" + uri-template: "npm:^2.0.0" + checksum: 10c0/4b00fbada78234dd7a17863cef6134193b6d0396888cbcbfcda397d7321c594826f4f092d6bd6ac725e32a91ac3baf44a53a3bab5645ac7ef7c7ee803388f64f + languageName: node + linkType: hard + +"@backstage/catalog-model@npm:^1.10.0": + version: 1.10.0 + resolution: "@backstage/catalog-model@npm:1.10.0" + dependencies: + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + ajv: "npm:^8.10.0" + ajv-errors: "npm:^3.0.0" + lodash: "npm:^4.17.21" + zod: "npm:^3.25.76" + checksum: 10c0/7dec54821da2efa9e400891b0a4ad06a6952388f10e1654f6b92663afe6760fa0a72e21f445d9928ad10ccd7d52fbf5198ac3b7c166749df6eb313893a22d827 + languageName: node + linkType: hard + "@backstage/catalog-model@npm:^1.7.5, @backstage/catalog-model@npm:^1.7.6, @backstage/catalog-model@npm:^1.9.0": version: 1.9.0 resolution: "@backstage/catalog-model@npm:1.9.0" @@ -2989,6 +3018,18 @@ __metadata: languageName: node linkType: hard +"@backstage/connections@npm:^0.3.0": + version: 0.3.0 + resolution: "@backstage/connections@npm:0.3.0" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + zod: "npm:^4.0.0" + checksum: 10c0/97b7cdf9675bbc458965da85d15b769a314d0e8febb2fb27e1b679cbd5e5c3f661547ad928a9c750ea8889f03879113d31438a06241454dbb39dab631709b4e5 + languageName: node + linkType: hard + "@backstage/core-app-api@npm:^1.19.4, @backstage/core-app-api@npm:^1.20.1": version: 1.20.1 resolution: "@backstage/core-app-api@npm:1.20.1" @@ -3018,6 +3059,35 @@ __metadata: languageName: node linkType: hard +"@backstage/core-app-api@npm:^1.20.4": + version: 1.20.4 + resolution: "@backstage/core-app-api@npm:1.20.4" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.1" + "@backstage/version-bridge": "npm:^1.0.12" + "@types/prop-types": "npm:^15.7.3" + history: "npm:^5.0.0" + i18next: "npm:^22.4.15" + lodash: "npm:^4.17.21" + prop-types: "npm:^15.7.2" + react-use: "npm:^17.2.4" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/a8f3ed20ef3743ab895a2235a2720d55cca983ccbf41e40695e27b3f9812571ef2b0af3f1f0786c2777c7185dd3a3e46d63ef9e54ce58bbe90fa36d7fc860e46 + languageName: node + linkType: hard + "@backstage/core-compat-api@npm:^0.5.11, @backstage/core-compat-api@npm:^0.5.7": version: 0.5.11 resolution: "@backstage/core-compat-api@npm:0.5.11" @@ -3043,6 +3113,31 @@ __metadata: languageName: node linkType: hard +"@backstage/core-compat-api@npm:^0.5.14": + version: 0.5.14 + resolution: "@backstage/core-compat-api@npm:0.5.14" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/plugin-app-react": "npm:^0.2.6" + "@backstage/plugin-catalog-react": "npm:^3.2.1" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + lodash: "npm:^4.17.21" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/6874c14216dce47fb5ad847f94c62e495e386e617358b6f67de081513b3c907592deb9f109daf07dfeec2bcb9488b357d48aa46451e0b7e4fcc7ee49fceb6863 + languageName: node + linkType: hard + "@backstage/core-components@npm:^0.17.5": version: 0.17.5 resolution: "@backstage/core-components@npm:0.17.5" @@ -3155,6 +3250,65 @@ __metadata: languageName: node linkType: hard +"@backstage/core-components@npm:^0.18.13": + version: 0.18.13 + resolution: "@backstage/core-components@npm:0.18.13" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/errors": "npm:^1.3.1" + "@backstage/theme": "npm:^0.7.3" + "@backstage/ui": "npm:^0.17.1" + "@backstage/version-bridge": "npm:^1.0.12" + "@dagrejs/dagre": "npm:^1.1.4" + "@date-io/core": "npm:^1.3.13" + "@material-table/core": "npm:^3.1.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@testing-library/react": "npm:^16.0.0" + "@types/react-sparklines": "npm:^1.7.0" + ansi-regex: "npm:^6.0.1" + classnames: "npm:^2.2.6" + csstype: "npm:^3.0.2" + d3-selection: "npm:^3.0.0" + d3-shape: "npm:^3.0.0" + d3-zoom: "npm:^3.0.0" + js-yaml: "npm:^4.3.0" + linkify-react: "npm:4.3.2" + linkifyjs: "npm:4.3.2" + lodash: "npm:^4.17.21" + parse5: "npm:^6.0.0" + qs: "npm:^6.15.2" + rc-progress: "npm:3.5.1" + react-full-screen: "npm:^1.1.1" + react-helmet: "npm:6.1.0" + react-hook-form: "npm:^7.12.2" + react-idle-timer: "npm:5.7.2" + react-markdown: "npm:^8.0.0" + react-sparklines: "npm:^1.7.0" + react-syntax-highlighter: "npm:^15.4.5" + react-use: "npm:^17.3.2" + react-virtualized-auto-sizer: "npm:^1.0.11" + react-window: "npm:^1.8.6" + rehype-raw: "npm:^6.0.0" + rehype-sanitize: "npm:^5.0.0" + remark-gfm: "npm:^3.0.1" + zen-observable: "npm:^0.10.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/18694687a9be08799e62749a9ccd9dea006edd029f41ac152af1de1c618afbcdac792ac7914620fee722b48b40711e0830a32d4f36e4519b33d34bc5683c2a75 + languageName: node + linkType: hard + "@backstage/core-plugin-api@npm:^1.10.9, @backstage/core-plugin-api@npm:^1.12.1, @backstage/core-plugin-api@npm:^1.12.2, @backstage/core-plugin-api@npm:^1.12.6": version: 1.12.6 resolution: "@backstage/core-plugin-api@npm:1.12.6" @@ -3178,6 +3332,29 @@ __metadata: languageName: node linkType: hard +"@backstage/core-plugin-api@npm:^1.12.9": + version: 1.12.9 + resolution: "@backstage/core-plugin-api@npm:1.12.9" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + history: "npm:^5.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/209c918060adeb48ff81d32d19e139910bb9947d28e47f9b1a4942e15d3ebf2c091d11eda7e6562f3f39d4bd283b08e4b133a45b392a88cceba3a1728f12b5e3 + languageName: node + linkType: hard + "@backstage/dev-utils@npm:^1.1.23": version: 1.1.23 resolution: "@backstage/dev-utils@npm:1.1.23" @@ -3264,6 +3441,19 @@ __metadata: languageName: node linkType: hard +"@backstage/filter-predicates@npm:^0.1.4": + version: 0.1.4 + resolution: "@backstage/filter-predicates@npm:0.1.4" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + zod: "npm:^3.25.76 || ^4.0.0" + zod-validation-error: "npm:^5.0.0" + checksum: 10c0/0e54760800797c45df47f58f0c1138cd2667939f0d1a4b83c63466fed82b293ffc144751bf98684b2e61edcc111c1cb34ebf607f19befd361e9b8f061f04d1cc + languageName: node + linkType: hard + "@backstage/frontend-app-api@npm:^0.14.1": version: 0.14.1 resolution: "@backstage/frontend-app-api@npm:0.14.1" @@ -3407,6 +3597,28 @@ __metadata: languageName: node linkType: hard +"@backstage/frontend-plugin-api@npm:^0.18.0": + version: 0.18.0 + resolution: "@backstage/frontend-plugin-api@npm:0.18.0" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/types": "npm:^1.2.2" + "@backstage/version-bridge": "npm:^1.0.12" + "@standard-schema/spec": "npm:^1.1.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/30d677b7002706c32ea5426e6b25b49ac905f07f6d5777ae372bfdc90f3be24bde8e09087a6241861f8eaa4abb385153dbb08363fe80321202397ec01d488bf0 + languageName: node + linkType: hard + "@backstage/frontend-test-utils@npm:^0.4.5": version: 0.4.5 resolution: "@backstage/frontend-test-utils@npm:0.4.5" @@ -3520,6 +3732,27 @@ __metadata: languageName: node linkType: hard +"@backstage/integration-react@npm:^1.2.21": + version: 1.2.21 + resolution: "@backstage/integration-react@npm:1.2.21" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/integration": "npm:^2.1.0" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f68dda358ce8829eca9008d8549192d492b9a8877f9080311120541307f3187b6ca65f25c8d3fd708092f96db404bea5fd3975a7887489a9504a39d606c3afab + languageName: node + linkType: hard + "@backstage/integration@npm:^1.17.1, @backstage/integration@npm:^1.19.2": version: 1.19.2 resolution: "@backstage/integration@npm:1.19.2" @@ -3575,6 +3808,26 @@ __metadata: languageName: node linkType: hard +"@backstage/integration@npm:^2.1.0": + version: 2.1.1 + resolution: "@backstage/integration@npm:2.1.1" + dependencies: + "@azure/identity": "npm:^4.0.0" + "@azure/storage-blob": "npm:^12.5.0" + "@backstage/config": "npm:^1.3.8" + "@backstage/connections": "npm:^0.3.0" + "@backstage/errors": "npm:^1.3.1" + "@octokit/auth-app": "npm:^4.0.0" + "@octokit/rest": "npm:^19.0.3" + cross-fetch: "npm:^4.0.0" + git-url-parse: "npm:^15.0.0" + lodash: "npm:^4.17.21" + luxon: "npm:^3.0.0" + p-throttle: "npm:^4.1.1" + checksum: 10c0/6f7ab64f743f43323cee0764de089e67ffa4497821620fe7cd1fa16eee5fc10564b56e7f71955fca63120b1f96948ae9b849f014c12d791ab1672084d7394b21 + languageName: node + linkType: hard + "@backstage/module-federation-common@npm:^0.1.4": version: 0.1.4 resolution: "@backstage/module-federation-common@npm:0.1.4" @@ -3709,6 +3962,25 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-app-react@npm:^0.2.6": + version: 0.2.6 + resolution: "@backstage/plugin-app-react@npm:0.2.6" + dependencies: + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@material-ui/core": "npm:^4.9.13" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/6af5cdd9fdef3a4ae059f77bfc2f0ba86ef27d064516aafca2867ccedc284c6d4b025e6af39b965c26b1c3e6ca1330ce27bd71aaeaa88b54ae50ce62befa57a9 + languageName: node + linkType: hard + "@backstage/plugin-app@npm:^0.3.5": version: 0.3.5 resolution: "@backstage/plugin-app@npm:0.3.5" @@ -4196,6 +4468,53 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-catalog-react@npm:^3.2.1": + version: 3.2.2 + resolution: "@backstage/plugin-catalog-react@npm:3.2.2" + dependencies: + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.10.0" + "@backstage/core-compat-api": "npm:^0.5.14" + "@backstage/core-components": "npm:^0.18.13" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/errors": "npm:^1.3.1" + "@backstage/filter-predicates": "npm:^0.1.4" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/integration-react": "npm:^1.2.21" + "@backstage/plugin-permission-common": "npm:^0.9.10" + "@backstage/plugin-permission-react": "npm:^0.5.4" + "@backstage/types": "npm:^1.2.2" + "@backstage/ui": "npm:^0.17.1" + "@backstage/version-bridge": "npm:^1.0.12" + "@material-ui/core": "npm:^4.12.2" + "@material-ui/icons": "npm:^4.9.1" + "@material-ui/lab": "npm:4.0.0-alpha.61" + "@react-hookz/web": "npm:^24.0.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + classnames: "npm:^2.2.6" + lodash: "npm:^4.17.21" + material-ui-popup-state: "npm:^5.3.6" + qs: "npm:^6.15.2" + react-use: "npm:^17.2.4" + react-window: "npm:^1.8.10" + yaml: "npm:^2.0.0" + zen-observable: "npm:^0.10.0" + zod: "npm:^4.0.0" + peerDependencies: + "@backstage/frontend-test-utils": ^0.6.3 + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@backstage/frontend-test-utils": + optional: true + "@types/react": + optional: true + checksum: 10c0/b9ccc684d417dd103742f468ba0fdeec8af540f0c3116e7b046fca7bdf0db2113a94c7f23918810732ae071acd9cbbe80189c88898645fc188f1c213d4dd9565 + languageName: node + linkType: hard + "@backstage/plugin-catalog@npm:^2.0.5": version: 2.0.5 resolution: "@backstage/plugin-catalog@npm:2.0.5" @@ -4302,34 +4621,17 @@ __metadata: languageName: node linkType: hard -"@backstage/plugin-home@npm:0.9.6": - version: 0.9.6 - resolution: "@backstage/plugin-home@npm:0.9.6" +"@backstage/plugin-home-react@npm:^0.1.41": + version: 0.1.41 + resolution: "@backstage/plugin-home-react@npm:0.1.41" dependencies: - "@backstage/catalog-client": "npm:^1.15.1" - "@backstage/catalog-model": "npm:^1.9.0" - "@backstage/config": "npm:^1.3.8" - "@backstage/core-app-api": "npm:^1.20.1" - "@backstage/core-compat-api": "npm:^0.5.11" - "@backstage/core-components": "npm:^0.18.10" - "@backstage/core-plugin-api": "npm:^1.12.6" - "@backstage/frontend-plugin-api": "npm:^0.17.0" - "@backstage/plugin-catalog-react": "npm:^3.0.0" - "@backstage/plugin-home-react": "npm:^0.1.38" - "@backstage/theme": "npm:^0.7.3" + "@backstage/core-compat-api": "npm:^0.5.14" + "@backstage/core-components": "npm:^0.18.13" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/frontend-plugin-api": "npm:^0.18.0" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" - "@material-ui/lab": "npm:4.0.0-alpha.61" - "@rjsf/core": "npm:5.24.13" - "@rjsf/material-ui": "npm:5.24.13" "@rjsf/utils": "npm:5.24.13" - "@rjsf/validator-ajv8": "npm:5.24.13" - lodash: "npm:^4.17.21" - luxon: "npm:^3.4.3" - react-grid-layout: "npm:1.3.4" - react-resizable: "npm:^3.0.4" - react-use: "npm:^17.2.4" - zod: "npm:^3.25.76 || ^4.0.0" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -4338,24 +4640,24 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/ed63d4c1a865b4a7260bdacb3046afc5391dd169522767b2a53bc22851cb34f5c9adbf71118949ad1e71f00b550c71466468ed6164482094759bd31b618de71e + checksum: 10c0/612b09945d746ec02a34f33b2c933a0b9764ead6b5abd503954e08e1b014d52b93f2d2505aa403baf18f27ad303b10cafabcd72eab51b299b9d0bf798a87a218 languageName: node linkType: hard -"@backstage/plugin-home@patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch": - version: 0.9.6 - resolution: "@backstage/plugin-home@patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch::version=0.9.6&hash=ada97e" +"@backstage/plugin-home@npm:^0.9.6": + version: 0.9.9 + resolution: "@backstage/plugin-home@npm:0.9.9" dependencies: - "@backstage/catalog-client": "npm:^1.15.1" - "@backstage/catalog-model": "npm:^1.9.0" + "@backstage/catalog-client": "npm:^1.16.1" + "@backstage/catalog-model": "npm:^1.10.0" "@backstage/config": "npm:^1.3.8" - "@backstage/core-app-api": "npm:^1.20.1" - "@backstage/core-compat-api": "npm:^0.5.11" - "@backstage/core-components": "npm:^0.18.10" - "@backstage/core-plugin-api": "npm:^1.12.6" - "@backstage/frontend-plugin-api": "npm:^0.17.0" - "@backstage/plugin-catalog-react": "npm:^3.0.0" - "@backstage/plugin-home-react": "npm:^0.1.38" + "@backstage/core-app-api": "npm:^1.20.4" + "@backstage/core-compat-api": "npm:^0.5.14" + "@backstage/core-components": "npm:^0.18.13" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/frontend-plugin-api": "npm:^0.18.0" + "@backstage/plugin-catalog-react": "npm:^3.2.1" + "@backstage/plugin-home-react": "npm:^0.1.41" "@backstage/theme": "npm:^0.7.3" "@material-ui/core": "npm:^4.12.2" "@material-ui/icons": "npm:^4.9.1" @@ -4378,7 +4680,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/8a5eb26521c03d1f67b1855815e09879a6f5b71644423f5320991b6ee52d8c4c308b21535ae963f63ab99676d430af9a0cdec3063bf96c4d58ff30b8bc763600 + checksum: 10c0/521490949dec0948a583a984476212527bf7c972aa43cea778f9482ed35b5ab8707fa669305d481e870f23189471dc4974f46f010097b1ada5b791d644bb93ef languageName: node linkType: hard @@ -4561,6 +4863,20 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-permission-common@npm:^0.9.10": + version: 0.9.10 + resolution: "@backstage/plugin-permission-common@npm:0.9.10" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/errors": "npm:^1.3.1" + "@backstage/types": "npm:^1.2.2" + cross-fetch: "npm:^4.0.0" + zod: "npm:^3.25.76 || ^4.0.0" + zod-to-json-schema: "npm:^3.25.1" + checksum: 10c0/7fabd3906d6d7c741b83bfa351287bec44ccb100d5ad6753a25f6ff4055c2ba284bbd7d2ea0853435b66fcc8def19dff229c7d4857e4b21eff06158069860971 + languageName: node + linkType: hard + "@backstage/plugin-permission-common@npm:^0.9.3, @backstage/plugin-permission-common@npm:^0.9.5, @backstage/plugin-permission-common@npm:^0.9.9": version: 0.9.9 resolution: "@backstage/plugin-permission-common@npm:0.9.9" @@ -4650,6 +4966,26 @@ __metadata: languageName: node linkType: hard +"@backstage/plugin-permission-react@npm:^0.5.4": + version: 0.5.4 + resolution: "@backstage/plugin-permission-react@npm:0.5.4" + dependencies: + "@backstage/config": "npm:^1.3.8" + "@backstage/core-plugin-api": "npm:^1.12.9" + "@backstage/plugin-permission-common": "npm:^0.9.10" + dataloader: "npm:^2.0.0" + swr: "npm:^2.0.0" + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/672f90c31b786000873755736cc07261a7ad11fe8ab45127fcb293cea320b3ab4677329b922c8d62324925419ba455e1887bff543433252fb5505cd6eaf1dfce + languageName: node + linkType: hard + "@backstage/plugin-proxy-backend@npm:^0.6.13": version: 0.6.13 resolution: "@backstage/plugin-proxy-backend@npm:0.6.13" @@ -5472,6 +5808,33 @@ __metadata: languageName: node linkType: hard +"@backstage/ui@npm:^0.17.1": + version: 0.17.1 + resolution: "@backstage/ui@npm:0.17.1" + dependencies: + "@backstage/version-bridge": "npm:^1.0.12" + "@braintree/sanitize-url": "npm:^7.1.2" + "@internationalized/date": "npm:^3.12.0" + "@remixicon/react": "npm:>=4.6.0 <4.9.0" + "@tanstack/react-table": "npm:^8.21.3" + clsx: "npm:^2.1.1" + marked: "npm:^15.0.12" + react-aria: "npm:~3.48.0" + react-aria-components: "npm:~1.17.0" + react-stately: "npm:~3.46.0" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + "@types/react": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + react-router-dom: ^6.30.2 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/88388f9d314665e72c655cb0ad745e812584254805715c80371f0e00731649efd7ea23b0c595b16ea2d132bd4d894ff1bf3b7b8a36277dba650f90f0f2e11c41 + languageName: node + linkType: hard + "@backstage/version-bridge@npm:^1.0.11, @backstage/version-bridge@npm:^1.0.12": version: 1.0.12 resolution: "@backstage/version-bridge@npm:1.0.12" @@ -10387,7 +10750,7 @@ __metadata: "@backstage/plugin-catalog-graph": "npm:^0.6.4" "@backstage/plugin-catalog-import": "npm:^0.13.13" "@backstage/plugin-catalog-react": "npm:^3.0.0" - "@backstage/plugin-home": "patch:@backstage/plugin-home@npm%3A0.9.6#~/.yarn/patches/@backstage-plugin-home-npm-0.9.6-5b249fe852.patch" + "@backstage/plugin-home": "npm:^0.9.6" "@backstage/plugin-home-react": "npm:^0.1.38" "@backstage/plugin-kubernetes": "npm:^0.12.19" "@backstage/plugin-org": "npm:^0.7.4" @@ -26443,6 +26806,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.3.0": + version: 4.3.2 + resolution: "js-yaml@npm:4.3.2" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/dedd34c2e8fef1d504687f1bc94ed0ee1311a1f78770fa2800352c6d59c635ccf555009d74e9afe529ae62199da2b1ccef30e53dc84dcd8d2d8187c22574bc97 + languageName: node + linkType: hard + "jsbn@npm:^1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -32298,6 +32672,16 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.15.2": + version: 6.16.0 + resolution: "qs@npm:6.16.0" + dependencies: + es-define-property: "npm:^1.0.1" + side-channel: "npm:^1.1.1" + checksum: 10c0/eb3e31992fbd70e31a1791e571ed817d70975de7d3bfcbbbec93d77d1dd305877e9e8fdbcc62303c228ee5c3606685622cd6231c042dbc4790bb4e7c65fcbe18 + languageName: node + linkType: hard + "quansync@npm:^0.2.7": version: 0.2.11 resolution: "quansync@npm:0.2.11" From 0aef7d0079c3aea06dd39774160055aa3c95e511 Mon Sep 17 00:00:00 2001 From: Achintha Jayaweera Date: Tue, 15 Sep 2026 17:24:30 +0530 Subject: [PATCH 4/5] fix(home): update changeset to remove stale patch reference The changeset still described patching @backstage/plugin-home@0.9.6, which is no longer accurate now that the yarn patch has been removed (per reviewer feedback). Updated the description to reflect the current change accurately. Signed-off-by: Achintha Jayaweera --- .changeset/ready-taxis-prove.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/ready-taxis-prove.md b/.changeset/ready-taxis-prove.md index 11f545a2f..5d4c30e44 100644 --- a/.changeset/ready-taxis-prove.md +++ b/.changeset/ready-taxis-prove.md @@ -2,4 +2,4 @@ '@openchoreo/backstage-portal-app': patch --- -Add composable home page widget grid (Recently Visited, My Projects, Quick Actions, Recent Deployments) with Edit/Add Widget/Save controls; patches @backstage/plugin-home@0.9.6 to fix inability to save an empty board and incorrect toolbar resting-state +Add composable home page widget grid (Recently Visited, My Projects, Quick Actions, Recent Deployments) with Edit/Add Widget/Save controls; default view matches the existing home page layout From d73ee4a868c642022aa7e863a81e450e8efeb42f Mon Sep 17 00:00:00 2001 From: Achintha Jayaweera Date: Wed, 16 Sep 2026 08:45:45 +0530 Subject: [PATCH 5/5] fix(home): remove duplicate card titles RecentlyVisitedHomeWidget, MyProjectsHomeWidget, and RecentDeploymentsHomeWidget each passed a title to createCardExtension, but their underlying components (RecentlyVisitedCard, MyProjectsWidget via SummaryWidgetWrapper, RecentDeploymentsCard) already render their own title via InfoCard, causing a stacked double-title on each card. Removed the redundant title from createCardExtension for these three; QuickActionsSection has no internal title so its title is unchanged. Signed-off-by: Achintha Jayaweera --- packages/portal-app/src/components/Home/homeWidgets.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/portal-app/src/components/Home/homeWidgets.tsx b/packages/portal-app/src/components/Home/homeWidgets.tsx index fd7a00a7d..8539cb38e 100644 --- a/packages/portal-app/src/components/Home/homeWidgets.tsx +++ b/packages/portal-app/src/components/Home/homeWidgets.tsx @@ -10,7 +10,6 @@ import { export const RecentlyVisitedHomeWidget = homePlugin.provide( createCardExtension({ name: 'RecentlyVisited', - title: 'Recently Visited', components: async () => ({ Content: RecentlyVisitedCard }), layout: { height: { minRows: 4 }, @@ -22,7 +21,6 @@ export const RecentlyVisitedHomeWidget = homePlugin.provide( export const MyProjectsHomeWidget = homePlugin.provide( createCardExtension({ name: 'MyProjects', - title: 'My Projects', components: async () => ({ Content: MyProjectsWidget }), layout: { height: { minRows: 4 }, @@ -46,7 +44,6 @@ export const QuickActionsHomeWidget = homePlugin.provide( export const RecentDeploymentsHomeWidget = homePlugin.provide( createCardExtension({ name: 'RecentDeployments', - title: 'Recent Deployments', components: async () => ({ Content: RecentDeploymentsCard }), layout: { height: { minRows: 4 },