[#4] MemberAdminWindow: Add more input fields for email addresses
This commit is contained in:
@ -2,8 +2,6 @@
|
|||||||
x:Class="Elwig.Windows.MemberAdminWindow"
|
x:Class="Elwig.Windows.MemberAdminWindow"
|
||||||
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:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:local="clr-namespace:Elwig.Windows"
|
xmlns:local="clr-namespace:Elwig.Windows"
|
||||||
Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150"
|
Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150"
|
||||||
Loaded="Window_Loaded">
|
Loaded="Window_Loaded">
|
||||||
@ -239,14 +237,42 @@
|
|||||||
<ColumnDefinition Width="2*"/>
|
<ColumnDefinition Width="2*"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Label Content="E-Mail-Adresse (1):" Margin="10,10,0,0" Grid.Column="0"/>
|
<Label x:Name="EmailAddress1Label" Content="E-Mail-Adresse:" Margin="10,10,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="EmailAddress1Input" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
<TextBox x:Name="EmailAddress1Input" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
<Label Content="E-Mail-Adresse (2):" Margin="10,40,0,0" Grid.Column="0"/>
|
<Label x:Name="EmailAddress2Label" Content="E-Mail-Adresse:" Margin="10,40,0,0" Grid.Column="0"/>
|
||||||
<TextBox x:Name="EmailAddress2Input" Margin="0,40,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
<TextBox x:Name="EmailAddress2Input" Margin="0,40,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress3Label" Content="E-Mail-Adresse:" Margin="10,70,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress3Input" Margin="0,70,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress4Label" Content="E-Mail-Adresse:" Margin="10,100,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress4Input" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress5Label" Content="E-Mail-Adresse:" Margin="10,130,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress5Input" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress6Label" Content="E-Mail-Adresse:" Margin="10,160,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress6Input" Margin="0,160,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress7Label" Content="E-Mail-Adresse:" Margin="10,190,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress7Input" Margin="0,190,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress8Label" Content="E-Mail-Adresse:" Margin="10,210,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress8Input" Margin="0,210,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
|
<Label x:Name="EmailAddress9Label" Content="E-Mail-Adresse:" Margin="10,250,0,0" Grid.Column="0"/>
|
||||||
|
<TextBox x:Name="EmailAddress9Input" Margin="0,250,10,0" Grid.Column="1" Grid.ColumnSpan="2"
|
||||||
|
TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
|
||||||
|
|
||||||
<ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
|
<ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
|
||||||
<TextBox x:Name="PhoneNr1Input" Margin="0,70,5,0" Grid.Column="1"
|
<TextBox x:Name="PhoneNr1Input" Margin="0,70,5,0" Grid.Column="1"
|
||||||
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
|
||||||
|
@ -17,7 +17,8 @@ namespace Elwig.Windows {
|
|||||||
public partial class MemberAdminWindow : AdministrationWindow {
|
public partial class MemberAdminWindow : AdministrationWindow {
|
||||||
|
|
||||||
private List<string> TextFilter = [];
|
private List<string> TextFilter = [];
|
||||||
private readonly (ComboBox, TextBox, TextBox)[] PhoneNrInputs;
|
private readonly (ComboBox Type, TextBox Number, TextBox Comment)[] PhoneNrInputs;
|
||||||
|
private readonly (Label Label, TextBox Address)[] EmailAddressInputs;
|
||||||
|
|
||||||
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(MemberAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
|
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(MemberAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
|
||||||
private readonly RoutedCommand CtrlP = new("CtrlP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control)]);
|
private readonly RoutedCommand CtrlP = new("CtrlP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control)]);
|
||||||
@ -38,6 +39,17 @@ namespace Elwig.Windows {
|
|||||||
AddressInput, PlzInput, OrtInput, BillingOrtInput,
|
AddressInput, PlzInput, OrtInput, BillingOrtInput,
|
||||||
BusinessSharesInput, BranchInput, DefaultKgInput
|
BusinessSharesInput, BranchInput, DefaultKgInput
|
||||||
];
|
];
|
||||||
|
EmailAddressInputs = [
|
||||||
|
(EmailAddress1Label, EmailAddress1Input),
|
||||||
|
(EmailAddress2Label, EmailAddress2Input),
|
||||||
|
(EmailAddress3Label, EmailAddress3Input),
|
||||||
|
(EmailAddress4Label, EmailAddress4Input),
|
||||||
|
(EmailAddress5Label, EmailAddress5Input),
|
||||||
|
(EmailAddress6Label, EmailAddress6Input),
|
||||||
|
(EmailAddress7Label, EmailAddress7Input),
|
||||||
|
(EmailAddress8Label, EmailAddress8Input),
|
||||||
|
(EmailAddress9Label, EmailAddress9Input),
|
||||||
|
];
|
||||||
PhoneNrInputs = [
|
PhoneNrInputs = [
|
||||||
(PhoneNr1TypeInput, PhoneNr1Input, PhoneNr1CommentInput),
|
(PhoneNr1TypeInput, PhoneNr1Input, PhoneNr1CommentInput),
|
||||||
(PhoneNr2TypeInput, PhoneNr2Input, PhoneNr2CommentInput),
|
(PhoneNr2TypeInput, PhoneNr2Input, PhoneNr2CommentInput),
|
||||||
@ -63,7 +75,7 @@ namespace Elwig.Windows {
|
|||||||
Menu_Print_MemberDataSheet.IsEnabled = App.IsPrintingReady;
|
Menu_Print_MemberDataSheet.IsEnabled = App.IsPrintingReady;
|
||||||
|
|
||||||
ActiveMemberInput.IsChecked = true;
|
ActiveMemberInput.IsChecked = true;
|
||||||
UpdatePhoneNrInputVisibility();
|
UpdateContactInfoVisibility();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,27 +248,55 @@ namespace Elwig.Windows {
|
|||||||
|
|
||||||
private void SetPhoneNrInput(int nr, string? type, string? number, string? comment) {
|
private void SetPhoneNrInput(int nr, string? type, string? number, string? comment) {
|
||||||
var inputs = PhoneNrInputs[nr];
|
var inputs = PhoneNrInputs[nr];
|
||||||
inputs.Item1.SelectedItem = (type == null) ? null : inputs.Item1.ItemsSource.Cast<KeyValuePair<string, string>>().FirstOrDefault(p => p.Key == type);
|
inputs.Type.SelectedItem = (type == null) ? null : inputs.Type.ItemsSource.Cast<KeyValuePair<string, string>>().FirstOrDefault(p => p.Key == type);
|
||||||
inputs.Item2.Text = number;
|
inputs.Number.Text = number;
|
||||||
inputs.Item3.Text = comment;
|
inputs.Comment.Text = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetEmailAddressInput(int nr, string? address) {
|
||||||
|
var inputs = EmailAddressInputs[nr];
|
||||||
|
inputs.Address.Text = address;
|
||||||
}
|
}
|
||||||
|
|
||||||
private (string, string, string?)? GetPhoneNrInput(int nr) {
|
private (string, string, string?)? GetPhoneNrInput(int nr) {
|
||||||
var inputs = PhoneNrInputs[nr];
|
var inputs = PhoneNrInputs[nr];
|
||||||
var number = inputs.Item2.Text;
|
var number = inputs.Number.Text;
|
||||||
if (string.IsNullOrEmpty(number))
|
if (string.IsNullOrEmpty(number))
|
||||||
return null;
|
return null;
|
||||||
var type = (inputs.Item1.SelectedItem as KeyValuePair<string, string>?)?.Key ?? (number.StartsWith("+43 ") && number[4] == '6' ? "mobile" : "landline");
|
var type = (inputs.Type.SelectedItem as KeyValuePair<string, string>?)?.Key ?? (number.StartsWith("+43 ") && number[4] == '6' ? "mobile" : "landline");
|
||||||
var comment = inputs.Item3.Text;
|
var comment = inputs.Comment.Text;
|
||||||
return (type, number, comment == "" ? null : comment);
|
return (type, number, comment == "" ? null : comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetPhoneNrInputVisible(int nr, bool visible) {
|
private string? GetEmailAddressInput(int nr) {
|
||||||
|
var inputs = EmailAddressInputs[nr];
|
||||||
|
return inputs.Address.Text == "" ? null : inputs.Address.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetPhoneNrInputVisible(int nr, bool visible, int? position = null) {
|
||||||
var inputs = PhoneNrInputs[nr];
|
var inputs = PhoneNrInputs[nr];
|
||||||
|
if (position is int p) {
|
||||||
|
var mt = 10 + p * 30;
|
||||||
|
inputs.Type.Margin = new(6, mt, 5, 0);
|
||||||
|
inputs.Number.Margin = new(0, mt, 5, 0);
|
||||||
|
inputs.Comment.Margin = new(0, mt, 10, 0);
|
||||||
|
}
|
||||||
var vis = visible ? Visibility.Visible : Visibility.Hidden;
|
var vis = visible ? Visibility.Visible : Visibility.Hidden;
|
||||||
inputs.Item1.Visibility = vis;
|
inputs.Type.Visibility = vis;
|
||||||
inputs.Item2.Visibility = vis;
|
inputs.Number.Visibility = vis;
|
||||||
inputs.Item3.Visibility = vis;
|
inputs.Comment.Visibility = vis;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetEmailAddressInputVisible(int nr, bool visible, int? position = null) {
|
||||||
|
var inputs = EmailAddressInputs[nr];
|
||||||
|
if (position is int p) {
|
||||||
|
var mt = 10 + p * 30;
|
||||||
|
inputs.Label.Margin = new(10, mt, 0, 0);
|
||||||
|
inputs.Address.Margin = new(0, mt, 10, 0);
|
||||||
|
}
|
||||||
|
var vis = visible ? Visibility.Visible : Visibility.Hidden;
|
||||||
|
inputs.Label.Visibility = vis;
|
||||||
|
inputs.Address.Visibility = vis;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
private void MemberList_SelectionChanged(object sender, RoutedEventArgs evt) {
|
||||||
@ -274,7 +314,7 @@ namespace Elwig.Windows {
|
|||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
UnlockInputs();
|
UnlockInputs();
|
||||||
UpdatePhoneNrInputVisibility(true);
|
UpdateContactInfoVisibility(true);
|
||||||
InitInputs();
|
InitInputs();
|
||||||
LockSearchInputs();
|
LockSearchInputs();
|
||||||
}
|
}
|
||||||
@ -289,7 +329,7 @@ namespace Elwig.Windows {
|
|||||||
HideNewEditDeleteButtons();
|
HideNewEditDeleteButtons();
|
||||||
ShowSaveResetCancelButtons();
|
ShowSaveResetCancelButtons();
|
||||||
UnlockInputs();
|
UnlockInputs();
|
||||||
UpdatePhoneNrInputVisibility(true);
|
UpdateContactInfoVisibility(true);
|
||||||
LockSearchInputs();
|
LockSearchInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +355,7 @@ namespace Elwig.Windows {
|
|||||||
HideSaveResetCancelButtons();
|
HideSaveResetCancelButtons();
|
||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
UpdatePhoneNrInputVisibility();
|
UpdateContactInfoVisibility();
|
||||||
UnlockSearchInputs();
|
UnlockSearchInputs();
|
||||||
FinishInputFilling();
|
FinishInputFilling();
|
||||||
await RefreshMemberList();
|
await RefreshMemberList();
|
||||||
@ -342,7 +382,7 @@ namespace Elwig.Windows {
|
|||||||
ShowNewEditDeleteButtons();
|
ShowNewEditDeleteButtons();
|
||||||
RefreshInputs();
|
RefreshInputs();
|
||||||
LockInputs();
|
LockInputs();
|
||||||
UpdatePhoneNrInputVisibility();
|
UpdateContactInfoVisibility();
|
||||||
UnlockSearchInputs();
|
UnlockSearchInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,13 +544,24 @@ namespace Elwig.Windows {
|
|||||||
ActiveMemberInput.IsEnabled = true;
|
ActiveMemberInput.IsEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdatePhoneNrInputVisibility(bool extra = false) {
|
private void UpdateContactInfoVisibility(bool extra = false) {
|
||||||
bool lastVisible = true;
|
var m = MemberList.SelectedItem as Member;
|
||||||
var m = (Member)MemberList.SelectedItem;
|
bool lastVisible;
|
||||||
|
int num = 0;
|
||||||
|
lastVisible = true;
|
||||||
|
for (int i = 0; i < EmailAddressInputs.Length; i++) {
|
||||||
|
var input = EmailAddressInputs[i];
|
||||||
|
var vis = !string.IsNullOrEmpty(input.Address.Text) || (m?.EmailAddresses.Any(a => a.Nr - 1 == i) ?? false);
|
||||||
|
var cVis = vis || (extra && lastVisible);
|
||||||
|
SetEmailAddressInputVisible(i, cVis, cVis ? num++ : null);
|
||||||
|
lastVisible = vis;
|
||||||
|
}
|
||||||
|
lastVisible = true;
|
||||||
for (int i = 0; i < PhoneNrInputs.Length; i++) {
|
for (int i = 0; i < PhoneNrInputs.Length; i++) {
|
||||||
var input = PhoneNrInputs[i];
|
var input = PhoneNrInputs[i];
|
||||||
var vis = !string.IsNullOrEmpty(input.Item2.Text) || (m?.TelephoneNumbers.Any(p => p.Nr - 1 == i) ?? false);
|
var vis = !string.IsNullOrEmpty(input.Number.Text) || (m?.TelephoneNumbers.Any(n => n.Nr - 1 == i) ?? false);
|
||||||
SetPhoneNrInputVisible(i, vis || (extra && lastVisible));
|
var cVis = vis || (extra && lastVisible);
|
||||||
|
SetPhoneNrInputVisible(i, cVis, cVis ? num++ : null);
|
||||||
lastVisible = vis;
|
lastVisible = vis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -605,17 +656,17 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < EmailAddressInputs.Length; i++) {
|
||||||
var input = i == 0 ? EmailAddress1Input : EmailAddress2Input;
|
var input = GetEmailAddressInput(i);
|
||||||
var emailAddr = m.EmailAddresses.FirstOrDefault(a => a.Nr - 1 == i);
|
var emailAddr = m.EmailAddresses.FirstOrDefault(a => a.Nr - 1 == i);
|
||||||
if (input.Text == "") {
|
if (input == null || input == "") {
|
||||||
if (emailAddr != null) {
|
if (emailAddr != null) {
|
||||||
Context.Remove(emailAddr);
|
Context.Remove(emailAddr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MemberEmailAddr a = emailAddr ?? Context.CreateProxy<MemberEmailAddr>();
|
MemberEmailAddr a = emailAddr ?? Context.CreateProxy<MemberEmailAddr>();
|
||||||
a.Nr = i + 1;
|
a.Nr = i + 1;
|
||||||
a.Address = input.Text;
|
a.Address = input ?? "";
|
||||||
a.Comment = null;
|
a.Comment = null;
|
||||||
if (emailAddr == null) {
|
if (emailAddr == null) {
|
||||||
a.MgNr = newMgNr;
|
a.MgNr = newMgNr;
|
||||||
@ -678,8 +729,14 @@ namespace Elwig.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var emailAddrs = m.EmailAddresses.OrderBy(a => a.Nr).ToList();
|
var emailAddrs = m.EmailAddresses.OrderBy(a => a.Nr).ToList();
|
||||||
EmailAddress1Input.Text = emailAddrs.Count > 0 ? emailAddrs[0].Address : "";
|
for (int i = 0; i< EmailAddressInputs.Length; i++) {
|
||||||
EmailAddress2Input.Text = emailAddrs.Count > 1 ? emailAddrs[1].Address : "";
|
if (i < emailAddrs.Count) {
|
||||||
|
var emailAddr = emailAddrs[i];
|
||||||
|
SetEmailAddressInput(i, emailAddr.Address);
|
||||||
|
} else {
|
||||||
|
SetEmailAddressInput(i, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var phoneNrs = m.TelephoneNumbers.OrderBy(p => p.Nr).ToList();
|
var phoneNrs = m.TelephoneNumbers.OrderBy(p => p.Nr).ToList();
|
||||||
for (int i = 0; i < PhoneNrInputs.Length; i++) {
|
for (int i = 0; i < PhoneNrInputs.Length; i++) {
|
||||||
@ -690,7 +747,7 @@ namespace Elwig.Windows {
|
|||||||
SetPhoneNrInput(i, null, null, null);
|
SetPhoneNrInput(i, null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UpdatePhoneNrInputVisibility(IsEditing || IsCreating);
|
UpdateContactInfoVisibility(IsEditing || IsCreating);
|
||||||
|
|
||||||
IbanInput.Text = m.Iban;
|
IbanInput.Text = m.Iban;
|
||||||
BicInput.Text = m.Bic;
|
BicInput.Text = m.Bic;
|
||||||
@ -786,9 +843,14 @@ namespace Elwig.Windows {
|
|||||||
InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr);
|
InputLostFocus((TextBox)sender, Validator.CheckPredecessorMgNr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private new void EmailAddressInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
|
base.EmailAddressInput_TextChanged(sender, evt);
|
||||||
|
UpdateContactInfoVisibility(IsEditing || IsCreating);
|
||||||
|
}
|
||||||
|
|
||||||
private new void PhoneNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
private new void PhoneNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
|
||||||
base.PhoneNrInput_TextChanged(sender, evt);
|
base.PhoneNrInput_TextChanged(sender, evt);
|
||||||
UpdatePhoneNrInputVisibility(IsEditing || IsCreating);
|
UpdateContactInfoVisibility(IsEditing || IsCreating);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void KgDetailsButton_Click(object sender, RoutedEventArgs evt) {
|
private void KgDetailsButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
Reference in New Issue
Block a user