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") +
+ + @Html.EditorForModel() +
+ +
+
+} 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.EditorForModel() + +
+ +
+
+} + +
+ @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 @@ + + + +