using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using Comal.Classes; using Comal.Classes.SecurityDescriptors; using InABox.Configuration; using Xamarin.Forms.Xaml; using InABox.Core; using InABox.Mobile; using InABox.Mobile.Shared; namespace PRS.Mobile { [XamlCompilation(XamlCompilationOptions.Compile)] public partial class SiteModule { private JobShell _job; private SiteModuleSettings _settings; private CancellationTokenSource _pollingToken; public SiteModule() { _settings = new LocalConfiguration().Load(); InitializeComponent(); ProgressVisible = true; SiteDocuments.IsVisible = Security.IsAllowed(); // ** Not Yet Implemented ** //CanApproveJobRequisitions.IsVisible = InABox.Core.Security.CanView() Manufacturing.IsVisible = Security.IsAllowed(); JobTasks.IsVisible = Security.IsAllowed(); JobRequis.IsVisible = Security.IsAllowed(); Task.Run(() => { App.Data.Jobs.Refresh(false); _job = App.Data.Jobs.FirstOrDefault(x => x.ID == _settings.JobID); }).BeginInvokeOnMainThread((task) => { SelectJob.Text = _job?.DisplayName ?? "Select Job"; SiteForms.Alert = ""; SelectJob.IsEnabled = true; EnableModules(); ProgressVisible = false; }); } protected override void OnAppearing() { _pollingToken = new CancellationTokenSource(); StartMonitoringITPForms(); StartMonitoringForms(); StartMonitoringTasks(); base.OnAppearing(); } protected override void OnDisappearing() { base.OnDisappearing(); _pollingToken.Cancel(); } private void StartMonitoringITPForms() { var token = _pollingToken.Token; Task.Run(() => { while (!_pollingToken.Token.IsCancellationRequested) { Guid jobid = _job?.ID ?? Guid.Empty; if (App.Data.IsConnected() && (jobid != Guid.Empty)) { var _model = new JobITPFormModel(App.Data, () => new Filter(x => x.Parent.Job.ID).IsEqualTo(jobid).And(x=>x.Form.ID).IsNotEqualTo(Guid.Empty) ); _model.Refresh(true); Dispatcher.BeginInvokeOnMainThread(() => { int count = _model.Items.Count(x => x.Completed.IsEmpty()); SiteITPForms.Alert = count > 0 ? count.ToString() : ""; }); } else Dispatcher.BeginInvokeOnMainThread(() => { SiteITPForms.Alert = ""; }); Task.Delay(TimeSpan.FromSeconds(30), token) .Wait(token); } }, token ); } private void StartMonitoringForms() { var token = _pollingToken.Token; Task.Run(() => { while (!_pollingToken.Token.IsCancellationRequested) { Guid jobid = _job?.ID ?? Guid.Empty; if (App.Data.IsConnected() && (jobid != Guid.Empty)) { JobFormModel _model = new JobFormModel(App.Data, () => new Filter(x => x.Parent.ID).IsEqualTo(jobid)); _model.Refresh(true); Dispatcher.BeginInvokeOnMainThread(() => { int count = _model.Items.Count(x => x.Completed.IsEmpty()); SiteForms.Alert = count > 0 ? count.ToString() : ""; }); } else Dispatcher.BeginInvokeOnMainThread(() => { SiteForms.Alert = ""; }); Task.Delay(TimeSpan.FromSeconds(30), token) .Wait(token); } }, token ); } private void StartMonitoringTasks() { var token = _pollingToken.Token; Task.Run( async () => { while (!_pollingToken.Token.IsCancellationRequested) { Guid jobid = _job?.ID ?? Guid.Empty; if (App.Data.IsConnected() && (jobid != Guid.Empty)) { var _model = new JobKanbanModel( App.Data, () => new Filter(x => x.JobLink.ID).IsEqualTo(jobid) ); _model.Refresh(true); Dispatcher.BeginInvokeOnMainThread(() => { int count = _model.Items.Count(x=>x.Status == KanbanStatus.Open); JobTasks.Alert = count > 0 ? count.ToString() : ""; }); } else Dispatcher.BeginInvokeOnMainThread(() => { JobTasks.Alert = ""; }); Task.Delay(TimeSpan.FromSeconds(30), token) .Wait(token); } }, token ); } protected override void UpdateTransportStatus() { base.UpdateTransportStatus(); EnableModules(); } private void EnableModules() { foreach (var menu in Menu.Items) menu.IsEnabled = App.Data.IsConnected() && (_job != null); } private void SelectJobBtn_Clicked(object sender, EventArgs e) { SelectionPage jobs = new JobSelectionPage( (job) => { var _sitesettings = new LocalConfiguration().Load(); _sitesettings.FolderID = Guid.Empty; new LocalConfiguration().Save(_sitesettings); new LocalConfiguration().Save(new SiteModuleSettings() { JobID = job.ID }); _job = job; SelectJob.Text = _job?.DisplayName ?? "Select Job"; SiteForms.Alert = ""; }); Navigation.PushAsync(jobs); } private void SiteITPForms_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new SiteITPs(_job)); } private void SiteDocuments_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new SiteDocuments(_job)); } private void SiteForms_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new SiteForms(_job)); } private void GeneralDocuments_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new JobWebDocuments(_job)); } // private void JobRequisitions_OnTapped(ModuleMenuItem sender, ModuleMenuItemTappedArgs args) // { // throw new NotImplementedException(); // } private void Manufacturing_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new SiteManufacturing(_job)); } private void JobTasks_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { var model = new JobKanbanModel( App.Data, () => new Filter(x => x.JobLink.ID).IsEqualTo(_job?.ID ?? CoreUtils.FullGuid), () => CoreRepository.CacheFileName($"{_job.ID}.") ); model.ItemAdded += (o, createdArgs) => { createdArgs.Item.JobID = _job.ID; createdArgs.Item.JobNumber = _job.JobNumber; createdArgs.Item.JobName = _job.Name; }; var jobtasks = new KanbanList() { Model = model, Title = _job?.DisplayName ?? "Job Tasks" }; Navigation.PushAsync(jobtasks); } private void JobRequis_OnTapped(MobileModuleItem sender, ModuleMenuItemTappedArgs args) { Navigation.PushAsync(new RequisitionList(_job, RequisitionEditMode.EditRequest)); } } }