| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 | using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Windows;using System.Windows.Controls;using Comal.Classes;using InABox.Clients;using InABox.Configuration;using InABox.Core;using NPOI.HSSF.Util;using Syncfusion.Windows.Tools.Controls;namespace PRSDesktop{    public class EmployeeSelectorData    {        // if first == FullGuid, remainder are selected        // Otherwise, ignore the rest        public Guid[] Teams { get; set; }                // if first == FullGuid, select all        public Guid[] Employees { get; set; }                public EmployeeSelectorData( Guid[] teams, Guid[] employees)        {            Teams = teams;            Employees = employees;        }        public EmployeeSelectorData() : this(new[] { Guid.Empty }, new[] { CoreUtils.FullGuid })        {        }    }    public class EmployeeSelectorSettings    {        public double SplitPosition { get; set; }        public EmployeeSelectorSettings()        {            SplitPosition = 200.0F;        }    }        public class EmployeeSelectorSettingsChangedArgs : EventArgs    {        public EmployeeSelectorSettings Settings { get; private set; }        public EmployeeSelectorSettingsChangedArgs(EmployeeSelectorSettings settings)        {            Settings = settings;        }    }        public delegate void EmployeeSelectorSettingsChanged(object sender, EmployeeSelectorSettingsChangedArgs args);        public class EmployeeSelectorSelectionChangedArgs : EventArgs    {        public EmployeeSelectorData Selection { get; private set; }        public EmployeeSelectorSelectionChangedArgs(EmployeeSelectorData selection)        {            Selection = selection;        }    }    public delegate void EmployeeSelectorSelectionChanged(object sender, EmployeeSelectorSelectionChangedArgs args);    public partial class EmployeeSelector : UserControl    {        private enum Suppress        {            This        }        private class ListEntry        {            public Guid Key { get; set; }            public String Value { get; set; }        }        public EmployeeSelectorSettings Settings { get; set; }                public event EmployeeSelectorSettingsChanged SettingsChanged;        public event EmployeeSelectorSelectionChanged SelectionChanged;                private CoreTable _employees;        private Dictionary<Guid, EmployeeRosterItem[]> _rosters;        private ListEntry[] _teams;        private Tuple<Guid,Guid,String>[] _employeeteams;        public T[] GetEmployeeData<T>(Func<CoreRow, EmployeeRosterItem[], T> transform)        {            List<T> result = new List<T>();            var selteams = GetSelectedTeams();            var selemps = GetSelectedEmployees();            var empids = _employeeteams                .Where(x => selteams.Contains(x.Item1) && selemps.Contains(CoreUtils.FullGuid) || selemps.Contains(x.Item2))                .Select(x => x.Item2)                .Distinct()                .ToArray();            var rows = _employees.Rows.Where(r => empids.Contains(r.Get<Employee, Guid>(c => c.ID)));            foreach (var row in rows)            {                if(!_rosters.TryGetValue(row.Get<Employee, Guid>(x => x.ID), out var rosters))                {                    rosters = Array.Empty<EmployeeRosterItem>();                }                result.Add(transform.Invoke(row, rosters));            }            return result.ToArray();        }                public EmployeeSelector()        {            Settings = new EmployeeSelectorSettings();            using (new EventSuppressor(Suppress.This))                InitializeComponent();        }                public void Setup()        {            using (new EventSuppressor(Suppress.This))            {                var results = Client.QueryMultiple(                    new KeyedQueryDef<Employee>(LookupFactory.DefineFilter<Employee>()),                    new KeyedQueryDef<EmployeeRosterItem>(                        new Filter<EmployeeRosterItem>(x => x.Employee.ID)                            .InQuery(LookupFactory.DefineFilter<Employee>(), x => x.ID)),                    new KeyedQueryDef<Team>(                        LookupFactory.DefineFilter<Team>(),                        Columns.None<Team>().Add(x => x.ID)                            .Add(x => x.Name),                        new SortOrder<Team>(x => x.Name)),                    new KeyedQueryDef<EmployeeTeam>(                        LookupFactory.DefineFilter<EmployeeTeam>(),                        Columns.None<EmployeeTeam>().Add(x => x.TeamLink.ID)                            .Add(x => x.EmployeeLink.ID)                            .Add(x => x.EmployeeLink.Name)));                _employees = results.Get<Employee>();                _rosters = results.Get<EmployeeRosterItem>().ToObjects<EmployeeRosterItem>()                    .GroupBy(x => x.Employee.ID, x => x).ToDictionary(x => x.Key, x => x.ToArray());                _teams = results.Get<Team>().Rows.Select(r => new ListEntry() { Key = r.Get<Team,Guid>(c=>c.ID), Value = r.Get<Team,String>(c=>c.Name) }).ToArray();                TeamList.ItemsSource = _teams;                                ObservableCollection<ListEntry> teamdata = new() { new ListEntry() { Key = Guid.Empty, Value = "All Staff" } };                foreach (var team in _teams)                    teamdata.Add(team);                teamdata.Add(new ListEntry() { Key = CoreUtils.FullGuid, Value = "Multiple Teams" });                Teams.ItemsSource = teamdata;                                _employeeteams = results.Get<EmployeeTeam>().Rows.Select(                    row => new Tuple<Guid, Guid, String>(                        row.Get<EmployeeTeam, Guid>(c => c.TeamLink.ID),                        row.Get<EmployeeTeam, Guid>(c => c.EmployeeLink.ID),                        row.Get<EmployeeTeam, String>(c => c.EmployeeLink.Name)                    )                ).Union(                    _employees.Rows.Select(                        row => new Tuple<Guid,Guid,String>(                            Guid.Empty,                            row.Get<Employee, Guid>(c => c.ID),                            row.Get<Employee, String>(c => c.Name)                        )                    )                    ).ToArray();                Teams.SelectedValue = Guid.Empty;            }        }        private void UpdateSettings()        {            bool changed = false;                        var teams = GetSelectedTeams();            if (teams.Contains(CoreUtils.FullGuid) && (Math.Abs(Settings.SplitPosition - TeamListRow.Height.Value) >= 1.0F))            {                changed = true;                Settings.SplitPosition = TeamListRow.Height.Value;            }            if (changed && (!EventSuppressor.IsSet(Suppress.This)))                SettingsChanged?.Invoke(this, new EmployeeSelectorSettingsChangedArgs(Settings));        }                private Guid[] GetSelectedTeams()        {            Guid teamid = Teams.SelectedValue != null ? (Guid)Teams.SelectedValue : Guid.Empty;            var teams = (teamid == CoreUtils.FullGuid)                ? TeamList.SelectedItems                    .OfType<ListEntry>()                    .Select(x => x.Key)                    .Prepend(teamid)                    .ToArray()                : new Guid[] { teamid };            return teams;        }        private Guid[] GetSelectedEmployees()        {            var emps = (SelectedEmployees.SelectedItems.Count == SelectedEmployees.Items.Count)                ? new Guid[] { CoreUtils.FullGuid }                : SelectedEmployees.SelectedItems                    .OfType<ListEntry>()                    .Select(x => x.Key)                    .ToArray();            return emps;        }        public EmployeeSelectorData Selection        {            get => GetSelectionData();            set => SelectEmployees(value);        }                private EmployeeSelectorData GetSelectionData()        {            return new EmployeeSelectorData(                GetSelectedTeams(),                GetSelectedEmployees()            );        }                private void SelectEmployees(EmployeeSelectorData selection)        {            using (new EventSuppressor(Suppress.This))            {                Teams.SelectedValue = selection.Teams.Contains(CoreUtils.FullGuid)                    ? CoreUtils.FullGuid                    : selection.Teams.FirstOrDefault();                LoadTeams(selection.Teams);                var employees = SelectedEmployees.ItemsSource as ObservableCollection<ListEntry>;                var pairs = employees.Where(x => selection.Employees.Contains(CoreUtils.FullGuid) || selection.Employees.Contains(x.Key));                SelectedEmployees.SelectedItems.Clear();                foreach (var pair in pairs)                    SelectedEmployees.SelectedItems.Add(pair);            }                    }                private void LoadTeams(Guid[] teamids)        {            using (new EventSuppressor(Suppress.This))            {                Guid teamid = teamids.FirstOrDefault();                if (Guid.Equals(teamid, CoreUtils.FullGuid))                {                    TeamListRow.Height = new GridLength(Settings.SplitPosition, GridUnitType.Pixel);                    TeamListSplitterRow.Height = new GridLength(4, GridUnitType.Pixel);                    var selected = new ObservableCollection<object>(_teams.Where(x => teamids.Contains(x.Key)));                    TeamList.SelectedItems = selected;                    LoadEmployees(teamids.Skip(1).ToArray());                }                else                {                    TeamListRow.Height = new GridLength(0, GridUnitType.Pixel);                    TeamListSplitterRow.Height = new GridLength(0, GridUnitType.Pixel);                    LoadEmployees(new Guid[] { teamid });                }            }        }        private void LoadEmployees(Guid[] teamids)        {            using (new EventSuppressor(Suppress.This))            {                var empids =_employeeteams                    .OrderBy(x => x.Item3)                    .Where(x => teamids.Contains(x.Item1))                    .Select(x => new Tuple<Guid,String>(x.Item2, x.Item3))                    .Distinct();                var emps = empids.Select(x => new ListEntry() { Key = x.Item1, Value = x.Item2 }).ToArray();                SelectedEmployees.ItemsSource = new ObservableCollection<ListEntry>(emps);                SelectedEmployees.SelectedItems = new ObservableCollection<object>(emps);            }        }                public void SelectEmployee(Guid employeeid)        {            using (new EventSuppressor(Suppress.This))            {                LoadTeams(new Guid[] { Guid.Empty });                if (SelectedEmployees.ItemsSource is ObservableCollection<ListEntry> employees)                {                    var emp = employees.FirstOrDefault(x => x.Key == employeeid);                    if (emp != null)                        SelectedEmployees.SelectedItems = new ObservableCollection<object>() { emp };                }            }        }                private void TeamsSelectionChanged(object sender, SelectionChangedEventArgs e)        {            if (EventSuppressor.IsSet(Suppress.This))                return;            using (new EventSuppressor(Suppress.This))                LoadTeams(GetSelectedTeams());            UpdateSettings();            SelectionChanged?.Invoke(this, new EmployeeSelectorSelectionChangedArgs(GetSelectionData()));         }                private void SelectedTeams_ItemChecked(object? sender, ItemCheckedEventArgs e)        {            if (EventSuppressor.IsSet(Suppress.This))                return;            using (new EventSuppressor(Suppress.This))                LoadEmployees(GetSelectedTeams());            UpdateSettings();            SelectionChanged?.Invoke(this, new EmployeeSelectorSelectionChangedArgs(GetSelectionData()));         }                private void SelectedEmployees_OnItemChecked(object? sender, ItemCheckedEventArgs e)        {            if (EventSuppressor.IsSet(Suppress.This))                return;            UpdateSettings();            SelectionChanged?.Invoke(this, new EmployeeSelectorSelectionChangedArgs(GetSelectionData()));                    }                private void SelectedTeams_SizeChanged(object sender, SizeChangedEventArgs e)        {            if (EventSuppressor.IsSet(Suppress.This))                return;            UpdateSettings();        }    }}
 |