using BeWo.ServiceProxy; using BeWo.Services; using BeWo.ViewModel.ListViewModel; using BeWo.ViewModel.View.Administration; using BS.Shared; using BS.Shared.DataContracts.Compact; using DevExpress.Mvvm; using DevExpress.Mvvm.POCO; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using System.Windows.Input; using MessageBox = System.Windows.MessageBox; namespace BeWo.ViewModel.View.AI { public class AiPromptbausteinSelectionComplexViewModel : DialogViewModel { public event EventHandler ItemAccepted; public event EventHandler VMListReloaded; private AiPromptbausteinFolderVM _SelectedFolder; private AbstractBaseVM _SelectedItem; private IBeWoWindowService WindowService { get; set; } public bool IsFavorite { get; set; } public DelegateCommand SendCommand { get; set; } public AiActionType AiActionType { get; set; } public AiPromptbausteinFolderVM Favoriten { get; set; } public AiPromptbausteinFolderVM CopiedFolder { get; set; } public AiPromptbausteinPromptVM CopiedPrompt { get; set; } 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; } 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; } public DelegateCommand ChangeFavoritenStatePromptCommand { get; private set; } public DelegateCommand OpenAddRoutineDialogCommand { get; private set; } public DelegateCommand OpenEditRoutineDialogCommand { get; private set; } public DelegateCommand DeleteRoutineCommand { get; private set; } public DelegateCommand ChangeFavoritenStateRoutineCommand { get; private set; } public bool CanEditPromptbausteine { get; set; } public bool HasCopiedFolder => CopiedFolder is object; public bool HasCopiedPrompt => CopiedPrompt is object; public CompactEmployeeDC CurrentEmployee => BeWoApp.CompactLoggedOnEmployee; public bool CanOpenContextMenu { get; set; } public string AcceptButtonText => CanOpenContextMenu ? "Absenden" : "Hinzufügen"; public AiPromptbausteinSelectionComplexViewModel() { SendCommand = new DelegateCommand(Send, CanSend, true); if (BeWoApp.IsInDesignMode) { Folders = new AiPromptbausteinFolderListVM(); } } public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType) : this() { AiActionType = aiActionType; WindowService = BeWoApp.MainControl.WindowService; InitCommands(); } public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType, AiPromptbausteinFolderListVM viewModel, bool isFavorite = false, bool canOpen = true) : this(aiActionType) { LoadedActionType = aiActionType; Folders = viewModel; IsFavorite = isFavorite; CanOpenContextMenu = canOpen; } private void InitCommands() { OpenAddFolderDialogCommand = new DelegateCommand(OpenAddFolderDialog, canOpenAddFolderDialog, false); OpenEditFolderDialogCommand = new DelegateCommand(OpenEditFolderDialog, canOpenEditFolderDialog, false); DeleteFolderCommand = new DelegateCommand(DeleteFolder, canDeleteFolder, false); 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); ChangeFavoritenStatePromptCommand = new DelegateCommand(ChangeFavoritenStatePrompt, canChangeFavoritenStatePrompt, false); OpenAddRoutineDialogCommand = new DelegateCommand(OpenAddRoutineDialog, canOpenAddRoutineDialog, false); OpenEditRoutineDialogCommand = new DelegateCommand(OpenEditRoutineDialog, canOpenEditRoutineDialog, false); DeleteRoutineCommand = new DelegateCommand(OpenDeleteRoutineDialog, canOpenDeleteRoutineDialog, false); ChangeFavoritenStateRoutineCommand = new DelegateCommand(ChangeFavoritenStateRoutine, canChangeFavoritenStateRoutine, false); CanEditPromptbausteine = BeWoApp.HasLoggedOnUserRight(UserRightType.AiModulePromptbausteineEdit); } public AiPromptbausteinFolderVM SelectedFolder { get => _SelectedFolder; set { SetProperty(ref _SelectedFolder, value, nameof(SelectedFolder)); if (SelectedItem is AiPromptbausteinPromptVM vm) { SelectedItem = null; } } } public AbstractBaseVM SelectedItem { get => _SelectedItem; set { SetProperty(ref _SelectedItem, value, nameof(SelectedItem)); SendCommand.RaiseCanExecuteChanged(); } } public AiPromptbausteinFolderListVM Folders { get; private set; } public AiActionType LoadedActionType { get; set; } public bool HasFavoriten { get { #if DEBUG if (BeWoApp.IsInDesignMode) return true; #endif return Folders.Count > 3 && Folders.VMList[0].Prompts.Count > 0; } } public void ResetSelection() { SelectedFolder = null; if (IsFavorite) SelectedFolder = Folders.VMList[0]; } public void Send() { var selected_prompt = SelectedItem; Close(); ItemAccepted?.Invoke(this, selected_prompt); } public bool CanSend() { return SelectedItem is AiPromptbausteinPromptVM || (SelectedItem is AiPromptbausteinRoutineVM routine && routine.IsValid); } public void InitVMList() { if (Folders is object && LoadedActionType == AiActionType) return; LoadedActionType = AiActionType; VMFactory.CreateAiPromptbausteinFolderListVMAsync(AiActionType, UpdateVMList); } public void ReloadVMList(bool notify = true) { VMFactory.CreateAiPromptbausteinFolderListVMAsync(AiActionType, UpdateVMList); if(notify) VMListReloaded?.Invoke(this, EventArgs.Empty); } private void UpdateVMList(AiPromptbausteinFolderListVM new_list) { Folders = new_list; FirePropertyChanged(nameof(Folders)); if (Folders.VMList.Count > 0 && Folders.VMList[0].DataContract.Oid == -5) { Favoriten = Folders.VMList[0]; if (IsFavorite) SelectedFolder = Favoriten; } FirePropertyChanged(nameof(HasFavoriten)); } public void UpdateFolderCommands() { OpenAddFolderDialogCommand?.RaiseCanExecuteChanged(); OpenEditFolderDialogCommand?.RaiseCanExecuteChanged(); CopyFolderCommand?.RaiseCanExecuteChanged(); PasteFolderCommand?.RaiseCanExecuteChanged(); DeleteFolderCommand?.RaiseCanExecuteChanged(); } public void UpdatePromptCommands() { OpenAddPromptDialogCommand?.RaiseCanExecuteChanged(); OpenEditPromptDialogCommand?.RaiseCanExecuteChanged(); CopyPromptCommand?.RaiseCanExecuteChanged(); PastePromptCommand?.RaiseCanExecuteChanged(); DeletePromptCommand?.RaiseCanExecuteChanged(); ChangeFavoritenStatePromptCommand?.RaiseCanExecuteChanged(); OpenAddRoutineDialogCommand?.RaiseCanExecuteChanged(); OpenEditRoutineDialogCommand?.RaiseCanExecuteChanged(); DeleteRoutineCommand?.RaiseCanExecuteChanged(); ChangeFavoritenStateRoutineCommand?.RaiseCanExecuteChanged(); } // --- Folder Commands --- void OpenAddFolderDialog() { var sel_folder = SelectedFolder; var new_vm = sel_folder.SubFolders.CreateNewVM(); new_vm.Creator = CurrentEmployee; new_vm.Parent = sel_folder; new_vm.ParentFolderOid = sel_folder?.DataContract?.Oid; new_vm.CanAddFolder = true; new_vm.CanAddPrompt = true; new_vm.CanEdit = true; new_vm.ActionType = AiActionType; var vm = new AiPromptbausteinFolderViewModel(new_vm, true); vm.DataSaved += (s, new_dc) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void OpenEditFolderDialog() { 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); vm.DataSaved += (s, new_dc) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void DeleteFolder() { var sel_folder = SelectedFolder; var parent = sel_folder.Parent; var result = MessageBox.Show("Möchten Sie den ausgewählten Ordner wirklich löschen?", "Hinweis", MessageBoxButton.OKCancel); if (result != MessageBoxResult.OK) return; var delete_dc = sel_folder.CommitToDataContract(); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinFolder(delete_dc), () => ReloadVMList()); } bool canOpenAddFolderDialog() => CanEditPromptbausteine && (SelectedFolder?.CanAddFolder ?? true); bool canOpenEditFolderDialog() => CanEditPromptbausteine && (SelectedFolder?.CanEdit ?? false); bool canDeleteFolder() => CanEditPromptbausteine && (SelectedFolder?.CanEdit ?? false); // --- Prompt Commands --- void OpenAddPromptDialog() { var sel_folder = SelectedFolder; var new_vm = sel_folder.SubPrompts.CreateNewVM(); new_vm.Creator = CurrentEmployee; new_vm.ParentFolderOid = sel_folder.DataContract.Oid; new_vm.ShowPrompt = true; new_vm.ShowPromptByTenant = true; new_vm.CanEdit = true; new_vm.ActionType = AiActionType; var vm = new AiPromptbausteinPromptViewModel(new_vm); vm.DataSaved += (s, e) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void OpenEditPromptDialog() { var sel_prompt = SelectedItem as AiPromptbausteinPromptVM; if (SelectedItem is null) throw new Exception("invalid operation"); 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); vm.DataSaved += (s, e) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void CopyPrompt() { CopiedPrompt = SelectedItem as AiPromptbausteinPromptVM; } void PastePrompt() { var copied_dc = CopiedPrompt.CommitToDataContract(); copied_dc.Creator = CurrentEmployee; copied_dc.CanEdit = true; copied_dc.IsPublic = false; copied_dc.IsFavorite = false; copied_dc.Oid = null; copied_dc.Version = null; copied_dc.ParentFolderOid = SelectedFolder.DataContract.Oid; copied_dc.ActionType = AiActionType; copied_dc.PromptId = null; var copied_vm = new AiPromptbausteinPromptVM(copied_dc); SelectedFolder.SubPrompts.VMList.Add(copied_vm); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinPrompt(copied_dc), new_dc => { copied_vm.UpdateByDataContract(new_dc); SelectedFolder.SubPrompts.VMList.Add(copied_vm); SelectedItem = copied_vm; }); } void OpenDeletePromptDialog() { var sel_prompt = SelectedItem as AiPromptbausteinPromptVM; 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; if (sel_prompt.IsFavorite) { sel_prompt.IsFavorite = false; } var delete_dc = sel_prompt.CommitToDataContract(); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinPrompt(delete_dc), () => { ReloadVMList(); }); } void ChangeFavoritenStatePrompt() { var sel_prompt = SelectedItem as AiPromptbausteinPromptVM; sel_prompt.IsFavorite = !sel_prompt.IsFavorite; var edit_dc = sel_prompt.CommitToDataContract(); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(edit_dc), new_dc => { ReloadVMList(); }); } bool canOpenAddPromptDialog() { return CanEditPromptbausteine && (SelectedFolder?.CanAddPrompt ?? false); } bool canOpenEditPromptDialog() { return SelectedItem as AiPromptbausteinPromptVM is object; } bool canCopyPrompt() { return CanEditPromptbausteine && SelectedItem as AiPromptbausteinPromptVM is object; } bool canPastePrompt() { return canOpenAddPromptDialog() && HasCopiedPrompt; } bool canOpenDeletePromptDialog() { return CanEditPromptbausteine && ((SelectedItem as AiPromptbausteinPromptVM)?.CanEdit ?? false); } bool canChangeFavoritenStatePrompt() { return SelectedItem as AiPromptbausteinPromptVM is object; } // --- Routine Commands void OpenAddRoutineDialog() { var sel_folder = SelectedFolder; var new_vm = sel_folder.SubRoutines.CreateNewVM(); new_vm.Creator = CurrentEmployee; new_vm.ParentFolderOid = sel_folder.DataContract.Oid; new_vm.CanEdit = true; new_vm.ActionType = AiActionType; var vm = new AiPromptbausteinRoutineViewModel(new_vm, Folders); vm.DataSaved += (s, e) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void OpenEditRoutineDialog() { var sel_prompt = SelectedItem as AiPromptbausteinRoutineVM; if (SelectedItem is null) throw new Exception("invalid operation"); 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); vm.DataSaved += (s, e) => { ReloadVMList(); }; Close(); WindowService.Show(vm); } void OpenDeleteRoutineDialog() { var sel_prompt = SelectedItem as AiPromptbausteinRoutineVM; var folder = SelectedFolder; var txt = "Möchten Sie die ausgewählte Routine wirklich löschen?"; var result = MessageBox.Show(txt, "Hinweis", MessageBoxButton.OKCancel); if (result != MessageBoxResult.OK) return; if (sel_prompt.IsFavorite) { sel_prompt.IsFavorite = false; } var delete_dc = sel_prompt.CommitToDataContract(); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.DeleteAiPromptbausteinRoutine(delete_dc), () => { ReloadVMList(); }); } void ChangeFavoritenStateRoutine() { var sel_routine = SelectedItem as AiPromptbausteinRoutineVM; sel_routine.IsFavorite = !sel_routine.IsFavorite; var edit_dc = sel_routine.CommitToDataContract(); ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(edit_dc), new_dc => { ReloadVMList(); }); } bool canOpenAddRoutineDialog() => CanEditPromptbausteine && (SelectedFolder?.CanAddPrompt ?? false); bool canOpenEditRoutineDialog() => SelectedItem is AiPromptbausteinRoutineVM; bool canOpenDeleteRoutineDialog() => CanEditPromptbausteine && ((SelectedItem as AiPromptbausteinRoutineVM)?.CanEdit ?? false); bool canChangeFavoritenStateRoutine() => SelectedItem is AiPromptbausteinRoutineVM; } }