From b3eeb563f70c6a4beb546744a0b6f7cd3b089a68 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 20 Aug 2025 06:12:48 +0000 Subject: [PATCH] Fix PDF export filename: use JavaScript download with proper .pdf extension Co-authored-by: clayschaad <11883505+clayschaad@users.noreply.github.com> --- Client/Pages/Index.razor.cs | 3 +-- Client/wwwroot/index.html | 1 + Client/wwwroot/js/fileDownload.js | 18 ++++++++++++++++++ test.pdf | Bin 0 -> 25211 bytes 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 Client/wwwroot/js/fileDownload.js create mode 100644 test.pdf diff --git a/Client/Pages/Index.razor.cs b/Client/Pages/Index.razor.cs index 8b95a79..b7ee35b 100644 --- a/Client/Pages/Index.razor.cs +++ b/Client/Pages/Index.razor.cs @@ -104,8 +104,7 @@ namespace ShiftScheduler.Client.Pages var response = await HttpClient.PostAsJsonAsync("api/shift/export_pdf", shiftsWithTransportList); var bytes = await response.Content.ReadAsByteArrayAsync(); var base64 = Convert.ToBase64String(bytes); - var fileUrl = $"data:application/octet-stream;base64,{base64}"; - NavigationManager.NavigateTo(fileUrl, true); + await JSRuntime.InvokeVoidAsync("downloadFile", "schedule.pdf", "application/pdf", base64); } private async Task SaveScheduleToStorage() diff --git a/Client/wwwroot/index.html b/Client/wwwroot/index.html index 9dead99..cfa7310 100644 --- a/Client/wwwroot/index.html +++ b/Client/wwwroot/index.html @@ -26,6 +26,7 @@ Reload 🗙 + diff --git a/Client/wwwroot/js/fileDownload.js b/Client/wwwroot/js/fileDownload.js new file mode 100644 index 0000000..a0c444b --- /dev/null +++ b/Client/wwwroot/js/fileDownload.js @@ -0,0 +1,18 @@ +window.downloadFile = (filename, contentType, base64Data) => { + const byteCharacters = atob(base64Data); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const blob = new Blob([byteArray], { type: contentType }); + + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); +}; \ No newline at end of file diff --git a/test.pdf b/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c6fb7eb1930cd1426ac2a9f8152bb86414c9708c GIT binary patch literal 25211 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