Remove plugin catalog code

This commit is contained in:
Bill Thornton
2025-07-14 17:28:17 -04:00
parent 0eeed43d85
commit 9fd0fcc175
6 changed files with 1 additions and 165 deletions
+1 -4
View File
@@ -22,10 +22,7 @@ export const HelpLinks = [
paths: ['/dashboard/playback/transcoding'],
url: 'https://jellyfin.org/docs/general/server/transcoding'
}, {
paths: [
'/dashboard/plugins',
'/dashboard/plugins/catalog'
],
paths: ['/dashboard/plugins'],
url: 'https://jellyfin.org/docs/general/server/plugins/'
}, {
paths: ['/dashboard/plugins/repositories'],
@@ -1,28 +0,0 @@
import React from 'react';
import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info';
import ExtensionIcon from '@mui/icons-material/Extension';
import BaseCard from 'apps/dashboard/components/BaseCard';
import { useLocation } from 'react-router-dom';
type IProps = {
pkg: PackageInfo;
};
const PackageCard = ({ pkg }: IProps) => {
const location = useLocation();
return (
<BaseCard
title={pkg.name}
image={pkg.imageUrl}
icon={<ExtensionIcon sx={{ width: 80, height: 80 }} />}
to={{
pathname: `/dashboard/plugins/${pkg.guid}`,
search: `?name=${encodeURIComponent(pkg.name || '')}`,
hash: location.hash
}}
/>
);
};
export default PackageCard;
@@ -1,17 +0,0 @@
import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info';
const getPackageCategories = (packages?: PackageInfo[]) => {
if (!packages) return [];
const categories: string[] = [];
for (const pkg of packages) {
if (pkg.category && !categories.includes(pkg.category)) {
categories.push(pkg.category);
}
}
return categories.sort((a, b) => a.localeCompare(b));
};
export default getPackageCategories;
@@ -1,17 +0,0 @@
import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/package-info';
const getPackagesByCategory = (packages: PackageInfo[] | undefined, category: string) => {
if (!packages) return [];
return packages
.filter(pkg => pkg.category === category)
.sort((a, b) => {
if (a.name && b.name) {
return a.name.localeCompare(b.name);
} else {
return 0;
}
});
};
export default getPackagesByCategory;
@@ -1,98 +0,0 @@
import Settings from '@mui/icons-material/Settings';
import Box from '@mui/material/Box';
import Grid from '@mui/material/Grid2';
import IconButton from '@mui/material/IconButton';
import Stack from '@mui/material/Stack';
import TextField from '@mui/material/TextField';
import Typography from '@mui/material/Typography';
import React, { useCallback, useMemo, useState } from 'react';
import { Link } from 'react-router-dom';
import { usePackages } from 'apps/dashboard/features/plugins/api/usePackages';
import PackageCard from 'apps/dashboard/features/plugins/components/PackageCard';
import { PluginCategory } from 'apps/dashboard/features/plugins/constants/pluginCategory';
import { CATEGORY_LABELS } from 'apps/dashboard/features/plugins/constants/categoryLabels';
import getPackageCategories from 'apps/dashboard/features/plugins/utils/getPackageCategories';
import getPackagesByCategory from 'apps/dashboard/features/plugins/utils/getPackagesByCategory';
import Loading from 'components/loading/LoadingComponent';
import Page from 'components/Page';
import globalize from 'lib/globalize';
export const Component = () => {
const { data: packages, isPending: isPackagesPending } = usePackages();
const [ searchQuery, setSearchQuery ] = useState('');
const filteredPackages = useMemo(() => {
return packages?.filter(i => i.name?.toLocaleLowerCase().includes(searchQuery.toLocaleLowerCase()));
}, [ packages, searchQuery ]);
const packageCategories = getPackageCategories(filteredPackages);
const updateSearchQuery = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
setSearchQuery(e.target.value);
}, []);
const getCategoryLabel = (category: string) => {
const categoryKey = category.replace(/\s/g, '') as PluginCategory;
if (CATEGORY_LABELS[categoryKey]) {
return globalize.translate(CATEGORY_LABELS[categoryKey]);
}
console.warn('[AvailablePlugins] unmapped category label', category);
return category;
};
if (isPackagesPending) {
return <Loading />;
}
return (
<Page
id='pluginCatalogPage'
className='mainAnimatedPage type-interior'
title={globalize.translate('TabCatalog')}
>
<Box className='content-primary'>
<Stack spacing={3}>
<Stack direction='row' gap={1}>
<Typography variant='h1'>{globalize.translate('TabCatalog')}</Typography>
<IconButton
component={Link}
to='/dashboard/plugins/repositories'
sx={{
backgroundColor: 'background.paper'
}}
>
<Settings />
</IconButton>
</Stack>
<TextField
label={globalize.translate('Search')}
value={searchQuery}
onChange={updateSearchQuery}
/>
{packageCategories.map(category => (
<Stack key={category} spacing={2}>
<Typography variant='h2'>{getCategoryLabel(category)}</Typography>
<Grid container spacing={2} columns={{ xs: 1, sm: 4, md: 9, lg: 8, xl: 10 }}>
{getPackagesByCategory(filteredPackages, category).map(pkg => (
<Grid key={pkg.guid} size={{ xs: 1, sm: 2, md: 3, lg: 2 }}>
<PackageCard
pkg={pkg}
/>
</Grid>
))}
</Grid>
</Stack>
))}
</Stack>
</Box>
</Page>
);
};
Component.displayName = 'PluginsCatalogPage';
-1
View File
@@ -1605,7 +1605,6 @@
"TabAccess": "Access",
"TabAdvanced": "Advanced",
"HeaderBackups": "Backups",
"TabCatalog": "Catalog",
"TabDashboard": "Dashboard",
"TabLatest": "Recently Added",
"TabLogs": "Logs",