edit and delete publishers

This commit is contained in:
tmont 2011-02-24 01:46:54 +00:00
parent f275b9192f
commit 7c2fe503de
6 changed files with 143 additions and 13 deletions

View File

@ -1,4 +1,7 @@
using System.Web.Mvc; using System.Linq;
using System.Web.Mvc;
using Portoa.Persistence;
using Portoa.Util;
using Portoa.Web.Controllers; using Portoa.Web.Controllers;
using VideoGameQuotes.Api; using VideoGameQuotes.Api;
using VideoGameQuotes.Web.Models; using VideoGameQuotes.Web.Models;
@ -13,8 +16,48 @@ namespace VideoGameQuotes.Web.Controllers {
this.publisherService = publisherService; this.publisherService = publisherService;
} }
[HttpPost, VerifyUser(Group = UserGroup.Admin)]
public JsonResult Delete(int id) {
if (id < 1) {
return Json(this.CreateJsonResponse("Invalid ID"));
}
try {
var publisher = publisherService.FindById(id);
var games = publisherService.GetGamesForPublisher(publisher);
if (games.Any()) {
return Json(this.CreateJsonErrorResponse(
string.Format("The following games are still using this publisher: {0}", games.Implode(game => game.Name, ", "))
));
}
} catch (EntityNotFoundException) {
return Json(this.CreateJsonErrorResponse("No publisher exists for ID " + id));
}
publisherService.Delete(id);
return Json(this.CreateJsonResponse());
}
[HttpPost, VerifyUser(Group = UserGroup.Admin)]
public JsonResult Edit(EditPublisherModel model) {
if (model.PublisherId < 1) {
ModelState.AddModelError("PublisherId", "Invalid publisher ID");
}
if (!ModelState.IsValid) {
return Json(this.CreateJsonErrorResponse("Some errors occurred"));
}
var publisher = publisherService.FindById(model.PublisherId);
publisher.Name = model.PublisherName;
publisher.Website = model.PublisherWebsite;
publisher = publisherService.Save(publisher);
return Json(this.CreateJsonResponse(data: publisher.ToDto()));
}
[HttpPost, VerifyUser] [HttpPost, VerifyUser]
public ActionResult Create(CreatePublisherModel model) { public ActionResult Create(EditPublisherModel model) {
if (!ModelState.IsValid) { if (!ModelState.IsValid) {
return Json(this.CreateJsonErrorResponse("Some errors occurred.")); return Json(this.CreateJsonErrorResponse("Some errors occurred."));
} }

View File

@ -1,9 +1,10 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace VideoGameQuotes.Web.Models { namespace VideoGameQuotes.Web.Models {
public class CreatePublisherModel { public class EditPublisherModel {
[Required(ErrorMessage = "Publishers must have a name, douchebag")] [Required(ErrorMessage = "Publishers must have a name, douchebag")]
public string PublisherName { get; set; } public string PublisherName { get; set; }
public string PublisherWebsite { get; set; } public string PublisherWebsite { get; set; }
public int PublisherId { get; set; }
} }
} }

View File

@ -81,7 +81,7 @@ namespace VideoGameQuotes.Web.Models {
return table.ToString(TagRenderMode.Normal); return table.ToString(TagRenderMode.Normal);
} }
public string MakePublisherTable(HtmlHelper<EditQuoteModel> html, int cellsPerRow = 6) { public string MakePublisherTable(HtmlHelper<EditQuoteModel> html, int cellsPerRow = 4) {
return MakeTable( return MakeTable(
"publisher-checkbox-table", "publisher-checkbox-table",
cellsPerRow, cellsPerRow,

View File

@ -1,4 +1,6 @@
using System.Linq; using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations; using JetBrains.Annotations;
using Portoa.Persistence; using Portoa.Persistence;
using VideoGameQuotes.Api; using VideoGameQuotes.Api;
@ -9,13 +11,18 @@ namespace VideoGameQuotes.Web.Services {
[CanBeNull] [CanBeNull]
Publisher FindByName(string name); Publisher FindByName(string name);
Publisher Save(Publisher publisher); Publisher Save(Publisher publisher);
IEnumerable<Game> GetGamesForPublisher(Publisher publisher);
Publisher FindById(int id);
void Delete(int id);
} }
public class PublisherService : IPublisherService { public class PublisherService : IPublisherService {
private readonly IRepository<Publisher> repository; private readonly IRepository<Publisher> repository;
private readonly IRepository<Game> gameRepository;
public PublisherService(IRepository<Publisher> repository) { public PublisherService(IRepository<Publisher> repository, IRepository<Game> gameRepository) {
this.repository = repository; this.repository = repository;
this.gameRepository = gameRepository;
} }
[UnitOfWork] [UnitOfWork]
@ -27,5 +34,22 @@ namespace VideoGameQuotes.Web.Services {
public Publisher Save(Publisher publisher) { public Publisher Save(Publisher publisher) {
return repository.Save(publisher); return repository.Save(publisher);
} }
[UnitOfWork]
public IEnumerable<Game> GetGamesForPublisher(Publisher publisher) {
return gameRepository
.Records
.Where(game => game.Publishers.Contains(publisher));
}
[UnitOfWork]
public Publisher FindById(int id) {
return repository.FindById(id);
}
[UnitOfWork]
public void Delete(int id) {
repository.Delete(id);
}
} }
} }

View File

@ -91,7 +91,7 @@
<Compile Include="Controllers\PublisherController.cs" /> <Compile Include="Controllers\PublisherController.cs" />
<Compile Include="Controllers\SystemController.cs" /> <Compile Include="Controllers\SystemController.cs" />
<Compile Include="Models\EditGameModel.cs" /> <Compile Include="Models\EditGameModel.cs" />
<Compile Include="Models\CreatePublisherModel.cs" /> <Compile Include="Models\EditPublisherModel.cs" />
<Compile Include="Services\GameService.cs" /> <Compile Include="Services\GameService.cs" />
<Compile Include="Services\PublisherService.cs" /> <Compile Include="Services\PublisherService.cs" />
<Compile Include="Services\SystemService.cs" /> <Compile Include="Services\SystemService.cs" />

View File

@ -358,11 +358,10 @@
$("#create-system-submit").click(function() { $("#create-system-submit").click(function() {
var $container = $("#create-system-form"); var $container = $("#create-system-form");
var data = { SystemName: $("#SystemName").val(), SystemAbbreviation: $("#SystemAbbreviation").val(), SystemReleaseDate: $("#SystemReleaseDate").val() }; var data = { SystemName: $("#SystemName").val(), SystemAbbreviation: $("#SystemAbbreviation").val(), SystemReleaseDate: $("#SystemReleaseDate").val() };
var url = "/system/create"; var url = "/system/create";
var systemId = $container.find("> .edit-mode").val(); var systemId = $container.find("> .edit-mode").val();
if (systemId > 0) { if (systemId > 0) {
url = "/system/edit"; url = "/system/edit";
data.SystemId = systemId; data.SystemId = systemId;
@ -394,9 +393,18 @@
$("#create-publisher-submit").click(function() { $("#create-publisher-submit").click(function() {
var $container = $("#create-publisher-form"); var $container = $("#create-publisher-form");
$.ajax("/publisher/create", { var data = { PublisherName: $("#PublisherName").val(), PublisherWebsite: $("#PublisherWebsite").val() };
var url = "/publisher/create";
var publisherId = $container.find("> .edit-mode").val();
if (publisherId > 0) {
url = "/publisher/edit";
data.PublisherId = publisherId;
}
$.ajax(url, {
type: "POST", type: "POST",
data: { PublisherName: $("#PublisherName").val(), PublisherWebsite: $("#PublisherWebsite").val() }, data: data,
beforeSend: function() { $container.clearModelErrors(); }, beforeSend: function() { $container.clearModelErrors(); },
success: function(data, statux, $xhr) { success: function(data, statux, $xhr) {
if (data.Error !== null) { if (data.Error !== null) {
@ -404,7 +412,13 @@
return; return;
} }
addNewCheckbox($("#publisher-checkbox-table"), "PublisherIds", data.Data.Id, data.Data.Name, 8); if (publisherId <= 0) {
addNewCheckbox($("#publisher-checkbox-table"), "PublisherIds", data.Data.Id, data.Data.Name, 4);
} else {
//update publisher name
$("#publisher-checkbox-table").find("input[value='" + data.Data.Id +"'] + label").text(data.Data.Name);
}
toggleFormAndLink("publisher")(); toggleFormAndLink("publisher")();
} }
}); });
@ -644,6 +658,54 @@
return false; return false;
}); });
$(".edit-publisher-link").click(function() {
var $link = $(this);
$link.toggleClass("edit-link loading-link");
var publisherId = $link.siblings("input[name='PublisherIds']").val();
$.vgquotes.getResourceById("publisher", publisherId, function(publisher) {
$link.toggleClass("edit-link loading-link");
if (publisher === null) {
alert("Unable to fetch publisher " + publisherId);
return;
}
toggleFormAndLink("publisher")();
$("#create-publisher-form > .edit-mode").val(publisherId);
$("#create-publisher-form > fieldset > legend").text("Edit Publisher");
//populate publisher form with publisher data
$("#PublisherName").val(publisher.Name);
$("#PublisherWebsite").val(publisher.Website);
});
return false;
});
$(".delete-publisher-link").click(function() {
var $link = $(this);
$link.toggleClass("delete-link loading-link");
$.ajax("/publisher/delete", {
type: "POST",
data: { id: $link.siblings("input[name='PublisherIds']").val() },
success: function(data, status, $xhr) {
if (data.Error !== null) {
alert(data.Error);
return;
}
//remove checkbox for that publisher
$link.parent().empty();
},
complete: function() { $link.toggleClass("delete-link loading-link"); }
});
return false;
});
}; };
(function(){ (function(){