Grafika strony glownej z biblioteki mediow, naglowek w panelu
Deploy PROD / deploy (push) Successful in 26s

GRAFIKA JAKO USTAWIENIE, NIE PLIK W REPOZYTORIUM
Nowe `ACADEMY_HERO_IMAGE_MEDIA_ID` (typ MEDIA) wskazuje zdjecie obok naglowka
strony glownej. Zdjecie jest materialem konkretnego klienta, zwykle z jego
logo, a model wdrozenia zabrania danych klienta w obrazie Docker: wbudowane
w kod pojawiloby sie na stronie kazdej kolejnej instancji. Ta sama regula co
przy logo i ikonie karty.

Plik idzie przez `/api/public/media/{id}`, jak obrazki w tresci strony. Pusta
albo nieliczbowa wartosc daje domyslny panel z motywem wodnym zamiast adresu
donikad: zepsuty obrazek w najbardziej widocznym miejscu strony wyglada gorzej
niz motyw domyslny.

Ramka dostaje proporcje zdjecia (16:9) zamiast sztywnej wysokosci: przy innym
ksztalcie `object-cover` obcinal brzegi, a tam zwykle stoi logo.

NAGLOWEK STRONY GLOWNEJ W PANELU
`ACADEMY_HERO_EYEBROW`, `_TITLE` i `_TEXT` istnialy w backendzie od poczatku,
ale nie bylo ich w panelu: tytul strony dalo sie zmienic wylacznie zapytaniem
do bazy. Ustawienia -> Strona glowna ma teraz karte z tymi polami i grafika.

ODMIANA LICZNIKOW
Etykiety licznikow mialy na sztywno forme dla "wielu", wiec na zywej stronie
widnialo "1 kursantow". Licznik jest pierwsza rzecza, ktora widzi gosc.
Uzyta istniejaca funkcja `plural` z `lib/dates.ts`, teraz wyeksportowana,
zamiast czwartej kopii tej samej funkcji.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-28 07:43:55 +02:00
parent 698425bbe3
commit 4f21af5f80
7 changed files with 97 additions and 6 deletions
@@ -215,6 +215,8 @@ public final class PublicAcademyDtos {
String heroEyebrow,
String heroTitle,
String heroText,
/** Adres grafiki obok naglowka albo null, gdy strona ma domyslny motyw. */
String heroImageUrl,
String expertsTitle,
String expertsText,
String reviewsTitle,
@@ -122,6 +122,7 @@ public class PublicAcademyService {
settings.get(SettingKey.ACADEMY_HERO_EYEBROW),
settings.get(SettingKey.ACADEMY_HERO_TITLE),
settings.get(SettingKey.ACADEMY_HERO_TEXT),
heroImageUrl(),
settings.get(SettingKey.ACADEMY_EXPERTS_TITLE),
settings.get(SettingKey.ACADEMY_EXPERTS_TEXT),
settings.get(SettingKey.ACADEMY_REVIEWS_TITLE),
@@ -137,6 +138,23 @@ public class PublicAcademyService {
sections.getOrDefault(PageSectionType.FAQ, List.of()));
}
/**
* Adres grafiki obok naglowka.
*
* Plik idzie przez `/api/public/media/{id}`, jak obrazki w tresci strony:
* klucz obiektu w MinIO nie opuszcza serwera, a typ pochodzi z bazy.
* Wartosc, ktora nie jest liczba, daje null zamiast adresu donikad:
* zepsuty obrazek w najbardziej widocznym miejscu strony wyglada gorzej
* niz domyslny motyw.
*/
private String heroImageUrl() {
String id = settings.get(SettingKey.ACADEMY_HERO_IMAGE_MEDIA_ID);
if (id == null || !id.trim().matches("\\d+")) {
return null;
}
return "/api/public/media/" + id.trim();
}
/**
* Liczby w naglowku.
*
@@ -413,6 +413,20 @@ public enum SettingKey {
"Kursy online i otwarte webinary z ekspertami. Jedno konto, certyfikaty, "
+ "dostęp z dowolnego urządzenia.",
"Zdanie pod nagłówkiem strony głównej Akademii"),
/**
* Grafika obok naglowka strony glownej Akademii.
*
* Identyfikator pliku z biblioteki mediow, nie adres i nie plik w repozytorium.
* Zdjecie jest zwykle materialem konkretnego klienta (z jego logo), a model
* wdrozenia zabrania danych klienta w obrazie Docker: wbudowane w kod
* pojawiloby sie na stronie kazdej kolejnej instancji. Ta sama regula co przy
* logo i ikonie karty.
*
* Puste oznacza domyslny panel z motywem wodnym, co jest poprawnym stanem.
*/
ACADEMY_HERO_IMAGE_MEDIA_ID(SettingType.MEDIA, "",
"Grafika obok nagłówka strony głównej Akademii. Puste pokazuje domyślny motyw.",
Requirement.OPTIONAL_EMPTY),
ACADEMY_EXPERTS_TITLE(SettingType.STRING, "Uczysz się od praktyków",
"Nagłówek sekcji z prowadzącymi. Same osoby dodaje się w zakładce Strona główna."),
ACADEMY_EXPERTS_TEXT(SettingType.STRING, "",