// Zapamiętane predykcje okresowe (PRE-22). // // Kalendarz pozwala policzyć horoskop na wybrany okres. Partnerzy chcą kilku // okresów naraz — i żeby wszystkie trafiły potem do raportu (zakładka // „Skompiluj", PRE-23/24). Tu jest magazyn i lista. // // Trzymamy w localStorage, tak jak wspólne dane formularza (PRE-21): serwer // zostaje bezstanowy, żadne dane urodzeniowe ani treści z baz nie lądują po // stronie usługi. Zakładka „Skompiluj" odczyta to samo miejsce. (function () { 'use strict'; var KEY = 'astrololo.predictions.v1'; function read() { try { var v = JSON.parse(localStorage.getItem(KEY) || '[]'); return Array.isArray(v) ? v : []; } catch (e) { return []; // uszkodzony wpis nie może zablokować strony } } function write(list) { try { localStorage.setItem(KEY, JSON.stringify(list)); return true; } catch (e) { return false; // najczęściej przepełniony magazyn } } function byPeriod(a, b) { return String(a.from_date).localeCompare(String(b.from_date)); } // Klucz tożsamości to OKRES. Ponowne policzenie tego samego zakresu ma // podmienić wpis, a nie dokładać duplikat — inaczej lista puchłaby przy // każdej próbie z innym modelem. function upsert(entry) { var list = read().filter(function (p) { return !(p.from_date === entry.from_date && p.to_date === entry.to_date); }); list.push(entry); list.sort(byPeriod); return write(list) ? list : null; } function remove(id) { var list = read().filter(function (p) { return p.id !== id; }); write(list); return list; } function val(sel) { var el = document.querySelector(sel); return el ? el.value.trim() : ''; } /** Wyciąga świeżo policzony horoskop okresowy ze strony. */ function capture() { var text = val('#horoscopeText'); var from = val('input[name=from_date]'); var to = val('input[name=to_date]'); if (!text || !from || !to) return null; return { id: from + '..' + to, from_date: from, to_date: to, person: val('input[name=person]'), text: text, saved_at: new Date().toISOString() }; } function fmtDate(iso) { return String(iso || '').slice(0, 10); } function render() { var host = document.getElementById('savedPredictions'); if (!host) return; var list = read(); if (!list.length) { host.innerHTML = '

Brak zapamiętanych predykcji. ' + 'Policz horoskop na wybrany okres — zapamięta się sam i trafi do raportu.

'; return; } var rows = list.map(function (p) { var chars = (p.text || '').length; return '' + '' + fmtDate(p.from_date) + ' – ' + fmtDate(p.to_date) + '' + '' + fmtDate(p.saved_at) + '' + '' + chars.toLocaleString('pl-PL') + ' znaków' + '' + ''; }).join(''); host.innerHTML = '
Zapamiętane predykcje (' + list.length + ') — wejdą do raportu
' + '' + '' + rows + '
OkresZapisanoObjętość
'; Array.prototype.forEach.call(host.querySelectorAll('[data-drop]'), function (btn) { btn.addEventListener('click', function () { remove(btn.getAttribute('data-drop')); render(); }); }); } function saveCurrent() { var entry = capture(); if (!entry) return; var note = document.getElementById('predictionsNote'); if (upsert(entry)) { if (note) note.textContent = 'Zapamiętano predykcję ' + entry.from_date + ' – ' + entry.to_date + '.'; } else if (note) { // Horoskopy bywają długie; gdy magazyn się przepełni, trzeba powiedzieć // wprost, zamiast po cichu zgubić wynik. note.textContent = 'Nie udało się zapamiętać — magazyn przeglądarki pełny. ' + 'Usuń starsze predykcje i spróbuj ponownie.'; } render(); } function ready(fn) { if (document.readyState !== 'loading') fn(); else document.addEventListener('DOMContentLoaded', fn); } ready(function () { if (!document.getElementById('savedPredictions')) return; // nie ta zakładka render(); // 1) horoskop policzony przez okno postępu (strumień) document.addEventListener('astrololo:horoscope', function (e) { if (!e.detail || e.detail.profile === 'period') saveCurrent(); }); // 2) wariant bez strumienia: strona wróciła z gotowym wynikiem po zwykłym // POST. Zapis jest idempotentny (klucz = okres), więc odświeżenie strony // niczego nie duplikuje. if (document.querySelector('#horoscopeText')) saveCurrent(); }); // Udostępniamy magazyn zakładce „Skompiluj" (PRE-23) — jedno źródło prawdy. window.astrololoPredictions = { read: read, remove: remove, key: KEY }; })();