mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Fix configuration page link
This commit is contained in:
parent
e928a2ff95
commit
c143082f63
3 changed files with 27 additions and 5 deletions
21
src/apps/dashboard/features/plugins/api/configurationPage.ts
Normal file
21
src/apps/dashboard/features/plugins/api/configurationPage.ts
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import type { ConfigurationPageInfo } from '@jellyfin/sdk/lib/generated-client/models/configuration-page-info';
|
||||||
|
|
||||||
|
export const findBestConfigurationPage = (
|
||||||
|
configurationPages: ConfigurationPageInfo[],
|
||||||
|
pluginId: string
|
||||||
|
) => {
|
||||||
|
// Find candidates matching the plugin id
|
||||||
|
const candidates = configurationPages.filter(c => c.PluginId === pluginId);
|
||||||
|
|
||||||
|
// If none are found, return undefined
|
||||||
|
if (candidates.length === 0) return;
|
||||||
|
// If only one is found, return it
|
||||||
|
if (candidates.length === 1) return candidates[0];
|
||||||
|
|
||||||
|
// Prefer the first candidate with the EnableInMainMenu flag for consistency
|
||||||
|
const menuCandidate = candidates.find(c => !!c.EnableInMainMenu);
|
||||||
|
if (menuCandidate) return menuCandidate;
|
||||||
|
|
||||||
|
// Fallback to the first match
|
||||||
|
return candidates[0];
|
||||||
|
};
|
|
@ -1,14 +1,14 @@
|
||||||
import type { PluginStatus, VersionInfo } from '@jellyfin/sdk/lib/generated-client';
|
import type { ConfigurationPageInfo, PluginStatus, VersionInfo } from '@jellyfin/sdk/lib/generated-client';
|
||||||
|
|
||||||
export interface PluginDetails {
|
export interface PluginDetails {
|
||||||
canUninstall: boolean
|
canUninstall: boolean
|
||||||
description?: string
|
description?: string
|
||||||
hasConfiguration: boolean
|
|
||||||
id: string
|
id: string
|
||||||
imageUrl?: string
|
imageUrl?: string
|
||||||
isEnabled: boolean
|
isEnabled: boolean
|
||||||
name?: string
|
name?: string
|
||||||
owner?: string
|
owner?: string
|
||||||
|
configurationPage?: ConfigurationPageInfo
|
||||||
status?: PluginStatus
|
status?: PluginStatus
|
||||||
version?: VersionInfo
|
version?: VersionInfo
|
||||||
versions: VersionInfo[]
|
versions: VersionInfo[]
|
||||||
|
|
|
@ -16,6 +16,7 @@ import Settings from '@mui/icons-material/Settings';
|
||||||
import React, { type FC, useEffect, useState, useCallback, useMemo } from 'react';
|
import React, { type FC, useEffect, useState, useCallback, useMemo } from 'react';
|
||||||
import { useSearchParams, Link as RouterLink, useParams } from 'react-router-dom';
|
import { useSearchParams, Link as RouterLink, useParams } from 'react-router-dom';
|
||||||
|
|
||||||
|
import { findBestConfigurationPage } from 'apps/dashboard/features/plugins/api/configurationPage';
|
||||||
import { findBestPluginInfo } from 'apps/dashboard/features/plugins/api/pluginInfo';
|
import { findBestPluginInfo } from 'apps/dashboard/features/plugins/api/pluginInfo';
|
||||||
import { useConfigurationPages } from 'apps/dashboard/features/plugins/api/useConfigurationPages';
|
import { useConfigurationPages } from 'apps/dashboard/features/plugins/api/useConfigurationPages';
|
||||||
import { useDisablePlugin } from 'apps/dashboard/features/plugins/api/useDisablePlugin';
|
import { useDisablePlugin } from 'apps/dashboard/features/plugins/api/useDisablePlugin';
|
||||||
|
@ -261,7 +262,6 @@ const PluginPage: FC = () => {
|
||||||
setPluginDetails({
|
setPluginDetails({
|
||||||
canUninstall: !!pluginInfo?.CanUninstall,
|
canUninstall: !!pluginInfo?.CanUninstall,
|
||||||
description: pluginInfo?.Description || packageInfo?.description || packageInfo?.overview,
|
description: pluginInfo?.Description || packageInfo?.description || packageInfo?.overview,
|
||||||
hasConfiguration: !!configurationPages?.some(page => page.PluginId === pluginId),
|
|
||||||
id: pluginId,
|
id: pluginId,
|
||||||
imageUrl: imageUrl || packageInfo?.imageUrl || undefined,
|
imageUrl: imageUrl || packageInfo?.imageUrl || undefined,
|
||||||
isEnabled: (isEnabledOverride && pluginInfo?.Status === PluginStatus.Restart)
|
isEnabled: (isEnabledOverride && pluginInfo?.Status === PluginStatus.Restart)
|
||||||
|
@ -269,6 +269,7 @@ const PluginPage: FC = () => {
|
||||||
name: pluginName || pluginInfo?.Name || packageInfo?.name,
|
name: pluginName || pluginInfo?.Name || packageInfo?.name,
|
||||||
owner: packageInfo?.owner,
|
owner: packageInfo?.owner,
|
||||||
status: pluginInfo?.Status,
|
status: pluginInfo?.Status,
|
||||||
|
configurationPage: findBestConfigurationPage(configurationPages || [], pluginId),
|
||||||
version,
|
version,
|
||||||
versions: packageInfo?.versions || []
|
versions: packageInfo?.versions || []
|
||||||
});
|
});
|
||||||
|
@ -360,10 +361,10 @@ const PluginPage: FC = () => {
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{!isLoading && pluginDetails?.hasConfiguration && (
|
{!isLoading && pluginDetails?.configurationPage?.Name && (
|
||||||
<Button
|
<Button
|
||||||
component={RouterLink}
|
component={RouterLink}
|
||||||
to={`/${getPluginUrl(pluginName)}`}
|
to={`/${getPluginUrl(pluginDetails.configurationPage.Name)}`}
|
||||||
startIcon={<Settings />}
|
startIcon={<Settings />}
|
||||||
>
|
>
|
||||||
{globalize.translate('Settings')}
|
{globalize.translate('Settings')}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue