From 0e7fc2e697dc5fd115cf795279cfe1eaaf34b761 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Tue, 3 Jun 2014 23:04:28 +0200 Subject: [PATCH] New: Health Check errors now have links to the wiki pages. --- src/NzbDrone.Api/Health/HealthResource.cs | 1 + .../HealthCheck/Checks/RootFolderCheck.cs | 4 +-- .../HealthCheck/Checks/UpdateCheck.cs | 3 +- src/NzbDrone.Core/HealthCheck/HealthCheck.cs | 20 ++++++++++++- src/UI/System/Info/Health/HealthLayout.js | 15 ++++++++-- src/UI/System/Info/Health/HealthWikiCell.js | 29 +++++++++++++++++++ src/UI/jQuery/RouteBinder.js | 6 ++-- 7 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 src/UI/System/Info/Health/HealthWikiCell.js diff --git a/src/NzbDrone.Api/Health/HealthResource.cs b/src/NzbDrone.Api/Health/HealthResource.cs index a5bec7c06..281a55e60 100644 --- a/src/NzbDrone.Api/Health/HealthResource.cs +++ b/src/NzbDrone.Api/Health/HealthResource.cs @@ -8,5 +8,6 @@ namespace NzbDrone.Api.Health { public HealthCheckResult Type { get; set; } public String Message { get; set; } + public Uri WikiUrl { get; set; } } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index 0c44b0947..59a79c4cc 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -28,11 +28,11 @@ namespace NzbDrone.Core.HealthCheck.Checks { if (missingRootFolders.Count == 1) { - return new HealthCheck(GetType(), HealthCheckResult.Error, "Missing root folder: " + missingRootFolders.First()); + return new HealthCheck(GetType(), HealthCheckResult.Error, "Missing root folder: " + missingRootFolders.First(), "#missing-root-folder"); } var message = String.Format("Multiple root folders are missing: {0}", String.Join(" | ", missingRootFolders)); - return new HealthCheck(GetType(), HealthCheckResult.Error, message); + return new HealthCheck(GetType(), HealthCheckResult.Error, message, "#missing-root-folder"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs index 0eb187b29..350595138 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs @@ -33,8 +33,7 @@ namespace NzbDrone.Core.HealthCheck.Checks } catch (Exception) { - return new HealthCheck(GetType(), HealthCheckResult.Error, - "Unable to update, running from write-protected folder"); + return new HealthCheck(GetType(), HealthCheckResult.Error, "Unable to update, running from write-protected folder"); } } diff --git a/src/NzbDrone.Core/HealthCheck/HealthCheck.cs b/src/NzbDrone.Core/HealthCheck/HealthCheck.cs index 183849ecb..31f0a3035 100644 --- a/src/NzbDrone.Core/HealthCheck/HealthCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/HealthCheck.cs @@ -1,13 +1,17 @@ using System; +using System.Text.RegularExpressions; using NzbDrone.Core.Datastore; namespace NzbDrone.Core.HealthCheck { public class HealthCheck : ModelBase { + private static readonly Regex CleanFragmentRegex = new Regex("[^a-z ]", RegexOptions.Compiled); + public Type Source { get; set; } public HealthCheckResult Type { get; set; } public String Message { get; set; } + public Uri WikiUrl { get; set; } public HealthCheck(Type source) { @@ -15,11 +19,25 @@ namespace NzbDrone.Core.HealthCheck Type = HealthCheckResult.Ok; } - public HealthCheck(Type source, HealthCheckResult type, string message) + public HealthCheck(Type source, HealthCheckResult type, String message, String wikiFragment = null) { Source = source; Type = type; Message = message; + WikiUrl = MakeWikiUrl(wikiFragment ?? MakeWikiFragment(message)); + } + + private static String MakeWikiFragment(String message) + { + return "#" + CleanFragmentRegex.Replace(message.ToLower(), String.Empty).Replace(' ', '-'); + } + + private static Uri MakeWikiUrl(String fragment) + { + var rootUri = new Uri("https://github.com/NzbDrone/NzbDrone/wiki/Health-checks"); + var fragmentUri = new Uri(fragment, UriKind.Relative); + + return new Uri(rootUri, fragmentUri); } } diff --git a/src/UI/System/Info/Health/HealthLayout.js b/src/UI/System/Info/Health/HealthLayout.js index 2a0a44461..935087741 100644 --- a/src/UI/System/Info/Health/HealthLayout.js +++ b/src/UI/System/Info/Health/HealthLayout.js @@ -5,8 +5,9 @@ define( 'backgrid', 'Health/HealthCollection', 'System/Info/Health/HealthCell', + 'System/Info/Health/HealthWikiCell', 'System/Info/Health/HealthOkView' - ], function (Marionette, Backgrid, HealthCollection, HealthCell, HealthOkView) { + ], function (Marionette, Backgrid, HealthCollection, HealthCell, HealthWikiCell, HealthOkView) { return Marionette.Layout.extend({ template: 'System/Info/Health/HealthLayoutTemplate', @@ -19,12 +20,20 @@ define( { name: 'type', label: '', - cell: HealthCell + cell: HealthCell, + sortable: false }, { name: 'message', label: 'Message', - cell: 'string' + cell: 'string', + sortable: false + }, + { + name: 'wikiUrl', + label: '', + cell: HealthWikiCell, + sortable: false } ], diff --git a/src/UI/System/Info/Health/HealthWikiCell.js b/src/UI/System/Info/Health/HealthWikiCell.js new file mode 100644 index 000000000..e6efd8c22 --- /dev/null +++ b/src/UI/System/Info/Health/HealthWikiCell.js @@ -0,0 +1,29 @@ +'use strict'; +define( + [ + 'jquery', + 'backgrid' + ], function ($, Backgrid) { + return Backgrid.UriCell.extend({ + + className: 'wiki-link-cell', + + title: 'Read the Wiki for more information', + + text: 'Wiki', + + render: function () { + this.$el.empty(); + var rawValue = this.model.get(this.column.get("name")); + var formattedValue = this.formatter.fromRaw(rawValue, this.model); + this.$el.append($("", { + tabIndex: -1, + href: rawValue, + title: this.title || formattedValue, + target: this.target + }).text(this.text)); + this.delegateEvents(); + return this; + } + }); + }); diff --git a/src/UI/jQuery/RouteBinder.js b/src/UI/jQuery/RouteBinder.js index f4b541102..e3e85c068 100644 --- a/src/UI/jQuery/RouteBinder.js +++ b/src/UI/jQuery/RouteBinder.js @@ -48,13 +48,15 @@ define( throw 'couldn\'t find route target'; } - if (!href.startsWith('http')) { var relativeHref = href.replace(StatusModel.get('urlBase'), ''); Backbone.history.navigate(relativeHref, { trigger: true }); } - + else if (href.contains('#')) { + //Open in new tab without dereferer (since it doesn't support fragments) + window.open(href, '_blank'); + } else { //Open in new tab window.open('http://www.dereferer.org/?' + encodeURI(href), '_blank');