Ansatz 1. Wenn das nix wird, esse ich einen Besen
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
18
BeWo/Core/EventArg/TextAcceptedEventArgs.cs
Normal file
18
BeWo/Core/EventArg/TextAcceptedEventArgs.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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">
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" />
|
||||
|
||||
79
BeWo/View/Controls/AI/AiChatButton.xaml
Normal file
79
BeWo/View/Controls/AI/AiChatButton.xaml
Normal 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>
|
||||
99
BeWo/View/Controls/AI/AiChatButton.xaml.cs
Normal file
99
BeWo/View/Controls/AI/AiChatButton.xaml.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
20
BeWo/View/Detail/AI/AiPromptbausteinChatResultView.xaml
Normal file
20
BeWo/View/Detail/AI/AiPromptbausteinChatResultView.xaml
Normal 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>
|
||||
28
BeWo/View/Detail/AI/AiPromptbausteinChatResultView.xaml.cs
Normal file
28
BeWo/View/Detail/AI/AiPromptbausteinChatResultView.xaml.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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>();
|
||||
|
||||
66
BeWo/ViewModel/Controls/AI/AiChatButtonViewModel.cs
Normal file
66
BeWo/ViewModel/Controls/AI/AiChatButtonViewModel.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
110
BeWo/ViewModel/Controls/AI/AiChatButtonWithHistoryViewModel.cs
Normal file
110
BeWo/ViewModel/Controls/AI/AiChatButtonWithHistoryViewModel.cs
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using BS.Shared.DataContracts.Compact;
|
||||
using BS.Shared.DataContracts.Feature.AI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user