diff --git a/__init__.py b/__init__.py index a241106..e21c049 100644 --- a/__init__.py +++ b/__init__.py @@ -17,6 +17,8 @@ def create_app(): app = Flask(__name__) app.secret_key = os.getenv('SECRET_KEY', 'dev-secret-key-unsafe') # You know what to do for prod app.config.from_object(Config) + app.jinja_env.trim_blocks = True + app.jinja_env.lstrip_blocks = True db.init_app(app) diff --git a/requirements.txt b/requirements.txt index b7cb7bb..18825da 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ dotenv flask flask_sqlalchemy pandas -pyodbc \ No newline at end of file +pyodbc +beautifulsoup4 \ No newline at end of file diff --git a/routes.py b/routes.py index c371cfe..28232f0 100644 --- a/routes.py +++ b/routes.py @@ -9,6 +9,7 @@ import pandas as pd import traceback import json import datetime +from bs4 import BeautifulSoup main = Blueprint('main', __name__) @@ -78,6 +79,22 @@ worklog_form_fields = { "notes": lambda log: {"label": "Notes", "type": "textarea", "value": log.notes or "", "rows": 15} } +@main.after_request +def prettify_html_response(response): + if app.debug and response.content_type.startswith("text/html"): + try: + from bs4 import BeautifulSoup + + soup = BeautifulSoup(response.get_data(as_text=True), 'html5lib') + pretty_html = soup.prettify() + + response.set_data(pretty_html.encode("utf-8")) # type: ignore + response.headers['Content-Type'] = 'text/html; charset=utf-8' + + except Exception as e: + print(f"⚠️ Prettifying failed: {e}") + return response + @main.route("/") def index(): worklog_query = eager_load_worklog_relationships( diff --git a/templates/settings.html b/templates/settings.html index c6c62d6..ef360d9 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -6,7 +6,7 @@
{{ breadcrumbs.breadcrumb_header( title=title, - submit_button=True + save_button=True ) }}
@@ -131,7 +131,7 @@
@@ -196,9 +196,9 @@ }; } - document.addEventListener('DOMContentLoaded', () => { const modal = document.getElementById('roomEditor'); - const saveButton = document.getElementById('roomEditorSaveButton'); + const saveButton = document.getElementById('saveButton') + const editorSaveButton = document.getElementById('editorSaveButton'); const cancelButton = document.getElementById('roomEditorCancelButton'); const form = document.getElementById('settingsForm'); @@ -234,8 +234,9 @@ }); }); - form.addEventListener('submit', async (event) => { + saveButton.addEventListener('click', async (event) => { event.preventDefault(); + console.log("Test") const state = buildFormState(); if (!isSerializable(state)) { @@ -273,7 +274,7 @@ } }); - saveButton.addEventListener('click', () => { + editorSaveButton.addEventListener('click', () => { const name = document.getElementById('roomName').value.trim(); const sectionVal = document.getElementById('roomSection').value; const funcVal = document.getElementById('roomFunction').value; @@ -309,5 +310,4 @@ cancelButton.addEventListener('click', () => { bootstrap.Modal.getInstance(modal).hide(); }); - }); {% endblock %} \ No newline at end of file