@using BLAIzor.Models @using BLAIzor.Services @using Newtonsoft.Json @using BLAIzor.Components.Partials @using System.Collections.ObjectModel @inject ContentEditorService ContentEditorService @inject ContentEditorAIService ContentEditorAIService @inject HtmlSnippetProcessor HtmlSnippetProcessor @inject QDrantService QDrantService @inject IJSRuntime JSRuntime @*
*@ @if (isLoading) {

Loading suggestions...

} else if (extractedMenuItems.Any()) {

Menu Items Editor

@(allowReorder ? "Done Reordering" : "Reorder") @if (allowReorder) { } else { @foreach (var item in extractedMenuItems) { } }
} else if (!string.IsNullOrEmpty(errorMessage)) {

@errorMessage

} @code { [Parameter] public int SiteId { get; set; } [Parameter] public string SessionId { get; set; } private string subject = string.Empty; ObservableCollection menuItems = new(); IList selectedMenuItems; private List extractedMenuItems = new(); private List allContentItems = new(); private bool MenuItemsSaved = false; private bool isLoading = false; private string? errorMessage; private bool hasCollection = false; private bool allowReorder = false; private RadzenDataGrid dataGrid; MenuItem draggedItem; MenuItemModel SelectedMenuItemModel = new(""); protected override async Task OnParametersSetAsync() { var site = await ContentEditorService.GetSiteInfoByIdAsync(SiteId); subject = site.SiteDescription ?? string.Empty; menuItems = new ObservableCollection((await ContentEditorService.GetMenuItemsBySiteIdAsync(SiteId)).OrderBy(x => x.SortOrder)); allContentItems = await ContentEditorService.GetAllContentItemsBySiteIdAsync(SiteId); var collectionResult = await QDrantService.GetCollectionBySiteIdAsync(SiteId); hasCollection = !string.IsNullOrEmpty(collectionResult); if (menuItems.Count > 0) { foreach (var menuItem in menuItems) { var model = new MenuItemModel("") { MenuItem = menuItem }; if (menuItem.ContentItemId != null) { var contentItem = await ContentEditorService.GetContentItemByIdAsync(menuItem.ContentItemId.Value); if (contentItem != null) { model.Content = contentItem.Content; model.ContentDescription = contentItem.Description; } } extractedMenuItems.Add(model); } MenuItemsSaved = true; } } // private async Task GenerateMenuItems() // { // if (string.IsNullOrWhiteSpace(subject)) // { // errorMessage = "Please enter a subject."; // return; // } // isLoading = true; // try // { // var prompt = $"Suggest a list of menu items for a website about: {subject}. Please do not attach any explanation."; // var response = await ContentEditorAIService.GetMenuSuggestionsAsync(SessionId, prompt); // extractedMenuItems = response.Select(name => new MenuItemModel(name)).ToList(); // } // catch // { // errorMessage = "An error occurred while generating menu items."; // } // finally { isLoading = false; } // } private async Task AddMenuItem() { MenuItemModel newModel = new MenuItemModel("New Menu Item"); MenuItem newItem = new MenuItem(); newItem.SiteInfoId = SiteId; newItem.Name = "New Menu Item"; newItem.SortOrder = extractedMenuItems.Count+1; var result = await ContentEditorService.AddMenuItemAsync(newItem); newModel.MenuItem = result; extractedMenuItems.Add(newModel); if(result == null) { extractedMenuItems.Remove(newModel); } } private async Task RemoveMenuItem(MenuItemModel item){ await ContentEditorService.DeleteMenuItemAsync(item.MenuItem.Id); extractedMenuItems.Remove(item); } private async Task SaveMenuItems(bool updateVectorDatabase) { //var result = await ContentEditorAIService.ProcessMenuItems(SiteId, hasCollection, extractedMenuItems, subject, MenuItemsSaved, updateVectorDatabase); try { foreach (var menuItemToUpdate in extractedMenuItems) { var result2 = await ContentEditorService.UpdateMenuItemAsync(menuItemToUpdate.MenuItem); } } catch (Exception ex) { errorMessage = "Some error occured: " + ex; } finally { MenuItemsSaved = true; hasCollection = true; errorMessage = "Menu saved"; } } void RowRender(RowRenderEventArgs args) { if (!allowReorder) return; args.Attributes.Add("title", "Drag row to reorder"); args.Attributes.Add("style", "cursor:grab"); args.Attributes.Add("draggable", "true"); args.Attributes.Add("ondragover", "event.preventDefault();event.target.closest('.rz-data-row').classList.add('my-class')"); args.Attributes.Add("ondragleave", "event.target.closest('.rz-data-row').classList.remove('my-class')"); args.Attributes.Add("ondragstart", EventCallback.Factory.Create(this, () => draggedItem = args.Data)); args.Attributes.Add("ondrop", EventCallback.Factory.Create(this, () => { var draggedIndex = menuItems.IndexOf(draggedItem); var droppedIndex = menuItems.IndexOf(args.Data); var draggedModel = extractedMenuItems[draggedIndex]; menuItems.RemoveAt(draggedIndex); extractedMenuItems.RemoveAt(draggedIndex); menuItems.Insert(droppedIndex, draggedItem); extractedMenuItems.Insert(droppedIndex, draggedModel); for (int i = 0; i < menuItems.Count; i++) { menuItems[i].SortOrder = i; extractedMenuItems[i].MenuItem.SortOrder = i; } JSRuntime.InvokeVoidAsync("eval", "document.querySelector('.my-class').classList.remove('my-class')"); })); } void ToggleReorder() { if (allowReorder) _ = SaveMenuItems(false); allowReorder = !allowReorder; } void OnRowSelect(MenuItem item) { SelectedMenuItemModel = extractedMenuItems.FirstOrDefault(x => x.MenuItem.Id == item.Id) ?? new(""); } }