From f0409c794d14add12adf9a956e143cc135fe05f6 Mon Sep 17 00:00:00 2001 From: Thomas Hounsell Date: Thu, 23 Feb 2017 20:53:49 +0000 Subject: [PATCH] Code style consistency and enforcement --- BuildFeed.Local/InvariantTerms.cs | 12 +- BuildFeed.Local/Properties/AssemblyInfo.cs | 7 +- BuildFeed.Model/Api/NewBuild.cs | 30 +- BuildFeed.Model/Api/SearchResult.cs | 14 +- BuildFeed.Model/Build.cs | 336 +++++------ BuildFeed.Model/BuildGroup.cs | 20 +- BuildFeed.Model/BuildRepository-Group.cs | 168 +++--- BuildFeed.Model/BuildRepository-Lab.cs | 102 ++-- BuildFeed.Model/BuildRepository-Source.cs | 30 +- BuildFeed.Model/BuildRepository-Version.cs | 114 ++-- BuildFeed.Model/BuildRepository-Year.cs | 82 +-- BuildFeed.Model/BuildVersion.cs | 22 +- BuildFeed.Model/MetaItem.cs | 244 ++++---- BuildFeed.Model/MongoConfig.cs | 62 +- BuildFeed.Model/ProjectFamily.cs | 60 +- BuildFeed.Model/Properties/AssemblyInfo.cs | 7 +- BuildFeed.Model/TypeOfSource.cs | 42 +- BuildFeed.Model/View/ChangePassword.cs | 32 +- BuildFeed.Model/View/FrontBuildGroup.cs | 12 +- BuildFeed.Model/View/LoginUser.cs | 22 +- BuildFeed.Model/View/RegistrationUser.cs | 38 +- BuildFeed.Model/View/SitemapData.cs | 48 +- BuildFeed.Model/app.config | 17 +- BuildFeed.Model/packages.config | 19 +- BuildFeed/App_Code/PaginationHelpers.cshtml | 80 ++- BuildFeed/App_Start/RouteConfig.cs | 34 +- .../Areas/admin/Controllers/baseController.cs | 54 +- .../Areas/admin/Controllers/metaController.cs | 170 +++--- .../admin/Controllers/usersController.cs | 112 ++-- .../admin/Models/ViewModel/MetaListing.cs | 10 +- .../Areas/admin/adminAreaRegistration.cs | 44 +- BuildFeed/Code/CustomContentTypeAttribute.cs | 18 +- BuildFeed/Code/DateTimeModelBinder.cs | 32 +- BuildFeed/Code/DisplayHelpers.cs | 106 ++-- BuildFeed/Code/MvcIntrinsics.cs | 12 +- BuildFeed/Code/Options/Locale.cs | 138 ++--- BuildFeed/Code/Options/Theme.cs | 62 +- BuildFeed/Code/OutputCachePushAttribute.cs | 30 +- BuildFeed/Controllers/BaseController.cs | 22 +- BuildFeed/Controllers/apiController.cs | 5 +- BuildFeed/Controllers/frontController.cs | 2 - BuildFeed/Controllers/rssController.cs | 294 +++++----- BuildFeed/Controllers/supportController.cs | 534 +++++++++--------- BuildFeed/Global.asax | 2 +- BuildFeed/Global.asax.cs | 76 +-- BuildFeed/OneSignalSDKUpdaterWorker.js | 2 +- BuildFeed/OneSignalSDKWorker.js | 2 +- BuildFeed/Properties/AssemblyInfo.cs | 7 +- BuildFeed/Views/_ViewStart.cshtml | 2 +- BuildFeed/Views/front/AddBulk.cshtml | 78 +-- BuildFeed/Views/front/Pages.cshtml | 6 +- BuildFeed/Views/front/editBuild.cshtml | 294 +++++----- BuildFeed/Views/front/index.cshtml | 120 ++-- BuildFeed/Views/front/viewBuild.cshtml | 306 +++++----- BuildFeed/Views/front/viewGroup.cshtml | 134 ++--- BuildFeed/Views/front/viewLab.cshtml | 172 +++--- BuildFeed/Views/front/viewSource.cshtml | 166 +++--- BuildFeed/Views/front/viewVersion.cshtml | 166 +++--- BuildFeed/Views/front/viewYear.cshtml | 184 +++--- BuildFeed/Views/shared/_default.cshtml | 2 +- BuildFeed/Views/shared/error.cshtml | 2 +- BuildFeed/Views/support/password.cshtml | 30 +- BuildFeed/Views/support/register.cshtml | 40 +- BuildFeed/Views/support/sitemap.cshtml | 2 +- .../Views/support/thanks_register.cshtml | 7 +- BuildFeed/content/Web.config | 3 +- BuildFeed/manifest.json | 28 +- BuildFeed/packages.config | 159 +++--- BuildFeed/res/Web.config | 3 +- BuildFeed/res/css/dark.css.map | 2 +- BuildFeed/res/css/default.css.map | 2 +- BuildFeed/res/css/light.css.map | 2 +- BuildFeed/yandex_702baad42b020be7.html | 6 +- 73 files changed, 2696 insertions(+), 2608 deletions(-) diff --git a/BuildFeed.Local/InvariantTerms.cs b/BuildFeed.Local/InvariantTerms.cs index ecac936..bbc34e8 100644 --- a/BuildFeed.Local/InvariantTerms.cs +++ b/BuildFeed.Local/InvariantTerms.cs @@ -2,10 +2,10 @@ namespace BuildFeed.Local { - public class InvariantTerms - { - public const string DeveloperName = "Thomas Hounsell"; - public const string ProductName = "Windows NT"; - public const string SiteName = "BuildFeed"; - } + public class InvariantTerms + { + public const string DeveloperName = "Thomas Hounsell"; + public const string ProductName = "Windows NT"; + public const string SiteName = "BuildFeed"; + } } \ No newline at end of file diff --git a/BuildFeed.Local/Properties/AssemblyInfo.cs b/BuildFeed.Local/Properties/AssemblyInfo.cs index 4633fdb..5b63323 100644 --- a/BuildFeed.Local/Properties/AssemblyInfo.cs +++ b/BuildFeed.Local/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("BuildFeed.Local")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,9 +17,11 @@ using System.Runtime.InteropServices; // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("3485b33a-6c3a-4535-9d85-4696914ad504")] // Version information for an assembly consists of the following four values: @@ -32,5 +34,6 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/BuildFeed.Model/Api/NewBuild.cs b/BuildFeed.Model/Api/NewBuild.cs index 1eded84..9733e3f 100644 --- a/BuildFeed.Model/Api/NewBuild.cs +++ b/BuildFeed.Model/Api/NewBuild.cs @@ -2,20 +2,20 @@ namespace BuildFeed.Model.Api { - public class NewBuildPost - { - public NewBuild[] NewBuilds { get; set; } - public string Password { get; set; } - public string Username { get; set; } - } + public class NewBuildPost + { + public NewBuild[] NewBuilds { get; set; } + public string Password { get; set; } + public string Username { get; set; } + } - public class NewBuild - { - public DateTime? BuildTime { get; set; } - public string Lab { get; set; } - public uint MajorVersion { get; set; } - public uint MinorVersion { get; set; } - public uint Number { get; set; } - public uint? Revision { get; set; } - } + public class NewBuild + { + public DateTime? BuildTime { get; set; } + public string Lab { get; set; } + public uint MajorVersion { get; set; } + public uint MinorVersion { get; set; } + public uint Number { get; set; } + public uint? Revision { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/Api/SearchResult.cs b/BuildFeed.Model/Api/SearchResult.cs index 299c2a1..878b3ae 100644 --- a/BuildFeed.Model/Api/SearchResult.cs +++ b/BuildFeed.Model/Api/SearchResult.cs @@ -1,10 +1,10 @@ namespace BuildFeed.Model.Api { - public class SearchResult - { - public string Group { get; set; } - public string Label { get; set; } - public string Title { get; set; } - public string Url { get; set; } - } + public class SearchResult + { + public string Group { get; set; } + public string Label { get; set; } + public string Title { get; set; } + public string Url { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/Build.cs b/BuildFeed.Model/Build.cs index de2e580..0f9aeba 100644 --- a/BuildFeed.Model/Build.cs +++ b/BuildFeed.Model/Build.cs @@ -11,205 +11,205 @@ using Required = System.ComponentModel.DataAnnotations.RequiredAttribute; namespace BuildFeed.Model { - [DataObject] - [BsonIgnoreExtraElements] - public class Build - { - [Key] - [BsonId] - public Guid Id { get; set; } + [DataObject] + [BsonIgnoreExtraElements] + public class Build + { + [Key] + [BsonId] + public Guid Id { get; set; } - public long? LegacyId { get; set; } + public long? LegacyId { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_MajorVersion))] - public uint MajorVersion { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_MajorVersion))] + public uint MajorVersion { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_MinorVersion))] - public uint MinorVersion { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_MinorVersion))] + public uint MinorVersion { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_BuildNumber))] - public uint Number { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_BuildNumber))] + public uint Number { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Revision))] - [DisplayFormat(ConvertEmptyStringToNull = true)] - public uint? Revision { get; set; } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Revision))] + [DisplayFormat(ConvertEmptyStringToNull = true)] + public uint? Revision { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_LabString))] - public string Lab { get; set; } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_LabString))] + public string Lab { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_BuildTime))] - [DisplayFormat(ConvertEmptyStringToNull = true, ApplyFormatInEditMode = true, DataFormatString = "{0:yyMMdd-HHmm}")] - public DateTime? BuildTime { get; set; } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_BuildTime))] + [DisplayFormat(ConvertEmptyStringToNull = true, ApplyFormatInEditMode = true, DataFormatString = "{0:yyMMdd-HHmm}")] + public DateTime? BuildTime { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Added))] - public DateTime Added { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Added))] + public DateTime Added { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Modified))] - public DateTime Modified { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Modified))] + public DateTime Modified { get; set; } - [@Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_SourceType))] - [EnumDataType(typeof(TypeOfSource))] - public TypeOfSource SourceType { get; set; } + [@Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_SourceType))] + [EnumDataType(typeof(TypeOfSource))] + public TypeOfSource SourceType { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_SourceDetails))] - [AllowHtml] - public string SourceDetails { get; set; } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_SourceDetails))] + [AllowHtml] + public string SourceDetails { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_LeakDate))] - [DisplayFormat(ConvertEmptyStringToNull = true, ApplyFormatInEditMode = true)] - public DateTime? LeakDate { get; set; } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_LeakDate))] + [DisplayFormat(ConvertEmptyStringToNull = true, ApplyFormatInEditMode = true)] + public DateTime? LeakDate { get; set; } - public string LabUrl { get; set; } + public string LabUrl { get; set; } - public bool IsLeaked => SourceType == TypeOfSource.PublicRelease || SourceType == TypeOfSource.InternalLeak || SourceType == TypeOfSource.UpdateGDR || SourceType == TypeOfSource.UpdateLDR; + public bool IsLeaked => SourceType == TypeOfSource.PublicRelease || SourceType == TypeOfSource.InternalLeak || SourceType == TypeOfSource.UpdateGDR || SourceType == TypeOfSource.UpdateLDR; - public string FullBuildString { get; set; } + public string FullBuildString { get; set; } - public string AlternateBuildString { get; set; } + public string AlternateBuildString { get; set; } - public ProjectFamily Family - { - get - { - if (Number >= 14800) + public ProjectFamily Family + { + get { - return ProjectFamily.Redstone2; + if (Number >= 14800) + { + return ProjectFamily.Redstone2; + } + if (Number >= 11000) + { + return ProjectFamily.Redstone; + } + if (Number >= 10500) + { + return ProjectFamily.Threshold2; + } + if (Number >= 9700) + { + return ProjectFamily.Threshold; + } + if (Number >= 9250) + { + return ProjectFamily.Windows81; + } + if (Number >= 7650) + { + return ProjectFamily.Windows8; + } + if (Number >= 6020) + { + return ProjectFamily.Windows7; + } + if (MajorVersion == 6 + && Number >= 5000) + { + return ProjectFamily.WindowsVista; + } + if (MajorVersion == 6) + { + return ProjectFamily.Longhorn; + } + if (MajorVersion == 5 + && Number >= 3000) + { + return ProjectFamily.Server2003; + } + if (MajorVersion == 5 + && Number >= 2205) + { + return ProjectFamily.WindowsXP; + } + if (MajorVersion == 5 + && MinorVersion == 50) + { + return ProjectFamily.Neptune; + } + if (MajorVersion == 5) + { + return ProjectFamily.Windows2000; + } + return ProjectFamily.None; } - if (Number >= 11000) - { - return ProjectFamily.Redstone; - } - if (Number >= 10500) - { - return ProjectFamily.Threshold2; - } - if (Number >= 9700) - { - return ProjectFamily.Threshold; - } - if (Number >= 9250) - { - return ProjectFamily.Windows81; - } - if (Number >= 7650) - { - return ProjectFamily.Windows8; - } - if (Number >= 6020) - { - return ProjectFamily.Windows7; - } - if (MajorVersion == 6 - && Number >= 5000) - { - return ProjectFamily.WindowsVista; - } - if (MajorVersion == 6) - { - return ProjectFamily.Longhorn; - } - if (MajorVersion == 5 - && Number >= 3000) - { - return ProjectFamily.Server2003; - } - if (MajorVersion == 5 - && Number >= 2205) - { - return ProjectFamily.WindowsXP; - } - if (MajorVersion == 5 - && MinorVersion == 50) - { - return ProjectFamily.Neptune; - } - if (MajorVersion == 5) - { - return ProjectFamily.Windows2000; - } - return ProjectFamily.None; - } - } + } - public string SourceDetailsFiltered - { - get - { - HtmlDocument hDoc = new HtmlDocument(); - hDoc.LoadHtml($"
{SourceDetails}
"); - - if (string.IsNullOrWhiteSpace(hDoc.DocumentNode.InnerText)) + public string SourceDetailsFiltered + { + get { - return ""; + HtmlDocument hDoc = new HtmlDocument(); + hDoc.LoadHtml($"
{SourceDetails}
"); + + if (string.IsNullOrWhiteSpace(hDoc.DocumentNode.InnerText)) + { + return ""; + } + + if (Uri.IsWellFormedUriString(hDoc.DocumentNode.InnerText, UriKind.Absolute)) + { + Uri uri = new Uri(hDoc.DocumentNode.InnerText, UriKind.Absolute); + return $"{VariantTerms.Model_ExternalLink} "; + } + + return SourceDetails; + } + } + + public string GenerateFullBuildString() + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{MajorVersion}.{MinorVersion}.{Number}"); + + if (Revision.HasValue) + { + sb.Append($".{Revision}"); } - if (Uri.IsWellFormedUriString(hDoc.DocumentNode.InnerText, UriKind.Absolute)) + if (!string.IsNullOrWhiteSpace(Lab)) { - Uri uri = new Uri(hDoc.DocumentNode.InnerText, UriKind.Absolute); - return $"{VariantTerms.Model_ExternalLink} "; + sb.Append($".{Lab}"); } - return SourceDetails; - } - } - - public string GenerateFullBuildString() - { - StringBuilder sb = new StringBuilder(); - sb.Append($"{MajorVersion}.{MinorVersion}.{Number}"); - - if (Revision.HasValue) - { - sb.Append($".{Revision}"); - } - - if (!string.IsNullOrWhiteSpace(Lab)) - { - sb.Append($".{Lab}"); - } - - if (BuildTime.HasValue) - { - sb.Append($".{BuildTime.Value.ToString("yyMMdd-HHmm", CultureInfo.InvariantCulture.DateTimeFormat)}"); - } - - return sb.ToString(); - } - - public string GenerateAlternateBuildString() - { - StringBuilder sb = new StringBuilder(); - sb.Append($"{MajorVersion}.{MinorVersion}.{Number}"); - - if (Revision.HasValue) - { - sb.Append($".{Revision}"); - } - - if (!string.IsNullOrWhiteSpace(Lab)) - { - sb.Append($" ({Lab}"); - if (BuildTime.HasValue) { - sb.Append($".{BuildTime.Value.ToString("yyMMdd-HHmm", CultureInfo.InvariantCulture.DateTimeFormat)}"); + sb.Append($".{BuildTime.Value.ToString("yyMMdd-HHmm", CultureInfo.InvariantCulture.DateTimeFormat)}"); } - sb.Append(")"); - } + return sb.ToString(); + } - return sb.ToString(); - } + public string GenerateAlternateBuildString() + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{MajorVersion}.{MinorVersion}.{Number}"); - public string GenerateLabUrl() => !string.IsNullOrEmpty(Lab) - ? Lab.Replace('/', '-').ToLower() - : ""; - } + if (Revision.HasValue) + { + sb.Append($".{Revision}"); + } + + if (!string.IsNullOrWhiteSpace(Lab)) + { + sb.Append($" ({Lab}"); + + if (BuildTime.HasValue) + { + sb.Append($".{BuildTime.Value.ToString("yyMMdd-HHmm", CultureInfo.InvariantCulture.DateTimeFormat)}"); + } + + sb.Append(")"); + } + + return sb.ToString(); + } + + public string GenerateLabUrl() => !string.IsNullOrEmpty(Lab) + ? Lab.Replace('/', '-').ToLower() + : ""; + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildGroup.cs b/BuildFeed.Model/BuildGroup.cs index a90496d..d212c51 100644 --- a/BuildFeed.Model/BuildGroup.cs +++ b/BuildFeed.Model/BuildGroup.cs @@ -1,14 +1,14 @@ namespace BuildFeed.Model { - public struct BuildGroup - { - public uint Major { get; set; } - public uint Minor { get; set; } - public uint Build { get; set; } - public uint? Revision { get; set; } + public struct BuildGroup + { + public uint Major { get; set; } + public uint Minor { get; set; } + public uint Build { get; set; } + public uint? Revision { get; set; } - public override string ToString() => Revision.HasValue - ? $"{Major}.{Minor}.{Build}.{Revision.Value}" - : $"{Major}.{Minor}.{Build}"; - } + public override string ToString() => Revision.HasValue + ? $"{Major}.{Minor}.{Build}.{Revision.Value}" + : $"{Major}.{Minor}.{Build}"; + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildRepository-Group.cs b/BuildFeed.Model/BuildRepository-Group.cs index cbbacb7..670ac05 100644 --- a/BuildFeed.Model/BuildRepository-Group.cs +++ b/BuildFeed.Model/BuildRepository-Group.cs @@ -7,95 +7,95 @@ using MongoDB.Driver; namespace BuildFeed.Model { - public partial class BuildRepository - { - public async Task SelectAllGroups(int limit = -1, int skip = 0) - { - IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument - { - new BsonElement("_id", - new BsonDocument - { - new BsonElement(nameof(BuildGroup.Major), $"${nameof(Build.MajorVersion)}"), - new BsonElement(nameof(BuildGroup.Minor), $"${nameof(Build.MinorVersion)}"), - new BsonElement(nameof(BuildGroup.Build), $"${nameof(Build.Number)}"), - new BsonElement(nameof(BuildGroup.Revision), $"${nameof(Build.Revision)}") - }), - new BsonElement("date", new BsonDocument("$max", $"${nameof(Build.BuildTime)}")), - new BsonElement("count", new BsonDocument("$sum", 1)) - }).Sort(new BsonDocument - { - new BsonElement($"_id.{nameof(BuildGroup.Major)}", -1), - new BsonElement($"_id.{nameof(BuildGroup.Minor)}", -1), - new BsonElement($"_id.{nameof(BuildGroup.Build)}", -1), - new BsonElement($"_id.{nameof(BuildGroup.Revision)}", -1) - }).Skip(skip); - - if (limit > 0) - { - query = query.Limit(limit); - } - - List grouping = await query.ToListAsync(); - - return (from g in grouping - select new FrontBuildGroup - { - Key = new BuildGroup + public partial class BuildRepository + { + public async Task SelectAllGroups(int limit = -1, int skip = 0) + { + IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument + { + new BsonElement("_id", + new BsonDocument { - Major = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Major)].AsInt32, - Minor = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Minor)].AsInt32, - Build = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Build)].AsInt32, - Revision = (uint?)g["_id"].AsBsonDocument[nameof(BuildGroup.Revision)].AsNullableInt32 - }, - LastBuild = g["date"].ToNullableUniversalTime(), - BuildCount = g["count"].AsInt32 - }).ToArray(); - } + new BsonElement(nameof(BuildGroup.Major), $"${nameof(Build.MajorVersion)}"), + new BsonElement(nameof(BuildGroup.Minor), $"${nameof(Build.MinorVersion)}"), + new BsonElement(nameof(BuildGroup.Build), $"${nameof(Build.Number)}"), + new BsonElement(nameof(BuildGroup.Revision), $"${nameof(Build.Revision)}") + }), + new BsonElement("date", new BsonDocument("$max", $"${nameof(Build.BuildTime)}")), + new BsonElement("count", new BsonDocument("$sum", 1)) + }).Sort(new BsonDocument + { + new BsonElement($"_id.{nameof(BuildGroup.Major)}", -1), + new BsonElement($"_id.{nameof(BuildGroup.Minor)}", -1), + new BsonElement($"_id.{nameof(BuildGroup.Build)}", -1), + new BsonElement($"_id.{nameof(BuildGroup.Revision)}", -1) + }).Skip(skip); - public async Task SelectAllGroupsCount() - { - List grouping = await _buildCollection.Aggregate().Group(new BsonDocument - { - new BsonElement("_id", - new BsonDocument - { - new BsonElement(nameof(BuildGroup.Major), $"${nameof(Build.MajorVersion)}"), - new BsonElement(nameof(BuildGroup.Minor), $"${nameof(Build.MinorVersion)}"), - new BsonElement(nameof(BuildGroup.Build), $"${nameof(Build.Number)}"), - new BsonElement(nameof(BuildGroup.Revision), $"${nameof(Build.Revision)}") - }) - }).ToListAsync(); - return grouping.Count; - } + if (limit > 0) + { + query = query.Limit(limit); + } - public async Task> SelectGroup(BuildGroup group, int limit = -1, int skip = 0) - { - IFindFluent query = _buildCollection.Find(new BsonDocument - { + List grouping = await query.ToListAsync(); + + return (from g in grouping + select new FrontBuildGroup + { + Key = new BuildGroup + { + Major = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Major)].AsInt32, + Minor = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Minor)].AsInt32, + Build = (uint)g["_id"].AsBsonDocument[nameof(BuildGroup.Build)].AsInt32, + Revision = (uint?)g["_id"].AsBsonDocument[nameof(BuildGroup.Revision)].AsNullableInt32 + }, + LastBuild = g["date"].ToNullableUniversalTime(), + BuildCount = g["count"].AsInt32 + }).ToArray(); + } + + public async Task SelectAllGroupsCount() + { + List grouping = await _buildCollection.Aggregate().Group(new BsonDocument + { + new BsonElement("_id", + new BsonDocument + { + new BsonElement(nameof(BuildGroup.Major), $"${nameof(Build.MajorVersion)}"), + new BsonElement(nameof(BuildGroup.Minor), $"${nameof(Build.MinorVersion)}"), + new BsonElement(nameof(BuildGroup.Build), $"${nameof(Build.Number)}"), + new BsonElement(nameof(BuildGroup.Revision), $"${nameof(Build.Revision)}") + }) + }).ToListAsync(); + return grouping.Count; + } + + public async Task> SelectGroup(BuildGroup group, int limit = -1, int skip = 0) + { + IFindFluent query = _buildCollection.Find(new BsonDocument + { + new BsonElement(nameof(Build.MajorVersion), group.Major), + new BsonElement(nameof(Build.MinorVersion), group.Minor), + new BsonElement(nameof(Build.Number), group.Build), + new BsonElement(nameof(Build.Revision), group.Revision) + }).Sort(new BsonDocument + { + new BsonElement(nameof(Build.BuildTime), 1) + }).Skip(skip); + + if (limit > 0) + { + query = query.Limit(limit); + } + + return await query.ToListAsync(); + } + + public async Task SelectGroupCount(BuildGroup group) => await _buildCollection.CountAsync(new BsonDocument + { new BsonElement(nameof(Build.MajorVersion), group.Major), new BsonElement(nameof(Build.MinorVersion), group.Minor), new BsonElement(nameof(Build.Number), group.Build), new BsonElement(nameof(Build.Revision), group.Revision) - }).Sort(new BsonDocument - { - new BsonElement(nameof(Build.BuildTime), 1) - }).Skip(skip); - - if (limit > 0) - { - query = query.Limit(limit); - } - - return await query.ToListAsync(); - } - - public async Task SelectGroupCount(BuildGroup group) => await _buildCollection.CountAsync(new BsonDocument - { - new BsonElement(nameof(Build.MajorVersion), @group.Major), - new BsonElement(nameof(Build.MinorVersion), @group.Minor), - new BsonElement(nameof(Build.Number), @group.Build), - new BsonElement(nameof(Build.Revision), @group.Revision) - }); - } + }); + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildRepository-Lab.cs b/BuildFeed.Model/BuildRepository-Lab.cs index b1399d0..4125cd8 100644 --- a/BuildFeed.Model/BuildRepository-Lab.cs +++ b/BuildFeed.Model/BuildRepository-Lab.cs @@ -7,70 +7,70 @@ using MongoDB.Driver; namespace BuildFeed.Model { - public partial class BuildRepository - { - public async Task SelectAllLabs(int limit = -1, int skip = 0) - { - IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", $"${nameof(Build.Lab)}")).Sort(new BsonDocument("_id", 1)).Skip(skip); + public partial class BuildRepository + { + public async Task SelectAllLabs(int limit = -1, int skip = 0) + { + IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", $"${nameof(Build.Lab)}")).Sort(new BsonDocument("_id", 1)).Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } + if (limit > 0) + { + query = query.Limit(limit); + } - List grouping = await query.ToListAsync(); + List grouping = await query.ToListAsync(); - return (from g in grouping - where !g["_id"].IsBsonNull - select g["_id"].AsString).ToArray(); - } + return (from g in grouping + where !g["_id"].IsBsonNull + select g["_id"].AsString).ToArray(); + } - public async Task SelectLabsForVersion(int major, int minor) - { - IAggregateFluent query = _buildCollection.Aggregate().Match(new BsonDocument - { - new BsonElement(nameof(Build.MajorVersion), major), - new BsonElement(nameof(Build.MinorVersion), minor) - }).Group(new BsonDocument("_id", $"${nameof(Build.Lab)}")).Sort(new BsonDocument("_id", 1)); + public async Task SelectLabsForVersion(int major, int minor) + { + IAggregateFluent query = _buildCollection.Aggregate().Match(new BsonDocument + { + new BsonElement(nameof(Build.MajorVersion), major), + new BsonElement(nameof(Build.MinorVersion), minor) + }).Group(new BsonDocument("_id", $"${nameof(Build.Lab)}")).Sort(new BsonDocument("_id", 1)); - List grouping = await query.ToListAsync(); + List grouping = await query.ToListAsync(); - return (from g in grouping - where !g["_id"].IsBsonNull - select g["_id"].AsString).ToArray(); - } + return (from g in grouping + where !g["_id"].IsBsonNull + select g["_id"].AsString).ToArray(); + } - public async Task> SearchLabs(string search) - { - List> result = await _buildCollection.Aggregate().Match(b => b.Lab != null).Match(b => b.Lab != "").Match(b => b.Lab.ToLower().Contains(search.ToLower())).Group(b => b.Lab.ToLower(), - // incoming bullshit hack - bg => new Tuple(bg.Key)).ToListAsync(); + public async Task> SearchLabs(string search) + { + List> result = await _buildCollection.Aggregate().Match(b => b.Lab != null).Match(b => b.Lab != "").Match(b => b.Lab.ToLower().Contains(search.ToLower())).Group(b => b.Lab.ToLower(), + // incoming bullshit hack + bg => new Tuple(bg.Key)).ToListAsync(); - // work ourselves out of aforementioned bullshit hack - return result.Select(b => b.Item1).ToList(); - } + // work ourselves out of aforementioned bullshit hack + return result.Select(b => b.Item1).ToList(); + } - public async Task SelectAllLabsCount() - { - IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", new BsonDocument(nameof(Build.Lab), $"${nameof(Build.Lab)}"))).Sort(new BsonDocument("_id", 1)); + public async Task SelectAllLabsCount() + { + IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", new BsonDocument(nameof(Build.Lab), $"${nameof(Build.Lab)}"))).Sort(new BsonDocument("_id", 1)); - List grouping = await query.ToListAsync(); + List grouping = await query.ToListAsync(); - return grouping.Count; - } + return grouping.Count; + } - public async Task> SelectLab(string lab, int limit = -1, int skip = 0) - { - IFindFluent query = _buildCollection.Find(new BsonDocument(nameof(Build.LabUrl), lab)).Sort(sortByCompileDate).Skip(skip); + public async Task> SelectLab(string lab, int limit = -1, int skip = 0) + { + IFindFluent query = _buildCollection.Find(new BsonDocument(nameof(Build.LabUrl), lab)).Sort(sortByCompileDate).Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } + if (limit > 0) + { + query = query.Limit(limit); + } - return await query.ToListAsync(); - } + return await query.ToListAsync(); + } - public async Task SelectLabCount(string lab) => await _buildCollection.CountAsync(new BsonDocument(nameof(Build.LabUrl), lab)); - } + public async Task SelectLabCount(string lab) => await _buildCollection.CountAsync(new BsonDocument(nameof(Build.LabUrl), lab)); + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildRepository-Source.cs b/BuildFeed.Model/BuildRepository-Source.cs index 5ab73fe..fc75081 100644 --- a/BuildFeed.Model/BuildRepository-Source.cs +++ b/BuildFeed.Model/BuildRepository-Source.cs @@ -6,24 +6,24 @@ using MongoDB.Driver; namespace BuildFeed.Model { - public partial class BuildRepository - { - public Task SelectAllSources(int limit = -1, int skip = 0) => Task.Run(() => Enum.GetValues(typeof(TypeOfSource)) as TypeOfSource[]); + public partial class BuildRepository + { + public Task SelectAllSources(int limit = -1, int skip = 0) => Task.Run(() => Enum.GetValues(typeof(TypeOfSource)) as TypeOfSource[]); - public Task SelectAllSourcesCount() => Task.Run(() => Enum.GetValues(typeof(TypeOfSource)).LongLength); + public Task SelectAllSourcesCount() => Task.Run(() => Enum.GetValues(typeof(TypeOfSource)).LongLength); - public async Task> SelectSource(TypeOfSource source, int limit = -1, int skip = 0) - { - IFindFluent query = _buildCollection.Find(new BsonDocument(nameof(Build.SourceType), source)).Sort(sortByOrder).Skip(skip); + public async Task> SelectSource(TypeOfSource source, int limit = -1, int skip = 0) + { + IFindFluent query = _buildCollection.Find(new BsonDocument(nameof(Build.SourceType), source)).Sort(sortByOrder).Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } + if (limit > 0) + { + query = query.Limit(limit); + } - return await query.ToListAsync(); - } + return await query.ToListAsync(); + } - public async Task SelectSourceCount(TypeOfSource source) => await _buildCollection.CountAsync(new BsonDocument(nameof(Build.SourceType), source)); - } + public async Task SelectSourceCount(TypeOfSource source) => await _buildCollection.CountAsync(new BsonDocument(nameof(Build.SourceType), source)); + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildRepository-Version.cs b/BuildFeed.Model/BuildRepository-Version.cs index 71474c7..353e844 100644 --- a/BuildFeed.Model/BuildRepository-Version.cs +++ b/BuildFeed.Model/BuildRepository-Version.cs @@ -6,67 +6,67 @@ using MongoDB.Driver; namespace BuildFeed.Model { - public partial class BuildRepository - { - public async Task SelectAllVersions(int limit = -1, int skip = 0) - { - IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", - new BsonDocument + public partial class BuildRepository + { + public async Task SelectAllVersions(int limit = -1, int skip = 0) + { + IAggregateFluent query = _buildCollection.Aggregate().Group(new BsonDocument("_id", + new BsonDocument + { + new BsonElement(nameof(BuildVersion.Major), $"${nameof(Build.MajorVersion)}"), + new BsonElement(nameof(BuildVersion.Minor), $"${nameof(Build.MinorVersion)}") + })).Sort(new BsonDocument { - new BsonElement(nameof(BuildVersion.Major), $"${nameof(Build.MajorVersion)}"), - new BsonElement(nameof(BuildVersion.Minor), $"${nameof(Build.MinorVersion)}") - })).Sort(new BsonDocument - { - new BsonElement($"_id.{nameof(BuildVersion.Major)}", -1), - new BsonElement($"_id.{nameof(BuildVersion.Minor)}", -1) - }).Skip(skip); + new BsonElement($"_id.{nameof(BuildVersion.Major)}", -1), + new BsonElement($"_id.{nameof(BuildVersion.Minor)}", -1) + }).Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } - - List grouping = await query.ToListAsync(); - - return (from g in grouping - select new BuildVersion - { - Major = (uint)g["_id"].AsBsonDocument[nameof(BuildVersion.Major)].AsInt32, - Minor = (uint)g["_id"].AsBsonDocument[nameof(BuildVersion.Minor)].AsInt32 - }).ToArray(); - } - - public async Task SelectAllVersionsCount() - { - List query = await _buildCollection.Aggregate().Group(new BsonDocument("_id", - new BsonDocument + if (limit > 0) { - new BsonElement(nameof(BuildVersion.Major), $"${nameof(Build.MajorVersion)}"), - new BsonElement(nameof(BuildVersion.Minor), $"${nameof(Build.MinorVersion)}") - })).ToListAsync(); - return query.Count; - } + query = query.Limit(limit); + } - public async Task> SelectVersion(uint major, uint minor, int limit = -1, int skip = 0) - { - IFindFluent query = _buildCollection.Find(new BsonDocument - { + List grouping = await query.ToListAsync(); + + return (from g in grouping + select new BuildVersion + { + Major = (uint)g["_id"].AsBsonDocument[nameof(BuildVersion.Major)].AsInt32, + Minor = (uint)g["_id"].AsBsonDocument[nameof(BuildVersion.Minor)].AsInt32 + }).ToArray(); + } + + public async Task SelectAllVersionsCount() + { + List query = await _buildCollection.Aggregate().Group(new BsonDocument("_id", + new BsonDocument + { + new BsonElement(nameof(BuildVersion.Major), $"${nameof(Build.MajorVersion)}"), + new BsonElement(nameof(BuildVersion.Minor), $"${nameof(Build.MinorVersion)}") + })).ToListAsync(); + return query.Count; + } + + public async Task> SelectVersion(uint major, uint minor, int limit = -1, int skip = 0) + { + IFindFluent query = _buildCollection.Find(new BsonDocument + { + new BsonElement(nameof(Build.MajorVersion), major), + new BsonElement(nameof(Build.MinorVersion), minor) + }).Sort(sortByOrder).Skip(skip); + + if (limit > 0) + { + query = query.Limit(limit); + } + + return await query.ToListAsync(); + } + + public async Task SelectVersionCount(uint major, uint minor) => await _buildCollection.CountAsync(new BsonDocument + { new BsonElement(nameof(Build.MajorVersion), major), new BsonElement(nameof(Build.MinorVersion), minor) - }).Sort(sortByOrder).Skip(skip); - - if (limit > 0) - { - query = query.Limit(limit); - } - - return await query.ToListAsync(); - } - - public async Task SelectVersionCount(uint major, uint minor) => await _buildCollection.CountAsync(new BsonDocument - { - new BsonElement(nameof(Build.MajorVersion), major), - new BsonElement(nameof(Build.MinorVersion), minor) - }); - } + }); + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildRepository-Year.cs b/BuildFeed.Model/BuildRepository-Year.cs index 0ebd77d..4ade8e0 100644 --- a/BuildFeed.Model/BuildRepository-Year.cs +++ b/BuildFeed.Model/BuildRepository-Year.cs @@ -7,54 +7,54 @@ using MongoDB.Driver; namespace BuildFeed.Model { - public partial class BuildRepository - { - public async Task SelectAllYears(int limit = -1, int skip = 0) - { - IAggregateFluent query = - _buildCollection.Aggregate() - .Match(Builders.Filter.Ne(b => b.BuildTime, null)) - .Group(new BsonDocument("_id", new BsonDocument("$year", $"${nameof(Build.BuildTime)}"))) - .Sort(new BsonDocument("_id", -1)) - .Skip(skip); + public partial class BuildRepository + { + public async Task SelectAllYears(int limit = -1, int skip = 0) + { + IAggregateFluent query = + _buildCollection.Aggregate() + .Match(Builders.Filter.Ne(b => b.BuildTime, null)) + .Group(new BsonDocument("_id", new BsonDocument("$year", $"${nameof(Build.BuildTime)}"))) + .Sort(new BsonDocument("_id", -1)) + .Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } + if (limit > 0) + { + query = query.Limit(limit); + } - List grouping = await query.ToListAsync(); + List grouping = await query.ToListAsync(); - return (from g in grouping - where !g["_id"].IsBsonNull - select g["_id"].AsInt32).ToArray(); - } + return (from g in grouping + where !g["_id"].IsBsonNull + select g["_id"].AsInt32).ToArray(); + } - public async Task SelectAllYearsCount() - { - List query = await _buildCollection.Aggregate().Match(Builders.Filter.Ne(b => b.BuildTime, null)).Group(new BsonDocument("_id", new BsonDocument("$year", $"${nameof(Build.BuildTime)}"))).ToListAsync(); + public async Task SelectAllYearsCount() + { + List query = await _buildCollection.Aggregate().Match(Builders.Filter.Ne(b => b.BuildTime, null)).Group(new BsonDocument("_id", new BsonDocument("$year", $"${nameof(Build.BuildTime)}"))).ToListAsync(); - return query.Count; - } + return query.Count; + } - public async Task> SelectYear(int year, int limit = -1, int skip = 0) - { - IFindFluent query = - _buildCollection.Find(Builders.Filter.And(Builders.Filter.Gte(b => b.BuildTime, new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Utc)), - Builders.Filter.Lte(b => b.BuildTime, new DateTime(year, 12, 31, 23, 59, 59, DateTimeKind.Utc)))).Sort(sortByCompileDate).Skip(skip); + public async Task> SelectYear(int year, int limit = -1, int skip = 0) + { + IFindFluent query = + _buildCollection.Find(Builders.Filter.And(Builders.Filter.Gte(b => b.BuildTime, new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Utc)), + Builders.Filter.Lte(b => b.BuildTime, new DateTime(year, 12, 31, 23, 59, 59, DateTimeKind.Utc)))).Sort(sortByCompileDate).Skip(skip); - if (limit > 0) - { - query = query.Limit(limit); - } + if (limit > 0) + { + query = query.Limit(limit); + } - return await query.ToListAsync(); - } + return await query.ToListAsync(); + } - public async Task SelectYearCount(int year) - => - await - _buildCollection.CountAsync(Builders.Filter.And(Builders.Filter.Gte(b => b.BuildTime, new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Utc)), - Builders.Filter.Lte(b => b.BuildTime, new DateTime(year, 12, 31, 23, 59, 59, DateTimeKind.Utc)))); - } + public async Task SelectYearCount(int year) + => + await + _buildCollection.CountAsync(Builders.Filter.And(Builders.Filter.Gte(b => b.BuildTime, new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Utc)), + Builders.Filter.Lte(b => b.BuildTime, new DateTime(year, 12, 31, 23, 59, 59, DateTimeKind.Utc)))); + } } \ No newline at end of file diff --git a/BuildFeed.Model/BuildVersion.cs b/BuildFeed.Model/BuildVersion.cs index cfda2d9..c381b65 100644 --- a/BuildFeed.Model/BuildVersion.cs +++ b/BuildFeed.Model/BuildVersion.cs @@ -1,16 +1,16 @@ namespace BuildFeed.Model { - public struct BuildVersion - { - public uint Major { get; set; } - public uint Minor { get; set; } + public struct BuildVersion + { + public uint Major { get; set; } + public uint Minor { get; set; } - public BuildVersion(uint major, uint minor) - { - Major = major; - Minor = minor; - } + public BuildVersion(uint major, uint minor) + { + Major = major; + Minor = minor; + } - public override string ToString() => $"{Major}.{Minor}"; - } + public override string ToString() => $"{Major}.{Minor}"; + } } \ No newline at end of file diff --git a/BuildFeed.Model/MetaItem.cs b/BuildFeed.Model/MetaItem.cs index faac284..db94127 100644 --- a/BuildFeed.Model/MetaItem.cs +++ b/BuildFeed.Model/MetaItem.cs @@ -12,156 +12,156 @@ using Required = System.ComponentModel.DataAnnotations.RequiredAttribute; namespace BuildFeed.Model { - [DataObject] - public class MetaItemModel - { - [Key] - [BsonId] - [@Required] - public MetaItemKey Id { get; set; } + [DataObject] + public class MetaItemModel + { + [Key] + [BsonId] + [@Required] + public MetaItemKey Id { get; set; } - [DisplayName("Meta Description")] - public string MetaDescription { get; set; } + [DisplayName("Meta Description")] + public string MetaDescription { get; set; } - [DisplayName("Page Content")] - [AllowHtml] - public string PageContent { get; set; } - } + [DisplayName("Page Content")] + [AllowHtml] + public string PageContent { get; set; } + } - public class MetaItem - { - private const string META_COLLECTION_NAME = "metaitem"; - private readonly BuildRepository _bModel; + public class MetaItem + { + private const string META_COLLECTION_NAME = "metaitem"; + private readonly BuildRepository _bModel; - private readonly IMongoCollection _metaCollection; + private readonly IMongoCollection _metaCollection; - public MetaItem() - { - MongoClientSettings settings = new MongoClientSettings - { - Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port) - }; - - if (!string.IsNullOrEmpty(MongoConfig.Username) && !string.IsNullOrEmpty(MongoConfig.Password)) - { - settings.Credentials = new List + public MetaItem() + { + MongoClientSettings settings = new MongoClientSettings { - MongoCredential.CreateCredential(MongoConfig.Database, MongoConfig.Username, MongoConfig.Password) + Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port) }; - } - MongoClient dbClient = new MongoClient(settings); + if (!string.IsNullOrEmpty(MongoConfig.Username) && !string.IsNullOrEmpty(MongoConfig.Password)) + { + settings.Credentials = new List + { + MongoCredential.CreateCredential(MongoConfig.Database, MongoConfig.Username, MongoConfig.Password) + }; + } - _metaCollection = dbClient.GetDatabase(MongoConfig.Database).GetCollection(META_COLLECTION_NAME); - _bModel = new BuildRepository(); - } + MongoClient dbClient = new MongoClient(settings); - [DataObjectMethod(DataObjectMethodType.Select, false)] - public async Task> Select() - { - return await _metaCollection.Find(new BsonDocument()).ToListAsync(); - } + _metaCollection = dbClient.GetDatabase(MongoConfig.Database).GetCollection(META_COLLECTION_NAME); + _bModel = new BuildRepository(); + } - [DataObjectMethod(DataObjectMethodType.Select, true)] - public async Task> SelectByType(MetaType type) - { - return await _metaCollection.Find(f => f.Id.Type == type).ToListAsync(); - } + [DataObjectMethod(DataObjectMethodType.Select, false)] + public async Task> Select() + { + return await _metaCollection.Find(new BsonDocument()).ToListAsync(); + } - [DataObjectMethod(DataObjectMethodType.Select, false)] - public async Task SelectById(MetaItemKey id) - { - return await _metaCollection.Find(f => (f.Id.Type == id.Type) && (f.Id.Value == id.Value)).SingleOrDefaultAsync(); - } + [DataObjectMethod(DataObjectMethodType.Select, true)] + public async Task> SelectByType(MetaType type) + { + return await _metaCollection.Find(f => f.Id.Type == type).ToListAsync(); + } - [DataObjectMethod(DataObjectMethodType.Select, false)] - public async Task> SelectUnusedLabs() - { - string[] labs = await _bModel.SelectAllLabs(); + [DataObjectMethod(DataObjectMethodType.Select, false)] + public async Task SelectById(MetaItemKey id) + { + return await _metaCollection.Find(f => f.Id.Type == id.Type && f.Id.Value == id.Value).SingleOrDefaultAsync(); + } - List usedLabs = await _metaCollection.Find(f => f.Id.Type == MetaType.Lab).ToListAsync(); + [DataObjectMethod(DataObjectMethodType.Select, false)] + public async Task> SelectUnusedLabs() + { + string[] labs = await _bModel.SelectAllLabs(); - return from l in labs - where usedLabs.All(ul => ul.Id.Value != l) - select l; - } + List usedLabs = await _metaCollection.Find(f => f.Id.Type == MetaType.Lab).ToListAsync(); - [DataObjectMethod(DataObjectMethodType.Select, false)] - public async Task> SelectUnusedVersions() - { - BuildVersion[] versions = await _bModel.SelectAllVersions(); + return from l in labs + where usedLabs.All(ul => ul.Id.Value != l) + select l; + } - List usedVersions = await _metaCollection.Find(f => f.Id.Type == MetaType.Version).ToListAsync(); + [DataObjectMethod(DataObjectMethodType.Select, false)] + public async Task> SelectUnusedVersions() + { + BuildVersion[] versions = await _bModel.SelectAllVersions(); - return from v in versions - where usedVersions.All(ul => ul.Id.Value != v.ToString()) - select v.ToString(); - } + List usedVersions = await _metaCollection.Find(f => f.Id.Type == MetaType.Version).ToListAsync(); - [DataObjectMethod(DataObjectMethodType.Select, false)] - public async Task> SelectUnusedYears() - { - int[] years = await _bModel.SelectAllYears(); + return from v in versions + where usedVersions.All(ul => ul.Id.Value != v.ToString()) + select v.ToString(); + } - List usedYears = await _metaCollection.Find(f => f.Id.Type == MetaType.Year).ToListAsync(); + [DataObjectMethod(DataObjectMethodType.Select, false)] + public async Task> SelectUnusedYears() + { + int[] years = await _bModel.SelectAllYears(); - return from y in years - where usedYears.All(ul => ul.Id.Value != y.ToString()) - select y.ToString(); - } + List usedYears = await _metaCollection.Find(f => f.Id.Type == MetaType.Year).ToListAsync(); - [DataObjectMethod(DataObjectMethodType.Insert, true)] - public async Task Insert(MetaItemModel item) - { - await _metaCollection.InsertOneAsync(item); - } + return from y in years + where usedYears.All(ul => ul.Id.Value != y.ToString()) + select y.ToString(); + } - [DataObjectMethod(DataObjectMethodType.Update, true)] - public async Task Update(MetaItemModel item) - { - await _metaCollection.ReplaceOneAsync(f => (f.Id.Type == item.Id.Type) && (f.Id.Value == item.Id.Value), item); - } + [DataObjectMethod(DataObjectMethodType.Insert, true)] + public async Task Insert(MetaItemModel item) + { + await _metaCollection.InsertOneAsync(item); + } - [DataObjectMethod(DataObjectMethodType.Insert, false)] - public async Task InsertAll(IEnumerable items) - { - await _metaCollection.InsertManyAsync(items); - } + [DataObjectMethod(DataObjectMethodType.Update, true)] + public async Task Update(MetaItemModel item) + { + await _metaCollection.ReplaceOneAsync(f => f.Id.Type == item.Id.Type && f.Id.Value == item.Id.Value, item); + } - [DataObjectMethod(DataObjectMethodType.Delete, true)] - public async Task DeleteById(MetaItemKey id) - { - await _metaCollection.DeleteOneAsync(f => (f.Id.Type == id.Type) && (f.Id.Value == id.Value)); - } - } + [DataObjectMethod(DataObjectMethodType.Insert, false)] + public async Task InsertAll(IEnumerable items) + { + await _metaCollection.InsertManyAsync(items); + } - public class MetaItemKey - { - public MetaType Type { get; set; } - public string Value { get; set; } + [DataObjectMethod(DataObjectMethodType.Delete, true)] + public async Task DeleteById(MetaItemKey id) + { + await _metaCollection.DeleteOneAsync(f => f.Id.Type == id.Type && f.Id.Value == id.Value); + } + } - public MetaItemKey() - { - } + public class MetaItemKey + { + public MetaType Type { get; set; } + public string Value { get; set; } - public MetaItemKey(string id) - { - string[] items = id.Split(':'); - Type = (MetaType)Enum.Parse(typeof(MetaType), items[0]); - Value = items[1]; - } + public MetaItemKey() + { + } - public override string ToString() - { - return $"{Type}:{Value}"; - } - } + public MetaItemKey(string id) + { + string[] items = id.Split(':'); + Type = (MetaType)Enum.Parse(typeof(MetaType), items[0]); + Value = items[1]; + } - public enum MetaType - { - Lab, - Version, - Source, - Year - } + public override string ToString() + { + return $"{Type}:{Value}"; + } + } + + public enum MetaType + { + Lab, + Version, + Source, + Year + } } \ No newline at end of file diff --git a/BuildFeed.Model/MongoConfig.cs b/BuildFeed.Model/MongoConfig.cs index 4d2657d..56e0d07 100644 --- a/BuildFeed.Model/MongoConfig.cs +++ b/BuildFeed.Model/MongoConfig.cs @@ -2,40 +2,40 @@ namespace BuildFeed.Model { - public static class MongoConfig - { - public static string Host { get; } - public static int Port { get; } - public static string Database { get; } - public static string Username { get; } - public static string Password { get; } + public static class MongoConfig + { + public static string Host { get; } + public static int Port { get; } + public static string Database { get; } + public static string Username { get; } + public static string Password { get; } - static MongoConfig() - { - Host = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoHost"]) - ? ConfigurationManager.AppSettings["data:MongoHost"] - : "localhost"; + static MongoConfig() + { + Host = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoHost"]) + ? ConfigurationManager.AppSettings["data:MongoHost"] + : "localhost"; - int _port; - bool success = int.TryParse(ConfigurationManager.AppSettings["data:MongoPort"], out _port); - if (!success) - { - _port = 27017; // mongo default port - } - Port = _port; + int _port; + bool success = int.TryParse(ConfigurationManager.AppSettings["data:MongoPort"], out _port); + if (!success) + { + _port = 27017; // mongo default port + } + Port = _port; - Database = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoDB"]) - ? ConfigurationManager.AppSettings["data:MongoDB"] - : "MongoAuth"; + Database = !string.IsNullOrEmpty(ConfigurationManager.AppSettings["data:MongoDB"]) + ? ConfigurationManager.AppSettings["data:MongoDB"] + : "MongoAuth"; - Username = ConfigurationManager.AppSettings["data:MongoUser"] ?? ""; - Password = ConfigurationManager.AppSettings["data:MongoPass"] ?? ""; - } + Username = ConfigurationManager.AppSettings["data:MongoUser"] ?? ""; + Password = ConfigurationManager.AppSettings["data:MongoPass"] ?? ""; + } - public static void SetupIndexes() - { - BuildRepository b = new BuildRepository(); - b.SetupIndexes(); - } - } + public static void SetupIndexes() + { + BuildRepository b = new BuildRepository(); + b.SetupIndexes(); + } + } } \ No newline at end of file diff --git a/BuildFeed.Model/ProjectFamily.cs b/BuildFeed.Model/ProjectFamily.cs index 1f42e21..b52e3b7 100644 --- a/BuildFeed.Model/ProjectFamily.cs +++ b/BuildFeed.Model/ProjectFamily.cs @@ -2,47 +2,47 @@ namespace BuildFeed.Model { - public enum ProjectFamily - { - None, + public enum ProjectFamily + { + None, - [Display(Name = "Windows 2000")] - Windows2000, + [Display(Name = "Windows 2000")] + Windows2000, - [Display(Name = "Neptune")] - Neptune, + [Display(Name = "Neptune")] + Neptune, - [Display(Name = "Windows XP")] - WindowsXP, + [Display(Name = "Windows XP")] + WindowsXP, - [Display(Name = "Server 2003")] - Server2003, + [Display(Name = "Server 2003")] + Server2003, - [Display(Name = "Longhorn")] - Longhorn, + [Display(Name = "Longhorn")] + Longhorn, - [Display(Name = "Vista")] - WindowsVista, + [Display(Name = "Vista")] + WindowsVista, - [Display(Name = "Windows 7")] - Windows7, + [Display(Name = "Windows 7")] + Windows7, - [Display(Name = "Windows 8")] - Windows8, + [Display(Name = "Windows 8")] + Windows8, - [Display(Name = "Windows 8.1")] - Windows81, + [Display(Name = "Windows 8.1")] + Windows81, - [Display(Name = "Threshold")] - Threshold, + [Display(Name = "Threshold")] + Threshold, - [Display(Name = "Threshold 2")] - Threshold2, + [Display(Name = "Threshold 2")] + Threshold2, - [Display(Name = "Redstone")] - Redstone, + [Display(Name = "Redstone")] + Redstone, - [Display(Name = "Redstone 2")] - Redstone2 - } + [Display(Name = "Redstone 2")] + Redstone2 + } } \ No newline at end of file diff --git a/BuildFeed.Model/Properties/AssemblyInfo.cs b/BuildFeed.Model/Properties/AssemblyInfo.cs index 9b23247..084fe90 100644 --- a/BuildFeed.Model/Properties/AssemblyInfo.cs +++ b/BuildFeed.Model/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("BuildFeed.Model")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,9 +17,11 @@ using System.Runtime.InteropServices; // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("7e2b4f61-1c11-4471-af80-5480e94c0664")] // Version information for an assembly consists of the following four values: @@ -32,5 +34,6 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/BuildFeed.Model/TypeOfSource.cs b/BuildFeed.Model/TypeOfSource.cs index 64760e7..5a9761b 100644 --- a/BuildFeed.Model/TypeOfSource.cs +++ b/BuildFeed.Model/TypeOfSource.cs @@ -3,33 +3,33 @@ using BuildFeed.Local; namespace BuildFeed.Model { - public enum TypeOfSource - { - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_PublicRelease))] - PublicRelease = 0, + public enum TypeOfSource + { + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_PublicRelease))] + PublicRelease = 0, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_InternalLeak))] - InternalLeak = 1, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_InternalLeak))] + InternalLeak = 1, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_UpdateGDR))] - UpdateGDR = 2, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_UpdateGDR))] + UpdateGDR = 2, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_UpdateLDR))] - UpdateLDR = 3, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_UpdateLDR))] + UpdateLDR = 3, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_AppPackage))] - AppPackage = 4, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_AppPackage))] + AppPackage = 4, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_BuildTools))] - BuildTools = 5, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_BuildTools))] + BuildTools = 5, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_Documentation))] - Documentation = 6, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_Documentation))] + Documentation = 6, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_Logging))] - Logging = 7, + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_Logging))] + Logging = 7, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_PrivateLeak))] - PrivateLeak = 8 - } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Model_Source_PrivateLeak))] + PrivateLeak = 8 + } } \ No newline at end of file diff --git a/BuildFeed.Model/View/ChangePassword.cs b/BuildFeed.Model/View/ChangePassword.cs index ce29151..1b6b077 100644 --- a/BuildFeed.Model/View/ChangePassword.cs +++ b/BuildFeed.Model/View/ChangePassword.cs @@ -3,22 +3,22 @@ using BuildFeed.Local; namespace BuildFeed.Model.View { - public class ChangePassword - { - [Required] - [MinLength(8)] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_ConfirmNewPassword))] - [Compare("NewPassword")] - public string ConfirmNewPassword { get; set; } + public class ChangePassword + { + [Required] + [MinLength(8)] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_ConfirmNewPassword))] + [Compare("NewPassword")] + public string ConfirmNewPassword { get; set; } - [Required] - [MinLength(8)] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterNewPassword))] - public string NewPassword { get; set; } + [Required] + [MinLength(8)] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterNewPassword))] + public string NewPassword { get; set; } - [Required] - [MinLength(8)] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterCurrentPassword))] - public string OldPassword { get; set; } - } + [Required] + [MinLength(8)] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterCurrentPassword))] + public string OldPassword { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/View/FrontBuildGroup.cs b/BuildFeed.Model/View/FrontBuildGroup.cs index cc32ddb..ab0e9b0 100644 --- a/BuildFeed.Model/View/FrontBuildGroup.cs +++ b/BuildFeed.Model/View/FrontBuildGroup.cs @@ -2,10 +2,10 @@ namespace BuildFeed.Model.View { - public class FrontBuildGroup - { - public int BuildCount { get; set; } - public BuildGroup Key { get; set; } - public DateTime? LastBuild { get; set; } - } + public class FrontBuildGroup + { + public int BuildCount { get; set; } + public BuildGroup Key { get; set; } + public DateTime? LastBuild { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/View/LoginUser.cs b/BuildFeed.Model/View/LoginUser.cs index 313e47a..5019ba5 100644 --- a/BuildFeed.Model/View/LoginUser.cs +++ b/BuildFeed.Model/View/LoginUser.cs @@ -3,17 +3,17 @@ using BuildFeed.Local; namespace BuildFeed.Model.View { - public class LoginUser - { - [Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_UserName))] - public string UserName { get; set; } + public class LoginUser + { + [Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_UserName))] + public string UserName { get; set; } - [Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_Password))] - public string Password { get; set; } + [Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_Password))] + public string Password { get; set; } - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_RememberMe))] - public bool RememberMe { get; set; } - } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_RememberMe))] + public bool RememberMe { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/View/RegistrationUser.cs b/BuildFeed.Model/View/RegistrationUser.cs index db7ffb3..2b86c59 100644 --- a/BuildFeed.Model/View/RegistrationUser.cs +++ b/BuildFeed.Model/View/RegistrationUser.cs @@ -3,26 +3,26 @@ using BuildFeed.Local; namespace BuildFeed.Model.View { - public class RegistrationUser - { - [Required] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_UserName))] - public string UserName { get; set; } + public class RegistrationUser + { + [Required] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_UserName))] + public string UserName { get; set; } - [Required] - [EmailAddress] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EmailAddress))] - public string EmailAddress { get; set; } + [Required] + [EmailAddress] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EmailAddress))] + public string EmailAddress { get; set; } - [Required] - [MinLength(8)] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterPassword))] - public string Password { get; set; } + [Required] + [MinLength(8)] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_EnterPassword))] + public string Password { get; set; } - [Required] - [MinLength(8)] - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_ConfirmPassword))] - [Compare(nameof(Password))] - public string ConfirmPassword { get; set; } - } + [Required] + [MinLength(8)] + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Support_ConfirmPassword))] + [Compare(nameof(Password))] + public string ConfirmPassword { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/View/SitemapData.cs b/BuildFeed.Model/View/SitemapData.cs index 7f8fe59..e610007 100644 --- a/BuildFeed.Model/View/SitemapData.cs +++ b/BuildFeed.Model/View/SitemapData.cs @@ -4,35 +4,35 @@ using System.Web.Routing; namespace BuildFeed.Model.View { - public class SitemapData - { - public Dictionary Actions { get; set; } - public SitemapDataBuildGroup[] Builds { get; set; } + public class SitemapData + { + public Dictionary Actions { get; set; } + public SitemapDataBuildGroup[] Builds { get; set; } - public string[] Labs { get; set; } - } + public string[] Labs { get; set; } + } - public class SitemapDataBuildGroup - { - public SitemapDataBuild[] Builds { get; set; } - public BuildGroup Id { get; set; } - } + public class SitemapDataBuildGroup + { + public SitemapDataBuild[] Builds { get; set; } + public BuildGroup Id { get; set; } + } - public class SitemapDataBuild - { - public Guid Id { get; set; } - public string Name { get; set; } - } + public class SitemapDataBuild + { + public Guid Id { get; set; } + public string Name { get; set; } + } - public class SitemapPagedAction - { - public string Action => UrlParams["action"].ToString(); + public class SitemapPagedAction + { + public string Action => UrlParams["action"].ToString(); - public string Name { get; set; } - public int Pages { get; set; } + public string Name { get; set; } + public int Pages { get; set; } - public string UniqueId => UrlParams.GetHashCode().ToString("X8").ToLower(); + public string UniqueId => UrlParams.GetHashCode().ToString("X8").ToLower(); - public RouteValueDictionary UrlParams { get; set; } - } + public RouteValueDictionary UrlParams { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed.Model/app.config b/BuildFeed.Model/app.config index 2ae86f9..addb1ae 100644 --- a/BuildFeed.Model/app.config +++ b/BuildFeed.Model/app.config @@ -1,11 +1,12 @@  + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/BuildFeed.Model/packages.config b/BuildFeed.Model/packages.config index 63c432c..bd71db5 100644 --- a/BuildFeed.Model/packages.config +++ b/BuildFeed.Model/packages.config @@ -1,12 +1,13 @@  + - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/BuildFeed/App_Code/PaginationHelpers.cshtml b/BuildFeed/App_Code/PaginationHelpers.cshtml index 256c9ba..3d66701 100644 --- a/BuildFeed/App_Code/PaginationHelpers.cshtml +++ b/BuildFeed/App_Code/PaginationHelpers.cshtml @@ -12,28 +12,48 @@ { RouteValueDictionary rvd = new RouteValueDictionary(rd); rvd.Remove("page"); -
  • -
  • +
  • + + + +
  • +
  • + + + +
  • } else if (currentPage > 2) { - RouteValueDictionary firstRvd = new RouteValueDictionary(rd); - firstRvd.Remove("page"); -
  • + RouteValueDictionary firstRvd = new RouteValueDictionary(rd); + firstRvd.Remove("page"); +
  • + + + +
  • - RouteValueDictionary rvd = new RouteValueDictionary(rd) - { - ["page"] = currentPage - 1 - }; -
  • + RouteValueDictionary rvd = new RouteValueDictionary(rd) + { + ["page"] = currentPage - 1 + }; +
  • + + + +
  • } else {
  • - + + +
  • - + + +
  • } @@ -77,26 +97,38 @@ @if (currentPage < totalPages) { - RouteValueDictionary rvd = new RouteValueDictionary(rd) - { - ["page"] = currentPage + 1 - }; + RouteValueDictionary rvd = new RouteValueDictionary(rd) + { + ["page"] = currentPage + 1 + }; -
  • +
  • + + + +
  • - RouteValueDictionary lastRvd = new RouteValueDictionary(rd) - { - ["page"] = totalPages - }; -
  • + RouteValueDictionary lastRvd = new RouteValueDictionary(rd) + { + ["page"] = totalPages + }; +
  • + + + +
  • } else {
  • - + + +
  • - + + +
  • } diff --git a/BuildFeed/App_Start/RouteConfig.cs b/BuildFeed/App_Start/RouteConfig.cs index 9325e88..b15a05c 100644 --- a/BuildFeed/App_Start/RouteConfig.cs +++ b/BuildFeed/App_Start/RouteConfig.cs @@ -4,22 +4,22 @@ using System.Web.Routing; namespace BuildFeed { - public class RouteConfig - { - public static void RegisterRoutes(RouteCollection routes) - { - routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + public class RouteConfig + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); - routes.AppendTrailingSlash = true; - routes.MapHttpRoute("API", - "api/{action}/{id}", - new - { - controller = "api", - action = "GetBuilds", - id = UrlParameter.Optional - }); - routes.MapMvcAttributeRoutes(); - } - } + routes.AppendTrailingSlash = true; + routes.MapHttpRoute("API", + "api/{action}/{id}", + new + { + controller = "api", + action = "GetBuilds", + id = UrlParameter.Optional + }); + routes.MapMvcAttributeRoutes(); + } + } } \ No newline at end of file diff --git a/BuildFeed/Areas/admin/Controllers/baseController.cs b/BuildFeed/Areas/admin/Controllers/baseController.cs index 5f732a7..751b542 100644 --- a/BuildFeed/Areas/admin/Controllers/baseController.cs +++ b/BuildFeed/Areas/admin/Controllers/baseController.cs @@ -5,34 +5,34 @@ using BuildFeed.Controllers; namespace BuildFeed.Areas.admin.Controllers { - public class baseController : BaseController - { - [Authorize(Roles = "Administrators")] - // GET: admin/base - public ActionResult index() - { - return View(); - } + public class baseController : BaseController + { + [Authorize(Roles = "Administrators")] + // GET: admin/base + public ActionResult index() + { + return View(); + } - [Authorize(Users = "hounsell")] - public ActionResult setup() - { - if (!Roles.RoleExists("Administrators")) - { - Roles.CreateRole("Administrators"); - } - if (!Roles.IsUserInRole("hounsell", "Administrators")) - { - Roles.AddUserToRole("hounsell", "Administrators"); - } + [Authorize(Users = "hounsell")] + public ActionResult setup() + { + if (!Roles.RoleExists("Administrators")) + { + Roles.CreateRole("Administrators"); + } + if (!Roles.IsUserInRole("hounsell", "Administrators")) + { + Roles.AddUserToRole("hounsell", "Administrators"); + } - return RedirectToAction("index"); - } + return RedirectToAction("index"); + } - [Authorize(Users = "hounsell")] - public ActionResult exception() - { - throw new Exception("This is a test exception"); - } - } + [Authorize(Users = "hounsell")] + public ActionResult exception() + { + throw new Exception("This is a test exception"); + } + } } \ No newline at end of file diff --git a/BuildFeed/Areas/admin/Controllers/metaController.cs b/BuildFeed/Areas/admin/Controllers/metaController.cs index ad73c23..91763ff 100644 --- a/BuildFeed/Areas/admin/Controllers/metaController.cs +++ b/BuildFeed/Areas/admin/Controllers/metaController.cs @@ -7,102 +7,102 @@ using BuildFeed.Model; namespace BuildFeed.Areas.admin.Controllers { - [Authorize(Roles = "Administrators")] - public class metaController : BaseController - { - private readonly MetaItem _mModel; + [Authorize(Roles = "Administrators")] + public class metaController : BaseController + { + private readonly MetaItem _mModel; - public metaController() - { - _mModel = new MetaItem(); - } + public metaController() + { + _mModel = new MetaItem(); + } - // GET: admin/meta - public async Task index() - { - return View(new MetaListing - { - CurrentItems = from i in await _mModel.Select() + // GET: admin/meta + public async Task index() + { + return View(new MetaListing + { + CurrentItems = from i in await _mModel.Select() + group i by i.Id.Type + into b + orderby b.Key.ToString() + select b, + NewItems = from i in (from l in await _mModel.SelectUnusedLabs() + select new MetaItemModel + { + Id = new MetaItemKey + { + Type = MetaType.Lab, + Value = l + } + }).Concat(from v in await _mModel.SelectUnusedVersions() + select new MetaItemModel + { + Id = new MetaItemKey + { + Type = MetaType.Version, + Value = v + } + }).Concat(from y in await _mModel.SelectUnusedYears() + select new MetaItemModel + { + Id = new MetaItemKey + { + Type = MetaType.Year, + Value = y + } + }) group i by i.Id.Type into b orderby b.Key.ToString() - select b, - NewItems = from i in (from l in await _mModel.SelectUnusedLabs() - select new MetaItemModel - { - Id = new MetaItemKey - { - Type = MetaType.Lab, - Value = l - } - }).Concat(from v in await _mModel.SelectUnusedVersions() - select new MetaItemModel - { - Id = new MetaItemKey - { - Type = MetaType.Version, - Value = v - } - }).Concat(from y in await _mModel.SelectUnusedYears() - select new MetaItemModel - { - Id = new MetaItemKey - { - Type = MetaType.Year, - Value = y - } - }) - group i by i.Id.Type - into b - orderby b.Key.ToString() - select b - }); - } + select b + }); + } - public ActionResult create(MetaType type, string value) - { - return View(new MetaItemModel - { - Id = new MetaItemKey + public ActionResult create(MetaType type, string value) + { + return View(new MetaItemModel { - Type = type, - Value = value + Id = new MetaItemKey + { + Type = type, + Value = value + } + }); + } + + [HttpPost] + public async Task create(MetaItemModel meta) + { + if (ModelState.IsValid) + { + await _mModel.Insert(meta); + return RedirectToAction("index"); } - }); - } - [HttpPost] - public async Task create(MetaItemModel meta) - { - if (ModelState.IsValid) - { - await _mModel.Insert(meta); - return RedirectToAction("index"); - } + return View(meta); + } - return View(meta); - } + public async Task edit(MetaType type, string value) + { + return View("create", + await _mModel.SelectById(new MetaItemKey + { + Type = type, + Value = value + })); + } - public async Task edit(MetaType type, string value) - { - return View("create", - await _mModel.SelectById(new MetaItemKey + [HttpPost] + public async Task edit(MetaItemModel meta) + { + if (ModelState.IsValid) { - Type = type, - Value = value - })); - } + await _mModel.Update(meta); + return RedirectToAction("index"); + } - [HttpPost] - public async Task edit(MetaItemModel meta) - { - if (ModelState.IsValid) - { - await _mModel.Update(meta); - return RedirectToAction("index"); - } - - return View("create", meta); - } - } + return View("create", meta); + } + } } \ No newline at end of file diff --git a/BuildFeed/Areas/admin/Controllers/usersController.cs b/BuildFeed/Areas/admin/Controllers/usersController.cs index 2a5ef2d..fd7237b 100644 --- a/BuildFeed/Areas/admin/Controllers/usersController.cs +++ b/BuildFeed/Areas/admin/Controllers/usersController.cs @@ -8,73 +8,73 @@ using MongoAuth; namespace BuildFeed.Areas.admin.Controllers { - [Authorize(Roles = "Administrators")] - public class usersController : BaseController - { - // GET: admin/users - public ActionResult index() => View(Membership.GetAllUsers().Cast().OrderByDescending(m => m.IsApproved).ThenBy(m => m.UserName)); + [Authorize(Roles = "Administrators")] + public class usersController : BaseController + { + // GET: admin/users + public ActionResult index() => View(Membership.GetAllUsers().Cast().OrderByDescending(m => m.IsApproved).ThenBy(m => m.UserName)); - public ActionResult admins() - { - List admins = Roles.GetUsersInRole("Administrators").Select(Membership.GetUser).ToList(); + public ActionResult admins() + { + List admins = Roles.GetUsersInRole("Administrators").Select(Membership.GetUser).ToList(); - return View(admins.OrderByDescending(m => m.UserName)); - } + return View(admins.OrderByDescending(m => m.UserName)); + } - public ActionResult promote(string id) - { - Roles.AddUserToRole(id, "Administrators"); - return RedirectToAction("Index"); - } + public ActionResult promote(string id) + { + Roles.AddUserToRole(id, "Administrators"); + return RedirectToAction("Index"); + } - public ActionResult demote(string id) - { - Roles.RemoveUserFromRole(id, "Administrators"); - return RedirectToAction("Index"); - } + public ActionResult demote(string id) + { + Roles.RemoveUserFromRole(id, "Administrators"); + return RedirectToAction("Index"); + } - public ActionResult approve(Guid id) - { - MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; - provider?.ChangeApproval(id, true); - return RedirectToAction("Index"); - } + public ActionResult approve(Guid id) + { + MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; + provider?.ChangeApproval(id, true); + return RedirectToAction("Index"); + } - public ActionResult unapprove(Guid id) - { - MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; - provider?.ChangeApproval(id, false); - return RedirectToAction("Index"); - } + public ActionResult unapprove(Guid id) + { + MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; + provider?.ChangeApproval(id, false); + return RedirectToAction("Index"); + } - public ActionResult @lock(Guid id) - { - MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; - provider?.ChangeLockStatus(id, true); - return RedirectToAction("Index"); - } + public ActionResult @lock(Guid id) + { + MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; + provider?.ChangeLockStatus(id, true); + return RedirectToAction("Index"); + } - public ActionResult unlock(Guid id) - { - MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; - provider?.ChangeLockStatus(id, false); - return RedirectToAction("Index"); - } + public ActionResult unlock(Guid id) + { + MongoMembershipProvider provider = Membership.Provider as MongoMembershipProvider; + provider?.ChangeLockStatus(id, false); + return RedirectToAction("Index"); + } - public ActionResult cleanup() - { - MembershipUserCollection users = Membership.GetAllUsers(); + public ActionResult cleanup() + { + MembershipUserCollection users = Membership.GetAllUsers(); - foreach (MembershipUser user in users) - { - if (!user.IsApproved - && (user.CreationDate.AddDays(30) < DateTime.Now)) + foreach (MembershipUser user in users) { - Membership.DeleteUser(user.UserName); + if (!user.IsApproved + && user.CreationDate.AddDays(30) < DateTime.Now) + { + Membership.DeleteUser(user.UserName); + } } - } - return RedirectToAction("index"); - } - } + return RedirectToAction("index"); + } + } } \ No newline at end of file diff --git a/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs b/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs index ba39f54..eda3aab 100644 --- a/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs +++ b/BuildFeed/Areas/admin/Models/ViewModel/MetaListing.cs @@ -4,9 +4,9 @@ using BuildFeed.Model; namespace BuildFeed.Areas.admin.Models.ViewModel { - public class MetaListing - { - public IEnumerable> CurrentItems { get; set; } - public IEnumerable> NewItems { get; set; } - } + public class MetaListing + { + public IEnumerable> CurrentItems { get; set; } + public IEnumerable> NewItems { get; set; } + } } \ No newline at end of file diff --git a/BuildFeed/Areas/admin/adminAreaRegistration.cs b/BuildFeed/Areas/admin/adminAreaRegistration.cs index f32ea48..1ce7941 100644 --- a/BuildFeed/Areas/admin/adminAreaRegistration.cs +++ b/BuildFeed/Areas/admin/adminAreaRegistration.cs @@ -2,28 +2,28 @@ namespace BuildFeed.Areas.admin { - public class AdminAreaRegistration : AreaRegistration - { - public override string AreaName => "admin"; + public class AdminAreaRegistration : AreaRegistration + { + public override string AreaName => "admin"; - public override void RegisterArea(AreaRegistrationContext context) - { - context.MapRoute("Meta", - "admin/{controller}/{action}/{type}/{value}", - new - { - action = "index", - controller = "meta" - }); + public override void RegisterArea(AreaRegistrationContext context) + { + context.MapRoute("Meta", + "admin/{controller}/{action}/{type}/{value}", + new + { + action = "index", + controller = "meta" + }); - context.MapRoute("Admin (Default)", - "admin/{controller}/{action}/{id}", - new - { - action = "index", - controller = "base", - id = UrlParameter.Optional - }); - } - } + context.MapRoute("Admin (Default)", + "admin/{controller}/{action}/{id}", + new + { + action = "index", + controller = "base", + id = UrlParameter.Optional + }); + } + } } \ No newline at end of file diff --git a/BuildFeed/Code/CustomContentTypeAttribute.cs b/BuildFeed/Code/CustomContentTypeAttribute.cs index 12c8660..628db91 100644 --- a/BuildFeed/Code/CustomContentTypeAttribute.cs +++ b/BuildFeed/Code/CustomContentTypeAttribute.cs @@ -2,14 +2,14 @@ namespace BuildFeed.Code { - // this class is a hacky workaround because Microsoft just don't feel like caching the correct content type - public class CustomContentTypeAttribute : ActionFilterAttribute - { - public string ContentType { get; set; } + // this class is a hacky workaround because Microsoft just don't feel like caching the correct content type + public class CustomContentTypeAttribute : ActionFilterAttribute + { + public string ContentType { get; set; } - public override void OnResultExecuted(ResultExecutedContext filterContext) - { - filterContext.HttpContext.Response.ContentType = ContentType; - } - } + public override void OnResultExecuted(ResultExecutedContext filterContext) + { + filterContext.HttpContext.Response.ContentType = ContentType; + } + } } \ No newline at end of file diff --git a/BuildFeed/Code/DateTimeModelBinder.cs b/BuildFeed/Code/DateTimeModelBinder.cs index 4182379..6340364 100644 --- a/BuildFeed/Code/DateTimeModelBinder.cs +++ b/BuildFeed/Code/DateTimeModelBinder.cs @@ -4,23 +4,23 @@ using System.Web.Mvc; namespace BuildFeed.Code { - public class DateTimeModelBinder : DefaultModelBinder - { - public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) - { - ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); + public class DateTimeModelBinder : DefaultModelBinder + { + public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) + { + ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); - DateTime retValue; - bool success = DateTime.TryParse(value.AttemptedValue, CultureInfo.CurrentUICulture.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out retValue); + DateTime retValue; + bool success = DateTime.TryParse(value.AttemptedValue, CultureInfo.CurrentUICulture.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out retValue); - if (!success) - { - success = DateTime.TryParseExact(value.AttemptedValue, "yyMMdd-HHmm", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out retValue); - } + if (!success) + { + success = DateTime.TryParseExact(value.AttemptedValue, "yyMMdd-HHmm", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out retValue); + } - return success - ? retValue as DateTime? - : null; - } - } + return success + ? retValue as DateTime? + : null; + } + } } \ No newline at end of file diff --git a/BuildFeed/Code/DisplayHelpers.cs b/BuildFeed/Code/DisplayHelpers.cs index 403647e..49161d4 100644 --- a/BuildFeed/Code/DisplayHelpers.cs +++ b/BuildFeed/Code/DisplayHelpers.cs @@ -8,68 +8,68 @@ using System.Web.Mvc; namespace BuildFeed.Code { - public static class MvcExtensions - { - public static IHtmlString CheckboxListForEnum(this HtmlHelper html, string id, T currentItem) where T : struct - { - StringBuilder sb = new StringBuilder(); + public static class MvcExtensions + { + public static IHtmlString CheckboxListForEnum(this HtmlHelper html, string id, T currentItem) where T : struct + { + StringBuilder sb = new StringBuilder(); - foreach (T enumItem in Enum.GetValues(typeof(T)).Cast()) - { - long enumValue = Convert.ToInt64(enumItem); - long currentValue = Convert.ToInt64(currentItem); - - if (enumValue == 0) + foreach (T enumItem in Enum.GetValues(typeof(T)).Cast()) { - // skip 0-valued bitflags, they're for display only. - continue; + long enumValue = Convert.ToInt64(enumItem); + long currentValue = Convert.ToInt64(currentItem); + + if (enumValue == 0) + { + // skip 0-valued bitflags, they're for display only. + continue; + } + + TagBuilder wrapper = new TagBuilder("div"); + wrapper.Attributes.Add("class", "checkbox"); + + TagBuilder label = new TagBuilder("label"); + + TagBuilder input = new TagBuilder("input"); + if ((enumValue & currentValue) != 0) + { + input.MergeAttribute("checked", "checked"); + } + input.MergeAttribute("type", "checkbox"); + input.MergeAttribute("value", enumValue.ToString()); + input.MergeAttribute("name", id); + + label.InnerHtml = input.ToString(TagRenderMode.SelfClosing); + label.InnerHtml += GetDisplayTextForEnum(enumItem); + + wrapper.InnerHtml = label.ToString(TagRenderMode.Normal); + + sb.Append(wrapper.ToString(TagRenderMode.Normal)); } - TagBuilder wrapper = new TagBuilder("div"); - wrapper.Attributes.Add("class", "checkbox"); + return new HtmlString(sb.ToString()); + } - TagBuilder label = new TagBuilder("label"); + public static string GetDisplayTextForEnum(object o) + { + string result = null; + DisplayAttribute display = o.GetType().GetMember(o.ToString()).First().GetCustomAttributes(false).OfType().LastOrDefault(); - TagBuilder input = new TagBuilder("input"); - if ((enumValue & currentValue) != 0) + if (display != null) { - input.MergeAttribute("checked", "checked"); + result = display.GetName(); } - input.MergeAttribute("type", "checkbox"); - input.MergeAttribute("value", enumValue.ToString()); - input.MergeAttribute("name", id); - label.InnerHtml = input.ToString(TagRenderMode.SelfClosing); - label.InnerHtml += GetDisplayTextForEnum(enumItem); + return result ?? o.ToString(); + } - wrapper.InnerHtml = label.ToString(TagRenderMode.Normal); + public static string ToLongDateWithoutDay(this DateTime dt) + { + string s = CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern; + s = s.Replace("dddd", "").Replace("ddd", ""); + s = s.Trim(' ', ','); - sb.Append(wrapper.ToString(TagRenderMode.Normal)); - } - - return new HtmlString(sb.ToString()); - } - - public static string GetDisplayTextForEnum(object o) - { - string result = null; - DisplayAttribute display = o.GetType().GetMember(o.ToString()).First().GetCustomAttributes(false).OfType().LastOrDefault(); - - if (display != null) - { - result = display.GetName(); - } - - return result ?? o.ToString(); - } - - public static string ToLongDateWithoutDay(this DateTime dt) - { - string s = CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern; - s = s.Replace("dddd", "").Replace("ddd", ""); - s = s.Trim(' ', ','); - - return dt.ToString(s); - } - } + return dt.ToString(s); + } + } } \ No newline at end of file diff --git a/BuildFeed/Code/MvcIntrinsics.cs b/BuildFeed/Code/MvcIntrinsics.cs index 4c650c0..65770b5 100644 --- a/BuildFeed/Code/MvcIntrinsics.cs +++ b/BuildFeed/Code/MvcIntrinsics.cs @@ -3,10 +3,10 @@ using System.Web.WebPages; namespace BuildFeed.Code { - public static class MvcIntrinsics - { - public static AjaxHelper Ajax => ((WebViewPage)WebPageContext.Current.Page).Ajax; - public static HtmlHelper Html => ((WebViewPage)WebPageContext.Current.Page).Html; - public static UrlHelper Url => ((WebViewPage)WebPageContext.Current.Page).Url; - } + public static class MvcIntrinsics + { + public static AjaxHelper Ajax => ((WebViewPage)WebPageContext.Current.Page).Ajax; + public static HtmlHelper Html => ((WebViewPage)WebPageContext.Current.Page).Html; + public static UrlHelper Url => ((WebViewPage)WebPageContext.Current.Page).Url; + } } \ No newline at end of file diff --git a/BuildFeed/Code/Options/Locale.cs b/BuildFeed/Code/Options/Locale.cs index ee07723..9a2e373 100644 --- a/BuildFeed/Code/Options/Locale.cs +++ b/BuildFeed/Code/Options/Locale.cs @@ -4,84 +4,84 @@ using System.Web; namespace BuildFeed.Code.Options { - public class Locale - { - private const string LANG_COOKIE_NAME = "bf_lang"; + public class Locale + { + private const string LANG_COOKIE_NAME = "bf_lang"; - public static readonly Locale[] AvailableLocales = - { - new Locale("ar"), - //new Locale("bn"), - new Locale("cs"), - new Locale("de"), - new Locale("el"), - new Locale("en"), - new Locale("es"), - new Locale("fa"), - new Locale("fi"), - new Locale("fr"), - new Locale("he"), - new Locale("hr"), - new Locale("hu"), - new Locale("id"), - new Locale("it"), - new Locale("ja"), - new Locale("ko"), - new Locale("lt"), - new Locale("nl"), - new Locale("pl"), - new Locale("pt"), - new Locale("pt-br"), - //new Locale("qps-ploc"), - new Locale("ro"), - new Locale("ru"), - new Locale("sk"), - new Locale("sl"), - new Locale("sv"), - new Locale("tr"), - new Locale("uk"), - new Locale("vi"), - new Locale("zh-hans"), - new Locale("zh-hant") - }; + public static readonly Locale[] AvailableLocales = + { + new Locale("ar"), + //new Locale("bn"), + new Locale("cs"), + new Locale("de"), + new Locale("el"), + new Locale("en"), + new Locale("es"), + new Locale("fa"), + new Locale("fi"), + new Locale("fr"), + new Locale("he"), + new Locale("hr"), + new Locale("hu"), + new Locale("id"), + new Locale("it"), + new Locale("ja"), + new Locale("ko"), + new Locale("lt"), + new Locale("nl"), + new Locale("pl"), + new Locale("pt"), + new Locale("pt-br"), + //new Locale("qps-ploc"), + new Locale("ro"), + new Locale("ru"), + new Locale("sk"), + new Locale("sl"), + new Locale("sv"), + new Locale("tr"), + new Locale("uk"), + new Locale("vi"), + new Locale("zh-hans"), + new Locale("zh-hant") + }; - public string DisplayName => Info.NativeName; + public string DisplayName => Info.NativeName; - public CultureInfo Info { get; set; } - public string LocaleId { get; set; } + public CultureInfo Info { get; set; } + public string LocaleId { get; set; } - public Locale(string localeId) - { - LocaleId = localeId; - Info = CultureInfo.GetCultureInfo(localeId); - } + public Locale(string localeId) + { + LocaleId = localeId; + Info = CultureInfo.GetCultureInfo(localeId); + } - public static CultureInfo DetectCulture(HttpContextBase context) - { - string langCookie = context.Request.Cookies[LANG_COOKIE_NAME]?.Value; + public static CultureInfo DetectCulture(HttpContextBase context) + { + string langCookie = context.Request.Cookies[LANG_COOKIE_NAME]?.Value; - if (!string.IsNullOrEmpty(langCookie)) - { - try + if (!string.IsNullOrEmpty(langCookie)) { - CultureInfo ci = (CultureInfo)CultureInfo.GetCultureInfo(langCookie).Clone(); + try + { + CultureInfo ci = (CultureInfo)CultureInfo.GetCultureInfo(langCookie).Clone(); - // Get Gregorian Calendar in locale if available - Calendar gc = ci.OptionalCalendars.FirstOrDefault(c => c is GregorianCalendar && (((GregorianCalendar)c).CalendarType == GregorianCalendarTypes.Localized)); - if (gc != null) - { - ci.DateTimeFormat.Calendar = gc; - } + // Get Gregorian Calendar in locale if available + Calendar gc = ci.OptionalCalendars.FirstOrDefault(c => c is GregorianCalendar && ((GregorianCalendar)c).CalendarType == GregorianCalendarTypes.Localized); + if (gc != null) + { + ci.DateTimeFormat.Calendar = gc; + } - return ci; + return ci; + } + + catch (CultureNotFoundException) + { + } } - catch (CultureNotFoundException) - { - } - } - - return CultureInfo.CurrentCulture; - } - } + return CultureInfo.CurrentCulture; + } + } } \ No newline at end of file diff --git a/BuildFeed/Code/Options/Theme.cs b/BuildFeed/Code/Options/Theme.cs index e2b1261..937e96d 100644 --- a/BuildFeed/Code/Options/Theme.cs +++ b/BuildFeed/Code/Options/Theme.cs @@ -6,43 +6,43 @@ using BuildFeed.Local; namespace BuildFeed.Code.Options { - public class Theme - { - private const string THEME_COOKIE_NAME = "bf_theme"; + public class Theme + { + private const string THEME_COOKIE_NAME = "bf_theme"; - public static Theme[] AvailableThemes = (from st in Enum.GetValues(typeof(SiteTheme)).Cast() - select new Theme(st)).ToArray(); + public static Theme[] AvailableThemes = (from st in Enum.GetValues(typeof(SiteTheme)).Cast() + select new Theme(st)).ToArray(); - private readonly SiteTheme _siteTheme; + private readonly SiteTheme _siteTheme; - public string CookieValue => _siteTheme.ToString(); - public string CssPath => $"~/res/css/{_siteTheme.ToString().ToLower()}.css"; - public string DisplayName => MvcExtensions.GetDisplayTextForEnum(_siteTheme); + public string CookieValue => _siteTheme.ToString(); + public string CssPath => $"~/res/css/{_siteTheme.ToString().ToLower()}.css"; + public string DisplayName => MvcExtensions.GetDisplayTextForEnum(_siteTheme); - public Theme(SiteTheme st) - { - _siteTheme = st; - } + public Theme(SiteTheme st) + { + _siteTheme = st; + } - public static SiteTheme DetectTheme(HttpContextBase context) - { - string themeCookie = context.Request.Cookies[THEME_COOKIE_NAME]?.Value; - SiteTheme theme = SiteTheme.Dark; - if (!string.IsNullOrEmpty(themeCookie)) - { - Enum.TryParse(themeCookie, out theme); - } + public static SiteTheme DetectTheme(HttpContextBase context) + { + string themeCookie = context.Request.Cookies[THEME_COOKIE_NAME]?.Value; + SiteTheme theme = SiteTheme.Dark; + if (!string.IsNullOrEmpty(themeCookie)) + { + Enum.TryParse(themeCookie, out theme); + } - return theme; - } - } + return theme; + } + } - public enum SiteTheme - { - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeDark))] - Dark = 0, + public enum SiteTheme + { + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeDark))] + Dark = 0, - [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeLight))] - Light - } + [Display(ResourceType = typeof(VariantTerms), Name = nameof(VariantTerms.Common_ThemeLight))] + Light + } } \ No newline at end of file diff --git a/BuildFeed/Code/OutputCachePushAttribute.cs b/BuildFeed/Code/OutputCachePushAttribute.cs index 915921e..8c0b488 100644 --- a/BuildFeed/Code/OutputCachePushAttribute.cs +++ b/BuildFeed/Code/OutputCachePushAttribute.cs @@ -5,20 +5,20 @@ using BuildFeed.Code.Options; namespace BuildFeed.Code { - public class OutputCachePushAttribute : ActionFilterAttribute - { - public override void OnResultExecuted(ResultExecutedContext filterContext) - { - bool isRtl = CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft; - Theme theme = new Theme(Theme.DetectTheme(filterContext.HttpContext)); + public class OutputCachePushAttribute : ActionFilterAttribute + { + public override void OnResultExecuted(ResultExecutedContext filterContext) + { + bool isRtl = CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft; + Theme theme = new Theme(Theme.DetectTheme(filterContext.HttpContext)); - filterContext.HttpContext.Response.PushPromise("/res/css/default.css"); - filterContext.HttpContext.Response.PushPromise(VirtualPathUtility.ToAbsolute(theme.CssPath)); - if (isRtl) - { - filterContext.HttpContext.Response.PushPromise("/res/css/rtl.css"); - } - filterContext.HttpContext.Response.PushPromise("/res/ts/bfs.js"); - } - } + filterContext.HttpContext.Response.PushPromise("/res/css/default.css"); + filterContext.HttpContext.Response.PushPromise(VirtualPathUtility.ToAbsolute(theme.CssPath)); + if (isRtl) + { + filterContext.HttpContext.Response.PushPromise("/res/css/rtl.css"); + } + filterContext.HttpContext.Response.PushPromise("/res/ts/bfs.js"); + } + } } \ No newline at end of file diff --git a/BuildFeed/Controllers/BaseController.cs b/BuildFeed/Controllers/BaseController.cs index 1107352..930b796 100644 --- a/BuildFeed/Controllers/BaseController.cs +++ b/BuildFeed/Controllers/BaseController.cs @@ -5,17 +5,17 @@ using BuildFeed.Code.Options; namespace BuildFeed.Controllers { - public class BaseController : Controller - { - protected override void Initialize(RequestContext requestContext) - { - CultureInfo ci = Locale.DetectCulture(requestContext.HttpContext); - CultureInfo.CurrentCulture = ci; - CultureInfo.CurrentUICulture = ci; + public class BaseController : Controller + { + protected override void Initialize(RequestContext requestContext) + { + CultureInfo ci = Locale.DetectCulture(requestContext.HttpContext); + CultureInfo.CurrentCulture = ci; + CultureInfo.CurrentUICulture = ci; - ViewBag.Theme = new Theme(Theme.DetectTheme(requestContext.HttpContext)); + ViewBag.Theme = new Theme(Theme.DetectTheme(requestContext.HttpContext)); - base.Initialize(requestContext); - } - } + base.Initialize(requestContext); + } + } } \ No newline at end of file diff --git a/BuildFeed/Controllers/apiController.cs b/BuildFeed/Controllers/apiController.cs index a2bc121..1f69b9c 100644 --- a/BuildFeed/Controllers/apiController.cs +++ b/BuildFeed/Controllers/apiController.cs @@ -11,8 +11,6 @@ using BuildFeed.Model; using BuildFeed.Model.Api; using BuildFeed.Model.View; using OneSignal.CSharp.SDK; -using OneSignal.CSharp.SDK.Resources; -using OneSignal.CSharp.SDK.Resources.Notifications; namespace BuildFeed.Controllers { @@ -94,7 +92,8 @@ namespace BuildFeed.Controllers await _bModel.Insert(build); OneSignalClient osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]); - osc.PushNewBuild(build, $"https://buildfeed.net{Url.Route("Build", new { controller = "Front", action = nameof(FrontController.ViewBuild), id = build.Id, area = "", httproute = "" })}?utm_source=notification&utm_campaign=new_build"); + osc.PushNewBuild(build, + $"https://buildfeed.net{Url.Route("Build", new { controller = "Front", action = nameof(FrontController.ViewBuild), id = build.Id, area = "", httproute = "" })}?utm_source=notification&utm_campaign=new_build"); } return true; } diff --git a/BuildFeed/Controllers/frontController.cs b/BuildFeed/Controllers/frontController.cs index 5751521..9d46b1e 100644 --- a/BuildFeed/Controllers/frontController.cs +++ b/BuildFeed/Controllers/frontController.cs @@ -15,8 +15,6 @@ using BuildFeed.Code; using BuildFeed.Model; using BuildFeed.Model.View; using OneSignal.CSharp.SDK; -using OneSignal.CSharp.SDK.Resources; -using OneSignal.CSharp.SDK.Resources.Notifications; namespace BuildFeed.Controllers { diff --git a/BuildFeed/Controllers/rssController.cs b/BuildFeed/Controllers/rssController.cs index 775952a..f0403be 100644 --- a/BuildFeed/Controllers/rssController.cs +++ b/BuildFeed/Controllers/rssController.cs @@ -9,167 +9,167 @@ using WilderMinds.RssSyndication; namespace BuildFeed.Controllers { - public class RssController : BaseController - { - private const int RSS_SIZE = 25; - private readonly BuildRepository _bModel; + public class RssController : BaseController + { + private const int RSS_SIZE = 25; + private readonly BuildRepository _bModel; - public RssController() - { - _bModel = new BuildRepository(); - } + public RssController() + { + _bModel = new BuildRepository(); + } - [Route("rss/compiled")] - public async Task Index() - { - List builds = await _bModel.SelectBuildsByCompileDate(RSS_SIZE); + [Route("rss/compiled")] + public async Task Index() + { + List builds = await _bModel.SelectBuildsByCompileDate(RSS_SIZE); - Feed feed = new Feed - { - Title = "BuildFeed RSS - Recently Compiled", - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), - Items = (from build in builds - select new Item - { - Title = build.AlternateBuildString, - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), - Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", - Categories = - { - build.Family.ToString() - }, - PublishDate = DateTime.SpecifyKind(build.BuildTime.GetValueOrDefault(), DateTimeKind.Utc) - }).ToList() - }; + Feed feed = new Feed + { + Title = "BuildFeed RSS - Recently Compiled", + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), + Items = (from build in builds + select new Item + { + Title = build.AlternateBuildString, + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), + Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", + Categories = + { + build.Family.ToString() + }, + PublishDate = DateTime.SpecifyKind(build.BuildTime.GetValueOrDefault(), DateTimeKind.Utc) + }).ToList() + }; - return new ContentResult - { - Content = feed.Serialize(), - ContentType = "application/rss+xml", - ContentEncoding = Encoding.UTF8 - }; - } + return new ContentResult + { + Content = feed.Serialize(), + ContentType = "application/rss+xml", + ContentEncoding = Encoding.UTF8 + }; + } - [Route("rss/added")] - public async Task Added() - { - List builds = await _bModel.SelectBuildsByAddedDate(RSS_SIZE); + [Route("rss/added")] + public async Task Added() + { + List builds = await _bModel.SelectBuildsByAddedDate(RSS_SIZE); - Feed feed = new Feed - { - Title = "BuildFeed RSS - Recently Added", - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), - Items = (from build in builds - select new Item - { - Title = build.AlternateBuildString, - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), - Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", - Categories = - { - build.Family.ToString() - }, - PublishDate = DateTime.SpecifyKind(build.Added, DateTimeKind.Utc) - }).ToList() - }; + Feed feed = new Feed + { + Title = "BuildFeed RSS - Recently Added", + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), + Items = (from build in builds + select new Item + { + Title = build.AlternateBuildString, + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), + Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", + Categories = + { + build.Family.ToString() + }, + PublishDate = DateTime.SpecifyKind(build.Added, DateTimeKind.Utc) + }).ToList() + }; - return new ContentResult - { - Content = feed.Serialize(), - ContentType = "application/rss+xml", - ContentEncoding = Encoding.UTF8 - }; - } + return new ContentResult + { + Content = feed.Serialize(), + ContentType = "application/rss+xml", + ContentEncoding = Encoding.UTF8 + }; + } - [Route("rss/leaked")] - public async Task Leaked() - { - List builds = await _bModel.SelectBuildsByLeakedDate(RSS_SIZE); + [Route("rss/leaked")] + public async Task Leaked() + { + List builds = await _bModel.SelectBuildsByLeakedDate(RSS_SIZE); - Feed feed = new Feed - { - Title = "BuildFeed RSS - Recently Leaked", - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), - Items = (from build in builds - select new Item - { - Title = build.AlternateBuildString, - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), - Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", - Categories = - { - build.Family.ToString() - }, - PublishDate = DateTime.SpecifyKind(build.LeakDate.GetValueOrDefault(), DateTimeKind.Utc) - }).ToList() - }; + Feed feed = new Feed + { + Title = "BuildFeed RSS - Recently Leaked", + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), + Items = (from build in builds + select new Item + { + Title = build.AlternateBuildString, + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), + Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", + Categories = + { + build.Family.ToString() + }, + PublishDate = DateTime.SpecifyKind(build.LeakDate.GetValueOrDefault(), DateTimeKind.Utc) + }).ToList() + }; - return new ContentResult - { - Content = feed.Serialize(), - ContentType = "application/rss+xml", - ContentEncoding = Encoding.UTF8 - }; - } + return new ContentResult + { + Content = feed.Serialize(), + ContentType = "application/rss+xml", + ContentEncoding = Encoding.UTF8 + }; + } - [Route("rss/version")] - public async Task Version() - { - List builds = await _bModel.SelectBuildsByOrder(RSS_SIZE); + [Route("rss/version")] + public async Task Version() + { + List builds = await _bModel.SelectBuildsByOrder(RSS_SIZE); - Feed feed = new Feed - { - Title = "BuildFeed RSS - Highest Version", - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), - Items = (from build in builds - select new Item - { - Title = build.AlternateBuildString, - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), - Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", - Categories = - { - build.Family.ToString() - } - }).ToList() - }; + Feed feed = new Feed + { + Title = "BuildFeed RSS - Highest Version", + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), + Items = (from build in builds + select new Item + { + Title = build.AlternateBuildString, + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), + Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", + Categories = + { + build.Family.ToString() + } + }).ToList() + }; - return new ContentResult - { - Content = feed.Serialize(), - ContentType = "application/rss+xml", - ContentEncoding = Encoding.UTF8 - }; - } + return new ContentResult + { + Content = feed.Serialize(), + ContentType = "application/rss+xml", + ContentEncoding = Encoding.UTF8 + }; + } - [Route("rss/lab/{lab}")] - public async Task Lab(string lab) - { - List builds = await _bModel.SelectLab(lab, RSS_SIZE); + [Route("rss/lab/{lab}")] + public async Task Lab(string lab) + { + List builds = await _bModel.SelectLab(lab, RSS_SIZE); - Feed feed = new Feed - { - Title = $"BuildFeed RSS - {lab} Lab", - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), - Items = (from build in builds - select new Item - { - Title = build.AlternateBuildString, - Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), - Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", - Categories = - { - build.Family.ToString() - } - }).ToList() - }; + Feed feed = new Feed + { + Title = $"BuildFeed RSS - {lab} Lab", + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}"), + Items = (from build in builds + select new Item + { + Title = build.AlternateBuildString, + Link = new Uri($"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}"), + Permalink = $"{Request.Url.Scheme}://{Request.Url.Authority}{Url.Action(nameof(FrontController.ViewBuild), new { controller = "Front", id = build.Id })}", + Categories = + { + build.Family.ToString() + } + }).ToList() + }; - return new ContentResult - { - Content = feed.Serialize(), - ContentType = "application/rss+xml", - ContentEncoding = Encoding.UTF8 - }; - } - } + return new ContentResult + { + Content = feed.Serialize(), + ContentType = "application/rss+xml", + ContentEncoding = Encoding.UTF8 + }; + } + } } \ No newline at end of file diff --git a/BuildFeed/Controllers/supportController.cs b/BuildFeed/Controllers/supportController.cs index 0f3ef41..ee40042 100644 --- a/BuildFeed/Controllers/supportController.cs +++ b/BuildFeed/Controllers/supportController.cs @@ -14,320 +14,320 @@ using BuildFeed.Model.View; namespace BuildFeed.Controllers { - public class SupportController : BaseController - { - private readonly BuildRepository _bModel; + public class SupportController : BaseController + { + private readonly BuildRepository _bModel; - public SupportController() - { - _bModel = new BuildRepository(); - } + public SupportController() + { + _bModel = new BuildRepository(); + } - [Route("login/")] - public ActionResult Login() => View(); + [Route("login/")] + public ActionResult Login() => View(); - [HttpPost] - [Route("login/")] - public ActionResult Login(LoginUser ru) - { - if (ModelState.IsValid) - { - bool isAuthenticated = Membership.ValidateUser(ru.UserName, ru.Password); - - if (isAuthenticated) + [HttpPost] + [Route("login/")] + public ActionResult Login(LoginUser ru) + { + if (ModelState.IsValid) { - int expiryLength = ru.RememberMe - ? 129600 - : 60; + bool isAuthenticated = Membership.ValidateUser(ru.UserName, ru.Password); - FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(ru.UserName, true, expiryLength); - string encryptedTicket = FormsAuthentication.Encrypt(ticket); - HttpCookie cookieTicket = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) - { - Expires = DateTime.Now.AddMinutes(expiryLength), - Path = FormsAuthentication.FormsCookiePath - }; - Response.Cookies.Add(cookieTicket); + if (isAuthenticated) + { + int expiryLength = ru.RememberMe + ? 129600 + : 60; - string returnUrl = string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) - ? "/" - : Request.QueryString["ReturnUrl"]; + FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(ru.UserName, true, expiryLength); + string encryptedTicket = FormsAuthentication.Encrypt(ticket); + HttpCookie cookieTicket = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) + { + Expires = DateTime.Now.AddMinutes(expiryLength), + Path = FormsAuthentication.FormsCookiePath + }; + Response.Cookies.Add(cookieTicket); - return Redirect(returnUrl); + string returnUrl = string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) + ? "/" + : Request.QueryString["ReturnUrl"]; + + return Redirect(returnUrl); + } } - } - ViewData["ErrorMessage"] = "The username and password are not valid."; - return View(ru); - } + ViewData["ErrorMessage"] = "The username and password are not valid."; + return View(ru); + } - [Authorize] - [Route("password/")] - public ActionResult Password() => View(); + [Authorize] + [Route("password/")] + public ActionResult Password() => View(); - [HttpPost] - [Authorize] - [Route("password/")] - public ActionResult Password(ChangePassword cp) - { - if (ModelState.IsValid) - { - MembershipUser user = Membership.GetUser(); - - if (user != null) + [HttpPost] + [Authorize] + [Route("password/")] + public ActionResult Password(ChangePassword cp) + { + if (ModelState.IsValid) { - bool success = user.ChangePassword(cp.OldPassword, cp.NewPassword); + MembershipUser user = Membership.GetUser(); - if (success) - { - return Redirect("/"); - } + if (user != null) + { + bool success = user.ChangePassword(cp.OldPassword, cp.NewPassword); + + if (success) + { + return Redirect("/"); + } + } } - } - ViewData["ErrorMessage"] = "There was an error changing your password."; - return View(cp); - } + ViewData["ErrorMessage"] = "There was an error changing your password."; + return View(cp); + } - [Route("logout/")] - public ActionResult Logout() - { - FormsAuthentication.SignOut(); - return Redirect("/"); - } + [Route("logout/")] + public ActionResult Logout() + { + FormsAuthentication.SignOut(); + return Redirect("/"); + } - [Route("register/")] - public ActionResult Register() => View(); + [Route("register/")] + public ActionResult Register() => View(); - [HttpPost] - [Route("register/")] - public ActionResult Register(RegistrationUser ru) - { - if (ModelState.IsValid) - { - MembershipCreateStatus status; - Membership.CreateUser(ru.UserName, ru.Password, ru.EmailAddress, "THIS WILL BE IGNORED", "I WILL BE IGNORED", false, out status); - - switch (status) + [HttpPost] + [Route("register/")] + public ActionResult Register(RegistrationUser ru) + { + if (ModelState.IsValid) { - case MembershipCreateStatus.Success: - return RedirectToAction("thanks_register"); - case MembershipCreateStatus.InvalidPassword: - ViewData["ErrorMessage"] = "The password is invalid."; - break; - case MembershipCreateStatus.DuplicateEmail: - ViewData["ErrorMessage"] = "A user account with this email address already exists."; - break; - case MembershipCreateStatus.DuplicateUserName: - ViewData["ErrorMessage"] = "A user account with this user name already exists."; - break; - default: - ViewData["ErrorMessage"] = "Unspecified error."; - break; + MembershipCreateStatus status; + Membership.CreateUser(ru.UserName, ru.Password, ru.EmailAddress, "THIS WILL BE IGNORED", "I WILL BE IGNORED", false, out status); + + switch (status) + { + case MembershipCreateStatus.Success: + return RedirectToAction("thanks_register"); + case MembershipCreateStatus.InvalidPassword: + ViewData["ErrorMessage"] = "The password is invalid."; + break; + case MembershipCreateStatus.DuplicateEmail: + ViewData["ErrorMessage"] = "A user account with this email address already exists."; + break; + case MembershipCreateStatus.DuplicateUserName: + ViewData["ErrorMessage"] = "A user account with this user name already exists."; + break; + default: + ViewData["ErrorMessage"] = "Unspecified error."; + break; + } } - } - return View(ru); - } + return View(ru); + } - [Route("register/thanks/")] - public ActionResult thanks_register() => View(); + [Route("register/thanks/")] + public ActionResult thanks_register() => View(); - [Route("rss")] - public async Task Rss() - { - ViewBag.Labs = await _bModel.SelectAllLabs(); - return View(); - } + [Route("rss")] + public async Task Rss() + { + ViewBag.Labs = await _bModel.SelectAllLabs(); + return View(); + } - [Route("sitemap/")] + [Route("sitemap/")] #if !DEBUG [OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "userName;lang;theme")] #endif - public async Task Sitemap() - { - List builds = await _bModel.SelectBuildsByOrder(); - var actions = new Dictionary - { + public async Task Sitemap() + { + List builds = await _bModel.SelectBuildsByOrder(); + var actions = new Dictionary { - "Pages", new[] - { - new SitemapPagedAction - { - UrlParams = new RouteValueDictionary(new - { - controller = "Front", - action = "Index", - page = 1 - }), - Pages = (builds.Count + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE - } - } - }, - { - "Versions", (from b in builds - group b by new BuildVersion - { - Major = b.MajorVersion, - Minor = b.MinorVersion - } - into bv - orderby bv.Key.Major descending, bv.Key.Minor descending - select new SitemapPagedAction - { - Name = $"{InvariantTerms.ProductName} {bv.Key.Major}.{bv.Key.Minor}", - UrlParams = new RouteValueDictionary(new - { - controller = "Front", - action = "ViewVersion", - major = bv.Key.Major, - minor = bv.Key.Minor, - page = 1 - }), - Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE - }).ToArray() - }, - { - "Labs", (from b in builds - where !string.IsNullOrEmpty(b.Lab) - group b by b.Lab - into bv - orderby bv.Key - select new SitemapPagedAction + { + "Pages", new[] + { + new SitemapPagedAction { - Name = bv.Key, - UrlParams = new RouteValueDictionary(new - { - controller = "Front", - action = "ViewLab", - lab = bv.Key, - page = 1 - }), - Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE - }).ToArray() - }, - { - "Years", (from b in builds - where b.BuildTime.HasValue - group b by b.BuildTime.Value.Year - into bv - orderby bv.Key descending - select new SitemapPagedAction - { - Name = bv.Key.ToString(), UrlParams = new RouteValueDictionary(new { - controller = "Front", - action = "ViewYear", - year = bv.Key, - page = 1 + controller = "Front", + action = "Index", + page = 1 }), - Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE - }).ToArray() - }, - { - "Sources", (from b in builds - group b by b.SourceType - into bv - orderby bv.Key - select new SitemapPagedAction - { - Name = MvcExtensions.GetDisplayTextForEnum(bv.Key), - UrlParams = new RouteValueDictionary(new + Pages = (builds.Count + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE + } + } + }, + { + "Versions", (from b in builds + group b by new BuildVersion + { + Major = b.MajorVersion, + Minor = b.MinorVersion + } + into bv + orderby bv.Key.Major descending, bv.Key.Minor descending + select new SitemapPagedAction + { + Name = $"{InvariantTerms.ProductName} {bv.Key.Major}.{bv.Key.Minor}", + UrlParams = new RouteValueDictionary(new + { + controller = "Front", + action = "ViewVersion", + major = bv.Key.Major, + minor = bv.Key.Minor, + page = 1 + }), + Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE + }).ToArray() + }, + { + "Labs", (from b in builds + where !string.IsNullOrEmpty(b.Lab) + group b by b.Lab + into bv + orderby bv.Key + select new SitemapPagedAction + { + Name = bv.Key, + UrlParams = new RouteValueDictionary(new + { + controller = "Front", + action = "ViewLab", + lab = bv.Key, + page = 1 + }), + Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE + }).ToArray() + }, + { + "Years", (from b in builds + where b.BuildTime.HasValue + group b by b.BuildTime.Value.Year + into bv + orderby bv.Key descending + select new SitemapPagedAction { - controller = "Front", - action = "ViewSource", - source = bv.Key, - page = 1 - }), - Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE - }).ToArray() - } - }; + Name = bv.Key.ToString(), + UrlParams = new RouteValueDictionary(new + { + controller = "Front", + action = "ViewYear", + year = bv.Key, + page = 1 + }), + Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE + }).ToArray() + }, + { + "Sources", (from b in builds + group b by b.SourceType + into bv + orderby bv.Key + select new SitemapPagedAction + { + Name = MvcExtensions.GetDisplayTextForEnum(bv.Key), + UrlParams = new RouteValueDictionary(new + { + controller = "Front", + action = "ViewSource", + source = bv.Key, + page = 1 + }), + Pages = (bv.Count() + (FrontController.PAGE_SIZE - 1)) / FrontController.PAGE_SIZE + }).ToArray() + } + }; - SitemapData model = new SitemapData - { - Builds = (from b in builds - group b by new - { - Major = b.MajorVersion, - Minor = b.MinorVersion, - Build = b.Number, - b.Revision - } - into bg - orderby bg.Key.Major descending, bg.Key.Minor descending, bg.Key.Build descending, bg.Key.Revision descending - select new SitemapDataBuildGroup - { - Id = new BuildGroup - { - Major = bg.Key.Major, - Minor = bg.Key.Minor, - Build = bg.Key.Build, - Revision = bg.Key.Revision - }, - Builds = (from bgb in bg - select new SitemapDataBuild - { - Id = bgb.Id, - Name = bgb.FullBuildString - }).ToArray() - }).ToArray(), - Actions = actions, - Labs = (from b in builds - group b by b.Lab - into lab - select lab.Key).ToArray() - }; + SitemapData model = new SitemapData + { + Builds = (from b in builds + group b by new + { + Major = b.MajorVersion, + Minor = b.MinorVersion, + Build = b.Number, + b.Revision + } + into bg + orderby bg.Key.Major descending, bg.Key.Minor descending, bg.Key.Build descending, bg.Key.Revision descending + select new SitemapDataBuildGroup + { + Id = new BuildGroup + { + Major = bg.Key.Major, + Minor = bg.Key.Minor, + Build = bg.Key.Build, + Revision = bg.Key.Revision + }, + Builds = (from bgb in bg + select new SitemapDataBuild + { + Id = bgb.Id, + Name = bgb.FullBuildString + }).ToArray() + }).ToArray(), + Actions = actions, + Labs = (from b in builds + group b by b.Lab + into lab + select lab.Key).ToArray() + }; - return View(model); - } + return View(model); + } - [Route("xml-sitemap/")] + [Route("xml-sitemap/")] #if !DEBUG [OutputCache(Duration = 3600, VaryByParam = "none", VaryByCustom = "userName;lang;theme")] #endif - public async Task XmlSitemap() - { - XNamespace xn = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9"); - var xlist = new List(); + public async Task XmlSitemap() + { + XNamespace xn = XNamespace.Get("http://www.sitemaps.org/schemas/sitemap/0.9"); + var xlist = new List(); - // home page - XElement home = new XElement(xn + "url"); - home.Add(new XElement(xn + "loc", Request.Url?.GetLeftPart(UriPartial.Authority) + "/")); - home.Add(new XElement(xn + "changefreq", "daily")); - xlist.Add(home); + // home page + XElement home = new XElement(xn + "url"); + home.Add(new XElement(xn + "loc", Request.Url?.GetLeftPart(UriPartial.Authority) + "/")); + home.Add(new XElement(xn + "changefreq", "daily")); + xlist.Add(home); - foreach (Build b in await _bModel.Select()) - { - XElement url = new XElement(xn + "url"); - url.Add(new XElement(xn + "loc", - Request.Url?.GetLeftPart(UriPartial.Authority) + Url.Action("ViewBuild", - "Front", - new - { - id = b.Id - }))); - if (b.Modified != DateTime.MinValue) + foreach (Build b in await _bModel.Select()) { - url.Add(new XElement(xn + "lastmod", b.Modified.ToString("yyyy-MM-dd"))); + XElement url = new XElement(xn + "url"); + url.Add(new XElement(xn + "loc", + Request.Url?.GetLeftPart(UriPartial.Authority) + Url.Action("ViewBuild", + "Front", + new + { + id = b.Id + }))); + if (b.Modified != DateTime.MinValue) + { + url.Add(new XElement(xn + "lastmod", b.Modified.ToString("yyyy-MM-dd"))); + } + xlist.Add(url); } - xlist.Add(url); - } - XDeclaration decl = new XDeclaration("1.0", "utf-8", ""); - XElement root = new XElement(xn + "urlset", xlist); + XDeclaration decl = new XDeclaration("1.0", "utf-8", ""); + XElement root = new XElement(xn + "urlset", xlist); - XDocument xdoc = new XDocument(decl, root); + XDocument xdoc = new XDocument(decl, root); - Response.ContentType = "application/xml"; - xdoc.Save(Response.OutputStream); + Response.ContentType = "application/xml"; + xdoc.Save(Response.OutputStream); - return new EmptyResult(); - } + return new EmptyResult(); + } - [Route("credits/")] - public ActionResult Credits() => View(); - } + [Route("credits/")] + public ActionResult Credits() => View(); + } } \ No newline at end of file diff --git a/BuildFeed/Global.asax b/BuildFeed/Global.asax index 59cbfaa..9d17b82 100644 --- a/BuildFeed/Global.asax +++ b/BuildFeed/Global.asax @@ -1 +1 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="BuildFeed.MvcApplication" Language="C#" %> +<%@ Application Codebehind="Global.asax.cs" Inherits="BuildFeed.MvcApplication" Language="C#" %> \ No newline at end of file diff --git a/BuildFeed/Global.asax.cs b/BuildFeed/Global.asax.cs index fd55a2e..ff8ad5b 100644 --- a/BuildFeed/Global.asax.cs +++ b/BuildFeed/Global.asax.cs @@ -10,52 +10,52 @@ using BuildFeed.Model; namespace BuildFeed { - public class MvcApplication : HttpApplication - { - protected void Application_Start() - { - // Disable ASP.NET MVC version header - MvcHandler.DisableMvcResponseHeader = true; + public class MvcApplication : HttpApplication + { + protected void Application_Start() + { + // Disable ASP.NET MVC version header + MvcHandler.DisableMvcResponseHeader = true; - // Don't bother looking for the legacy aspx view engine. - ViewEngines.Engines.Clear(); - ViewEngines.Engines.Add(new RazorViewEngine()); + // Don't bother looking for the legacy aspx view engine. + ViewEngines.Engines.Clear(); + ViewEngines.Engines.Add(new RazorViewEngine()); - AreaRegistration.RegisterAllAreas(); - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - RouteConfig.RegisterRoutes(RouteTable.Routes); + AreaRegistration.RegisterAllAreas(); + FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); + RouteConfig.RegisterRoutes(RouteTable.Routes); - DateTimeModelBinder db = new DateTimeModelBinder(); + DateTimeModelBinder db = new DateTimeModelBinder(); - ModelBinders.Binders.Add(typeof(DateTime), db); - ModelBinders.Binders.Add(typeof(DateTime?), db); + ModelBinders.Binders.Add(typeof(DateTime), db); + ModelBinders.Binders.Add(typeof(DateTime?), db); - MongoConfig.SetupIndexes(); - } + MongoConfig.SetupIndexes(); + } - public override string GetVaryByCustomString(HttpContext context, string custom) - { - string[] parts = custom.Split(';'); - List varyParts = new List(); - HttpContextWrapper contextWrapper = new HttpContextWrapper(context); + public override string GetVaryByCustomString(HttpContext context, string custom) + { + string[] parts = custom.Split(';'); + var varyParts = new List(); + HttpContextWrapper contextWrapper = new HttpContextWrapper(context); - foreach (string part in parts) - { - switch (part) + foreach (string part in parts) { - case "userName": - varyParts.Add($"user:{context.User.Identity.Name}"); - break; - case "lang": - varyParts.Add($"lang:{Locale.DetectCulture(contextWrapper).LCID}"); - break; - case "theme": - varyParts.Add($"theme:{Theme.DetectTheme(contextWrapper)}"); - break; + switch (part) + { + case "userName": + varyParts.Add($"user:{context.User.Identity.Name}"); + break; + case "lang": + varyParts.Add($"lang:{Locale.DetectCulture(contextWrapper).LCID}"); + break; + case "theme": + varyParts.Add($"theme:{Theme.DetectTheme(contextWrapper)}"); + break; + } } - } - return string.Join(";", varyParts.OrderBy(s => s)); - } - } + return string.Join(";", varyParts.OrderBy(s => s)); + } + } } \ No newline at end of file diff --git a/BuildFeed/OneSignalSDKUpdaterWorker.js b/BuildFeed/OneSignalSDKUpdaterWorker.js index 8657823..982c3fc 100644 --- a/BuildFeed/OneSignalSDKUpdaterWorker.js +++ b/BuildFeed/OneSignalSDKUpdaterWorker.js @@ -1 +1 @@ -importScripts('https://cdn.onesignal.com/sdks/OneSignalSDK.js'); +importScripts("https://cdn.onesignal.com/sdks/OneSignalSDK.js"); \ No newline at end of file diff --git a/BuildFeed/OneSignalSDKWorker.js b/BuildFeed/OneSignalSDKWorker.js index 8657823..982c3fc 100644 --- a/BuildFeed/OneSignalSDKWorker.js +++ b/BuildFeed/OneSignalSDKWorker.js @@ -1 +1 @@ -importScripts('https://cdn.onesignal.com/sdks/OneSignalSDK.js'); +importScripts("https://cdn.onesignal.com/sdks/OneSignalSDK.js"); \ No newline at end of file diff --git a/BuildFeed/Properties/AssemblyInfo.cs b/BuildFeed/Properties/AssemblyInfo.cs index 014e263..16dd922 100644 --- a/BuildFeed/Properties/AssemblyInfo.cs +++ b/BuildFeed/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. + [assembly: AssemblyTitle("BuildFeed")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -17,9 +17,11 @@ using System.Runtime.InteropServices; // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. + [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM + [assembly: Guid("6c5846cb-43ac-4818-a9b5-a6cd1d6983a3")] // Version information for an assembly consists of the following four values: @@ -31,5 +33,6 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: + [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/BuildFeed/Views/_ViewStart.cshtml b/BuildFeed/Views/_ViewStart.cshtml index d599c2d..b43c42a 100644 --- a/BuildFeed/Views/_ViewStart.cshtml +++ b/BuildFeed/Views/_ViewStart.cshtml @@ -1,3 +1,3 @@ @{ - Layout = "~/Views/shared/_default.cshtml"; + Layout = "~/Views/shared/_default.cshtml"; } \ No newline at end of file diff --git a/BuildFeed/Views/front/AddBulk.cshtml b/BuildFeed/Views/front/AddBulk.cshtml index 4d9c18c..9c6aef0 100644 --- a/BuildFeed/Views/front/AddBulk.cshtml +++ b/BuildFeed/Views/front/AddBulk.cshtml @@ -3,58 +3,58 @@ @model BuildFeed.Model.View.BulkAddition @{ - ViewBag.Title = $"{VariantTerms.Common_AddBulk} | {InvariantTerms.SiteName}"; + ViewBag.Title = $"{VariantTerms.Common_AddBulk} | {InvariantTerms.SiteName}"; }

    @VariantTerms.Common_AddBulk

    @if (ViewBag.Results != null) { -

    @VariantTerms.Bulk_Success

    - +

    @VariantTerms.Bulk_Success

    + }

    @VariantTerms.Bulk_Instructions

    @using (Html.BeginForm()) { - @Html.AntiForgeryToken() + @Html.AntiForgeryToken() -
    - -
    - @Html.TextAreaFor(m => m.Builds, new - { - rows = 10 - }) -
    -
    +
    + +
    + @Html.TextAreaFor(m => m.Builds, new + { + rows = 10 + }) +
    +
    -
    - -
    - -
    -
    +
    + +
    + +
    +
    -
    - -
    - -
    -
    +
    + +
    + +
    +
    } \ No newline at end of file diff --git a/BuildFeed/Views/front/Pages.cshtml b/BuildFeed/Views/front/Pages.cshtml index 3c92730..4116fda 100644 --- a/BuildFeed/Views/front/Pages.cshtml +++ b/BuildFeed/Views/front/Pages.cshtml @@ -35,11 +35,13 @@ DateTime maxDate = group.LastBuild.Value; if (maxDate.AddDays(28) > DateTime.Now) { - @maxDate.Humanize() + + @maxDate.Humanize() } else { - @maxDate.ToLongDateWithoutDay() + + @maxDate.ToLongDateWithoutDay() } }

    diff --git a/BuildFeed/Views/front/editBuild.cshtml b/BuildFeed/Views/front/editBuild.cshtml index 8be44d3..6b424c6 100644 --- a/BuildFeed/Views/front/editBuild.cshtml +++ b/BuildFeed/Views/front/editBuild.cshtml @@ -2,187 +2,187 @@ @using BuildFeed.Model @model BuildFeed.Model.Build @{ - ViewBag.Title = (string)ViewContext.RouteData.Values["action"] == nameof(FrontController.AddBuild) - ? $"{VariantTerms.Common_AddBuild} | {InvariantTerms.SiteName}" - : $"{VariantTerms.Front_EditBuild} {Model.FullBuildString} | {InvariantTerms.SiteName}"; - Html.EnableClientValidation(); - Html.EnableUnobtrusiveJavaScript(); + ViewBag.Title = (string)ViewContext.RouteData.Values["action"] == nameof(FrontController.AddBuild) + ? $"{VariantTerms.Common_AddBuild} | {InvariantTerms.SiteName}" + : $"{VariantTerms.Front_EditBuild} {Model.FullBuildString} | {InvariantTerms.SiteName}"; + Html.EnableClientValidation(); + Html.EnableUnobtrusiveJavaScript(); } @if ((string)ViewContext.RouteData.Values["action"] == nameof(FrontController.AddBuild)) { -

    @VariantTerms.Common_AddBuild

    +

    @VariantTerms.Common_AddBuild

    } else { -

    @VariantTerms.Front_EditBuild @Model.AlternateBuildString

    +

    @VariantTerms.Front_EditBuild @Model.AlternateBuildString

    }
    - -
    - -
    + +
    + +
    @using (Html.BeginForm()) { - @Html.AntiForgeryToken() + @Html.AntiForgeryToken() - @Html.ValidationSummary(true) + @Html.ValidationSummary(true) -
    - @Html.LabelFor(model => model.MajorVersion) -
    - @Html.TextBoxFor(model => model.MajorVersion) - @Html.ValidationMessageFor(model => model.MajorVersion) -
    -
    +
    + @Html.LabelFor(model => model.MajorVersion) +
    + @Html.TextBoxFor(model => model.MajorVersion) + @Html.ValidationMessageFor(model => model.MajorVersion) +
    +
    -
    - @Html.LabelFor(model => model.MinorVersion) -
    - @Html.TextBoxFor(model => model.MinorVersion) - @Html.ValidationMessageFor(model => model.MinorVersion) -
    -
    +
    + @Html.LabelFor(model => model.MinorVersion) +
    + @Html.TextBoxFor(model => model.MinorVersion) + @Html.ValidationMessageFor(model => model.MinorVersion) +
    +
    -
    - @Html.LabelFor(model => model.Number) -
    - @Html.TextBoxFor(model => model.Number) - @Html.ValidationMessageFor(model => model.Number) -
    -
    +
    + @Html.LabelFor(model => model.Number) +
    + @Html.TextBoxFor(model => model.Number) + @Html.ValidationMessageFor(model => model.Number) +
    +
    -
    - @Html.LabelFor(model => model.Revision) -
    - @Html.TextBoxFor(model => model.Revision) - @Html.ValidationMessageFor(model => model.Revision) -
    -
    +
    + @Html.LabelFor(model => model.Revision) +
    + @Html.TextBoxFor(model => model.Revision) + @Html.ValidationMessageFor(model => model.Revision) +
    +
    -
    - @Html.LabelFor(model => model.Lab) -
    - @Html.TextBoxFor(model => model.Lab) - @Html.ValidationMessageFor(model => model.Lab) -
    -
    +
    + @Html.LabelFor(model => model.Lab) +
    + @Html.TextBoxFor(model => model.Lab) + @Html.ValidationMessageFor(model => model.Lab) +
    +
    -
    - @Html.LabelFor(model => model.BuildTime) -
    - @Html.TextBoxFor(model => model.BuildTime, "{0:yyMMdd-HHmm}") - @Html.ValidationMessageFor(model => model.BuildTime) -
    -
    +
    + @Html.LabelFor(model => model.BuildTime) +
    + @Html.TextBoxFor(model => model.BuildTime, "{0:yyMMdd-HHmm}") + @Html.ValidationMessageFor(model => model.BuildTime) +
    +
    -
    - @Html.LabelFor(model => model.SourceType) -
    - @Html.DropDownListFor(model => model.SourceType, EnumHelper.GetSelectList(typeof(TypeOfSource))) - @Html.ValidationMessageFor(model => model.SourceType) -
    -
    +
    + @Html.LabelFor(model => model.SourceType) +
    + @Html.DropDownListFor(model => model.SourceType, EnumHelper.GetSelectList(typeof(TypeOfSource))) + @Html.ValidationMessageFor(model => model.SourceType) +
    +
    -
    - @Html.LabelFor(model => model.LeakDate) -
    -
    - @Html.TextBoxFor(model => model.LeakDate, "{0:dd/MM/yyyy}") - -
    - @Html.ValidationMessageFor(model => model.LeakDate) -
    -
    +
    + @Html.LabelFor(model => model.LeakDate) +
    +
    + @Html.TextBoxFor(model => model.LeakDate, "{0:dd/MM/yyyy}") + +
    + @Html.ValidationMessageFor(model => model.LeakDate) +
    +
    -
    - @Html.LabelFor(model => model.SourceDetails) -
    - @Html.TextAreaFor(model => model.SourceDetails) - @Html.ValidationMessageFor(model => model.SourceDetails) -
    -
    +
    + @Html.LabelFor(model => model.SourceDetails) +
    + @Html.TextAreaFor(model => model.SourceDetails) + @Html.ValidationMessageFor(model => model.SourceDetails) +
    +
    - + } @section Scripts { - - - + + + - - + + - + $("#MajorVersion").val(result[2]); + $("#MinorVersion").val(result[3]); + $("#Number").val(result[4]); + $("#Revision").val(result[6]); + $("#Lab").val(result[8]); + $("#BuildTime").val(result[9]); + }); + }); + } \ No newline at end of file diff --git a/BuildFeed/Views/front/index.cshtml b/BuildFeed/Views/front/index.cshtml index 0f2166a..34aab11 100644 --- a/BuildFeed/Views/front/index.cshtml +++ b/BuildFeed/Views/front/index.cshtml @@ -1,78 +1,78 @@ @model BuildFeed.Model.View.FrontPage @{ - ViewBag.Title = $"{InvariantTerms.SiteName} | Windows 10 Build Tracker"; + ViewBag.Title = $"{InvariantTerms.SiteName} | Windows 10 Build Tracker"; } @section Head { - + }

    @string.Format(VariantTerms.Front_HomeH1, InvariantTerms.SiteName)

    @VariantTerms.Front_LatestBuilds

    - @if (Model.CurrentCanary != null) - { - -

    @VariantTerms.Front_CurrentCanary

    -
    -

    @(Model.CurrentCanary.MajorVersion).@(Model.CurrentCanary.MinorVersion).@(Model.CurrentCanary.Number).@(Model.CurrentCanary.Revision)

    -

    @Model.CurrentCanary.Lab

    -

    @(Model.CurrentCanary.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    -
    -
    - } - @if (Model.CurrentInsider != null) - { - -

    @VariantTerms.Front_CurrentInsider

    -
    -

    @(Model.CurrentInsider.MajorVersion).@(Model.CurrentInsider.MinorVersion).@(Model.CurrentInsider.Number).@(Model.CurrentInsider.Revision)

    -

    @Model.CurrentInsider.Lab

    -

    @(Model.CurrentInsider.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    -
    -
    - } - @if (Model.CurrentRelease != null) - { - -

    @VariantTerms.Front_CurrentRelease

    -
    -

    @(Model.CurrentRelease.MajorVersion).@(Model.CurrentRelease.MinorVersion).@(Model.CurrentRelease.Number).@(Model.CurrentRelease.Revision)

    -

    @Model.CurrentRelease.Lab

    -

    @(Model.CurrentRelease.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    -
    -
    - } - @if (Model.CurrentXbox != null) - { - -

    @VariantTerms.Front_CurrentXbox

    -
    -

    @(Model.CurrentXbox.MajorVersion).@(Model.CurrentXbox.MinorVersion).@(Model.CurrentXbox.Number).@(Model.CurrentXbox.Revision)

    -

    @Model.CurrentXbox.Lab

    -

    @(Model.CurrentXbox.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    -
    -
    - } + @if (Model.CurrentCanary != null) + { + +

    @VariantTerms.Front_CurrentCanary

    +
    +

    @(Model.CurrentCanary.MajorVersion).@(Model.CurrentCanary.MinorVersion).@(Model.CurrentCanary.Number).@(Model.CurrentCanary.Revision)

    +

    @Model.CurrentCanary.Lab

    +

    @(Model.CurrentCanary.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    +
    +
    + } + @if (Model.CurrentInsider != null) + { + +

    @VariantTerms.Front_CurrentInsider

    +
    +

    @(Model.CurrentInsider.MajorVersion).@(Model.CurrentInsider.MinorVersion).@(Model.CurrentInsider.Number).@(Model.CurrentInsider.Revision)

    +

    @Model.CurrentInsider.Lab

    +

    @(Model.CurrentInsider.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    +
    +
    + } + @if (Model.CurrentRelease != null) + { + +

    @VariantTerms.Front_CurrentRelease

    +
    +

    @(Model.CurrentRelease.MajorVersion).@(Model.CurrentRelease.MinorVersion).@(Model.CurrentRelease.Number).@(Model.CurrentRelease.Revision)

    +

    @Model.CurrentRelease.Lab

    +

    @(Model.CurrentRelease.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    +
    +
    + } + @if (Model.CurrentXbox != null) + { + +

    @VariantTerms.Front_CurrentXbox

    +
    +

    @(Model.CurrentXbox.MajorVersion).@(Model.CurrentXbox.MinorVersion).@(Model.CurrentXbox.Number).@(Model.CurrentXbox.Revision)

    +

    @Model.CurrentXbox.Lab

    +

    @(Model.CurrentXbox.BuildTime?.ToString("HH:mm, dddd dd MMMM yyyy"))

    +
    +
    + }
    - @VariantTerms.Front_FullBuildListing + @VariantTerms.Front_FullBuildListing

    @VariantTerms.Front_Share

    diff --git a/BuildFeed/Views/front/viewBuild.cshtml b/BuildFeed/Views/front/viewBuild.cshtml index 11b5e0f..0f87ab8 100644 --- a/BuildFeed/Views/front/viewBuild.cshtml +++ b/BuildFeed/Views/front/viewBuild.cshtml @@ -4,132 +4,132 @@ @model BuildFeed.Model.Build @{ - ViewBag.Title = $"{Model.FullBuildString} | {InvariantTerms.SiteName}"; + ViewBag.Title = $"{Model.FullBuildString} | {InvariantTerms.SiteName}"; } @section head { - - + + - - - - @{ - string metaDesc = Model.BuildTime.HasValue - ? string.Format(VariantTerms.Meta_BuildDate, Model.Number, Model.Lab, Model.BuildTime.Value.ToLongDateWithoutDay()) - : string.Format(VariantTerms.Meta_BuildNoDate, Model.Number, Model.Lab); - } - - - + + + + @{ + string metaDesc = Model.BuildTime.HasValue + ? string.Format(VariantTerms.Meta_BuildDate, Model.Number, Model.Lab, Model.BuildTime.Value.ToLongDateWithoutDay()) + : string.Format(VariantTerms.Meta_BuildNoDate, Model.Number, Model.Lab); + } + + + }

    @Model.AlternateBuildString

    @VariantTerms.Front_Details

    -
    - @Html.LabelFor(model => model.MajorVersion) -

    @Html.DisplayFor(model => model.MajorVersion)

    -
    -
    - @Html.LabelFor(model => model.MinorVersion) -

    @Html.DisplayFor(model => model.MinorVersion)

    -
    -
    - @Html.LabelFor(model => model.Number) -

    @Html.DisplayFor(model => model.Number)

    -
    -
    - @Html.LabelFor(model => model.Revision) -

    - @if (Model.Revision.HasValue) - { - @Html.DisplayFor(model => model.Revision) - } - else - { - @("-") - } -

    -
    +
    + @Html.LabelFor(model => model.MajorVersion) +

    @Html.DisplayFor(model => model.MajorVersion)

    +
    +
    + @Html.LabelFor(model => model.MinorVersion) +

    @Html.DisplayFor(model => model.MinorVersion)

    +
    +
    + @Html.LabelFor(model => model.Number) +

    @Html.DisplayFor(model => model.Number)

    +
    +
    + @Html.LabelFor(model => model.Revision) +

    + @if (Model.Revision.HasValue) + { + @Html.DisplayFor(model => model.Revision) + } + else + { + @("-") + } +

    +
    -
    - @Html.LabelFor(model => model.Lab) -

    - @if (string.IsNullOrEmpty(Model.Lab)) - { - @VariantTerms.Front_NoLabString - } - else - { - @Model.Lab
    - -   - @string.Format(VariantTerms.Front_MoreFromLab, Model.Lab) - - } -

    -
    -
    - @Html.LabelFor(model => model.BuildTime) -

    - @if (Model.BuildTime.HasValue) - { - -
    - -   - @string.Format(VariantTerms.Front_MoreFromYear, Model.BuildTime.Value.Year) - - } -

    -
    -
    -
    - -
    - @if (Model.LeakDate.HasValue) - { - @Html.LabelFor(model => model.LeakDate) -
    - -
    - } -
    + } +

    +
    +
    + @Html.LabelFor(model => model.BuildTime) +

    + @if (Model.BuildTime.HasValue) + { + +
    + +   + @string.Format(VariantTerms.Front_MoreFromYear, Model.BuildTime.Value.Year) + + } +

    +
    + +
    +
    + @Html.LabelFor(model => model.SourceType) + +
    +
    + @if (Model.LeakDate.HasValue) + { + @Html.LabelFor(model => model.LeakDate) +
    + +
    + } +

    @if (!string.IsNullOrWhiteSpace(Model.SourceDetailsFiltered)) { -

    @Html.DisplayNameFor(model => model.SourceDetails)

    -
    @Html.Raw(Model.SourceDetailsFiltered)
    -
    +

    @Html.DisplayNameFor(model => model.SourceDetails)

    +
    @Html.Raw(Model.SourceDetailsFiltered)
    +
    }

    @VariantTerms.Front_Share

    @@ -137,57 +137,57 @@ @if (User.Identity.IsAuthenticated) { -

    @VariantTerms.Front_EditorActions

    -

    - @Html.ActionLink(VariantTerms.Front_Edit, nameof(FrontController.EditBuild), new - { - id = Model.Id - }, new - { - @class = "button edit-button" - }) +

    @VariantTerms.Front_EditorActions

    +

    + @Html.ActionLink(VariantTerms.Front_Edit, nameof(FrontController.EditBuild), new + { + id = Model.Id + }, new + { + @class = "button edit-button" + }) - @if (Roles.IsUserInRole("Administrators")) - { - @Html.ActionLink(VariantTerms.Front_Delete, nameof(FrontController.DeleteBuild), new - { - id = Model.Id - }, new - { - @class = "button delete-button" - }) - } -

    + @if (Roles.IsUserInRole("Administrators")) + { + @Html.ActionLink(VariantTerms.Front_Delete, nameof(FrontController.DeleteBuild), new + { + id = Model.Id + }, new + { + @class = "button delete-button" + }) + } +

    }
    -

    @VariantTerms.Front_Comments

    -
    - - + (function() + { + var dsq = document.createElement('script'); + dsq.type = 'text/javascript'; + dsq.async = true; + dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]) + .appendChild(dsq); + })(); + +

    - - @VariantTerms.Front_ReturnToOverview - -   - @VariantTerms.Front_ReturnToListing + + @VariantTerms.Front_ReturnToOverview + +   + @VariantTerms.Front_ReturnToListing

    \ No newline at end of file diff --git a/BuildFeed/Views/front/viewGroup.cshtml b/BuildFeed/Views/front/viewGroup.cshtml index b18e78b..b9fad53 100644 --- a/BuildFeed/Views/front/viewGroup.cshtml +++ b/BuildFeed/Views/front/viewGroup.cshtml @@ -4,77 +4,77 @@ @using Humanizer @model Tuple> @{ - ViewBag.Title = $"{Model.Item1} | {InvariantTerms.SiteName}"; + ViewBag.Title = $"{Model.Item1} | {InvariantTerms.SiteName}"; }

    @Model.Item1.ToString()

    @VariantTerms.Front_Listing

    - @foreach (Build build in Model.Item2) - { -
    -

    - - @(string.IsNullOrEmpty(build.Lab) - ? "{Unknown}" - : build.Lab) - -

    - @if (build.BuildTime.HasValue) - { -

    - - @build.BuildTime.Value.ToLongDateWithoutDay() -

    -

    - - @build.BuildTime.Value.ToShortTimeString() -

    - } - @if (build.IsLeaked) - { -

    - - @VariantTerms.Front_Public -

    - } - else - { -

    - - @VariantTerms.Front_Private -

    - } - @if (User.Identity.IsAuthenticated) - { -

    - - @VariantTerms.Front_Edit - -   - @if (Roles.IsUserInRole("Administrators")) - { - - @VariantTerms.Front_Delete - - } -

    - } -
    - } -
    -
    -
    -
    -
    + @foreach (Build build in Model.Item2) + { +
    +

    + + @(string.IsNullOrEmpty(build.Lab) + ? "{Unknown}" + : build.Lab) + +

    + @if (build.BuildTime.HasValue) + { +

    + + @build.BuildTime.Value.ToLongDateWithoutDay() +

    +

    + + @build.BuildTime.Value.ToShortTimeString() +

    + } + @if (build.IsLeaked) + { +

    + + @VariantTerms.Front_Public +

    + } + else + { +

    + + @VariantTerms.Front_Private +

    + } + @if (User.Identity.IsAuthenticated) + { +

    + + @VariantTerms.Front_Edit + +   + @if (Roles.IsUserInRole("Administrators")) + { + + @VariantTerms.Front_Delete + + } +

    + } +
    + } +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/BuildFeed/Views/front/viewLab.cshtml b/BuildFeed/Views/front/viewLab.cshtml index 92d14ab..e743af5 100644 --- a/BuildFeed/Views/front/viewLab.cshtml +++ b/BuildFeed/Views/front/viewLab.cshtml @@ -4,107 +4,107 @@ @using Humanizer @model IEnumerable @{ - ViewBag.Title = string.Format("{0}{1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1 - ? "" - : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); + ViewBag.Title = string.Format("{0}{1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1 + ? "" + : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); } @section head { - @if (ViewBag.MetaItem != null) - { - - - } - else - { - string metaDesc = string.Format(VariantTerms.Meta_LabGeneric, ViewBag.ItemId); - - - } + @if (ViewBag.MetaItem != null) + { + + + } + else + { + string metaDesc = string.Format(VariantTerms.Meta_LabGeneric, ViewBag.ItemId); + + + } - @if (ViewBag.PageNumber != 1) - { - - } + @if (ViewBag.PageNumber != 1) + { + + } }

    @string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId)

    @if (ViewBag.MetaItem != null && !string.IsNullOrWhiteSpace(ViewBag.MetaItem.PageContent)) { -

    @VariantTerms.Front_About

    - @Html.Raw(ViewBag.MetaItem.PageContent) +

    @VariantTerms.Front_About

    + @Html.Raw(ViewBag.MetaItem.PageContent) }

    @VariantTerms.Front_Share


    @VariantTerms.Front_Listing

    - @foreach (Build build in Model) - { -
    -

    - - @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") - -

    - @if (build.BuildTime.HasValue) - { -

    - - @build.BuildTime.Value.ToLongDateWithoutDay() - -

    -

    - - @build.BuildTime.Value.ToShortTimeString() - -

    - } - @if (build.IsLeaked) - { -

    - - @VariantTerms.Front_Public -

    - } - else - { -

    - - @VariantTerms.Front_Private -

    - } - @if (User.Identity.IsAuthenticated) - { -

    - - @VariantTerms.Front_Edit - -   - @if (Roles.IsUserInRole("Administrators")) - { - - @VariantTerms.Front_Delete - - } -

    - } -
    - } -
    -
    -
    -
    -
    + @foreach (Build build in Model) + { +
    +

    + + @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") + +

    + @if (build.BuildTime.HasValue) + { +

    + + @build.BuildTime.Value.ToLongDateWithoutDay() + +

    +

    + + @build.BuildTime.Value.ToShortTimeString() + +

    + } + @if (build.IsLeaked) + { +

    + + @VariantTerms.Front_Public +

    + } + else + { +

    + + @VariantTerms.Front_Private +

    + } + @if (User.Identity.IsAuthenticated) + { +

    + + @VariantTerms.Front_Edit + +   + @if (Roles.IsUserInRole("Administrators")) + { + + @VariantTerms.Front_Delete + + } +

    + } +
    + } +
    +
    +
    +
    +
    @PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewLab", ViewContext.RouteData.Values) \ No newline at end of file diff --git a/BuildFeed/Views/front/viewSource.cshtml b/BuildFeed/Views/front/viewSource.cshtml index 8697bf8..b89f4ea 100644 --- a/BuildFeed/Views/front/viewSource.cshtml +++ b/BuildFeed/Views/front/viewSource.cshtml @@ -4,104 +4,104 @@ @using Humanizer @model IEnumerable @{ - ViewBag.Title = string.Format("{0}{1} | {2}", ViewBag.ItemId, ViewBag.PageNumber == 1 - ? "" - : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); + ViewBag.Title = string.Format("{0}{1} | {2}", ViewBag.ItemId, ViewBag.PageNumber == 1 + ? "" + : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); } @section head { - @if (ViewBag.MetaItem != null) - { - - - } + @if (ViewBag.MetaItem != null) + { + + + } - @if (ViewBag.PageNumber != 1) - { - - } + @if (ViewBag.PageNumber != 1) + { + + } }

    @ViewBag.ItemId

    @if (ViewBag.MetaItem != null && !string.IsNullOrWhiteSpace(ViewBag.MetaItem.PageContent)) { -

    @VariantTerms.Front_About

    - @Html.Raw(ViewBag.MetaItem.PageContent) +

    @VariantTerms.Front_About

    + @Html.Raw(ViewBag.MetaItem.PageContent) }

    @VariantTerms.Front_Share


    @VariantTerms.Front_Listing

    - @foreach (Build build in Model) - { -
    -

    - - @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") - -

    - @if (!string.IsNullOrEmpty(build.Lab)) - { -

    - @build.Lab

    - } - @if (build.BuildTime.HasValue) - { -

    - - @build.BuildTime.Value.ToLongDateWithoutDay() -

    -

    - - @build.BuildTime.Value.ToShortTimeString() -

    - } - @if (build.IsLeaked) - { -

    - - @VariantTerms.Front_Public -

    - } - else - { -

    - - @VariantTerms.Front_Private -

    - } - @if (User.Identity.IsAuthenticated) - { -

    - - @VariantTerms.Front_Edit - -   - @if (Roles.IsUserInRole("Administrators")) - { - - @VariantTerms.Front_Delete - - } -

    - } -
    - } -
    -
    -
    -
    -
    + @foreach (Build build in Model) + { +
    +

    + + @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") + +

    + @if (!string.IsNullOrEmpty(build.Lab)) + { +

    + @build.Lab

    + } + @if (build.BuildTime.HasValue) + { +

    + + @build.BuildTime.Value.ToLongDateWithoutDay() +

    +

    + + @build.BuildTime.Value.ToShortTimeString() +

    + } + @if (build.IsLeaked) + { +

    + + @VariantTerms.Front_Public +

    + } + else + { +

    + + @VariantTerms.Front_Private +

    + } + @if (User.Identity.IsAuthenticated) + { +

    + + @VariantTerms.Front_Edit + +   + @if (Roles.IsUserInRole("Administrators")) + { + + @VariantTerms.Front_Delete + + } +

    + } +
    + } +
    +
    +
    +
    +
    @PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewSource", ViewContext.RouteData.Values) \ No newline at end of file diff --git a/BuildFeed/Views/front/viewVersion.cshtml b/BuildFeed/Views/front/viewVersion.cshtml index 2f094b2..8007290 100644 --- a/BuildFeed/Views/front/viewVersion.cshtml +++ b/BuildFeed/Views/front/viewVersion.cshtml @@ -4,103 +4,103 @@ @using Humanizer @model IEnumerable @{ - ViewBag.Title = $"{InvariantTerms.ProductName} {ViewBag.ItemId} {(ViewBag.PageNumber == 1 ? "" : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber))} | {InvariantTerms.SiteName}"; + ViewBag.Title = $"{InvariantTerms.ProductName} {ViewBag.ItemId} {(ViewBag.PageNumber == 1 ? "" : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber))} | {InvariantTerms.SiteName}"; } @section head { - @if (ViewBag.MetaItem != null) - { - - - } + @if (ViewBag.MetaItem != null) + { + + + } - @if (ViewBag.PageNumber != 1) - { - - } + @if (ViewBag.PageNumber != 1) + { + + } }

    @string.Format("{0} {1}", InvariantTerms.ProductName, ViewBag.ItemId)

    @if (ViewBag.MetaItem != null - && !string.IsNullOrWhiteSpace(ViewBag.MetaItem.PageContent)) + && !string.IsNullOrWhiteSpace(ViewBag.MetaItem.PageContent)) { -

    @VariantTerms.Front_About

    - @Html.Raw(ViewBag.MetaItem.PageContent) +

    @VariantTerms.Front_About

    + @Html.Raw(ViewBag.MetaItem.PageContent) }

    @VariantTerms.Front_Share

    @VariantTerms.Front_Listing

    - @foreach (Build build in Model) - { -
    -

    - - @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") - -

    - @if (!string.IsNullOrEmpty(build.Lab)) - { -

    - @build.Lab -

    - } - @if (build.BuildTime.HasValue) - { -

    - - @build.BuildTime.Value.ToLongDateWithoutDay() -

    -

    - - @build.BuildTime.Value.ToShortTimeString() -

    - } - @if (build.IsLeaked) - { -

    - - @VariantTerms.Front_Public -

    - } - else - { -

    - - @VariantTerms.Front_Private -

    - } - @if (User.Identity.IsAuthenticated) - { -

    - - @VariantTerms.Front_Edit - -   - @if (Roles.IsUserInRole("Administrators")) - { - - @VariantTerms.Front_Delete - - } -

    - } -
    - } -
    -
    -
    -
    -
    + @foreach (Build build in Model) + { +
    +

    + + @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") + +

    + @if (!string.IsNullOrEmpty(build.Lab)) + { +

    + @build.Lab +

    + } + @if (build.BuildTime.HasValue) + { +

    + + @build.BuildTime.Value.ToLongDateWithoutDay() +

    +

    + + @build.BuildTime.Value.ToShortTimeString() +

    + } + @if (build.IsLeaked) + { +

    + + @VariantTerms.Front_Public +

    + } + else + { +

    + + @VariantTerms.Front_Private +

    + } + @if (User.Identity.IsAuthenticated) + { +

    + + @VariantTerms.Front_Edit + +   + @if (Roles.IsUserInRole("Administrators")) + { + + @VariantTerms.Front_Delete + + } +

    + } +
    + } +
    +
    +
    +
    +
    @PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewVersion", ViewContext.RouteData.Values) \ No newline at end of file diff --git a/BuildFeed/Views/front/viewYear.cshtml b/BuildFeed/Views/front/viewYear.cshtml index 2e9e904..a50eaf2 100644 --- a/BuildFeed/Views/front/viewYear.cshtml +++ b/BuildFeed/Views/front/viewYear.cshtml @@ -4,113 +4,113 @@ @using Humanizer @model IEnumerable @{ - ViewBag.Title = string.Format("{0}{1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1 - ? "" - : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); + ViewBag.Title = string.Format("{0}{1} | {2}", string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId), ViewBag.PageNumber == 1 + ? "" + : string.Format(VariantTerms.Common_TitlePage, ViewBag.PageNumber), InvariantTerms.SiteName); } @section head { - @if (ViewBag.MetaItem != null) - { - - - } - else - { - string metaDesc = string.Format(VariantTerms.Meta_YearGeneric, ViewBag.ItemId); - - - } + @if (ViewBag.MetaItem != null) + { + + + } + else + { + string metaDesc = string.Format(VariantTerms.Meta_YearGeneric, ViewBag.ItemId); + + + } - @if (ViewBag.PageNumber != 1) - { - - } + @if (ViewBag.PageNumber != 1) + { + + } }

    @string.Format(VariantTerms.Front_BuildsFrom, ViewBag.ItemId)

    @if (ViewBag.MetaItem != null && !string.IsNullOrWhiteSpace(ViewBag.MetaItem.PageContent)) { -

    @VariantTerms.Front_About

    - @Html.Raw(ViewBag.MetaItem.PageContent) +

    @VariantTerms.Front_About

    + @Html.Raw(ViewBag.MetaItem.PageContent) }

    @VariantTerms.Front_Share


    @VariantTerms.Front_Listing

    - @foreach (Build build in Model) - { -
    -

    - - @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") - -

    - @if (!string.IsNullOrEmpty(build.Lab)) - { -

    - @build.Lab -

    - } - @if (build.BuildTime.HasValue) - { -

    - - @build.BuildTime.Value.ToLongDateWithoutDay() - -

    -

    - - @build.BuildTime.Value.ToShortTimeString() - -

    - } - @if (build.IsLeaked) - { -

    - - @VariantTerms.Front_Public -

    - } - else - { -

    - - @VariantTerms.Front_Private -

    - } - @if (User.Identity.IsAuthenticated) - { -

    - - @VariantTerms.Front_Edit - -   - @if (Roles.IsUserInRole("Administrators")) - { - - @VariantTerms.Front_Delete - - } -

    - } -
    - } -
    -
    -
    -
    -
    + @foreach (Build build in Model) + { +
    +

    + + @($"{build.MajorVersion}.{build.MinorVersion}.{build.Number}.{build.Revision}") + +

    + @if (!string.IsNullOrEmpty(build.Lab)) + { +

    + @build.Lab +

    + } + @if (build.BuildTime.HasValue) + { +

    + + @build.BuildTime.Value.ToLongDateWithoutDay() + +

    +

    + + @build.BuildTime.Value.ToShortTimeString() + +

    + } + @if (build.IsLeaked) + { +

    + + @VariantTerms.Front_Public +

    + } + else + { +

    + + @VariantTerms.Front_Private +

    + } + @if (User.Identity.IsAuthenticated) + { +

    + + @VariantTerms.Front_Edit + +   + @if (Roles.IsUserInRole("Administrators")) + { + + @VariantTerms.Front_Delete + + } +

    + } +
    + } +
    +
    +
    +
    +
    @PaginationHelpers.PaginationBlock((int)ViewBag.PageNumber, (int)ViewBag.PageCount, "viewYear", ViewContext.RouteData.Values) \ No newline at end of file diff --git a/BuildFeed/Views/shared/_default.cshtml b/BuildFeed/Views/shared/_default.cshtml index 3b8b9fb..a10a69e 100644 --- a/BuildFeed/Views/shared/_default.cshtml +++ b/BuildFeed/Views/shared/_default.cshtml @@ -272,7 +272,7 @@ - + @RenderSection("scripts", false) + @RenderSection("scripts", false) diff --git a/BuildFeed/Views/support/password.cshtml b/BuildFeed/Views/support/password.cshtml index 02f2edc..3c84455 100644 --- a/BuildFeed/Views/support/password.cshtml +++ b/BuildFeed/Views/support/password.cshtml @@ -21,11 +21,17 @@
    - @Html.LabelFor(model => model.OldPassword, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.OldPassword, new + { + @class = "control-label col-md-2" + })
    - @Html.PasswordFor(model => model.OldPassword, new { @class = "form-control" }) + @Html.PasswordFor(model => model.OldPassword, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.OldPassword) @@ -33,11 +39,17 @@
    - @Html.LabelFor(model => model.NewPassword, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.NewPassword, new + { + @class = "control-label col-md-2" + })
    - @Html.PasswordFor(model => model.NewPassword, new { @class = "form-control" }) + @Html.PasswordFor(model => model.NewPassword, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.NewPassword) @@ -45,11 +57,17 @@
    - @Html.LabelFor(model => model.ConfirmNewPassword, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.ConfirmNewPassword, new + { + @class = "control-label col-md-2" + })
    - @Html.PasswordFor(model => model.ConfirmNewPassword, new { @class = "form-control" }) + @Html.PasswordFor(model => model.ConfirmNewPassword, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.ConfirmNewPassword) diff --git a/BuildFeed/Views/support/register.cshtml b/BuildFeed/Views/support/register.cshtml index 11e2980..dbbe459 100644 --- a/BuildFeed/Views/support/register.cshtml +++ b/BuildFeed/Views/support/register.cshtml @@ -21,11 +21,17 @@
    - @Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.UserName, new + { + @class = "control-label col-md-2" + })
    - @Html.TextBoxFor(model => model.UserName, new { @class = "form-control" }) + @Html.TextBoxFor(model => model.UserName, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.UserName) @@ -33,11 +39,17 @@
    - @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.Password, new + { + @class = "control-label col-md-2" + })
    - @Html.PasswordFor(model => model.Password, new { @class = "form-control" }) + @Html.PasswordFor(model => model.Password, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.Password) @@ -45,11 +57,17 @@
    - @Html.LabelFor(model => model.ConfirmPassword, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.ConfirmPassword, new + { + @class = "control-label col-md-2" + })
    - @Html.PasswordFor(model => model.ConfirmPassword, new { @class = "form-control" }) + @Html.PasswordFor(model => model.ConfirmPassword, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.ConfirmPassword) @@ -57,11 +75,17 @@
    - @Html.LabelFor(model => model.EmailAddress, new { @class = "control-label col-md-2" }) + @Html.LabelFor(model => model.EmailAddress, new + { + @class = "control-label col-md-2" + })
    - @Html.TextBoxFor(model => model.EmailAddress, new { @class = "form-control" }) + @Html.TextBoxFor(model => model.EmailAddress, new + { + @class = "form-control" + })
    @Html.ValidationMessageFor(model => model.EmailAddress) diff --git a/BuildFeed/Views/support/sitemap.cshtml b/BuildFeed/Views/support/sitemap.cshtml index 79de0e1..d137300 100644 --- a/BuildFeed/Views/support/sitemap.cshtml +++ b/BuildFeed/Views/support/sitemap.cshtml @@ -1,5 +1,5 @@ @using BuildFeed.Model.View -@model SitemapData +@model BuildFeed.Model.View.SitemapData @{ ViewBag.Title = $"{VariantTerms.Common_Sitemap} | {InvariantTerms.SiteName}"; } diff --git a/BuildFeed/Views/support/thanks_register.cshtml b/BuildFeed/Views/support/thanks_register.cshtml index 479bcef..9a5bd01 100644 --- a/BuildFeed/Views/support/thanks_register.cshtml +++ b/BuildFeed/Views/support/thanks_register.cshtml @@ -1,7 +1,6 @@ - -@{ - ViewBag.Title = $"{VariantTerms.Support_ThanksRegister} | {BuildFeed.Local.InvariantTerms.SiteName}"; +@{ + ViewBag.Title = $"{VariantTerms.Support_ThanksRegister} | {InvariantTerms.SiteName}"; }

    @VariantTerms.Support_ThanksRegister

    -

    @VariantTerms.Support_AccountValidation

    +

    @VariantTerms.Support_AccountValidation

    \ No newline at end of file diff --git a/BuildFeed/content/Web.config b/BuildFeed/content/Web.config index 600e1f9..65fa3d9 100644 --- a/BuildFeed/content/Web.config +++ b/BuildFeed/content/Web.config @@ -1,8 +1,9 @@  + - + \ No newline at end of file diff --git a/BuildFeed/manifest.json b/BuildFeed/manifest.json index b8d7e4b..b3e8c26 100644 --- a/BuildFeed/manifest.json +++ b/BuildFeed/manifest.json @@ -1,16 +1,16 @@ { - "name": "BuildFeed", - "short_name": "BuildFeed", - "background_color": "#373736", - "theme_color": "#373736", - "description": "Learn what Dona Sarkar won't tell you. Keep up to date with the latest Microsoft Windows developments with BuildFeed, the comprehensive build tracker.", - "icons": [ - { - "src": "https://buildfeed.net/content/tile/notify.png", - "sizes": "2048x2048" - } - ], - "start_url": "https://buildfeed.net/", - "display": "standalone", - "gcm_sender_id": "482941778795" + "name": "BuildFeed", + "short_name": "BuildFeed", + "background_color": "#373736", + "theme_color": "#373736", + "description": "Learn what Dona Sarkar won't tell you. Keep up to date with the latest Microsoft Windows developments with BuildFeed, the comprehensive build tracker.", + "icons": [ + { + "src": "https://buildfeed.net/content/tile/notify.png", + "sizes": "2048x2048" + } + ], + "start_url": "https://buildfeed.net/", + "display": "standalone", + "gcm_sender_id": "482941778795" } \ No newline at end of file diff --git a/BuildFeed/packages.config b/BuildFeed/packages.config index b6fd40e..9cf8cd4 100644 --- a/BuildFeed/packages.config +++ b/BuildFeed/packages.config @@ -1,82 +1,83 @@  + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BuildFeed/res/Web.config b/BuildFeed/res/Web.config index 600e1f9..65fa3d9 100644 --- a/BuildFeed/res/Web.config +++ b/BuildFeed/res/Web.config @@ -1,8 +1,9 @@  + - + \ No newline at end of file diff --git a/BuildFeed/res/css/dark.css.map b/BuildFeed/res/css/dark.css.map index a89c449..439efe1 100644 --- a/BuildFeed/res/css/dark.css.map +++ b/BuildFeed/res/css/dark.css.map @@ -1 +1 @@ -{"version":3,"sources":["dark.scss","dark.css"],"names":[],"mappings":"AAAA,KAEI,iBAAA,QACA,MAAA,QAGJ,EAEI,MAAA,KCAJ,eDGA,KAGI,MAAA,QAGJ,eAEI,oBAAA,QAGJ,cAEI,iBAAA,QACA,MAAA,QAHJ,iBAOQ,oBAAA,KAIR,iBAEI,iBAAA,QACA,MAAA,QACA,oBAAA,QAJJ,wBAQQ,MAAA,QARR,6CAiBgB,MAAA,QAjBhB,kDCJE,mDD2Bc,iBAAA,QAMhB,eAEI,iBAAA,QACA,aAAA,QACA,WAAA,EAAA,IAAA,KAAA,gBC5BF,wBADA,uBDyBF,uBAUQ,iBAAA,QAIR,QAEI,WAAA,EAAA,IAAA,KAAA,gBAAA,MAFJ,WAAA,WAMQ,MAAA,QCnCN,kCD6BF,0BC9BE,oBD2CM,MAAA,QAIR,0BAIQ,WAAA,QACA,MAAA,kBC1CR,yCADA,wCDsCA,wCAYQ,WAAA,QACA,MAAA,kBAIR,oCAEI,iBAAA,QAFJ,uCAMQ,MAAA,QCnDN,2ED6CF,0EAYQ,iBAAA,QACA,MAAA,QACA,aAAA","file":"dark.css","sourcesContent":["body\r\n{\r\n background-color: #f6f5f3;\r\n color: #373736;\r\n}\r\n\r\na\r\n{\r\n color: #fff;\r\n}\r\n\r\nh1 > a,\r\n#page-footer a\r\n{\r\n color: #373736;\r\n}\r\n\r\ntable thead th\r\n{\r\n border-bottom-color: #f6f5f3;\r\n}\r\n\r\n#page-content\r\n{\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n\r\n h3\r\n {\r\n border-bottom-color: #ccc;\r\n }\r\n}\r\n\r\n#page-navigation\r\n{\r\n background-color: #242423;\r\n color: #f6f5f3;\r\n border-bottom-color: #f6f5f3;\r\n\r\n button\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n > li\r\n {\r\n a\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n &.open > a,\r\n > a:hover\r\n {\r\n background-color: #373736;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.dropdown-menu\r\n{\r\n background-color: #242423;\r\n border-color: #f6f5f3;\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15);\r\n\r\n a:hover,\r\n a:focus,\r\n a:active\r\n {\r\n background-color: #373736;\r\n }\r\n}\r\n\r\narticle\r\n{\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15) inset;\r\n\r\n h1, h3\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n .build-group > h3 > a,\r\n a.more-link,\r\n .build-details-comments a\r\n {\r\n color: #d6d5d3;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n > li.active > a\r\n {\r\n background: #f6f5f3;\r\n color: #242423 !important;\r\n }\r\n\r\n > li:hover:not(.disabled) > a,\r\n > li:focus:not(.disabled) > a,\r\n > li:active:not(.disabled) > a\r\n {\r\n background: #d6d5d3;\r\n color: #373736 !important;\r\n }\r\n}\r\n\r\n#modal-search-overlay #modal-search\r\n{\r\n background-color: #242423;\r\n\r\n h3\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n > #modal-search-box > #modal-search-input,\r\n > #modal-search-box > #modal-search-button\r\n {\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n border-color: #d6d5d3;\r\n }\r\n}\r\n","body{background-color:#f6f5f3;color:#373736}a{color:#fff}#page-footer a,h1>a{color:#373736}table thead th{border-bottom-color:#f6f5f3}#page-content{background-color:#373736;color:#f6f5f3}#page-content h3{border-bottom-color:#ccc}#page-navigation{background-color:#242423;color:#f6f5f3;border-bottom-color:#f6f5f3}#page-navigation button{color:#f6f5f3}#page-navigation #page-navigation-links>li a{color:#f6f5f3}#page-navigation #page-navigation-links>li.open>a,#page-navigation #page-navigation-links>li>a:hover{background-color:#373736}.dropdown-menu{background-color:#242423;border-color:#f6f5f3;box-shadow:0 5px 10px rgba(0,0,0,.15)}.dropdown-menu a:active,.dropdown-menu a:focus,.dropdown-menu a:hover{background-color:#373736}article{box-shadow:0 5px 10px rgba(0,0,0,.15) inset}article h1,article h3{color:#f6f5f3}article .build-details-comments a,article .build-group>h3>a,article a.more-link{color:#d6d5d3}ul.pagination>li.active>a{background:#f6f5f3;color:#242423!important}ul.pagination>li:active:not(.disabled)>a,ul.pagination>li:focus:not(.disabled)>a,ul.pagination>li:hover:not(.disabled)>a{background:#d6d5d3;color:#373736!important}#modal-search-overlay #modal-search{background-color:#242423}#modal-search-overlay #modal-search h3{color:#f6f5f3}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-button,#modal-search-overlay #modal-search>#modal-search-box>#modal-search-input{background-color:#373736;color:#f6f5f3;border-color:#d6d5d3}\n/*# sourceMappingURL=dark.css.map */\n"]} \ No newline at end of file +{"version":3,"sources":["dark.scss","dark.css"],"names":[],"mappings":"AAAA,KAEI,iBAAA,QACA,MAAA,QAGJ,EAEI,MAAA,KCAJ,eDGA,KAGI,MAAA,QAGJ,eAEI,oBAAA,QAGJ,cAEI,iBAAA,QACA,MAAA,QAHJ,iBAOQ,oBAAA,KAIR,iBAEI,iBAAA,QACA,MAAA,QACA,oBAAA,QAJJ,wBAQQ,MAAA,QARR,6CAiBgB,MAAA,QAjBhB,kDCJE,mDD2Bc,iBAAA,QAMhB,eAEI,iBAAA,QACA,aAAA,QACA,WAAA,EAAA,IAAA,KAAA,gBC5BF,wBADA,uBDyBF,uBAUQ,iBAAA,QAIR,QAEI,WAAA,EAAA,IAAA,KAAA,gBAAA,MAFJ,WAAA,WAMQ,MAAA,QCnCN,kCD6BF,0BC9BE,oBD2CM,MAAA,QAIR,0BAIQ,WAAA,QACA,MAAA,kBC1CR,yCADA,wCDsCA,wCAYQ,WAAA,QACA,MAAA,kBAIR,oCAEI,iBAAA,QAFJ,uCAMQ,MAAA,QCnDN,2ED6CF,0EAYQ,iBAAA,QACA,MAAA,QACA,aAAA","file":"dark.css","sourcesContent":["body\r\n{\r\n background-color: #f6f5f3;\r\n color: #373736;\r\n}\r\n\r\na\r\n{\r\n color: #fff;\r\n}\r\n\r\nh1 > a,\r\n#page-footer a\r\n{\r\n color: #373736;\r\n}\r\n\r\ntable thead th\r\n{\r\n border-bottom-color: #f6f5f3;\r\n}\r\n\r\n#page-content\r\n{\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n\r\n h3\r\n {\r\n border-bottom-color: #ccc;\r\n }\r\n}\r\n\r\n#page-navigation\r\n{\r\n background-color: #242423;\r\n color: #f6f5f3;\r\n border-bottom-color: #f6f5f3;\r\n\r\n button\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n > li\r\n {\r\n a\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n &.open > a,\r\n > a:hover\r\n {\r\n background-color: #373736;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.dropdown-menu\r\n{\r\n background-color: #242423;\r\n border-color: #f6f5f3;\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15);\r\n\r\n a:hover,\r\n a:focus,\r\n a:active\r\n {\r\n background-color: #373736;\r\n }\r\n}\r\n\r\narticle\r\n{\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15) inset;\r\n\r\n h1, h3\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n .build-group > h3 > a,\r\n a.more-link,\r\n .build-details-comments a\r\n {\r\n color: #d6d5d3;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n > li.active > a\r\n {\r\n background: #f6f5f3;\r\n color: #242423 !important;\r\n }\r\n\r\n > li:hover:not(.disabled) > a,\r\n > li:focus:not(.disabled) > a,\r\n > li:active:not(.disabled) > a\r\n {\r\n background: #d6d5d3;\r\n color: #373736 !important;\r\n }\r\n}\r\n\r\n#modal-search-overlay #modal-search\r\n{\r\n background-color: #242423;\r\n\r\n h3\r\n {\r\n color: #f6f5f3;\r\n }\r\n\r\n > #modal-search-box > #modal-search-input,\r\n > #modal-search-box > #modal-search-button\r\n {\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n border-color: #d6d5d3;\r\n }\r\n}\r\n","body\n{\n background-color: #f6f5f3;\n color: #373736\n}\n\na\n{\n color: #fff\n}\n\n#page-footer a, h1 > a\n{\n color: #373736\n}\n\ntable thead th\n{\n border-bottom-color: #f6f5f3\n}\n\n#page-content\n{\n background-color: #373736;\n color: #f6f5f3\n}\n\n#page-content h3\n{\n border-bottom-color: #ccc\n}\n\n#page-navigation\n{\n background-color: #242423;\n border-bottom-color: #f6f5f3;\n color: #f6f5f3;\n}\n\n#page-navigation button\n{\n color: #f6f5f3\n}\n\n#page-navigation #page-navigation-links > li a\n{\n color: #f6f5f3\n}\n\n#page-navigation #page-navigation-links > li.open > a, #page-navigation #page-navigation-links > li > a:hover\n{\n background-color: #373736\n}\n\n.dropdown-menu\n{\n background-color: #242423;\n border-color: #f6f5f3;\n box-shadow: 0 5px 10px rgba(0, 0, 0, .15)\n}\n\n.dropdown-menu a:active, .dropdown-menu a:focus, .dropdown-menu a:hover\n{\n background-color: #373736\n}\n\narticle\n{\n box-shadow: 0 5px 10px rgba(0, 0, 0, .15) inset\n}\n\narticle h1, article h3\n{\n color: #f6f5f3\n}\n\narticle .build-details-comments a, article .build-group > h3 > a, article a.more-link\n{\n color: #d6d5d3\n}\n\nul.pagination > li.active > a\n{\n background: #f6f5f3;\n color: #242423 !important\n}\n\nul.pagination > li:active:not(.disabled) > a, ul.pagination > li:focus:not(.disabled) > a, ul.pagination > li:hover:not(.disabled) > a\n{\n background: #d6d5d3;\n color: #373736 !important\n}\n\n#modal-search-overlay #modal-search\n{\n background-color: #242423\n}\n\n#modal-search-overlay #modal-search h3\n{\n color: #f6f5f3\n}\n\n#modal-search-overlay #modal-search > #modal-search-box > #modal-search-button, #modal-search-overlay #modal-search > #modal-search-box > #modal-search-input\n{\n background-color: #373736;\n border-color: #d6d5d3;\n color: #f6f5f3;\n}\n/*# sourceMappingURL=dark.css.map */"]} \ No newline at end of file diff --git a/BuildFeed/res/css/default.css.map b/BuildFeed/res/css/default.css.map index 9f3215d..f766d47 100644 --- a/BuildFeed/res/css/default.css.map +++ b/BuildFeed/res/css/default.css.map @@ -1 +1 @@ -{"version":3,"sources":["default.scss","default.css"],"names":[],"mappings":"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","file":"default.css","sourcesContent":["body\r\n{\r\n font-family: 'Roboto', sans-serif;\r\n font-size: 10pt;\r\n line-height: 1.6;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\na\r\n{\r\n text-decoration: none;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: underline;\r\n }\r\n}\r\n\r\nh1\r\n{\r\n font-size: 3em;\r\n font-weight: 500;\r\n}\r\n\r\np\r\n{\r\n margin: 0 0 1em;\r\n}\r\n\r\ntable\r\n{\r\n width: 100%;\r\n border-collapse: collapse;\r\n\r\n th,\r\n td\r\n {\r\n margin: 0;\r\n border: 0;\r\n padding: 4px 6px;\r\n }\r\n\r\n thead th\r\n {\r\n border-bottom: 1px solid;\r\n text-align: left;\r\n }\r\n}\r\n\r\n.at-share-btn-elements\r\n{\r\n margin-left: -8px;\r\n\r\n > .at_flat_counter\r\n {\r\n font-size: 14px !important;\r\n vertical-align: top !important;\r\n }\r\n\r\n > .at-share-btn\r\n {\r\n margin-left: 8px !important;\r\n }\r\n}\r\n\r\n\r\n.container\r\n{\r\n width: 1240px;\r\n max-width: 80%;\r\n margin: 0 auto;\r\n position: relative;\r\n}\r\n\r\n.no-wrapping\r\n{\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.eager-wrapping\r\n{\r\n word-wrap: break-word;\r\n}\r\n\r\n.field-validation-error\r\n{\r\n display: block;\r\n margin: #{(1em / 3)} 0;\r\n color: #FF2626;\r\n}\r\n\r\na.button,\r\ninput[type=submit].button\r\n{\r\n display: inline-block;\r\n vertical-align: middle;\r\n padding: #{(1em / 3)} 1em;\r\n background-color: #0A81CC;\r\n color: #fff;\r\n text-decoration: none;\r\n border-radius: #{(1em / 6)};\r\n text-align: center;\r\n\r\n &.edit-button\r\n {\r\n background-color: #FF9F19;\r\n }\r\n\r\n &.delete-button\r\n {\r\n background-color: #FF2626;\r\n }\r\n\r\n &.add-button\r\n {\r\n background-color: #12B23F;\r\n }\r\n}\r\n\r\nheader#page-header\r\n{\r\n h1\r\n {\r\n font-weight: 300;\r\n margin: .33em 0;\r\n\r\n a\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n}\r\n\r\nnav#page-navigation\r\n{\r\n border-bottom-width: 1px;\r\n border-bottom-style: solid;\r\n position: relative;\r\n z-index: 10;\r\n\r\n #page-navigation-links\r\n {\r\n margin: 0 -15px;\r\n padding: 0;\r\n text-align: right;\r\n\r\n > li\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n\r\n > a\r\n {\r\n display: block;\r\n padding: 15px;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n }\r\n }\r\n\r\n button\r\n {\r\n display: none;\r\n width: 100%;\r\n border: 0;\r\n font-size: 1.2em;\r\n font-weight: 300;\r\n padding: #{(2em / 3)} 0;\r\n background: none;\r\n }\r\n}\r\n\r\n.dropdown-parent\r\n{\r\n .dropdown-menu\r\n {\r\n box-sizing: border-box;\r\n display: none;\r\n position: absolute;\r\n left: -15px;\r\n right: -15px;\r\n max-width: 1270px;\r\n padding: 15px 15px 0;\r\n text-align: left;\r\n z-index: 10;\r\n border-width: 1px;\r\n border-style: solid;\r\n border-top-width: 0;\r\n flex-wrap: wrap;\r\n\r\n h4\r\n {\r\n margin: 0 0 .5em;\r\n font-size: 1.2em;\r\n font-weight: 500;\r\n }\r\n\r\n .dropdown-menu-block\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-bottom: 15px;\r\n flex-grow: 1;\r\n\r\n ul\r\n {\r\n padding: 0;\r\n display: flex;\r\n flex-wrap: wrap;\r\n }\r\n\r\n li\r\n {\r\n list-style-type: none;\r\n line-height: 2em;\r\n width: 133px;\r\n vertical-align: top;\r\n flex-grow: 1;\r\n\r\n > a\r\n {\r\n display: block;\r\n padding: 0 1em;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n }\r\n }\r\n\r\n #settings-theme-menu\r\n {\r\n width: 120px;\r\n flex-grow: 1;\r\n }\r\n\r\n #settings-lang-menu\r\n {\r\n width: 320px;\r\n flex-grow: 1000;\r\n }\r\n }\r\n\r\n &.open\r\n {\r\n .dropdown-menu\r\n {\r\n display: flex;\r\n }\r\n }\r\n}\r\n\r\narticle\r\n{\r\n padding: 2em 0;\r\n\r\n h1\r\n {\r\n font-size: 4em;\r\n font-weight: 300;\r\n text-align: center;\r\n margin: 0 0 #{(1em / 2)};\r\n\r\n &.eager-wrapping\r\n {\r\n font-size: 4em;\r\n }\r\n }\r\n\r\n h3\r\n {\r\n font-size: 2em;\r\n font-weight: bold;\r\n margin: #{(1em / 3)} 0 #{(2em / 3)};\r\n text-transform: uppercase;\r\n letter-spacing: #{(1em / 4)};\r\n border-bottom: 1px solid;\r\n }\r\n\r\n h4\r\n {\r\n margin: 1em 0 0;\r\n }\r\n\r\n .build-group-listing\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n margin: 0 #{(-3em / 2)};\r\n\r\n .build-group\r\n {\r\n width: 250px;\r\n flex-grow: 1;\r\n margin: 0 #{(3em / 2)} 3em;\r\n box-sizing: border-box;\r\n border: 3px solid #0A81CC;\r\n padding: 0.5em 1.5em;\r\n\r\n h3\r\n {\r\n background-color: #0A81CC;\r\n color: #fff;\r\n margin: -0.25em -0.75em 0.75em;\r\n font-size: 2em;\r\n line-height: 1.25em;\r\n font-weight: normal;\r\n padding: 0;\r\n letter-spacing: 0;\r\n border-bottom: 0;\r\n text-transform: lowercase;\r\n text-align: center;\r\n\r\n a\r\n {\r\n color: #fff;\r\n text-decoration: none !important;\r\n display: block;\r\n padding: 0.25em 0;\r\n }\r\n }\r\n\r\n p\r\n {\r\n font-size: 1.1em;\r\n font-weight: 300;\r\n margin: 0 0 #{(2em / 3)};\r\n }\r\n }\r\n\r\n .build-group-empty\r\n {\r\n width: 270px;\r\n flex-grow: 1;\r\n margin: 0 0.75em;\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\n.latest-flex\r\n{\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n margin: 2em -2em 0 0;\r\n\r\n .latest-flex-item\r\n {\r\n width: 240px;\r\n box-sizing: border-box;\r\n background: #fff;\r\n flex-grow: 1;\r\n margin: 0 2em 2em 0;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n\r\n h3.latest-flex-title\r\n {\r\n border-bottom: 0;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 1.25em;\r\n font-weight: normal;\r\n text-align: center;\r\n padding: 0.4em 0.5em;\r\n margin: -1px;\r\n color: #fff;\r\n }\r\n\r\n &.latest-flex-red\r\n {\r\n border: #{(1em / 4)} solid #FF2626;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #FF2626;\r\n }\r\n }\r\n\r\n &.latest-flex-yellow\r\n {\r\n border: #{(1em / 4)} solid #FF9F19;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #FF9F19;\r\n }\r\n }\r\n\r\n &.latest-flex-blue\r\n {\r\n border: #{(1em / 4)} solid #0A81CC;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #0A81CC;\r\n }\r\n }\r\n\r\n &.latest-flex-green\r\n {\r\n border: #{(1em / 4)} solid #12B23F;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #12B23F;\r\n }\r\n }\r\n\r\n .latest-flex-detail\r\n {\r\n color: #373736;\r\n text-align: center;\r\n font-weight: 300;\r\n\r\n .latest-flex-build\r\n {\r\n font-size: #{(7em / 3)};\r\n margin: #{(1em / 3)} 0 #{(1em / 6)};\r\n }\r\n\r\n .latest-flex-lab\r\n {\r\n font-size: 1.5em;\r\n margin: 0 0 0.5em;\r\n }\r\n\r\n .latest-flex-time\r\n {\r\n margin: 0 0 0.75em;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.latest-full\r\n{\r\n display: block;\r\n background: #0A81CC;\r\n font-weight: normal;\r\n text-align: center;\r\n color: #fff;\r\n margin: 0 0 2em;\r\n padding: #{(2em / 3)};\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.build-details-flex\r\n{\r\n display: flex;\r\n font-size: 1.1em;\r\n flex-wrap: wrap;\r\n\r\n .build-details-flex-item\r\n {\r\n flex-grow: 1;\r\n margin-bottom: 1.5em;\r\n width: 160px;\r\n\r\n label\r\n {\r\n font-weight: bold;\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-right: 1em;\r\n min-width: 100px;\r\n }\r\n\r\n .build-details-flex-value\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-right: 20px;\r\n }\r\n }\r\n}\r\n\r\n.form-group\r\n{\r\n margin-bottom: 1.5em;\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n > label\r\n {\r\n width: 20%;\r\n max-width: 240px;\r\n min-width: 120px;\r\n text-align: left;\r\n font-weight: bold;\r\n margin-right: 1em;\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-top: #{(1em / 4)};\r\n flex-grow: 1;\r\n }\r\n\r\n > div\r\n {\r\n margin-left: calc(20% + 1em);\r\n width: 40%;\r\n min-width: 240px;\r\n max-width: 560px;\r\n display: inline-block;\r\n vertical-align: top;\r\n flex-grow: 2;\r\n\r\n input, textarea, select\r\n {\r\n width: 100%;\r\n box-sizing: border-box;\r\n border: 1px solid;\r\n padding: #{(1em / 3)} #{(1em / 2)};\r\n border-radius: #{(1em / 6)};\r\n line-height: 1em;\r\n border-color: #888;\r\n }\r\n\r\n .group-input-button\r\n {\r\n display: flex;\r\n\r\n input\r\n {\r\n border-top-right-radius: 0;\r\n border-bottom-right-radius: 0;\r\n border-right: 0;\r\n }\r\n\r\n button\r\n {\r\n border-top-left-radius: 0;\r\n border-bottom-left-radius: 0;\r\n width: 120px;\r\n border: 1px solid #888;\r\n border-left: 0;\r\n }\r\n }\r\n\r\n input[type=submit],\r\n input[type=checkbox]\r\n {\r\n width: auto;\r\n }\r\n\r\n > input[type=submit],\r\n > button,\r\n .group-input-button > button\r\n {\r\n display: inline-block;\r\n vertical-align: middle;\r\n padding: #{(1em / 3)} 1em;\r\n background-color: #12B23F;\r\n color: #fff;\r\n text-decoration: none;\r\n border-radius: #{(1em / 6)};\r\n border: 0;\r\n line-height: 1.6;\r\n }\r\n\r\n &.wide-group\r\n {\r\n width: 40%;\r\n\r\n > .trumbowyg-box\r\n {\r\n width: 100%;\r\n margin: 0;\r\n }\r\n }\r\n }\r\n\r\n > label + div\r\n {\r\n margin-left: 0;\r\n }\r\n}\r\n\r\n.credits-wrapper\r\n{\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n .credits-list\r\n {\r\n width: 480px;\r\n max-width: 100%;\r\n flex-grow: 1;\r\n }\r\n}\r\n\r\n.credits-list\r\n{\r\n dt\r\n {\r\n font-weight: bold;\r\n }\r\n\r\n dd\r\n {\r\n margin-left: 0;\r\n }\r\n\r\n dd + dt\r\n {\r\n margin-top: 1.5em;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n text-align: center;\r\n margin: 0.5em 0 1em;\r\n padding: 0;\r\n display: flex;\r\n justify-content: center;\r\n\r\n > li\r\n {\r\n list-style: none;\r\n width: 1.8em;\r\n line-height: 1.8em;\r\n margin: 0 #{(1em / 3)};\r\n\r\n > a,\r\n > span\r\n {\r\n display: block;\r\n border-radius: #{(1em / 3)};\r\n text-decoration: none;\r\n }\r\n\r\n > span\r\n {\r\n cursor: not-allowed;\r\n }\r\n }\r\n}\r\n\r\nfooter#page-footer\r\n{\r\n padding: #{(4em / 3)} 0 #{(4em / 6)};\r\n font-size: 0.85em;\r\n\r\n .footer-flex\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n .footer-flex-item\r\n {\r\n width: 50%;\r\n min-width: 200px;\r\n text-align: center;\r\n flex-grow: 1;\r\n\r\n &:last-child\r\n {\r\n text-align: right;\r\n }\r\n\r\n &:first-child\r\n {\r\n text-align: left;\r\n }\r\n }\r\n }\r\n\r\n p\r\n {\r\n margin: 0 0 #{(2em / 5)};\r\n }\r\n}\r\n\r\n#modal-search-overlay\r\n{\r\n display: none;\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n transition: background-color linear 0.6s, -webkit-backdrop-filter linear 0.6s, backdrop-filter linear 0.6s;\r\n background-color: rgba(0,0,0, 0);\r\n -webkit-backdrop-filter: blur(0);\r\n backdrop-filter: blur(0);\r\n z-index: 100;\r\n\r\n &.open\r\n {\r\n display: block;\r\n background-color: rgba(0,0,0, 0.75);\r\n -webkit-backdrop-filter: blur(10px);\r\n backdrop-filter: blur(10px);\r\n }\r\n\r\n #modal-search\r\n {\r\n position: absolute;\r\n top: 15%;\r\n left: 25%;\r\n width: 50%;\r\n max-height: 70%;\r\n overflow: auto;\r\n padding: 2em;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n border: 1px solid #ccc;\r\n\r\n h3\r\n {\r\n margin: 0 0 1em;\r\n font-size: 1.5em;\r\n font-weight: 300;\r\n }\r\n\r\n > #modal-search-box\r\n {\r\n width: 100%;\r\n\r\n > *\r\n {\r\n display: inline-block;\r\n height: 2.5em;\r\n padding: 0.5em;\r\n box-sizing: border-box;\r\n border: 1px solid;\r\n }\r\n\r\n > #modal-search-input\r\n {\r\n width: calc(100% - #{(10em / 3)});\r\n }\r\n\r\n > #modal-search-button\r\n {\r\n width: #{(8em / 3)};\r\n }\r\n }\r\n\r\n > #modal-search-result\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n\r\n > .search-result-item\r\n {\r\n display: block;\r\n padding: 0 1em;\r\n width: 140px;\r\n flex-grow: 1;\r\n\r\n > .search-result-heading\r\n {\r\n font-size: 1.2em;\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n#menu-open-overlay\r\n{\r\n display: none;\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 5;\r\n\r\n &.open\r\n {\r\n display: block;\r\n }\r\n}\r\n\r\n@media (max-width: 980px)\r\n{\r\n #modal-search-overlay #modal-search\r\n {\r\n left: 10%;\r\n width: 80%;\r\n }\r\n}\r\n\r\n@media (max-width: 640px)\r\n{\r\n header#page-header h1\r\n {\r\n text-align: center;\r\n }\r\n\r\n nav#page-navigation\r\n {\r\n button\r\n {\r\n display: block;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n display: none;\r\n\r\n &.open\r\n {\r\n display: block;\r\n }\r\n\r\n > li\r\n {\r\n display: block;\r\n text-align: left;\r\n }\r\n }\r\n }\r\n\r\n article\r\n {\r\n h1,\r\n h1.eager-wrapping\r\n {\r\n font-size: 3em;\r\n line-height: #{(4 / 3)};\r\n }\r\n\r\n h3\r\n {\r\n text-align: center;\r\n }\r\n\r\n .addthis_sharing_toolbox\r\n {\r\n text-align: center;\r\n }\r\n }\r\n\r\n footer#page-footer .footer-flex .footer-flex-item\r\n {\r\n &:first-child\r\n {\r\n text-align: center;\r\n margin-bottom: #{(3em / 2)};\r\n }\r\n\r\n &:last-child\r\n {\r\n text-align: center;\r\n }\r\n }\r\n}\r\n\r\n@media (max-width: 1300px)\r\n{\r\n .latest-flex .latest-flex-item\r\n {\r\n min-width: calc(50% - 2em);\r\n }\r\n}","body{font-family:Roboto,sans-serif;font-size:10pt;line-height:1.6;margin:0;box-sizing:border-box}a{text-decoration:none}a:active,a:focus,a:hover{text-decoration:underline}h1{font-size:3em;font-weight:500}p{margin:0 0 1em}table{width:100%;border-collapse:collapse}table td,table th{margin:0;border:0;padding:4px 6px}table thead th{border-bottom:1px solid;text-align:left}.at-share-btn-elements{margin-left:-8px}.at-share-btn-elements>.at_flat_counter{font-size:14px!important;vertical-align:top!important}.at-share-btn-elements>.at-share-btn{margin-left:8px!important}.container{width:1240px;max-width:80%;margin:0 auto;position:relative}.no-wrapping{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.eager-wrapping{word-wrap:break-word}.field-validation-error{display:block;margin:.33333em 0;color:#ff2626}a.button,input[type=submit].button{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#0a81cc;color:#fff;text-decoration:none;border-radius:.16667em;text-align:center}a.button.edit-button,input[type=submit].button.edit-button{background-color:#ff9f19}a.button.delete-button,input[type=submit].button.delete-button{background-color:#ff2626}a.button.add-button,input[type=submit].button.add-button{background-color:#12b23f}header#page-header h1{font-weight:300;margin:.33em 0}header#page-header h1 a{text-decoration:none}nav#page-navigation{border-bottom-width:1px;border-bottom-style:solid;position:relative;z-index:10}nav#page-navigation #page-navigation-links{margin:0 -15px;padding:0;text-align:right}nav#page-navigation #page-navigation-links>li{display:inline-block;vertical-align:top}nav#page-navigation #page-navigation-links>li>a{display:block;padding:15px}nav#page-navigation #page-navigation-links>li>a:active,nav#page-navigation #page-navigation-links>li>a:focus,nav#page-navigation #page-navigation-links>li>a:hover{text-decoration:none}nav#page-navigation button{display:none;width:100%;border:0;font-size:1.2em;font-weight:300;padding:.66667em 0;background:0 0}.dropdown-parent .dropdown-menu{box-sizing:border-box;display:none;position:absolute;left:-15px;right:-15px;max-width:1270px;padding:15px 15px 0;text-align:left;z-index:10;border-width:1px;border-style:solid;border-top-width:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.dropdown-parent .dropdown-menu h4{margin:0 0 .5em;font-size:1.2em;font-weight:500}.dropdown-parent .dropdown-menu .dropdown-menu-block{display:inline-block;vertical-align:top;margin-bottom:15px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.dropdown-parent .dropdown-menu .dropdown-menu-block ul{padding:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.dropdown-parent .dropdown-menu .dropdown-menu-block li{list-style-type:none;line-height:2em;width:20%;min-width:100px;vertical-align:top;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a{display:block;padding:0 1em}.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:active,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:focus,.dropdown-parent .dropdown-menu .dropdown-menu-block li>a:hover{text-decoration:none}.dropdown-parent .dropdown-menu #settings-theme-menu{width:120px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.dropdown-parent .dropdown-menu #settings-lang-menu{width:320px;-webkit-box-flex:1000;-webkit-flex-grow:1000;-ms-flex-positive:1000;flex-grow:1000}.dropdown-parent.open .dropdown-menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}article{padding:2em 0}article h1{font-size:4em;font-weight:300;text-align:center;margin:0 0 .5em}article h1.eager-wrapping{font-size:4em}article h3{font-size:2em;font-weight:700;margin:.33333em 0 .66667em;text-transform:uppercase;letter-spacing:.25em;border-bottom:1px solid}article h4{margin:1em 0 0}article .build-group-listing{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 -1.5em}article .build-group-listing .build-group{width:250px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:0 1.5em 3em;box-sizing:border-box;border:3px solid #0a81cc;padding:.5em 1.5em}article .build-group-listing .build-group h3{background-color:#0a81cc;color:#fff;margin:-.25em -.75em .75em;font-size:2em;line-height:1.25em;font-weight:400;padding:0;letter-spacing:0;border-bottom:0;text-transform:lowercase;text-align:center}article .build-group-listing .build-group h3 a{color:#fff;text-decoration:none!important;display:block;padding:.25em 0}article .build-group-listing .build-group p{font-size:1.1em;font-weight:300;margin:0 0 .66667em}article .build-group-listing .build-group-empty{width:270px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:0 .75em;box-sizing:border-box}.latest-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2em -2em 0 0}.latest-flex .latest-flex-item{width:240px;box-sizing:border-box;background:#fff;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:0 2em 2em 0}.latest-flex .latest-flex-item:active,.latest-flex .latest-flex-item:focus,.latest-flex .latest-flex-item:hover{text-decoration:none}.latest-flex .latest-flex-item h3.latest-flex-title{border-bottom:0;margin:0;padding:0;font-size:1.25em;font-weight:400;text-align:center;padding:.4em .5em;margin:-1px;color:#fff}.latest-flex .latest-flex-item.latest-flex-red{border:.25em solid #ff2626}.latest-flex .latest-flex-item.latest-flex-red h3.latest-flex-title{background:#ff2626}.latest-flex .latest-flex-item.latest-flex-yellow{border:.25em solid #ff9f19}.latest-flex .latest-flex-item.latest-flex-yellow h3.latest-flex-title{background:#ff9f19}.latest-flex .latest-flex-item.latest-flex-blue{border:.25em solid #0a81cc}.latest-flex .latest-flex-item.latest-flex-blue h3.latest-flex-title{background:#0a81cc}.latest-flex .latest-flex-item.latest-flex-green{border:.25em solid #12b23f}.latest-flex .latest-flex-item.latest-flex-green h3.latest-flex-title{background:#12b23f}.latest-flex .latest-flex-item .latest-flex-detail{color:#373736;text-align:center;font-weight:300}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-build{font-size:2.33333em;margin:.33333em 0 .16667em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-lab{font-size:1.5em;margin:0 0 .5em}.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-time{margin:0 0 .75em}.latest-full{display:block;background:#0a81cc;font-weight:400;text-align:center;color:#fff;margin:0 0 2em;padding:.66667em}.latest-full:active,.latest-full:focus,.latest-full:hover{text-decoration:none}.build-details-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.1em;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.build-details-flex .build-details-flex-item{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-bottom:1.5em;width:160px}.build-details-flex .build-details-flex-item label{font-weight:700;display:inline-block;vertical-align:top;margin-right:1em;min-width:100px}.build-details-flex .build-details-flex-item .build-details-flex-value{display:inline-block;vertical-align:top;margin-right:20px}.form-group{margin-bottom:1.5em;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.form-group>label{width:20%;max-width:240px;min-width:120px;text-align:left;font-weight:700;margin-right:1em;display:inline-block;vertical-align:top;margin-top:.25em;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.form-group>div{margin-left:calc(20% + 1em);width:40%;min-width:240px;max-width:560px;display:inline-block;vertical-align:top;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.form-group>div input,.form-group>div select,.form-group>div textarea{width:100%;box-sizing:border-box;border:1px solid;padding:.33333em .5em;border-radius:.16667em;line-height:1em;border-color:#888}.form-group>div .group-input-button{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.form-group>div .group-input-button input{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.form-group>div .group-input-button button{border-top-left-radius:0;border-bottom-left-radius:0;width:120px;border:1px solid #888;border-left:0}.form-group>div input[type=checkbox],.form-group>div input[type=submit]{width:auto}.form-group>div .group-input-button>button,.form-group>div>button,.form-group>div>input[type=submit]{display:inline-block;vertical-align:middle;padding:.33333em 1em;background-color:#12b23f;color:#fff;text-decoration:none;border-radius:.16667em;border:0;line-height:1.6}.form-group>div.wide-group{width:40%}.form-group>div.wide-group>.trumbowyg-box{width:100%;margin:0}.form-group>label+div{margin-left:0}.credits-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.credits-wrapper .credits-list{width:480px;max-width:100%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.credits-list dt{font-weight:700}.credits-list dd{margin-left:0}.credits-list dd+dt{margin-top:1.5em}ul.pagination{text-align:center;margin:.5em 0 1em;padding:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}ul.pagination>li{list-style:none;width:1.8em;line-height:1.8em;margin:0 .33333em}ul.pagination>li>a,ul.pagination>li>span{display:block;border-radius:.33333em;text-decoration:none}ul.pagination>li>span{cursor:not-allowed}footer#page-footer{padding:1.33333em 0 .66667em;font-size:.85em}footer#page-footer .footer-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}footer#page-footer .footer-flex .footer-flex-item{width:50%;min-width:200px;text-align:center;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:right}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:left}footer#page-footer p{margin:0 0 .4em}#modal-search-overlay{display:none;position:fixed;top:0;bottom:0;left:0;right:0;transition:background-color linear .6s,-webkit-backdrop-filter linear .6s,backdrop-filter linear .6s;background-color:transparent;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);z-index:100}#modal-search-overlay.open{display:block;background-color:rgba(0,0,0,.75);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}#modal-search-overlay #modal-search{position:absolute;top:15%;left:25%;width:50%;max-height:70%;overflow:auto;padding:2em;border-radius:2px;box-sizing:border-box;border:1px solid #ccc}#modal-search-overlay #modal-search h3{margin:0 0 1em;font-size:1.5em;font-weight:300}#modal-search-overlay #modal-search>#modal-search-box{width:100%}#modal-search-overlay #modal-search>#modal-search-box>*{display:inline-block;height:2.5em;padding:.5em;box-sizing:border-box;border:1px solid}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-input{width:calc(100% - 3.33333em)}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-button{width:2.66667em}#modal-search-overlay #modal-search>#modal-search-result{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item{display:block;padding:0 1em;width:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}#modal-search-overlay #modal-search>#modal-search-result>.search-result-item>.search-result-heading{font-size:1.2em;margin-bottom:0}#menu-open-overlay{display:none;position:fixed;top:0;bottom:0;left:0;right:0;z-index:5}#menu-open-overlay.open{display:block}@media (max-width:980px){#modal-search-overlay #modal-search{left:10%;width:80%}}@media (max-width:640px){header#page-header h1{text-align:center}nav#page-navigation button{display:block}nav#page-navigation #page-navigation-links{display:none}nav#page-navigation #page-navigation-links.open{display:block}nav#page-navigation #page-navigation-links>li{display:block;text-align:left}article h1,article h1.eager-wrapping{font-size:3em;line-height:1.33333}article h3{text-align:center}article .addthis_sharing_toolbox{text-align:center}footer#page-footer .footer-flex .footer-flex-item:first-child{text-align:center;margin-bottom:1.5em}footer#page-footer .footer-flex .footer-flex-item:last-child{text-align:center}}@media (max-width:1300px){.latest-flex .latest-flex-item{min-width:calc(50% - 2em)}}\n/*# sourceMappingURL=default.css.map */\n"]} \ No newline at end of file +{"version":3,"sources":["default.scss","default.css"],"names":[],"mappings":"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","file":"default.css","sourcesContent":["body\r\n{\r\n font-family: 'Roboto', sans-serif;\r\n font-size: 10pt;\r\n line-height: 1.6;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\na\r\n{\r\n text-decoration: none;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: underline;\r\n }\r\n}\r\n\r\nh1\r\n{\r\n font-size: 3em;\r\n font-weight: 500;\r\n}\r\n\r\np\r\n{\r\n margin: 0 0 1em;\r\n}\r\n\r\ntable\r\n{\r\n width: 100%;\r\n border-collapse: collapse;\r\n\r\n th,\r\n td\r\n {\r\n margin: 0;\r\n border: 0;\r\n padding: 4px 6px;\r\n }\r\n\r\n thead th\r\n {\r\n border-bottom: 1px solid;\r\n text-align: left;\r\n }\r\n}\r\n\r\n.at-share-btn-elements\r\n{\r\n margin-left: -8px;\r\n\r\n > .at_flat_counter\r\n {\r\n font-size: 14px !important;\r\n vertical-align: top !important;\r\n }\r\n\r\n > .at-share-btn\r\n {\r\n margin-left: 8px !important;\r\n }\r\n}\r\n\r\n\r\n.container\r\n{\r\n width: 1240px;\r\n max-width: 80%;\r\n margin: 0 auto;\r\n position: relative;\r\n}\r\n\r\n.no-wrapping\r\n{\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.eager-wrapping\r\n{\r\n word-wrap: break-word;\r\n}\r\n\r\n.field-validation-error\r\n{\r\n display: block;\r\n margin: #{(1em / 3)} 0;\r\n color: #FF2626;\r\n}\r\n\r\na.button,\r\ninput[type=submit].button\r\n{\r\n display: inline-block;\r\n vertical-align: middle;\r\n padding: #{(1em / 3)} 1em;\r\n background-color: #0A81CC;\r\n color: #fff;\r\n text-decoration: none;\r\n border-radius: #{(1em / 6)};\r\n text-align: center;\r\n\r\n &.edit-button\r\n {\r\n background-color: #FF9F19;\r\n }\r\n\r\n &.delete-button\r\n {\r\n background-color: #FF2626;\r\n }\r\n\r\n &.add-button\r\n {\r\n background-color: #12B23F;\r\n }\r\n}\r\n\r\nheader#page-header\r\n{\r\n h1\r\n {\r\n font-weight: 300;\r\n margin: .33em 0;\r\n\r\n a\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n}\r\n\r\nnav#page-navigation\r\n{\r\n border-bottom-width: 1px;\r\n border-bottom-style: solid;\r\n position: relative;\r\n z-index: 10;\r\n\r\n #page-navigation-links\r\n {\r\n margin: 0 -15px;\r\n padding: 0;\r\n text-align: right;\r\n\r\n > li\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n\r\n > a\r\n {\r\n display: block;\r\n padding: 15px;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n }\r\n }\r\n\r\n button\r\n {\r\n display: none;\r\n width: 100%;\r\n border: 0;\r\n font-size: 1.2em;\r\n font-weight: 300;\r\n padding: #{(2em / 3)} 0;\r\n background: none;\r\n }\r\n}\r\n\r\n.dropdown-parent\r\n{\r\n .dropdown-menu\r\n {\r\n box-sizing: border-box;\r\n display: none;\r\n position: absolute;\r\n left: -15px;\r\n right: -15px;\r\n max-width: 1270px;\r\n padding: 15px 15px 0;\r\n text-align: left;\r\n z-index: 10;\r\n border-width: 1px;\r\n border-style: solid;\r\n border-top-width: 0;\r\n flex-wrap: wrap;\r\n\r\n h4\r\n {\r\n margin: 0 0 .5em;\r\n font-size: 1.2em;\r\n font-weight: 500;\r\n }\r\n\r\n .dropdown-menu-block\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-bottom: 15px;\r\n flex-grow: 1;\r\n\r\n ul\r\n {\r\n padding: 0;\r\n display: flex;\r\n flex-wrap: wrap;\r\n }\r\n\r\n li\r\n {\r\n list-style-type: none;\r\n line-height: 2em;\r\n width: 133px;\r\n vertical-align: top;\r\n flex-grow: 1;\r\n\r\n > a\r\n {\r\n display: block;\r\n padding: 0 1em;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n }\r\n }\r\n }\r\n\r\n #settings-theme-menu\r\n {\r\n width: 120px;\r\n flex-grow: 1;\r\n }\r\n\r\n #settings-lang-menu\r\n {\r\n width: 320px;\r\n flex-grow: 1000;\r\n }\r\n }\r\n\r\n &.open\r\n {\r\n .dropdown-menu\r\n {\r\n display: flex;\r\n }\r\n }\r\n}\r\n\r\narticle\r\n{\r\n padding: 2em 0;\r\n\r\n h1\r\n {\r\n font-size: 4em;\r\n font-weight: 300;\r\n text-align: center;\r\n margin: 0 0 #{(1em / 2)};\r\n\r\n &.eager-wrapping\r\n {\r\n font-size: 4em;\r\n }\r\n }\r\n\r\n h3\r\n {\r\n font-size: 2em;\r\n font-weight: bold;\r\n margin: #{(1em / 3)} 0 #{(2em / 3)};\r\n text-transform: uppercase;\r\n letter-spacing: #{(1em / 4)};\r\n border-bottom: 1px solid;\r\n }\r\n\r\n h4\r\n {\r\n margin: 1em 0 0;\r\n }\r\n\r\n .build-group-listing\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n margin: 0 #{(-3em / 2)};\r\n\r\n .build-group\r\n {\r\n width: 250px;\r\n flex-grow: 1;\r\n margin: 0 #{(3em / 2)} 3em;\r\n box-sizing: border-box;\r\n border: 3px solid #0A81CC;\r\n padding: 0.5em 1.5em;\r\n\r\n h3\r\n {\r\n background-color: #0A81CC;\r\n color: #fff;\r\n margin: -0.25em -0.75em 0.75em;\r\n font-size: 2em;\r\n line-height: 1.25em;\r\n font-weight: normal;\r\n padding: 0;\r\n letter-spacing: 0;\r\n border-bottom: 0;\r\n text-transform: lowercase;\r\n text-align: center;\r\n\r\n a\r\n {\r\n color: #fff;\r\n text-decoration: none !important;\r\n display: block;\r\n padding: 0.25em 0;\r\n }\r\n }\r\n\r\n p\r\n {\r\n font-size: 1.1em;\r\n font-weight: 300;\r\n margin: 0 0 #{(2em / 3)};\r\n }\r\n }\r\n\r\n .build-group-empty\r\n {\r\n width: 270px;\r\n flex-grow: 1;\r\n margin: 0 0.75em;\r\n box-sizing: border-box;\r\n }\r\n }\r\n}\r\n\r\n.latest-flex\r\n{\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n margin: 2em -2em 0 0;\r\n\r\n .latest-flex-item\r\n {\r\n width: 240px;\r\n box-sizing: border-box;\r\n background: #fff;\r\n flex-grow: 1;\r\n margin: 0 2em 2em 0;\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n\r\n h3.latest-flex-title\r\n {\r\n border-bottom: 0;\r\n margin: 0;\r\n padding: 0;\r\n font-size: 1.25em;\r\n font-weight: normal;\r\n text-align: center;\r\n padding: 0.4em 0.5em;\r\n margin: -1px;\r\n color: #fff;\r\n }\r\n\r\n &.latest-flex-red\r\n {\r\n border: #{(1em / 4)} solid #FF2626;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #FF2626;\r\n }\r\n }\r\n\r\n &.latest-flex-yellow\r\n {\r\n border: #{(1em / 4)} solid #FF9F19;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #FF9F19;\r\n }\r\n }\r\n\r\n &.latest-flex-blue\r\n {\r\n border: #{(1em / 4)} solid #0A81CC;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #0A81CC;\r\n }\r\n }\r\n\r\n &.latest-flex-green\r\n {\r\n border: #{(1em / 4)} solid #12B23F;\r\n\r\n h3.latest-flex-title\r\n {\r\n background: #12B23F;\r\n }\r\n }\r\n\r\n .latest-flex-detail\r\n {\r\n color: #373736;\r\n text-align: center;\r\n font-weight: 300;\r\n\r\n .latest-flex-build\r\n {\r\n font-size: #{(7em / 3)};\r\n margin: #{(1em / 3)} 0 #{(1em / 6)};\r\n }\r\n\r\n .latest-flex-lab\r\n {\r\n font-size: 1.5em;\r\n margin: 0 0 0.5em;\r\n }\r\n\r\n .latest-flex-time\r\n {\r\n margin: 0 0 0.75em;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.latest-full\r\n{\r\n display: block;\r\n background: #0A81CC;\r\n font-weight: normal;\r\n text-align: center;\r\n color: #fff;\r\n margin: 0 0 2em;\r\n padding: #{(2em / 3)};\r\n\r\n &:hover,\r\n &:active,\r\n &:focus\r\n {\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n.build-details-flex\r\n{\r\n display: flex;\r\n font-size: 1.1em;\r\n flex-wrap: wrap;\r\n\r\n .build-details-flex-item\r\n {\r\n flex-grow: 1;\r\n margin-bottom: 1.5em;\r\n width: 160px;\r\n\r\n label\r\n {\r\n font-weight: bold;\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-right: 1em;\r\n min-width: 100px;\r\n }\r\n\r\n .build-details-flex-value\r\n {\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-right: 20px;\r\n }\r\n }\r\n}\r\n\r\n.form-group\r\n{\r\n margin-bottom: 1.5em;\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n > label\r\n {\r\n width: 20%;\r\n max-width: 240px;\r\n min-width: 120px;\r\n text-align: left;\r\n font-weight: bold;\r\n margin-right: 1em;\r\n display: inline-block;\r\n vertical-align: top;\r\n margin-top: #{(1em / 4)};\r\n flex-grow: 1;\r\n }\r\n\r\n > div\r\n {\r\n margin-left: calc(20% + 1em);\r\n width: 40%;\r\n min-width: 240px;\r\n max-width: 560px;\r\n display: inline-block;\r\n vertical-align: top;\r\n flex-grow: 2;\r\n\r\n input, textarea, select\r\n {\r\n width: 100%;\r\n box-sizing: border-box;\r\n border: 1px solid;\r\n padding: #{(1em / 3)} #{(1em / 2)};\r\n border-radius: #{(1em / 6)};\r\n line-height: 1em;\r\n border-color: #888;\r\n }\r\n\r\n .group-input-button\r\n {\r\n display: flex;\r\n\r\n input\r\n {\r\n border-top-right-radius: 0;\r\n border-bottom-right-radius: 0;\r\n border-right: 0;\r\n }\r\n\r\n button\r\n {\r\n border-top-left-radius: 0;\r\n border-bottom-left-radius: 0;\r\n width: 120px;\r\n border: 1px solid #888;\r\n border-left: 0;\r\n }\r\n }\r\n\r\n input[type=submit],\r\n input[type=checkbox]\r\n {\r\n width: auto;\r\n }\r\n\r\n > input[type=submit],\r\n > button,\r\n .group-input-button > button\r\n {\r\n display: inline-block;\r\n vertical-align: middle;\r\n padding: #{(1em / 3)} 1em;\r\n background-color: #12B23F;\r\n color: #fff;\r\n text-decoration: none;\r\n border-radius: #{(1em / 6)};\r\n border: 0;\r\n line-height: 1.6;\r\n }\r\n\r\n &.wide-group\r\n {\r\n width: 40%;\r\n\r\n > .trumbowyg-box\r\n {\r\n width: 100%;\r\n margin: 0;\r\n }\r\n }\r\n }\r\n\r\n > label + div\r\n {\r\n margin-left: 0;\r\n }\r\n}\r\n\r\n.credits-wrapper\r\n{\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n .credits-list\r\n {\r\n width: 480px;\r\n max-width: 100%;\r\n flex-grow: 1;\r\n }\r\n}\r\n\r\n.credits-list\r\n{\r\n dt\r\n {\r\n font-weight: bold;\r\n }\r\n\r\n dd\r\n {\r\n margin-left: 0;\r\n }\r\n\r\n dd + dt\r\n {\r\n margin-top: 1.5em;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n text-align: center;\r\n margin: 0.5em 0 1em;\r\n padding: 0;\r\n display: flex;\r\n justify-content: center;\r\n\r\n > li\r\n {\r\n list-style: none;\r\n width: 1.8em;\r\n line-height: 1.8em;\r\n margin: 0 #{(1em / 3)};\r\n\r\n > a,\r\n > span\r\n {\r\n display: block;\r\n border-radius: #{(1em / 3)};\r\n text-decoration: none;\r\n }\r\n\r\n > span\r\n {\r\n cursor: not-allowed;\r\n }\r\n }\r\n}\r\n\r\nfooter#page-footer\r\n{\r\n padding: #{(4em / 3)} 0 #{(4em / 6)};\r\n font-size: 0.85em;\r\n\r\n .footer-flex\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n .footer-flex-item\r\n {\r\n width: 50%;\r\n min-width: 200px;\r\n text-align: center;\r\n flex-grow: 1;\r\n\r\n &:last-child\r\n {\r\n text-align: right;\r\n }\r\n\r\n &:first-child\r\n {\r\n text-align: left;\r\n }\r\n }\r\n }\r\n\r\n p\r\n {\r\n margin: 0 0 #{(2em / 5)};\r\n }\r\n}\r\n\r\n#modal-search-overlay\r\n{\r\n display: none;\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n transition: background-color linear 0.6s, -webkit-backdrop-filter linear 0.6s, backdrop-filter linear 0.6s;\r\n background-color: rgba(0,0,0, 0);\r\n -webkit-backdrop-filter: blur(0);\r\n backdrop-filter: blur(0);\r\n z-index: 100;\r\n\r\n &.open\r\n {\r\n display: block;\r\n background-color: rgba(0,0,0, 0.75);\r\n -webkit-backdrop-filter: blur(10px);\r\n backdrop-filter: blur(10px);\r\n }\r\n\r\n #modal-search\r\n {\r\n position: absolute;\r\n top: 15%;\r\n left: 25%;\r\n width: 50%;\r\n max-height: 70%;\r\n overflow: auto;\r\n padding: 2em;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n border: 1px solid #ccc;\r\n\r\n h3\r\n {\r\n margin: 0 0 1em;\r\n font-size: 1.5em;\r\n font-weight: 300;\r\n }\r\n\r\n > #modal-search-box\r\n {\r\n width: 100%;\r\n\r\n > *\r\n {\r\n display: inline-block;\r\n height: 2.5em;\r\n padding: 0.5em;\r\n box-sizing: border-box;\r\n border: 1px solid;\r\n }\r\n\r\n > #modal-search-input\r\n {\r\n width: calc(100% - #{(10em / 3)});\r\n }\r\n\r\n > #modal-search-button\r\n {\r\n width: #{(8em / 3)};\r\n }\r\n }\r\n\r\n > #modal-search-result\r\n {\r\n display: flex;\r\n flex-wrap: wrap;\r\n justify-content: space-between;\r\n\r\n > .search-result-item\r\n {\r\n display: block;\r\n padding: 0 1em;\r\n width: 140px;\r\n flex-grow: 1;\r\n\r\n > .search-result-heading\r\n {\r\n font-size: 1.2em;\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n#menu-open-overlay\r\n{\r\n display: none;\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 5;\r\n\r\n &.open\r\n {\r\n display: block;\r\n }\r\n}\r\n\r\n@media (max-width: 980px)\r\n{\r\n #modal-search-overlay #modal-search\r\n {\r\n left: 10%;\r\n width: 80%;\r\n }\r\n}\r\n\r\n@media (max-width: 640px)\r\n{\r\n header#page-header h1\r\n {\r\n text-align: center;\r\n }\r\n\r\n nav#page-navigation\r\n {\r\n button\r\n {\r\n display: block;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n display: none;\r\n\r\n &.open\r\n {\r\n display: block;\r\n }\r\n\r\n > li\r\n {\r\n display: block;\r\n text-align: left;\r\n }\r\n }\r\n }\r\n\r\n article\r\n {\r\n h1,\r\n h1.eager-wrapping\r\n {\r\n font-size: 3em;\r\n line-height: #{(4 / 3)};\r\n }\r\n\r\n h3\r\n {\r\n text-align: center;\r\n }\r\n\r\n .addthis_sharing_toolbox\r\n {\r\n text-align: center;\r\n }\r\n }\r\n\r\n footer#page-footer .footer-flex .footer-flex-item\r\n {\r\n &:first-child\r\n {\r\n text-align: center;\r\n margin-bottom: #{(3em / 2)};\r\n }\r\n\r\n &:last-child\r\n {\r\n text-align: center;\r\n }\r\n }\r\n}\r\n\r\n@media (max-width: 1300px)\r\n{\r\n .latest-flex .latest-flex-item\r\n {\r\n min-width: calc(50% - 2em);\r\n }\r\n}","body\n{\n box-sizing: border-box;\n font-family: Roboto, sans-serif;\n font-size: 10pt;\n line-height: 1.6;\n margin: 0;\n}\n\na\n{\n text-decoration: none\n}\n\na:active, a:focus, a:hover\n{\n text-decoration: underline\n}\n\nh1\n{\n font-size: 3em;\n font-weight: 500\n}\n\np\n{\n margin: 0 0 1em\n}\n\ntable\n{\n border-collapse: collapse;\n width: 100%;\n}\n\ntable td, table th\n{\n border: 0;\n margin: 0;\n padding: 4px 6px\n}\n\ntable thead th\n{\n border-bottom: 1px solid;\n text-align: left\n}\n\n.at-share-btn-elements\n{\n margin-left: -8px\n}\n\n.at-share-btn-elements > .at_flat_counter\n{\n font-size: 14px !important;\n vertical-align: top !important\n}\n\n.at-share-btn-elements > .at-share-btn\n{\n margin-left: 8px !important\n}\n\n.container\n{\n margin: 0 auto;\n max-width: 80%;\n position: relative;\n width: 1240px;\n}\n\n.no-wrapping\n{\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap\n}\n\n.eager-wrapping\n{\n word-wrap: break-word\n}\n\n.field-validation-error\n{\n color: #ff2626;\n display: block;\n margin: .33333em 0;\n}\n\na.button, input[type=submit].button\n{\n background-color: #0a81cc;\n border-radius: .16667em;\n color: #fff;\n display: inline-block;\n padding: .33333em 1em;\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n}\n\na.button.edit-button, input[type=submit].button.edit-button\n{\n background-color: #ff9f19\n}\n\na.button.delete-button, input[type=submit].button.delete-button\n{\n background-color: #ff2626\n}\n\na.button.add-button, input[type=submit].button.add-button\n{\n background-color: #12b23f\n}\n\nheader#page-header h1\n{\n font-weight: 300;\n margin: .33em 0\n}\n\nheader#page-header h1 a\n{\n text-decoration: none\n}\n\nnav#page-navigation\n{\n border-bottom-style: solid;\n border-bottom-width: 1px;\n position: relative;\n z-index: 10\n}\n\nnav#page-navigation #page-navigation-links\n{\n margin: 0 -15px;\n padding: 0;\n text-align: right\n}\n\nnav#page-navigation #page-navigation-links > li\n{\n display: inline-block;\n vertical-align: top\n}\n\nnav#page-navigation #page-navigation-links > li > a\n{\n display: block;\n padding: 15px\n}\n\nnav#page-navigation #page-navigation-links > li > a:active, nav#page-navigation #page-navigation-links > li > a:focus, nav#page-navigation #page-navigation-links > li > a:hover\n{\n text-decoration: none\n}\n\nnav#page-navigation button\n{\n background: 0 0;\n border: 0;\n display: none;\n font-size: 1.2em;\n font-weight: 300;\n padding: .66667em 0;\n width: 100%;\n}\n\n.dropdown-parent .dropdown-menu\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n border-style: solid;\n border-top-width: 0;\n border-width: 1px;\n box-sizing: border-box;\n display: none;\n flex-wrap: wrap;\n left: -15px;\n max-width: 1270px;\n padding: 15px 15px 0;\n position: absolute;\n right: -15px;\n text-align: left;\n z-index: 10;\n}\n\n.dropdown-parent .dropdown-menu h4\n{\n font-size: 1.2em;\n font-weight: 500;\n margin: 0 0 .5em;\n}\n\n.dropdown-parent .dropdown-menu .dropdown-menu-block\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n display: inline-block;\n flex-grow: 1;\n margin-bottom: 15px;\n vertical-align: top;\n}\n\n.dropdown-parent .dropdown-menu .dropdown-menu-block ul\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n padding: 0;\n}\n\n.dropdown-parent .dropdown-menu .dropdown-menu-block li\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n flex-grow: 1;\n line-height: 2em;\n list-style-type: none;\n vertical-align: top;\n width: 133px;\n}\n\n.dropdown-parent .dropdown-menu .dropdown-menu-block li > a\n{\n display: block;\n padding: 0 1em\n}\n\n.dropdown-parent .dropdown-menu .dropdown-menu-block li > a:active, .dropdown-parent .dropdown-menu .dropdown-menu-block li > a:focus, .dropdown-parent .dropdown-menu .dropdown-menu-block li > a:hover\n{\n text-decoration: none\n}\n\n.dropdown-parent .dropdown-menu #settings-theme-menu\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n flex-grow: 1;\n width: 120px;\n}\n\n.dropdown-parent .dropdown-menu #settings-lang-menu\n{\n -ms-flex-positive: 1000;\n -webkit-box-flex: 1000;\n -webkit-flex-grow: 1000;\n flex-grow: 1000;\n width: 320px;\n}\n\n.dropdown-parent.open .dropdown-menu\n{\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex\n}\n\narticle\n{\n padding: 2em 0\n}\n\narticle h1\n{\n font-size: 4em;\n font-weight: 300;\n margin: 0 0 .5em;\n text-align: center;\n}\n\narticle h1.eager-wrapping\n{\n font-size: 4em\n}\n\narticle h3\n{\n border-bottom: 1px solid;\n font-size: 2em;\n font-weight: 700;\n letter-spacing: .25em;\n margin: .33333em 0 .66667em;\n text-transform: uppercase;\n}\n\narticle h4\n{\n margin: 1em 0 0\n}\n\narticle .build-group-listing\n{\n -ms-flex-pack: center;\n -ms-flex-wrap: wrap;\n -webkit-box-pack: center;\n -webkit-flex-wrap: wrap;\n -webkit-justify-content: center;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin: 0 -1.5em\n}\n\narticle .build-group-listing .build-group\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n border: 3px solid #0a81cc;\n box-sizing: border-box;\n flex-grow: 1;\n margin: 0 1.5em 3em;\n padding: .5em 1.5em;\n width: 250px;\n}\n\narticle .build-group-listing .build-group h3\n{\n background-color: #0a81cc;\n border-bottom: 0;\n color: #fff;\n font-size: 2em;\n font-weight: 400;\n letter-spacing: 0;\n line-height: 1.25em;\n margin: -.25em -.75em .75em;\n padding: 0;\n text-align: center;\n text-transform: lowercase;\n}\n\narticle .build-group-listing .build-group h3 a\n{\n color: #fff;\n display: block;\n padding: .25em 0;\n text-decoration: none !important;\n}\n\narticle .build-group-listing .build-group p\n{\n font-size: 1.1em;\n font-weight: 300;\n margin: 0 0 .66667em\n}\n\narticle .build-group-listing .build-group-empty\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n box-sizing: border-box;\n flex-grow: 1;\n margin: 0 .75em;\n width: 270px;\n}\n\n.latest-flex\n{\n -ms-flex-pack: justify;\n -ms-flex-wrap: wrap;\n -webkit-box-pack: justify;\n -webkit-flex-wrap: wrap;\n -webkit-justify-content: space-between;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n margin: 2em -2em 0 0\n}\n\n.latest-flex .latest-flex-item\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n background: #fff;\n box-sizing: border-box;\n flex-grow: 1;\n margin: 0 2em 2em 0;\n width: 240px;\n}\n\n.latest-flex .latest-flex-item:active, .latest-flex .latest-flex-item:focus, .latest-flex .latest-flex-item:hover\n{\n text-decoration: none\n}\n\n.latest-flex .latest-flex-item h3.latest-flex-title\n{\n border-bottom: 0;\n color: #fff;\n font-size: 1.25em;\n font-weight: 400;\n margin: 0;\n margin: -1px;\n padding: 0;\n padding: .4em .5em;\n text-align: center;\n}\n\n.latest-flex .latest-flex-item.latest-flex-red\n{\n border: .25em solid #ff2626\n}\n\n.latest-flex .latest-flex-item.latest-flex-red h3.latest-flex-title\n{\n background: #ff2626\n}\n\n.latest-flex .latest-flex-item.latest-flex-yellow\n{\n border: .25em solid #ff9f19\n}\n\n.latest-flex .latest-flex-item.latest-flex-yellow h3.latest-flex-title\n{\n background: #ff9f19\n}\n\n.latest-flex .latest-flex-item.latest-flex-blue\n{\n border: .25em solid #0a81cc\n}\n\n.latest-flex .latest-flex-item.latest-flex-blue h3.latest-flex-title\n{\n background: #0a81cc\n}\n\n.latest-flex .latest-flex-item.latest-flex-green\n{\n border: .25em solid #12b23f\n}\n\n.latest-flex .latest-flex-item.latest-flex-green h3.latest-flex-title\n{\n background: #12b23f\n}\n\n.latest-flex .latest-flex-item .latest-flex-detail\n{\n color: #373736;\n font-weight: 300;\n text-align: center;\n}\n\n.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-build\n{\n font-size: 2.33333em;\n margin: .33333em 0 .16667em\n}\n\n.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-lab\n{\n font-size: 1.5em;\n margin: 0 0 .5em\n}\n\n.latest-flex .latest-flex-item .latest-flex-detail .latest-flex-time\n{\n margin: 0 0 .75em\n}\n\n.latest-full\n{\n background: #0a81cc;\n color: #fff;\n display: block;\n font-weight: 400;\n margin: 0 0 2em;\n padding: .66667em;\n text-align: center;\n}\n\n.latest-full:active, .latest-full:focus, .latest-full:hover\n{\n text-decoration: none\n}\n\n.build-details-flex\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n font-size: 1.1em;\n}\n\n.build-details-flex .build-details-flex-item\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n flex-grow: 1;\n margin-bottom: 1.5em;\n width: 160px\n}\n\n.build-details-flex .build-details-flex-item label\n{\n display: inline-block;\n font-weight: 700;\n margin-right: 1em;\n min-width: 100px;\n vertical-align: top;\n}\n\n.build-details-flex .build-details-flex-item .build-details-flex-value\n{\n display: inline-block;\n margin-right: 20px;\n vertical-align: top;\n}\n\n.form-group\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 1.5em;\n}\n\n.form-group > label\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n display: inline-block;\n flex-grow: 1;\n font-weight: 700;\n margin-right: 1em;\n margin-top: .25em;\n max-width: 240px;\n min-width: 120px;\n text-align: left;\n vertical-align: top;\n width: 20%;\n}\n\n.form-group > div\n{\n -ms-flex-positive: 2;\n -webkit-box-flex: 2;\n -webkit-flex-grow: 2;\n display: inline-block;\n flex-grow: 2;\n margin-left: calc(20% + 1em);\n max-width: 560px;\n min-width: 240px;\n vertical-align: top;\n width: 40%;\n}\n\n.form-group > div input, .form-group > div select, .form-group > div textarea\n{\n border: 1px solid;\n border-color: #888;\n border-radius: .16667em;\n box-sizing: border-box;\n line-height: 1em;\n padding: .33333em .5em;\n width: 100%;\n}\n\n.form-group > div .group-input-button\n{\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex\n}\n\n.form-group > div .group-input-button input\n{\n border-bottom-right-radius: 0;\n border-right: 0;\n border-top-right-radius: 0;\n}\n\n.form-group > div .group-input-button button\n{\n border: 1px solid #888;\n border-bottom-left-radius: 0;\n border-left: 0;\n border-top-left-radius: 0;\n width: 120px;\n}\n\n.form-group > div input[type=checkbox], .form-group > div input[type=submit]\n{\n width: auto\n}\n\n.form-group > div .group-input-button > button, .form-group > div > button, .form-group > div > input[type=submit]\n{\n background-color: #12b23f;\n border: 0;\n border-radius: .16667em;\n color: #fff;\n display: inline-block;\n line-height: 1.6;\n padding: .33333em 1em;\n text-decoration: none;\n vertical-align: middle;\n}\n\n.form-group > div.wide-group\n{\n width: 40%\n}\n\n.form-group > div.wide-group > .trumbowyg-box\n{\n margin: 0;\n width: 100%;\n}\n\n.form-group > label + div\n{\n margin-left: 0\n}\n\n.credits-wrapper\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap\n}\n\n.credits-wrapper .credits-list\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n flex-grow: 1;\n max-width: 100%;\n width: 480px;\n}\n\n.credits-list dt\n{\n font-weight: 700\n}\n\n.credits-list dd\n{\n margin-left: 0\n}\n\n.credits-list dd + dt\n{\n margin-top: 1.5em\n}\n\nul.pagination\n{\n -ms-flex-pack: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n justify-content: center;\n margin: .5em 0 1em;\n padding: 0;\n text-align: center;\n}\n\nul.pagination > li\n{\n line-height: 1.8em;\n list-style: none;\n margin: 0 .33333em;\n width: 1.8em;\n}\n\nul.pagination > li > a, ul.pagination > li > span\n{\n border-radius: .33333em;\n display: block;\n text-decoration: none\n}\n\nul.pagination > li > span\n{\n cursor: not-allowed\n}\n\nfooter#page-footer\n{\n font-size: .85em;\n padding: 1.33333em 0 .66667em;\n}\n\nfooter#page-footer .footer-flex\n{\n -ms-flex-wrap: wrap;\n -webkit-flex-wrap: wrap;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap\n}\n\nfooter#page-footer .footer-flex .footer-flex-item\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n flex-grow: 1;\n min-width: 200px;\n text-align: center;\n width: 50%;\n}\n\nfooter#page-footer .footer-flex .footer-flex-item:last-child\n{\n text-align: right\n}\n\nfooter#page-footer .footer-flex .footer-flex-item:first-child\n{\n text-align: left\n}\n\nfooter#page-footer p\n{\n margin: 0 0 .4em\n}\n\n#modal-search-overlay\n{\n -webkit-backdrop-filter: blur(0);\n backdrop-filter: blur(0);\n background-color: transparent;\n bottom: 0;\n display: none;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n transition: background-color linear .6s, -webkit-backdrop-filter linear .6s, backdrop-filter linear .6s;\n z-index: 100\n}\n\n#modal-search-overlay.open\n{\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n background-color: rgba(0, 0, 0, .75);\n display: block;\n}\n\n#modal-search-overlay #modal-search\n{\n border: 1px solid #ccc;\n border-radius: 2px;\n box-sizing: border-box;\n left: 25%;\n max-height: 70%;\n overflow: auto;\n padding: 2em;\n position: absolute;\n top: 15%;\n width: 50%;\n}\n\n#modal-search-overlay #modal-search h3\n{\n font-size: 1.5em;\n font-weight: 300;\n margin: 0 0 1em;\n}\n\n#modal-search-overlay #modal-search > #modal-search-box\n{\n width: 100%\n}\n\n#modal-search-overlay #modal-search > #modal-search-box > *\n{\n border: 1px solid;\n box-sizing: border-box;\n display: inline-block;\n height: 2.5em;\n padding: .5em;\n}\n\n#modal-search-overlay #modal-search > #modal-search-box > #modal-search-input\n{\n width: calc(100% - 3.33333em)\n}\n\n#modal-search-overlay #modal-search > #modal-search-box > #modal-search-button\n{\n width: 2.66667em\n}\n\n#modal-search-overlay #modal-search > #modal-search-result\n{\n -ms-flex-pack: justify;\n -ms-flex-wrap: wrap;\n -webkit-box-pack: justify;\n -webkit-flex-wrap: wrap;\n -webkit-justify-content: space-between;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between\n}\n\n#modal-search-overlay #modal-search > #modal-search-result > .search-result-item\n{\n -ms-flex-positive: 1;\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n display: block;\n flex-grow: 1;\n padding: 0 1em;\n width: 140px;\n}\n\n#modal-search-overlay #modal-search > #modal-search-result > .search-result-item > .search-result-heading\n{\n font-size: 1.2em;\n margin-bottom: 0\n}\n\n#menu-open-overlay\n{\n bottom: 0;\n display: none;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n z-index: 5\n}\n\n#menu-open-overlay.open\n{\n display: block\n}\n\n@media (max-width: 980px)\n{\n #modal-search-overlay #modal-search\n {\n left: 10%;\n width: 80%\n }\n}\n\n@media (max-width: 640px)\n{\n header#page-header h1\n {\n text-align: center\n }\n\n nav#page-navigation button\n {\n display: block\n }\n\n nav#page-navigation #page-navigation-links\n {\n display: none\n }\n\n nav#page-navigation #page-navigation-links.open\n {\n display: block\n }\n\n nav#page-navigation #page-navigation-links > li\n {\n display: block;\n text-align: left\n }\n\n article h1, article h1.eager-wrapping\n {\n font-size: 3em;\n line-height: 1.33333\n }\n\n article h3\n {\n text-align: center\n }\n\n article .addthis_sharing_toolbox\n {\n text-align: center\n }\n\n footer#page-footer .footer-flex .footer-flex-item:first-child\n {\n margin-bottom: 1.5em;\n text-align: center;\n }\n\n footer#page-footer .footer-flex .footer-flex-item:last-child\n {\n text-align: center\n }\n}\n\n@media (max-width: 1300px)\n{\n .latest-flex .latest-flex-item\n {\n min-width: calc(50% - 2em)\n }\n}\n/*# sourceMappingURL=default.css.map */"]} \ No newline at end of file diff --git a/BuildFeed/res/css/light.css.map b/BuildFeed/res/css/light.css.map index d9095b0..bd89723 100644 --- a/BuildFeed/res/css/light.css.map +++ b/BuildFeed/res/css/light.css.map @@ -1 +1 @@ -{"version":3,"sources":["light.scss","light.css"],"names":[],"mappings":"AAAA,KAEG,iBAAA,QACA,MAAA,QAGH,EAEG,MAAA,KCAH,eDGA,KAGG,MAAA,QAGH,eAEG,oBAAA,QAGH,cAEG,iBAAA,QACA,MAAA,QAHH,iBAOM,oBAAA,KAIN,iBAEG,iBAAA,QACA,MAAA,QACA,oBAAA,QAJH,wBAQM,MAAA,QARN,6CAiBY,MAAA,QAjBZ,kDCJE,mDD2BU,iBAAA,QAMZ,eAEG,iBAAA,QACA,aAAA,QACA,WAAA,EAAA,IAAA,KAAA,gBC5BD,wBADA,uBDyBF,uBAUM,iBAAA,QAIN,QAEG,WAAA,KAFH,WAAA,WAMM,MAAA,QCnCJ,kCD6BF,0BC9BE,oBD2CI,MAAA,QAIN,0BAIM,WAAA,QACA,MAAA,kBC1CN,yCADA,wCDsCA,wCAYM,WAAA,QACA,MAAA,kBAIN,oCAEG,iBAAA,QAFH,uCAMM,MAAA,QCnDJ,2ED6CF,0EAYM,iBAAA,KACA,MAAA,QACA,aAAA","file":"light.css","sourcesContent":["body\r\n{\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n}\r\n\r\na\r\n{\r\n color: #000;\r\n}\r\n\r\nh1 > a,\r\n#page-footer a\r\n{\r\n color: #f6f5f3;\r\n}\r\n\r\ntable thead th\r\n{\r\n border-bottom-color: #373736;\r\n}\r\n\r\n#page-content\r\n{\r\n background-color: #f6f5f3;\r\n color: #373736;\r\n\r\n h3\r\n {\r\n border-bottom-color: #ccc;\r\n }\r\n}\r\n\r\n#page-navigation\r\n{\r\n background-color: #e6e5e3;\r\n color: #373736;\r\n border-bottom-color: #373736;\r\n\r\n button\r\n {\r\n color: #373736;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n > li\r\n {\r\n a\r\n {\r\n color: #373736;\r\n }\r\n\r\n &.open > a,\r\n > a:hover\r\n {\r\n background-color: #f6f5f3;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.dropdown-menu\r\n{\r\n background-color: #e6e5e3;\r\n border-color: #373736;\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15);\r\n\r\n a:hover,\r\n a:focus,\r\n a:active\r\n {\r\n background-color: #f6f5f3;\r\n }\r\n}\r\n\r\narticle\r\n{\r\n box-shadow: none;\r\n\r\n h1, h3\r\n {\r\n color: #242423;\r\n }\r\n\r\n .build-group > h3 > a,\r\n a.more-link,\r\n .build-details-comments a\r\n {\r\n color: #242423;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n > li.active > a\r\n {\r\n background: #373736;\r\n color: #e6e5e3 !important;\r\n }\r\n\r\n > li:hover:not(.disabled) > a,\r\n > li:focus:not(.disabled) > a,\r\n > li:active:not(.disabled) > a\r\n {\r\n background: #242423;\r\n color: #f6f5f3 !important;\r\n }\r\n}\r\n\r\n#modal-search-overlay #modal-search\r\n{\r\n background-color: #f6f5f3;\r\n\r\n h3\r\n {\r\n color: #373736;\r\n }\r\n\r\n > #modal-search-box > #modal-search-input,\r\n > #modal-search-box > #modal-search-button\r\n {\r\n background-color: #fff;\r\n color: #373736;\r\n border-color: #242423;\r\n }\r\n}\r\n","body{background-color:#373736;color:#f6f5f3}a{color:#000}#page-footer a,h1>a{color:#f6f5f3}table thead th{border-bottom-color:#373736}#page-content{background-color:#f6f5f3;color:#373736}#page-content h3{border-bottom-color:#ccc}#page-navigation{background-color:#e6e5e3;color:#373736;border-bottom-color:#373736}#page-navigation button{color:#373736}#page-navigation #page-navigation-links>li a{color:#373736}#page-navigation #page-navigation-links>li.open>a,#page-navigation #page-navigation-links>li>a:hover{background-color:#f6f5f3}.dropdown-menu{background-color:#e6e5e3;border-color:#373736;box-shadow:0 5px 10px rgba(0,0,0,.15)}.dropdown-menu a:active,.dropdown-menu a:focus,.dropdown-menu a:hover{background-color:#f6f5f3}article{box-shadow:none}article h1,article h3{color:#242423}article .build-details-comments a,article .build-group>h3>a,article a.more-link{color:#242423}ul.pagination>li.active>a{background:#373736;color:#e6e5e3!important}ul.pagination>li:active:not(.disabled)>a,ul.pagination>li:focus:not(.disabled)>a,ul.pagination>li:hover:not(.disabled)>a{background:#242423;color:#f6f5f3!important}#modal-search-overlay #modal-search{background-color:#f6f5f3}#modal-search-overlay #modal-search h3{color:#373736}#modal-search-overlay #modal-search>#modal-search-box>#modal-search-button,#modal-search-overlay #modal-search>#modal-search-box>#modal-search-input{background-color:#fff;color:#373736;border-color:#242423}\n/*# sourceMappingURL=light.css.map */\n"]} \ No newline at end of file +{"version":3,"sources":["light.scss","light.css"],"names":[],"mappings":"AAAA,KAEG,iBAAA,QACA,MAAA,QAGH,EAEG,MAAA,KCAH,eDGA,KAGG,MAAA,QAGH,eAEG,oBAAA,QAGH,cAEG,iBAAA,QACA,MAAA,QAHH,iBAOM,oBAAA,KAIN,iBAEG,iBAAA,QACA,MAAA,QACA,oBAAA,QAJH,wBAQM,MAAA,QARN,6CAiBY,MAAA,QAjBZ,kDCJE,mDD2BU,iBAAA,QAMZ,eAEG,iBAAA,QACA,aAAA,QACA,WAAA,EAAA,IAAA,KAAA,gBC5BD,wBADA,uBDyBF,uBAUM,iBAAA,QAIN,QAEG,WAAA,KAFH,WAAA,WAMM,MAAA,QCnCJ,kCD6BF,0BC9BE,oBD2CI,MAAA,QAIN,0BAIM,WAAA,QACA,MAAA,kBC1CN,yCADA,wCDsCA,wCAYM,WAAA,QACA,MAAA,kBAIN,oCAEG,iBAAA,QAFH,uCAMM,MAAA,QCnDJ,2ED6CF,0EAYM,iBAAA,KACA,MAAA,QACA,aAAA","file":"light.css","sourcesContent":["body\r\n{\r\n background-color: #373736;\r\n color: #f6f5f3;\r\n}\r\n\r\na\r\n{\r\n color: #000;\r\n}\r\n\r\nh1 > a,\r\n#page-footer a\r\n{\r\n color: #f6f5f3;\r\n}\r\n\r\ntable thead th\r\n{\r\n border-bottom-color: #373736;\r\n}\r\n\r\n#page-content\r\n{\r\n background-color: #f6f5f3;\r\n color: #373736;\r\n\r\n h3\r\n {\r\n border-bottom-color: #ccc;\r\n }\r\n}\r\n\r\n#page-navigation\r\n{\r\n background-color: #e6e5e3;\r\n color: #373736;\r\n border-bottom-color: #373736;\r\n\r\n button\r\n {\r\n color: #373736;\r\n }\r\n\r\n #page-navigation-links\r\n {\r\n > li\r\n {\r\n a\r\n {\r\n color: #373736;\r\n }\r\n\r\n &.open > a,\r\n > a:hover\r\n {\r\n background-color: #f6f5f3;\r\n }\r\n }\r\n }\r\n}\r\n\r\n.dropdown-menu\r\n{\r\n background-color: #e6e5e3;\r\n border-color: #373736;\r\n box-shadow: 0 5px 10px rgba(0,0,0,0.15);\r\n\r\n a:hover,\r\n a:focus,\r\n a:active\r\n {\r\n background-color: #f6f5f3;\r\n }\r\n}\r\n\r\narticle\r\n{\r\n box-shadow: none;\r\n\r\n h1, h3\r\n {\r\n color: #242423;\r\n }\r\n\r\n .build-group > h3 > a,\r\n a.more-link,\r\n .build-details-comments a\r\n {\r\n color: #242423;\r\n }\r\n}\r\n\r\nul.pagination\r\n{\r\n > li.active > a\r\n {\r\n background: #373736;\r\n color: #e6e5e3 !important;\r\n }\r\n\r\n > li:hover:not(.disabled) > a,\r\n > li:focus:not(.disabled) > a,\r\n > li:active:not(.disabled) > a\r\n {\r\n background: #242423;\r\n color: #f6f5f3 !important;\r\n }\r\n}\r\n\r\n#modal-search-overlay #modal-search\r\n{\r\n background-color: #f6f5f3;\r\n\r\n h3\r\n {\r\n color: #373736;\r\n }\r\n\r\n > #modal-search-box > #modal-search-input,\r\n > #modal-search-box > #modal-search-button\r\n {\r\n background-color: #fff;\r\n color: #373736;\r\n border-color: #242423;\r\n }\r\n}\r\n","body\n{\n background-color: #373736;\n color: #f6f5f3\n}\n\na\n{\n color: #000\n}\n\n#page-footer a, h1 > a\n{\n color: #f6f5f3\n}\n\ntable thead th\n{\n border-bottom-color: #373736\n}\n\n#page-content\n{\n background-color: #f6f5f3;\n color: #373736\n}\n\n#page-content h3\n{\n border-bottom-color: #ccc\n}\n\n#page-navigation\n{\n background-color: #e6e5e3;\n border-bottom-color: #373736;\n color: #373736;\n}\n\n#page-navigation button\n{\n color: #373736\n}\n\n#page-navigation #page-navigation-links > li a\n{\n color: #373736\n}\n\n#page-navigation #page-navigation-links > li.open > a, #page-navigation #page-navigation-links > li > a:hover\n{\n background-color: #f6f5f3\n}\n\n.dropdown-menu\n{\n background-color: #e6e5e3;\n border-color: #373736;\n box-shadow: 0 5px 10px rgba(0, 0, 0, .15)\n}\n\n.dropdown-menu a:active, .dropdown-menu a:focus, .dropdown-menu a:hover\n{\n background-color: #f6f5f3\n}\n\narticle\n{\n box-shadow: none\n}\n\narticle h1, article h3\n{\n color: #242423\n}\n\narticle .build-details-comments a, article .build-group > h3 > a, article a.more-link\n{\n color: #242423\n}\n\nul.pagination > li.active > a\n{\n background: #373736;\n color: #e6e5e3 !important\n}\n\nul.pagination > li:active:not(.disabled) > a, ul.pagination > li:focus:not(.disabled) > a, ul.pagination > li:hover:not(.disabled) > a\n{\n background: #242423;\n color: #f6f5f3 !important\n}\n\n#modal-search-overlay #modal-search\n{\n background-color: #f6f5f3\n}\n\n#modal-search-overlay #modal-search h3\n{\n color: #373736\n}\n\n#modal-search-overlay #modal-search > #modal-search-box > #modal-search-button, #modal-search-overlay #modal-search > #modal-search-box > #modal-search-input\n{\n background-color: #fff;\n border-color: #242423;\n color: #373736;\n}\n/*# sourceMappingURL=light.css.map */"]} \ No newline at end of file diff --git a/BuildFeed/yandex_702baad42b020be7.html b/BuildFeed/yandex_702baad42b020be7.html index 5003779..f73ccd2 100644 --- a/BuildFeed/yandex_702baad42b020be7.html +++ b/BuildFeed/yandex_702baad42b020be7.html @@ -1,4 +1,6 @@ - + + + Verification: 702baad42b020be7 - + \ No newline at end of file