Skip to content

Commit f1ecf4a

Browse files
committed
feat(extensions): add row actions to installed packages
1 parent e015957 commit f1ecf4a

30 files changed

+847
-618
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@red-hat-developer-hub/backstage-plugin-marketplace-backend': patch
3+
'@red-hat-developer-hub/backstage-plugin-marketplace': patch
4+
---
5+
6+
added row actions to the installed packages
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@red-hat-developer-hub/backstage-plugin-marketplace-common': patch
3+
---
4+
5+
update disablePackage to make PATCH call instead of POST

workspaces/marketplace/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@
5050
"minimatch": "3",
5151
"node-gyp": "^9.0.0",
5252
"prettier": "^3.4.2",
53-
"typescript": "~5.3.0",
54-
"yaml": "^2.8.1"
53+
"typescript": "~5.3.0"
5554
},
5655
"resolutions": {
5756
"@backstage/app-defaults": "1.6.5",

workspaces/marketplace/plugins/marketplace-backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"@red-hat-developer-hub/backstage-plugin-marketplace-common": "workspace:^",
4646
"express": "^4.17.1",
4747
"express-promise-router": "^4.1.0",
48+
"yaml": "^2.7.1",
4849
"zod": "^3.22.4"
4950
},
5051
"devDependencies": {

workspaces/marketplace/plugins/marketplace-common/src/api/MarketplaceBackendClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ export class MarketplaceBackendClient implements MarketplaceApi {
208208
): Promise<{ status: string }> {
209209
return this.request(
210210
`/package/${encodeURIComponent(namespace)}/${encodeURIComponent(name)}/configuration/disable`,
211-
'POST',
211+
'PATCH',
212212
undefined,
213213
{ disabled },
214214
);

workspaces/marketplace/plugins/marketplace/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"@red-hat-developer-hub/backstage-plugin-marketplace-common": "workspace:^",
6464
"@scalprum/react-core": "0.9.5",
6565
"@tanstack/react-query": "^5.60.5",
66+
"js-yaml": "^4.1.0",
6667
"monaco-editor": "^0.53.0",
6768
"react-use": "^17.6.0",
6869
"yaml": "^2.7.0"

workspaces/marketplace/plugins/marketplace/report-alpha.api.md

Lines changed: 117 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,30 @@ import { TranslationResource } from '@backstage/core-plugin-api/alpha';
99

1010
// @alpha
1111
export const marketplaceTranslationRef: TranslationRef<"plugin.marketplace", {
12+
readonly "search.filter": string;
13+
readonly "search.clear": string;
14+
readonly "search.placeholder": string;
15+
readonly "search.author": string;
16+
readonly "search.clearFilter": string;
17+
readonly "search.category": string;
18+
readonly "search.supportType": string;
19+
readonly "search.noResults": string;
20+
readonly "search.filterBy": string;
21+
readonly "search.clearFilters": string;
22+
readonly "search.noResultsFound": string;
23+
readonly error: string;
24+
readonly "button.close": string;
1225
readonly "button.update": string;
26+
readonly "button.restart": string;
27+
readonly "button.disable": string;
1328
readonly "button.install": string;
1429
readonly "button.uninstall": string;
1530
readonly "button.enable": string;
16-
readonly "button.disable": string;
1731
readonly "button.save": string;
18-
readonly "button.close": string;
1932
readonly "button.viewAll": string;
2033
readonly "button.viewDocumentation": string;
2134
readonly "button.viewInstalledPlugins": string;
22-
readonly "button.restart": string;
35+
readonly loading: string;
2336
readonly "dialog.backendRestartRequired": string;
2437
readonly "dialog.restartMessage": string;
2538
readonly "header.title": string;
@@ -30,90 +43,38 @@ readonly "header.installedPackagesWithCount": string;
3043
readonly "header.pluginsPage": string;
3144
readonly "header.packagesPage": string;
3245
readonly "header.collectionsPage": string;
33-
readonly "search.filter": string;
34-
readonly "search.author": string;
35-
readonly "search.placeholder": string;
36-
readonly "search.clear": string;
37-
readonly "search.clearFilter": string;
38-
readonly "search.category": string;
39-
readonly "search.supportType": string;
40-
readonly "search.noResults": string;
41-
readonly "search.filterBy": string;
42-
readonly "search.clearFilters": string;
43-
readonly "search.noResultsFound": string;
44-
readonly "table.plugins": string;
45-
readonly "table.packageName": string;
46-
readonly "table.version": string;
47-
readonly "table.role": string;
4846
readonly "table.name": string;
49-
readonly "table.packages": string;
47+
readonly "table.action": string;
48+
readonly "table.role": string;
5049
readonly "table.description": string;
5150
readonly "table.status": string;
52-
readonly "table.supportedVersion": string;
53-
readonly "table.action": string;
51+
readonly "table.version": string;
52+
readonly "table.plugins": string;
53+
readonly "table.packageName": string;
5454
readonly "table.versions": string;
55+
readonly "table.packages": string;
56+
readonly "table.supportedVersion": string;
5557
readonly "table.pluginsCount": string;
5658
readonly "table.packagesCount": string;
5759
readonly "table.pluginsTable": string;
5860
readonly "metadata.about": string;
59-
readonly "metadata.highlights": string;
6061
readonly "metadata.by": string;
62+
readonly "metadata.versions": string;
63+
readonly "metadata.highlights": string;
64+
readonly "metadata.category": string;
6165
readonly "metadata.pluginNotFound": string;
6266
readonly "metadata.publisher": string;
6367
readonly "metadata.supportProvider": string;
68+
readonly "metadata.entryName": string;
69+
readonly "metadata.bySomeone": string;
6470
readonly "role.backend": string;
6571
readonly "role.backendModule": string;
6672
readonly "role.frontend": string;
67-
readonly "install.title": string;
68-
readonly "install.configurationRequired": string;
69-
readonly "install.optional": string;
70-
readonly "install.required": string;
71-
readonly "install.selectPackages": string;
72-
readonly "install.allPackages": string;
73-
readonly "install.customConfiguration": string;
74-
readonly "install.installProgress": string;
75-
readonly "install.success": string;
76-
readonly "install.error": string;
77-
readonly "install.installFrontend": string;
78-
readonly "install.installBackend": string;
79-
readonly "install.installTemplates": string;
80-
readonly "install.installationInstructions": string;
81-
readonly "install.download": string;
82-
readonly "install.examples": string;
83-
readonly "install.cancel": string;
84-
readonly "install.reset": string;
85-
readonly "install.pluginTabs": string;
86-
readonly "install.settingUpPlugin": string;
87-
readonly "install.aboutPlugin": string;
88-
readonly "install.pluginUpdated": string;
89-
readonly "install.pluginInstalled": string;
90-
readonly "install.instructions": string;
91-
readonly "install.editInstructions": string;
92-
readonly "install.back": string;
93-
readonly "install.packageUpdated": string;
94-
readonly "install.errors.missingPluginsList": string;
95-
readonly "install.errors.missingPackageItem": string;
96-
readonly "install.errors.missingPackageField": string;
97-
readonly "install.errors.failedToSave": string;
98-
readonly "installedPackages.table.title": string;
99-
readonly "installedPackages.table.searchPlaceholder": string;
100-
readonly "installedPackages.table.columns.packageName": string;
101-
readonly "installedPackages.table.columns.version": string;
102-
readonly "installedPackages.table.columns.role": string;
103-
readonly "installedPackages.table.columns.name": string;
104-
readonly "installedPackages.table.columns.actions": string;
105-
readonly "installedPackages.table.tooltips.enableActions": string;
106-
readonly "installedPackages.table.emptyMessages.noResults": string;
107-
readonly "installedPackages.table.emptyMessages.noRecords": string;
73+
readonly "status.disabled": string;
10874
readonly "status.installed": string;
10975
readonly "status.notInstalled": string;
110-
readonly "status.disabled": string;
11176
readonly "status.partiallyInstalled": string;
11277
readonly "status.updateAvailable": string;
113-
readonly "emptyState.noPluginsFound": string;
114-
readonly "emptyState.mustEnableBackend": string;
115-
readonly "emptyState.noPluginsDescription": string;
116-
readonly "emptyState.configureBackend": string;
11778
readonly "alert.productionDisabled": string;
11879
readonly "alert.installationDisabled": string;
11980
readonly "alert.extensionsExample": string;
@@ -123,80 +84,130 @@ readonly "alert.restartRequired": string;
12384
readonly "alert.backendRestartRequired": string;
12485
readonly "alert.backendRestartMessage": string;
12586
readonly "alert.viewPlugins": string;
87+
readonly "errors.missingConfigFile": string;
88+
readonly "errors.missingConfigMessage": string;
89+
readonly "errors.invalidConfigFile": string;
90+
readonly "errors.invalidConfigMessage": string;
91+
readonly "errors.fileNotExists": string;
92+
readonly "errors.fileNotExistsMessage": string;
93+
readonly "errors.unknownError": string;
12694
readonly "common.close": string;
127-
readonly "common.links": string;
12895
readonly "common.by": string;
96+
readonly "common.links": string;
12997
readonly "common.comma": string;
13098
readonly "common.noDescriptionAvailable": string;
13199
readonly "common.readMore": string;
132100
readonly "common.apply": string;
133101
readonly "common.couldNotApplyYaml": string;
134-
readonly "plugin.version": string;
135-
readonly "plugin.author": string;
136-
readonly "plugin.installation": string;
137-
readonly "plugin.configuration": string;
138-
readonly "plugin.description": string;
139-
readonly "plugin.documentation": string;
140-
readonly "plugin.repository": string;
141-
readonly "plugin.license": string;
142-
readonly "plugin.tags": string;
143-
readonly "plugin.dependencies": string;
144-
readonly "package.version": string;
145-
readonly "package.author": string;
146-
readonly "package.support": string;
147-
readonly "package.lifecycle": string;
148-
readonly "package.supportedVersions": string;
149-
readonly "package.about": string;
150-
readonly "package.name": string;
151-
readonly "package.highlights": string;
152-
readonly "package.dynamicPluginPath": string;
153-
readonly "package.backstageRole": string;
154-
readonly "package.notFound": string;
155102
readonly "actions.view": string;
156-
readonly "actions.install": string;
157-
readonly "actions.enable": string;
158-
readonly "actions.disable": string;
159103
readonly "actions.actions": string;
160104
readonly "actions.edit": string;
105+
readonly "actions.disable": string;
106+
readonly "actions.install": string;
107+
readonly "actions.enable": string;
161108
readonly "actions.editConfiguration": string;
162109
readonly "actions.pluginConfigurations": string;
110+
readonly "actions.packageConfiguration": string;
163111
readonly "actions.pluginCurrentlyEnabled": string;
164112
readonly "actions.pluginCurrentlyDisabled": string;
113+
readonly "actions.packageCurrentlyEnabled": string;
114+
readonly "actions.packageCurrentlyDisabled": string;
165115
readonly "actions.installTitle": string;
166116
readonly "actions.editTitle": string;
117+
readonly "package.name": string;
118+
readonly "package.about": string;
119+
readonly "package.version": string;
120+
readonly "package.lifecycle": string;
121+
readonly "package.author": string;
122+
readonly "package.support": string;
123+
readonly "package.supportedVersions": string;
124+
readonly "package.highlights": string;
125+
readonly "package.dynamicPluginPath": string;
126+
readonly "package.backstageRole": string;
127+
readonly "package.notFound": string;
128+
readonly "plugin.description": string;
129+
readonly "plugin.version": string;
130+
readonly "plugin.tags": string;
131+
readonly "plugin.repository": string;
132+
readonly "plugin.installation": string;
133+
readonly "plugin.license": string;
134+
readonly "plugin.author": string;
135+
readonly "plugin.dependencies": string;
136+
readonly "plugin.documentation": string;
137+
readonly "plugin.configuration": string;
138+
readonly "plugin.authors": string;
139+
readonly "install.required": string;
140+
readonly "install.optional": string;
141+
readonly "install.error": string;
142+
readonly "install.cancel": string;
143+
readonly "install.title": string;
144+
readonly "install.reset": string;
145+
readonly "install.success": string;
146+
readonly "install.download": string;
147+
readonly "install.errors.missingPluginsList": string;
148+
readonly "install.errors.missingPackageItem": string;
149+
readonly "install.errors.missingPackageField": string;
150+
readonly "install.errors.failedToSave": string;
151+
readonly "install.examples": string;
152+
readonly "install.configurationRequired": string;
153+
readonly "install.selectPackages": string;
154+
readonly "install.allPackages": string;
155+
readonly "install.customConfiguration": string;
156+
readonly "install.installProgress": string;
157+
readonly "install.installFrontend": string;
158+
readonly "install.installBackend": string;
159+
readonly "install.installTemplates": string;
160+
readonly "install.installationInstructions": string;
161+
readonly "install.pluginTabs": string;
162+
readonly "install.settingUpPlugin": string;
163+
readonly "install.aboutPlugin": string;
164+
readonly "install.pluginUpdated": string;
165+
readonly "install.pluginInstalled": string;
166+
readonly "install.instructions": string;
167+
readonly "install.editInstructions": string;
168+
readonly "install.back": string;
169+
readonly "install.packageUpdated": string;
170+
readonly "installedPackages.table.columns.name": string;
171+
readonly "installedPackages.table.columns.role": string;
172+
readonly "installedPackages.table.columns.version": string;
173+
readonly "installedPackages.table.columns.actions": string;
174+
readonly "installedPackages.table.columns.packageName": string;
175+
readonly "installedPackages.table.title": string;
176+
readonly "installedPackages.table.searchPlaceholder": string;
177+
readonly "installedPackages.table.tooltips.enableActions": string;
178+
readonly "installedPackages.table.tooltips.noDownloadPermissions": string;
179+
readonly "installedPackages.table.tooltips.noEditPermissions": string;
180+
readonly "installedPackages.table.tooltips.noTogglePermissions": string;
181+
readonly "installedPackages.table.emptyMessages.noResults": string;
182+
readonly "installedPackages.table.emptyMessages.noRecords": string;
183+
readonly "emptyState.noPluginsFound": string;
184+
readonly "emptyState.mustEnableBackend": string;
185+
readonly "emptyState.noPluginsDescription": string;
186+
readonly "emptyState.configureBackend": string;
167187
readonly "tooltips.productionDisabled": string;
168188
readonly "tooltips.extensionsDisabled": string;
169189
readonly "tooltips.noPermissions": string;
170190
readonly "supportTypes.certifiedBy": string;
171191
readonly "supportTypes.verifiedBy": string;
172192
readonly "supportTypes.customPlugins": string;
193+
readonly "collection.security": string;
194+
readonly "collection.featured.title": string;
195+
readonly "collection.featured.description": string;
173196
readonly "collection.kubernetes": string;
174197
readonly "collection.monitoring": string;
175-
readonly "collection.security": string;
176198
readonly "collection.viewMore": string;
177199
readonly "collection.pluginCount": string;
178-
readonly "collection.featured.title": string;
179-
readonly "collection.featured.description": string;
180-
readonly error: string;
181-
readonly "errors.missingConfigFile": string;
182-
readonly "errors.missingConfigMessage": string;
183-
readonly "errors.invalidConfigFile": string;
184-
readonly "errors.invalidConfigMessage": string;
185-
readonly "errors.fileNotExists": string;
186-
readonly "errors.fileNotExistsMessage": string;
187-
readonly "errors.unknownError": string;
188-
readonly loading: string;
189200
readonly retry: string;
190201
readonly "aria.filterBy": string;
191202
readonly "aria.openPlugin": string;
192203
readonly "aria.closeDialog": string;
193204
readonly "aria.expandSection": string;
194205
readonly "aria.collapseSection": string;
195206
readonly "aria.sortBy": string;
207+
readonly "badges.verified": string;
196208
readonly "badges.certifiedBy": string;
197209
readonly "badges.verifiedBy": string;
198210
readonly "badges.certified": string;
199-
readonly "badges.verified": string;
200211
readonly "badges.customPlugin": string;
201212
readonly "badges.stableAndSecured": string;
202213
readonly "badges.generallyAvailable": string;

workspaces/marketplace/plugins/marketplace/src/components/InstalledPackages/InstalledPackagesTable.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ import { InstalledPackagesTable } from './InstalledPackagesTable';
2626
import { errorApiRef } from '@backstage/core-plugin-api';
2727
import { translationApiRef } from '@backstage/core-plugin-api/alpha';
2828

29+
jest.mock('@backstage/core-plugin-api', () => ({
30+
...jest.requireActual('@backstage/core-plugin-api'),
31+
useRouteRef: () => (params: any) =>
32+
`/packages/${params.namespace}/${params.name}`,
33+
}));
34+
2935
describe('InstalledPackagesTable', () => {
3036
const renderWithProviders = (apis: any) =>
3137
render(

0 commit comments

Comments
 (0)