using System; using System.Collections.Generic; using System.Collections.ObjectModel; using InABox.Clients; using InABox.Core; using Comal.Classes; using Xamarin.Forms; using System.Linq; using System.Threading.Tasks; using comal.timesheets.CustomControls; using comal.timesheets.iOS.Assignments; using InABox.Configuration; using Syncfusion.Office; using Syncfusion.SfSchedule.XForms; using Xamarin.Forms.Xaml; using XF.Material.Forms; using XF.Material.Forms.UI.Dialogs; using XF.Material.Forms.UI.Dialogs.Configurations; namespace comal.timesheets { public enum AssignmentView { Day, TimeLine } public partial class AssignmentList : ContentPage { private AssignmentEdit _editor = null; private Guid[] _employeeids = new Guid[] { }; private AssignmentModuleSettings _settings = null; private AssignmentView _view = AssignmentView.Day; public AssignmentList() { InitializeComponent(); _settings = new LocalConfiguration().Load(); DatePicker.Date = _settings.Date.IsEmpty() ? DateTime.Today : _settings.Date; _view = _settings.View; _employeeids = (_settings.Employees != null) ? _settings.Employees : new Guid[] { App.Data.Employee.ID }; } protected override void OnAppearing() { base.OnAppearing(); Reload(); } private void Reload() { DayView.DataSource = null; TimeLineView.DataSource = null; if (_view == AssignmentView.Day) { DayViewColumn.Width = new GridLength(1, GridUnitType.Star); TimeLineViewColumn.Width = new GridLength(0, GridUnitType.Absolute); DayView.DayViewSettings.DayLabelSettings.TimeFormat = "HH:mm"; } else { DayViewColumn.Width = new GridLength(0, GridUnitType.Absolute); TimeLineViewColumn.Width = new GridLength(1, GridUnitType.Star); TimeLineView.ResourceViewSettings.VisibleResourceCount = Math.Max(1,Math.Min(8, _employeeids.Length)); TimeLineView.TimelineViewSettings.AppointmentHeight = (this.Height / TimeLineView.ResourceViewSettings.VisibleResourceCount) + 100; var resources = new ObservableCollection(); foreach (var empid in _employeeids) { var empname = GlobalVariables.EmployeeShells.FirstOrDefault(x => x.ID == empid)?.Name ?? empid.ToString(); resources.Add( new ScheduleResource() { Name = empname, //String.Join("", empname.Split(' ').Select(x=>x.Substring(0,1))), Id = empid, Color = Color.Red, Image = "" } ); } TimeLineView.ScheduleResources = resources; TimeLineView.ShowResourceView = true; } Refresh(); } private void Refresh() { Title.Text = $"{DatePicker.Date:dd MMMM yyyy}"; DataModel.Load( new Filter(x => x.Date).IsEqualTo(DatePicker.Date).And(x => x.EmployeeLink.ID).InList(_employeeids), () => { Dispatcher.BeginInvokeOnMainThread(() =>{ if (_view == AssignmentView.Day) DayView.DataSource = new ObservableCollection(DataModel.Items); else TimeLineView.DataSource = new ObservableCollection(DataModel.Items); }); } ); } private void BackButton_OnClicked(object sender, EventArgs e) { Navigation.PopAsync(); } private void SelectedDate_Tapped(object sender, EventArgs e) { DatePicker.Focus(); } private void DatePicker_OnDateSelected(object sender, DateChangedEventArgs e) { if (_employeeids.Any()) { _settings.Date = DatePicker.Date; new LocalConfiguration().Save(_settings); } DayView.MoveToDate = DatePicker.Date; TimeLineView.MoveToDate = DatePicker.Date; Dispatcher.BeginInvokeOnMainThread(()=> { Refresh(); }); } private async void SelectEmployees_Tapped(object sender, EventArgs e) { var actions = new List() { "Only Me" }; actions.AddRange(GlobalVariables.TeamEmployeeShells.Where(x=>x.ID == App.Data.Employee.ID).Select(x=>x.TeamName).Distinct()); var result = await MaterialDialog.Instance.SelectActionAsync(title: "Select a Team", actions: actions); if (result == 0) { _view = AssignmentView.Day; _employeeids = new Guid[] { App.Data.Employee.ID }; } else if (result > 0) { _view = AssignmentView.TimeLine; _employeeids = GlobalVariables.TeamEmployeeShells.Where(x => String.Equals(x.TeamName, actions[result])) .Select(x => x.ID).Distinct().ToArray(); } _settings.Employees = _employeeids; _settings.View = _view; new LocalConfiguration().Save(_settings); Dispatcher.BeginInvokeOnMainThread(()=> { Reload(); }); } private async void Schedule_OnCellTapped(object sender, CellTappedEventArgs e) { if (e.Appointment is AssignmentListDataModelItem item) { var editor = new AssignmentEdit(item); Navigation.PushAsync(editor); } } private async void Schedule_OnCellLongPressed(object sender, CellTappedEventArgs e) { if (e.Appointment == null) { if (InABox.Core.Security.CanEdit()) { var assignment = new Assignment() { Date = e.Datetime.Date, Start = new TimeSpan(e.Datetime.TimeOfDay.Hours,0,0), Finish = e.Datetime.TimeOfDay.Add(new TimeSpan(1, 0, 0)), Duration = new TimeSpan(1, 0, 0), Title = "New Assignment" }; assignment.EmployeeLink.ID = (e.Resource is ScheduleResource sr) ? (Guid)sr.Id : App.Data.Employee.ID; var editor = new AssignmentEdit(assignment); Navigation.PushAsync(editor); } } else if (InABox.Core.Security.CanDelete()) { var confirm = await MaterialDialog.Instance.ConfirmAsync( "Are you sure you wish to delete this assignment?", "Confirm Deletion", "Yes, Delete", "Cancel", new MaterialAlertDialogConfiguration() { ButtonFontFamily = Material.FontFamily.Body2 } ); if (confirm == true) { using(await MaterialDialog.Instance.LoadingDialogAsync(message: "Deleting Assignment")) { var assignment = new Assignment() { ID = (e.Appointment as AssignmentListDataModelItem).Id }; new Client().Delete(assignment, "Deleted on Mobile Device"); } Refresh(); } } } } }