Skip to content

Commit

Permalink
Release mgmt quick select: group by location, use import folder ID
Browse files Browse the repository at this point in the history
  • Loading branch information
harshithmohan committed Jan 22, 2025
1 parent 29af0df commit dadee7b
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 106 deletions.
222 changes: 122 additions & 100 deletions src/components/Utilities/ReleaseManagement/QuickSelectModal.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
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';
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;
Expand All @@ -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<Record<number, ImportFolderType>>(() => {
const result = {};

forEach(importFoldersQuery.data, (folder) => {
result[folder.ID] = folder;
});

return result;
}, [importFoldersQuery]);

const { isPending: isDeleting, mutate: deleteFiles } = useDeleteFilesMutation();

const [groupsToDelete, setGroupsToDelete] = useImmer<Set<number>>(new Set());
Expand Down Expand Up @@ -76,104 +90,112 @@ const QuickSelectModal = ({ onClose, seriesId, show, type }: Props) => {
{fileSummaryQuery.isSuccess && (
map(
fileSummary?.Groups,
(group, index) => (
<div key={`group-${index}`} className="flex items-center justify-between gap-x-3">
<div className="flex flex-col gap-y-1">
{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;
{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 && (
<>
&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>
</>
)}
(group, index) => {
const importFolder = importFolders[group.ImportFolder!];

return (
<div key={`group-${index}`} className="flex items-center justify-between gap-x-3">
<div className="flex flex-col gap-y-1">
{type === ReleaseManagementItemType.DuplicateFiles && (
<>
<div className="font-semibold">
Import Folder:&nbsp;
{`${importFolder.Name} (ID: ${importFolder.ID})`}
</div>
<div className="flex flex-wrap break-all text-sm opacity-65">
Location:&nbsp;
{group.FileLocation?.replace(importFolder.Path, '')}
</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;
{`${importFolder.Name} (ID: ${importFolder.ID})`}
</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 && (
<>
&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}`}
isChecked={groupsToDelete.has(index)}
onChange={handleCheckboxChange}
label="Delete"
/>
</div>
<Checkbox
id={`checkbox-${index}`}
isChecked={groupsToDelete.has(index)}
onChange={handleCheckboxChange}
label="Delete"
/>
</div>
),
);
},
)
)}

Expand Down
2 changes: 1 addition & 1 deletion src/core/types/api/webui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export type WebuiSeriesFileSummaryGroupType = {
FileSource?: string;
FileLocation?: string;
FileIsDeprecated?: boolean;
ImportFolder?: string;
ImportFolder?: number;
VideoCodecs?: string;
VideoBitDepth?: number;
VideoResolution?: string;
Expand Down
2 changes: 1 addition & 1 deletion src/hooks/useIsFeatureSupported.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
8 changes: 4 additions & 4 deletions src/pages/utilities/ReleaseManagement.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ const ReleaseManagement = () => {
});
});

const isDuplicatesQuickSelectSupported = useIsFeatureSupported(FeatureType.DuplicatesQuickSelect);
const isQuickSelectSupported = useIsFeatureSupported(FeatureType.ReleaseManagementQuickSelect);

return (
<>
Expand Down Expand Up @@ -196,13 +196,13 @@ const ReleaseManagement = () => {
{/* </Button> */}
{/* )} */}

{(type === ReleaseManagementItemType.MultipleReleases || isDuplicatesQuickSelectSupported)
&& !selectedEpisode && (
{!selectedEpisode && (
<Button
buttonType="secondary"
className="flex gap-x-2.5 px-4 py-3 font-semibold"
disabled={!selectedSeries}
disabled={!selectedSeries || !isQuickSelectSupported}
onClick={toggleShowQuickSelectModal}
tooltip={isQuickSelectSupported ? '' : 'Only supported on server version >=5.1.0.6'}
>
<Icon path={mdiSelectMultiple} size={0.8333} />
Quick Select
Expand Down

0 comments on commit dadee7b

Please sign in to comment.