Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MauiProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public static MauiApp CreateMauiApp()
builder.Services.AddSingleton<OperationalTeamStatusService>();
builder.Services.AddSingleton<IRotaService, RotaService>();
builder.Services.AddSingleton<IOrderStatusService, OrderStatusService>();
builder.Services.AddSingleton<ITeamMemberService, TeamMemberService>();

return builder.Build();
}
Expand Down
56 changes: 56 additions & 0 deletions Models/Team.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using SQLite;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace MauiApp1.Models
{
internal class Team : INotifyPropertyChanged
{
[PrimaryKey, AutoIncrement]
public int id { get; set; }
private int maxSize;
public int MaxSize
{
get => maxSize;
set => SetField(ref maxSize, value);
}

private string skillsRequired;
public string SkillsRequired
{
get => skillsRequired;
set => SetField(ref skillsRequired, value);
}

private DateTime startDate;
public DateTime StartDate
{
get => startDate;
set => SetField(ref startDate, value);
}

private DateTime endDate;
public DateTime EndDate
{
get => endDate;
set => SetField(ref endDate, value);
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
}
49 changes: 49 additions & 0 deletions Models/TeamMember.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using SQLite;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace MauiApp1.Models
{
public class TeamMember : INotifyPropertyChanged
{
[PrimaryKey, AutoIncrement]
public int id { get; set; }
private string firstname;
public string Firstname
{
get => firstname;
set => SetField(ref firstname, value);
}

private string lastname;
public string Lastname
{
get => lastname;
set => SetField(ref lastname, value);
}

private string email;
public string Email
{
get => email;
set => SetField(ref email, value);
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
}
17 changes: 17 additions & 0 deletions Services/ITeamMemberService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using MauiApp1.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MauiApp1.Services
{
public interface ITeamMemberService
{
Task<List<TeamMember>> GetTeamMemberList();
Task<int> AddTeamMember(TeamMember teamMember);
Task<int> DeleteTeamMember(TeamMember teamMember);
Task<int> UpdateTeamMember(TeamMember teamMember);
}
}
52 changes: 52 additions & 0 deletions Services/TeamMemberService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using MauiApp1.Data;
using MauiApp1.Models;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MauiApp1.Services
{
public class TeamMemberService : ITeamMemberService
{
private SQLiteAsyncConnection _dbConn;
/*! <summary>
Method that initiates connection to database. Will create the OrderStatus table if connected.
</summary> */
private async Task SetUpDb()
{
if (_dbConn != null)
return;


_dbConn = new SQLiteAsyncConnection(DatabaseSettings.DBPath, DatabaseSettings.Flags);
await _dbConn.CreateTableAsync<OrderStatus>();
}

public async Task<int> AddTeamMember(TeamMember teamMember)
{
await SetUpDb();
return await _dbConn.InsertAsync(teamMember);
}

public async Task<int> DeleteTeamMember(TeamMember teamMember)
{
await SetUpDb();
return await _dbConn.DeleteAsync(teamMember);
}

public async Task<List<TeamMember>> GetTeamMemberList()
{
await SetUpDb();
return await _dbConn.Table<TeamMember>().ToListAsync();
}

public async Task<int> UpdateTeamMember(TeamMember teamMember)
{
await SetUpDb();
return await _dbConn.UpdateAsync(teamMember);
}
}
}
12 changes: 12 additions & 0 deletions Tests/TeamMembersPageTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MauiApp1.Tests
{
internal class TeamMembersPageTests
{
}
}
30 changes: 30 additions & 0 deletions Views/TeamMember.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp1.Views.TeamMembersPage"
Title="TeamMember Page">
<VerticalStackLayout Spacing="10" Margin="5">
<Editor x:Name="txe_teamMemberFirstName" Placeholder="First Name" />
<Editor x:Name="txe_teamMemberLastName" Placeholder="Last Name" />
<Editor x:Name="txe_teamMemberEmail" Placeholder="Email" />


<Grid ColumnDefinitions="*,*" ColumnSpacing="4">
<Button Text="Save"
Clicked="SaveButton_Clicked" />

<Button Grid.Column="1"
Text="Delete"
Clicked="DeleteButton_Clicked" />
</Grid>

<ListView x:Name="ltv_teamMembers" Background="white" ItemSelected="ltv_teamMembers_ItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding FirstName}" TextColor="Black" FontAttributes="Bold" />
<Label Text="{Binding LastName + ' - ' + Email}" TextColor="Gray" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ContentPage>
111 changes: 111 additions & 0 deletions Views/TeamMember.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
using MauiApp1.Models;
using MauiApp1.Services;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;

/*! The TeamMembersPage class allows for the basic functions
* implemented in the TeamMemberService class to be used within
* the UI
*/

namespace MauiApp1.Views;

public partial class TeamMembersPage : ContentPage
{
TeamMember selectedTeamMember = null;
ITeamMemberService teamMemberService;
ObservableCollection<TeamMember> teamMembers = new ObservableCollection<TeamMember>();

//! public initialisation of components
public TeamMembersPage()
{
InitializeComponent();
this.BindingContext = this;
this.teamMemberService = new TeamMemberService();

Task.Run(async () => await LoadTeamMembers());
}


//! Task to load teamMembers into a variable
private async Task LoadTeamMembers()
{
teamMembers = new ObservableCollection<TeamMember>(await teamMemberService.GetTeamMemberList());
ltv_teamMembers.ItemsSource = teamMembers;
}

/*!
* Detect save button being clicked
* @param sender (Object) the sender object created by the event
* @param e (EventArgs) the arguments passed into the event
*/
private void SaveButton_Clicked(object sender, EventArgs e)
{
string firstName = txe_teamMemberFirstName.Text;
string lastName = txe_teamMemberLastName.Text;
string email = txe_teamMemberEmail.Text;

if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName) || string.IsNullOrEmpty(email)) return;

var teamMember = new TeamMember()
{
Firstname = firstName,
Lastname = lastName,
Email = email
};

teamMemberService.AddTeamMember(teamMember);
teamMembers.Add(teamMember);

// Clear input fields
txe_teamMemberFirstName.Text = "";
txe_teamMemberLastName.Text = "";
txe_teamMemberEmail.Text = "";
}


/*!
* Detect delete button being clicked
* @param sender (Object) the sender object created by the event
* @param e (EventArgs) the arguments passed into the event
*/
private async void DeleteButton_Clicked(object sender, EventArgs e)
{
if (ltv_teamMembers.SelectedItem == null)
{
await DisplayAlert("No TeamMember Selected", "Select the teamMember you want to delete from the list", "OK");
return;
}

TeamMember selectedTeamMember = (TeamMember)ltv_teamMembers.SelectedItem;

await teamMemberService.DeleteTeamMember(selectedTeamMember);
teamMembers.Remove(selectedTeamMember);

// Clear input fields
txe_teamMemberFirstName.Text = "";
txe_teamMemberLastName.Text = "";
txe_teamMemberEmail.Text = "";
Comment on lines +63 to +90
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this violates dry

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and it also violates SRP because it should be in a different method


ltv_teamMembers.SelectedItem = null;
}


/*!
* Detect all items selected in list view
* @param sender (Object) the sender object created by the event
* @param e (SelectedItemChangedEventArgs) the arguments passed into the event
*/
private void ltv_teamMembers_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
TeamMember selectedTeamMember = e.SelectedItem as TeamMember;
if (selectedTeamMember == null) return;

txe_teamMemberFirstName.Text = selectedTeamMember.Firstname;
txe_teamMemberLastName.Text = selectedTeamMember.Lastname;
txe_teamMemberEmail.Text = selectedTeamMember.Email;
}

}