B2025-018 PROMS - Issues with folder order in tree view. #526

Merged
jjenko merged 1 commits from B2025-018 into Development 2025-02-21 16:05:19 -05:00
3 changed files with 93 additions and 18 deletions

View File

@ -19,6 +19,7 @@ using System.Drawing;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Linq;
namespace VEPROMS.CSLA.Library namespace VEPROMS.CSLA.Library
{ {
@ -143,6 +144,8 @@ namespace VEPROMS.CSLA.Library
} }
#endregion #endregion
#region SortingChildren #region SortingChildren
private static bool IsInManualOrderNullFix = false;
[NonSerialized] [NonSerialized]
public Csla.SortedBindingList<FolderInfo> _SortedChildFolders; public Csla.SortedBindingList<FolderInfo> _SortedChildFolders;
public Csla.SortedBindingList<FolderInfo> SortedChildFolders public Csla.SortedBindingList<FolderInfo> SortedChildFolders
@ -151,6 +154,29 @@ namespace VEPROMS.CSLA.Library
{ {
if (ChildFolders != null) 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) if (_SortedChildFolders == null)
{ {
_SortedChildFolders = new SortedBindingList<FolderInfo>(ChildFolders); _SortedChildFolders = new SortedBindingList<FolderInfo>(ChildFolders);
@ -166,6 +192,10 @@ namespace VEPROMS.CSLA.Library
return _SortedChildFolders; 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) public double? NewManualOrder(int index)
{ {
double? retval = 1; double? retval = 1;
@ -174,13 +204,27 @@ namespace VEPROMS.CSLA.Library
else if (index == 0) else if (index == 0)
{ {
if (retval >= SortedChildFolders[index].ManualOrder) // If one is too big, then divide first value in half 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) else if (SortedChildFolders.Count > index)
{ {
retval += SortedChildFolders[index - 1].ManualOrder; // Just go to the next whole number //B2025-018 Issues with folder order in tree view
if (retval >= SortedChildFolders[index].ManualOrder) //filter to just items with the same parent
retval = (SortedChildFolders[index - 1].ManualOrder + SortedChildFolders[index].ManualOrder) / 2; //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 else
{ {

View File

@ -769,6 +769,15 @@ namespace VEPROMS.CSLA.Library
tmp.MyParent = myParent; tmp.MyParent = myParent;
tmp.Name = name; tmp.Name = name;
tmp.ShortName = shortName; 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; 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) 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.Config = config;
tmp.DTS = dts; tmp.DTS = dts;
tmp.UsrID = usrID; 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; 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) 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.MyFormat = myFormat;
tmp.ManualOrder = manualOrder; tmp.ManualOrder = manualOrder;
tmp.Config = config; 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; return tmp;
} }
public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config) public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config)

View File

@ -2812,23 +2812,27 @@ namespace Volian.Controls.Library
int f2 = -1; int f2 = -1;
string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder"); string uniquename = _LastFolderInfo.MyParent.UniqueChildName("New Folder");
int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0); int myindex = SelectedNode.Index + ((newtype == MenuSelections.FolderAfter) ? 1 : 0);
FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.FolderID); //B2025-018 Issues with folder order in tree view
double? myorder = parfolderinfo.NewManualOrder(myindex); //since before/after folder is at same level as current folder
using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID)) //so need to use the parents order to determine where to place it
{ using (FolderInfo parfolderinfo = FolderInfo.Get(parentfolder.MyParent.FolderID))
ShowBrokenRules(folder.BrokenRulesCollection); { double? myorder = parfolderinfo.NewManualOrder(myindex);
SetLastValues(FolderInfo.Get(folder.FolderID)); using (Folder folder = Folder.MakeFolder(parentfolder.MyParent, parentfolder.MyConnection, uniquename, string.Empty, "Short Name", null, myorder, string.Empty, DateTime.Now, VlnSettings.UserID))
if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
{ {
folder.Save(); ShowBrokenRules(folder.BrokenRulesCollection);
tn = new VETreeNode((IVEDrillDownReadOnly)_LastFolderInfo); SetLastValues(FolderInfo.Get(folder.FolderID));
if (newtype == MenuSelections.FolderBefore) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index, tn); if (OnNodeOpenProperty(this, new vlnTreePropertyEventArgs(uniquename, folder.FolderConfig)) == DialogResult.OK)
if (newtype == MenuSelections.FolderAfter) SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 1, tn); {
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 if (f2 != -1) Folder.Delete(f2);
f2 = folder.FolderID;
} }
if (f2 != -1) Folder.Delete(f2);
} }
} }
} }