diff --git a/SqlDatabaseVectorSearch/Components/Layout/MainLayout.razor b/SqlDatabaseVectorSearch/Components/Layout/MainLayout.razor index 54a9c59..11dbb73 100644 --- a/SqlDatabaseVectorSearch/Components/Layout/MainLayout.razor +++ b/SqlDatabaseVectorSearch/Components/Layout/MainLayout.razor @@ -42,7 +42,7 @@ new() { Id = "1", Href = "/", IconName = IconName.HouseDoorFill, Text = "Home", Match = NavLinkMatch.All}, new() { Id = "2", Href = "/counter", IconName = IconName.PlusSquareFill, Text = "Counter"}, new() { Id = "3", Href = "/weather", IconName = IconName.Table, Text = "Weather"}, - new() { Id = "4", Href= "/documents", IconName = IconName.FileTypeTxt, Text = "Documents" } + new() { Id = "4", Href= "/documents", IconName = IconName.FileText, Text = "Documents" } ]; return navItems; diff --git a/SqlDatabaseVectorSearch/Components/Pages/Documents.razor b/SqlDatabaseVectorSearch/Components/Pages/Documents.razor index 2751635..19889a3 100644 --- a/SqlDatabaseVectorSearch/Components/Pages/Documents.razor +++ b/SqlDatabaseVectorSearch/Components/Pages/Documents.razor @@ -6,6 +6,8 @@ @inject IJSRuntime JSRuntime + + Documents

Upload new document

@@ -40,7 +42,7 @@ Name Number of chunks - Creation Date + Creation date @@ -58,12 +60,19 @@ - +
+
+
+ +
+
+
} @code { + private ConfirmDialog dialog = default!; private Button uploadButton = default!; private Button deleteButton = default!; @@ -73,8 +82,13 @@ [SupplyParameterFromForm] public IBrowserFile? File { get; set; } - protected override async Task OnInitializedAsync() + protected override async Task OnAfterRenderAsync(bool firstRender) { + if (!firstRender) + { + return; + } + await LoadDocumentsAsync(); } @@ -87,9 +101,11 @@ { documents.Add(new SelectableDocument(dbDocument.Id, dbDocument.Name, dbDocument.CreationDate, dbDocument.ChunkCount) { - LocalCreationDateString = await JSRuntime.InvokeAsync("getLocalTime", dbDocument.CreationDate) + LocalCreationDateString = await GetLocalDateTimeStringAsync(dbDocument.CreationDate) }); } + + StateHasChanged(); } private void HandleFileSelected(InputFileChangeEventArgs e) @@ -114,7 +130,7 @@ await vectorSearchService.ImportAsync(stream, File.Name, MimeUtility.GetMimeMapping(File.Name), null); - CreateToastMessage(ToastType.Success, "Upload document", $"The document {File.Name} has been successfully uploaded and indexed.", DateTime.Now.ToString("g")); + CreateToastMessage(ToastType.Success, "Upload document", $"The document {File.Name} has been successfully uploaded and indexed.", await GetLocalDateTimeStringAsync(DateTimeOffset.UtcNow)); await LoadDocumentsAsync(); } @@ -128,9 +144,19 @@ { var selectedDocuments = documents?.Where(d => d.IsSelected) ?? []; + var confirmation = await dialog.ShowAsync( + title: "Delete the selected document?", + message1: "This will delete the documents and all the corresponding embeddings. The operation cannot be undone.", + message2: "Do you want to proceed?"); + + if (!confirmation) + { + return; + } + try { - uploadButton.ShowLoading(); + deleteButton.ShowLoading(); foreach (var document in selectedDocuments) { @@ -138,11 +164,11 @@ } await LoadDocumentsAsync(); - CreateToastMessage(ToastType.Info, "Delete documents", "The selected documents have been successfully deleted.", DateTime.Now.ToString("g")); + CreateToastMessage(ToastType.Info, "Delete documents", "The selected documents have been successfully deleted.", await GetLocalDateTimeStringAsync(DateTimeOffset.UtcNow)); } finally { - uploadButton.HideLoading(); + deleteButton.HideLoading(); } } @@ -160,6 +186,11 @@ messages.Add(toastMessage); } + private async Task GetLocalDateTimeStringAsync(DateTimeOffset dateTime) + { + return await JSRuntime.InvokeAsync("getLocalTime", dateTime); + } + private record class SelectableDocument(Guid Id, string Name, DateTimeOffset CreationDate, int ChunkCount) : Document(Id, Name, CreationDate, ChunkCount) { public bool IsSelected { get; set; }