wylaczenie sposob platnosci i porpawki ux
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE zbiorka ALTER COLUMN numer_konta DROP NOT NULL;
|
||||||
|
ALTER TABLE zbiorka ALTER COLUMN numer_telefonu_blik DROP NOT NULL;
|
155
app.py
155
app.py
@@ -82,8 +82,8 @@ class Zbiorka(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
nazwa = db.Column(db.String(100), nullable=False)
|
nazwa = db.Column(db.String(100), nullable=False)
|
||||||
opis = db.Column(db.Text, nullable=False)
|
opis = db.Column(db.Text, nullable=False)
|
||||||
numer_konta = db.Column(db.String(50), nullable=False)
|
numer_konta = db.Column(db.String(50), nullable=True)
|
||||||
numer_telefonu_blik = db.Column(db.String(50), nullable=False)
|
numer_telefonu_blik = db.Column(db.String(50), nullable=True)
|
||||||
cel = db.Column(Numeric(12, 2), nullable=False, default=0)
|
cel = db.Column(Numeric(12, 2), nullable=False, default=0)
|
||||||
stan = db.Column(Numeric(12, 2), default=0)
|
stan = db.Column(Numeric(12, 2), default=0)
|
||||||
ukryta = db.Column(db.Boolean, default=False)
|
ukryta = db.Column(db.Boolean, default=False)
|
||||||
@@ -92,6 +92,8 @@ class Zbiorka(db.Model):
|
|||||||
pokaz_postep_finanse = db.Column(db.Boolean, default=True, nullable=False)
|
pokaz_postep_finanse = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
pokaz_postep_pozycje = db.Column(db.Boolean, default=True, nullable=False)
|
pokaz_postep_pozycje = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
pokaz_postep_kwotowo = db.Column(db.Boolean, default=True, nullable=False)
|
pokaz_postep_kwotowo = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
|
uzyj_konta = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
|
uzyj_blik = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
|
|
||||||
wplaty = db.relationship(
|
wplaty = db.relationship(
|
||||||
"Wplata",
|
"Wplata",
|
||||||
@@ -386,88 +388,69 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
return redirect(url_for("index"))
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
is_edit = zbiorka_id is not None
|
is_edit = zbiorka_id is not None
|
||||||
zb = None
|
zb = db.session.get(Zbiorka, zbiorka_id) if is_edit else None
|
||||||
if is_edit:
|
if is_edit and zb is None:
|
||||||
zb = db.session.get(Zbiorka, zbiorka_id)
|
abort(404)
|
||||||
if zb is None:
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
global_settings = UstawieniaGlobalne.query.first()
|
global_settings = UstawieniaGlobalne.query.first()
|
||||||
|
|
||||||
|
def _temp_obj():
|
||||||
|
t = zb or Zbiorka()
|
||||||
|
t.nazwa = (request.form.get("nazwa", "") or "").strip()
|
||||||
|
t.opis = (request.form.get("opis", "") or "").strip()
|
||||||
|
t.numer_konta = (request.form.get("numer_konta", "") or "").strip()
|
||||||
|
t.numer_telefonu_blik = (request.form.get("numer_telefonu_blik", "") or "").strip()
|
||||||
|
t.ukryj_kwote = "ukryj_kwote" in request.form
|
||||||
|
t.pokaz_postep_finanse = "pokaz_postep_finanse" in request.form
|
||||||
|
t.pokaz_postep_pozycje = "pokaz_postep_pozycje" in request.form
|
||||||
|
t.pokaz_postep_kwotowo = "pokaz_postep_kwotowo" in request.form
|
||||||
|
t.uzyj_konta = "uzyj_konta" in request.form
|
||||||
|
t.uzyj_blik = "uzyj_blik" in request.form
|
||||||
|
return t
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
# Pola wspólne
|
# Pola
|
||||||
nazwa = (request.form.get("nazwa", "") or "").strip()
|
nazwa = (request.form.get("nazwa", "") or "").strip()
|
||||||
opis = (request.form.get("opis", "") or "").strip()
|
opis = (request.form.get("opis", "") or "").strip()
|
||||||
numer_konta = (request.form.get("numer_konta", "") or "").strip()
|
numer_konta = (request.form.get("numer_konta", "") or "").strip()
|
||||||
numer_telefonu_blik = (request.form.get("numer_telefonu_blik", "") or "").strip()
|
numer_telefonu_blik = (request.form.get("numer_telefonu_blik", "") or "").strip()
|
||||||
|
|
||||||
# Widoczność kwot i poszczególnych pasków postępu
|
# Przełączniki płatności
|
||||||
|
uzyj_konta = "uzyj_konta" in request.form
|
||||||
|
uzyj_blik = "uzyj_blik" in request.form
|
||||||
|
|
||||||
|
# Widoczność/metryki
|
||||||
ukryj_kwote = "ukryj_kwote" in request.form
|
ukryj_kwote = "ukryj_kwote" in request.form
|
||||||
pokaz_postep_finanse = "pokaz_postep_finanse" in request.form
|
pokaz_postep_finanse = "pokaz_postep_finanse" in request.form
|
||||||
pokaz_postep_pozycje = "pokaz_postep_pozycje" in request.form
|
pokaz_postep_pozycje = "pokaz_postep_pozycje" in request.form
|
||||||
pokaz_postep_kwotowo = "pokaz_postep_kwotowo" in request.form
|
pokaz_postep_kwotowo = "pokaz_postep_kwotowo" in request.form
|
||||||
|
|
||||||
# Walidacja wymaganych pól tekstowych (zanim uderzymy w bazę)
|
# Walidacje
|
||||||
if not nazwa:
|
if not nazwa:
|
||||||
flash("Nazwa jest wymagana", "danger")
|
flash("Nazwa jest wymagana", "danger")
|
||||||
temp_zb = zb or Zbiorka()
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
temp_zb.nazwa = nazwa
|
|
||||||
temp_zb.opis = opis
|
|
||||||
temp_zb.numer_konta = numer_konta
|
|
||||||
temp_zb.numer_telefonu_blik = numer_telefonu_blik
|
|
||||||
temp_zb.ukryj_kwote = ukryj_kwote
|
|
||||||
temp_zb.pokaz_postep_finanse = pokaz_postep_finanse
|
|
||||||
temp_zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
|
||||||
temp_zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
|
||||||
return render_template("admin/formularz_zbiorek.html", zbiorka=temp_zb, global_settings=global_settings)
|
|
||||||
|
|
||||||
if not opis:
|
if not opis:
|
||||||
flash("Opis jest wymagany", "danger")
|
flash("Opis jest wymagany", "danger")
|
||||||
temp_zb = zb or Zbiorka()
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
temp_zb.nazwa = nazwa
|
|
||||||
temp_zb.opis = opis
|
|
||||||
temp_zb.numer_konta = numer_konta
|
|
||||||
temp_zb.numer_telefonu_blik = numer_telefonu_blik
|
|
||||||
temp_zb.ukryj_kwote = ukryj_kwote
|
|
||||||
temp_zb.pokaz_postep_finanse = pokaz_postep_finanse
|
|
||||||
temp_zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
|
||||||
temp_zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
|
||||||
return render_template("admin/formularz_zbiorek.html", zbiorka=temp_zb, global_settings=global_settings)
|
|
||||||
|
|
||||||
if not numer_konta:
|
# Co najmniej jeden kanał
|
||||||
flash("Numer konta jest wymagany", "danger")
|
if not (uzyj_konta or uzyj_blik):
|
||||||
temp_zb = zb or Zbiorka()
|
flash("Włącz co najmniej jeden kanał wpłat (konto lub BLIK).", "danger")
|
||||||
temp_zb.nazwa = nazwa
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
temp_zb.opis = opis
|
|
||||||
temp_zb.numer_konta = numer_konta
|
|
||||||
temp_zb.numer_telefonu_blik = numer_telefonu_blik
|
|
||||||
temp_zb.ukryj_kwote = ukryj_kwote
|
|
||||||
temp_zb.pokaz_postep_finanse = pokaz_postep_finanse
|
|
||||||
temp_zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
|
||||||
temp_zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
|
||||||
return render_template("admin/formularz_zbiorek.html", zbiorka=temp_zb, global_settings=global_settings)
|
|
||||||
|
|
||||||
if not numer_telefonu_blik:
|
# Warunkowe wartości
|
||||||
flash("Numer telefonu BLIK jest wymagany", "danger")
|
if uzyj_konta and not numer_konta:
|
||||||
temp_zb = zb or Zbiorka()
|
flash("Numer konta jest wymagany (kanał przelewu włączony).", "danger")
|
||||||
temp_zb.nazwa = nazwa
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
temp_zb.opis = opis
|
|
||||||
temp_zb.numer_konta = numer_konta
|
|
||||||
temp_zb.numer_telefonu_blik = numer_telefonu_blik
|
|
||||||
temp_zb.ukryj_kwote = ukryj_kwote
|
|
||||||
temp_zb.pokaz_postep_finanse = pokaz_postep_finanse
|
|
||||||
temp_zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
|
||||||
temp_zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
|
||||||
return render_template("admin/formularz_zbiorek.html", zbiorka=temp_zb, global_settings=global_settings)
|
|
||||||
|
|
||||||
# Cel — Decimal, > 0; akceptuj przecinek i usuń spacje/nbsp
|
if uzyj_blik and not numer_telefonu_blik:
|
||||||
|
flash("Numer telefonu BLIK jest wymagany (kanał BLIK włączony).", "danger")
|
||||||
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
|
|
||||||
|
# Cel > 0
|
||||||
cel_raw = (request.form.get("cel", "") or "")
|
cel_raw = (request.form.get("cel", "") or "")
|
||||||
cel_norm = (
|
cel_norm = cel_raw.replace(" ", "").replace("\u00A0", "").replace(",", ".").strip()
|
||||||
cel_raw.replace(" ", "")
|
|
||||||
.replace("\u00A0", "")
|
|
||||||
.replace(",", ".")
|
|
||||||
.strip()
|
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
if not cel_norm:
|
if not cel_norm:
|
||||||
raise InvalidOperation
|
raise InvalidOperation
|
||||||
@@ -476,51 +459,41 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
raise InvalidOperation
|
raise InvalidOperation
|
||||||
except (InvalidOperation, ValueError):
|
except (InvalidOperation, ValueError):
|
||||||
flash("Podano nieprawidłową wartość dla celu zbiórki", "danger")
|
flash("Podano nieprawidłową wartość dla celu zbiórki", "danger")
|
||||||
# Odtwórz stan formularza, ale nie używaj zbiorka.id w szablonie
|
return render_template("admin/formularz_zbiorek.html", zbiorka=_temp_obj(), global_settings=global_settings)
|
||||||
temp_zb = zb or Zbiorka()
|
|
||||||
temp_zb.nazwa = nazwa
|
|
||||||
temp_zb.opis = opis
|
|
||||||
temp_zb.numer_konta = numer_konta
|
|
||||||
temp_zb.numer_telefonu_blik = numer_telefonu_blik
|
|
||||||
# cel pozostaw niewypełniony przy błędzie, aby input pokazał to co wpisał użytkownik
|
|
||||||
temp_zb.ukryj_kwote = ukryj_kwote
|
|
||||||
temp_zb.pokaz_postep_finanse = pokaz_postep_finanse
|
|
||||||
temp_zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
|
||||||
temp_zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
|
||||||
return render_template("admin/formularz_zbiorek.html", zbiorka=temp_zb, global_settings=global_settings)
|
|
||||||
|
|
||||||
# Lista produktów
|
# Produkty
|
||||||
names = request.form.getlist("item_nazwa[]")
|
names = request.form.getlist("item_nazwa[]")
|
||||||
links = request.form.getlist("item_link[]")
|
links = request.form.getlist("item_link[]")
|
||||||
prices = request.form.getlist("item_cena[]")
|
prices = request.form.getlist("item_cena[]")
|
||||||
|
|
||||||
def _read_price(val):
|
def _read_price(val: str):
|
||||||
"""Zwraca Decimal(>=0) albo None; akceptuje przecinek jako separator dziesiętny."""
|
|
||||||
if not val or not val.strip():
|
if not val or not val.strip():
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
d = Decimal(val.replace(",", "."))
|
d = Decimal(val.replace(",", "."))
|
||||||
if d < 0:
|
return d if d >= 0 else None
|
||||||
return None
|
|
||||||
return d
|
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# --- ZAPIS ZBIÓRKI + PRODUKTÓW ---
|
# Zapis
|
||||||
if is_edit:
|
if is_edit:
|
||||||
# Aktualizacja istniejącej zbiórki
|
|
||||||
zb.nazwa = nazwa
|
zb.nazwa = nazwa
|
||||||
zb.opis = opis
|
zb.opis = opis
|
||||||
zb.numer_konta = numer_konta
|
|
||||||
zb.numer_telefonu_blik = numer_telefonu_blik
|
# NOT NULL-safe: puste stringi gdy wyłączone
|
||||||
|
zb.uzyj_konta = uzyj_konta
|
||||||
|
zb.uzyj_blik = uzyj_blik
|
||||||
|
zb.numer_konta = numer_konta if uzyj_konta else ""
|
||||||
|
zb.numer_telefonu_blik = numer_telefonu_blik if uzyj_blik else ""
|
||||||
|
|
||||||
zb.cel = cel
|
zb.cel = cel
|
||||||
zb.ukryj_kwote = ukryj_kwote
|
zb.ukryj_kwote = ukryj_kwote
|
||||||
zb.pokaz_postep_finanse = pokaz_postep_finanse
|
zb.pokaz_postep_finanse = pokaz_postep_finanse
|
||||||
zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
zb.pokaz_postep_pozycje = pokaz_postep_pozycje
|
||||||
zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
zb.pokaz_postep_kwotowo = pokaz_postep_kwotowo
|
||||||
db.session.commit() # zapisz bazowe pola
|
db.session.commit()
|
||||||
|
|
||||||
# Nadpisz listę produktów
|
# Nadpisz pozycje
|
||||||
zb.przedmioty.clear()
|
zb.przedmioty.clear()
|
||||||
for i, raw_name in enumerate(names):
|
for i, raw_name in enumerate(names):
|
||||||
name = (raw_name or "").strip()
|
name = (raw_name or "").strip()
|
||||||
@@ -529,7 +502,6 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
link = (links[i] if i < len(links) else "").strip() or None
|
link = (links[i] if i < len(links) else "").strip() or None
|
||||||
cena_val = _read_price(prices[i] if i < len(prices) else "")
|
cena_val = _read_price(prices[i] if i < len(prices) else "")
|
||||||
kupione_val = request.form.get(f"item_kupione_val_{i}") == "1"
|
kupione_val = request.form.get(f"item_kupione_val_{i}") == "1"
|
||||||
|
|
||||||
db.session.add(Przedmiot(
|
db.session.add(Przedmiot(
|
||||||
zbiorka_id=zb.id,
|
zbiorka_id=zb.id,
|
||||||
nazwa=name,
|
nazwa=name,
|
||||||
@@ -537,17 +509,17 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
cena=cena_val,
|
cena=cena_val,
|
||||||
kupione=kupione_val
|
kupione=kupione_val
|
||||||
))
|
))
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash("Zbiórka została zaktualizowana", "success")
|
flash("Zbiórka została zaktualizowana", "success")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Utworzenie nowej zbiórki
|
|
||||||
nowa = Zbiorka(
|
nowa = Zbiorka(
|
||||||
nazwa=nazwa,
|
nazwa=nazwa,
|
||||||
opis=opis,
|
opis=opis,
|
||||||
numer_konta=numer_konta,
|
uzyj_konta=uzyj_konta,
|
||||||
numer_telefonu_blik=numer_telefonu_blik,
|
uzyj_blik=uzyj_blik,
|
||||||
|
numer_konta=(numer_konta if uzyj_konta else ""),
|
||||||
|
numer_telefonu_blik=(numer_telefonu_blik if uzyj_blik else ""),
|
||||||
cel=cel,
|
cel=cel,
|
||||||
ukryj_kwote=ukryj_kwote,
|
ukryj_kwote=ukryj_kwote,
|
||||||
pokaz_postep_finanse=pokaz_postep_finanse,
|
pokaz_postep_finanse=pokaz_postep_finanse,
|
||||||
@@ -557,7 +529,6 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
db.session.add(nowa)
|
db.session.add(nowa)
|
||||||
db.session.commit() # potrzebne ID
|
db.session.commit() # potrzebne ID
|
||||||
|
|
||||||
# Dodaj produkty do nowej zbiórki
|
|
||||||
for i, raw_name in enumerate(names):
|
for i, raw_name in enumerate(names):
|
||||||
name = (raw_name or "").strip()
|
name = (raw_name or "").strip()
|
||||||
if not name:
|
if not name:
|
||||||
@@ -565,7 +536,6 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
link = (links[i] if i < len(links) else "").strip() or None
|
link = (links[i] if i < len(links) else "").strip() or None
|
||||||
cena_val = _read_price(prices[i] if i < len(prices) else "")
|
cena_val = _read_price(prices[i] if i < len(prices) else "")
|
||||||
kupione_val = request.form.get(f"item_kupione_val_{i}") == "1"
|
kupione_val = request.form.get(f"item_kupione_val_{i}") == "1"
|
||||||
|
|
||||||
db.session.add(Przedmiot(
|
db.session.add(Przedmiot(
|
||||||
zbiorka_id=nowa.id,
|
zbiorka_id=nowa.id,
|
||||||
nazwa=name,
|
nazwa=name,
|
||||||
@@ -573,7 +543,6 @@ def formularz_zbiorek(zbiorka_id=None):
|
|||||||
cena=cena_val,
|
cena=cena_val,
|
||||||
kupione=kupione_val
|
kupione=kupione_val
|
||||||
))
|
))
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash("Zbiórka została dodana", "success")
|
flash("Zbiórka została dodana", "success")
|
||||||
|
|
||||||
|
@@ -391,34 +391,50 @@ select.form-select:focus {
|
|||||||
|
|
||||||
/* Tylko ten przycisk */
|
/* Tylko ten przycisk */
|
||||||
.btn.btn-outline-light.btn-opis {
|
.btn.btn-outline-light.btn-opis {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
transition: none;
|
transition: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn.btn-outline-light.btn-opis:hover,
|
.btn.btn-outline-light.btn-opis:hover,
|
||||||
.btn.btn-outline-light.btn-opis:focus {
|
.btn.btn-outline-light.btn-opis:focus {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #161616;
|
background-color: #161616;
|
||||||
border-color: color-mix(in srgb, var(--accent) 20%, var(--border));
|
border-color: color-mix(in srgb, var(--accent) 20%, var(--border));
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn.btn-outline-light {
|
.btn.btn-outline-light {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 1px solid rgba(255,255,255,0.9);
|
border: 1px solid rgba(255, 255, 255, 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn.btn-outline-light:hover,
|
.btn.btn-outline-light:hover,
|
||||||
.btn.btn-outline-light:focus {
|
.btn.btn-outline-light:focus {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #161616;
|
background-color: #161616;
|
||||||
border-color: color-mix(in srgb, var(--accent) 20%, #ffffff);
|
border-color: color-mix(in srgb, var(--accent) 20%, #ffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn.btn-outline-light:active {
|
.btn.btn-outline-light:active {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #141414;
|
background-color: #141414;
|
||||||
border-color: color-mix(in srgb, var(--accent) 24%, #ffffff);
|
border-color: color-mix(in srgb, var(--accent) 24%, #ffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#kanalyWarning,
|
||||||
|
#postepyWarning {
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
background-color: #2c2c2c;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:disabled,
|
||||||
|
textarea:disabled,
|
||||||
|
select:disabled {
|
||||||
|
background-color: #2b2b2b !important;
|
||||||
|
color: #bbb !important;
|
||||||
|
opacity: 1 !important;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
88
static/js/sposoby_wplat.js
Normal file
88
static/js/sposoby_wplat.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
(function () {
|
||||||
|
const form = document.getElementById('form-edit-zbiorka') || document.getElementById('form-add-zbiorka') || document.querySelector('form');
|
||||||
|
|
||||||
|
const map = [
|
||||||
|
['uzyj_konta', 'numer_konta'],
|
||||||
|
['uzyj_blik', 'numer_telefonu_blik']
|
||||||
|
];
|
||||||
|
|
||||||
|
const warnBox = document.getElementById('kanalyWarning');
|
||||||
|
|
||||||
|
function showWarn(show) {
|
||||||
|
if (!warnBox) return;
|
||||||
|
warnBox.classList.toggle('d-none', !show);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEl(id) { return document.getElementById(id); }
|
||||||
|
|
||||||
|
function toggleField(chkId, inputId) {
|
||||||
|
const chk = getEl(chkId);
|
||||||
|
const inp = getEl(inputId);
|
||||||
|
if (!inp || !chk) return;
|
||||||
|
const on = chk.checked;
|
||||||
|
inp.disabled = !on;
|
||||||
|
if (on) inp.setAttribute('required', '');
|
||||||
|
else inp.removeAttribute('required');
|
||||||
|
}
|
||||||
|
|
||||||
|
function atLeastOneOn() {
|
||||||
|
return map.some(([c]) => getEl(c)?.checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
function blinkInvalid(el) {
|
||||||
|
if (!el) return;
|
||||||
|
el.classList.add('is-invalid');
|
||||||
|
setTimeout(() => el.classList.remove('is-invalid'), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
function preventUncheckLast(e) {
|
||||||
|
const target = e.target;
|
||||||
|
if (target.checked) return;
|
||||||
|
const after = map.map(([c]) => c === target.id ? false : !!getEl(c)?.checked);
|
||||||
|
if (!after.some(Boolean)) {
|
||||||
|
e.preventDefault();
|
||||||
|
target.checked = true;
|
||||||
|
showWarn(true);
|
||||||
|
blinkInvalid(target);
|
||||||
|
} else {
|
||||||
|
showWarn(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onToggle(chkId, inputId) {
|
||||||
|
toggleField(chkId, inputId);
|
||||||
|
showWarn(!atLeastOneOn());
|
||||||
|
}
|
||||||
|
|
||||||
|
map.forEach(([chkId, inputId]) => {
|
||||||
|
const chk = getEl(chkId);
|
||||||
|
if (!chk) return;
|
||||||
|
chk.addEventListener('click', preventUncheckLast);
|
||||||
|
chk.addEventListener('change', () => onToggle(chkId, inputId));
|
||||||
|
toggleField(chkId, inputId);
|
||||||
|
});
|
||||||
|
showWarn(!atLeastOneOn());
|
||||||
|
|
||||||
|
if (form) {
|
||||||
|
form.addEventListener('submit', function (e) {
|
||||||
|
if (!atLeastOneOn()) {
|
||||||
|
e.preventDefault();
|
||||||
|
showWarn(true);
|
||||||
|
blinkInvalid(getEl('uzyj_konta') || getEl('uzyj_blik'));
|
||||||
|
(getEl('uzyj_konta') || getEl('uzyj_blik'))?.focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [chkId, inputId] of map) {
|
||||||
|
const chk = getEl(chkId), inp = getEl(inputId);
|
||||||
|
if (chk?.checked && inp && !inp.value.trim()) {
|
||||||
|
e.preventDefault();
|
||||||
|
showWarn(true);
|
||||||
|
blinkInvalid(inp);
|
||||||
|
inp.focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
@@ -17,14 +17,16 @@
|
|||||||
<!-- Nawigacja / powrót -->
|
<!-- Nawigacja / powrót -->
|
||||||
<div class="d-flex align-items-center gap-2 mb-3">
|
<div class="d-flex align-items-center gap-2 mb-3">
|
||||||
{% if is_edit and zbiorka and zbiorka.id %}
|
{% if is_edit and zbiorka and zbiorka.id %}
|
||||||
<a href="{{ url_for('zbiorka', zbiorka_id=zbiorka.id) }}" class="btn btn-sm btn-outline-light">← Szczegóły zbiórki</a>
|
<a href="{{ url_for('zbiorka', zbiorka_id=zbiorka.id) }}" class="btn btn-sm btn-outline-light">← Szczegóły
|
||||||
|
zbiórki</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-sm btn-outline-light">← Panel Admina</a>
|
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-sm btn-outline-light">← Panel Admina</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card shadow-sm">
|
<div class="card shadow-sm">
|
||||||
<div class="card-header bg-secondary text-white d-flex flex-wrap align-items-center justify-content-between gap-2">
|
<div
|
||||||
|
class="card-header bg-secondary text-white d-flex flex-wrap align-items-center justify-content-between gap-2">
|
||||||
<h3 class="card-title mb-0">
|
<h3 class="card-title mb-0">
|
||||||
{{ 'Edytuj zbiórkę' if is_edit else 'Dodaj nową zbiórkę' }}
|
{{ 'Edytuj zbiórkę' if is_edit else 'Dodaj nową zbiórkę' }}
|
||||||
</h3>
|
</h3>
|
||||||
@@ -48,19 +50,18 @@
|
|||||||
<span class="badge bg-dark border" style="border-color: var(--border);">
|
<span class="badge bg-dark border" style="border-color: var(--border);">
|
||||||
Brakuje: {{ delta|round(2) }} PLN
|
Brakuje: {{ delta|round(2) }} PLN
|
||||||
</span>
|
</span>
|
||||||
{% elif delta < 0 %}
|
{% elif delta < 0 %} <span class="badge bg-dark border" style="border-color: var(--border);">
|
||||||
<span class="badge bg-dark border" style="border-color: var(--border);">
|
|
||||||
Nadwyżka: {{ (-delta)|round(2) }} PLN
|
Nadwyżka: {{ (-delta)|round(2) }} PLN
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if zbiorka.ukryj_kwote %}
|
{% if zbiorka.ukryj_kwote %}
|
||||||
<span class="badge bg-secondary">Kwoty niepubliczne</span>
|
<span class="badge bg-secondary">Kwoty niepubliczne</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-success">Kwoty widoczne</span>
|
<span class="badge bg-success">Kwoty widoczne</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<small class="opacity-75">Uzupełnij podstawowe dane i dane płatności</small>
|
<small class="opacity-75">Uzupełnij podstawowe dane i dane płatności</small>
|
||||||
@@ -77,30 +78,17 @@
|
|||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="nazwa" class="form-label">Nazwa zbiórki</label>
|
<label for="nazwa" class="form-label">Nazwa zbiórki</label>
|
||||||
<input
|
<input type="text" class="form-control" id="nazwa" name="nazwa" maxlength="120"
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
id="nazwa"
|
|
||||||
name="nazwa"
|
|
||||||
maxlength="120"
|
|
||||||
placeholder="{{ 'Krótki, zrozumiały tytuł' if is_edit else 'Np. Wsparcie dla schroniska Azor' }}"
|
placeholder="{{ 'Krótki, zrozumiały tytuł' if is_edit else 'Np. Wsparcie dla schroniska Azor' }}"
|
||||||
value="{{ (zbiorka.nazwa if zbiorka else request.form.get('nazwa','')) }}"
|
value="{{ (zbiorka.nazwa if zbiorka else request.form.get('nazwa','')) }}" required
|
||||||
required
|
aria-describedby="nazwaHelp">
|
||||||
aria-describedby="nazwaHelp"
|
|
||||||
>
|
|
||||||
<div id="nazwaHelp" class="form-text">Krótki, zrozumiały tytuł. Max 120 znaków.</div>
|
<div id="nazwaHelp" class="form-text">Krótki, zrozumiały tytuł. Max 120 znaków.</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="opis" class="form-label">Opis (Markdown)</label>
|
<label for="opis" class="form-label">Opis (Markdown)</label>
|
||||||
<textarea
|
<textarea class="form-control" id="opis" name="opis" rows="8" required
|
||||||
class="form-control"
|
aria-describedby="opisHelp">{{ (zbiorka.opis if zbiorka else request.form.get('opis','')) }}</textarea>
|
||||||
id="opis"
|
|
||||||
name="opis"
|
|
||||||
rows="8"
|
|
||||||
required
|
|
||||||
aria-describedby="opisHelp"
|
|
||||||
>{{ (zbiorka.opis if zbiorka else request.form.get('opis','')) }}</textarea>
|
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<small id="opisHelp" class="form-text text-muted">
|
<small id="opisHelp" class="form-text text-muted">
|
||||||
Możesz używać Markdown (nagłówki, listy, linki). W edytorze włącz podgląd 👁️.
|
Możesz używać Markdown (nagłówki, listy, linki). W edytorze włącz podgląd 👁️.
|
||||||
@@ -139,32 +127,44 @@
|
|||||||
{% set i = loop.index0 %}
|
{% set i = loop.index0 %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" class="form-control" name="item_nazwa[]" value="{{ it.nazwa }}" placeholder="np. Karma Brit 10kg" required>
|
<input type="text" class="form-control" name="item_nazwa[]"
|
||||||
|
value="{{ it.nazwa }}" placeholder="np. Karma Brit 10kg" required>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="url" class="form-control" name="item_link[]" value="{{ it.link or '' }}" placeholder="https://...">
|
<input type="url" class="form-control" name="item_link[]"
|
||||||
|
value="{{ it.link or '' }}" placeholder="https://...">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" inputmode="decimal" class="form-control text-end" name="item_cena[]" value="{{ (it.cena|round(2)) if it.cena is not none else '' }}" placeholder="0,00">
|
<input type="text" inputmode="decimal" class="form-control text-end"
|
||||||
|
name="item_cena[]"
|
||||||
|
value="{{ (it.cena|round(2)) if it.cena is not none else '' }}"
|
||||||
|
placeholder="0,00">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input class="form-check-input kupione-switch" type="checkbox" {% if it.kupione %}checked{% endif %}>
|
<input class="form-check-input kupione-switch" type="checkbox" {% if
|
||||||
<input type="hidden" name="item_kupione_val_{{ i }}" value="{{ 1 if it.kupione else 0 }}">
|
it.kupione %}checked{% endif %}>
|
||||||
<label class="form-check-label small">{{ 'Kupione' if it.kupione else 'Do kupienia' }}</label>
|
<input type="hidden" name="item_kupione_val_{{ i }}"
|
||||||
|
value="{{ 1 if it.kupione else 0 }}">
|
||||||
|
<label class="form-check-label small">{{ 'Kupione' if it.kupione else 'Do
|
||||||
|
kupienia' }}</label>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
<button type="button" class="btn btn-sm btn-outline-light remove-row" title="Usuń wiersz">✕</button>
|
<button type="button" class="btn btn-sm btn-outline-light remove-row"
|
||||||
|
title="Usuń wiersz">✕</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<!-- pusty wiersz startowy -->
|
<!-- pusty wiersz startowy -->
|
||||||
<tr>
|
<tr>
|
||||||
<td><input type="text" class="form-control" name="item_nazwa[]" placeholder="np. Karma Brit 10kg" required></td>
|
<td><input type="text" class="form-control" name="item_nazwa[]"
|
||||||
<td><input type="url" class="form-control" name="item_link[]" placeholder="https://..."></td>
|
placeholder="np. Karma Brit 10kg" required></td>
|
||||||
<td><input type="text" inputmode="decimal" class="form-control text-end" name="item_cena[]" placeholder="0,00"></td>
|
<td><input type="url" class="form-control" name="item_link[]"
|
||||||
|
placeholder="https://..."></td>
|
||||||
|
<td><input type="text" inputmode="decimal" class="form-control text-end"
|
||||||
|
name="item_cena[]" placeholder="0,00"></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input class="form-check-input kupione-switch" type="checkbox">
|
<input class="form-check-input kupione-switch" type="checkbox">
|
||||||
@@ -173,7 +173,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
<button type="button" class="btn btn-sm btn-outline-light remove-row" title="Usuń wiersz">✕</button>
|
<button type="button" class="btn btn-sm btn-outline-light remove-row"
|
||||||
|
title="Usuń wiersz">✕</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -183,7 +184,8 @@
|
|||||||
|
|
||||||
<div class="d-flex gap-2">
|
<div class="d-flex gap-2">
|
||||||
<button type="button" class="btn btn-sm btn-outline-light" id="add-row">+ Dodaj pozycję</button>
|
<button type="button" class="btn btn-sm btn-outline-light" id="add-row">+ Dodaj pozycję</button>
|
||||||
<button type="button" class="btn btn-sm btn-outline-light" id="clear-empty">Usuń puste wiersze</button>
|
<button type="button" class="btn btn-sm btn-outline-light" id="clear-empty">Usuń puste
|
||||||
|
wiersze</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -192,56 +194,68 @@
|
|||||||
<!-- SEKCJA: Dane płatności -->
|
<!-- SEKCJA: Dane płatności -->
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<h6 class="text-muted mb-2">Dane płatności</h6>
|
<h6 class="text-muted mb-2">Dane płatności</h6>
|
||||||
|
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-12">
|
<!-- Przełączniki kanałów -->
|
||||||
<label for="numer_konta" class="form-label">Numer konta (IBAN)</label>
|
<div class="col-12 col-md-6">
|
||||||
<div class="input-group">
|
<div class="form-check form-switch">
|
||||||
<span class="input-group-text">PL</span>
|
<input class="form-check-input" type="checkbox" id="uzyj_konta" name="uzyj_konta" {% if
|
||||||
<input
|
zbiorka is none or zbiorka.uzyj_konta %}checked{% endif %}>
|
||||||
type="text"
|
<label class="form-check-label" for="uzyj_konta">Przelew na konto</label>
|
||||||
class="form-control"
|
|
||||||
id="numer_konta"
|
|
||||||
name="numer_konta"
|
|
||||||
inputmode="numeric"
|
|
||||||
autocomplete="off"
|
|
||||||
placeholder="12 3456 7890 1234 5678 9012 3456"
|
|
||||||
required
|
|
||||||
aria-describedby="ibanHelp"
|
|
||||||
value="{% if zbiorka and zbiorka.numer_konta %}{{ zbiorka.numer_konta }}{% elif global_settings %}{{ global_settings.numer_konta }}{% else %}{{ request.form.get('numer_konta','') }}{% endif %}"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="ibanHelp" class="form-text">Wpisz ciąg cyfr; spacje dodadzą się automatycznie dla czytelności.</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" id="uzyj_blik" name="uzyj_blik" {% if
|
||||||
|
zbiorka is none or zbiorka.uzyj_blik %}checked{% endif %}>
|
||||||
|
<label class="form-check-label" for="uzyj_blik">BLIK</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div id="kanalyWarning" class="alert alert-warning d-none mt-2" role="alert">
|
||||||
|
Musi być włączony co najmniej jeden kanał wpłat (konto lub BLIK).
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- IBAN -->
|
||||||
|
<div class="col-12" id="pole_konto">
|
||||||
|
<label for="numer_konta" class="form-label">Numer konta (IBAN)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">PL</span>
|
||||||
|
<input type="text" class="form-control" id="numer_konta" name="numer_konta"
|
||||||
|
inputmode="numeric" autocomplete="off"
|
||||||
|
placeholder="12 3456 7890 1234 5678 9012 3456" {% if zbiorka and not
|
||||||
|
zbiorka.uzyj_konta %}disabled{% endif %} {% if zbiorka is none or zbiorka.uzyj_konta
|
||||||
|
%}required{% endif %} aria-describedby="ibanHelp"
|
||||||
|
value="{% if zbiorka and zbiorka.numer_konta %}{{ zbiorka.numer_konta }}{% elif global_settings %}{{ global_settings.numer_konta }}{% else %}{{ request.form.get('numer_konta','') }}{% endif %}">
|
||||||
|
</div>
|
||||||
|
<div id="ibanHelp" class="form-text">Wpisz ciąg cyfr; spacje dodadzą się automatycznie dla
|
||||||
|
czytelności.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- BLIK -->
|
||||||
|
<div class="col-12 col-md-6" id="pole_blik">
|
||||||
<label for="numer_telefonu_blik" class="form-label">Numer telefonu BLIK</label>
|
<label for="numer_telefonu_blik" class="form-label">Numer telefonu BLIK</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">+48</span>
|
<span class="input-group-text">+48</span>
|
||||||
<input
|
<input type="tel" class="form-control" id="numer_telefonu_blik"
|
||||||
type="tel"
|
name="numer_telefonu_blik" inputmode="tel" pattern="[0-9 ]{9,13}"
|
||||||
class="form-control"
|
placeholder="123 456 789" {% if zbiorka and not zbiorka.uzyj_blik %}disabled{% endif
|
||||||
id="numer_telefonu_blik"
|
%} {% if zbiorka is none or zbiorka.uzyj_blik %}required{% endif %}
|
||||||
name="numer_telefonu_blik"
|
|
||||||
inputmode="tel"
|
|
||||||
pattern="[0-9 ]{9,13}"
|
|
||||||
placeholder="123 456 789"
|
|
||||||
required
|
|
||||||
aria-describedby="blikHelp"
|
aria-describedby="blikHelp"
|
||||||
value="{% if zbiorka and zbiorka.numer_telefonu_blik %}{{ zbiorka.numer_telefonu_blik }}{% elif global_settings %}{{ global_settings.numer_telefonu_blik }}{% else %}{{ request.form.get('numer_telefonu_blik','') }}{% endif %}"
|
value="{% if zbiorka and zbiorka.numer_telefonu_blik %}{{ zbiorka.numer_telefonu_blik }}{% elif global_settings %}{{ global_settings.numer_telefonu_blik }}{% else %}{{ request.form.get('numer_telefonu_blik','') }}{% endif %}">
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="blikHelp" class="form-text">Dziewięć cyfr telefonu powiązanego z BLIK. Spacje opcjonalne.</div>
|
<div id="blikHelp" class="form-text">Dziewięć cyfr telefonu powiązanego z BLIK. Spacje
|
||||||
|
opcjonalne.</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if is_edit %}
|
{% if is_edit %}
|
||||||
<div class="col-12 col-md-12 d-flex align-items-end">
|
<div class="col-12 col-md-12 d-flex align-items-end">
|
||||||
<button type="button" class="btn btn-sm btn-outline-light" id="ustaw-globalne"
|
<button type="button" class="btn btn-sm btn-outline-light" id="ustaw-globalne"
|
||||||
title="Wstaw wartości z ustawień globalnych"
|
title="Wstaw wartości z ustawień globalnych" {% if global_settings %}
|
||||||
{% if global_settings %}
|
|
||||||
data-iban="{{ global_settings.numer_konta }}"
|
data-iban="{{ global_settings.numer_konta }}"
|
||||||
data-blik="{{ global_settings.numer_telefonu_blik }}"
|
data-blik="{{ global_settings.numer_telefonu_blik }}" {% endif %}>
|
||||||
{% endif %}
|
|
||||||
>
|
|
||||||
Wstaw globalne ustawienia
|
Wstaw globalne ustawienia
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -258,7 +272,8 @@
|
|||||||
<div id="celSyncBox" class="alert d-none py-2 px-3 mb-3" role="alert">
|
<div id="celSyncBox" class="alert d-none py-2 px-3 mb-3" role="alert">
|
||||||
<div class="d-flex flex-wrap align-items-center justify-content-between gap-2">
|
<div class="d-flex flex-wrap align-items-center justify-content-between gap-2">
|
||||||
<div id="celSyncMsg" class="small"></div>
|
<div id="celSyncMsg" class="small"></div>
|
||||||
<button type="button" id="btnApplyCelFromSum" class="btn btn-sm btn-outline-light d-none"></button>
|
<button type="button" id="btnApplyCelFromSum"
|
||||||
|
class="btn btn-sm btn-outline-light d-none"></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -267,82 +282,56 @@
|
|||||||
<label for="cel" class="form-label">Cel zbiórki</label>
|
<label for="cel" class="form-label">Cel zbiórki</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">PLN</span>
|
<span class="input-group-text">PLN</span>
|
||||||
<input
|
<input type="text" inputmode="decimal" class="form-control" id="cel" name="cel"
|
||||||
type="text"
|
placeholder="0,00" required aria-describedby="celHelp"
|
||||||
inputmode="decimal"
|
value="{% if zbiorka and zbiorka.cel is not none %}{{ zbiorka.cel }}{% else %}{{ request.form.get('cel','') }}{% endif %}">
|
||||||
class="form-control"
|
|
||||||
id="cel"
|
|
||||||
name="cel"
|
|
||||||
placeholder="0,00"
|
|
||||||
required
|
|
||||||
aria-describedby="celHelp"
|
|
||||||
value="{% if zbiorka and zbiorka.cel is not none %}{{ zbiorka.cel }}{% else %}{{ request.form.get('cel','') }}{% endif %}"
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="celHelp" class="form-text">Minimalnie 0,01 PLN. Można później edytować.</div>
|
<div id="celHelp" class="form-text">Minimalnie 0,01 PLN. Można później edytować.</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 col-md-12 d-flex align-items-end">
|
<div class="col-12 col-md-12 d-flex align-items-end">
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input class="form-check-input" type="checkbox" id="ukryj_kwote" name="ukryj_kwote" {%
|
||||||
class="form-check-input"
|
if zbiorka %}{% if zbiorka.ukryj_kwote %}checked{% endif %}{% endif %}>
|
||||||
type="checkbox"
|
|
||||||
id="ukryj_kwote"
|
|
||||||
name="ukryj_kwote"
|
|
||||||
{% if zbiorka %}{% if zbiorka.ukryj_kwote %}checked{% endif %}{% endif %}
|
|
||||||
>
|
|
||||||
<label class="form-check-label" for="ukryj_kwote">Ukryj kwoty (cel i stan)</label>
|
<label class="form-check-label" for="ukryj_kwote">Ukryj kwoty (cel i stan)</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-3 mt-2">
|
<div class="row g-3 mt-2">
|
||||||
<div class="col-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input class="form-check-input" type="checkbox" id="pokaz_postep_finanse"
|
||||||
class="form-check-input"
|
name="pokaz_postep_finanse" data-group="postepy" {% if zbiorka %}{% if
|
||||||
type="checkbox"
|
zbiorka.pokaz_postep_finanse %}checked{% endif %}{% else %}checked{% endif %}>
|
||||||
id="pokaz_postep_finanse"
|
<label class="form-check-label" for="pokaz_postep_finanse">Pokaż postęp: Finanse</label>
|
||||||
name="pokaz_postep_finanse"
|
</div>
|
||||||
data-group="postepy"
|
|
||||||
{% if zbiorka %}{% if zbiorka.pokaz_postep_finanse %}checked{% endif %}{% else %}checked{% endif %}
|
|
||||||
>
|
|
||||||
<label class="form-check-label" for="pokaz_postep_finanse">Pokaż postęp: Finanse</label>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input class="form-check-input" type="checkbox" id="pokaz_postep_pozycje"
|
||||||
class="form-check-input"
|
name="pokaz_postep_pozycje" data-group="postepy" {% if zbiorka %}{% if
|
||||||
type="checkbox"
|
zbiorka.pokaz_postep_pozycje %}checked{% endif %}{% else %}checked{% endif %}>
|
||||||
id="pokaz_postep_pozycje"
|
<label class="form-check-label" for="pokaz_postep_pozycje">Pokaż postęp: Zakupy
|
||||||
name="pokaz_postep_pozycje"
|
(liczba)</label>
|
||||||
data-group="postepy"
|
</div>
|
||||||
{% if zbiorka %}{% if zbiorka.pokaz_postep_pozycje %}checked{% endif %}{% else %}checked{% endif %}
|
|
||||||
>
|
|
||||||
<label class="form-check-label" for="pokaz_postep_pozycje">Pokaż postęp: Zakupy (liczba)</label>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input class="form-check-input" type="checkbox" id="pokaz_postep_kwotowo"
|
||||||
class="form-check-input"
|
name="pokaz_postep_kwotowo" data-group="postepy" {% if zbiorka %}{% if
|
||||||
type="checkbox"
|
zbiorka.pokaz_postep_kwotowo %}checked{% endif %}{% else %}checked{% endif %}>
|
||||||
id="pokaz_postep_kwotowo"
|
<label class="form-check-label" for="pokaz_postep_kwotowo">Pokaż postęp: Zakupy
|
||||||
name="pokaz_postep_kwotowo"
|
(kwotowo)</label>
|
||||||
data-group="postepy"
|
</div>
|
||||||
{% if zbiorka %}{% if zbiorka.pokaz_postep_kwotowo %}checked{% endif %}{% else %}checked{% endif %}
|
|
||||||
>
|
|
||||||
<label class="form-check-label" for="pokaz_postep_kwotowo">Pokaż postęp: Zakupy (kwotowo)</label>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div><br>
|
</div><br>
|
||||||
<div id="postepyWarning" class="alert alert-warning d-none mt-2" role="alert">
|
<div id="postepyWarning" class="alert alert-warning d-none mt-2" role="alert">
|
||||||
Nie można wyłączyć wszystkich wskaźników postępu. Pozostaw przynajmniej jeden włączony.
|
Nie można wyłączyć wszystkich wskaźników postępu. Pozostaw przynajmniej jeden włączony.
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- CTA -->
|
<!-- CTA -->
|
||||||
<div class="d-flex flex-wrap gap-2">
|
<div class="d-flex flex-wrap gap-2">
|
||||||
@@ -365,4 +354,5 @@
|
|||||||
<script src="{{ url_for('static', filename='js/produkty_formularz.js') }}?v={{ APP_VERSION }}"></script>
|
<script src="{{ url_for('static', filename='js/produkty_formularz.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/kwoty_formularz.js') }}?v={{ APP_VERSION }}"></script>
|
<script src="{{ url_for('static', filename='js/kwoty_formularz.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/przelaczniki_zabezpieczenie.js') }}?v={{ APP_VERSION }}"></script>
|
<script src="{{ url_for('static', filename='js/przelaczniki_zabezpieczenie.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
{% endblock %}
|
<script src="{{ url_for('static', filename='js/sposoby_wplat.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
|
{% endblock %}
|
@@ -24,7 +24,7 @@ zbiórki{% endif %}{% endblock %}
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if zbiorki and zbiorki|length > 0 %}
|
{% if zbiorki and zbiorki|length > 0 %}
|
||||||
<div class="row g-4">
|
<div class="row g-4 pb-5">
|
||||||
{% for z in zbiorki %}
|
{% for z in zbiorki %}
|
||||||
{% set progress = (z.stan / z.cel * 100) if z.cel > 0 else 0 %}
|
{% set progress = (z.stan / z.cel * 100) if z.cel > 0 else 0 %}
|
||||||
{% set progress_clamped = 100 if progress > 100 else (0 if progress < 0 else progress) %} <div
|
{% set progress_clamped = 100 if progress > 100 else (0 if progress < 0 else progress) %} <div
|
||||||
@@ -85,10 +85,11 @@ zbiórki{% endif %}{% endblock %}
|
|||||||
<div class="mt-auto pt-2">
|
<div class="mt-auto pt-2">
|
||||||
|
|
||||||
{# TO POWODUJE ZE BLOK JEST KLIKALNY #}
|
{# TO POWODUJE ZE BLOK JEST KLIKALNY #}
|
||||||
<!-- <a href="{{ url_for('zbiorka', zbiorka_id=z.id) }}" class="stretched-link"></a> -->
|
<!-- <a href="{{ url_for('zbiorka', zbiorka_id=z.id) }}" class="stretched-link"></a> -->
|
||||||
|
|
||||||
<div class="d-grid">
|
<div class="d-grid">
|
||||||
<a href="{{ url_for('zbiorka', zbiorka_id=z.id) }}" class="btn btn-outline-light btn-sm w-100 btn-opis">
|
<a href="{{ url_for('zbiorka', zbiorka_id=z.id) }}"
|
||||||
|
class="btn btn-outline-light btn-sm w-100 btn-opis">
|
||||||
Otwórz opis
|
Otwórz opis
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -62,8 +62,8 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="fw-semibold">{{ it.nazwa }}</span>
|
<span class="fw-semibold">{{ it.nazwa }}</span>
|
||||||
{% if it.link %}
|
{% if it.link %}
|
||||||
<a href="{{ it.link }}" target="_blank" rel="noopener"
|
<a href="{{ it.link }}" target="_blank" rel="noopener" class="btn btn-sm btn-outline-light ms-2">Sklep
|
||||||
class="btn btn-sm btn-outline-light ms-2">Sklep ↗</a>
|
↗</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -165,6 +165,9 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% set show_iban = zbiorka.uzyj_konta and zbiorka.numer_konta %}
|
||||||
|
{% set show_blik = zbiorka.uzyj_blik and zbiorka.numer_telefonu_blik %}
|
||||||
|
|
||||||
<!-- Kolumna prawa: płatności (sticky) -->
|
<!-- Kolumna prawa: płatności (sticky) -->
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="card shadow-sm wspomoz-card sticky-md" style="top: var(--sticky-offset, 1rem);">
|
<div class="card shadow-sm wspomoz-card sticky-md" style="top: var(--sticky-offset, 1rem);">
|
||||||
@@ -175,17 +178,15 @@
|
|||||||
{% if has_cel and not zbiorka.ukryj_kwote %}
|
{% if has_cel and not zbiorka.ukryj_kwote %}
|
||||||
{% set brak = (zbiorka.cel - zbiorka.stan) %}
|
{% set brak = (zbiorka.cel - zbiorka.stan) %}
|
||||||
{% if brak > 0 %}
|
{% if brak > 0 %}
|
||||||
<span class="badge bg-warning text-dark border border-warning">
|
<span class="badge bg-warning text-dark border border-warning">Brakuje: {{ brak|round(2) }} PLN</span>
|
||||||
Brakuje: {{ brak|round(2) }} PLN
|
|
||||||
</span>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge rounded-pill" style="background: var(--accent); color:#111;">
|
<span class="badge rounded-pill" style="background: var(--accent); color:#111;">Zrealizowana</span>
|
||||||
Zrealizowana
|
|
||||||
</span>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if show_iban or show_blik %}
|
||||||
|
{% if show_iban %}
|
||||||
<!-- Numer konta -->
|
<!-- Numer konta -->
|
||||||
<div>
|
<div>
|
||||||
<label for="ibanInput" class="form-label fw-semibold mb-1">Numer konta</label>
|
<label for="ibanInput" class="form-label fw-semibold mb-1">Numer konta</label>
|
||||||
@@ -198,7 +199,9 @@
|
|||||||
aria-label="Kopiuj numer konta">Kopiuj</button>
|
aria-label="Kopiuj numer konta">Kopiuj</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if show_blik %}
|
||||||
<!-- Telefon BLIK -->
|
<!-- Telefon BLIK -->
|
||||||
<div>
|
<div>
|
||||||
<label for="blikInput" class="form-label fw-semibold mb-1">Telefon BLIK</label>
|
<label for="blikInput" class="form-label fw-semibold mb-1">Telefon BLIK</label>
|
||||||
@@ -211,6 +214,12 @@
|
|||||||
aria-label="Kopiuj numer BLIK">Kopiuj</button>
|
aria-label="Kopiuj numer BLIK">Kopiuj</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<div class="alert alert-secondary mb-0">
|
||||||
|
Kanały płatności są wyłączone dla tej zbiórki.
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if not zbiorka.ukryj_kwote %}
|
{% if not zbiorka.ukryj_kwote %}
|
||||||
<ul class="list-group list-group-flush small">
|
<ul class="list-group list-group-flush small">
|
||||||
@@ -243,7 +252,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{% if current_user.is_authenticated and current_user.czy_admin %}
|
{% if current_user.is_authenticated and current_user.czy_admin %}
|
||||||
<hr>
|
<hr>
|
||||||
<div class="d-grid gap-2 mt-2">
|
<div class="d-grid gap-2 mt-2">
|
||||||
@@ -271,8 +279,7 @@
|
|||||||
<small class="text-muted">Łącznie pozycji: {{ aktywnosci|length }}</small>
|
<small class="text-muted">Łącznie pozycji: {{ aktywnosci|length }}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if current_user.is_authenticated and current_user.czy_admin %}
|
{% if current_user.is_authenticated and current_user.czy_admin %}
|
||||||
<a href="{{ url_for('transakcje_zbiorki', zbiorka_id=zbiorka.id) }}"
|
<a href="{{ url_for('transakcje_zbiorki', zbiorka_id=zbiorka.id) }}" class="btn btn-sm btn-outline-light">
|
||||||
class="btn btn-sm btn-outline-light">
|
|
||||||
Zarządzaj
|
Zarządzaj
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -324,5 +331,4 @@
|
|||||||
{{ super() }}
|
{{ super() }}
|
||||||
<script src="{{ url_for('static', filename='js/zbiorka.js') }}?v={{ APP_VERSION }}"></script>
|
<script src="{{ url_for('static', filename='js/zbiorka.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/progress.js') }}?v={{ APP_VERSION }}"></script>
|
<script src="{{ url_for('static', filename='js/progress.js') }}?v={{ APP_VERSION }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/progress.js') }}?v={{ APP_VERSION }}"></script>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
Reference in New Issue
Block a user