Promptauswahl + Undo/Redo in EditVM

This commit is contained in:
2026-01-19 11:02:35 +01:00
parent b5eee2c495
commit cc7df8a8ac
4 changed files with 205 additions and 3 deletions

View File

@@ -16,6 +16,7 @@
xmlns:uc="clr-namespace:BeWo.Controls;assembly=BeWo.Controls"
xmlns:val="clr-namespace:BeWo.Validation"
xmlns:zeit="clr-namespace:BeWo.View.Detail.Zeiterfassung"
x:Name="root"
Width="Auto"
Height="Auto"
HorizontalAlignment="Stretch"
@@ -1466,6 +1467,7 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
@@ -1502,9 +1504,45 @@
Content="Textbausteine"
IsTabStop="False" />
<StackPanel
x:Name="stackpanel_ai"
Grid.Row="1"
Grid.ColumnSpan="2"
HorizontalAlignment="Right"
Orientation="Horizontal"
DataContext="">
<StackPanel.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\..\..\Styles\ModernOrangeBlack.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</StackPanel.Resources>
<Button
x:Name="btn_AiPromptbausteinUndo"
Padding="0"
Command="{Binding UndoEditAiActionCommand}"
Style="{StaticResource ButtonPreviousStyle}"
Visibility="{Binding IsEditUndoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<Button
x:Name="btn_AiPromptbausteinRedo"
Padding="0"
Command="{Binding RedoEditAiActionCommand}"
Style="{StaticResource ButtonRedoStyle}"
Visibility="{Binding IsEditRedoButtonVisible, Converter={StaticResource BoolVisibilityHiddenConverter}}" />
<Button
x:Name="btn_AiPromptbaustein"
Padding="0"
Command="{Binding OpenEditAiPromptSelectionCommand}"
Content="{StaticResource AiDesignsIconKIFunktionWeissGruen}"
Style="{StaticResource PrimaryButton}" />
</StackPanel>
<TextBox
x:Name="TextboxNotice"
Grid.Row="1"
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="2"
VerticalAlignment="Stretch"

View File

@@ -233,7 +233,9 @@ namespace BeWo.View.Detail.Zeiterfassung
{
_TextModuleButtonList.DoForEach(button => button.Visibility = Visibility.Collapsed);
}
}
stackpanel_ai.DataContext = ViewModel;
}
private static void CheckRecursive(List<SupportConceptGoalDC> goalTree, bool wert)
{

View File

@@ -2202,6 +2202,8 @@ namespace BeWo.View.Detail.Zeiterfassung
var sr = new ServiceRecordVM(record, ViewModel.PrototypeVM.Category2Services,
selectedRecord.AllGoalCategories, allgoalsCopy);
ViewModel.EditVM = sr;
Edit(sr);
}
}

View File

@@ -104,6 +104,13 @@ namespace BeWo.ViewModel.ListViewModel
public ICommand UndoAiActionCommand { get; set; }
public ICommand RedoAiActionCommand { get; set; }
private List<string> _EditAiActionHistory;
private int _EditAiActionHistoryIndex;
public ICommand OpenEditAiPromptSelectionCommand { get; set; }
public ICommand UndoEditAiActionCommand { get; set; }
public ICommand RedoEditAiActionCommand { get; set; }
public IList<ServiceRecordVM> VisibleSerivceRecords { get; set; }
public ServiceRecordListVM(
@@ -186,6 +193,21 @@ namespace BeWo.ViewModel.ListViewModel
UndoAiActionCommand = new DelegateCommand(UndoAiAction);
RedoAiActionCommand = new DelegateCommand(RedoAiAction);
var vm_edit_doku = new AiPromptbausteinSelectionComplexViewModel(AiActionType.ServiceRecordDocumentation);
vm_edit_doku.PromptAccepted += EditPromptAccepted;
OpenEditAiPromptSelectionCommand = new DelegateCommand(() =>
{
_EditAiActionHistory = new List<string>();
_EditAiActionHistory.Add(AktuellerEditDokutext);
_EditAiActionHistoryIndex = 0;
BeWoApp.MainControl.WindowService.Show(vm_edit_doku);
}, () => !string.IsNullOrWhiteSpace(AktuellerEditDokutext));
UndoEditAiActionCommand = new DelegateCommand(UndoEditAiAction);
RedoEditAiActionCommand = new DelegateCommand(RedoEditAiAction);
_AiActionHistory = new List<string>();
_AiActionHistory.Add(AktuellerDokutext);
_AiActionHistoryIndex = 0;
@@ -202,11 +224,24 @@ namespace BeWo.ViewModel.ListViewModel
FirePropertyChanged(nameof(IsUndoButtonVisible));
}
}
public string AktuellerEditDokutext
{
get => EditVM.Notice;
set
{
EditVM.Notice = value;
FirePropertyChanged(nameof(IsEditUndoButtonVisible));
FirePropertyChanged(nameof(IsEditRedoButtonVisible));
}
}
public bool IsAiButtonVisible => SelectedCustomerNode is object;
public bool IsUndoButtonVisible => _AiActionHistoryIndex > 0;
public bool IsRedoButtonVisible => _AiActionHistoryIndex < _AiActionHistory.Count - 1;
public bool IsEditUndoButtonVisible => _AiActionHistoryIndex > 0;
public bool IsEditRedoButtonVisible => _AiActionHistoryIndex < _AiActionHistory.Count - 1;
private void PromptAccepted(object sender, AiPromptbausteinPromptVM prompt)
{
if (prompt is null)
@@ -271,7 +306,7 @@ namespace BeWo.ViewModel.ListViewModel
_AiActionHistory.RemoveRange(idx + 1, count - idx - 1);
}
if(AktuellerDokutext != _AiActionHistory[_AiActionHistoryIndex])
if (AktuellerDokutext != _AiActionHistory[_AiActionHistoryIndex])
{
_AiActionHistory.Add(AktuellerDokutext);
_AiActionHistoryIndex++;
@@ -314,6 +349,113 @@ namespace BeWo.ViewModel.ListViewModel
);
}
private void EditPromptAccepted(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 Hilfeplan
var support_concept = SelectedCustomerNode.SupportConceptTreeNodeDC.SupportConcept;
var support_concept_oid = support_concept.SupportConceptOid;
var support_concept_version = support_concept.SupportConceptVersion;
// 1.3 Aktuelles Doku Feld
var doku_feld = AktuellerEditDokutext;
// 1.4 Sichtbaren Zeiterfassungseinträge
var service_records = CurrentVisibleVMs;
var sr_refs = service_records.Select(x => new BeWoRefDC(x.DataContract.ServiceRecordOid.Value, x.DataContract.ServiceRecordVersion));
// 1.5 Costbearer
var costbearer = SelectedCustomerNode.SupportConceptTreeNodeDC.CostBearer;
var cb_oid = costbearer.CostBearerOid.Value;
var cb_ver = costbearer.CostBearerVersion;
// Service Aufruf
var req = new AiFunctionDocRequest()
{
AiPromptbausteinPrompt = new BeWoRefDC(prompt_oid, prompt_version),
SupportConcept = new BeWoRefDC(support_concept_oid, support_concept_version),
ServiceRecords = sr_refs,
CostBearer = new BeWoRefDC(cb_oid, cb_ver),
Dokumentation = doku_feld,
};
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.ExecuteAiFunctionServiceRecordDocumentation(req),
callback =>
{
var viewModel = new AiPromptbausteinActionResultViewModel();
viewModel.Result = callback.Result;
viewModel.Accept_Button_Clicked += (s, e) =>
{
var sb = new StringBuilder();
sb.AppendLine("AI Antwort:");
sb.AppendLine(viewModel.Result);
sb.AppendLine();
sb.AppendLine("Original:");
sb.AppendLine(AktuellerEditDokutext);
var str = sb.ToString();
var idx = _EditAiActionHistoryIndex;
var count = _EditAiActionHistory.Count;
if (count - 1 > idx)
{
_EditAiActionHistory.RemoveRange(idx + 1, count - idx - 1);
}
if (AktuellerEditDokutext != _EditAiActionHistory[_EditAiActionHistoryIndex])
{
_EditAiActionHistory.Add(AktuellerEditDokutext);
_EditAiActionHistoryIndex++;
}
_EditAiActionHistory.Add(str);
_EditAiActionHistoryIndex++;
AktuellerEditDokutext = str;
};
viewModel.Replace_Button_Clicked += (s, e) =>
{
var str = viewModel.Result;
var idx = _EditAiActionHistoryIndex;
var count = _EditAiActionHistory.Count;
if (count - 1 > idx)
{
_EditAiActionHistory.RemoveRange(idx + 1, count - idx - 1);
}
if (AktuellerEditDokutext != _EditAiActionHistory[_EditAiActionHistoryIndex])
{
_EditAiActionHistory.Add(AktuellerEditDokutext);
_EditAiActionHistoryIndex++;
}
_EditAiActionHistory.Add(str);
_EditAiActionHistoryIndex++;
AktuellerEditDokutext = str;
};
viewModel.Retry_Button_Clicked += (s, e) =>
{
PromptAccepted(sender, prompt);
};
BeWoApp.MainControl.WindowService.Show(viewModel);
}
);
}
public Dictionary<TableID, long[]> GetVisibleInformationReferences(IEnumerable<ServiceRecordVM> selected_records)
{
var current = SelectedCustomerNode;
@@ -768,6 +910,24 @@ namespace BeWo.ViewModel.ListViewModel
_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()
{