using System; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Comal.Classes; using InABox.Clients; using InABox.Core; using Syncfusion.Drawing; using Xamarin.Forms; using Xamarin.Forms.Xaml; using XF.Material.Forms.UI.Dialogs; namespace comal.timesheets { public class AssignmentDetailsChangedArgs : EventArgs { public string Property { get; } public AssignmentDetailsChangedArgs(String property) { Property = property; } } public delegate void AssignmentDetailsChangedDelegate(object sender, AssignmentDetailsChangedArgs args); [XamlCompilation(XamlCompilationOptions.Compile)] public partial class AssignmentDetails : ContentView, IAssignmentPage { public event AssignmentDetailsChangedDelegate OnDetailsChanged; public AssignmentEditDataModel DataModel => BindingContext as AssignmentEditDataModel; public AssignmentDetails() { InitializeComponent(); } public void Load() { bool open = DataModel.Item.Completed.IsEmpty(); Completed.Text = open ? "Complete" : InABox.Core.Security.CanEdit() ? "Re-Open" : $"Completed {DataModel.Item.Completed:dd/MM/yy}"; Subject.IsEnabled = open && InABox.Core.Security.CanEdit(); Start.IsEnabled = open && InABox.Core.Security.CanEdit(); Finish.IsEnabled = open && InABox.Core.Security.CanEdit(); Job.IsEnabled = open && InABox.Core.Security.CanEdit(); Task.IsEnabled = open && InABox.Core.Security.CanEdit(); Activity.IsEnabled = open && InABox.Core.Security.CanEdit(); Description.IsEnabled = open && InABox.Core.Security.CanEdit(); Completed.IsEnabled = open || InABox.Core.Security.CanEdit(); } private async void Activity_Clicked(object sender, EventArgs e) { try { GenericSelectionPage page = new GenericSelectionPage( "Select Activity", new SelectionViewModel( new Filter(x => x.Employee.ID).IsEqualTo(App.Data.Employee.ID), new Expression>[] { x => x.Activity.Code, x => x.Activity.Description }, new Expression>[] { x => x.Activity.ID }, new SortOrder(x => x.Activity.Code) ) ); page.OnItemSelected += (row) => { Device.BeginInvokeOnMainThread(() => { DataModel.Item.ActivityID = row.Get(c => c.Activity.ID); DataModel.Item.ActivityCode = row.Get(c => c.Activity.Code); DataModel.Item.ActivityDescription = row.Get(c => c.Activity.Description); OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Activity")); }); }; Navigation.PushAsync(page); } catch { } } private void Job_Clicked(object sender, EventArgs e) { try { GenericSelectionPage page = new GenericSelectionPage( "Select Job", new SelectionViewModel( new Filter(x => x.JobStatus.Active).IsEqualTo(true), new Expression>[] { x => x.JobNumber, x => x.Name }, new Expression>[] { x => x.ID, x=>x.SiteAddress.Location.Latitude, x=>x.SiteAddress.Location.Longitude }, new SortOrder(x => x.JobNumber,SortDirection.Descending) ) ); page.OnItemSelected += (row) => { Device.BeginInvokeOnMainThread(() => { DataModel.Item.JobID = row.Get(c => c.ID); DataModel.Item.JobNumber = row.Get(c => c.JobNumber); DataModel.Item.JobName = row.Get(c => c.Name); DataModel.Coordinates = new PointF( (float)row.Get(c => c.SiteAddress.Location.Longitude), (float)row.Get(c => c.SiteAddress.Location.Latitude) ); OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Job")); }); }; Navigation.PushAsync(page); } catch { } } private void Task_Clicked(object sender, EventArgs e) { try { GenericSelectionPage page = new GenericSelectionPage( "Select Task", new SelectionViewModel( new Filter(x => x.Completed).IsEqualTo(DateTime.MinValue), new Expression>[] { x => x.Number, x => x.Title }, new Expression>[] { x => x.ID}, new SortOrder(x => x.Number, SortDirection.Descending) ) ); page.OnItemSelected += (row) => { Device.BeginInvokeOnMainThread(() => { DataModel.Item.TaskID = row.Get(c => c.ID); DataModel.Item.TaskNumber = row.Get(c => c.Number); DataModel.Item.TaskName = row.Get(c => c.Title); OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Task")); }); }; Navigation.PushAsync(page); } catch { } } private async void Complete_Clicked(object sender, EventArgs e) { if (!DataModel.Item.Completed.IsEmpty()) { DataModel.Item.Completed = DateTime.MinValue; DataModel.Save("Re-opened on Mobile Device"); Load(); return; } bool bOpenForms = DataModel.Forms.Any(x => !x.Completed); if (bOpenForms) { await MaterialDialog.Instance.AlertAsync("Please finish all open forms before completing this assignment","Open Forms Found"); return; } bool bConfirm = await MaterialDialog.Instance.ConfirmAsync(message: "Complete Assignment?", confirmingText: "Yes", dismissiveText: "No") == true; if (bConfirm) { DataModel.Item.Completed = DateTime.Now; DataModel.Save("Completed on Mobile Device"); Navigation.PopAsync(); } } private void Start_OnUnfocused(object sender, FocusEventArgs e) { OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Start")); } private void Finish_OnUnfocused(object sender, FocusEventArgs e) { OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Finish")); } private void Description_OnTextChanged(object sender, TextChangedEventArgs e) { if (Description.IsFocused) OnDetailsChanged?.Invoke(this, new AssignmentDetailsChangedArgs("Description")); } private void Subject_OnTextChanged(object sender, TextChangedEventArgs e) { if (Subject.IsFocused) OnDetailsChanged?.Invoke(this,new AssignmentDetailsChangedArgs("Subject")); } } }