fix: PDF viewer - wire up _render_file_viewer + URL-encode filenames
- view_page now calls _render_file_viewer for content_format='file' pages instead of rendering the full page_editor template (which was the old path) - URL-encode filenames in file_url using urllib.parse.quote() to handle spaces and special characters correctly - Fixed in both board.py (viewer + page_data) and dashboard.py The _render_file_viewer was dead code — defined but never called. File pages were going through page_editor.html which rendered PDFs in an iframe embedded in the editor UI. Now they get a clean standalone HTML viewer.
This commit is contained in:
@@ -926,6 +926,10 @@ async def view_page(request: Request, page_id: int):
|
||||
return HTMLResponse("<h2>Page not found</h2>", status_code=404)
|
||||
page = dict(row)
|
||||
|
||||
# For file-type pages (PDFs, images, etc.), use the dedicated file viewer
|
||||
if page.get("content_format") == "file":
|
||||
return _render_file_viewer(page, request)
|
||||
|
||||
ws = page.get("workspace", "")
|
||||
parts = ws.split("/") if "/" in ws else ["", ""]
|
||||
owner, repo = parts[0], parts[1] if len(parts) > 1 else ""
|
||||
@@ -959,7 +963,8 @@ async def view_page(request: Request, page_id: int):
|
||||
ws_id = p.replace("workspace_", "")
|
||||
break
|
||||
filename = fp_parts[-1] if fp_parts else page.get("title", "File")
|
||||
file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
|
||||
from urllib.parse import quote
|
||||
file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
|
||||
page_data["file_url"] = file_url
|
||||
page_data["file_mime"] = mime_type
|
||||
page_data["file_size"] = file_size
|
||||
@@ -1006,7 +1011,8 @@ def _render_file_viewer(page: dict, request: Request) -> HTMLResponse:
|
||||
break
|
||||
filename = parts[-1] if parts else title
|
||||
|
||||
file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
|
||||
from urllib.parse import quote
|
||||
file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
|
||||
|
||||
# Determine viewer type
|
||||
is_image = mime_type.startswith("image/")
|
||||
|
||||
@@ -270,7 +270,8 @@ async def view_page_root(request: Request, page_id: int):
|
||||
ws_id = p.replace("workspace_", "")
|
||||
break
|
||||
filename = fp_parts[-1] if fp_parts else page.get("title", "File")
|
||||
file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
|
||||
from urllib.parse import quote
|
||||
file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
|
||||
page_data["file_url"] = file_url
|
||||
page_data["file_mime"] = mime_type
|
||||
page_data["file_size"] = file_size
|
||||
|
||||
Reference in New Issue
Block a user