mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-11 07:46:05 -07:00
This commit is contained in:
parent
17502d695b
commit
1067b9afd7
10 changed files with 237 additions and 25 deletions
|
@ -122,6 +122,7 @@
|
||||||
<Compile Include="SettingModels\ExternalSettings.cs" />
|
<Compile Include="SettingModels\ExternalSettings.cs" />
|
||||||
<Compile Include="SettingModels\HeadphonesSettings.cs" />
|
<Compile Include="SettingModels\HeadphonesSettings.cs" />
|
||||||
<Compile Include="SettingModels\LandingPageSettings.cs" />
|
<Compile Include="SettingModels\LandingPageSettings.cs" />
|
||||||
|
<Compile Include="SettingModels\CustomizationSettings.cs" />
|
||||||
<Compile Include="SettingModels\NewsletterSettings.cs" />
|
<Compile Include="SettingModels\NewsletterSettings.cs" />
|
||||||
<Compile Include="SettingModels\NotificationSettings.cs" />
|
<Compile Include="SettingModels\NotificationSettings.cs" />
|
||||||
<Compile Include="SettingModels\NotificationSettingsV2.cs" />
|
<Compile Include="SettingModels\NotificationSettingsV2.cs" />
|
||||||
|
|
39
PlexRequests.Core/SettingModels/CustomizationSettings.cs
Normal file
39
PlexRequests.Core/SettingModels/CustomizationSettings.cs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#region Copyright
|
||||||
|
// /************************************************************************
|
||||||
|
// Copyright (c) 2016 Jamie Rees
|
||||||
|
// File: NewsletterSettings.cs
|
||||||
|
// Created By: Jim MacKenzie
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
// a copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
// ************************************************************************/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
namespace PlexRequests.Core.SettingModels
|
||||||
|
{
|
||||||
|
public class CustomizationSettings : Settings
|
||||||
|
{
|
||||||
|
public string ApplicationName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The CSS name of the theme we want
|
||||||
|
/// </summary>
|
||||||
|
public string ThemeName { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,7 +66,7 @@ namespace PlexRequests.UI.Helpers
|
||||||
var assetLocation = GetBaseUrl();
|
var assetLocation = GetBaseUrl();
|
||||||
|
|
||||||
var content = GetContentUrl(assetLocation);
|
var content = GetContentUrl(assetLocation);
|
||||||
var settings = GetSettings();
|
var settings = GetCustomizationSettings();
|
||||||
if (string.IsNullOrEmpty(settings.ThemeName))
|
if (string.IsNullOrEmpty(settings.ThemeName))
|
||||||
{
|
{
|
||||||
settings.ThemeName = Themes.PlexTheme;
|
settings.ThemeName = Themes.PlexTheme;
|
||||||
|
@ -328,6 +328,11 @@ namespace PlexRequests.UI.Helpers
|
||||||
return helper.Raw(GetBaseUrl());
|
return helper.Raw(GetBaseUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IHtmlString GetApplicationName(this HtmlHelpers helper)
|
||||||
|
{
|
||||||
|
return helper.Raw(GetCustomizationSettings().ApplicationName);
|
||||||
|
}
|
||||||
|
|
||||||
private static string GetBaseUrl()
|
private static string GetBaseUrl()
|
||||||
{
|
{
|
||||||
return GetSettings().BaseUrl;
|
return GetSettings().BaseUrl;
|
||||||
|
@ -343,6 +348,16 @@ namespace PlexRequests.UI.Helpers
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static CustomizationSettings GetCustomizationSettings()
|
||||||
|
{
|
||||||
|
var returnValue = Cache.GetOrSet(CacheKeys.GetPlexRequestSettings, () =>
|
||||||
|
{
|
||||||
|
var settings = Locator.Resolve<ISettingsService<CustomizationSettings>>().GetSettings();
|
||||||
|
return settings;
|
||||||
|
});
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
private static string GetLinkUrl(string assetLocation)
|
private static string GetLinkUrl(string assetLocation)
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(assetLocation) ? string.Empty : $"{assetLocation}";
|
return string.IsNullOrEmpty(assetLocation) ? string.Empty : $"{assetLocation}";
|
||||||
|
|
72
PlexRequests.UI/Modules/Admin/CustomizationModule.cs
Normal file
72
PlexRequests.UI/Modules/Admin/CustomizationModule.cs
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
#region Copyright
|
||||||
|
// /************************************************************************
|
||||||
|
// Copyright (c) 2016 Jamie Rees
|
||||||
|
// File: CustomizationModule.cs
|
||||||
|
// Created By: Jamie Rees
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
// a copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
// the following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be
|
||||||
|
// included in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
// ************************************************************************/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Nancy;
|
||||||
|
using Nancy.ModelBinding;
|
||||||
|
using Nancy.Responses.Negotiation;
|
||||||
|
using PlexRequests.Core;
|
||||||
|
using PlexRequests.Core.SettingModels;
|
||||||
|
using PlexRequests.Helpers.Permissions;
|
||||||
|
using PlexRequests.UI.Models;
|
||||||
|
using ISecurityExtensions = PlexRequests.Core.ISecurityExtensions;
|
||||||
|
|
||||||
|
namespace PlexRequests.UI.Modules.Admin
|
||||||
|
{
|
||||||
|
public class CustomizationModule : BaseModule
|
||||||
|
{
|
||||||
|
public CustomizationModule(ISettingsService<PlexRequestSettings> settingsService, ISettingsService<CustomizationSettings> cust, ISecurityExtensions security) : base("admin", settingsService, security)
|
||||||
|
{
|
||||||
|
Before += (ctx) => Security.AdminLoginRedirect(Permissions.Administrator, ctx);
|
||||||
|
|
||||||
|
Settings = cust;
|
||||||
|
|
||||||
|
Get["/customization", true] = async (x,ct) => await Index();
|
||||||
|
Post["/customization", true] = async (x,ct) => await Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ISettingsService<CustomizationSettings> Settings { get; }
|
||||||
|
|
||||||
|
private async Task<Negotiator> Index()
|
||||||
|
{
|
||||||
|
var model = await Settings.GetSettingsAsync();
|
||||||
|
|
||||||
|
return View["customization", model];
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<Response> Save()
|
||||||
|
{
|
||||||
|
var model = this.Bind<CustomizationSettings>();
|
||||||
|
|
||||||
|
var result = await Settings.SaveSettingsAsync(model);
|
||||||
|
|
||||||
|
return Response.AsJson(result
|
||||||
|
? new JsonResponseModel { Result = true }
|
||||||
|
: new JsonResponseModel { Result = false, Message = "We could not save to the database, please try again" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -244,6 +244,7 @@
|
||||||
<Compile Include="Models\SearchMovieViewModel.cs" />
|
<Compile Include="Models\SearchMovieViewModel.cs" />
|
||||||
<Compile Include="Models\UserManagement\DeleteUserViewModel.cs" />
|
<Compile Include="Models\UserManagement\DeleteUserViewModel.cs" />
|
||||||
<Compile Include="Models\UserManagement\UserUpdateViewModel.cs" />
|
<Compile Include="Models\UserManagement\UserUpdateViewModel.cs" />
|
||||||
|
<Compile Include="Modules\Admin\CustomizationModule.cs" />
|
||||||
<Compile Include="Modules\Admin\UserManagementSettingsModule.cs" />
|
<Compile Include="Modules\Admin\UserManagementSettingsModule.cs" />
|
||||||
<Compile Include="Modules\Admin\FaultQueueModule.cs" />
|
<Compile Include="Modules\Admin\FaultQueueModule.cs" />
|
||||||
<Compile Include="Modules\Admin\SystemStatusModule.cs" />
|
<Compile Include="Modules\Admin\SystemStatusModule.cs" />
|
||||||
|
@ -757,6 +758,9 @@
|
||||||
<Content Include="Views\UserManagementSettings\UserManagementSettings.cshtml">
|
<Content Include="Views\UserManagementSettings\UserManagementSettings.cshtml">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Views\Customization\Customization.cshtml">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<None Include="Web.Debug.config">
|
<None Include="Web.Debug.config">
|
||||||
<DependentUpon>web.config</DependentUpon>
|
<DependentUpon>web.config</DependentUpon>
|
||||||
</None>
|
</None>
|
||||||
|
|
|
@ -19,18 +19,6 @@
|
||||||
{
|
{
|
||||||
formAction = "/" + baseUrl.ToHtmlString() + formAction;
|
formAction = "/" + baseUrl.ToHtmlString() + formAction;
|
||||||
}
|
}
|
||||||
var plexTheme = string.Empty;
|
|
||||||
var originalTheme = string.Empty;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Model.ThemeName))
|
|
||||||
{
|
|
||||||
plexTheme = Model.ThemeName.Equals(Themes.PlexTheme) ? "selected=\"selected\"" : string.Empty;
|
|
||||||
originalTheme = Model.ThemeName.Equals(Themes.OriginalTheme) ? "selected=\"selected\"" : string.Empty;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
plexTheme = "selected=\"selected\"";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
<div class="col-sm-8 col-sm-push-1">
|
<div class="col-sm-8 col-sm-push-1">
|
||||||
<form class="form-horizontal" method="POST" id="mainForm">
|
<form class="form-horizontal" method="POST" id="mainForm">
|
||||||
|
@ -69,16 +57,6 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="select" class="control-label">Theme</label>
|
|
||||||
<div id="themes">
|
|
||||||
<select class="form-control form-control-custom" id="select">
|
|
||||||
<option @plexTheme class="form-control form-control-custom" value="@Themes.PlexTheme">Plex</option>
|
|
||||||
<option @originalTheme class="form-control form-control-custom" value="@Themes.OriginalTheme">Original Blue</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@Html.Checkbox(Model.SearchForMovies,"SearchForMovies","Search for Movies")
|
@Html.Checkbox(Model.SearchForMovies,"SearchForMovies","Search for Movies")
|
||||||
|
|
||||||
|
|
89
PlexRequests.UI/Views/Customization/Customization.cshtml
Normal file
89
PlexRequests.UI/Views/Customization/Customization.cshtml
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
@using PlexRequests.UI.Helpers
|
||||||
|
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<PlexRequests.Core.SettingModels.CustomizationSettings>
|
||||||
|
@Html.Partial("Shared/Partial/_Sidebar")
|
||||||
|
@{
|
||||||
|
var plexTheme = string.Empty;
|
||||||
|
var originalTheme = string.Empty;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(Model.ThemeName))
|
||||||
|
{
|
||||||
|
plexTheme = Model.ThemeName.Equals(Themes.PlexTheme) ? "selected=\"selected\"" : string.Empty;
|
||||||
|
originalTheme = Model.ThemeName.Equals(Themes.OriginalTheme) ? "selected=\"selected\"" : string.Empty;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
plexTheme = "selected=\"selected\"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<div class="col-sm-8 col-sm-push-1">
|
||||||
|
<form class="form-horizontal" method="POST" id="mainForm">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Customization Settings</legend>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="ApplicationName" class="control-label">Application Name</label>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<input type="text" class="form-control form-control-custom " id="ApplicationName" name="ApplicationName" placeholder="Application Name" value="@Model.ApplicationName">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="select" class="control-label">Theme</label>
|
||||||
|
<div id="themes">
|
||||||
|
<select class="form-control form-control-custom" id="select">
|
||||||
|
<option @plexTheme class="form-control form-control-custom" value="@Themes.PlexTheme">Plex</option>
|
||||||
|
<option @originalTheme class="form-control form-control-custom" value="@Themes.OriginalTheme">Original Blue</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div>
|
||||||
|
<button type="submit" id="save" class="btn btn-primary-outline">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
|
||||||
|
$('#save').click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var theme = $("#themes option:selected").val();
|
||||||
|
var $form = $("#mainForm");
|
||||||
|
|
||||||
|
var data = $form.serialize();
|
||||||
|
data = data + "&themeName=" + theme;
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: $form.prop("method"),
|
||||||
|
data: data,
|
||||||
|
url: $form.prop("action"),
|
||||||
|
dataType: "json",
|
||||||
|
success: function (response) {
|
||||||
|
if (response.result === true) {
|
||||||
|
generateNotify("Success!", "success");
|
||||||
|
} else {
|
||||||
|
generateNotify(response.message, "warning");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function (e) {
|
||||||
|
console.log(e);
|
||||||
|
generateNotify("Something went wrong!", "danger");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -12,13 +12,19 @@
|
||||||
{
|
{
|
||||||
url = "/" + baseUrl.ToHtmlString();
|
url = "/" + baseUrl.ToHtmlString();
|
||||||
}
|
}
|
||||||
|
var title = UI.Layout_Title;
|
||||||
|
var customName = Html.GetApplicationName().ToHtmlString();
|
||||||
|
if (!string.IsNullOrEmpty(customName))
|
||||||
|
{
|
||||||
|
title = customName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div hidden="hidden" id="baseUrl">@baseUrl.ToHtmlString()</div>
|
<div hidden="hidden" id="baseUrl">@baseUrl.ToHtmlString()</div>
|
||||||
<head>
|
<head>
|
||||||
<title>@UI.Layout_Title</title>
|
<title>@title</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<!-- Styles -->
|
<!-- Styles -->
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
|
@ -15,6 +15,13 @@
|
||||||
{
|
{
|
||||||
url = "/" + baseUrl.ToHtmlString();
|
url = "/" + baseUrl.ToHtmlString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var title = UI.Layout_Title;
|
||||||
|
var customName = Html.GetApplicationName().ToHtmlString();
|
||||||
|
if (!string.IsNullOrEmpty(customName))
|
||||||
|
{
|
||||||
|
title = customName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +35,7 @@
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<a class="navbar-brand" href="@url/search">@UI.Layout_Title</a>
|
<a class="navbar-brand" href="@url/search">@title</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<div class="col-lg-3 col-md-3 col-sm-4">
|
<div class="col-lg-3 col-md-3 col-sm-4">
|
||||||
<div class="list-group table-of-contents">
|
<div class="list-group table-of-contents">
|
||||||
@Html.GetSidebarUrl(Context, "/admin", "Plex Request")
|
@Html.GetSidebarUrl(Context, "/admin", "Plex Request")
|
||||||
|
@Html.GetSidebarUrl(Context, "/admin/customization", "Customization")
|
||||||
@Html.GetSidebarUrl(Context, "/admin/landingpage", "Landing Page")
|
@Html.GetSidebarUrl(Context, "/admin/landingpage", "Landing Page")
|
||||||
@Html.GetSidebarUrl(Context, "/admin/authentication", "Authentication")
|
@Html.GetSidebarUrl(Context, "/admin/authentication", "Authentication")
|
||||||
@Html.GetSidebarUrl(Context, "/admin/usermanagementsettings", "User Management Settings")
|
@Html.GetSidebarUrl(Context, "/admin/usermanagementsettings", "User Management Settings")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue