");
+<<<<<<< HEAD
sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} {T["report.text.files_unit"]}, {FormatSize(totalSize)})
");
+=======
+ sb.AppendLine($"
{T["report.section.storage_by_file_type"]} ({totalFiles:N0} files, {FormatSize(totalSize)})
");
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
var colors = new[] { "#0078d4", "#2b88d8", "#106ebe", "#005a9e", "#004578",
"#00bcf2", "#009e49", "#8cbd18", "#ffb900", "#d83b01" };
diff --git a/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs b/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs
index 49caae1..57fd8fe 100644
--- a/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs
+++ b/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs
@@ -214,7 +214,11 @@ public partial class DuplicatesViewModel : FeatureViewModelBase
if (dialog.ShowDialog() != true) return;
try
{
+<<<<<<< HEAD
await _csvExportService.WriteAsync(_lastGroups, dialog.FileName, CurrentSplit, CancellationToken.None);
+=======
+ await _csvExportService.WriteAsync(_lastGroups, dialog.FileName, CancellationToken.None);
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
Process.Start(new ProcessStartInfo(dialog.FileName) { UseShellExecute = true });
}
catch (Exception ex) { StatusMessage = $"Export failed: {ex.Message}"; _logger.LogError(ex, "CSV export failed."); }
diff --git a/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs b/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs
index 507d270..3c2ccf2 100644
--- a/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs
+++ b/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs
@@ -176,7 +176,10 @@ public partial class StorageViewModel : FeatureViewModelBase
ExportCsvCommand = new AsyncRelayCommand(ExportCsvAsync, CanExport);
ExportHtmlCommand = new AsyncRelayCommand(ExportHtmlAsync, CanExport);
+<<<<<<< HEAD
ApplyChartThemeColors();
+=======
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
if (_themeManager is not null)
_themeManager.ThemeChanged += (_, _) => UpdateChartSeries();
}
@@ -398,6 +401,7 @@ public partial class StorageViewModel : FeatureViewModelBase
private SKColor ChartFgColor => (_themeManager?.IsDarkActive ?? false) ? new SKColor(0xE7, 0xEA, 0xF1) : new SKColor(0x1F, 0x24, 0x30);
private SKColor ChartSeparatorColor => (_themeManager?.IsDarkActive ?? false) ? new SKColor(0x32, 0x38, 0x49) : new SKColor(0xE3, 0xE6, 0xEC);
+<<<<<<< HEAD
private SKColor ChartSurfaceColor => (_themeManager?.IsDarkActive ?? false) ? new SKColor(0x1E, 0x22, 0x30) : new SKColor(0xFF, 0xFF, 0xFF);
private void ApplyChartThemeColors()
@@ -407,6 +411,8 @@ public partial class StorageViewModel : FeatureViewModelBase
TooltipTextPaint.Color = ChartFgColor;
TooltipBackgroundPaint.Color = ChartSurfaceColor;
}
+=======
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
private void UpdateChartSeries()
{
diff --git a/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml b/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml
index 8e24325..71d21f6 100644
--- a/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml
+++ b/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml
@@ -16,8 +16,12 @@
+<<<<<<< HEAD
diff --git a/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml.cs b/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml.cs
index 8e30277..f33968a 100644
--- a/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml.cs
+++ b/SharepointToolbox/Views/Dialogs/FolderBrowserDialog.xaml.cs
@@ -22,7 +22,10 @@ public partial class FolderBrowserDialog : Window
public IReadOnlyList
SelectedFilePaths { get; private set; } = Array.Empty();
private readonly List _fileCheckboxes = new();
+<<<<<<< HEAD
private readonly List _expandedNodes = new();
+=======
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
///
/// Dialog for browsing library folders. Set
@@ -81,7 +84,10 @@ public partial class FolderBrowserDialog : Window
// Placeholder child so the expand arrow appears.
node.Items.Add(new TreeViewItem { Header = "Loading..." });
node.Expanded += FolderNode_Expanded;
+<<<<<<< HEAD
_expandedNodes.Add(node);
+=======
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
return node;
}
@@ -101,9 +107,18 @@ public partial class FolderBrowserDialog : Window
{
var folder = _ctx.Web.GetFolderByServerRelativeUrl(info.ServerRelativeUrl);
_ctx.Load(folder, f => f.StorageMetrics.TotalSize,
+<<<<<<< HEAD
f => f.StorageMetrics.TotalFileCount);
var list = _ctx.Web.Lists.GetByTitle(info.LibraryTitle);
_ctx.Load(list, l => l.Title);
+=======
+ f => f.StorageMetrics.TotalFileCount,
+ f => f.Folders.Include(sf => sf.Name, sf => sf.ServerRelativeUrl,
+ sf => sf.StorageMetrics.TotalSize,
+ sf => sf.StorageMetrics.TotalFileCount),
+ f => f.Files.Include(fi => fi.Name, fi => fi.Length,
+ fi => fi.ServerRelativeUrl));
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
var progress = new Progress();
await ExecuteQueryRetryHelper.ExecuteQueryRetryAsync(_ctx, progress, CancellationToken.None);
@@ -114,6 +129,7 @@ public partial class FolderBrowserDialog : Window
folder.StorageMetrics.TotalFileCount,
folder.StorageMetrics.TotalSize);
+<<<<<<< HEAD
// Enumerate direct children via paginated CAML — Folder.Folders /
// Folder.Files lazy loading hits the list-view threshold on libraries
// above 5,000 items even when only a small folder is being expanded.
@@ -191,6 +207,53 @@ public partial class FolderBrowserDialog : Window
node.Items.Add(fileItem);
}
}
+=======
+ // Child folders first
+ foreach (var subFolder in folder.Folders)
+ {
+ if (subFolder.Name.StartsWith("_") || subFolder.Name == "Forms")
+ continue;
+
+ var childRelative = string.IsNullOrEmpty(info.RelativePath)
+ ? subFolder.Name
+ : $"{info.RelativePath}/{subFolder.Name}";
+
+ var childInfo = new FolderNodeInfo(
+ info.LibraryTitle, childRelative, subFolder.ServerRelativeUrl);
+
+ var childNode = MakeFolderNode(
+ FormatFolderHeader(subFolder.Name,
+ subFolder.StorageMetrics.TotalFileCount,
+ subFolder.StorageMetrics.TotalSize),
+ childInfo);
+ node.Items.Add(childNode);
+ }
+
+ // Files under this folder — only shown when selection is enabled.
+ if (_allowFileSelection)
+ {
+ foreach (var file in folder.Files)
+ {
+ // Library-relative path for the file (used by the transfer service)
+ var fileRel = string.IsNullOrEmpty(info.RelativePath)
+ ? file.Name
+ : $"{info.RelativePath}/{file.Name}";
+
+ var cb = new CheckBox
+ {
+ Content = $"{file.Name} ({FormatSize(file.Length)})",
+ Tag = new FileNodeInfo(info.LibraryTitle, fileRel),
+ Margin = new Thickness(4, 2, 0, 2),
+ };
+ cb.Checked += FileCheckbox_Toggled;
+ cb.Unchecked += FileCheckbox_Toggled;
+ _fileCheckboxes.Add(cb);
+
+ var fileItem = new TreeViewItem { Header = cb, Focusable = false };
+ node.Items.Add(fileItem);
+ }
+ }
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
}
catch (Exception ex)
{
@@ -305,6 +368,7 @@ public partial class FolderBrowserDialog : Window
Close();
}
+<<<<<<< HEAD
protected override void OnClosed(EventArgs e)
{
Loaded -= OnLoaded;
@@ -320,6 +384,8 @@ public partial class FolderBrowserDialog : Window
base.OnClosed(e);
}
+=======
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
private record FolderNodeInfo(string LibraryTitle, string RelativePath, string ServerRelativeUrl);
private record FileNodeInfo(string LibraryTitle, string RelativePath);
}
diff --git a/SharepointToolbox/Views/Dialogs/InputDialog.xaml b/SharepointToolbox/Views/Dialogs/InputDialog.xaml
index 860c8a3..43d673f 100644
--- a/SharepointToolbox/Views/Dialogs/InputDialog.xaml
+++ b/SharepointToolbox/Views/Dialogs/InputDialog.xaml
@@ -1,8 +1,12 @@
>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
Width="340" Height="140"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource AppBgBrush}"
@@ -12,8 +16,12 @@
+<<<<<<< HEAD
diff --git a/SharepointToolbox/Views/Tabs/TransferView.xaml b/SharepointToolbox/Views/Tabs/TransferView.xaml
index 4e425fe..2b4d4db 100644
--- a/SharepointToolbox/Views/Tabs/TransferView.xaml
+++ b/SharepointToolbox/Views/Tabs/TransferView.xaml
@@ -18,6 +18,7 @@
Click="BrowseSource_Click" Margin="0,0,0,5" />
+<<<<<<< HEAD
@@ -32,6 +33,20 @@
IsChecked="{Binding CopyFolderContents}"
Margin="0,4,0,0"
ToolTip="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.chk.copy_contents.tooltip]}" />
+=======
+
+
+
+
+
+
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8
diff --git a/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml b/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml
index 52b8c08..220abb0 100644
--- a/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml
+++ b/SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml
@@ -44,7 +44,11 @@
+<<<<<<< HEAD
+=======
+
+>>>>>>> f4cc81bb71b935c6f6f050288c9e283dcca5cfa8