| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 | 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 InABox.DynamicGrid;using NPOI.HSSF.Util;using Syncfusion.Windows.Tools.Controls;namespace PRSDesktop{    public class TeamSelectorData    {        // FullGuid => All Staff        public Guid[] Teams { get; set; }                public TeamSelectorData(Guid[] teams)        {            Teams = teams;        }        public TeamSelectorData() : this(new[] { CoreUtils.FullGuid })        {        }    }    public class TeamSelectorSettings    {        public TeamSelectorSettings()        {        }    }        public class TeamSelectorSettingsChangedArgs : EventArgs    {        public TeamSelectorSettings Settings { get; private set; }        public TeamSelectorSettingsChangedArgs(TeamSelectorSettings settings)        {            Settings = settings;        }    }        public delegate void TeamSelectorSettingsChanged(object sender, TeamSelectorSettingsChangedArgs args);        public class TeamSelectorSelectionChangedArgs : EventArgs    {        public TeamSelectorData Selection { get; private set; }        public TeamSelectorSelectionChangedArgs(TeamSelectorData selection)        {            Selection = selection;        }    }    public delegate void TeamSelectorSelectionChanged(object sender, TeamSelectorSelectionChangedArgs args);    public partial class TeamSelector : UserControl    {        private enum Suppress        {            This        }        private class ListEntry        {            public Guid Key { get; set; }            public String Value { get; set; }        }        public TeamSelectorSettings Settings { get; set; }        public event TeamSelectorSettingsChanged SettingsChanged;        public event TeamSelectorSelectionChanged SelectionChanged;                private void UpdateSettings()        {            bool changed = false;            if (changed && (!EventSuppressor.IsSet(Suppress.This)))                SettingsChanged?.Invoke(this, new TeamSelectorSettingsChangedArgs(Settings));        }                private ListEntry[] _teams;        private Tuple<Guid,Guid,String>[] _employeeteams;        private CoreTable _employees;                public TeamSelector()        {            Settings = new TeamSelectorSettings();            using (new EventSuppressor(Suppress.This))                InitializeComponent();        }                public void Setup()        {            using (new EventSuppressor(Suppress.This))            {                MultiQuery query = new MultiQuery();                                query.Add<Team>(                    LookupFactory.DefineFilter<Team>(),                    new Columns<Team>(x => x.ID)                        .Add(x => x.Name),                    new SortOrder<Team>(x => x.Name)                );                                query.Add<Employee>(                    LookupFactory.DefineFilter<Employee>(),                    null,                    new SortOrder<Employee>(x=>x.Name)                );                                query.Add<EmployeeTeam>(                    LookupFactory.DefineFilter<EmployeeTeam>(),                    new Columns<EmployeeTeam>(x => x.TeamLink.ID)                        .Add(x => x.EmployeeLink.ID)                        .Add(x => x.EmployeeLink.Name)                );                query.Query();                _employees = query.Get<Employee>();                                _employeeteams = query.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(                        r => new Tuple<Guid,Guid,String>(                            CoreUtils.FullGuid,                            r.Get<Employee,Guid>(c=>c.ID),                            r.Get<Employee,String>(c=>c.Name)                        )                    )                    ).ToArray();                                _teams = query.Get<Team>().Rows.Select(                    r => new ListEntry()                    {                        Key = r.Get<Team, Guid>(c => c.ID),                         Value = r.Get<Team, String>(c => c.Name)                    }                ).ToArray();                SelectedTeams.ItemsSource = _teams;                            }        }                public T[] GetEmployeeData<T>(Func<CoreRow, T> transform)        {            List<T> result = new List<T>();            var selteams = GetSelectedTeams();            var empids = _employeeteams                .Where(x => selteams.Contains(CoreUtils.FullGuid) || selteams.Contains(x.Item1))                .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)                result.Add(transform.Invoke(row));            return result.ToArray();        }        private Guid[] GetSelectedTeams()        {            var jobs = (SelectedTeams.SelectedItems.Count == SelectedTeams.Items.Count)                ? new Guid[] { CoreUtils.FullGuid }                : SelectedTeams.SelectedItems                    .OfType<ListEntry>()                    .Select(x => x.Key)                    .ToArray();            return jobs;        }        public TeamSelectorData Selection        {            get => GetSelectionData();            set => SelectTeams(value);        }                private TeamSelectorData GetSelectionData()        {            return new TeamSelectorData(                GetSelectedTeams()            );        }                private void SelectTeams(TeamSelectorData selection)        {            using (new EventSuppressor(Suppress.This))            {                var sels = _teams.Where(x => selection.Teams.Contains(CoreUtils.FullGuid) || selection.Teams.Contains(x.Key));                SelectedTeams.SelectedItems.Clear();                foreach (var sel in sels)                    SelectedTeams.SelectedItems.Add(sel);            }                    }        private void SelectedTeams_OnItemChecked(object? sender, ItemCheckedEventArgs e)        {            if (EventSuppressor.IsSet(Suppress.This))                return;            UpdateSettings();            SelectionChanged?.Invoke(this, new TeamSelectorSelectionChangedArgs(GetSelectionData()));                    }    }}
 |