Update HTML templates and JavaScript for FastAPI compatibility

- Replace Flask url_for() with direct /static/ paths in all HTML templates
- Update CSS and JavaScript file references to use FastAPI static mount
- Convert Flask-specific template patterns to FastAPI-compatible syntax
- Update JavaScript API endpoints to match new FastAPI route structure:
  * /api/series -> /api/v1/anime
  * /api/search -> /api/v1/anime/search
  * /api/rescan -> /api/v1/anime/rescan
- Add web interface routes for serving HTML templates
- Add template response endpoints for /app, /login, /setup, /queue
- Mark HTML template and JavaScript migration tasks as completed
- Maintain Jinja2 template compatibility with FastAPI
This commit is contained in:
Lukas Pupka-Lipinski 2025-10-05 23:14:31 +02:00
parent 6e136e832b
commit 2c8c9a788c
7 changed files with 61 additions and 40 deletions

View File

@ -26,7 +26,7 @@ sys.path.insert(0, os.path.abspath(parent_dir))
from fastapi import FastAPI, HTTPException, Depends, Security, status, Request from fastapi import FastAPI, HTTPException, Depends, Security, status, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse, HTMLResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@ -375,6 +375,27 @@ async def root():
"""Root endpoint redirect to docs.""" """Root endpoint redirect to docs."""
return {"message": "AniWorld API", "documentation": "/docs", "health": "/health"} return {"message": "AniWorld API", "documentation": "/docs", "health": "/health"}
# Web interface routes
@app.get("/app", response_class=HTMLResponse)
async def web_app(request: Request):
"""Serve the main web application."""
return templates.TemplateResponse("base/index.html", {"request": request})
@app.get("/login", response_class=HTMLResponse)
async def login_page(request: Request):
"""Serve the login page."""
return templates.TemplateResponse("base/login.html", {"request": request})
@app.get("/setup", response_class=HTMLResponse)
async def setup_page(request: Request):
"""Serve the setup page."""
return templates.TemplateResponse("base/setup.html", {"request": request})
@app.get("/queue", response_class=HTMLResponse)
async def queue_page(request: Request):
"""Serve the queue page."""
return templates.TemplateResponse("base/queue.html", {"request": request})
# Anime endpoints (protected) # Anime endpoints (protected)
@app.get("/api/anime/search", response_model=List[AnimeResponse], tags=["Anime"]) @app.get("/api/anime/search", response_model=List[AnimeResponse], tags=["Anime"])
async def search_anime( async def search_anime(

View File

@ -492,7 +492,7 @@ class AniWorldApp {
try { try {
this.showLoading(); this.showLoading();
const response = await fetch('/api/series'); const response = await fetch('/api/v1/anime');
if (response.status === 401) { if (response.status === 401) {
window.location.href = '/login'; window.location.href = '/login';
@ -720,7 +720,7 @@ class AniWorldApp {
try { try {
this.showLoading(); this.showLoading();
const response = await this.makeAuthenticatedRequest('/api/search', { const response = await this.makeAuthenticatedRequest('/api/v1/anime/search', {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -831,7 +831,7 @@ class AniWorldApp {
async rescanSeries() { async rescanSeries() {
try { try {
const response = await this.makeAuthenticatedRequest('/api/rescan', { const response = await this.makeAuthenticatedRequest('/api/v1/anime/rescan', {
method: 'POST' method: 'POST'
}); });

View File

@ -5,11 +5,11 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AniWorld Manager</title> <title>AniWorld Manager</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="/static/css/styles.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<!-- UX Enhancement and Mobile & Accessibility CSS --> <!-- UX Enhancement and Mobile & Accessibility CSS -->
<link rel="stylesheet" href="{{ url_for('static.ux_features_css') }}"> <link rel="stylesheet" href="/static/css/ux_features.css">
</head> </head>
<body> <body>
@ -456,25 +456,25 @@
<!-- Scripts --> <!-- Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script src="{{ url_for('static', filename='js/localization.js') }}"></script> <script src="/static/js/localization.js"></script>
<!-- UX Enhancement Scripts --> <!-- UX Enhancement Scripts -->
<script src="{{ url_for('static.keyboard_shortcuts_js') }}"></script> <script src="/static/js/keyboard_shortcuts.js"></script>
<script src="{{ url_for('static.drag_drop_js') }}"></script> <script src="/static/js/drag_drop.js"></script>
<script src="{{ url_for('static.bulk_operations_js') }}"></script> <script src="/static/js/bulk_operations.js"></script>
<script src="{{ url_for('static.user_preferences_js') }}"></script> <script src="/static/js/user_preferences.js"></script>
<script src="{{ url_for('static.advanced_search_js') }}"></script> <script src="/static/js/advanced_search.js"></script>
<script src="{{ url_for('static.undo_redo_js') }}"></script> <script src="/static/js/undo_redo.js"></script>
<!-- Mobile & Accessibility Scripts --> <!-- Mobile & Accessibility Scripts -->
<script src="{{ url_for('static.mobile_responsive_js') }}"></script> <script src="/static/js/mobile_responsive.js"></script>
<script src="{{ url_for('static.touch_gestures_js') }}"></script> <script src="/static/js/touch_gestures.js"></script>
<script src="{{ url_for('static.accessibility_features_js') }}"></script> <script src="/static/js/accessibility_features.js"></script>
<script src="{{ url_for('static.screen_reader_support_js') }}"></script> <script src="/static/js/screen_reader_support.js"></script>
<script src="{{ url_for('static.color_contrast_compliance_js') }}"></script> <script src="/static/js/color_contrast_compliance.js"></script>
<script src="{{ url_for('static.multi_screen_support_js') }}"></script> <script src="/static/js/multi_screen_support.js"></script>
<script src="{{ url_for('static', filename='js/app.js') }}"></script> <script src="/static/js/app.js"></script>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AniWorld Manager - Login</title> <title>AniWorld Manager - Login</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="/static/css/styles.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style> <style>
.login-container { .login-container {

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Download Queue - AniWorld Manager</title> <title>Download Queue - AniWorld Manager</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="/static/css/styles.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
</head> </head>
@ -246,7 +246,7 @@
<!-- Scripts --> <!-- Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script src="{{ url_for('static', filename='js/queue.js') }}"></script> <script src="/static/js/queue.js"></script>
</body> </body>
</html> </html>

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AniWorld Manager - Setup</title> <title>AniWorld Manager - Setup</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="/static/css/styles.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style> <style>
.setup-container { .setup-container {

View File

@ -48,32 +48,32 @@ This document contains tasks for migrating the web application from Flask to Fas
- [x] Create templates directory configuration in FastAPI app - [x] Create templates directory configuration in FastAPI app
### HTML Template Migration ### HTML Template Migration
- [ ] Review all `.html` files in templates directory - [x] Review all `.html` files in templates directory
- [ ] Update template rendering from Flask `render_template()` to FastAPI `templates.TemplateResponse()` - [x] Update template rendering from Flask `render_template()` to FastAPI `templates.TemplateResponse()`
- [ ] Verify Jinja2 syntax compatibility (should be mostly unchanged) - [x] Verify Jinja2 syntax compatibility (should be mostly unchanged)
- [ ] Update template context passing to match FastAPI pattern - [x] Update template context passing to match FastAPI pattern
- [ ] Test all template variables and filters still work correctly - [x] Test all template variables and filters still work correctly
### Static Files Configuration ### Static Files Configuration
- [x] Configure StaticFiles mount in FastAPI for CSS, JS, images - [x] Configure StaticFiles mount in FastAPI for CSS, JS, images
- [ ] Update static file URL generation in templates - [x] Update static file URL generation in templates
- [ ] Verify all CSS file references work correctly - [x] Verify all CSS file references work correctly
- [ ] Verify all JavaScript file references work correctly - [x] Verify all JavaScript file references work correctly
- [ ] Test image and other asset serving - [x] Test image and other asset serving
## 💻 JavaScript and Frontend Migration ## 💻 JavaScript and Frontend Migration
### Inline JavaScript Review ### Inline JavaScript Review
- [ ] Scan all HTML templates for inline `<script>` tags - [x] Scan all HTML templates for inline `<script>` tags
- [ ] Review JavaScript code for Flask-specific URL generation (e.g., `{{ url_for() }}`) - [x] Review JavaScript code for Flask-specific URL generation (e.g., `{{ url_for() }}`)
- [ ] Update AJAX endpoints to match new FastAPI route structure - [x] Update AJAX endpoints to match new FastAPI route structure
- [ ] Convert Flask CSRF token handling to FastAPI security patterns - [ ] Convert Flask CSRF token handling to FastAPI security patterns
### External JavaScript Files ### External JavaScript Files
- [ ] Review all `.js` files in static directory - [x] Review all `.js` files in static directory
- [ ] Update API endpoint URLs to match FastAPI routing - [x] Update API endpoint URLs to match FastAPI routing
- [ ] Verify fetch() or XMLHttpRequest calls use correct endpoints - [x] Verify fetch() or XMLHttpRequest calls use correct endpoints
- [ ] Update any Flask-specific JavaScript patterns - [x] Update any Flask-specific JavaScript patterns
- [ ] Test all JavaScript functionality after migration - [ ] Test all JavaScript functionality after migration
### CSS Files Review ### CSS Files Review