Generic Business Logic + Oberfläche

This commit is contained in:
2026-05-12 11:47:04 +02:00
parent bd960f1c6c
commit fe3588f1ba
31 changed files with 675 additions and 333 deletions

View File

@@ -6,6 +6,7 @@ using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.Extensions.CustomInterfaces;
using DevExpress.Mvvm;
using DevExpress.Utils.Extensions;
using DevExpress.Xpf.Layout.Core;
using System;
using System.Collections.Generic;
@@ -15,6 +16,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using static DevExpress.Utils.Drawing.Helpers.NativeMethods;
namespace BeWo.ViewModel.View.Administration
{
@@ -50,14 +52,24 @@ namespace BeWo.ViewModel.View.Administration
public DelegateCommand DeleteRoutineCommand { get; private set; }
public DelegateCommand ChangeFavoritenStateRoutineCommand { get; private set; }
public bool CanEditPromptbausteine { get; set; }
public AiPromptbausteinFolderVM SelectedFolder
{
get => _SelectedFolder;
set => SetProperty(ref _SelectedFolder, value, nameof(SelectedFolder));
set
{
SetProperty(ref _SelectedFolder, value, nameof(SelectedFolder));
if (SelectedItem is AiPromptbausteinPromptVM vm)
{
vm.IsSelected = false;
SelectedItem = null;
}
}
}
public AbstractBaseVM SelectedItem
{
get => _SelectedItem;
@@ -104,11 +116,11 @@ namespace BeWo.ViewModel.View.Administration
{
get
{
return Folders?.ContainsDirtyObject() ?? false;
return false;
}
}
public bool HasCopiedFolder => CopiedFolder is object;
public bool HasCopiedPrompt => CopiedPrompt is object;
public bool HasCopiedPrompt => CopiedPrompt is object;
public CompactEmployeeDC CurrentEmployee => BeWoApp.CompactLoggedOnEmployee;
public void UpdateFolderCommands()
@@ -118,7 +130,7 @@ namespace BeWo.ViewModel.View.Administration
CopyFolderCommand.RaiseCanExecuteChanged();
PasteFolderCommand.RaiseCanExecuteChanged();
DeleteFolderCommand.RaiseCanExecuteChanged();
}
}
public void UpdatePromptCommands()
{
OpenAddPromptDialogCommand.RaiseCanExecuteChanged();
@@ -133,61 +145,6 @@ namespace BeWo.ViewModel.View.Administration
ChangeFavoritenStateRoutineCommand.RaiseCanExecuteChanged();
}
public void SaveVMList()
{
if (!IsDirty)
return;
// DFS -> 1. Sobald Knoten gefunden wird mit IsNew=true: Teilbaum als neu markieren
// 2. Sobald Knoten gefunden wird mit IsNew=false && IsDirty=true: Knoten als update markieren
// 3. Checken, welche Knoten gelöscht wurden
var toadd_folder = new List<AiPromptbausteinFolderVM>();
var toadd_prompts = new List<AiPromptbausteinPromptDC>();
var toupdate_folder = new List<AiPromptbausteinFolderVM>();
var toupdate_prompt = new List<AiPromptbausteinPromptDC>();
DFS_Search_AddUpdate(Folders, ref toadd_folder, ref toadd_prompts, ref toupdate_folder, ref toupdate_prompt);
var todelete_folder = new List<AiPromptbausteinFolderDC>();
var todelete_prompt = new List<AiPromptbausteinPromptDC>();
DFS_Search_Delete(Folders, ref todelete_folder, ref todelete_prompt);
var toadd_folder_dcs = toadd_folder.Select(x => x.CommitToDataContract());
var toupdate_folder_dcs = toupdate_folder.Select(x => x.CommitToDataContract());
var actions = new List<Action<IAiEnhancedService>>();
if (toadd_folder.Any())
actions.Add(x => x.InsertAiPromptbausteinFolder(toadd_folder_dcs.ToList()));
if (toadd_prompts.Any())
actions.Add(x => x.InsertAiPromptbausteinPrompt(toadd_prompts.ToList()));
if (toupdate_folder_dcs.Any())
{
foreach (var folder_dc in toupdate_folder_dcs)
{
folder_dc.SubPrompts = null;
folder_dc.SubFolders = null;
}
actions.Add(x => x.UpdateAiPromptbausteinFolder(toupdate_folder_dcs.ToList()));
}
if (toupdate_prompt.Any())
actions.Add(x => x.UpdateAiPromptbausteinPrompt(toupdate_prompt.ToList()));
if (todelete_folder.Any())
actions.Add(x => x.DeleteAiPromptbausteinFolder(todelete_folder.ToDictionary(x1 => x1.Oid.Value, x2 => x2.Version.Value)));
if (todelete_prompt.Any())
actions.Add(x => x.DeleteAiPromptbausteinPrompt(todelete_prompt.ToDictionary(x1 => x1.Oid.Value, x2 => x2.Version.Value)));
ServiceFacade.DoMultipleAiEnhancedServicesAsync(actions, () =>
{
ReloadVMList();
});
}
internal void ReloadVMList()
{
VMFactory.CreateAiPromptbausteinFolderListVMAsync(
@@ -203,76 +160,6 @@ namespace BeWo.ViewModel.View.Administration
});
}
void DFS_Search_AddUpdate(AiPromptbausteinFolderListVM folders, ref List<AiPromptbausteinFolderVM> toadd_Folder, ref List<AiPromptbausteinPromptDC> toadd_Prompts, ref List<AiPromptbausteinFolderVM> toupdate_Folder, ref List<AiPromptbausteinPromptDC> toupdate_Prompt)
{
foreach (var node in folders.VMList)
{
// Favoriten ignorieren
if (node.DataContract.Oid is long oid && oid < -4)
continue;
// Öffentlich
if (node.DataContract.Oid is long oid2 && oid2 < -1){
DFS_Search_UpdatePromptFavorite(node.SubFolders, ref toadd_Folder, ref toadd_Prompts, ref toupdate_Folder, ref toupdate_Prompt);
if (node.SubPrompts.ChangedCount > 0)
toupdate_Prompt.AddRange(node.SubPrompts.CommitChanged());
continue;
}
// Eigene
if (node.IsNew)
{
toadd_Folder.Add(node);
}
else
{
if (node.IsDirty)
toupdate_Folder.Add(node);
if (node.HasSubFolders)
DFS_Search_AddUpdate(node.SubFolders, ref toadd_Folder, ref toadd_Prompts, ref toupdate_Folder, ref toupdate_Prompt);
if (node.SubPrompts.AddedCount > 0)
toadd_Prompts.AddRange(node.SubPrompts.CommitAdded());
if (node.SubPrompts.ChangedCount > 0)
toupdate_Prompt.AddRange(node.SubPrompts.CommitChanged());
}
}
}
void DFS_Search_UpdatePromptFavorite(AiPromptbausteinFolderListVM folders, ref List<AiPromptbausteinFolderVM> toadd_Folder, ref List<AiPromptbausteinPromptDC> toadd_Prompts, ref List<AiPromptbausteinFolderVM> toupdate_Folder, ref List<AiPromptbausteinPromptDC> toupdate_Prompt)
{
foreach (var node in folders.VMList)
{
if (node.HasSubFolders)
DFS_Search_UpdatePromptFavorite(node.SubFolders, ref toadd_Folder, ref toadd_Prompts, ref toupdate_Folder, ref toupdate_Prompt);
if (node.SubPrompts.ChangedCount > 0)
toupdate_Prompt.AddRange(node.SubPrompts.CommitChanged());
}
}
void DFS_Search_Delete(AiPromptbausteinFolderListVM folders, ref List<AiPromptbausteinFolderDC> todelete_Folder, ref List<AiPromptbausteinPromptDC> todelete_Prompt)
{
foreach (var node_dc in folders.DCBackup)
{
if (node_dc.Oid is long oid && oid < -1)
continue;
if (folders.VMList.FirstOrDefault(vm => vm.DataContract == node_dc) is AiPromptbausteinFolderVM node_vm)
{
if (node_vm.SubFolders.DCBackup is object && node_vm.SubFolders.DCBackup.Count > 0)
DFS_Search_Delete(node_vm.SubFolders, ref todelete_Folder, ref todelete_Prompt);
if (node_vm.SubPrompts.RemovedCount > 0)
todelete_Prompt.AddRange(node_vm.SubPrompts.GetRemoved());
}
else
{
todelete_Folder.Add(node_dc);
}
}
}
void OpenAddFolderDialog()
{
var sel_folder = SelectedFolder;
@@ -290,8 +177,15 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
sel_folder.SubFolders.VMList.Add(new_vm);
sel_folder.IsExpanded = true;
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinFolder(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubFolders.VMList.Add(new_vm);
sel_folder.IsExpanded = true;
});
};
WindowService.Show(vm);
@@ -301,6 +195,8 @@ namespace BeWo.ViewModel.View.Administration
var sel_folder = SelectedFolder;
var sel_dc = sel_folder.CopyToEmptyDataContract();
sel_dc.CanEdit = SelectedFolder.CanEdit;
sel_dc.Oid = sel_folder.DataContract.Oid;
sel_dc.Version = sel_folder.DataContract.Version;
var edit_vm = new AiPromptbausteinFolderVM(sel_dc);
var vm = new AiPromptbausteinFolderViewModel(edit_vm, false);
@@ -308,7 +204,12 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
sel_folder.UpdateByDataContract(edit_dc);
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinFolder(edit_dc),
new_dc =>
{
sel_folder.UpdateByDataContract(new_dc);
});
};
WindowService.Show(vm);
@@ -332,7 +233,9 @@ namespace BeWo.ViewModel.View.Administration
if (result != MessageBoxResult.OK)
return;
parent.SubFolders.VMList.Remove(sel_folder);
var delete_dc = sel_folder.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinFolder(delete_dc),
() => parent.SubFolders.VMList.Remove(sel_folder));
}
bool canOpenAddFolderDialog()
@@ -374,8 +277,15 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedItem = new_vm;
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinPrompt(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedItem = new_vm;
});
};
WindowService.Show(vm);
@@ -389,6 +299,8 @@ namespace BeWo.ViewModel.View.Administration
var sel_dc = sel_prompt.CopyToEmptyDataContract();
sel_dc.CanEdit = sel_prompt.CanEdit;
sel_dc.Oid = sel_prompt.DataContract.Oid;
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinPromptVM(sel_dc);
var vm = new AiPromptbausteinPromptViewModel(edit_vm, false);
@@ -396,9 +308,13 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
sel_prompt.UpdateByDataContract(edit_dc);
UpdateSelectedPromptFavorite(sel_prompt);
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(edit_dc),
new_dc =>
{
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedPromptFavorite(sel_prompt);
});
};
WindowService.Show(vm);
@@ -474,7 +390,25 @@ namespace BeWo.ViewModel.View.Administration
if (result != MessageBoxResult.OK)
return;
folder.SubPrompts.VMList.Remove(sel_prompt);
if (sel_prompt.IsFavorite)
{
sel_prompt.IsFavorite = false;
UpdateSelectedPromptFavorite();
}
var delete_dc = sel_prompt.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinPrompt(delete_dc),
() =>
{
if (folder.SubPrompts.VMList.Contains(sel_prompt))
{
folder.SubPrompts.VMList.Remove(sel_prompt);
}
else
{
ReloadVMList();
}
});
}
void ChangeFavoritenStatePrompt()
@@ -483,7 +417,14 @@ namespace BeWo.ViewModel.View.Administration
sel_prompt.IsFavorite = !sel_prompt.IsFavorite;
UpdateSelectedPromptFavorite(sel_prompt);
var edit_dc = sel_prompt.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(edit_dc),
new_dc =>
{
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedPromptFavorite(sel_prompt);
});
}
bool canOpenAddPromptDialog()
@@ -528,8 +469,15 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
sel_folder.SubRoutines.VMList.Add(new_vm);
SelectedItem = new_vm;
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinRoutine(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubRoutines.VMList.Add(new_vm);
SelectedItem = new_vm;
});
};
WindowService.Show(vm);
@@ -543,6 +491,8 @@ namespace BeWo.ViewModel.View.Administration
var sel_dc = sel_prompt.CopyToEmptyDataContract();
sel_dc.CanEdit = sel_prompt.CanEdit;
sel_dc.Oid = sel_prompt.DataContract.Oid;
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinRoutineVM(sel_dc);
var vm = new AiPromptbausteinRoutineViewModel(edit_vm, Folders, false);
@@ -550,9 +500,13 @@ namespace BeWo.ViewModel.View.Administration
vm.Accept_Button_Clicked += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
sel_prompt.UpdateByDataContract(edit_dc);
UpdateSelectedRoutineFavorite(sel_prompt);
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(edit_dc),
new_dc =>
{
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedRoutineFavorite(sel_prompt);
});
};
WindowService.Show(vm);
@@ -568,7 +522,25 @@ namespace BeWo.ViewModel.View.Administration
if (result != MessageBoxResult.OK)
return;
folder.SubRoutines.VMList.Remove(sel_prompt);
if (sel_prompt.IsFavorite)
{
sel_prompt.IsFavorite = false;
UpdateSelectedRoutineFavorite();
}
var delete_dc = sel_prompt.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinRoutine(delete_dc),
() =>
{
if (folder.SubRoutines.VMList.Contains(sel_prompt))
{
folder.SubRoutines.VMList.Remove(sel_prompt);
}
else
{
ReloadVMList();
}
});
}
void ChangeFavoritenStateRoutine()
{
@@ -576,7 +548,14 @@ namespace BeWo.ViewModel.View.Administration
sel_routine.IsFavorite = !sel_routine.IsFavorite;
UpdateSelectedRoutineFavorite(sel_routine);
var edit_dc = sel_routine.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(edit_dc),
new_dc =>
{
sel_routine.UpdateByDataContract(new_dc);
UpdateSelectedRoutineFavorite(sel_routine);
});
}
bool canOpenAddRoutineDialog() => CanEditPromptbausteine && (SelectedFolder?.CanAddPrompt ?? false);