Skip to content

Commit

Permalink
Add quick select for deleting duplicates (#1172)
Browse files Browse the repository at this point in the history
  • Loading branch information
harshithmohan authored Jan 21, 2025
1 parent 73171a3 commit 29af0df
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 64 deletions.
153 changes: 90 additions & 63 deletions src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,24 @@ import ModalPanel from '@/components/Panels/ModalPanel';
import toast from '@/components/Toast';
import { useDeleteFilesMutation } from '@/core/react-query/file/mutations';
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';

type Props = {
show: boolean;
onClose: () => void;
seriesId: number;
type: ReleaseManagementItemType;
};

const QuickSelectModal = ({ onClose, seriesId, show }: Props) => {
const QuickSelectModal = ({ onClose, seriesId, show, type }: Props) => {
const fileSummaryQuery = useSeriesFileSummaryQuery(
seriesId,
{
groupBy:
'GroupName,FileSource,FileVersion,ImportFolder,VideoCodecs,VideoResolution,AudioLanguages,SubtitleLanguages,VideoHasChapters',
groupBy: type === ReleaseManagementItemType.MultipleReleases
? 'GroupName,FileSource,FileVersion,ImportFolder,VideoCodecs,VideoResolution,AudioLanguages,SubtitleLanguages,VideoHasChapters'
: 'ImportFolder,MultipleLocations',
includeEpisodeDetails: true,
},
show,
Expand Down Expand Up @@ -76,68 +79,92 @@ const QuickSelectModal = ({ onClose, seriesId, show }: Props) => {
(group, index) => (
<div key={`group-${index}`} className="flex items-center justify-between gap-x-3">
<div className="flex flex-col gap-y-1">
<div className="font-semibold">
{group.GroupName === 'None' ? 'Manual link' : group.GroupName}
&nbsp;-&nbsp;
{group.Episodes?.length}
&nbsp;Episodes
{group.RangeByType.Normal && (
<>
&nbsp;(
{group.RangeByType.Normal.Range}
)
</>
)}
&nbsp;-&nbsp;
{`v${group.FileVersion}`}
</div>
<div className="flex flex-wrap text-sm opacity-65">
Import Folder:&nbsp;
{group.ImportFolder}
</div>
<div className="flex flex-wrap text-sm opacity-65">
{group.FileSource}
&nbsp;|&nbsp;
{group.VideoCodecs?.toUpperCase()}
&nbsp;|&nbsp;
{group.VideoResolution}
{group.AudioLanguages && (
<>
&nbsp;|&nbsp;
<div>
{group.AudioLanguages.length === 0 ? 'No Audio' : (
<>
{group.AudioLanguages.length > 1 ? 'Multi ' : 'Single '}
Audio (
{group.AudioLanguages.join(', ')}
)
</>
)}
</div>
</>
)}
{group.SubtitleLanguages && (
<>
{type === ReleaseManagementItemType.DuplicateFiles && (
<>
<div className="font-semibold">
Import Folder:&nbsp;
{group.ImportFolder}
</div>
<div className="flex flex-wrap text-sm opacity-65">
{group.Episodes?.length}
&nbsp;Episodes
{group.RangeByType.Normal && (
<>
&nbsp;(
{group.RangeByType.Normal.Range}
)
</>
)}
</div>
</>
)}

{type === ReleaseManagementItemType.MultipleReleases && (
<>
<div className="font-semibold">
{group.GroupName === 'None' ? 'Manual link' : group.GroupName}
&nbsp;-&nbsp;
{group.Episodes?.length}
&nbsp;Episodes
{group.RangeByType.Normal && (
<>
&nbsp;(
{group.RangeByType.Normal.Range}
)
</>
)}
&nbsp;-&nbsp;
{`v${group.FileVersion}`}
</div>
<div className="flex flex-wrap text-sm opacity-65">
Import Folder:&nbsp;
{group.ImportFolder}
</div>
<div className="flex flex-wrap text-sm opacity-65">
{group.FileSource}
&nbsp;|&nbsp;
<div>
{group.SubtitleLanguages.length === 0 ? 'No Subs' : (
<>
{group.SubtitleLanguages.length > 1 ? 'Multi ' : 'Single '}
Subs (
{group.SubtitleLanguages.join(', ')}
)
</>
)}
</div>
</>
)}
{group.VideoHasChapters && (
<>
{group.VideoCodecs?.toUpperCase()}
&nbsp;|&nbsp;
<div>Chaptered</div>
</>
)}
</div>
{group.VideoResolution}
{group.AudioLanguages && (
<>
&nbsp;|&nbsp;
<div>
{group.AudioLanguages.length === 0 ? 'No Audio' : (
<>
{group.AudioLanguages.length > 1 ? 'Multi ' : 'Single '}
Audio (
{group.AudioLanguages.join(', ')}
)
</>
)}
</div>
</>
)}
{group.SubtitleLanguages && (
<>
&nbsp;|&nbsp;
<div>
{group.SubtitleLanguages.length === 0 ? 'No Subs' : (
<>
{group.SubtitleLanguages.length > 1 ? 'Multi ' : 'Single '}
Subs (
{group.SubtitleLanguages.join(', ')}
)
</>
)}
</div>
</>
)}
{group.VideoHasChapters && (
<>
&nbsp;|&nbsp;
<div>Chaptered</div>
</>
)}
</div>
</>
)}
</div>
<Checkbox
id={`checkbox-${index}`}
Expand Down
1 change: 1 addition & 0 deletions src/hooks/useIsFeatureSupported.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +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',
}

const useIsFeatureSupported = (feature: FeatureType) => {
Expand Down
7 changes: 6 additions & 1 deletion src/pages/utilities/ReleaseManagement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import {
import { invalidateQueries, resetQueries } from '@/core/react-query/queryClient';
import { ReleaseManagementItemType } from '@/core/react-query/release-management/types';
import useEventCallback from '@/hooks/useEventCallback';
import useIsFeatureSupported, { FeatureType } from '@/hooks/useIsFeatureSupported';

import type { ReleaseManagementOptionsType } from '@/components/Utilities/constants';
import type { EpisodeType } from '@/core/types/api/episode';
Expand Down Expand Up @@ -134,6 +135,8 @@ const ReleaseManagement = () => {
});
});

const isDuplicatesQuickSelectSupported = useIsFeatureSupported(FeatureType.DuplicatesQuickSelect);

return (
<>
<title>{`${titleMap[type]} | Shoko`}</title>
Expand Down Expand Up @@ -193,7 +196,8 @@ const ReleaseManagement = () => {
{/* </Button> */}
{/* )} */}

{(type === ReleaseManagementItemType.MultipleReleases && !selectedEpisode) && (
{(type === ReleaseManagementItemType.MultipleReleases || isDuplicatesQuickSelectSupported)
&& !selectedEpisode && (
<Button
buttonType="secondary"
className="flex gap-x-2.5 px-4 py-3 font-semibold"
Expand Down Expand Up @@ -273,6 +277,7 @@ const ReleaseManagement = () => {
show={showQuickSelectModal}
onClose={toggleShowQuickSelectModal}
seriesId={selectedSeries}
type={type}
/>
</div>
</>
Expand Down

0 comments on commit 29af0df

Please sign in to comment.