private void button_JobReload_Click(object sender, RoutedEventArgs e) { if (job != null) { job = App.jobStore.getJobById(job.id); parent.updateScheduledJobs(job); // Force setJob(job); } }
private void buttonDelete_Click(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show($"Are you sure you want to delete this job ?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.No) { return; } job = App.jobStore.getJobById(job.id); if (job.status == JobStatus.TERMINATED || job.status == JobStatus.CANCELLED) { App.jobStore.deleteJob(job); } reset(); parent.updateScheduledJobs(); }
private void buttonCancel_Click(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show($"Are you sure you want to cancel this job ?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.No) { return; } job = App.jobStore.getJobById(job.id); if (job.status == JobStatus.CREATED || job.status == JobStatus.SCHEDULED) { job.unSchedule(); job.status = JobStatus.CANCELLED; App.jobStore.updateJob(job); } setJob(job); parent.updateScheduledJobs(); }
/// <summary> /// Show a job in the panel. If the job is null, the panel will be reset /// </summary> /// <param name="job">The job to show</param> public void setJob(Scheduling.Job job) { this.job = job; if (job == null) { reset(); return; } if (job.status == JobStatus.CREATED) { elementToDisable.ForEach(element => element.IsEnabled = true); } else { elementToDisable.ForEach(element => element.IsEnabled = false); } label_jobDetailsTitle.Content = "Selected Job"; textBox_TaskName.Text = job.name; if (job.executeNow) { jobNowCheckbox.IsChecked = true; jobCyclicCheckbox.IsChecked = false; textBox_plannedTrigger.Text = string.Empty; } else { jobNowCheckbox.IsChecked = false; jobCyclicCheckbox.IsChecked = job.cyclic; textBox_plannedTrigger.Text = job.triggerDescription; } // Selected computers selectedComputersGrid.SelectedItems.Clear(); foreach (Computer c in selectedComputersGrid.Items) { foreach (ComputerInfo ci in job.computers) { if (ci.name == c.nameLong) { selectedComputersGrid.SelectedItems.Add(c); break; } } } // Tasks tasksPanel.Children.Clear(); foreach (JobTask task in job.tasks) { dynamic panel = null; switch (task.type) { case JobTaskType.INSTALL_SOFTWARE: panel = new TaskInstall(); break; case JobTaskType.REBOOT: panel = new TaskReboot(); break; case JobTaskType.SHUTDOWN: panel = new TaskShutdown(); break; case JobTaskType.WAKE_ON_LAN: panel = new TaskWakeOnLan(); break; } if (panel != null) { panel.initFromTask(task); tasksPanel.Children.Add(panel); } } // Actions accordingly to the status switch (job.status) { case JobStatus.CANCELLED: case JobStatus.TERMINATED: buttonShowReport.Visibility = Visibility.Visible; buttonCancel.Visibility = Visibility.Collapsed; buttonDelete.Visibility = Visibility.Visible; parent.jobReportDetails.setJob(job); break; case JobStatus.SCHEDULED: buttonShowReport.Visibility = Visibility.Visible; buttonDelete.Visibility = Visibility.Collapsed; buttonCancel.Visibility = Visibility.Visible; buttonCancel.IsEnabled = true; parent.jobReportDetails.setJob(job); break; case JobStatus.IN_PROGRESS: buttonShowReport.Visibility = Visibility.Visible; buttonDelete.Visibility = Visibility.Collapsed; buttonCancel.Visibility = Visibility.Visible; buttonCancel.IsEnabled = false; break; case JobStatus.CREATED: default: buttonShowReport.Visibility = Visibility.Collapsed; buttonDelete.Visibility = Visibility.Collapsed; buttonCancel.Visibility = Visibility.Collapsed; break; } buttonCreateJob.Visibility = Visibility.Collapsed; }
private void buttonCreateJob_Click(object sender, RoutedEventArgs e) { // If a trigger is defined if (trigger == null && !jobNowCheckbox.IsChecked.Value) { MessageBox.Show("Error : An execution trigger must be provided to the job", "Job creation error"); return; } // Get the selected computers if (selectedComputersGrid.SelectedItems.Count <= 0) { MessageBox.Show("Error : No computer selected. At least one computer should be selected", "Job creation error"); return; } var selectedComputers = new List <ComputerInfo>(); foreach (Computer c in selectedComputersGrid.SelectedItems) { selectedComputers.Add(App.computerInfoStore.getComputerInfoByName(c.nameLong)); } // Get the tasks var tasks = new List <JobTask>(); foreach (dynamic element in tasksPanel.Children) { JobTask jobTask = element.createTask(); if (jobTask == null) { return; // Error during jobtask creation } tasks.Add(jobTask); } if (tasks.Count <= 0) { MessageBox.Show("Error : No task defined. At least one taks should be defined", "Job creation error"); return; } // OK, create the job var job = new Scheduling.Job { creationDateTime = DateTime.Now, cyclic = jobCyclicCheckbox.IsChecked.Value, executeNow = trigger == null, triggerDescription = trigger != null?trigger.ToString() : "As soon as possible", computers = selectedComputers, status = JobStatus.SCHEDULED, tasks = tasks, name = textBox_TaskName.Text }; // Insert into the job store App.jobStore.insertJob(job); // Create a windows task if (jobNowCheckbox.IsChecked.Value) { job.schedule(); } else { job.schedule(trigger); } parent.updateScheduledJobs(); reset(); }
public void setJob(Scheduling.Job job) { this.job = job; textBox_CreationDate.Text = job.creationDateTime.ToString("f", CultureInfo.CreateSpecificCulture("fr-FR")); textBox_LastExecutionDate.Text = job.lastExecutionDateTime != DateTime.MinValue ? job.lastExecutionDateTime.ToString("f", CultureInfo.CreateSpecificCulture("fr-FR")) : "Never"; textBox_StartTrigger.Text = job.triggerDescription; float success = job.reports.Aggregate(0, (sum, jr) => jr.error ? sum : sum + 1) / (float)job.reports.Count * 100f; string message = null; foreach (var msg in messages) { if (success >= msg.Item1) { message = msg.Item2; break; } } if (success < 0 || float.IsNaN(success)) { textBox_SuccessRate.Content = "-"; } else { textBox_SuccessRate.Content = $"{message} ({(int)success}%)"; } // Grid clear detailsGrid.Items.Clear(); detailsGrid.Columns.Clear(); // Column creation detailsGrid.Columns.Add(new DataGridTextColumn { Header = "Computer Name", Binding = new Binding("computerName") }); detailsGrid.Columns.Add(new DataGridTextColumn { Header = "Start", Binding = new Binding("startDateTime") }); detailsGrid.Columns.Add(new DataGridTextColumn { Header = "End", Binding = new Binding("endDateTime") }); detailsGrid.Columns.Add(new DataGridTextColumn { Header = "Duration", Binding = new Binding("duration") }); int i = 0; foreach (var task in job.tasks) { detailsGrid.Columns.Add(new DataGridTextColumn { Header = headers.GetValueOrDefault(task.type), Binding = new Binding($"task{i}") }); i++; } // Row creations foreach (var report in job.reports) { var dynamicObject = new ExpandoObject() as IDictionary <string, object>; dynamicObject.Add("computerName", report.computerName); dynamicObject.Add("startDateTime", report.startDateTime.ToString("dd/MM/yyyy HH:mm:ss")); dynamicObject.Add("endDateTime", report.endDateTime.ToString("dd/MM/yyyy HH:mm:ss")); var diff = (report.endDateTime - report.startDateTime); dynamicObject.Add("duration", (int)diff.TotalMinutes + " minutes " + (int)(diff.TotalSeconds % 60) + " seconds"); for (i = 0; i < job.tasks.Count; i++) { if (report.tasksReports.Count > i) { dynamicObject.Add($"task{i}", report.tasksReports[i].error ? "Failed" : "Success"); } else { dynamicObject.Add($"task{i}", "-"); } } detailsGrid.Items.Add(dynamicObject); } // Row styling for (i = 0; i < job.reports.Count; i++) { for (int j = 0; j < job.reports[i].tasksReports.Count; j++) { var cell = detailsGrid.GetCell(i, j + 4); if (cell != null) { switch ((cell.Content as TextBlock).Text) { case "-": cell.Background = Brushes.LightYellow; break; case "Failed": cell.Background = Brushes.Red; break; case "Success": cell.Background = Brushes.LightGreen; break; } } } } }