Börjat på RoundBuilding avsnittet , skall ändra save-svar från bool till int
This commit is contained in:
9
Common.Library/Interfaces/IMethodSharingService.cs
Normal file
9
Common.Library/Interfaces/IMethodSharingService.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace Common.Library
|
||||||
|
{
|
||||||
|
public interface IMethodSharingService<TEntity>
|
||||||
|
{
|
||||||
|
ObservableCollection<TEntity> Get();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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; }
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
}
|
||||||
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
64
GreadyPoang/CommandClasses/RoundStartingViewModelCommands.cs
Normal file
64
GreadyPoang/CommandClasses/RoundStartingViewModelCommands.cs
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user