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