1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-10-30 07:22:35 +01:00

SeasonEditor moved to Gird Editor.

This commit is contained in:
Mark McDowall 2011-06-04 22:23:50 -07:00
parent b68784060b
commit 08b7b8c3e1
10 changed files with 90 additions and 83 deletions

View File

@ -90,7 +90,7 @@ namespace NzbDrone.Web.Controllers
[AcceptVerbs(HttpVerbs.Post)] [AcceptVerbs(HttpVerbs.Post)]
[GridAction] [GridAction]
public ActionResult _SaveAjaxSeriesEditing(int id, string path, bool monitored, bool seasonFolder, int qualityProfileId, List<SeasonEditModel> seasons) public ActionResult _SaveAjaxSeriesEditing(int id, string path, bool monitored, bool seasonFolder, int qualityProfileId, List<SeasonEditModel> seasonEditor)
{ {
var oldSeries = _seriesProvider.GetSeries(id); var oldSeries = _seriesProvider.GetSeries(id);
oldSeries.Path = path; oldSeries.Path = path;
@ -182,25 +182,15 @@ namespace NzbDrone.Web.Controllers
return PartialView("SeriesSearchResults", model); return PartialView("SeriesSearchResults", model);
} }
[AcceptVerbs(HttpVerbs.Post)]
[GridAction]
public ActionResult _SaveAjaxEditing(string id)
{
return RedirectToAction("UnMapped");
}
[HttpPost] [HttpPost]
public ActionResult SaveSeasons(List<SeasonEditModel> seasons) public JsonResult SaveSeason(int seriesId, int seasonNumber, bool monitored)
{ {
foreach (var season in seasons) if (_episodeProvider.IsIgnored(seriesId, seasonNumber) == monitored)
{ {
if (_episodeProvider.IsIgnored(season.SeriesId, season.SeasonNumber) != !season.Monitored) _episodeProvider.SetSeasonIgnore(seriesId, seasonNumber, !monitored);
{
_episodeProvider.SetSeasonIgnore(season.SeriesId, season.SeasonNumber, !season.Monitored);
}
} }
return Content("Saved"); return new JsonResult { Data = "ok" };
} }
public ActionResult Details(int seriesId) public ActionResult Details(int seriesId)
@ -284,6 +274,7 @@ namespace NzbDrone.Web.Controllers
QualityProfileName = s.QualityProfile.Name, QualityProfileName = s.QualityProfile.Name,
SeasonFolder = s.SeasonFolder, SeasonFolder = s.SeasonFolder,
Status = s.Status, Status = s.Status,
SeasonsCount = _episodeProvider.GetSeasons(s.SeriesId).Where(n => n != 0).Count()
}); });
} }

View File

@ -19,6 +19,10 @@ namespace NzbDrone.Web.Helpers
string.Format("<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />", string.Format("<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />",
collectionName, itemIndex)); collectionName, itemIndex));
html.ViewContext.Writer.WriteLine(
string.Format("<input type=\"hidden\" name=\"{0}_collection\" autocomplete=\"off\" value=\"{1}\" />",
collectionName, itemIndex));
return BeginHtmlFieldPrefixScope(html, string.Format("{0}[{1}]", collectionName, itemIndex)); return BeginHtmlFieldPrefixScope(html, string.Format("{0}[{1}]", collectionName, itemIndex));
} }

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
namespace NzbDrone.Web.Helpers
{
public static class ValueExtension
{
public static object ValueFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var memberEx = expression.Body as MemberExpression;
if (memberEx == null)
throw new ArgumentException("Body not a member-expression.");
string name = memberEx.Member.Name;
var model = html.ViewData.Model;
var value = model.GetType().GetProperty(name).GetValue(model, null);
return value;
}
}
}

View File

@ -35,5 +35,8 @@ namespace NzbDrone.Web.Models
[DisplayName("Monitored")] [DisplayName("Monitored")]
public bool Monitored { get; set; } public bool Monitored { get; set; }
[DisplayName("Season Editor")]
public List<SeasonEditModel> SeasonEditor { get; set; }
} }
} }

View File

@ -252,6 +252,7 @@
<Compile Include="Global.asax.cs"> <Compile Include="Global.asax.cs">
<DependentUpon>Global.asax</DependentUpon> <DependentUpon>Global.asax</DependentUpon>
</Compile> </Compile>
<Compile Include="Helpers\ValueExtension.cs" />
<Compile Include="Helpers\DescriptionExtension.cs" /> <Compile Include="Helpers\DescriptionExtension.cs" />
<Compile Include="Helpers\HtmlPrefixScopeExtensions.cs" /> <Compile Include="Helpers\HtmlPrefixScopeExtensions.cs" />
<Compile Include="Helpers\IsCurrentActionHelper.cs" /> <Compile Include="Helpers\IsCurrentActionHelper.cs" />

View File

@ -8,6 +8,8 @@
<div style="width: 435px; margin: 10px;"> <div style="width: 435px; margin: 10px;">
@Html.HiddenFor(m => m.SeriesId)
<div class="edit-group"> <div class="edit-group">
<div class="config-title">@Html.LabelFor(m => m.Path)</div> <div class="config-title">@Html.LabelFor(m => m.Path)</div>
<div class="config-value">@Html.TextBoxFor(m => m.Path, new { style = "width: 300" })</div> <div class="config-value">@Html.TextBoxFor(m => m.Path, new { style = "width: 300" })</div>
@ -27,4 +29,9 @@
<b>@Html.LabelFor(m => m.QualityProfileId)</b> <b>@Html.LabelFor(m => m.QualityProfileId)</b>
@Html.DropDownListFor(model => model.QualityProfileId, (SelectList)ViewData["SelectList"], new { style = "margin-left:40px" }) @Html.DropDownListFor(model => model.QualityProfileId, (SelectList)ViewData["SelectList"], new { style = "margin-left:40px" })
</div> </div>
<div id="seasonEditorSection">
<div style="font-weight: bold; padding-right: 15px; padding-bottom: 5px;">@Html.LabelFor(m => m.SeasonEditor)</div>
<div id="season-editor"></div>
</div>
</div> </div>

View File

@ -109,8 +109,7 @@
.ClientTemplate("<a href=" + .ClientTemplate("<a href=" +
Url.Action("Details", "Series", new {seriesId = "<#= SeriesId #>"}) + Url.Action("Details", "Series", new {seriesId = "<#= SeriesId #>"}) +
"><#= Title #></a>"); "><#= Title #></a>");
columns.Bound(o => o.SeasonsCount).Title("Seasons") columns.Bound(o => o.SeasonsCount).Title("Seasons");
.ClientTemplate("<a href=# onclick=\"openSeasonEditor(<#= SeriesId #>, \'<#= Title #>\'); return false;\"><#= SeasonsCount #></a>");
columns.Bound(o => o.QualityProfileName).Title("Quality"); columns.Bound(o => o.QualityProfileName).Title("Quality");
columns.Bound(o => o.Status); columns.Bound(o => o.Status);
columns.Bound(o => o.AirsDayOfWeek); columns.Bound(o => o.AirsDayOfWeek);
@ -133,6 +132,7 @@
.Sortable(sort => sort.OrderBy(order => order.Add(o => o.Title).Ascending()).Enabled(true)) .Sortable(sort => sort.OrderBy(order => order.Add(o => o.Title).Ascending()).Enabled(true))
.DetailView(detailView => detailView.ClientTemplate("<div style=\"width:95%\"><#= Overview #></div>")) .DetailView(detailView => detailView.ClientTemplate("<div style=\"width:95%\"><#= Overview #></div>"))
.ClientEvents(clientEvents => { clientEvents.OnEdit("grid_edit"); .ClientEvents(clientEvents => { clientEvents.OnEdit("grid_edit");
clientEvents.OnSave("grid_save");
clientEvents.OnDataBinding("grid_bind"); clientEvents.OnDataBinding("grid_bind");
clientEvents.OnDataBound("grid_bound"); clientEvents.OnDataBound("grid_bound");
clientEvents.OnRowDataBound("grid_rowBound"); clientEvents.OnRowDataBound("grid_rowBound");
@ -150,6 +150,33 @@
.closest(".t-window") .closest(".t-window")
.data("tWindow") .data("tWindow")
.center(); .center();
var seriesId = args.dataItem.SeriesId;
var url = '@Url.Action("SeasonEditor", "Series")';
$('#season-editor').load(url, { seriesId: seriesId });
}
function grid_save(e) {
var seasonEditor = e.form.SeasonEditor_collection;
var saveSeasonEditUrl = '@Url.Action("SaveSeason", "Series")';
jQuery.each(seasonEditor, function() {
var guid = $(this).val();
var prefix = '#SeasonEditor_' + guid + '__';
var seriesId = $(prefix + 'SeriesId').val();
var seasonNumber = $(prefix + 'SeasonNumber').val();
var monitored = $(prefix + 'Monitored').attr('checked');
$.ajax({
type: "POST",
url: saveSeasonEditUrl,
data: jQuery.param({ seriesId: seriesId, seasonNumber: seasonNumber, monitored: monitored }),
error: function(req, status, error) {
alert("Sorry! We could save season changes at this time. " + error);
},
success: function(data, textStatus, jqXHR) { }
});
});
} }
function grid_rowBound(e) { function grid_rowBound(e) {
@ -188,27 +215,4 @@
} }
}); });
} }
function openSeasonEditor(seriesId, seriesName) {
windowElement = null;
windowElement = $.telerik.window.create({
title: "<b>Season Editor: " + seriesName + "</b>",
contentUrl: '@Url.Action("SeasonEditor", "Series")' + '/?seriesId=' + seriesId,
width: 360,
height: 400,
modal: true,
resizable: false,
draggable: true,
scrollable: true
});
windowElement.data('tWindow').center();
}
function closeSeasonEditor() {
$('#form').remove();
var window = windowElement.data("tWindow");
window.close();
}
</script> </script>

View File

@ -5,46 +5,12 @@
Layout = null; Layout = null;
} }
<script type="text/javascript"> <div style="vertical-align: middle">
$(document).ready(function () { @foreach (var season in Model)
var options = { {
target: '#result', Html.RenderAction("GetSingleSeasonView", "Series", season);
//beforeSubmit: showRequest,
success: showResponse,
type: 'post',
resetForm: false
};
$('#form').ajaxForm(options);
$('#save_button').attr('disabled', '');
});
function showRequest(formData, jqForm, options) {
$("#result").empty().html('Saving...');
$("#form :input").attr("disabled", true);
} }
</div>
function showResponse(responseText, statusText, xhr, $form) {
//$("#result").empty().html(responseText);
$("#form :input").attr("disabled", false);
closeSeasonEditor();
}
</script>
@using (Html.BeginForm("SaveSeasons", "Series", FormMethod.Post, new { id = "form" }))
{
<div style="vertical-align: middle">
@foreach (var season in Model)
{
Html.RenderAction("GetSingleSeasonView", "Series", season);
}
</div>
<div id="buttons" style="padding-top: 20px; position: absolute; bottom: 5;">
<button type="submit" class="t-button t-state-default">Save</button>
<button type="button" class="t-button t-state-default" onclick="closeSeasonEditor()">Cancel</button>
</div>
}
<div id="result"></div>
<script type="text/javascript"> <script type="text/javascript">
var lastChecked = null; var lastChecked = null;
@ -68,4 +34,4 @@
lastChecked = this; lastChecked = this;
}); });
}); });
</script> </script>

View File

@ -2,14 +2,18 @@
@using NzbDrone.Web.Models; @using NzbDrone.Web.Models;
@model SeasonEditModel @model SeasonEditModel
@using (Html.BeginCollectionItem("seasons")) @using (Html.BeginCollectionItem("SeasonEditor"))
{ {
<fieldset style="display: inline; border-color: lightgrey; width: 26%; margin-bottom: 2px; padding-bottom: 1px; padding-top: 1px;"> var idClean = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('[', '_').Replace(']', '_');
<fieldset style="display: inline; border-color: lightgrey; width: 20%; margin-bottom: 2px; margin-right: 0px; margin-left: 0px; padding-bottom: 1px; padding-top: 1px;">
@Html.DisplayFor(m => m.SeasonString) @Html.DisplayFor(m => m.SeasonString)
<span style="float: right;">@Html.CheckBoxFor(m => m.Monitored, new { @class = "chkbox" })</span> <span style="float: right;">@Html.CheckBoxFor(m => m.Monitored, new { @class = "chkbox" })</span>
@Html.HiddenFor(m => m.SeriesId)
@Html.HiddenFor(m => m.SeasonNumber) @Html.HiddenFor(m => m.SeasonNumber)
@Html.HiddenFor(m => m.SeasonNumber) @Html.Hidden(idClean, new { @class = "cleanId", })
</fieldset> </fieldset>
} }