public void UpdatePage()
        {
            this.Dispatcher.Invoke(() =>
            {
                try
                {
                    if (mainController.Project != null)
                    {
                        using (MySqlDataReader dataReader = new ProjectDAO().GetDashboardStats(mainController.Project.Id, mainController.User.Id))
                        {
                            if (dataReader.Read())
                            {
                                tasksLeft      = dataReader.IsDBNull(2) ? 0 : dataReader.GetInt16("TasksLeft");
                                tasksCompleted = dataReader.IsDBNull(3) ? 0 : dataReader.GetInt16("TasksCompleted");
                                yourTasks      = dataReader.IsDBNull(4) ? 0 : dataReader.GetInt16("YourTasks");
                                daysLeft       = dataReader.IsDBNull(5) ? "Ingen" : dataReader.GetInt16("DaysLeft") + " dage";
                            }
                        }

                        mySQLConnector.CloseConnections();

                        UpdateQuickStats();
                        UpdateCharts();
                    }
                }
                catch (Exception exception)
                {
                    utilities.GetNotifier().ShowError(utilities.HandleException(exception));
                }
            });
        }
        public Dashboard()
        {
            InitializeComponent();
            mainController.Dashboard = this;

            try
            {
                if (mainController.Project != null)
                {
                    using (MySqlDataReader dataReader = new ProjectDAO().GetDashboardStats(mainController.Project.Id, mainController.User.Id))
                    {
                        if (dataReader.Read())
                        {
                            tasksLeft      = dataReader.IsDBNull(2) ? 0 : dataReader.GetInt16("TasksLeft");
                            tasksCompleted = dataReader.IsDBNull(3) ? 0 : dataReader.GetInt16("TasksCompleted");
                            yourTasks      = dataReader.IsDBNull(4) ? 0 : dataReader.GetInt16("YourTasks");
                            daysLeft       = dataReader.IsDBNull(5) ? "Ingen" : dataReader.GetInt16("DaysLeft") + " dage";
                        }
                    }

                    mySQLConnector.CloseConnections();

                    SetupQuickStats();
                    SetupCharts();

                    worker         = new BackgroundWorker();
                    worker.DoWork += WorkerUpdater;
                    Timer timer = new Timer(60000);
                    timer.Elapsed += TimerElapsed;
                    timer.Start();
                }
            }
            catch
            {
                throw;
            }
        }
        public BurndownChart()
        {
            InitializeComponent();

            try
            {
                mySQLConnector      = MySQLConnector.Instance;
                HorizontalAlignment = HorizontalAlignment.Left;

                Project project = MainController.Instance.Project;


                if (project.DueDate != DateTime.MinValue)
                {
                    MySqlDataReader dataReader = new ProjectDAO().GetBurndwonChartData(project.Id);

                    if (dataReader.Read())
                    {
                        days          = dataReader.IsDBNull(3) ? 0 : dataReader.GetInt16("ProjectLength");
                        totalWork     = dataReader.IsDBNull(1) ? 0 : dataReader.GetInt16("TotalWork");
                        daysFromStart = dataReader.IsDBNull(4) ? 0 : dataReader.GetInt16("DaysFromStart");
                        workDone      = dataReader.IsDBNull(2) ? 0 : dataReader.GetInt16("WorkDone");
                    }

                    // Get values for target line
                    ChartValues <double> target = new ChartValues <double>();

                    for (int i = 0; i <= days; i++)
                    {
                        if (target.Count == 0)
                        {
                            target.Add(totalWork);
                        }
                        else if (i == days)
                        {
                            target.Add(0);
                        }
                        else
                        {
                            target.Add(Math.Round(target[i - 1] - (totalWork / days), 2));
                        }
                    }

                    // Get values for actual work done
                    ChartValues <double> actual           = new ChartValues <double>();
                    MySqlDataReader      dataReaderActual = new WorkLogDAO().GetWorkLogByProject(project.Id);

                    List <WorkLog> workLogs = new List <WorkLog>();

                    if (dataReaderActual != null)
                    {
                        while (dataReaderActual.Read())
                        {
                            workLogs.Add(new WorkLog(null, 0, dataReaderActual.IsDBNull(0) ? 0 : dataReaderActual.GetInt16("Work"), (DateTime)dataReaderActual.GetMySqlDateTime("Date")));
                        }

                        for (int i = 0; i <= daysFromStart; i++)
                        {
                            if (actual.Count == 0)
                            {
                                actual.Add(totalWork);
                            }
                            else
                            {
                                bool foundWork = false;

                                foreach (WorkLog work in workLogs)
                                {
                                    if (work.CreatedAt.Date.Equals(project.CreatedAt.AddDays(i).Date))
                                    {
                                        actual.Add(actual[actual.Count - 1] - work.Work);
                                        workLogs.Remove(work);
                                        foundWork = true;
                                        break;
                                    }

                                    if (work.Equals(workLogs.Last()))
                                    {
                                        foundWork = false;
                                    }
                                }

                                if (!foundWork)
                                {
                                    actual.Add(actual[actual.Count - 1]);
                                }
                            }
                        }
                    }

                    SeriesCollection = new SeriesCollection
                    {
                        new LineSeries
                        {
                            Title          = "Gudieline",
                            Values         = target,
                            LineSmoothness = 0
                        },
                        new LineSeries
                        {
                            Title          = "Arbejde tilbage",
                            Values         = actual,
                            LineSmoothness = 0
                        }
                    };

                    DataContext = this;

                    Chart.Series = SeriesCollection;
                    Chart.AxisY.Clear();
                    Chart.AxisY.Add(
                        new Axis
                    {
                        MinValue  = 0,
                        Title     = "Estimat",
                        Separator = new Separator {
                            Stroke = new Utilities().GetColor("#546e7a")
                        },
                        FontSize = 14
                    });

                    Chart.AxisX.Clear();
                    Chart.AxisX.Add(
                        new Axis
                    {
                        MinValue  = 0,
                        Title     = "Tidslinje",
                        Separator = new Separator {
                            Stroke = new Utilities().GetColor("#546e7a")
                        },
                        FontSize = 14
                    });

                    if (days <= 12)
                    {
                        Chart.AxisX[0].Separator.Step = 1;
                    }


                    mySQLConnector.CloseConnections(dataReader);
                    mySQLConnector.CloseConnections(dataReaderActual);
                }
            }
            catch
            {
                throw;
            }
        }
        public void UpdateChart()
        {
            try
            {
                Project project = MainController.Instance.Project;

                int    days = 0, daysFromStart = 0, workDone = 0;
                double totalWork = 0;

                if (project.DueDate != DateTime.MinValue)
                {
                    MySqlDataReader dataReader = new ProjectDAO().GetBurndwonChartData(project.Id);

                    if (dataReader.Read())
                    {
                        days          = dataReader.IsDBNull(3) ? 0 : dataReader.GetInt16("ProjectLength");
                        totalWork     = dataReader.IsDBNull(1) ? 0 : dataReader.GetInt16("TotalWork");
                        daysFromStart = dataReader.IsDBNull(4) ? 0 : dataReader.GetInt16("DaysFromStart");
                        workDone      = dataReader.IsDBNull(2) ? 0 : dataReader.GetInt16("WorkDone");
                    }

                    mySQLConnector.CloseConnections(dataReader);

                    if (this.days != days || this.daysFromStart != daysFromStart || !this.totalWork.Equals(totalWork) || !this.workDone.Equals(workDone))
                    {
                        this.days          = days;
                        this.daysFromStart = daysFromStart;
                        this.totalWork     = totalWork;
                        this.workDone      = workDone;

                        // Get values for target line
                        ChartValues <double> target = new ChartValues <double>();

                        for (int i = 0; i <= days; i++)
                        {
                            if (target.Count == 0)
                            {
                                target.Add(totalWork);
                            }
                            else if (i == days)
                            {
                                target.Add(0);
                            }
                            else
                            {
                                target.Add(Math.Round(target[i - 1] - (totalWork / days), 2));
                            }
                        }

                        // Get values for actual work done
                        ChartValues <double> actual           = new ChartValues <double>();
                        MySqlDataReader      dataReaderActual = new WorkLogDAO().GetWorkLogByProject(project.Id);

                        List <WorkLog> workLogs = new List <WorkLog>();

                        if (dataReaderActual != null)
                        {
                            while (dataReaderActual.Read())
                            {
                                workLogs.Add(new WorkLog(null, 0, dataReaderActual.IsDBNull(0) ? 0 : dataReaderActual.GetInt16("Work"), (DateTime)dataReaderActual.GetMySqlDateTime("Date")));
                            }

                            for (int i = 0; i <= daysFromStart; i++)
                            {
                                if (actual.Count == 0)
                                {
                                    actual.Add(totalWork);
                                }
                                else
                                {
                                    bool foundWork = false;

                                    foreach (WorkLog work in workLogs)
                                    {
                                        if (work.CreatedAt.Date.Equals(project.CreatedAt.AddDays(i).Date))
                                        {
                                            actual.Add(actual[actual.Count - 1] - work.Work);
                                            workLogs.Remove(work);
                                            foundWork = true;
                                            break;
                                        }

                                        if (work.Equals(workLogs.Last()))
                                        {
                                            foundWork = false;
                                        }
                                    }

                                    if (!foundWork)
                                    {
                                        actual.Add(actual[actual.Count - 1]);
                                    }
                                }
                            }
                        }

                        SeriesCollection[0].Values = target;
                        SeriesCollection[1].Values = actual;

                        mySQLConnector.CloseConnections(dataReaderActual);
                    }
                }
            }
            catch
            {
                throw;
            }
        }