Auto complete for paths added. Config text boxes are now wider.
This commit is contained in:
parent
ff673f3d7d
commit
bda226096b
|
@ -190,14 +190,14 @@ hr
|
||||||
/* Config Pages */
|
/* Config Pages */
|
||||||
.config-section
|
.config-section
|
||||||
{
|
{
|
||||||
width: 650px;
|
width: 800px;
|
||||||
height: 45px;
|
height: 45px;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.config-group
|
.config-group
|
||||||
{
|
{
|
||||||
width: 300px;
|
width: 385px;
|
||||||
display: block;
|
display: block;
|
||||||
float: left;
|
float: left;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
@ -205,7 +205,7 @@ hr
|
||||||
|
|
||||||
.config-group2
|
.config-group2
|
||||||
{
|
{
|
||||||
width: 300px;
|
width: 385px;
|
||||||
display: block;
|
display: block;
|
||||||
float: right;
|
float: right;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
@ -223,6 +223,11 @@ hr
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type=text]
|
||||||
|
{
|
||||||
|
width: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
.config-validation
|
.config-validation
|
||||||
{
|
{
|
||||||
color: Red;
|
color: Red;
|
||||||
|
|
|
@ -184,6 +184,7 @@ namespace NzbDrone.Web.Controllers
|
||||||
return new SelectList(dataVal, "Id", "SeriesName", selectId);
|
return new SelectList(dataVal, "Id", "SeriesName", selectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Root Directory
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public JsonResult SaveRootDir(int id, string path)
|
public JsonResult SaveRootDir(int id, string path)
|
||||||
{
|
{
|
||||||
|
@ -202,23 +203,29 @@ namespace NzbDrone.Web.Controllers
|
||||||
return new JsonResult { Data = "ok" };
|
return new JsonResult { Data = "ok" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public ViewResult AddRootDir()
|
public PartialViewResult AddRootDir()
|
||||||
{
|
{
|
||||||
var rootDir = new RootDir { Path = String.Empty };
|
var rootDir = new RootDir { Path = String.Empty };
|
||||||
|
|
||||||
var id = _rootFolderProvider.Add(rootDir);
|
var id = _rootFolderProvider.Add(rootDir);
|
||||||
rootDir.Id = id;
|
rootDir.Id = id;
|
||||||
|
|
||||||
ViewData["RootDirId"] = id;
|
var model = new RootDirModel();
|
||||||
|
model.Id = rootDir.Id;
|
||||||
|
model.Path = rootDir.Path;
|
||||||
|
model.SelectList = new SelectList(new List<string> { rootDir.Path }, rootDir.Path);
|
||||||
|
|
||||||
return View("RootDir", rootDir);
|
return PartialView("RootDir", model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActionResult GetRootDirView(RootDir rootDir)
|
public ActionResult GetRootDirView(RootDir rootDir)
|
||||||
{
|
{
|
||||||
ViewData["RootDirId"] = rootDir.Id;
|
var model = new RootDirModel();
|
||||||
|
model.Id = rootDir.Id;
|
||||||
|
model.Path = rootDir.Path;
|
||||||
|
model.SelectList = new SelectList(new List<string> { rootDir.Path }, rootDir.Path);
|
||||||
|
|
||||||
return PartialView("RootDir", rootDir);
|
return PartialView("RootDir", model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonResult DeleteRootDir(int rootDirId)
|
public JsonResult DeleteRootDir(int rootDirId)
|
||||||
|
@ -235,28 +242,5 @@ namespace NzbDrone.Web.Controllers
|
||||||
|
|
||||||
return new JsonResult { Data = "ok" };
|
return new JsonResult { Data = "ok" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonResult JsonAutoCompletePath(string term)
|
|
||||||
{
|
|
||||||
var windowsSep = term.LastIndexOf('\\');
|
|
||||||
|
|
||||||
if (windowsSep > -1)
|
|
||||||
{
|
|
||||||
var start = term.Substring(windowsSep + 1);
|
|
||||||
var dirs = _diskProvider.GetDirectories(term.Substring(0, windowsSep + 1)).Where(d => new DirectoryInfo(d).Name.ToLower().StartsWith(start.ToLower())).Take(10);
|
|
||||||
return Json(dirs.ToArray(), JsonRequestBehavior.AllowGet);
|
|
||||||
}
|
|
||||||
|
|
||||||
var index = term.LastIndexOf('/');
|
|
||||||
|
|
||||||
if (index > -1)
|
|
||||||
{
|
|
||||||
var start = term.Substring(index + 1);
|
|
||||||
var dirs = _diskProvider.GetDirectories(term.Substring(0, index + 1)).Where(d => new DirectoryInfo(d).Name.ToLower().StartsWith(start.ToLower())).Take(10);
|
|
||||||
return Json(dirs.ToArray(), JsonRequestBehavior.AllowGet);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Json(new JsonResult(), JsonRequestBehavior.AllowGet);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
using NzbDrone.Core.Providers.Core;
|
||||||
|
|
||||||
|
namespace NzbDrone.Web.Controllers
|
||||||
|
{
|
||||||
|
public class DirectoryController : Controller
|
||||||
|
{
|
||||||
|
private readonly DiskProvider _diskProvider;
|
||||||
|
|
||||||
|
public DirectoryController(DiskProvider diskProvider)
|
||||||
|
{
|
||||||
|
_diskProvider = diskProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActionResult Test()
|
||||||
|
{
|
||||||
|
return Content("Testing...");
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public ActionResult _autoCompletePath(string text, int? filterMode)
|
||||||
|
{
|
||||||
|
var data = GetDirectories(text);
|
||||||
|
|
||||||
|
return new JsonResult
|
||||||
|
{
|
||||||
|
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
|
||||||
|
Data = data
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SelectList GetDirectories(string text)
|
||||||
|
{
|
||||||
|
//Windows (Including UNC)
|
||||||
|
var windowsSep = text.LastIndexOf('\\');
|
||||||
|
|
||||||
|
if (windowsSep > -1)
|
||||||
|
{
|
||||||
|
var dirs = _diskProvider.GetDirectories(text.Substring(0, windowsSep + 1));
|
||||||
|
return new SelectList(dirs, dirs.FirstOrDefault());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Unix
|
||||||
|
var index = text.LastIndexOf('/');
|
||||||
|
|
||||||
|
if (index > -1)
|
||||||
|
{
|
||||||
|
var dirs = _diskProvider.GetDirectories(text.Substring(0, index + 1));
|
||||||
|
return new SelectList(dirs, dirs.FirstOrDefault());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SelectList(new List<string>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -96,6 +96,9 @@ namespace NzbDrone.Web.Controllers
|
||||||
{
|
{
|
||||||
ViewData["viewName"] = "Sabnzbd";
|
ViewData["viewName"] = "Sabnzbd";
|
||||||
|
|
||||||
|
var sabDropDir = _configProvider.SabDropDirectory;
|
||||||
|
var selectList = new SelectList(new List<string> {sabDropDir}, sabDropDir);
|
||||||
|
|
||||||
var model = new SabnzbdSettingsModel
|
var model = new SabnzbdSettingsModel
|
||||||
{
|
{
|
||||||
SabHost = _configProvider.SabHost,
|
SabHost = _configProvider.SabHost,
|
||||||
|
@ -105,7 +108,8 @@ namespace NzbDrone.Web.Controllers
|
||||||
SabPassword = _configProvider.SabPassword,
|
SabPassword = _configProvider.SabPassword,
|
||||||
SabTvCategory = _configProvider.SabTvCategory,
|
SabTvCategory = _configProvider.SabTvCategory,
|
||||||
SabTvPriority = _configProvider.SabTvPriority,
|
SabTvPriority = _configProvider.SabTvPriority,
|
||||||
SabDropDirectory = _configProvider.SabDropDirectory
|
SabDropDirectory = sabDropDir,
|
||||||
|
SabDropDirectorySelectList = selectList
|
||||||
};
|
};
|
||||||
|
|
||||||
return View("Index", model);
|
return View("Index", model);
|
||||||
|
|
|
@ -2,12 +2,15 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
|
||||||
namespace NzbDrone.Web.Models
|
namespace NzbDrone.Web.Models
|
||||||
{
|
{
|
||||||
public class RootDirModel
|
public class RootDirModel
|
||||||
{
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
public string CleanPath { get; set; }
|
public string CleanPath { get; set; }
|
||||||
|
public SelectList SelectList { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -56,5 +56,7 @@ namespace NzbDrone.Web.Models
|
||||||
[Description("The directory where SABnzbd stores TV shows (NzbDrone will sort them for you)")]
|
[Description("The directory where SABnzbd stores TV shows (NzbDrone will sort them for you)")]
|
||||||
[DisplayFormat(ConvertEmptyStringToNull = false)]
|
[DisplayFormat(ConvertEmptyStringToNull = false)]
|
||||||
public string SabDropDirectory { get; set; }
|
public string SabDropDirectory { get; set; }
|
||||||
|
|
||||||
|
public SelectList SabDropDirectorySelectList { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -236,6 +236,7 @@
|
||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
<DependentUpon>UploadLocalization.en-US.resx</DependentUpon>
|
<DependentUpon>UploadLocalization.en-US.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Controllers\DirectoryController.cs" />
|
||||||
<Compile Include="Controllers\EpisodeController.cs" />
|
<Compile Include="Controllers\EpisodeController.cs" />
|
||||||
<Compile Include="Controllers\HealthController.cs" />
|
<Compile Include="Controllers\HealthController.cs" />
|
||||||
<Compile Include="Controllers\HistoryController.cs" />
|
<Compile Include="Controllers\HistoryController.cs" />
|
||||||
|
|
|
@ -153,7 +153,7 @@
|
||||||
var saveRootDirUrl = '@Url.Action("SaveRootDir", "AddSeries")';
|
var saveRootDirUrl = '@Url.Action("SaveRootDir", "AddSeries")';
|
||||||
|
|
||||||
function saveRootDir(id) {
|
function saveRootDir(id) {
|
||||||
var path = $('#path_' + id).val();
|
var path = $("#path_" + id).data("tComboBox").value();
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@model NzbDrone.Core.Repository.RootDir
|
@model NzbDrone.Web.Models.RootDirModel
|
||||||
|
|
||||||
@{
|
@{
|
||||||
Layout = null;
|
Layout = null;
|
||||||
|
@ -6,8 +6,17 @@
|
||||||
|
|
||||||
<div class="rootDirSection" id="rootDir_@(Model.Id)" style="padding: 7px; padding-left: 3px;">
|
<div class="rootDirSection" id="rootDir_@(Model.Id)" style="padding: 7px; padding-left: 3px;">
|
||||||
<fieldset style="padding: 5px; height: 40px;">
|
<fieldset style="padding: 5px; height: 40px;">
|
||||||
@Html.TextBoxFor(m => m.Path, new { @class = "root_dir_text", id = "path_" + Model.Id })
|
@{Html.Telerik().ComboBox()
|
||||||
<a href="#" class="deleteRow" onclick="deleteRootDir('@ViewData["RootDirId"]')">
|
.Name("path_" + Model.Id)
|
||||||
|
.BindTo(Model.SelectList)
|
||||||
|
.DataBinding(binding => binding.Ajax().Select("_autoCompletePath", "Directory").Delay(400).Cache(false))
|
||||||
|
.Filterable(f => f.FilterMode(AutoCompleteFilterMode.StartsWith))
|
||||||
|
.HighlightFirstMatch(true)
|
||||||
|
.HtmlAttributes(new { style = "width: 300px;" })
|
||||||
|
.Render();}
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#RemoveRootDir" class="deleteRow" onclick="deleteRootDir(@Model.Id); return false;">
|
||||||
<img src="../../Content/Images/X.png" alt="Delete" width="20px" height="20px" style="vertical-align: middle; margin-top: 7px;"/></a>
|
<img src="../../Content/Images/X.png" alt="Delete" width="20px" height="20px" style="vertical-align: middle; margin-top: 7px;"/></a>
|
||||||
<button style="padding: 2px 10px 2px 10px; vertical-align: middle; margin: 0px; margin-top: 7px;" onclick="saveRootDir(@Model.Id)">Save</button>
|
<button style="padding: 2px 10px 2px 10px; vertical-align: middle; margin: 0px; margin-top: 7px;" onclick="saveRootDir(@Model.Id)">Save</button>
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
.indexer_group
|
.indexer_group
|
||||||
{
|
{
|
||||||
width: 220px;
|
width: 290px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.indexer_left
|
.indexer_left
|
||||||
|
@ -48,8 +48,10 @@
|
||||||
|
|
||||||
.indexer_checkbox
|
.indexer_checkbox
|
||||||
{
|
{
|
||||||
margin-right: 135px;
|
margin-right: 205px;
|
||||||
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@using (Html.BeginForm("SaveIndexers", "Settings", FormMethod.Post, new { id = "form", name = "form" })) {
|
@using (Html.BeginForm("SaveIndexers", "Settings", FormMethod.Post, new { id = "form", name = "form" })) {
|
||||||
|
@ -60,7 +62,7 @@
|
||||||
<div>
|
<div>
|
||||||
@{ Html.Telerik().PanelBar()
|
@{ Html.Telerik().PanelBar()
|
||||||
.Name("PanelBar")
|
.Name("PanelBar")
|
||||||
.HtmlAttributes(new { style = "width: 300px; margin: 10px;" })
|
.HtmlAttributes(new { style = "width: 500px; margin: 10px;" })
|
||||||
.ExpandMode(PanelBarExpandMode.Single)
|
.ExpandMode(PanelBarExpandMode.Single)
|
||||||
.SelectedIndex(0)
|
.SelectedIndex(0)
|
||||||
.Items(indexerItem =>
|
.Items(indexerItem =>
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="config-group" style="width: 255px; margin-bottom: 5px; margin-left: 5px;">
|
<div class="config-group" style="width: 255px; margin-bottom: 5px; margin-left: 5px;">
|
||||||
<div class="config-title">@Html.LabelFor(x => x.Name)</div>
|
<div class="config-title">@Html.LabelFor(x => x.Name)</div>
|
||||||
<div class="config-value">@Html.TextBoxFor(x => x.Name, new { maxlength = 15 })</div>
|
<div class="config-value">@Html.TextBoxFor(x => x.Name, new { maxlength = 15, style="width: 150px" })</div>
|
||||||
<div class="config-validation">@Html.ValidationMessageFor(x => x.Name)</div>
|
<div class="config-validation">@Html.ValidationMessageFor(x => x.Name)</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="config-group" style="width: 255px; margin-bottom: 5px; margin-left: 5px;">
|
<div class="config-group" style="width: 255px; margin-bottom: 5px; margin-left: 5px;">
|
||||||
|
|
|
@ -112,7 +112,14 @@
|
||||||
<div class="config-section">
|
<div class="config-section">
|
||||||
<div class="config-group">
|
<div class="config-group">
|
||||||
<div class="config-title">@Html.LabelFor(m => m.SabDropDirectory)</div>
|
<div class="config-title">@Html.LabelFor(m => m.SabDropDirectory)</div>
|
||||||
<div class="config-value">@Html.TextBoxFor(m => m.SabDropDirectory)</div>
|
<div class="config-value">@{Html.Telerik().ComboBoxFor(m => m.SabDropDirectory)
|
||||||
|
.BindTo(Model.SabDropDirectorySelectList)
|
||||||
|
.DataBinding(binding => binding.Ajax().Select("_autoCompletePath", "Directory").Delay(400).Cache(false))
|
||||||
|
.Filterable(f => f.FilterMode(AutoCompleteFilterMode.StartsWith))
|
||||||
|
.HighlightFirstMatch(true)
|
||||||
|
.HtmlAttributes(new { style = "margin-left: -2px; width: 220px;" })
|
||||||
|
.Render();}</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="config-group2">
|
<div class="config-group2">
|
||||||
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabDropDirectory)</div>
|
<div class="config-validation">@Html.ValidationMessageFor(m => m.SabDropDirectory)</div>
|
||||||
|
|
Loading…
Reference in New Issue