Filter serverlist

This commit is contained in:
eelke 2025-10-26 19:03:07 +01:00
parent 4b8a346cfb
commit 954a7eaefe
2 changed files with 62 additions and 24 deletions

View file

@ -1,6 +1,7 @@
using System.Collections.ObjectModel;
using ReactiveUI;
using System.Reactive;
using System.Reactive.Linq;
using Avalonia.Media;
using pgLabII.Views;
using ReactiveUI.SourceGenerators;
@ -9,9 +10,7 @@ namespace pgLabII.ViewModels;
public partial class ServerListViewModel : ViewModelBase
{
[Reactive] public partial ServerConfigurationViewModel? SelectedServerConfiguration { get; set; }
public ObservableCollection<ServerConfigurationViewModel> ServerConfigurations { get; } =
private readonly ObservableCollection<ServerConfigurationViewModel> _allServers =
[
new (new()
{
@ -34,6 +33,15 @@ public partial class ServerListViewModel : ViewModelBase
}),
];
[Reactive] private string _filterText = "";
[ObservableAsProperty]
private ObservableCollection<ServerConfigurationViewModel> _serverConfigurations;
[Reactive] public partial ServerConfigurationViewModel? SelectedServerConfiguration { get; set; }
//public ObservableCollection<ServerConfigurationViewModel> ServerConfigurations { get; }
public ReactiveCommand<ServerConfigurationViewModel?, Unit> ExploreServerCommand { get; }
public ReactiveCommand<ServerConfigurationViewModel?, Unit> EditServerCommand { get; }
public ReactiveCommand<ServerConfigurationViewModel?, Unit> RemoveServerCommand { get; }
@ -52,14 +60,18 @@ public partial class ServerListViewModel : ViewModelBase
return Unit.Default;
});
EditServerCommand = ReactiveCommand.Create<ServerConfigurationViewModel?, Unit>((sc) =>
EditServerCommand = ReactiveCommand.CreateFromTask<ServerConfigurationViewModel?, Unit>(async (sc) =>
{
var conf = sc ?? SelectedServerConfiguration;
if (conf is null)
return Unit.Default;
EditServerConfigurationWindow window = new(new(conf));
window.Show();
bool result = await window.ShowDialog<bool>( );
if (result)
{
}
return Unit.Default;
});
@ -78,5 +90,27 @@ public partial class ServerListViewModel : ViewModelBase
EditServerConfigurationWindow window = new(new());
window.Show();
});
_serverConfigurationsHelper = this.WhenAnyValue(x => x.FilterText)
.Throttle(TimeSpan.FromMilliseconds(200))
.Select(FilterServers)
.ToProperty(this, x => x.ServerConfigurations);
}
private ObservableCollection<ServerConfigurationViewModel> FilterServers(string? filterText)
{
if (string.IsNullOrWhiteSpace(filterText))
{
return new ObservableCollection<ServerConfigurationViewModel>(_allServers);
}
var filtered = _allServers.Where(s =>
s.Name?.Contains(filterText, StringComparison.OrdinalIgnoreCase) is true ||
s.Host?.Contains(filterText, StringComparison.OrdinalIgnoreCase) is true ||
s.InitialDatabase?.Contains(filterText, StringComparison.OrdinalIgnoreCase) is true ||
s.UserName?.Contains(filterText, StringComparison.OrdinalIgnoreCase) is true
).ToList();
return new ObservableCollection<ServerConfigurationViewModel>(filtered);
}
}

View file

@ -26,6 +26,10 @@
Command="{Binding ExploreServerCommand}"/>
</StackPanel>
<TextBox Watermark="Filter servers..."
Text="{Binding FilterText, Mode=TwoWay}"
Margin="0,5"/>
<DataGrid ItemsSource="{Binding ServerConfigurations}"
SelectedItem="{Binding SelectedServerConfiguration, Mode=TwoWay}"
HorizontalAlignment="Stretch"