Minor display changes, more meta groundwork

Also page size increased from 15 to 20.
This commit is contained in:
Thomas Hounsell 2015-01-04 17:31:27 +00:00
parent bb5808a76b
commit 6b71adab4d
6 changed files with 76 additions and 170 deletions

View File

@ -196,7 +196,7 @@
</Compile> </Compile>
<Compile Include="Models\ApiModel\SearchResult.cs" /> <Compile Include="Models\ApiModel\SearchResult.cs" />
<Compile Include="Models\Build.cs" /> <Compile Include="Models\Build.cs" />
<Compile Include="Models\LabMeta.cs" /> <Compile Include="Models\MetaItem.cs" />
<Compile Include="Models\ViewModel\LoginUser.cs" /> <Compile Include="Models\ViewModel\LoginUser.cs" />
<Compile Include="Models\ViewModel\ChangePassword.cs" /> <Compile Include="Models\ViewModel\ChangePassword.cs" />
<Compile Include="Models\ViewModel\RegistrationUser.cs" /> <Compile Include="Models\ViewModel\RegistrationUser.cs" />
@ -293,7 +293,6 @@
<Content Include="Views\support\rss.cshtml" /> <Content Include="Views\support\rss.cshtml" />
<Content Include="Views\support\sitemap.cshtml" /> <Content Include="Views\support\sitemap.cshtml" />
<Content Include="Scripts\jsrender.min.js.map" /> <Content Include="Scripts\jsrender.min.js.map" />
<Content Include="Views\build\lab.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="App_Data\" /> <Folder Include="App_Data\" />

View File

@ -7,7 +7,7 @@ namespace BuildFeed.Controllers
{ {
public class buildController : Controller public class buildController : Controller
{ {
public static int pageSize { get { return 15; } } public static int pageSize { get { return 20; } }
// //
// GET: /build/ // GET: /build/

View File

@ -1,25 +1,22 @@
using BuildFeed; using NServiceKit.DataAnnotations;
using NServiceKit.DataAnnotations;
using NServiceKit.DesignPatterns.Model; using NServiceKit.DesignPatterns.Model;
using NServiceKit.Redis; using NServiceKit.Redis;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
using Required = System.ComponentModel.DataAnnotations.RequiredAttribute; using Required = System.ComponentModel.DataAnnotations.RequiredAttribute;
namespace BuildFeed.Models namespace BuildFeed.Models
{ {
[DataObject] [DataObject]
public class LabMeta : IHasId<string> public class MetaItem : IHasId<MetaItemKey>
{ {
[Key] [Key]
[Index] [Index]
[@Required] [@Required]
public string Id { get; set; } public MetaItemKey Id { get; set; }
[DisplayName("Page Content")] [DisplayName("Page Content")]
[AllowHtml] [AllowHtml]
@ -31,21 +28,21 @@ public class LabMeta : IHasId<string>
[DataObjectMethod(DataObjectMethodType.Select, true)] [DataObjectMethod(DataObjectMethodType.Select, true)]
public static IEnumerable<LabMeta> Select() public static IEnumerable<MetaItem> Select()
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
return client.GetAll(); return client.GetAll();
} }
} }
[DataObjectMethod(DataObjectMethodType.Select, false)] [DataObjectMethod(DataObjectMethodType.Select, false)]
public static LabMeta SelectById(string id) public static MetaItem SelectById(MetaItemKey id)
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
return client.GetById(id); return client.GetById(id);
} }
} }
@ -56,43 +53,45 @@ public static IEnumerable<string> SelectUnusedLabs()
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
var labs = Build.SelectBuildLabs(); var labs = Build.SelectBuildLabs();
var usedLabs = client.GetAll(); var usedLabs = from u in client.GetAll()
where u.Id.Type == MetaType.Lab
select u;
return from l in labs return from l in labs
where !usedLabs.Any(ul => ul.Id == l) where !usedLabs.Any(ul => ul.Id.Value as string == l)
select l; select l;
} }
} }
[DataObjectMethod(DataObjectMethodType.Insert, true)] [DataObjectMethod(DataObjectMethodType.Insert, true)]
public static void Insert(LabMeta item) public static void Insert(MetaItem item)
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
client.Store(item); client.Store(item);
} }
} }
[DataObjectMethod(DataObjectMethodType.Update, true)] [DataObjectMethod(DataObjectMethodType.Update, true)]
public static void Update(LabMeta item) public static void Update(MetaItem item)
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
client.Store(item); client.Store(item);
} }
} }
[DataObjectMethod(DataObjectMethodType.Insert, false)] [DataObjectMethod(DataObjectMethodType.Insert, false)]
public static void InsertAll(IEnumerable<LabMeta> items) public static void InsertAll(IEnumerable<MetaItem> items)
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
client.StoreAll(items); client.StoreAll(items);
} }
} }
@ -102,9 +101,22 @@ public static void DeleteById(long id)
{ {
using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database)) using (RedisClient rClient = new RedisClient(DatabaseConfig.Host, DatabaseConfig.Port, db: DatabaseConfig.Database))
{ {
var client = rClient.As<LabMeta>(); var client = rClient.As<MetaItem>();
client.DeleteById(id); client.DeleteById(id);
} }
} }
} }
public struct MetaItemKey
{
public object Value { get; set; }
public MetaType Type { get; set; }
}
public enum MetaType
{
Lab,
Version,
Source
}
} }

View File

@ -6,12 +6,12 @@
@section head @section head
{ {
<meta name="description" content="@Model.FullBuildString. @Model.SourceDetails" /> <meta name="description" content="@Model.FullBuildString" />
<link href="@Url.Action()" rel="canonical" /> <link href="@Url.Action()" rel="canonical" />
<meta property="og:title" content="@Model.FullBuildString" /> <meta property="og:title" content="@Model.FullBuildString" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="@Url.Action()" /> <meta property="og:url" content="@Url.Action()" />
<meta property="og:description" content="@Model.SourceDetails, via BuildFeed." /> <meta property="og:description" content="@Model.FullBuildString, via BuildFeed." />
<!--<meta property="og:image" content="" />--> <!--<meta property="og:image" content="" />-->
} }
@ -65,21 +65,34 @@
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.Lab, new { @class = "control-label col-sm-2" }) @Html.LabelFor(model => model.Lab, new { @class = "control-label col-sm-2" })
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-static">@Html.ActionLink(Model.Lab, "lab", new { lab = Model.Lab })</p> <p class="form-control-static">
@Model.Lab<br />
<a href="@Url.Action("lab", new { lab = Model.Lab })" class="more-link"><i class="fa fa-plus-square-o fa-sm"></i> Find more builds from @Model.Lab</a>
</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.BuildTime, new { @class = "control-label col-sm-2" }) @Html.LabelFor(model => model.BuildTime, new { @class = "control-label col-sm-2" })
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-static">@Html.DisplayFor(model => model.BuildTime, "{0:yyMMdd-HHmm}")</p> <p class="form-control-static">
@Html.DisplayFor(model => model.BuildTime, "{0:yyMMdd-HHmm}")
@if (Model.BuildTime.HasValue)
{
<br />
<a href="@Url.Action("year", new { year = Model.BuildTime.Value.Year })" class="more-link"><i class="fa fa-plus-square-o fa-sm"></i> Find more builds compiled in @Model.BuildTime.Value.Year</a>
}
</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.SourceType, new { @class = "control-label col-sm-2" }) @Html.LabelFor(model => model.SourceType, new { @class = "control-label col-sm-2" })
<div class="col-sm-10"> <div class="col-sm-10">
<p class="form-control-static">@Html.DisplayFor(model => model.SourceType, "Enumeration")</p> <p class="form-control-static">
@Html.DisplayFor(model => model.SourceType, "Enumeration")<br />
<a href="@Url.Action("source", new { source = Model.SourceType })" class="more-link"><i class="fa fa-plus-square-o fa-sm"></i> Find more builds sourced from @Html.DisplayFor(model => model.SourceType, "Enumeration")</a>
</p>
</div> </div>
</div> </div>
@ -90,7 +103,7 @@
</div> </div>
</div> </div>
@if ( (Model.MajorVersion == 6 && Model.MinorVersion == 4) || (Model.MajorVersion == 10 && Model.MinorVersion == 0) && Model.FlightLevel != BuildFeed.Models.LevelOfFlight.None) @if ((Model.MajorVersion == 6 && Model.MinorVersion == 4) || (Model.MajorVersion == 10 && Model.MinorVersion == 0) && Model.FlightLevel != BuildFeed.Models.LevelOfFlight.None)
{ {
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.FlightLevel, new { @class = "control-label col-sm-2" }) @Html.LabelFor(model => model.FlightLevel, new { @class = "control-label col-sm-2" })

View File

@ -1,140 +0,0 @@
@model IEnumerable<BuildFeed.Models.Build>
@{
ViewBag.Title = "BuildFeed";
if (ViewBag.PageNumber > 1)
{
ViewBag.Title = string.Format("Page {1} | {0}", ViewBag.Title, ViewBag.PageNumber);
}
ViewBag.ItemId = ViewContext.Controller.ValueProvider.GetValue("lab").RawValue;
ViewBag.Title = string.Format("Builds from {1} | {0}", ViewBag.Title, ViewBag.ItemId);
}
@section head
{
<meta name="description" content="Check out all the known builds to come out of the Windows development lab @ViewBag.ItemId through BuildFeed, a collaborative Windows build list" />
<meta property="og:description" content="Check out all the known builds to come out of the Windows development lab @ViewBag.ItemId through BuildFeed, a collaborative Windows build list" />
}
<div class="row">
<div class="col-sm-9">
<ul class="list-unstyled">
@foreach (var item in Model)
{
<li>
<div class="build-head">
@Html.ActionLink("Info", "info", new { id = item.Id }, new { @class = "btn btn-info btn-xs" })
@if (User.Identity.IsAuthenticated)
{
@Html.ActionLink("Edit", "edit", new { id = item.Id }, new { @class = "btn btn-default btn-xs" })
}
@if (Roles.IsUserInRole("Administrators"))
{
@Html.ActionLink("Delete", "delete", new { id = item.Id }, new { @class = "btn btn-danger btn-xs" })
}
<h3>@Html.DisplayFor(modelItem => item.FullBuildString)</h3>
</div>
<div class="build-foot">
<span class="badge">@Html.DisplayFor(TypeOfSource => item.SourceType, "Enumeration")</span>
@if (item.FlightLevel != BuildFeed.Models.LevelOfFlight.None)
{
<span class="badge">Flight Level: @Html.DisplayFor(TypeOfSource => item.FlightLevel, "Enumeration")</span>
}
@if (item.BetaWikiUri != null)
{
<a href="@item.BetaWikiServerUri" target="_blank" class="badge"><i class="fa fa-sm fa-link"></i> BetaWiki (Client)</a>
}
@if (item.BetaWikiServerUri != null)
{
<a href="@item.BetaWikiServerUri" target="_blank" class="badge"><i class="fa fa-sm fa-link"></i> BetaWiki (Server)</a>
}
@if (item.WinWorldPCUri != null)
{
<a href="@item.WinWorldPCUri" target="_blank" class="badge"><i class="fa fa-sm fa-link"></i> WinWorldPC</a>
}
@if (item.BetaArchiveUri != null)
{
<a href="@item.BetaArchiveUri" target="_blank" class="badge"><i class="fa fa-sm fa-link"></i> BetaArchive Wiki</a>
}
@if (item.LonghornMsUri != null)
{
<a href="@item.LonghornMsUri" target="_blank" class="badge"><i class="fa fa-sm fa-link"></i> Longhorn.ms</a>
}
</div>
</li>
}
</ul>
</div>
<div class="col-sm-3">
<div class="panel panel-default panel-search">
<div class="panel-body">
@Html.TextBox("search-input", "", new { @class = "form-control" })
</div>
</div>
<div class="list-group">
@Html.ActionLink("Return to full listing", "index", new { controller = "build", area = "", page = 1 }, new { @class = "list-group-item" })
</div>
<div class="list-group">
@if (User.Identity.IsAuthenticated)
{
if (Roles.IsUserInRole("Administrators"))
{
@Html.ActionLink("Administration", "index", new { controller = "base", area = "admin" }, new { @class = "list-group-item" })
}
@Html.ActionLink("Add a build", "create", new { controller = "build" }, new { @class = "list-group-item" })
@Html.ActionLink("Change your password", "password", new { controller = "support" }, new { @class = "list-group-item" })
@Html.ActionLink("Log out", "logout", new { controller = "support" }, new { @class = "list-group-item" })
}
else
{
@Html.ActionLink("Log in", "login", new { controller = "support" }, new { @class = "list-group-item" })
@Html.ActionLink("Register", "register", new { controller = "support" }, new { @class = "list-group-item" })
}
</div>
</div>
</div>
@if (ViewBag.PageCount > 1)
{
<ul class="pagination">
@if (ViewBag.PageNumber > 1)
{
<li>@Html.ActionLink(HttpUtility.HtmlDecode("&laquo;"), ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString(), new { page = ViewBag.PageNumber - 1 })</li>
}
else
{
<li class="disabled"><span>&laquo;</span></li>
}
@for (int i = 1; i <= ViewBag.PageCount; i++)
{
<li @((i == ViewBag.PageNumber) ? "class=active" : "")>@Html.ActionLink(i.ToString(), ViewBag.Action as string, new { page = i })</li>
}
@if (ViewBag.PageNumber < ViewBag.PageCount)
{
<li>@Html.ActionLink(HttpUtility.HtmlDecode("&raquo;"), ViewBag.Action as string, new { page = ViewBag.PageNumber + 1 })</li>
}
else
{
<li class="disabled"><span>&raquo;</span></li>
}
</ul>
}
@section scripts
{
@Scripts.Render("~/bundles/jsrender")
<script type="text/javascript" src="~/Scripts/bfs.js"></script>
<script id="result-template" type="text/x-jsrender">
<a href="{{:Url}}" class="list-group-item" title="{{:Title}}">
<h4 class="list-group-item-heading">{{:Label}}</h4>
<p class="list-group-item-text">{{:Group}}</p>
</a>
</script>
}

View File

@ -73,6 +73,28 @@ li:last-child .build-foot
margin-right: 0.12em; margin-right: 0.12em;
} }
.more-link
{
display: inline-block;
font-size: 13px;
vertical-align: 1px;
border-bottom: 1px dashed #41c0e5;
color: #31b0d5;
}
.more-link .fa-sm
{
font-size: 11px;
vertical-align: 0px;
}
.more-link:hover
{
color: #30829e;
border-bottom-color: #50a2be;
text-decoration: none;
}
.field-validation-error .field-validation-error
{ {
color: #ff4136; color: #ff4136;