尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Új vagy a projektben? Kezdd a repó áttekintésével (mi miért van, hol mit találsz), a gyakori feladatokhoz (új téma, új nyelv, új oldal, kiadás…) pedig ott az útmutató.
Az ATG – All-Time Greats (korábbi nevén Goats App) egy reszponzív webes alkalmazás baráti csoportok számára: közös kiadások nyilvántartása és egyenlítése, italok rangsorolása, közös tervek, galéria és naptár egy helyen. Minden adat egy csoporthoz (belépőkóddal csatlakozó baráti kör) van kötve, a tárolást és a jogosultságokat a Supabase (Postgres + Auth + Storage, row-level security-vel) biztosítja.
Bejelentkezés (index.html, kijelentkezett nézet)
Főoldal (app.html, bejelentkezett nézet)
Tartozások (tartozasok.html)
Képek (kepek.html) – csoportonként ki-be kapcsolható oldal (enabled_pages: kepek)
public.jelentesek táblába, cel_tipus = 'kep', óránként legfeljebb 20; a képről másolat készül a privát jelentett bucketbe).Tervek / Ötletek (tervek.html)
Ranglista (ranglista.html)
data-katt / data-valtozas / data-bevitel attribútummal mennek, lásd js/segedek/html-esemenyek.js)js/kulso/, css/kulso/): supabase-js 2.117.2, heic2any 0.0.4, Font Awesome 6.5.1 (solid); CDN-ről semmi nem töltődik.
A CSP script-src 'self'; kivétel a kepek.html 'unsafe-eval'-ja, mert a HEIC-átalakító new Function()-t használ.SECURITY DEFINER RPC-k az összetettebb/jogosultság-érzékeny műveletekhez, Supabase Storage a galéria képeihez, Supabase Auth (Google OAuth) a bejelentkezéshez.naplo tábla): ki, mikor, mit módosított — csak a csapat (superadmin) látja.sw.js) és manifest.json a telepíthetőséghez és az offline/gyors induláshoz.A galéria képei a privát kepek Supabase Storage bucketben vannak, csoportonként a csoport azonosítójával elnevezett mappában (<group_id>/<uuid>.webp).
Méret és formátum
js/elemek/kep-kivago.js): a képet húzni lehet (egérrel, ujjal, nyilakkal), nagyítani csúszkával, görgővel vagy két ujjal. Gombok: Kihagyás (Esc), Középre, Kész; több képnél „A többit középre”. A kivágó <canvas>-ra rajzol, inline stílus nélkül.js/segedek/kep-tomorites.js, az első feltöltéskor töltődik be): a rövidebb oldal legfeljebb 360 px (a galéria 180 px-es kijelzett méretének 2×-ese), a hosszabb legfeljebb 720 px. A négyzetre vágott kép így 360×360 px, jellemzően 40–50 KB. A FELADAT12 előtti (nem négyzetes) képek maradnak, azok középre vágva jelennek meg.upsert nélkül, cacheControl: 31536000-zel.file_size_limit = 153600 (150 KB), allowed_mime_types = {image/webp,image/jpeg}. A korábban feltöltött, nagyobb képek megmaradnak.Csoportonkénti korlát
public.app_beallitasok tábla adja, újratelepítés nélkül módosítható (Supabase SQL editor):
update public.app_beallitasok set ertek = 500 where kulcs = 'kep_korlat_csoportonkent';
storage.objects táblán egy RESTRICTIVE INSERT policy (kepek_csoport_korlat) ellenőrzi a kep_mappa_korlat_alatt() függvénnyel; a kliens a kep_korlat_csoportonkent() RPC-vel kérdezi le, és elérésekor ezt írja ki: „A csoport elérte a képkorlátot, törölj régebbi képeket.”Oldalak
kepek.html + js/pages/kepek.js: a teljes rács, feltöltés, törlés, jelentés; a csempék képe csak akkor töltődik be, amikor a görgetésben láthatóvá válik (IntersectionObserver, kötegelt aláírással).app.html + js/elemek/galeria.js: csak lapozás. Az „Összes kép →” link akkor látszik, ha a csoportnál a kepek oldal engedélyezett.groups.enabled_pages tömbben (kepek kulcs); új csoportnál alapból be van kapcsolva.Jelentés és a jelentett képek másolata
kep-jelentes Edge Functiont hívja (supabase/functions/kep-jelentes/index.ts). Ez a felhasználó nevében (az ő JWT-jével) szúrja be a sort a public.jelentesek táblába, így a táblaszabályok érvényesek: csak csoporttag jelenthet, óránként legfeljebb 20-at.jelentett bucketbe <jelentés-azonosító>.<kiterjesztés> néven, és a helyét beírja a jelentés masolat_utvonal oszlopába. A jelentett bucketre nincs storage-policy: a csoporttagok nem látják és nem törölhetik, a másolat akkor is megmarad, ha az eredeti képet vagy a csoportot törlik.jelentett), a jelentés lezárása után (statusz = 'lezarva').jelentesek táblába csak a group_id, cel_tipus, cel_azonosito, ok, leiras oszlopot írhatja (oszlopszintű jog); a statusz és a masolat_utvonal csak szerveroldalon változik.supabase functions deploy kep-jelentes (JWT-ellenőrzéssel). A SUPABASE_URL, SUPABASE_ANON_KEY és SUPABASE_SERVICE_ROLE_KEY környezeti változót a Supabase automatikusan adja.Helyi gyorsítótár (js/segedek/kep-gyorsitotar.js)
goats-kepek-v1 tárolója őrzi az útvonal alapján, és a következő megnyitáskor onnan, blob URL-ként jelenik meg: egy képet eszközönként csak egyszer töltünk le.createSignedUrls hívás megy (2 perces lejárattal).localStorage goats_kep_cache_index). Kijelentkezéskor az egész törlődik.goats-kepek-* tárolót verzióváltáskor sem törli.Az admin.html (js/pages/admin.js, css/pages/admin.css) csak a superadminoké (profiles.system_role = 'superadmin'). Session nélkül az index.html-re, nem superadminnak az app.html-re irányít (location.replace), az adatai addig nem töltődnek be; a profil változásakor (onChange) újra ellenőriz. A menüben az „Admin ⚙️” csak superadminnak látszik, a csoporttól és a kapcsolóktól függetlenül (mobilon a „Több ☰” fiókban).
Globális kapcsolók – az egész alkalmazásra érvényesek (nem csoportonként), a public.app_kapcsolok táblában (kulcs, ertek boolean, modositotta, modositva). Olvasni minden bejelentkezett felhasználó tudja, írni csak a superadmin az admin_beallitas_mentese(kulcs_in, ertek_in) RPC-vel. (A public.app_beallitasok a FELADAT12 számértékű beállításait tárolja, pl. a képkorlátot; az külön tábla.)
| Kulcs | Mit kapcsol |
|---|---|
oldal_tartozasok, oldal_ranglista, oldal_kepek, oldal_tervek, oldal_goatsgame | Az oldal a menüben és közvetlen megnyitáskor (a Kezdőlap nem kapcsolható) |
funkcio_kepfeltoltes | Képfeltöltés (Képek oldal) |
funkcio_italjavaslat | Új ital javaslása (Ranglista) |
funkcio_uj_csoport | Új csoport létrehozása |
funkcio_tartozas_felvetel | Új tartozás felvétele |
funkcio_csoportcsatlakozas | Csatlakozás csoportkóddal |
csoportszuro_csak_admin | Beállítás (alapból ki): bekapcsolva a Ranglista csoportszűrőjét csak a csoport adminja módosíthatja |
A superadminokra egyik kapcsoló sem vonatkozik: minden oldalt látnak és minden funkciót használhatnak.
Működés
js/segedek/oldalak.js (a nav-bar és az admin oldal is ezt használja).hitelesites.js a bejelentkezéskor betölti a kapcsolókat (state.beallitasok, a munkamenet-pillanatképben legfeljebb 60 másodpercig), és kiadja az oldalEngedelyezett(kulcs) és funkcioEngedelyezett(kulcs) segédet; mindkettő igaz superadminnak.enabled_pages-ében benne van ÉS a globális kapcsolója be van kapcsolva).<body data-oldal="..."> attribútuma alapján a js/segedek/oldal-orzo.js az app.html-re irányít („Ez az oldal jelenleg nem elérhető.”). Kijelentkezve a kapcsolók nem olvashatók, ezért a publikus Ranglistát ilyenkor nem korlátozza.js/segedek/funkcio-kapcsolo.js letiltja a gombot, és mellé írja: „Ez a funkció jelenleg ki van kapcsolva.”public.funkcio_engedelyezve(kulcs) (superadminnak mindig igaz). A képfeltöltést, az italjavaslatot és a tartozás felvételét RESTRICTIVE INSERT policyk ellenőrzik (storage.objects a kepek bucketre, kepek, ital_katalogus, tartozasok), a csoportlétrehozást és a csatlakozást a create_new_group és a join_group_with_code RPC.Táblák
| Tábla | Tartalom |
|---|---|
public.ital_kategoriak | Fő- és alkategóriák: kod, nev, szulo_id (alkategóriánál a főkategória), sorrend, szabály (szabaly_marka = márka egyezik, vagy szabaly_nev = a név eleje). A főkategória tulajdonságai a felületet vezérlik: ikon, recept (koktél, fröccs), kiszereles (sör), alkoholos, zero_szuro (energiaital). |
public.italok | A katalógus: id, marka, nev, kategoria_id, alkategoria_id + alkategoria_kezi (kézi felülírás; kézi és üres = egyik sem), zero (üres = automatikus a névből: zero, sugar free, cukormentes; a Ranglistán „Cukormentes” jelvény), alkohol_fok, kiszereles (sörnél: dobozos = 0,5 l, dobozos_330 = 0,33 l, uveges), recept_mod (arany/pontos), jovahagyva, javasolta_id, created_at. Az azonosítók a régi ital_katalogus azonosítói, így a mentett ranglisták (ital_ranglista.id = 'ital-<id>') érvényesek. |
public.ital_osszetevok | Koktél/fröccs recept: egy sor egy hozzávaló (ital_id, sorrend, nev, mennyiseg, egyseg). |
Az alkategória-szabály és a zero felismerése egy helyen van: js/segedek/ital-kategoriak.js (a Ranglista és az admin oldal is ezt használja). Jogosultság: olvasni mindenki tudja (a jóvá nem hagyott italt csak a javasló, a csoporttársai és a superadmin), új italt bejelentkezett felhasználó javasolhat (a funkcio_italjavaslat kapcsoló mellett), kategóriát és besorolást csak a superadmin módosíthat (RLS).
Admin oldal → Italjavaslatok: a jóváhagyásra váró italok (kategória, márka, kiszerelés, alkoholfok, recept, javasló), jóváhagyás vagy elutasítás (list_pending_drinks, approve_drink, reject_drink RPC; korábban a beállítások ablakában volt).
Admin oldal → Italkategóriák: alkategória létrehozása, szerkesztése, törlése egy főkategórián belül (szabály: márka vagy névkezdet), és italonként az alkategória és a zero kézi felülírása.
Szűrés (Ranglista)
groups.filter_settings, save_filter_settings RPC): mely fő- és alkategóriák látszanak, és energiaitalnál mind / csak zero / nem zero. Amíg a csoport nem állította be, egyetlen ital sem látszik, és az oldal felkínálja a beállítást. Alapból bármelyik tag módosíthatja; a csoportszuro_csak_admin kapcsolóval csak a csoport adminja.Az alkalmazás telepíthető asztali és mobil böngészőkből is ("Telepítés" / "Hozzáadás a kezdőképernyőhöz").
sw.js előgyorsítótárazza az alkalmazás vázát (a bejelentkezési és a legfontosabb belépési fájlokat), hogy az első/ismételt betöltés gyors legyen, és navigációnál 2 másodperces hálózati időkorlát után a gyorsítótárra vált.A FELADAT13-as átszervezés óta a mappa- és fájlnevek (ahol lehetett) magyarok, ékezet és szóköz nélkül, kisbetűvel, kötőjellel elválasztva — a GitHub Pages és az URL-ek kis-/nagybetű-érzékenysége miatt. A css/, js/, css/base/, css/pages/, js/pages/, main.*, navbar.css, modals.css és supabase-client.js nevek szándékosan maradtak (már eleve egyértelműek vagy általánosan ismert technikai kifejezések).
css/
base/ # alap: szinek/betumeret (valtozok.css), reset (visszaallitas.css), segedosztalyok.css
elemek/ # ujrafelhasznalhato komponensek (navbar.css, modals.css, lenyilo-menu.css, lebego-cimke.css, moderacio.css, tartozasok-egyenlitese.css)
pages/ # oldal-specifikus stilusok (bejelentkezes.css = index.html, fooldal.css = app.html, tartozasok/ranglista/tervek/kepek/admin/jogi.css, goatsgame.css)
main.css # a fenti @import-ok gyujtofajlja
js/
hitelesites.js # kozponti auth/session/csoport-allapot (window.goatsAuth)
supabase-client.js # Supabase kliens singleton
admin-muveletek.js # csoport/profil admin RPC wrapperek
main.js # modul-aggregator a bejelentkezett oldalakhoz
elemek/ # ujrafelhasznalhato UI-komponensek (naptar, nav-bar, galeria, kep-kivago, beallitasok-modal, tartozasok-egyenlitese.js)
beallitasok/ # a beallitasok-modal al-nezetei (belepes-modal, profil-modal, csoport-adatok, tema-valaszto, ital-moderacio, beallitasok-sablonok, tos-ujraelfogadas)
pages/ # egy-egy HTML oldalhoz tartozo belepesi script (bejelentkezes-oldal.js, app-orzo.js, tartozasok.js, tervek.js, kepek.js, admin.js, admin-kategoriak.js, ranglista.js, goatsgame.js)
segedek/ # altalanos segedfuggvenyek (ital-kep, modal-fokusz, szin-osztaly, csoport-kepek, csoport-kod, kep-tomorites, kep-gyorsitotar, oldalak, oldal-orzo, funkcio-kapcsolo, ital-kategoriak, keslelteto, teljesitmeny, tema)
img/
icon-*.png # PWA ikonok (a manifest.json hivatkozza)
ikonok/ # ital-kategoria SVG ikonok (CSS maszkkal szinezve)
Service worker verziózása: a sw.js tetején lévő CACHE_NEV (pl. 'goats-v11') minden olyan kiadásnál emelendő, ami bármelyik előgyorsítótárazott (ELOGYORSITOTT) fájl útvonalát vagy tartalmát megváltoztatja — enélkül a már telepített/PWA-ként futó appok a régi, lecserélt fájlokat kapnák a gyorsítótárból. Az activate esemény a korábbi cache-neveket automatikusan törli.
Az app build nélküli, statikus HTML/CSS/JS, de nem nyitható meg közvetlenül file://-ként — a Supabase-hívások és az ES modulok miatt egy helyi HTTP szerver kell:
python -m http.server 8099
# vagy: npx serve .
Utána nyisd meg a http://localhost:8099/index.html címet. Bejelentkezéshez és adatlekérdezéshez élő internet-kapcsolat és a projektbe beállított Supabase-kulcsok kellenek (js/supabase-client.js).
hu.goatsapp.app404-not-found-team.github.io, start URL: /Goats-app/ (a manifest.json start_url és scope értéke ezzel egyezik)assetlinks.json a 404-not-found-team.github.io repóbanhttps://404-not-found-team.github.io/Goats-app/privacy.html, fiók-törlés: https://404-not-found-team.github.io/Goats-app/fiok-torles.htmljogi.html — innen érhető el mindegyik jogi dokumentum, és ez a link van a Profil menüben ("Jogi információk").privacy.html.felhasznalasi-feltetelek.html — a verziószáma (hitelesites.js TOS_VERSION) egyezzen a lap tetején feltüntetett verzióval.fiok-torles.html.accept_tos RPC-vel történik, a TOS_VERSION-nel.TOS_VERSION értékét (js/hitelesites.js), és a felhasznalasi-feltetelek.html tetején lévő verziószámot/dátumot is ennek megfelelően. Ez új elfogadást kényszerít ki a következő bejelentkezéskor.Goats Game (goatsgame.html)
Beállítások / Profil (a fejlécben elérhető menü, minden oldalon)
Admin (admin.html) – csak superadminnak, lásd Admin oldal és globális kapcsolók.