Browse Source

Added setting for setting the max cache age for data entry panel.

Kenric Nugteren 1 year ago
parent
commit
496a94a861

+ 2 - 3
prs.desktop/Panels/DataEntry/DataEntryGrid.cs

@@ -1,5 +1,6 @@
 using Comal.Classes;
 using InABox.Clients;
+using InABox.Configuration;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.WPF;
@@ -51,9 +52,7 @@ public class DataEntryCachedDocument : ICachedDocument
 
 public class DataEntryCache : DocumentCache<DataEntryCachedDocument>
 {
-    private static TimeSpan _maxAge = TimeSpan.FromDays(7);
-
-    public override TimeSpan MaxAge => _maxAge;
+    public override TimeSpan MaxAge => TimeSpan.FromDays(new UserConfiguration<DataEntryPanelSettings>().Load().CacheAge);
 
     private static DataEntryCache? _cache;
     public static DataEntryCache Cache

+ 330 - 305
prs.desktop/Panels/DataEntry/DataEntryPanel.xaml.cs

@@ -10,390 +10,415 @@ using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Media;
 using InABox.Configuration;
+using NPOI.SS.Formula.Functions;
 
-namespace PRSDesktop
+namespace PRSDesktop;
+
+
+public class DataEntryPanelSettings : BaseObject, IUserConfigurationSettings
 {
+    private static readonly double DefaultCacheAge = 7;
 
-    public class DataEntryPanelSettings : IUserConfigurationSettings
-    {
-        public double PreviewWidth { get; set; }
-        
-    }
+    [NullEditor]
+    public double PreviewWidth { get; set; }
+
+    [DoubleEditor(ToolTip = "Age of cached documents before they are deleted (days)")]
+    public double CacheAge { get; set; } = DefaultCacheAge;
+}
+
+/// <summary>
+/// Interaction logic for DataEntryPanel.xaml
+/// </summary>
+/// <remarks>
+/// This is a host because it has a singular code popup editor
+/// </remarks>
+public partial class DataEntryPanel : UserControl, IBasePanel, IDynamicEditorHost
+{
+    private DataEntryPanelSettings _settings;
     
-    /// <summary>
-    /// Interaction logic for DataEntryPanel.xaml
-    /// </summary>
-    /// <remarks>
-    /// This is a host because it has a singular code popup editor
-    /// </remarks>
-    public partial class DataEntryPanel : UserControl, IBasePanel, IDynamicEditorHost
-    {
-        private DataEntryPanelSettings _settings;
-        
-        //IPopupEditorControl? _popup;
-        private IDynamicDataGrid? _grid;
-        
-        private Type? _selectedType;
-        private Guid _entityID;
-        private Guid _originalID;
-        private bool _processenabled;
+    //IPopupEditorControl? _popup;
+    private IDynamicDataGrid? _grid;
+    
+    private Type? _selectedType;
+    private Guid _entityID;
+    private Guid _originalID;
+    private bool _processenabled;
 
-        private Entity? _entity;
+    private Entity? _entity;
 
-        private Button? _process;
+    private Button? _process;
 
-        private bool _isChanged;
-        private bool IsChanged
+    private bool _isChanged;
+    private bool IsChanged
+    {
+        get => _isChanged;
+        set
         {
-            get => _isChanged;
-            set
+            if(_isChanged != value)
             {
-                if(_isChanged != value)
-                {
-                    _isChanged = value;
-                    Editor.HideButtons = !value;// (_entity?.IsChanged() != true) && (_originalID == _entityID);
-                    if (_process != null)
-                        _process.IsEnabled = value;// ((_entity?.ID ?? Guid.Empty) != Guid.Empty) || (_entity?.IsChanged() != false);
-                    _documents._dataEntryGrid.IsEnabled = !value;// (_entity?.IsChanged() != true) && (_originalID == _entityID);
-                }
+                _isChanged = value;
+                Editor.HideButtons = !value;// (_entity?.IsChanged() != true) && (_originalID == _entityID);
+                if (_process != null)
+                    _process.IsEnabled = value;// ((_entity?.ID ?? Guid.Empty) != Guid.Empty) || (_entity?.IsChanged() != false);
+                _documents._dataEntryGrid.IsEnabled = !value;// (_entity?.IsChanged() != true) && (_originalID == _entityID);
             }
         }
+    }
+    
+    public void Select(Type? type, Guid id)
+    {
+        ClearEditor();
         
-        public void Select(Type? type, Guid id)
+        _selectedType = type;
+        _entityID = id;
+
+        if (_selectedType != null)
         {
             ClearEditor();
+            CreateEditor();
+            PopulateEditor();
+            //LoadPopup();
+        }
             
-            _selectedType = type;
-            _entityID = id;
+    }
+    
+    private void ScanPanel_OnSelectScan(string appliesto, Guid entityid, bool processenabled)
+    {
+        _processenabled = processenabled;
+        _originalID = entityid;
+        Select(
+            CoreUtils.GetEntityOrNull(appliesto),
+            entityid
+        );
+    }
+    
+    public DataEntryPanel()
+    {
+        InitializeComponent();
+        LoadSettings();
+    }
 
-            if (_selectedType != null)
-            {
-                ClearEditor();
-                CreateEditor();
-                PopulateEditor();
-                //LoadPopup();
-            }
-                
-        }
-        
-        private void ScanPanel_OnSelectScan(string appliesto, Guid entityid, bool processenabled)
-        {
-            _processenabled = processenabled;
-            _originalID = entityid;
-            Select(
-                CoreUtils.GetEntityOrNull(appliesto),
-                entityid
-            );
-        }
-        
-        public DataEntryPanel()
-        {
-            _settings = new UserConfiguration<DataEntryPanelSettings>().Load();
-            InitializeComponent();
-            _panel.AnchorWidth = _settings.PreviewWidth > 0.0F
-                ? _settings.PreviewWidth
-                : 500F;
-        }
+    private void LoadSettings()
+    {
+        _settings = new UserConfiguration<DataEntryPanelSettings>().Load();
+        _panel.AnchorWidth = _settings.PreviewWidth > 0.0F
+            ? _settings.PreviewWidth
+            : 500F;
+    }
 
-        public void Setup()
-        {
-            _documents.Setup();
+    public void Setup()
+    {
+        _documents.Setup();
 
-            IsChanged = false;
-        }
-        
-        public void Refresh()
+        IsChanged = false;
+    }
+    
+    public void Refresh()
+    {
+        if (CheckSaved())
         {
-            if (CheckSaved())
-            {
-                _documents.Refresh();
-                IsChanged = false;
-            }
+            _documents.Refresh();
+            IsChanged = false;
         }
+    }
 
-        public bool IsReady { get; set; }
+    public bool IsReady { get; set; }
 
-        public string SectionName => "Data Entry";
+    public string SectionName => "Data Entry";
 
-        public DataModel DataModel(Selection selection)
-        {
-            return new EmptyDataModel();
-        }
+    public DataModel DataModel(Selection selection)
+    {
+        return new EmptyDataModel();
+    }
 
-        public event DataModelUpdateEvent? OnUpdateDataModel;
+    public event DataModelUpdateEvent? OnUpdateDataModel;
 
-        public void CreateToolbarButtons(IPanelHost host)
+    public void CreateToolbarButtons(IPanelHost host)
+    {
+        if (Security.IsAllowed<CanSetupDataEntryTags>())
         {
-            if (Security.IsAllowed<CanSetupDataEntryTags>())
+            host.CreateSetupAction(new PanelAction
+            {
+                Caption = "Data Entry Tags",
+                OnExecute = (action) =>
+                {
+                    var list = new MasterList(typeof(DataEntryTag));
+                    list.ShowDialog();
+                }
+            });
+            host.CreateSetupAction(new PanelAction
             {
-                host.CreateSetupAction(new PanelAction
+                Caption = "Settings",
+                OnExecute = (action) =>
                 {
-                    Caption = "Data Entry Tags",
-                    OnExecute = (action) =>
+                    var settings = new UserConfiguration<DataEntryPanelSettings>().Load();
+
+                    var grid = new DynamicItemsListGrid<DataEntryPanelSettings>();
+                    if (grid.EditItems(new DataEntryPanelSettings[] { settings }))
                     {
-                        var list = new MasterList(typeof(DataEntryTag));
-                        list.ShowDialog();
+                        new UserConfiguration<DataEntryPanelSettings>().Save(settings);
+                        LoadSettings();
                     }
-                });
-            }
+                }
+            });
         }
+    }
 
-        public void Heartbeat(TimeSpan time)
-        {
-        }
-        
-        public Dictionary<string, object[]> Selected()
+    public void Heartbeat(TimeSpan time)
+    {
+    }
+    
+    public Dictionary<string, object[]> Selected()
+    {
+        return new Dictionary<string, object[]>();
+    }
+    
+    private void CheckSaved(CancelEventArgs cancel)
+    {
+        if (!_isChanged)
         {
-            return new Dictionary<string, object[]>();
+            return;
         }
-        
-        private void CheckSaved(CancelEventArgs cancel)
+        var result = MessageBox.Show("You have changes that have not been saved; do you wish to save these changes?", "Save Changes?", MessageBoxButton.YesNoCancel);
+        if (result == MessageBoxResult.Yes)
         {
-            if (!_isChanged)
-            {
-                return;
-            }
-            var result = MessageBox.Show("You have changes that have not been saved; do you wish to save these changes?", "Save Changes?", MessageBoxButton.YesNoCancel);
-            if (result == MessageBoxResult.Yes)
-            {
-                DoSave(false);
-                if (!cancel.Cancel)
-                    MessageBox.Show("Item saved.");
-            }
-            else if (result == MessageBoxResult.Cancel)
-            {
-                cancel.Cancel = true;
-            }
+            DoSave(false);
+            if (!cancel.Cancel)
+                MessageBox.Show("Item saved.");
         }
-        private bool CheckSaved()
+        else if (result == MessageBoxResult.Cancel)
         {
-            var cancel = new CancelEventArgs();
-            CheckSaved(cancel);
-            return !cancel.Cancel;
+            cancel.Cancel = true;
         }
+    }
+    private bool CheckSaved()
+    {
+        var cancel = new CancelEventArgs();
+        CheckSaved(cancel);
+        return !cancel.Cancel;
+    }
 
-        public void Shutdown(CancelEventArgs? cancel)
-        {
-            if (cancel != null)
-                CheckSaved(cancel);
-            if (cancel?.Cancel != true) 
-                _documents.Shutdown(cancel);
-        }
+    public void Shutdown(CancelEventArgs? cancel)
+    {
+        if (cancel != null)
+            CheckSaved(cancel);
+        if (cancel?.Cancel != true) 
+            _documents.Shutdown(cancel);
+    }
 
-        #region Host
+    #region Host
 
-        
-        public DynamicGridColumns Columns { get; set; } = new();
+    
+    public DynamicGridColumns Columns { get; set; } = new();
 
-        IEnumerable<DynamicGridColumn> IDynamicEditorHost.Columns => Columns;
+    IEnumerable<DynamicGridColumn> IDynamicEditorHost.Columns => Columns;
 
-        public void LoadColumns(string column, Dictionary<string, string> columns)
-        {
-            if (_selectedType is null) 
-                return;
+    public void LoadColumns(string column, Dictionary<string, string> columns)
+    {
+        if (_selectedType is null) 
+            return;
 
-            columns.Clear();
+        columns.Clear();
 
-            foreach (var c in LookupFactory.DefineColumns(_selectedType).ColumnNames().Where(x => x != "ID"))
-               columns.Add(c, c);
-            
-            //if (_popup?.EditorDefinition is CodePopupEditorControl codePopup && !columns.ContainsKey(codePopup.CodeColumn))
-            //    columns.Add(codePopup.CodeColumn, codePopup.CodeColumn);
-        }
+        foreach (var c in LookupFactory.DefineColumns(_selectedType).ColumnNames().Where(x => x != "ID"))
+           columns.Add(c, c);
+        
+        //if (_popup?.EditorDefinition is CodePopupEditorControl codePopup && !columns.ContainsKey(codePopup.CodeColumn))
+        //    columns.Add(codePopup.CodeColumn, codePopup.CodeColumn);
+    }
 
-        public IFilter? DefineFilter(Type type) => LookupFactory.DefineFilter(type);
+    public IFilter? DefineFilter(Type type) => LookupFactory.DefineFilter(type);
 
-        public void LoadLookups(ILookupEditorControl sender)
-        {
-            var editor = sender.EditorDefinition as ILookupEditor;
-            var colname = sender.ColumnName;
+    public void LoadLookups(ILookupEditorControl sender)
+    {
+        var editor = sender.EditorDefinition as ILookupEditor;
+        var colname = sender.ColumnName;
 
-            var values = editor.Values(colname, Editor.Items);
-            sender.LoadLookups(values);
-        }
+        var values = editor.Values(colname, Editor.Items);
+        sender.LoadLookups(values);
+    }
 
-        object?[] IDynamicEditorHost.GetItems() => Editor.Items;
+    object?[] IDynamicEditorHost.GetItems() => Editor.Items;
 
-        public BaseEditor? GetEditor(DynamicGridColumn column) => column.Editor.CloneEditor();
+    public BaseEditor? GetEditor(DynamicGridColumn column) => column.Editor.CloneEditor();
 
-        #endregion
+    #endregion
 
-        private void ClearEditor()
-        {
+    private void ClearEditor()
+    {
 
-            DetailBorder.Child = null;
-            IsChanged = false;
-            
-            //if (_popup is UIElement element)
-            //    DetailHeader.Children.Remove(element);
-        }
+        DetailBorder.Child = null;
+        IsChanged = false;
         
+        //if (_popup is UIElement element)
+        //    DetailHeader.Children.Remove(element);
+    }
+    
 
-        private void CreateEditor()
+    private void CreateEditor()
+    {
+        if (_selectedType == null)
+            return;
+        
+        Editor = new EmbeddedDynamicEditorForm();
+        Editor.SetLayoutType<VerticalDynamicEditorGridLayout>();
+        Editor.HighlightButtons = true;
+        Editor.HideButtons = true;
+        Editor.SetValue(Grid.RowProperty, 1);
+        Editor.SetValue(Grid.ColumnProperty, 0);
+        Editor.SetValue(Grid.ColumnSpanProperty, 4);
+
+        Editor.OnAfterEditorValueChanged += (sender, args) =>
         {
-            if (_selectedType == null)
-                return;
-            
-            Editor = new EmbeddedDynamicEditorForm();
-            Editor.SetLayoutType<VerticalDynamicEditorGridLayout>();
-            Editor.HighlightButtons = true;
-            Editor.HideButtons = true;
-            Editor.SetValue(Grid.RowProperty, 1);
-            Editor.SetValue(Grid.ColumnProperty, 0);
-            Editor.SetValue(Grid.ColumnSpanProperty, 4);
-
-            Editor.OnAfterEditorValueChanged += (sender, args) =>
-            {
-                IsChanged = IsChanged || (_entity?.IsChanged() == true || _originalID != _entityID);
-                return null;
-            };
+            IsChanged = IsChanged || (_entity?.IsChanged() == true || _originalID != _entityID);
+            return null;
+        };
 
-            Editor.OnOK += () => { DoSave(false); };
-            Editor.OnCancel += () =>
-            {
-                _entityID = _originalID;
-                Select(_selectedType,_entityID);
-            };
-            Editor.OnChanged += (sender, args) => IsChanged = true;
-            Editor.OnFormCustomiseEditor += (sender, items, column, editor) =>
+        Editor.OnOK += () => { DoSave(false); };
+        Editor.OnCancel += () =>
+        {
+            _entityID = _originalID;
+            Select(_selectedType,_entityID);
+        };
+        Editor.OnChanged += (sender, args) => IsChanged = true;
+        Editor.OnFormCustomiseEditor += (sender, items, column, editor) =>
+        {
+            if ((editor is BaseCodeEditor be) && editor.Editable.EditorVisible())
             {
-                if ((editor is BaseCodeEditor be) && editor.Editable.EditorVisible())
+                be.Buttons = new[]
                 {
-                    be.Buttons = new[]
-                    {
-                        new EditorButton(null, "..", 30, DoLookup, false)
-                    };
-                }
-            };
-            
-            DetailBorder.Child = Editor;
-            _grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), _selectedType) as IDynamicDataGrid;
-            
-        }
+                    new EditorButton(null, "..", 30, DoLookup, false)
+                };
+            }
+        };
+        
+        DetailBorder.Child = Editor;
+        _grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), _selectedType) as IDynamicDataGrid;
         
-        private void DoLookup(object editor, object? item)
+    }
+    
+    private void DoLookup(object editor, object? item)
+    {
+        if (editor is CodeEditorControl ce)
         {
-            if (editor is CodeEditorControl ce)
+            
+            Dictionary<string, string>? filter = null;
+            if (ce.Value != null)
             {
-                
-                Dictionary<string, string>? filter = null;
-                if (ce.Value != null)
-                {
-                    filter = new Dictionary<string, string>();
-                    filter[ce.ColumnName] = ce.Value;
-                }
+                filter = new Dictionary<string, string>();
+                filter[ce.ColumnName] = ce.Value;
+            }
 
-                var popup = new PopupList(_selectedType, _entityID, new String[] { }, filter);
-                popup.OnDefineFilter += type => LookupFactory.DefineFilter(type);
-                if (popup.ShowDialog() == true)
-                {
-                    _entityID = popup.ID;
-                    Select(_selectedType, _entityID);
-                }
+            var popup = new PopupList(_selectedType, _entityID, new String[] { }, filter);
+            popup.OnDefineFilter += type => LookupFactory.DefineFilter(type);
+            if (popup.ShowDialog() == true)
+            {
+                _entityID = popup.ID;
+                Select(_selectedType, _entityID);
             }
         }
+    }
 
 
-        private void SaveDocument(DataEntryDocument dataEntryDocument)
-        {
-            var linktype = CoreUtils.TypeList(x =>
-                x.GetInterfaces().Contains(typeof(IEntityLink))
-                && x.BaseType != null
-                && x.BaseType.IsGenericType
-                && x.BaseType.GenericTypeArguments.FirstOrDefault() == _selectedType
-            ).FirstOrDefault();
-            if (linktype == null)
-                return;
-            
-            var doctype = CoreUtils.TypeList(x =>
-                x.GetInterfaces().Contains(typeof(IEntityDocument))
-                && x.BaseType != null
-                && x.BaseType.IsGenericType
-                && x.BaseType.GenericTypeArguments.FirstOrDefault() == linktype
-            ).FirstOrDefault();
-            if (doctype == null)
-                return;
-
-            var doc = (IEntityDocument)Activator.CreateInstance(doctype)!;
-            CoreUtils.SetPropertyValue(doc,"EntityLink.ID",_entityID);
-            doc.DocumentLink.ID = dataEntryDocument.Document.ID;
-            doc.Thumbnail = dataEntryDocument.Thumbnail;
-            ClientFactory.CreateClient(doctype).Save(doc,"Added from Data Entry Screen");
+    private void SaveDocument(DataEntryDocument dataEntryDocument)
+    {
+        var linktype = CoreUtils.TypeList(x =>
+            x.GetInterfaces().Contains(typeof(IEntityLink))
+            && x.BaseType != null
+            && x.BaseType.IsGenericType
+            && x.BaseType.GenericTypeArguments.FirstOrDefault() == _selectedType
+        ).FirstOrDefault();
+        if (linktype == null)
+            return;
+        
+        var doctype = CoreUtils.TypeList(x =>
+            x.GetInterfaces().Contains(typeof(IEntityDocument))
+            && x.BaseType != null
+            && x.BaseType.IsGenericType
+            && x.BaseType.GenericTypeArguments.FirstOrDefault() == linktype
+        ).FirstOrDefault();
+        if (doctype == null)
+            return;
+
+        var doc = (IEntityDocument)Activator.CreateInstance(doctype)!;
+        CoreUtils.SetPropertyValue(doc,"EntityLink.ID",_entityID);
+        doc.DocumentLink.ID = dataEntryDocument.Document.ID;
+        doc.Thumbnail = dataEntryDocument.Thumbnail;
+        ClientFactory.CreateClient(doctype).Save(doc,"Added from Data Entry Screen");
 
-        }
+    }
 
-        private void DoSave(bool markasprocessed)
-        {
-            var cancel = new System.ComponentModel.CancelEventArgs();
-            if (markasprocessed && (_entity is IDataEntryInstance scannable))
-                scannable.DataEntered = DateTime.Now;
-            Editor.SaveItem(cancel);
+    private void DoSave(bool markasprocessed)
+    {
+        var cancel = new System.ComponentModel.CancelEventArgs();
+        if (markasprocessed && (_entity is IDataEntryInstance scannable))
+            scannable.DataEntered = DateTime.Now;
+        Editor.SaveItem(cancel);
 
-            if (!cancel.Cancel)
+        if (!cancel.Cancel)
+        {
+            _originalID = _entityID;
+            IsChanged = false;
+            var row = _documents._dataEntryGrid.SelectedRows.FirstOrDefault();
+            if (row != null)
             {
-                _originalID = _entityID;
-                IsChanged = false;
-                var row = _documents._dataEntryGrid.SelectedRows.FirstOrDefault();
-                if (row != null)
+                var scan = row?.ToObject<DataEntryDocument>();
+                scan.EntityID = _entity.ID;
+                if (markasprocessed)
                 {
-                    var scan = row?.ToObject<DataEntryDocument>();
-                    scan.EntityID = _entity.ID;
-                    if (markasprocessed)
-                    {
-                        SaveDocument(scan);
-                        scan.Archived = DateTime.Now;
-                    }
+                    SaveDocument(scan);
+                    scan.Archived = DateTime.Now;
+                }
 
-                    if (scan.IsChanged())
-                    {
-                        new Client<DataEntryDocument>().Save(scan, "Updated from Data Entry Screen");
-                        _documents.Refresh();
-                    }
-                    
+                if (scan.IsChanged())
+                {
+                    new Client<DataEntryDocument>().Save(scan, "Updated from Data Entry Screen");
+                    _documents.Refresh();
                 }
+                
             }
         }
+    }
 
-        private void PopulateEditor()
-        {
-            if (_selectedType == null)
-                return;
-
-            _entity = null;
-            if (_entityID != Guid.Empty)
-            {
-                _entity = Client.Create(_selectedType)
-                    .Query(
-                        Filter.Create<Entity>(_selectedType, x => x.ID).IsEqualTo(_entityID),
-                        _grid.LoadEditorColumns()
-                    )
-                    .ToObjects(_selectedType)
-                    .OfType<Entity>()
-                    .FirstOrDefault();
-            }
-            _entity ??= Activator.CreateInstance(_selectedType) as Entity;
-            if (_entity == null)
-                return;
-            _grid?.InitialiseEditorForm(Editor, new object[] { _entity }, null, true);
-            
-            _process = new Button()
-            {
-                Content = "Mark as Processed",
-                BorderBrush = new SolidColorBrush(Colors.DarkBlue),
-                Background = new SolidColorBrush(Colors.DodgerBlue),
-                Margin = new Thickness(5, 5, 0, 5),
-                Padding = new Thickness(10, 0, 10, 0),
-                IsEnabled = _processenabled
-            };
-            _process.Click += (sender, args) => DoSave(true);
-            Editor.AddButton(_process);
-            IsChanged = false;
-        }
+    private void PopulateEditor()
+    {
+        if (_selectedType == null)
+            return;
 
-        private void _panel_OnOnChanged(object sender, DynamicSplitPanelSettings e)
+        _entity = null;
+        if (_entityID != Guid.Empty)
         {
-            _settings.PreviewWidth = e.AnchorWidth;
-            new UserConfiguration<DataEntryPanelSettings>().Save(_settings);
+            _entity = Client.Create(_selectedType)
+                .Query(
+                    Filter.Create<Entity>(_selectedType, x => x.ID).IsEqualTo(_entityID),
+                    _grid.LoadEditorColumns()
+                )
+                .ToObjects(_selectedType)
+                .OfType<Entity>()
+                .FirstOrDefault();
         }
+        _entity ??= Activator.CreateInstance(_selectedType) as Entity;
+        if (_entity == null)
+            return;
+        _grid?.InitialiseEditorForm(Editor, new object[] { _entity }, null, true);
+        
+        _process = new Button()
+        {
+            Content = "Mark as Processed",
+            BorderBrush = new SolidColorBrush(Colors.DarkBlue),
+            Background = new SolidColorBrush(Colors.DodgerBlue),
+            Margin = new Thickness(5, 5, 0, 5),
+            Padding = new Thickness(10, 0, 10, 0),
+            IsEnabled = _processenabled
+        };
+        _process.Click += (sender, args) => DoSave(true);
+        Editor.AddButton(_process);
+        IsChanged = false;
+    }
+
+    private void _panel_OnOnChanged(object sender, DynamicSplitPanelSettings e)
+    {
+        _settings.PreviewWidth = e.AnchorWidth;
+        new UserConfiguration<DataEntryPanelSettings>().Save(_settings);
     }
 }