New: Health Check errors now have links to the wiki pages.

pull/6/head
Taloth Saldono 10 years ago
parent 68352e0340
commit 0e7fc2e697

@ -8,5 +8,6 @@ namespace NzbDrone.Api.Health
{ {
public HealthCheckResult Type { get; set; } public HealthCheckResult Type { get; set; }
public String Message { get; set; } public String Message { get; set; }
public Uri WikiUrl { get; set; }
} }
} }

@ -28,11 +28,11 @@ namespace NzbDrone.Core.HealthCheck.Checks
{ {
if (missingRootFolders.Count == 1) 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)); 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()); return new HealthCheck(GetType());

@ -33,8 +33,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
} }
catch (Exception) catch (Exception)
{ {
return new HealthCheck(GetType(), HealthCheckResult.Error, return new HealthCheck(GetType(), HealthCheckResult.Error, "Unable to update, running from write-protected folder");
"Unable to update, running from write-protected folder");
} }
} }

@ -1,13 +1,17 @@
using System; using System;
using System.Text.RegularExpressions;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.HealthCheck namespace NzbDrone.Core.HealthCheck
{ {
public class HealthCheck : ModelBase public class HealthCheck : ModelBase
{ {
private static readonly Regex CleanFragmentRegex = new Regex("[^a-z ]", RegexOptions.Compiled);
public Type Source { get; set; } public Type Source { get; set; }
public HealthCheckResult Type { get; set; } public HealthCheckResult Type { get; set; }
public String Message { get; set; } public String Message { get; set; }
public Uri WikiUrl { get; set; }
public HealthCheck(Type source) public HealthCheck(Type source)
{ {
@ -15,11 +19,25 @@ namespace NzbDrone.Core.HealthCheck
Type = HealthCheckResult.Ok; Type = HealthCheckResult.Ok;
} }
public HealthCheck(Type source, HealthCheckResult type, string message) public HealthCheck(Type source, HealthCheckResult type, String message, String wikiFragment = null)
{ {
Source = source; Source = source;
Type = type; Type = type;
Message = message; 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);
} }
} }

@ -5,8 +5,9 @@ define(
'backgrid', 'backgrid',
'Health/HealthCollection', 'Health/HealthCollection',
'System/Info/Health/HealthCell', 'System/Info/Health/HealthCell',
'System/Info/Health/HealthWikiCell',
'System/Info/Health/HealthOkView' 'System/Info/Health/HealthOkView'
], function (Marionette, Backgrid, HealthCollection, HealthCell, HealthOkView) { ], function (Marionette, Backgrid, HealthCollection, HealthCell, HealthWikiCell, HealthOkView) {
return Marionette.Layout.extend({ return Marionette.Layout.extend({
template: 'System/Info/Health/HealthLayoutTemplate', template: 'System/Info/Health/HealthLayoutTemplate',
@ -19,12 +20,20 @@ define(
{ {
name: 'type', name: 'type',
label: '', label: '',
cell: HealthCell cell: HealthCell,
sortable: false
}, },
{ {
name: 'message', name: 'message',
label: 'Message', label: 'Message',
cell: 'string' cell: 'string',
sortable: false
},
{
name: 'wikiUrl',
label: '',
cell: HealthWikiCell,
sortable: false
} }
], ],

@ -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($("<a>", {
tabIndex: -1,
href: rawValue,
title: this.title || formattedValue,
target: this.target
}).text(this.text));
this.delegateEvents();
return this;
}
});
});

@ -48,13 +48,15 @@ define(
throw 'couldn\'t find route target'; throw 'couldn\'t find route target';
} }
if (!href.startsWith('http')) { if (!href.startsWith('http')) {
var relativeHref = href.replace(StatusModel.get('urlBase'), ''); var relativeHref = href.replace(StatusModel.get('urlBase'), '');
Backbone.history.navigate(relativeHref, { trigger: true }); 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 { else {
//Open in new tab //Open in new tab
window.open('http://www.dereferer.org/?' + encodeURI(href), '_blank'); window.open('http://www.dereferer.org/?' + encodeURI(href), '_blank');

Loading…
Cancel
Save