commit 97e3252cdb4b91cf0a0b987e83e283e98b7b9804
parent 1dabd3bf8bfdd45d5e8eba3c07ce725698d4d54c
Author: William Lindholm <william_lindholm@outlook.com>
Date: Sun, 15 Oct 2023 14:05:23 +0200
Added inserts for details pages.
Diffstat:
12 files changed, 192 insertions(+), 20 deletions(-)
diff --git a/MVC-databaskonstruktion/Controllers/OperatesInController.cs b/MVC-databaskonstruktion/Controllers/OperatesInController.cs
@@ -0,0 +1,51 @@
+using Microsoft.AspNetCore.Mvc;
+using MVC_databaskonstruktion.Models;
+using MySql.Data.MySqlClient;
+using MySqlX.XDevAPI.Relational;
+using System.Diagnostics;
+
+namespace MVC_databaskonstruktion.Controllers
+{
+ public class OperatesIn : Controller
+ {
+ private readonly IConfiguration _configuration;
+ private OperatesInModel _operatesInModel { get; set; }
+
+ public OperatesIn(IConfiguration configuration)
+ {
+ this._configuration = configuration;
+ _operatesInModel = new OperatesInModel(_configuration);
+ }
+
+ public IActionResult Delete(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName)
+ {
+ try
+ {
+ _operatesInModel.DeleteAgentFromOperation(OperationName, StartDate, IncidentName, IncidentNumber, CodeName);
+ }
+ catch (MySqlException e)
+ {
+ switch (e.Number)
+ {
+ case 1451:
+ TempData["ErrorMessage"] = "Foreign Key Constraint Failed!";
+ break;
+ case 1452:
+ TempData["ErrorMessage"] = "Foreign Key Constraint Failed!";
+ break;
+ default:
+ TempData["ErrorMessage"] = $"Something went wrong: error {e.Number}";
+ break;
+ }
+ }
+
+ return RedirectToAction("Details", "Operations", new
+ {
+ OperationName,
+ StartDate,
+ IncidentName,
+ IncidentNumber
+ });
+ }
+ }
+}
diff --git a/MVC-databaskonstruktion/Controllers/OperationsController.cs b/MVC-databaskonstruktion/Controllers/OperationsController.cs
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using MVC_databaskonstruktion.Models;
using MySql.Data.MySqlClient;
+using System.Diagnostics;
using System.Numerics;
namespace MVC_databaskonstruktion.Controllers
@@ -27,6 +28,7 @@ namespace MVC_databaskonstruktion.Controllers
public IActionResult Details(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber)
{
ViewBag.AgentsInOperation = _operationsModel.GetAgentsInOperation(OperationName, StartDate, IncidentName, IncidentNumber);
+ ViewBag.AddAgentModal = _operationsModel.CreateAgentModal(OperationName, StartDate, IncidentName, IncidentNumber);
return View("Details");
}
@@ -58,6 +60,8 @@ namespace MVC_databaskonstruktion.Controllers
public IActionResult Create(string OperationName, DateTime StartDate, DateTime EndDate, bool SuccessRate, string GroupLeader, string Incident)
{
+ Trace.WriteLine("In Model: Successrate read as: " + SuccessRate);
+
try
{
_operationsModel.CreateOperation(OperationName, StartDate, EndDate, SuccessRate, GroupLeader, Incident);
@@ -83,5 +87,33 @@ namespace MVC_databaskonstruktion.Controllers
return RedirectToAction("Index");
}
+
+ public IActionResult AddAgent(string CodeName, string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber)
+ {
+ try
+ {
+ _operationsModel.AddAgentToOperation(OperationName, StartDate, IncidentName, IncidentNumber, CodeName);
+ }
+ catch (MySqlException e)
+ {
+ switch (e.Number)
+ {
+ case 1062:
+ TempData["ErrorMessage"] = "Agent already exists!";
+ break;
+ case 1406:
+ TempData["ErrorMessage"] = "Data too long!";
+ break;
+ case 3819:
+ TempData["ErrorMessage"] = "Invalid Data!";
+ break;
+ default:
+ TempData["ErrorMessage"] = $"Something went wrong: {e.Number}";
+ break;
+ }
+ }
+
+ return RedirectToAction("Details", new { OperationName, StartDate, IncidentName, IncidentNumber });
+ }
}
}
diff --git a/MVC-databaskonstruktion/Models/AgentsModel.cs b/MVC-databaskonstruktion/Models/AgentsModel.cs
@@ -44,9 +44,9 @@ namespace MVC_databaskonstruktion.Models
public void DeleteAgent(string table, string CodeName)
{
- List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>>
+ List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>>
{
- new KeyValuePair<string, string>("CodeName", CodeName)
+ new KeyValuePair<string, object>("CodeName", CodeName)
};
_databaseRepository.DeleteRow(table, conditions);
diff --git a/MVC-databaskonstruktion/Models/IncidentsModel.cs b/MVC-databaskonstruktion/Models/IncidentsModel.cs
@@ -1,5 +1,4 @@
using MVC_databaskonstruktion.Utils;
-using System.Runtime.InteropServices;
namespace MVC_databaskonstruktion.Models
{
@@ -28,10 +27,10 @@ namespace MVC_databaskonstruktion.Models
public void DeleteIncident(string table, string incidentName, string incidentNumber)
{
- List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>>
+ List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>>
{
- new KeyValuePair<string, string>("IncidentName", incidentName),
- new KeyValuePair<string, string>("IncidentNumber", incidentNumber)
+ new KeyValuePair<string, object>("IncidentName", incidentName),
+ new KeyValuePair<string, object>("IncidentNumber", incidentNumber)
};
_databaseRepository.DeleteRow(table, conditions);
@@ -41,6 +40,10 @@ namespace MVC_databaskonstruktion.Models
{
return _tableBuilder
.SetDataTable(_databaseRepository.GetTable($"SELECT * FROM Operation WHERE IncidentName = '{IncidentName}' AND IncidentNumber = '{IncidentNumber}';"))
+ .SetRedirect("Details")
+ .SetDeleteTable("Operation")
+ .SetPrimaryKeys(new List<string> { "IncidentName", "IncidentNumber", "OperationName", "StartDate" })
+ .SetControllerName("Operations")
.Build();
}
diff --git a/MVC-databaskonstruktion/Models/OperatesInModel.cs b/MVC-databaskonstruktion/Models/OperatesInModel.cs
@@ -0,0 +1,30 @@
+using MVC_databaskonstruktion.Utils;
+
+namespace MVC_databaskonstruktion.Models
+{
+ public class OperatesInModel
+ {
+ private IConfiguration _configuration { get; set; }
+ private DatabaseRepository _databaseRepository { get; set; }
+
+ public OperatesInModel(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ _databaseRepository = new DatabaseRepository(_configuration);
+ }
+
+ public void DeleteAgentFromOperation(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName)
+ {
+ var operatesInData = new List<KeyValuePair<string, object>>
+ {
+ new KeyValuePair<string, object>("CodeName", CodeName),
+ new KeyValuePair<string, object>("OperationName", OperationName),
+ new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-dd")),
+ new KeyValuePair<string, object>("IncidentName", IncidentName),
+ new KeyValuePair<string, object>("IncidentNumber", IncidentNumber)
+ };
+
+ _databaseRepository.DeleteRow("OperatesIn", operatesInData);
+ }
+ }
+}
diff --git a/MVC-databaskonstruktion/Models/OperationsModel.cs b/MVC-databaskonstruktion/Models/OperationsModel.cs
@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using MVC_databaskonstruktion.Utils;
+using System.Diagnostics;
namespace MVC_databaskonstruktion.Models
{
@@ -38,8 +39,9 @@ namespace MVC_databaskonstruktion.Models
{
return _tableBuilder
.SetDataTable(_databaseRepository.GetTable($"SELECT * FROM OperatesIn WHERE OperationName = '{OperationName}' AND StartDate = '{StartDate}' AND IncidentName = '{IncidentName}' AND IncidentNumber = '{IncidentNumber}';"))
- .SetControllerName("Agents")
+ .SetControllerName("Operations")
.SetDeleteTable("OperatesIn")
+ .SetDeletionController("OperatesIn")
.SetRedirect("FieldAgentDetails")
.SetPrimaryKeys(new List<string> { "CodeName", "OperationName", "StartDate", "IncidentName", "IncidentNumber" })
.Build();
@@ -47,12 +49,12 @@ namespace MVC_databaskonstruktion.Models
public void DeleteOperation(string table, string IncidentName, string IncidentNumber, string OperationName, DateTime StartDate)
{
- List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>>
+ List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>>
{
- new KeyValuePair<string, string>("IncidentName", IncidentName),
- new KeyValuePair<string, string>("IncidentNumber", IncidentNumber),
- new KeyValuePair<string, string>("OperationName", OperationName),
- new KeyValuePair<string, string>("StartDate", StartDate.ToString("yyyy-M-d"))
+ new KeyValuePair<string, object>("IncidentName", IncidentName),
+ new KeyValuePair<string, object>("IncidentNumber", IncidentNumber),
+ new KeyValuePair<string, object>("OperationName", OperationName),
+ new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-dd"))
};
_databaseRepository.DeleteRow(table, conditions);
@@ -64,8 +66,8 @@ namespace MVC_databaskonstruktion.Models
var groupLeaderSelection = _databaseRepository.GetColumnAsDropdown("SELECT CodeName FROM GroupLeaders");
var successSelection = new List<SelectListItem>
{
- new SelectListItem { Text = "Success", Value = "1" },
- new SelectListItem { Text = "Fail", Value = "0" }
+ new SelectListItem { Text = "Success", Value = "True" },
+ new SelectListItem { Text = "Fail", Value = "False" }
};
var modalBuilder = new ModalBuilder()
@@ -84,6 +86,8 @@ namespace MVC_databaskonstruktion.Models
public void CreateOperation(string OperationName, DateTime StartDate, DateTime EndDate, bool SuccessRate, string GroupLeader, string Incident)
{
+ Trace.WriteLine("In Model: Successrate read as: " + SuccessRate);
+
var IncidentName = Incident.Split(", ")[0];
var IncidentNumber = Incident.Split(", ")[1];
@@ -100,5 +104,41 @@ namespace MVC_databaskonstruktion.Models
_databaseRepository.CreateRow("Operation", OperationData);
}
+
+ public void AddAgentToOperation(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName)
+ {
+ var AgentData = new List<KeyValuePair<string, object>>
+ {
+ new KeyValuePair<string, object>("CodeName", CodeName),
+ new KeyValuePair<string, object>("OperationName", OperationName),
+ new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-d")),
+ new KeyValuePair<string, object>("IncidentName", IncidentName),
+ new KeyValuePair<string, object>("IncidentNumber", IncidentNumber)
+ };
+
+ foreach(var data in AgentData)
+ {
+ Trace.WriteLine(data.Key + " : " + data.Value);
+ }
+
+ _databaseRepository.CreateRow("OperatesIn", AgentData);
+ }
+
+ public ModalContext CreateAgentModal(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber)
+ {
+ var fieldAgentsSelection = _databaseRepository.GetColumnAsDropdown("SELECT CodeName FROM FieldAgents");
+
+ var modalBuilder = new ModalBuilder()
+ .SetTitle("Add Agent")
+ .SetIdentifier("AddAgent")
+ .SetAction("AddAgent", "Operations")
+ .AddInput("CodeName", "CodeName", "dropdown", "", fieldAgentsSelection)
+ .AddInput("OperationName", "OperationName", "hidden", OperationName)
+ .AddInput("StartDate", "StartDate", "hidden", StartDate.ToString("yyyy-M-d"))
+ .AddInput("IncidentName", "IncidentName", "hidden", IncidentName)
+ .AddInput("IncidentNumber", "IncidentNumber", "hidden", IncidentNumber.ToString());
+
+ return modalBuilder.Build();
+ }
}
}
\ No newline at end of file
diff --git a/MVC-databaskonstruktion/Utils/DatabaseRepository.cs b/MVC-databaskonstruktion/Utils/DatabaseRepository.cs
@@ -72,7 +72,7 @@ namespace MVC_databaskonstruktion.Utils
cmd.ExecuteNonQuery();
}
- public void DeleteRow(string table, List<KeyValuePair<string, string>> primaryKeys)
+ public void DeleteRow(string table, List<KeyValuePair<string, object>> primaryKeys)
{
string whereClause = "WHERE ";
for (var i = 0; i < primaryKeys.Count; i++)
diff --git a/MVC-databaskonstruktion/Utils/TableObject.cs b/MVC-databaskonstruktion/Utils/TableObject.cs
@@ -7,6 +7,7 @@ namespace MVC_databaskonstruktion.Utils
public DataTable DataSet;
public string ControllerName;
public string? DeleteTable;
+ public string? DeletionController;
public List<string>? PrimaryKeys;
public string? Redirect;
}
diff --git a/MVC-databaskonstruktion/Utils/TableObjectBuilder.cs b/MVC-databaskonstruktion/Utils/TableObjectBuilder.cs
@@ -7,6 +7,7 @@ namespace MVC_databaskonstruktion.Utils
private DataTable _dataTable;
private string _controllerName;
private string? _deleteTable;
+ private string? _deletionController;
private List<string>? _primaryKeys;
private string? _redirect;
@@ -38,6 +39,12 @@ namespace MVC_databaskonstruktion.Utils
return this;
}
+ public TableObjectBuilder SetDeletionController(string controller)
+ {
+ _deletionController = controller;
+ return this;
+ }
+
public TableObjectBuilder SetDataTable(DataTable dataTable)
{
_dataTable = dataTable;
@@ -55,11 +62,15 @@ namespace MVC_databaskonstruktion.Utils
if (_dataTable == null)
throw new NullReferenceException("DataTable is null.");
+ if (_deletionController == null)
+ _deletionController = _controllerName;
+
return new TableObject
{
DataSet = this._dataTable,
ControllerName = this._controllerName,
DeleteTable = this._deleteTable,
+ DeletionController = this._deletionController,
PrimaryKeys = this._primaryKeys,
Redirect = this._redirect
};
diff --git a/MVC-databaskonstruktion/Views/Operations/Details.cshtml b/MVC-databaskonstruktion/Views/Operations/Details.cshtml
@@ -7,4 +7,8 @@
<h3>Agents in operation</h3>
-<partial name="_TablePartial" model="ViewBag.AgentsInOperation" />
-\ No newline at end of file
+<partial name="_TablePartial" model="ViewBag.AgentsInOperation" />
+
+<label>Add agent to incident</label>
+<br />
+<partial name="_ModalPartial" model="ViewBag.AddAgentModal" />
+\ No newline at end of file
diff --git a/MVC-databaskonstruktion/Views/Shared/_ModalPartial.cshtml b/MVC-databaskonstruktion/Views/Shared/_ModalPartial.cshtml
@@ -36,7 +36,7 @@
</div>
break;
case "hidden":
- <input type="hidden" id="@input.Id" value="@input.Placeholder">
+ <input type="hidden" name="@input.Id" id="@input.Id" value="@input.Placeholder">
break;
case "normal":
<div class="form-group">
diff --git a/MVC-databaskonstruktion/Views/Shared/_TablePartial.cshtml b/MVC-databaskonstruktion/Views/Shared/_TablePartial.cshtml
@@ -7,7 +7,7 @@
var deleteQuery = new RouteValueDictionary();
}
-<div class="overflow-scroll w-100">
+<div class="overflow-auto w-100">
<table class="table table-striped table-bordered">
<thead class="table-dark">
<tr>
@@ -59,7 +59,7 @@
@if (!string.IsNullOrEmpty(Model.DeleteTable))
{
<td class="col-1">
- @Html.ActionLink("Delete", "Delete", Model.ControllerName, deleteQuery, new { @class = "btn btn-block btn-danger m-0 w-100" })
+ @Html.ActionLink("Delete", "Delete", Model.DeletionController, deleteQuery, new { @class = "btn btn-block btn-danger m-0 w-100" })
</td>
}
</tr>