diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj index 3ee8d1721..cf1c9e42d 100644 --- a/BeWo/BeWo.csproj +++ b/BeWo/BeWo.csproj @@ -106,6 +106,7 @@ + @@ -155,6 +156,9 @@ AiConversationButton.xaml + + AiPromptbausteinButton.xaml + AiPromptbausteinActionResultView.xaml @@ -256,6 +260,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/BeWo/BeWoApp.xaml b/BeWo/BeWoApp.xaml index 042c908b3..43aa8902a 100644 --- a/BeWo/BeWoApp.xaml +++ b/BeWo/BeWoApp.xaml @@ -86,6 +86,7 @@ + diff --git a/BeWo/Converter/StringEmptyBoolConverter.cs b/BeWo/Converter/StringEmptyBoolConverter.cs new file mode 100644 index 000000000..3bb495e3a --- /dev/null +++ b/BeWo/Converter/StringEmptyBoolConverter.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace BeWo.Converter +{ + public class StringEmptyBoolConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string stringi) + { + return !string.IsNullOrEmpty(stringi); + } + + return false; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/BeWo/Services/BeWoWindowService.cs b/BeWo/Services/BeWoWindowService.cs index d2b01c7f3..d9eecc28a 100644 --- a/BeWo/Services/BeWoWindowService.cs +++ b/BeWo/Services/BeWoWindowService.cs @@ -54,19 +54,19 @@ namespace BeWo.Services } else if (windowViewModel is AiPromptbausteinFolderViewModel viewModel3) { - ShowAiPromptbausteinFolderPopup(viewModel3); + ShowAiPromptbausteinFolderWindow(viewModel3); } else if(windowViewModel is AiPromptbausteinPromptViewModel viewModel4) { - ShowAiPromptbausteinPromptPopup(viewModel4); + ShowAiPromptbausteinPromptWindow(viewModel4); } else if(windowViewModel is AiPromptbausteinActionResultViewModel viewModel5) { - ShowAiPromptbausteinActionResultPopup(viewModel5); + ShowAiPromptbausteinActionResultWindow(viewModel5); } else if(windowViewModel is AiPromptbausteinSelectionComplexViewModel viewModel6) { - ShowAiPromptbausteinSelectionComplexPopup(viewModel6); + ShowAiPromptbausteinSelectionComplexWindow(viewModel6); } else { @@ -85,7 +85,7 @@ namespace BeWo.Services }; Show(title, control, viewModel, options); } - public void ShowAiPromptbausteinFolderPopup(AiPromptbausteinFolderViewModel viewModel) + public void ShowAiPromptbausteinFolderWindow(AiPromptbausteinFolderViewModel viewModel) { var control = new AiPromptbausteinFolderView(viewModel); var options = new BeWoWindowOptions() @@ -95,7 +95,7 @@ namespace BeWo.Services }; Show("KI Promptbaustein Ordner", control, viewModel, options); } - public void ShowAiPromptbausteinPromptPopup(AiPromptbausteinPromptViewModel viewModel) + public void ShowAiPromptbausteinPromptWindow(AiPromptbausteinPromptViewModel viewModel) { var control = new AiPromptbausteinPromptView(viewModel); var options = new BeWoWindowOptions() @@ -105,7 +105,7 @@ namespace BeWo.Services }; Show("KI Promptbaustein Prompt", control, viewModel, options); } - public void ShowAiPromptbausteinActionResultPopup(AiPromptbausteinActionResultViewModel viewModel) + public void ShowAiPromptbausteinActionResultWindow(AiPromptbausteinActionResultViewModel viewModel) { var control = new AiPromptbausteinActionResultView(viewModel); var options = new BeWoWindowOptions() @@ -116,7 +116,7 @@ namespace BeWo.Services Show("KI Promptbaustein Ergebnis", control, viewModel, options); } - public void ShowAiPromptbausteinSelectionComplexPopup(AiPromptbausteinSelectionComplexViewModel viewModel) + public void ShowAiPromptbausteinSelectionComplexWindow(AiPromptbausteinSelectionComplexViewModel viewModel) { var control = new AiPromptbausteinComplexSelectionView(viewModel); var options = new BeWoWindowOptions() 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..df37ce2af --- /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..07ac2d2b6 --- /dev/null +++ b/BeWo/View/Controls/AI/AiPromptbausteinButton.xaml.cs @@ -0,0 +1,183 @@ +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 CanExecuteProperty = + DependencyProperty.Register("CanExecute", typeof(bool), typeof(AiPromptbausteinButton), new PropertyMetadata(true, OnCanExecuteChanged)); + + 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 AiPromptbausteinButtonState State + { + get { return (AiPromptbausteinButtonState)GetValue(StateProperty); } + set { SetValue(StateProperty, value); } + } + public AiActionType ActionType + { + get { return (AiActionType)GetValue(ActionTypeProperty); } + set { SetValue(ActionTypeProperty, value); } + } + + public bool CanExecute + { + get { return (bool)GetValue(CanExecuteProperty); } + set { SetValue(CanExecuteProperty, value); } + } + + public event EventHandler PromptAccepted; + + 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); + } + private static void OnCanExecuteChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var control = (AiPromptbausteinButton)d; + var canExecute = (bool)e.NewValue; + control.UpdateCanExecute(canExecute); + } + + 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; + btnOpenAi5.IsEnabled = true; + break; + case AiPromptbausteinButtonState.Normal: + root.Visibility = Visibility.Visible; + root.IsEnabled = true; + btnOpenAi5.IsEnabled = true; + break; + case AiPromptbausteinButtonState.Loading: + root.Visibility = Visibility.Visible; + root.IsEnabled = false; + btnOpenAi5.IsEnabled = false; + break; + case AiPromptbausteinButtonState.Disabled: + root.Visibility = Visibility.Visible; + root.IsEnabled = true; + btnOpenAi5.IsEnabled = false; + break; + 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)); + } + private void UpdateCanExecute(bool canExecute) + { + if (canExecute) + State = AiPromptbausteinButtonState.Normal; + else + State = AiPromptbausteinButtonState.Disabled; + } + } +} 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/AI/AiPromptbausteinPromptView.xaml b/BeWo/View/Detail/AI/AiPromptbausteinPromptView.xaml index 6732d038a..d48de16f8 100644 --- a/BeWo/View/Detail/AI/AiPromptbausteinPromptView.xaml +++ b/BeWo/View/Detail/AI/AiPromptbausteinPromptView.xaml @@ -70,7 +70,6 @@ Grid.Row="2" Grid.Column="2" IsEnabled="{Binding ViewModel.CanEdit}" - MaxLength="1024" Style="{StaticResource TextBoxNoticeLarge}" Text="{Binding ViewModel.Prompt, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap" /> diff --git a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml index b9ee550e7..e40c2ceca 100644 --- a/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml +++ b/BeWo/View/Detail/Zeiterfassung/ServiceRecordView2.xaml @@ -1718,12 +1718,11 @@ Style="{StaticResource ButtonRedoStyle}" Visibility="{Binding IsRedoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" /> -