|  | @@ -1,255 +0,0 @@
 | 
	
		
			
				|  |  | -using System;
 | 
	
		
			
				|  |  | -using System.Collections.Generic;
 | 
	
		
			
				|  |  | -using System.Linq;
 | 
	
		
			
				|  |  | -using System.Threading;
 | 
	
		
			
				|  |  | -using System.Windows.Media.Imaging;
 | 
	
		
			
				|  |  | -using InABox.Clients;
 | 
	
		
			
				|  |  | -using InABox.Core;
 | 
	
		
			
				|  |  | -using InABox.DynamicGrid;
 | 
	
		
			
				|  |  | -using InABox.WPF;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -namespace PRSDesktop
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    public class UserTokenGrid : DynamicGrid<UserTokenItem>
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        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()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            Items = new List<UserTokenItem>();
 | 
	
		
			
				|  |  | -            LoadSystemTokens();
 | 
	
		
			
				|  |  | -            LoadGlobalTokens();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            ActionColumns.Add(new DynamicImageColumn(TokenImage, TokenAction)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                GetFilter = () => new FuncCheckBoxDynamicGridColumnFilter(TokenFilter, TokenFilterData)
 | 
	
		
			
				|  |  | -            });
 | 
	
		
			
				|  |  | -            HiddenColumns.Add(x => x.Code);
 | 
	
		
			
				|  |  | -            HiddenColumns.Add(x => x.Value);
 | 
	
		
			
				|  |  | -            HiddenColumns.Add(x => x.Default);
 | 
	
		
			
				|  |  | -            HiddenColumns.Add(x => x.HasValue);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        protected override void Init()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        protected override void DoReconfigure(DynamicGridOptions options)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            options.RecordCount = true;
 | 
	
		
			
				|  |  | -            options.FilterRows = true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public List<UserTokenItem> Items { get; }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public List<UserSecurityToken> 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<GlobalSecurityToken>().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<SecurityToken>().Load(new Filter<SecurityToken>(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<UserSecurityToken>().Load(new Filter<UserSecurityToken>(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;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public override void DeleteItems(params CoreRow[] row)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public override void SaveItem(UserTokenItem item)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        public override UserTokenItem LoadItem(CoreRow row)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            return Items[row.Index];
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        protected override void Reload(
 | 
	
		
			
				|  |  | -        	Filters<UserTokenItem> criteria, Columns<UserTokenItem> columns, ref SortOrder<UserTokenItem>? sort,
 | 
	
		
			
				|  |  | -        	CancellationToken token, Action<CoreTable?, Exception?> action)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var table = new CoreTable();
 | 
	
		
			
				|  |  | -            table.LoadColumns(columns);
 | 
	
		
			
				|  |  | -            table.LoadRows(Items);
 | 
	
		
			
				|  |  | -            action.Invoke(table, null);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private IEnumerable<Tuple<string, object?>> TokenFilterData()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            yield return new("Enabled", "Enabled");
 | 
	
		
			
				|  |  | -            yield return new("Disabled", "Disabled");
 | 
	
		
			
				|  |  | -            yield return new("Overriden", "Overriden");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private bool TokenFilter(CoreRow row, Predicate<object?> filter)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var hasvalue = row.Get<GroupTokenItem, bool>(x => x.HasValue);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (hasvalue && filter("Overriden")) return true;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var value = row.Get<GroupTokenItem, bool>(x => x.Value);
 | 
	
		
			
				|  |  | -            var defvalue = row.Get<GroupTokenItem, bool>(x => x.Default);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            var actualValue = hasvalue ? value : defvalue;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (actualValue)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                return filter("Enabled");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            else
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                return filter("Disabled");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        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<UserTokenItem, string>(x => x.Code);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                var defvalue = corrow.Get<UserTokenItem, bool>(x => x.Default);
 | 
	
		
			
				|  |  | -                var hasvalue = corrow.Get<UserTokenItem, bool>(x => x.HasValue);
 | 
	
		
			
				|  |  | -                var actvalue = corrow.Get<UserTokenItem, bool>(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<UserTokenItem, bool>(x => x.Default);
 | 
	
		
			
				|  |  | -            var hasvalue = row.Get<UserTokenItem, bool>(x => x.HasValue);
 | 
	
		
			
				|  |  | -            var actvalue = row.Get<UserTokenItem, bool>(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;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 |