New: Specials monitoring options

pull/5521/head
Stevie Robinson 1 year ago committed by GitHub
parent 033936dce7
commit 11905b99d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -35,6 +35,16 @@ function SeriesMonitoringOptionsPopoverContent() {
data="Monitor all episodes of the latest season and future seasons" data="Monitor all episodes of the latest season and future seasons"
/> />
<DescriptionListItem
title="Monitor Specials"
data="Monitor all special episodes without changing the monitored status of other episodes"
/>
<DescriptionListItem
title="Unmonitor Specials"
data="Unmonitor all special episodes without changing the monitored status of other episodes"
/>
<DescriptionListItem <DescriptionListItem
title="None" title="None"
data="No episodes will be monitored" data="No episodes will be monitored"

@ -8,6 +8,10 @@
font-weight: bold; font-weight: bold;
} }
.labelIcon {
margin-left: 8px;
}
@media only screen and (max-width: $breakpointExtraSmall) { @media only screen and (max-width: $breakpointExtraSmall) {
.modalFooter { .modalFooter {
flex-direction: column; flex-direction: column;

@ -1,6 +1,7 @@
// This file is automatically generated. // This file is automatically generated.
// Please do not change this file! // Please do not change this file!
interface CssExports { interface CssExports {
'labelIcon': string;
'modalFooter': string; 'modalFooter': string;
'selected': string; 'selected': string;
} }

@ -1,14 +1,17 @@
import React, { useCallback, useState } from 'react'; import React, { useCallback, useState } from 'react';
import SeriesMonitoringOptionsPopoverContent from 'AddSeries/SeriesMonitoringOptionsPopoverContent';
import Form from 'Components/Form/Form'; import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup'; import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup'; import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel'; import FormLabel from 'Components/Form/FormLabel';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import ModalBody from 'Components/Modal/ModalBody'; import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent'; import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes } from 'Helpers/Props'; import Popover from 'Components/Tooltip/Popover';
import { icons, inputTypes, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import styles from './ChangeMonitoringModalContent.css'; import styles from './ChangeMonitoringModalContent.css';
@ -48,7 +51,16 @@ function ChangeMonitoringModalContent(
<ModalBody> <ModalBody>
<Form {...otherProps}> <Form {...otherProps}>
<FormGroup> <FormGroup>
<FormLabel>{translate('Monitoring')}</FormLabel> <FormLabel>
{translate('Monitoring')}
<Popover
anchor={<Icon className={styles.labelIcon} name={icons.INFO} />}
title={translate('Monitoring Options')}
body={<SeriesMonitoringOptionsPopoverContent />}
position={tooltipPositions.RIGHT}
/>
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.MONITOR_EPISODES_SELECT} type={inputTypes.MONITOR_EPISODES_SELECT}

@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'labelIcon': string;
}
export const cssExports: CssExports;
export default cssExports;

@ -1,16 +1,20 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import SeriesMonitoringOptionsPopoverContent from 'AddSeries/SeriesMonitoringOptionsPopoverContent';
import Form from 'Components/Form/Form'; import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup'; import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup'; import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel'; import FormLabel from 'Components/Form/FormLabel';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import SpinnerButton from 'Components/Link/SpinnerButton'; import SpinnerButton from 'Components/Link/SpinnerButton';
import ModalBody from 'Components/Modal/ModalBody'; import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent'; import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes } from 'Helpers/Props'; import Popover from 'Components/Tooltip/Popover';
import { icons, inputTypes, tooltipPositions } from 'Helpers/Props';
import styles from './MonitoringOptionsModalContent.css';
const NO_CHANGE = 'noChange'; const NO_CHANGE = 'noChange';
@ -84,7 +88,21 @@ class MonitoringOptionsModalContent extends Component {
<ModalBody> <ModalBody>
<Form {...otherProps}> <Form {...otherProps}>
<FormGroup> <FormGroup>
<FormLabel>Monitoring</FormLabel> <FormLabel>
Monitoring
<Popover
anchor={
<Icon
className={styles.labelIcon}
name={icons.INFO}
/>
}
title="Monitoring Options"
body={<SeriesMonitoringOptionsPopoverContent />}
position={tooltipPositions.RIGHT}
/>
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.MONITOR_EPISODES_SELECT} type={inputTypes.MONITOR_EPISODES_SELECT}

@ -6,6 +6,8 @@ const monitorOptions = [
{ key: 'pilot', value: 'Pilot Episode' }, { key: 'pilot', value: 'Pilot Episode' },
{ key: 'firstSeason', value: 'Only First Season' }, { key: 'firstSeason', value: 'Only First Season' },
{ key: 'latestSeason', value: 'Only Latest Season' }, { key: 'latestSeason', value: 'Only Latest Season' },
{ key: 'monitorSpecials', value: 'Monitor Specials' },
{ key: 'unmonitorSpecials', value: 'Unmonitor Specials' },
{ key: 'none', value: 'None' } { key: 'none', value: 'None' }
]; ];

@ -149,6 +149,58 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeMonitoredServiceTests
VerifyNotMonitored(e => e.SeasonNumber == 0); VerifyNotMonitored(e => e.SeasonNumber == 0);
} }
[Test]
public void should_monitor_specials()
{
GivenSpecials();
var monitoringOptions = new MonitoringOptions
{
Monitor = MonitorTypes.MonitorSpecials
};
Subject.SetEpisodeMonitoredStatus(_series, monitoringOptions);
VerifyMonitored(e => e.SeasonNumber == 0);
}
[Test]
public void should_unmonitor_specials()
{
GivenSpecials();
var monitoringOptions = new MonitoringOptions
{
Monitor = MonitorTypes.UnmonitorSpecials
};
Subject.SetEpisodeMonitoredStatus(_series, monitoringOptions);
VerifyNotMonitored(e => e.SeasonNumber == 0);
}
[Test]
public void should_unmonitor_specials_after_monitoring()
{
GivenSpecials();
var monitoringOptions = new MonitoringOptions
{
Monitor = MonitorTypes.MonitorSpecials
};
Subject.SetEpisodeMonitoredStatus(_series, monitoringOptions);
monitoringOptions = new MonitoringOptions
{
Monitor = MonitorTypes.UnmonitorSpecials
};
Subject.SetEpisodeMonitoredStatus(_series, monitoringOptions);
VerifyNotMonitored(e => e.SeasonNumber == 0);
}
[Test] [Test]
public void should_not_monitor_season_when_all_episodes_are_monitored_except_latest_season() public void should_not_monitor_season_when_all_episodes_are_monitored_except_latest_season()
{ {

@ -100,6 +100,18 @@ namespace NzbDrone.Core.Tv
break; break;
case MonitorTypes.MonitorSpecials:
_logger.Debug("[{0}] Monitoring special episodes", series.Title);
ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == 0), true);
break;
case MonitorTypes.UnmonitorSpecials:
_logger.Debug("[{0}] Unmonitoring special episodes", series.Title);
ToggleEpisodesMonitoredState(episodes.Where(e => e.SeasonNumber == 0), false);
break;
case MonitorTypes.None: case MonitorTypes.None:
_logger.Debug("[{0}] Unmonitoring all episodes", series.Title); _logger.Debug("[{0}] Unmonitoring all episodes", series.Title);
ToggleEpisodesMonitoredState(episodes, e => false); ToggleEpisodesMonitoredState(episodes, e => false);

@ -19,6 +19,8 @@ namespace NzbDrone.Core.Tv
FirstSeason, FirstSeason,
LatestSeason, LatestSeason,
Pilot, Pilot,
MonitorSpecials,
UnmonitorSpecials,
None None
} }
} }

@ -9150,6 +9150,8 @@
"firstSeason", "firstSeason",
"latestSeason", "latestSeason",
"pilot", "pilot",
"monitorSpecials",
"UnmonitorSpecials",
"none" "none"
], ],
"type": "string" "type": "string"

Loading…
Cancel
Save