1. V2 rendszeráttekintés
A v2 frontend refaktor lényege, hogy az eredetileg oldalanként monolit JavaScript állományokat
felelősség-alapú modulokra bontja, miközben:
- a HTML tagek és ID-k változatlanok maradnak,
- a backend route-ok változatlanok maradnak,
- a funkcionális működésnek meg kell egyeznie az eredeti rendszerrel,
- az átállás fokozatosan, kis kockázattal történik.
Mi a rendszer magja?
Továbbra is két fő üzleti entitás van:
a planner session és a quote.
A refaktor ezek körüli frontend logikát bontja kisebb egységekre.
Mi a refaktor magja?
A monolit oldallogikák helyett külön fájlba kerül a közös helper, a modal, a pénzügy,
a template-kezelés, a keresés, az auth, a render vagy a timeline.
A v2 nem új termékverzió üzleti értelemben, hanem technikai szerkezeti verzió.
Ezért a dokumentáció a működést ugyanazzal a részletességgel írja le, de már a refaktorált
fájlszerkezetre vetítve.
2. Refaktor célja és alapelvei
A refaktor nem „mindent közösítsünk” elven épül, hanem a következő működési szabályok mentén:
1. A HTML marad stabil
A meglévő formmezők, ID-k, canvasok, modal elemek és listadobozok a refaktor után is ugyanazok.
Ez csökkenti a regressziók esélyét és egyszerűsíti a fokozatos átállást.
2. A közös logika csak akkor kerül ki, ha valóban közös
Nem minden hasonló függvény kerül a core-ba. Csak az, ami több modulban ugyanúgy használható,
stabil, és nem hordoz feature-specifikus mellékhatást.
3. A feature modulok saját felelősséget visznek
A planner-finance nem keres rekordokat, a planner-search nem számol pénzügyet,
a dashboard-render nem authol, a djview-timeline nem renderel DOM-ot.
4. Klasszikus script betöltés marad
A rendszer nem áll át ES module import/export szerkezetre.
A modulok window.XYZ namespace-en keresztül érhetők el.
5. A betöltési sorrend a működés része
Mivel nincs bundler vagy module loader, a script sorrend logikai függőséget is jelent.
A dokumentáció ezért ezt külön fejezetben kezeli.
A refaktor fő célja a karbantarthatóság, átláthatóság, tesztelhetőség és részleges újrafelhasználhatóság,
nem pedig a technológiai stack lecserélése.
3. V2 rendszertérkép
Ez a blokk összefoglalja, hogy a refaktorált frontendben melyik oldal milyen modulhalmazt használ,
és ezek hogyan kapcsolódnak a backendhez.
Frontend oldalak
- main.html – launcher / navigáció
- index.html – planner wizard
- crm.html – ajánlatkészítés és follow-up
- dashboard.html – összesítő admin nézet
- calendar.html – havi naptárnézet
- dj-view.html – live preview
- user-manual.html – technikai dokumentáció
Refaktorált JS szintek
- core/ – alap helper és API wrapper
- ui/ – közös modal logika
- planner/ – planner feature modulok
- crm/ – CRM feature modulok
- dashboard/ – dashboard auth / render / app
- calendar/ – calendar entry
- djview/ – DJ preview logika
Backend kapcsolódások
- /api/sessions és kapcsolódó route-ok
- /api/quotes és kapcsolódó route-ok
- /api/dashboard-summary
- /api/calendar
- /api/auth/dashboard és /api/auth/price-view
Állandó technikai szabályok
- nincs bundler
- nincs import/export
- nincs HTML ID átnevezés
- nincs backend route átnevezés ebben a körben
4. Frontend oldalak és belépési pontok
A refaktorált frontendben az egyes HTML oldalak továbbra is önálló entrypointok.
A különbség az, hogy már nem egyetlen nagy JS fájl van mögöttük, hanem több kisebb modul.
| HTML oldal |
Funkció |
Core függőségek |
Feature modulok |
Entrypoint |
index.html |
Planner wizard |
base.js, api.js, formar.js |
ui-modal.js
planner-templates.js
planner-venues.js
planner-signature.js
planner-finance.js
planner-search.js
planner-accepted-qoutes.js
|
planner-app.js |
crm.html |
CRM / quote felület |
base.js, api.js, formar.js |
ui-modal.js
crm-finance.js
crm-follwup.js
crm-templates.js
|
crm-app.js |
dashboard.html |
Admin dashboard |
base.js, api.js, formar.js |
dashboard-auth.js
dashboard-render.js
|
dashboard-app.js |
calendar.html |
Havi naptár |
base.js, api.js, formar.js |
— |
calendar-app.js |
dj-view.html |
DJ preview |
base.js, api.js, formar.js |
djview-timeline.js
djview-auth.js
djview-render.js
|
djview-app.js |
Mivel minden HTML oldal önálló entrypoint, a közös helper-ek csak azon az oldalon érhetők el,
ahol a megfelelő script hivatkozások be vannak töltve. Ezért a hiányzó script nem csak részfunkciót,
hanem teljes oldalhibát is okozhat.
5. Refaktorált fájlszerkezet
public/
assets/
JS/
calendar/
calendar-app.js
core/
api.js
base.js
formar.js
crm/
crm-app.js
crm-finance.js
crm-follwup.js
crm-templates.js
dashboard/
dashboard-app.js
dashboard-auth.js
dashboard-render.js
djview/
djview-app.js
djview-auth.js
djview-render.js
djview-timeline.js
planner/
planner-accepted-qoutes.js
planner-app.js
planner-finance.js
planner-search.js
planner-signature.js
planner-templates.js
planner-venues.js
ui/
ui-modal.js
Miért így jó?
- oldalankénti monolit helyett feature-szegmensek vannak
- könnyebb egy hiba forrását izolálni
- jobban látszik, mi közös és mi oldal-specifikus
- későbbi backend service bontáshoz is jobban illeszkedik
Miért nem lett több core fájl?
Az első frontend refaktor célja a stabilitás volt. Ezért csak az igazoltan közös
és alacsony kockázatú logikák kerültek ki a core-ba.
6. Fontos név- és fájlmegkötések
A projektben több olyan fájlnév van, amely történelmi okból elírt formában maradt meg.
Ezeket a dokumentáció külön kiemeli, mert a script hivatkozásnál a tényleges fájlnevet kell használni.
| Logikai név |
Tényleges fájlnév |
Megjegyzés |
format.js |
formar.js |
tartalmilag format helper, de a projektben a fájlnév így szerepel |
crm-followup.js |
crm-follwup.js |
followup elírással szerepel |
planner-accepted-quotes.js |
planner-accepted-qoutes.js |
quotes elírással szerepel |
Ezeket a neveket ebben a körben nem érdemes átírni, mert az több helyen egyszerre okozna törést.
Ha később lesz külön naming-cleanup kör, azt érdemes önálló regressziós teszttel kezelni.
7. HTML script betöltési sorrend
A refaktorált frontendben a script sorrend logikai függőségeket is jelent.
Mivel nincs import/export, a modulok csak akkor működnek, ha a rájuk épülő függőségek előbb betöltődtek.
index.html
<script src="./assets/JS/core/base.js"></script>
<script src="./assets/JS/core/api.js"></script>
<script src="./assets/JS/core/formar.js"></script>
<script src="./assets/JS/ui/ui-modal.js"></script>
<script src="./assets/JS/planner/planner-templates.js"></script>
<script src="./assets/JS/planner/planner-venues.js"></script>
<script src="./assets/JS/planner/planner-signature.js"></script>
<script src="./assets/JS/planner/planner-finance.js"></script>
<script src="./assets/JS/planner/planner-search.js"></script>
<script src="./assets/JS/planner/planner-accepted-qoutes.js"></script>
<script src="./assets/JS/planner/planner-app.js"></script>
crm.html
<script src="./assets/JS/core/base.js"></script>
<script src="./assets/JS/core/api.js"></script>
<script src="./assets/JS/core/formar.js"></script>
<script src="./assets/JS/ui/ui-modal.js"></script>
<script src="./assets/JS/crm/crm-finance.js"></script>
<script src="./assets/JS/crm/crm-follwup.js"></script>
<script src="./assets/JS/crm/crm-templates.js"></script>
<script src="./assets/JS/crm/crm-app.js"></script>
dashboard.html
<script src="./assets/JS/core/base.js"></script>
<script src="./assets/JS/core/api.js"></script>
<script src="./assets/JS/core/formar.js"></script>
<script src="./assets/JS/dashboard/dashboard-auth.js"></script>
<script src="./assets/JS/dashboard/dashboard-render.js"></script>
<script src="./assets/JS/dashboard/dashboard-app.js"></script>
calendar.html
<script src="./assets/JS/core/base.js"></script>
<script src="./assets/JS/core/api.js"></script>
<script src="./assets/JS/core/formar.js"></script>
<script src="./assets/JS/calendar/calendar-app.js"></script>
dj-view.html
<script src="./assets/JS/core/base.js"></script>
<script src="./assets/JS/core/api.js"></script>
<script src="./assets/JS/core/formar.js"></script>
<script src="./assets/JS/djview/djview-timeline.js"></script>
<script src="./assets/JS/djview/djview-auth.js"></script>
<script src="./assets/JS/djview/djview-render.js"></script>
<script src="./assets/JS/djview/djview-app.js"></script>
main.html
<script>
document.getElementById("year").textContent = new Date().getFullYear();
</script>
A main launcher jelenleg nem használ refaktorált JS modult.
A leggyakoribb refaktor utáni hibák:
rossz script útvonal,
felcserélt sorrend,
kimaradt core vagy ui modul.
8. Frontend architektúra – adatfolyam
A v2 architektúra lényege, hogy az oldal entrypoint csak összehangolja a feature modulokat.
Az adatmozgás már kisebb egységeken keresztül történik.
1. HTML oldal betölt
A HTML oldal betölti a core modulokat, majd az oldalhoz szükséges feature modulokat,
végül az adott entrypoint futtatja az inicializálást.
2. Core réteg inicializálódik
Az AppCore biztosítja az alap DOM, path, format és API helper-eket,
amelyeket később minden feature modul egységesen használ.
3. Feature modulok regisztrálódnak
A window.PlannerFinance, window.CrmFollowup, window.DashboardRender,
window.DjViewTimeline típusú namespace-ek elérhetővé válnak a globális térben.
4. Entrypoint összefogja a működést
Az entrypoint modul hívja meg a részmodulokat:
pl. template betöltés, venue lista, finance sync, search bind, timeline render vagy auth bind.
5. Felhasználói interakció indul
Gombnyomás, input változás vagy page load hatására valamelyik feature modul API hívást indít,
állapotot módosít, vagy újrarendereli az oldal egy részét.
6. API válasz → részleges UI frissítés
Nem mindig az egész oldal rajzolódik újra. Sok helyen csak a szükséges rész:
lista, summary mező, modal, result link vagy timeline blokk.
A v2 frontend ezért már részben komponens-szerű gondolkodást követ, még ha technikailag nem is React vagy Vue alapú.
9. Teljes rendszer komponens diagram
Ez az ábra a refaktorált frontend és a változatlan backend magas szintű kapcsolódását mutatja.
Felhasználó
User
↓
HTML page
Frontend entrypointok
index.html
crm.html
dashboard.html
calendar.html
dj-view.html
Core réteg
AppCore.BASE
AppCore.$
AppCore.apiGet / apiPost / apiDelete
AppCore.escapeHtml / normalizeText / formatMoney / truthy
Feature modulok
Planner*
Crm*
Dashboard*
CalendarApp
DjView*
Backend API
/api/sessions
/api/session/:stamp
/api/quotes
/api/quote/:stamp
/api/dashboard-summary
/api/calendar
/api/venues
/api/upload
/api/auth/*
Tárolási réteg
/data
/data/quotes
/uploads
/public/templates
/public/venues.json
A frontend szét lett bontva, de a backend még ugyanazt a monolit route- és storage-logikát szolgálja ki.
Emiatt a frontend refaktor különösen jó előkészítő lépés a későbbi backend service-bontáshoz.
10. Frontend → modulfüggőségi mátrix
Ez a mátrix azt mutatja meg, hogy az entrypoint és a feature modulok milyen frontend namespace-ekre épülnek.
| Modul |
Függő namespace-ek |
Függőség erőssége |
Mi történik, ha hiányzik? |
planner-app.js |
AppCore
UiModal
PlannerTemplates
PlannerVenues
PlannerSignature
PlannerFinance
PlannerSearch
PlannerAcceptedQuotes
|
erős |
A planner oldal részlegesen vagy teljesen használhatatlanná válik. |
crm-app.js |
AppCore
UiModal
CrmFinance
CrmFollowup
CrmTemplates
|
erős |
Quote generálás, follow-up és template kezelés nem működik. |
dashboard-app.js |
AppCore, DashboardAuth, DashboardRender |
erős |
Belépés vagy dashboard render hibás lesz. |
calendar-app.js |
AppCore |
közepes |
Az oldal egyszerűbben javítható, de a calendar teljesen leállhat. |
djview-app.js |
AppCore, DjViewTimeline, DjViewAuth, DjViewRender |
erős |
A preview, auth vagy render egy része hibára fut. |
11. Core réteg
A core réteg feladata, hogy minden oldal számára egységes technikai alapot biztosítson.
Itt nincsenek planner- vagy CRM-specifikus üzleti szabályok.
core/base.js
A legalapvetőbb helper-eket tartalmazza.
window.AppCore = window.AppCore || {}
window.AppCore.BASE
window.AppCore.$(id)
window.AppCore.BASE = window.location.pathname.startsWith("/wedding-planner-dj")
? "/wedding-planner-dj"
: "";
A BASE a későbbi API és linképítések alapja. Ha hibás, akkor az összes relatív API hívás elromlik.
core/api.js
Egységes fetch wrapper réteg.
apiGet(url, options)
apiPost(url, body, options)
apiDelete(url, options)
if (!json.ok) {
throw new Error(json.error || "API hiba.");
}
Ez a wrapper biztosítja, hogy az összes modul ugyanúgy kezelje a backend { ok:false } válaszait.
core/formar.js
Közös formázási és normalizálási helper-ek.
escapeHtml(v)
normalizeText(v)
toNumberOrZero(v)
formatMoney(v)
truthy(v)
| Helper |
Használat |
Fő modulok |
escapeHtml |
biztonságos HTML render stringekben |
calendar, crm, dashboard, djview |
normalizeText |
query, összehasonlítás, option kezelés |
crm, planner |
toNumberOrZero |
pénzügyi számítások |
planner-finance, crm-finance, djview-render |
formatMoney |
dashboard, CRM kiegészítő UI |
dashboard-render, crm-finance |
truthy |
bool-szerű mezők értelmezése |
planner, crm, djview-timeline |
12. UI réteg
A közös UI szintet a ui/ui-modal.js képviseli.
Ez nem általános UI framework, hanem egy célzott közös modul a planner és a CRM közös modal igényeire.
ui/ui-modal.js
getModalRefs() – app modal DOM elérések
getPdfModalRefs() – PDF progress DOM elérések
showAppModal({...}) – info / success / warning / error modal
closeAppModal(result)
showPdfProgressModal(message)
finishPdfProgressModal(success, message)
hidePdfProgressModal()
bindModalEvents()
Hol használjuk?
- planner save előtti validációs hibák
- planner save alatti PDF progress
- CRM quote generálás
- CRM follow-up visszatöltés
- törlési megerősítések
Mit nem kezel?
- dashboard auth overlay
- dj-view price modal
- egyedi inline hibadobozok
A modul a meglévő HTML ID-kre támaszkodik:
appModal, appModalOkBtn, pdfProgressModal stb.
Ezért csak olyan oldalon használható, ahol ezek ténylegesen jelen vannak.
13. Planner modulrendszer
A planner lett a legnagyobb mértékben feature-ökre bontva.
Az eredeti app.js logikája most több jól elkülöníthető részben él tovább.
Planner namespace-ek
PlannerApp
PlannerFinance
PlannerSearch
PlannerSignature
PlannerTemplates
PlannerVenues
PlannerAcceptedQuotes
Fő logikai bontás
- PlannerApp – orchestration
- PlannerFinance – összegzés és billing UI
- PlannerSearch – keresés, statisztika, visszatöltés
- PlannerSignature – aláírás és csatolmányok
- PlannerTemplates – sablonok
- PlannerVenues – helyszínek
- PlannerAcceptedQuotes – elfogadott ajánlatok
A planner refaktor nem változtatja meg a wizard szerkezetét, a mezőket vagy a mentési payloadot.
A cél itt kizárólag a felelősség-szétválasztás volt.
14. planner-app.js részletesen
A planner-app.js a planner oldal fő entrypointja és koordinátora.
Nem minden logika lakik itt, de ez indítja és hangolja össze a teljes planner oldalt.
Fő state-ek
currentStep
GENRES_BY_EVENT
Fő feladatok
- wizard léptetés
- event type UI kapcsolás
- payload összeállítás
- validáció
- save / reset / autotimeline
- feature modulok inicializálása
Fontos metódusok
showStep(n)
getEventType()
renderGenres(selected)
syncCeremonyMusicLocks()
syncConditionalSections()
syncEventTypeUI()
applyTemplate(templateId)
checkConflicts()
validateForm(payload)
getPayload()
setPayload(p)
savePlanner()
generateAutoTimeline()
resetPlanner()
initApp()
Mire támaszkodik?
PlannerFinance.syncStep4UI()
PlannerTemplates.loadTemplateIndex()
PlannerVenues.loadVenues()
PlannerSignature.initSignaturePad()
PlannerSearch.initSearchCollapse()
PlannerAcceptedQuotes.loadPlannerAcceptedQuotes()
UiModal megerősítésekhez és hibákhoz
A PlannerApp egyik fontos szerepe, hogy a többi modul működését helyes sorrendben inicializálja.
A feature modulok önmagukban nem garantálják a teljes oldal működését.
15. planner-finance.js részletesen
Ez a modul a planner pénzügyi logikáját viszi: összegszámítás, hátralék, átutalási mezők, számlázási blokk láthatóság.
Backend függés
GET /api/payment-transfer-config
Fő metódusok
loadTransferConfig()
applyTransferConfig()
clearTransferFields()
updateTransferAmountField()
getExtraServicesTotal()
recalcFinance()
syncBillingUI()
syncStep4UI()
Üzleti szabályok
- effect gépek automatikusan növelik a végösszeget
- hátralék = végösszeg - előleg
- átutalás esetén bank mezők kötelező relevanciát kapnak
- számlázás esetén invoice section látható
- fizetett státusz alapján invoice number mező láthatóság változik
const total = Math.max(0, base + travel + extras - discount);
const remaining = Math.max(0, total - deposit);
A modul nem ment adatot önmagában. A számított értékeket az input mezőkbe írja vissza,
és a mentés során a PlannerApp.getPayload() olvassa ki őket.
16. planner-search.js részletesen
A planner-search.js kezeli a kereső / visszatöltő panelt, a statisztikai összesítést
és a találatok részleges műveleteit.
Fő metódusok
initSearchCollapse()
openSearchPanel()
runSearch()
renderSearchResults(items)
toggleStats()
bindSearchEvents()
API függések
GET /api/sessions
GET /api/session/:stamp
DELETE /api/session/:stamp
GET /api/stats
| UI funkció |
Modul metódus |
Backend route |
| keresés |
runSearch() |
GET /api/sessions |
| statisztika |
toggleStats() |
GET /api/stats |
| visszatöltés |
találati gomb → PlannerApp.setPayload() |
GET /api/session/:stamp |
| törlés |
találati gomb → apiDelete() |
DELETE /api/session/:stamp |
A keresőmodul jó példa arra, hogy a refaktor nem csak fájlokat bont szét,
hanem a felhasználói interakciók külön felelősségi területre kerülnek.
17. planner-signature.js részletesen
Ez a modul felel a signature canvas kezeléséért és a planner mellékletek listájáért.
Fő state-ek
attachments
currentSignatureFile
signaturePad
signatureCtx
signatureDrawing
signatureDirty
Fő metódusok
initSignaturePad()
clearSignaturePad()
getSignatureDataUrl()
drawSignatureFromDataUrl()
renderAttachments()
setAttachments()
pushAttachment()
clearAttachments()
setCurrentSignatureFile()
getCurrentSignatureFile()
A modul önmagában nem tölt fel semmit a szerverre.
A feltöltést a PlannerApp.savePlanner() végzi, amely a canvas dataURL-ből blobot képez,
majd /api/upload hívást indít.
18. planner-templates.js részletesen
A planner template modul a sablonindex és az egyes sablon JSON fájlok betöltését végzi.
Fő state
templateIndex
templateCache
Fő metódusok
loadTemplateIndex()
getTemplateIndex()
renderTemplateOptions()
renderSearchTemplateOptions()
loadTemplateById(templateId)
const response = await fetch(`${BASE}/templates/index.json`, { cache: "no-store" });
A template modul csak adatbetöltést végez.
A template tényleges alkalmazása a planner oldalon a PlannerApp.applyTemplate() feladata.
19. planner-venues.js részletesen
A venue modul a helyszínlista API integrációját és az „Egyéb…” helyszín logikát választja le a planner főappból.
State
venuesData = { options: [] }
Fő metódusok
loadVenues(selectedValue)
renderVenueOptions(selectedValue)
saveVenueIfNeeded()
getVenueValue()
bindVenueEvents()
| Szituáció |
Mi történik? |
| betöltött venue megtalálható a listában |
a select ugyanarra az értékre áll |
| betöltött venue nincs a listában |
a select __other__ értékre vált, a custom input feltöltődik |
felhasználó __other__-t választ |
a custom venue mező láthatóvá válik |
save közben __other__ van kiválasztva |
a modul új venue-t ment az API-n keresztül |
20. planner-accepted-qoutes.js részletesen
Ez a modul az accepted státuszú quote-ok planner oldalra történő előtöltését kezeli.
Különösen fontos, mert itt a quote és a planner közti hídlogika jelenik meg.
Fő metódusok
loadPlannerAcceptedQuotes()
renderPlannerAcceptedQuoteOptions()
inferEventTypeFromQuote()
inferTemplateIdFromQuote()
applyAcceptedQuoteToPlanner()
loadSelectedAcceptedQuoteIntoPlanner()
bindAcceptedQuoteEvents()
Az inferEventTypeFromQuote() és inferTemplateIdFromQuote() azért fontos,
mert nem minden accepted quote hordoz teljesen egyértelmű planner template információt.
A modul ezért következtető logikát is tartalmaz.
21. CRM modulrendszer
A CRM refaktor a quote-kezelés monolit logikáját bontja szét pénzügyre, follow-up-ra,
template-kezelésre és az ezek fölött álló orchestratorra.
CRM namespace-ek
CrmApp
CrmFinance
CrmFollowup
CrmTemplates
Fő logikai bontás
- CrmApp – fő entrypoint és quote műveletek
- CrmFinance – effect / extra / végösszeg számítás
- CrmFollowup – korábbi quote visszatöltés és törlés
- CrmTemplates – quote sablonok
22. crm-app.js részletesen
A CRM fő entrypointja. Betölti a kapcsolt planner sessiont, összefogja a quote form állapotát,
kezeli a generálást és a törlést.
State
currentSessionRecord
currentGeneratedQuoteStamp
Fő metódusok
getCurrentSessionRecord()
getCurrentGeneratedQuoteStamp()
setCurrentGeneratedQuoteStamp()
renderEventInfo()
collectQuotePayload()
setResultLinks()
clearResultLinks()
loadSessionIfExists()
generateQuotePdf()
deleteGeneratedQuote()
bindCrmEvents()
initCrm()
A CrmApp a CRM oldalon több más modul szolgáltatásait használja,
de a felhasználó számára még mindig ez viselkedik „a CRM oldal logikájaként”.
23. crm-finance.js részletesen
A CRM pénzügyi modulja főként az ajánlati összegek számítását és az eseményből felismert effect gépek kezelését végzi.
Fő metódusok
effectListFromPayload(p)
getQuoteExtrasTotal()
effectTotalFromPayload(p)
recalcQuoteFinance()
setDetectedEffectsFromEvent()
setDefaultDates()
Fontos szabályok
- buborék gép +10 000 Ft
- hidegszikra +60 000 Ft
- nehézfüst +60 000 Ft
- a végösszeg = alapár + extrák - kedvezmény
- kapcsolt eventből effect mezők felismerhetők
24. crm-follwup.js részletesen
A follow-up modul kezeli az ajánlat és utókövetés mód közti váltást,
a korábbi ajánlatok listáját, azok visszatöltését és törlését.
Fő metódusok
getDocumentModeValue()
syncDocumentModeUi()
loadFollowupQuoteOptions(autoLoadFirst)
loadSelectedQuoteIntoFollowup(showSuccessModal)
deleteSelectedFollowupQuote()
API függések
GET /api/quotes
GET /api/quote/:stamp
DELETE /api/quote/:stamp
A modul képes a kapcsolt planner esemény adatai alapján a korábbi quote-okat leszűrni,
így a follow-up dropdown nem a teljes quote univerzumot mutatja.
25. crm-templates.js részletesen
A CRM template modul a quote sablonok betöltését és az ajánlati űrlapra való alkalmazását végzi.
State
templateIndex
templateCache
Fő metódusok
loadTemplateIndex()
renderTemplateOptions()
loadTemplateById(templateId)
buildFallbackTemplateDescription(templateData, eventPayload)
applyTemplateToQuoteForm(templateId)
A modul nem csak betölt, hanem fallback logikát is ad:
ha nincs direkt package description, akkor a template meta és a kapcsolt event payload alapján állít össze leírást.
26. Dashboard modulrendszer
A dashboard refaktor célja az volt, hogy az auth, a render és a főapp logika különváljon.
Dashboard namespace-ek
DashboardApp
DashboardAuth
DashboardRender
Bontás előnye
- auth hibák könnyebben izolálhatók
- render helper-ek külön tesztelhetők
- main app csak orchestrationt végez
27. dashboard-app.js részletesen
A dashboard fő entrypointja, amely kezeli az unlock folyamatot, az overlay-t és a summary betöltést.
Fő metódusok
setText(id, value)
unlockDashboardUi()
setAuthError(message)
checkDashboardPassword()
loadDashboard()
bindDashboardEvents()
initDashboard()
A dashboard oldalon nincs általános modal modul.
Itt az auth overlay és az inline auth hiba saját, oldal-specifikus megoldásként marad.
28. dashboard-auth.js részletesen
Egyetlen, jól izolált feladata van: a dashboard jelszó ellenőrzése.
async function verifyDashboardPassword(password) {
const response = await fetch(`${BASE}/api/auth/dashboard`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ password })
});
...
}
Ez tipikus példa arra, amikor külön fájlba bontás kis kockázattal nagy átláthatósági nyereséget ad.
29. dashboard-render.js részletesen
A dashboard render modul HTML stringeket gyárt a summary alatti listákhoz és a next-event blokkhoz.
Fő metódusok
renderDashList(items, options)
renderAlertList(items, emptyText)
renderNextEventBox(item)
Miért külön fájl?
- a dashboard-app kisebb lett
- a render logika könnyebben áttekinthető
- később könnyebben cserélhető vagy bővíthető
30. calendar-app.js részletesen
A naptár jelenleg egyetlen feature modulban maradt, mert a logikája önmagában is jól körülhatárolható.
State
currentMonth
calendarData
selectedDate
Fő metódusok
updateUrlMonth(month)
dayTitle(dateStr)
renderDayList(dateStr)
renderCalendar()
loadCalendar(monthOverride)
bindCalendarEvents()
initCalendar()
A calendar modul fontos javítása, hogy az API által visszaadott it.ics mezőt használja.
Ez megszünteti a korábbi kézi útvonal-összerakás kockázatát.
31. DJ View modulrendszer
A DJ preview refaktor bontja a timeline logikát, a price unlock authot,
a HTML renderelést és az auto-refresh működést.
DJ View namespace-ek
DjViewTimeline
DjViewAuth
DjViewRender
DjViewApp
Refaktor előnye
- timeline algoritmus külön tesztelhető
- price modal auth elszigetelt
- render különválik az adatlekéréstől
- konzisztensebb a planner / CRM / dashboard mintával
32. djview-timeline.js részletesen
A timeline modul kizárólag az időalapú eseménysor összeállításával foglalkozik.
Fő metódusok
toMinutes(timeStr)
pad2(n)
minutesToTime(totalMinutes)
splitCeremonyTimeline(startTime, endTime, stepsCount)
parseEventDate(value)
buildDateTimeFromEvent(dateValue, timeValue, isNextDay)
buildWeddingTimeline(p)
buildGenericEventTimeline(p)
buildTimeline(p)
annotateTimeline(timeline, eventDate)
computeTimelinePhase(timeline)
computeNextEvent(timeline, eventType)
Mit nem csinál?
- nem kér API-t
- nem ír DOM-ot
- nem kezeli a password modalt
- nem kezeli a PDF gombokat
A modul időlogikája kritikus, mert a preview egyik legfontosabb eleme a „Most / Következik / Elmúlt” állapotok helyes megjelenítése.
33. djview-auth.js részletesen
Az árfeloldás és a password modal logika külön modulként él.
Ez a dashboard auth mintájához hasonlóan különválasztja az auth jellegű működést a render és az adatbetöltés logikától.
Tipikus elemek
verifyPricePassword(password)
getPriceModalRefs()
openPriceModal()
closePriceModal(result)
showPriceModalError(message)
bindPriceModal()
handlePriceToggle()
Felelősség
- ármezők rejtett/látható állapotának kezelése
- jelszó bekérése
- auth endpoint hívása
- hibás jelszó kezelés
34. djview-render.js részletesen
Ez a modul a preview teljes HTML szerkezetét építi fel, a timeline adatokból és a session payloadból.
Tipikus render helper-ek
renderBlockTitle()
renderTimeline()
renderPills()
renderKV()
- különböző kártya renderelők: contact, finance, transfer, billing, template, approval
Külön szabályok
- esküvő és non-wedding jobb oldali kártyái eltérnek
- árak rejtetten vagy láthatóan renderelhetők
- timeline state osztályok külön CSS állapotokat kapnak
35. djview-app.js részletesen
A DJ View entrypoint a session rekord lekérését, a render meghívását,
a gombok bekötését és az auto refresh kezelését végzi.
State
refreshTimer
- a price unlock állapot auth modulban vagy app modul szintjén kezelhető
Fő metódusok
getParam(name) vagy AppCore alapú megfelelő
loadView()
startAutoRefresh()
- reload gomb bind
- toggle price bind
- init()
Az app modul feladata, hogy a session lekérés eredményét átadja a render modulnak,
és biztosítsa a 30 másodperces automatikus újratöltést.
36. Frontend modul → endpoint mátrix
Ez a mátrix azt mutatja meg, hogy a refaktorált frontend modulok pontosan mely backend végpontokat használják.
| Frontend modul |
Használt endpointok |
Fő cél |
PlannerApp |
POST /api/upload
GET /api/conflicts
POST /api/autotimeline
POST /api/sessions
|
mentés, konfliktusellenőrzés, automatikus menetrend |
PlannerSearch |
GET /api/sessions
GET /api/session/:stamp
DELETE /api/session/:stamp
GET /api/stats
|
keresés, visszatöltés, törlés, statisztika |
PlannerVenues |
GET /api/venues
POST /api/venues
|
helyszínlista |
PlannerFinance |
GET /api/payment-transfer-config |
átutalási adatok |
PlannerAcceptedQuotes |
GET /api/planner-accepted-quotes
GET /api/planner-accepted-quote/:stamp
|
accepted quote alapú előtöltés |
CrmApp |
GET /api/session/:stamp
POST /api/quotes/generate
DELETE /api/quote/:stamp
|
kapcsolt esemény betöltése, quote generálás, törlés |
CrmFollowup |
GET /api/quotes
GET /api/quote/:stamp
DELETE /api/quote/:stamp
|
follow-up lista és visszatöltés |
DashboardAuth |
POST /api/auth/dashboard |
dashboard védelem |
DashboardApp |
GET /api/dashboard-summary |
summary és listák |
CalendarApp |
GET /api/calendar |
havi naptár és napi lista |
DjViewAuth |
POST /api/auth/price-view |
pénzügyi adatok feloldása |
DjViewApp |
GET /api/session/:stamp |
preview adatbetöltés |
37. Használt adatmodellek
A refaktorált frontend ugyanazokra az üzleti adatmodellekre épül, mint az eredeti rendszer.
A különbség az, hogy most ezekhez több kisebb modul különböző részfeladatokkal kapcsolódik.
Planner payload
{
"eventTemplate": "wedding_classic",
"eventTemplateName": "Esküvő – klasszikus magyar",
"eventType": "wedding",
"coupleName": "Minta Pár",
"eventDate": "2026-08-15",
"venue": "Szeged - Kastélykert Birtok",
"headcount": "150",
"primaryContactName": "Teszt Elek",
"primaryContactPhone": "+36 30 123 4567",
"genres": ["Retro", "Pop"],
"guestArrivalTime": "17:00",
"dinnerTime": "19:00",
"eventEndTime": "04:00",
"serviceFeeBase": "250000",
"paymentMethod": "átutalás",
"invoiceNeeded": true,
"signatureFile": "/uploads/signature.png",
"attachments": ["/uploads/photo1.jpg"]
}
Quote payload
{
"quoteNumber": "AJ-2026-0001",
"quoteDate": "2026-03-12",
"validFrom": "2026-03-12",
"validUntil": "2026-03-19",
"servicePeriodFrom": "2026-08-15T12:00",
"servicePeriodTo": "2026-08-15T23:00",
"packageName": "Esküvő – Prémium",
"packageDescription": "Teljes DJ és fénytechnika",
"basePrice": 250000,
"extrasTotal": 60000,
"discountAmount": 10000,
"totalPrice": 300000,
"paymentTerms": "50% előleg",
"status": "draft",
"paymentMethod": "átutalás",
"documentMode": "offer"
}
Calendar response
{
"ok": true,
"month": "2026-08",
"monthLabel": "2026. augusztus",
"prevMonth": "2026-07",
"nextMonth": "2026-09",
"days": [
{
"date": "2026-08-15",
"day": 15,
"inMonth": true,
"isToday": false,
"items": [
{
"stamp": "minta_par_2026-08-15",
"coupleName": "Minta Pár",
"venue": "Szeged - Kastélykert Birtok",
"eventType": "wedding",
"pdf": "/data/minta_par_2026-08-15.pdf",
"ics": "/data/minta_par_2026-08-15.ics"
}
]
}
]
}
Dashboard summary response
{
"ok": true,
"summary": {
"totalEvents": 18,
"todayCount": 1,
"next7DaysCount": 4,
"openFinanceCount": 3,
"openFinanceTotal": 540000,
"paidCount": 5,
"paidTotal": 1200000,
"contractedEvents": 12
},
"nextEvent": { "stamp": "..." },
"todayItems": [],
"next7Days": [],
"openFinance": [],
"incompleteItems": [],
"alerts": {
"missingDeposit": [],
"missingInvoiceInfo": [],
"missingSignature": [],
"missingTimeline": []
}
}
38. Frontend állapotmodellek
A refaktor egyik fontos hozadéka, hogy az oldalak lokális state-je jobban látszik.
Ez hibakeresésnél és későbbi átalakításnál is nagy előny.
| Oldal / modul |
Fő state változók |
Jelentés |
PlannerApp |
currentStep |
wizard aktuális lépés |
PlannerSignature |
attachments, currentSignatureFile, signatureDirty |
aláírás és melléklet állapot |
PlannerFinance |
transferConfigCache |
átutalási config cache |
PlannerAcceptedQuotes |
plannerAcceptedQuotes |
accepted ajánlatlista |
CrmApp |
currentSessionRecord, currentGeneratedQuoteStamp |
kapcsolt event és generált ajánlat |
CrmTemplates |
templateIndex, templateCache |
quote sabloncache |
CalendarApp |
currentMonth, calendarData, selectedDate |
naptár állapot |
UiModal |
modalResolver, pdfProgressInterval, pdfProgressValue |
modal és PDF progress állapot |
DjViewApp/Auth |
refreshTimer, priceUnlocked, priceModalResolver |
preview refresh és price unlock állapot |
39. HTML / DOM szerződések
A refaktor egyik legfontosabb hallgatólagos szerződése, hogy a modulok meghatározott DOM ID-k létezésére számítanak.
Ezeket a dokumentáció explicit módon rögzíti.
UiModal által elvárt elemek
appModal
appModalIcon
appModalTitle
appModalSubtitle
appModalBody
appModalOkBtn
appModalCancelBtn
pdfProgressModal
pdfProgressFill
pdfProgressPercent
pdfProgressText
PlannerSignature által elvárt elemek
signaturePad
attachments
coupleName
CalendarApp által elvárt elemek
calendarGrid
monthLabel
selectedDayTitle
selectedDayList
prevMonthBtn
nextMonthBtn
reloadCalendarBtn
DJ View auth által elvárt elemek
priceModal
pricePasswordInput
priceModalError
priceModalOkBtn
priceModalCancelBtn
togglePriceBtn
Ha egy modul nem találja a szükséges DOM elemeit, az vagy csendes részleges hibát,
vagy közvetlen futási hibát okozhat. Ezért a refaktor utáni HTML csere ellenőrzése külön regressziós pont.
40. Mentési folyamatok
A refaktor után a mentési folyamatok üzletileg ugyanazok maradtak, de technikailag több modul együttműködésében valósulnak meg.
Planner mentés
PlannerApp.savePlanner() meghívja a PlannerFinance.syncStep4UI()-t,
ellenőrzi az egyéb venue mentést, validál,
opcionálisan signature uploadot végez,
konfliktust ellenőriz,
majd meghívja a POST /api/sessions route-ot.
Planner mentés utáni UI
Result linkek beállítása, conflict notice render, kereső frissítése,
PDF progress lezárása, siker modal megjelenítése.
CRM quote mentés
CrmApp.generateQuotePdf() összeállítja a linked payloadot és a quote objektumot,
elindítja a PDF progress modalt,
majd POST /api/quotes/generate hívást végez.
CRM mentés utáni UI
PDF link és JSON link beállítása, quote stamp elmentése, PDF progress befejezése,
siker modal megjelenítése.
41. Betöltési folyamatok
A betöltési folyamatok a refaktorált frontendben több kisebb modul között oszlanak meg.
Planner oldal első betöltés
PlannerApp.initApp() → genre render → UI sync → signature pad init →
modal bind → search collapse → template index → venue lista → accepted quote lista →
kereső bind → wizard bind → finance sync.
CRM oldal kapcsolt sessionnel
CrmApp.loadSessionIfExists() → session payload betöltés → event info render →
effect detect → default date kitöltés → finance recalc.
Dashboard belépés után
DashboardAuth.verifyDashboardPassword() → auth overlay eltűnik →
DashboardApp.loadDashboard() → summary és listák renderelése.
Calendar oldal
CalendarApp.loadCalendar() → API válasz → selectedDate kiválasztás →
havi grid render → napi lista render.
DJ preview oldal
DjViewApp.loadView() → session betöltés →
DjViewTimeline.buildTimeline() →
DjViewTimeline.annotateTimeline() →
DjViewRender.render().
42. Hibakezelési stratégia
A v2 frontend hibakezelése részben egységesebb lett az AppCore.api* wrapper miatt,
de továbbra is oldal-specifikus UI visszajelzések maradtak.
Közös minták
apiGet/apiPost/apiDelete kivételt dobnak, ha ok:false
- a planner és CRM több helyen
UiModal-t használ
- a dashboard auth saját inline hibát használ
- a DJ View saját modal hibaszöveget használ
Tipikus megjelenítési formák
- modal warning
- modal success
- modal error
- inline error box
- empty-box placeholder
- console.error fejlesztői célra
A frontend refaktor után a hibák forrása könnyebben lokalizálható:
API réteg, render réteg, event bind réteg vagy HTML hiányzó elem.
43. Átállási útmutató a régi script-ekről
A v2-re való átállás során a régi oldalankénti script hivatkozások cserélődnek le az új moduláris útvonalakra.
| Régi script |
Új script-ek |
app.js |
core/base.js,
core/api.js,
core/formar.js,
ui/ui-modal.js,
planner/*.js
|
crm.js |
core/base.js,
core/api.js,
core/formar.js,
ui/ui-modal.js,
crm/*.js
|
dashboard.js |
core/base.js,
core/api.js,
core/formar.js,
dashboard/*.js
|
calendar.js |
core/base.js,
core/api.js,
core/formar.js,
calendar/calendar-app.js
|
dj-view.js |
core/base.js,
core/api.js,
core/formar.js,
djview/*.js
|
Az átállás során a régi és az új script-eket nem szabad egyszerre bent hagyni ugyanazon az oldalon,
mert duplikált bind, duplikált init vagy felülírt namespace lehet a következmény.
44. Tesztelési forgatókönyvek
A refaktorált frontend akkor tekinthető funkcionálisan stabilnak, ha az alábbi végponti és UI forgatókönyvek sikeresen lefutnak.
1. Planner – üres indulás
Töltsön be a wizard, jelenjen meg az első lépés, működjön a léptetés, legyen alapértelmezett approval date.
2. Planner – template betöltés
Event template select változásra töltsön elő mezőket, változzon a genre lista, frissüljön a Step 4 UI.
3. Planner – venue és egyéb helyszín
__other__ választáskor jelenjen meg a custom input, mentéskor az új venue kerüljön elmentésre.
4. Planner – finance
Effect gépek, kedvezmény, előleg, payment method és invoice checkbox változásra a pénzügyi mezők helyesen frissüljenek.
5. Planner – signature és attachment
Canvas aláírás működjön egérrel és touch-al, attachment chip lista frissüljön.
6. Planner – save
PDF progress modal fusson, létrejöjjön a JSON / PDF / ICS, megjelenjen a result blokk.
7. Planner – search és stats
Collapse panel nyíljon, a search eredményekből működjön a visszatöltés és törlés.
8. Planner – accepted quote import
Elfogadott ajánlatból a planner mezők, template és finance értékek helyesen töltődjenek vissza.
9. CRM – kapcsolt event betöltés
?stamp= paraméterrel töltse be a session alapadatait és effect gépeit.
10. CRM – template
Quote template kiválasztás után package name, description és base price frissüljön.
11. CRM – follow-up
Document mode váltáskor a followup card jelenjen meg vagy tűnjön el,
a korábbi quote lista töltődjön, a visszatöltés működjön.
12. CRM – quote generálás és törlés
PDF progress fusson, a result link létrejöjjön, a törlés után eltűnjön.
13. Dashboard
Helyes jelszóval unlockoljon, hibás jelszóval maradjon zárolva, summary és listák töltődjenek be.
14. Calendar
Előző/következő hónap működjön, selectedDate változzon, napi lista és PDF / ICS / DJ Preview linkek helyesek legyenek.
15. DJ View
Timeline épüljön, next event blokk jelenjen meg, price unlock működjön, auto refresh fusson.
45. Regressziós ellenőrzőlista
Script és namespace
- minden oldalon betöltődik a megfelelő
assets/JS/... fájl
- nincs 404 script hiba
- nincs
window.XYZ is undefined hiba
- nincsenek duplikált init-ek
Planner
- wizard léptetés jó
- genres és eventType UI jó
- finance helyes
- signature működik
- save után result link él
CRM
- kapcsolt session betölt
- quote template működik
- follow-up lista helyes
- delete nem hagy broken linket
Dashboard / Calendar / DJ
- dashboard auth ok
- calendar havi váltás ok
- DJ price unlock ok
- DJ auto refresh ok
46. Ismert korlátok
Jelenlegi korlátok
- a backend még nem lett service / utils rétegre bontva
- a frontend továbbra is globális namespace-eket használ
- a script sorrend kézi karbantartást igényel
- több történelmi fájlnév-elírás megmaradt
- nincs automatikus build vagy lint réteg
Refaktor utáni logikus következő lépések
- backend utility/service bontás
- route callback-ek szervezettebb kinyerése
- naming cleanup külön körben
- schema validation szigorítása
- később opcionális modulrendszer vagy bundling
47. Fejlesztői megjegyzések
A refaktor erősségei
- a frontend felelősségek sokkal tisztábbak
- könnyebb egy hibát lokalizálni
- a közös helper-ek egyszer lettek leírva
- az oldalak betöltési logikája dokumentálhatóbb és stabilabb
- a későbbi backend bontáshoz jó előkészítés
Fontos óvintézkedések
- HTML ID-khez nem szabad hozzányúlni kontroll nélkül
- script sorrendet mindig dokumentáltan kell karbantartani
- elírt fájlneveket csak külön cleanup körben szabad javítani
- régi és új script-eket nem szabad keverni ugyanazon az oldalon
Ez a v2 dokumentáció a refaktorált frontend szerkezet hivatalos technikai leírásának tekinthető.
Arra szolgál, hogy a rendszer a további bővítések, javítások és a későbbi backend szétbontás során is
következetesen, ellenőrizhetően és visszakereshetően fejlődjön tovább.