diff --git a/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml b/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml index 951252503f..77cb5edb48 100644 --- a/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml +++ b/.ibm/pipelines/resources/config_map/dynamic-global-header-config.yaml @@ -30,7 +30,7 @@ dynamicPlugins: config: priority: 90 props: - title: Create... + title: Self-service icon: add to: create - mountPoint: global.header/component diff --git a/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml b/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml index 18498aaee0..47d78f87a0 100644 --- a/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml +++ b/catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-global-header.yaml @@ -61,7 +61,7 @@ spec: config: priority: 90 props: - title: Create... + title: Self-service icon: add to: create - mountPoint: global.header/component diff --git a/dynamic-plugins.default.yaml b/dynamic-plugins.default.yaml index dfbde5284c..be2c592301 100644 --- a/dynamic-plugins.default.yaml +++ b/dynamic-plugins.default.yaml @@ -557,7 +557,7 @@ plugins: config: priority: 90 props: - title: Create... + title: Self-service icon: add to: create - mountPoint: global.header/component diff --git a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json index e5745b90ae..e2fe3576dc 100644 --- a/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json +++ b/dynamic-plugins/wrappers/red-hat-developer-hub-backstage-plugin-global-header/package.json @@ -29,7 +29,7 @@ }, "dependencies": { "@mui/material": "5.16.14", - "@red-hat-developer-hub/backstage-plugin-global-header": "1.0.0" + "@red-hat-developer-hub/backstage-plugin-global-header": "1.1.0" }, "devDependencies": { "@backstage/cli": "0.29.6", diff --git a/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts b/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts index a217e4930c..908a0540fa 100644 --- a/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts +++ b/e2e-tests/playwright/e2e/audit-log/catalog.spec.ts @@ -89,7 +89,7 @@ test.describe("Audit Log check for Catalog Plugin", () => { }); test("Should fetch logs for QueriedCatalogEntityFetch event and validate log structure and values", async () => { - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await validateCatalogLogEvent( "QueriedCatalogEntityFetch", "Queried entity fetch attempt", @@ -101,7 +101,7 @@ test.describe("Audit Log check for Catalog Plugin", () => { test("Should fetch logs for CatalogLocationCreation event and validate log structure and values", async () => { const template = "https://github.com/RoadieHQ/sample-service/blob/main/demo_template.yaml"; - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.analyzeComponent(template); diff --git a/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts b/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts index b5c5f0ad76..9909a29a13 100644 --- a/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts +++ b/e2e-tests/playwright/e2e/audit-log/scaffold.spec.ts @@ -22,7 +22,7 @@ test.describe("Audit Log check for Catalog Plugin", () => { common = new Common(page); catalogImport = new CatalogImport(page); await common.loginAsGuest(); - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); }); test("Should fetch logs for ScaffolderParameterSchemaFetch event and validate log structure and values", async ({ @@ -32,7 +32,7 @@ test.describe("Audit Log check for Catalog Plugin", () => { await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent(template, false); await page.waitForTimeout(1000); - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); await common.waitForLoad(); await uiHelper.clickBtnInCard("Hello World 2", "Choose"); await LogUtils.validateLogEvent( diff --git a/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts b/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts index 505445e8f4..2686f5bb2e 100644 --- a/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts +++ b/e2e-tests/playwright/e2e/authProviders/github-happy-path.spec.ts @@ -130,7 +130,7 @@ test.describe.serial("GitHub Happy path", () => { test("Register an existing component", async () => { await uiHelper.openSidebar("Catalog"); await uiHelper.selectMuiBox("Kind", "Component"); - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent(component); }); @@ -161,7 +161,7 @@ test.describe.serial("GitHub Happy path", () => { }); test("Verify all 12 Software Templates appear in the Create page", async () => { - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); await uiHelper.verifyHeading("Templates"); for (const template of TEMPLATES) { diff --git a/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts b/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts index 4ea25193cb..240b11555c 100644 --- a/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts +++ b/e2e-tests/playwright/e2e/catalog-scaffolded-from-link.spec.ts @@ -39,7 +39,7 @@ test.describe.serial("Link Scaffolded Templates to Catalog Items", () => { test("Register an Template", async () => { await uiHelper.openSidebar("Catalog"); - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent(template, false); }); @@ -47,7 +47,7 @@ test.describe.serial("Link Scaffolded Templates to Catalog Items", () => { test("Create a React App using the newly registered Template", async () => { test.setTimeout(130000); await uiHelper.openSidebar("Catalog"); - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.searchInputPlaceholder("Create React App Template"); await uiHelper.verifyText("Create React App Template"); await uiHelper.waitForTextDisappear("Add ArgoCD to an existing project"); diff --git a/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts b/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts index 0ba48da31c..3dfb0f8702 100644 --- a/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts +++ b/e2e-tests/playwright/e2e/catalog-timestamp.spec.ts @@ -31,7 +31,7 @@ test.describe("Test timestamp column on Catalog", () => { }); test("Register an existing component and verify `Created At` column and value in the Catalog Page", async () => { - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent(component); await uiHelper.openSidebar("Catalog"); diff --git a/e2e-tests/playwright/e2e/default-global-header.spec.ts b/e2e-tests/playwright/e2e/default-global-header.spec.ts index 03171af041..cf4434d77d 100644 --- a/e2e-tests/playwright/e2e/default-global-header.spec.ts +++ b/e2e-tests/playwright/e2e/default-global-header.spec.ts @@ -20,7 +20,7 @@ test.describe("Default Global Header", () => { page, }) => { await expect(page.locator(`input[placeholder="Search..."]`)).toBeVisible(); - await uiHelper.verifyLink({ label: "Create..." }); + await uiHelper.verifyLink({ label: "Self-service" }); await uiHelper.verifyLink({ label: "Support (external link)" }); await uiHelper.verifyLink({ label: "Notifications" }); expect(await uiHelper.isBtnVisible("rhdh-qe-2")).toBeTruthy(); @@ -31,9 +31,9 @@ test.describe("Default Global Header", () => { expect(await uiHelper.isBtnVisible("Settings")).toBeFalsy(); }); - test("Verify that clicking on Create button opens the Software Templates page", async () => { - await uiHelper.clickLink({ ariaLabel: "Create..." }); - await uiHelper.verifyHeading("Software Templates"); + test("Verify that clicking on Self-service button opens the Templates page", async () => { + await uiHelper.clickLink({ ariaLabel: "Self-service" }); + await uiHelper.verifyHeading("Self-service"); }); test("Verify that clicking on Support button opens a new tab", async ({ diff --git a/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts b/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts index 19cfa5dced..8a183a4a32 100644 --- a/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/bulk-import.spec.ts @@ -272,7 +272,7 @@ test.describe test('Verify repo from "register existing component" are displayed in bulk import Added repositories', async () => { // Register Existing Component await uiHelper.openSidebar("Catalog"); - await uiHelper.clickButton("Create"); + await uiHelper.clickButton("Self-service"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent( existingComponentDetails.url, diff --git a/e2e-tests/playwright/e2e/plugins/http-request.spec.ts b/e2e-tests/playwright/e2e/plugins/http-request.spec.ts index 49cf8e426f..86ed846b5b 100644 --- a/e2e-tests/playwright/e2e/plugins/http-request.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/http-request.spec.ts @@ -23,7 +23,7 @@ test.describe("Testing scaffolder-backend-module-http-request to invoke an exter test("Create a software template using http-request plugin", async () => { test.setTimeout(130000); - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); await uiHelper.verifyHeading("Templates"); await uiHelper.clickButton("Register Existing Component"); await catalogImport.registerExistingComponent(template, false); @@ -34,7 +34,7 @@ test.describe("Testing scaffolder-backend-module-http-request to invoke an exter await uiHelper.clickLink("Test HTTP Request"); await uiHelper.verifyHeading("Test HTTP Request"); await uiHelper.clickLink("Launch Template"); - await uiHelper.verifyHeading("Software Templates"); + await uiHelper.verifyHeading("Self-service"); await uiHelper.clickButton("Create"); //Checking for Http Status 200 await uiHelper.verifyText("200", false); diff --git a/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts b/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts index 5c21f32633..8a6901e3d2 100644 --- a/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/kubernetes-actions/kubernetes-actions.spec.ts @@ -18,12 +18,12 @@ test.describe("Test Kubernetes Actions plugin", () => { kubeClient = new KubeClient(); await common.loginAsGuest(); - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); }); test("Creates kubernetes namespace", async () => { namespace = `test-kubernetes-actions-${Date.now()}`; - await uiHelper.verifyHeading("Software Templates"); + await uiHelper.verifyHeading("Self-service"); await uiHelper.clickBtnInCard("Create a kubernetes namespace", "Choose"); await uiHelper.waitForTitle("Create a kubernetes namespace", 2); diff --git a/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts b/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts index f9249a2d05..363435963f 100644 --- a/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts +++ b/e2e-tests/playwright/e2e/plugins/rbac/rbac.spec.ts @@ -480,7 +480,7 @@ test.describe.serial("Test RBAC", () => { await uiHelper.openSidebar("Catalog"); await uiHelper.selectMuiBox("Kind", "Component"); await uiHelper.verifyTableIsEmpty(); - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); await page.reload(); await uiHelper.verifyText( "No templates found that match your filter. Learn more about", @@ -495,7 +495,7 @@ test.describe.serial("Test RBAC", () => { }); test("Test catalog-entity create is allowed", async () => { - await uiHelper.clickLink({ ariaLabel: "Create..." }); + await uiHelper.clickLink({ ariaLabel: "Self-service" }); expect(await uiHelper.isLinkVisible("Register Existing Component")); await uiHelper.clickButton("Register Existing Component"); const catalogImport = new CatalogImport(page); diff --git a/e2e-tests/playwright/utils/navbar.ts b/e2e-tests/playwright/utils/navbar.ts index 8e146bb28e..2513d7f33f 100644 --- a/e2e-tests/playwright/utils/navbar.ts +++ b/e2e-tests/playwright/utils/navbar.ts @@ -1,10 +1,9 @@ export type SidebarTabs = | "Catalog" - | "Create" | "Settings" | "My Group" | "Home" - | "Create..." + | "Self-service" | "Learning Paths" | "Extensions" | "Bulk import" diff --git a/packages/app/src/components/AppBase/AppBase.tsx b/packages/app/src/components/AppBase/AppBase.tsx index a92c861856..b4a3ee637f 100644 --- a/packages/app/src/components/AppBase/AppBase.tsx +++ b/packages/app/src/components/AppBase/AppBase.tsx @@ -97,9 +97,7 @@ const AppBase = () => { + } > diff --git a/packages/app/src/components/DynamicRoot/DynamicRoot.tsx b/packages/app/src/components/DynamicRoot/DynamicRoot.tsx index 7ccbb588a5..a1ab15fd47 100644 --- a/packages/app/src/components/DynamicRoot/DynamicRoot.tsx +++ b/packages/app/src/components/DynamicRoot/DynamicRoot.tsx @@ -20,6 +20,7 @@ import extractDynamicConfig, { DynamicRoute, } from '../../utils/dynamicUI/extractDynamicConfig'; import initializeRemotePlugins from '../../utils/dynamicUI/initializeRemotePlugins'; +import { catalogTranslations } from '../catalog/translations/catalog'; import { MenuIcon } from '../Root/MenuIcon'; import CommonIcons from './CommonIcons'; import defaultAppComponents from './defaultAppComponents'; @@ -458,6 +459,10 @@ export const DynamicRoot = ({ api => !remoteApis.some(remoteApi => remoteApi.api.id === api.api.id), ); app.current = createApp({ + __experimentalTranslations: { + availableLanguages: ['en'], + resources: [catalogTranslations], + }, apis: [...filteredStaticApis, ...remoteApis], bindRoutes({ bind }) { bindAppRoutes(bind, resolvedRouteBindingTargets, routeBindings); diff --git a/packages/app/src/components/catalog/translations/catalog-en.ts b/packages/app/src/components/catalog/translations/catalog-en.ts new file mode 100644 index 0000000000..34b80f9598 --- /dev/null +++ b/packages/app/src/components/catalog/translations/catalog-en.ts @@ -0,0 +1,12 @@ +import { createTranslationMessages } from '@backstage/core-plugin-api/alpha'; +import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; + +const en = createTranslationMessages({ + ref: catalogTranslationRef, + full: false, // False means that this is a partial translation + messages: { + 'indexPage.createButtonTitle': 'Self-service', + }, +}); + +export default en; diff --git a/packages/app/src/components/catalog/translations/catalog.ts b/packages/app/src/components/catalog/translations/catalog.ts new file mode 100644 index 0000000000..6475233edd --- /dev/null +++ b/packages/app/src/components/catalog/translations/catalog.ts @@ -0,0 +1,9 @@ +import { createTranslationResource } from '@backstage/core-plugin-api/alpha'; +import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; + +export const catalogTranslations = createTranslationResource({ + ref: catalogTranslationRef, + translations: { + en: () => import('./catalog-en'), + }, +}); diff --git a/packages/app/src/consts.ts b/packages/app/src/consts.ts index 1cb2215f4c..8594bebaa5 100644 --- a/packages/app/src/consts.ts +++ b/packages/app/src/consts.ts @@ -30,7 +30,7 @@ export const DefaultMainMenuItems = { priority: 60, }, 'default.create': { - title: 'Create...', + title: 'Self-service', icon: 'add', to: 'create', priority: 50, diff --git a/yarn.lock b/yarn.lock index 6102382f5f..bc679662f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13148,27 +13148,6 @@ __metadata: languageName: node linkType: hard -"@mui/styled-engine@npm:5.16.13": - version: 5.16.13 - resolution: "@mui/styled-engine@npm:5.16.13" - dependencies: - "@babel/runtime": ^7.23.9 - "@emotion/cache": ^11.13.5 - csstype: ^3.1.3 - prop-types: ^15.8.1 - peerDependencies: - "@emotion/react": ^11.4.1 - "@emotion/styled": ^11.3.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - checksum: d9459ef4baac056d1a65e351e084b2fe1eb30516907fc48166f570c60e3db3cb30de2d0af2bf22a8caa004bf2c37a1b831ccad1069b1d03cfae202c247967e44 - languageName: node - linkType: hard - "@mui/styled-engine@npm:5.16.14, @mui/styled-engine@npm:^5.16.14": version: 5.16.14 resolution: "@mui/styled-engine@npm:5.16.14" @@ -16902,9 +16881,9 @@ __metadata: languageName: node linkType: hard -"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.0.0": - version: 1.0.0 - resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.0.0" +"@red-hat-developer-hub/backstage-plugin-global-header@npm:1.1.0": + version: 1.1.0 + resolution: "@red-hat-developer-hub/backstage-plugin-global-header@npm:1.1.0" dependencies: "@backstage/catalog-model": ^1.7.3 "@backstage/core-components": ^0.16.3 @@ -16921,15 +16900,15 @@ __metadata: "@backstage/plugin-search-react": ^1.8.5 "@backstage/plugin-signals-react": ^0.0.9 "@backstage/theme": ^0.6.3 - "@mui/icons-material": 5.16.13 - "@mui/material": 5.16.13 - "@mui/styled-engine": 5.16.13 + "@mui/icons-material": 5.16.14 + "@mui/material": 5.16.14 + "@mui/styled-engine": 5.16.14 "@scalprum/react-core": 0.9.3 react-use: ^17.5.0 peerDependencies: react: ^16.13.1 || ^17.0.0 || ^18.0.0 react-router-dom: ^6.0.0 - checksum: 6500dfcac091608b4eb466c1702f28934a276dd7cbf04aaafca167c74c605c6a520dfaa425f8669d21f5365e46b830a6acbb291206fe5b67bf7fde742823a586 + checksum: 1ea671962219deb0a927d3bc93c54cc5e369824b3cf316f2bb1a6c0d2e0577a058d7449bd6dcd146ef2ad513ecd62b6a48356424a0372605a7e7ce397ab46b43 languageName: node linkType: hard @@ -41054,7 +41033,7 @@ __metadata: "@backstage/cli": 0.29.6 "@janus-idp/cli": 3.3.0 "@mui/material": 5.16.14 - "@red-hat-developer-hub/backstage-plugin-global-header": 1.0.0 + "@red-hat-developer-hub/backstage-plugin-global-header": 1.1.0 typescript: 5.8.2 languageName: unknown linkType: soft