diff --git a/BeWo/ViewModel/AbstractDCMapperVM.cs b/BeWo/ViewModel/AbstractDCMapperVM.cs index 53ab8ac78..9725648e0 100644 --- a/BeWo/ViewModel/AbstractDCMapperVM.cs +++ b/BeWo/ViewModel/AbstractDCMapperVM.cs @@ -6,7 +6,7 @@ namespace BeWo.ViewModel { public abstract class AbstractDCMapperVM : AbstractBaseVM where DCType : new() { - private readonly List _DirtyProps = new List(); + protected readonly List _DirtyProps = new List(); private bool? _IsNew; diff --git a/BeWo/ViewModel/AiPromptbausteinFolderVM.cs b/BeWo/ViewModel/AiPromptbausteinFolderVM.cs index b0cf2c7ad..15f9e0349 100644 --- a/BeWo/ViewModel/AiPromptbausteinFolderVM.cs +++ b/BeWo/ViewModel/AiPromptbausteinFolderVM.cs @@ -152,15 +152,30 @@ namespace BeWo.ViewModel { get { - if (SubPrompts?.VMList != null && SubPrompts.VMList.Count > 0) + if (TotalPromptCount > 0) { - return $"{Title} ({SubPrompts.Count})"; + return $"{Title} ({TotalPromptCount})"; } return Title; } } + public int TotalPromptCount + { + get + { + var total = SubPrompts.Count; + + foreach ( var folder in SubFolders.VMList) + { + total += folder.TotalPromptCount; + } + + return total; + } + } + protected override void InitByDataContract(AiPromptbausteinFolderDC pDataContract) { _Title = pDataContract.Title; diff --git a/BeWo/ViewModel/AiPromptbausteinPromptVM.cs b/BeWo/ViewModel/AiPromptbausteinPromptVM.cs index d93df0e65..184f7cb51 100644 --- a/BeWo/ViewModel/AiPromptbausteinPromptVM.cs +++ b/BeWo/ViewModel/AiPromptbausteinPromptVM.cs @@ -134,6 +134,11 @@ namespace BeWo.ViewModel protected override AiPromptbausteinPromptDC MapToDataContract(AiPromptbausteinPromptDC pDataContract, bool doCommit) { + pDataContract.IsFavorite = _IsFavorite; + + if (!CanEdit) + return pDataContract; + pDataContract.Title = _Title; pDataContract.Description = _Description; pDataContract.ParentFolderOid = _ParentFolderOid; @@ -145,7 +150,6 @@ namespace BeWo.ViewModel pDataContract.ShowPromptByTenant = _ShowPromptByTenant; pDataContract.IsOwnsoftPrompt = _IsOwnsoftPrompt; pDataContract.OwnsoftRefLink = _OwnsoftRefLink; - pDataContract.IsFavorite = _IsFavorite; return pDataContract; } @@ -165,5 +169,15 @@ namespace BeWo.ViewModel OwnsoftRefLink = pDataContract.OwnsoftRefLink; IsFavorite = pDataContract.IsFavorite; } + + public override bool IsDirty + { + get + { + if (!CanEdit) + return _DirtyProps.Contains(nameof(IsFavorite)); + return _DirtyProps.Count > 0; + } + } } } diff --git a/BeWo/ViewModel/ListViewModel/AiPromptbausteinFolderListVM.cs b/BeWo/ViewModel/ListViewModel/AiPromptbausteinFolderListVM.cs index e3d877d98..5c197ef53 100644 --- a/BeWo/ViewModel/ListViewModel/AiPromptbausteinFolderListVM.cs +++ b/BeWo/ViewModel/ListViewModel/AiPromptbausteinFolderListVM.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using BS.Shared.DataContracts.Feature.AI; +using DevExpress.CodeParser; +using DevExpress.Xpf.Scheduling.Editors; namespace BeWo.ViewModel.ListViewModel { @@ -30,7 +33,7 @@ namespace BeWo.ViewModel.ListViewModel foreach (var vm in VMList) { if (vm.DataContract.Oid < -1) - return false; + continue; if (vm.SubFolders is object && vm.SubFolders.ContainsDirtyObject()) return true; @@ -41,5 +44,87 @@ namespace BeWo.ViewModel.ListViewModel return false; } + + //public IEnumerable GetNewFolders() + //{ + // foreach(var folder in VMList) + // { + // if (folder.IsNew) + // { + // yield return folder; + // continue; + // } + + // var new_sub_folders = folder.SubFolders.GetNewFolders(); + + // foreach (var new_sub_folder in new_sub_folders) + // { + // yield return new_sub_folder; + // } + // } + //} + + //public IEnumerable GetNewPrompts() + //{ + // foreach (var folder in VMList) + // { + // if (folder.IsNew) + // continue; + + // var new_prompts = folder.SubPrompts.CommitAdded(); + // foreach (var new_prompt in new_prompts) + // { + // yield return new_prompt; + // } + + // var new_sub_prompts = folder.SubFolders.GetNewPrompts(); + // foreach (var new_sub_prompt in new_sub_prompts) + // { + // yield return new_sub_prompt; + // } + // } + //} + + //public IEnumerable GetUpdatedFolder() + //{ + // foreach (var folder in VMList) + // { + // if (folder.IsNew) + // continue; + + // var new_prompts = folder.SubPrompts.CommitAdded(); + // foreach (var new_prompt in new_prompts) + // { + // yield return new_prompt; + // } + + // var new_sub_prompts = folder.SubFolders.GetNewPrompts(); + // foreach (var new_sub_prompt in new_sub_prompts) + // { + // yield return new_sub_prompt; + // } + // } + //} + + //public IEnumerable GetUpdatedPrompt() + //{ + // foreach (var folder in VMList) + // { + // if (folder.IsNew) + // continue; + + // var new_prompts = folder.SubPrompts.CommitAdded(); + // foreach (var new_prompt in new_prompts) + // { + // yield return new_prompt; + // } + + // var new_sub_prompts = folder.SubFolders.GetNewPrompts(); + // foreach (var new_sub_prompt in new_sub_prompts) + // { + // yield return new_sub_prompt; + // } + // } + //} } } diff --git a/BeWo/ViewModel/VMFactory.cs b/BeWo/ViewModel/VMFactory.cs index 66d1e1c49..aa3c4de6b 100644 --- a/BeWo/ViewModel/VMFactory.cs +++ b/BeWo/ViewModel/VMFactory.cs @@ -11,6 +11,7 @@ using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; +using BS.Shared.DataContracts.Feature.AI; using BS.Shared.Extensions; using DevExpress.XtraEditors.Filtering.Templates; @@ -701,29 +702,29 @@ namespace BeWo.ViewModel ServiceFacade.DoEmployeeServiceAsync(s => s.GetAllEmploymentTypes(), r => pCallBack(new EmploymentTypeListVM(r))); } - private static void InternalCreateCustomerVM(CustomerDC pCustomerDC, Action pCallBack) - { - var list = new List - { - ValueListEntryType.DisabilityType, - ValueListEntryType.CustomerCareType, - ValueListEntryType.PlacementObjectiveType, - ValueListEntryType.TerminationReasonType, - ValueListEntryType.Nationality, - ValueListEntryType.Aufenthaltsstatus, - ValueListEntryType.RoleInFamily, - ValueListEntryType.NotizenKategorieCustomer, - ValueListEntryType.Auftragsherkunft, - ValueListEntryType.Vermittlungsgrundlage, - ValueListEntryType.EinkommenBeginnType, - ValueListEntryType.EinkommenEndeType, - ValueListEntryType.FremdHilfeType, - ValueListEntryType.SozSchwierigkeitenType, - ValueListEntryType.SozBeziehungenType, - ValueListEntryType.ErstaufnahmeType, - ValueListEntryType.RegionType, - ValueListEntryType.VgAVerlauf - }; + private static void InternalCreateCustomerVM(CustomerDC pCustomerDC, Action pCallBack) + { + var list = new List + { + ValueListEntryType.DisabilityType, + ValueListEntryType.CustomerCareType, + ValueListEntryType.PlacementObjectiveType, + ValueListEntryType.TerminationReasonType, + ValueListEntryType.Nationality, + ValueListEntryType.Aufenthaltsstatus, + ValueListEntryType.RoleInFamily, + ValueListEntryType.NotizenKategorieCustomer, + ValueListEntryType.Auftragsherkunft, + ValueListEntryType.Vermittlungsgrundlage, + ValueListEntryType.EinkommenBeginnType, + ValueListEntryType.EinkommenEndeType, + ValueListEntryType.FremdHilfeType, + ValueListEntryType.SozSchwierigkeitenType, + ValueListEntryType.SozBeziehungenType, + ValueListEntryType.ErstaufnahmeType, + ValueListEntryType.RegionType, + ValueListEntryType.VgAVerlauf + }; ServiceFacade.DoValueListServiceAsync( s => s.GetAllValueListEntrysByTypes(list), @@ -925,7 +926,7 @@ namespace BeWo.ViewModel public static void CreateAiConversationListVM(AiContextType uIContext, long? reference_oid, Action callback) { ServiceFacade.DoAiEnhancedServiceAsnyc( - s => s.GetAiConversations(uIContext, reference_oid), + s => s.GetAiConversations(uIContext, reference_oid), cb => { cb.Reverse(); @@ -937,7 +938,50 @@ namespace BeWo.ViewModel { ServiceFacade.DoAiEnhancedServiceAsnyc( req => req.GetAiPromptbausteinFolder(aiActionType), - res => get_viewmodel(new AiPromptbausteinFolderListVM(res))); + res => + { + var listvm = new AiPromptbausteinFolderListVM(res); + + reloadFavoriten(listvm); + + get_viewmodel(listvm); + }); + } + + static void reloadFavoriten(AiPromptbausteinFolderListVM folders) + { + var favoriten = new AiPromptbausteinFolderDC() + { + Oid = -5, + Title = "Favoriten", + Description = "Eigene Favoriten", + SubPrompts = new List() + }; + var fav_vm = new AiPromptbausteinFolderVM(favoriten); + + fav_vm.SubPrompts.VMList.Clear(); + + folders.VMList.Insert(0, fav_vm); + + findFavoriten(folders, fav_vm); + } + + static void findFavoriten(AiPromptbausteinFolderListVM folders, AiPromptbausteinFolderVM favoriten) + { + foreach (var folder in folders.VMList) + { + if (folder == favoriten) + continue; + + if (folder.SubFolders?.VMList.Any() ?? false) + findFavoriten(folder.SubFolders, favoriten); + + foreach (var prompt in folder.SubPrompts.VMList) + { + if (prompt.IsFavorite) + favoriten.SubPrompts.VMList.Add(prompt); + } + } } } } \ No newline at end of file diff --git a/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs b/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs index 120415ba1..0ba67438f 100644 --- a/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs +++ b/BeWo/ViewModel/View/Administration/AiPromptbausteinComplexTreeViewModel.cs @@ -26,6 +26,8 @@ namespace BeWo.ViewModel.View.Administration private AiActionType AiActionType { get; set; } public AiPromptbausteinFolderListVM Folders { get; set; } + public AiPromptbausteinFolderVM Favoriten { get; set; } + public AiPromptbausteinPromptVM SelectedPrompt { get; set; } public AiPromptbausteinFolderVM CopiedFolder { get; set; } public AiPromptbausteinPromptVM CopiedPrompt { get; set; } @@ -170,6 +172,10 @@ namespace BeWo.ViewModel.View.Administration listvm => { Folders = listvm; + if (Folders.VMList.Count > 0 && Folders.VMList[0].DataContract.Oid == -5) + { + Favoriten = Folders.VMList[0]; + } FirePropertyChanged(nameof(Folders)); }); } @@ -179,7 +185,7 @@ namespace BeWo.ViewModel.View.Administration foreach (var node in folders.VMList) { if (node.DataContract.Oid is long oid && oid < -1) - continue; + continue; if (node.IsNew) { @@ -201,6 +207,26 @@ namespace BeWo.ViewModel.View.Administration } } } + void DFS_Search_UpdatePromptFavorite(AiPromptbausteinFolderListVM folders, ref List toadd_Folder, ref List toadd_Prompts, ref List toupdate_Folder, ref List toupdate_Prompt) + { + foreach (var node in folders.VMList) + { + if (node == Favoriten) + continue; + + if (node.DataContract?.Oid >= -1) + continue; + + if (node.IsNew) + continue; + + if (node.HasSubFolders) + DFS_Search_UpdatePromptFavorite(node.SubFolders, ref toadd_Folder, ref toadd_Prompts, ref toupdate_Folder, ref toupdate_Prompt); + + if (node.SubPrompts.AddedCount > 0) + toadd_Prompts.AddRange(node.SubPrompts.CommitAdded()); + } + } void DFS_Search_Delete(AiPromptbausteinFolderListVM folders, ref List todelete_Folder, ref List todelete_Prompt) { foreach (var node_dc in folders.DCBackup) @@ -340,6 +366,20 @@ namespace BeWo.ViewModel.View.Administration { var edit_dc = edit_vm.CommitToDataContract(); sel_prompt.UpdateByDataContract(edit_dc); + + if (sel_prompt.IsFavorite && !Favoriten.SubPrompts.VMList.Contains(sel_prompt)) + Favoriten.SubPrompts.VMList.Add(sel_prompt); + else if (!sel_prompt.IsFavorite && Favoriten.SubPrompts.VMList.Contains(sel_prompt)) + { + Favoriten.SubPrompts.VMList.Remove(sel_prompt); + + if(Favoriten.SubPrompts.Count == 0) + { + var selected_folder = SelectedFolder; + SelectedFolder = null; + SelectedFolder = selected_folder; + } + } }; WindowService.Show(vm); diff --git a/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs b/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs new file mode 100644 index 000000000..290d1887e --- /dev/null +++ b/Shared/DataContracts/Feature/AI/AiPromptbausteinFolderStructureDC.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Instrumentation; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts.Feature.AI +{ + //[DataContract] + //public class AiPromptbausteinFolderStructureDC : IDataContract + //{ + // public AiPromptbausteinFolderDC MyProperty { get; set; } + //} +} diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 579df07ff..9ea6f2b54 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -188,6 +188,7 @@ +