Dynamische HomeViewPanels
This commit is contained in:
@@ -6784,6 +6784,10 @@ namespace BeWo.ServiceProxy
|
||||
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IReportService/SendTimeSheetMail", ReplyAction="http://tempuri.org/IReportService/SendTimeSheetMailResponse")]
|
||||
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IReportService/SendTimeSheetMailBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
|
||||
string SendTimeSheetMail(BS.Shared.DataContracts.TimeSheetStatusItemDC item, bool saveMailToDatabase);
|
||||
|
||||
[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IReportService/CreateCustomReport", ReplyAction="http://tempuri.org/IReportService/CreateCustomReportResponse")]
|
||||
[System.ServiceModel.FaultContractAttribute(typeof(BeWo.ServiceProxy.BeWoFault), Action="http://tempuri.org/IReportService/CreateCustomReportBeWoFaultFault", Name="BeWoFault", Namespace="http://schemas.datacontract.org/2004/07/BeWo.Service.ServiceContracts")]
|
||||
System.IO.MemoryStream CreateCustomReport(long employeeOid, string reportName);
|
||||
}
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
|
||||
@@ -6854,6 +6858,11 @@ namespace BeWo.ServiceProxy
|
||||
{
|
||||
return base.Channel.SendTimeSheetMail(item, saveMailToDatabase);
|
||||
}
|
||||
|
||||
public System.IO.MemoryStream CreateCustomReport(long employeeOid, string reportName)
|
||||
{
|
||||
return base.Channel.CreateCustomReport(employeeOid, reportName);
|
||||
}
|
||||
}
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
xmlns:viewModel="clr-namespace:BeWo.Scheduler.ViewModel"
|
||||
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
|
||||
xmlns:security="clr-namespace:BeWo.Security"
|
||||
xmlns:dxp="http://schemas.devexpress.com/winfx/2008/xaml/printing"
|
||||
xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
|
||||
xmlns:dxpbars="http://schemas.devexpress.com/winfx/2008/xaml/printing/bars"
|
||||
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Focusable="True">
|
||||
|
||||
<localView:BeWoView.Resources>
|
||||
@@ -57,6 +60,45 @@
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<blc:DragDockPanel x:Key="PanelReport">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\ChartBarDisabled.png" Stretch="Fill" StretchDirection="Both" />
|
||||
<TextBlock Text="Report" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
<dxp:DocumentPreviewControl CommandBarStyle="Bars">
|
||||
<dxp:DocumentPreviewControl.CommandProvider>
|
||||
<dxp:DocumentCommandProvider>
|
||||
<dxp:DocumentCommandProvider.Actions>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.ExportCsv}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.ExportMht}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.ExportTxt}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Open}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.DocumentMap}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Watermark}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Scale}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.PrintDirect}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.PageSetup}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Save}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Send}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Parameters}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.Thumbnails}"/>
|
||||
<dxb:RemoveAction ElementName="{x:Static dxpbars:DefaultPreviewBarItemNames.EditingFields}"/>
|
||||
</dxp:DocumentCommandProvider.Actions>
|
||||
</dxp:DocumentCommandProvider>
|
||||
</dxp:DocumentPreviewControl.CommandProvider>
|
||||
|
||||
</dxp:DocumentPreviewControl>
|
||||
</Grid>
|
||||
</blc:DragDockPanel>
|
||||
</localView:BeWoView.Resources>
|
||||
|
||||
|
||||
@@ -102,12 +144,12 @@
|
||||
<TextBlock x:Name="txtLastLoginTime" Text="Zuletzt angemeldet am: 08.01.2009 12:53" TextWrapping="Wrap" />
|
||||
</StackPanel>
|
||||
|
||||
<blc:DragDockPanelHost x:Name="panelHost" Grid.Row="1">
|
||||
<blc:DragDockPanel x:Name="Tasks">
|
||||
<blc:DragDockPanelHost x:Name="PanelHost" Grid.Row="1">
|
||||
<blc:DragDockPanel x:Name="PanelTasks">
|
||||
<blc:DragDockPanel.Header>
|
||||
<DockPanel>
|
||||
<Image Source="..\Ressources\Icons\AlertsDisabled.png" />
|
||||
<TextBlock Text="{t:Translate Aufgaben}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate Aufgaben}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
<TextBlock x:Name="RequestsTextBlock" VerticalAlignment="Center" HorizontalAlignment="Center">
|
||||
<Hyperlink RequestNavigate="ShowAppointmentRequests" NavigateUri="#" x:Name="RequestsHyperlink" Foreground="CornflowerBlue">
|
||||
<TextBlock x:Name="RequestsHyperLinkTextBlock" Foreground="CornflowerBlue" />
|
||||
@@ -287,11 +329,11 @@
|
||||
</Grid>
|
||||
</blc:DragDockPanel>
|
||||
|
||||
<blc:DragDockPanel x:Name="ExpiringSupportConcepts">
|
||||
<blc:DragDockPanel x:Name="PanelExpiringSupportConcepts">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\Light Bulb.png" Stretch="Fill" StretchDirection="Both" />
|
||||
<TextBlock Text="{t:Translate Hinweise}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate Hinweise}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<Grid>
|
||||
@@ -364,11 +406,11 @@
|
||||
</Grid>
|
||||
</blc:DragDockPanel>
|
||||
|
||||
<blc:DragDockPanel x:Name="ConferenceDates">
|
||||
<blc:DragDockPanel x:Name="PanelConferenceDates">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\Alarm.png" Stretch="Fill" StretchDirection="Both"></Image>
|
||||
<TextBlock Text="{t:Translate Hilfeplankonferenzen}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate Hilfeplankonferenzen}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<Grid>
|
||||
@@ -438,11 +480,11 @@
|
||||
</Grid>
|
||||
</blc:DragDockPanel>
|
||||
|
||||
<blc:DragDockPanel x:Name="Birthdates">
|
||||
<blc:DragDockPanel x:Name="PanelBirthdates">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\Calendar 1.png" Stretch="Fill" StretchDirection="Both" />
|
||||
<TextBlock Text="{t:Translate Geburtstage}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate Geburtstage}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<Grid>
|
||||
@@ -501,11 +543,11 @@
|
||||
</Grid>
|
||||
</blc:DragDockPanel>
|
||||
|
||||
<blc:DragDockPanel x:Name="InternalNews">
|
||||
<blc:DragDockPanel x:Name="PanelInternalNews">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\AlertsDisabled.png" Stretch="Fill" StretchDirection="Both" />
|
||||
<TextBlock Text="{t:Translate Ankündigungen}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate Ankündigungen}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||
@@ -521,11 +563,11 @@
|
||||
</ScrollViewer>
|
||||
</blc:DragDockPanel>
|
||||
|
||||
<blc:DragDockPanel x:Name="BeWoNews">
|
||||
<blc:DragDockPanel x:Name="PanelBeWoNews">
|
||||
<blc:DragDockPanel.Header>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image Source="..\Ressources\Icons\RSS Newsfeed.png" Stretch="Fill" StretchDirection="Both" />
|
||||
<TextBlock Text="{t:Translate BeWoPlaner News}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" />
|
||||
<TextBlock Text="{t:Translate BeWoPlaner News}" TextWrapping="Wrap" FontSize="16" Foreground="#E0E0E0" VerticalAlignment="Bottom" Margin="5,0,0,5" Tag="Titel"/>
|
||||
</StackPanel>
|
||||
</blc:DragDockPanel.Header>
|
||||
<Grid>
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
@@ -31,12 +32,18 @@ using BS.Shared.DataContracts.Compact;
|
||||
using BS.Shared.Extensions;
|
||||
using BS.Shared.RSS;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Markup;
|
||||
using System.Xml;
|
||||
using BeWo.Annotations;
|
||||
using BeWo.ownChat;
|
||||
using BeWo.Scheduler.Utils;
|
||||
using BeWo.Scheduler.View;
|
||||
using BeWo.View.Master;
|
||||
using ChatController.HauptKlassen;
|
||||
using DevExpress.Data.Helpers;
|
||||
using DevExpress.Xpf.Docking.VisualElements;
|
||||
using DevExpress.Xpf.DocumentViewer;
|
||||
using DevExpress.Xpf.Printing;
|
||||
using DevExpress.XtraScheduler;
|
||||
using DevExpress.XtraScheduler.Xml;
|
||||
using Brushes = System.Windows.Media.Brushes;
|
||||
@@ -56,7 +63,7 @@ namespace BeWo.View
|
||||
public partial class HomeView : BeWoView, INotifyPropertyChanged
|
||||
{
|
||||
#region Constant Fields
|
||||
|
||||
|
||||
private const int Datebuffer = 14;
|
||||
|
||||
#endregion
|
||||
@@ -78,7 +85,7 @@ namespace BeWo.View
|
||||
private bool _IsAllowedToSeeMitarbeitertermine;
|
||||
private bool _IsShowingAppointments;
|
||||
private bool _HasRightsToSeeAppointments;
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@@ -89,17 +96,14 @@ namespace BeWo.View
|
||||
|
||||
DataContext = this;
|
||||
|
||||
txtHeader.Text = String.Format("{0} {1}", BeWoApp.LoggedOnUser.Employee.FirstName, BeWoApp.LoggedOnUser.Employee.LastName);
|
||||
|
||||
txtHeader.Text = $"{BeWoApp.LoggedOnUser.Employee.FirstName} {BeWoApp.LoggedOnUser.Employee.LastName}";
|
||||
txtVersion.Text = BeWoApp.Version;
|
||||
|
||||
txtLoginTime.Text = string.Empty;
|
||||
txtLastLoginTime.Text = string.Empty;
|
||||
|
||||
PasswortSchloss.Text = string.Join("", (from Match m in Regex.Matches("D83DDD12", @"\S{4}") select (char)int.Parse(m.Value, NumberStyles.HexNumber)).ToArray());
|
||||
|
||||
//PreparePanels();
|
||||
InitPanels(null);
|
||||
|
||||
|
||||
HyperlinkZuPasswortsicherheit.NavigateUri = new Uri("http://news.bewoplaner.de/?NewsType=3&NewsCount=1&NewsOID=373457455");
|
||||
|
||||
@@ -147,6 +151,8 @@ namespace BeWo.View
|
||||
BewoChat.Visibility = PropertyChatBerechtigung ? Visibility.Visible : Visibility.Hidden;
|
||||
|
||||
PruefePasswortStaerke();
|
||||
|
||||
ServiceFacade.DoOperationsServiceAsync(s => s.GetHomeViewPanels(), r => Dispatcher?.Invoke(() => UpdatePanels(r)));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -169,7 +175,7 @@ namespace BeWo.View
|
||||
|
||||
private void HomeDragPanelViewLoaded(object o, RoutedEventArgs e)
|
||||
{
|
||||
InitContent();
|
||||
|
||||
//Warum klappt das bei Köln Ring nicht?=
|
||||
if (BeWoApp.LoggedOnUser == null || BeWoApp.LoggedOnUser.ResetPasswordInfos == null)
|
||||
{
|
||||
@@ -303,7 +309,7 @@ namespace BeWo.View
|
||||
{
|
||||
Process.Start(new ProcessStartInfo((sender as Hyperlink).NavigateUri.ToString()));
|
||||
}
|
||||
|
||||
|
||||
private void PasswortAendernLinkOnRequestNavigate(object sender, RequestNavigateEventArgs e)
|
||||
{
|
||||
var pav = new PasswortAenderungsView();
|
||||
@@ -314,7 +320,7 @@ namespace BeWo.View
|
||||
{
|
||||
Process.Start(new ProcessStartInfo((sender as Hyperlink)?.NavigateUri.ToString()));
|
||||
}
|
||||
|
||||
|
||||
private void BtnCreateNewsItem_OnClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
TeamNewsItemVM teamVm = ((Button)sender).Tag as TeamNewsItemVM;
|
||||
@@ -595,7 +601,7 @@ namespace BeWo.View
|
||||
|
||||
var result = new List<DependencyObject>();
|
||||
|
||||
foreach (var item in panelHost.Children)
|
||||
foreach (var item in PanelHost.Children)
|
||||
{
|
||||
var p = item as DragDockPanel;
|
||||
|
||||
@@ -680,50 +686,46 @@ namespace BeWo.View
|
||||
|
||||
private void PruefePasswortStaerke()
|
||||
{
|
||||
if (BeWoApp.PasswortStrength == PasswortSecurityStrength.SehrSchwach)
|
||||
switch (BeWoApp.PasswortStrength)
|
||||
{
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Red);
|
||||
case PasswortSecurityStrength.SehrSchwach:
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Red);
|
||||
|
||||
this.Dispatcher.BeginInvoke(
|
||||
DispatcherPriority.Normal,
|
||||
(Action)delegate
|
||||
{
|
||||
if (BeWoApp.AppSettings.IsPasswordSecurityActiv)
|
||||
{
|
||||
MessageBox.Show("Sie benutzen ein sehr schwaches Passwort.\nBitte ändern Sie Ihr Passwort, indem Sie im Startbildschirm oben auf \"Passwort ändern\" klicken.", "Achtung!",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
});
|
||||
this.Dispatcher.BeginInvoke(
|
||||
DispatcherPriority.Normal,
|
||||
(Action)delegate
|
||||
{
|
||||
if (BeWoApp.AppSettings.IsPasswordSecurityActiv)
|
||||
{
|
||||
MessageBox.Show("Sie benutzen ein sehr schwaches Passwort.\nBitte ändern Sie Ihr Passwort, indem Sie im Startbildschirm oben auf \"Passwort ändern\" klicken.", "Achtung!",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case PasswortSecurityStrength.Schwach:
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.OrangeRed);
|
||||
|
||||
this.Dispatcher.BeginInvoke(
|
||||
DispatcherPriority.Normal,
|
||||
(Action)delegate
|
||||
{
|
||||
if (BeWoApp.AppSettings.IsPasswordSecurityActiv)
|
||||
{
|
||||
MessageBox.Show("Sie benutzen ein schwaches Passwort.\nBitte ändern Sie Ihr Passwort, indem Sie im Startbildschirm oben auf \"Passwort ändern\" klicken.", "Achtung!",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case PasswortSecurityStrength.Mittelmass:
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Yellow);
|
||||
break;
|
||||
case PasswortSecurityStrength.Stark:
|
||||
case PasswortSecurityStrength.SehrStark:
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Green);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
else if (BeWoApp.PasswortStrength == PasswortSecurityStrength.Schwach)
|
||||
{
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.OrangeRed);
|
||||
|
||||
this.Dispatcher.BeginInvoke(
|
||||
DispatcherPriority.Normal,
|
||||
(Action)delegate
|
||||
{
|
||||
if (BeWoApp.AppSettings.IsPasswordSecurityActiv)
|
||||
{
|
||||
MessageBox.Show("Sie benutzen ein schwaches Passwort.\nBitte ändern Sie Ihr Passwort, indem Sie im Startbildschirm oben auf \"Passwort ändern\" klicken.", "Achtung!",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (BeWoApp.PasswortStrength == PasswortSecurityStrength.Mittelmass)
|
||||
{
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Yellow);
|
||||
}
|
||||
else if (BeWoApp.PasswortStrength == PasswortSecurityStrength.Stark)
|
||||
{
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Green);
|
||||
}
|
||||
else if (BeWoApp.PasswortStrength == PasswortSecurityStrength.SehrStark)
|
||||
{
|
||||
PasswortSchloss.Foreground = new SolidColorBrush(Colors.Green);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void InitPanelsCallback(IList<UiElementDC> elements, object state)
|
||||
@@ -743,6 +745,8 @@ namespace BeWo.View
|
||||
InternalNewsGrid.Children.Clear();
|
||||
|
||||
ReorderPanels();
|
||||
|
||||
InitContent();
|
||||
}
|
||||
|
||||
private void InitBewoNews()
|
||||
@@ -771,17 +775,18 @@ namespace BeWo.View
|
||||
|
||||
private void InitContent()
|
||||
{
|
||||
SetMaximizedPanel();
|
||||
|
||||
InitLoginInfo();
|
||||
|
||||
|
||||
|
||||
InitExpiredSupportConcepts();
|
||||
InitNextConferenceDates();
|
||||
InitBewoNews();
|
||||
InitBirthdays();
|
||||
|
||||
rb_open.IsChecked = true;
|
||||
UpdateInternalNews();
|
||||
InitTasks();
|
||||
|
||||
rb_open.IsChecked = true;
|
||||
}
|
||||
|
||||
private void InitExpiredSupportConcepts()
|
||||
@@ -794,6 +799,81 @@ namespace BeWo.View
|
||||
ReloadExpiringSupportConcepts);
|
||||
}
|
||||
|
||||
private void InitLoginInfo()
|
||||
{
|
||||
DateTime endOfWeek = DateTime.Now.GetNext(DayOfWeek.Sunday).Date;
|
||||
|
||||
ServiceFacade.DoAnalysisServiceAsync(s1 => s1.GetLastLogins(BeWoApp.LoggedOnUser.LoginName), ReloadLogins);
|
||||
}
|
||||
|
||||
private void InitNextConferenceDates()
|
||||
{
|
||||
DateTime endOfWeek = DateTime.Now.GetNext(DayOfWeek.Sunday).Date;
|
||||
DateTime endOfWeek2 = endOfWeek.AddDays(8);
|
||||
|
||||
ServiceFacade.DoAnalysisServiceAsync(
|
||||
s1 => s1.GetSupportConceptsWithConferenceDate(BeWoApp.LoggedOnUser.Employee.EmployeeOid, endOfWeek2),
|
||||
ReloadConferenceDates);
|
||||
}
|
||||
|
||||
private void InitTasks()
|
||||
{
|
||||
var test = 0;
|
||||
|
||||
while (BeWoApp.LoggedOnEmployee == null && test < 50)
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
test++;
|
||||
}
|
||||
|
||||
if (BeWoApp.LoggedOnEmployee != null)
|
||||
{
|
||||
var rights = new List<UserRightType> { UserRightType.KalenderAnsehen };
|
||||
|
||||
_HasRightsToSeeAppointments = BeWoUtils.HasRight(UserRightType.KalenderAnsehen) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
|
||||
var r2 = rights;
|
||||
r2.Add(UserRightType.KalenderMitarbeitertermineAnsehen);
|
||||
|
||||
var r3 = rights;
|
||||
r3.Add(UserRightType.KalenderKliententermineAlleAnsehen);
|
||||
|
||||
var r5 = rights;
|
||||
r5.Add(UserRightType.KalenderRessourcentermineAnsehen);
|
||||
|
||||
_IsAllowedToSeeMitarbeitertermine = r2.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
_IsAllowedToSeeCustomerAppointments = r3.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
_IsAllowedToSeeResourceAppointments = r5.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
|
||||
if (_HasRightsToSeeAppointments && _IsAllowedToSeeMitarbeitertermine)
|
||||
{
|
||||
#if DEBUG
|
||||
TestTermineAnlegenButton.Visibility = Visibility.Visible;
|
||||
TestTermineLoeschenButton.Visibility = Visibility.Visible;
|
||||
#endif
|
||||
|
||||
employeeFilterBox.Visibility = Visibility.Visible;
|
||||
|
||||
ServiceFacade.DoEmployeeServiceAsync(s => s.GetAllActiveEmployeesCompact(), cb =>
|
||||
{
|
||||
this.Dispatch(delegate
|
||||
{
|
||||
EmployeesForAppointmentView = cb.OrderBy(o => o.LastName + ", " + o.FirstName).ToList();
|
||||
employeeFilterBox.SelectedItem = BeWoApp.CompactLoggedOnEmployee;
|
||||
});
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
EmployeesForAppointmentView = new List<CompactEmployeeDC> { BeWoApp.CompactLoggedOnEmployee };
|
||||
employeeFilterBox.SelectedItem = BeWoApp.CompactLoggedOnEmployee;
|
||||
}
|
||||
|
||||
ShowAppointments(false);
|
||||
LoadTasksAndAppointments(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateInternalNews()
|
||||
{
|
||||
if (InternalNewsGrid != null)
|
||||
@@ -845,6 +925,155 @@ namespace BeWo.View
|
||||
RefreshInternalNews);
|
||||
}
|
||||
|
||||
private void UpdatePanels(List<HomeViewPanelDC> panels)
|
||||
{
|
||||
if (panels == null || panels.Count == 0) return;
|
||||
|
||||
PanelHost.Children.Clear();
|
||||
|
||||
var dict = new Dictionary<HomeViewPanelType, DragDockPanel>()
|
||||
{
|
||||
{HomeViewPanelType.BeWoNewsPanel, PanelBeWoNews},
|
||||
{HomeViewPanelType.BirthdatesPanel, PanelBirthdates},
|
||||
{HomeViewPanelType.ConferenceDatesPanel, PanelConferenceDates},
|
||||
{HomeViewPanelType.ExpiringSupportConceptsPanel, PanelExpiringSupportConcepts},
|
||||
{HomeViewPanelType.InternalNewsPanel, PanelInternalNews},
|
||||
{HomeViewPanelType.TasksPanel, PanelTasks}
|
||||
};
|
||||
|
||||
|
||||
//panels.Add(new HomeViewPanelDC { HeaderTitel = "TestTask", PanelType = HomeViewPanelType.TasksPanel });
|
||||
//panels.Add(new HomeViewPanelDC { HeaderTitel = "TestNews", PanelType = HomeViewPanelType.BeWoNewsPanel });
|
||||
//panels.Add(new HomeViewPanelDC { HeaderTitel = "TestDates", PanelType = HomeViewPanelType.ExpiringSupportConceptsPanel });
|
||||
//panels.Add(new HomeViewPanelDC { HeaderTitel = "Test", PanelType = HomeViewPanelType.TasksPanel });
|
||||
|
||||
foreach (var panelDC in panels)
|
||||
{
|
||||
if (dict.ContainsKey(panelDC.PanelType))
|
||||
{
|
||||
var panel = dict[panelDC.PanelType];
|
||||
PanelHost.Children.Add(panel);
|
||||
if (panelDC.HeaderTitel == null) continue;
|
||||
|
||||
foreach (var child in ((StackPanel)panel.Header).Children)
|
||||
{
|
||||
if (child is TextBlock textBlock && (string)textBlock.Tag == "Titel")
|
||||
{
|
||||
textBlock.Text = panelDC.HeaderTitel;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (panelDC.PanelType == HomeViewPanelType.CustomReportPanel)
|
||||
{
|
||||
PanelHost.Children.Add(CreateReportPanel(panelDC.HeaderTitel, panelDC.Value));
|
||||
}
|
||||
else if (panelDC.PanelType == HomeViewPanelType.CustomXamlPanel)
|
||||
{
|
||||
PanelHost.Children.Add(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
InitPanels(null);
|
||||
}
|
||||
|
||||
private DragDockPanel CreateReportPanel(string title, string reportName)
|
||||
{
|
||||
var panel = new DragDockPanel()
|
||||
{
|
||||
Tag = "CustomReport",
|
||||
Name = title,
|
||||
Header = new StackPanel()
|
||||
{
|
||||
Orientation = Orientation.Horizontal,
|
||||
Children =
|
||||
{
|
||||
new Image()
|
||||
{
|
||||
Source = new BitmapImage(new Uri(@"..\Ressources\Icons\ChartBarDisabled.png", UriKind.Relative)),
|
||||
Stretch = Stretch.Fill,
|
||||
StretchDirection = StretchDirection.Both
|
||||
},
|
||||
new TextBlock()
|
||||
{
|
||||
Text = title ?? "Bericht",
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
FontSize = 16,
|
||||
Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E0E0E0")),
|
||||
VerticalAlignment = VerticalAlignment.Bottom,
|
||||
Margin = new Thickness(5,0,0,5),
|
||||
Tag = "Titel"
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
panel.Loaded += (s, e) => LoadReport(reportName, title, panel);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
private DragDockPanel CreateXamlPanel(string title, string xamlString)
|
||||
{
|
||||
var panel = new DragDockPanel()
|
||||
{
|
||||
Tag = "CustomReport",
|
||||
Name = title,
|
||||
Header = new StackPanel()
|
||||
{
|
||||
Orientation = Orientation.Horizontal,
|
||||
Children =
|
||||
{
|
||||
new Image()
|
||||
{
|
||||
Source = new BitmapImage(new Uri(@"..\Ressources\Icons\ChartBarDisabled.png", UriKind.Relative)),
|
||||
Stretch = Stretch.Fill,
|
||||
StretchDirection = StretchDirection.Both
|
||||
},
|
||||
new TextBlock()
|
||||
{
|
||||
Text = title ?? "Bericht",
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
FontSize = 16,
|
||||
Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E0E0E0")),
|
||||
VerticalAlignment = VerticalAlignment.Bottom,
|
||||
Margin = new Thickness(5,0,0,5),
|
||||
Tag = "Titel"
|
||||
}
|
||||
}
|
||||
},
|
||||
Content = XamlReader.Load(XmlReader.Create(xamlString))
|
||||
};
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
private void LoadReport(string reportName, string title, DragDockPanel panel)
|
||||
{
|
||||
ServiceFacade.DoReportServiceAsync(s => s.CreateCustomReport(BeWoApp.LoggedOnEmployee.EmployeeOid.Value, reportName), ms => SetReportControl(ms, title, panel));
|
||||
}
|
||||
|
||||
private void SetReportControl(MemoryStream ms, string title, DragDockPanel panel)
|
||||
{
|
||||
this.Dispatch(
|
||||
delegate
|
||||
{
|
||||
var grid = new Grid();
|
||||
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
|
||||
var ctrl = new DocumentPreviewControl
|
||||
{
|
||||
CommandBarStyle = CommandBarStyle.None
|
||||
};
|
||||
grid.Children.Add(ctrl);
|
||||
panel.Content = grid;
|
||||
BeWoUtils.ShowReportWindow(ms, title, ctrl);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private void RefreshInternalNews(List<NewsItemDC> news)
|
||||
{
|
||||
this.Dispatch(delegate
|
||||
@@ -929,7 +1158,7 @@ namespace BeWo.View
|
||||
}
|
||||
return sp;
|
||||
}
|
||||
|
||||
|
||||
private UIElement CreateInternalNewsTeamControl(TeamNewsItemVM teamNewsItemVm, bool initExpand)
|
||||
{
|
||||
var sp = new StackPanel();
|
||||
@@ -1107,81 +1336,6 @@ namespace BeWo.View
|
||||
return grid;
|
||||
}
|
||||
|
||||
private void InitLoginInfo()
|
||||
{
|
||||
DateTime endOfWeek = DateTime.Now.GetNext(DayOfWeek.Sunday).Date;
|
||||
|
||||
ServiceFacade.DoAnalysisServiceAsync(s1 => s1.GetLastLogins(BeWoApp.LoggedOnUser.LoginName), ReloadLogins);
|
||||
}
|
||||
|
||||
private void InitNextConferenceDates()
|
||||
{
|
||||
DateTime endOfWeek = DateTime.Now.GetNext(DayOfWeek.Sunday).Date;
|
||||
DateTime endOfWeek2 = endOfWeek.AddDays(8);
|
||||
|
||||
ServiceFacade.DoAnalysisServiceAsync(
|
||||
s1 => s1.GetSupportConceptsWithConferenceDate(BeWoApp.LoggedOnUser.Employee.EmployeeOid, endOfWeek2),
|
||||
ReloadConferenceDates);
|
||||
}
|
||||
|
||||
private void InitTasks()
|
||||
{
|
||||
var test = 0;
|
||||
|
||||
while (BeWoApp.LoggedOnEmployee == null && test < 50)
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
test++;
|
||||
}
|
||||
|
||||
if (BeWoApp.LoggedOnEmployee != null)
|
||||
{
|
||||
var rights = new List<UserRightType> { UserRightType.KalenderAnsehen };
|
||||
|
||||
_HasRightsToSeeAppointments = BeWoUtils.HasRight(UserRightType.KalenderAnsehen) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
|
||||
var r2 = rights;
|
||||
r2.Add(UserRightType.KalenderMitarbeitertermineAnsehen);
|
||||
|
||||
var r3 = rights;
|
||||
r3.Add(UserRightType.KalenderKliententermineAlleAnsehen);
|
||||
|
||||
var r5 = rights;
|
||||
r5.Add(UserRightType.KalenderRessourcentermineAnsehen);
|
||||
|
||||
_IsAllowedToSeeMitarbeitertermine = r2.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
_IsAllowedToSeeCustomerAppointments = r3.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
_IsAllowedToSeeResourceAppointments = r5.All(BeWoUtils.HasRight) || BeWoUtils.HasRight(UserRightType.ViewAll);
|
||||
|
||||
if (_HasRightsToSeeAppointments && _IsAllowedToSeeMitarbeitertermine)
|
||||
{
|
||||
#if DEBUG
|
||||
TestTermineAnlegenButton.Visibility = Visibility.Visible;
|
||||
TestTermineLoeschenButton.Visibility = Visibility.Visible;
|
||||
#endif
|
||||
|
||||
employeeFilterBox.Visibility = Visibility.Visible;
|
||||
|
||||
ServiceFacade.DoEmployeeServiceAsync(s => s.GetAllActiveEmployeesCompact(), cb =>
|
||||
{
|
||||
this.Dispatch(delegate
|
||||
{
|
||||
EmployeesForAppointmentView = cb.OrderBy(o => o.LastName + ", " + o.FirstName).ToList();
|
||||
employeeFilterBox.SelectedItem = BeWoApp.CompactLoggedOnEmployee;
|
||||
});
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
EmployeesForAppointmentView = new List<CompactEmployeeDC> { BeWoApp.CompactLoggedOnEmployee };
|
||||
employeeFilterBox.SelectedItem = BeWoApp.CompactLoggedOnEmployee;
|
||||
}
|
||||
|
||||
ShowAppointments(false);
|
||||
LoadTasksAndAppointments(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildRecurringAppointments(List<SchedulerAppointmentDC> pRecurringAppointments, DateTime pStartDate, DateTime pEndDate)
|
||||
{
|
||||
var patternToExceptions = new List<RecurringAppointment>();
|
||||
@@ -1458,42 +1612,31 @@ namespace BeWo.View
|
||||
|
||||
public void ReorderPanels()
|
||||
{
|
||||
List<string> order = BeWoApp.AppSettings.StartupPanelOrder;
|
||||
if (order != null && order.Count > 0)
|
||||
var save = BeWoApp.AppSettings.StartupPanelOrder;
|
||||
var actual = PanelHost.Children.Cast<DragDockPanel>().Select(item => item.Name).ToList();
|
||||
|
||||
if (save == null || save.Count != actual.Count || actual.Except(save).Any()) return;
|
||||
|
||||
var panels = new Dictionary<string, DragDockPanel>();
|
||||
|
||||
foreach (var item in PanelHost.Children)
|
||||
{
|
||||
var panels = new Dictionary<string, DragDockPanel>();
|
||||
|
||||
foreach (object item in panelHost.Children)
|
||||
{
|
||||
var p = item as DragDockPanel;
|
||||
panels.Add(p.Name, p);
|
||||
}
|
||||
|
||||
panelHost.Children.Clear();
|
||||
foreach (string item in order)
|
||||
{
|
||||
if (panels.ContainsKey(item))
|
||||
{
|
||||
DragDockPanel p = panels[item];
|
||||
|
||||
panelHost.AddPanel(p); // Children.Add(p);
|
||||
|
||||
panels.Remove(item);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (DragDockPanel item in panels.Values)
|
||||
{
|
||||
panelHost.AddPanel(item);
|
||||
}
|
||||
var p = item as DragDockPanel;
|
||||
panels.Add(p.Name, p);
|
||||
}
|
||||
|
||||
PanelHost.Children.Clear();
|
||||
|
||||
save.DoForEach(x => PanelHost.AddPanel(panels[x]));
|
||||
|
||||
SetMaximizedPanel();
|
||||
}
|
||||
|
||||
private void SetMaximizedPanel()
|
||||
{
|
||||
if (!String.IsNullOrEmpty(BeWoApp.AppSettings.StartupPanelMaximized))
|
||||
if (!string.IsNullOrEmpty(BeWoApp.AppSettings.StartupPanelMaximized))
|
||||
{
|
||||
foreach (object item in panelHost.Children)
|
||||
foreach (object item in PanelHost.Children)
|
||||
{
|
||||
var p = item as DragDockPanel;
|
||||
if (BeWoApp.AppSettings.StartupPanelMaximized.Equals(p.Name))
|
||||
@@ -1502,9 +1645,8 @@ namespace BeWo.View
|
||||
|
||||
foreach (DependencyObject child in objekts)
|
||||
{
|
||||
if (child is ToggleButton)
|
||||
if (child is ToggleButton btn)
|
||||
{
|
||||
var btn = child as ToggleButton;
|
||||
btn.IsChecked = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace BeWo.Data.Entities
|
||||
{
|
||||
private HomeViewPanelType _PanelType;
|
||||
private string _HeaderTitel;
|
||||
private string _ReportName;
|
||||
private string _Value;
|
||||
|
||||
public HomeViewPanel()
|
||||
{
|
||||
@@ -38,13 +38,13 @@ namespace BeWo.Data.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public virtual string ReportName
|
||||
public virtual string Value
|
||||
{
|
||||
get => _ReportName;
|
||||
get => _Value;
|
||||
set
|
||||
{
|
||||
if (AreDifferent(_ReportName, value))
|
||||
_ReportName = value;
|
||||
if (AreDifferent(_Value, value))
|
||||
_Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,6 @@
|
||||
|
||||
<property column="PanelType" type="BS.Shared.HomeViewPanelType, BS.Shared" name="PanelType" />
|
||||
<property column="HeaderTitel" type="String" name="HeaderTitel" length="1024" />
|
||||
<property column="ReportName" type="String" name="ReportName" length="1024" />
|
||||
<property column="Value" type="String" name="Value" length="1024" />
|
||||
</class>
|
||||
</hibernate-mapping>
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `bewodemo`.`homeviewpanel`
|
||||
CHANGE COLUMN `ReportName` `Value` VARCHAR(1024) NULL DEFAULT NULL ;
|
||||
@@ -70,5 +70,7 @@ namespace BeWo.Report
|
||||
|
||||
public abstract XtraReport CreateSbdLeistungsnachweisForSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long serviceCategoryOid, int startDay, int endDay);
|
||||
|
||||
}
|
||||
public abstract XtraReport CreateCustomReport(long employeeOid, String reportName);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
@@ -605,5 +606,14 @@ namespace BeWo.Report
|
||||
return report as XtraReport;
|
||||
}
|
||||
|
||||
public override XtraReport CreateCustomReport(long employeeOid, String reportName)
|
||||
{
|
||||
var report = FindReportImp<QueryRO>(null, reportName);
|
||||
if (report == null)
|
||||
{
|
||||
return new XtraReport();
|
||||
}
|
||||
return report as XtraReport;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,12 @@ namespace ReportingService.ServiceContracts
|
||||
|
||||
[FaultContract(typeof(BeWoFault))]
|
||||
[OperationContract]
|
||||
String SendTimeSheetMail(TimeSheetStatusItemDC item, bool saveMailToDatabase);
|
||||
string SendTimeSheetMail(TimeSheetStatusItemDC item, bool saveMailToDatabase);
|
||||
|
||||
}
|
||||
[FaultContract(typeof(BeWoFault))]
|
||||
[OperationContract]
|
||||
MemoryStream CreateCustomReport(long employeeOid, string reportName);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -106,6 +106,13 @@ namespace ReportingService.ServiceImplementations
|
||||
}
|
||||
}
|
||||
|
||||
public MemoryStream CreateCustomReport(long employeeOid, String reportName)
|
||||
{
|
||||
var reportCreator = GetReportCreator();
|
||||
|
||||
return CreateReportStream(reportCreator.CreateCustomReport(employeeOid, reportName));
|
||||
}
|
||||
|
||||
private static MemoryStream CreateReportStream(XtraReport pReport)
|
||||
{
|
||||
pReport.CreateDocument();
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace BeWo.Service.DCEntityMapper
|
||||
pDataContract.Oid = pEntity.Oid;
|
||||
pDataContract.HeaderTitel = pEntity.HeaderTitel;
|
||||
pDataContract.PanelType = pEntity.PanelType;
|
||||
pDataContract.ReportName = pEntity.ReportName;
|
||||
pDataContract.Value = pEntity.Value;
|
||||
|
||||
return pDataContract;
|
||||
}
|
||||
@@ -26,7 +26,7 @@ namespace BeWo.Service.DCEntityMapper
|
||||
pEntity.Oid = pDataContract.Oid;
|
||||
pEntity.HeaderTitel = pDataContract.HeaderTitel;
|
||||
pEntity.PanelType = pDataContract.PanelType;
|
||||
pEntity.ReportName = pDataContract.ReportName;
|
||||
pEntity.Value = pDataContract.Value;
|
||||
|
||||
return pEntity;
|
||||
}
|
||||
|
||||
@@ -1026,6 +1026,7 @@ namespace BS.Shared
|
||||
BirthdatesPanel,
|
||||
InternalNewsPanel,
|
||||
BeWoNewsPanel,
|
||||
CustomReportPanel
|
||||
CustomReportPanel,
|
||||
CustomXamlPanel
|
||||
}
|
||||
}
|
||||
@@ -2,19 +2,15 @@
|
||||
|
||||
namespace BS.Shared.DataContracts
|
||||
{
|
||||
[DataContract]
|
||||
public class HomeViewPanelDC : IDataContract
|
||||
{
|
||||
[DataMember]
|
||||
public long? Oid { get; set; }
|
||||
[DataContract]
|
||||
public class HomeViewPanelDC : IDataContract
|
||||
{
|
||||
[DataMember] public long? Oid { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public HomeViewPanelType PanelType { get; set; }
|
||||
[DataMember] public HomeViewPanelType PanelType { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public string HeaderTitel { get; set; }
|
||||
[DataMember] public string HeaderTitel { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public string ReportName { get; set; }
|
||||
}
|
||||
[DataMember] public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user