Ai Promptbaustein SR Conv Popup

This commit is contained in:
2026-03-11 15:00:27 +01:00
parent 07436f6444
commit 4885e7868f
7 changed files with 149 additions and 39 deletions

View File

@@ -6,6 +6,8 @@
xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing"
xmlns:local="clr-namespace:BeWo.View.Controls.AI"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ai="clr-namespace:BeWo.View.Detail.AI"
x:Name="root"
mc:Ignorable="d">
<Grid>
<StackPanel
@@ -20,23 +22,31 @@
</ResourceDictionary>
</StackPanel.Resources>
<Button
Background="Transparent"
x:Name="btnOpenAi4"
Height="30"
Margin="10,0,0,0"
Margin="0"
Click="btnOpenAi4_Click"
Content="{StaticResource AiDesignsIconKIChatWeissOrange}"
Style="{StaticResource NavigationToolbarButtonStyle}"
ToolTip="KI Chat öffnen"
ToolTipService.ShowOnDisabled="True" />
<Button
Background="Transparent"
x:Name="btnOpenAi5"
Height="30"
Margin="10,0,0,0"
Click="btnOpenAi5_Click"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
MouseRightButtonUp="btnOpenAi5_MouseRightButtonUp"
Style="{StaticResource NavigationToolbarButtonStyle}"
ToolTip="KI Chat mit Prompt-Baustein starten"
ToolTipService.ShowOnDisabled="True" />
ToolTipService.ShowOnDisabled="True">
<!--<Button.InputBindings>
<MouseBinding Command="{Binding AiPromptOpenFavoriteCommand, ElementName=root}" Gesture="RightClick" />
<MouseBinding Command="{Binding AiPromptOpenAllCommand, ElementName=root}" Gesture="LeftClick" />
</Button.InputBindings>-->
</Button>
<Image
x:Name="imgWarning"
Height="20"
@@ -51,5 +61,25 @@
</Image.ToolTip>
</Image>
</StackPanel>
<Popup
x:Name="popup_promptbaustein_all"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False"
Width="600"
Height="400">
<Border BorderThickness="1" x:Name="border_promptbaustein_al">
</Border>
</Popup>
<Popup
x:Name="popup_promptbaustein_favoriten"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False">
<Border BorderThickness="1" x:Name="border_promptbaustein_favoriten">
</Border>
</Popup>
</Grid>
</UserControl>

View File

@@ -1,6 +1,14 @@
using BeWo.ViewModel.View.AI;
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.Mvvm;
using DevExpress.Pdf.Native.BouncyCastle.Asn1.BC;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -30,9 +38,18 @@ namespace BeWo.View.Controls.AI
/// </summary>
public partial class AiConversationButton : UserControl
{
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(AiConversationButtonState), typeof(AiConversationButton), new PropertyMetadata(AiConversationButtonState.Normal, OnStateChanged));
public static readonly DependencyProperty ActionTypeProperty =
DependencyProperty.Register("ActionType", typeof(AiActionType), typeof(AiConversationButton), new PropertyMetadata(AiActionType.ServiceRecord, OnActionTypeChanged));
public event RoutedEventHandler OpenAiWindowClick;
public event RoutedEventHandler OpenAiPromptClick;
public event EventHandler<AiPromptbausteinPromptVM> PromptAccepted;
public AiConversationButton()
{
InitializeComponent();
@@ -45,16 +62,15 @@ namespace BeWo.View.Controls.AI
get { return (AiConversationButtonState)GetValue(StateProperty); }
set { SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(AiConversationButtonState), typeof(AiConversationButton), new PropertyMetadata(AiConversationButtonState.Normal, OnStateChanged));
private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
public AiActionType ActionType
{
var control = (AiConversationButton)d;
control.UpdateState();
get { return (AiActionType)GetValue(ActionTypeProperty); }
set { SetValue(ActionTypeProperty, value); }
}
public ICommand AiPromptOpenAllCommand { get; set; }
public ICommand AiPromptOpenFavoriteCommand { get; set; }
public string Tooltip { get; set; }
public bool IsButtonEnabled { get; set; }
public bool IsButton2Enabled { get; set; }
@@ -62,6 +78,15 @@ namespace BeWo.View.Controls.AI
public bool IsButton2Visible { get; set; }
public bool IsWarningSignVisible { get; set; }
public void AiPromptOpenAll()
{
popup_promptbaustein_all.IsOpen = true;
}
public void AiPromptOpenFavorite()
{
popup_promptbaustein_favoriten.IsOpen = true;
}
private void UpdateState()
{
switch (State)
@@ -111,19 +136,55 @@ namespace BeWo.View.Controls.AI
btnOpenAi5.ToolTip = btnOpenAi4.ToolTip = ToolTip;
btnOpenAi4.IsEnabled = IsButtonEnabled;
btnOpenAi5.IsEnabled = IsButton2Enabled;
btnOpenAi4.Visibility = IsButtonVisible ? Visibility.Visible : Visibility.Collapsed;
btnOpenAi5.Visibility = IsButton2Visible ? Visibility.Visible : Visibility.Collapsed;
btnOpenAi4.Visibility = IsButtonVisible ? Visibility.Visible : Visibility.Collapsed;
btnOpenAi5.Visibility = IsButton2Visible ? Visibility.Visible : Visibility.Collapsed;
imgWarning.Visibility = IsWarningSignVisible ? Visibility.Visible : Visibility.Collapsed;
}
private static void OnActionTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (AiConversationButton)d;
var actionType = (AiActionType)e.NewValue;
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.GetAiPromptbausteinFolder(actionType), folders => control.InitPromptbausteine(actionType, folders));
}
private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (AiConversationButton)d;
control.UpdateState();
}
private void btnOpenAi4_Click(object sender, RoutedEventArgs e)
{
OpenAiWindowClick?.Invoke(this, e);
}
private void btnOpenAi5_Click(object sender, RoutedEventArgs e)
{
OpenAiPromptClick?.Invoke(this, e);
//OpenAiPromptClick?.Invoke(this, e);
AiPromptOpenAll();
}
private void btnOpenAi5_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
AiPromptOpenFavorite();
}
private void InitPromptbausteine(AiActionType actionType, List<AiPromptbausteinFolderDC> folders)
{
var viewmodel = new AiPromptbausteinSelectionComplexViewModel(actionType);
viewmodel.PromptAccepted += PromptAccepted;
viewmodel.InitVMList();
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, viewmodel.Folders);
viewmodel2.PromptAccepted += PromptAccepted;
viewmodel2.InitVMList();
var view2 = new AiPromptbausteinComplexSelectionView(viewmodel2);
view2.ReduceSelection();
view2.Padding = new Thickness(3);
view2.Background = FindResource("ObjectEditBackgroundBrush") as System.Windows.Media.Brush;
border_promptbaustein_favoriten.Child = view2;
AiPromptOpenAllCommand = new DelegateCommand(AiPromptOpenAll);
AiPromptOpenFavoriteCommand = new DelegateCommand(AiPromptOpenFavorite);
}
}
}

View File

@@ -37,6 +37,7 @@
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<GroupBox
x:Name="groupBox1"
Grid.Column="0"
HorizontalAlignment="Stretch"
Header="Ordner"
@@ -58,11 +59,13 @@
</TreeView>
</GroupBox>
<GridSplitter
x:Name="splitter"
Grid.Column="1"
Width="1"
HorizontalAlignment="Center"
Background="#878890" />
<GroupBox
x:Name="groupbox2"
Grid.Column="2"
Grid.ColumnSpan="2"
HorizontalAlignment="Stretch"

View File

@@ -31,7 +31,17 @@ namespace BeWo.View.Detail.AI
DataContext = ViewModel = viewModel;
Loaded += (s, e) => ViewModel.ReloadVMList();
Loaded += (s, e) => ViewModel.InitVMList();
}
public void ReduceSelection()
{
groupBox1.Visibility = Visibility.Collapsed;
splitter.Visibility = Visibility.Collapsed;
groupbox2.Header = "Favoriten";
Grid.SetColumn(groupbox2, 0);
Grid.SetColumnSpan(groupbox2, 3);
ViewModel.SelectedFolderId = 0;
}
private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)

View File

@@ -3324,9 +3324,12 @@
VerticalAlignment="Center"
Orientation="Horizontal">
<ai:AiConversationButton
OpenAiPromptClick="AiConversationButton_OpenAiPromptClick"
x:Name="ai_conversation_btn"
Margin="10,0,0,0"
ActionType="ServiceRecordConversation"
OpenAiWindowClick="AiConversationButton_OpenAiWindowClick"
State="{Binding AiConversationButtonState}" />
State="{Binding AiConversationButtonState}"
PromptAccepted="PromptAccepted"/>
</StackPanel>
<StackPanel
Grid.Column="2"

View File

@@ -5078,11 +5078,6 @@ namespace BeWo.View.Detail.Zeiterfassung
ComboBoxTreeViewControl.TreeViewSourceList = ViewModel.PrototypeVM.GoalTree;
}
private void AiConversationButton_OpenAiPromptClick(object sender, RoutedEventArgs e)
{
OpenAiChatPromptWindow();
}
private void AiConversationButton_OpenAiWindowClick(object sender, RoutedEventArgs e)
{
OpenAiWindow();
@@ -5105,15 +5100,6 @@ namespace BeWo.View.Detail.Zeiterfassung
MainControl.WindowService.ShowAiConversationWindow(getAiConversationChatViewModel());
}
private void OpenAiChatPromptWindow()
{
var vm_chat = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordConversation);
vm_chat.PromptAccepted += PromptAccepted;
MainControl.WindowService.Show(vm_chat);
}
private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
{
if (prompt is null)

View File

@@ -16,6 +16,8 @@ namespace BeWo.ViewModel.View.AI
{
public class AiPromptbausteinSelectionComplexViewModel : DialogViewModel
{
public event EventHandler<AiPromptbausteinPromptVM> PromptAccepted;
private AiPromptbausteinFolderVM _SelectedFolder;
public AiPromptbausteinSelectionComplexViewModel()
@@ -27,18 +29,17 @@ namespace BeWo.ViewModel.View.AI
Folders = new AiPromptbausteinFolderListVM();
}
}
public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType) : this()
{
AiActionType = aiActionType;
}
public AiPromptbausteinSelectionComplexViewModel(AiActionType aiActionType, AiPromptbausteinFolderListVM viewModel) : this(aiActionType)
{
LoadedActionType = aiActionType;
Folders = viewModel;
}
public event EventHandler<AiPromptbausteinPromptVM> PromptAccepted;
public ICommand SendCommand { get; set; }
public AiActionType AiActionType { get; set; }
@@ -49,12 +50,17 @@ namespace BeWo.ViewModel.View.AI
{
_SelectedFolder = value;
FirePropertyChanged(nameof(SelectedFolder));
if (value is null)
SelectedFolderId = null;
else
SelectedFolderId = Folders.VMList.IndexOf(value);
}
}
public AiPromptbausteinPromptVM SelectedPrompt { get; set; }
public AiPromptbausteinFolderListVM Folders { get; private set; }
public ICommand SendCommand { get; set; }
public AiActionType LoadedActionType { get; set; }
public int? SelectedFolderId { get; set; }
public void Send()
{
@@ -62,21 +68,32 @@ namespace BeWo.ViewModel.View.AI
PromptAccepted?.Invoke(this, SelectedPrompt);
}
public bool CanSend()
{
return SelectedPrompt is object;
}
public void InitVMList()
{
if (Folders is object && LoadedActionType == AiActionType)
return;
LoadedActionType = AiActionType;
VMFactory.CreateAiPromptbausteinFolderListVMAsync(AiActionType, UpdateVMList);
}
public void ReloadVMList()
{
VMFactory.CreateAiPromptbausteinFolderListVMAsync(AiActionType, UpdateVMList);
}
private void UpdateVMList(AiPromptbausteinFolderListVM new_list)
{
Folders = new_list;
FirePropertyChanged(nameof(Folders));
if(SelectedFolderId is int folder_id)
{
SelectedFolder = Folders.VMList[folder_id];
}
}
}
}