Skip to content

Commit bcdf091

Browse files
authored
New: Bulk edit enhancements to performers, studios (#7)
1 parent 3e6b47d commit bcdf091

File tree

8 files changed

+237
-9
lines changed

8 files changed

+237
-9
lines changed

frontend/src/Performer/Index/Select/Edit/EditPerformersModalContent.tsx

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import styles from './EditPerformersModalContent.css';
1414

1515
interface SavePayload {
1616
monitored?: boolean;
17+
moviesMonitored?: boolean;
1718
qualityProfileId?: number;
1819
rootFolderPath?: string;
20+
searchOnAdd?: boolean;
1921
}
2022

2123
interface EditPerformersModalContentProps {
@@ -48,16 +50,44 @@ const monitoredOptions = [
4850
},
4951
];
5052

53+
const searchOnAddOptions = [
54+
{
55+
key: NO_CHANGE,
56+
get value() {
57+
return translate('NoChange');
58+
},
59+
disabled: true,
60+
},
61+
{
62+
key: 'true',
63+
get value() {
64+
return translate('Yes');
65+
},
66+
},
67+
{
68+
key: 'false',
69+
get value() {
70+
return translate('No');
71+
},
72+
},
73+
];
5174
function EditPerformersModalContent(props: EditPerformersModalContentProps) {
5275
const { performerIds, onSavePress, onModalClose } = props;
5376

5477
const [monitored, setMonitored] = useState<string | number>(NO_CHANGE);
78+
79+
const [moviesMonitored, setMoviesMonitored] = useState<string | number>(
80+
NO_CHANGE
81+
);
82+
5583
const [qualityProfileId, setQualityProfileId] = useState<string | number>(
5684
NO_CHANGE
5785
);
86+
5887
const [rootFolderPath, setRootFolderPath] = useState<string | number>(
5988
NO_CHANGE
6089
);
90+
const [searchOnAdd, setSearchOnAdd] = useState<string | number>(NO_CHANGE);
6191

6292
const save = useCallback(() => {
6393
let hasChanges = false;
@@ -68,6 +98,11 @@ function EditPerformersModalContent(props: EditPerformersModalContentProps) {
6898
payload.monitored = monitored === 'monitored';
6999
}
70100

101+
if (moviesMonitored !== NO_CHANGE) {
102+
hasChanges = true;
103+
payload.moviesMonitored = moviesMonitored === 'monitored';
104+
}
105+
71106
if (qualityProfileId !== NO_CHANGE) {
72107
hasChanges = true;
73108
payload.qualityProfileId = qualityProfileId as number;
@@ -78,25 +113,44 @@ function EditPerformersModalContent(props: EditPerformersModalContentProps) {
78113
payload.rootFolderPath = rootFolderPath as string;
79114
}
80115

116+
if (searchOnAdd !== NO_CHANGE) {
117+
hasChanges = true;
118+
payload.searchOnAdd = searchOnAdd === 'true';
119+
}
120+
81121
if (hasChanges) {
82122
onSavePress(payload);
83123
}
84124

85125
onModalClose();
86-
}, [monitored, qualityProfileId, rootFolderPath, onSavePress, onModalClose]);
126+
}, [
127+
monitored,
128+
moviesMonitored,
129+
qualityProfileId,
130+
rootFolderPath,
131+
searchOnAdd,
132+
onSavePress,
133+
onModalClose,
134+
]);
87135

88136
const onInputChange = useCallback(
89137
({ name, value }: EnhancedSelectInputChanged<string | number>) => {
90138
switch (name) {
91139
case 'monitored':
92140
setMonitored(value);
93141
break;
142+
case 'moviesMonitored':
143+
setMoviesMonitored(value);
144+
break;
94145
case 'qualityProfileId':
95146
setQualityProfileId(value);
96147
break;
97148
case 'rootFolderPath':
98149
setRootFolderPath(value);
99150
break;
151+
case 'searchOnAdd':
152+
setSearchOnAdd(value);
153+
break;
100154
default:
101155
console.warn('EditPerformersModalContent Unknown Input');
102156
}
@@ -116,17 +170,31 @@ function EditPerformersModalContent(props: EditPerformersModalContentProps) {
116170

117171
<ModalBody>
118172
<FormGroup>
119-
<FormLabel>{translate('Monitored')}</FormLabel>
173+
<FormLabel>{translate('MonitoredScene')}</FormLabel>
120174

121175
<FormInputGroup
122176
type={inputTypes.SELECT}
123177
name="monitored"
178+
helpText={translate('MonitoredPerformerHelpText')}
124179
value={monitored}
125180
values={monitoredOptions}
126181
onChange={onInputChange}
127182
/>
128183
</FormGroup>
129184

185+
<FormGroup>
186+
<FormLabel>{translate('MonitoredMovie')}</FormLabel>
187+
188+
<FormInputGroup
189+
type={inputTypes.SELECT}
190+
name="moviesMonitored"
191+
helpText={translate('MonitoredPerformerMovieHelpText')}
192+
value={moviesMonitored}
193+
values={monitoredOptions}
194+
onChange={onInputChange}
195+
/>
196+
</FormGroup>
197+
130198
<FormGroup>
131199
<FormLabel>{translate('QualityProfile')}</FormLabel>
132200

@@ -150,7 +218,20 @@ function EditPerformersModalContent(props: EditPerformersModalContentProps) {
150218
includeNoChange={true}
151219
includeNoChangeDisabled={false}
152220
selectedValueOptions={{ includeFreeSpace: false }}
153-
helpText="Moving scenes to the same root folder can be used to rename scene folders to match updated title or naming format"
221+
helpText={translate('MovieEditRootFolderHelpText')}
222+
onChange={onInputChange}
223+
/>
224+
</FormGroup>
225+
226+
<FormGroup>
227+
<FormLabel>{translate('SearchOnAdd')}</FormLabel>
228+
229+
<FormInputGroup
230+
type={inputTypes.SELECT}
231+
name="searchOnAdd"
232+
helpText={translate('SearchOnAddPerformerHelpText')}
233+
value={searchOnAdd}
234+
values={searchOnAddOptions}
154235
onChange={onInputChange}
155236
/>
156237
</FormGroup>

frontend/src/Scene/Index/Select/Edit/EditScenesModalContent.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ function EditScenesModalContent(props: EditScenesModalContentProps) {
146146
<FormInputGroup
147147
type={inputTypes.SELECT}
148148
name="monitored"
149+
helpText={translate('MonitoredMovieHelpText')}
149150
value={monitored}
150151
values={monitoredOptions}
151152
onChange={onInputChange}
@@ -175,7 +176,7 @@ function EditScenesModalContent(props: EditScenesModalContentProps) {
175176
includeNoChange={true}
176177
includeNoChangeDisabled={false}
177178
selectedValueOptions={{ includeFreeSpace: false }}
178-
helpText="Moving scenes to the same root folder can be used to rename scene folders to match updated title or naming format"
179+
helpText={translate('MovieEditRootFolderHelpText')}
179180
onChange={onInputChange}
180181
/>
181182
</FormGroup>

frontend/src/Studio/Index/Select/Edit/EditStudiosModalContent.tsx

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import styles from './EditStudiosModalContent.css';
1414

1515
interface SavePayload {
1616
monitored?: boolean;
17+
moviesMonitored?: boolean;
1718
qualityProfileId?: number;
1819
rootFolderPath?: string;
20+
searchOnAdd?: boolean;
1921
}
2022

2123
interface EditStudiosModalContentProps {
@@ -48,17 +50,46 @@ const monitoredOptions = [
4850
},
4951
];
5052

53+
const searchOnAddOptions = [
54+
{
55+
key: NO_CHANGE,
56+
get value() {
57+
return translate('NoChange');
58+
},
59+
disabled: true,
60+
},
61+
{
62+
key: 'true',
63+
get value() {
64+
return translate('Yes');
65+
},
66+
},
67+
{
68+
key: 'false',
69+
get value() {
70+
return translate('No');
71+
},
72+
},
73+
];
74+
5175
function EditStudiosModalContent(props: EditStudiosModalContentProps) {
5276
const { studioIds, onSavePress, onModalClose } = props;
5377

5478
const [monitored, setMonitored] = useState<string | number>(NO_CHANGE);
79+
80+
const [moviesMonitored, setMoviesMonitored] = useState<string | number>(
81+
NO_CHANGE
82+
);
83+
5584
const [qualityProfileId, setQualityProfileId] = useState<string | number>(
5685
NO_CHANGE
5786
);
5887
const [rootFolderPath, setRootFolderPath] = useState<string | number>(
5988
NO_CHANGE
6089
);
6190

91+
const [searchOnAdd, setSearchOnAdd] = useState<string | number>(NO_CHANGE);
92+
6293
const save = useCallback(() => {
6394
let hasChanges = false;
6495
const payload: SavePayload = {};
@@ -68,6 +99,11 @@ function EditStudiosModalContent(props: EditStudiosModalContentProps) {
6899
payload.monitored = monitored === 'monitored';
69100
}
70101

102+
if (moviesMonitored !== NO_CHANGE) {
103+
hasChanges = true;
104+
payload.moviesMonitored = moviesMonitored === 'monitored';
105+
}
106+
71107
if (qualityProfileId !== NO_CHANGE) {
72108
hasChanges = true;
73109
payload.qualityProfileId = qualityProfileId as number;
@@ -78,25 +114,44 @@ function EditStudiosModalContent(props: EditStudiosModalContentProps) {
78114
payload.rootFolderPath = rootFolderPath as string;
79115
}
80116

117+
if (searchOnAdd !== NO_CHANGE) {
118+
hasChanges = true;
119+
payload.searchOnAdd = searchOnAdd === 'true';
120+
}
121+
81122
if (hasChanges) {
82123
onSavePress(payload);
83124
}
84125

85126
onModalClose();
86-
}, [monitored, qualityProfileId, rootFolderPath, onSavePress, onModalClose]);
127+
}, [
128+
monitored,
129+
moviesMonitored,
130+
qualityProfileId,
131+
rootFolderPath,
132+
searchOnAdd,
133+
onSavePress,
134+
onModalClose,
135+
]);
87136

88137
const onInputChange = useCallback(
89138
({ name, value }: EnhancedSelectInputChanged<string | number>) => {
90139
switch (name) {
91140
case 'monitored':
92141
setMonitored(value);
93142
break;
143+
case 'moviesMonitored':
144+
setMoviesMonitored(value);
145+
break;
94146
case 'qualityProfileId':
95147
setQualityProfileId(value);
96148
break;
97149
case 'rootFolderPath':
98150
setRootFolderPath(value);
99151
break;
152+
case 'searchOnAdd':
153+
setSearchOnAdd(value);
154+
break;
100155
default:
101156
console.warn('EditStudiosModalContent Unknown Input');
102157
}
@@ -116,17 +171,31 @@ function EditStudiosModalContent(props: EditStudiosModalContentProps) {
116171

117172
<ModalBody>
118173
<FormGroup>
119-
<FormLabel>{translate('Monitored')}</FormLabel>
174+
<FormLabel>{translate('MonitoredScene')}</FormLabel>
120175

121176
<FormInputGroup
122177
type={inputTypes.SELECT}
123178
name="monitored"
179+
helpText={translate('MonitoredStudioHelpText')}
124180
value={monitored}
125181
values={monitoredOptions}
126182
onChange={onInputChange}
127183
/>
128184
</FormGroup>
129185

186+
<FormGroup>
187+
<FormLabel>{translate('MonitoredMovie')}</FormLabel>
188+
189+
<FormInputGroup
190+
type={inputTypes.SELECT}
191+
name="moviesMonitored"
192+
helpText={translate('MonitoredStudioMovieHelpText')}
193+
value={moviesMonitored}
194+
values={monitoredOptions}
195+
onChange={onInputChange}
196+
/>
197+
</FormGroup>
198+
130199
<FormGroup>
131200
<FormLabel>{translate('QualityProfile')}</FormLabel>
132201

@@ -150,7 +219,20 @@ function EditStudiosModalContent(props: EditStudiosModalContentProps) {
150219
includeNoChange={true}
151220
includeNoChangeDisabled={false}
152221
selectedValueOptions={{ includeFreeSpace: false }}
153-
helpText="Moving scenes to the same root folder can be used to rename scene folders to match updated title or naming format"
222+
helpText={translate('MovieEditRootFolderHelpText')}
223+
onChange={onInputChange}
224+
/>
225+
</FormGroup>
226+
227+
<FormGroup>
228+
<FormLabel>{translate('SearchOnAdd')}</FormLabel>
229+
230+
<FormInputGroup
231+
type={inputTypes.SELECT}
232+
name="searchOnAdd"
233+
helpText={translate('SearchOnAddStudioHelpText')}
234+
value={searchOnAdd}
235+
values={searchOnAddOptions}
154236
onChange={onInputChange}
155237
/>
156238
</FormGroup>

src/NzbDrone.Core/Localization/Core/en.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,7 +1222,7 @@
12221222
"MonitoredScenesOnly": "Monitoring Scenes",
12231223
"MonitoredStatus": "Monitored/Status",
12241224
"MonitoredStudioHelpText": "Monitor to automatically have items from this studio added to the library",
1225-
"MonitoredStudioMovieHelpText": "Monitor to automatically have items from this studio added to the library. Requires a StashDB link to be created for the studio to the Movie Metadata source",
1225+
"MonitoredStudioMovieHelpText": "Monitor to automatically have items from this studio added to the library. Requires a link to be added on the studio to the Movie Metadata source on stashdb.org",
12261226
"MonitorMovie": "Monitor Movie",
12271227
"MonitorMovies": "Monitor Movies",
12281228
"MonitorOptionsMovieAndScene": "Movie and Scene",
@@ -1261,7 +1261,7 @@
12611261
"MovieDownloadFailedTooltip": "Movie download failed",
12621262
"MovieDownloadIgnoredTooltip": "Movie Download Ignored",
12631263
"MovieEditor": "Movie Editor",
1264-
"MovieEditRootFolderHelpText": "Moving movies to the same root folder can be used to rename movie folders to match updated title or naming format",
1264+
"MovieEditRootFolderHelpText": "Moving items to the same root folder can be used to rename those folders to match updated title or naming format",
12651265
"MovieExcludedFromAutomaticAdd": "Movie Excluded From Automatic Add",
12661266
"MovieFileDeleted": "Movie File Deleted",
12671267
"MovieFileDeletedTooltip": "Movie file deleted",

0 commit comments

Comments
 (0)