using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Web.Mvc; using Portoa.Web.Util; using VideoGameQuotes.Api; using VideoGameQuotes.Web.Validation; namespace VideoGameQuotes.Web.Models { public class QuoteSubmitModel { [NonEmptyText(ErrorMessage = "Quote text must be non-empty"), DisplayName("Quote")] public string QuoteText { get; set; } [DisplayName("Categories")] public IList CategoryIds { get; set; } public int GameId { get; set; } //if a new game is created [DisplayName("Name")] public string GameName { get; set; } [DisplayName("Website")] public string GameWebsite { get; set; } [DisplayName("Region")] public Region GameRegions { get; set; } [DisplayName("Publishers")] public IList PublisherIds { get; set; } [DisplayName("Systems")] public IList SystemIds { get; set; } //if a new publisher is created [DisplayName("Name")] public string PublisherName { get; set; } [DisplayName("Website")] public string PublisherWebsite { get; set; } //if a new system is created [DisplayName("Name")] public string SystemName { get; set; } [DisplayName("Abbreviation")] public string SystemAbbreviation { get; set; } [DisplayName("Release Date")] public DateTime SystemReleaseDate { get; set; } public IEnumerable AllGames { get; set; } public IEnumerable AllSystems { get; set; } public IEnumerable AllPublishers { get; set; } public IEnumerable AllCategories { get; set; } public IEnumerable GetGameList() { return new[] { new SelectListItem { Value = "0", Text = "--none--" } } .Concat(AllGames.Select(game => new SelectListItem { Value = game.Id.ToString(), Text = game.Name })); } private static string MakeTable(string tableId, int cellsPerRow, IEnumerable items, Func cellDataCallback) { var table = new TagBuilder("table"); table.MergeAttribute("id", tableId); var count = 0; var row = new TagBuilder("tr"); var cell = new TagBuilder("td"); foreach (var item in items) { if (count % cellsPerRow == 0) { if (count > 0) { table.InnerHtml += row.ToString(TagRenderMode.Normal); } row.InnerHtml = string.Empty; } cell.InnerHtml = cellDataCallback(item); row.InnerHtml += cell.ToString(TagRenderMode.Normal); count++; } if (count > 0) { //last row table.InnerHtml += row.ToString(TagRenderMode.Normal); } return table.ToString(TagRenderMode.Normal); } public string MakePublisherTable(HtmlHelper html, int cellsPerRow = 8) { return MakeTable( "publisher-checkbox-table", cellsPerRow, AllPublishers, publisher => CreateCheckbox(html, "PublisherIds", publisher.Id, "publisher_" + publisher.Id, publisher.Name) ); } public string MakeSystemTable(HtmlHelper html, int cellsPerRow = 8) { return MakeTable( "system-checkbox-table", cellsPerRow, AllSystems, system => CreateCheckbox(html, "SystemIds", system.Id, "system_" + system.Id, system.Abbreviation) ); } public string MakeCategoryTable(HtmlHelper html, int cellsPerRow = 5) { return MakeTable( "category-checkbox-table", cellsPerRow, AllCategories, category => CreateCheckbox(html, "CategoryIds", category.Id, "category_" + category.Id, category.Name) ); } public string MakeRegionTable(HtmlHelper html, int cellsPerRow = 8) { return MakeTable( "region-checkbox-table", cellsPerRow, (IEnumerable)Enum.GetValues(typeof(Region)), region => CreateCheckbox(html, "GameRegions", region, "region_" + (int)region, region.ToString()) ); } private static string CreateCheckbox(HtmlHelper html, string name, object value, string id, string labelText) { return string.Format("", name, value, id) + html.Label(labelText, id); } } }