From 9264dcdf88bc46311efd58207ddd63ba1cb77aab Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 15 Dec 2011 00:25:16 -0800 Subject: [PATCH] Added ImageLink helpers for Ajax and Html links. Added run button to System/Jobs. --- NzbDrone.Core/Jobs/JobProvider.cs | 11 +++++ NzbDrone.Core/Jobs/UpdateInfoJob.cs | 2 +- NzbDrone.Core/Repository/JobDefinition.cs | 3 ++ NzbDrone.Web/Content/Images/Gear.png | Bin 0 -> 1910 bytes NzbDrone.Web/Controllers/SystemController.cs | 17 ++++++- NzbDrone.Web/Helpers/LinkHelper.cs | 44 +++++++++++++++++++ NzbDrone.Web/NzbDrone.Web.csproj | 2 + NzbDrone.Web/Views/System/Jobs.cshtml | 23 +++++++++- 8 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 NzbDrone.Web/Content/Images/Gear.png create mode 100644 NzbDrone.Web/Helpers/LinkHelper.cs diff --git a/NzbDrone.Core/Jobs/JobProvider.cs b/NzbDrone.Core/Jobs/JobProvider.cs index ec6a10689..dfa2ae8f9 100644 --- a/NzbDrone.Core/Jobs/JobProvider.cs +++ b/NzbDrone.Core/Jobs/JobProvider.cs @@ -184,6 +184,17 @@ namespace NzbDrone.Core.Jobs } + public virtual bool QueueJob(string jobTypeString) + { + var type = Type.GetType(jobTypeString); + + if (type == null) + return false; + + QueueJob(type); + return true; + } + private void ProcessQueue() { try diff --git a/NzbDrone.Core/Jobs/UpdateInfoJob.cs b/NzbDrone.Core/Jobs/UpdateInfoJob.cs index 135676a10..5b3a7de6a 100644 --- a/NzbDrone.Core/Jobs/UpdateInfoJob.cs +++ b/NzbDrone.Core/Jobs/UpdateInfoJob.cs @@ -35,7 +35,7 @@ namespace NzbDrone.Core.Jobs public int DefaultInterval { - get { return 720; } //Daily + get { return 720; } //12-hours } public virtual void Start(ProgressNotification notification, int targetId, int secondaryTargetId) diff --git a/NzbDrone.Core/Repository/JobDefinition.cs b/NzbDrone.Core/Repository/JobDefinition.cs index 3eb1dcec9..3bbac9bf6 100644 --- a/NzbDrone.Core/Repository/JobDefinition.cs +++ b/NzbDrone.Core/Repository/JobDefinition.cs @@ -20,5 +20,8 @@ namespace NzbDrone.Core.Repository public DateTime LastExecution { get; set; } public Boolean Success { get; set; } + + [Ignore] + public string Command { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Web/Content/Images/Gear.png b/NzbDrone.Web/Content/Images/Gear.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4fedcaa7e1f1ddf375713f2ad7c5edc92f997f GIT binary patch literal 1910 zcmV-+2Z{KJP)}@Vtl{GCmIlg zB#I#Jh$x7Mw3l4r zlK6Lyh{zp_YGgxm-1A9uUk5 zdV%+O!4AQ*)nL-r*7ik#nLtZROYym@t1CTc&YZ61=4Mq_S68y`-o1NXcXzk<{{8!I z*;BCg{I6W7wXv~L3;*WL8}K86ts6KuAH0?VIEL*lr(=lsZ;29p7 zYAbMZ#flaE+qZ8&D(=xEf1eX<_CL;@J6D}KbEa+a;>GoA*REBcKYyM^;N!=SYW@24 zO4ejp%N`4$bq?C_fEPUD2$teFBeKxRjT<*+J@1R*M@L6hKA*=m{=`EBf2bD_=1Q2W zXV0EF32_2Xo;*=~eSOdvHCc(kZ->5+_>!`O{_yZH-+wBXg`yNF3XcU}zI>^zyU1XgV^_f*0P7aVRYdM@2KW4 zb|nrJo??rDAhxyRB71x#f`GeKvl6#%+O$bCwJn4T+`4s3`+ZGKO(JA3G@xbE=9?*M z`(~;@+lCDr((~rc)A`?K^6=q9H90w1vE_pZ4QSc4DQ2Y4b?erlMO!5bq)oefTCiV= z$*FDIwiPXI`!N|J#IjR@e+ljvtTVXZyqj|EftDRVJi~A2&YcvrQ^;auYBe%C)93+) z5sr?2o^%I7jACZj1HZ_?JlI_e9y4geKL$qxkJ7>fH z1|@nfQ9@n3crhDPpk5j@kHrWbmG}AXus(1hMpC%oQov8CE?yuC&YnHno*PPBsDA$Z z`Jr8;t8j%Va4E+2OJOvlz-8FlGUH)rOB~`pGXiKrJL>eq6ezGUZsW#LhMd-J6RhQ6 zcNk4SjV76i2P7~DqFP)(#Sv5?d3|q;-0xgN^^IeFBjbR}g*vWWxpIoDk0nc%=z+ot zni2)b78EuId~Z@^SSC7Z)=UF?o_VhPCWr zud4!6(6(;fiqYEb8^9zAWOwY?p)Ep>?i&3#3HlT=$m-Rrbu&mxv}*;=yyM!DHLPV1 zdtEd+O->x%=C_7KF62o&y>I2pm6};pui`7>U-WVl?T?1Io`16!x7UIeypcg#=|uNJ z9@ilL)kr0PuwY2Biv^rGhz#WvDCa_Xe~|f_Xl@4cNn!v6I=RCMvohBsVB9vm(*4|8 zhzuR&6o^Wr9S~s_C3D!*)Aj4uaS`rq)a~21596;)O;NXQxRtEeRh$~bJ28^ZbmkYF zqVNwMJP5sBkE_5{pO{Q)tu%OK2qEnEB)L6%_Nbnoo@4UvS5d6pWR6gvw-F_dn7swr zi$R92UAvYQBW0)$1iL60DSX^Qh7wnW;03{qxoGXQhak`MDEYtT^ZBeagz2zTFzI$c z)*lZHQ2aoV6C-fzP;Z*H^VR;5?|clR10tkn59dJz>|Wk=q5NO|$QK8Cxx@_vqrhM_ z8O~S%JLM4;H8oB2_V)hR*VmU7H_F&4Q>?E8U)B_= wdKnPoSIVT|*=>1*?^g^Zzfyk7@UH*^0MT$d>;M1& literal 0 HcmV?d00001 diff --git a/NzbDrone.Web/Controllers/SystemController.cs b/NzbDrone.Web/Controllers/SystemController.cs index 99f259903..4e42e9f96 100644 --- a/NzbDrone.Web/Controllers/SystemController.cs +++ b/NzbDrone.Web/Controllers/SystemController.cs @@ -35,7 +35,14 @@ namespace NzbDrone.Web.Controllers TargetId = c.TargetId, SecondaryTargetId = c.SecondaryTargetId }); - return View(_jobProvider.All()); + var jobs = _jobProvider.All(); + + foreach(var jobDefinition in jobs) + { + jobDefinition.Command = ""; + } + + return View(jobs); } public ActionResult Indexers() @@ -131,5 +138,13 @@ namespace NzbDrone.Web.Controllers return new JsonResult { Data = "ok" }; } + + public JsonResult RunJob(string typeName) + { + if (!_jobProvider.QueueJob(typeName)) + return Json(new NotificationResult { Title = "Failed to Start Job", Text = "Invalid job name", NotificationType = NotificationType.Error }); + + return Json(new NotificationResult { Title = "Job Queued" }); + } } } diff --git a/NzbDrone.Web/Helpers/LinkHelper.cs b/NzbDrone.Web/Helpers/LinkHelper.cs new file mode 100644 index 000000000..af1438715 --- /dev/null +++ b/NzbDrone.Web/Helpers/LinkHelper.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using System.Web.Mvc.Ajax; +using System.Web.Mvc.Html; +using System.Web.Routing; + +namespace NzbDrone.Web.Helpers +{ + public static class LinkHelper + { + public static MvcHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, object imgAttributes, string actionName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes) + { + return ImageActionLink(helper, imageUrl, imgAttributes, actionName, null, routeValues, ajaxOptions, htmlAttributes); + } + + public static MvcHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, object imgAttributes, string actionName, string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes) + { + var builder = new TagBuilder("img"); + builder.MergeAttribute("src", imageUrl); + var imgAttributesDictionary = new RouteValueDictionary(imgAttributes); + builder.MergeAttributes(imgAttributesDictionary); + var link = helper.ActionLink("[replaceme]", actionName, controllerName, routeValues, ajaxOptions, htmlAttributes).ToHtmlString(); + return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing))); + } + + public static MvcHtmlString ImageActionLink(this HtmlHelper helper, string imageUrl, object imgAttributes, string actionName, object routeValues, object htmlAttributes) + { + return ImageActionLink(helper, imageUrl, imgAttributes, actionName, null, routeValues, htmlAttributes); + } + + public static MvcHtmlString ImageActionLink(this HtmlHelper helper, string imageUrl, object imgAttributes, string actionName, string controllerName, object routeValues, object htmlAttributes) + { + var builder = new TagBuilder("img"); + builder.MergeAttribute("src", imageUrl); + var imgAttributesDictionary = new RouteValueDictionary(imgAttributes); + builder.MergeAttributes(imgAttributesDictionary); + var link = helper.ActionLink("[replaceme]", actionName, controllerName, routeValues, htmlAttributes).ToHtmlString(); + return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing))); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index e5013ac09..28c065394 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -142,6 +142,7 @@ + @@ -219,6 +220,7 @@ Global.asax + diff --git a/NzbDrone.Web/Views/System/Jobs.cshtml b/NzbDrone.Web/Views/System/Jobs.cshtml index e2020c286..385b5a715 100644 --- a/NzbDrone.Web/Views/System/Jobs.cshtml +++ b/NzbDrone.Web/Views/System/Jobs.cshtml @@ -1,9 +1,24 @@ @using NzbDrone.Web.Models +@using NzbDrone.Web.Helpers @model IEnumerable @{ViewBag.Title = "Jobs";} @{Html.Telerik().Grid(Model).Name("Grid") - .Render();} + .Columns(c => c.Bound(g => g.Id)) + .Columns(c => c.Bound(g => g.Enable)) + .Columns(c => c.Bound(g => g.TypeName)) + .Columns(c => c.Bound(g => g.Name)) + .Columns(c => c.Bound(g => g.Interval)) + .Columns(c => c.Bound(g => g.LastExecution)) + .Columns(c => c.Bound(g => g.Success)) + .Columns(c => c.Bound(g => g.Command) + .Template(@ @{ if(item.Enable) + { + @Ajax.ImageActionLink("../../Content/Images/Gear.png", new { Alt = "Run", Width = 18, Height = 18, Title = "Run Job" }, "RunJob", new { TypeName = item.TypeName }, null, null) + } + } + )) + .Render();} Items currently in queue @@ -13,3 +28,9 @@ .Columns(c => c.Bound(g => g.SecondaryTargetId).Title("Secondary Target")) .Render();} + +@section Scripts{ + +} \ No newline at end of file