/* ── Codul Valorilor Personale - sectiune noua, aparte de credinte/anamneza ── Zoomul Petre 24.07 14:00: 7 categorii de valori; participantul alege 3-4 per categorie; toate valorile alese, amestecate, dau CODUL VALORIC PERSONAL ("doar ce am selectat eu"). Datele: valori_data.js (window.PRP_VALORI), generat de valori/parse_valori.py din matricea + modelul + dictionarul lui Petre. Tehnicile/terapiile NU intra (decizia lui). Navigare: #valori/ · #valori// · #valori/cod (acelasi model history/deep-link ca anamneza). */ const IcValori = (p) => ( ); window.IcValori = IcValori; const VAL_DATE = () => window.PRP_VALORI || { categorii: [], concepte: [] }; /* store.valori = { sel: [id...], plan: { [id]: {campuri} }, codMod: "lista"|"matrice" } codMod = matricea CODULUI meu (planul personal) - SINGURA matrice din secțiunea Valori (decizia Marian 25.07). Fallback aici, nu migrare in app.jsx: store-urile vechi cad pe "lista". */ function valStarea(store) { const v = store.valori || {}; return { sel: v.sel || [], plan: v.plan || {}, adaugat: v.adaugat || {}, codMod: v.codMod === "matrice" ? "matrice" : "lista" }; } /* Scrie un camp din planul unei valori SI retine ziua in care a fost completat prima data. Rutinele si angajamentele devin itemi urmariti (window.valItemiPlan), iar fara o data a asumarii: conformarea pe 7 zile ii judeca si pe zilele in care nu existau, iar in Planul strategic o valoare asumata si nebifata nu devine niciodata rosie (audit 25.07). Cheia e "|", aceeasi forma stabila ca a itemilor din store.log. */ function valScrieCamp(set, id, camp, text) { set((s) => { const st = valStarea(s); const cheie = id + "|" + camp; const adaugat = { ...st.adaugat }; const aveaText = String((st.plan[id] || {})[camp] || "").trim() !== ""; const areText = String(text || "").trim() !== ""; if (areText && !aveaText && !adaugat[cheie]) { const d = new Date(); adaugat[cheie] = window.PRP_UTIL ? window.PRP_UTIL.fmtISO(d) : `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`; } return { ...s, valori: { ...s.valori, sel: st.sel, adaugat, plan: { ...st.plan, [id]: { ...(st.plan[id] || {}), [camp]: text } } } }; }); } function valToateValorile() { const rez = []; VAL_DATE().categorii.forEach((c) => c.valori.forEach((v) => rez.push({ ...v, cat: c.slug, catNume: c.nume }))); return rez; } function valDupaId(id) { return valToateValorile().find((v) => v.id === id) || null; } /* campurile planului de implementare per valoare aleasa - limbajul lui Petre (PSA Cod Valori: Rutinele/Obiceiurile/Pasiunile cu subtitlurile lui; zoomul: rutine, obiceiuri, pasiuni, traditii personale, gestionarea tentatiilor; studiul de caz: recompense) */ const VAL_PLAN_CAMPURI = [ ["angajament", "Angajamentul meu personal", "Comanda personală: ce îmi asum ferm pentru această valoare"], ["rutinaZ", "Rutine zilnice", "Creează structura de implementare - pasul de fiecare zi"], ["rutinaS", "Rutine săptămânale", "Verificarea și consolidarea săptămânală"], ["rutinaL", "Rutine lunare", "Autoevaluarea profundă, o dată pe lună"], ["obiceiuri", "Obiceiurile mele", "Creează automatismele necesare în fixare"], ["pasiuni", "Pasiunile mele", "Fixează valorile prin activarea plăcerii"], ["traditii", "Tradițiile mele personale", "Tradiții proprii în activarea valorilor"], ["tentatii", "Gestionarea tentațiilor", "Mecanismele mele când apare tentația de a mă abate"], ["recompense", "Recompensele mele", "Cu ce mă răsplătesc când respect angajamentul"], ]; function valoriExport(store) { const { sel, plan } = valStarea(store); return { valori: { selectie: sel.map((id) => { const v = valDupaId(id); return v ? { id, nume: v.nume, categorie: v.catNume, definitie: v.definitie } : { id }; }), planImplementare: Object.fromEntries( sel.filter((id) => plan[id] && Object.values(plan[id]).some((x) => String(x || "").trim())) .map((id) => [id, plan[id]])), }, }; } window.valoriExport = valoriExport; /* ── navigare ── nav.nivel = "categorii" | "valori" (drill-down, cerinta Marian 24.07: click pe o categorie INLOCUIESTE bara orizontala cu valorile categoriei; "← Categoriile" revine). Nivelul nu intra in hash - la deep-link se deduce: fisa deschisa -> "valori", altfel "categorii". */ function valNavDinHash() { const m = (location.hash || "").match(/^#valori\/([a-z-]+)(?:\/([a-z0-9-]+))?$/); if (!m) return null; if (m[1] === "cod") return { cat: "cod", fisa: null, nivel: "categorii" }; if (!VAL_DATE().categorii.some((c) => c.slug === m[1])) return null; const fisa = m[2] && valDupaId(m[2]) ? m[2] : null; return { cat: m[1], fisa, nivel: fisa ? "valori" : "categorii" }; } /* bara orizontala pe doua niveluri (aceleasi clase .cred-tabs/.cred-tab ca restul aplicatiei): nivelul "categorii" = categoriile + Codul meu; nivelul "valori" = valorile categoriei active (★ pe cele alese in cod) + intoarcerea la categorii */ function ValTabs({ nav, setNav, store }) { const { sel } = valStarea(store); const cats = VAL_DATE().categorii; if (nav.nivel === "valori" && nav.cat !== "cod") { const c = cats.find((x) => x.slug === nav.cat); if (c) return (
{c.valori.map((v) => ( ))}
); } return (
{cats.map((c) => { const scurt = c.nume.replace(/^Valorile\s+/, ""); const nAles = c.valori.filter((v) => sel.includes(v.id)).length; return ( ); })}
); } /* butonul de selectie a unei valori in cod */ function ValAlege({ v, store, set, mare }) { const { sel } = valStarea(store); const aleasa = sel.includes(v.id); const toggle = (e) => { e.stopPropagation(); set((s) => { const st = valStarea(s); const selNou = aleasa ? st.sel.filter((x) => x !== v.id) : [...st.sel, v.id]; return { ...s, valori: { ...s.valori, sel: selNou, plan: st.plan } }; }); }; return ( ); } /* ── ecranul unei categorii: intro + contor + valorile ── */ function ValCategorie({ cat, store, set, setNav }) { const c = VAL_DATE().categorii.find((x) => x.slug === cat); if (!c) return null; const { sel } = valStarea(store); const nAles = c.valori.filter((v) => sel.includes(v.id)).length; return (

{c.nume}

Parcurge valorile de mai jos și alege-le pe cele care te definesc cu adevărat - recomandat 3-4 valori din această categorie. Toate valorile alese, din toate categoriile, formează împreună Codul Valorilor Personale.

Alese: {nAles} {nAles > 4 ? peste recomandarea de 3-4 : din 3-4 recomandate}
{c.valori.map((v) => { const aleasa = sel.includes(v.id); return (
setNav({ cat, fisa: v.id, nivel: "valori" })} onKeyDown={(e) => { if (e.key === "Enter") setNav({ cat, fisa: v.id, nivel: "valori" }); }}>

{v.nume}

{v.definitie}

{!v.completa && Fișă în completare la Dr. Petre}
); })}
); } /* o sectiune-lista din fisa */ function ValSect({ titlu, itemi, intro, mantre }) { if ((!itemi || !itemi.length) && !intro) return null; return (

{titlu}

{intro ?

{intro}

: null} {mantre ? (itemi || []).map((m, i) =>
{m}
) :
    {(itemi || []).map((x, i) =>
  • {x}
  • )}
}
); } function ValDaNu({ titlu, da, nu, etDa, etNu }) { if ((!da || !da.length) && (!nu || !nu.length)) return null; return (

{titlu}

{etDa}

    {(da || []).map((x, i) =>
  • {x}
  • )}

{etNu}

    {(nu || []).map((x, i) =>
  • {x}
  • )}
); } /* ── fisa completa a unei valori (sectiunile in ordinea dictata de Petre in zoom) ── */ function ValFisa({ id, store, set, setNav }) { const v = valDupaId(id); if (!v) return null; const f = v.fisa || {}; const a = v.aprofundare || {}; return (
{/* fara definitie aici (Marian 24.07 dupa zoom 5): notiunea traieste DOAR pe prima pagina, pe cardurile categoriei; fisa incepe direct cu lista lui Petre */}
{v.catNume}

{v.nume}

{!v.completa &&

Fișa de instrument a acestei valori este în completare la Dr. Petre - mai jos este conținutul aprofundat deja disponibil.

}
{/* Sectiunile fisei, in ordinea coloanelor din Matricea de Activare: trasaturile, comportamentele, pozitive/negative, reperele DA/NU (din Modelul complet), actiunile, mantrele, instrumentele de control, concluzia. SCOASE din afisare (datele rămân in valori_data.js): **modul de impactare** si **tehnicile/terapiile** - Marian 25.07, dupa ce fusesera aduse in aceeasi sesiune pe „totul din acest excel trebuie sa ajunga in platforma". Nici definitia nu e aici: notiunea traieste DOAR pe cardurile primei pagini. Rămân afara si campurile din Modelul complet care nu-s in acest Excel: scopul, avantajele, beneficiile, exemplele, parghiile. */} {v.trasaturiDetalii && v.trasaturiDetalii.length ? (

Trăsăturile de caracter ale valorii

{v.trasaturiDetalii.map((t, i) => (
{t.nume}
{t.definitie ?

{t.definitie}

: null} {(t.forme || []).map((fo, j) => (

{fo.nume}{fo.descriere ? " - " + fo.descriere : ""}

))}
))}
) : } {f.concluzie ? (

Concluzia

{f.concluzie}

) : null}
); } /* ── Codul meu valoric: valorile alese + planul de implementare personal ── */ function ValPlanCamp({ id, camp, eticheta, hint, store, set }) { const { plan } = valStarea(store); const val = (plan[id] && plan[id][camp]) || ""; const onChange = (e) => valScrieCamp(set, id, camp, e.target.value); return (
{hint}