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'}
+
{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
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}
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}
+
+
+ zoom && (zoom -= 10)}
+ disabled={!doc}
+ size="xs"
+ color="light"
+ variant="border"
+ title="Zoom out"
+ aria-label="Zoom out"
+ btnClasses="!rounded-r-none !px-2"
+ >
+
+
+ {#if wideView}
+ (zoom = 100)}
+ disabled={!doc}
+ size="xs"
+ color="light"
+ variant="border"
+ title="Reset zoom"
+ aria-label="Reset zoom"
+ btnClasses="!w-[50px] !font-medium !rounded-none !border-l-0 !px-1"
+ >
+ {zoom.toFixed(0)}%
+
+ {/if}
+ renderPdf(true, true)}
+ disabled={!doc}
+ size="xs"
+ color="light"
+ variant="border"
+ title="Scale to viewport"
+ aria-label="Scale to viewport"
+ btnClasses="!rounded-none !border-l-0 !px-2"
+ >
+
+
+ zoom && (zoom += 10)}
+ disabled={!doc}
+ size="xs"
+ color="light"
+ variant="border"
+ title="Zoom in"
+ aria-label="Zoom in"
+ btnClasses="!rounded-l-none !px-2 !border-l-0"
+ >
+
+
+
+
+ {
+ 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}
+ (fullscreen = !fullscreen)}
+ disabled={!doc}
+ size="xs"
+ color="light"
+ title="Toggle fullscreen"
+ aria-label="Toggle fullscreen"
+ btnClasses="!font-medium !px-2"
+ >
+ {#if fullscreen}
+
+ {:else}
+
+ {/if}
+
+
+
+ {:else}
+
+
+ Loading PDF
+
+ {/if}
+
+ {/if}
+ {#if extraButton}
+
+ {/if}
+
+
+ {#if error}
+
+ {error}
+
+ {/if}
+