ticket and respond

This commit is contained in:
2024-08-03 17:35:24 +03:30
parent 780bfc94c8
commit be864f564b
11 changed files with 246 additions and 105 deletions

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Entity; using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Web; using System.Web;
@ -17,30 +18,38 @@ namespace WebApplication1.Controllers
// GET: responses // GET: responses
public ActionResult Index() public ActionResult Index()
{ {
if (Convert.ToInt32(Session["Userrole"]) > 0)
{
return View(db.tickets.OrderByDescending(p => p.priority).Where(s=> s.status == 1).ToList());
}
else
{
@ViewBag.role = "user";
}
if (Session["User"] != null) if (Session["User"] != null)
{ {
if (Session["Userid"] == null) if (Convert.ToInt32(Session["Userrole"]) > 0)
{ {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest); var models = (from user in db.users // Access Users DbSet
} join tickets in db.tickets on user.ID equals tickets.senderid into ticketsgroup // Join News DbSet
user user = db.users.Find(Session["Userid"]); from tickets in ticketsgroup.DefaultIfEmpty() // Left outer join
if (user == null) where tickets != null // Filter based on existence of news record
select new ticketlist
{ {
return HttpNotFound(); username = user != null ? user.usename : null,
} ticketID = tickets.ID, // Use null-conditional operator for missing news
return View(user); ticketTitle = tickets.title,
priority = tickets.priority,
status = tickets.status
}).OrderByDescending(p => p.priority).Where(s => s.status == 1 || s.status ==3).ToList();
return View(models);
} }
else else
return RedirectToAction("Login","users"); {
return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
}
}
else
return RedirectToAction("Login", "users");
}
public ActionResult test()
{
return View(db.responses.ToList());
} }
@ -74,7 +83,8 @@ namespace WebApplication1.Controllers
{ {
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
response.adminid = Convert.ToInt32(Session["Userid"]);
var targetTicket = db.tickets.Find(response.ticketid);
db.responses.Add(response); db.responses.Add(response);
db.SaveChanges(); db.SaveChanges();
return RedirectToAction("Index"); return RedirectToAction("Index");
@ -91,7 +101,8 @@ namespace WebApplication1.Controllers
return new HttpStatusCodeResult(HttpStatusCode.BadRequest); return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
} }
ViewBag.targetTicket = db.tickets.Find(id); ViewBag.targetTicket = db.tickets.Find(id);
ViewBag.sender = db.users.Find(db.tickets.Find(id).senderid); var u = db.users.Find(db.tickets.Find(id).senderid);
ViewBag.sender = u.usename;
if (ViewBag.targetTicket == null) if (ViewBag.targetTicket == null)
{ {
@ -109,19 +120,59 @@ namespace WebApplication1.Controllers
{ {
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
response.adminid = Convert.ToInt32(Session["Userid"]);
//wtf
db.responses.Add(response);
db.SaveChanges();
var targetTicket= db.tickets.Find(response.ticketid); response.adminid = Convert.ToInt32(Session["Userid"]);
targetTicket.status = 0; var targetTicket = db.tickets.Find(response.ticketid);
if (response.ID == 0)
{
db.responses.Add(response);
targetTicket.status = 2;
targetTicket.responsid = response.ID;
try
{
db.SaveChanges(); db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Console.WriteLine($"Property: {validationError.PropertyName} Error: {validationError.ErrorMessage}");
}
}
}
}
else
{
var res = db.responses.Find(response.ID);
res.content += "\n" + response.content;
targetTicket.status = 2;
try
{
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
foreach (var validationErrors in ex.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Console.WriteLine($"Property: {validationError.PropertyName} Error: {validationError.ErrorMessage}");
}
}
}
}
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
return View(response); return View(response);
} }
// GET: responses/Delete/5 // GET: responses/Delete/5
public ActionResult Delete(int? id) public ActionResult Delete(int? id)
{ {

View File

@ -23,7 +23,7 @@ namespace WebApplication1.Controllers
return View(db.tickets.Where(n => n.senderid == uid)); return View(db.tickets.Where(n => n.senderid == uid));
} }
else else
return RedirectToAction("Login"); return RedirectToAction("Login", "users");
} }
// GET: tickets/Details/5 // GET: tickets/Details/5
@ -58,10 +58,11 @@ namespace WebApplication1.Controllers
// more details see https://go.microsoft.com/fwlink/?LinkId=317598. // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,title,content,priority,senderid,status")] ticket ticket) public ActionResult Create([Bind(Include = "ID,title,content,priority,senderid,status,responsid")] ticket ticket)
{ {
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
ticket.responsid = 0;
ticket.senderid = Convert.ToInt32(Session["Userid"]); ticket.senderid = Convert.ToInt32(Session["Userid"]);
ticket.status = 1; ticket.status = 1;
@ -81,6 +82,8 @@ namespace WebApplication1.Controllers
return new HttpStatusCodeResult(HttpStatusCode.BadRequest); return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
} }
ticket ticket = db.tickets.Find(id); ticket ticket = db.tickets.Find(id);
ViewBag.response = db.responses.Find(ticket.responsid);
if (ticket == null) if (ticket == null)
{ {
return HttpNotFound(); return HttpNotFound();
@ -93,11 +96,13 @@ namespace WebApplication1.Controllers
// more details see https://go.microsoft.com/fwlink/?LinkId=317598. // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,title,content,priority,senderid,status")] ticket ticket) public ActionResult Edit([Bind(Include = "ID,title,content,priority,senderid,status,responsid")] ticket ticket)
{ {
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
db.Entry(ticket).State = EntityState.Modified; var currentTicket = db.tickets.Find(ticket.ID);
currentTicket.content += "\n" + ticket.content;
currentTicket.status = 3;
db.SaveChanges(); db.SaveChanges();
return RedirectToAction("Index"); return RedirectToAction("Index");
} }

View File

@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class Login
{
[Key]
public int ID { get; set; }
public string username { get; set; }
public string password { get; set; }
}
}

View File

@ -34,8 +34,8 @@
<PropertyRef Name="ID" /> <PropertyRef Name="ID" />
</Key> </Key>
<Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> <Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="title" Type="nchar" MaxLength="10" /> <Property Name="title" Type="nvarchar" MaxLength="150" />
<Property Name="content" Type="nchar" MaxLength="10" /> <Property Name="content" Type="nvarchar(max)" />
<Property Name="adminid" Type="int" /> <Property Name="adminid" Type="int" />
<Property Name="ticketid" Type="int" /> <Property Name="ticketid" Type="int" />
</EntityType> </EntityType>
@ -52,11 +52,12 @@
<PropertyRef Name="ID" /> <PropertyRef Name="ID" />
</Key> </Key>
<Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> <Property Name="ID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="title" Type="nvarchar" MaxLength="50" Nullable="false" /> <Property Name="title" Type="nvarchar" MaxLength="150" Nullable="false" />
<Property Name="content" Type="nvarchar(max)" Nullable="false" /> <Property Name="content" Type="nvarchar(max)" Nullable="false" />
<Property Name="priority" Type="int" Nullable="false" /> <Property Name="priority" Type="int" Nullable="false" />
<Property Name="senderid" Type="int" Nullable="false" /> <Property Name="senderid" Type="int" Nullable="false" />
<Property Name="status" Type="int" /> <Property Name="status" Type="int" />
<Property Name="responsid" Type="int" />
</EntityType> </EntityType>
<EntityType Name="user"> <EntityType Name="user">
<Key> <Key>
@ -125,11 +126,12 @@
<PropertyRef Name="ID" /> <PropertyRef Name="ID" />
</Key> </Key>
<Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="title" Type="String" MaxLength="50" FixedLength="false" Unicode="true" Nullable="false" /> <Property Name="title" Type="String" MaxLength="150" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="content" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" Nullable="false" /> <Property Name="content" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" Nullable="false" />
<Property Name="priority" Type="Int32" Nullable="false" /> <Property Name="priority" Type="Int32" Nullable="false" />
<Property Name="senderid" Type="Int32" Nullable="false" /> <Property Name="senderid" Type="Int32" Nullable="false" />
<Property Name="status" Type="Int32" /> <Property Name="status" Type="Int32" />
<Property Name="responsid" Type="Int32" />
</EntityType> </EntityType>
<EntityType Name="user"> <EntityType Name="user">
<Key> <Key>
@ -146,8 +148,8 @@
<PropertyRef Name="ID" /> <PropertyRef Name="ID" />
</Key> </Key>
<Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Name="ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="title" Type="String" MaxLength="10" FixedLength="true" Unicode="true" /> <Property Name="title" Type="String" MaxLength="150" FixedLength="false" Unicode="true" />
<Property Name="content" Type="String" MaxLength="10" FixedLength="true" Unicode="true" /> <Property Name="content" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
<Property Name="adminid" Type="Int32" /> <Property Name="adminid" Type="Int32" />
<Property Name="ticketid" Type="Int32" /> <Property Name="ticketid" Type="Int32" />
</EntityType> </EntityType>
@ -195,6 +197,7 @@
<EntitySetMapping Name="tickets"> <EntitySetMapping Name="tickets">
<EntityTypeMapping TypeName="newswebappModel.ticket"> <EntityTypeMapping TypeName="newswebappModel.ticket">
<MappingFragment StoreEntitySet="ticket"> <MappingFragment StoreEntitySet="ticket">
<ScalarProperty Name="responsid" ColumnName="responsid" />
<ScalarProperty Name="status" ColumnName="status" /> <ScalarProperty Name="status" ColumnName="status" />
<ScalarProperty Name="senderid" ColumnName="senderid" /> <ScalarProperty Name="senderid" ColumnName="senderid" />
<ScalarProperty Name="priority" ColumnName="priority" /> <ScalarProperty Name="priority" ColumnName="priority" />

View File

@ -20,5 +20,6 @@ namespace WebApplication1.Models
public int priority { get; set; } public int priority { get; set; }
public int senderid { get; set; } public int senderid { get; set; }
public Nullable<int> status { get; set; } public Nullable<int> status { get; set; }
public Nullable<int> responsid { get; set; }
} }
} }

18
Models/ticketlist.cs Normal file
View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class ticketlist
{
public int ticketID { get; set; }
public int userID { get; set; }
public string username { get; set; }
public string ticketTitle { get; set; }
public int priority { get; set; }
public int? status { get; set; }
}
}

View File

@ -1,7 +1,12 @@
@model IEnumerable<WebApplication1.Models.ticket> @using WebApplication1.Models
@model IEnumerable<ticketlist>
@{ @{
ViewBag.Title = "Index"; ViewBag.Title = "Index";
string status = "";
} }
<h2>Index</h2> <h2>Index</h2>
@ -12,28 +17,38 @@
<table class="table"> <table class="table">
<tr> <tr>
<th> <th>
@Html.DisplayNameFor(model => model.title) Title
</th> </th>
<th> <th>
@Html.DisplayNameFor(model => model.content) Sender username
</th> </th>
<th></th> <th></th>
</tr> </tr>
@foreach (var item in Model) { @foreach (var item in Model)
{
<tr> <tr>
<td> <td>
@Html.DisplayFor(modelItem => item.title) @Html.DisplayFor(modelItem => item.ticketTitle)
</td> </td>
<td> <td>
@Html.DisplayFor(modelItem => item.content) @Html.DisplayFor(modelItem => item.username)
</td> </td>
<td> <td>
@Html.ActionLink("Respond", "Respond", new { id=item.ID }) | @if (item.status == 1)
@Html.ActionLink("Details", "Details", new { id=item.ID }) | {
@Html.ActionLink("Delete", "Delete", new { id=item.ID }) status = "awaiting response";
}
else if (item.status == 3)
{
status = "open";
}
@status
</td>
<td>
@Html.ActionLink("Respond", "Respond", new { id = item.ticketID })
</td> </td>
</tr> </tr>
} }
</table> </table>

View File

@ -15,6 +15,16 @@
{ {
priority = "Normal"; priority = "Normal";
} }
string status = "";
if (ViewBag.targetTicket.status == 1)
{
status = "awaiting response";
}
else if (ViewBag.targetTicket.status == 3)
{
status = "open";
}
} }
<h2>Edit</h2> <h2>Edit</h2>
@ -49,11 +59,17 @@
<input class="form-control" placeholder=@priority readonly /> <input class="form-control" placeholder=@priority readonly />
</div> </div>
</div> </div>
<div class="form-group">
Status
<div class="col-md-10">
<input class="form-control" placeholder=@status readonly />
</div>
</div>
<div class="form-group"> <div class="form-group">
Content Content
<div class="col-md-10"> <div class="col-md-10">
<textarea class="form-control" placeholder=@ViewBag.targetTicket.content></textarea> <textarea class="form-control">@ViewBag.targetTicket.content</textarea>
</div> </div>
</div> </div>
<br /> <br />
@ -71,7 +87,7 @@
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.content, htmlAttributes: new { @class = "control-label col-md-2" }) @Html.LabelFor(model => model.content, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10"> <div class="col-md-10">
@Html.TextAreaFor(model => model.content, new { @class = "form-control" } ) @Html.TextAreaFor(model => model.content, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.content, "", new { @class = "text-danger" }) @Html.ValidationMessageFor(model => model.content, "", new { @class = "text-danger" })
</div> </div>
</div> </div>
@ -80,7 +96,8 @@
<div class="form-group"> <div class="form-group">
<div class="col-md-10"> <div class="col-md-10">
<input class="form-control" name="ticketid" value=@ViewBag.targetTicket.ID hidden /> <input class="form-control" name="ticketid" value=@ViewBag.targetTicket.ID readonly hidden />
<input class="form-control" name="ID" value=@ViewBag.targetTicket.responsid readonly hidden />
</div> </div>
</div> </div>

View File

@ -0,0 +1,45 @@
@model IEnumerable<WebApplication1.Models.response>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.title)
</th>
<th>
@Html.DisplayNameFor(model => model.content)
</th>
<th>
@Html.DisplayNameFor(model => model.adminid)
</th>
<th>
@Html.DisplayNameFor(model => model.ticketid)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.title)
</td>
<td>
@Html.DisplayFor(modelItem => item.content)
</td>
<td>
@Html.DisplayFor(modelItem => item.adminid)
</td>
<td>
@Html.DisplayFor(modelItem => item.ticketid)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>

View File

@ -2,6 +2,7 @@
@{ @{
ViewBag.Title = "Edit"; ViewBag.Title = "Edit";
} }
<h2>Edit</h2> <h2>Edit</h2>
@ -10,12 +11,27 @@
{ {
@Html.AntiForgeryToken() @Html.AntiForgeryToken()
<div class="form-horizontal"> <div class="form-horizontal">
<h4>ticket</h4> <h4>ticket</h4>
<hr /> <hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.ID) @Html.HiddenFor(model => model.ID)
<section class="col-md-4">
<div class="form-group">
Title
<div class="col-md-10">
<input class="form-control" placeholder=@ViewBag.response.title readonly />
</div>
</div>
<div class="form-group">
Content
<div class="col-md-10">
<textarea class="form-control" placeholder=@ViewBag.response.content></textarea>
</div>
</div>
<br />
</section>
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.title, htmlAttributes: new { @class = "control-label col-md-2" }) @Html.LabelFor(model => model.title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10"> <div class="col-md-10">
@ -27,33 +43,18 @@
<div class="form-group"> <div class="form-group">
@Html.LabelFor(model => model.content, htmlAttributes: new { @class = "control-label col-md-2" }) @Html.LabelFor(model => model.content, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10"> <div class="col-md-10">
@Html.EditorFor(model => model.content, new { htmlAttributes = new { @class = "form-control" } }) @Html.TextAreaFor(model => model.content, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.content, "", new { @class = "text-danger" }) @Html.ValidationMessageFor(model => model.content, "", new { @class = "text-danger" })
</div> </div>
</div> </div>
<div class="form-group">
@Html.LabelFor(model => model.priority, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.priority, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.priority, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.senderid, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.senderid, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.senderid, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group"> <div class="form-group">
<div class="col-md-offset-2 col-md-10"> <div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" /> <input type="submit" value="Save" class="btn btn-default" />
</div> </div>
</div> </div>
</div> </div>
} }
<div> <div>

View File

@ -154,7 +154,7 @@
<Compile Include="Models\category.cs"> <Compile Include="Models\category.cs">
<DependentUpon>Model1.tt</DependentUpon> <DependentUpon>Model1.tt</DependentUpon>
</Compile> </Compile>
<Compile Include="Models\Login.cs" /> <Compile Include="Models\ticketlist.cs" />
<Compile Include="Models\newsModel.cs" /> <Compile Include="Models\newsModel.cs" />
<Compile Include="Models\Register.cs" /> <Compile Include="Models\Register.cs" />
<Compile Include="Controllers\tagsController.cs" /> <Compile Include="Controllers\tagsController.cs" />
@ -291,6 +291,7 @@
<Content Include="Views\responses\Details.cshtml" /> <Content Include="Views\responses\Details.cshtml" />
<Content Include="Views\responses\Respond.cshtml" /> <Content Include="Views\responses\Respond.cshtml" />
<Content Include="Views\responses\Index.cshtml" /> <Content Include="Views\responses\Index.cshtml" />
<Content Include="Views\responses\test.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="App_Data\" /> <Folder Include="App_Data\" />