feat(04-09): create BulkMembers, BulkSites, and FolderStructure ViewModels and Views
- BulkMembersViewModel: CSV import, validate, preview, confirm, execute, retry failed, export failed - BulkSitesViewModel: same flow using IBulkSiteService.CreateSitesAsync - FolderStructureViewModel: site URL + library inputs, CSV folders, FolderStructureService.BuildUniquePaths - BulkMembersView/BulkSitesView/FolderStructureView: XAML + code-behind wiring ConfirmBulkOperationDialog - [Rule 3] Fixed duplicate converter definitions: removed untracked standalone EnumBoolConverter/StringToVisibilityConverter/ListToStringConverter files (already defined in IndentConverter.cs)
This commit is contained in:
50
SharepointToolbox/Views/Tabs/BulkMembersView.xaml
Normal file
50
SharepointToolbox/Views/Tabs/BulkMembersView.xaml
Normal file
@@ -0,0 +1,50 @@
|
||||
<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">
|
||||
<DockPanel Margin="10">
|
||||
<!-- Options Panel (Left) -->
|
||||
<StackPanel DockPanel.Dock="Left" Width="240" Margin="0,0,10,0">
|
||||
<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]}"
|
||||
Command="{Binding LoadExampleCommand}" Margin="0,0,0,10" />
|
||||
|
||||
<TextBlock Text="{Binding PreviewSummary}" TextWrapping="Wrap" Margin="0,0,0,10" />
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulkmembers.execute]}"
|
||||
Command="{Binding RunCommand}" Margin="0,0,0,5"
|
||||
IsEnabled="{Binding IsRunning, Converter={StaticResource InverseBoolConverter}}" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[status.cancelled]}"
|
||||
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}}" />
|
||||
<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.retryfailed]}"
|
||||
Command="{Binding RetryFailedCommand}" Margin="0,0,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulk.exportfailed]}"
|
||||
Command="{Binding ExportFailedCommand}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Preview DataGrid (Right) -->
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
IsReadOnly="True" CanUserSortColumns="True">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="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"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
</UserControl>
|
||||
21
SharepointToolbox/Views/Tabs/BulkMembersView.xaml.cs
Normal file
21
SharepointToolbox/Views/Tabs/BulkMembersView.xaml.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System.Windows.Controls;
|
||||
using SharepointToolbox.Views.Dialogs;
|
||||
|
||||
namespace SharepointToolbox.Views.Tabs;
|
||||
|
||||
public partial class BulkMembersView : UserControl
|
||||
{
|
||||
public BulkMembersView(ViewModels.Tabs.BulkMembersViewModel viewModel)
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = viewModel;
|
||||
|
||||
viewModel.ShowConfirmDialog = message =>
|
||||
{
|
||||
var dlg = new ConfirmBulkOperationDialog(message)
|
||||
{ Owner = System.Windows.Window.GetWindow(this) };
|
||||
dlg.ShowDialog();
|
||||
return dlg.IsConfirmed;
|
||||
};
|
||||
}
|
||||
}
|
||||
50
SharepointToolbox/Views/Tabs/BulkSitesView.xaml
Normal file
50
SharepointToolbox/Views/Tabs/BulkSitesView.xaml
Normal file
@@ -0,0 +1,50 @@
|
||||
<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">
|
||||
<DockPanel Margin="10">
|
||||
<StackPanel DockPanel.Dock="Left" Width="240" Margin="0,0,10,0">
|
||||
<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]}"
|
||||
Command="{Binding LoadExampleCommand}" Margin="0,0,0,10" />
|
||||
|
||||
<TextBlock Text="{Binding PreviewSummary}" TextWrapping="Wrap" Margin="0,0,0,10" />
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.execute]}"
|
||||
Command="{Binding RunCommand}" Margin="0,0,0,5"
|
||||
IsEnabled="{Binding IsRunning, Converter={StaticResource InverseBoolConverter}}" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[status.cancelled]}"
|
||||
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}}" />
|
||||
<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.retryfailed]}"
|
||||
Command="{Binding RetryFailedCommand}" Margin="0,0,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulk.exportfailed]}"
|
||||
Command="{Binding ExportFailedCommand}" />
|
||||
</StackPanel>
|
||||
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
IsReadOnly="True" CanUserSortColumns="True">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="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]}"
|
||||
Binding="{Binding Record.Alias}" Width="100" />
|
||||
<DataGridTextColumn Header="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[bulksites.type]}"
|
||||
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"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
</UserControl>
|
||||
21
SharepointToolbox/Views/Tabs/BulkSitesView.xaml.cs
Normal file
21
SharepointToolbox/Views/Tabs/BulkSitesView.xaml.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System.Windows.Controls;
|
||||
using SharepointToolbox.Views.Dialogs;
|
||||
|
||||
namespace SharepointToolbox.Views.Tabs;
|
||||
|
||||
public partial class BulkSitesView : UserControl
|
||||
{
|
||||
public BulkSitesView(ViewModels.Tabs.BulkSitesViewModel viewModel)
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = viewModel;
|
||||
|
||||
viewModel.ShowConfirmDialog = message =>
|
||||
{
|
||||
var dlg = new ConfirmBulkOperationDialog(message)
|
||||
{ Owner = System.Windows.Window.GetWindow(this) };
|
||||
dlg.ShowDialog();
|
||||
return dlg.IsConfirmed;
|
||||
};
|
||||
}
|
||||
}
|
||||
53
SharepointToolbox/Views/Tabs/FolderStructureView.xaml
Normal file
53
SharepointToolbox/Views/Tabs/FolderStructureView.xaml
Normal file
@@ -0,0 +1,53 @@
|
||||
<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">
|
||||
<DockPanel Margin="10">
|
||||
<StackPanel DockPanel.Dock="Left" Width="280" Margin="0,0,10,0">
|
||||
<!-- Site URL and Library inputs -->
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.siteurl]}"
|
||||
Margin="0,0,0,3" />
|
||||
<TextBox Text="{Binding SiteUrl, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,10" />
|
||||
|
||||
<TextBlock Text="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.library]}"
|
||||
Margin="0,0,0,3" />
|
||||
<TextBox Text="{Binding LibraryTitle, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,10" />
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.import]}"
|
||||
Command="{Binding ImportCsvCommand}" Margin="0,0,0,5" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.example]}"
|
||||
Command="{Binding LoadExampleCommand}" Margin="0,0,0,10" />
|
||||
|
||||
<TextBlock Text="{Binding PreviewSummary}" TextWrapping="Wrap" Margin="0,0,0,10" />
|
||||
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[folderstruct.execute]}"
|
||||
Command="{Binding RunCommand}" Margin="0,0,0,5"
|
||||
IsEnabled="{Binding IsRunning, Converter={StaticResource InverseBoolConverter}}" />
|
||||
<Button Content="{Binding Source={x:Static loc:TranslationSource.Instance}, Path=[status.cancelled]}"
|
||||
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}}" />
|
||||
<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>
|
||||
|
||||
<DataGrid ItemsSource="{Binding PreviewRows}" AutoGenerateColumns="False"
|
||||
IsReadOnly="True" CanUserSortColumns="True">
|
||||
<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"
|
||||
Binding="{Binding Errors, Converter={StaticResource ListToStringConverter}}"
|
||||
Width="*" />
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>
|
||||
</DockPanel>
|
||||
</UserControl>
|
||||
21
SharepointToolbox/Views/Tabs/FolderStructureView.xaml.cs
Normal file
21
SharepointToolbox/Views/Tabs/FolderStructureView.xaml.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System.Windows.Controls;
|
||||
using SharepointToolbox.Views.Dialogs;
|
||||
|
||||
namespace SharepointToolbox.Views.Tabs;
|
||||
|
||||
public partial class FolderStructureView : UserControl
|
||||
{
|
||||
public FolderStructureView(ViewModels.Tabs.FolderStructureViewModel viewModel)
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = viewModel;
|
||||
|
||||
viewModel.ShowConfirmDialog = message =>
|
||||
{
|
||||
var dlg = new ConfirmBulkOperationDialog(message)
|
||||
{ Owner = System.Windows.Window.GetWindow(this) };
|
||||
dlg.ShowDialog();
|
||||
return dlg.IsConfirmed;
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user