From 0d304bb9ac4ac4d1039885e043380d2783cd5014 Mon Sep 17 00:00:00 2001 From: amanpras Date: Tue, 3 Mar 2026 09:58:01 +0530 Subject: [PATCH 1/2] Shared repository folder item fix --- .../ActionsRepositoryPage.xaml.cs | 2 +- .../ActivitiesGroupsRepositoryPage.xaml.cs | 2 +- .../ActivitiesRepositoryPage.xaml.cs | 2 +- .../UCListView/UcListView.xaml.cs | 85 +++++++++++++++++++ .../Repository/SharedRepositoryOperations.cs | 10 ++- 5 files changed, 97 insertions(+), 4 deletions(-) diff --git a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActionsRepositoryPage.xaml.cs b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActionsRepositoryPage.xaml.cs index 80663b59f..eebf94136 100644 --- a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActionsRepositoryPage.xaml.cs +++ b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActionsRepositoryPage.xaml.cs @@ -78,7 +78,7 @@ private void SetGridAndTreeData() { xActionListView.DataSourceList = mActionsFolder.GetFolderItems(); } - xActionListView.SetFolderTreeRoot(new SharedActionsFolderTreeItem(mActionsFolder)); + xActionListView.SetFolderTreeRootFactory(() => new SharedActionsFolderTreeItem(mActionsFolder)); xActionListView.IsToggleButtonVisible = true; } diff --git a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesGroupsRepositoryPage.xaml.cs b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesGroupsRepositoryPage.xaml.cs index 0b70442db..5a85c8a46 100644 --- a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesGroupsRepositoryPage.xaml.cs +++ b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesGroupsRepositoryPage.xaml.cs @@ -74,7 +74,7 @@ private void SetGridAndTreeData() { xActivitiesGroupsRepositoryListView.DataSourceList = mActivitiesGroupFolder.GetFolderItems(); } - xActivitiesGroupsRepositoryListView.SetFolderTreeRoot(new SharedActivitiesGroupsFolderTreeItem(mActivitiesGroupFolder)); + xActivitiesGroupsRepositoryListView.SetFolderTreeRootFactory(() => new SharedActivitiesGroupsFolderTreeItem(mActivitiesGroupFolder)); xActivitiesGroupsRepositoryListView.IsToggleButtonVisible = true; } diff --git a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesRepositoryPage.xaml.cs b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesRepositoryPage.xaml.cs index 13635002d..64a969cf0 100644 --- a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesRepositoryPage.xaml.cs +++ b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/ActivitiesRepositoryPage.xaml.cs @@ -134,7 +134,7 @@ private void SetGridAndTreeData() xActivitiesRepositoryListView.DataSourceList = mActivitiesFolder.GetFolderItems(); } - xActivitiesRepositoryListView.SetFolderTreeRoot(new SharedActivitiesFolderTreeItem(mActivitiesFolder)); + xActivitiesRepositoryListView.SetFolderTreeRootFactory(() => new SharedActivitiesFolderTreeItem(mActivitiesFolder)); xActivitiesRepositoryListView.IsToggleButtonVisible = true; } diff --git a/Ginger/Ginger/UserControlsLib/UCListView/UcListView.xaml.cs b/Ginger/Ginger/UserControlsLib/UCListView/UcListView.xaml.cs index b3f93f362..60fe2630d 100644 --- a/Ginger/Ginger/UserControlsLib/UCListView/UcListView.xaml.cs +++ b/Ginger/Ginger/UserControlsLib/UCListView/UcListView.xaml.cs @@ -124,6 +124,7 @@ public bool IsToggleButtonVisible bool mFolderViewActive = false; ITreeViewItem mFolderTreeRoot; + Func mFolderTreeRootFactory; CancellationTokenSource? mTreeSearchCts; public void SetFolderTreeRoot(ITreeViewItem root) @@ -135,6 +136,17 @@ public void SetFolderTreeRoot(ITreeViewItem root) xFolderTreeView.AddItem(mFolderTreeRoot); } } + + public void SetFolderTreeRootFactory(Func factory) + { + mFolderTreeRootFactory = factory; + mFolderTreeRoot = factory(); + if (xFolderTreeView != null) + { + xFolderTreeView.ClearTreeItems(); + xFolderTreeView.AddItem(mFolderTreeRoot); + } + } public UcListView() { InitializeComponent(); @@ -401,11 +413,71 @@ NotifyCollectionChangedAction.Remove or NotifyCollectionChangedAction.Move) { OnUcListViewEvent(UcListViewEventArgs.eEventType.UpdateIndex); + + // Refresh folder tree view when items are added/removed/modified + if (mFolderTreeRoot != null && xFolderTreeView != null) + { + RefreshFolderTreeView(); + } } UpdateTitleListCount(); }); } + private void RefreshFolderTreeView() + { + try + { + this.Dispatcher.Invoke(() => + { + if (xFolderTreeView != null && xFolderTreeView.Tree != null && xFolderTreeView.Tree.Items.Count > 0) + { + // Create a fresh tree root to avoid cached children + if (mFolderTreeRootFactory != null) + { + mFolderTreeRoot = mFolderTreeRootFactory(); + } + + if (mFolderTreeRoot != null) + { + xFolderTreeView.ClearTreeItems(); + xFolderTreeView.AddItem(mFolderTreeRoot); + } + // Refresh all expanded nodes in the tree + RefreshExpandedTreeNodes(xFolderTreeView.Tree.Items[0] as TreeViewItem); + } + }); + } + catch (Exception ex) + { + Reporter.ToLog(eLogLevel.ERROR, "Failed to refresh folder tree view", ex); + } + } + + private void RefreshExpandedTreeNodes(TreeViewItem treeNode) + { + if (treeNode == null) + { + return; + } + + if (treeNode.IsExpanded && treeNode.Items.Count > 0) + { + var firstChild = treeNode.Items[0] as TreeViewItem; + if (firstChild != null) + { + xFolderTreeView.RefreshTreeViewItemChildrens(treeNode); + } + + // Recursively refreshing child nodes + var childItems = treeNode.Items.Cast().ToList(); + foreach (var childNode in childItems) + { + RefreshExpandedTreeNodes(childNode); + } + } + } + private void UpdateTitleListCount() { this.Dispatcher.Invoke(() => @@ -1315,6 +1387,19 @@ private void xToggleBtn_Click(object sender, RoutedEventArgs e) // ensure folders + items are presented for current tab root xFolderTreeView.EnableDragDrop = true; xFolderTreeView.TreeChildFolderOnly = false; + + // Refresh the tree to show latest items from repository + // Create a fresh tree root to avoid cached children + if (mFolderTreeRootFactory != null) + { + mFolderTreeRoot = mFolderTreeRootFactory(); + } + + if (mFolderTreeRoot != null) + { + xFolderTreeView.ClearTreeItems(); + xFolderTreeView.AddItem(mFolderTreeRoot); + } } else { diff --git a/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs b/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs index ab75a821f..2f36ecddf 100644 --- a/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs +++ b/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs @@ -158,7 +158,15 @@ public Boolean UploadItemToRepository(Context context, UploadItemSelection itemT { WorkSpace.Instance.SolutionRepository.MoveSharedRepositoryItemToPrevVersion(itemToUpload.ExistingItem); - RepositoryFolderBase repositoryFolder = WorkSpace.Instance.SolutionRepository.GetRepositoryFolderByPath(itemToUpload.ExistingItem.ContainingFolderFullPath); + // Checking if user selected a different target folder, using that, otherwise using existing folder + string targetFolderPath = itemToUpload.ExistingItem.ContainingFolderFullPath; + if (!string.IsNullOrEmpty(itemToUpload.TargetFolderFullPath) && + itemToUpload.TargetFolderFullPath != itemToUpload.ExistingItem.ContainingFolderFullPath) + { + targetFolderPath = itemToUpload.TargetFolderFullPath; + } + + RepositoryFolderBase repositoryFolder = WorkSpace.Instance.SolutionRepository.GetRepositoryFolderByPath(targetFolderPath); if (repositoryFolder != null) { itemCopy.ItemName = itemToUpload.ExistingItem.ItemName; From f0dc9abab59add5027429295a9e25cd6ade59d11 Mon Sep 17 00:00:00 2001 From: amanpras Date: Tue, 3 Mar 2026 11:55:43 +0530 Subject: [PATCH 2/2] Column hide for Overriting Share repo --- .../UploadItemsSelectionPage.xaml.cs | 95 +++++++++++++++++++ .../Repository/SharedRepositoryOperations.cs | 10 +- 2 files changed, 96 insertions(+), 9 deletions(-) diff --git a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/AddItemToRepositoryWizard/UploadItemsSelectionPage.xaml.cs b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/AddItemToRepositoryWizard/UploadItemsSelectionPage.xaml.cs index e4bd7eb02..7c48edbdc 100644 --- a/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/AddItemToRepositoryWizard/UploadItemsSelectionPage.xaml.cs +++ b/Ginger/Ginger/AutomatePageLib/AddActionMenu/SharedRepositoryLib/AddItemToRepositoryWizard/UploadItemsSelectionPage.xaml.cs @@ -29,6 +29,10 @@ limitations under the License. using Amdocs.Ginger.UserControls; using GingerCore.Activities; using GingerCore.Variables; +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; namespace Ginger.Repository.ItemToRepositoryWizard { @@ -37,15 +41,99 @@ namespace Ginger.Repository.ItemToRepositoryWizard /// public partial class UploadItemsSelectionPage : Page, IWizardPage { + /// + /// Converter to invert boolean to visibility (true -> Collapsed, false -> Visible) + /// + private class BoolToVisibilityInvertConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool boolValue) + { + return boolValue ? Visibility.Collapsed : Visibility.Visible; + } + return Visibility.Visible; // Default to visible if not a bool + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Visibility visibility) + { + return visibility != Visibility.Visible; + } + return false; + } + } public UploadItemToRepositoryWizard UploadItemToRepositoryWizard; public UploadItemsValidationPage itemValidate; bool isConvertPage = false; + ObservableList mItemsList; + public UploadItemsSelectionPage(ObservableList items, bool isConvert) { InitializeComponent(); isConvertPage = isConvert; + mItemsList = items; SetSelectedItemsGridView(); itemSelectionGrid.DataSourceList = items; + + // Listen to ItemUploadType changes to show/hide folder column dynamically + items.CollectionChanged += Items_CollectionChanged; + foreach (var item in items) + { + item.PropertyChanged += Item_PropertyChanged; + } + + // Update folder column visibility after grid is loaded + this.Loaded += UploadItemsSelectionPage_Loaded; + } + + private void UploadItemsSelectionPage_Loaded(object sender, RoutedEventArgs e) + { + // Initial update of folder column visibility + UpdateFolderColumnVisibility(); + } + + private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + if (e.NewItems != null) + { + foreach (UploadItemSelection item in e.NewItems) + { + item.PropertyChanged += Item_PropertyChanged; + } + } + if (e.OldItems != null) + { + foreach (UploadItemSelection item in e.OldItems) + { + item.PropertyChanged -= Item_PropertyChanged; + } + } + UpdateFolderColumnVisibility(); + } + + private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(UploadItemSelection.ItemUploadType) || + e.PropertyName == nameof(UploadItemSelection.IsOverrite)) + { + UpdateFolderColumnVisibility(); + } + } + + private void UpdateFolderColumnVisibility() + { + // Show folder column only if there's at least one item that is NOT overwrite + bool shouldShowFolderColumn = mItemsList.Any(item => !item.IsOverrite); + + var folderColumn = itemSelectionGrid.grdMain.Columns.FirstOrDefault(c => + c.Header != null && c.Header.ToString() == "Add to Folder"); + + if (folderColumn != null) + { + folderColumn.Visibility = shouldShowFolderColumn ? Visibility.Visible : Visibility.Collapsed; + } } private void SetSelectedItemsGridView() @@ -165,6 +253,13 @@ private DataTemplate CreateSelectFolderTemplate() panel.SetValue(FrameworkElement.HorizontalAlignmentProperty, HorizontalAlignment.Stretch); panel.SetValue(FrameworkElement.VerticalAlignmentProperty, VerticalAlignment.Center); + //// Hide folder selection UI for overwrite items (folder cannot be changed during overwrite) + //panel.SetBinding(UIElement.VisibilityProperty, new Binding(nameof(UploadItemSelection.IsOverrite)) + //{ + // Converter = new BoolToVisibilityInvertConverter(), + // Mode = BindingMode.OneWay + //}); + var txt = new FrameworkElementFactory(typeof(TextBlock)); txt.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center); txt.SetValue(TextBlock.MarginProperty, new Thickness(0, 0, 6, 0)); diff --git a/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs b/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs index 2f36ecddf..ab75a821f 100644 --- a/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs +++ b/Ginger/GingerCoreNET/Repository/SharedRepositoryOperations.cs @@ -158,15 +158,7 @@ public Boolean UploadItemToRepository(Context context, UploadItemSelection itemT { WorkSpace.Instance.SolutionRepository.MoveSharedRepositoryItemToPrevVersion(itemToUpload.ExistingItem); - // Checking if user selected a different target folder, using that, otherwise using existing folder - string targetFolderPath = itemToUpload.ExistingItem.ContainingFolderFullPath; - if (!string.IsNullOrEmpty(itemToUpload.TargetFolderFullPath) && - itemToUpload.TargetFolderFullPath != itemToUpload.ExistingItem.ContainingFolderFullPath) - { - targetFolderPath = itemToUpload.TargetFolderFullPath; - } - - RepositoryFolderBase repositoryFolder = WorkSpace.Instance.SolutionRepository.GetRepositoryFolderByPath(targetFolderPath); + RepositoryFolderBase repositoryFolder = WorkSpace.Instance.SolutionRepository.GetRepositoryFolderByPath(itemToUpload.ExistingItem.ContainingFolderFullPath); if (repositoryFolder != null) { itemCopy.ItemName = itemToUpload.ExistingItem.ItemName;