Sewerdamages angefangen
This commit is contained in:
@@ -1,16 +1,16 @@
|
|||||||
// See https://aka.ms/new-console-template for more information
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
|
||||||
|
using DaSaSo.ConsoleApp;
|
||||||
using DaSaSo.Domain.Model;
|
using DaSaSo.Domain.Model;
|
||||||
using DaSaSo.Domain.Services;
|
using DaSaSo.Domain.Services;
|
||||||
using DaSaSo.EntityFramework;
|
using DaSaSo.EntityFramework;
|
||||||
using DaSaSo.EntityFramework.Services;
|
using DaSaSo.EntityFramework.Services;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
IDataService<Client> clientService = new GenericDataService<Client>(new DaSaSoDbContextFactory(""));
|
|
||||||
clientService.Create(new Client()
|
testclass test = new testclass();
|
||||||
{
|
test.data = efields.CATRA | efields.PRO;
|
||||||
Firstname = "Cynthia",
|
|
||||||
LastName = "Schreuder",
|
var s = test.data.HasFlag(efields.CATRA);
|
||||||
Country = "Tarmstedt",
|
|
||||||
Postcode = "25445",
|
Debugger.Break();
|
||||||
});
|
|
||||||
|
|||||||
38
DaSaSo.ConsoleApp/testclass.cs
Normal file
38
DaSaSo.ConsoleApp/testclass.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DaSaSo.ConsoleApp
|
||||||
|
{
|
||||||
|
class testclass
|
||||||
|
{
|
||||||
|
public efields data;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
enum efields : int
|
||||||
|
{
|
||||||
|
PRO = 1,
|
||||||
|
CONTRA = 2,
|
||||||
|
DESPRED = 4,
|
||||||
|
CATRA = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
static class EnumerationExtensions
|
||||||
|
{
|
||||||
|
public static bool Has<T>(this System.Enum type, T value)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (((int)(object)type & (int)(object)value) == (int)(object)value);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
namespace DaSaSo.Domain.Model
|
namespace DaSaSo.Domain.Model
|
||||||
{
|
{
|
||||||
|
[Flags]
|
||||||
public enum EDamageType
|
public enum EDamageType
|
||||||
{
|
{
|
||||||
Riss = 1,
|
Riss = 1,
|
||||||
@@ -9,8 +10,12 @@
|
|||||||
Inkrustation = 16,
|
Inkrustation = 16,
|
||||||
Ablagerung = 32,
|
Ablagerung = 32,
|
||||||
EinrageneStutzen = 64,
|
EinrageneStutzen = 64,
|
||||||
Infiltration = 128
|
Infiltration = 128,
|
||||||
|
Static = Riss | Bruch | Scherbe,
|
||||||
|
Betrieb = Wurzel | Inkrustation | Ablagerung,
|
||||||
|
Other = EinrageneStutzen | Infiltration
|
||||||
}
|
}
|
||||||
|
[Flags]
|
||||||
public enum EPreparationType
|
public enum EPreparationType
|
||||||
{
|
{
|
||||||
CleanedHD = 1,
|
CleanedHD = 1,
|
||||||
|
|||||||
@@ -13,15 +13,18 @@ namespace DaSaSo.ViewModel.Interface
|
|||||||
event EventHandler? ProjectChanged;
|
event EventHandler? ProjectChanged;
|
||||||
event EventHandler? BuildingSiteChanged;
|
event EventHandler? BuildingSiteChanged;
|
||||||
event EventHandler? SewerObjectChanged;
|
event EventHandler? SewerObjectChanged;
|
||||||
|
event EventHandler? SewerDamageChanged;
|
||||||
Client AktuellClient { get; }
|
Client AktuellClient { get; }
|
||||||
Project AktuellProjekt { get; }
|
Project AktuellProjekt { get; }
|
||||||
Buildingsite AktuellBaustelle { get; }
|
Buildingsite AktuellBaustelle { get; }
|
||||||
SewerObject AktuellSewerObject { get; }
|
SewerObject AktuellSewerObject { get; }
|
||||||
|
SewerDamage AktuellSewerDamage { get; }
|
||||||
|
|
||||||
void SetClient(Client client, bool notification = true);
|
void SetClient(Client client, bool notification = true);
|
||||||
void SetProject(Project project, bool notification = true);
|
void SetProject(Project project, bool notification = true);
|
||||||
void SetBuildingSite(Buildingsite buildingsite);
|
void SetBuildingSite(Buildingsite buildingsite);
|
||||||
void SetSewerObject(SewerObject sewerObject, bool notification = true);
|
void SetSewerObject(SewerObject sewerObject, bool notification = true);
|
||||||
|
void SetSewerDamage(SewerDamage sewerDamage, bool notification = true);
|
||||||
void ResetProject();
|
void ResetProject();
|
||||||
void ResetBuildingSite();
|
void ResetBuildingSite();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ namespace DaSaSo.ViewModel
|
|||||||
{
|
{
|
||||||
private readonly IActualProject _actualProject;
|
private readonly IActualProject _actualProject;
|
||||||
private readonly IDataService<SewerObject> _dataService;
|
private readonly IDataService<SewerObject> _dataService;
|
||||||
|
private SewerDamage _selectedDamage;
|
||||||
|
public SewerDamage SelectedDamage
|
||||||
|
{
|
||||||
|
get => _selectedDamage;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_selectedDamage = value;
|
||||||
|
_actualProject.SetSewerDamage(_selectedDamage);
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SewerObject _model;
|
SewerObject _model;
|
||||||
public List<SewerDamage> Damages { get => _model.SewerDamages.ToList(); }
|
public List<SewerDamage> Damages { get => _model.SewerDamages.ToList(); }
|
||||||
@@ -22,6 +33,7 @@ namespace DaSaSo.ViewModel
|
|||||||
_actualProject = actualProject;
|
_actualProject = actualProject;
|
||||||
_dataService = dataService;
|
_dataService = dataService;
|
||||||
_model = _actualProject.AktuellSewerObject;
|
_model = _actualProject.AktuellSewerObject;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,16 @@ namespace DaSaSo.ViewModel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
string _schaden = "llooo";
|
||||||
|
public string Schaden
|
||||||
|
{
|
||||||
|
get => _schaden;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_schaden = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
public string Strasse { get => _actualProject.AktuellSewerObject.StreetName; }
|
public string Strasse { get => _actualProject.AktuellSewerObject.StreetName; }
|
||||||
public string AktualObject { get => _actualProject.AktuellSewerObject.ObjektName; }
|
public string AktualObject { get => _actualProject.AktuellSewerObject.ObjektName; }
|
||||||
|
|
||||||
@@ -56,6 +65,13 @@ namespace DaSaSo.ViewModel
|
|||||||
LoadModel();
|
LoadModel();
|
||||||
UpdateCurrentSewerViewModelCommand = new UpdateCurrentSewerViewModelCommand(_navigator, viewModelFactory);
|
UpdateCurrentSewerViewModelCommand = new UpdateCurrentSewerViewModelCommand(_navigator, viewModelFactory);
|
||||||
_navigator.StateChanged += () => OnPropertyChanged(nameof(CurrentSewerViewModel));
|
_navigator.StateChanged += () => OnPropertyChanged(nameof(CurrentSewerViewModel));
|
||||||
|
_actualProject.SewerDamageChanged += _actualProject_SewerDamageChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _actualProject_SewerDamageChanged(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Schaden = _actualProject.AktuellSewerDamage.Distance.ToString();
|
||||||
|
OnPropertyChanged(nameof(Schaden));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void LoadModel()
|
private async void LoadModel()
|
||||||
|
|||||||
@@ -15,12 +15,15 @@ namespace DaSaSo.ViewModel.State.ActualState
|
|||||||
public Project? AktuellProjekt { get; private set; }
|
public Project? AktuellProjekt { get; private set; }
|
||||||
public SewerObject? AktuellSewerObject { get; private set; }
|
public SewerObject? AktuellSewerObject { get; private set; }
|
||||||
|
|
||||||
|
public SewerDamage? AktuellSewerDamage { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
#region events
|
#region events
|
||||||
public event EventHandler? ClientChanged;
|
public event EventHandler? ClientChanged;
|
||||||
public event EventHandler? ProjectChanged;
|
public event EventHandler? ProjectChanged;
|
||||||
public event EventHandler? BuildingSiteChanged;
|
public event EventHandler? BuildingSiteChanged;
|
||||||
public event EventHandler? SewerObjectChanged;
|
public event EventHandler? SewerObjectChanged;
|
||||||
|
public event EventHandler? SewerDamageChanged;
|
||||||
|
|
||||||
protected void OnClientChanged()
|
protected void OnClientChanged()
|
||||||
{
|
{
|
||||||
@@ -38,6 +41,10 @@ namespace DaSaSo.ViewModel.State.ActualState
|
|||||||
{
|
{
|
||||||
SewerObjectChanged?.Invoke(this, new EventArgs());
|
SewerObjectChanged?.Invoke(this, new EventArgs());
|
||||||
}
|
}
|
||||||
|
protected void OnSewerDamageChanged()
|
||||||
|
{
|
||||||
|
SewerDamageChanged?.Invoke(this, new EventArgs());
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
public void SetClient(Client client, bool notification = true)
|
public void SetClient(Client client, bool notification = true)
|
||||||
{
|
{
|
||||||
@@ -77,5 +84,12 @@ namespace DaSaSo.ViewModel.State.ActualState
|
|||||||
{
|
{
|
||||||
SetBuildingSite(null);
|
SetBuildingSite(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetSewerDamage(SewerDamage sewerDamage, bool notification = true)
|
||||||
|
{
|
||||||
|
AktuellSewerDamage = sewerDamage;
|
||||||
|
if (notification)
|
||||||
|
OnSewerDamageChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,9 @@
|
|||||||
<RadioButton Content="Stammdaten" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentSewerViewModelCommand}" CommandParameter="{x:Static nav:ESewerWindowViewType.SewerStammdaten}" Margin="20" />
|
<RadioButton Content="Stammdaten" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentSewerViewModelCommand}" CommandParameter="{x:Static nav:ESewerWindowViewType.SewerStammdaten}" Margin="20" />
|
||||||
<RadioButton Content="Schäden" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentSewerViewModelCommand}" CommandParameter="{x:Static nav:ESewerWindowViewType.SewerDamageList}" Margin="20" />
|
<RadioButton Content="Schäden" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentSewerViewModelCommand}" CommandParameter="{x:Static nav:ESewerWindowViewType.SewerDamageList}" Margin="20" />
|
||||||
<RadioButton Content="Schließen" Style="{StaticResource ToggleButtonList}" Command="{Binding CloseCommand}" Margin="20" />
|
<RadioButton Content="Schließen" Style="{StaticResource ToggleButtonList}" Command="{Binding CloseCommand}" Margin="20" />
|
||||||
|
<RadioButton Content="{Binding Schaden}" Style="{StaticResource ToggleButtonList}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
25
DaSaSo.Wpf/Converters/EqualDamageTypeToBooleanConverter.cs
Normal file
25
DaSaSo.Wpf/Converters/EqualDamageTypeToBooleanConverter.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using DaSaSo.Domain.Model;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace DaSaSo.Wpf.Converters
|
||||||
|
{
|
||||||
|
class EqualDamageTypeToBooleanConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
return (((int)value & (int)parameter) == (int)value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using DaSaSo.Domain.Model;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Data;
|
||||||
|
|
||||||
|
namespace DaSaSo.Wpf.Converters
|
||||||
|
{
|
||||||
|
class EqualPreperationTypeToBooleanConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
EPreparationType damagevalue = (EPreparationType)value;
|
||||||
|
EPreparationType damageParameter = (EPreparationType)parameter;
|
||||||
|
return damagevalue.HasFlag(damageParameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,8 @@ namespace DaSaSo.Wpf.HostBuilders
|
|||||||
services.AddTransient<MainWindowViewModel>();
|
services.AddTransient<MainWindowViewModel>();
|
||||||
services.AddSingleton<ClientListViewModel>();
|
services.AddSingleton<ClientListViewModel>();
|
||||||
|
|
||||||
|
services.AddTransient<SewerMainListViewModel>();
|
||||||
|
|
||||||
services.AddSingleton<CreateViewModel<HomeViewModel>>(services =>
|
services.AddSingleton<CreateViewModel<HomeViewModel>>(services =>
|
||||||
{
|
{
|
||||||
return () => new HomeViewModel();
|
return () => new HomeViewModel();
|
||||||
@@ -57,7 +59,10 @@ namespace DaSaSo.Wpf.HostBuilders
|
|||||||
{
|
{
|
||||||
return () => new SewerDamageListViewModel(
|
return () => new SewerDamageListViewModel(
|
||||||
services.GetRequiredService<IActualProject>(),
|
services.GetRequiredService<IActualProject>(),
|
||||||
services.GetRequiredService<IDataService<SewerObject>>());
|
services.GetRequiredService<IDataService<SewerObject>>()//,
|
||||||
|
//services.GetRequiredService<SewerMainListViewModel>()
|
||||||
|
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
services.AddSingleton<CreateViewModel<ClientListViewModel>>(services =>
|
services.AddSingleton<CreateViewModel<ClientListViewModel>>(services =>
|
||||||
|
|||||||
25
DaSaSo.Wpf/Sampledata/SewerDamageListSampleData.cs
Normal file
25
DaSaSo.Wpf/Sampledata/SewerDamageListSampleData.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using DaSaSo.Domain.Model;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DaSaSo.Wpf.Sampledata
|
||||||
|
{
|
||||||
|
public class SewerDamageListSampleData
|
||||||
|
{
|
||||||
|
public ObservableCollection<SewerDamage> Damages { get; private set; } = new ObservableCollection<SewerDamage>();
|
||||||
|
public SewerDamageListSampleData()
|
||||||
|
{
|
||||||
|
Damages.Add(new SewerDamage()
|
||||||
|
{
|
||||||
|
DamageType = EDamageType.Bruch | EDamageType.EinrageneStutzen,
|
||||||
|
PreparationType = EPreparationType.CleanedHD | EPreparationType.CleanedRoborter,
|
||||||
|
Distance = 12.5m
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,35 @@
|
|||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:DaSaSo.Wpf.View.SewerObject" xmlns:viewmodel="clr-namespace:DaSaSo.ViewModel;assembly=DaSaSo.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel:SewerDamageListViewModel}"
|
xmlns:sd="clr-namespace:DaSaSo.Wpf.Sampledata"
|
||||||
mc:Ignorable="d"
|
xmlns:damagetype ="clr-namespace:DaSaSo.Domain.Model;assembly=DaSaSo.Domain"
|
||||||
d:DesignHeight="450" d:DesignWidth="800">
|
xmlns:local="clr-namespace:DaSaSo.Wpf.View.SewerObject" xmlns:viewmodel="clr-namespace:DaSaSo.ViewModel;assembly=DaSaSo.ViewModel"
|
||||||
|
xmlns:converters="clr-namespace:DaSaSo.Wpf.Converters"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
d:DesignHeight="450" d:DesignWidth="1020">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<converters:EqualDamageTypeToBooleanConverter x:Key="EqualDamageTypeToBooleanConverter" />
|
||||||
|
<converters:EqualPreperationTypeToBooleanConverter x:Key="EqualPreperationTypeToBooleanConverter" />
|
||||||
|
</UserControl.Resources>
|
||||||
|
<d:UserControl.DataContext>
|
||||||
|
<sd:SewerDamageListSampleData />
|
||||||
|
</d:UserControl.DataContext>
|
||||||
<Grid>
|
<Grid>
|
||||||
<DataGrid ItemsSource="{Binding Damages}" />
|
<DataGrid ItemsSource="{Binding Damages}" AutoGenerateColumns="False" IsReadOnly="True" SelectedItem="{Binding SelectedDamage}">
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn Header="Entfernung" Binding="{Binding Distance}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Statik (Riss / Bruch / Scherbe)" Binding="{Binding DamageType, Converter={StaticResource EqualDamageTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EDamageType.Static}}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Betrieb (Wurzeln / Inkrustation / Ablagerungen)" Binding="{Binding DamageType, Converter={StaticResource EqualDamageTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EDamageType.Betrieb}}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Sonstiges (Infiltration / Einragene Stutzen)" Binding="{Binding DamageType, Converter={StaticResource EqualDamageTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EDamageType.Other}}" />
|
||||||
|
|
||||||
|
|
||||||
|
<DataGridCheckBoxColumn Header="HD Reinigung" Binding="{Binding PreparationType, Converter={StaticResource EqualPreperationTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EPreparationType.CleanedHD}}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Mechanisch gereinigt" Binding="{Binding PreparationType, Converter={StaticResource EqualPreperationTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EPreparationType.CleanedMechanisch}}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Roboter" Binding="{Binding PreparationType, Converter={StaticResource EqualPreperationTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EPreparationType.CleanedRoborter}}" />
|
||||||
|
<DataGridCheckBoxColumn Header="Fäkalienfrei" Binding="{Binding PreparationType, Converter={StaticResource EqualPreperationTypeToBooleanConverter}, ConverterParameter={x:Static damagetype:EPreparationType.FaekalienFrei}}" />
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"databaseToUse": "sqlite",
|
"databaseToUse": "default",
|
||||||
"default": "Host = localhost; Database = dasaso; Username = kansan; Password = kansan",
|
"default": "Host = localhost; Database = dasaso; Username = kansan; Password = kansan",
|
||||||
"sqlite": "Data Source=database.db"
|
"sqlite": "Data Source=database.db"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user