public ActionResult Create(Guid dashboardId)
        {
            ViewBag.IsEdit = false;
            ViewBag.PageName = PAGE_CSS_PANEL_EDIT_CREATE;

            var uow = Helper.GetUnitOfWorkByCurrentUser();
            var dashboard = uow.Dashboards.Get(f => f.Id == dashboardId).FirstOrDefault();

            var model = new PanelModel();

            if (dashboard.Panels == null || dashboard.Panels.Count == 0)
                model.PanelOrder = 1;
            else
                model.PanelOrder = dashboard.Panels.Max(f => f.PanelOrder) + 1;

            if (Request.IsAjaxRequest())
                return PartialView(CREATE_OR_EDIT_TEMPLATE, model);

            return View(CREATE_OR_EDIT_TEMPLATE, model);
        }
        public ActionResult Create(Guid dashboardId, PanelModel model)
        {
            ViewBag.IsEdit = false;
            ViewBag.PageName = PAGE_CSS_PANEL_EDIT_CREATE;

            if (ModelState.IsValid)
            {
                var uow = Helper.GetUnitOfWorkByCurrentUser();
                var dashboard = uow.Dashboards.Get(f => f.Id == dashboardId).FirstOrDefault();

                var panel = this.ConvertModelToObjectDomain(model);
                panel.Id = Guid.NewGuid();
                panel.CreateDate = DateTime.Now;
                panel.LastUpdateDate = panel.CreateDate;

                if (dashboard.Panels == null)
                    dashboard.Panels = new List<Panel>();

                dashboard.Panels.Add(panel);

                // reorder panels
                dashboard.ReorderPanel(panel, panel.PanelOrder);

                // save dashboard
                uow.Dashboards.Update(dashboard);

                if (Request.IsAjaxRequest())
                    return Json(new { Success = true });

                return RedirectToDashboard(dashboard.FriendlyUrl);
            }
            else
            {
                if (Request.IsAjaxRequest())
                    return PartialView(CREATE_OR_EDIT_TEMPLATE, model);

                return View(CREATE_OR_EDIT_TEMPLATE, model);
            }
        }
        private Panel ConvertModelToObjectDomain(PanelModel model)
        {
            var panel = new Panel();
            panel.Title = model.Title;
            panel.PanelOrder = model.PanelOrder;
            panel.PanelWidth = model.PanelWidth;
            panel.PanelComponents = model.PanelComponents;
            panel.DisplayY = model.DisplayY;

            panel.GroupBy = model.GroupBy;
            panel.GroupByOrderBy = model.GroupByOrderBy;
            panel.GroupByOrderByClassification = model.GroupByOrderByClassification;
            panel.GroupByOrderByGroup = model.GroupByOrderByGroup;
            panel.GroupByOrderByGroupClassification = model.GroupByOrderByGroupClassification;

            panel.GroupBy2 = model.GroupBy2;
            panel.GroupByOrderBy2 = model.GroupByOrderBy2;
            panel.GroupByOrderByClassification2 = model.GroupByOrderByClassification2;
            panel.GroupByOrderByGroup2 = model.GroupByOrderByGroup2;
            panel.GroupByOrderByGroupClassification2 = model.GroupByOrderByGroupClassification2;

            panel.GroupBy3 = model.GroupBy3;
            panel.GroupByOrderBy3 = model.GroupByOrderBy3;
            panel.GroupByOrderByClassification3 = model.GroupByOrderByClassification3;
            panel.GroupByOrderByGroup3 = model.GroupByOrderByGroup3;
            panel.GroupByOrderByGroupClassification3 = model.GroupByOrderByGroupClassification3;

            //panel.OrderBy = model.OrderBy;
            //panel.OrderByClassification = model.OrderByClassification;
            panel.Filter = new TransactionFilter();
            panel.Filter.TransactionType = model.FilterTransactionType;
            panel.Filter.DateStart = model.FilterDateStart;
            panel.Filter.DateEnd = model.FilterDateEnd;
            panel.Filter.ValueStart = model.FilterValueStart;
            panel.Filter.ValueEnd = model.FilterValueEnd;
            panel.ViewName = model.ViewName;

            // depois tenho que apagar o orderby e orderbyclassification
            panel.Filter.OrderBy = model.OrderBy;
            panel.Filter.OrderByClassification = model.OrderByClassification;

            if (!string.IsNullOrWhiteSpace(model.FilterCategories))
            {
                panel.Filter.Categories = new List<string>();
                panel.Filter.Categories = model.FilterCategories.Split(',').Select(s => s.Trim()).ToList();
            }

            if (!string.IsNullOrWhiteSpace(model.FilterSubCategories))
            {
                panel.Filter.SubCategories = new List<string>();
                panel.Filter.SubCategories = model.FilterSubCategories.Split(',').Select(s => s.Trim()).ToList();
            }

            if (!string.IsNullOrWhiteSpace(model.FilterTransactionNames))
            {
                panel.Filter.Names = new List<string>();
                panel.Filter.Names = model.FilterTransactionNames.Split(',').Select(s => s.Trim()).ToList();
            }

            return panel;
        }
        private PanelModel ConvertObjectDomainToModel(Panel panel, Dashboard dashboard)
        {
            var model = new PanelModel();

            if (panel != null)
            {
                model.Title = panel.Title;
                model.Id = panel.Id;
                model.Dashboard = dashboard;
                model.PanelOrder = panel.PanelOrder;
                model.PanelWidth = panel.PanelWidth;
                model.PanelComponents = panel.PanelComponents;
                model.DisplayY = panel.DisplayY;

                model.GroupBy = panel.GroupBy;
                model.GroupByOrderBy = panel.GroupByOrderBy;
                model.GroupByOrderByClassification = panel.GroupByOrderByClassification;
                model.GroupByOrderByGroup = panel.GroupByOrderByGroup;
                model.GroupByOrderByGroupClassification = panel.GroupByOrderByGroupClassification;

                model.GroupBy2 = panel.GroupBy2;
                model.GroupByOrderBy2 = panel.GroupByOrderBy2;
                model.GroupByOrderByClassification2 = panel.GroupByOrderByClassification2;
                model.GroupByOrderByGroup2 = panel.GroupByOrderByGroup2;
                model.GroupByOrderByGroupClassification2 = panel.GroupByOrderByGroupClassification2;

                model.GroupBy3 = panel.GroupBy3;
                model.GroupByOrderBy3 = panel.GroupByOrderBy3;
                model.GroupByOrderByClassification3 = panel.GroupByOrderByClassification3;
                model.GroupByOrderByGroup3 = panel.GroupByOrderByGroup3;
                model.GroupByOrderByGroupClassification3 = panel.GroupByOrderByGroupClassification3;

                model.OrderBy = panel.Filter.OrderBy;
                model.OrderByClassification = panel.Filter.OrderByClassification;
                model.FilterTransactionType = panel.Filter.TransactionType;
                model.FilterDateStart = panel.Filter.DateStart;
                model.FilterDateEnd = panel.Filter.DateEnd;
                model.FilterValueStart = panel.Filter.ValueStart;
                model.FilterValueEnd = panel.Filter.ValueEnd;
                model.ViewName = panel.ViewName;

                model.Panel = panel;

                if (panel.Filter.Categories != null)
                    model.FilterCategories = string.Join(",", panel.Filter.Categories);

                if (panel.Filter.SubCategories != null)
                    model.FilterSubCategories = string.Join(",", panel.Filter.SubCategories);

                if (panel.Filter.Names != null)
                    model.FilterTransactionNames = string.Join(",", panel.Filter.Names);
            }

            return model;
        }
        public ActionResult Edit(Guid dashboardId, Guid panelId, PanelModel model)
        {
            ViewBag.IsEdit = true;
            ViewBag.PageName = PAGE_CSS_PANEL_EDIT_CREATE;

            if (ModelState.IsValid)
            {
                var uow = Helper.GetUnitOfWorkByCurrentUser();
                var panelUpdate = this.ConvertModelToObjectDomain(model);

                var dashboard = uow.Dashboards.Get(f => f.Id == dashboardId).FirstOrDefault();
                var panelOld = dashboard.Panels.FirstOrDefault(f => f.Id == panelId);
                var panelPosition = dashboard.Panels.IndexOf(panelOld);

                panelUpdate.Id = panelOld.Id;
                panelUpdate.CreateDate = panelOld.CreateDate;
                panelUpdate.LastUpdateDate = DateTime.Now;

                dashboard.Panels.Remove(panelOld);
                dashboard.Panels.Insert(panelPosition, panelUpdate);

                // reorder panels
                dashboard.ReorderPanel(panelUpdate, panelUpdate.PanelOrder);

                //var addAfterIfOccurConflict = panelUpdate.PanelOrder > panelOld.PanelOrder;
                //dashboard.ReorderPanels(addAfterIfOccurConflict);

                // save dashboard
                uow.Dashboards.Update(dashboard);

                if (Request.IsAjaxRequest())
                    return Json(new { Success = true });

                return RedirectToDashboard(dashboard.FriendlyUrl);
            }
            else
            {
                if (Request.IsAjaxRequest())
                    return PartialView(CREATE_OR_EDIT_TEMPLATE, model);

                return View(CREATE_OR_EDIT_TEMPLATE, model);
            }
        }