diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj
index 3ee8d1721..34a5cc250 100644
--- a/BeWo/BeWo.csproj
+++ b/BeWo/BeWo.csproj
@@ -155,6 +155,9 @@
AiConversationButton.xaml
+
+ AiPromptbausteinButton.xaml
+
AiPromptbausteinActionResultView.xaml
@@ -256,6 +259,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/BeWo/View/Controls/AI/AiConversationButton.xaml.cs b/BeWo/View/Controls/AI/AiConversationButton.xaml.cs
index 4e6961f56..5ad874de0 100644
--- a/BeWo/View/Controls/AI/AiConversationButton.xaml.cs
+++ b/BeWo/View/Controls/AI/AiConversationButton.xaml.cs
@@ -170,13 +170,15 @@ namespace BeWo.View.Controls.AI
{
var viewmodel = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm);
viewmodel.PromptAccepted += PromptAccepted;
+ popup_promptbaustein_all.Closed += (s, e) => viewmodel.ResetSelection();
var view = new AiPromptbausteinComplexSelectionView(viewmodel);
view.Padding = new Thickness(3);
view.Background = FindResource("ObjectEditBackgroundBrush") as System.Windows.Media.Brush;
border_promptbaustein_al.Child = view;
- var viewmodel2 = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm);
+ var viewmodel2 = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm, true);
viewmodel2.PromptAccepted += PromptAccepted;
+ popup_promptbaustein_favoriten.Closed += (s, e) => viewmodel2.ResetSelection();
var view2 = new AiPromptbausteinComplexSelectionView(viewmodel2);
view2.ReduceSelection();
viewmodel2.SelectedFolder = viewmodel2.Folders.VMList[0];
diff --git a/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml b/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml
new file mode 100644
index 000000000..d7d1203c9
--- /dev/null
+++ b/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml.cs b/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml.cs
new file mode 100644
index 000000000..1194dd585
--- /dev/null
+++ b/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml.cs
@@ -0,0 +1,160 @@
+using BeWo.ServiceProxy;
+using BeWo.View.Detail.AI;
+using BeWo.ViewModel;
+using BeWo.ViewModel.View.AI;
+using BS.Shared;
+using BS.Shared.DataContracts.Feature.AI;
+using DevExpress.Utils.Mdi;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Remoting.Messaging;
+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;
+
+namespace BeWo.View.Controls.AI
+{
+ public enum AiPromptbausteinButtonState
+ {
+ Hidden,
+ Normal,
+ Loading,
+ Disabled
+ }
+
+ ///
+ /// Interaktionslogik für AiPromptbausteinButton.xaml
+ ///
+ public partial class AiPromptbausteinButton : UserControl
+ {
+ public static readonly DependencyProperty StateProperty =
+ DependencyProperty.Register("State", typeof(AiPromptbausteinButtonState), typeof(AiPromptbausteinButton), new PropertyMetadata(AiPromptbausteinButtonState.Normal, OnStateChanged));
+
+ public static readonly DependencyProperty ActionTypeProperty =
+ DependencyProperty.Register("ActionType", typeof(AiActionType), typeof(AiPromptbausteinButton), new PropertyMetadata(AiActionType.ServiceRecord, OnActionTypeChanged));
+
+ public event EventHandler PromptAccepted;
+
+ public AiPromptbausteinButtonState State
+ {
+ get { return (AiPromptbausteinButtonState)GetValue(StateProperty); }
+ set { SetValue(StateProperty, value); }
+ }
+ public AiActionType ActionType
+ {
+ get { return (AiActionType)GetValue(ActionTypeProperty); }
+ set { SetValue(ActionTypeProperty, value); }
+ }
+
+ public AiActionType LoadedActionType { get; set; }
+
+ public AiPromptbausteinButton()
+ {
+ InitializeComponent();
+
+
+ }
+
+ private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (AiPromptbausteinButton)d;
+ var state = (AiPromptbausteinButtonState)e.NewValue;
+ control.UpdateState(state);
+ }
+ private static void OnActionTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (AiPromptbausteinButton)d;
+ var actionType = (AiActionType)e.NewValue;
+ control.UpdateActionType(actionType);
+ }
+
+ public void AiPromptOpenAll()
+ {
+ popup_promptbaustein_all.IsOpen = true;
+ }
+ public void AiPromptOpenFavorite()
+ {
+ popup_promptbaustein_favoriten.IsOpen = true;
+ }
+
+ private void btnOpenAi5_Click(object sender, RoutedEventArgs e)
+ {
+ AiPromptOpenAll();
+ }
+ private void btnOpenAi5_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ AiPromptOpenFavorite();
+ }
+
+ private void InitPromptbausteine(AiActionType actionType, List folders)
+ {
+ VMFactory.CreateAiPromptbausteinFolderListVM(folders, (listvm) =>
+ {
+ var viewmodel = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm);
+ viewmodel.PromptAccepted += PromptAccepted;
+ popup_promptbaustein_all.Closed += (s, e) => viewmodel.ResetSelection();
+ var view = new AiPromptbausteinComplexSelectionView(viewmodel);
+ view.Padding = new Thickness(3);
+ view.Background = FindResource("ObjectEditBackgroundBrush") as System.Windows.Media.Brush;
+ border_promptbaustein_al.Child = view;
+
+ var viewmodel2 = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm, true);
+ viewmodel2.PromptAccepted += PromptAccepted;
+ popup_promptbaustein_favoriten.Closed += (s, e) => viewmodel2.ResetSelection();
+ var view2 = new AiPromptbausteinComplexSelectionView(viewmodel2);
+ view2.ReduceSelection();
+ viewmodel2.SelectedFolder = viewmodel2.Folders.VMList[0];
+ view2.Padding = new Thickness(3);
+ view2.Background = FindResource("ObjectEditBackgroundBrush") as System.Windows.Media.Brush;
+ border_promptbaustein_favoriten.Child = view2;
+ State = AiPromptbausteinButtonState.Normal;
+ });
+ }
+ private void UpdateState(AiPromptbausteinButtonState state)
+ {
+ switch (state)
+ {
+ case AiPromptbausteinButtonState.Hidden:
+ root.Visibility = Visibility.Collapsed;
+ root.IsEnabled = true;
+ break;
+ case AiPromptbausteinButtonState.Normal:
+ root.Visibility = Visibility.Visible;
+ root.IsEnabled = true;
+ break;
+ case AiPromptbausteinButtonState.Loading:
+ root.Visibility = Visibility.Visible;
+ root.IsEnabled = false;
+ break;
+ case AiPromptbausteinButtonState.Disabled:
+ throw new NotImplementedException();
+ default:
+ throw new NotImplementedException();
+ break;
+ }
+
+ }
+ private void UpdateActionType(AiActionType actionType)
+ {
+ ActionType = actionType;
+
+ if (!BeWoApp.AppSettings.ShowAI)
+ {
+ State = AiPromptbausteinButtonState.Hidden;
+ return;
+ }
+
+ State = AiPromptbausteinButtonState.Loading;
+ ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.GetAiPromptbausteinFolder(actionType), folders => InitPromptbausteine(actionType, folders));
+ }
+ }
+}
diff --git a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml
index 24be48a9b..1fef54bc8 100644
--- a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml
+++ b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml
@@ -74,9 +74,9 @@
diff --git a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs
index 316a14706..712e31f42 100644
--- a/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs
+++ b/BeWo/View/Detail/AI/AiPromptbausteinComplexSelectionView.xaml.cs
@@ -31,7 +31,18 @@ namespace BeWo.View.Detail.AI
DataContext = ViewModel = viewModel;
- Loaded += (s, e) => ViewModel.InitVMList();
+ Loaded += (s, e) =>
+ {
+ ViewModel.InitVMList();
+
+ TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem;
+ if (item != null)
+ {
+ item.IsSelected = true;
+
+ item.IsSelected = false;
+ }
+ };
}
public void ReduceSelection()
diff --git a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml
index b9ee550e7..f3795aa83 100644
--- a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml
+++ b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml
@@ -1724,6 +1724,10 @@
Command="{Binding OpenAiPromptSelectionCommand}"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
Style="{StaticResource PrimaryButton}" />
+
diff --git a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml.cs b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml.cs
index 301311a92..cfe415dcc 100644
--- a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml.cs
+++ b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml.cs
@@ -5100,15 +5100,15 @@ namespace BeWo.View.Detail.Zeiterfassung
MainControl.WindowService.ShowAiConversationWindow(getAiConversationChatViewModel());
}
- private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
- {
- if (prompt is null)
- throw new NotImplementedException();
+ private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
+ {
+ if (prompt is null)
+ throw new NotImplementedException();
- // 1. Information aufbereiten
- // 1.1 Prompt
- var prompt_oid = prompt.DataContract.Oid.Value;
- var prompt_version = prompt.DataContract.Version;
+ // 1. Information aufbereiten
+ // 1.1 Prompt
+ var prompt_oid = prompt.DataContract.Oid.Value;
+ var prompt_version = prompt.DataContract.Version;
// 1.2 Restliche Informationen
var vm = getAiConversationChatViewModel();
@@ -5117,12 +5117,12 @@ namespace BeWo.View.Detail.Zeiterfassung
// 3 Auswerten
vm.MessageInput = prompt.Prompt;
- vm.SendAfterLoaded = true;
+ vm.SendAfterLoaded = true;
- MainControl.WindowService.ShowAiConversationWindow(vm);
- }
+ MainControl.WindowService.ShowAiConversationWindow(vm);
+ }
- private IEnumerable GetVisibleRecordVMs()
+ private IEnumerable GetVisibleRecordVMs()
{
var list = new List();
@@ -5146,6 +5146,11 @@ namespace BeWo.View.Detail.Zeiterfassung
return list;
}
+
+ private void btn_AiPromptbaustein2_PromptAccepted(object sender, AiPromptbausteinPromptVM e)
+ {
+ ViewModel.PromptAccepted(sender, e);
+ }
}
//public class RowBackgroundHelper
diff --git a/BeWo/ViewModel/AiPromptbausteinPromptVM.cs b/BeWo/ViewModel/AiPromptbausteinPromptVM.cs
index 96da4f4be..41c85ef53 100644
--- a/BeWo/ViewModel/AiPromptbausteinPromptVM.cs
+++ b/BeWo/ViewModel/AiPromptbausteinPromptVM.cs
@@ -103,9 +103,10 @@ namespace BeWo.ViewModel
public bool IsFavorite
{
get => _IsFavorite;
- set {
- var success = SetProperty(ref _IsFavorite, value, nameof(IsFavorite), () => DataContract.IsFavorite);
- if(success)
+ set
+ {
+ var success = SetProperty(ref _IsFavorite, value, nameof(IsFavorite), () => DataContract.IsFavorite);
+ if (success)
FirePropertyChanged(nameof(FontWeight));
}
}
@@ -124,7 +125,12 @@ namespace BeWo.ViewModel
public bool IsSelected
{
get => _IsSelected;
- set => SetProperty(ref _IsSelected, value, nameof(IsInfoVisible));
+ set
+ {
+ var success = SetProperty(ref _IsSelected, value, nameof(IsSelected));
+ if (success)
+ FirePropertyChanged(nameof(IsInfoVisible));
+ }
}
public bool IsInfoVisible
@@ -190,13 +196,13 @@ namespace BeWo.ViewModel
ActionType = pDataContract.ActionType;
}
- public override bool IsDirty
+ public override bool IsDirty
{
get
{
if (!CanEdit)
return _DirtyProps.Contains(nameof(IsFavorite));
- return _DirtyProps.Count > 0;
+ return _DirtyProps.Count > 0;
}
}
}
diff --git a/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs b/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs
index 9071f6bb1..a69b0a8b3 100644
--- a/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs
+++ b/BeWo/ViewModel/ListViewModel/ServiceRecordListVM.cs
@@ -185,31 +185,31 @@ namespace BeWo.ViewModel.ListViewModel
private void InitAiStuff()
{
- var vm_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
+ //var vm_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
- vm_doku.PromptAccepted += PromptAccepted;
+ //vm_doku.PromptAccepted += PromptAccepted;
- OpenAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(
- () => BeWoApp.MainControl.WindowService.Show(vm_doku),
- null,
- () => !string.IsNullOrWhiteSpace(AktuellerDokutext));
+ //OpenAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(
+ // () => BeWoApp.MainControl.WindowService.Show(vm_doku),
+ // null,
+ // () => !string.IsNullOrWhiteSpace(AktuellerDokutext));
UndoAiActionCommand = new DelegateCommand(UndoAiAction);
RedoAiActionCommand = new DelegateCommand(RedoAiAction);
- var vm_edit_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
+ //var vm_edit_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
- vm_edit_doku.PromptAccepted += EditPromptAccepted;
+ //vm_edit_doku.PromptAccepted += EditPromptAccepted;
- OpenEditAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(() =>
- {
- _EditAiActionHistory = new List();
- _EditAiActionHistory.Add(AktuellerEditDokutext);
- _EditAiActionHistoryIndex = 0;
- BeWoApp.MainControl.WindowService.Show(vm_edit_doku);
- },
- null,
- () => !string.IsNullOrWhiteSpace(AktuellerEditDokutext));
+ //OpenEditAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(() =>
+ //{
+ // _EditAiActionHistory = new List();
+ // _EditAiActionHistory.Add(AktuellerEditDokutext);
+ // _EditAiActionHistoryIndex = 0;
+ // BeWoApp.MainControl.WindowService.Show(vm_edit_doku);
+ //},
+ //null,
+ //() => !string.IsNullOrWhiteSpace(AktuellerEditDokutext));
UndoEditAiActionCommand = new DelegateCommand(UndoEditAiAction);
RedoEditAiActionCommand = new DelegateCommand(RedoEditAiAction);
@@ -256,7 +256,7 @@ namespace BeWo.ViewModel.ListViewModel
public bool IsEditUndoButtonVisible => _EditAiActionHistoryIndex > 0;
public bool IsEditRedoButtonVisible => _EditAiActionHistoryIndex < (_EditAiActionHistory?.Count ?? 0) - 1;
- private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
+ public void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
{
if (prompt is null)
throw new NotImplementedException();
@@ -363,7 +363,7 @@ namespace BeWo.ViewModel.ListViewModel
);
}
- private void EditPromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
+ public void EditPromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
{
if (prompt is null)
throw new NotImplementedException();
diff --git a/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs b/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs
index 7f30a0cd7..b57f83cdc 100644
--- a/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs
+++ b/BeWo/ViewModel/View/AI/AiPromptbausteinComplexSelectionViewModel.cs
@@ -19,6 +19,7 @@ namespace BeWo.ViewModel.View.AI
public event EventHandler PromptAccepted;
private AiPromptbausteinFolderVM _SelectedFolder;
+ private AiPromptbausteinPromptVM _SelectedPrompt;
public AiPromptbausteinSelectionComplexViewModel()
{
@@ -33,12 +34,15 @@ namespace BeWo.ViewModel.View.AI
{
AiActionType = aiActionType;
}
- public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType, AiPromptbausteinFolderListVM viewModel) : this(aiActionType)
+ public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType, AiPromptbausteinFolderListVM viewModel, bool isFavorite = false) : this(aiActionType)
{
LoadedActionType = aiActionType;
Folders = viewModel;
+ IsFavorite = isFavorite;
}
+ public bool IsFavorite { get; set; }
+
public ICommand SendCommand { get; set; }
public AiActionType AiActionType { get; set; }
@@ -52,10 +56,25 @@ namespace BeWo.ViewModel.View.AI
FirePropertyChanged(nameof(SelectedFolder));
}
}
- public AiPromptbausteinPromptVM SelectedPrompt { get; set; }
+ public AiPromptbausteinPromptVM SelectedPrompt
+ {
+ get => _SelectedPrompt;
+ set
+ {
+ _SelectedPrompt = value;
+ FirePropertyChanged(nameof(SelectedPrompt));
+ }
+ }
public AiPromptbausteinFolderListVM Folders { get; private set; }
public AiActionType LoadedActionType { get; set; }
+ public void ResetSelection()
+ {
+ if (!IsFavorite)
+ SelectedFolder = null;
+
+ SelectedPrompt = null;
+ }
public void Send()
{
CloseDialogCommand.Execute(null);
diff --git a/Service/Plugins/AiFunctionService.cs b/Service/Plugins/AiFunctionService.cs
index 93b6d1c45..22389a96e 100644
--- a/Service/Plugins/AiFunctionService.cs
+++ b/Service/Plugins/AiFunctionService.cs
@@ -75,6 +75,9 @@ namespace BeWo.Service.Plugins
if (model == null)
throw new NotImplementedException();
+ if (user_prompt == null)
+ user_prompt = string.Empty;
+
var messages = new List()
{
system, user_prompt