ソースを参照

Added cancelling DynamicEditPages

Kenric Nugteren 9 ヶ月 前
コミット
763ede5f00

+ 0 - 219
prs.desktop/Panels/Security/Groups/GroupTokenGrid.cs

@@ -1,219 +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 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;
-        }
-    }
-}

+ 0 - 22
prs.desktop/Panels/Security/Groups/GroupTokenItem.cs

@@ -1,22 +0,0 @@
-using System;
-using InABox.Core;
-
-namespace PRSDesktop
-{
-    public class GroupTokenItem : BaseObject
-    {
-        public Guid ID { get; set; }
-        public string Group { get; set; }
-        public string Code { get; set; }
-        public string Description { get; set; }
-        public bool Default { get; set; }
-        public bool HasValue { get; set; }
-        public bool Value { get; set; }
-
-        public override string ToString()
-        {
-            return string.Format("{0}: Default: {1} HasValue: {2} Value: {3}", Code, Default ? "true" : "false", HasValue ? "true" : "false",
-                Value ? "true" : "false");
-        }
-    }
-}

+ 0 - 12
prs.desktop/Panels/Security/Groups/GroupTokenPage.xaml

@@ -1,12 +0,0 @@
-<UserControl x:Class="PRSDesktop.GroupTokenPage"
-             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             xmlns:local="clr-namespace:PRSDesktop"
-             mc:Ignorable="d"
-             d:DesignHeight="450" d:DesignWidth="800">
-    <Grid>
-        <local:GroupTokenGrid x:Name="grid" />
-    </Grid>
-</UserControl>

+ 0 - 91
prs.desktop/Panels/Security/Groups/GroupTokenPage.xaml.cs

@@ -1,91 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows;
-using System.Windows.Controls;
-using InABox.Clients;
-using InABox.Core;
-using InABox.DynamicGrid;
-
-namespace PRSDesktop
-{
-    /// <summary>
-    ///     Interaction logic for SecurityTokenPanel.xaml
-    /// </summary>
-    public partial class GroupTokenPage : UserControl, IDynamicCustomEditorPage<SecurityGroup>
-    {
-        public GroupTokenPage()
-        {
-            InitializeComponent();
-        }
-
-        public bool Ready { get; set; }
-
-        public PageType PageType => PageType.Other;
-
-        public DynamicEditorGrid EditorGrid { get; set; }
-
-        public bool ReadOnly { get; set; }
-
-        public void AfterSave(object item)
-        {
-            var updates = new List<SecurityToken>();
-            var deletes = new List<SecurityToken>();
-            foreach (var token in grid.Tokens)
-            {
-                var gti = grid.Items.FirstOrDefault(x => x.Code.Equals(token.Descriptor));
-                if (gti != null)
-                {
-                    if (gti.HasValue)
-                    {
-                        if (token.IsChanged())
-                            updates.Add(token);
-                    }
-                    else
-                    {
-                        if (token.ID != Guid.Empty)
-                            deletes.Add(token);
-                    }
-                }
-            }
-
-            if (updates.Any())
-                new Client<SecurityToken>().Save(updates, "");
-            foreach (var delete in deletes)
-                new Client<SecurityToken>().Delete(delete, "");
-        }
-
-        public void BeforeSave(object item)
-        {
-        }
-
-        public string Caption()
-        {
-            return "Security Tokens";
-        }
-
-        public void Load(object item, Func<Type, CoreTable?>? PageDataHandler)
-        {
-            var group = item as SecurityGroup;
-            grid.GroupID = group.ID;
-            grid.Refresh(true, true);
-            Ready = true;
-        }
-
-        public Size MinimumSize()
-        {
-            return new Size(300, 600);
-        }
-
-        public int Order()
-        {
-            return 0;
-        }
-        
-        public event EventHandler? OnChanged;
-        public void DoChanged()
-        {
-            OnChanged?.Invoke(this, EventArgs.Empty);
-        }
-    }
-}

+ 0 - 57
prs.desktop/Panels/Security/Groups/SecurityGroupGrid.cs

@@ -1,57 +0,0 @@
-using System;
-using System.Linq;
-using System.Windows.Controls;
-using InABox.Clients;
-using InABox.Core;
-using InABox.DynamicGrid;
-using InABox.WPF;
-
-namespace PRSDesktop
-{
-    public class SecurityGroupGrid : DynamicDataGrid<SecurityGroup>
-    {
-        public SecurityGroupGrid()
-        {
-            AddButton("Duplicate", null, DuplicateGroup);
-            HiddenColumns.Add(x => x.ID);
-            HiddenColumns.Add(x => x.Description);
-            HiddenColumns.Add(x => x.Code);
-        }
-
-        private bool DuplicateGroup(Button sender, CoreRow[] rows)
-        {
-            using (new WaitCursor())
-            {
-                foreach (var row in rows)
-                {
-                    var id = row.Get<SecurityGroup, Guid>(x => x.ID);
-                    var code = row.Get<SecurityGroup, string>(x => x.Code);
-                    var desc = row.Get<SecurityGroup, string>(x => x.Description);
-                    var group = new Client<SecurityGroup>().Load(new Filter<SecurityGroup>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
-                    group.ID = Guid.Empty;
-                    group.Created = DateTime.Now;
-                    group.CreatedBy = ClientFactory.UserID;
-                    group.LastUpdate = group.Created;
-                    group.LastUpdateBy = group.CreatedBy;
-                    group.Code = string.Format("{0} (Copy)", group.Code);
-                    group.Description = string.Format("{0} (Copy)", group.Description);
-                    new Client<SecurityGroup>().Save(group, "Duplicated from " + code);
-                    var tokens = new Client<SecurityToken>().Load(new Filter<SecurityToken>(x => x.Group.ID).IsEqualTo(id));
-                    foreach (var token in tokens)
-                    {
-                        token.ID = Guid.Empty;
-                        token.Group.ID = group.ID;
-                        token.Created = DateTime.Now;
-                        token.CreatedBy = ClientFactory.UserID;
-                        token.LastUpdate = group.Created;
-                        token.LastUpdateBy = group.CreatedBy;
-                    }
-
-                    new Client<SecurityToken>().Save(tokens, "Duplicated from " + code);
-                }
-            }
-
-            return true;
-        }
-    }
-}

+ 0 - 45
prs.desktop/Panels/Security/Groups/SecurityGroupUserGrid.cs

@@ -1,45 +0,0 @@
-using Comal.Classes;
-using InABox.Clients;
-using InABox.Core;
-using InABox.DynamicGrid;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace PRSDesktop;
-
-public class SecurityGroupUserGrid : DynamicOneToManyGrid<SecurityGroup, User>
-{
-    protected override void DoReconfigure(DynamicGridOptions options)
-    {
-        base.DoReconfigure(options);
-        options.Clear();
-        options.AddRows = true;
-        options.DeleteRows = true;
-        options.MultiSelect = true;
-    }
-
-    protected override void DoAdd(bool OpenEditorOnDirectEdit = false)
-    {
-        var IDs = Items.Select(x => x.ID).ToArray();
-
-        var filters = new Filters<User>();
-        filters.Add(LookupFactory.DefineFilter<User>());
-        filters.Add(new Filter<User>(x => x.ID).NotInList(IDs));
-
-        var dlg = new MultiSelectDialog<User>(filters.Combine(), null, true);
-        if (dlg.ShowDialog())
-        {
-            SaveItems(dlg.Items());
-            Refresh(false, true);
-        }
-    }
-
-    protected override void OnDeleteItem(User item)
-    {
-        item.SecurityGroup.ID = Guid.Empty;
-        Client.Save(item, "Cleared security group");
-    }
-}

+ 0 - 9
prs.desktop/Panels/Security/User/UserSecurityTokenPage.xaml

@@ -1,9 +0,0 @@
-<UserControl x:Class="PRSDesktop.UserSecurityTokenPage"
-             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             mc:Ignorable="d"
-             d:DesignHeight="450" d:DesignWidth="800">
-    <Grid />
-</UserControl>

+ 0 - 91
prs.desktop/Panels/Security/User/UserSecurityTokenPage.xaml.cs

@@ -1,91 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows;
-using System.Windows.Controls;
-using InABox.Clients;
-using InABox.Core;
-using InABox.DynamicGrid;
-
-namespace PRSDesktop
-{
-    /// <summary>
-    ///     Interaction logic for SecurityTokenPanel.xaml
-    /// </summary>
-    public partial class UserSecurityTokenPage : UserControl, IDynamicCustomEditorPage<User>
-    {
-        private readonly UserTokenGrid grid = new();
-
-        public bool ReadOnly { get; set; }
-
-        public UserSecurityTokenPage()
-        {
-            InitializeComponent();
-            Content = grid;
-        }
-
-        public bool Ready { get; set; }
-
-        public DynamicEditorGrid EditorGrid { get; set; }
-        public PageType PageType => PageType.Other;
-
-        public void AfterSave(object item)
-        {
-            var updates = new List<UserSecurityToken>();
-            var deletes = new List<UserSecurityToken>();
-            foreach (var token in grid.Tokens)
-            {
-                var uti = grid.Items.FirstOrDefault(x => x.Code.Equals(token.Descriptor.Split('.').Last()));
-                if (uti.HasValue)
-                {
-                    if (token.IsChanged())
-                        updates.Add(token);
-                }
-                else
-                {
-                    if (token.ID != Guid.Empty)
-                        deletes.Add(token);
-                }
-            }
-
-            if (updates.Any())
-                new Client<UserSecurityToken>().Save(updates, "");
-            foreach (var delete in deletes)
-                new Client<UserSecurityToken>().Delete(delete, "");
-        }
-
-        public void BeforeSave(object item)
-        {
-        }
-
-        public string Caption()
-        {
-            return "Security Tokens";
-        }
-
-        public void Load(object item, Func<Type, CoreTable?>? PageDataHandler)
-        {
-            var user = item as User;
-            grid.GroupID = user.SecurityGroup.ID;
-            grid.UserID = user.ID;
-            grid.Refresh(true, true);
-            Ready = true;
-        }
-
-        public Size MinimumSize()
-        {
-            return new Size(300, 600);
-        }
-
-        public int Order()
-        {
-            return 0;
-        }
-        
-        public event EventHandler? OnChanged;
-        public void DoChanged()
-        {
-            OnChanged?.Invoke(this, EventArgs.Empty);
-        }
-    }
-}

+ 0 - 255
prs.desktop/Panels/Security/User/UserTokenGrid.cs

@@ -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;
-        }
-    }
-}

+ 0 - 16
prs.desktop/Panels/Security/User/UserTokenItem.cs

@@ -1,16 +0,0 @@
-using System;
-using InABox.Core;
-
-namespace PRSDesktop
-{
-    public class UserTokenItem : BaseObject
-    {
-        public Guid ID { get; set; }
-        public string Group { get; set; }
-        public string Code { get; set; }
-        public string Description { get; set; }
-        public bool Default { get; set; }
-        public bool HasValue { get; set; }
-        public bool Value { get; set; }
-    }
-}

+ 6 - 4
prs.desktop/Panels/Tasks/KanbanNotes.xaml.cs

@@ -49,6 +49,11 @@ namespace PRSDesktop
             Ready = true;
         }
 
+        public void Cancel()
+        {
+            NotesList.ItemsSource = ((Kanban)(EditorGrid as IDynamicEditorHost).GetItems().First()).Notes;
+        }
+
         public void BeforeSave(object item)
         {
             if (!string.IsNullOrWhiteSpace(AdditionalNote))
@@ -65,10 +70,7 @@ namespace PRSDesktop
             return "Notes";
         }
 
-        public int Order()
-        {
-            return int.MinValue;
-        }
+        public int Order { get; set; } = int.MinValue;
 
         public void AfterSave(object item)
         {

+ 6 - 4
prs.server/Forms/SMSProviderGrid.cs

@@ -153,16 +153,18 @@ namespace PRSServer.Forms
             Ready = true;
         }
 
-        public Size MinimumSize()
+        public void Cancel()
         {
-            return new Size(400, 400);
+            // Not doing anything here, even though we really should.
         }
 
-        public int Order()
+        public Size MinimumSize()
         {
-            return int.MinValue;
+            return new Size(400, 400);
         }
 
+        public int Order { get; set; } = int.MinValue;
+
         public override void DeleteItems(params CoreRow[] rows)
         {
             foreach(var row in rows)