Files
astrololo/services/presentation/app/static/natal.js
T
gitea 6c9029c496
Testy / Build obrazu silnika B (swisseph) (push) Waiting to run
Testy / Kontrola składni wszystkich warstw (push) Waiting to run
build / build (push) Successful in 52s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m16s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Has started running
feat(prezentacja): zakladka „Skompiluj" — zbiorczy raport (PRE-23)
Czwarta wskazowka partnerow. Nowa zakladka sklada w jedno trzy kawalki liczone
w roznych miejscach: policzony horoskop, interpretacje natalna z AI i wszystkie
zapamietane predykcje okresowe.

Uklad sekcji dokladnie wg prosby: imie i nazwisko -> wprowadzone dane ->
RYSUNEK kosmogramu -> interpretacja natalna -> predykcje okresowe. Test pilnuje
tej kolejnosci, bo to jedyna rzecz, ktora latwo przestawic przy refaktorze,
a partnerzy podali ja wprost.

Skad material:
- HOROSKOP liczymy TU NA NOWO z danych formularza, zamiast go zapamietywac.
  To czysta funkcja wejscia — tanio powtorzyc, a odpada trzymanie w przegladarce
  duzego wyniku, ktory moglby sie rozjechac z aktualnym formularzem.
- INTERPRETACJA NATALNA — nowy natal.js, odpowiednik predictions.js. Natalna jest
  JEDNA (dotyczy momentu urodzenia, nie okresu), wiec ponowne wygenerowanie
  podmienia slot zamiast dokladac wpis.
- PREDYKCJE — z magazynu z PRE-22.

compile.js czyta magazyny przez ICH API (window.astrololoNatal /
astrololoPredictions), a nie siegajac wprost do localStorage — format danych ma
jednego wlasciciela: modul, ktory je zapisuje. Test tego pilnuje.

Zakladka MOWI, CZEGO BRAKUJE: panel gotowosci z trzema pozycjami i podpowiedzia,
na ktorej zakladce uzupelnic. Bez tego uzytkownik zlozylby niekompletny raport
i dowiedzialby sie o tym dopiero po otwarciu PDF-a.

Tresc od modelu jest ESKEJPOWANA przed wstawieniem do DOM — to tekst z zewnatrz,
wiec bez tego mielibysmy wektor wstrzykniecia.

Weryfikacja na zywej aplikacji: dwie predykcje zapisane w Kalendarzu, natalna
w Interpretacjach, obie odczytane na Skompiluj (panel: brak horoskopu na zolto,
dwa pozostale na zielono). Po zlozeniu wszystkie trzy zielone, a raport zaczyna
sie od „Jan Kowalski" i danych wejsciowych. Kolejnosc sekcji sprawdzona na
wyrenderowanym HTML: naglowek 2931 < dane 3033 < kosmogram 3158 < natalna 26544
< predykcje 26575.

Testy: 16 nowych. Poprawione tez trzy wlasne testy, ktore lapaly nazwy plikow
w KOMENTARZACH zamiast w tagach skryptow. Calosc: prezentacja 117 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:09:56 +02:00

98 lines
3.1 KiB
JavaScript

// Zapamiętana interpretacja natalna (PRE-23).
//
// Odpowiednik predictions.js, tylko że natalna jest JEDNA — dotyczy momentu
// urodzenia, nie wybranego okresu. Ponowne wygenerowanie podmienia poprzednią.
//
// Po co magazyn: zakładka „Skompiluj" składa raport z trzech kawałków liczonych
// w różnych miejscach (horoskop, interpretacja natalna, predykcje okresowe).
// Bez zapamiętania trzeba by je generować od nowa na jednej stronie.
//
// localStorage, tak jak reszta stanu (PRE-21/22) — serwer zostaje bezstanowy.
(function () {
'use strict';
var KEY = 'astrololo.natal.v1';
function read() {
try {
var v = JSON.parse(localStorage.getItem(KEY) || 'null');
return (v && typeof v === 'object' && v.text) ? v : null;
} catch (e) {
return null; // uszkodzony wpis nie może zablokować strony
}
}
function clear() {
try { localStorage.removeItem(KEY); } catch (e) { /* trudno */ }
}
function val(sel) {
var el = document.querySelector(sel);
return el ? el.value.trim() : '';
}
function save() {
var text = val('#horoscopeText');
if (!text) return false; // nie ma czego zapamiętać
var entry = {
text: text,
person: val('input[name=person]'),
date: val('input[name=date]'),
time: val('input[name=time]'),
tz_offset: val('input[name=tz_offset]'),
lat: val('input[name=lat]'),
lon: val('input[name=lon]'),
saved_at: new Date().toISOString()
};
try {
localStorage.setItem(KEY, JSON.stringify(entry));
return true;
} catch (e) {
return false; // przepełniony magazyn — zgłaszamy wyżej
}
}
function note(msg) {
var el = document.getElementById('natalNote');
if (el) el.textContent = msg;
}
function saveCurrent() {
var text = val('#horoscopeText');
if (!text) return;
if (save()) {
note('Interpretacja natalna zapamiętana — trafi do raportu (zakładka Skompiluj).');
} else {
// Interpretacje bywają długie; cicha strata byłaby najgorsza.
note('Nie udało się zapamiętać — magazyn przeglądarki pełny. '
+ 'Usuń starsze predykcje i spróbuj ponownie.');
}
}
function ready(fn) {
if (document.readyState !== 'loading') fn();
else document.addEventListener('DOMContentLoaded', fn);
}
ready(function () {
if (!document.getElementById('natalNote')) return; // nie ta zakładka
// 1) interpretacja policzona przez okno postępu (strumień)
document.addEventListener('astrololo:horoscope', function (e) {
if (!e.detail || e.detail.profile === 'natal') saveCurrent();
});
// 2) wariant bez strumienia: strona wróciła z gotowym wynikiem po zwykłym
// POST. Zapis nadpisuje jeden slot, więc odświeżenie niczego nie mnoży.
if (document.querySelector('#horoscopeText')) saveCurrent();
var status = read();
if (status) {
note('W raporcie jest zapamiętana interpretacja natalna z '
+ String(status.saved_at).slice(0, 10) + '.');
}
});
window.astrololoNatal = { read: read, clear: clear, key: KEY };
})();