logo w navbarze lub tekst

This commit is contained in:
Mateusz Gruszczyński
2025-08-28 11:28:22 +02:00
parent 2186c81264
commit b7ab11d124
4 changed files with 119 additions and 38 deletions

View File

@@ -44,5 +44,25 @@ ALTER TABLE global_settings ADD COLUMN logo_url TEXT DEFAULT '';
ALTER TABLE global_settings ADD COLUMN site_title TEXT DEFAULT '';
ALTER TABLE global_settings ADD COLUMN show_logo_in_navbar BOOLEAN DEFAULT 0;
COMMIT;
PRAGMA foreign_keys=ON;
PRAGMA foreign_keys=ON;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 1) Dodajemy nowe kolumny (SQLite pozwala tylko na ADD COLUMN)
ALTER TABLE global_settings ADD COLUMN navbar_brand_mode TEXT DEFAULT 'text';
ALTER TABLE global_settings ADD COLUMN footer_brand_mode TEXT DEFAULT 'text';
ALTER TABLE global_settings ADD COLUMN footer_text TEXT;
-- 2) Backfill: zgodność wsteczna z show_logo_in_navbar
UPDATE global_settings
SET navbar_brand_mode = 'logo'
WHERE COALESCE(show_logo_in_navbar, 0) = 1;
-- 3) Upewnij się, że wartości są ustawione (na wypadek NULL-i)
UPDATE global_settings
SET navbar_brand_mode = COALESCE(navbar_brand_mode, 'text'),
footer_brand_mode = COALESCE(footer_brand_mode, 'text');

16
app.py
View File

@@ -88,7 +88,10 @@ class GlobalSettings(db.Model):
logo_url = db.Column(db.String(255), nullable=True)
site_title = db.Column(db.String(120), nullable=True)
show_logo_in_navbar = db.Column(db.Boolean, default=False)
show_logo_in_navbar = db.Column(db.Boolean, default=False)
navbar_brand_mode = db.Column(db.String(10), default="text")
footer_brand_mode = db.Column(db.String(10), default="text")
footer_text = db.Column(db.String(200), nullable=True)
@login_manager.user_loader
def load_user(user_id):
@@ -479,7 +482,10 @@ def admin_ustawienia():
allowed_login_hosts = request.form.get("allowed_login_hosts")
logo_url = request.form.get("logo_url")
site_title = request.form.get("site_title")
show_logo_in_navbar = "show_logo_in_navbar" in request.form
navbar_brand_mode = request.form.get("navbar_brand_mode", "text")
footer_brand_mode = request.form.get("footer_brand_mode", "text")
footer_text = request.form.get("footer_text") or None
show_logo_in_navbar = (navbar_brand_mode == "logo")
if settings is None:
settings = GlobalSettings(
@@ -489,6 +495,9 @@ def admin_ustawienia():
logo_url=logo_url,
site_title=site_title,
show_logo_in_navbar=show_logo_in_navbar,
navbar_brand_mode=navbar_brand_mode,
footer_brand_mode=footer_brand_mode,
footer_text=footer_text,
)
db.session.add(settings)
else:
@@ -498,6 +507,9 @@ def admin_ustawienia():
settings.logo_url = logo_url
settings.site_title = site_title
settings.show_logo_in_navbar = show_logo_in_navbar
settings.navbar_brand_mode = navbar_brand_mode
settings.footer_brand_mode = footer_brand_mode
settings.footer_text = footer_text
db.session.commit()
flash("Ustawienia globalne zostały zaktualizowane", "success")

View File

@@ -76,40 +76,81 @@
</div>
</div>
<div class="mb-4">
<h6 class="text-muted mb-2">Branding</h6>
<div class="row g-3 align-items-end">
<!-- Logo -->
<div class="col-md-6">
<label for="logo_url" class="form-label">Logo (adres URL PNG/SVG)</label>
<input type="text" class="form-control" id="logo_url" name="logo_url"
value="{{ settings.logo_url if settings else '' }}" placeholder="https://example.com/logo.png">
<div class="form-text">Najlepiej transparentne, do 60px wysokości.</div>
<!-- SEKCJA: Branding -->
<div class="card shadow-sm mb-4">
<div class="card-header bg-secondary text-white d-flex align-items-center justify-content-between gap-2">
<h3 class="card-title mb-0">Branding</h3>
<small class="opacity-75">Logo i tytuły wyświetlane w menu i stopce</small>
</div>
<div class="card-body">
<!-- Wspólne zasoby: logo + tytuł serwisu -->
<div class="row g-3 align-items-end">
<div class="col-md-6">
<label for="logo_url" class="form-label">Logo (URL PNG/SVG)</label>
<input type="text" class="form-control" id="logo_url" name="logo_url"
value="{{ settings.logo_url if settings else '' }}" placeholder="https://example.com/logo.svg">
<div class="form-text">Transparentne, do ~60px wysokości.</div>
{% if settings and settings.logo_url %}
<div class="mt-2">
<img src="{{ settings.logo_url }}" alt="Logo preview" style="max-height:50px">
</div>
{% endif %}
</div>
<div class="col-md-6">
<label for="site_title" class="form-label">Tytuł serwisu</label>
<input type="text" class="form-control" id="site_title" name="site_title"
value="{{ settings.site_title if settings else '' }}" placeholder="Np. Zbiórki unitraklub.pl">
</div>
</div>
<!-- Tekst -->
<div class="col-md-6">
<label for="site_title" class="form-label">Tytuł w navbarze</label>
<input type="text" class="form-control" id="site_title" name="site_title"
value="{{ settings.site_title if settings else '' }}" placeholder="Np. Zbiórki unitraklub.pl">
<hr class="my-4">
<!-- NAVBAR -->
<div class="row g-3">
<div class="col-md-6">
<h6 class="mb-2">Menu (navbar)</h6>
<div class="form-check">
<input class="form-check-input" type="radio" name="navbar_brand_mode" id="navbar_mode_logo" value="logo"
{% if settings and settings.navbar_brand_mode=='logo' or (settings and settings.show_logo_in_navbar)
%}checked{% endif %}>
<label class="form-check-label" for="navbar_mode_logo">Pokaż logo</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="navbar_brand_mode" id="navbar_mode_text" value="text"
{% if not settings or (settings and settings.navbar_brand_mode !='logo' and not
settings.show_logo_in_navbar) %}checked{% endif %}>
<label class="form-check-label" for="navbar_mode_text">Pokaż tekst</label>
</div>
<div class="form-text mt-1">Jeśli wybierzesz logo, użyjemy adresu z pola "Tytuł serwisu".</div>
</div>
<!-- STOPKA -->
<div class="col-md-6">
<h6 class="mb-2">Stopka</h6>
<div class="form-check">
<input class="form-check-input" type="radio" name="footer_brand_mode" id="footer_mode_logo" value="logo"
{% if settings and settings.footer_brand_mode=='logo' %}checked{% endif %}>
<label class="form-check-label" for="footer_mode_logo">Logo</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="footer_brand_mode" id="footer_mode_text" value="text"
{% if not settings or (settings and settings.footer_brand_mode !='logo' ) %}checked{% endif %}>
<label class="form-check-label" for="footer_mode_text">Tekst</label>
</div>
<label for="footer_text" class="form-label mt-2">Tekst w stopce (gdy wybrano „Tekst”)</label>
<input type="text" class="form-control" id="footer_text" name="footer_text"
value="{{ settings.footer_text if settings and settings.footer_text else '' }}"
placeholder="Np. © {{ now().year if now else '2025' }} Zbiórki">
<div class="form-text">Pozostaw pusty, by użyć domyślnego.</div>
</div>
</div>
</div>
<!-- Checkbox: logo w navbarze -->
<div class="form-check mt-3">
<input class="form-check-input" type="checkbox" id="show_logo_in_navbar" name="show_logo_in_navbar" {% if
settings and settings.show_logo_in_navbar %}checked{% endif %}>
<label class="form-check-label" for="show_logo_in_navbar">Wyświetlaj logo w navbarze</label>
</div>
{% if settings and settings.logo_url %}
<div class="mt-3">
<span class="form-text d-block mb-1">Podgląd logo:</span>
<img src="{{ settings.logo_url }}" alt="Logo preview" style="max-height:50px;">
</div>
{% endif %}
</div>
<!-- CTA -->
<div class="d-flex justify-content-between">
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-outline-light border">Powrót</a>

View File

@@ -13,11 +13,16 @@
<body class="d-flex flex-column min-vh-100">
<nav class="navbar navbar-expand-lg">
<div class="container">
<a class="navbar-brand" href="{{ url_for('index') }}">
{% if global_settings and global_settings.show_logo_in_navbar and global_settings.logo_url %}
<a class="navbar-brand d-flex align-items-center gap-2" href="{{ url_for('index') }}">
{% set nav_mode = (global_settings.navbar_brand_mode if global_settings and
global_settings.navbar_brand_mode else ('logo' if global_settings and
global_settings.show_logo_in_navbar else 'text')) %}
{% if nav_mode == 'logo' and global_settings and global_settings.logo_url %}
<img src="{{ global_settings.logo_url }}" alt="Logo" style="max-height:40px; vertical-align:middle;">
{% else %}
<span>{{ global_settings.site_title if global_settings and global_settings.site_title else "Zbiórki"
}}</span>
{% endif %}
{{ global_settings.site_title if global_settings and global_settings.site_title else "Zbiórki" }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar"
@@ -66,11 +71,14 @@
</div>
<!-- stopka -->
<footer class="mt-auto text-center py-3 border-top" style="background: var(--surface-0);">
{% if global_settings and global_settings.logo_url %}
<img src="{{ global_settings.logo_url }}" alt="Logo" style="max-height:60px; opacity:0.85;">
<footer class="border-top mt-5 py-3 text-center small text-muted">
{% set footer_mode = global_settings.footer_brand_mode if global_settings and global_settings.footer_brand_mode
else 'text' %}
{% if footer_mode == 'logo' and global_settings and global_settings.logo_url %}
<img src="{{ global_settings.logo_url }}" alt="Logo" style="max-height:28px;">
{% else %}
<small class="text-muted">© linuxiarz.pl</small>
{{ global_settings.footer_text if global_settings and global_settings.footer_text else "© " ~ (now().year if now
else '2025') ~ " linuxiarz.pl" }}
{% endif %}
</footer>