diff --git a/StudentHouseDashboard/Data/AnnouncementRepository.cs b/StudentHouseDashboard/Data/AnnouncementRepository.cs index f97bb8c..8708a47 100644 --- a/StudentHouseDashboard/Data/AnnouncementRepository.cs +++ b/StudentHouseDashboard/Data/AnnouncementRepository.cs @@ -156,7 +156,7 @@ namespace Data UserRepository userRepository = new UserRepository(); StringBuilder sql = new StringBuilder(); sql.Append("SELECT * FROM Announcements "); - string[] searchStrings = query.Trim().Split(' '); + string[] searchStrings = query.Split(' '); for (int i = 0; i < searchStrings.Length; i++) { if (i == 0) diff --git a/StudentHouseDashboard/Data/CommentRepository.cs b/StudentHouseDashboard/Data/CommentRepository.cs index 53eb699..495dd9a 100644 --- a/StudentHouseDashboard/Data/CommentRepository.cs +++ b/StudentHouseDashboard/Data/CommentRepository.cs @@ -207,4 +207,37 @@ public class CommentRepository : ICommentRepository } DeleteComment(commentId); } + + public void CreateCommentOnComplaint(User author, string description, string title, DateTime publishDate, int complaintId) + { + + } + + public List GetAllCommentsOnComplaint(int complaintId) + { + List comments = new List(); + using (SqlConnection connection = SqlConnectionHelper.CreateConnection()) + { + string sql = "SELECT c.ID, c.Author, c.Description, c.Title, c.PublishDate, " + + "u.ID UserID, u.Name UserName, u.Password, u.Role FROM ComplaintsComments cc " + + "INNER JOIN Comments c ON c.ID = cc.CommentID " + + "INNER JOIN Users u ON u.ID = c.Author " + + "WHERE cc.ComplaintID = @complaintID"; + SqlCommand sqlCommand = new SqlCommand(sql, connection); + sqlCommand.Parameters.AddWithValue("@complaintID", complaintId); + var reader = sqlCommand.ExecuteReader(); + while (reader.Read()) + { + Comment newComment = new Comment((int)reader["ID"], + new User((int)reader["UserID"], reader["UserName"].ToString(), + reader["Password"].ToString(), (UserRole)reader["Role"]), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"]); + newComment.Responses = GetAllCommentResponses(newComment.ID); + comments.Add(newComment); + } + } + + return comments; + } } \ No newline at end of file diff --git a/StudentHouseDashboard/Data/ComplaintRepository.cs b/StudentHouseDashboard/Data/ComplaintRepository.cs new file mode 100644 index 0000000..3e4c8d2 --- /dev/null +++ b/StudentHouseDashboard/Data/ComplaintRepository.cs @@ -0,0 +1,192 @@ +using Logic; +using Logic.Exceptions; +using Models; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Data +{ + public class ComplaintRepository : IComplaintRepository + { + public ComplaintRepository() + { + + } + public List GetAllComplaints() + { + List complaints = new List(); + UserRepository userRepository = new UserRepository(); + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "SELECT * FROM Complaints;"; + SqlCommand cmd = new SqlCommand(sql, conn); + var reader = cmd.ExecuteReader(); + + while (reader.Read()) + { + Complaint complaint = new Complaint(Convert.ToInt32(reader["ID"]), + userRepository.GetUserById(Convert.ToInt32(reader["Author"])), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"], (ComplaintStatus)reader["Status"], + (ComplaintSeverity)reader["Severity"]); + CommentRepository commentRepository = new CommentRepository(); + complaint.Responses = commentRepository.GetAllCommentsOnComplaint(complaint.ID); + // ID, Name, Password, Role + complaints.Add(complaint); + } + conn.Close(); + } + return complaints; + } + public Complaint GetComplaintById(int id) + { + UserRepository userRepository = new UserRepository(); + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "SELECT * FROM Complaints WHERE ID = @id;"; + SqlCommand cmd = new SqlCommand(sql, conn); + cmd.Parameters.AddWithValue("id", id); + var reader = cmd.ExecuteReader(); + reader.Read(); + Complaint complaint = new Complaint(Convert.ToInt32(reader["ID"]), + userRepository.GetUserById(Convert.ToInt32(reader["Author"])), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"], (ComplaintStatus)reader["Status"], + (ComplaintSeverity)reader["Severity"]); + CommentRepository commentRepository = new CommentRepository(); + complaint.Responses = commentRepository.GetAllCommentsOnComplaint(complaint.ID); + conn.Close(); + return complaint; + } + } + public List GetComplaintsByPage(int userId, int p, int c) + { + List complaints = new List(); + UserRepository userRepository = new UserRepository(); + User user = userRepository.GetUserById(userId); + string sql = "SELECT * FROM Complaints ORDER BY ID DESC OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; + if (user.Role == UserRole.TENANT) + { + sql = $"SELECT * FROM Complaints WHERE Author = {userId} ORDER BY ID DESC OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; + } + if (c == null) + { + throw new DatabaseOperationException("Get complaints: Invalid item count"); + } + if (p == null) + { + throw new DatabaseOperationException("Get complaints: Invalid page number"); + } + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + + SqlCommand sqlCommand = new SqlCommand(sql, conn); + sqlCommand.Parameters.AddWithValue("@start", p * c); + sqlCommand.Parameters.AddWithValue("@count", c); + var reader = sqlCommand.ExecuteReader(); + while (reader.Read()) + { + complaints.Add(new Complaint(Convert.ToInt32(reader["ID"]), + userRepository.GetUserById(Convert.ToInt32(reader["Author"])), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"], (ComplaintStatus)reader["Status"], + (ComplaintSeverity)reader["Severity"])); + } + + } + return complaints; + } + public Complaint CreateComplaint(string title, string description, User author, DateTime publishDate, ComplaintStatus status, ComplaintSeverity severity) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "INSERT INTO Complaints (Author, Description, Title, PublishDate, Status, Severity) VALUES (@author, @desc, @title, @date, @status, @severity) " + + "SELECT SCOPE_IDENTITY();"; + SqlCommand cmd = new SqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@author", author.ID); + cmd.Parameters.AddWithValue("@desc", description); + cmd.Parameters.AddWithValue("@title", title); + cmd.Parameters.AddWithValue("@date", publishDate); + cmd.Parameters.AddWithValue("@status", (int)status); + cmd.Parameters.AddWithValue("@severity", (int)severity); + int newId = Convert.ToInt32(cmd.ExecuteScalar()); + if (newId == 0) + { + throw new DatabaseOperationException("Database error: Complaint not created"); + } + else + { + return GetComplaintById(newId); + } + } + } + public void UpdateComplaint(int id, string title, string description, ComplaintStatus status, ComplaintSeverity severity) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "UPDATE Complaints " + + "SET Description = @desc, Title = @title, Status = @status, Severity = @severity " + + "WHERE ID = @id " + + "SELECT SCOPE_IDENTITY();"; + SqlCommand cmd = new SqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@id", id); + cmd.Parameters.AddWithValue("@desc", description); + cmd.Parameters.AddWithValue("@title", title); + cmd.Parameters.AddWithValue("@status", (int)status); + cmd.Parameters.AddWithValue("@severity", (int)severity); + var writer = cmd.ExecuteNonQuery(); + if (writer == -1) + { + throw new DatabaseOperationException("Database error: Complaint not created"); + } + } + } + + public List SearchComplaint(string query) + { + if (string.IsNullOrEmpty(query)) + { + throw new DatabaseOperationException("Search complaints error: Search query is empty"); + } + List complaints = new List(); + UserRepository userRepository = new UserRepository(); + StringBuilder sql = new StringBuilder(); + sql.Append("SELECT * FROM Complaints "); + string[] searchStrings = query.Split(' '); + for (int i = 0; i < searchStrings.Length; i++) + { + if (i == 0) + { + sql.Append($"WHERE Title LIKE @query{i} OR Description LIKE @query{i} "); + } + else + { + sql.Append($"OR Title LIKE @query{i} OR Description LIKE @query{i} "); + } + } + sql.Append(';'); + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + SqlCommand sqlCommand = new SqlCommand(sql.ToString(), conn); + for (int i = 0; i < searchStrings.Length; i++) + { + sqlCommand.Parameters.AddWithValue($"@query{i}", $"%{searchStrings[i]}%"); + } + var reader = sqlCommand.ExecuteReader(); + while (reader.Read()) + { + complaints.Add(new Complaint(Convert.ToInt32(reader["ID"]), + userRepository.GetUserById(Convert.ToInt32(reader["Author"])), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"], (ComplaintStatus)reader["Status"], + (ComplaintSeverity)reader["Severity"])); + } + } + return complaints; + } + } +} diff --git a/StudentHouseDashboard/Logic/AnnouncementManager.cs b/StudentHouseDashboard/Logic/AnnouncementManager.cs index 78c178b..2874e95 100644 --- a/StudentHouseDashboard/Logic/AnnouncementManager.cs +++ b/StudentHouseDashboard/Logic/AnnouncementManager.cs @@ -53,13 +53,16 @@ namespace Logic DateTime date; if (DateTime.TryParse(match.Groups[0].Value, out date)) { - query = Regex.Replace(query, "date:[0-9]{4}-[0-9]{2}-[0-9]{2}", ""); + query = Regex.Replace(query, "date:[0-9]{4}-[0-9]{2}-[0-9]{2}", "").Trim(); if (string.IsNullOrEmpty(query)) { + // search only by date return announcementRepository.GetAllAnnouncements().Where(x => x.PublishDate.Date == date.Date).ToList(); } + // search by date and keywords else return announcementRepository.SearchAnnouncement(query).Where(x => x.PublishDate.Date == date.Date).ToList(); } + // search by keywords else return announcementRepository.SearchAnnouncement(query); } } diff --git a/StudentHouseDashboard/Logic/ComplaintManager.cs b/StudentHouseDashboard/Logic/ComplaintManager.cs new file mode 100644 index 0000000..a595710 --- /dev/null +++ b/StudentHouseDashboard/Logic/ComplaintManager.cs @@ -0,0 +1,42 @@ +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic +{ + public class ComplaintManager + { + private IComplaintRepository complaintRepository; + public ComplaintManager(IComplaintRepository complaintRepository) + { + this.complaintRepository = complaintRepository; + } + public List GetAllComplaints() + { + return complaintRepository.GetAllComplaints(); + } + public Complaint GetComplaintById(int id) + { + return complaintRepository.GetComplaintById(id); + } + public List GetComplaintsByPage(int userId, int p, int c) + { + return complaintRepository.GetComplaintsByPage(userId, p, c); + } + public Complaint CreateComplaint(string title, string description, User author, DateTime publishDate, ComplaintStatus status, ComplaintSeverity severity) + { + return complaintRepository.CreateComplaint(title, description, author, publishDate, status, severity); + } + public void UpdateComplaint(int id, string title, string description, ComplaintStatus status, ComplaintSeverity severity) + { + complaintRepository.UpdateComplaint(id, title, description, status, severity); + } + public List SearchComplaint(string query) + { + return complaintRepository.SearchComplaint(query); + } + } +} diff --git a/StudentHouseDashboard/Logic/ICommentRepository.cs b/StudentHouseDashboard/Logic/ICommentRepository.cs index 436d3d4..9217df7 100644 --- a/StudentHouseDashboard/Logic/ICommentRepository.cs +++ b/StudentHouseDashboard/Logic/ICommentRepository.cs @@ -7,11 +7,13 @@ namespace Logic; public interface ICommentRepository { public List GetAllCommentsOnAnnouncement(int announcementId); + public List GetAllCommentsOnComplaint(int complaintId); public List GetAllCommentResponses(int commentId); public Comment GetCommentById(int id); public void UpdateComment(int id, string description); public Comment CreateComment(User author, string description, string title, DateTime publishDate); public void CreateCommentOnAnnouncement(User author, string description, string title, DateTime publishDate, int announcementId); + public void CreateCommentOnComplaint(User author, string description, string title, DateTime publishDate, int complaintId); public void CreateResponseOnComment(User author, string description, string title, DateTime publishDate, int commentId); public void DeleteComment(int id); public void DeleteCommentOnAnnouncement(int commentId, int announcementId); diff --git a/StudentHouseDashboard/Logic/IComplaintRepository.cs b/StudentHouseDashboard/Logic/IComplaintRepository.cs new file mode 100644 index 0000000..1f7260a --- /dev/null +++ b/StudentHouseDashboard/Logic/IComplaintRepository.cs @@ -0,0 +1,20 @@ +using Logic.Exceptions; +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic +{ + public interface IComplaintRepository + { + public List GetAllComplaints(); + public Complaint GetComplaintById(int id); + public List GetComplaintsByPage(int userId, int p, int c); + public Complaint CreateComplaint(string title, string description, User author, DateTime publishDate, ComplaintStatus status, ComplaintSeverity severity); + public void UpdateComplaint(int id, string title, string description, ComplaintStatus status, ComplaintSeverity severity); + public List SearchComplaint(string query); + } +} diff --git a/StudentHouseDashboard/Logic/UserManager.cs b/StudentHouseDashboard/Logic/UserManager.cs index 7479b01..6277289 100644 --- a/StudentHouseDashboard/Logic/UserManager.cs +++ b/StudentHouseDashboard/Logic/UserManager.cs @@ -33,12 +33,12 @@ namespace Logic } public User? AuthenticatedUser(string name, string password) { + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password)) + { + throw new ArgumentException("Name or password should not be empty!"); + } List users = userRepository.GetAllUsers(); User? user = users.Find(x => x.Name == name); - if (name == null || password == null) - { - throw new ArgumentNullException(); - } if (user != null && BCrypt.Net.BCrypt.Verify(password, user.Password)) { return user; @@ -57,12 +57,16 @@ namespace Logic } if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password)) { - throw new ArgumentException("Name or password should not be empty"); + throw new ArgumentException("Name or password should not be empty!"); } return userRepository.CreateUser(name, password, role); } public void UpdateUser(int id, string name, string password, UserRole role) { + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password)) + { + throw new ArgumentException("Name or password should not be empty!"); + } userRepository.UpdateUser(id, name, password, role); } public void DisableUser(int id) diff --git a/StudentHouseDashboard/Models/Complaint.cs b/StudentHouseDashboard/Models/Complaint.cs index 83a728e..f47a582 100644 --- a/StudentHouseDashboard/Models/Complaint.cs +++ b/StudentHouseDashboard/Models/Complaint.cs @@ -7,6 +7,10 @@ namespace Models { public class Complaint : GenericMessage { + public Complaint() + { + + } public Complaint(int id, User author, string description, string title, DateTime publishDate, ComplaintStatus status, ComplaintSeverity severity) : base(id, author, description, title, publishDate) { Status = status; @@ -27,5 +31,9 @@ namespace Models { get;set; } + public override string ToString() + { + return $"({PublishDate.ToString("d")} - {Author.Name}) {Title}"; + } } } \ No newline at end of file diff --git a/StudentHouseDashboard/Models/ComplaintSeverity.cs b/StudentHouseDashboard/Models/ComplaintSeverity.cs index d2ebd96..0323eb6 100644 --- a/StudentHouseDashboard/Models/ComplaintSeverity.cs +++ b/StudentHouseDashboard/Models/ComplaintSeverity.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; @@ -7,9 +8,13 @@ namespace Models { public enum ComplaintSeverity { + [Description("Low")] LOW, + [Description("Normal")] NORMAL, + [Description("High")] HIGH, + [Description("Urgent")] URGENT } } \ No newline at end of file diff --git a/StudentHouseDashboard/Models/ComplaintStatus.cs b/StudentHouseDashboard/Models/ComplaintStatus.cs index d6b790b..712f9cd 100644 --- a/StudentHouseDashboard/Models/ComplaintStatus.cs +++ b/StudentHouseDashboard/Models/ComplaintStatus.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; @@ -7,9 +8,13 @@ namespace Models { public enum ComplaintStatus { + [Description("Filed")] FILED, + [Description("Under review")] UNDER_REVIEW, + [Description("Solved")] SOLVED, + [Description("Archived")] ARCHIVED } } \ No newline at end of file diff --git a/StudentHouseDashboard/Models/GenericMessage.cs b/StudentHouseDashboard/Models/GenericMessage.cs index f6d087d..30e86ab 100644 --- a/StudentHouseDashboard/Models/GenericMessage.cs +++ b/StudentHouseDashboard/Models/GenericMessage.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; @@ -32,6 +33,7 @@ namespace Models { get;set; } + [StringLength(255)] public string Title { get;set; diff --git a/StudentHouseDashboard/Models/User.cs b/StudentHouseDashboard/Models/User.cs index 9febc1b..08f65b3 100644 --- a/StudentHouseDashboard/Models/User.cs +++ b/StudentHouseDashboard/Models/User.cs @@ -25,7 +25,7 @@ namespace Models { get; set; } - + [StringLength(255)] public string Name { get; set; diff --git a/StudentHouseDashboard/Models/UserRole.cs b/StudentHouseDashboard/Models/UserRole.cs index 542e350..44d2522 100644 --- a/StudentHouseDashboard/Models/UserRole.cs +++ b/StudentHouseDashboard/Models/UserRole.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; @@ -8,11 +9,11 @@ namespace Models { public enum UserRole { - [Display(Name = "Tenant")] + [Description("Tenant")] TENANT, - [Display(Name = "Manager")] + [Description("Manager")] MANAGER, - [Display(Name = "Administrator")] + [Description("Administrator")] ADMIN } } \ No newline at end of file diff --git a/StudentHouseDashboard/Tests/UserManagerTest.cs b/StudentHouseDashboard/Tests/UserManagerTest.cs index 525eef2..b7496b7 100644 --- a/StudentHouseDashboard/Tests/UserManagerTest.cs +++ b/StudentHouseDashboard/Tests/UserManagerTest.cs @@ -28,7 +28,7 @@ namespace Tests } [TestMethod] - [ExpectedException(typeof(ArgumentNullException))] + [ExpectedException(typeof(ArgumentException))] public void AuthenticatedUserNullPasswordTest() { // Arrange diff --git a/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml b/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml new file mode 100644 index 0000000..962a851 --- /dev/null +++ b/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml @@ -0,0 +1,76 @@ +@page +@using Models; +@using System.Security.Claims; +@model WebApp.Pages.ComplaintsModel +@{ + ViewData["Title"] = "Complaints"; + List complaints = ((List)ViewData["complaints"]).ToList(); + int currentPage = 0; + if (ViewData["page"] != null) + { + currentPage = Convert.ToInt32(ViewData["page"]); + } +} + +Create new complaint + +
+ @foreach (Complaint complaint in complaints) + { +
+
+
@complaint.Title
+
@complaint.Status
+
@complaint.Author.Name
+

@complaint.Description.PadRight(100).Substring(0,100).Trim()

+ More details +
+
+ } +
+ +@if (ViewData["page"] != null) +{ + +} \ No newline at end of file diff --git a/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml.cs new file mode 100644 index 0000000..6f1cb2c --- /dev/null +++ b/StudentHouseDashboard/WebApp/Pages/Complaints.cshtml.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Logic; +using Models; +using System.Security.Claims; + +namespace WebApp.Pages +{ + [Authorize] + public class ComplaintsModel : PageModel + { + public ComplaintManager ComplaintManager { get; set; } + private readonly IComplaintRepository _complaintRepository; + + public ComplaintsModel(IComplaintRepository complaintRepository) + { + _complaintRepository = complaintRepository; + } + + public void OnGet(int? p, int? c) // page, count + { + ComplaintManager = new ComplaintManager(_complaintRepository); + if (!(p < 0)) + { + p = 1; + } + if (!(c < 1)) + { + c = 10; + } + ViewData.Add("complaints", ComplaintManager.GetComplaintsByPage(int.Parse(User.FindFirstValue("id")), p.Value - 1, c.Value)); + ViewData.Add("page", p); + ViewData.Add("count", c); + ViewData.Add("allCount", ComplaintManager.GetAllComplaints().Count); + } + } +} diff --git a/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml b/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml new file mode 100644 index 0000000..99dc4f6 --- /dev/null +++ b/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml @@ -0,0 +1,24 @@ +@page +@using Models; +@model WebApp.Pages.CreateComplaintModel +@{ + ViewData["Title"] = "Create complaint"; +} + +

@ViewData["Title"]

+ +
+
+ + +
+
+ + +
+ +
\ No newline at end of file diff --git a/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml.cs new file mode 100644 index 0000000..98e11b9 --- /dev/null +++ b/StudentHouseDashboard/WebApp/Pages/CreateComplaint.cshtml.cs @@ -0,0 +1,28 @@ +using Data; +using Logic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Models; +using System.Security.Claims; + +namespace WebApp.Pages +{ + [Authorize] + public class CreateComplaintModel : PageModel + { + [BindProperty] + public Complaint Complaint { get; set; } + public void OnGet() + { + } + public IActionResult OnPost() + { + ComplaintManager complaintManager = new ComplaintManager(new ComplaintRepository()); + UserManager userManager = new UserManager(new UserRepository()); + User user = userManager.GetUserById(int.Parse(User.FindFirstValue("id"))); + complaintManager.CreateComplaint(Complaint.Title, Complaint.Description, user, DateTime.Now, ComplaintStatus.FILED, Complaint.Severity); + return RedirectToPage("Complaints"); + } + } +} diff --git a/StudentHouseDashboard/WebApp/Pages/Shared/_Layout.cshtml b/StudentHouseDashboard/WebApp/Pages/Shared/_Layout.cshtml index 6113aee..ae71aba 100644 --- a/StudentHouseDashboard/WebApp/Pages/Shared/_Layout.cshtml +++ b/StudentHouseDashboard/WebApp/Pages/Shared/_Layout.cshtml @@ -27,6 +27,9 @@ + }