using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Platform.Storage; using LehrerApp.Desktop.ViewModels; using LehrerApp.Desktop.ViewModels.Settings; using LehrerApp.Desktop.Views.Shared; using Microsoft.Extensions.DependencyInjection; namespace LehrerApp.Desktop.Views.Settings; public partial class SettingsView : UserControl { public SettingsView() => InitializeComponent(); protected override void OnDataContextChanged(EventArgs e) { base.OnDataContextChanged(e); if (DataContext is SettingsViewModel vm) { vm.OnConfirmRestore = ShowRestoreConfirmDialog; vm.OnAppLockChanged = () => App.Services.GetRequiredService().ApplyConfig(); vm.OnConfirmHardDelete = ShowHardDeleteConfirmDialog; } } private async Task ShowRestoreConfirmDialog(BackupListItem item) { var info = new ConfirmDialogInfo { Title = "Backup wiederherstellen?", Message = $"Die aktuelle Datenbank wird durch das Backup vom {item.Display} ersetzt. " + "Die App wird danach automatisch neu gestartet.", ConfirmText = "Wiederherstellen", }; var dialog = new ConfirmDialog { DataContext = info }; var owner = TopLevel.GetTopLevel(this) as Window; return owner is not null && await dialog.ShowDialog(owner); } private async Task ShowHardDeleteConfirmDialog(ExpiredDocumentItem item) { var info = new ConfirmDialogInfo { Title = "Eintrag endgültig löschen?", Message = $"\"{item.Title}\" ({item.StudentName}) wird unwiderruflich gelöscht, nicht nur ausgeblendet.", ConfirmText = "Endgültig löschen", }; var dialog = new ConfirmDialog { DataContext = info }; var owner = TopLevel.GetTopLevel(this) as Window; return owner is not null && await dialog.ShowDialog(owner); } private async void OnImportClick(object? sender, RoutedEventArgs e) { var topLevel = TopLevel.GetTopLevel(this); if (topLevel is null || DataContext is not SettingsViewModel vm) return; var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { Title = "Kompetenzkatalog importieren", AllowMultiple = false, FileTypeFilter = [new FilePickerFileType("JSON-Dateien") { Patterns = ["*.json"] }], }); if (files.Count == 0) return; var json = await File.ReadAllTextAsync(files[0].Path.LocalPath); vm.ImportCatalog(json); } private async void OnExportClick(object? sender, RoutedEventArgs e) { var topLevel = TopLevel.GetTopLevel(this); if (topLevel is null || DataContext is not SettingsViewModel vm) return; var file = await topLevel.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions { Title = "Kompetenzkatalog exportieren", SuggestedFileName = $"Kompetenzkatalog_{vm.CatalogSubject?.Name}_{vm.CatalogGradeLevel}.json", FileTypeChoices = [new FilePickerFileType("JSON-Dateien") { Patterns = ["*.json"] }], }); if (file is null) return; var json = vm.ExportCatalog(); await File.WriteAllTextAsync(file.Path.LocalPath, json); } private async void OnEditGradingKeyTemplateClick(object? sender, RoutedEventArgs e) { if (sender is not Button { Tag: GradingKeyTemplateEditItem item }) return; var dialog = new GradingKeyTemplateDialog { DataContext = item }; var owner = TopLevel.GetTopLevel(this) as Window; if (owner is not null) await dialog.ShowDialog(owner); } }