diff --git a/.gitignore b/.gitignore index 1e59be575c..27885185f1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ frontend/src/routes/test.svelte CaddyfileRemoteMalo *.swp **/.idea/ -.direnv \ No newline at end of file +.direnv +.vscode \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index dc3f727cad..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.analysis.typeCheckingMode": "basic" -} diff --git a/backend/windmill-common/src/s3_helpers.rs b/backend/windmill-common/src/s3_helpers.rs index 715615f37f..a1c5d03888 100644 --- a/backend/windmill-common/src/s3_helpers.rs +++ b/backend/windmill-common/src/s3_helpers.rs @@ -12,6 +12,8 @@ use object_store::azure::MicrosoftAzureBuilder; use object_store::ObjectStore; #[cfg(feature = "parquet")] use object_store::{aws::AmazonS3Builder, ClientOptions}; +#[cfg(feature = "parquet")] +use reqwest::header::HeaderMap; use serde::{Deserialize, Serialize}; #[cfg(feature = "parquet")] use std::sync::Arc; @@ -251,9 +253,15 @@ pub async fn build_s3_client(s3_resource_ref: &S3Resource) -> error::Result + {:else if !forceJson && resultKind === 'pdf'} +
+ +
{:else if !forceJson && resultKind === 'plain'}
{typeof result === 'string' ? result : result?.['result']}
{#if !noControls}
@@ -667,6 +678,14 @@ (result.storage ? `&storage=${result.storage}` : '')} />
+ {:else if result?.s3?.endsWith('.pdf')} +
+ +
{/if} {/if}
@@ -735,6 +754,14 @@ >open image preview {/if} + {:else if s3object?.s3?.endsWith('.pdf')} +
+ +
{/if} {/each} diff --git a/frontend/src/lib/components/S3FilePicker.svelte b/frontend/src/lib/components/S3FilePicker.svelte index 57adc334b4..3ee14c1986 100644 --- a/frontend/src/lib/components/S3FilePicker.svelte +++ b/frontend/src/lib/components/S3FilePicker.svelte @@ -22,6 +22,7 @@ import TableSimple from './TableSimple.svelte' import ConfirmationModal from './common/confirmationModal/ConfirmationModal.svelte' import FileUploadModal from './common/fileUpload/FileUploadModal.svelte' + import PdfViewer from './display/PdfViewer.svelte' let deletionModalOpen = false let fileDeletionInProgress = false @@ -245,6 +246,16 @@ contentPreview: filePreviewContent, contentType: filePreviewRaw.content_type } + if (fileMetadata) { + fileMetadata.mimeType = + ((fileKey.endsWith('.png') || + fileKey.endsWith('.jpg') || + fileKey.endsWith('.jpeg') || + fileKey.endsWith('.webp')) && + 'Image') || + (fileKey.endsWith('.pdf') && 'PDF') || + filePreview.contentType + } } filePreviewLoading = false fileInfoLoading = false @@ -616,6 +627,13 @@ alt="S3 preview" /> + {:else if fileMetadata?.fileKey.endsWith('.pdf')} +
+ +
{:else if filePreviewLoading}
File preview loading diff --git a/frontend/src/lib/components/apps/components/display/AppPdf.svelte b/frontend/src/lib/components/apps/components/display/AppPdf.svelte index 02d94a31cc..cdd6029418 100644 --- a/frontend/src/lib/components/apps/components/display/AppPdf.svelte +++ b/frontend/src/lib/components/apps/components/display/AppPdf.svelte @@ -1,18 +1,12 @@ @@ -207,133 +53,30 @@ {#if render} -
- {#if source && zoom} - {#if pages?.length} -
-
- - {#if wideView} - - {/if} - - -
-
- { - scrollToPage(currentTarget.valueAsNumber) - }} - min="1" - max={pages.length} - value={pageNumber} - disabled={!doc} - type="number" - class="!w-[45px] !px-1 !py-0" - /> - - / {pages.length} - -
-
- -
-
- {:else} -
- - Loading PDF -
- {/if} -
- {/if} - {#if $mode !== 'preview' && $selectedComponent?.includes(id)} - - {/if} - {#if error} -
- {error} -
- {/if} + on:click={() => syncZoomValue()} + > + Sync zoom value + + {/if} + +
{/if} diff --git a/frontend/src/lib/components/display/PdfViewer.svelte b/frontend/src/lib/components/display/PdfViewer.svelte new file mode 100644 index 0000000000..7f02e2ee5c --- /dev/null +++ b/frontend/src/lib/components/display/PdfViewer.svelte @@ -0,0 +1,331 @@ + + +
+ {#if source && zoom} + {#if pages?.length} +
+
+ + {#if wideView} + + {/if} + + +
+
+ { + scrollToPage(currentTarget.valueAsNumber) + }} + min="1" + max={pages.length} + value={pageNumber} + disabled={!doc} + type="number" + class="!w-[45px] !px-1 !py-0" + /> + + / {pages.length} + +
+
+ {#if allowFullscreen} + + {/if} + +
+
+ {:else} +
+ + Loading PDF +
+ {/if} +
+ {/if} + {#if extraButton} + + {/if} + + + {#if error} +
+ {error} +
+ {/if} +