123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- 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 GroupTokenGrid : DynamicGrid<GroupTokenItem>
- {
- private Guid _groupid = 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 GroupTokenGrid()
- {
- Items = new List<GroupTokenItem>();
- foreach (var descriptor in Security.Descriptors.Where(x => x.Visible && x.HasScope(SecurityDescriptorScope.Group)))
- {
- var tokenitem = new GroupTokenItem
- {
- Group = descriptor.Type,
- Code = descriptor.Code,
- Description = descriptor.Description,
- ID = Guid.Empty,
- Default = descriptor.Value,
- HasValue = false,
- Value = descriptor.Value
- };
- Items.Add(tokenitem);
- }
- var globals = new Client<GlobalSecurityToken>().Load().ToList();
- foreach (var global in globals)
- {
- global.Descriptor = global.Descriptor.Split('.').Last();
- var item = Items.FirstOrDefault(x => x.Code.Equals(global.Descriptor));
- if (item != null)
- {
- item.Default = global.Enabled;
- item.HasValue = false;
- item.Value = global.Enabled;
- }
- }
- ActionColumns.Add(new DynamicImageColumn(TokenImage, TokenAction)
- {
- GetFilter = () => new FuncCheckBoxDynamicGridColumnFilter(TokenFilter, TokenFilterData)
- });
- //ActionColumns.Add(new DynamicTickColumn<TokenItem,bool>(x => x.Checked, tick, tick, disabled) { Action = CheckClick, AllowHeaderClick = true });
- HiddenColumns.Add(x => x.Code);
- HiddenColumns.Add(x => x.Value);
- HiddenColumns.Add(x => x.HasValue);
- HiddenColumns.Add(x => x.Default);
- }
- protected override void Init()
- {
- }
- protected override void DoReconfigure(DynamicGridOptions options)
- {
- options.RecordCount = true;
- options.FilterRows = true;
- }
- public List<GroupTokenItem> Items { get; }
- public List<SecurityToken> Tokens { get; private set; }
- public Guid GroupID
- {
- get => _groupid;
- set
- {
- _groupid = value;
- LoadGroupTokens();
- }
- }
- private void LoadGroupTokens()
- {
- Tokens = new Client<SecurityToken>().Load(new Filter<SecurityToken>(x => x.Group.ID).IsEqualTo(_groupid)).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(GroupTokenItem item)
- {
- }
- public override GroupTokenItem LoadItem(CoreRow row)
- {
- return Items[row.Index];
- }
- protected override void Reload(
- Filters<GroupTokenItem> criteria, Columns<GroupTokenItem> columns, ref SortOrder<GroupTokenItem>? 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<GroupTokenItem, string>(x => x.Code);
- var defvalue = row.Get<GroupTokenItem, bool>(x => x.Default);
- var hasvalue = row.Get<GroupTokenItem, bool>(x => x.HasValue);
- var actvalue = row.Get<GroupTokenItem, bool>(x => x.Value);
- var token = Tokens.FirstOrDefault(x => x.Descriptor.Equals(Code));
- if (token == null)
- {
- token = new SecurityToken();
- token.Descriptor = Code;
- token.Group.ID = _groupid;
- 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<GroupTokenItem, bool>(x => x.Default);
- var hasvalue = row.Get<GroupTokenItem, bool>(x => x.HasValue);
- var actvalue = row.Get<GroupTokenItem, 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;
- }
- }
- }
|