mirror of
https://gitlab.com/fabinfra/fabaccess/borepin.git
synced 2025-03-12 23:01:52 +01:00
Added: first implementation of categories
This commit is contained in:
parent
e20e585426
commit
a3bf515fb4
@ -7,7 +7,7 @@ namespace Borepin.Droid.Services
|
||||
{
|
||||
public class BrowserService : IBrowserService
|
||||
{
|
||||
private Xamarin.Essentials.BrowserLaunchOptions ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
private Xamarin.Essentials.BrowserLaunchOptions _ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
return new Xamarin.Essentials.BrowserLaunchOptions()
|
||||
{
|
||||
@ -30,7 +30,7 @@ namespace Borepin.Droid.Services
|
||||
|
||||
public async Task OpenAsync(string uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
|
||||
public async Task OpenAsync(Uri uri)
|
||||
@ -45,7 +45,7 @@ namespace Borepin.Droid.Services
|
||||
|
||||
public async Task OpenAsync(Uri uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
}
|
||||
}
|
@ -7,7 +7,7 @@ namespace Borepin.UWP.Services
|
||||
{
|
||||
public class BrowserService : IBrowserService
|
||||
{
|
||||
private Xamarin.Essentials.BrowserLaunchOptions ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
private Xamarin.Essentials.BrowserLaunchOptions _ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
return new Xamarin.Essentials.BrowserLaunchOptions()
|
||||
{
|
||||
@ -30,7 +30,7 @@ namespace Borepin.UWP.Services
|
||||
|
||||
public async Task OpenAsync(string uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
|
||||
public async Task OpenAsync(Uri uri)
|
||||
@ -45,7 +45,7 @@ namespace Borepin.UWP.Services
|
||||
|
||||
public async Task OpenAsync(Uri uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ namespace Borepin.iOS.Services
|
||||
{
|
||||
public class BrowserService : IBrowserService
|
||||
{
|
||||
private Xamarin.Essentials.BrowserLaunchOptions ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
private Xamarin.Essentials.BrowserLaunchOptions _ConvertBrowserLaunchOptions(Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
return new Xamarin.Essentials.BrowserLaunchOptions()
|
||||
{
|
||||
@ -30,7 +30,7 @@ namespace Borepin.iOS.Services
|
||||
|
||||
public async Task OpenAsync(string uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
|
||||
public async Task OpenAsync(Uri uri)
|
||||
@ -45,7 +45,7 @@ namespace Borepin.iOS.Services
|
||||
|
||||
public async Task OpenAsync(Uri uri, Service.Browser.BrowserLaunchOptions browserLaunchOptions)
|
||||
{
|
||||
await Browser.OpenAsync(uri, ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
await Browser.OpenAsync(uri, _ConvertBrowserLaunchOptions(browserLaunchOptions));
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
using FabAccessAPI;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Borepin.Base
|
||||
@ -109,7 +110,7 @@ namespace Borepin.Base
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
catch(Exception ex)
|
||||
{
|
||||
IsConnected = false;
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
|
@ -59,7 +59,7 @@ namespace Borepin.DialogModel
|
||||
IDialogParameters parameters = new DialogParameters()
|
||||
{
|
||||
{ "result", "confirm" },
|
||||
{ "instance", _Instance }
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
@ -75,7 +75,7 @@ namespace Borepin.DialogModel
|
||||
IDialogParameters parameters = new DialogParameters()
|
||||
{
|
||||
{ "result", "abort" },
|
||||
{ "instance", _Instance }
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ namespace Borepin.DialogModel
|
||||
{
|
||||
{ "result", "scanned" },
|
||||
{ "value", ScanResult.Text },
|
||||
{ "instance", _Instance }
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
@ -90,7 +90,7 @@ namespace Borepin.DialogModel
|
||||
IDialogParameters parameters = new DialogParameters()
|
||||
{
|
||||
{ "result", "abort" },
|
||||
{ "instance", _Instance }
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
|
@ -13,8 +13,6 @@ namespace Borepin.Model
|
||||
public ConnectionDataVisualize(ConnectionData connectionData)
|
||||
{
|
||||
_ConnectionData = connectionData;
|
||||
|
||||
LoadData();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
19
Borepin/Borepin/Model/MachineViewModelListGroup.cs
Normal file
19
Borepin/Borepin/Model/MachineViewModelListGroup.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using Borepin.ViewModel;
|
||||
using NaturalSort.Extension;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public class MachineViewModelListGroup : List<MachineListItemViewModel>
|
||||
{
|
||||
public string Category { get; set; }
|
||||
public void Sort_Machines()
|
||||
{
|
||||
List<MachineListItemViewModel> ordered = new List<MachineListItemViewModel>(this.OrderBy(x => x.Machine.Name, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
Clear();
|
||||
AddRange(ordered);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
using FabAccessAPI.Schema;
|
||||
using Prism.Mvvm;
|
||||
using System.Threading.Tasks;
|
||||
using static FabAccessAPI.Schema.Machine;
|
||||
|
||||
namespace Borepin.Model
|
||||
@ -14,13 +15,11 @@ namespace Borepin.Model
|
||||
public MachineVisualize(Machine machine)
|
||||
{
|
||||
_Machine = machine;
|
||||
|
||||
LoadData();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
public async void LoadData()
|
||||
public async Task LoadData()
|
||||
{
|
||||
//ID = _Machine.Id;
|
||||
//Space = new SpaceVisualize(_Machine.Space);
|
||||
@ -28,11 +27,12 @@ namespace Borepin.Model
|
||||
Description = _Machine.Description;
|
||||
Wiki = _Machine.Wiki;
|
||||
State = _Machine.State;
|
||||
Category = _Machine.Category;
|
||||
|
||||
if(_Machine.Manager.Just != null)
|
||||
{
|
||||
Manager = new UserVisualize(_Machine.Manager.Just);
|
||||
Manager.LoadData();
|
||||
await Manager.LoadData().ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -49,17 +49,17 @@ namespace Borepin.Model
|
||||
else
|
||||
{
|
||||
CurrentUser = new UserVisualize(machineInfoExtended.CurrentUser.Just);
|
||||
CurrentUser.LoadData();
|
||||
await CurrentUser.LoadData().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (machineInfoExtended.LastUser .Just== null)
|
||||
if (machineInfoExtended.LastUser.Just == null)
|
||||
{
|
||||
LastUser = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
LastUser = new UserVisualize(machineInfoExtended.LastUser.Just);
|
||||
LastUser.LoadData();
|
||||
await LastUser.LoadData().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -74,7 +74,7 @@ namespace Borepin.Model
|
||||
CanCheck = !((CheckInterface_Proxy)_Machine.Check).IsNull;
|
||||
CanManage = !((ManageInterface_Proxy)_Machine.Manage).IsNull;
|
||||
CanAdmin = !((AdminInterface_Proxy)_Machine.Admin).IsNull;
|
||||
CanNotUseByPermission = State == MachineState.free && CanUse == false;
|
||||
CanNotUseByPermission = State == MachineState.free && !CanUse;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -100,6 +100,13 @@ namespace Borepin.Model
|
||||
set => SetProperty(ref _Name, value);
|
||||
}
|
||||
|
||||
private string _Category;
|
||||
public string Category
|
||||
{
|
||||
get => _Category;
|
||||
set => SetProperty(ref _Category, value);
|
||||
}
|
||||
|
||||
private string _Description;
|
||||
public string Description
|
||||
{
|
||||
|
@ -13,7 +13,6 @@ namespace Borepin.Model
|
||||
public SpaceVisualize(Space space)
|
||||
{
|
||||
_Space = space;
|
||||
LoadData();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
using FabAccessAPI.Schema;
|
||||
using Prism.Mvvm;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Borepin.Model
|
||||
{
|
||||
@ -13,16 +14,17 @@ namespace Borepin.Model
|
||||
public UserVisualize(User user)
|
||||
{
|
||||
_User = user;
|
||||
LoadData();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region LoadData
|
||||
public void LoadData()
|
||||
public Task LoadData()
|
||||
{
|
||||
//ID = _User.Id;
|
||||
Username = _User.Username;
|
||||
//Space = new SpaceVisualize(_User.Space);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@ -29,7 +29,8 @@
|
||||
Android="True"/>
|
||||
</Button.IsVisible>
|
||||
</Button>
|
||||
<ListView ItemsSource="{Binding MachineListItemViewModel_List}" SelectionMode="None" SeparatorColor="Transparent">
|
||||
<ListView ItemsSource="{Binding MachineListItemViewModel_List}" SelectionMode="None" SeparatorColor="Transparent" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Category}">
|
||||
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<ViewCell>
|
||||
|
@ -12,6 +12,7 @@ using NaturalSort.Extension;
|
||||
using System.Linq;
|
||||
using Borepin.Service;
|
||||
using static FabAccessAPI.Schema.Machine;
|
||||
using Borepin.Model;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
@ -28,41 +29,93 @@ namespace Borepin.PageModel
|
||||
#region Data
|
||||
public override async Task LoadAPIData()
|
||||
{
|
||||
User user_self = await _API.Session.UserSystem.Info.GetUserSelf().ConfigureAwait(false);
|
||||
|
||||
IReadOnlyList<Machine> machine_list = await _API.Session.MachineSystem.Info.GetMachineList().ConfigureAwait(false);
|
||||
|
||||
List<MachineListItemViewModel> viewmodel_list_user_assigned = new List<MachineListItemViewModel>();
|
||||
List<MachineListItemViewModel> viewmodel_list_not_user_assigned = new List<MachineListItemViewModel>();
|
||||
await _CreateMachineList(new List<Machine>(machine_list)).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task _CreateMachineList(List<Machine> machine_list)
|
||||
{
|
||||
List<MachineViewModelListGroup> viewmodel_group_list = new List<MachineViewModelListGroup>();
|
||||
MachineViewModelListGroup viewmodel_group_inusebyme = new MachineViewModelListGroup()
|
||||
{
|
||||
Category = Resources.Text.TextResource.InUseByMe,
|
||||
};
|
||||
MachineViewModelListGroup viewmodel_group_uncategorised = new MachineViewModelListGroup()
|
||||
{
|
||||
Category = null,
|
||||
};
|
||||
|
||||
foreach (Machine machine in machine_list)
|
||||
{
|
||||
if(!((InUseInterface_Proxy)machine.Inuse).IsNull)
|
||||
if (!((InUseInterface_Proxy)machine.Inuse).IsNull)
|
||||
{
|
||||
MachineListItemViewModel new_viewmodel = new MachineListItemViewModel(_NavigationService, _PageDialogService)
|
||||
{
|
||||
IsInUseByMe = true,
|
||||
};
|
||||
await new_viewmodel.LoadInstance(machine).ConfigureAwait(false);
|
||||
viewmodel_list_user_assigned.Add(new_viewmodel);
|
||||
|
||||
new_viewmodel.Machine.Category = Resources.Text.TextResource.InUseByMe;
|
||||
|
||||
viewmodel_group_inusebyme.Add(new_viewmodel);
|
||||
}
|
||||
else if (machine.Category == null)
|
||||
{
|
||||
MachineListItemViewModel new_viewmodel = new MachineListItemViewModel(_NavigationService, _PageDialogService);
|
||||
await new_viewmodel.LoadInstance(machine).ConfigureAwait(false);
|
||||
|
||||
viewmodel_group_inusebyme.Add(new_viewmodel);
|
||||
}
|
||||
else
|
||||
{
|
||||
MachineListItemViewModel new_viewmodel = new MachineListItemViewModel(_NavigationService, _PageDialogService);
|
||||
await new_viewmodel.LoadInstance(machine).ConfigureAwait(false);
|
||||
viewmodel_list_not_user_assigned.Add(new_viewmodel);
|
||||
|
||||
MachineViewModelListGroup viewmodel_group = viewmodel_group_list.Find(x => string.Equals(x.Category, machine.Category, StringComparison.Ordinal));
|
||||
if (viewmodel_group != null)
|
||||
{
|
||||
viewmodel_group.Add(new_viewmodel);
|
||||
}
|
||||
else
|
||||
{
|
||||
MachineViewModelListGroup new_viewmodel_group = new MachineViewModelListGroup()
|
||||
{
|
||||
Category = machine.Category,
|
||||
};
|
||||
new_viewmodel_group.Add(new_viewmodel);
|
||||
viewmodel_group_list.Add(new_viewmodel_group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<MachineListItemViewModel> viewmodel_list_sorted = new List<MachineListItemViewModel>();
|
||||
viewmodel_list_sorted.AddRange(viewmodel_list_user_assigned.OrderBy(x => x.Machine.Name, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
viewmodel_list_sorted.AddRange(viewmodel_list_not_user_assigned.OrderBy(x => x.Machine.Name, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
MachineListItemViewModel_List = viewmodel_list_sorted;
|
||||
viewmodel_group_inusebyme.Sort_Machines();
|
||||
viewmodel_group_uncategorised.Sort_Machines();
|
||||
foreach(MachineViewModelListGroup viewmodel_group in viewmodel_group_list)
|
||||
{
|
||||
viewmodel_group.Sort_Machines();
|
||||
}
|
||||
|
||||
List<MachineViewModelListGroup> viewmodel_group_list_sorted = new List<MachineViewModelListGroup>();
|
||||
if(viewmodel_group_inusebyme.Count != 0)
|
||||
{
|
||||
viewmodel_group_list_sorted.Add(viewmodel_group_inusebyme);
|
||||
}
|
||||
|
||||
viewmodel_group_list_sorted.AddRange(new List<MachineViewModelListGroup>(viewmodel_group_list.OrderBy(x => x.Category, StringComparison.OrdinalIgnoreCase.WithNaturalSort())));
|
||||
|
||||
if (viewmodel_group_uncategorised.Count != 0)
|
||||
{
|
||||
viewmodel_group_list_sorted.Add(viewmodel_group_uncategorised);
|
||||
}
|
||||
|
||||
MachineListItemViewModel_List = viewmodel_group_list_sorted;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
private IList<MachineListItemViewModel> _MachineListItemViewModel_List;
|
||||
public IList<MachineListItemViewModel> MachineListItemViewModel_List
|
||||
private IList<MachineViewModelListGroup> _MachineListItemViewModel_List;
|
||||
public IList<MachineViewModelListGroup> MachineListItemViewModel_List
|
||||
{
|
||||
get => _MachineListItemViewModel_List;
|
||||
set => SetProperty(ref _MachineListItemViewModel_List, value);
|
||||
|
@ -19,7 +19,7 @@ namespace Borepin.PageModel
|
||||
#region Private Fields
|
||||
private string _ID;
|
||||
private Machine _Machine;
|
||||
private IBrowserService _BrowserService;
|
||||
private readonly IBrowserService _BrowserService;
|
||||
#endregion
|
||||
|
||||
#region Contructors
|
||||
@ -55,7 +55,7 @@ namespace Borepin.PageModel
|
||||
{
|
||||
_Machine = (await _API.Session.MachineSystem.Info.GetMachine(_ID).ConfigureAwait(false)).Just;
|
||||
MachineItem = new MachineVisualize(_Machine);
|
||||
MachineItem.LoadData();
|
||||
await MachineItem.LoadData().ConfigureAwait(false);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@ -36,9 +36,9 @@ namespace Borepin.PageModel
|
||||
PossibleFormats = new List<BarcodeFormat>()
|
||||
{
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.EAN_13
|
||||
BarcodeFormat.EAN_13,
|
||||
// TODO add more Barcode Formats if needed
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
//set => SetProperty(ref _ScanOptions, value);
|
||||
|
@ -24,7 +24,7 @@ namespace Borepin.PageModel
|
||||
#region Private Fields
|
||||
private string _ID;
|
||||
private User _User;
|
||||
private IDialogService _DialogService;
|
||||
private readonly IDialogService _DialogService;
|
||||
private bool _IsDialog;
|
||||
#endregion
|
||||
|
||||
@ -65,7 +65,7 @@ namespace Borepin.PageModel
|
||||
|
||||
_User = (await _API.Session.UserSystem.Search.GetUserByName(_ID).ConfigureAwait(false)).Just;
|
||||
UserItem = new UserVisualize(_User);
|
||||
UserItem.LoadData();
|
||||
await UserItem.LoadData().ConfigureAwait(false);
|
||||
|
||||
IReadOnlyList<Role> role_list = await _API.Session.PermissionSystem.Info.GetRoleList().ConfigureAwait(false);
|
||||
List<Role> user_role_list = new List<Role>(await _User.Info.ListRoles().ConfigureAwait(false));
|
||||
@ -78,7 +78,7 @@ namespace Borepin.PageModel
|
||||
{
|
||||
role,
|
||||
_User,
|
||||
user_role_list.Exists(x => string.Equals(x.Name, role.Name, StringComparison.Ordinal))
|
||||
user_role_list.Exists(x => string.Equals(x.Name, role.Name, StringComparison.Ordinal)),
|
||||
};
|
||||
|
||||
await new_viewmodel.LoadInstance(array).ConfigureAwait(false);
|
||||
|
@ -350,6 +350,15 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to In Use By Me.
|
||||
/// </summary>
|
||||
internal static string InUseByMe {
|
||||
get {
|
||||
return ResourceManager.GetString("InUseByMe", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to You do not have the authorization to use this machine.
|
||||
///Ask in your Space if you can be trained on the machine to be unlocked for the machine..
|
||||
|
@ -215,6 +215,9 @@ You can also put down several servers and then connect to the desired server.</v
|
||||
<data name="HOST" xml:space="preserve">
|
||||
<value>Host</value>
|
||||
</data>
|
||||
<data name="InUseByMe" xml:space="preserve">
|
||||
<value>In Use By Me</value>
|
||||
</data>
|
||||
<data name="MachinePage_CanNotUseByPermission" xml:space="preserve">
|
||||
<value>You do not have the authorization to use this machine.
|
||||
Ask in your Space if you can be trained on the machine to be unlocked for the machine.</value>
|
||||
|
@ -3,6 +3,6 @@
|
||||
public enum BrowserLaunchMode
|
||||
{
|
||||
SystemPreferred = 0,
|
||||
External = 1
|
||||
External = 1,
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,6 @@
|
||||
{
|
||||
Default = 0,
|
||||
Show = 1,
|
||||
Hide = 2
|
||||
Hide = 2,
|
||||
}
|
||||
}
|
||||
|
@ -20,15 +20,13 @@ namespace Borepin.ViewModel
|
||||
#endregion
|
||||
|
||||
#region LoadData
|
||||
public override Task LoadInstance(object instance)
|
||||
public override async Task LoadInstance(object instance)
|
||||
{
|
||||
if(instance is Machine)
|
||||
{
|
||||
Machine = new MachineVisualize(instance as Machine);
|
||||
Machine.LoadData();
|
||||
await Machine.LoadData().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user