logo w navbarze lub tekst
This commit is contained in:
22
alters.txt
22
alters.txt
@@ -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 site_title TEXT DEFAULT '';
|
||||||
ALTER TABLE global_settings ADD COLUMN show_logo_in_navbar BOOLEAN DEFAULT 0;
|
ALTER TABLE global_settings ADD COLUMN show_logo_in_navbar BOOLEAN DEFAULT 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
COMMIT;
|
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
16
app.py
@@ -88,7 +88,10 @@ class GlobalSettings(db.Model):
|
|||||||
logo_url = db.Column(db.String(255), nullable=True)
|
logo_url = db.Column(db.String(255), nullable=True)
|
||||||
site_title = db.Column(db.String(120), 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)
|
||||||
|
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
|
@login_manager.user_loader
|
||||||
def load_user(user_id):
|
def load_user(user_id):
|
||||||
@@ -479,7 +482,10 @@ def admin_ustawienia():
|
|||||||
allowed_login_hosts = request.form.get("allowed_login_hosts")
|
allowed_login_hosts = request.form.get("allowed_login_hosts")
|
||||||
logo_url = request.form.get("logo_url")
|
logo_url = request.form.get("logo_url")
|
||||||
site_title = request.form.get("site_title")
|
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:
|
if settings is None:
|
||||||
settings = GlobalSettings(
|
settings = GlobalSettings(
|
||||||
@@ -489,6 +495,9 @@ def admin_ustawienia():
|
|||||||
logo_url=logo_url,
|
logo_url=logo_url,
|
||||||
site_title=site_title,
|
site_title=site_title,
|
||||||
show_logo_in_navbar=show_logo_in_navbar,
|
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)
|
db.session.add(settings)
|
||||||
else:
|
else:
|
||||||
@@ -498,6 +507,9 @@ def admin_ustawienia():
|
|||||||
settings.logo_url = logo_url
|
settings.logo_url = logo_url
|
||||||
settings.site_title = site_title
|
settings.site_title = site_title
|
||||||
settings.show_logo_in_navbar = show_logo_in_navbar
|
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()
|
db.session.commit()
|
||||||
flash("Ustawienia globalne zostały zaktualizowane", "success")
|
flash("Ustawienia globalne zostały zaktualizowane", "success")
|
||||||
|
@@ -76,40 +76,81 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-4">
|
<!-- SEKCJA: Branding -->
|
||||||
<h6 class="text-muted mb-2">Branding</h6>
|
<div class="card shadow-sm mb-4">
|
||||||
<div class="row g-3 align-items-end">
|
<div class="card-header bg-secondary text-white d-flex align-items-center justify-content-between gap-2">
|
||||||
<!-- Logo -->
|
<h3 class="card-title mb-0">Branding</h3>
|
||||||
<div class="col-md-6">
|
<small class="opacity-75">Logo i tytuły wyświetlane w menu i stopce</small>
|
||||||
<label for="logo_url" class="form-label">Logo (adres URL PNG/SVG)</label>
|
</div>
|
||||||
<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="card-body">
|
||||||
<div class="form-text">Najlepiej transparentne, do 60px wysokości.</div>
|
<!-- 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>
|
</div>
|
||||||
|
|
||||||
<!-- Tekst -->
|
<hr class="my-4">
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="site_title" class="form-label">Tytuł w navbarze</label>
|
<!-- NAVBAR -->
|
||||||
<input type="text" class="form-control" id="site_title" name="site_title"
|
<div class="row g-3">
|
||||||
value="{{ settings.site_title if settings else '' }}" placeholder="Np. Zbiórki unitraklub.pl">
|
<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>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- CTA -->
|
<!-- CTA -->
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-outline-light border">Powrót</a>
|
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-outline-light border">Powrót</a>
|
||||||
|
@@ -13,11 +13,16 @@
|
|||||||
<body class="d-flex flex-column min-vh-100">
|
<body class="d-flex flex-column min-vh-100">
|
||||||
<nav class="navbar navbar-expand-lg">
|
<nav class="navbar navbar-expand-lg">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a class="navbar-brand" href="{{ url_for('index') }}">
|
<a class="navbar-brand d-flex align-items-center gap-2" href="{{ url_for('index') }}">
|
||||||
{% if global_settings and global_settings.show_logo_in_navbar and global_settings.logo_url %}
|
{% 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;">
|
<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 %}
|
{% endif %}
|
||||||
{{ global_settings.site_title if global_settings and global_settings.site_title else "Zbiórki" }}
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar"
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar"
|
||||||
@@ -66,11 +71,14 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- stopka -->
|
<!-- stopka -->
|
||||||
<footer class="mt-auto text-center py-3 border-top" style="background: var(--surface-0);">
|
<footer class="border-top mt-5 py-3 text-center small text-muted">
|
||||||
{% if global_settings and global_settings.logo_url %}
|
{% set footer_mode = global_settings.footer_brand_mode if global_settings and global_settings.footer_brand_mode
|
||||||
<img src="{{ global_settings.logo_url }}" alt="Logo" style="max-height:60px; opacity:0.85;">
|
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 %}
|
{% 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 %}
|
{% endif %}
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user