/* ── Chestionarele de valori (A/B/C) - sectiune separata in sidebar (decizia Marian 24.07) ── Date: window.PRP_CHV (chv_data.js) · scoring: window.chvScoring (pur, testat golden) · store.chv[slug] = { activ: {raspunsuri, inceput, finalizat}, anterior: {...}|null }. Anti-bias: etichetele de stadiu NU apar la completare - doar in rezultat. Navigare: #chestionare[//], ecrane: completare | rezultat (modelul anamnezei). */ const IcChv = (p) => ( ); window.IcChv = IcChv; const CHV = () => (window.PRP_CHV || { chestionare: [] }).chestionare; const chvDeSlug = (slug) => CHV().find((c) => c.slug === slug) || null; function chvStarea(store, slug) { const tot = store.chv || {}; const st = tot[slug] || { activ: { raspunsuri: {}, inceput: null, finalizat: null }, istoric: [] }; if (!Array.isArray(st.istoric)) st.istoric = []; return st; } function chvScrie(set, slug, transform) { set((s) => { const tot = s.chv || {}; const cur = tot[slug] || { activ: { raspunsuri: {}, inceput: null, finalizat: null }, istoric: [] }; if (!Array.isArray(cur.istoric)) cur.istoric = []; return { ...s, chv: { ...tot, [slug]: transform(cur) } }; }); } /* data calendaristica a completarii (prototip local - patternul consolei/planului) */ const chvISO = () => new Date().toISOString().slice(0, 10); function chvExport(store) { const rez = {}; CHV().forEach((ch) => { const st = chvStarea(store, ch.slug); if (!st.activ.finalizat) return; const g = window.chvScoring.scorGlobal(ch, st.activ.raspunsuri); rez[ch.slug] = { nume: ch.nume, finalizat: st.activ.finalizat, stadiu: g.stadiu, eticheta: ch.mecanism.stadii[g.stadiu].eticheta, total: g.total, arii: g.arii.map((a) => ({ nr: a.nr, nume: a.nume, nA: a.nA, nB: a.nB, nC: a.nC, stadiu: a.stadiu })), decodificare: ch.mecanism.stadii[g.stadiu].sectiuni, raspunsuri: Object.fromEntries(Object.entries(st.activ.raspunsuri).map(([k, v]) => { const parti = k.split("|"); const aria = ch.arii.find((x) => x.nr === +parti[0]); const af = aria && aria.afirmatii.find((x) => x.nr === +parti[1]); return [k, { alegere: v, text: af ? af[v] : "" }]; })), /* istoricul completarilor anterioare - compact (verdictele; raspunsurile raman in store) */ istoric: st.istoric.filter((i) => i.finalizat).map((i) => { const gi = window.chvScoring.scorGlobal(ch, i.raspunsuri); return { finalizat: i.finalizat, stadiu: gi.stadiu, eticheta: ch.mecanism.stadii[gi.stadiu].eticheta, total: gi.total }; }), }; }); return Object.keys(rez).length ? { chestionareValori: rez } : {}; } window.chvExport = chvExport; function chvNavDinHash() { const m = (location.hash || "").match(/^#chestionare(?:\/([a-z-]+)\/(completare|rezultat|istoric)(?:\/(\d+))?)?$/); if (!m) return null; if (m[1] && !chvDeSlug(m[1])) return { slug: null, ecran: null, arhiva: null }; return { slug: m[1] || null, ecran: m[2] || null, arhiva: m[2] === "istoric" && m[3] ? +m[3] - 1 : null }; } /* ── hub: cardurile chestionarelor ── */ function ChvHub({ store, setNav }) { return (

Chestionarele valorilor

Chestionare de autoevaluare pe domeniile valorilor - la fiecare afirmație alegi varianta care te descrie cel mai bine ACUM, nu cea care ți-ar plăcea să fie adevărată. Rezultatul: profilul pe arii, stadiul curent de dezvoltare și decodificarea lui completă. Restul chestionarelor sunt în pregătire la Dr. Petre și apar aici imediat ce sosesc.

{CHV().map((ch) => { const st = chvStarea(store, ch.slug); const g = window.chvScoring.scorGlobal(ch, st.activ.raspunsuri); const pct = g.nTotal ? Math.round((g.nRaspunse / g.nTotal) * 100) : 0; return (

{ch.nume}

{ch.arii.length} arii · {g.nTotal} afirmații
{st.activ.finalizat ? "Finalizat: " + st.activ.finalizat : g.nRaspunse ? "În lucru: " + g.nRaspunse + " / " + g.nTotal : "Necompletat"}
{/* UN singur buton de rezultate (cerinta Marian): activul complet -> rezultatul curent (istoricul e in aceeasi pagina); altfel -> ultimul rezultat arhivat */}
{st.istoric.length > 0 &&
{st.istoric.length === 1 ? "O completare anterioară" : st.istoric.length + " completări anterioare"} · {" "}ultima: {st.istoric[0].finalizat}
}
); })}
); } /* ── completare: arie cu arie, variante FARA etichete de stadiu (anti-bias) ── */ function ChvCompletare({ ch, store, set, setNav }) { const [ariaIdx, setAriaIdx] = React.useState(0); const st = chvStarea(store, ch.slug); const g = window.chvScoring.scorGlobal(ch, st.activ.raspunsuri); const idx = Math.min(ariaIdx, ch.arii.length - 1); const aria = ch.arii[idx]; /* inaintarea e conditionata de aria curenta COMPLETA (cerinta Marian 24.07, cu captura) */ const ariaCompleta = g.arii[idx] ? g.arii[idx].complet : false; const alege = (afNr, v) => chvScrie(set, ch.slug, (cur) => ({ ...cur, activ: { raspunsuri: { ...cur.activ.raspunsuri, [aria.nr + "|" + afNr]: v }, inceput: cur.activ.inceput || chvISO(), finalizat: cur.activ.finalizat, }, })); const finalizeaza = () => { chvScrie(set, ch.slug, (cur) => ({ ...cur, activ: { ...cur.activ, finalizat: chvISO() } })); setNav({ slug: ch.slug, ecran: "rezultat" }); }; return (
{ch.nume}
Aria {aria.nr} din {ch.arii.length}: {aria.nume}
Progres total: {g.nRaspunse} / {g.nTotal}
{aria.afirmatii.map((af) => { const cheie = aria.nr + "|" + af.nr; const ales = st.activ.raspunsuri[cheie]; return (

Afirmația {af.nr} din {aria.afirmatii.length}

{["A", "B", "C"].map((v) => ( ))}
); })}
{idx < ch.arii.length - 1 ? : }
); } /* ── blocul de rezultat (verdict + harta + decodificare) - refolosit de rezultatul ACTIV si de completarile ARHIVATE din istoric ── */ function ChvRezultatCorp({ ch, g, finalizat, banner }) { const stadiu = ch.mecanism.stadii[g.stadiu]; const SECTIUNI = [ ["caracteristici", "Caracteristicile stadiului de dezvoltare personală"], ["impactare", "Modul de impactare personală"], ["predictii", "Predicțiile viitoare la nivel personal"], ["pericole", "Pericolele și vulnerabilitățile etapei"], ["actiuni", "Acțiuni concrete viitoare"], ]; return (
{ch.nume} · {banner || ("finalizat " + finalizat)}
{stadiu.eticheta} - {stadiu.nivel}
Total: {g.total.nA} A · {g.total.nB} B · {g.total.nC} C din {g.nTotal} afirmații

Harta ariilor

{g.arii.map((a) => ( ))}
AriaABCStadiu
{a.nr}. {a.nume} {a.nA}{a.nB}{a.nC} {ch.mecanism.stadii[a.stadiu].eticheta}
{SECTIUNI.map(([cheie, titlu]) => (

{titlu}

    {(stadiu.sectiuni[cheie] || []).map((x, i) =>
  • {x}
  • )}
))}
); } /* ── rezultatul ACTIV: corpul + istoricul completarilor + reia ── */ function ChvRezultat({ ch, store, set, setNav }) { const [confirmaReia, setConfirmaReia] = React.useState(false); const st = chvStarea(store, ch.slug); const g = window.chvScoring.scorGlobal(ch, st.activ.raspunsuri); /* rezultatul se poate deschide si direct din hub la 100% raspunsuri - data finalizarii se consemneaza atunci la prima deschidere */ React.useEffect(() => { if (g.complet && !st.activ.finalizat) { chvScrie(set, ch.slug, (cur) => ({ ...cur, activ: { ...cur.activ, finalizat: chvISO() } })); } }, [g.complet, st.activ.finalizat]); if (!g.complet) { return (
Rezultatul se activează la chestionar complet
Progres: {g.nRaspunse} / {g.nTotal}. Continuă completarea.
); } const reia = () => { chvScrie(set, ch.slug, (cur) => ({ activ: { raspunsuri: {}, inceput: null, finalizat: null }, istoric: [cur.activ, ...cur.istoric], })); setNav({ slug: ch.slug, ecran: "completare", arhiva: null }); }; return (
{confirmaReia ?
Sigur reiei chestionarul? Rezultatul curent se arhivează în istoricul completărilor și rămâne oricând vizibil acolo.
: }
); } /* ── istoricul completarilor: lista compacta cu drill-down la rezultatul complet ── */ function ChvIstoricLista({ ch, st, setNav }) { const intrari = st.istoric.filter((i) => i.finalizat); if (!intrari.length) return null; return (

Istoricul completărilor

{intrari.map((i, idx) => { const gi = window.chvScoring.scorGlobal(ch, i.raspunsuri); return ( ); })}
FinalizatStadiuABC
{i.finalizat} {ch.mecanism.stadii[gi.stadiu].eticheta} {gi.total.nA}{gi.total.nB}{gi.total.nC}
); } /* ── rezultatul unei completari ARHIVATE (read-only, fara reia) ── */ function ChvArhiva({ ch, store, setNav, arhiva }) { const st = chvStarea(store, ch.slug); const intrari = st.istoric.filter((i) => i.finalizat); const intrare = intrari[arhiva]; if (!intrare) { return (
Completarea căutată nu există în istoric
); } const g = window.chvScoring.scorGlobal(ch, intrare.raspunsuri); return (
); } /* ── view-ul principal + navigarea in history ── */ function ChvView({ store, set }) { const [nav, setNavRaw] = React.useState(() => chvNavDinHash() || { slug: null, ecran: null, arhiva: null }); const setNav = (n) => { setNavRaw(n); try { const hash = "#chestionare" + (n.slug ? "/" + n.slug + "/" + n.ecran + (n.ecran === "istoric" && n.arhiva != null ? "/" + (n.arhiva + 1) : "") : ""); history.pushState({ view: "chestionare", chvNav: n }, "", hash); } catch (e) { /* file:// restrictiv - navigarea ramane in state local */ } }; React.useEffect(() => { const onPop = (e) => { if (e.state && e.state.chvNav) setNavRaw(e.state.chvNav); else if (e.state && e.state.view === "chestionare") setNavRaw({ slug: null, ecran: null, arhiva: null }); }; window.addEventListener("popstate", onPop); return () => window.removeEventListener("popstate", onPop); }, []); const ch = nav.slug ? chvDeSlug(nav.slug) : null; let continut; if (ch && nav.ecran === "completare") continut = ; else if (ch && nav.ecran === "istoric") continut = ; else if (ch && nav.ecran === "rezultat") continut = ; else continut = ; return (
{ch ? (
{nav.ecran === "istoric" && }
) : null} {continut}
); } window.ChvView = ChvView;