using C4IT.FASD.Base;
using C4IT.FASD.Cockpit.Communication;
using FasdDesktopUi.Basics.Helper;
using FasdDesktopUi.Basics.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
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 static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UserControls
{
///
/// Interaction logic for HoldTicketDialog.xaml
///
public partial class HoldTicketDialog : UserControl, INotifyPropertyChanged
{
#region DataProvider
public cSupportCaseDataProvider DataProvider
{
get { return (cSupportCaseDataProvider)GetValue(DataProviderProperty); }
set
{
SetValue(DataProviderProperty, value);
}
}
public static readonly DependencyProperty DataProviderProperty =
DependencyProperty.Register("DataProvider", typeof(cSupportCaseDataProvider), typeof(HoldTicketDialog), new PropertyMetadata(null, DataProviderChanged));
private static void DataProviderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is HoldTicketDialog me))
return;
//me.UpdateReasonsComboBoxAsync();
}
#endregion
public event EventHandler CommentChanged;
public string Comment
{
get { return (string)GetValue(CommentProperty); }
set { SetValue(CommentProperty, value); }
}
// Using a DependencyProperty as the backing store for Comment. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommentProperty =
DependencyProperty.Register("Comment", typeof(string), typeof(HoldTicketDialog), new PropertyMetadata(string.Empty, OnCommentChanged));
private static void OnCommentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (HoldTicketDialog)d;
control.CommentChanged?.Invoke(control, EventArgs.Empty);
}
public event EventHandler SelectedReminderDateChanged;
public DateTime SelectedReminderDate
{
get { return (DateTime)GetValue(SelectedReminderDateProperty); }
set { SetValue(SelectedReminderDateProperty, value); }
}
// Using a DependencyProperty as the backing store for SelectedReminderDate. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedReminderDateProperty =
DependencyProperty.Register("SelectedReminderDate", typeof(DateTime), typeof(HoldTicketDialog), new PropertyMetadata(DateTime.MinValue, OnSelectedReminderDateChanged));
private static void OnSelectedReminderDateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (HoldTicketDialog)d;
control.SelectedReminderDateChanged?.Invoke(control, EventArgs.Empty);
}
private int _selectedHour;
public int SelectedHour
{
get { return _selectedHour; }
set
{
if (_selectedHour != value)
{
_selectedHour = value;
OnPropertyChanged(nameof(SelectedHour));
setReminderDate();
}
}
}
private int _selectedMinute;
public int SelectedMinute
{
get { return _selectedMinute; }
set
{
if (_selectedMinute != value)
{
_selectedMinute = value;
OnPropertyChanged(nameof(SelectedMinute));
setReminderDate();
}
}
}
private DateTime _selectedDate;
public DateTime SelectedDate
{
get { return _selectedDate; }
set
{
if (_selectedDate != value)
{
_selectedDate = value;
OnPropertyChanged(nameof(SelectedDate));
setReminderDate();
}
}
}
public ObservableCollection HoursRange { get; set; }
public ObservableCollection MinutesRange { get; set; }
public HoldTicketDialog(cSupportCaseDataProvider cDataProviderBase)
{
DataProvider = cDataProviderBase;
InitializeComponent();
HoursRange = new ObservableCollection(Enumerable.Range(0, 24).ToList());
MinutesRange = new ObservableCollection(Enumerable.Range(0, 60).ToList());
this.DataContext = this;
SelectedReminderDateDatePicker.DisplayDateStart = DateTime.Now;
SelectedDate = DateTime.Now.AddDays(1).Date;
SelectedHour = DateTime.Now.Hour;
SelectedMinute = DateTime.Now.Minute;
}
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
UpdateReasonsComboBox();
}
private void setReminderDate()
{
SelectedReminderDate = new DateTime(
SelectedDate.Year,
SelectedDate.Month,
SelectedDate.Day,
SelectedHour,
SelectedMinute,
0);
}
private void UpdateReasonsComboBox()
{
try
{
if (DataProvider == null) return;
var resTable = DataProvider.HealthCardDataHelper.HealthCardRawData.GetTableByName("M42Wpm-Pickup-ObjectStateReason", false);
if (resTable == null) return;
if (!resTable.Columns.TryGetValue("name", out var namesColumn) ||
!resTable.Columns.TryGetValue("position", out var positionsColumn) ||
!resTable.Columns.TryGetValue("hidden", out var hiddensColumn) ||
!resTable.Columns.TryGetValue("state", out var statesColumn) ||
!resTable.Columns.TryGetValue("stategroup", out var stateGroupsColumn) ||
!resTable.Columns.TryGetValue("id", out var idsColumn)) return;
var resList = new List>();
for (int i = 0; i < idsColumn.Values.Count; i++)
{
if (statesColumn.Values[i] == null || stateGroupsColumn.Values[i] == null) continue;
int? positionValue = null; // Nullabel int für den Fall, dass die Position null ist
int stateValue, stateGroupValue;
// Überprüft, ob positionsColumn.Values[i] null ist
if (positionsColumn.Values[i] != null && int.TryParse(positionsColumn.Values[i].ToString(), out int posVal))
{
positionValue = posVal;
}
if (int.TryParse(statesColumn.Values[i].ToString(), out stateValue) && int.TryParse(stateGroupsColumn.Values[i].ToString(), out stateGroupValue))
{
var eintrag = new Dictionary
{
{ "ID", idsColumn.Values[i] },
{ "DisplayName", namesColumn.Values[i] },
{ "Hidden", Convert.ToBoolean(hiddensColumn.Values[i])},
{ "State", stateValue },
{ "StateGroup", stateGroupValue },
{ "Position", positionValue ?? Int32.MaxValue } // Verwende Int32.MaxValue für null Positionen
};
resList.Add(eintrag);
}
}
// Filtern und Sortieren, wobei Einträge ohne Position zuletzt erscheinen
resList = resList.Where(eintrag => !(bool)eintrag["Hidden"] && (int)eintrag["State"] == 203 && (int)eintrag["StateGroup"] == 7)
.OrderBy(eintrag => eintrag["Position"] != null)
.ThenBy(eintrag => (int)eintrag["Position"])
.ToList();
var targetComboBox = ReasonSelection;
targetComboBox.Items.Clear();
foreach (var listValue in resList)
{
targetComboBox.Items.Add(new ComboBoxItem { Content = listValue["DisplayName"], Tag = listValue["ID"] });
}
}
catch (Exception e)
{
LogException(e);
}
}
private void DropDownOpened(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
var parentBorder = cUiElementHelper.GetFirstParentOfType(senderElement);
cFocusInvoker.InvokeGotFocus(parentBorder, e);
}
catch (Exception E)
{
LogException(E);
}
}
private void DropDownClosed(object sender, EventArgs e)
{
try
{
if (!(sender is FrameworkElement senderElement))
return;
var parentBorder = cUiElementHelper.GetFirstParentOfType(senderElement);
cFocusInvoker.InvokeLostFocus(parentBorder, e);
}
catch (Exception E)
{
LogException(E);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}