using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using C4IT.API.Contracts; using C4IT.Logging; using C4IT_CustomerPanel.libs; using static C4IT.Logging.cLogManager; namespace C4IT_CustomerPanel.UserControls { /// /// Interaction logic for Incidents.xaml /// public partial class Incidents : UserControl { public readonly StackPanel _incidentHead = new StackPanel(); public Dictionary ticketCollection = new Dictionary(); public List unreadTickets = new List(); private MainWindow mainWindow; public Incidents() { mainWindow = MainWindow.MainInstance; InitializeComponent(); } public void InitializeContracts() { try { unreadTickets = ConfigClass.LoadFromJson>("UnreadTickets", "run"); } catch { } if (unreadTickets == null) unreadTickets = new List(); } private void OnCreateNewTicketClicked(object sender, RoutedEventArgs e) { if (mainWindow.ConfigSettings.GetConfig()._createNewTicketDirectLink != String.Empty) { Process.Start(mainWindow.ConfigSettings.GetConfig()._createNewTicketDirectLink); } else { Process.Start(mainWindow.ConfigSettings.GetMatrixServer(true) + "/wm"); } } private void ReadAll_PreviewMouseDown(object sender, MouseButtonEventArgs e) { foreach (KeyValuePair item in ticketCollection) { item.Value.IsUnread = false; } CheckAllTicketsRead(null, null); } public void CheckAllTicketsRead(object sender, MouseButtonEventArgs e) { if (e != null) e.Handled = true; if (sender == null) { unreadTickets.Clear(); lock (mainWindow.NewContentSignals) { mainWindow.NewContentSignals[enumMainFunctions.Incident] = false; mainWindow._isRedDotActive = false; } mainWindow.UpdateNewContentSignals(); } else { Boolean allRead = true; IncidentListItem incItem = null; if (sender is Image) { Image item = (Image)sender; incItem = (IncidentListItem)item.DataContext; } else if (sender is IncidentListItem) { incItem = (IncidentListItem)sender; } if (incItem != null) { incItem.IsUnread = false; unreadTickets.Remove(incItem.getEOID()); foreach (KeyValuePair inc in ticketCollection) { if (inc.Value.IsUnread) { allRead = false; break; } } if (allRead) { unreadTickets.Clear(); lock (mainWindow.NewContentSignals) { mainWindow.NewContentSignals[enumMainFunctions.Incident] = false; mainWindow._isRedDotActive = false; } mainWindow.UpdateNewContentSignals(); } } } ConfigClass.SaveAsJson("UnreadTickets", unreadTickets, "run"); } public void ProcessNewTickets(List _tickets) { var newLastUpdate = mainWindow.lastUpdate; try { if (_tickets != null && _tickets.Count > 0) { NoIncident.Visibility = Visibility.Hidden; foreach (Ticket ti in _tickets) { if (ti._objectID == Guid.Empty) continue; if (!ticketCollection.TryGetValue(ti._objectID, out var item)) { item = new IncidentListItem(ti) { Margin = new Thickness(2, 10, 2, 0), }; item.MouseLeftButtonDown += OnTicketClicked; item.signal.PreviewMouseDown += CheckAllTicketsRead; ticketCollection.Add(ti._objectID, item); } item.TicketItem = ti; if (ti._lastJournalEntryAction is int jText && staticLibs.JournalActivityAction.TryGetValue(jText, out var actionInfo) && actionInfo.visible) { item.LastJournalEntryActionText = actionInfo.JournalText; } else { item.LastJournalEntryActionText = string.Empty; } var ticketUpdateDate = ti._lastJournalEntryDate > DateTime.MinValue ? ti._lastJournalEntryDate : ti._createdDate; if (ticketUpdateDate > mainWindow.lastUpdate) { if (!unreadTickets.Contains(ti._objectID)) unreadTickets.Add(ti._objectID); item.IsUnread = true; mainWindow.NewContentSignalsInfo[enumMainFunctions.Incident] = Properties.Resources.NewTicketInfoMessage; if (ticketUpdateDate > newLastUpdate) newLastUpdate = ticketUpdateDate; } else { item.IsUnread = unreadTickets.Contains(ti._objectID); } item.TicketType = ti._ticketType; } var incomingIds = new HashSet(_tickets.Select(t => t._objectID)); var keysToRemove = ticketCollection.Keys .Where(id => !incomingIds.Contains(id)) .ToList(); foreach (var id in keysToRemove) { ticketCollection.Remove(id); } } else { ticketCollection.Clear(); NoIncident.Visibility = Visibility.Visible; } } catch (Exception e) { cLogManager.LogException(e); } if (newLastUpdate > mainWindow.lastUpdate) { mainWindow.lastUpdate = newLastUpdate; ConfigClass.SaveAsJson("LastTicketUpdate", mainWindow.lastUpdate, "run"); } ConfigClass.SaveAsJson("UnreadTickets", unreadTickets, "run"); ticketCollection = ticketCollection .OrderByDescending(x => x.Value.TicketItem._lastJournalEntryDate) .ThenByDescending(x => x.Value.TicketItem._createdDate) .ToDictionary(x => x.Key, x => x.Value); FillIncidentGrid(); } public void FillIncidentGrid() { try { var setNewContent = false; _incidentHead.Children.Clear(); foreach (var item in ticketCollection) { if (item.Value.IsUnread) setNewContent = true; var control = item.Value; control.TicketItem = control.TicketItem; // löst im Setter alle OnPropertyChanged aus _incidentHead.Children.Add(control); } CanvasIncident.Content = null; CanvasIncident.Content = _incidentHead; if (setNewContent) { lock (mainWindow.NewContentSignals) mainWindow.NewContentSignals[enumMainFunctions.Incident] = true; } } catch (Exception e) { LogException(e); } } public void OnTicketClicked(object sender, EventArgs e) { if (sender is FrameworkElement fe && fe.DataContext is IncidentListItem item) { if (!item.TicketItem._objectID.Equals(Guid.Empty)) { try { string startParam; if (mainWindow.ConfigSettings.GetConfig()._isUUX) { startParam = string.Format("{0}/wm/app-SelfServicePortal/notSet/preview-object/{1}/{2}/0/", mainWindow.ConfigSettings.GetMatrixServer(true), item.TicketItem._sysEntity, item.TicketItem._objectID.ToString()); } else { startParam = string.Format("{0}/SPS/Portal/Pages/Support/IncidentDetails.aspx?IncidentID={1}&ConsiderArchivedData=0", mainWindow.ConfigSettings.GetMatrixServer(true), item.TicketItem._objectID.ToString()); } Process.Start(startParam); CheckAllTicketsRead(item, null); } catch (Exception) { // Not yet implemented } } } } } }