Nutzerfreundlichere Interaktion

This commit is contained in:
2026-06-05 14:56:49 +02:00
parent 1b0085f67b
commit f2930dc75f
23 changed files with 382 additions and 328 deletions

View File

@@ -23,6 +23,10 @@ namespace BeWo.ViewModel
private AiPromptbausteinFolderListVM _SubFolders;
private AiPromptbausteinPromptListVM _SubPrompts;
private AiPromptbausteinRoutineListVM _SubRoutines;
private bool _CanAddFolder;
private bool _CanAddPrompt;
private bool _CanAddRoutine;
private bool _CanEdit;
public AiPromptbausteinFolderVM(AiPromptbausteinFolderDC dc) : base(dc, dc.Oid)
{
@@ -82,6 +86,27 @@ namespace BeWo.ViewModel
set => SetProperty(ref _ActionType, value, nameof(ActionType), () => DataContract.ActionType);
}
public bool CanAddFolder
{
get => _CanAddFolder;
set => SetProperty(ref _CanAddFolder, value, nameof(CanAddFolder));
}
public bool CanAddPrompt
{
get => _CanAddPrompt;
set => SetProperty(ref _CanAddPrompt, value, nameof(CanAddPrompt));
}
public bool CanAddRoutine
{
get => _CanAddRoutine;
set => SetProperty(ref _CanAddRoutine, value, nameof(CanAddRoutine));
}
public bool CanEdit
{
get => _CanEdit;
set => SetProperty(ref _CanEdit, value && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModulePromptbausteineEdit), nameof(CanEdit));
}
public AiPromptbausteinFolderListVM SubFolders
{
get => _SubFolders;
@@ -194,27 +219,6 @@ namespace BeWo.ViewModel
}
}
public bool CanAddFolder
{
get => DataContract.CanAddFolder;
set => DataContract.CanAddFolder = value;
}
public bool CanAddPrompt
{
get => DataContract.CanAddPrompt;
set => DataContract.CanAddPrompt = value;
}
public bool CanAddRoutine
{
get => DataContract.CanAddRoutine;
set => DataContract.CanAddRoutine = value;
}
public bool CanEdit
{
get => DataContract.CanEdit && BeWoApp.HasLoggedOnUserRight(UserRightType.AiModulePromptbausteineEdit);
set => DataContract.CanEdit = value;
}
public bool IsNewFeature
{
get => DataContract.IsNewFeature;
@@ -274,6 +278,10 @@ namespace BeWo.ViewModel
_Position = pDataContract.Position;
_IsExpanded = pDataContract.IsExpanded;
_ActionType = pDataContract.ActionType;
_CanAddFolder = pDataContract.CanAddFolder;
_CanAddPrompt = pDataContract.CanAddPrompt;
_CanAddRoutine = pDataContract.CanAddRoutine;
_CanEdit = pDataContract.CanEdit;
SubFolders = new AiPromptbausteinFolderListVM(pDataContract.SubFolders, this);
SubPrompts = new AiPromptbausteinPromptListVM(pDataContract.SubPrompts);
SubRoutines = new AiPromptbausteinRoutineListVM(pDataContract.SubRoutines);

View File

@@ -155,7 +155,7 @@ namespace BeWo.ViewModel.View.AI
{
var selected_prompt = SelectedItem;
CloseDialogCommand.Execute(null);
Close();
ItemAccepted?.Invoke(this, selected_prompt);
}
@@ -236,12 +236,9 @@ namespace BeWo.ViewModel.View.AI
var vm = new AiPromptbausteinFolderViewModel(new_vm, true);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var new_dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinFolder(new_dc),
(new_dcs) => ReloadVMList());
ReloadVMList();
};
Close();
@@ -259,12 +256,9 @@ namespace BeWo.ViewModel.View.AI
var vm = new AiPromptbausteinFolderViewModel(edit_vm, false);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinFolder(edit_dc),
(update_dc) => ReloadVMList());
ReloadVMList();
};
Close();
@@ -303,19 +297,11 @@ namespace BeWo.ViewModel.View.AI
new_vm.CanEdit = true;
new_vm.ActionType = AiActionType;
var vm = new AiPromptbausteinPromptViewModel(new_vm, true);
var vm = new AiPromptbausteinPromptViewModel(new_vm);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, e) =>
{
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinPrompt(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedItem = new_vm;
});
ReloadVMList();
};
Close();
@@ -335,17 +321,11 @@ namespace BeWo.ViewModel.View.AI
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinPromptVM(sel_dc);
var vm = new AiPromptbausteinPromptViewModel(edit_vm, false);
var vm = new AiPromptbausteinPromptViewModel(edit_vm);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(edit_dc),
new_dc =>
{
ReloadVMList();
});
ReloadVMList();
};
Close();
@@ -458,17 +438,11 @@ namespace BeWo.ViewModel.View.AI
new_vm.CanEdit = true;
new_vm.ActionType = AiActionType;
var vm = new AiPromptbausteinRoutineViewModel(new_vm, Folders, true);
var vm = new AiPromptbausteinRoutineViewModel(new_vm, Folders);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, e) =>
{
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinRoutine(dc),
new_dc =>
{
ReloadVMList();
});
ReloadVMList();
};
Close();
@@ -488,17 +462,11 @@ namespace BeWo.ViewModel.View.AI
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinRoutineVM(sel_dc);
var vm = new AiPromptbausteinRoutineViewModel(edit_vm, Folders, false);
var vm = new AiPromptbausteinRoutineViewModel(edit_vm, Folders);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, e) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(edit_dc),
new_dc =>
{
ReloadVMList();
});
ReloadVMList();
};
Close();

View File

@@ -5,44 +5,69 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace BeWo.ViewModel.View
{
public class AcceptCancelDialogViewModel : DialogViewModel
public abstract class AcceptCancelDialogViewModel : DialogViewModel
{
public event EventHandler Accept_Button_Clicked;
public event EventHandler Cancel_Button_Clicked;
public DelegateCommand SaveCommand { get; set; }
public AcceptCancelDialogViewModel() : base()
protected AcceptCancelDialogViewModel() : base()
{
AcceptCommand = new DelegateCommand(Accept, canAccept, false);
CancelCommand = new DelegateCommand(Cancel, canCancel, false);
SaveCommand = new DelegateCommand(Save, canSave, false);
}
public DelegateCommand AcceptCommand { get; set; }
public DelegateCommand CancelCommand { get; set; }
public void Accept()
protected virtual void Save()
{
Accept_Button_Clicked?.Invoke(this, EventArgs.Empty);
throw new NotImplementedException();
}
protected virtual bool canSave()
{
return false;
}
}
public class AcceptCancelDialogViewModel<DCType, VMType> : AcceptCancelDialogViewModel where VMType : AbstractDCMapperVM<DCType> where DCType : new()
{
public event EventHandler<DCType> DataSaved;
public VMType ViewModel { get; set; }
public string AcceptButtonText => ViewModel.IsNew ? "Hinzufügen" : "Speichern";
public AcceptCancelDialogViewModel(VMType viewModel) : base()
{
ViewModel = viewModel;
ViewModel.PropertyChanged += (s, e) =>
{
SaveCommand.RaiseCanExecuteChanged();
};
}
protected void DataSave(DCType dCType)
{
DataSaved?.Invoke(this, dCType);
Close();
}
public void Cancel()
protected override void Close()
{
Cancel_Button_Clicked?.Invoke(this, EventArgs.Empty);
Close();
base.Close();
}
protected virtual bool canAccept()
protected override bool canSave()
{
return true;
return ViewModel.IsNew || ViewModel.IsDirty;
}
protected virtual bool canCancel()
protected virtual bool isDirty()
{
return true;
return false;
}
}
}

View File

@@ -173,17 +173,11 @@ namespace BeWo.ViewModel.View.Administration
var vm = new AiPromptbausteinFolderViewModel(new_vm, true);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinFolder(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubFolders.VMList.Add(new_vm);
sel_folder.IsExpanded = true;
});
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubFolders.VMList.Add(new_vm);
sel_folder.IsExpanded = true;
};
WindowService.Show(vm);
@@ -199,15 +193,9 @@ namespace BeWo.ViewModel.View.Administration
var vm = new AiPromptbausteinFolderViewModel(edit_vm, false);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinFolder(edit_dc),
new_dc =>
{
sel_folder.UpdateByDataContract(new_dc);
});
sel_folder.UpdateByDataContract(new_dc);
};
WindowService.Show(vm);
@@ -271,19 +259,13 @@ namespace BeWo.ViewModel.View.Administration
new_vm.CanEdit = true;
new_vm.ActionType = AiActionType;
var vm = new AiPromptbausteinPromptViewModel(new_vm, true);
var vm = new AiPromptbausteinPromptViewModel(new_vm);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinPrompt(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedItem = new_vm;
});
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubPrompts.VMList.Add(new_vm);
SelectedItem = new_vm;
};
WindowService.Show(vm);
@@ -301,18 +283,12 @@ namespace BeWo.ViewModel.View.Administration
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinPromptVM(sel_dc);
var vm = new AiPromptbausteinPromptViewModel(edit_vm, false);
var vm = new AiPromptbausteinPromptViewModel(edit_vm);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(edit_dc),
new_dc =>
{
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedPromptFavorite(sel_prompt);
});
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedPromptFavorite(sel_prompt);
};
WindowService.Show(vm);
@@ -471,19 +447,13 @@ namespace BeWo.ViewModel.View.Administration
new_vm.CanEdit = true;
new_vm.ActionType = AiActionType;
var vm = new AiPromptbausteinRoutineViewModel(new_vm, Folders, true);
var vm = new AiPromptbausteinRoutineViewModel(new_vm, Folders);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var dc = new_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinRoutine(dc),
new_dc =>
{
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubRoutines.VMList.Add(new_vm);
SelectedItem = new_vm;
});
new_vm.UpdateByDataContract(new_dc);
sel_folder.SubRoutines.VMList.Add(new_vm);
SelectedItem = new_vm;
};
WindowService.Show(vm);
@@ -501,18 +471,12 @@ namespace BeWo.ViewModel.View.Administration
sel_dc.Version = sel_prompt.DataContract.Version;
var edit_vm = new AiPromptbausteinRoutineVM(sel_dc);
var vm = new AiPromptbausteinRoutineViewModel(edit_vm, Folders, false);
var vm = new AiPromptbausteinRoutineViewModel(edit_vm, Folders);
vm.Accept_Button_Clicked += (s, e) =>
vm.DataSaved += (s, new_dc) =>
{
var edit_dc = edit_vm.CommitToDataContract();
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(edit_dc),
new_dc =>
{
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedRoutineFavorite(sel_prompt);
});
sel_prompt.UpdateByDataContract(new_dc);
UpdateSelectedRoutineFavorite(sel_prompt);
};
WindowService.Show(vm);

View File

@@ -1,4 +1,6 @@
using DevExpress.DataProcessing.InMemoryDataProcessor;
using BeWo.ServiceProxy;
using BS.Shared.DataContracts.Feature.AI;
using DevExpress.DataProcessing.InMemoryDataProcessor;
using DevExpress.Mvvm;
using DevExpress.Mvvm.POCO;
using DevExpress.XtraBars.Docking2010.Views.WindowsUI;
@@ -11,28 +13,30 @@ using System.Windows.Input;
namespace BeWo.ViewModel.View.Administration
{
public class AiPromptbausteinFolderViewModel : AcceptCancelDialogViewModel
public class AiPromptbausteinFolderViewModel : AcceptCancelDialogViewModel<AiPromptbausteinFolderDC, AiPromptbausteinFolderVM>
{
private readonly bool _IsNew;
public AiPromptbausteinFolderViewModel(AiPromptbausteinFolderVM viewModel, bool isNew) : base()
public AiPromptbausteinFolderViewModel(AiPromptbausteinFolderVM viewModel, bool isNew) : base(viewModel)
{
ViewModel = viewModel;
_IsNew = isNew;
ViewModel.PropertyChanged += (s, e) =>
{
AcceptCommand.RaiseCanExecuteChanged();
};
}
public AiPromptbausteinFolderVM ViewModel { get; set; }
public string AcceptButtonText => _IsNew ? "Hinzufügen" : "Speichern";
protected override bool canAccept()
protected override void Save()
{
return (_IsNew || ViewModel.IsDirty) && !string.IsNullOrWhiteSpace(ViewModel.Title);
var dc = ViewModel.CommitToDataContract();
if (ViewModel.IsNew)
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinFolder(dc), DataSave);
}
else
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinFolder(dc), DataSave);
}
}
protected override bool canSave()
{
return base.canSave() && !string.IsNullOrWhiteSpace(ViewModel.Title);
}
}
}

View File

@@ -1,4 +1,6 @@
using System;
using BeWo.ServiceProxy;
using BS.Shared.DataContracts.Feature.AI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,28 +8,32 @@ using System.Threading.Tasks;
namespace BeWo.ViewModel.View.Administration
{
public class AiPromptbausteinPromptViewModel : AcceptCancelDialogViewModel
public class AiPromptbausteinPromptViewModel : AcceptCancelDialogViewModel<AiPromptbausteinPromptDC, AiPromptbausteinPromptVM>
{
private readonly bool _IsNew;
public AiPromptbausteinPromptViewModel(AiPromptbausteinPromptVM viewModel, bool isNew) : base()
public AiPromptbausteinPromptViewModel(AiPromptbausteinPromptVM viewModel) : base(viewModel)
{
ViewModel = viewModel;
_IsNew = isNew;
ViewModel.PropertyChanged += (s, e) =>
{
AcceptCommand.RaiseCanExecuteChanged();
};
}
public AiPromptbausteinPromptVM ViewModel { get; private set; }
public string AcceptButtonText => _IsNew ? "Hinzufügen" : "Speichern";
protected override bool canAccept()
protected override bool canSave()
{
return (_IsNew || ViewModel.IsDirty) && !string.IsNullOrWhiteSpace(ViewModel.Title) && !string.IsNullOrWhiteSpace(ViewModel.Prompt);
return base.canSave() && !string.IsNullOrWhiteSpace(ViewModel.Title) && !string.IsNullOrWhiteSpace(ViewModel.Prompt);
}
protected override void Save()
{
var dc = ViewModel.CommitToDataContract();
if (ViewModel.IsNew)
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinPrompt(dc),
DataSave);
}
else
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinPrompt(dc),
DataSave);
}
}
}
}

View File

@@ -1,4 +1,6 @@
using BeWo.ViewModel.ListViewModel;
using BeWo.ServiceProxy;
using BeWo.ViewModel.ListViewModel;
using BS.Shared.DataContracts.Feature.AI;
using DevExpress.Mvvm;
using System;
using System.Collections.Generic;
@@ -10,13 +12,12 @@ using System.Windows.Input;
namespace BeWo.ViewModel.View.Administration
{
public class AiPromptbausteinRoutineViewModel : AcceptCancelDialogViewModel
public class AiPromptbausteinRoutineViewModel : AcceptCancelDialogViewModel<AiPromptbausteinRoutineDC, AiPromptbausteinRoutineVM>
{
private readonly bool _IsNew;
public AiPromptbausteinRoutineStepVM _SelectedStep;
public AiPromptbausteinFolderListVM FolderListVM { get; set; }
public AiPromptbausteinRoutineVM ViewModel { get; private set; }
public ICommand DeleteStepCommand { get; private set; }
public ICommand MoveStepUpCommand { get; private set; }
@@ -28,22 +29,13 @@ namespace BeWo.ViewModel.View.Administration
set => SetProperty(ref _SelectedStep, value, nameof(SelectedStep));
}
public string AcceptButtonText => _IsNew ? "Hinzufügen" : "Speichern";
public AiPromptbausteinRoutineViewModel(AiPromptbausteinRoutineVM viewModel, AiPromptbausteinFolderListVM folders, bool isNew) : base()
public AiPromptbausteinRoutineViewModel(AiPromptbausteinRoutineVM viewModel, AiPromptbausteinFolderListVM folders) : base(viewModel)
{
ViewModel = viewModel;
FolderListVM = folders;
_IsNew = isNew;
ViewModel.PropertyChanged += (s, e) =>
{
AcceptCommand.RaiseCanExecuteChanged();
};
ViewModel.Steps.VMList.ListChanged += (s, e) =>
{
AcceptCommand.RaiseCanExecuteChanged();
SaveCommand.RaiseCanExecuteChanged();
};
DeleteStepCommand = new DelegateCommand<AiPromptbausteinRoutineStepVM>(DeleteStep, canDeleteStep);
@@ -81,9 +73,25 @@ namespace BeWo.ViewModel.View.Administration
return step is object && ViewModel.Steps.Count > 1 && ViewModel.Steps.VMList.Last() != step;
}
protected override bool canAccept()
protected override bool canSave()
{
return (_IsNew || ViewModel.IsDirty) && !string.IsNullOrWhiteSpace(ViewModel.Title) && (ViewModel.Steps?.VMList.Any() ?? false);
return base.canSave() && !string.IsNullOrWhiteSpace(ViewModel.Title) && (ViewModel.Steps?.VMList.Any() ?? false);
}
protected override void Save()
{
var dc = ViewModel.CommitToDataContract();
if (ViewModel.IsNew)
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.InsertAiPromptbausteinRoutine(dc),
DataSave);
}
else
{
ServiceFacade.DoAiEnhancedServiceAsnyc(x => x.UpdateAiPromptbausteinRoutine(dc),
DataSave);
}
}
private void swap(AiPromptbausteinRoutineStepVM step_x, int offset_y)

View File

@@ -10,18 +10,16 @@ namespace BeWo.ViewModel.View
{
public class DialogViewModel : WindowViewModel
{
public event EventHandler RequestClose;
public event EventHandler RequestCloseFinal;
public DialogViewModel() : base()
{
CloseDialogCommand = new DelegateCommand(Close);
}
public ICommand CloseDialogCommand { get; set; }
protected void Close()
protected virtual void Close()
{
RequestClose?.Invoke(this, EventArgs.Empty);
RequestCloseFinal?.Invoke(this, EventArgs.Empty);
}
}
}