Ansatz 1. Wenn das nix wird, esse ich einen Besen

This commit is contained in:
2026-05-21 13:49:57 +02:00
parent a0f2d40c25
commit 709937eee3
23 changed files with 518 additions and 157 deletions

View File

@@ -21,8 +21,6 @@ using BeWo.ViewModel.View.AI;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.DataContracts.Feature.AI.Functions.ServiceRecords;
using BS.Shared.Extensions;
using BS.Shared.Translation;
using DevExpress.Mvvm;

View File

@@ -120,6 +120,7 @@
<Compile Include="Converter\StringEmptyBoolConverter.cs" />
<Compile Include="Core\BeWoAppVersion.cs" />
<Compile Include="Core\Commands\CommandFactory.cs" />
<Compile Include="Core\EventArg\TextAcceptedEventArgs.cs" />
<Compile Include="Scheduling\View\AbsenceTimesCreationView.xaml.cs">
<DependentUpon>AbsenceTimesCreationView.xaml</DependentUpon>
</Compile>
@@ -147,6 +148,8 @@
<Compile Include="Styles\DataTemplates\DataTemplates.xaml.cs">
<DependentUpon>DataTemplates.xaml</DependentUpon>
</Compile>
<Compile Include="ViewModel\Controls\AI\AiChatButtonViewModel.cs" />
<Compile Include="ViewModel\Controls\AI\AiChatButtonWithHistoryViewModel.cs" />
<Compile Include="ViewModel\TeamFolderRightVM.cs" />
<Compile Include="ViewModel\AddressVM.cs" />
<Compile Include="ViewModel\AiConfigVM.cs" />
@@ -168,6 +171,7 @@
<Compile Include="ViewModel\View\Administration\AiPromptbausteinRoutineViewModel.cs" />
<Compile Include="ViewModel\View\AI\AiConversationChatViewModel.cs" />
<Compile Include="ViewModel\View\AI\AiPromptbausteinActionResultViewModel.cs" />
<Compile Include="ViewModel\View\AI\AiPromptbausteinChatResultViewModel.cs" />
<Compile Include="ViewModel\View\AI\AiPromptbausteinComplexSelectionViewModel.cs" />
<Compile Include="ViewModel\View\DialogViewModel.cs" />
<Compile Include="ViewModel\View\Gkv\GkvAbrechnungDialogViewModel.cs" />
@@ -175,12 +179,18 @@
<Compile Include="View\Controls\AI\AiConversationButton.xaml.cs">
<DependentUpon>AiConversationButton.xaml</DependentUpon>
</Compile>
<Compile Include="View\Controls\AI\AiChatButton.xaml.cs">
<DependentUpon>AiChatButton.xaml</DependentUpon>
</Compile>
<Compile Include="View\Controls\AI\AiPromptbausteinButton.xaml.cs">
<DependentUpon>AiPromptbausteinButton.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\AI\AiPromptbausteinActionResultView.xaml.cs">
<DependentUpon>AiPromptbausteinActionResultView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\AI\AiPromptbausteinChatResultView.xaml.cs">
<DependentUpon>AiPromptbausteinChatResultView.xaml</DependentUpon>
</Compile>
<Compile Include="View\Detail\AI\AiPromptbausteinComplexSelectionFavoritenView.xaml.cs">
<DependentUpon>AiPromptbausteinComplexSelectionFavoritenView.xaml</DependentUpon>
</Compile>
@@ -300,6 +310,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Controls\AI\AiChatButton.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Controls\AI\AiPromptbausteinButton.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@@ -308,6 +322,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Detail\AI\AiPromptbausteinChatResultView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="View\Detail\AI\AiPromptbausteinComplexSelectionFavoritenView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.Core.EventArg
{
public class TextAcceptedEventArgs : EventArgs
{
public string Text { get; }
public TextAcceptedEventArgs(string text)
{
Text = text;
}
}
}

View File

@@ -39,8 +39,8 @@
BorderThickness="0"
Cursor="Arrow"
Focusable="False"
FontWeight="{Binding FontWeight}"
FontSize="12"
FontWeight="{Binding FontWeight}"
IsReadOnly="True"
Text="{Binding Path=Title, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"
ToolTipService.ShowDuration="100000">

View File

@@ -148,7 +148,7 @@
<!-- Assistent Message Control -->
<DataTemplate x:Key="AssistentMessageTemplate">
<Grid Margin="0,0,30,0" HorizontalAlignment="Left">
<Grid Margin="0,0,60,0" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
@@ -174,7 +174,7 @@
BorderBrush="Black"
BorderThickness="0"
CornerRadius="0, 10, 10, 10">
<Grid Margin="4,0,0,4">
<Grid Margin="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
@@ -186,7 +186,7 @@
<TextBlock
Grid.Row="0"
Grid.ColumnSpan="2"
Margin="0,4,0,4"
Margin="0,0,0,4"
Padding="0"
VerticalAlignment="Center"
FontSize="12"
@@ -195,7 +195,7 @@
Style="{StaticResource TextBlockStyle}"
Text="{Binding DurationSec, StringFormat=Nachgedacht für {0} Sekunden}">
<TextBlock.ToolTip>
<Grid Margin="4,0,0,4">
<Grid Margin="0,4,0,4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
@@ -249,7 +249,7 @@
<DataTemplate x:Key="SystemMessageTemplate">
<Border
Width="auto"
Margin="30,0,30,0"
Margin="60,0,60,0"
HorizontalAlignment="Center"
Background="#DEFFFFFF"
BorderBrush="Black"
@@ -280,7 +280,7 @@
<DataTemplate x:Key="UserMessageTemplate">
<Border
Width="auto"
Margin="30,0,0,0"
Margin="60,0,0,0"
HorizontalAlignment="Right"
Background="#DEFFFFFF"
BorderBrush="Black"

View File

@@ -22,7 +22,7 @@
<ResourceDictionary Source="Designs\AI\Icon_Refresh_Schw+Orange.xaml" />
<ResourceDictionary Source="Designs\AI\Icon_Refresh_Weiss.xaml" />
<ResourceDictionary Source="Designs\AI\Icon_Refresh_Weiss+Orange.xaml" />
<ResourceDictionary Source="Designs\GeometryCollection.xaml" />
<ResourceDictionary Source="Colors\Colors.xaml" />

View File

@@ -0,0 +1,79 @@
<UserControl
x:Class="BeWo.View.Controls.AI.AiChatButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
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.ViewModel.Controls.AI" xmlns:i="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" d:DataContext="{d:DesignInstance Type=ai:AiChatButtonViewModel}"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\..\..\Styles\ModernOrangeBlack.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<StackPanel
Margin="0"
VerticalAlignment="Center"
Orientation="Horizontal">
<Button
x:Name="btnOpenAi4"
Height="30"
Margin="0"
Background="Transparent"
Content="{StaticResource AiDesignsIconKIChatWeissOrange}"
ToolTip="KI Chat öffnen"
ToolTipService.ShowOnDisabled="True" >
<Button.InputBindings>
<MouseBinding Command="{Binding OpenConversationPopupCommand}" Gesture="LeftClick"/>
</Button.InputBindings>
</Button>
<Button
x:Name="btnOpenAi5"
Height="30"
Margin="10,0,0,0"
Background="Transparent"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
ToolTip="KI Chat mit Prompt-Baustein starten"
ToolTipService.ShowOnDisabled="True"
MouseRightButtonUp="btnOpenAi5_MouseRightButtonUp">
<Button.InputBindings>
<MouseBinding Command="{Binding OpenAllPromptsPopupCommand}" Gesture="LeftClick" />
</Button.InputBindings>
</Button>
<Image
x:Name="imgWarning"
Height="20"
Margin="10,0,0,0"
Source="{Binding Source={x:Static draw:SystemIcons.Warning}, Converter={StaticResource IconToImageSourceConverter}, Mode=OneWay}"
Visibility="Visible">
<!-- Visibility="{Binding ElementName=btnOpenAi4, Path=Visibility}" -->
<Image.ToolTip>
Die aktuelle Ansicht beinhaltet zu viele Daten.
Es können keine neuen Chats zu dieser Ansicht erstellt werden.
</Image.ToolTip>
</Image>
</StackPanel>
<!--<Popup
x:Name="popup_promptbaustein_all"
Width="600"
Height="400"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False">
<Border x:Name="border_promptbaustein_al" BorderThickness="1" />
</Popup>-->
<Popup
x:Name="popup_promptbaustein_favoriten"
Placement="Top"
PlacementTarget="{Binding ElementName=btnOpenAi5}"
StaysOpen="False"
IsOpen="{Binding IsFavoritenOpen}">
<Border x:Name="border_promptbaustein_favoriten" BorderThickness="1" />
</Popup>
</Grid>
</UserControl>

View File

@@ -0,0 +1,99 @@
using BeWo.ServiceProxy;
using BeWo.View.Detail.AI;
using BeWo.ViewModel;
using BeWo.ViewModel.Controls.AI;
using BeWo.ViewModel.View.AI;
using BS.Shared;
using BS.Shared.DataContracts.Feature.AI;
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;
namespace BeWo.View.Controls.AI
{
/// <summary>
/// Interaktionslogik für AiGenericConversationButton.xaml
/// </summary>
public partial class AiChatButton : UserControl
{
public static readonly DependencyProperty ActionTypeProperty =
DependencyProperty.Register("ActionType", typeof(AiActionType), typeof(AiChatButton), new PropertyMetadata(AiActionType.ServiceRecord, OnActionTypeChanged));
public AiActionType ActionType
{
get { return (AiActionType)GetValue(ActionTypeProperty); }
set { SetValue(ActionTypeProperty, value); }
}
public AiChatButtonViewModel ViewModel => DataContext as AiChatButtonViewModel;
public AiChatButton()
{
InitializeComponent();
}
private static void OnActionTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = (AiChatButton)d;
var actionType = (AiActionType)e.NewValue;
if (BeWoApp.AppSettings.ShowAI && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModulePromptbausteineView))
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.GetAiPromptbausteinFolder(actionType), folders => control.InitPromptbausteine(actionType, folders));
}
}
public void AiPromptOpenAll()
{
//popup_promptbaustein_all.IsOpen = true;
//OpenAiPromptClick?.Invoke(this, e);
BeWoApp.MainControl.WindowService.Show(ViewModel.AllPromptsViewModel);
}
public void AiPromptOpenFavorite()
{
popup_promptbaustein_favoriten.IsOpen = true;
}
private void InitPromptbausteine(AiActionType actionType, List<AiPromptbausteinFolderDC> folders)
{
VMFactory.CreateAiPromptbausteinFolderListVM(folders, (listvm) =>
{
var viewmodel = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm);
viewmodel.ItemAccepted += ItemAccepted;
viewmodel.RequestClose += (s, e) => viewmodel.ResetSelection();
ViewModel.AllPromptsViewModel = viewmodel;
var viewmodel2 = new AiPromptbausteinSelectionComplexViewModel(actionType, listvm, true);
viewmodel2.ItemAccepted += ItemAccepted;
popup_promptbaustein_favoriten.Closed += (s, e) => viewmodel2.ResetSelection();
var view2 = new AiPromptbausteinComplexSelectionFavoritenView(viewmodel2);
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;
viewmodel.VMListReloaded += (s, e) => viewmodel2.ReloadVMList(false);
});
}
private void ItemAccepted(object sender, AbstractBaseVM e)
{
throw new NotImplementedException();
}
private void btnOpenAi5_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
ViewModel.OpenFavoritePromptsPopupCommand.Execute(null);
}
}
}

View File

@@ -70,9 +70,6 @@ namespace BeWo.View.Controls.AI
public AiPromptbausteinSelectionComplexViewModel AllPromptsViewModel { get; set; }
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; }
@@ -191,8 +188,8 @@ namespace BeWo.View.Controls.AI
viewmodel.VMListReloaded += (s, e) => viewmodel2.ReloadVMList(false);
AiPromptOpenAllCommand = new DelegateCommand(AiPromptOpenAll);
AiPromptOpenFavoriteCommand = new DelegateCommand(AiPromptOpenFavorite);
//AiPromptOpenAllCommand = new DelegateCommand(AiPromptOpenAll);
//AiPromptOpenFavoriteCommand = new DelegateCommand(AiPromptOpenFavorite);
});
}
}

View File

@@ -0,0 +1,20 @@
<UserControl x:Class="BeWo.View.Detail.AI.AiPromptbausteinChatResultView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BeWo.View.Detail.AI"
Background="{StaticResource ObjectEditBackgroundBrush}"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\..\..\Styles\ModernOrangeBlack.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,28 @@
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;
namespace BeWo.View.Detail.AI
{
/// <summary>
/// Interaktionslogik für AiPromptbausteinChatResultView.xaml
/// </summary>
public partial class AiPromptbausteinChatResultView : UserControl
{
public AiPromptbausteinChatResultView()
{
InitializeComponent();
}
}
}

View File

@@ -1707,7 +1707,7 @@
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</StackPanel.Resources>
<StackPanel
<!--<StackPanel
HorizontalAlignment="Right"
Orientation="Horizontal"
Visibility="{Binding IsAiDocuButtonVisible, Converter={StaticResource BoolVisibilityConverter}}">
@@ -1729,8 +1729,9 @@
Margin="3,0,0,0"
ActionType="ServiceRecordDocumentation"
CanExecute="{Binding PrototypeVM.Notice, Converter={StaticResource StringEmptyBoolConverter}}"
ItemAccepted="btn_AiPromptbaustein2_ItemAccepted" />
</StackPanel>
ItemAccepted="btn_AiPromptbaustein2_ItemAccepted" />-->
<ai:AiChatButton x:Name="btn_ai_docu" ActionType="ServiceRecordDocumentation" />
<!--</StackPanel>-->
<ai1:VoiceToTextButtonControl Margin="6,0,0,0" TargetTextBox="{Binding ElementName=dokumentationsTextBox}" />
@@ -3334,13 +3335,14 @@
Margin="0"
VerticalAlignment="Center"
Orientation="Horizontal">
<ai:AiConversationButton
<ai:AiChatButton x:Name="btn_ai_conv" ActionType="ServiceRecordConversation" />
<!--<ai:AiConversationButton
x:Name="ai_conversation_btn"
Margin="10,0,0,0"
ActionType="ServiceRecordConversation"
ItemAccepted="ItemAccepted"
OpenAiWindowClick="AiConversationButton_OpenAiWindowClick"
State="{Binding AiConversationButtonState}" />
State="{Binding AiConversationButtonState}" />-->
</StackPanel>
<StackPanel
Grid.Column="2"

View File

@@ -53,7 +53,6 @@ using DependencyObject = System.Windows.DependencyObject;
using BeWo.View.Windows;
using BeWo.Core.Commands;
using BeWo.ViewModel.View.AI;
using BS.Shared.DataContracts.Feature.AI.Functions.ServiceRecords;
using System.Text;
namespace BeWo.View.Detail.Zeiterfassung
@@ -347,6 +346,11 @@ namespace BeWo.View.Detail.Zeiterfassung
srGridControl.FilterChanged += SrGridControl_FilterChanged;
srGridControl.ItemsSourceChanged += SrGridControl_ItemsSourceChanged;
btn_ai_conv.DataContext = pViewModel.AiChatButtonConversationViewModel;
btn_ai_conv.ViewModel.GetAiConversationChatViewModel = () => getAiConversationChatViewModel();
btn_ai_docu.DataContext = pViewModel.AiChatButtonDocumentationViewModel;
}
public ICommand OpenAiWindowCommand { get; set; }
@@ -1189,9 +1193,9 @@ namespace BeWo.View.Detail.Zeiterfassung
serviceRecordEditView = new ServiceRecordEditView();
}
ViewModel.ResetEditAiAction();
ViewModel.AiChatButtonDocumentationEditViewModel.ClearHistory();
popup_content.Child = serviceRecordEditView;
popup_content.Child = serviceRecordEditView;
double height = MainControl.ActualHeight * 0.8;
double width = 810;
@@ -2257,7 +2261,7 @@ namespace BeWo.View.Detail.Zeiterfassung
ComboBoxTreeViewControl.TreeViewSourceList = ViewModel.PrototypeVM.GoalTree;
}
ViewModel.ResetAiAction();
ViewModel.AiChatButtonDocumentationViewModel.ClearHistory();
}
return lValid;
@@ -5078,11 +5082,6 @@ namespace BeWo.View.Detail.Zeiterfassung
ComboBoxTreeViewControl.TreeViewSourceList = ViewModel.PrototypeVM.GoalTree;
}
private void AiConversationButton_OpenAiWindowClick(object sender, RoutedEventArgs e)
{
OpenAiWindow();
}
private AiConversationChatViewModel getAiConversationChatViewModel()
{
var records = GetVisibleRecordVMs();
@@ -5100,28 +5099,6 @@ namespace BeWo.View.Detail.Zeiterfassung
MainControl.WindowService.ShowAiConversationWindow(getAiConversationChatViewModel());
}
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.2 Restliche Informationen
var vm = getAiConversationChatViewModel();
// 2 Validieren
// 3 Auswerten
vm.MessageInput = prompt.Prompt;
vm.SendAfterLoaded = true;
MainControl.WindowService.ShowAiConversationWindow(vm);
}
private IEnumerable<ServiceRecordVM> GetVisibleRecordVMs()
{
var list = new List<ServiceRecordVM>();

View File

@@ -0,0 +1,66 @@
using BeWo.ViewModel.View.AI;
using DevExpress.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.ViewModel.Controls.AI
{
public class AiChatButtonViewModel : AbstractBaseVM
{
private bool canExecute;
public bool IsFavoritenOpen { get; set; }
public List<AiMenuItemTemplate> AssistentCommands { get; protected set; }
public virtual bool IsHistoryEnabled => false;
public bool CanExecute
{
get => canExecute;
set => SetProperty(ref canExecute, value, nameof(CanExecute));
}
public Func<AiConversationChatViewModel> GetAiConversationChatViewModel { get; set; }
public AiPromptbausteinSelectionComplexViewModel AllPromptsViewModel { get; set; }
public DelegateCommand OpenConversationPopupCommand { get; protected set; }
public DelegateCommand OpenAllPromptsPopupCommand { get; protected set; }
public DelegateCommand OpenFavoritePromptsPopupCommand { get; protected set; }
public AiChatButtonViewModel()
{
canExecute = true;
OpenConversationPopupCommand = new DelegateCommand(OpenConversationPopup);
OpenAllPromptsPopupCommand = new DelegateCommand(OpenAllPromptsPopup);
OpenFavoritePromptsPopupCommand = new DelegateCommand(OpenFavoritePromptsPopup);
}
public void OpenConversationPopup()
{
BeWoApp.MainControl.WindowService.ShowAiConversationWindow(GetAiConversationChatViewModel());
}
public void OpenAllPromptsPopup()
{
BeWoApp.MainControl.WindowService.Show(AllPromptsViewModel);
}
public void OpenFavoritePromptsPopup()
{
IsFavoritenOpen = true;
FirePropertyChanged(nameof(IsFavoritenOpen));
}
}
public class AiMenuItemTemplate
{
public string Icon { get; set; }
public string Name { get; set; }
public DelegateCommand<AiConversationMessageVM> Command { get; set; }
}
}

View File

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BeWo.ViewModel.Controls.AI
{
public class AiChatButtonWithHistoryViewModel : AiChatButtonViewModel
{
private string currentValue;
public int CurrentIndex { get; set; }
public List<string> History { get; set; }
public string CurrentValue
{
get => currentValue;
set => SetProperty(ref currentValue, value, nameof(CurrentValue));
}
public bool IsUndoButtonVisible => CurrentIndex > 0;
public bool IsRedoButtonVisible => CurrentIndex < History.Count - 1;
public override bool IsHistoryEnabled => true;
public AiChatButtonWithHistoryViewModel() : base()
{
History = new List<string>();
CurrentIndex = 0;
AssistentCommands = new List<AiMenuItemTemplate>()
{
new AiMenuItemTemplate()
{
Command = new DevExpress.Mvvm.DelegateCommand<AiConversationMessageVM>(x => Accept1(x.Message)),
Icon = null,
Name = "Akzeptieren"
},
new AiMenuItemTemplate()
{
Command = new DevExpress.Mvvm.DelegateCommand<AiConversationMessageVM>(x => Accept2(x.Message)),
Icon = null,
Name = "Ersetzen"
},
};
}
public void ClearHistory()
{
History.Clear();
History.Add(CurrentValue);
CurrentIndex = 0;
FirePropertyChanged(nameof(IsRedoButtonVisible));
FirePropertyChanged(nameof(IsUndoButtonVisible));
}
public void Accept(string str)
{
var idx = CurrentIndex;
var count = History.Count;
var last_idx = count - 1;
if (last_idx > idx)
{
History.RemoveRange(idx + 1, last_idx - idx);
}
if (CurrentValue != History[CurrentIndex])
{
History.Add(CurrentValue);
CurrentIndex++;
}
History.Add(str);
CurrentIndex++;
CurrentValue = str;
}
public void UndoAiAction()
{
if (CurrentIndex <= 0)
return;
CurrentIndex--;
CurrentValue = History[CurrentIndex];
}
public void RedoAiAction()
{
if (CurrentIndex >= History.Count - 1)
return;
CurrentIndex++;
CurrentValue = History[CurrentIndex];
}
public void Accept1(string s)
{
}
public void Accept2(string s)
{
}
}
}

View File

@@ -14,6 +14,7 @@ using BeWo.Core.Commands;
using BeWo.Core.Service;
using BeWo.ServiceProxy;
using BeWo.View.Controls.AI;
using BeWo.ViewModel.Controls.AI;
using BeWo.ViewModel.View.AI;
using BS.Shared;
using BS.Shared.Core;
@@ -116,6 +117,10 @@ namespace BeWo.ViewModel.ListViewModel
public AiUserSettingVM AiUserSetting { get; set; }
public AiChatButtonViewModel AiChatButtonConversationViewModel { get; set; }
public AiChatButtonWithHistoryViewModel AiChatButtonDocumentationViewModel { get; set; }
public AiChatButtonWithHistoryViewModel AiChatButtonDocumentationEditViewModel { get; set; }
public ServiceRecordListVM(
Dictionary<ServiceCategoryDC, List<ServiceDescriptionDC>> pCategory2Services,
IEnumerable<ValueListEntryDC> pAllGoalCategories,
@@ -188,42 +193,20 @@ namespace BeWo.ViewModel.ListViewModel
private void InitAiStuff()
{
//var vm_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
AiChatButtonConversationViewModel = new AiChatButtonViewModel()
{
};
//vm_doku.PromptAccepted += PromptAccepted;
AiChatButtonDocumentationViewModel = new AiChatButtonWithHistoryViewModel()
{
//OpenAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(
// () => BeWoApp.MainControl.WindowService.Show(vm_doku),
// null,
// () => !string.IsNullOrWhiteSpace(AktuellerDokutext));
};
UndoAiActionCommand = new DelegateCommand(UndoAiAction);
RedoAiActionCommand = new DelegateCommand(RedoAiAction);
AiChatButtonDocumentationEditViewModel = new AiChatButtonWithHistoryViewModel()
{
//var vm_edit_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
//vm_edit_doku.PromptAccepted += EditPromptAccepted;
//OpenEditAiPromptSelectionCommand = CommandFactory.GetAiViewCommand(() =>
//{
// _EditAiActionHistory = new List<string>();
// _EditAiActionHistory.Add(AktuellerEditDokutext);
// _EditAiActionHistoryIndex = 0;
// BeWoApp.MainControl.WindowService.Show(vm_edit_doku);
//},
//null,
//() => !string.IsNullOrWhiteSpace(AktuellerEditDokutext));
UndoEditAiActionCommand = new DelegateCommand(UndoEditAiAction);
RedoEditAiActionCommand = new DelegateCommand(RedoEditAiAction);
_AiActionHistory = new List<string>();
_AiActionHistory.Add(AktuellerDokutext);
_AiActionHistoryIndex = 0;
_EditAiActionHistory = new List<string>();
_EditAiActionHistory.Add(AktuellerEditDokutext);
_EditAiActionHistoryIndex = 0;
};
}
private void InitAiTranscriptionStuff()
@@ -254,9 +237,9 @@ namespace BeWo.ViewModel.ListViewModel
set
{
PrototypeVM.Notice = value;
FirePropertyChanged(nameof(IsAiDocuButtonCanExecute));
FirePropertyChanged(nameof(IsRedoButtonVisible));
FirePropertyChanged(nameof(IsUndoButtonVisible));
//FirePropertyChanged(nameof(IsAiDocuButtonCanExecute));
//FirePropertyChanged(nameof(IsRedoButtonVisible));
//FirePropertyChanged(nameof(IsUndoButtonVisible));
}
}
public string AktuellerEditDokutext
@@ -265,8 +248,8 @@ namespace BeWo.ViewModel.ListViewModel
set
{
EditVM.Notice = value;
FirePropertyChanged(nameof(IsEditUndoButtonVisible));
FirePropertyChanged(nameof(IsEditRedoButtonVisible));
//FirePropertyChanged(nameof(IsEditUndoButtonVisible));
//FirePropertyChanged(nameof(IsEditRedoButtonVisible));
}
}
@@ -274,13 +257,8 @@ namespace BeWo.ViewModel.ListViewModel
public bool IsAiChatButtonVisible => SelectedCustomerNode is object && IsAiModuleEnabled && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleServiceRecordChat);
public bool IsAiDocuButtonVisible => SelectedCustomerNode is object && IsAiModuleEnabled && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModuleServiceRecordDocu);
public bool IsAiRowVisible => IsAiDocuButtonVisible || VoiceToTextButtonControl.HasRightToUseAIVoice;
public bool IsAiDocuButtonCanExecute => !string.IsNullOrWhiteSpace(AktuellerDokutext);
public bool IsUndoButtonVisible => _AiActionHistoryIndex > 0;
public bool IsRedoButtonVisible => _AiActionHistoryIndex < _AiActionHistory.Count - 1;
public bool IsEditUndoButtonVisible => _EditAiActionHistoryIndex > 0;
public bool IsEditRedoButtonVisible => _EditAiActionHistoryIndex < (_EditAiActionHistory?.Count ?? 0) - 1;
public void ItemAccepted(object sender, AbstractBaseVM item)
{
if(item is AiPromptbausteinRoutineVM)
@@ -526,25 +504,7 @@ namespace BeWo.ViewModel.ListViewModel
(exp) => AiConversationButtonState = AiConversationButtonState.Disabled);
}
}
public void ResetAiAction()
{
_AiActionHistory.Clear();
_AiActionHistory.Add(AktuellerDokutext);
_AiActionHistoryIndex = 0;
FirePropertyChanged(nameof(IsRedoButtonVisible));
FirePropertyChanged(nameof(IsUndoButtonVisible));
}
public void ResetEditAiAction()
{
_EditAiActionHistory.Clear();
_EditAiActionHistory.Add(AktuellerDokutext);
_EditAiActionHistoryIndex = 0;
FirePropertyChanged(nameof(IsEditRedoButtonVisible));
FirePropertyChanged(nameof(IsEditUndoButtonVisible));
}
public Dictionary<TableID, long[]> GetVisibleInformationReferences(IEnumerable<ServiceRecordVM> selected_records)
{
var current = SelectedCustomerNode;
@@ -982,42 +942,6 @@ namespace BeWo.ViewModel.ListViewModel
private DateTime? enddate;
public void UndoAiAction()
{
if (_AiActionHistoryIndex <= 0)
return;
_AiActionHistoryIndex--;
AktuellerDokutext = _AiActionHistory[_AiActionHistoryIndex];
}
public void RedoAiAction()
{
if (_AiActionHistoryIndex >= _AiActionHistory.Count - 1)
return;
_AiActionHistoryIndex++;
AktuellerDokutext = _AiActionHistory[_AiActionHistoryIndex];
}
public void UndoEditAiAction()
{
if (_EditAiActionHistoryIndex <= 0)
return;
_EditAiActionHistoryIndex--;
AktuellerEditDokutext = _EditAiActionHistory[_EditAiActionHistoryIndex];
}
public void RedoEditAiAction()
{
if (_EditAiActionHistoryIndex >= _EditAiActionHistory.Count - 1)
return;
_EditAiActionHistoryIndex++;
AktuellerEditDokutext = _EditAiActionHistory[_EditAiActionHistoryIndex];
}
public List<ServiceRecordVM> CreateFromPrototype()
{
var lResult = new List<ServiceRecordVM>();

View File

@@ -0,0 +1,31 @@
using BeWo.Core.EventArg;
using BS.Shared.Core;
using DevExpress.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace BeWo.ViewModel.View.AI
{
public class AiPromptbausteinChatResultViewModel : DialogViewModel
{
public AiPromptbausteinChatResultViewModel()
{
}
public string SelectedText => "Example";
public event EventHandler<TextAcceptedEventArgs> Accepted;
private void Accept_Click(object sender, RoutedEventArgs e)
{
Accepted?.Invoke(this,
new TextAcceptedEventArgs(SelectedText));
}
}
}

View File

@@ -4,7 +4,6 @@ using BeWo.ViewModel.ListViewModel;
using BeWo.ViewModel.View.Administration;
using BS.Shared;
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.Extensions.CustomInterfaces;
using DevExpress.Mvvm;
using DevExpress.Mvvm.POCO;

View File

@@ -4,7 +4,6 @@ using System.Collections.Generic;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.Feature.AI;
namespace BeWo.Data.Entities
{

View File

@@ -3,7 +3,6 @@ using BeWo.Data.Entities;
using BeWo.Service.Core;
using BeWo.Service.DCEntityMapper;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Feature.AI;
using System;
using System.Collections.Generic;
using System.Linq;

View File

@@ -3,7 +3,6 @@ using BeWo.Data.Entities;
using BeWo.Service.ServiceProxy;
using BeWo.Service.ServiceUtils;
using BS.Shared;
using BS.Shared.DataContracts.Feature.AI;
using BS.Shared.DataContracts.Feature.AI.Functions.ServiceRecords;
using DevExpress.DataAccess.Native.Web;
using RestSharp.Validation;

View File

@@ -1,5 +1,4 @@
using BS.Shared.DataContracts.Compact;
using BS.Shared.DataContracts.Feature.AI;
using System;
using System.Collections.Generic;
using System.Linq;

View File

@@ -1,5 +1,4 @@
using BS.Shared.DataContracts.Feature.AI;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;