diff --git a/src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx b/src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx index 422a79e9..01d96db0 100644 --- a/src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx +++ b/src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx @@ -1,5 +1,5 @@ -import React, { useEffect } from 'react'; -import { map, toNumber } from 'lodash'; +import React, { useEffect, useMemo } from 'react'; +import { forEach, map, toNumber } from 'lodash'; import { useImmer } from 'use-immer'; import Button from '@/components/Input/Button'; @@ -7,11 +7,14 @@ import Checkbox from '@/components/Input/Checkbox'; import ModalPanel from '@/components/Panels/ModalPanel'; import toast from '@/components/Toast'; import { useDeleteFilesMutation } from '@/core/react-query/file/mutations'; +import { useImportFoldersQuery } from '@/core/react-query/import-folder/queries'; import { resetQueries } from '@/core/react-query/queryClient'; import { ReleaseManagementItemType } from '@/core/react-query/release-management/types'; import { useSeriesFileSummaryQuery } from '@/core/react-query/webui/queries'; import useEventCallback from '@/hooks/useEventCallback'; +import type { ImportFolderType } from '@/core/types/api/import-folder'; + type Props = { show: boolean; onClose: () => void; @@ -25,13 +28,24 @@ const QuickSelectModal = ({ onClose, seriesId, show, type }: Props) => { { groupBy: type === ReleaseManagementItemType.MultipleReleases ? 'GroupName,FileSource,FileVersion,ImportFolder,VideoCodecs,VideoResolution,AudioLanguages,SubtitleLanguages,VideoHasChapters' - : 'ImportFolder,MultipleLocations', + : 'ImportFolder,FileLocation,MultipleLocations', includeEpisodeDetails: true, }, show, ); const fileSummary = fileSummaryQuery.data; + const importFoldersQuery = useImportFoldersQuery(); + const importFolders = useMemo>(() => { + const result = {}; + + forEach(importFoldersQuery.data, (folder) => { + result[folder.ID] = folder; + }); + + return result; + }, [importFoldersQuery]); + const { isPending: isDeleting, mutate: deleteFiles } = useDeleteFilesMutation(); const [groupsToDelete, setGroupsToDelete] = useImmer>(new Set()); @@ -76,104 +90,112 @@ const QuickSelectModal = ({ onClose, seriesId, show, type }: Props) => { {fileSummaryQuery.isSuccess && ( map( fileSummary?.Groups, - (group, index) => ( -
-
- {type === ReleaseManagementItemType.DuplicateFiles && ( - <> -
- Import Folder:  - {group.ImportFolder} -
-
- {group.Episodes?.length} -  Episodes - {group.RangeByType.Normal && ( - <> -  ( - {group.RangeByType.Normal.Range} - ) - - )} -
- - )} - - {type === ReleaseManagementItemType.MultipleReleases && ( - <> -
- {group.GroupName === 'None' ? 'Manual link' : group.GroupName} -  -  - {group.Episodes?.length} -  Episodes - {group.RangeByType.Normal && ( - <> -  ( - {group.RangeByType.Normal.Range} - ) - - )} -  -  - {`v${group.FileVersion}`} -
-
- Import Folder:  - {group.ImportFolder} -
-
- {group.FileSource} -  |  - {group.VideoCodecs?.toUpperCase()} -  |  - {group.VideoResolution} - {group.AudioLanguages && ( - <> -  |  -
- {group.AudioLanguages.length === 0 ? 'No Audio' : ( - <> - {group.AudioLanguages.length > 1 ? 'Multi ' : 'Single '} - Audio ( - {group.AudioLanguages.join(', ')} - ) - - )} -
- - )} - {group.SubtitleLanguages && ( - <> -  |  -
- {group.SubtitleLanguages.length === 0 ? 'No Subs' : ( - <> - {group.SubtitleLanguages.length > 1 ? 'Multi ' : 'Single '} - Subs ( - {group.SubtitleLanguages.join(', ')} - ) - - )} -
- - )} - {group.VideoHasChapters && ( - <> -  |  -
Chaptered
- - )} -
- - )} + (group, index) => { + const importFolder = importFolders[group.ImportFolder!]; + + return ( +
+
+ {type === ReleaseManagementItemType.DuplicateFiles && ( + <> +
+ Import Folder:  + {`${importFolder.Name} (ID: ${importFolder.ID})`} +
+
+ Location:  + {group.FileLocation?.replace(importFolder.Path, '')} +
+
+ {group.Episodes?.length} +  Episodes + {group.RangeByType.Normal && ( + <> +  ( + {group.RangeByType.Normal.Range} + ) + + )} +
+ + )} + + {type === ReleaseManagementItemType.MultipleReleases && ( + <> +
+ {group.GroupName === 'None' ? 'Manual link' : group.GroupName} +  -  + {group.Episodes?.length} +  Episodes + {group.RangeByType.Normal && ( + <> +  ( + {group.RangeByType.Normal.Range} + ) + + )} +  -  + {`v${group.FileVersion}`} +
+
+ Import Folder:  + {`${importFolder.Name} (ID: ${importFolder.ID})`} +
+
+ {group.FileSource} +  |  + {group.VideoCodecs?.toUpperCase()} +  |  + {group.VideoResolution} + {group.AudioLanguages && ( + <> +  |  +
+ {group.AudioLanguages.length === 0 ? 'No Audio' : ( + <> + {group.AudioLanguages.length > 1 ? 'Multi ' : 'Single '} + Audio ( + {group.AudioLanguages.join(', ')} + ) + + )} +
+ + )} + {group.SubtitleLanguages && ( + <> +  |  +
+ {group.SubtitleLanguages.length === 0 ? 'No Subs' : ( + <> + {group.SubtitleLanguages.length > 1 ? 'Multi ' : 'Single '} + Subs ( + {group.SubtitleLanguages.join(', ')} + ) + + )} +
+ + )} + {group.VideoHasChapters && ( + <> +  |  +
Chaptered
+ + )} +
+ + )} +
+
- -
- ), + ); + }, ) )} diff --git a/src/core/types/api/webui.ts b/src/core/types/api/webui.ts index becbad25..40862a63 100644 --- a/src/core/types/api/webui.ts +++ b/src/core/types/api/webui.ts @@ -41,7 +41,7 @@ export type WebuiSeriesFileSummaryGroupType = { FileSource?: string; FileLocation?: string; FileIsDeprecated?: boolean; - ImportFolder?: string; + ImportFolder?: number; VideoCodecs?: string; VideoBitDepth?: number; VideoResolution?: string; diff --git a/src/hooks/useIsFeatureSupported.ts b/src/hooks/useIsFeatureSupported.ts index 89f4e039..d1d89d06 100644 --- a/src/hooks/useIsFeatureSupported.ts +++ b/src/hooks/useIsFeatureSupported.ts @@ -8,7 +8,7 @@ import type { VersionType } from '@/core/types/api/init'; export enum FeatureType { Placeholder = '5.0.0.0', // This is as a placeholder so the string conversion for `parseServerVersion` works and also serves as an example - DuplicatesQuickSelect = '5.1.0.4', + ReleaseManagementQuickSelect = '5.1.0.6', } const useIsFeatureSupported = (feature: FeatureType) => { diff --git a/src/pages/utilities/ReleaseManagement.tsx b/src/pages/utilities/ReleaseManagement.tsx index e5834ca2..db7196b1 100644 --- a/src/pages/utilities/ReleaseManagement.tsx +++ b/src/pages/utilities/ReleaseManagement.tsx @@ -135,7 +135,7 @@ const ReleaseManagement = () => { }); }); - const isDuplicatesQuickSelectSupported = useIsFeatureSupported(FeatureType.DuplicatesQuickSelect); + const isQuickSelectSupported = useIsFeatureSupported(FeatureType.ReleaseManagementQuickSelect); return ( <> @@ -196,13 +196,13 @@ const ReleaseManagement = () => { {/* */} {/* )} */} - {(type === ReleaseManagementItemType.MultipleReleases || isDuplicatesQuickSelectSupported) - && !selectedEpisode && ( + {!selectedEpisode && (