Skip to content

Commit 8016526

Browse files
authored
Merge pull request #141 from headlamp-k8s/update-available-label
plugin-catalog: Add update available label to card
2 parents e7996cd + ffad84c commit 8016526

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

plugin-catalog/src/components/plugins/List.tsx

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { PluginCard } from './PluginCard';
99
import { Switch } from '@mui/material';
1010
import { FormControlLabel } from '@mui/material';
1111
import { isEqual } from 'lodash';
12+
import semver from 'semver';
1213

1314
const PAGE_SIZE = 60; // Maximum allowed by the API
1415
const ARTIFACTHUB_HEADLAMP_PLUGIN_KIND = '21';
@@ -49,6 +50,7 @@ export interface PluginPackage {
4950
organization_name: string;
5051
};
5152
isInstalled: boolean;
53+
isUpdateAvailable: boolean;
5254
}
5355

5456
async function fetchPlugins(offset: number, org?: string) {
@@ -126,7 +128,15 @@ async function processPlugins() {
126128
} catch (err) {
127129
console.log('plugin-catalog: Failed to list plugins', err);
128130
}
129-
const installedPlugins = pluginData.map((plugin: any) => plugin.folderName);
131+
const installedVersions: Record<string, string> = pluginData.reduce(
132+
(acc, plugin: any) => {
133+
if (plugin.folderName && plugin.artifacthubVersion) {
134+
acc[plugin.folderName] = plugin.artifacthubVersion;
135+
}
136+
return acc;
137+
},
138+
{}
139+
);
130140

131141
// Merge all plugins and org-specific plugins, removing duplicates
132142
const mergedPlugins = [...allPlugins, ...orgPlugins];
@@ -135,10 +145,24 @@ async function processPlugins() {
135145
);
136146

137147
const pluginsWithInstallStatus = uniquePlugins
138-
.map((pkg: PluginPackage) => ({
139-
...pkg,
140-
isInstalled: installedPlugins.includes(pkg.name),
141-
}))
148+
.map((pkg: PluginPackage) => {
149+
const installedVersion = installedVersions[pkg.name];
150+
let isInstalled = false;
151+
let isUpdateAvailable = false;
152+
153+
if (installedVersion) {
154+
isInstalled = true;
155+
if (semver.valid(pkg.version) && semver.valid(installedVersion)) {
156+
isUpdateAvailable = semver.gt(pkg.version, installedVersion);
157+
}
158+
}
159+
160+
return {
161+
...pkg,
162+
isInstalled,
163+
isUpdateAvailable,
164+
};
165+
})
142166
// Reorder so plugins with logos show first.
143167
.sort((a, b) => (!!b.logo_image_id ? 1 : 0) - (!!a.logo_image_id ? 1 : 0));
144168

plugin-catalog/src/components/plugins/PluginCard.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@ export function PluginCard(props: PluginCardProps) {
151151
}}
152152
>
153153
<span></span>
154-
{plugin.isInstalled && <Typography>Installed</Typography>}
154+
{plugin.isInstalled && (
155+
<Typography>{plugin.isUpdateAvailable ? 'Update available' : 'Installed'}</Typography>
156+
)}
155157
</CardActions>
156158
</Card>
157159
</Box>

0 commit comments

Comments
 (0)