using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using Comal.Classes; using FastReport.DataVisualization.Charting; using InABox.Clients; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using PRSDesktop.Panels.Employees; using Xceed.Wpf.Toolkit.PropertyGrid; namespace PRSDesktop { internal class EmployeeGrid : DynamicDataGrid { private bool ShowAll; private Button SendFormButton = null!; public EmployeeGrid() { } protected override void Init() { base.Init(); HiddenColumns.Add(x => x.Code); HiddenColumns.Add(x=>x.RosterTemplate.ID); HiddenColumns.Add(x=>x.RosterTemplate.Code); HiddenColumns.Add(x => x.RosterStart); ActionColumns.Add(new DynamicScheduleEditorColumn()); HiddenColumns.Add(x => x.ActiveSchedules); HiddenColumns.Add(x => x.Thumbnail.ID); HiddenColumns.Add(x => x.Thumbnail.FileName); ActionColumns.Add(new DynamicImageManagerColumn(this, x => x.Thumbnail, true) { Position = DynamicActionColumnPosition.Start }); ActionColumns.Add(new DynamicMenuColumn(MenuBuild) { Position = DynamicActionColumnPosition.End }); // AddButton("Activities", PRSDesktop.Resources.quality.AsBitmapImage(), ShowActivities); // AddButton("Available Forms", PRSDesktop.Resources.kanban.AsBitmapImage(), ShowRoleForms); //ActionColumns.Add(new DynamicEmployeeStatusColumn(x => x.InOut)); //HiddenColumns.Add(x => x.InOut); AddButton("Show All", PRSDesktop.Resources.anonymous.AsBitmapImage(Color.White), ToggleFinishedEmployees); SendFormButton = AddButton("Send Form", PRSDesktop.Resources.kanban.AsBitmapImage(Color.White), CreateEmployeeForms); } protected override void SelectItems(CoreRow[]? rows) { base.SelectItems(rows); SendFormButton.IsEnabled = rows is not null && rows.Length > 0; } private bool CreateEmployeeForms(Button button, CoreRow[] rows) { if(rows.Length == 0) { MessageBox.Show("Please select at least one row."); return false; } var select = new MultiSelectDialog( LookupFactory.DefineFilter(Array.Empty()), LookupFactory.DefineColumns() .Add(x => x.ID) .Add(x => x.Description), false); if (select.ShowDialog() == true) { var digitalForm = select.Data().Rows.FirstOrDefault()?.ToObject(); if (digitalForm is not null) { var employees = Client.Query( new Filter(x => x.Form.ID).IsEqualTo(digitalForm.ID), new Columns(x => x.Employee.ID)) .Rows.Select(x => x.Get(x => x.Employee.ID)) .ToArray(); var selectedEmployees = rows.Select(x => x.ToObject()).ToArray(); var warningEmployees = selectedEmployees.Where(x => !employees.Contains(x.ID)).ToArray(); if (warningEmployees.Any()) { var message = "The selected form is not usually available for "; if(warningEmployees.Length == 1) { message += warningEmployees[0].Code; } else { message += string.Join(',', warningEmployees.Take(warningEmployees.Length - 1).Select(x => x.Code)) + " and " + warningEmployees.Last().Code; } message += ", since it has not been assigned to their role"; if(warningEmployees.Length > 1) { message += "s"; } message += "; do you still wish to send this form?"; var result = MessageBox.Show(message, "Confirm", MessageBoxButton.YesNo); if(result != MessageBoxResult.Yes) { MessageBox.Show("Sending form cancelled."); return false; } } var employeeForms = new List(rows.Length); foreach(var employee in selectedEmployees) { var employeeForm = new EmployeeForm(); employeeForm.Form.ID = digitalForm.ID; employeeForm.Description = digitalForm.Description; employeeForm.Parent.ID = employee.ID; employeeForms.Add(employeeForm); } Client.Save(employeeForms, "Assigned to employee by user"); MessageBox.Show("Form sent."); } } return false; } protected override void DoReconfigure(FluentList options) { base.DoReconfigure(options); options.AddRange( DynamicGridOption.FilterRows, DynamicGridOption.SelectColumns, DynamicGridOption.MultiSelect ); } private void MenuBuild(DynamicMenuColumn column, CoreRow? row) { if (row is null) return; var newItem = column.AddItem("Digital Forms", null, null); DynamicGridUtils.PopulateFormMenu( newItem, row.Get(x => x.ID), row.ToObject); column.AddSeparator(); column.AddItem("Activities", PRSDesktop.Resources.quality, ShowActivitiesWindow); column.AddItem("Available Forms", PRSDesktop.Resources.kanban, ShowRoleFormsWindow); } private void ShowActivitiesWindow(CoreRow? row) { if (row is null) return; DynamicGridUtils.CreateGridWindow("Employee Activities", new EmployeeActivityGrid() { Left = row.ToObject() }).ShowDialog(); } private void ShowRoleFormsWindow(CoreRow? row) { if (row is null) return; DynamicGridUtils.CreateGridWindow("Employee Role Forms", new EmployeeRoleFormGrid() { Left = row.ToObject() }).ShowDialog(); } private bool ShowActivities(Button button, CoreRow[] rows) { if(rows.Length == 0) { MessageBox.Show("Please select an employee."); return false; } else if(rows.Length > 1) { MessageBox.Show("Please select only one employee"); return false; } ShowActivitiesWindow(rows[0]); return false; } private bool ShowRoleForms(Button button, CoreRow[] rows) { if(rows.Length == 0) { MessageBox.Show("Please select an employee."); return false; } else if(rows.Length > 1) { MessageBox.Show("Please select only one employee"); return false; } ShowRoleFormsWindow(rows[0]); return false; } public Employee[] Employees { get; private set; } private bool ToggleFinishedEmployees(Button btn, CoreRow[] rows) { ShowAll = !ShowAll; UpdateButton(btn, PRSDesktop.Resources.anonymous.AsBitmapImage(Color.White), ShowAll ? "Hide Finished" : "Show All"); return true; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder? sort, Action action) { if (!ShowAll) criteria.Add(new Filter(x => x.FinishDate).IsEqualTo(DateTime.MinValue)); base.Reload(criteria, columns, ref sort, action); } protected override BaseEditor? GetEditor(object item, DynamicGridColumn column) { if (column.ColumnName.StartsWith($"{nameof(Employee.OrgChart)}.")) { if (!Security.IsAllowed()) return new NullEditor(); var orgChartSettings = new GlobalConfiguration().Load(); if (orgChartSettings.Layout != OrgChartLayout.Employee) return new NullEditor(); } return base.GetEditor(item, column); } } }