diff --git a/Web/Controllers/PurposeController.cs b/Web/Controllers/PurposeController.cs
new file mode 100644
index 0000000..265a8be
--- /dev/null
+++ b/Web/Controllers/PurposeController.cs
@@ -0,0 +1,71 @@
+using System.Linq;
+using System.Web.Mvc;
+using MileageTraker.Web.Models;
+
+namespace MileageTraker.Web.Controllers
+{
+ [Authorize(Roles = "Administrator, Developer")]
+ public class PurposeController : ControllerBase
+ {
+ public ActionResult Index()
+ {
+ return View(DataService.GetPurposeTypes().ToList());
+ }
+
+ public ActionResult Details(int id = 0)
+ {
+ var purposetype = DataService.FindPurposeType(id);
+ if (purposetype == null)
+ {
+ TempData["StatusMessage"] = "Purpose " + id + " not found";
+ return RedirectToAction("Index");
+ }
+ return View(purposetype);
+ }
+
+ public ActionResult Create()
+ {
+ var purposeType = new PurposeType();
+ purposeType.SortOrder = DataService.GetPurposeTypes().Max(pt => pt.SortOrder) + 2;
+ return View(purposeType);
+ }
+
+ [HttpPost]
+ public ActionResult Create([Bind(Exclude = "PurposeTypeId")]PurposeType purposetype)
+ {
+ if (ModelState.IsValid)
+ {
+ DataService.AddPurposeType(purposetype);
+
+ TempData["StatusMessage"] = "Purpose " + purposetype.Purpose + " created";
+ return RedirectToAction("Index");
+ }
+
+ return View(purposetype);
+ }
+
+ public ActionResult Edit(int id = 0)
+ {
+ var purposeType = DataService.FindPurposeType(id);
+ if (purposeType == null)
+ {
+ TempData["StatusMessage"] = "Purpose " + id + " not found";
+ return RedirectToAction("Index");
+ }
+ return View(purposeType);
+ }
+
+ [HttpPost]
+ public ActionResult Edit(PurposeType purposeType)
+ {
+ if (ModelState.IsValid)
+ {
+ DataService.UpdatePurposeType(purposeType);
+
+ TempData["StatusMessage"] = "Changes to Purpose " + purposeType.Purpose + " saved";
+ return RedirectToAction("Index");
+ }
+ return View(purposeType);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Web/DAL/DataService.cs b/Web/DAL/DataService.cs
index 6e68442..e1fed32 100644
--- a/Web/DAL/DataService.cs
+++ b/Web/DAL/DataService.cs
@@ -330,6 +330,23 @@ namespace MileageTraker.Web.DAL
select pt).OrderBy(pt => pt.SortOrder).ToList();
}
+ public void AddPurposeType(PurposeType purposeType)
+ {
+ _db.PurposeTypes.Add(purposeType);
+ _db.SaveChanges();
+ }
+
+ public void UpdatePurposeType(PurposeType purposeType)
+ {
+ _db.Entry(purposeType).State = EntityState.Modified;
+ _db.SaveChanges();
+ }
+
+ public PurposeType FindPurposeType(int id)
+ {
+ return GetPurposeTypes().FirstOrDefault(pt => pt.PurposeTypeId == id);
+ }
+
#endregion
#region Vehicle
diff --git a/Web/Migrations/201303071926246_UpdatePurposeRequired.Designer.cs b/Web/Migrations/201303071926246_UpdatePurposeRequired.Designer.cs
new file mode 100644
index 0000000..6750d1d
--- /dev/null
+++ b/Web/Migrations/201303071926246_UpdatePurposeRequired.Designer.cs
@@ -0,0 +1,24 @@
+//
+namespace MileageTraker.Web.Migrations
+{
+ using System.Data.Entity.Migrations;
+ using System.Data.Entity.Migrations.Infrastructure;
+
+ public sealed partial class UpdatePurposeRequired : IMigrationMetadata
+ {
+ string IMigrationMetadata.Id
+ {
+ get { return "201303071926246_UpdatePurposeRequired"; }
+ }
+
+ string IMigrationMetadata.Source
+ {
+ get { return null; }
+ }
+
+ string IMigrationMetadata.Target
+ {
+ get { return "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"; }
+ }
+ }
+}
diff --git a/Web/Migrations/201303071926246_UpdatePurposeRequired.cs b/Web/Migrations/201303071926246_UpdatePurposeRequired.cs
new file mode 100644
index 0000000..c808326
--- /dev/null
+++ b/Web/Migrations/201303071926246_UpdatePurposeRequired.cs
@@ -0,0 +1,17 @@
+namespace MileageTraker.Web.Migrations
+{
+ using System.Data.Entity.Migrations;
+
+ public partial class UpdatePurposeRequired : DbMigration
+ {
+ public override void Up()
+ {
+ AlterColumn("PurposeType", "Purpose", c => c.String(nullable: false));
+ }
+
+ public override void Down()
+ {
+ AlterColumn("PurposeType", "Purpose", c => c.String());
+ }
+ }
+}
diff --git a/Web/Models/PurposeType.cs b/Web/Models/PurposeType.cs
index 503cc86..5ee0124 100644
--- a/Web/Models/PurposeType.cs
+++ b/Web/Models/PurposeType.cs
@@ -1,12 +1,17 @@
using System.ComponentModel.DataAnnotations;
+using System.Web.Mvc;
+using MileageTraker.Web.Attributes;
namespace MileageTraker.Web.Models
{
public class PurposeType
{
[Key]
+ [HiddenInput(DisplayValue = false)]
public int PurposeTypeId { get; set; }
+ [Required]
public string Purpose { get; set; }
+ [InputSize("mini")]
public int SortOrder { get; set; }
}
}
\ No newline at end of file
diff --git a/Web/Properties/PublishProfiles/ETHRA.pubxml b/Web/Properties/PublishProfiles/ETHRA.pubxml
index a57f689..9b3920f 100644
--- a/Web/Properties/PublishProfiles/ETHRA.pubxml
+++ b/Web/Properties/PublishProfiles/ETHRA.pubxml
@@ -15,7 +15,7 @@ by editing this MSBuild file. In order to learn more about this please visit htt
diff --git a/Web/Views/Log/Index.cshtml b/Web/Views/Log/Index.cshtml
index 2d78213..d285459 100644
--- a/Web/Views/Log/Index.cshtml
+++ b/Web/Views/Log/Index.cshtml
@@ -24,6 +24,7 @@
@Html.ActionLink("Add New Log", "Create", null, new { @class = "btn" })
@Html.ActionLink("Export", "Export", new { Year = Model.SelectedYear, Month = Model.SelectedMonth, LogType = Model.SelectedLogType }, new { @class = "btn" })
+ @Html.ActionLink("Purposes", "Index", "Purpose", null, new { @class = "btn" })
Report
@@ -60,7 +61,7 @@
{
if (item.Notes != null)
{
- return Html.Raw("
" + item.PurposePurpose + "");
+ return Html.Raw("
" + Html.Encode(item.PurposePurpose) + "");
}
return item.PurposePurpose;
}),
diff --git a/Web/Views/Purpose/Create.cshtml b/Web/Views/Purpose/Create.cshtml
new file mode 100644
index 0000000..61794e6
--- /dev/null
+++ b/Web/Views/Purpose/Create.cshtml
@@ -0,0 +1,19 @@
+@model MileageTraker.Web.Models.PurposeType
+
+@{
+ ViewBag.Title = "Create Purpose";
+}
+
+
@ViewBag.Title
+
+@using (Html.BeginForm("Create", "Purpose", FormMethod.Post, new { @class = "form-horizontal well center-content" }))
+{
+ @Html.Partial("_ValidationSummary")
+
+}
diff --git a/Web/Views/Purpose/Details.cshtml b/Web/Views/Purpose/Details.cshtml
new file mode 100644
index 0000000..a8fc7d7
--- /dev/null
+++ b/Web/Views/Purpose/Details.cshtml
@@ -0,0 +1,16 @@
+@model MileageTraker.Web.Models.PurposeType
+
+@{
+ ViewBag.Title = "Purpose Details";
+}
+
+@Html.Partial("_StatusMessage")
+
+
@ViewBag.Title
+
+ @Html.DisplayForModel()
+
+
+
+ @Html.ActionLink("Edit", "Edit", new { id = Model.PurposeTypeId }, new { @class = "btn" })
+
\ No newline at end of file
diff --git a/Web/Views/Purpose/Edit.cshtml b/Web/Views/Purpose/Edit.cshtml
new file mode 100644
index 0000000..081edda
--- /dev/null
+++ b/Web/Views/Purpose/Edit.cshtml
@@ -0,0 +1,28 @@
+@model MileageTraker.Web.Models.PurposeType
+
+@{
+ ViewBag.Title = "Purpose Edit";
+}
+
+@Html.Partial("_StatusMessage")
+
+
@ViewBag.Title
+
+@using (Html.BeginForm("Edit", "Purpose", FormMethod.Post, new { @class = "form-horizontal well center-content" }))
+{
+ @Html.Partial("_ValidationSummary")
+
+
+}
+
+
+ @Html.ActionLink("Details", "Details", new { id = Model.PurposeTypeId }, new { @class = "btn" })
+
diff --git a/Web/Views/Purpose/Index.cshtml b/Web/Views/Purpose/Index.cshtml
new file mode 100644
index 0000000..c777480
--- /dev/null
+++ b/Web/Views/Purpose/Index.cshtml
@@ -0,0 +1,27 @@
+@model IEnumerable
+
+@{
+ ViewBag.Title = "Purposes";
+ var grid = new WebGrid(Model, canSort: false, canPage: false);
+}
+
+@Html.Partial("_StatusMessage")
+
+@ViewBag.Title
+
+
+ @Html.ActionLink("Add new Purpose", "Create", null, new{@class="btn"})
+
+
+@grid.GetHtml(columns:
+ grid.Columns(
+ grid.Column("Purpose"),
+ grid.Column("SortOrder", "Sort Order"),
+ grid.Column(format:
+ @
+ @Html.ActionLink("Edit", "Edit", new { id = item.PurposeTypeId }, new { @class = "btn btn-mini" })
+ @Html.ActionLink("Details", "Details", new { id = item.PurposeTypeId }, new { @class = "btn btn-mini" })
+
)
+ ),
+ htmlAttributes: new { @class = "table table-striped table-bordered table-hover table-condensed" }
+ )
diff --git a/Web/Web.csproj b/Web/Web.csproj
index 6ac76dc..716ebf4 100644
--- a/Web/Web.csproj
+++ b/Web/Web.csproj
@@ -119,6 +119,7 @@
+
@@ -163,6 +164,10 @@
201303051835510_AddLogNotes.cs
+
+
+ 201303071926246_UpdatePurposeRequired.cs
+
@@ -319,6 +324,10 @@
+
+
+
+