diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 2f223dfa8..08e129def 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -232,6 +232,7 @@ namespace NzbDrone.Core.Providers series.SeasonFolder = edited.SeasonFolder; series.BacklogSetting = edited.BacklogSetting; series.Path = edited.Path; + series.DownloadEpisodesAiredAfter = edited.DownloadEpisodesAiredAfter; } _database.UpdateMany(allSeries); diff --git a/NzbDrone.Web/Content/SeriesEditor.css b/NzbDrone.Web/Content/SeriesEditor.css index be5178250..f41e13fcf 100644 --- a/NzbDrone.Web/Content/SeriesEditor.css +++ b/NzbDrone.Web/Content/SeriesEditor.css @@ -4,7 +4,7 @@ } .checkboxColumn { - width: 110px; + width: 50px; text-align: center; } @@ -13,7 +13,7 @@ text-align: center; } -table input[type="text"], table select { +table input[type="text"], table input[type="date"], table select { margin: 2px 2px; } @@ -37,6 +37,19 @@ th .footer-control-quality { width: 120px; } +td .aired-after { + width: 80px; +} + +th .footer-control-boolean { + width: 90px; +} + +th .footer-control-aired-after { + width: 80px; +} + + #stylized, .settingsForm { overflow: hidden; } diff --git a/NzbDrone.Web/Content/Settings.css b/NzbDrone.Web/Content/Settings.css index 3fdbdff45..59d5d25ea 100644 --- a/NzbDrone.Web/Content/Settings.css +++ b/NzbDrone.Web/Content/Settings.css @@ -1,5 +1,4 @@ -p, h1, form, button -{ +p, h1, form, button { border: 0; margin: 0; padding: 0; @@ -9,21 +8,18 @@ display: none; } -.spacer -{ +.spacer { clear: both; height: 1px; } -.settingsForm -{ +.settingsForm { width: 620px; padding: 14px; } -#stylized p -{ +#stylized p { font-size: 11px; color: #666666; margin-bottom: 20px; @@ -31,8 +27,7 @@ padding-bottom: 10px; } -#stylized .labelClass -{ +#stylized .labelClass { display: block; font-weight: bold; text-align: right; @@ -41,8 +36,7 @@ margin-bottom: -10px; } -#stylized .small -{ +#stylized .small { color: #666666; display: block; font-size: 11px; @@ -51,8 +45,7 @@ width: 340px; } -#stylized .inputClass -{ +#stylized .inputClass { float: left; padding: 2px 2px; border: solid 1px #aacfe4; @@ -60,19 +53,16 @@ margin: 4px 0 20px 10px; } -#stylized .selectClass -{ +#stylized .selectClass { width: 206px; } -#stylized .checkClass -{ +#stylized .checkClass { margin: 12px 0px 20px 10px; border: none; } -#stylized button -{ +#stylized button { clear: both; margin-left: 220px; margin-bottom: 10px; @@ -85,8 +75,7 @@ } -#saveAjax -{ +#saveAjax { padding-left: 6px; margin-bottom: -7px; width: 20px; @@ -94,24 +83,21 @@ display: none; } -#save_button[disabled="disabled"] -{ +#save_button[disabled="disabled"] { padding: 0px 6px 0px 6px; border: 2px outset ButtonFace; color: lightgrey; cursor: progress; } -.ui-dialog-buttonset .ui-delete-button -{ +.ui-dialog-buttonset .ui-delete-button { background: url("jQueryUI/images/ui-bg_flat_30_b40404_40x100.png") repeat-x scroll 50% 50% #B40404; border: 1px solid #FFFFFF; color: #FFFFFF; font-weight: normal; } -.ui-dialog-buttonset .ui-delete-button:active -{ +.ui-dialog-buttonset .ui-delete-button:active { background: url("jQueryUI/images/ui-bg_flat_30_616161_40x100.png") repeat-x scroll 50% 50% #616161; border: 1px solid #FFFFFF; color: #FFFFFF; diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index e18e7ef4d..a1f637f2c 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Web.Mvc; @@ -44,7 +45,7 @@ namespace NzbDrone.Web.Controllers return View((object)serialized); } - public ActionResult SingleSeriesEditor(int seriesId) + public ActionResult Edit(int seriesId) { var profiles = _qualityProvider.All(); ViewData["SelectList"] = new SelectList(profiles, "QualityProfileId", "Name"); @@ -63,7 +64,7 @@ namespace NzbDrone.Web.Controllers } [HttpPost] - public EmptyResult SaveSingleSeriesEditor(SeriesModel seriesModel) + public EmptyResult Edit(SeriesModel seriesModel) { var series = _seriesProvider.GetSeries(seriesModel.SeriesId); series.Monitored = seriesModel.Monitored; @@ -72,6 +73,9 @@ namespace NzbDrone.Web.Controllers series.Path = seriesModel.Path; series.BacklogSetting = (BacklogSettingType)seriesModel.BacklogSetting; + if (!String.IsNullOrWhiteSpace(seriesModel.DownloadEpisodesAiredAfter)) + series.DownloadEpisodesAiredAfter = DateTime.Parse(seriesModel.DownloadEpisodesAiredAfter, null, DateTimeStyles.RoundtripKind); + _seriesProvider.UpdateSeries(series); return new EmptyResult(); @@ -172,7 +176,7 @@ namespace NzbDrone.Web.Controllers } [HttpPost] - public JsonResult SaveEditor(List series) + public JsonResult Editor(List series) { //Save edits if (series == null || series.Count == 0) @@ -204,7 +208,8 @@ namespace NzbDrone.Web.Controllers EpisodeFileCount = s.EpisodeFileCount, NextAiring = s.NextAiring == null ? String.Empty : s.NextAiring.Value.ToBestDateString(), NextAiringSorter = s.NextAiring == null ? "12/31/9999" : s.NextAiring.Value.ToString("MM/dd/yyyy"), - AirTime = s.AirTimes + AirTime = s.AirTimes, + DownloadEpisodesAiredAfter = s.DownloadEpisodesAiredAfter.HasValue ? s.DownloadEpisodesAiredAfter.Value.ToString("yyyy-MM-dd") : String.Empty }).ToList(); return series; diff --git a/NzbDrone.Web/Models/SeriesModel.cs b/NzbDrone.Web/Models/SeriesModel.cs index 652d1b9f8..b61204248 100644 --- a/NzbDrone.Web/Models/SeriesModel.cs +++ b/NzbDrone.Web/Models/SeriesModel.cs @@ -28,7 +28,7 @@ namespace NzbDrone.Web.Models public string Details { get; set; } public string Network { get; set; } public string AirTime { get; set; } - + public IList Seasons { get; set; } //View & Edit @@ -52,5 +52,9 @@ namespace NzbDrone.Web.Models [DisplayName("Backlog Setting")] [Description("Should NzbDrone search for missing episodes every 30 days?")] public int BacklogSetting { get; set; } + + [DisplayName("Download Episodes Aired After")] + [Description("Should NzbDrone only download episodes a certain date?")] + public string DownloadEpisodesAiredAfter { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index 1aaeb81f9..c906c085a 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -534,7 +534,7 @@ - + diff --git a/NzbDrone.Web/Scripts/NzbDrone/AutoBind.js b/NzbDrone.Web/Scripts/NzbDrone/AutoBind.js index 5c9947995..2c31f28ad 100644 --- a/NzbDrone.Web/Scripts/NzbDrone/AutoBind.js +++ b/NzbDrone.Web/Scripts/NzbDrone/AutoBind.js @@ -45,7 +45,7 @@ }); }); - $('.jQuery-dateTime').livequery(function () { + $('.jQuery-datepicker').livequery(function () { $(this).datepicker({ dateFormat: "yy-mm-dd" }); diff --git a/NzbDrone.Web/Scripts/NzbDrone/series.js b/NzbDrone.Web/Scripts/NzbDrone/series.js index c630adf50..7dc54f64c 100644 --- a/NzbDrone.Web/Scripts/NzbDrone/series.js +++ b/NzbDrone.Web/Scripts/NzbDrone/series.js @@ -1,5 +1,5 @@ -var seriesEditorUrl = '../Series/SingleSeriesEditor'; -var saveSeriesEditorUrl = '../Series/SaveSingleSeriesEditor'; +var seriesEditorUrl = '../Series/Edit'; +var saveSeriesEditorUrl = '../Series/Edit'; var seriesDeleteUrl = '../Series/DeleteSeries'; $("#seriesEditor").dialog({ diff --git a/NzbDrone.Web/Views/AddSeries/AddNew.cshtml b/NzbDrone.Web/Views/AddSeries/AddNew.cshtml index 1d4be560d..5c46dfeaa 100644 --- a/NzbDrone.Web/Views/AddSeries/AddNew.cshtml +++ b/NzbDrone.Web/Views/AddSeries/AddNew.cshtml @@ -7,7 +7,7 @@ @Html.DropDownList("newSeriesPath", new SelectList((IList)ViewData["RootDirs"]), new { style = "width: 406px; margin-left: 0px;" }) @Html.DropDownList("qualityList", (SelectList)ViewData["QualityProfiles"], new { @class = "qualitySelector" }) - @Html.TextBox("newAiredAfter", "", new { type = "date", @class = "jQuery-dateTime aired-after", title = "Only download episodes that aired after the choosen date" }) + @Html.TextBox("newAiredAfter", "", new { type = "date", @class = "jQuery-datepicker aired-after", title = "Only download episodes that aired after the choosen date" }) \ No newline at end of file diff --git a/NzbDrone.Web/Views/AddSeries/ExistingSeries.cshtml b/NzbDrone.Web/Views/AddSeries/ExistingSeries.cshtml index dfb807ffb..fe0a51a40 100644 --- a/NzbDrone.Web/Views/AddSeries/ExistingSeries.cshtml +++ b/NzbDrone.Web/Views/AddSeries/ExistingSeries.cshtml @@ -23,7 +23,7 @@ else { @Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector masterQualitySelector" }) - @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-dateTime aired-after-master", title = "Skip episodes that aired before the choosen date" }) + @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker aired-after-master", title = "Skip episodes that aired before the choosen date" }) foreach (var series in Model.ExistingSeries) { @@ -35,7 +35,7 @@ else @Html.Hidden("seriesId", series.Item3, new { @class = "seriesId" }) @Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector" }) - @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-dateTime aired-after", title = "Only download episodes that aired after the choosen date" }) + @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker aired-after", title = "Only download episodes that aired after the choosen date" }) diff --git a/NzbDrone.Web/Views/Series/SingleSeriesEditor.cshtml b/NzbDrone.Web/Views/Series/Edit.cshtml similarity index 77% rename from NzbDrone.Web/Views/Series/SingleSeriesEditor.cshtml rename to NzbDrone.Web/Views/Series/Edit.cshtml index 8f6e29cc3..a2bf391e2 100644 --- a/NzbDrone.Web/Views/Series/SingleSeriesEditor.cshtml +++ b/NzbDrone.Web/Views/Series/Edit.cshtml @@ -12,7 +12,7 @@
- @using (Html.BeginForm("SaveSingleSeriesEditor", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" })) + @using (Html.BeginForm("Edit", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" })) { @Html.HiddenFor(m => m.SeriesId) @Html.HiddenFor(m => m.Status) @@ -36,5 +36,10 @@ @Html.DescriptionFor(m => m.BacklogSetting) @Html.DropDownListFor(m => m.BacklogSetting, (SelectList)ViewData["BacklogSettingSelectList"], new { @class = "inputClass" }) + + + @Html.TextBoxFor(m => m.DownloadEpisodesAiredAfter, new { type = "date", @class = "inputClass jQuery-datepicker" }) }
\ No newline at end of file diff --git a/NzbDrone.Web/Views/Series/Editor.cshtml b/NzbDrone.Web/Views/Series/Editor.cshtml index 3b58995b0..93ec6bbba 100644 --- a/NzbDrone.Web/Views/Series/Editor.cshtml +++ b/NzbDrone.Web/Views/Series/Editor.cshtml @@ -16,7 +16,7 @@ } -@using (Html.BeginForm("SaveEditor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" })) +@using (Html.BeginForm("Editor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" })) { @@ -24,9 +24,10 @@ - - - + + + + @@ -46,14 +47,17 @@ @Html.DropDownList("masterQualitySelector", (SelectList)ViewData["MasterProfileSelectList"], new { @class = "footer-control-quality masterSelector master-quality", disabled = true }) + + } \ No newline at end of file
@Html.CheckBox("editToggleMaster", false, new { @class = "editToggleMaster" }) Title QualityMonitoredSeason FolderBacklog StatusMonitoredSeason FolderBacklog StatusAired After Path
- @Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-monitored", disabled = true }) + @Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-monitored", disabled = true }) - @Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-season-folder", disabled = true }) + @Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-season-folder", disabled = true }) @Html.DropDownList("masterBacklogSetting", (SelectList)ViewData["MasterBacklogSettingSelectList"], new { @class = "footer-control masterSelector master-backlog-setting", disabled = true }) + @Html.TextBox("masterAiredAfter", "" , new { type = "date", @class = "footer-control-aired-after masterSelector master-aired-after jQuery-datepicker", disabled = true }) + @Html.CheckBoxFor(m => m.Monitored, new {@class = "seriesCheckbox monitored"}) @Html.CheckBoxFor(m => m.SeasonFolder, new {@class = "seriesCheckbox seasonFolder"}) @Html.DropDownListFor(m => m.BacklogSetting, new SelectList((List>)ViewData["BacklogSettingTypes"], "Key", "Value", (int)Model.BacklogSetting), new { @class = "backlogSetting" })@Html.TextBoxFor(m => m.DownloadEpisodesAiredAfter, new { type = "date", @class = "aired-after jQuery-datepicker" }) @Html.TextBoxFor(m => m.Path, new { @class = "path" })