Börjat på RoundBuilding avsnittet , skall ändra save-svar från bool till int

This commit is contained in:
2025-09-05 14:52:08 +02:00
parent 4caeb21b0d
commit d3c9dcb208
10 changed files with 373 additions and 29 deletions

View File

@ -0,0 +1,9 @@
using System.Collections.ObjectModel;
namespace Common.Library
{
public interface IMethodSharingService<TEntity>
{
ObservableCollection<TEntity> Get();
}
}

View File

@ -0,0 +1,16 @@
using Common.Library;
namespace GreadyPoang.EntityLayer;
public class RoundBuilderElement : EntityBase
{
public int ParticipantId { get; set; }
public string ParticipantName { get; set; } = string.Empty;
public int GameRoundRegNr { get; set; }
public int GameRegPoints { get; set; }
public int GameRoundPoints { get; set; }
public GamePointStatus Status { get; set; }
public DateTime GameRoundStartDate { get; set; }
public int GameRoundId { get; set; }
}

View File

@ -0,0 +1,37 @@
using Common.Library;
using GreadyPoang.EntityLayer;
using System.Collections.ObjectModel;
namespace GreadyPoang.ViewModelLayer;
public class MethodSharingService : ViewModelBase, IMethodSharingService<Participant>
{
private readonly IRepository<Participant> _repository;
public MethodSharingService(IRepository<Participant> repository)
{
_repository = repository;
}
public ObservableCollection<Participant> Get()
{
ObservableCollection<Participant> _participantList = new();
if (_repository != null)
{
var participantsTask = _repository.Get();
var participants = participantsTask is Task<IEnumerable<Participant>> task
? task.GetAwaiter().GetResult()
: (IEnumerable<Participant>)participantsTask;
foreach (var participant in participants)
{
if (!_participantList.Any(p => p.ParticipantId == participant.ParticipantId))
{
_participantList.Add(participant);
}
}
}
return _participantList;
}
}

View File

@ -13,9 +13,10 @@ public class ParticipantViewModel : ViewModelBase
} }
public ParticipantViewModel(IRepository<Participant> repo) : base() public ParticipantViewModel(IRepository<Participant> repo, IMethodSharingService<Participant> sharingService) : base()
{ {
Repository = repo; _Repository = repo;
_sharingService = sharingService;
} }
#endregion #endregion
@ -23,7 +24,8 @@ public class ParticipantViewModel : ViewModelBase
#region Private Variables #region Private Variables
private Participant? _ParticipantObject = new(); private Participant? _ParticipantObject = new();
private ObservableCollection<Participant> _ParticipantList = new(); private ObservableCollection<Participant> _ParticipantList = new();
private readonly IRepository<Participant>? Repository; private readonly IRepository<Participant>? _Repository;
private readonly IMethodSharingService<Participant> _sharingService;
#endregion #endregion
#region public Properties #region public Properties
@ -53,23 +55,12 @@ public class ParticipantViewModel : ViewModelBase
#region Get Method #region Get Method
public ObservableCollection<Participant> Get() public ObservableCollection<Participant> Get()
{ {
if (Repository != null) ParticipantList = _sharingService.Get();
{
var participantsTask = Repository.Get();
var participants = participantsTask is Task<IEnumerable<Participant>> task
? task.GetAwaiter().GetResult()
: (IEnumerable<Participant>)participantsTask;
foreach (var participant in participants)
{
if (!_ParticipantList.Any(p => p.ParticipantId == participant.ParticipantId))
{
ParticipantList.Add(participant);
}
}
}
return ParticipantList; return ParticipantList;
} }
#endregion #endregion
#region Get(id) Method #region Get(id) Method
@ -77,7 +68,7 @@ public class ParticipantViewModel : ViewModelBase
{ {
try try
{ {
ParticipantObject = Repository?.Get(id).GetAwaiter().GetResult(); ParticipantObject = _Repository?.Get(id).GetAwaiter().GetResult();
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -88,11 +79,11 @@ public class ParticipantViewModel : ViewModelBase
} }
public virtual bool Save() public virtual bool Save()
{ {
if (Repository == null || ParticipantObject == null) if (_Repository == null || ParticipantObject == null)
{ {
return false; return false;
} }
var tmpTask = Repository.Save(ParticipantObject); var tmpTask = _Repository.Save(ParticipantObject);
bool tmp = tmpTask.GetAwaiter().GetResult(); bool tmp = tmpTask.GetAwaiter().GetResult();
if (tmp) if (tmp)
{ {

View File

@ -0,0 +1,165 @@
using Common.Library;
using GreadyPoang.EntityLayer;
using System.Collections.ObjectModel;
using System.Diagnostics;
namespace GreadyPoang.ViewModelLayer;
public class RoundStartingViewModel : ViewModelBase
{
#region Constructors
public RoundStartingViewModel() : base()
{
}
public RoundStartingViewModel(IRepository<GameRound> repo, IMethodSharingService<Participant> sharingService) : base()
{
_Repository = repo;
_sharingService = sharingService;
_roundElements = new ObservableCollection<RoundBuilderElement>();
}
#endregion
private GameRound? _GameRoundObject = new();
private ObservableCollection<GameRound> _GameRoundList = new();
private ObservableCollection<Participant> _ParticipantList = new();
private readonly IRepository<GameRound>? _Repository;
private readonly IMethodSharingService<Participant> _sharingService;
private Participant _selectedItem;
private ObservableCollection<RoundBuilderElement> _roundElements;
public ObservableCollection<RoundBuilderElement> RoundElements
{
get { return _roundElements; }
set
{
_roundElements = value;
RaisePropertyChanged(nameof(RoundElements));
}
}
public Participant SelectedItem
{
get => _selectedItem;
set
{
if (_selectedItem != value)
{
_selectedItem = value;
RaisePropertyChanged(nameof(SelectedItem));
OnItemSelected(value); // Metod som triggas vid val
}
}
}
private void OnItemSelected(Participant item)
{
if (_roundElements.Count == 0)
{
var GameRound = new GameRound
{
GameRoundStartDate = DateTime.Now,
GameRoundFinished = null
};
_Repository?.Save(GameRound).GetAwaiter().GetResult();
}
// Gör något med det valda objektet
Debug.WriteLine($"Du valde: {item.LastNameFirstName}");
}
public GameRound? GameRoundObject
{
get { return _GameRoundObject; }
set
{
_GameRoundObject = value;
RaisePropertyChanged(nameof(GameRoundObject));
}
}
public ObservableCollection<GameRound> GameRoundList
{
get { return _GameRoundList; }
set
{
_GameRoundList = value;
RaisePropertyChanged(nameof(GameRoundList));
}
}
public ObservableCollection<Participant> ParticipantList
{
get { return _ParticipantList; }
set
{
_ParticipantList = value;
RaisePropertyChanged(nameof(ParticipantList));
}
}
#region Get Method
public ObservableCollection<GameRound> Get()
{
if (_Repository != null)
{
var gameRoundsTask = _Repository.Get();
var gameRounds = gameRoundsTask is Task<IEnumerable<GameRound>> task
? task.GetAwaiter().GetResult()
: (IEnumerable<GameRound>)gameRoundsTask;
foreach (var gameRound in gameRounds)
{
if (!_GameRoundList.Any(p => p.GameRoundId == gameRound.GameRoundId))
{
GameRoundList.Add(gameRound);
}
}
}
return GameRoundList;
}
public ObservableCollection<Participant> GetParticipants()
{
ParticipantList = _sharingService.Get();
return ParticipantList;
}
#endregion
#region Get(id) Method
public GameRound? Get(int id)
{
try
{
GameRoundObject = _Repository?.Get(id).GetAwaiter().GetResult();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error in Get method: {ex.Message}");
}
return GameRoundObject;
}
public virtual bool Save()
{
if (_Repository == null || GameRoundObject == null)
{
return false;
}
var tmpTask = _Repository.Save(GameRoundObject);
bool tmp = tmpTask.GetAwaiter().GetResult();
if (tmp)
{
GameRoundObject = new GameRound();
this.Get();
}
return tmp;
}
#endregion
}

View File

@ -12,7 +12,7 @@ public class ParticipantViewModelCommands : ParticipantViewModel
{ {
} }
public ParticipantViewModelCommands(IRepository<Participant> repo) : base(repo) public ParticipantViewModelCommands(IRepository<Participant> repo, IMethodSharingService<Participant> sharingService) : base(repo, sharingService)
{ {
} }

View File

@ -0,0 +1,64 @@
using Common.Library;
using GreadyPoang.EntityLayer;
using GreadyPoang.ViewModelLayer;
using System.Windows.Input;
namespace GreadyPoang.CommandClasses;
public class RoundStartingViewModelCommands : RoundStartingViewModel
{
public RoundStartingViewModelCommands() : base()
{
}
public RoundStartingViewModelCommands(IRepository<GameRound> repo, IMethodSharingService<Participant> sharingService) : base(repo, sharingService)
{
}
#region Private Variables
private bool _IsSaveCommandEnabled = true;
#endregion
#region Public Properties
public bool IsSaveCommandEnabled
{
get { return _IsSaveCommandEnabled; }
set
{
_IsSaveCommandEnabled = value;
RaisePropertyChanged(nameof(IsSaveCommandEnabled));
}
}
#endregion
#region Commands
public ICommand SaveCommand { get; private set; }
public ICommand EditCommand { get; private set; }
#endregion
#region Init Method
public override void Init()
{
base.Init();
SaveCommand = new Command(async () => SaveAsync(), () => IsSaveCommandEnabled);
EditCommand = new Command<int>(async (id) => await EditAsync(id), (id) => id > 0);
}
#endregion
protected async Task EditAsync(int id)
{
await Shell.Current.GoToAsync($"{nameof(Views.RoundStartingView)}?id={id}");
}
public async Task<bool> SaveAsync()
{
var ret = base.Save();
if (ret)
{
await Shell.Current.GoToAsync("..");
}
return ret;
}
}

View File

@ -3,6 +3,7 @@ using GreadyPoang.CommandClasses;
using GreadyPoang.DataLayer; using GreadyPoang.DataLayer;
using GreadyPoang.DataLayer.Database; using GreadyPoang.DataLayer.Database;
using GreadyPoang.EntityLayer; using GreadyPoang.EntityLayer;
using GreadyPoang.ViewModelLayer;
using GreadyPoang.Views; using GreadyPoang.Views;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -39,6 +40,15 @@ public static class MauiProgram
builder.Services.AddScoped<ParticipantViewModelCommands>(); builder.Services.AddScoped<ParticipantViewModelCommands>();
builder.Services.AddScoped<ParticipantListView>(); builder.Services.AddScoped<ParticipantListView>();
builder.Services.AddScoped<IRepository<GameRound>, GameRoundRepository>();
builder.Services.AddScoped<RoundStartingViewModelCommands>();
builder.Services.AddScoped<RoundStartingView>();
builder.Services.AddScoped<IRepository<GamePoint>, GamePointRepository>();
builder.Services.AddScoped<IMethodSharingService<Participant>, MethodSharingService>();
#if DEBUG #if DEBUG
builder.Logging.AddDebug(); builder.Logging.AddDebug();
#endif #endif

View File

@ -3,6 +3,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:partial="clr-namespace:GreadyPoang.ViewsPartial" xmlns:partial="clr-namespace:GreadyPoang.ViewsPartial"
x:Class="GreadyPoang.Views.RoundStartingView" x:Class="GreadyPoang.Views.RoundStartingView"
xmlns:vm="clr-namespace:GreadyPoang.CommandClasses"
xmlns:model="clr-namespace:GreadyPoang.EntityLayer;assembly=GreadyPoang.EntityLayer"
x:DataType="vm:RoundStartingViewModelCommands"
x:Name="GameRoundStartingPage"
Title="Starta ny Runda"> Title="Starta ny Runda">
<Border Style="{StaticResource Border.Page}" StrokeThickness="4"> <Border Style="{StaticResource Border.Page}" StrokeThickness="4">
<Grid Style="{StaticResource Grid.Page}"> <Grid Style="{StaticResource Grid.Page}">
@ -16,11 +20,40 @@
ViewTitle="Starta en Spelrunda" ViewTitle="Starta en Spelrunda"
ViewDescription="Välj deltagare och initiera spel" /> ViewDescription="Välj deltagare och initiera spel" />
<Border Grid.Row="1" Stroke="Gold" StrokeThickness="2" BackgroundColor="LemonChiffon" > <Border Grid.Row="1" Stroke="Gold" StrokeThickness="2" BackgroundColor="LemonChiffon" >
<HorizontalStackLayout>
<Border Stroke="Gray"
StrokeThickness="2"
BackgroundColor="LightGray"
Padding="10"
Margin="2"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="250">
<Picker ItemsSource="{Binding ParticipantList}"
ItemDisplayBinding="{Binding LastNameFirstName}"
SelectedItem="{Binding SelectedItem}"
Title="Välj deltagare"/>
</Border>
<Border Stroke="Gold" StrokeThickness="2" BackgroundColor="LightCyan" >
<HorizontalStackLayout>
<Border Stroke="red" StrokeThickness="4" BackgroundColor="DarkGoldenrod">
<Label Text="Här kommer du kunna välja deltagare och starta en ny spelrunda" <Label Text="Här kommer du kunna välja deltagare och starta en ny spelrunda"
FontAttributes="Bold" FontAttributes="Bold"
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center"/> VerticalOptions="Center"/>
</Border> </Border>
<Border Stroke="red" StrokeThickness="4" BackgroundColor="DarkGoldenrod">
<Label Text="Här kommer du kunna välja deltagare och starta en ny spelrunda"
FontAttributes="Bold"
HorizontalOptions="Center"
VerticalOptions="Center"/>
</Border>
</HorizontalStackLayout>
</Border>
</HorizontalStackLayout>
</Border>
<Border Grid.Row="2" Stroke="Gold" BackgroundColor="Ivory" StrokeThickness="2" Padding="5"> <Border Grid.Row="2" Stroke="Gold" BackgroundColor="Ivory" StrokeThickness="2" Padding="5">
<Label Text="Här kommer en lista på alla spelrundor att visas" <Label Text="Här kommer en lista på alla spelrundor att visas"
FontAttributes="Bold" FontAttributes="Bold"

View File

@ -1,9 +1,28 @@
using GreadyPoang.CommandClasses;
namespace GreadyPoang.Views; namespace GreadyPoang.Views;
public partial class RoundStartingView : ContentPage public partial class RoundStartingView : ContentPage
{ {
public RoundStartingView()
public RoundStartingView(RoundStartingViewModelCommands viewModel)
{ {
InitializeComponent(); InitializeComponent();
ViewModel = viewModel;
} }
public RoundStartingViewModelCommands ViewModel { get; set; }
public int GameRoundId { get; set; }
protected override void OnAppearing()
{
base.OnAppearing();
BindingContext = ViewModel;
ViewModel.Get();
ViewModel.GetParticipants();
}
} }