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

Loading suggestions...

} else if (extractedMenuItems.Any()) {

Suggested Menu Items

@{ @(allowReorder ? "Done" : "Reorder") } @if (allowReorder) { @* *@ @* *@ } else { @foreach (var item in extractedMenuItems) { @{ if (MenuItemsSaved) { } } } }
} 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; IList selectedMenuItems; private List extractedMenuItems = 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() { menuItems = new ObservableCollection((await ContentEditorService.GetMenuItemsBySiteIdAsync(SiteId)).OrderBy(x => x.SortOrder)); var collectionResult = await QDrantService.GetCollectionBySiteIdAsync(SiteId); if (!string.IsNullOrEmpty(collectionResult)) { //create colection hasCollection = true; Console.Write("Has collection already"); } if (menuItems.Count() > 0) { foreach (var menuItem in menuItems) { string content; MenuItemModel model = new MenuItemModel(""); //try to get content from qDrant if (menuItem.QdrantPointId != null) { content = await QDrantService.GetContentAsync(SiteId, menuItem.PointId); // content = await QDrantService.GetContentAsync(SiteId, menuItem.QdrantPointId); TODO var selectedPoint = JsonConvert.DeserializeObject(content)!; if (selectedPoint != null) { model.Content = selectedPoint.result.payload.content; Console.Write($"Found point: {selectedPoint.result.payload.content}"); } } model.MenuItem = menuItem; extractedMenuItems.Add(model); // UpdateMenuItem(model); } MenuItemsSaved = true; } //get menu content from QDrant for each menu item } private async Task GenerateMenuItems() { if (string.IsNullOrWhiteSpace(subject)) { errorMessage = "Please enter a subject."; return; } isLoading = true; errorMessage = null; try { var prompt = $"Suggest a list of menu items for a website about: {subject}. Please do not attach any explanation."; var response = await ContentEditorService.GetMenuSuggestionsAsync(SessionId, prompt); extractedMenuItems = response.Select(name => new MenuItemModel(name)).ToList(); } catch (Exception ex) { errorMessage = "An error occurred while generating menu items."; } finally { isLoading = false; } } private async Task AddMenuItem() { isLoading = true; errorMessage = null; var newItem = new MenuItemModel("New menu item", ""); //TODO Fix extractedMenuItems.Add(newItem); } private void RemoveMenuItem(MenuItemModel item) { extractedMenuItems.Remove(item); } private void UpdateMenuItem(MenuItemModel updatedItem) { Console.Write("Updating menu item"); var item = extractedMenuItems.FirstOrDefault(i => i.MenuItem.Name == updatedItem.MenuItem.Name); if (item != null) { item.Content = updatedItem.Content; } else { Console.Write("Not found"); } } private async Task SaveMenuItems(bool updateVectorDatabase) { var result = await ContentEditorService.ProcessMenuItems(SiteId, hasCollection, extractedMenuItems, subject, MenuItemsSaved, updateVectorDatabase); if (result == "OK") { MenuItemsSaved = true; hasCollection = true; errorMessage = "Menu saved"; } else { errorMessage = result; } } void RowRender(RowRenderEventArgs args) { if (allowReorder) { 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); MenuItemModel draggedExtractedMenuItem = extractedMenuItems[draggedIndex]; var droppedIndex = menuItems.IndexOf(args.Data); menuItems.Remove(draggedItem); menuItems.Insert(draggedIndex <= droppedIndex ? droppedIndex++ : droppedIndex, draggedItem); extractedMenuItems.Remove(draggedExtractedMenuItem); extractedMenuItems.Insert(draggedIndex <= droppedIndex ? droppedIndex++ : droppedIndex, draggedExtractedMenuItem); foreach (var menuItemToReorder in menuItems) { menuItemToReorder.SortOrder = menuItems.IndexOf(menuItemToReorder); } foreach (var extractedMenuItemToReorder in extractedMenuItems) { extractedMenuItemToReorder.MenuItem.SortOrder = extractedMenuItems.IndexOf(extractedMenuItemToReorder); } JSRuntime.InvokeVoidAsync("eval", $"document.querySelector('.my-class').classList.remove('my-class')"); })); } } void Select(MenuItem menuItem) { SelectedMenuItemModel.MenuItem.Name = menuItem.Name; SelectedMenuItemModel.Content = extractedMenuItems.Where(x => x.MenuItem.Name == menuItem.Name).FirstOrDefault().Content; SelectedMenuItemModel.MenuItem.SortOrder = menuItem.SortOrder; SelectedMenuItemModel.MenuItem.ShowInMainMenu = menuItem.ShowInMainMenu; } void OnRowSelect(MenuItem menuItem) { Select(menuItem); } async void ToggleReorder() { if (allowReorder) { await SaveMenuItems(false); } allowReorder = !allowReorder; await InvokeAsync(StateHasChanged); } }