diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.css b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.css index a6b976c68..79a4f0d94 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.css +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.css @@ -10,3 +10,7 @@ display: none; } + +.labelIcon { + margin-left: 8px; +} diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js index c2996f0f7..25da42106 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { inputTypes, kinds } from 'Helpers/Props'; +import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props'; +import Icon from 'Components/Icon'; import Button from 'Components/Link/Button'; import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; @@ -12,10 +13,41 @@ import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; import FormLabel from 'Components/Form/FormLabel'; import FormInputGroup from 'Components/Form/FormInputGroup'; +import Popover from 'Components/Tooltip/Popover'; import ProviderFieldFormGroup from 'Components/Form/ProviderFieldFormGroup'; +import DescriptionList from 'Components/DescriptionList/DescriptionList'; +import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; import styles from './EditImportListModalContent.css'; +function ImportListMonitoringOptionsPopoverContent() { + return ( + + + + + + + + ); +} + function EditImportListModalContent(props) { + + const monitorOptions = [ + { key: 'none', value: 'None' }, + { key: 'specificAlbum', value: 'Specific Album' }, + { key: 'entireArtist', value: 'All Artist Albums' } + ]; + const { advancedSettings, isFetching, @@ -92,11 +124,26 @@ function EditImportListModalContent(props) { - Monitor + + Monitor + + + } + title="Monitoring Options" + body={} + position={tooltipPositions.RIGHT} + /> + { return selectProviderSchema(state, section, payload, (selectedSchema) => { - selectedSchema.enableRss = selectedSchema.supportsRss; - selectedSchema.enableSearch = selectedSchema.supportsSearch; + selectedSchema.enableAutomaticAdd = true; + selectedSchema.shouldMonitor = 'entireArtist'; return selectedSchema; }); diff --git a/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs b/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs index 930ee9c90..3c2cc36da 100644 --- a/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs +++ b/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs @@ -5,7 +5,7 @@ namespace Lidarr.Api.V1.ImportLists public class ImportListResource : ProviderResource { public bool EnableAutomaticAdd { get; set; } - public bool ShouldMonitor { get; set; } + public ImportListMonitorType ShouldMonitor { get; set; } public string RootFolderPath { get; set; } public int QualityProfileId { get; set; } public int LanguageProfileId { get; set; } diff --git a/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs index df76a7cc8..17995eeed 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/ImportListSyncServiceFixture.cs @@ -39,7 +39,7 @@ namespace NzbDrone.Core.Test.ImportListTests Mocker.GetMock() .Setup(v => v.Get(It.IsAny())) - .Returns(new ImportListDefinition{ ShouldMonitor = true }); + .Returns(new ImportListDefinition{ ShouldMonitor = ImportListMonitorType.SpecificAlbum }); Mocker.GetMock() .Setup(v => v.Fetch()) @@ -83,6 +83,13 @@ namespace NzbDrone.Core.Test.ImportListTests }); } + private void WithMonitorType(ImportListMonitorType monitor) + { + Mocker.GetMock() + .Setup(v => v.Get(It.IsAny())) + .Returns(new ImportListDefinition{ ShouldMonitor = monitor }); + } + [Test] public void should_search_if_artist_title_and_no_artist_id() { @@ -152,17 +159,20 @@ namespace NzbDrone.Core.Test.ImportListTests .Verify(v => v.AddArtists(It.Is>(t=>t.Count == 0))); } - [Test] - public void should_add_if_not_existing_artist() + [TestCase(ImportListMonitorType.None, false)] + [TestCase(ImportListMonitorType.SpecificAlbum, true)] + [TestCase(ImportListMonitorType.EntireArtist, true)] + public void should_add_if_not_existing_artist(ImportListMonitorType monitor, bool expectedArtistMonitored) { WithArtistId(); WithAlbum(); WithAlbumId(); + WithMonitorType(monitor); Subject.Execute(new ImportListSyncCommand()); Mocker.GetMock() - .Verify(v => v.AddArtists(It.Is>(t => t.Count == 1))); + .Verify(v => v.AddArtists(It.Is>(t => t.Count == 1 && t.First().Monitored == expectedArtistMonitored))); } [Test] @@ -180,11 +190,12 @@ namespace NzbDrone.Core.Test.ImportListTests } [Test] - public void should_mark_album_for_monitor_if_album_id() + public void should_mark_album_for_monitor_if_album_id_and_specific_monitor_selected() { WithArtistId(); WithAlbum(); WithAlbumId(); + WithMonitorType(ImportListMonitorType.SpecificAlbum); Subject.Execute(new ImportListSyncCommand()); @@ -192,6 +203,20 @@ namespace NzbDrone.Core.Test.ImportListTests .Verify(v => v.AddArtists(It.Is>(t => t.Count == 1 && t.First().AddOptions.AlbumsToMonitor.Contains("09474d62-17dd-3a4f-98fb-04c65f38a479")))); } + [Test] + public void should_not_mark_album_for_monitor_if_album_id_and_monitor_all_selected() + { + WithArtistId(); + WithAlbum(); + WithAlbumId(); + WithMonitorType(ImportListMonitorType.EntireArtist); + + Subject.Execute(new ImportListSyncCommand()); + + Mocker.GetMock() + .Verify(v => v.AddArtists(It.Is>(t => t.Count == 1 && !t.First().AddOptions.AlbumsToMonitor.Any()))); + } + [Test] public void should_not_mark_album_for_monitor_if_no_album_id() { @@ -202,6 +227,5 @@ namespace NzbDrone.Core.Test.ImportListTests Mocker.GetMock() .Verify(v => v.AddArtists(It.Is>(t => t.Count == 1 && t.First().AddOptions.AlbumsToMonitor.Count == 0))); } - } } diff --git a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs index 51afd2076..0a31ecdd9 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs @@ -5,7 +5,7 @@ namespace NzbDrone.Core.ImportLists public class ImportListDefinition : ProviderDefinition { public bool EnableAutomaticAdd { get; set; } - public bool ShouldMonitor { get; set; } + public ImportListMonitorType ShouldMonitor { get; set; } public int ProfileId { get; set; } public int LanguageProfileId { get; set; } public int MetadataProfileId { get; set; } @@ -15,4 +15,11 @@ namespace NzbDrone.Core.ImportLists public ImportListStatus Status { get; set; } } + + public enum ImportListMonitorType + { + None, + SpecificAlbum, + EntireArtist + } } diff --git a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs index c771254c9..cc48fc635 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs @@ -130,13 +130,14 @@ namespace NzbDrone.Core.ImportLists // Append Artist if not already in DB or already on add list if (existingArtist == null && excludedArtist == null && artistsToAdd.All(s => s.Metadata.Value.ForeignArtistId != report.ArtistMusicBrainzId)) { + var monitored = importList.ShouldMonitor != ImportListMonitorType.None; artistsToAdd.Add(new Artist { Metadata = new ArtistMetadata { ForeignArtistId = report.ArtistMusicBrainzId, Name = report.Artist }, - Monitored = importList.ShouldMonitor, + Monitored = monitored, RootFolderPath = importList.RootFolderPath, QualityProfileId = importList.ProfileId, LanguageProfileId = importList.LanguageProfileId, @@ -144,15 +145,15 @@ namespace NzbDrone.Core.ImportLists Tags = importList.Tags, AlbumFolder = true, AddOptions = new AddArtistOptions { - SearchForMissingAlbums = importList.ShouldMonitor, - Monitored = importList.ShouldMonitor, - Monitor = importList.ShouldMonitor ? MonitorTypes.All : MonitorTypes.None + SearchForMissingAlbums = monitored, + Monitored = monitored, + Monitor = monitored ? MonitorTypes.All : MonitorTypes.None } }); } // Add Album so we know what to monitor - if (report.AlbumMusicBrainzId.IsNotNullOrWhiteSpace() && artistsToAdd.Any(s => s.Metadata.Value.ForeignArtistId == report.ArtistMusicBrainzId) && importList.ShouldMonitor) + if (report.AlbumMusicBrainzId.IsNotNullOrWhiteSpace() && artistsToAdd.Any(s => s.Metadata.Value.ForeignArtistId == report.ArtistMusicBrainzId) && importList.ShouldMonitor == ImportListMonitorType.SpecificAlbum) { artistsToAdd.Find(s => s.Metadata.Value.ForeignArtistId == report.ArtistMusicBrainzId).AddOptions.AlbumsToMonitor.Add(report.AlbumMusicBrainzId); }