Files
BeWoPlaner/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs

440 lines
14 KiB
C#
Raw Normal View History

2025-12-30 11:30:01 +01:00
using BeWo.ServiceProxy;
using BeWo.Services;
using BeWo.ViewModel.ListViewModel;
using BS.Shared;
2026-01-05 10:58:12 +01:00
using BS.Shared.DataContracts.Compact;
2025-12-30 11:30:01 +01:00
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.Extensions.CustomInterfaces;
2025-12-30 14:43:25 +01:00
using DevExpress.Mvvm;
2025-12-30 11:30:01 +01:00
using DevExpress.Xpf.Layout.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
2025-12-30 11:30:01 +01:00
using System.Text;
using System.Threading.Tasks;
2025-12-31 10:11:48 +01:00
using System.Windows;
2025-12-30 11:30:01 +01:00
using System.Windows.Input;
namespace BeWo.ViewModel.View.Administration
{
public class AiPromptbausteinComplexTreeViewModel : WindowViewModel
{
private AiPromptbausteinFolderVM _SelectedFolder;
private IBeWoWindowService WindowService { get; set; }
private AiActionType AiActionType { get; set; }
public AiPromptbausteinFolderListVM Folders { get; set; }
2026-01-27 16:58:04 +01:00
public AiPromptbausteinFolderVM Favoriten { get; set; }
2025-12-30 11:30:01 +01:00
public AiPromptbausteinPromptVM SelectedPrompt { get; set; }
public AiPromptbausteinFolderVM CopiedFolder { get; set; }
2026-01-05 10:58:12 +01:00
public AiPromptbausteinPromptVM CopiedPrompt { get; set; }
2025-12-30 11:30:01 +01:00
2025-12-30 14:43:25 +01:00
public DelegateCommand OpenAddFolderDialogCommand { get; private set; }
public DelegateCommand OpenEditFolderDialogCommand { get; private set; }
public DelegateCommand CopyFolderCommand { get; private set; }
public DelegateCommand PasteFolderCommand { get; private set; }
public DelegateCommand DeleteFolderCommand { get; private set; }
2025-12-30 11:30:01 +01:00
2025-12-30 14:43:25 +01:00
public DelegateCommand OpenAddPromptDialogCommand { get; private set; }
public DelegateCommand OpenEditPromptDialogCommand { get; private set; }
public DelegateCommand CopyPromptCommand { get; private set; }
public DelegateCommand PastePromptCommand { get; private set; }
public DelegateCommand DeletePromptCommand { get; private set; }
2025-12-30 11:30:01 +01:00
2025-12-31 10:47:00 +01:00
public bool IsEditingMode { get; set; }
2025-12-30 11:30:01 +01:00
public AiPromptbausteinFolderVM SelectedFolder
{
get => _SelectedFolder;
set => SetProperty(ref _SelectedFolder, value, nameof(SelectedFolder));
}
2026-01-05 10:58:12 +01:00
2025-12-31 10:47:00 +01:00
public AiPromptbausteinComplexTreeViewModel() : this(null, AiActionType.ServiceRecordConversation)
2025-12-30 11:30:01 +01:00
{
if (BeWoApp.IsInDesignMode)
{
ReloadVMList();
2026-01-06 15:08:38 +01:00
SelectedFolder = Folders.VMList.FirstOrDefault();
2025-12-30 11:30:01 +01:00
return;
}
2025-12-31 10:47:00 +01:00
}
public AiPromptbausteinComplexTreeViewModel(IBeWoWindowService windowService, AiActionType aiActionType)
{
WindowService = windowService;
AiActionType = aiActionType;
2025-12-30 11:30:01 +01:00
2025-12-30 12:35:43 +01:00
OpenAddFolderDialogCommand = new DelegateCommand(OpenAddFolderDialog, canOpenAddFolderDialog, false);
OpenEditFolderDialogCommand = new DelegateCommand(OpenEditFolderDialog, canOpenEditFolderDialog, false);
CopyFolderCommand = new DelegateCommand(CopyFolder, canCopyFolder, false);
PasteFolderCommand = new DelegateCommand(PasteFolder, canPasteFolder, false);
DeleteFolderCommand = new DelegateCommand(DeleteFolder, canDeleteFolder, false);
2025-12-30 11:30:01 +01:00
2025-12-31 10:47:00 +01:00
OpenAddPromptDialogCommand = new DelegateCommand(OpenAddPromptDialog, canOpenAddPromptDialog, false);
OpenEditPromptDialogCommand = new DelegateCommand(OpenEditPromptDialog, canOpenEditPromptDialog, false);
CopyPromptCommand = new DelegateCommand(CopyPrompt, canCopyPrompt, false);
PastePromptCommand = new DelegateCommand(PastePrompt, canPastePrompt, false);
DeletePromptCommand = new DelegateCommand(OpenDeletePromptDialog, canOpenDeletePromptDialog, false);
IsEditingMode = true;
2025-12-30 11:30:01 +01:00
}
public override bool IsDirty
{
get
{
return Folders?.ContainsDirtyObject() ?? false;
2025-12-30 11:30:01 +01:00
}
}
2025-12-30 14:43:25 +01:00
public bool HasCopiedFolder => CopiedFolder is object;
2026-01-05 10:58:12 +01:00
public bool HasCopiedPrompt => CopiedPrompt is object;
public CompactEmployeeDC CurrentEmployee => BeWoApp.CompactLoggedOnEmployee;
2025-12-30 14:43:25 +01:00
public void UpdateFolderCommands()
{
OpenAddFolderDialogCommand.RaiseCanExecuteChanged();
OpenEditFolderDialogCommand.RaiseCanExecuteChanged();
CopyFolderCommand.RaiseCanExecuteChanged();
PasteFolderCommand.RaiseCanExecuteChanged();
DeleteFolderCommand.RaiseCanExecuteChanged();
2026-01-05 10:58:12 +01:00
}
2025-12-31 10:47:00 +01:00
public void UpdatePromptCommands()
{
OpenAddPromptDialogCommand.RaiseCanExecuteChanged();
OpenEditPromptDialogCommand.RaiseCanExecuteChanged();
CopyPromptCommand.RaiseCanExecuteChanged();
PastePromptCommand.RaiseCanExecuteChanged();
DeletePromptCommand.RaiseCanExecuteChanged();
}
2025-12-30 14:43:25 +01:00
2025-12-30 11:30:01 +01:00
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());
2025-12-30 11:30:01 +01:00
var actions = new List<Action<IAiEnhancedService>>();
2026-01-12 16:53:47 +01:00
if (toadd_folder.Any())
actions.Add(x => x.InsertAiPromptbausteinFolder(toadd_folder_dcs.ToList()));
2026-01-12 16:53:47 +01:00
if (toadd_prompts.Any())
actions.Add(x => x.InsertAiPromptbausteinPrompt(toadd_prompts.ToList()));
2026-01-12 16:53:47 +01:00
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();
});
2025-12-30 11:30:01 +01:00
}
internal void ReloadVMList()
{
2026-01-13 12:46:43 +01:00
VMFactory.CreateAiPromptbausteinFolderListVMAsync(
AiActionType,
listvm =>
2026-01-12 16:53:47 +01:00
{
2026-01-13 12:46:43 +01:00
Folders = listvm;
2026-01-27 16:58:04 +01:00
if (Folders.VMList.Count > 0 && Folders.VMList[0].DataContract.Oid == -5)
{
Favoriten = Folders.VMList[0];
}
2026-01-12 16:53:47 +01:00
FirePropertyChanged(nameof(Folders));
});
2025-12-30 11:30:01 +01:00
}
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;
}
2026-01-16 13:33:59 +01:00
// 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());
}
}
}
2026-01-27 16:58:04 +01:00
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());
2026-01-27 16:58:04 +01:00
}
}
void DFS_Search_Delete(AiPromptbausteinFolderListVM folders, ref List<AiPromptbausteinFolderDC> todelete_Folder, ref List<AiPromptbausteinPromptDC> todelete_Prompt)
{
foreach (var node_dc in folders.DCBackup)
{
2026-01-16 13:33:59 +01:00
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);
}
}
}
2025-12-30 11:30:01 +01:00
void OpenAddFolderDialog()
{
2025-12-30 12:35:43 +01:00
var sel_folder = SelectedFolder;
2025-12-31 10:47:00 +01:00
var new_vm = sel_folder.SubFolders.CreateNewVM();
2025-12-30 12:35:43 +01:00
2026-01-05 10:58:12 +01:00
new_vm.Creator = CurrentEmployee;
2025-12-30 12:48:57 +01:00
new_vm.Parent = sel_folder;
2026-01-12 16:53:47 +01:00
new_vm.ParentFolderOid = sel_folder?.DataContract?.Oid;
new_vm.CanAddFolder = true;
new_vm.CanAddPrompt = true;
2025-12-31 10:13:27 +01:00
new_vm.CanEdit = true;
2026-01-12 16:53:47 +01:00
new_vm.ActionType = AiActionType;
2025-12-30 12:48:57 +01:00
2025-12-30 12:35:43 +01:00
var vm = new AiPromptbausteinFolderViewModel(new_vm, true);
2025-12-30 14:43:25 +01:00
vm.Accept_Button_Clicked += (s, e) =>
{
2025-12-30 12:35:43 +01:00
sel_folder.SubFolders.VMList.Add(new_vm);
2025-12-30 12:48:57 +01:00
sel_folder.IsExpanded = true;
2025-12-30 12:35:43 +01:00
};
2025-12-30 11:30:01 +01:00
WindowService.Show(vm);
}
void OpenEditFolderDialog()
{
2025-12-30 12:35:43 +01:00
var sel_folder = SelectedFolder;
2026-01-23 15:32:06 +01:00
var sel_dc = sel_folder.CopyToEmptyDataContract();
2025-12-30 12:35:43 +01:00
var edit_vm = new AiPromptbausteinFolderVM(sel_dc);
var vm = new AiPromptbausteinFolderViewModel(edit_vm, false);
vm.Accept_Button_Clicked += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
sel_folder.UpdateByDataContract(edit_dc);
};
2025-12-30 11:30:01 +01:00
2025-12-30 12:35:43 +01:00
WindowService.Show(vm);
2025-12-30 11:30:01 +01:00
}
void CopyFolder()
{
}
void PasteFolder()
{
}
void DeleteFolder()
{
2025-12-31 10:11:48 +01:00
var sel_folder = SelectedFolder;
var parent = sel_folder.Parent;
var txt = "Möchten Sie den ausgewählten Ordner wirklich löschen?";
var result = MessageBox.Show(txt, "Hinweis", MessageBoxButton.OKCancel);
if (result != MessageBoxResult.OK)
return;
2025-12-30 11:30:01 +01:00
2025-12-31 10:11:48 +01:00
parent.SubFolders.VMList.Remove(sel_folder);
2025-12-30 11:30:01 +01:00
}
2025-12-30 12:35:43 +01:00
bool canOpenAddFolderDialog()
2025-12-30 11:30:01 +01:00
{
2026-01-12 16:53:47 +01:00
return SelectedFolder?.CanAddFolder ?? true;
2025-12-30 11:30:01 +01:00
}
2025-12-30 12:35:43 +01:00
bool canOpenEditFolderDialog()
2025-12-30 11:30:01 +01:00
{
2026-01-06 15:08:38 +01:00
return SelectedFolder?.CanEdit ?? false;
2025-12-30 11:30:01 +01:00
}
2025-12-30 12:35:43 +01:00
bool canCopyFolder()
2025-12-30 11:30:01 +01:00
{
return false;
2025-12-30 14:43:25 +01:00
//return SelectedFolder.CanEdit;
2025-12-30 11:30:01 +01:00
}
2025-12-30 12:35:43 +01:00
bool canPasteFolder()
2025-12-30 11:30:01 +01:00
{
return false;
2025-12-30 14:43:25 +01:00
//return HasCopiedFolder && SelectedFolder.CanAdd;
2025-12-30 11:30:01 +01:00
}
2025-12-30 12:35:43 +01:00
bool canDeleteFolder()
2025-12-30 11:30:01 +01:00
{
2026-01-06 15:08:38 +01:00
return SelectedFolder?.CanEdit ?? false;
2025-12-30 11:30:01 +01:00
}
2025-12-31 10:47:00 +01:00
void OpenAddPromptDialog()
{
var sel_folder = SelectedFolder;
var new_vm = sel_folder.SubPrompts.CreateNewVM();
2026-01-05 10:58:12 +01:00
new_vm.Creator = CurrentEmployee;
2025-12-31 10:47:00 +01:00
new_vm.ParentFolderOid = sel_folder.DataContract.Oid;
new_vm.ShowPrompt = true;
new_vm.ShowPromptByTenant = true;
new_vm.CanEdit = true;
var vm = new AiPromptbausteinPromptViewModel(new_vm, true);
vm.Accept_Button_Clicked += (s, e) =>
{
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedPrompt = new_vm;
};
WindowService.Show(vm);
}
void OpenEditPromptDialog()
{
var sel_prompt = SelectedPrompt;
2026-01-23 15:32:06 +01:00
var sel_dc = sel_prompt.CopyToEmptyDataContract();
2025-12-31 10:47:00 +01:00
var edit_vm = new AiPromptbausteinPromptVM(sel_dc);
var vm = new AiPromptbausteinPromptViewModel(edit_vm, false);
vm.Accept_Button_Clicked += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
sel_prompt.UpdateByDataContract(edit_dc);
2026-01-27 16:58:04 +01:00
if (sel_prompt.IsFavorite && !Favoriten.SubPrompts.VMList.Contains(sel_prompt))
Favoriten.SubPrompts.VMList.Add(sel_prompt);
else if (!sel_prompt.IsFavorite && Favoriten.SubPrompts.VMList.Contains(sel_prompt))
{
Favoriten.SubPrompts.VMList.Remove(sel_prompt);
if(Favoriten.SubPrompts.Count == 0)
{
var selected_folder = SelectedFolder;
SelectedFolder = null;
SelectedFolder = selected_folder;
}
}
2025-12-31 10:47:00 +01:00
};
WindowService.Show(vm);
}
void CopyPrompt()
{
2026-01-05 10:58:12 +01:00
CopiedPrompt = SelectedPrompt;
2025-12-31 10:47:00 +01:00
}
void PastePrompt()
{
2026-01-05 10:58:12 +01:00
var copied_dc = CopiedPrompt.CommitToDataContract();
copied_dc.Creator = CurrentEmployee;
copied_dc.CanEdit = true;
copied_dc.IsPublic = false;
copied_dc.Oid = null;
copied_dc.Version = 0;
var copied_vm = new AiPromptbausteinPromptVM(copied_dc);
SelectedFolder.SubPrompts.VMList.Add(copied_vm);
2025-12-31 10:47:00 +01:00
}
void OpenDeletePromptDialog()
{
var sel_prompt = SelectedPrompt;
var folder = SelectedFolder;
var txt = "Möchten Sie den ausgewählten Prompt wirklich löschen?";
var result = MessageBox.Show(txt, "Hinweis", MessageBoxButton.OKCancel);
if (result != MessageBoxResult.OK)
return;
folder.SubPrompts.VMList.Remove(SelectedPrompt);
}
2025-12-31 10:47:00 +01:00
bool canOpenAddPromptDialog()
{
2026-01-12 16:53:47 +01:00
return SelectedFolder?.CanAddPrompt ?? false;
2025-12-31 10:47:00 +01:00
}
bool canOpenEditPromptDialog()
{
return SelectedPrompt is object;
2025-12-31 10:47:00 +01:00
}
bool canCopyPrompt()
{
2026-01-05 10:58:12 +01:00
return SelectedPrompt is object;
2025-12-31 10:47:00 +01:00
}
bool canPastePrompt()
{
2026-01-05 10:58:12 +01:00
return canOpenAddPromptDialog() && HasCopiedPrompt;
2025-12-31 10:47:00 +01:00
}
bool canOpenDeletePromptDialog()
{
return SelectedPrompt?.CanEdit ?? false;
}
2025-12-30 11:30:01 +01:00
}
}