using System; using System.Collections.Generic; using System.Linq; using System.Windows.Media.Imaging; using InABox.Clients; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; namespace PRSDesktop { public class UserTokenGrid : DynamicGrid { private Guid _groupid = Guid.Empty; private Guid _userid = Guid.Empty; private readonly BitmapImage defaultdisabled = PRSDesktop.Resources.disabled.Fade(0.25F).AsBitmapImage(); private readonly BitmapImage defaulttick = PRSDesktop.Resources.tick.Fade(0.25F).AsBitmapImage(); private readonly BitmapImage disabled = PRSDesktop.Resources.disabled.AsBitmapImage(); private readonly BitmapImage tick = PRSDesktop.Resources.tick.AsBitmapImage(); public UserTokenGrid() { Options.AddRange(DynamicGridOption.RecordCount, DynamicGridOption.FilterRows); Items = new List(); LoadSystemTokens(); LoadGlobalTokens(); ActionColumns.Add(new DynamicImageColumn(TokenImage, TokenAction) { Filters = new[] { "Enabled", "Disabled", "Overridden" }, FilterRecord = TokenFilter }); HiddenColumns.Add(x => x.Code); HiddenColumns.Add(x => x.Value); HiddenColumns.Add(x => x.Default); HiddenColumns.Add(x => x.HasValue); } public List Items { get; } public List Tokens { get; private set; } public Guid GroupID { get => _groupid; set { _groupid = value; LoadGroupTokens(); } } public Guid UserID { get => _userid; set { _userid = value; LoadUserTokens(); } } private void LoadSystemTokens() { foreach (var descriptor in Security.Descriptors.Where(x => x.Visible && x.HasScope(SecurityDescriptorScope.User))) { var tokenitem = new UserTokenItem { Group = descriptor.Type, Code = descriptor.Code, Description = descriptor.Description, ID = Guid.Empty, Default = descriptor.Value, HasValue = false, Value = descriptor.Value }; Items.Add(tokenitem); } } private void LoadGlobalTokens() { var globaltokens = new Client().Load(); foreach (var globaltoken in globaltokens) { globaltoken.Descriptor = globaltoken.Descriptor.Split('.').Last(); var item = Items.FirstOrDefault(x => x.Code.Equals(globaltoken.Descriptor)); if (item != null) { item.Default = globaltoken.Enabled; item.HasValue = false; item.Value = globaltoken.Enabled; } } } private void LoadGroupTokens() { var grouptokens = new Client().Load(new Filter(x => x.Group.ID).IsEqualTo(_groupid)); foreach (var grouptoken in grouptokens) { grouptoken.Descriptor = grouptoken.Descriptor.Split('.').Last(); var item = Items.FirstOrDefault(x => x.Code.Equals(grouptoken.Descriptor)); if (item != null) { item.Default = grouptoken.Enabled; item.HasValue = false; item.Value = grouptoken.Enabled; } } } private void LoadUserTokens() { Tokens = new Client().Load(new Filter(x => x.User.ID).IsEqualTo(_userid)).ToList(); foreach (var token in Tokens) { token.Descriptor = token.Descriptor.Split('.').Last(); var item = Items.FirstOrDefault(x => x.Code.Equals(token.Descriptor)); if (item != null) { item.ID = token.ID; item.HasValue = true; item.Value = token.Enabled; } } } protected override void DeleteItems(params CoreRow[] row) { } public override void SaveItem(UserTokenItem item) { } protected override UserTokenItem LoadItem(CoreRow row) { return Items[row.Index]; } protected override void Reload(Filters criteria, Columns columns, ref SortOrder sort, Action action) { var table = new CoreTable(); foreach (var column in columns.Items) table.Columns.Add(new CoreColumn { ColumnName = column.ToString() }); table.LoadRows(Items); action.Invoke(table, null); } private bool TokenFilter(CoreRow row, string[] filter) { var defvalue = row.Get(x => x.Default); var hasvalue = row.Get(x => x.HasValue); var actvalue = row.Get(x => x.Value); if (filter.Contains("Enabled") && (hasvalue ? actvalue : defvalue)) return true; if (filter.Contains("Disabled") && (hasvalue ? !actvalue : !defvalue)) return true; if (filter.Contains("Overridden") && hasvalue) return true; return false; } private bool TokenAction(CoreRow row) { var result = false; var rows = row == null ? Data.Rows.ToArray() : new[] { row }; foreach (var corrow in rows) { var Code = corrow.Get(x => x.Code); var defvalue = corrow.Get(x => x.Default); var hasvalue = corrow.Get(x => x.HasValue); var actvalue = corrow.Get(x => x.Value); var token = Tokens.FirstOrDefault(x => x.Descriptor.Equals(Code)); if (token == null) { token = new UserSecurityToken(); token.Descriptor = Code; token.User.ID = _userid; Tokens.Add(token); } var item = Items.FirstOrDefault(x => x.Code.Equals(Code)); if (item != null) { // novalue -> !default -> default -> novalue if (!item.HasValue) { item.Value = !item.Default; item.HasValue = true; } else { if (item.Value != item.Default) item.Value = item.Default; else item.HasValue = false; } token.Enabled = item.Value; result = true; } } return result; } private BitmapImage TokenImage(CoreRow row) { if (row == null) return tick; var defvalue = row.Get(x => x.Default); var hasvalue = row.Get(x => x.HasValue); var actvalue = row.Get(x => x.Value); return hasvalue ? actvalue ? tick : disabled : defvalue ? defaulttick : defaultdisabled; } protected override DynamicGridColumns LoadColumns() { var columns = new DynamicGridColumns(); columns.Add(new DynamicGridColumn { ColumnName = "Group", Caption = "Group", Width = 100, Alignment = Alignment.MiddleLeft }); columns.Add(new DynamicGridColumn { ColumnName = "Description", Caption = "Description", Width = 0, Alignment = Alignment.MiddleLeft }); return columns; } } }