diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj index 373beee23..00b4a5f94 100644 --- a/BeWo/BeWo.csproj +++ b/BeWo/BeWo.csproj @@ -143,6 +143,7 @@ + @@ -150,6 +151,9 @@ AiPromptbausteinActionResultView.xaml + + AiPromptbausteinComplexSelectionView.xaml + AiPromptbausteinPromptView.xaml @@ -225,6 +229,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + MSBuild:Compile Designer diff --git a/BeWo/Services/BeWoWindowService.cs b/BeWo/Services/BeWoWindowService.cs index fec4dbedb..5535d6af3 100644 --- a/BeWo/Services/BeWoWindowService.cs +++ b/BeWo/Services/BeWoWindowService.cs @@ -68,6 +68,10 @@ namespace BeWo.Services { ShowAiPromptbausteinActionResultPopup(viewModel5); } + else if(windowViewModel is AiPromptbausteinSelectionComplexViewModel viewModel6) + { + ShowAiPromptbausteinSelectionComplexPopup(viewModel6); + } else { throw new NotImplementedException($"type not implemented: {typeof(T)}"); @@ -136,6 +140,17 @@ namespace BeWo.Services Show("KI Promptbaustein Ergebnis", control, viewModel, options); } + public void ShowAiPromptbausteinSelectionComplexPopup(AiPromptbausteinSelectionComplexViewModel viewModel) + { + var control = new AiPromptbausteinComplexSelectionView(viewModel); + var options = new BeWoWindowOptions() + { + Height = 400, + Width = 600 + }; + Show("KI Promptbaustein Auswahl", control, viewModel, options); + } + public void ShowGkvAbrechnungDetailWindow(GkvAbrechnungDialogViewModel vm) { diff --git a/BeWo/View/Detail/AI/AiPromptbausteinActionResultView.xaml b/BeWo/View/Detail/AI/AiPromptbausteinActionResultView.xaml index 4001e5c91..728bd5f5e 100644 --- a/BeWo/View/Detail/AI/AiPromptbausteinActionResultView.xaml +++ b/BeWo/View/Detail/AI/AiPromptbausteinActionResultView.xaml @@ -28,14 +28,14 @@ - - + VerticalAlignment="Stretch" + Text="{Binding Result}" + TextWrapping="Wrap" /> - + diff --git a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml new file mode 100644 index 000000000..210cc1c9b --- /dev/null +++ b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (i) + + + + + + + + + + + + + diff --git a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs new file mode 100644 index 000000000..018fa8cdf --- /dev/null +++ b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs @@ -0,0 +1,73 @@ +using BeWo.ViewModel.View.AI; +using BeWo.ViewModel; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Diagnostics; + +namespace BeWo.View.Detail.AI +{ + /// + /// Interaktionslogik für AiPromptbausteinComplexSelectionView.xaml + /// + public partial class AiPromptbausteinComplexSelectionView : UserControl + { + public AiPromptbausteinSelectionComplexViewModel ViewModel { get; set; } + + public AiPromptbausteinComplexSelectionView(AiPromptbausteinSelectionComplexViewModel viewModel) + { + InitializeComponent(); + + DataContext = ViewModel = viewModel; + + Loaded += (s, e) => ViewModel.ReloadVMList(); + } + + private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (ViewModel is null) + return; + + ViewModel.SelectedFolder = treeView.SelectedValue as AiPromptbausteinFolderVM; + } + + static TreeViewItem VisualUpwardSearch(DependencyObject source) + { + while (source != null && !(source is TreeViewItem)) + source = VisualTreeHelper.GetParent(source); + + return source as TreeViewItem; + } + + private void treeView_PreviewMouseDown(object sender, MouseButtonEventArgs e) + { + TreeViewItem treeViewItem = VisualUpwardSearch(e.OriginalSource as DependencyObject); + + if (treeViewItem is null) + return; + + if (e.ClickCount == 2) + { + if (ViewModel.CanSend()) + ViewModel.Send(); + } + } + + private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) + { + Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); + e.Handled = true; + } + } +} diff --git a/BeWo/View/Detail/AI/AiPromptbausteinComplexTreeView.xaml b/BeWo/View/Detail/AI/AiPromptbausteinComplexTreeView.xaml index 6f1743f0d..01e855fe9 100644 --- a/BeWo/View/Detail/AI/AiPromptbausteinComplexTreeView.xaml +++ b/BeWo/View/Detail/AI/AiPromptbausteinComplexTreeView.xaml @@ -37,7 +37,7 @@ - + diff --git a/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs b/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs index 73cf1b20a..5c0d61192 100644 --- a/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs +++ b/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs @@ -172,13 +172,15 @@ namespace BeWo.ViewModel.ListViewModel } VMList.ListChanged += (s, e) => CheckCustomerAbsenceTimes(); - var vm_doku = new AiPromptbausteinSelectionViewModel(AiActionType.ServiceRecordDocumentation); + var vm_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation); + //var vm_doku = new AiPromptbausteinSelectionViewModel(AiActionType.ServiceRecordDocumentation); vm_doku.PromptAccepted += PromptAccepted; OpenAiPromptSelectionCommand = new DelegateCommand(() => { - BeWoApp.MainControl.WindowService.ShowAiPromptbausteinSelectionWindow(vm_doku); + BeWoApp.MainControl.WindowService.Show(vm_doku); + //BeWoApp.MainControl.WindowService.ShowAiPromptbausteinSelectionWindow(vm_doku); }, () => !string.IsNullOrWhiteSpace(AktuellerDokutext)); UndoAiActionCommand = new DelegateCommand(UndoAiAction); @@ -205,9 +207,9 @@ namespace BeWo.ViewModel.ListViewModel public bool IsUndoButtonVisible => _AiActionHistoryIndex > 0; public bool IsRedoButtonVisible => _AiActionHistoryIndex < _AiActionHistory.Count - 1; - private void PromptAccepted(object sender, AiPromptbausteinTreeVM prompt) + private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt) { - if (prompt is null || prompt.PromptbausteinType != AiPromptbausteinType.Prompt) + if (prompt is null) throw new NotImplementedException(); // 1. Information aufbereiten @@ -235,7 +237,7 @@ namespace BeWo.ViewModel.ListViewModel // Service Aufruf var req = new AiFunctionDocRequest() { - AiPromptbaustein = new BeWoRefDC(prompt_oid, prompt_version), + AiPromptbausteinPrompt = new BeWoRefDC(prompt_oid, prompt_version), SupportConcept = new BeWoRefDC(support_concept_oid, support_concept_version), ServiceRecords = sr_refs, CostBearer = new BeWoRefDC(cb_oid, cb_ver), diff --git a/BeWo/ViewModel/VMFactory.cs b/BeWo/ViewModel/VMFactory.cs index b4db1e752..6e7f17411 100644 --- a/BeWo/ViewModel/VMFactory.cs +++ b/BeWo/ViewModel/VMFactory.cs @@ -955,5 +955,12 @@ namespace BeWo.ViewModel req => req.GetAiPromptbausteineSubTree(aiActionType), res => get_viewmodel(new AiPromptbausteinTreeListVM(res))); } + + internal static void CreateAiPromptbausteinFolderListVMAsync(AiActionType aiActionType, Action get_viewmodel) + { + ServiceFacade.DoAiEnhancedServiceAsnyc( + req => req.GetAiPromptbausteinFolder(aiActionType), + res => get_viewmodel(new AiPromptbausteinFolderListVM(res))); + } } } \ No newline at end of file diff --git a/BeWo/ViewModel/View/AI/AiConversationChatViewModel.cs b/BeWo/ViewModel/View/AI/AiConversationChatViewModel.cs index eb8eb0049..e4c13c836 100644 --- a/BeWo/ViewModel/View/AI/AiConversationChatViewModel.cs +++ b/BeWo/ViewModel/View/AI/AiConversationChatViewModel.cs @@ -45,7 +45,6 @@ namespace BeWo.ViewModel.View.AI OpenCloneCommand = new DelegateCommand(OpenClone, () => BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleChatClone) && ListVM.SelectedVM is object && BeWoAppInfo.IsInAiDeveloperMode); CloneCommand = new DelegateCommand(Clone); - AskDeleteCommand = new DelegateCommand(AskDelete, () => BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleChatDelete) && ListVM.SelectedVM is object); ListVM = new AiConversationListVM(); diff --git a/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs b/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs new file mode 100644 index 000000000..b4feb04d6 --- /dev/null +++ b/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs @@ -0,0 +1,82 @@ +using BeWo.ServiceProxy; +using BeWo.Services; +using BeWo.ViewModel.ListViewModel; +using BS.Shared; +using BS.Shared.Extensions.CustomInterfaces; +using DevExpress.Mvvm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Input; + +namespace BeWo.ViewModel.View.AI +{ + public class AiPromptbausteinSelectionComplexViewModel : DialogViewModel + { + private AiPromptbausteinFolderVM _SelectedFolder; + + public AiPromptbausteinSelectionComplexViewModel() + { + SendCommand = new DelegateCommand(Send, CanSend, true); + + if (BeWoApp.IsInDesignMode) + { + Folders = new AiPromptbausteinFolderListVM(); + } + } + + public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType) : this() + { + AiActionType = aiActionType; + } + + public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType, AiPromptbausteinFolderListVM viewModel) : this(aiActionType) + { + Folders = viewModel; + } + + public event EventHandler PromptAccepted; + + public AiActionType AiActionType { get; set; } + + public AiPromptbausteinFolderVM SelectedFolder + { + get => _SelectedFolder; + set + { + _SelectedFolder = value; + FirePropertyChanged(nameof(SelectedFolder)); + } + } + public AiPromptbausteinPromptVM SelectedPrompt { get; set; } + public AiPromptbausteinFolderListVM Folders { get; private set; } + + public ICommand SendCommand { get; set; } + + public void Send() + { + CloseDialogCommand.Execute(null); + + PromptAccepted?.Invoke(this, SelectedPrompt); + } + + public bool CanSend() + { + return SelectedPrompt is object; + } + + public void ReloadVMList() + { + VMFactory.CreateAiPromptbausteinFolderListVMAsync(AiActionType, UpdateVMList); + } + + private void UpdateVMList(AiPromptbausteinFolderListVM new_list) + { + Folders = new_list; + FirePropertyChanged(nameof(Folders)); + } + } +} diff --git a/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs b/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs index 513124955..69601339e 100644 --- a/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs +++ b/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs @@ -81,7 +81,6 @@ namespace BeWo.ViewModel.View.Administration IsEditingMode = true; } - public override bool IsDirty { get @@ -167,12 +166,11 @@ namespace BeWo.ViewModel.View.Administration } internal void ReloadVMList() { - ServiceFacade.DoAiEnhancedServiceAsnyc( - req => req.GetAiPromptbausteinFolder(AiActionType), - callback => + VMFactory.CreateAiPromptbausteinFolderListVMAsync( + AiActionType, + listvm => { - Folders = new AiPromptbausteinFolderListVM(callback); - + Folders = listvm; FirePropertyChanged(nameof(Folders)); }); } diff --git a/Service/Plugins/AiFunctionService.cs b/Service/Plugins/AiFunctionService.cs index d7ea05ae2..0c39cdf7e 100644 --- a/Service/Plugins/AiFunctionService.cs +++ b/Service/Plugins/AiFunctionService.cs @@ -37,24 +37,24 @@ namespace BeWo.Service.Plugins var factory = new AiFunctionSystemPromptBuilder(systemPromptFolderPath); var system_prompt = factory.CreateServiceRecordDocumentationSystemPrompt(context); - var prompt_baustein_ref = request.AiPromptbaustein; + var prompt_baustein_ref = request.AiPromptbausteinPrompt; var prompt_baustein_ref_oid = prompt_baustein_ref.Oid; var prompt_baustein_ref_ver = prompt_baustein_ref.Version; - var prompt_baustein = DAOFactory.GenericDAO.LoadByID(prompt_baustein_ref_oid); + var prompt_baustein = DAOFactory.GenericDAO.LoadByID(prompt_baustein_ref_oid); ServiceLogic.ConcurrencyCheck(prompt_baustein_ref_ver, prompt_baustein); - if (prompt_baustein.IsOrdner()) - throw new Exception("prompt is folder"); + //if (prompt_baustein.IsOrdner()) + // throw new Exception("prompt is folder"); - if (prompt_baustein.IsKette()) - throw new NotImplementedException(); + //if (prompt_baustein.IsKette()) + // throw new NotImplementedException(); if (prompt_baustein.Oid < 0) throw new NotImplementedException(); // Anfrage abschicken - var result = getResult(system_prompt, prompt_baustein.Content); + var result = getResult(system_prompt, prompt_baustein.Prompt); // Response auswerten diff --git a/Service/Plugins/AiPromptbausteineService.cs b/Service/Plugins/AiPromptbausteineService.cs index 48f6f6399..3c21b54fb 100644 --- a/Service/Plugins/AiPromptbausteineService.cs +++ b/Service/Plugins/AiPromptbausteineService.cs @@ -158,6 +158,7 @@ namespace BeWo.Service.Plugins foreach (var dc in own_dcs) { initOwnFolder(dc); + dc.ParentFolderOid = own_bib.Oid; } own_bib.SubFolders.AddRange(own_dcs); diff --git a/Shared/DataContracts/Feature/AI/Functions/ServiceRecords/AiFunctionDoc.cs b/Shared/DataContracts/Feature/AI/Functions/ServiceRecords/AiFunctionDoc.cs index 6180a3553..eca600ff4 100644 --- a/Shared/DataContracts/Feature/AI/Functions/ServiceRecords/AiFunctionDoc.cs +++ b/Shared/DataContracts/Feature/AI/Functions/ServiceRecords/AiFunctionDoc.cs @@ -11,7 +11,7 @@ namespace BS.Shared.DataContracts.Feature.AI.Functions.ServiceRecords public class AiFunctionDocRequest { [DataMember] - public BeWoRefDC AiPromptbaustein { get; set; } + public BeWoRefDC AiPromptbausteinPrompt { get; set; } [DataMember] public BeWoRefDC SupportConcept { get; set; }