From 2f9d3df335593ea9b6df4b55f980b41e4032b8ef Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 4 Jul 2025 10:02:33 -0500 Subject: [PATCH 1/2] Added initial app-next Signed-off-by: Andre Wanlin --- package.json | 1 + packages/app-next/.eslintrc.js | 1 + packages/app-next/config.d.ts | 14 + packages/app-next/e2e-tests/app.test.ts | 22 + packages/app-next/package.json | 84 ++++ .../public/android-chrome-192x192.png | Bin 0 -> 13599 bytes packages/app-next/public/apple-touch-icon.png | Bin 0 -> 12619 bytes packages/app-next/public/favicon-16x16.png | Bin 0 -> 883 bytes packages/app-next/public/favicon-32x32.png | Bin 0 -> 1686 bytes packages/app-next/public/favicon.ico | Bin 0 -> 15086 bytes packages/app-next/public/google-cloud.png | Bin 0 -> 6803 bytes packages/app-next/public/graphiql.png | Bin 0 -> 16674 bytes packages/app-next/public/index.html | 71 +++ packages/app-next/public/manifest.json | 15 + packages/app-next/public/robots.txt | 3 + .../app-next/public/safari-pinned-tab.svg | 1 + packages/app-next/public/tech-radar.png | Bin 0 -> 60371 bytes packages/app-next/src/App.test.tsx | 27 ++ packages/app-next/src/App.tsx | 255 ++++++++++ packages/app-next/src/apis.ts | 140 ++++++ .../src/components/Root/ApertureLogoFull.tsx | 79 ++++ .../src/components/Root/ApertureLogoIcon.tsx | 40 ++ .../app-next/src/components/Root/LogoFull.tsx | 45 ++ .../app-next/src/components/Root/LogoIcon.tsx | 46 ++ .../app-next/src/components/Root/Root.tsx | 117 +++++ .../app-next/src/components/Root/index.ts | 1 + .../src/components/catalog/EntityPage.tsx | 441 ++++++++++++++++++ .../components/home/CustomizableHomePage.tsx | 79 ++++ .../app-next/src/components/home/shared.tsx | 43 ++ .../src/components/search/SearchPage.tsx | 169 +++++++ .../settings/NotificationSettings.tsx | 66 +++ packages/app-next/src/index.tsx | 5 + packages/app-next/src/plugins.ts | 1 + packages/app-next/src/setupTests.ts | 1 + packages/app-next/src/theme/aperture.ts | 295 ++++++++++++ yarn.lock | 54 +++ 36 files changed, 2116 insertions(+) create mode 100644 packages/app-next/.eslintrc.js create mode 100644 packages/app-next/config.d.ts create mode 100644 packages/app-next/e2e-tests/app.test.ts create mode 100644 packages/app-next/package.json create mode 100644 packages/app-next/public/android-chrome-192x192.png create mode 100644 packages/app-next/public/apple-touch-icon.png create mode 100644 packages/app-next/public/favicon-16x16.png create mode 100644 packages/app-next/public/favicon-32x32.png create mode 100644 packages/app-next/public/favicon.ico create mode 100644 packages/app-next/public/google-cloud.png create mode 100644 packages/app-next/public/graphiql.png create mode 100644 packages/app-next/public/index.html create mode 100644 packages/app-next/public/manifest.json create mode 100644 packages/app-next/public/robots.txt create mode 100644 packages/app-next/public/safari-pinned-tab.svg create mode 100644 packages/app-next/public/tech-radar.png create mode 100644 packages/app-next/src/App.test.tsx create mode 100644 packages/app-next/src/App.tsx create mode 100644 packages/app-next/src/apis.ts create mode 100644 packages/app-next/src/components/Root/ApertureLogoFull.tsx create mode 100644 packages/app-next/src/components/Root/ApertureLogoIcon.tsx create mode 100644 packages/app-next/src/components/Root/LogoFull.tsx create mode 100644 packages/app-next/src/components/Root/LogoIcon.tsx create mode 100644 packages/app-next/src/components/Root/Root.tsx create mode 100644 packages/app-next/src/components/Root/index.ts create mode 100644 packages/app-next/src/components/catalog/EntityPage.tsx create mode 100644 packages/app-next/src/components/home/CustomizableHomePage.tsx create mode 100644 packages/app-next/src/components/home/shared.tsx create mode 100644 packages/app-next/src/components/search/SearchPage.tsx create mode 100644 packages/app-next/src/components/settings/NotificationSettings.tsx create mode 100644 packages/app-next/src/index.tsx create mode 100644 packages/app-next/src/plugins.ts create mode 100644 packages/app-next/src/setupTests.ts create mode 100644 packages/app-next/src/theme/aperture.ts diff --git a/package.json b/package.json index 0b195754a..b83496952 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "scripts": { "start": "backstage-cli repo start", "start:app-migrated": "backstage-cli repo start app-migrated backend", + "start:app-next": "backstage-cli repo start app-next backend", "start:otel-prerequisites": "docker-compose -f ./open-telemetry/docker-compose.yaml up", "build:backend": "yarn workspace backend build", "build:all": "backstage-cli repo build --all", diff --git a/packages/app-next/.eslintrc.js b/packages/app-next/.eslintrc.js new file mode 100644 index 000000000..e2a53a6ad --- /dev/null +++ b/packages/app-next/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/app-next/config.d.ts b/packages/app-next/config.d.ts new file mode 100644 index 000000000..a92c543d4 --- /dev/null +++ b/packages/app-next/config.d.ts @@ -0,0 +1,14 @@ +export interface Config { + /** + * @visibility frontend + */ + notificationsTester?: { + /** + * Flag to enable or disable the tester + * Default is enabled + * + * @visibility frontend + */ + enabled: boolean; + }; +} diff --git a/packages/app-next/e2e-tests/app.test.ts b/packages/app-next/e2e-tests/app.test.ts new file mode 100644 index 000000000..f0124e6c0 --- /dev/null +++ b/packages/app-next/e2e-tests/app.test.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from '@playwright/test'; + +test('App should render the welcome page', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText('My Company Catalog')).toBeVisible(); +}); diff --git a/packages/app-next/package.json b/packages/app-next/package.json new file mode 100644 index 000000000..7c932bab9 --- /dev/null +++ b/packages/app-next/package.json @@ -0,0 +1,84 @@ +{ + "name": "app-next", + "version": "0.0.0", + "private": true, + "backstage": { + "role": "frontend" + }, + "bundled": true, + "dependencies": { + "@backstage-community/plugin-badges": "^0.9.0", + "@backstage-community/plugin-cost-insights": "^0.15.1", + "@backstage-community/plugin-explore": "^0.9.0", + "@backstage-community/plugin-github-actions": "^0.11.0", + "@backstage-community/plugin-graphiql": "^0.4.1", + "@backstage-community/plugin-tech-radar": "^1.6.0", + "@backstage-community/plugin-todo": "^0.9.0", + "@backstage/canon": "backstage:^", + "@backstage/cli": "backstage:^", + "@backstage/core-app-api": "backstage:^", + "@backstage/core-compat-api": "backstage:^", + "@backstage/core-components": "backstage:^", + "@backstage/core-plugin-api": "backstage:^", + "@backstage/frontend-defaults": "backstage:^", + "@backstage/frontend-plugin-api": "backstage:^", + "@backstage/integration-react": "backstage:^", + "@backstage/plugin-api-docs": "backstage:^", + "@backstage/plugin-catalog": "backstage:^", + "@backstage/plugin-catalog-graph": "backstage:^", + "@backstage/plugin-catalog-react": "backstage:^", + "@backstage/plugin-home": "backstage:^", + "@backstage/plugin-kubernetes": "backstage:^", + "@backstage/plugin-notifications": "backstage:^", + "@backstage/plugin-org": "backstage:^", + "@backstage/plugin-scaffolder": "backstage:^", + "@backstage/plugin-search": "backstage:^", + "@backstage/plugin-search-react": "backstage:^", + "@backstage/plugin-signals": "backstage:^", + "@backstage/plugin-techdocs": "backstage:^", + "@backstage/plugin-techdocs-module-addons-contrib": "backstage:^", + "@backstage/plugin-techdocs-react": "backstage:^", + "@backstage/plugin-user-settings": "backstage:^", + "@backstage/theme": "backstage:^", + "@material-ui/core": "^4.11.0", + "@material-ui/icons": "^4.9.1", + "backstage-plugin-techdocs-addon-mermaid": "^0.21.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router": "^6.3.0", + "react-router-dom": "^6.3.0" + }, + "devDependencies": { + "@playwright/test": "^1.32.3", + "@testing-library/dom": "^10.1.0", + "@testing-library/jest-dom": "^6.0.0", + "@testing-library/react": "^16.0.0", + "@types/d3": "^7.4.3", + "@types/node": "^22.0.0", + "@types/react-dom": "*" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "test": "backstage-cli package test", + "lint": "backstage-cli package lint", + "clean": "backstage-cli package clean" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "files": [ + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" +} diff --git a/packages/app-next/public/android-chrome-192x192.png b/packages/app-next/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..eec0ae25b971cae8eb0033c9af7e0f676d1df663 GIT binary patch literal 13599 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 EANz~b2mk;8 literal 0 HcmV?d00001 diff --git a/packages/app-next/public/apple-touch-icon.png b/packages/app-next/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3158830ac778a62ff8f08da0e9eeee6e8ada8bfc GIT binary patch literal 12619 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 VSn|oqbSlsa22WQ%mvv4FO#qym7y1AI literal 0 HcmV?d00001 diff --git a/packages/app-next/public/favicon-32x32.png b/packages/app-next/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c0915ece75949f3d917134f55193949927edc633 GIT binary patch literal 1686 zcmd5*YdF&j82@WYD9ojqT$Wo{SSXitp^eRqxy{@++t}P`atlKxQX0)YMm6_KR%p4F z$}J+6LMeH2OXWDHjylI#AJ2#L{k+fbeSgn;`91HK_szmP+3%H7kpcicc}5$z1N!Px-7om}akWbt233fdJ10ExN)z&Z~ATcQ$c2>@ad0I)&=0IMPZ zfJBuET&w|L$8)@+J4!Sl|Nk(stgJlvmnlJ&;dZvl8tO{Q%IJ*5_~q$1+xa={mdc0(T`t!w?RZl>^IxA*%bGu3bF$<*nzTrF> zoQ&9oiO|s=ORAp|1maSVle9kTR(cJ300u{&4iq#dewwjMjZ;umbia|8`fV}#)u6uZ z2{{=Vn6Y8_#3SbXb1ic-&s#nMteerJ5NT@9WJFf_0Z{rXvToRrSOV|5nT6}g)=)7clCVKtHJ1*VPs-V;@XTM)*hF8A>dvO zHk*Y?X8JaA;})mFp7;7TRRuk~8$R*Snh{9txf3X8a4%y!TuP;MHGAGHB;T*cTs()( zPBU^uyOrcpI-AkwlQc~ccBy9xRRz@U7IH^D@piFSO__BF#e(AN-^z2yOmV!NrfGJV z)K=@)T;PiA16X29aqmP@px{GT+&pJ*OCU>i#GE8dw3RuCdu^ zY|d<%y|L(_@zJ9#_m z=Lc$*iilj{bjSDeNH|lRP>yLE)Yq?l!XVsP?uHhR(xnf>5p}vuAuF-j7*tA0oTAH zhFP&ZPMN7z8!K6i|K8u7|AYJvRll0p!ov{KSr|$njU-`o&7fVZN5@WQ|g`Mlirnap=oY~b#iCdHeScp|7sct zd}FL!1NSuuCnVle?ygaP975V!)pzN#*|A{{1* z$fS~)G%HFBO+IIv4>f5HNGY_6SF`0>Gf0kWIFv^nU=X CgrE5U literal 0 HcmV?d00001 diff --git a/packages/app-next/public/favicon.ico b/packages/app-next/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5e45e5dfbde6f39603d5be60d933c1af14dffb1e GIT binary patch literal 15086 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 D+pS%} literal 0 HcmV?d00001 diff --git a/packages/app-next/public/google-cloud.png b/packages/app-next/public/google-cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..09b3c6ea486954fa28ff71b14709a8e678cfa05f GIT binary patch literal 6803 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 literal 0 HcmV?d00001 diff --git a/packages/app-next/public/graphiql.png b/packages/app-next/public/graphiql.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2b884c3f18ad48fe978752d48654b7034162d8 GIT binary patch literal 16674 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 + + + + + + + + + + + + + + + + + + + <%= config.getString('app.title') %> + + + +
+ + + diff --git a/packages/app-next/public/manifest.json b/packages/app-next/public/manifest.json new file mode 100644 index 000000000..4a7c1b4ec --- /dev/null +++ b/packages/app-next/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Backstage", + "name": "Backstage", + "icons": [ + { + "src": "favicon.ico", + "sizes": "48x48", + "type": "image/png" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/packages/app-next/public/robots.txt b/packages/app-next/public/robots.txt new file mode 100644 index 000000000..b21f0887a --- /dev/null +++ b/packages/app-next/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: / diff --git a/packages/app-next/public/safari-pinned-tab.svg b/packages/app-next/public/safari-pinned-tab.svg new file mode 100644 index 000000000..0f500b300 --- /dev/null +++ b/packages/app-next/public/safari-pinned-tab.svg @@ -0,0 +1 @@ +Created by potrace 1.11, written by Peter Selinger 2001-2013 \ No newline at end of file diff --git a/packages/app-next/public/tech-radar.png b/packages/app-next/public/tech-radar.png new file mode 100644 index 0000000000000000000000000000000000000000..a68b502fd1e361c2a94216532ec1504a8b7531cd GIT binary patch literal 60371 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 ~(CSW=?ccl+7o2ZKbyf!v4ks=8 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 CQ>yg< literal 0 HcmV?d00001 diff --git a/packages/app-next/src/App.test.tsx b/packages/app-next/src/App.test.tsx new file mode 100644 index 000000000..639036375 --- /dev/null +++ b/packages/app-next/src/App.test.tsx @@ -0,0 +1,27 @@ +import { render, waitFor } from '@testing-library/react'; +import app from './App'; + +describe('App', () => { + it('should render', async () => { + process.env = { + NODE_ENV: 'test', + APP_CONFIG: [ + { + data: { + app: { + title: 'Test', + support: { url: 'http://localhost:7007/support' }, + }, + backend: { baseUrl: 'http://localhost:7007' }, + }, + context: 'test', + }, + ] as any, + }; + + const rendered = render(app); + await waitFor(() => { + expect(rendered.baseElement).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx new file mode 100644 index 000000000..c6e2a071b --- /dev/null +++ b/packages/app-next/src/App.tsx @@ -0,0 +1,255 @@ +import { badgesPlugin } from './plugins'; + +import { + AlertDisplay, + OAuthRequestDialog, + ProxiedSignInPage, +} from '@backstage/core-components'; +import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; +import { + CatalogEntityPage, + CatalogIndexPage, + catalogPlugin, +} from '@backstage/plugin-catalog'; +import { + CatalogGraphPage, + catalogGraphPlugin, +} from '@backstage/plugin-catalog-graph'; +import { + CostInsightsLabelDataflowInstructionsPage, + CostInsightsPage, + CostInsightsProjectGrowthInstructionsPage, +} from '@backstage-community/plugin-cost-insights'; +import { ExplorePage } from '@backstage-community/plugin-explore'; +import { Navigate, Route } from 'react-router'; +import { + TechDocsIndexPage, + TechDocsReaderPage, + techdocsPlugin, +} from '@backstage/plugin-techdocs'; +import { UnifiedThemeProvider, themes } from '@backstage/theme'; + +import { ApiExplorerPage } from '@backstage/plugin-api-docs'; +import { GraphiQLPage } from '@backstage-community/plugin-graphiql'; + +import { Root } from './components/Root'; +import { SearchPage } from '@backstage/plugin-search'; +import { TechRadarPage } from '@backstage-community/plugin-tech-radar'; +import { + SettingsLayout, + UserSettingsPage, +} from '@backstage/plugin-user-settings'; +import { apertureTheme } from './theme/aperture'; +import { apis } from './apis'; + +import { entityPage } from './components/catalog/EntityPage'; +import { orgPlugin } from '@backstage/plugin-org'; +import { searchPage } from './components/search/SearchPage'; +import { CssBaseline } from '@material-ui/core'; +import { HomepageCompositionRoot, VisitListener } from '@backstage/plugin-home'; +import { CustomizableHomePage } from './components/home/CustomizableHomePage'; +import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { NotificationsPage } from '@backstage/plugin-notifications'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; +import { + ExpandableNavigation, + LightBox, + ReportIssue, + TextSize, +} from '@backstage/plugin-techdocs-module-addons-contrib'; +import { Mermaid } from 'backstage-plugin-techdocs-addon-mermaid'; +import { SignalsDisplay } from '@backstage/plugin-signals'; +import { NotificationSettings } from './components/settings/NotificationSettings'; + +// New Frontend System Imports +import { createApp } from '@backstage/frontend-defaults'; +import { + convertLegacyApp, + convertLegacyAppOptions, + convertLegacyRouteRef, + convertLegacyRouteRefs, +} from '@backstage/core-compat-api'; +import { + createFrontendModule, + SignInPageBlueprint, + ThemeBlueprint, +} from '@backstage/frontend-plugin-api'; + +const routes = ( + + } /> + }> + + + {/* + }> + + + + + }> + + + */} + } /> + } /> + + } + /> + } + > + {entityPage} + + } /> + } + /> + } + /> + } /> + } + > + + + + + + + + + + } /> + } /> + }> + {searchPage} + + }> + + + + + } /> + } /> + } /> + +); + +const legacyFeatures = convertLegacyApp( + <> + + + + + + {routes} + + , +); + +const optionsModule = convertLegacyAppOptions({ + // TODO:(awanlin) the badges plugin doesn't support the new frontend system yet + plugins: [badgesPlugin], +}); + +const proxiedSignInPage = SignInPageBlueprint.make({ + params: { + loader: async () => props => ( + + ), + }, +}); + +const lightThemeExtension = ThemeBlueprint.make({ + name: 'light', + params: { + theme: { + id: 'light', + title: 'Light', + variant: 'light', + Provider: ({ children }) => ( + + ), + }, + }, +}); + +const darkThemeExtension = ThemeBlueprint.make({ + name: 'dark', + params: { + theme: { + id: 'dark', + title: 'Dark', + variant: 'dark', + Provider: ({ children }) => ( + + ), + }, + }, +}); + +const apertureThemeExtension = ThemeBlueprint.make({ + name: 'aperture', + params: { + theme: { + id: 'aperture', + title: 'Aperture', + variant: 'light', + Provider: ({ children }) => ( + + + {children} + + ), + }, + }, +}); + +const app = createApp({ + features: [ + optionsModule, + ...legacyFeatures, + createFrontendModule({ + pluginId: 'app', + extensions: [ + ...apis, + proxiedSignInPage, + lightThemeExtension, + darkThemeExtension, + apertureThemeExtension, + ], + }), + ], + bindRoutes({ bind }) { + bind(convertLegacyRouteRefs(catalogPlugin.externalRoutes), { + createComponent: convertLegacyRouteRef(scaffolderPlugin.routes.root), + viewTechDoc: convertLegacyRouteRef(techdocsPlugin.routes.docRoot), + createFromTemplate: convertLegacyRouteRef( + scaffolderPlugin.routes.selectedTemplate, + ), + }); + bind(convertLegacyRouteRefs(scaffolderPlugin.externalRoutes), { + viewTechDoc: convertLegacyRouteRef(techdocsPlugin.routes.docRoot), + }); + bind(convertLegacyRouteRefs(catalogGraphPlugin.externalRoutes), { + catalogEntity: convertLegacyRouteRef(catalogPlugin.routes.catalogEntity), + }); + bind(convertLegacyRouteRefs(orgPlugin.externalRoutes), { + catalogIndex: convertLegacyRouteRef(catalogPlugin.routes.catalogIndex), + }); + }, +}); + +export default app.createRoot(); diff --git a/packages/app-next/src/apis.ts b/packages/app-next/src/apis.ts new file mode 100644 index 000000000..853d671d7 --- /dev/null +++ b/packages/app-next/src/apis.ts @@ -0,0 +1,140 @@ +import { + graphQlBrowseApiRef, + GraphQLEndpoints, +} from '@backstage-community/plugin-graphiql'; +import { + costInsightsApiRef, + ExampleCostInsightsClient, +} from '@backstage-community/plugin-cost-insights'; +import { + ScmAuth, + ScmIntegrationsApi, + scmIntegrationsApiRef, +} from '@backstage/integration-react'; + +import { + createApiFactory, + githubAuthApiRef, + discoveryApiRef, + oauthRequestApiRef, + errorApiRef, + configApiRef, + identityApiRef, +} from '@backstage/core-plugin-api'; + +import { GithubAuth } from '@backstage/core-app-api'; +import { visitsApiRef, VisitsWebStorageApi } from '@backstage/plugin-home'; + +// New Frontend System imports +import { ApiBlueprint } from '@backstage/frontend-plugin-api'; + +const scmIntegrationsApi = ApiBlueprint.make({ + name: 'scm-integrations', + params: { + factory: createApiFactory({ + api: scmIntegrationsApiRef, + deps: { configApi: configApiRef }, + factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), + }), + }, +}); + +const scmAuthApi = ApiBlueprint.make({ + name: 'scm-auth', + params: { + factory: ScmAuth.createDefaultApiFactory(), + }, +}); + +const githubAuthApi = ApiBlueprint.make({ + name: 'github-auth', + params: { + factory: createApiFactory({ + api: githubAuthApiRef, + deps: { + configApi: configApiRef, + discoveryApi: discoveryApiRef, + oauthRequestApi: oauthRequestApiRef, + }, + factory: ({ discoveryApi, oauthRequestApi, configApi }) => + GithubAuth.create({ + discoveryApi, + oauthRequestApi, + defaultScopes: ['read:user'], + environment: configApi.getString('auth.environment'), + }), + }), + }, +}); + +const graphQlBrowseApi = ApiBlueprint.make({ + name: 'graphql-browse', + params: { + factory: createApiFactory({ + api: graphQlBrowseApiRef, + deps: { + errorApi: errorApiRef, + graphGithubAuthApi: githubAuthApiRef, + discoveryApi: discoveryApiRef, + }, + factory: ({ errorApi, graphGithubAuthApi, discoveryApi }) => + GraphQLEndpoints.from([ + GraphQLEndpoints.create({ + id: 'backstage', + title: 'GraphQL Backend', + url: discoveryApi.getBaseUrl('graphql'), + }), + GraphQLEndpoints.github({ + id: 'github', + title: 'GitHub', + errorApi, + githubAuthApi: graphGithubAuthApi, + }), + GraphQLEndpoints.create({ + id: 'gitlab', + title: 'GitLab', + url: 'https://gitlab.com/api/graphql', + }), + GraphQLEndpoints.create({ + id: 'swapi', + title: 'SWAPI', + url: 'https://swapi-graphql.netlify.app/.netlify/functions/index', + }), + ]), + }), + }, +}); + +const costInsightsApi = ApiBlueprint.make({ + name: 'cost-insights', + params: { + factory: createApiFactory( + costInsightsApiRef, + new ExampleCostInsightsClient(), + ), + }, +}); + +const visitsApi = ApiBlueprint.make({ + name: 'visits', + params: { + factory: createApiFactory({ + api: visitsApiRef, + deps: { + identityApi: identityApiRef, + errorApi: errorApiRef, + }, + factory: ({ identityApi, errorApi }) => + VisitsWebStorageApi.create({ identityApi, errorApi }), + }), + }, +}); + +export const apis = [ + scmIntegrationsApi, + scmAuthApi, + githubAuthApi, + graphQlBrowseApi, + costInsightsApi, + visitsApi, +]; diff --git a/packages/app-next/src/components/Root/ApertureLogoFull.tsx b/packages/app-next/src/components/Root/ApertureLogoFull.tsx new file mode 100644 index 000000000..eb09a575f --- /dev/null +++ b/packages/app-next/src/components/Root/ApertureLogoFull.tsx @@ -0,0 +1,79 @@ +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + fill: '#0099ff', + width: 'auto', + height: 40, + }, +}); + +export const ApertureLogoFull = () => { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/app-next/src/components/Root/ApertureLogoIcon.tsx b/packages/app-next/src/components/Root/ApertureLogoIcon.tsx new file mode 100644 index 000000000..f91114847 --- /dev/null +++ b/packages/app-next/src/components/Root/ApertureLogoIcon.tsx @@ -0,0 +1,40 @@ +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + fill: '#0099ff', + width: 'auto', + height: 40, + }, +}); + +export const ApertureLogoIcon = () => { + const classes = useStyles(); + + return ( + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/packages/app-next/src/components/Root/LogoFull.tsx b/packages/app-next/src/components/Root/LogoFull.tsx new file mode 100644 index 000000000..4508fc450 --- /dev/null +++ b/packages/app-next/src/components/Root/LogoFull.tsx @@ -0,0 +1,45 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 30, + }, + path: { + fill: '#7df3e1', + }, +}); +const LogoFull = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoFull; diff --git a/packages/app-next/src/components/Root/LogoIcon.tsx b/packages/app-next/src/components/Root/LogoIcon.tsx new file mode 100644 index 000000000..02455eb6d --- /dev/null +++ b/packages/app-next/src/components/Root/LogoIcon.tsx @@ -0,0 +1,46 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 28, + }, + path: { + fill: '#7df3e1', + }, +}); + +const LogoIcon = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default LogoIcon; diff --git a/packages/app-next/src/components/Root/Root.tsx b/packages/app-next/src/components/Root/Root.tsx new file mode 100644 index 000000000..56392a4d7 --- /dev/null +++ b/packages/app-next/src/components/Root/Root.tsx @@ -0,0 +1,117 @@ +import { PropsWithChildren } from 'react'; +import { Link, Theme, makeStyles } from '@material-ui/core'; +import HomeIcon from '@material-ui/icons/Home'; +import ExtensionIcon from '@material-ui/icons/Extension'; +import MapIcon from '@material-ui/icons/MyLocation'; +import LayersIcon from '@material-ui/icons/Layers'; +import LibraryBooks from '@material-ui/icons/LibraryBooks'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; +import MoneyIcon from '@material-ui/icons/MonetizationOn'; +import LogoFull from './LogoFull'; +import LogoIcon from './LogoIcon'; +import { NavLink } from 'react-router-dom'; +import { GraphiQLIcon } from '@backstage-community/plugin-graphiql'; +import { + Settings as SidebarSettings, + UserSettingsSignInAvatar, +} from '@backstage/plugin-user-settings'; +import { SidebarSearchModal } from '@backstage/plugin-search'; +import { + Sidebar, + SidebarPage, + sidebarConfig, + SidebarItem, + SidebarDivider, + SidebarSpace, + SidebarGroup, + useSidebarOpenState, +} from '@backstage/core-components'; +import MenuIcon from '@material-ui/icons/Menu'; +import SearchIcon from '@material-ui/icons/Search'; +import { appThemeApiRef, useApi } from '@backstage/core-plugin-api'; +import { ApertureLogoFull } from './ApertureLogoFull'; +import { ApertureLogoIcon } from './ApertureLogoIcon'; +import CategoryIcon from '@material-ui/icons/Category'; +import { MyGroupsSidebarItem } from '@backstage/plugin-org'; +import GroupIcon from '@material-ui/icons/People'; +import { NotificationsSidebarItem } from '@backstage/plugin-notifications'; + +const useSidebarLogoStyles = makeStyles({ + root: { + width: sidebarConfig.drawerWidthClosed, + height: 3 * sidebarConfig.logoHeight, + display: 'flex', + flexFlow: 'row nowrap', + alignItems: 'center', + marginBottom: -14, + }, + link: props => ({ + width: sidebarConfig.drawerWidthClosed, + marginLeft: props.themeId === 'aperture' ? 15 : 24, + }), +}); + +const SidebarLogo = () => { + const { isOpen } = useSidebarOpenState(); + + const appThemeApi = useApi(appThemeApiRef); + const themeId = appThemeApi.getActiveThemeId(); + const classes = useSidebarLogoStyles({ themeId: themeId! }); + + const fullLogo = themeId === 'aperture' ? : ; + const iconLogo = themeId === 'aperture' ? : ; + + return ( +
+ + {isOpen ? fullLogo : iconLogo} + +
+ ); +}; + +export const Root = ({ children }: PropsWithChildren<{}>) => ( + + + + } to="/search"> + + + + }> + + + + + + + + + + + + + + + + + } + to="/settings" + > + + + + {children} + +); diff --git a/packages/app-next/src/components/Root/index.ts b/packages/app-next/src/components/Root/index.ts new file mode 100644 index 000000000..35288815f --- /dev/null +++ b/packages/app-next/src/components/Root/index.ts @@ -0,0 +1 @@ +export { Root } from './Root'; diff --git a/packages/app-next/src/components/catalog/EntityPage.tsx b/packages/app-next/src/components/catalog/EntityPage.tsx new file mode 100644 index 000000000..1258a24d8 --- /dev/null +++ b/packages/app-next/src/components/catalog/EntityPage.tsx @@ -0,0 +1,441 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useMemo, useState } from 'react'; +import { Button, Grid } from '@material-ui/core'; +import BadgeIcon from '@material-ui/icons/CallToAction'; +import { + EntityApiDefinitionCard, + EntityConsumedApisCard, + EntityConsumingComponentsCard, + EntityHasApisCard, + EntityProvidedApisCard, + EntityProvidingComponentsCard, +} from '@backstage/plugin-api-docs'; +import { EntityBadgesDialog } from '@backstage-community/plugin-badges'; +import { + EntityAboutCard, + EntityDependsOnComponentsCard, + EntityDependsOnResourcesCard, + EntityHasComponentsCard, + EntityHasResourcesCard, + EntityHasSubcomponentsCard, + EntityHasSystemsCard, + EntityLayout, + EntityLinksCard, + EntityOrphanWarning, + EntityProcessingErrorsPanel, + EntityRelationWarning, + EntitySwitch, + hasCatalogProcessingErrors, + hasRelationWarnings, + isComponentType, + isKind, + isOrphan, +} from '@backstage/plugin-catalog'; +import { + EntityGithubActionsContent, + EntityRecentGithubActionsRunsCard, + isGithubActionsAvailable, +} from '@backstage-community/plugin-github-actions'; +import { + EntityGroupProfileCard, + EntityMembersListCard, + EntityOwnershipCard, + EntityUserProfileCard, +} from '@backstage/plugin-org'; +import { EntityTechdocsContent } from '@backstage/plugin-techdocs'; +import { EntityTodoContent } from '@backstage-community/plugin-todo'; +import { EmptyState } from '@backstage/core-components'; +import { EntityCatalogGraphCard } from '@backstage/plugin-catalog-graph'; +import { + EntityKubernetesContent, + isKubernetesAvailable, +} from '@backstage/plugin-kubernetes'; +import { + ExpandableNavigation, + LightBox, + ReportIssue, + TextSize, +} from '@backstage/plugin-techdocs-module-addons-contrib'; +import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; +import { Mermaid } from 'backstage-plugin-techdocs-addon-mermaid'; + +const EntityLayoutWrapper = (props: { children?: React.ReactNode }) => { + const [badgesDialogOpen, setBadgesDialogOpen] = useState(false); + + const extraMenuItems = useMemo(() => { + return [ + { + title: 'Badges', + Icon: BadgeIcon, + onClick: () => setBadgesDialogOpen(true), + }, + ]; + }, []); + + return ( + <> + + {props.children} + + setBadgesDialogOpen(false)} + /> + + ); +}; + +const entityWarningContent = ( + <> + + + + + + + + + + + + + + + + + + + + + + + + +); + +const cicdContent = ( + + + + + + + + Read more + + } + /> + + +); + +const cicdCard = ( + + + + + + + +); + +const techdocsContentWithAddons = ( + + + + + + + + + +); + +const overviewContent = ( + + {entityWarningContent} + + + + + + + + + + + + + {cicdCard} + + + + + +); + +const serviceEntityPage = ( + + + {overviewContent} + + + + + + + + {cicdContent} + + + + + + + + + + + + + + + + + + + + + + + + + + {techdocsContentWithAddons} + + + + + + +); + +const websiteEntityPage = ( + + + {overviewContent} + + + + + + + + {cicdContent} + + + + + + + + + + + + + + + {techdocsContentWithAddons} + + + + + + +); + +const defaultEntityPage = ( + + + {overviewContent} + + + + {techdocsContentWithAddons} + + + + + + +); + +const componentPage = ( + + + {serviceEntityPage} + + + + {websiteEntityPage} + + + {defaultEntityPage} + +); + +const apiPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + + + + + + + + + + + +); + +const userPage = ( + + + + {entityWarningContent} + + + + + + + + + +); + +const groupPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + +); + +const systemPage = ( + + + + {entityWarningContent} + + + + + + + + + + + + + + + + + + +); + +const domainPage = ( + + + + {entityWarningContent} + + + + + + + + + +); + +export const entityPage = ( + + + + + + + + + {defaultEntityPage} + +); diff --git a/packages/app-next/src/components/home/CustomizableHomePage.tsx b/packages/app-next/src/components/home/CustomizableHomePage.tsx new file mode 100644 index 000000000..122c07f08 --- /dev/null +++ b/packages/app-next/src/components/home/CustomizableHomePage.tsx @@ -0,0 +1,79 @@ +import { Page, Content } from '@backstage/core-components'; +import { + HomePageCompanyLogo, + TemplateBackstageLogo, + HomePageStarredEntities, + HomePageToolkit, + CustomHomepageGrid, + HomePageRandomJoke, + HomePageTopVisited, + HomePageRecentlyVisited, +} from '@backstage/plugin-home'; +import { HomePageSearchBar } from '@backstage/plugin-search'; +import { Grid } from '@material-ui/core'; + +import { tools, useLogoStyles } from './shared'; + +const defaultConfig = [ + { + component: 'HomePageSearchBar', + x: 0, + y: 0, + width: 24, + height: 2, + }, + { + component: 'HomePageRecentlyVisited', + x: 0, + y: 1, + width: 5, + height: 4, + }, + { + component: 'HomePageTopVisited', + x: 5, + y: 1, + width: 5, + height: 4, + }, + { + component: 'HomePageStarredEntities', + x: 0, + y: 2, + width: 6, + height: 4, + }, + { + component: 'HomePageToolkit', + x: 6, + y: 6, + width: 4, + height: 4, + }, +]; + +export const CustomizableHomePage = () => { + const { svg, path, container } = useLogoStyles(); + + return ( + + + + } + /> + + + + + + + + + + + + + ); +}; diff --git a/packages/app-next/src/components/home/shared.tsx b/packages/app-next/src/components/home/shared.tsx new file mode 100644 index 000000000..f182c939b --- /dev/null +++ b/packages/app-next/src/components/home/shared.tsx @@ -0,0 +1,43 @@ +import { TemplateBackstageLogoIcon } from '@backstage/plugin-home'; +import { makeStyles } from '@material-ui/core/styles'; + +export const useLogoStyles = makeStyles(theme => ({ + container: { + margin: theme.spacing(5, 0), + }, + svg: { + width: 'auto', + height: 100, + }, + path: { + fill: '#7df3e1', + }, +})); + +export const tools = [ + { + url: 'https://backstage.io/docs', + label: 'Docs', + icon: , + }, + { + url: 'https://github.com/backstage/backstage', + label: 'GitHub', + icon: , + }, + { + url: 'https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md', + label: 'Contributing', + icon: , + }, + { + url: 'https://backstage.io/plugins', + label: 'Plugins Directory', + icon: , + }, + { + url: 'https://github.com/backstage/backstage/issues/new/choose', + label: 'Submit New Issue', + icon: , + }, +]; diff --git a/packages/app-next/src/components/search/SearchPage.tsx b/packages/app-next/src/components/search/SearchPage.tsx new file mode 100644 index 000000000..f4aa8cf48 --- /dev/null +++ b/packages/app-next/src/components/search/SearchPage.tsx @@ -0,0 +1,169 @@ +import { + CatalogIcon, + Content, + DocsIcon, + Header, + Page, +} from '@backstage/core-components'; +import { CatalogSearchResultListItem } from '@backstage/plugin-catalog'; +import { SearchType } from '@backstage/plugin-search'; +import { + DefaultResultListItem, + SearchBar, + SearchFilter, + SearchResult, + SearchResultPager, + useSearch, +} from '@backstage/plugin-search-react'; +import { TechDocsSearchResultListItem } from '@backstage/plugin-techdocs'; +import { Grid, List, makeStyles, Paper, Theme } from '@material-ui/core'; + +import { ToolSearchResultListItem } from '@backstage-community/plugin-explore'; +import { useApi } from '@backstage/core-plugin-api'; +import { + catalogApiRef, + CATALOG_FILTER_EXISTS, +} from '@backstage/plugin-catalog-react'; +import BuildIcon from '@material-ui/icons/Build'; + +const useStyles = makeStyles((theme: Theme) => ({ + bar: { + padding: theme.spacing(1, 0), + }, + filters: { + padding: theme.spacing(2), + marginTop: theme.spacing(2), + }, + filter: { + '& + &': { + marginTop: theme.spacing(2.5), + }, + }, +})); + +const SearchPage = () => { + const classes = useStyles(); + const { types } = useSearch(); + const catalogApi = useApi(catalogApiRef); + return ( + +
+ + + + + + + , + }, + { + value: 'techdocs', + name: 'Documentation', + icon: , + }, + { + value: 'tools', + name: 'Tools', + icon: , + }, + ]} + /> + + {types.includes('techdocs') && ( + { + // Return a list of entities which are documented. + const { items } = await catalogApi.getEntities({ + fields: ['metadata.name'], + filter: { + 'metadata.annotations.backstage.io/techdocs-ref': + CATALOG_FILTER_EXISTS, + }, + }); + + const names = items.map(entity => entity.metadata.name); + names.sort(); + return names; + }} + /> + )} + + + + + + + {({ results }) => ( + + {results.map(({ type, document, highlight, rank }) => { + switch (type) { + case 'software-catalog': + return ( + + ); + case 'techdocs': + return ( + + ); + case 'tools': + return ( + + ); + default: + return ( + + ); + } + })} + + )} + + + + + + + ); +}; + +export const searchPage = ; diff --git a/packages/app-next/src/components/settings/NotificationSettings.tsx b/packages/app-next/src/components/settings/NotificationSettings.tsx new file mode 100644 index 000000000..b240893da --- /dev/null +++ b/packages/app-next/src/components/settings/NotificationSettings.tsx @@ -0,0 +1,66 @@ +import { Box, Button, Grid, Typography } from '@material-ui/core'; +import { + configApiRef, + discoveryApiRef, + errorApiRef, + fetchApiRef, + useApi, +} from '@backstage/core-plugin-api'; + +import { InfoCard } from '@backstage/core-components'; + +import { UserNotificationSettingsCard } from '@backstage/plugin-notifications'; + +export const NotificationSettings = () => { + const config = useApi(configApiRef); + const fetchApi = useApi(fetchApiRef); + const discovery = useApi(discoveryApiRef); + const errorApi = useApi(errorApiRef); + + const isEnabled = + config.getOptionalBoolean('notificationsTester.enabled') ?? true; + + const handleNotifyClick = async () => { + const notificationTesterUrl = await discovery.getBaseUrl( + 'notifications-tester', + ); + const response = await fetchApi.fetch(`${notificationTesterUrl}/test`, { + method: 'POST', + }); + if (!response.ok) { + errorApi.post( + new Error(`Failed to send notification: ${response.status}`), + ); + } + }; + + return ( + + + + + {isEnabled && ( + + + + + + Note: this card is not part of the default Notifications Setting + and was added to be able to try out the Notification system for + this Demo site. + + + + + )} + + ); +}; diff --git a/packages/app-next/src/index.tsx b/packages/app-next/src/index.tsx new file mode 100644 index 000000000..2e4bb6bd6 --- /dev/null +++ b/packages/app-next/src/index.tsx @@ -0,0 +1,5 @@ +import ReactDOM from 'react-dom/client'; +import app from './App'; +import '@backstage/canon/css/styles.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render(app); diff --git a/packages/app-next/src/plugins.ts b/packages/app-next/src/plugins.ts new file mode 100644 index 000000000..552c32a1f --- /dev/null +++ b/packages/app-next/src/plugins.ts @@ -0,0 +1 @@ +export { badgesPlugin } from '@backstage-community/plugin-badges'; diff --git a/packages/app-next/src/setupTests.ts b/packages/app-next/src/setupTests.ts new file mode 100644 index 000000000..7b0828bfa --- /dev/null +++ b/packages/app-next/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/packages/app-next/src/theme/aperture.ts b/packages/app-next/src/theme/aperture.ts new file mode 100644 index 000000000..95304b5f7 --- /dev/null +++ b/packages/app-next/src/theme/aperture.ts @@ -0,0 +1,295 @@ +import { + createBaseThemeOptions, + pageTheme as defaultPageThemes, + PageTheme, + palettes, + createUnifiedTheme, +} from '@backstage/theme'; + +import { alpha } from '@material-ui/core/styles'; + +const pageThemesFontColorOverride: Record = {}; +Object.keys(defaultPageThemes).map(key => { + pageThemesFontColorOverride[key] = { + ...defaultPageThemes[key], + fontColor: '#172B4D', + }; +}); + +export const apertureTheme = createUnifiedTheme({ + ...createBaseThemeOptions({ + palette: { + ...palettes.light, + primary: { + main: '#0052CC', + light: '#4C9AFF', + dark: '#172B4D', + }, + secondary: { + main: '#FF5630', + light: '#FFAB00', + dark: '#6554C0', + }, + grey: { + 50: '#C1C7D0', + 100: '#7A869A', + 200: '#6B778C', + 300: '#5E6C84', + 400: '#505F79', + 500: '#42526E', + 600: '#344563', + 700: '#253858', + 800: '#172B4D', + 900: '#091E42', + }, + error: { + main: '#FF5630', + light: '#FF8F73', + dark: '#DE350B', + }, + warning: { + main: '#FFAB00', + light: '#FFE380', + dark: '#FF8B00', + }, + success: { + main: '#36B37E', + light: '#79F2C0', + dark: '#006644', + }, + info: { + main: '#0065FF', + light: '#4C9AFF', + dark: '#0747A6', + }, + navigation: { + ...palettes.light.navigation, + background: '#172B4D', + color: '#FFFFFF', + indicator: '#2684FF', + navItem: { + hoverBackground: 'rgba(116,118,121,0.6)', + }, + }, + text: { + primary: '#172B48', + }, + background: { + default: '#FFFFFF', + }, + }, + }), + typography: { + htmlFontSize: 16, + fontFamily: 'Roboto, sans-serif', + h1: { + fontSize: 54, + fontWeight: 700, + marginBottom: 10, + }, + h2: { + fontSize: 40, + fontWeight: 700, + marginBottom: 8, + }, + h3: { + fontSize: 32, + fontWeight: 700, + marginBottom: 6, + }, + h4: { + fontWeight: 700, + fontSize: 28, + marginBottom: 6, + }, + h5: { + fontWeight: 700, + fontSize: 24, + marginBottom: 4, + }, + h6: { + fontWeight: 700, + fontSize: 20, + marginBottom: 2, + }, + }, + pageTheme: pageThemesFontColorOverride, + defaultPageTheme: 'home', + components: { + BackstageHeader: { + styleOverrides: { + header: ({ theme }) => ({ + backgroundImage: 'unset', + boxShadow: 'unset', + paddingBottom: theme.spacing(1), + }), + title: ({ theme }) => ({ + color: theme.page.fontColor, + fontWeight: 900, + }), + subtitle: ({ theme }) => ({ + color: alpha(theme.page.fontColor, 0.8), + }), + type: ({ theme }) => ({ + color: alpha(theme.page.fontColor, 0.8), + }), + }, + }, + BackstageHeaderTabs: { + styleOverrides: { + defaultTab: { + fontSize: 'inherit', + textTransform: 'none', + }, + }, + }, + BackstageOpenedDropdown: { + styleOverrides: { + icon: { + '& path': { + fill: '#FFFFFF', + }, + }, + }, + }, + BackstageTable: { + styleOverrides: { + root: { + '&> :first-child': { + borderBottom: '1px solid #D5D5D5', + boxShadow: 'none', + }, + '& th': { + borderTop: 'none', + textTransform: 'none !important', + }, + }, + }, + }, + CatalogReactUserListPicker: { + styleOverrides: { + title: { + textTransform: 'none', + }, + }, + }, + MuiAlert: { + styleOverrides: { + root: { + borderRadius: 0, + }, + standardError: ({ theme }) => ({ + color: '#FFFFFF', + backgroundColor: theme.palette.error.dark, + '& $icon': { + color: '#FFFFFF', + }, + }), + standardInfo: ({ theme }) => ({ + color: '#FFFFFF', + backgroundColor: theme.palette.primary.dark, + '& $icon': { + color: '#FFFFFF', + }, + }), + standardSuccess: ({ theme }) => ({ + color: '#FFFFFF', + backgroundColor: theme.palette.success.dark, + '& $icon': { + color: '#FFFFFF', + }, + }), + standardWarning: ({ theme }) => ({ + color: theme.palette.grey[700], + backgroundColor: theme.palette.secondary.light, + '& $icon': { + color: theme.palette.grey[700], + }, + }), + }, + }, + MuiAutocomplete: { + styleOverrides: { + root: { + '&[aria-expanded=true]': { + backgroundColor: '#26385A', + color: '#FFFFFF', + }, + '&[aria-expanded=true] path': { + fill: '#FFFFFF', + }, + }, + }, + }, + MuiBackdrop: { + styleOverrides: { + root: { + backgroundColor: 'rgba(9,30,69,0.54)', + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + borderRadius: 3, + textTransform: 'none', + }, + contained: { + boxShadow: 'none', + }, + }, + }, + MuiChip: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 3, + backgroundColor: theme.palette.grey[50], + color: theme.palette.primary.dark, + margin: 4, + }), + }, + }, + MuiSelect: { + styleOverrides: { + select: { + '&[aria-expanded]': { + backgroundColor: '#26385A', + color: '#FFFFFF', + }, + }, + }, + }, + MuiSwitch: { + styleOverrides: { + root: { + padding: 10, + }, + switchBase: { + padding: 12, + }, + thumb: { + backgroundColor: '#FFFFFF', + height: 14, + width: 14, + }, + track: { + borderRadius: 9, + }, + }, + }, + MuiTabs: { + styleOverrides: { + indicator: { + transition: 'none', + }, + }, + }, + MuiTypography: { + styleOverrides: { + button: { + textTransform: 'none', + }, + }, + }, + }, +}); diff --git a/yarn.lock b/yarn.lock index 502abd4a2..de5d349df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18546,6 +18546,60 @@ __metadata: languageName: unknown linkType: soft +"app-next@workspace:packages/app-next": + version: 0.0.0-use.local + resolution: "app-next@workspace:packages/app-next" + dependencies: + "@backstage-community/plugin-badges": "npm:^0.9.0" + "@backstage-community/plugin-cost-insights": "npm:^0.15.1" + "@backstage-community/plugin-explore": "npm:^0.9.0" + "@backstage-community/plugin-github-actions": "npm:^0.11.0" + "@backstage-community/plugin-graphiql": "npm:^0.4.1" + "@backstage-community/plugin-tech-radar": "npm:^1.6.0" + "@backstage-community/plugin-todo": "npm:^0.9.0" + "@backstage/canon": "backstage:^" + "@backstage/cli": "backstage:^" + "@backstage/core-app-api": "backstage:^" + "@backstage/core-compat-api": "backstage:^" + "@backstage/core-components": "backstage:^" + "@backstage/core-plugin-api": "backstage:^" + "@backstage/frontend-defaults": "backstage:^" + "@backstage/frontend-plugin-api": "backstage:^" + "@backstage/integration-react": "backstage:^" + "@backstage/plugin-api-docs": "backstage:^" + "@backstage/plugin-catalog": "backstage:^" + "@backstage/plugin-catalog-graph": "backstage:^" + "@backstage/plugin-catalog-react": "backstage:^" + "@backstage/plugin-home": "backstage:^" + "@backstage/plugin-kubernetes": "backstage:^" + "@backstage/plugin-notifications": "backstage:^" + "@backstage/plugin-org": "backstage:^" + "@backstage/plugin-scaffolder": "backstage:^" + "@backstage/plugin-search": "backstage:^" + "@backstage/plugin-search-react": "backstage:^" + "@backstage/plugin-signals": "backstage:^" + "@backstage/plugin-techdocs": "backstage:^" + "@backstage/plugin-techdocs-module-addons-contrib": "backstage:^" + "@backstage/plugin-techdocs-react": "backstage:^" + "@backstage/plugin-user-settings": "backstage:^" + "@backstage/theme": "backstage:^" + "@material-ui/core": "npm:^4.11.0" + "@material-ui/icons": "npm:^4.9.1" + "@playwright/test": "npm:^1.32.3" + "@testing-library/dom": "npm:^10.1.0" + "@testing-library/jest-dom": "npm:^6.0.0" + "@testing-library/react": "npm:^16.0.0" + "@types/d3": "npm:^7.4.3" + "@types/node": "npm:^22.0.0" + "@types/react-dom": "npm:*" + backstage-plugin-techdocs-addon-mermaid: "npm:^0.21.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-router: "npm:^6.3.0" + react-router-dom: "npm:^6.3.0" + languageName: unknown + linkType: soft + "app@npm:^0.0.0, app@workspace:packages/app": version: 0.0.0-use.local resolution: "app@workspace:packages/app" From 0ced91cd8f582a435dc37b9c9d856516bea651ec Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 4 Jul 2025 11:27:05 -0500 Subject: [PATCH 2/2] Initial migration Signed-off-by: Andre Wanlin --- app-config.yaml | 2 + packages/app-next/src/App.tsx | 135 +++++++++--------- .../app-next/src/components/Root/Root.tsx | 103 +++++++------ .../app-next/src/components/Root/index.ts | 2 +- 4 files changed, 132 insertions(+), 110 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index d524041ef..cd0f653e0 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -14,6 +14,8 @@ app: links: - url: https://backstage.io/blog/ title: Backstage Blog + experimental: + packages: all organization: name: Backstage diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index c6e2a071b..45d690557 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -1,20 +1,10 @@ import { badgesPlugin } from './plugins'; -import { - AlertDisplay, - OAuthRequestDialog, - ProxiedSignInPage, -} from '@backstage/core-components'; -import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; -import { - CatalogEntityPage, - CatalogIndexPage, - catalogPlugin, -} from '@backstage/plugin-catalog'; -import { - CatalogGraphPage, - catalogGraphPlugin, -} from '@backstage/plugin-catalog-graph'; +import { ProxiedSignInPage } from '@backstage/core-components'; +import { FlatRoutes } from '@backstage/core-app-api'; +import { CatalogIndexPage, catalogPlugin } from '@backstage/plugin-catalog'; +import { default as alphaCatalogPlugin } from '@backstage/plugin-catalog/alpha'; +import { catalogGraphPlugin } from '@backstage/plugin-catalog-graph'; import { CostInsightsLabelDataflowInstructionsPage, CostInsightsPage, @@ -29,12 +19,8 @@ import { } from '@backstage/plugin-techdocs'; import { UnifiedThemeProvider, themes } from '@backstage/theme'; -import { ApiExplorerPage } from '@backstage/plugin-api-docs'; import { GraphiQLPage } from '@backstage-community/plugin-graphiql'; -import { Root } from './components/Root'; -import { SearchPage } from '@backstage/plugin-search'; -import { TechRadarPage } from '@backstage-community/plugin-tech-radar'; import { SettingsLayout, UserSettingsPage, @@ -42,14 +28,12 @@ import { import { apertureTheme } from './theme/aperture'; import { apis } from './apis'; -import { entityPage } from './components/catalog/EntityPage'; import { orgPlugin } from '@backstage/plugin-org'; -import { searchPage } from './components/search/SearchPage'; + import { CssBaseline } from '@material-ui/core'; import { HomepageCompositionRoot, VisitListener } from '@backstage/plugin-home'; import { CustomizableHomePage } from './components/home/CustomizableHomePage'; -import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; -import { NotificationsPage } from '@backstage/plugin-notifications'; +import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; import { TechDocsAddons } from '@backstage/plugin-techdocs-react'; import { ExpandableNavigation, @@ -64,16 +48,29 @@ import { NotificationSettings } from './components/settings/NotificationSettings // New Frontend System Imports import { createApp } from '@backstage/frontend-defaults'; import { + compatWrapper, convertLegacyApp, convertLegacyAppOptions, convertLegacyRouteRef, convertLegacyRouteRefs, } from '@backstage/core-compat-api'; import { + AppRootElementBlueprint, createFrontendModule, SignInPageBlueprint, ThemeBlueprint, } from '@backstage/frontend-plugin-api'; +import { rootNav } from './components/Root'; +import { + EntityKindPicker, + EntityTypePicker, + UserListPicker, + EntityOwnerPicker, + EntityLifecyclePicker, + EntityTagPicker, + EntityProcessingStatusPicker, + EntityNamespacePicker, +} from '@backstage/plugin-catalog-react'; const routes = ( @@ -81,33 +78,6 @@ const routes = ( }> - {/* - }> - - - - - }> - - - */} - } /> - } /> - - } - /> - } - > - {entityPage} - } /> } /> } /> - }> - {searchPage} - + }> - } /> - } /> - } /> ); -const legacyFeatures = convertLegacyApp( - <> - - - - - - {routes} - - , -); +const legacyFeatures = convertLegacyApp(routes); + +const signalsDisplayExtension = AppRootElementBlueprint.make({ + name: 'signals-display-extension', + params: { + element: compatWrapper(), + }, +}); + +const visitListenerExtension = AppRootElementBlueprint.make({ + name: 'visit-listener-extension', + params: { + element: , + }, +}); const optionsModule = convertLegacyAppOptions({ // TODO:(awanlin) the badges plugin doesn't support the new frontend system yet @@ -217,6 +186,34 @@ const apertureThemeExtension = ThemeBlueprint.make({ }, }); +const catalogPluginOverride = alphaCatalogPlugin.withOverrides({ + extensions: [ + alphaCatalogPlugin.getExtension('page:catalog').override({ + params: { + loader: async () => + compatWrapper( + + + + + + + + + + + } + />, + ), + }, + }), + ], +}); + const app = createApp({ features: [ optionsModule, @@ -229,8 +226,12 @@ const app = createApp({ lightThemeExtension, darkThemeExtension, apertureThemeExtension, + rootNav, + signalsDisplayExtension, + visitListenerExtension, ], }), + catalogPluginOverride, ], bindRoutes({ bind }) { bind(convertLegacyRouteRefs(catalogPlugin.externalRoutes), { diff --git a/packages/app-next/src/components/Root/Root.tsx b/packages/app-next/src/components/Root/Root.tsx index 56392a4d7..f1852ecb8 100644 --- a/packages/app-next/src/components/Root/Root.tsx +++ b/packages/app-next/src/components/Root/Root.tsx @@ -1,4 +1,3 @@ -import { PropsWithChildren } from 'react'; import { Link, Theme, makeStyles } from '@material-ui/core'; import HomeIcon from '@material-ui/icons/Home'; import ExtensionIcon from '@material-ui/icons/Extension'; @@ -18,7 +17,6 @@ import { import { SidebarSearchModal } from '@backstage/plugin-search'; import { Sidebar, - SidebarPage, sidebarConfig, SidebarItem, SidebarDivider, @@ -35,6 +33,11 @@ import CategoryIcon from '@material-ui/icons/Category'; import { MyGroupsSidebarItem } from '@backstage/plugin-org'; import GroupIcon from '@material-ui/icons/People'; import { NotificationsSidebarItem } from '@backstage/plugin-notifications'; +import { compatWrapper } from '@backstage/core-compat-api'; +import { + coreExtensionData, + createExtension, +} from '@backstage/frontend-plugin-api'; const useSidebarLogoStyles = makeStyles({ root: { @@ -75,43 +78,59 @@ const SidebarLogo = () => { ); }; -export const Root = ({ children }: PropsWithChildren<{}>) => ( - - - - } to="/search"> - - - - }> - - - - - - - - - - - - - - - - - } - to="/settings" - > - - - - {children} - -); +export const rootNav = createExtension({ + name: 'nav', + attachTo: { id: 'app/layout', input: 'nav' }, + output: [coreExtensionData.reactElement], + factory() { + return [ + coreExtensionData.reactElement( + compatWrapper( + + + } to="/search"> + + + + }> + + + + + + + + + + + + + + + + + } + to="/settings" + > + + + , + ), + ), + ]; + }, +}); diff --git a/packages/app-next/src/components/Root/index.ts b/packages/app-next/src/components/Root/index.ts index 35288815f..81685adca 100644 --- a/packages/app-next/src/components/Root/index.ts +++ b/packages/app-next/src/components/Root/index.ts @@ -1 +1 @@ -export { Root } from './Root'; +export { rootNav } from './Root';