diff --git a/.idea/.idea.PSCHelpdesk/.idea/avalonia.xml b/.idea/.idea.PSCHelpdesk/.idea/avalonia.xml
index e15ef08..fdb6bad 100644
--- a/.idea/.idea.PSCHelpdesk/.idea/avalonia.xml
+++ b/.idea/.idea.PSCHelpdesk/.idea/avalonia.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
index a5e55b8..2d0e715 100644
--- a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
+++ b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
@@ -11,29 +11,21 @@
-
+
-
-
-
+
-
-
+
+
-
-
+
-
-
-
-
-
-
-
+
+
@@ -47,13 +39,21 @@
+
+
-
+
+
-
+
+
+
+
+
+
@@ -82,7 +82,7 @@
- file://$PROJECT_DIR$/HetznerServer/ViewModels/ServerViewModel.cs
- 77
-
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
+ 91
+
-
+
-
+
-
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
+ 80
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/HetznerServer/ViewModels/ServerViewModel.cs
+ 82
+
+
+
+
+
+
+
+
+
diff --git a/HetznerServer/DataTemplate/ServerView.axaml b/HetznerServer/DataTemplate/ServerView.axaml
new file mode 100644
index 0000000..e29dceb
--- /dev/null
+++ b/HetznerServer/DataTemplate/ServerView.axaml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/HetznerServer/DataTemplate/ServerView.axaml.cs b/HetznerServer/DataTemplate/ServerView.axaml.cs
new file mode 100644
index 0000000..de522b4
--- /dev/null
+++ b/HetznerServer/DataTemplate/ServerView.axaml.cs
@@ -0,0 +1,9 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+
+namespace PSCHelpdesk.Plugins.HetznerServer.DataTemplate;
+
+public class ServerView : TemplatedControl
+{
+}
\ No newline at end of file
diff --git a/HetznerServer/HetznerServer.cs b/HetznerServer/HetznerServer.cs
index 7b07e20..1c106a4 100644
--- a/HetznerServer/HetznerServer.cs
+++ b/HetznerServer/HetznerServer.cs
@@ -37,9 +37,9 @@ public class HetznerServer : Contract
settingsService.AddSetting(hetznerSettings);
}
- public List LoadViews()
+ public List LoadViews()
{
- return [new ServerView(), new HetznerSettingsView()];
+ return [typeof(ServerView), typeof(HetznerSettingsView)];
}
}
\ No newline at end of file
diff --git a/HetznerServer/ViewModels/ServerViewModel.cs b/HetznerServer/ViewModels/ServerViewModel.cs
index 56b71b0..f9c2584 100644
--- a/HetznerServer/ViewModels/ServerViewModel.cs
+++ b/HetznerServer/ViewModels/ServerViewModel.cs
@@ -1,5 +1,6 @@
using System.Collections.ObjectModel;
using System.Diagnostics;
+using System.Reactive;
using Avalonia.Controls;
using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
@@ -9,14 +10,20 @@ using PSCHelpdesk.Plugins.HetznerServer.Views;
using PSCHelpdesk.Shared.Service;
using PSCHelpdesk.Shared.Setting;
using PSCHelpdesk.Shared.ViewModels;
+using ReactiveUI;
namespace PSCHelpdesk.Plugins.HetznerServer.ViewModels;
public partial class ServerViewModel : ViewModelBase, IViewModelBase
{
+ public ReactiveCommand OpenSSH { get; }
+ public ReactiveCommand SelectionChanged { get; }
+
private SettingsManager _settingsManager;
public ServerViewModel()
{
+ OpenSSH = ReactiveCommand.Create(openSSH);
+ SelectionChanged = ReactiveCommand.Create(selectionChanged);
Server = new ObservableCollection();
SelectedServer = new Server(1,"","","","","");
_settingsManager = (SettingsManager)Ioc.Default.GetService();
@@ -24,7 +31,7 @@ public partial class ServerViewModel : ViewModelBase, IViewModelBase
}
- private bool _isPagePaneOpen = false;
+ private bool _isPagePaneOpen = true;
public bool IsPagePaneOpen
{
get => _isPagePaneOpen;
@@ -49,37 +56,34 @@ public partial class ServerViewModel : ViewModelBase, IViewModelBase
{
var settings = new Settings();
_settingsManager.LoadPluginSettings("HetznerSettings", settings);
- HetznerCloudClient hetznerCloudClient = new HetznerCloudClient(settings.HetznerApiKey);
-
- List list = await hetznerCloudClient.Server.Get();
- foreach (var server in list)
+ if (settings.HetznerApiKey != "")
{
- Server.Add(new Server(server.Id, server.Name, server.ServerType.Name, server.Status, server.PublicNet.Ipv4.Ip, server.PublicNet.Ipv6.Ip));
+ HetznerCloudClient hetznerCloudClient = new HetznerCloudClient(settings.HetznerApiKey);
+
+ List list = await hetznerCloudClient.Server.Get();
+ foreach (var server in list)
+ {
+ Server.Add(new Server(server.Id, server.Name, server.ServerType.Name, server.Status,
+ server.PublicNet.Ipv4.Ip, server.PublicNet.Ipv6.Ip));
+ }
+
+ SelectedServer = Server[0];
}
-
- SelectedServer = Server[0];
}
- [RelayCommand]
- public void ShowServerDetails(Server server)
+
+
+ void openSSH(Server server)
{
-
+ //Process.Start(_settingsManager.CoreSettings.SSHClientExecutable,string.Format(_settingsManager.CoreSettings.SSHClientExecutableArgs, server.Ipv4));
}
- [RelayCommand]
- public void OpenSCP(Server server)
- {
-
- }
-
- [RelayCommand]
- public void OpenSSH(Server server)
+ public void RunTheThing(Server server)
{
Process.Start(_settingsManager.CoreSettings.SSHClientExecutable,string.Format(_settingsManager.CoreSettings.SSHClientExecutableArgs, server.Ipv4));
}
- [RelayCommand]
- public void SelectionChanged(SelectionChangedEventArgs args)
+ void selectionChanged(SelectionChangedEventArgs args)
{
this.SelectedServer = (args.Source as DataGrid).SelectedItem as Server;
IsPagePaneOpen = true;
diff --git a/HetznerServer/Views/ServerView.axaml b/HetznerServer/Views/ServerView.axaml
index 0bbb8f3..68164d8 100644
--- a/HetznerServer/Views/ServerView.axaml
+++ b/HetznerServer/Views/ServerView.axaml
@@ -5,21 +5,22 @@
xmlns:vm="clr-namespace:PSCHelpdesk.Plugins.HetznerServer.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="PSCHelpdesk.Plugins.HetznerServer.Views.ServerView"
- x:DataType="vm:ServerViewModel">
+ x:DataType="vm:ServerViewModel"
+ Name="Servers">
-
+ x:Name="ServerTable">
-
+
@@ -36,7 +37,7 @@
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
Background="#232323"
- Command="{Binding #ServerTable.((vm:ServerViewModel)DataContext).ShowServerDetails}"
+ Command="{Binding ShowServerDetails}"
CommandParameter="{Binding .}"
Content="View"
Foreground="White" />
@@ -50,7 +51,7 @@
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
Background="#232323"
- Command="{Binding #ServerTable.((vm:ServerViewModel)DataContext).OpenSSH}"
+ Command="{Binding Path=$parent[DataGrid].((vm:ServerViewModel)DataContext).OpenSSH}"
CommandParameter="{Binding .}"
Content="Open SSH"
Foreground="White" />
@@ -64,7 +65,7 @@
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
Background="#232323"
- Command="{Binding #ServerTable.((vm:ServerViewModel)DataContext).OpenSCP}"
+ Command="{Binding #ServerTable.((vm:ServerViewModel)DataContext).OpenSSH}"
CommandParameter="{Binding .}"
Content="Open SCP"
Foreground="White" />
diff --git a/HetznerServer/Views/ServerView.axaml.cs b/HetznerServer/Views/ServerView.axaml.cs
index fce348b..2a6a999 100644
--- a/HetznerServer/Views/ServerView.axaml.cs
+++ b/HetznerServer/Views/ServerView.axaml.cs
@@ -1,4 +1,5 @@
using Avalonia.Controls;
+using PSCHelpdesk.Plugins.HetznerServer.ViewModels;
namespace PSCHelpdesk.Plugins.HetznerServer.Views;
@@ -7,5 +8,7 @@ public partial class ServerView : UserControl
public ServerView()
{
InitializeComponent();
+
+ this.DataContext = new ServerViewModel();
}
}
\ No newline at end of file
diff --git a/PSCHelpdesk.sln.DotSettings.user b/PSCHelpdesk.sln.DotSettings.user
index 06a4058..e9046f7 100644
--- a/PSCHelpdesk.sln.DotSettings.user
+++ b/PSCHelpdesk.sln.DotSettings.user
@@ -5,6 +5,7 @@
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
@@ -33,6 +34,7 @@
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
diff --git a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
index 5e27e9e..8b26672 100644
--- a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
+++ b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
@@ -49,6 +49,6 @@
-
+
diff --git a/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs b/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
index e380428..1808dcc 100644
--- a/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
@@ -1,3 +1,4 @@
+using System;
using System.Linq;
using Avalonia.Controls;
using CommunityToolkit.Mvvm.DependencyInjection;
@@ -19,7 +20,7 @@ public class PluginService
private List toLoadPlugins = new List();
private Dictionary loadedPlugins = new Dictionary();
private Dictionary foundPlugins = new Dictionary();
- private Dictionary controls = new Dictionary();
+ private Dictionary controls = new Dictionary();
public PluginService()
{
@@ -94,7 +95,7 @@ public class PluginService
var items = plugin.LoadViews();
foreach (var item in items)
{
- this.controls.Add(item.GetType().FullName, item);
+ this.controls.Add(item.FullName, item);
}
appService.AppIsStarted();
@@ -104,7 +105,7 @@ public class PluginService
public UserControl GetView(string viewName)
{
- return this.controls[viewName];
+ return (UserControl)Activator.CreateInstance(this.controls[viewName]);
}
public bool ViewExists(string viewName)
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs b/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
index d365e1b..199de2b 100644
--- a/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
+++ b/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
@@ -27,7 +27,8 @@ public class ViewLocator : IDataTemplate
if (_pluginService.ViewExists(name))
{
- return _pluginService.GetView(name);
+ var v = _pluginService.GetView(name);
+ return v;
}
if (type != null)
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
index 5b4ee70..ae81087 100644
--- a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
+using Avalonia.Controls;
using CommunityToolkit.Mvvm.DependencyInjection;
using PSCHelpdesk.Services;
using PSCHelpdesk.Shared.Menu;
@@ -11,38 +13,34 @@ using ReactiveUI;
namespace PSCHelpdesk.ViewModels;
-public class MainWindowViewModel : ViewModelBase
+public class MainWindowViewModel : ViewModelBase, IViewModelBase
{
- private MenuService _menuService;
+ private MenuService MenuService;
public ReactiveCommand ClickMenu { get; }
- public MenuService MenuService
+ private ObservableCollection _tabItems;
+
+ public ObservableCollection TabItems
{
- get => this._menuService;
- private set => SetAndRaisePropertyChanged(ref this._menuService, value);
+ get => _tabItems;
+ set => SetAndRaisePropertyChanged(ref _tabItems, value);
}
- private object _contentDisplay;
-
- private Item _selectedItem;
- public Item SelectedItem
+ private List- _menuItems;
+ public List
- MenuItems
{
- get => _selectedItem;
- set => SetAndRaisePropertyChanged(ref _selectedItem, value);
+ get => _menuItems;
+ set => SetAndRaisePropertyChanged(ref _menuItems, value);
}
- public object ContentDisplay
- {
- get => _contentDisplay;
- set => SetAndRaisePropertyChanged(ref _contentDisplay, value);
- }
public MainWindowViewModel()
{
- ClickMenu = ReactiveCommand.Create(SelectMenu);
- this.MenuItems = new List
- ();
Startup.RegisterServices();
- this.MenuService = (MenuService)Ioc.Default.GetService(typeof(IMenuService));
- this.MenuService.MenuChanged += delegate(object? sender, EventArgs args)
+ ClickMenu = ReactiveCommand.Create(SelectMenu);
+ TabItems = new ObservableCollection();
+ this.MenuItems = new List
- ();
+ MenuService = (MenuService)Ioc.Default.GetService(typeof(IMenuService));
+ MenuService.MenuChanged += delegate(object? sender, EventArgs args)
{
foreach (var menuServiceMenuItem in MenuService.MenuItems)
{
@@ -66,40 +64,26 @@ public class MainWindowViewModel : ViewModelBase
this.InitializeClient();
- this.SelectedItem = MenuService.MenuItems.Last();
- this.ContentDisplay = this.SelectedItem.CommandParameter;
-
+ TabItems.Add(new TabItemViewModel("test", new TestViewModel()));
+
}
- private List
- _menuItems;
- public List
- MenuItems
- {
- get => _menuItems;
- set => SetAndRaisePropertyChanged(ref _menuItems, value);
- }
-
-
private void InitializeClient()
{
this.MenuService.CreateMenu();
}
- public object SelectedContent
- {
- get
- {
- return this.SelectedItem?.CommandParameter;
- }
- }
-
public void SelectMenu(string parameter)
{
//this.SelectedItem = parameter;
var obj = this.MenuService.MenuItems.FirstOrDefault(menuItem => menuItem.Header == parameter.ToString(), null);
if (obj != null)
{
- this.SelectedItem = obj;
- this.ContentDisplay = obj.CommandParameter;
+ TabItems.Add(new TabItemViewModel(obj.Header, obj.CommandParameter));
+ //SetAndRaisePropertyChanged(ref _tabItems, TabItems);
+ //this.SelectedItem = obj;
+ //this.ContentDisplay = obj.CommandParameter;
}
}
+
}
\ No newline at end of file
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/TabItemViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/TabItemViewModel.cs
new file mode 100644
index 0000000..8db22d8
--- /dev/null
+++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/TabItemViewModel.cs
@@ -0,0 +1,14 @@
+using Avalonia.Controls;
+
+namespace PSCHelpdesk.ViewModels;
+
+public class TabItemViewModel
+{
+ public string Header { get; }
+ public object Content { get; }
+ public TabItemViewModel(string header, object content)
+ {
+ Header = header;
+ Content = content;
+ }
+}
\ No newline at end of file
diff --git a/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
index 2c0fdb3..7030689 100644
--- a/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
@@ -1,4 +1,5 @@
using Avalonia;
+using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using PSCHelpdesk.Shared.Menu;
diff --git a/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml b/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml
index 4feb929..54c2911 100644
--- a/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml
+++ b/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml
@@ -11,28 +11,40 @@
x:DataType="vm:MainWindowViewModel"
Title="PSCHelpdesk"
x:Name="MainWindowView">
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml.cs
index 917ed23..852e4e2 100644
--- a/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Views/MainWindow.axaml.cs
@@ -27,5 +27,4 @@ public partial class MainWindow : Window
};
settings.Show();
}
-
}
\ No newline at end of file
diff --git a/Shared/Plugin/Contract.cs b/Shared/Plugin/Contract.cs
index 02aeb20..39801dd 100644
--- a/Shared/Plugin/Contract.cs
+++ b/Shared/Plugin/Contract.cs
@@ -10,6 +10,6 @@ public interface Contract
void Configure();
- List LoadViews();
+ List LoadViews();
}
\ No newline at end of file