using Comal.Classes; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.Wpf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; namespace PRSDesktop; public class ServiceScreenSettings : IUserConfigurationSettings { public Guid CurrentJob { get; set; } public Guid JobStatus { get; set; } public ScreenViewType ViewType { get; set; } public double AnchorWidth { get; set; } } /// /// Interaction logic for ServicesPanel.xaml /// public partial class ServicePanel_Old : UserControl, IPanel { private int CurrentPage = -1; private readonly List> Pages; private IMasterDetailPage? SelectedPage => Pages.FirstOrDefault(x => x.Tab == JobPages.SelectedTab); private DateTime lastselection = DateTime.MaxValue; private DispatcherTimer timer; private ServiceScreenSettings settings; public ServicePanel_Old() { InitializeComponent(); Pages = new List> { new JobDetailPanel(Details), new JobDetailPanel(Requisitions), new JobDetailPanel(Invoices), new JobDetailGrid(Forms), new JobDetailGrid(Orders), new JobDetailGrid(Assignments), }; } #region IPanel public bool IsReady { get; set; } public string SectionName => "Service"; public event DataModelUpdateEvent? OnUpdateDataModel; public void CreateToolbarButtons(IPanelHost host) { } private IDataModelSource modelsource; public DataModel DataModel(Selection selection) { if (modelsource == null) { var row = ServiceGrid.SelectedRows.FirstOrDefault(); var jobid = row != null ? row.Get(x => x.ID) : CoreUtils.FullGuid; return new JobDetailsDataModel(new Filter(x => x.ID).IsEqualTo(jobid)); } return modelsource.DataModel(selection); } public void Heartbeat(TimeSpan time) { } public void Setup() { settings = new UserConfiguration().Load(); SplitPanel.View = settings.ViewType == ScreenViewType.Register ? DynamicSplitPanelView.Master : settings.ViewType == ScreenViewType.Details ? DynamicSplitPanelView.Detail : DynamicSplitPanelView.Combined; SplitPanel.AnchorWidth = settings.AnchorWidth; ServiceGrid.OnSelectItem += ServiceGrid_OnSelectItem; ServiceGrid.BeforeRefresh += ServiceGrid_BeforeRefresh; ServiceGrid.AfterRefresh += ServiceGrid_AfterRefresh; Orders.Visibility = ClientFactory.IsSupported() ? Visibility.Visible : Visibility.Collapsed; Requisitions.Visibility = ClientFactory.IsSupported() ? Visibility.Visible : Visibility.Collapsed; Assignments.Visibility = ClientFactory.IsSupported() ? Visibility.Visible : Visibility.Collapsed; Forms.Visibility = Security.CanView() ? Visibility.Visible : Visibility.Collapsed; Invoices.Visibility = Security.CanView() ? Visibility.Visible : Visibility.Collapsed; ServiceGrid.Refresh(true, false); ServiceGrid.ColumnsTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : ""; ServiceGrid.Refresh(true, false); timer = new DispatcherTimer(); timer.Tick += Timer_Tick; timer.Interval = new TimeSpan(0, 0, 0, 0, 100); timer.IsEnabled = true; } public void Refresh() { ServiceGrid.Refresh(false, true); lastselection = DateTime.MinValue; } private void Timer_Tick(object? sender, EventArgs e) { if (lastselection < DateTime.Now.AddMilliseconds(-500) && !_serviceGridRefreshing) { lastselection = DateTime.MaxValue; var job = ServiceGrid.SelectedRows.FirstOrDefault()?.ToObject() ?? new Job(); var dataModelSource = SelectedPage?.Refresh(job); if (JobPages.SelectedIndex != CurrentPage) { if(dataModelSource is not null) { modelsource = dataModelSource; OnUpdateDataModel?.Invoke(dataModelSource.SectionName, dataModelSource.DataModel(Selection.None)); } CurrentPage = JobPages.SelectedIndex; } } } private bool _serviceGridRefreshing; private void ServiceGrid_BeforeRefresh(object sender, BeforeRefreshEventArgs args) { _serviceGridRefreshing = true; } private void ServiceGrid_AfterRefresh(object sender, AfterRefreshEventArgs args) { if (settings.CurrentJob == Guid.Empty) { ServiceGrid.SelectedRows = Array.Empty(); } else { ServiceGrid.SelectedRows = ServiceGrid.Data.Rows.Where(x => x.Get(x => x.ID) == settings.CurrentJob).ToArray(); } _serviceGridRefreshing = false; } private void ServiceGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e) { if (!_serviceGridRefreshing) { lastselection = DateTime.Now; settings.CurrentJob = e.Rows?.FirstOrDefault()?.Get(x => x.ID) ?? Guid.Empty; new UserConfiguration().Save(settings); } } private void JobPages_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.Source == JobPages) lastselection = DateTime.MinValue; } private void SplitPanel_OnChanged(object sender, DynamicSplitPanelSettings e) { settings.ViewType = SplitPanel.View == DynamicSplitPanelView.Master ? ScreenViewType.Register : SplitPanel.View == DynamicSplitPanelView.Detail ? ScreenViewType.Details : ScreenViewType.Combined; settings.AnchorWidth = SplitPanel.AnchorWidth; new UserConfiguration().Save(settings); var newTag = settings.ViewType == ScreenViewType.Register ? settings.ViewType.ToString() : ""; if (ServiceGrid.ColumnsTag != newTag) { ServiceGrid.ColumnsTag = newTag; ServiceGrid.Refresh(true, true); } } public Dictionary Selected() { return SelectedPage?.Selected() ?? new Dictionary { { typeof(Job).EntityName(), ServiceGrid.SelectedRows } }; } public void Shutdown(CancelEventArgs? cancel) { } #endregion }