Auto complete for paths added. Config text boxes are now wider.

pull/3113/head
Mark McDowall 13 years ago
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…
Cancel
Save