using System.Globalization; using EnVisage.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity; using EnVisage.Code; using EnVisage.Code.Cache; using EnVisage.Models.Cache; using System.Text; namespace EnVisage.Code.HtmlHelpers { public static class HtmlHelpers { public struct RoleAccess { public Guid RoleId; public Areas SecurityObject; public Guid ProjectId; public int Read; public int Write; } public static MvcHtmlString GetProjectTree(this HtmlHelper html, UrlHelper url, AspNetUser principal, Guid? roleId) { const string attrChecked = "checked"; const string attrOverriden = "overriden"; var context = new EnVisageEntities(); var companies = (from c in context.Companies select new {c.Id, c.Name}).ToList(); //TODO: I've commented where clause above as we now have a bunch of projects assigned directly to parent company, e.g. system ones (capacity, etc.) var clients = (from c in context.Clients select new {c.Id, c.Name}).ToList(); var rolePermissions = new List(); var userPermissions = new List(); if (principal != null) { #region User foreach (var role in principal.AspNetRoles) { var accessForRoles = (from pr in context.ProjectAccesses where pr.PrincipalId == new Guid(role.Id) select new { PrincipalId = pr.PrincipalId, ProjectId = pr.ProjectId, Read = pr.Read, Write = pr.Write }).ToList(); foreach (var project in accessForRoles) { var new_ra = new RoleAccess(); new_ra.RoleId = project.PrincipalId; new_ra.ProjectId = project.ProjectId; new_ra.Read = project.Read; new_ra.Write = project.Write; rolePermissions.Add(new_ra); } } if (!string.IsNullOrEmpty(principal.Id)) userPermissions = (from pr in context.ProjectAccesses where pr.PrincipalId == new Guid(principal.Id) select pr) .ToList(); #endregion } else { #region Roles var accessForRoles = (from pr in context.ProjectAccesses where pr.PrincipalId == roleId select pr).ToList(); foreach (var project in accessForRoles) { var newRa = new RoleAccess { RoleId = project.PrincipalId, ProjectId = project.ProjectId, Read = project.Read, Write = project.Write }; rolePermissions.Add(newRa); } #endregion } var projects = (from pr in context.Projects orderby pr.Name select new {Id = pr.Id, Name = pr.Name, CompanyId = pr.CompanyId, ClientId = pr.ClientId}) .ToList(); var projlist = new TagBuilder("div"); projlist.InnerHtml = @" Projects  R    W "; foreach (var company in companies) { #region Company var tr = new TagBuilder("tr"); var td = new TagBuilder("td"); var span = new TagBuilder("span"); var td1 = new TagBuilder("td"); td1.Attributes.Add("nowrap", string.Empty); var cbr = new TagBuilder("input"); cbr.Attributes["value"] = company.Id.ToString(); cbr.Attributes["type"] = "checkbox"; cbr.Attributes["name"] = "companyread"; cbr.AddCssClass("custominput"); cbr.AddCssClass("custom"); var cbw = new TagBuilder("input"); cbw.Attributes["value"] = company.Id.ToString(); cbw.Attributes["type"] = "checkbox"; cbw.Attributes["name"] = "companywrite"; cbw.AddCssClass("custominput"); cbw.AddCssClass("custom"); var companyProjects = projects.Where(x => x.CompanyId == company.Id).Select(x => x.Id).ToArray(); //AK: looks like here we set checkboxes for lowest level permissions if (companyProjects.Length > 0 && (principal != null && userPermissions.Count(x => companyProjects.Contains(x.ProjectId)) > 0) || (principal == null && rolePermissions.Count(x => companyProjects.Contains(x.ProjectId)) > 0)) { if ((principal != null && companyProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Read == (int)Permission.Allow))) || (principal == null && companyProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Read == (int)Permission.Allow)))) cbr.Attributes["checked"] = attrChecked; if ((principal != null && companyProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Write == (int)Permission.Allow))) || (principal == null && companyProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Write == (int)Permission.Allow)))) cbw.Attributes["checked"] = attrChecked; } td1.InnerHtml = string.Format("{0}{1}", cbr, cbw); tr.Attributes["class"] = string.Format("treegrid-{0}", company.Id); span.Attributes["class"] = "treegrid-expander glyphicon glyphicon-chevron-right"; td.InnerHtml = span.ToString(); td.SetInnerText(company.Name); tr.InnerHtml = string.Format("{0}{1}", td, td1); projlist.InnerHtml += tr; #endregion #region Clients foreach ( var client in clients.Where( c => projects.Where(x => x.CompanyId == company.Id).Select(x => x.ClientId).Contains(c.Id))) { var client_tr = new TagBuilder("tr"); var client_td = new TagBuilder("td"); var client_span = new TagBuilder("span"); var client_td1 = new TagBuilder("td"); client_td1.Attributes.Add("nowrap", string.Empty); var client_cbr = new TagBuilder("input"); client_cbr.Attributes["value"] = client.Id.ToString(); client_cbr.Attributes["companyr"] = company.Id.ToString(); client_cbr.Attributes["type"] = "checkbox"; client_cbr.Attributes["name"] = "clientread"; client_cbr.AddCssClass("custominput"); var client_cbw = new TagBuilder("input"); client_cbw.Attributes["companyw"] = company.Id.ToString(); client_cbw.Attributes["value"] = client.Id.ToString(); client_cbw.Attributes["type"] = "checkbox"; client_cbw.Attributes["name"] = "clientwrite"; client_cbw.AddCssClass("custominput"); var clientProjects = projects.Where(x => x.CompanyId == company.Id && x.ClientId == client.Id).Select(x => x.Id).ToArray(); if (clientProjects.Length > 0 && (principal != null && userPermissions.Count(x => clientProjects.Contains(x.ProjectId)) > 0) || (principal == null && rolePermissions.Count(x => clientProjects.Contains(x.ProjectId)) > 0)) { if ((principal != null && clientProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Read == (int)Permission.Allow))) || (principal == null && clientProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Read == (int)Permission.Allow)))) client_cbr.Attributes["checked"] = attrChecked; if ((principal != null && clientProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Write == (int)Permission.Allow))) || (principal == null && clientProjects.All(prj => rolePermissions.Exists(prm => prm.ProjectId == prj && prm.Write == (int)Permission.Allow)))) client_cbw.Attributes["checked"] = attrChecked; } client_td1.InnerHtml = string.Format("{0}{1}", client_cbr, client_cbw); client_tr.Attributes["class"] = string.Format("treegrid-{0}{1} treegrid-parent-{0}", company.Id, client.Id); client_span.Attributes["class"] = "treegrid-expander glyphicon glyphicon-chevron-right"; client_td.InnerHtml = client_span.ToString(); client_td.SetInnerText(client.Name); client_tr.InnerHtml = string.Format("{0}{1}", client_td, client_td1); projlist.InnerHtml += client_tr; #region Projects foreach (var project in projects.Where(x => x.CompanyId == company.Id && x.ClientId == client.Id)) { var project_tr = new TagBuilder("tr"); var project_td = new TagBuilder("td"); var project_span = new TagBuilder("span"); var project_td1 = new TagBuilder("td"); project_td1.Attributes.Add("nowrap", string.Empty); var project_cbr = new TagBuilder("input"); project_cbr.Attributes["value"] = project.Id.ToString(); project_cbr.Attributes["type"] = "checkbox"; project_cbr.Attributes["name"] = "projectlistread"; project_cbr.Attributes["companyr"] = company.Id.ToString(); project_cbr.Attributes["clientr"] = client.Id.ToString(); var project_cbw = new TagBuilder("input"); project_cbw.Attributes["value"] = project.Id.ToString(); project_cbw.Attributes["type"] = "checkbox"; project_cbw.Attributes["name"] = "projectlistwrite"; project_cbw.Attributes["companyw"] = company.Id.ToString(); project_cbw.Attributes["clientw"] = client.Id.ToString(); project_cbr.AddCssClass("custominput"); project_cbw.AddCssClass("custominput"); if (principal != null) { var isUserPermissionReadFound = false; var isUserPermissionWriteFound = false; foreach (var selected in userPermissions) { if (project.Id == selected.ProjectId) { if (selected.Read == Permission.Allow.GetHashCode()) { project_cbr.Attributes["checked"] = attrChecked; } if (selected.Write == Permission.Allow.GetHashCode()) { project_cbw.Attributes["checked"] = attrChecked; } isUserPermissionReadFound = selected.Read != Permission.Inherited.GetHashCode(); isUserPermissionWriteFound = selected.Write != Permission.Inherited.GetHashCode(); } } var isFound = rolePermissions.Any(t => t.ProjectId == project.Id); var isRead = rolePermissions.Any(t => t.ProjectId == project.Id && (t.Read == (int) Permission.Allow)); var isWrite = rolePermissions.Any(t => t.ProjectId == project.Id && (t.Write == (int)Permission.Allow)); if (isFound) { project_cbr.Attributes["role"] = ((int)(isRead ? Permission.Allow : Permission.Deny)).ToString(CultureInfo.InvariantCulture); project_cbw.Attributes["role"] = ((int)(isWrite ? Permission.Allow : Permission.Deny)).ToString(CultureInfo.InvariantCulture); if (!isUserPermissionReadFound) { project_cbr.Attributes["overriden"] = attrOverriden; if (isRead) project_cbr.Attributes["checked"] = "checked"; } if (!isUserPermissionWriteFound) { project_cbw.Attributes["overriden"] = attrOverriden; if (isWrite) project_cbw.Attributes["checked"] = "checked"; } } if (!isFound) { project_cbr.Attributes["role"] = ((int)Permission.Deny).ToString(CultureInfo.InvariantCulture); project_cbw.Attributes["role"] = ((int)Permission.Deny).ToString(CultureInfo.InvariantCulture); if (!isUserPermissionReadFound) { project_cbr.Attributes["overriden"] = attrOverriden; } if (!isUserPermissionWriteFound) { project_cbw.Attributes["overriden"] = attrOverriden; } } } else { foreach (var selected in rolePermissions) { if (project.Id == selected.ProjectId) { if (selected.Read == Permission.Allow.GetHashCode()) { project_cbr.Attributes["checked"] = attrChecked; } if (selected.Write == Permission.Allow.GetHashCode()) { project_cbw.Attributes["checked"] = attrChecked; } } } } project_td1.InnerHtml = string.Format("{0}{1}", project_cbr, project_cbw); project_tr.Attributes["class"] = string.Format("treegrid-{0} treegrid-parent-{1}{2}", project.Id, company.Id, client.Id); project_span.Attributes["class"] = "treegrid-indent"; project_td.InnerHtml = project_span.ToString(); project_td.SetInnerText(project.Name); project_tr.InnerHtml = string.Format("{0}{1}", project_td, project_td1); projlist.InnerHtml += project_tr; } #endregion } #endregion } #region non-company and non-client projects //Also show non-company and non-client projects foreach (var project in projects.Where(x => !x.CompanyId.HasValue || !x.ClientId.HasValue)) { var projectTr = new TagBuilder("tr"); var projectTd = new TagBuilder("td"); var projectSpan = new TagBuilder("span"); var projectTd1 = new TagBuilder("td"); var projectCbr = new TagBuilder("input"); projectCbr.Attributes["value"] = project.Id.ToString(); projectCbr.Attributes["type"] = "checkbox"; projectCbr.Attributes["name"] = "projectlistread"; projectCbr.AddCssClass("custominput"); var projectCbw = new TagBuilder("input"); projectCbw.Attributes["value"] = project.Id.ToString(); projectCbw.Attributes["type"] = "checkbox"; projectCbw.Attributes["name"] = "projectlistwrite"; projectCbw.AddCssClass("custominput"); foreach (var selected in rolePermissions) { if (project.Id == selected.ProjectId) { if (selected.Read == (int)Permission.Allow) projectCbr.Attributes["checked"] = attrChecked; if (selected.Write == (int)Permission.Allow) projectCbw.Attributes["checked"] = attrChecked; } } projectTd1.InnerHtml = string.Format("{0}{1}", projectCbr, projectCbw); projectTr.Attributes["class"] = string.Format("treegrid-{0} treegrid-parent-{1}{2}", project.Id, -1, -1); projectSpan.Attributes["class"] = "treegrid-indent"; projectTd.InnerHtml = projectSpan.ToString(); projectTd.SetInnerText(project.Name); projectTr.InnerHtml = string.Format("{0}{1}", projectTd, projectTd1); projlist.InnerHtml += projectTr; } #endregion return new MvcHtmlString(projlist.ToString()); } //public static MvcHtmlString GetAreaItemsList(this HtmlHelper html, UrlHelper url, AspNetUser principal) public static MvcHtmlString GetAreaItemsList(this HtmlHelper html, UrlHelper url, UserModel principal) { const string attrChecked = "checked"; const string attrInherited = "inherited"; var context = new EnVisageEntities(); var roleIds = principal.AspNetRoles.Select(t => new Guid (t.Id)).ToArray(); var rolePermissions = (from pr in context.Securities where roleIds.Contains(pr.PrincipalId) select pr).ToArray().Select(area => new RoleAccess { RoleId = area.PrincipalId, SecurityObject = (Areas) Enum.Parse(typeof (Areas), area.SecurityObject), Read = area.Read, Write = area.Write }).ToList(); var userPermissions = new List(); // if(!string.IsNullOrEmpty(principal.Id)) if (principal.Id != Guid.Empty) userPermissions = (from pr in context.Securities where pr.PrincipalId == principal.Id select pr).ToList(); //userPermissions = (from pr in context.Securities where pr.PrincipalId == new Guid(principal.Id) select pr).ToList(); var menuItems = Enum.GetValues(typeof(Areas)).Cast().OrderBy(i => i.ToString()); menuItems = menuItems.OrderBy(i => i.ToString()); var menulist = new TagBuilder("div") {InnerHtml = @" Areas  R    W " }; foreach (var menuItem in menuItems) { var tr = new TagBuilder("tr"); var td = new TagBuilder("td"); var span = new TagBuilder("span"); var td1 = new TagBuilder("td"); var cbr = new TagBuilder("input"); cbr.Attributes["value"] = menuItem.ToString(); cbr.Attributes["type"] = "checkbox"; cbr.Attributes["name"] = "areasread"; cbr.AddCssClass("custominput"); var cbw = new TagBuilder("input"); cbw.Attributes["value"] = menuItem.ToString(); cbw.Attributes["type"] = "checkbox"; cbw.Attributes["name"] = "areaswrite"; cbw.AddCssClass("custominput"); var isExplicitReadFound = false; var isExplicitWriteFound = false; foreach (var pa in userPermissions) { if (!menuItem.ToString().Equals(pa.SecurityObject)) continue; if (pa.Read == (int)Permission.Allow) cbr.Attributes["checked"] = attrChecked; if (pa.Write == (int)Permission.Allow) cbw.Attributes["checked"] = attrChecked; isExplicitReadFound = pa.Read != (int)Permission.Inherited; isExplicitWriteFound = pa.Write != (int)Permission.Inherited; break; } var isRolePermissionFound = rolePermissions.Any(t => t.SecurityObject == menuItem); var isRead = rolePermissions.Any(t => t.SecurityObject == menuItem && (t.Read == (int)Permission.Allow)); var isWrite = rolePermissions.Any(t => t.SecurityObject == menuItem && (t.Write == (int)Permission.Allow)); if (isRolePermissionFound) { cbr.Attributes["role"] = ((int)(isRead ? Permission.Allow : Permission.Deny)).ToString(CultureInfo.InvariantCulture); cbw.Attributes["role"] = ((int)(isWrite ? Permission.Allow : Permission.Deny)).ToString(CultureInfo.InvariantCulture); if (!isExplicitReadFound) { cbr.Attributes["inherited"] = attrInherited; if (isRead) cbr.Attributes["checked"] = "checked"; } if (!isExplicitWriteFound) { cbw.Attributes["inherited"] = attrInherited; if (isWrite) cbw.Attributes["checked"] = "checked"; } } else { cbr.Attributes["role"] = ((int)Permission.Deny).ToString(CultureInfo.InvariantCulture); cbw.Attributes["role"] = ((int)Permission.Deny).ToString(CultureInfo.InvariantCulture); if (!isExplicitReadFound) { cbr.Attributes["inherited"] = attrInherited; } if (!isExplicitWriteFound) { cbw.Attributes["inherited"] = attrInherited; } } td1.InnerHtml = string.Format("{0}{1}", cbr, cbw); td.InnerHtml = span.ToString(); td.SetInnerText(AddSpacesToSentence(menuItem.ToString(),false)); tr.InnerHtml = string.Format("{0}{1}", td, td1); menulist.InnerHtml += tr; } return new MvcHtmlString(menulist.ToString()); } public static string AddSpacesToSentence(string text, bool preserveAcronyms) { if (string.IsNullOrWhiteSpace(text)) return string.Empty; StringBuilder newText = new StringBuilder(text.Length * 2); newText.Append(text[0]); for (int i = 1; i < text.Length; i++) { if (char.IsUpper(text[i])) if ((text[i - 1] != ' ' && !char.IsUpper(text[i - 1])) || (preserveAcronyms && char.IsUpper(text[i - 1]) && i < text.Length - 1 && !char.IsUpper(text[i + 1]))) newText.Append(' '); newText.Append(text[i]); } return newText.ToString(); } public static MvcHtmlString GetAreaItemsList(this HtmlHelper html, UrlHelper url, RoleModel role) { EnVisageEntities context = new EnVisageEntities(); var selecteds = (from pr in context.Securities where pr.PrincipalId == role.Id select pr).ToList(); var menuItems = Enum.GetValues(typeof(Areas)).Cast().OrderBy(i => i.ToString()); //per ENV-807 - temporary - remove Reports from permission list //menuItems = menuItems.Where(i => i != Areas.Reports).OrderBy(i => i.ToString()); menuItems = menuItems.OrderBy(i => i.ToString()); var menulist = new TagBuilder("div"); menulist.InnerHtml = @" Areas R    W "; foreach (var menuItem in menuItems) { var tr = new TagBuilder("tr"); var td = new TagBuilder("td"); var span = new TagBuilder("span"); var td1 = new TagBuilder("td"); td1.Attributes.Add("nowrap", string.Empty); var cbr = new TagBuilder("input"); cbr.Attributes["value"] = menuItem.ToString(); cbr.Attributes["type"] = "checkbox"; cbr.Attributes["name"] = "areasread"; var cbw = new TagBuilder("input"); cbw.Attributes["value"] = menuItem.ToString(); cbw.Attributes["type"] = "checkbox"; cbw.Attributes["name"] = "areaswrite"; cbr.AddCssClass("custominput"); cbw.AddCssClass("custominput"); foreach (var selected in selecteds) { if (menuItem.ToString() == selected.SecurityObject && selected.Read == 1) cbr.Attributes["checked"] = "checked"; if (menuItem.ToString() == selected.SecurityObject && selected.Write == 1) cbw.Attributes["checked"] = "checked"; } //cbw.InnerHtml = " " + menuItem.ToDisplayValue(); //menulist.InnerHtml += cbr + " " + cbw + "
"; td1.InnerHtml = cbr + " " + cbw; td.InnerHtml = span.ToString(); td.SetInnerText(menuItem.ToString()); tr.InnerHtml = td + "" + td1; menulist.InnerHtml += tr; } return new MvcHtmlString(menulist.ToString()); } //public static MvcHtmlString GetRolesList(this HtmlHelper html, UrlHelper url, AspNetUser Principal) public static MvcHtmlString GetRolesList(this HtmlHelper html, UrlHelper url, UserModel Principal) { EnVisageEntities context = new EnVisageEntities(); var selecteds = Principal.AspNetRoles.ToList(); var roleItems = (from pr in context.AspNetRoles orderby pr.Name select pr).ToList(); var rolelist = new TagBuilder("div"); foreach (var roleItem in roleItems) { var cb = new TagBuilder("input"); cb.Attributes["value"] = roleItem.Id.ToString(); cb.Attributes["type"] = "checkbox"; cb.Attributes["name"] = "roleitems"; foreach (var selected in selecteds) { if (roleItem.Id == selected.Id) cb.Attributes["checked"] = "checked"; } cb.InnerHtml = " " + roleItem.Name; rolelist.InnerHtml += cb + "     "; } return new MvcHtmlString(rolelist.ToString()); } public static MvcHtmlString GetProjectStatusDropdown(this HtmlHelper html, UrlHelper url) { EnVisageEntities context = new EnVisageEntities(); var statuses = (from pr in context.Status orderby pr.Name select pr).ToList(); var statusDropDown = new TagBuilder("select"); statusDropDown.Attributes["name"] = "statuses"; statusDropDown.Attributes["class"] = "form-control"; var opAll = new TagBuilder("option"); opAll.Attributes["value"] = "All"; opAll.InnerHtml = "All"; statusDropDown.InnerHtml += opAll.ToString(); foreach (var status in statuses) { var op = new TagBuilder("option"); op.Attributes["value"] = status.Name; op.InnerHtml = status.Name; statusDropDown.InnerHtml += op.ToString(); } return new MvcHtmlString(statusDropDown.ToString()); } public static MvcHtmlString GetProjectName(this HtmlHelper html, Guid ProjectId) { EnVisageEntities context = new EnVisageEntities(); var projName = (from pr in context.Projects where pr.Id == ProjectId select pr.Name).FirstOrDefault(); if (projName == null) return new MvcHtmlString(string.Empty); else return new MvcHtmlString(projName.ToString()); } public static IEnumerable GetProjectStatusDropdown(EnVisage.Models.ForecastDashboardModel input) { var options = new List(); using (var dbContext = new EnVisageEntities()) { var projectStatuses = dbContext.Status.ToList(); var allItem = new SelectListItem(); allItem.Text = "All"; allItem.Value = "All"; options.Add(allItem); options.AddRange(projectStatuses.Select(creditDepartment => new SelectListItem() { Value = creditDepartment.Id.ToString(), Text = creditDepartment.Name })); } return options; } public static IEnumerable GetProjectClassificationDropdown(EnVisage.Models.ForecastDashboardModel input) { var options = new List(); using (var dbContext = new EnVisageEntities()) { var projectClassifications = dbContext.Types.ToList(); var allItem = new SelectListItem(); allItem.Text = "All"; allItem.Value = "All"; options.Add(allItem); options.AddRange(projectClassifications.Select(creditDepartment => new SelectListItem() { Value = creditDepartment.Id.ToString(), Text = creditDepartment.Name })); } return options; } } }