From dc74da6e86f1661e63c23fb61256923c1f1390ab Mon Sep 17 00:00:00 2001 From: mschill Date: Fri, 21 Feb 2025 15:52:16 -0500 Subject: [PATCH] B2025-018 PROMS - Issues with folder order in tree view. --- .../Extension/FolderExt.cs | 52 +++++++++++++++++-- .../VEPROMS.CSLA.Library/Generated/Folder.cs | 27 ++++++++++ PROMS/Volian.Controls.Library/vlnTreeView.cs | 32 +++++++----- 3 files changed, 93 insertions(+), 18 deletions(-) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/FolderExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/FolderExt.cs index 15b2ffda..61904404 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/FolderExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/FolderExt.cs @@ -19,6 +19,7 @@ using System.Drawing; using System.Collections.Generic; using System.ComponentModel; using System.Text.RegularExpressions; +using System.Linq; namespace VEPROMS.CSLA.Library { @@ -143,6 +144,8 @@ namespace VEPROMS.CSLA.Library } #endregion #region SortingChildren + private static bool IsInManualOrderNullFix = false; + [NonSerialized] public Csla.SortedBindingList _SortedChildFolders; public Csla.SortedBindingList SortedChildFolders @@ -151,6 +154,29 @@ namespace VEPROMS.CSLA.Library { if (ChildFolders != null) { + //B2025-018 Issues with folder order in tree view + // if any ChildFolders with a missing Manual Order + // set them to the end of the list + // use IsInManualOrderNullFix - so, if setting ChildFolders Currently, + // do not try to set them (thus creating an infinite loop) + if (!IsInManualOrderNullFix && ChildFolders.Any(x => x.ManualOrder == null)) + { + IsInManualOrderNullFix = true; + foreach (FolderInfo fi in ChildFolders.Where(x => x.ManualOrder == null)) + { + using (FolderInfo parfolderinfo = FolderInfo.Get(fi.ParentID)) + { + using (Folder fldr = fi.Get()) + { + fldr.ManualOrder = parfolderinfo.NewManualOrder(9999); + fldr.Save(); + } + } + } + RefreshChildFolders(); + IsInManualOrderNullFix = false; + } + if (_SortedChildFolders == null) { _SortedChildFolders = new SortedBindingList(ChildFolders); @@ -166,6 +192,10 @@ namespace VEPROMS.CSLA.Library return _SortedChildFolders; } } + + //B2025-018 Issues with folder order in tree view + //Note: this should be called from the parent item + //As you want to put this into the sorted order of the parent item public double? NewManualOrder(int index) { double? retval = 1; @@ -174,13 +204,27 @@ namespace VEPROMS.CSLA.Library else if (index == 0) { if (retval >= SortedChildFolders[index].ManualOrder) // If one is too big, then divide first value in half - retval = SortedChildFolders[index].ManualOrder / 2; + retval = SortedChildFolders[index].ManualOrder / 2.0; } else if (SortedChildFolders.Count > index) { - retval += SortedChildFolders[index - 1].ManualOrder; // Just go to the next whole number - if (retval >= SortedChildFolders[index].ManualOrder) - retval = (SortedChildFolders[index - 1].ManualOrder + SortedChildFolders[index].ManualOrder) / 2; + //B2025-018 Issues with folder order in tree view + //filter to just items with the same parent + //want new order to be halfway between the previous item + //and the next ManualOrder + var tmp = SortedChildFolders.Where(x => x.ParentID == FolderID); + var lbound = SortedChildFolders[index - 1].ManualOrder; + var ubound = tmp.OrderBy(y => y.ManualOrder).FirstOrDefault(x => x.ManualOrder > lbound)?.ManualOrder; + if (ubound != null) + { + retval = ((ubound - lbound) / 2.0) + lbound; + } + else + { + //in this case, item before is highest for that parent + //so just make this 1 more + retval = lbound + 1; + } } else { diff --git a/PROMS/VEPROMS.CSLA.Library/Generated/Folder.cs b/PROMS/VEPROMS.CSLA.Library/Generated/Folder.cs index fb8a0a45..0232759d 100644 --- a/PROMS/VEPROMS.CSLA.Library/Generated/Folder.cs +++ b/PROMS/VEPROMS.CSLA.Library/Generated/Folder.cs @@ -769,6 +769,15 @@ namespace VEPROMS.CSLA.Library tmp.MyParent = myParent; tmp.Name = name; tmp.ShortName = shortName; + + //B2025-018 Issues with folder order in tree view + //if no manual order is set, add it at the end + if (myParent != null) + { + using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID)) + tmp.ManualOrder = parfolderinfo.NewManualOrder(9999); + } + return tmp; } public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID) @@ -784,6 +793,15 @@ namespace VEPROMS.CSLA.Library tmp.Config = config; tmp.DTS = dts; tmp.UsrID = usrID; + + //B2025-018 Issues with folder order in tree view + //if no manual order is set, add it at the end + if (myParent != null && manualOrder == null) + { + using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID)) + tmp.ManualOrder = parfolderinfo.NewManualOrder(9999); + } + return tmp; } public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID) @@ -813,6 +831,15 @@ namespace VEPROMS.CSLA.Library tmp.MyFormat = myFormat; tmp.ManualOrder = manualOrder; tmp.Config = config; + + //B2025-018 Issues with folder order in tree view + //if no manual order is set, add it at the end + if (myParent != null && manualOrder == null) + { + using (FolderInfo parfolderinfo = FolderInfo.Get(myParent.FolderID)) + tmp.ManualOrder = parfolderinfo.NewManualOrder(9999); + } + return tmp; } public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config) diff --git a/PROMS/Volian.Controls.Library/vlnTreeView.cs b/PROMS/Volian.Controls.Library/vlnTreeView.cs index e60b358b..3eac21cf 100644 --- a/PROMS/Volian.Controls.Library/vlnTreeView.cs +++ b/PROMS/Volian.Controls.Library/vlnTreeView.cs @@ -2812,23 +2812,27 @@ namespace Volian.Controls.Library int f2 = -1; string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder"); int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0); - FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.FolderID); - double? myorder = parfolderinfo.NewManualOrder(myindex); - using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID)) - { - ShowBrokenRules(folder.BrokenRulesCollection); - SetLastValues(FolderInfo.Get(folder.FolderID)); - if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK) + //B2025-018 Issues with folder order in tree view + //since before/after folder is at same level as current folder + //so need to use the parents order to determine where to place it + using (FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.MyParent.FolderID)) + { double? myorder = parfolderinfo.NewManualOrder(myindex); + using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID)) { - folder.Save(); - tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo); - if (newtype == MenuSelections.FolderBefore) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index, tn); - if (newtype == MenuSelections.FolderAfter) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 1, tn); + ShowBrokenRules(folder.BrokenRulesCollection); + SetLastValues(FolderInfo.Get(folder.FolderID)); + if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK) + { + folder.Save(); + tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo); + if (newtype == MenuSelections.FolderBefore) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index, tn); + if (newtype == MenuSelections.FolderAfter) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 1, tn); + } + else + f2 = folder.FolderID; } - else - f2 = folder.FolderID; + if (f2 != -1) Folder.Delete(f2); } - if (f2 != -1) Folder.Delete(f2); } } }