chore: release v2.4
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager) - Add InputDialog, Spinner common view - Add DuplicatesCsvExportService - Refresh views, dialogs, and view models across tabs - Update localization strings (en/fr) - Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,13 @@
|
||||
<UserControl x:Class="SharepointToolbox.Views.Tabs.BulkMembersView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common">
|
||||
<DockPanel Margin="10">
|
||||
<!-- Options Panel (Left) -->
|
||||
<StackPanel DockPanel.Dock="Left" Width="240" Margin="0,0,10,0">
|
||||
<ScrollViewer DockPanel.Dock="Left" Width="240" Margin="0,0,10,0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel>
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.import]}"
|
||||
Command="{Binding ImportCsvCommand}" Margin="0,0,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.example]}"
|
||||
@@ -19,8 +22,8 @@
|
||||
Command="{Binding CancelCommand}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
|
||||
<ProgressBar Height="20" Margin="0,10,0,5" Value="{Binding ProgressValue}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<common:Spinner Width="20" Height="20" HorizontalAlignment="Left" Margin="0,10,0,5"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock Text="{Binding ResultSummary}" FontWeight="Bold" Margin="0,10,0,5" />
|
||||
@@ -29,6 +32,7 @@
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulk.exportfailed]}"
|
||||
Command="{Binding ExportFailedCommand}" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Preview DataGrid (Right) -->
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
@@ -44,14 +48,15 @@
|
||||
</Style>
|
||||
</DataGrid.RowStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Valid" Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.valid]}"
|
||||
Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.groupname]}"
|
||||
Binding="{Binding Record.GroupName}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.email]}"
|
||||
Binding="{Binding Record.Email}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.role]}"
|
||||
Binding="{Binding Record.Role}" Width="80" />
|
||||
<DataGridTextColumn Header="Errors"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.errors]}"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
<UserControl x:Class="SharepointToolbox.Views.Tabs.BulkSitesView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common">
|
||||
<DockPanel Margin="10">
|
||||
<StackPanel DockPanel.Dock="Left" Width="240" Margin="0,0,10,0">
|
||||
<ScrollViewer DockPanel.Dock="Left" Width="240" Margin="0,0,10,0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel>
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.import]}"
|
||||
Command="{Binding ImportCsvCommand}" Margin="0,0,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.example]}"
|
||||
@@ -18,8 +21,8 @@
|
||||
Command="{Binding CancelCommand}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
|
||||
<ProgressBar Height="20" Margin="0,10,0,5" Value="{Binding ProgressValue}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<common:Spinner Width="20" Height="20" HorizontalAlignment="Left" Margin="0,10,0,5"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock Text="{Binding ResultSummary}" FontWeight="Bold" Margin="0,10,0,5" />
|
||||
@@ -28,6 +31,7 @@
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulk.exportfailed]}"
|
||||
Command="{Binding ExportFailedCommand}" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
IsReadOnly="True" CanUserSortColumns="True">
|
||||
@@ -42,7 +46,8 @@
|
||||
</Style>
|
||||
</DataGrid.RowStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Valid" Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.valid]}"
|
||||
Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.name]}"
|
||||
Binding="{Binding Record.Name}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.alias]}"
|
||||
@@ -51,7 +56,7 @@
|
||||
Binding="{Binding Record.Type}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.owners]}"
|
||||
Binding="{Binding Record.Owners}" Width="*" />
|
||||
<DataGridTextColumn Header="Errors"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.errors]}"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<GroupBox Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[grp.dup.criteria]}" Margin="0,0,0,8">
|
||||
<StackPanel Margin="4">
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[lbl.dup.note]}"
|
||||
TextWrapping="Wrap" FontSize="11" Foreground="#555" Margin="0,0,0,6" />
|
||||
TextWrapping="Wrap" FontSize="11" Foreground="{DynamicResource TextMutedBrush}" Margin="0,0,0,6" />
|
||||
<CheckBox Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[chk.dup.size]}"
|
||||
IsChecked="{Binding MatchSize}" Margin="0,2" />
|
||||
<CheckBox Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[chk.dup.created]}"
|
||||
@@ -44,28 +44,51 @@
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[btn.cancel]}"
|
||||
Command="{Binding CancelCommand}" Height="28" Margin="0,0,0,8" />
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[btn.open.results]}"
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.label]}" Margin="0,4,0,0" />
|
||||
<ComboBox SelectedIndex="{Binding SplitModeIndex}" Height="26" Margin="0,0,0,4">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.single]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.bySite]}" />
|
||||
</ComboBox>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.label]}" Margin="0,2,0,0" />
|
||||
<ComboBox SelectedIndex="{Binding HtmlLayoutIndex}" Height="26" Margin="0,0,0,6">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.separate]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.tabbed]}" />
|
||||
</ComboBox>
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.btn.exportCsv]}"
|
||||
Command="{Binding ExportCsvCommand}" Height="28" Margin="0,0,0,4" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.btn.exportHtml]}"
|
||||
Command="{Binding ExportHtmlCommand}" Height="28" Margin="0,0,0,4" />
|
||||
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" FontSize="11" Foreground="#555" Margin="0,4" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" FontSize="11" Foreground="{DynamicResource TextMutedBrush}" Margin="0,4" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Results DataGrid -->
|
||||
<DataGrid ItemsSource="{Binding Results}" IsReadOnly="True" AutoGenerateColumns="False"
|
||||
VirtualizingPanel.IsVirtualizing="True" Margin="4,8,8,8">
|
||||
VirtualizingPanel.IsVirtualizing="True" Margin="4,8,8,8"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Auto"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Auto"
|
||||
ColumnWidth="Auto">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Group" Binding="{Binding GroupName}" Width="160" />
|
||||
<DataGridTextColumn Header="Copies" Binding="{Binding GroupSize}" Width="60"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[duplicates.col.group]}"
|
||||
Binding="{Binding GroupName}" Width="160" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[duplicates.col.copies]}"
|
||||
Binding="{Binding GroupSize}" Width="60"
|
||||
ElementStyle="{StaticResource RightAlignStyle}" />
|
||||
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="160" />
|
||||
<DataGridTextColumn Header="Library" Binding="{Binding Library}" Width="120" />
|
||||
<DataGridTextColumn Header="Size"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.name]}"
|
||||
Binding="{Binding Name}" Width="160" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.library]}"
|
||||
Binding="{Binding Library}" Width="120" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.size]}"
|
||||
Binding="{Binding SizeBytes, Converter={StaticResource BytesConverter}}"
|
||||
Width="90" ElementStyle="{StaticResource RightAlignStyle}" />
|
||||
<DataGridTextColumn Header="Created" Binding="{Binding Created, StringFormat=yyyy-MM-dd}" Width="100" />
|
||||
<DataGridTextColumn Header="Modified" Binding="{Binding Modified, StringFormat=yyyy-MM-dd}" Width="100" />
|
||||
<DataGridTextColumn Header="Path" Binding="{Binding Path}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.created]}"
|
||||
Binding="{Binding Created, StringFormat=yyyy-MM-dd}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.modified]}"
|
||||
Binding="{Binding Modified, StringFormat=yyyy-MM-dd}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.path]}"
|
||||
Binding="{Binding Path}" Width="400" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
<UserControl x:Class="SharepointToolbox.Views.Tabs.FolderStructureView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common">
|
||||
<DockPanel Margin="10">
|
||||
<StackPanel DockPanel.Dock="Left" Width="280" Margin="0,0,10,0">
|
||||
<ScrollViewer DockPanel.Dock="Left" Width="280" Margin="0,0,10,0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel>
|
||||
<!-- Library input -->
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.library]}"
|
||||
Margin="0,0,0,3" />
|
||||
@@ -23,14 +26,15 @@
|
||||
Command="{Binding CancelCommand}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
|
||||
<ProgressBar Height="20" Margin="0,10,0,5" Value="{Binding ProgressValue}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<common:Spinner Width="20" Height="20" HorizontalAlignment="Left" Margin="0,10,0,5"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock Text="{Binding ResultSummary}" FontWeight="Bold" Margin="0,10,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulk.exportfailed]}"
|
||||
Command="{Binding ExportFailedCommand}" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
IsReadOnly="True" CanUserSortColumns="True">
|
||||
@@ -45,12 +49,17 @@
|
||||
</Style>
|
||||
</DataGrid.RowStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Valid" Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="Level 1" Binding="{Binding Record.Level1}" Width="*" />
|
||||
<DataGridTextColumn Header="Level 2" Binding="{Binding Record.Level2}" Width="*" />
|
||||
<DataGridTextColumn Header="Level 3" Binding="{Binding Record.Level3}" Width="*" />
|
||||
<DataGridTextColumn Header="Level 4" Binding="{Binding Record.Level4}" Width="*" />
|
||||
<DataGridTextColumn Header="Errors"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.valid]}"
|
||||
Binding="{Binding IsValid}" Width="50" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.col.level1]}"
|
||||
Binding="{Binding Record.Level1}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.col.level2]}"
|
||||
Binding="{Binding Record.Level2}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.col.level3]}"
|
||||
Binding="{Binding Record.Level3}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.col.level4]}"
|
||||
Binding="{Binding Record.Level4}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.errors]}"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common"
|
||||
xmlns:models="clr-namespace:SharepointToolbox.Core.Models"
|
||||
xmlns:converters="clr-namespace:SharepointToolbox.Core.Converters">
|
||||
|
||||
@@ -21,7 +22,9 @@
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Left panel: Scan configuration -->
|
||||
<DockPanel Grid.Column="0" Grid.Row="0" Margin="8">
|
||||
<ScrollViewer Grid.Column="0" Grid.Row="0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<DockPanel Margin="8">
|
||||
|
||||
<!-- Scan Options GroupBox -->
|
||||
<GroupBox Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[grp.scan.opts]}"
|
||||
@@ -65,7 +68,7 @@
|
||||
<Style TargetType="TextBlock">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsSimplifiedMode}" Value="False">
|
||||
<Setter Property="Foreground" Value="Gray" />
|
||||
<Setter Property="Foreground" Value="{DynamicResource TextMutedBrush}" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
@@ -108,6 +111,16 @@
|
||||
Command="{Binding CancelCommand}"
|
||||
Margin="0,0,0,4" Padding="6,3" />
|
||||
</Grid>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.label]}" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding SplitModeIndex}" Height="24" Margin="0,0,0,4">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.single]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.bySite]}" />
|
||||
</ComboBox>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.label]}" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding HtmlLayoutIndex}" Height="24" Margin="0,0,0,6">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.separate]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.tabbed]}" />
|
||||
</ComboBox>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
@@ -125,6 +138,7 @@
|
||||
</StackPanel>
|
||||
|
||||
</DockPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Right panel: Summary + Results -->
|
||||
<Grid Grid.Column="1" Grid.Row="0" Margin="0,8,8,8">
|
||||
@@ -153,7 +167,8 @@
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border CornerRadius="6" Padding="14,10" Margin="0,0,10,4" MinWidth="140">
|
||||
<Border CornerRadius="6" Padding="14,10" Margin="0,0,10,4" MinWidth="140"
|
||||
TextElement.Foreground="{DynamicResource OnColoredBgBrush}">
|
||||
<Border.Style>
|
||||
<Style TargetType="Border">
|
||||
<Setter Property="Background" Value="#F3F4F6" />
|
||||
@@ -182,7 +197,7 @@
|
||||
</Style>
|
||||
</Border.Style>
|
||||
<StackPanel>
|
||||
<TextBlock Text="{Binding Count}" FontSize="22" FontWeight="Bold" />
|
||||
<TextBlock Text="{Binding Count}" FontSize="22" FontWeight="Bold" Foreground="#1F2430" />
|
||||
<TextBlock Text="{Binding Label}" FontSize="11" Foreground="#555" />
|
||||
<TextBlock FontSize="10" Foreground="#888" Margin="0,2,0,0">
|
||||
<Run Text="{Binding DistinctUsers, Mode=OneWay}" />
|
||||
@@ -222,19 +237,24 @@
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding RiskLevel}" Value="{x:Static models:RiskLevel.High}">
|
||||
<Setter Property="Background" Value="#FEF2F2" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding RiskLevel}" Value="{x:Static models:RiskLevel.Medium}">
|
||||
<Setter Property="Background" Value="#FFFBEB" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding RiskLevel}" Value="{x:Static models:RiskLevel.Low}">
|
||||
<Setter Property="Background" Value="#ECFDF5" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding RiskLevel}" Value="{x:Static models:RiskLevel.ReadOnly}">
|
||||
<Setter Property="Background" Value="#EFF6FF" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<!-- Phase 18: auto-elevated rows get amber background + tooltip -->
|
||||
<DataTrigger Binding="{Binding WasAutoElevated}" Value="True">
|
||||
<Setter Property="Background" Value="#FFF9E6" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
<Setter Property="ToolTip" Value="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[permissions.elevated.tooltip]}" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
@@ -261,15 +281,22 @@
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTextColumn Header="Object Type" Binding="{Binding ObjectType}" Width="100" />
|
||||
<DataGridTextColumn Header="Title" Binding="{Binding Title}" Width="140" />
|
||||
<DataGridTextColumn Header="URL" Binding="{Binding Url}" Width="200" />
|
||||
<DataGridTextColumn Header="Unique Perms" Binding="{Binding HasUniquePermissions}" Width="90" />
|
||||
<DataGridTextColumn Header="Users" Binding="{Binding Users}" Width="140" />
|
||||
<DataGridTextColumn Header="Permission Levels" Binding="{Binding PermissionLevels}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.object_type]}"
|
||||
Binding="{Binding ObjectType}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.title]}"
|
||||
Binding="{Binding Title}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.url]}"
|
||||
Binding="{Binding Url}" Width="200" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[perm.col.unique_perms]}"
|
||||
Binding="{Binding HasUniquePermissions}" Width="90" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.users_groups]}"
|
||||
Binding="{Binding Users}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[perm.col.permission_levels]}"
|
||||
Binding="{Binding PermissionLevels}" Width="140" />
|
||||
|
||||
<!-- Simplified Labels column (only visible in simplified mode) -->
|
||||
<DataGridTextColumn Header="Simplified" Binding="{Binding SimplifiedLabels}" Width="200">
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.simplified]}"
|
||||
Binding="{Binding SimplifiedLabels}" Width="200">
|
||||
<DataGridTextColumn.Visibility>
|
||||
<Binding Path="DataContext.IsSimplifiedMode"
|
||||
RelativeSource="{RelativeSource AncestorType=DataGrid}"
|
||||
@@ -277,8 +304,10 @@
|
||||
</DataGridTextColumn.Visibility>
|
||||
</DataGridTextColumn>
|
||||
|
||||
<DataGridTextColumn Header="Granted Through" Binding="{Binding GrantedThrough}" Width="140" />
|
||||
<DataGridTextColumn Header="Principal Type" Binding="{Binding PrincipalType}" Width="110" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.granted_through]}"
|
||||
Binding="{Binding GrantedThrough}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[perm.col.principal_type]}"
|
||||
Binding="{Binding PrincipalType}" Width="110" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</Grid>
|
||||
@@ -286,9 +315,8 @@
|
||||
<!-- Bottom: status bar spanning both columns -->
|
||||
<StatusBar Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1">
|
||||
<StatusBarItem>
|
||||
<ProgressBar Width="150" Height="14"
|
||||
Value="{Binding ProgressValue}"
|
||||
Minimum="0" Maximum="100" />
|
||||
<common:Spinner Width="14" Height="14"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
</StatusBarItem>
|
||||
<StatusBarItem Content="{Binding StatusMessage}" />
|
||||
</StatusBar>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" FontSize="11" Foreground="#555" Margin="0,4" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" FontSize="11" Foreground="{DynamicResource TextMutedBrush}" Margin="0,4" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel Margin="16">
|
||||
<!-- Language -->
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.language]}" />
|
||||
@@ -16,6 +17,21 @@
|
||||
|
||||
<Separator Margin="0,12" />
|
||||
|
||||
<!-- Theme -->
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.theme]}" />
|
||||
<ComboBox Width="200" HorizontalAlignment="Left"
|
||||
SelectedValue="{Binding SelectedTheme}"
|
||||
SelectedValuePath="Tag">
|
||||
<ComboBoxItem Tag="System"
|
||||
Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.theme.system]}" />
|
||||
<ComboBoxItem Tag="Light"
|
||||
Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.theme.light]}" />
|
||||
<ComboBoxItem Tag="Dark"
|
||||
Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.theme.dark]}" />
|
||||
</ComboBox>
|
||||
|
||||
<Separator Margin="0,12" />
|
||||
|
||||
<!-- Data folder -->
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.folder]}" />
|
||||
<DockPanel>
|
||||
@@ -29,7 +45,7 @@
|
||||
|
||||
<!-- MSP Logo -->
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.logo.title]}" />
|
||||
<Border BorderBrush="#DDDDDD" BorderThickness="1" Padding="8" CornerRadius="4"
|
||||
<Border BorderBrush="{DynamicResource BorderSoftBrush}" BorderThickness="1" Padding="8" CornerRadius="4"
|
||||
HorizontalAlignment="Left" MinWidth="200" MinHeight="60" Margin="0,4,0,0">
|
||||
<Grid>
|
||||
<Image Source="{Binding MspLogoPreview, Converter={StaticResource Base64ToImageConverter}}"
|
||||
@@ -37,7 +53,7 @@
|
||||
Visibility="{Binding MspLogoPreview, Converter={StaticResource StringToVisibilityConverter}}" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.logo.nopreview]}"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Center"
|
||||
Foreground="#999999" FontStyle="Italic">
|
||||
Foreground="{DynamicResource TextMutedBrush}" FontStyle="Italic">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="Visibility" Value="Visible" />
|
||||
@@ -65,9 +81,10 @@
|
||||
Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.ownership.auto]}"
|
||||
Margin="0,4,0,0" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[settings.ownership.description]}"
|
||||
Foreground="#666666" FontSize="11" TextWrapping="Wrap" Margin="20,4,0,0" />
|
||||
Foreground="{DynamicResource TextMutedBrush}" FontSize="11" TextWrapping="Wrap" Margin="20,4,0,0" />
|
||||
|
||||
<TextBlock Text="{Binding StatusMessage}" Foreground="#CC0000" FontSize="11" Margin="0,4,0,0"
|
||||
<TextBlock Text="{Binding StatusMessage}" Foreground="{DynamicResource DangerBrush}" FontSize="11" Margin="0,4,0,0"
|
||||
Visibility="{Binding StatusMessage, Converter={StaticResource StringToVisibilityConverter}}" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</UserControl>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<CheckBox Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[chk.max.depth]}"
|
||||
IsChecked="{Binding IsMaxDepth}" Margin="0,2" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[stor.note]}"
|
||||
TextWrapping="Wrap" FontSize="11" Foreground="#888"
|
||||
TextWrapping="Wrap" FontSize="11" Foreground="{DynamicResource TextMutedBrush}"
|
||||
Margin="0,6,0,0" />
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
@@ -45,6 +45,16 @@
|
||||
<GroupBox Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[grp.export.fmt]}"
|
||||
Margin="0,0,0,8">
|
||||
<StackPanel Margin="4">
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.label]}" Margin="0,0,0,0" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding SplitModeIndex}" Height="24" Margin="0,0,0,4">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.single]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.bySite]}" />
|
||||
</ComboBox>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.label]}" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding HtmlLayoutIndex}" Height="24" Margin="0,0,0,6">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.separate]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.tabbed]}" />
|
||||
</ComboBox>
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[stor.rad.csv]}"
|
||||
Command="{Binding ExportCsvCommand}"
|
||||
Height="26" Margin="0,2" />
|
||||
@@ -68,7 +78,7 @@
|
||||
|
||||
<!-- Status -->
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap"
|
||||
FontSize="11" Foreground="#555" Margin="0,4" />
|
||||
FontSize="11" Foreground="{DynamicResource TextMutedBrush}" Margin="0,4" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
@@ -82,7 +92,7 @@
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Summary bar -->
|
||||
<Border Grid.Row="0" Background="#F0F7FF" CornerRadius="4" Padding="12,8" Margin="0,0,0,6">
|
||||
<Border Grid.Row="0" Background="{DynamicResource AccentSoftBrush}" CornerRadius="4" Padding="12,8" Margin="0,0,0,6">
|
||||
<Border.Style>
|
||||
<Style TargetType="Border">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
@@ -94,18 +104,18 @@
|
||||
</Style>
|
||||
</Border.Style>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Margin="0,0,24,0">
|
||||
<Run Text="Total Size: " FontWeight="SemiBold" />
|
||||
<Run Text="{Binding SummaryTotalSize, Converter={StaticResource BytesConverter}, Mode=OneWay}" />
|
||||
</TextBlock>
|
||||
<TextBlock Margin="0,0,24,0">
|
||||
<Run Text="Version Size: " FontWeight="SemiBold" />
|
||||
<Run Text="{Binding SummaryVersionSize, Converter={StaticResource BytesConverter}, Mode=OneWay}" />
|
||||
</TextBlock>
|
||||
<TextBlock>
|
||||
<Run Text="Files: " FontWeight="SemiBold" />
|
||||
<Run Text="{Binding SummaryFileCount, StringFormat=N0, Mode=OneWay}" />
|
||||
</TextBlock>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,24,0">
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[storage.lbl.total_size_colon]}" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding SummaryTotalSize, Converter={StaticResource BytesConverter}, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,0,24,0">
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[storage.lbl.version_size_colon]}" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding SummaryVersionSize, Converter={StaticResource BytesConverter}, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[storage.lbl.files_colon]}" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding SummaryFileCount, StringFormat=N0, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
@@ -147,11 +157,11 @@
|
||||
|
||||
<!-- Splitter between DataGrid and Chart -->
|
||||
<GridSplitter Grid.Row="2" Height="5" HorizontalAlignment="Stretch"
|
||||
Background="#DDD" ResizeDirection="Rows" />
|
||||
Background="{DynamicResource BorderSoftBrush}" ResizeDirection="Rows" />
|
||||
|
||||
<!-- Chart panel -->
|
||||
<Border Grid.Row="3" BorderBrush="#DDD" BorderThickness="1" CornerRadius="4"
|
||||
Padding="8" Background="White">
|
||||
<Border Grid.Row="3" BorderBrush="{DynamicResource BorderSoftBrush}" BorderThickness="1" CornerRadius="4"
|
||||
Padding="8" Background="{DynamicResource SurfaceBrush}">
|
||||
<Grid>
|
||||
<!-- Chart title -->
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[stor.chart.title]}"
|
||||
@@ -160,7 +170,7 @@
|
||||
|
||||
<!-- No data placeholder -->
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Foreground="#888" FontSize="12"
|
||||
Foreground="{DynamicResource TextMutedBrush}" FontSize="12"
|
||||
Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[stor.chart.nodata]}">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
@@ -192,7 +202,11 @@
|
||||
</Grid.Style>
|
||||
<lvc:PieChart x:Name="StoragePieChart"
|
||||
Series="{Binding PieChartSeries}"
|
||||
LegendPosition="Right" />
|
||||
LegendPosition="Right"
|
||||
LegendTextPaint="{Binding LegendTextPaint}"
|
||||
LegendBackgroundPaint="{Binding LegendBackgroundPaint}"
|
||||
TooltipTextPaint="{Binding TooltipTextPaint}"
|
||||
TooltipBackgroundPaint="{Binding TooltipBackgroundPaint}" />
|
||||
</Grid>
|
||||
|
||||
<!-- Bar chart wrapper (visible when IsDonutChart=false AND HasChartData=true) -->
|
||||
@@ -214,7 +228,9 @@
|
||||
<lvc:CartesianChart Series="{Binding BarChartSeries}"
|
||||
XAxes="{Binding BarXAxes}"
|
||||
YAxes="{Binding BarYAxes}"
|
||||
LegendPosition="Hidden" />
|
||||
LegendPosition="Hidden"
|
||||
TooltipTextPaint="{Binding TooltipTextPaint}"
|
||||
TooltipBackgroundPaint="{Binding TooltipBackgroundPaint}" />
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
@@ -22,16 +22,20 @@ public partial class StorageView : UserControl
|
||||
/// </summary>
|
||||
internal sealed class SingleSliceTooltip : IChartTooltip
|
||||
{
|
||||
private readonly System.Windows.Controls.ToolTip _tip = new()
|
||||
private readonly System.Windows.Controls.ToolTip _tip;
|
||||
|
||||
public SingleSliceTooltip()
|
||||
{
|
||||
Padding = new System.Windows.Thickness(8, 4, 8, 4),
|
||||
FontSize = 13,
|
||||
Background = new System.Windows.Media.SolidColorBrush(
|
||||
System.Windows.Media.Color.FromRgb(255, 255, 255)),
|
||||
BorderBrush = new System.Windows.Media.SolidColorBrush(
|
||||
System.Windows.Media.Color.FromRgb(200, 200, 200)),
|
||||
BorderThickness = new System.Windows.Thickness(1),
|
||||
};
|
||||
_tip = new System.Windows.Controls.ToolTip
|
||||
{
|
||||
Padding = new System.Windows.Thickness(8, 4, 8, 4),
|
||||
FontSize = 13,
|
||||
BorderThickness = new System.Windows.Thickness(1),
|
||||
};
|
||||
_tip.SetResourceReference(System.Windows.Controls.Control.BackgroundProperty, "SurfaceBrush");
|
||||
_tip.SetResourceReference(System.Windows.Controls.Control.ForegroundProperty, "TextBrush");
|
||||
_tip.SetResourceReference(System.Windows.Controls.Control.BorderBrushProperty, "BorderSoftBrush");
|
||||
}
|
||||
|
||||
public void Show(IEnumerable<ChartPoint> foundPoints, Chart chart)
|
||||
{
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
<DockPanel Margin="10">
|
||||
<!-- Left panel: Capture and Apply -->
|
||||
<StackPanel DockPanel.Dock="Left" Width="320" Margin="0,0,10,0">
|
||||
<ScrollViewer DockPanel.Dock="Left" Width="320" Margin="0,0,10,0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel>
|
||||
<!-- Capture Section -->
|
||||
<GroupBox Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[templates.capture]}"
|
||||
Margin="0,0,0,10">
|
||||
@@ -52,6 +54,7 @@
|
||||
<!-- Progress -->
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" Margin="0,5,0,0" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Right panel: Template list -->
|
||||
<DockPanel>
|
||||
@@ -68,10 +71,14 @@
|
||||
AutoGenerateColumns="False" IsReadOnly="True"
|
||||
SelectionMode="Single" CanUserSortColumns="True">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="*" />
|
||||
<DataGridTextColumn Header="Type" Binding="{Binding SiteType}" Width="100" />
|
||||
<DataGridTextColumn Header="Source" Binding="{Binding SourceUrl}" Width="*" />
|
||||
<DataGridTextColumn Header="Captured" Binding="{Binding CapturedAt, StringFormat=yyyy-MM-dd HH:mm}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.name]}"
|
||||
Binding="{Binding Name}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.type]}"
|
||||
Binding="{Binding SiteType}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[templates.col.source]}"
|
||||
Binding="{Binding SourceUrl}" Width="*" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[templates.col.captured]}"
|
||||
Binding="{Binding CapturedAt, StringFormat=yyyy-MM-dd HH:mm}" Width="140" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
<UserControl x:Class="SharepointToolbox.Views.Tabs.TransferView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common">
|
||||
<DockPanel Margin="10">
|
||||
<!-- Options Panel (Left) -->
|
||||
<StackPanel DockPanel.Dock="Left" Width="340" Margin="0,0,10,0">
|
||||
<ScrollViewer DockPanel.Dock="Left" Width="340" Margin="0,0,10,0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<StackPanel>
|
||||
<!-- Source -->
|
||||
<GroupBox Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.sourcesite]}"
|
||||
Margin="0,0,0,10">
|
||||
@@ -14,7 +17,21 @@
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.browse]}"
|
||||
Click="BrowseSource_Click" Margin="0,0,0,5" />
|
||||
<TextBlock Text="{Binding SourceLibrary}" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding SourceFolderPath}" Foreground="Gray" />
|
||||
<TextBlock Text="{Binding SourceFolderPath}" Foreground="{DynamicResource TextMutedBrush}" />
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Foreground="{DynamicResource AccentBrush}" FontStyle="Italic" FontSize="11"
|
||||
Text="{Binding SelectedFileCount, Mode=OneWay}" />
|
||||
<TextBlock Foreground="{DynamicResource AccentBrush}" FontStyle="Italic" FontSize="11"
|
||||
Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.text.files_selected]}" />
|
||||
</StackPanel>
|
||||
<CheckBox Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.chk.include_source]}"
|
||||
IsChecked="{Binding IncludeSourceFolder}"
|
||||
Margin="0,6,0,0"
|
||||
ToolTip="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.chk.include_source.tooltip]}" />
|
||||
<CheckBox Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.chk.copy_contents]}"
|
||||
IsChecked="{Binding CopyFolderContents}"
|
||||
Margin="0,4,0,0"
|
||||
ToolTip="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.chk.copy_contents.tooltip]}" />
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
@@ -27,7 +44,7 @@
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[transfer.browse]}"
|
||||
Click="BrowseDest_Click" Margin="0,0,0,5" />
|
||||
<TextBlock Text="{Binding DestLibrary}" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding DestFolderPath}" Foreground="Gray" />
|
||||
<TextBlock Text="{Binding DestFolderPath}" Foreground="{DynamicResource TextMutedBrush}" />
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
@@ -62,9 +79,8 @@
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
|
||||
<!-- Progress -->
|
||||
<ProgressBar Height="20" Margin="0,10,0,5"
|
||||
Value="{Binding ProgressValue}"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<common:Spinner Width="20" Height="20" HorizontalAlignment="Left" Margin="0,10,0,5"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
<TextBlock Text="{Binding StatusMessage}" TextWrapping="Wrap" />
|
||||
|
||||
<!-- Results -->
|
||||
@@ -74,6 +90,7 @@
|
||||
Command="{Binding ExportFailedCommand}"
|
||||
Visibility="{Binding HasFailures, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Right panel placeholder for future enhancements -->
|
||||
<Border />
|
||||
|
||||
@@ -53,11 +53,15 @@ public partial class TransferView : UserControl
|
||||
ClientId = _viewModel.CurrentProfile.ClientId,
|
||||
};
|
||||
var ctx = await _sessionManager.GetOrCreateContextAsync(profile, CancellationToken.None);
|
||||
var folderBrowser = new FolderBrowserDialog(ctx) { Owner = Window.GetWindow(this) };
|
||||
var folderBrowser = new FolderBrowserDialog(ctx, allowFileSelection: true)
|
||||
{
|
||||
Owner = Window.GetWindow(this)
|
||||
};
|
||||
if (folderBrowser.ShowDialog() == true)
|
||||
{
|
||||
_viewModel.SourceLibrary = folderBrowser.SelectedLibrary;
|
||||
_viewModel.SourceFolderPath = folderBrowser.SelectedFolderPath;
|
||||
_viewModel.SetSelectedFiles(folderBrowser.SelectedFilePaths);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +85,10 @@ public partial class TransferView : UserControl
|
||||
ClientId = _viewModel.CurrentProfile.ClientId,
|
||||
};
|
||||
var ctx = await _sessionManager.GetOrCreateContextAsync(profile, CancellationToken.None);
|
||||
var folderBrowser = new FolderBrowserDialog(ctx) { Owner = Window.GetWindow(this) };
|
||||
var folderBrowser = new FolderBrowserDialog(ctx, allowFolderCreation: true)
|
||||
{
|
||||
Owner = Window.GetWindow(this)
|
||||
};
|
||||
if (folderBrowser.ShowDialog() == true)
|
||||
{
|
||||
_viewModel.DestLibrary = folderBrowser.SelectedLibrary;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<UserControl x:Class="SharepointToolbox.Views.Tabs.UserAccessAuditView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization">
|
||||
xmlns:loc="clr-namespace:SharepointToolbox.Localization"
|
||||
xmlns:common="clr-namespace:SharepointToolbox.Views.Common">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="290" />
|
||||
@@ -13,7 +14,9 @@
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Left panel -->
|
||||
<DockPanel Grid.Column="0" Grid.Row="0" Margin="8">
|
||||
<ScrollViewer Grid.Column="0" Grid.Row="0"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<DockPanel Margin="8">
|
||||
|
||||
<!-- Mode toggle -->
|
||||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,8">
|
||||
@@ -41,7 +44,7 @@
|
||||
</GroupBox.Style>
|
||||
<StackPanel>
|
||||
<TextBox Text="{Binding SearchQuery, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,2" />
|
||||
<TextBlock Text="Searching..." FontStyle="Italic" FontSize="10" Foreground="Gray" Margin="0,0,0,2">
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.searching]}" FontStyle="Italic" FontSize="10" Foreground="{DynamicResource TextMutedBrush}" Margin="0,0,0,2">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
@@ -115,9 +118,9 @@
|
||||
|
||||
<!-- Status row: load status + user count -->
|
||||
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="0,0,0,4">
|
||||
<TextBlock Text="{Binding DirectoryLoadStatus}" FontStyle="Italic" Foreground="Gray" FontSize="10"
|
||||
<TextBlock Text="{Binding DirectoryLoadStatus}" FontStyle="Italic" Foreground="{DynamicResource TextMutedBrush}" FontSize="10"
|
||||
Margin="0,0,8,0" />
|
||||
<TextBlock FontSize="10" Foreground="Gray">
|
||||
<TextBlock FontSize="10" Foreground="{DynamicResource TextMutedBrush}">
|
||||
<TextBlock.Text>
|
||||
<MultiBinding StringFormat="{}{0} {1}">
|
||||
<Binding Path="DirectoryUserCount" />
|
||||
@@ -130,7 +133,7 @@
|
||||
<!-- Hint text -->
|
||||
<TextBlock DockPanel.Dock="Bottom"
|
||||
Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[directory.hint.doubleclick]}"
|
||||
FontStyle="Italic" Foreground="Gray" FontSize="10" Margin="0,4,0,0"
|
||||
FontStyle="Italic" Foreground="{DynamicResource TextMutedBrush}" FontSize="10" Margin="0,4,0,0"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<!-- Directory DataGrid -->
|
||||
@@ -142,17 +145,17 @@
|
||||
CanUserSortColumns="True"
|
||||
SelectionMode="Single" SelectionUnit="FullRow"
|
||||
HeadersVisibility="Column" GridLinesVisibility="Horizontal"
|
||||
BorderThickness="1" BorderBrush="#DDDDDD">
|
||||
BorderThickness="1" BorderBrush="{DynamicResource BorderSoftBrush}">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="Name"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[directory.col.name]}"
|
||||
Binding="{Binding DisplayName}" Width="120" />
|
||||
<DataGridTextColumn Header="Email"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.email]}"
|
||||
Binding="{Binding UserPrincipalName}" Width="140" />
|
||||
<DataGridTextColumn Header="Department"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[directory.col.department]}"
|
||||
Binding="{Binding Department}" Width="90" />
|
||||
<DataGridTextColumn Header="Job Title"
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[directory.col.jobtitle]}"
|
||||
Binding="{Binding JobTitle}" Width="90" />
|
||||
<DataGridTemplateColumn Header="Type" Width="60">
|
||||
<DataGridTemplateColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[directory.col.type]}" Width="60">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding UserType}" VerticalAlignment="Center">
|
||||
@@ -181,19 +184,20 @@
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Border Background="#EBF5FB" BorderBrush="#2980B9" BorderThickness="1"
|
||||
CornerRadius="4" Padding="6,2" Margin="0,1">
|
||||
CornerRadius="4" Padding="6,2" Margin="0,1"
|
||||
TextElement.Foreground="{DynamicResource OnColoredBgBrush}">
|
||||
<DockPanel>
|
||||
<Button Content="x" DockPanel.Dock="Right" Padding="4,0"
|
||||
Background="Transparent" BorderThickness="0"
|
||||
Command="{Binding DataContext.RemoveUserCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
|
||||
CommandParameter="{Binding}" />
|
||||
<TextBlock Text="{Binding DisplayName}" VerticalAlignment="Center" />
|
||||
<TextBlock Text="{Binding DisplayName}" VerticalAlignment="Center" Foreground="#1F2430" />
|
||||
</DockPanel>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
<TextBlock Text="{Binding SelectedUsersLabel}" FontStyle="Italic" Foreground="Gray" FontSize="10" />
|
||||
<TextBlock Text="{Binding SelectedUsersLabel}" FontStyle="Italic" Foreground="{DynamicResource TextMutedBrush}" FontSize="10" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Scan Options (always visible) -->
|
||||
@@ -232,6 +236,17 @@
|
||||
Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[btn.cancel]}"
|
||||
Command="{Binding CancelCommand}" Margin="0,0,0,0" Padding="6,3" />
|
||||
</Grid>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.label]}" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding SplitModeIndex}" Height="24" Margin="0,0,0,4">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.single]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.bySite]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.split.byUser]}" />
|
||||
</ComboBox>
|
||||
<Label Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.label]}" Padding="0,2" />
|
||||
<ComboBox SelectedIndex="{Binding HtmlLayoutIndex}" Height="24" Margin="0,0,0,6">
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.separate]}" />
|
||||
<ComboBoxItem Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[export.html.layout.tabbed]}" />
|
||||
</ComboBox>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
@@ -247,6 +262,7 @@
|
||||
</StackPanel>
|
||||
|
||||
</DockPanel>
|
||||
</ScrollViewer>
|
||||
|
||||
<!-- Right panel -->
|
||||
<Grid Grid.Column="1" Grid.Row="0" Margin="0,8,8,0">
|
||||
@@ -258,37 +274,40 @@
|
||||
|
||||
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,8">
|
||||
<Border Background="#EBF5FB" BorderBrush="#2980B9" BorderThickness="1"
|
||||
CornerRadius="4" Padding="12,6" Margin="0,0,8,0">
|
||||
CornerRadius="4" Padding="12,6" Margin="0,0,8,0"
|
||||
TextElement.Foreground="{DynamicResource OnColoredBgBrush}">
|
||||
<StackPanel HorizontalAlignment="Center">
|
||||
<TextBlock Text="{Binding TotalAccessCount}" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" />
|
||||
<TextBlock Text="{Binding TotalAccessCount}" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Foreground="#1F2430" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.summary.total]}"
|
||||
FontSize="10" Foreground="Gray" HorizontalAlignment="Center" />
|
||||
FontSize="10" Foreground="#5B6472" HorizontalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
<Border Background="#EAFAF1" BorderBrush="#27AE60" BorderThickness="1"
|
||||
CornerRadius="4" Padding="12,6" Margin="0,0,8,0">
|
||||
CornerRadius="4" Padding="12,6" Margin="0,0,8,0"
|
||||
TextElement.Foreground="{DynamicResource OnColoredBgBrush}">
|
||||
<StackPanel HorizontalAlignment="Center">
|
||||
<TextBlock Text="{Binding SitesCount}" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" />
|
||||
<TextBlock Text="{Binding SitesCount}" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" Foreground="#1F2430" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.summary.sites]}"
|
||||
FontSize="10" Foreground="Gray" HorizontalAlignment="Center" />
|
||||
FontSize="10" Foreground="#5B6472" HorizontalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
<Border Background="#FDEDEC" BorderBrush="#E74C3C" BorderThickness="1"
|
||||
CornerRadius="4" Padding="12,6">
|
||||
CornerRadius="4" Padding="12,6"
|
||||
TextElement.Foreground="{DynamicResource OnColoredBgBrush}">
|
||||
<StackPanel HorizontalAlignment="Center">
|
||||
<TextBlock Text="{Binding HighPrivilegeCount}" FontSize="20" FontWeight="Bold"
|
||||
HorizontalAlignment="Center" Foreground="#C0392B" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.summary.highPriv]}"
|
||||
FontSize="10" Foreground="Gray" HorizontalAlignment="Center" />
|
||||
FontSize="10" Foreground="#5B6472" HorizontalAlignment="Center" />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,0,0,4">
|
||||
<TextBox Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}" Width="200" Margin="0,0,8,0" />
|
||||
<ToggleButton IsChecked="{Binding IsGroupByUser}" Padding="8,3">
|
||||
<ToggleButton IsChecked="{Binding IsGroupByUser}">
|
||||
<ToggleButton.Style>
|
||||
<Style TargetType="ToggleButton">
|
||||
<Style TargetType="ToggleButton" BasedOn="{StaticResource ThemeToggleButtonStyle}">
|
||||
<Setter Property="Content" Value="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[audit.toggle.bySite]}" />
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
@@ -308,12 +327,15 @@
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding AccessType}" Value="Direct">
|
||||
<Setter Property="Background" Value="#EBF5FB" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding AccessType}" Value="Group">
|
||||
<Setter Property="Background" Value="#EAFAF1" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding AccessType}" Value="Inherited">
|
||||
<Setter Property="Background" Value="#F4F6F6" />
|
||||
<Setter Property="Foreground" Value="#1F2430" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding IsHighPrivilege}" Value="True">
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
@@ -327,14 +349,14 @@
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal" Margin="4,2">
|
||||
<TextBlock Text="{Binding Name}" FontWeight="Bold" Margin="0,0,8,0" />
|
||||
<TextBlock Text="{Binding ItemCount, StringFormat=({0})}" Foreground="Gray" />
|
||||
<TextBlock Text="{Binding ItemCount, StringFormat=({0})}" Foreground="{DynamicResource TextMutedBrush}" />
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</GroupStyle.HeaderTemplate>
|
||||
</GroupStyle>
|
||||
</DataGrid.GroupStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTemplateColumn Header="User" Width="180">
|
||||
<DataGridTemplateColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.user]}" Width="180">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
@@ -351,20 +373,24 @@
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Border.Style>
|
||||
<TextBlock Text="Guest" FontSize="10" Foreground="White" FontWeight="SemiBold" />
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[common.guest]}"
|
||||
FontSize="10" Foreground="White" FontWeight="SemiBold" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTextColumn Header="Site" Binding="{Binding SiteTitle}" Width="120" />
|
||||
<DataGridTextColumn Header="Object" Binding="{Binding ObjectTitle}" Width="140" />
|
||||
<DataGridTextColumn Header="Object Type" Binding="{Binding ObjectType}" Width="90" />
|
||||
<DataGridTemplateColumn Header="Permission Level" Width="140">
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.site]}"
|
||||
Binding="{Binding SiteTitle}" Width="120" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.object]}"
|
||||
Binding="{Binding ObjectTitle}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.object_type]}"
|
||||
Binding="{Binding ObjectType}" Width="90" />
|
||||
<DataGridTemplateColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.permission_level]}" Width="140">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="⚠" Foreground="#E74C3C" Margin="0,0,4,0"
|
||||
<TextBlock Text="⚠" Foreground="{DynamicResource DangerBrush}" Margin="0,0,4,0"
|
||||
FontSize="12" VerticalAlignment="Center">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
@@ -382,7 +408,7 @@
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTemplateColumn Header="Access Type" Width="110">
|
||||
<DataGridTemplateColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.access_type]}" Width="110">
|
||||
<DataGridTemplateColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock>
|
||||
@@ -406,7 +432,8 @@
|
||||
</DataTemplate>
|
||||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
<DataGridTextColumn Header="Granted Through" Binding="{Binding GrantedThrough}" Width="140" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[report.col.granted_through]}"
|
||||
Binding="{Binding GrantedThrough}" Width="140" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
|
||||
@@ -415,7 +442,8 @@
|
||||
<!-- Status bar -->
|
||||
<StatusBar Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1">
|
||||
<StatusBarItem>
|
||||
<ProgressBar Width="150" Height="14" Value="{Binding ProgressValue}" Minimum="0" Maximum="100" />
|
||||
<common:Spinner Width="14" Height="14"
|
||||
Visibility="{Binding IsRunning, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||
</StatusBarItem>
|
||||
<StatusBarItem Content="{Binding StatusMessage}" />
|
||||
</StatusBar>
|
||||
|
||||
Reference in New Issue
Block a user