diff --git a/StudentHouseDashboard/HouseData/Managers/AnnouncementManager.cs b/StudentHouseDashboard/HouseData/Managers/AnnouncementManager.cs index 197b6e4..3acab31 100644 --- a/StudentHouseDashboard/HouseData/Managers/AnnouncementManager.cs +++ b/StudentHouseDashboard/HouseData/Managers/AnnouncementManager.cs @@ -1,5 +1,8 @@ -using System; +using StudentHouseDashboard.Models; +using StudentHouseDashboard.Repositories; +using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,5 +11,30 @@ namespace StudentHouseDashboard.Managers { public class AnnouncementManager { + private AnnouncementRepository announcementRepository; + public AnnouncementManager() + { + announcementRepository = new AnnouncementRepository(); + } + public List GetAllAnnouncements() + { + return announcementRepository.GetAllAnnouncements(); + } + public List GetAnnouncementsByPage(int? p, int? c) + { + return announcementRepository.GetAnnouncementsByPage(p, c); + } + public bool CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + { + return announcementRepository.CreateAnnouncement(title, description, author, publishDate, isImportant, isSticky); + } + public bool UpdateAnnouncement(int id, string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + { + return announcementRepository.UpdateAnnouncement(id, title, description, author, publishDate, isImportant, isSticky); + } + public bool DeleteAnnouncement(int id) + { + return announcementRepository.DeleteAnnouncement(id); + } } } diff --git a/StudentHouseDashboard/HouseData/Models/Announcement.cs b/StudentHouseDashboard/HouseData/Models/Announcement.cs index c020318..2ef3e40 100644 --- a/StudentHouseDashboard/HouseData/Models/Announcement.cs +++ b/StudentHouseDashboard/HouseData/Models/Announcement.cs @@ -37,5 +37,9 @@ namespace StudentHouseDashboard.Models { throw new NotImplementedException(); } + public override string ToString() + { + return $"{Title} ({PublishDate.ToString("g")} - {Author.Name})"; + } } } \ No newline at end of file diff --git a/StudentHouseDashboard/HouseData/Repositories/AnnouncementRepository.cs b/StudentHouseDashboard/HouseData/Repositories/AnnouncementRepository.cs index 9f20f63..45ea60e 100644 --- a/StudentHouseDashboard/HouseData/Repositories/AnnouncementRepository.cs +++ b/StudentHouseDashboard/HouseData/Repositories/AnnouncementRepository.cs @@ -11,27 +11,12 @@ namespace StudentHouseDashboard.Repositories { public class AnnouncementRepository { - private string connectionString = "Server=mssqlstud.fhict.local;Database=dbi509645;User Id=dbi509645;Password=sNPNBm*BX!6z8RM;"; public AnnouncementRepository() { } - private SqlConnection CreateConnection() - { - SqlConnection connection = new SqlConnection(connectionString); - try - { - connection.Open(); - } - catch (Exception) - { - Console.WriteLine("Database connection error. Are you connected to the VDI VPN?"); - } - - return connection; - } public List GetAllAnnouncements() { List announcements = new List(); UserManager userManager = new UserManager(); - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Announcements;"; SqlCommand cmd = new SqlCommand(sql, conn); @@ -62,7 +47,7 @@ namespace StudentHouseDashboard.Repositories { p = 0; } - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Announcements ORDER BY ID OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; SqlCommand sqlCommand = new SqlCommand(sql, conn); @@ -81,5 +66,66 @@ namespace StudentHouseDashboard.Repositories } return announcements; } + public bool CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "INSERT INTO Announcements (Author, Description, Title, PublishDate, IsImportant, IsSticky) VALUES (@author, @desc, @title, @date, @important, @sticky);"; + 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("@important", isImportant); + cmd.Parameters.AddWithValue("@sticky", isSticky); + int writer = cmd.ExecuteNonQuery(); + + if (writer == 1) + { + return true; + } + else return false; + } + } + public bool UpdateAnnouncement(int id, string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "UPDATE Announcements " + + "SET Author = @author, Description = @desc, Title = @title, PublishDate = @date, IsImportant = @important, IsSticky = @sticky " + + "WHERE Id = @id;"; + 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("@important", isImportant); + cmd.Parameters.AddWithValue("@sticky", isSticky); + cmd.Parameters.AddWithValue("@id", id); + int writer = cmd.ExecuteNonQuery(); + + if (writer == 1) + { + return true; + } + else return false; + } + } + public bool DeleteAnnouncement(int id) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "DELETE FROM Announcements WHERE Id = @id;"; + SqlCommand cmd = new SqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@id", id); + int writer = cmd.ExecuteNonQuery(); + + if (writer == 1) + { + return true; + } + else return false; + } + } } } diff --git a/StudentHouseDashboard/HouseData/Repositories/SqlConnectionHelper.cs b/StudentHouseDashboard/HouseData/Repositories/SqlConnectionHelper.cs new file mode 100644 index 0000000..3047e3e --- /dev/null +++ b/StudentHouseDashboard/HouseData/Repositories/SqlConnectionHelper.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StudentHouseDashboard.Repositories +{ + public static class SqlConnectionHelper + { + private static string connectionString = "Server=mssqlstud.fhict.local;Database=dbi509645;User Id=dbi509645;Password=sNPNBm*BX!6z8RM;"; + public static SqlConnection CreateConnection() + { + SqlConnection connection = new SqlConnection(connectionString); + try + { + connection.Open(); + } + catch (Exception) + { + Console.WriteLine("Database connection error. Are you connected to the VDI VPN?"); + } + + return connection; + } + } +} diff --git a/StudentHouseDashboard/HouseData/Repositories/UserRepository.cs b/StudentHouseDashboard/HouseData/Repositories/UserRepository.cs index 8b87abe..76b9c3c 100644 --- a/StudentHouseDashboard/HouseData/Repositories/UserRepository.cs +++ b/StudentHouseDashboard/HouseData/Repositories/UserRepository.cs @@ -12,28 +12,12 @@ namespace StudentHouseDashboard.Repositories { public class UserRepository { - private string connectionString = "Server=mssqlstud.fhict.local;Database=dbi509645;User Id=dbi509645;Password=sNPNBm*BX!6z8RM;"; - public UserRepository() { } - private SqlConnection CreateConnection() - { - SqlConnection connection = new SqlConnection(connectionString); - try - { - connection.Open(); - } - catch (Exception) - { - Console.WriteLine("Database connection error. Are you connected to the VDI VPN?"); - } - - return connection; - } public List GetAllUsers() { var users = new List(); - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Users;"; SqlCommand cmd = new SqlCommand(sql, conn); @@ -54,7 +38,7 @@ namespace StudentHouseDashboard.Repositories } public User GetUserById(int id) { - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Users WHERE ID = @id;"; SqlCommand cmd = new SqlCommand(sql, conn); @@ -81,7 +65,7 @@ namespace StudentHouseDashboard.Repositories { p = 0; } - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Users ORDER BY ID OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; SqlCommand sqlCommand = new SqlCommand(sql, conn); @@ -99,7 +83,7 @@ namespace StudentHouseDashboard.Repositories } public bool CreateUser(string name, string password, UserRole role) { - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "INSERT INTO Users (Name, Password, Role) VALUES (@name, @pass, @role);"; SqlCommand cmd = new SqlCommand(sql, conn); @@ -117,7 +101,7 @@ namespace StudentHouseDashboard.Repositories } public bool UpdateUser(int id, string name, string password, UserRole role) { - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "UPDATE Users " + "SET Name = @name, Password = @pass, Role = @role " + @@ -138,7 +122,7 @@ namespace StudentHouseDashboard.Repositories } public bool DisableUser(int id) { - using (SqlConnection conn = CreateConnection()) + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "UPDATE Users " + "SET Name = 'Deleted User @id', Password = '0'" + @@ -154,6 +138,5 @@ namespace StudentHouseDashboard.Repositories else return false; } } - } } diff --git a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml index bfecd60..f77f73e 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml +++ b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml @@ -2,21 +2,27 @@ @using StudentHouseDashboard.Models; @model WebApp.Pages.AnnouncementModel @{ - User user = (User)ViewData["user"]; - ViewData["Title"] = $"User {user.Name}"; + Announcement announcement = (Announcement)ViewData["announcement"]; + ViewData["Title"] = $"{announcement.Title}"; } -

@user.Name

+

@announcement.Title

-

Name:

-

Password:

-

Role:

+

Title:

+

Author:

+

Description:

+

Date:

+

Important:

+

Pinned:

-

@user.Name

-

@user.Password

-

@user.Role.ToString()

+

@announcement.Title

+

@announcement.Author.Name

+

@announcement.Description

+

@announcement.PublishDate.ToString("g")

+

@announcement.IsImportant.ToString()

+

@announcement.IsSticky.ToString()

diff --git a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs index c0764d1..2fab7ae 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using StudentHouseDashboard.Managers; +using StudentHouseDashboard.Models; namespace WebApp.Pages { @@ -10,8 +11,8 @@ namespace WebApp.Pages { public void OnGet(int id) { - UserManager userManager = new UserManager(); - ViewData.Add("user", userManager.GetUserById(id)); + AnnouncementManager announcementManager = new AnnouncementManager(); + ViewData.Add("announcement", announcementManager.GetAllAnnouncements().Where(x => x.ID == id).First()); } } } diff --git a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml index 2d3c06e..3cda7e7 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml +++ b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml @@ -1,20 +1,25 @@ @page @using StudentHouseDashboard.Models; +@using System.Security.Claims; @model WebApp.Pages.AnnouncementsModel @{ ViewData["Title"] = "Announcements"; - List users = (List)ViewData["users"]; + List announcements = (List)ViewData["announcements"]; int currentPage = @Convert.ToInt32(ViewData["page"]); } -@foreach (User user in users) +@foreach (Announcement announcement in announcements) {
-
@user.Role.ToString()
-
@user.Name
-

@user.Password

- More details +
@announcement.Title
+
@announcement.Author.Name
+

@announcement.Description

+ More details + @if (User.FindFirst(ClaimTypes.Role).Value == "ADMIN") + { + @: Delete + }
} @@ -37,7 +42,7 @@ @:
  • @(currentPage - 1)
  • }
  • @currentPage
  • - @if (users.Count == 0) + @if (announcements.Count == 0) { @:
  • } diff --git a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs index 7021696..f20c5ee 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs @@ -2,6 +2,8 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using StudentHouseDashboard.Managers; +using StudentHouseDashboard.Models; +using System.Security.Claims; namespace WebApp.Pages { @@ -9,17 +11,16 @@ namespace WebApp.Pages public class AnnouncementsModel : PageModel { public AnnouncementManager AnnouncementManager { get; set; } - public UserManager UserManager { get; set; } public void OnGet(int? p, int? c) { - UserManager = new UserManager(); + AnnouncementManager = new AnnouncementManager(); if (p == null || p < 1) { p = 1; } - ViewData.Add("users", UserManager.GetUsersByPage(p - 1, c)); + ViewData.Add("announcements", AnnouncementManager.GetAnnouncementsByPage(p - 1, c)); ViewData.Add("page", p); - ViewData.Add("allCount", UserManager.GetAllUsers().Count()); + ViewData.Add("allCount", AnnouncementManager.GetAllAnnouncements().Count()); } } } diff --git a/StudentHouseDashboard/WinForms/AnnouncementForm.Designer.cs b/StudentHouseDashboard/WinForms/AnnouncementForm.Designer.cs new file mode 100644 index 0000000..0f69d1b --- /dev/null +++ b/StudentHouseDashboard/WinForms/AnnouncementForm.Designer.cs @@ -0,0 +1,165 @@ +namespace WinForms +{ + partial class AnnouncementForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + lblTitle = new Label(); + tbTitle = new TextBox(); + lblDescription = new Label(); + tbDescription = new TextBox(); + lblPublishDate = new Label(); + btnSave = new Button(); + ckbImportant = new CheckBox(); + ckbSticky = new CheckBox(); + dtpPublishDate = new DateTimePicker(); + lblAuthor = new Label(); + SuspendLayout(); + // + // lblTitle + // + lblTitle.AutoSize = true; + lblTitle.Location = new Point(12, 9); + lblTitle.Name = "lblTitle"; + lblTitle.Size = new Size(32, 15); + lblTitle.TabIndex = 0; + lblTitle.Text = "Title:"; + // + // tbTitle + // + tbTitle.Location = new Point(94, 6); + tbTitle.Name = "tbTitle"; + tbTitle.Size = new Size(405, 23); + tbTitle.TabIndex = 1; + // + // lblDescription + // + lblDescription.AutoSize = true; + lblDescription.Location = new Point(12, 38); + lblDescription.Name = "lblDescription"; + lblDescription.Size = new Size(70, 15); + lblDescription.TabIndex = 2; + lblDescription.Text = "Description:"; + // + // tbDescription + // + tbDescription.Location = new Point(94, 35); + tbDescription.Multiline = true; + tbDescription.Name = "tbDescription"; + tbDescription.Size = new Size(405, 112); + tbDescription.TabIndex = 3; + // + // lblPublishDate + // + lblPublishDate.AutoSize = true; + lblPublishDate.Location = new Point(12, 159); + lblPublishDate.Name = "lblPublishDate"; + lblPublishDate.Size = new Size(76, 15); + lblPublishDate.TabIndex = 4; + lblPublishDate.Text = "Publish Date:"; + // + // btnSave + // + btnSave.Location = new Point(424, 180); + btnSave.Name = "btnSave"; + btnSave.Size = new Size(75, 23); + btnSave.TabIndex = 6; + btnSave.Text = "Save changes"; + btnSave.UseVisualStyleBackColor = true; + btnSave.Click += btnSave_Click; + // + // ckbImportant + // + ckbImportant.AutoSize = true; + ckbImportant.Location = new Point(300, 155); + ckbImportant.Name = "ckbImportant"; + ckbImportant.Size = new Size(79, 19); + ckbImportant.TabIndex = 7; + ckbImportant.Text = "Important"; + ckbImportant.UseVisualStyleBackColor = true; + // + // ckbSticky + // + ckbSticky.AutoSize = true; + ckbSticky.Location = new Point(385, 155); + ckbSticky.Name = "ckbSticky"; + ckbSticky.Size = new Size(78, 19); + ckbSticky.TabIndex = 8; + ckbSticky.Text = "Pin to top"; + ckbSticky.UseVisualStyleBackColor = true; + // + // dtpPublishDate + // + dtpPublishDate.Location = new Point(94, 153); + dtpPublishDate.Name = "dtpPublishDate"; + dtpPublishDate.Size = new Size(200, 23); + dtpPublishDate.TabIndex = 9; + // + // lblAuthor + // + lblAuthor.AutoSize = true; + lblAuthor.Location = new Point(12, 184); + lblAuthor.Name = "lblAuthor"; + lblAuthor.Size = new Size(70, 15); + lblAuthor.TabIndex = 10; + lblAuthor.Text = "Created by: "; + // + // AnnouncementForm + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(511, 216); + Controls.Add(lblAuthor); + Controls.Add(dtpPublishDate); + Controls.Add(ckbSticky); + Controls.Add(ckbImportant); + Controls.Add(btnSave); + Controls.Add(lblPublishDate); + Controls.Add(tbDescription); + Controls.Add(lblDescription); + Controls.Add(tbTitle); + Controls.Add(lblTitle); + Name = "AnnouncementForm"; + Text = "Announcement"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label lblTitle; + private TextBox tbTitle; + private Label lblDescription; + private TextBox tbDescription; + private Label lblPublishDate; + private Button btnSave; + private CheckBox ckbImportant; + private CheckBox ckbSticky; + private DateTimePicker dtpPublishDate; + private Label lblAuthor; + } +} \ No newline at end of file diff --git a/StudentHouseDashboard/WinForms/AnnouncementForm.cs b/StudentHouseDashboard/WinForms/AnnouncementForm.cs new file mode 100644 index 0000000..3c8d4df --- /dev/null +++ b/StudentHouseDashboard/WinForms/AnnouncementForm.cs @@ -0,0 +1,69 @@ +using StudentHouseDashboard.Managers; +using StudentHouseDashboard.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace WinForms +{ + public partial class AnnouncementForm : Form + { + Announcement announcement; + User currentUser; + public AnnouncementForm(Announcement? announcement, bool readOnly, User? currentUser) + { + InitializeComponent(); + this.announcement = announcement; + this.currentUser = currentUser; + if (readOnly) + { + btnSave.Enabled = false; + tbTitle.Enabled = false; + tbDescription.Enabled = false; + dtpPublishDate.Enabled = false; + ckbImportant.Enabled = false; + ckbSticky.Enabled = false; + } + if (announcement != null) + { + tbTitle.Text = announcement.Title; + lblAuthor.Text = $"Created by: {announcement.Author.Name}"; + tbDescription.Text = announcement.Description; + dtpPublishDate.Value = announcement.PublishDate; + ckbImportant.Checked = announcement.IsImportant; + ckbSticky.Checked = announcement.IsSticky; + } + if (currentUser != null) + { + lblAuthor.Text = $"Created by: {currentUser.Name}"; + } + + } + + private void btnSave_Click(object sender, EventArgs e) + { + AnnouncementManager announcementManager = new AnnouncementManager(); + if (string.IsNullOrEmpty(tbTitle.Text)) + { + MessageBox.Show("Please enter a title"); + return; + } + + if (this.announcement == null) + { + announcementManager.CreateAnnouncement(tbTitle.Text, tbDescription.Text, currentUser, dtpPublishDate.Value, ckbImportant.Checked, ckbSticky.Checked); + } + else + { + announcementManager.UpdateAnnouncement(announcement.ID, tbTitle.Text, tbDescription.Text, currentUser, dtpPublishDate.Value, ckbImportant.Checked, ckbSticky.Checked); + } + this.DialogResult = DialogResult.OK; + } + } +} diff --git a/StudentHouseDashboard/WinForms/AnnouncementForm.resx b/StudentHouseDashboard/WinForms/AnnouncementForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/StudentHouseDashboard/WinForms/AnnouncementForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/StudentHouseDashboard/WinForms/Dashboard.Designer.cs b/StudentHouseDashboard/WinForms/Dashboard.Designer.cs index 5837ec5..b3d0b4e 100644 --- a/StudentHouseDashboard/WinForms/Dashboard.Designer.cs +++ b/StudentHouseDashboard/WinForms/Dashboard.Designer.cs @@ -34,80 +34,208 @@ btnDeleteUser = new Button(); btnUpdateUser = new Button(); btnViewUser = new Button(); + tabControl1 = new TabControl(); + tpUsers = new TabPage(); + panelUserFunctions = new Panel(); + tpAnnouncements = new TabPage(); + lbAnnouncements = new ListBox(); + panel1 = new Panel(); + btnNewAnnouncement = new Button(); + btnDeleteAnnouncement = new Button(); + btnViewAnnouncement = new Button(); + btnEditAnnouncement = new Button(); + tabControl1.SuspendLayout(); + tpUsers.SuspendLayout(); + panelUserFunctions.SuspendLayout(); + tpAnnouncements.SuspendLayout(); + panel1.SuspendLayout(); SuspendLayout(); // // lblUserStatus // + lblUserStatus.Anchor = AnchorStyles.Top | AnchorStyles.Right; lblUserStatus.AutoSize = true; - lblUserStatus.Location = new Point(13, 18); + lblUserStatus.Location = new Point(396, 4); lblUserStatus.Name = "lblUserStatus"; lblUserStatus.Size = new Size(80, 15); lblUserStatus.TabIndex = 0; lblUserStatus.Text = "Logged in as: "; + lblUserStatus.TextAlign = ContentAlignment.TopRight; // // lbUsers // + lbUsers.Dock = DockStyle.Fill; lbUsers.FormattingEnabled = true; lbUsers.ItemHeight = 15; - lbUsers.Location = new Point(13, 86); + lbUsers.Location = new Point(3, 3); lbUsers.Name = "lbUsers"; - lbUsers.Size = new Size(318, 154); + lbUsers.Size = new Size(717, 334); lbUsers.TabIndex = 1; // // btnCreateUser // - btnCreateUser.Location = new Point(13, 257); + btnCreateUser.Location = new Point(3, 3); btnCreateUser.Name = "btnCreateUser"; btnCreateUser.Size = new Size(75, 23); btnCreateUser.TabIndex = 2; - btnCreateUser.Text = "New User"; + btnCreateUser.Text = "New"; btnCreateUser.UseVisualStyleBackColor = true; btnCreateUser.Click += btnCreateUser_Click; // // btnDeleteUser // - btnDeleteUser.Location = new Point(94, 257); + btnDeleteUser.Location = new Point(84, 3); btnDeleteUser.Name = "btnDeleteUser"; btnDeleteUser.Size = new Size(75, 23); btnDeleteUser.TabIndex = 3; - btnDeleteUser.Text = "Delete User"; + btnDeleteUser.Text = "Delete"; btnDeleteUser.UseVisualStyleBackColor = true; btnDeleteUser.Click += btnDeleteUser_Click; // // btnUpdateUser // - btnUpdateUser.Location = new Point(175, 257); + btnUpdateUser.Location = new Point(165, 3); btnUpdateUser.Name = "btnUpdateUser"; btnUpdateUser.Size = new Size(75, 23); btnUpdateUser.TabIndex = 4; - btnUpdateUser.Text = "Edit User"; + btnUpdateUser.Text = "Edit"; btnUpdateUser.UseVisualStyleBackColor = true; btnUpdateUser.Click += btnUpdateUser_Click; // // btnViewUser // - btnViewUser.Location = new Point(256, 257); + btnViewUser.Location = new Point(246, 3); btnViewUser.Name = "btnViewUser"; btnViewUser.Size = new Size(75, 23); btnViewUser.TabIndex = 5; - btnViewUser.Text = "View User"; + btnViewUser.Text = "View"; btnViewUser.UseVisualStyleBackColor = true; btnViewUser.Click += btnViewUser_Click; // + // tabControl1 + // + tabControl1.Controls.Add(tpUsers); + tabControl1.Controls.Add(tpAnnouncements); + tabControl1.Dock = DockStyle.Fill; + tabControl1.Location = new Point(0, 0); + tabControl1.Name = "tabControl1"; + tabControl1.SelectedIndex = 0; + tabControl1.Size = new Size(731, 368); + tabControl1.TabIndex = 6; + // + // tpUsers + // + tpUsers.Controls.Add(panelUserFunctions); + tpUsers.Controls.Add(lbUsers); + tpUsers.Location = new Point(4, 24); + tpUsers.Name = "tpUsers"; + tpUsers.Padding = new Padding(3); + tpUsers.Size = new Size(723, 340); + tpUsers.TabIndex = 0; + tpUsers.Text = "Users"; + tpUsers.UseVisualStyleBackColor = true; + // + // panelUserFunctions + // + panelUserFunctions.Controls.Add(btnCreateUser); + panelUserFunctions.Controls.Add(btnDeleteUser); + panelUserFunctions.Controls.Add(btnViewUser); + panelUserFunctions.Controls.Add(btnUpdateUser); + panelUserFunctions.Dock = DockStyle.Bottom; + panelUserFunctions.Location = new Point(3, 298); + panelUserFunctions.Name = "panelUserFunctions"; + panelUserFunctions.Size = new Size(717, 39); + panelUserFunctions.TabIndex = 6; + // + // tpAnnouncements + // + tpAnnouncements.Controls.Add(panel1); + tpAnnouncements.Controls.Add(lbAnnouncements); + tpAnnouncements.Location = new Point(4, 24); + tpAnnouncements.Name = "tpAnnouncements"; + tpAnnouncements.Padding = new Padding(3); + tpAnnouncements.Size = new Size(723, 340); + tpAnnouncements.TabIndex = 1; + tpAnnouncements.Text = "Announcements"; + tpAnnouncements.UseVisualStyleBackColor = true; + // + // lbAnnouncements + // + lbAnnouncements.Dock = DockStyle.Fill; + lbAnnouncements.FormattingEnabled = true; + lbAnnouncements.ItemHeight = 15; + lbAnnouncements.Location = new Point(3, 3); + lbAnnouncements.Name = "lbAnnouncements"; + lbAnnouncements.Size = new Size(717, 334); + lbAnnouncements.TabIndex = 0; + // + // panel1 + // + panel1.Controls.Add(btnNewAnnouncement); + panel1.Controls.Add(btnDeleteAnnouncement); + panel1.Controls.Add(btnViewAnnouncement); + panel1.Controls.Add(btnEditAnnouncement); + panel1.Dock = DockStyle.Bottom; + panel1.Location = new Point(3, 298); + panel1.Name = "panel1"; + panel1.Size = new Size(717, 39); + panel1.TabIndex = 7; + // + // btnNewAnnouncement + // + btnNewAnnouncement.Location = new Point(3, 3); + btnNewAnnouncement.Name = "btnNewAnnouncement"; + btnNewAnnouncement.Size = new Size(75, 23); + btnNewAnnouncement.TabIndex = 2; + btnNewAnnouncement.Text = "New"; + btnNewAnnouncement.UseVisualStyleBackColor = true; + btnNewAnnouncement.Click += btnNewAnnouncement_Click; + // + // btnDeleteAnnouncement + // + btnDeleteAnnouncement.Location = new Point(84, 3); + btnDeleteAnnouncement.Name = "btnDeleteAnnouncement"; + btnDeleteAnnouncement.Size = new Size(75, 23); + btnDeleteAnnouncement.TabIndex = 3; + btnDeleteAnnouncement.Text = "Delete"; + btnDeleteAnnouncement.UseVisualStyleBackColor = true; + btnDeleteAnnouncement.Click += btnDeleteAnnouncement_Click; + // + // btnViewAnnouncement + // + btnViewAnnouncement.Location = new Point(246, 3); + btnViewAnnouncement.Name = "btnViewAnnouncement"; + btnViewAnnouncement.Size = new Size(75, 23); + btnViewAnnouncement.TabIndex = 5; + btnViewAnnouncement.Text = "View"; + btnViewAnnouncement.UseVisualStyleBackColor = true; + btnViewAnnouncement.Click += btnViewAnnouncement_Click; + // + // btnEditAnnouncement + // + btnEditAnnouncement.Location = new Point(165, 3); + btnEditAnnouncement.Name = "btnEditAnnouncement"; + btnEditAnnouncement.Size = new Size(75, 23); + btnEditAnnouncement.TabIndex = 4; + btnEditAnnouncement.Text = "Edit"; + btnEditAnnouncement.UseVisualStyleBackColor = true; + btnEditAnnouncement.Click += btnEditAnnouncement_Click; + // // Dashboard // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(359, 302); - Controls.Add(btnViewUser); - Controls.Add(btnUpdateUser); - Controls.Add(btnDeleteUser); - Controls.Add(btnCreateUser); - Controls.Add(lbUsers); + ClientSize = new Size(731, 368); Controls.Add(lblUserStatus); + Controls.Add(tabControl1); Name = "Dashboard"; Text = "Dashboard"; FormClosed += Dashboard_FormClosed; + tabControl1.ResumeLayout(false); + tpUsers.ResumeLayout(false); + panelUserFunctions.ResumeLayout(false); + tpAnnouncements.ResumeLayout(false); + panel1.ResumeLayout(false); ResumeLayout(false); PerformLayout(); } @@ -120,5 +248,15 @@ private Button btnDeleteUser; private Button btnUpdateUser; private Button btnViewUser; + private TabControl tabControl1; + private TabPage tpUsers; + private TabPage tpAnnouncements; + private Panel panelUserFunctions; + private Panel panel1; + private Button btnNewAnnouncement; + private Button btnDeleteAnnouncement; + private Button btnViewAnnouncement; + private Button btnEditAnnouncement; + private ListBox lbAnnouncements; } } \ No newline at end of file diff --git a/StudentHouseDashboard/WinForms/Dashboard.cs b/StudentHouseDashboard/WinForms/Dashboard.cs index 6b4a9cd..b5a88ad 100644 --- a/StudentHouseDashboard/WinForms/Dashboard.cs +++ b/StudentHouseDashboard/WinForms/Dashboard.cs @@ -15,9 +15,11 @@ namespace WinForms public partial class Dashboard : Form { Login loginForm; + User user; public Dashboard(Login loginForm, User user) { this.loginForm = loginForm; + this.user = user; InitializeComponent(); lblUserStatus.Text = $"Logged in as: {user.Role} {user.Name}"; if (user.Role == UserRole.MANAGER) @@ -25,18 +27,27 @@ namespace WinForms btnCreateUser.Enabled = false; btnDeleteUser.Enabled = false; btnUpdateUser.Enabled = true; + btnNewAnnouncement.Enabled = false; + btnDeleteAnnouncement.Enabled = false; + btnEditAnnouncement.Enabled = true; } else if (user.Role == UserRole.ADMIN) { btnCreateUser.Enabled = true; btnDeleteUser.Enabled = true; btnUpdateUser.Enabled = true; + btnNewAnnouncement.Enabled = true; + btnDeleteAnnouncement.Enabled = true; + btnEditAnnouncement.Enabled = true; } else { btnCreateUser.Enabled = false; btnDeleteUser.Enabled = false; btnUpdateUser.Enabled = false; + btnNewAnnouncement.Enabled = false; + btnDeleteAnnouncement.Enabled = false; + btnEditAnnouncement.Enabled = false; } RefreshLists(); } @@ -81,11 +92,50 @@ namespace WinForms { lbUsers.Items.Add(_user); } + AnnouncementManager announcementManager = new AnnouncementManager(); + lbAnnouncements.Items.Clear(); + foreach (Announcement announcement in announcementManager.GetAllAnnouncements()) + { + lbAnnouncements.Items.Add(announcement); + } } private void Dashboard_FormClosed(object sender, FormClosedEventArgs e) { loginForm.Show(); } + + private void btnNewAnnouncement_Click(object sender, EventArgs e) + { + AnnouncementForm announcementForm = new AnnouncementForm(null, false, user); + announcementForm.ShowDialog(); + RefreshLists(); + } + + private void btnDeleteAnnouncement_Click(object sender, EventArgs e) + { + Announcement currentAnnouncement = (Announcement)lbAnnouncements.SelectedItem; + if (MessageBox.Show($"Are you sure you want to delete\n{currentAnnouncement.Title}\nCreated at {currentAnnouncement.PublishDate.ToString("g")} by {currentAnnouncement.Author.Name}", + "Delete announcement", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + AnnouncementManager announcementManager = new AnnouncementManager(); + announcementManager.DeleteAnnouncement(currentAnnouncement.ID); + } + RefreshLists(); + } + + private void btnEditAnnouncement_Click(object sender, EventArgs e) + { + AnnouncementForm announcementForm = new AnnouncementForm((Announcement)lbAnnouncements.SelectedItem, false, null); + announcementForm.ShowDialog(); + RefreshLists(); + } + + private void btnViewAnnouncement_Click(object sender, EventArgs e) + { + AnnouncementForm announcementForm = new AnnouncementForm((Announcement)lbAnnouncements.SelectedItem, true, null); + announcementForm.ShowDialog(); + RefreshLists(); + } } } diff --git a/StudentHouseDashboard/WinForms/WinForms.csproj b/StudentHouseDashboard/WinForms/WinForms.csproj index 9f2515e..c671066 100644 --- a/StudentHouseDashboard/WinForms/WinForms.csproj +++ b/StudentHouseDashboard/WinForms/WinForms.csproj @@ -12,4 +12,10 @@ + + + Form + + + \ No newline at end of file diff --git a/docs/dbdiagram.png b/docs/dbdiagram.png new file mode 100644 index 0000000..47b23f5 Binary files /dev/null and b/docs/dbdiagram.png differ