143 lines
4.7 KiB
C#
143 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Web.Mvc;
|
|
using JetBrains.Annotations;
|
|
using Portoa.Validation.DataAnnotations;
|
|
using VideoGameQuotes.Api;
|
|
|
|
namespace VideoGameQuotes.Web.Models {
|
|
|
|
public class EditQuoteModel {
|
|
public EditQuoteModel() {
|
|
ControllerName = "Quote";
|
|
ActionName = "Submit";
|
|
}
|
|
|
|
public EditQuoteModel(Quote quote) : this() {
|
|
QuoteId = quote.Id;
|
|
Flags = quote.Flags.ToList();
|
|
QuoteText = quote.Text;
|
|
CategoryIds = quote.Categories.Select(category => category.Id).ToList();
|
|
GameId = quote.Game.Id;
|
|
ActionName = "Edit";
|
|
}
|
|
|
|
public User CurrentUser { get; set; }
|
|
|
|
public string ActionName { get; set; }
|
|
public string ControllerName { get; set; }
|
|
|
|
public int QuoteId { get; set; }
|
|
public List<QuoteFlag> Flags { get; set; }
|
|
|
|
[Required(ErrorMessage = "Quote text must be non-empty, saddlebags")]
|
|
[StringLength(1024, ErrorMessage = "Quote can't be longer than 1024 characters, slut")]
|
|
[DisplayName("Quote")]
|
|
public string QuoteText { get; set; }
|
|
[DisplayName("Categories")]
|
|
public IList<int> CategoryIds { get; set; }
|
|
|
|
[GreaterThanZero(ErrorMessage = "Quit screwing with the form, faggle"), DisplayName("Game")]
|
|
public int GameId { get; set; }
|
|
|
|
public IEnumerable<Game> AllGames { get; set; }
|
|
public IEnumerable<GamingSystem> AllSystems { get; set; }
|
|
public IEnumerable<Publisher> AllPublishers { get; set; }
|
|
public IEnumerable<Category> AllCategories { get; set; }
|
|
|
|
|
|
public IEnumerable<SelectListItem> GetGameList() {
|
|
return AllGames.Select(game => new SelectListItem { Value = game.Id.ToString(), Text = game.Name });
|
|
}
|
|
|
|
private static string MakeTable<T>(string tableId, int cellsPerRow, IEnumerable<T> items, Func<T, string> cellDataCallback) {
|
|
var table = new TagBuilder("table");
|
|
table.MergeAttribute("id", tableId);
|
|
table.MergeAttribute("class", "checkbox-table");
|
|
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<EditQuoteModel> html, int cellsPerRow = 4) {
|
|
return MakeTable(
|
|
"publisher-checkbox-table",
|
|
cellsPerRow,
|
|
AllPublishers,
|
|
publisher => CreateCheckbox("PublisherIds", publisher.Id, "publisher_" + publisher.Id, publisher.Name, "publisher")
|
|
);
|
|
}
|
|
|
|
public string MakeSystemTable(HtmlHelper<EditQuoteModel> html, int cellsPerRow = 6) {
|
|
return MakeTable(
|
|
"system-checkbox-table",
|
|
cellsPerRow,
|
|
AllSystems,
|
|
system => CreateCheckbox("SystemIds", system.Id, "system_" + system.Id, system.Abbreviation, "system")
|
|
);
|
|
}
|
|
|
|
public string MakeCategoryTable(HtmlHelper<EditQuoteModel> html, int cellsPerRow = 5) {
|
|
var categoryIds = CategoryIds ?? new List<int>();
|
|
return MakeTable(
|
|
"category-checkbox-table",
|
|
cellsPerRow,
|
|
AllCategories,
|
|
category => CreateCheckbox("CategoryIds", category.Id, "category_" + category.Id, category.Name, "category", categoryIds.Contains(category.Id))
|
|
);
|
|
}
|
|
|
|
public string MakeRegionTable(int cellsPerRow = 8) {
|
|
return MakeTable(
|
|
"region-checkbox-table",
|
|
cellsPerRow,
|
|
Enum.GetValues(typeof(Region)).Cast<Region>().Where(region => region != Region.Unknown),
|
|
region => CreateCheckbox("GameRegions", region, "region_" + (int)region, region.ToString())
|
|
);
|
|
}
|
|
|
|
private string CreateCheckbox(string name, object value, string id, string labelText, string editType = null, bool isChecked = false) {
|
|
return string.Format(
|
|
"<input type=\"checkbox\" name=\"{0}\" value=\"{1}\" id=\"{2}\"{4}/><label for=\"{2}\">{3}</label>{5}",
|
|
name,
|
|
value,
|
|
id,
|
|
labelText,
|
|
isChecked ? " checked=\"checked\"" : "",
|
|
GetEditAndDeleteLinks(editType)
|
|
);
|
|
}
|
|
|
|
private string GetEditAndDeleteLinks([CanBeNull]string editType) {
|
|
if (editType == null || CurrentUser.Group < UserGroup.Admin) {
|
|
return string.Empty;
|
|
}
|
|
|
|
return string.Format("<a href=\"#\" class=\"edit-link edit-{0}-link\" title=\"edit\"></a><a href=\"#\" class=\"delete-link delete-{0}-link\" title=\"delete\"></a>", editType);
|
|
}
|
|
}
|
|
} |