PageSourceSearch

https://www.climpact.it/assets/AddSuiteMemberDialog-BH4IHkxW.js

js climpact.it collected 2026-10-08 10:49:43 UTC 27,096 bytes, 1 lines download raw bytes

1import{r,b as oa,j as e}from"./vendor-react-B4BIr4_A.js";import{h as ca,e as qe,B as Ie,D as ma,C as da,d as ua,f as pa}from"./vendor-firebase-AOn3Fvmd.js";import{d as Xe,b as Oe}from"./firebase-config-Dn2Tu_JL.js";import{findUserByEmail as ha,defaultRoleFor as xe,addOrGrantSuiteMember as ga,revokePortalAccess as fa,PORTAL_ROLES as va,PORTAL_ROLE_LABEL as he}from"./portalSuiteMembership-CrlyxTYK.js";import{a4 as ge,ax as Ve,ay as xa,h as De}from"./app-BCfwVS8x.js";import{a as se}from"./emailBlocks-CtZk6XmE.js";import{R as ya}from"./RichTextField.events-BmW-0SyC.js";import{E as ja}from"./EmailDraftsControl-xcNg90OQ.js";import{u as ba}from"./portalLang-BNZe-O9I.js";import{P as Ue}from"./publicUrls-C1QEMgMu.js";import{B as Na}from"./panels-CW4Xe3h_.js";import{b as $e,a as fe,c as Ke,d as Be,e as ka,f as Sa}from"./BrandedOnboardingEmailComposer-C1HNZiXb.js";import{bb as ve,X as Je,L as ne,z as Ca,C as te,T as Fe,o as wa,p as Pa,a as Ea,bi as za,w as ye,D as Aa}from"./icone-sito-BiOTxGdK.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./crashBlackBox-NHteRanH.js";import"./evento-comune-FmQYl2SX.js";/* empty css               *//* empty css                              *//* empty css                        *//* empty css                      *//* empty css               *//* empty css                    *//* empty css                      *//* empty css                      *//* empty css                      */import"./emailTemplate-CZj6Czj1.js";import"./fondoRiferimento-ChLBv03J.js";import"./heroMarchi-Chvv_Egr.js";import"./emailFactCards-PLh9byk8.js";import"./strikethrough-DesaQItu.js";import"./underline-5P3CtgNZ.js";import"./link-DWIAGou6.js";import"./braces-DPpX96P0.js";import"./align-left-49Qnp4Ve.js";import"./code-xml-Bm6iu7kD.js";import"./EmailBlocksEditor-CtSRfLgY.js";import"./emailAssets-BGWzPiSa.js";import"./eventsStore-DaNHU_lI.js";import"./programmaPdf-IwHG3E72.js";import"./square-stack-CQXPO76z.js";import"./Skeleton-D4wgIOh6.js";import"./loghiReali-lfCC5BbQ.js";import"./grip-vertical-Dk1mfmEs.js";import"./code-Bc4K_GQf.js";import"./type-BVBHOo1v.js";async function Ge({to:n,subject:l,html:c,portalKey:d}){var w,s;const u=(c||"").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim();await ua(qe(Xe,"mail"),{to:[n],message:{subject:l,html:c,text:u},_meta:{from_uid:((w=Oe.currentUser)==null?void 0:w.uid)||null,from_email:((s=Oe.currentUser)==null?void 0:s.email)||null,portal:d||"suite",kind:"suite-onboarding",created_at:pa()}})}function He({grants:n,mode:l,recipientName:c,recipientEmail:d,resetLink:u,sender:w,customIntroHtml:s,customSubject:f,crpPanelLabel:k,headerGradient:T=null,pillStyle:_=void 0,tempPassword:P=null}){if((n||[]).length===1){const v=n[0],N={name:c,email:d,access:{[v.portalKey]:v.role},portals:v.portalKey==="crp"&&v.extra&&v.extra.panel?{crp:{role:v.role,panel:v.extra.panel}}:void 0},E=ka({primaryPortalKey:v.portalKey,member:N,tempPassword:P,resetLink:u||null,mode:l==="incremental"?"updated-access":"first-invite",crpPanelLabel:k,headerGradient:T,pillStyle:_}),W=f&&f.trim()?f.trim():$e({primaryPortalKey:v.portalKey,mode:l==="incremental"?"updated-access":"first-invite"});return{html:E,subject:W}}const o=Sa({recipientName:c,recipientEmail:d,grants:n,mode:l,resetLink:u,tempPassword:P,sender:w,customIntroHtml:s,crpPanelLabel:k,headerGradient:T,pillStyle:_}),S=f&&f.trim()?f.trim():fe({grants:n,mode:l});return{html:o,subject:S}}const Ra=350,La="var(--space-tint, #14a392)";function Ta(n){const l=new Map,c=n&&n.portals||{};for(const d of Object.keys(c)){const u=c[d];u&&u.role&&l.set(d,u.role)}return l}const _a=new Set(["management_team","drp"]);function zs({open:n,onClose:l,me:c,currentPortalKey:d,sendMail:u}){var Re,Le,Te,_e;const{t:w}=ba(),s=_a.has(d)?w:(a,t)=>t,[f,k]=r.useState(""),[T,_]=r.useState(""),[P,y]=r.useState(!1),[o,S]=r.useState(null),[v,N]=r.useState(null),[E,W]=r.useState({});r.useEffect(()=>{if(!n)return;const a=ca(qe(Xe,"crp_panels"),t=>{const i={};t.docs.forEach(b=>{i[b.id]=b.data()||{}}),W(i)},()=>{});return()=>{try{a()}catch{}}},[n]);const O=r.useMemo(()=>Na.map(a=>{const t=E[a.id];return t?{...a,label:t.label||a.label,description:t.description||a.description}:a}),[E]),[z,K]=r.useState(()=>We(d)),[p,J]=r.useState(()=>new Set),[M,je]=r.useState(!0),[be,Ne]=r.useState(!1),[R,ke]=r.useState(""),[h,Se]=r.useState(""),[Q,q]=r.useState("add"),[Y,Qe]=r.useState(null),[Z,Ye]=r.useState("solid"),[j,le]=r.useState(!1),[re,X]=r.useState(null),[oe,ee]=r.useState(!1);r.useEffect(()=>{n&&(k(""),_(""),S(null),N(null),y(!1),K(We(d)),J(new Set),je(!0),Ne(!1),ke(""),Se(""),q("add"),le(!1),X(null),ee(!1))},[n,d]);const[ce,V]=r.useState(!1),Ce=r.useRef(!1),we=r.useRef(!1),me=r.useRef(null),$=r.useCallback(()=>
1{if(!Pe.current){if(Ce.current){V(!0);return}l&&l()}},[l]),Pe=r.useRef(!1);Pe.current=j,r.useEffect(()=>{if(!n)return;const a=t=>{if(t.key==="Escape"){t.preventDefault(),$();return}(t.metaKey||t.ctrlKey)&&(t.key==="s"||t.key==="S")&&(t.preventDefault(),we.current&&me.current&&me.current())};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[n,$]),r.useEffect(()=>{if(!ce)return;const a=setTimeout(()=>V(!1),7e3);return()=>clearTimeout(a)},[ce]),r.useEffect(()=>{n&&V(!1)},[n]),r.useEffect(()=>{if(!n)return;const a=String(f||"").trim();if(!a||!a.includes("@")){S(null),N(null),y(!1);return}y(!0);const t=setTimeout(async()=>{try{const i=await ha(a);S(i||null),N(null),i&&_(b=>b&&b.trim()?b:i.data.name||[i.data.first_name,i.data.last_name].filter(Boolean).join(" ")||"")}catch(i){N((i==null?void 0:i.message)||String(i)),S(null)}finally{y(!1)}},Ra);return()=>clearTimeout(t)},[f,n]);const B=r.useMemo(()=>o?Ta(o.data):new Map,[o]),m=r.useMemo(()=>{const a=[];for(const t of Object.keys(z)){const i=z[t];if(!i.selected||B.has(t))continue;const b={portalKey:t,role:i.role||xe(t)};t==="crp"&&i.panel&&i.panel.trim()&&(b.extra={panel:i.panel.trim()}),a.push(b)}return a},[z,B]),g=r.useMemo(()=>o?[...p].map(a=>({portalKey:a})):[],[p,o]),F=o&&o.data&&(o.data.name||[o.data.first_name,o.data.last_name].filter(Boolean).join(" "))||T,L=o?"incremental":"cumulative",Ze=r.useMemo(()=>{if(R&&R.trim())return R.trim();if(m.length===1){const a=m[0].portalKey;return $e({primaryPortalKey:a,mode:L==="incremental"?"updated-access":"first-invite"})}return fe({grants:m,mode:L})},[R,m,L]);function Ee(a){if(!Array.isArray(a)||a.length===0)return null;const t=a.find(x=>x.portalKey==="crp"&&x.extra&&x.extra.panel);if(!t)return null;const i=t.extra.panel,b=(O||[]).find(x=>x.id===i);return b?b.label:i}const ea=r.useMemo(()=>{if(m.length===0)return`<div style="font-family:system-ui,sans-serif;padding:24px;color:#86868b;font-size:13px;line-height:1.6">Seleziona almeno un portale per vedere l'anteprima della mail.</div>`;try{const{html:a}=He({grants:m,mode:L,recipientName:F||"Nuovo membro",recipientEmail:f||"[email protected]",resetLink:o?null:`${Ue}/_preview_reset_link_`,tempPassword:o?null:"••••••••••••••",crpPanelLabel:Ee(m),headerGradient:Y,pillStyle:Z,sender:{name:c&&(c.name||c.displayName)||"Giuseppe Naglieri",email:c&&c.email||""},customIntroHtml:h&&h.trim()?/<[a-z][\s\S]*>/i.test(h)?se(h):"<p>"+ie(h.trim())+"</p>":"",customSubject:R});return a}catch{return'<div style="font-family:system-ui,sans-serif;padding:24px;color:#dc2626;font-size:13px;line-height:1.6">Errore di preview — controlla i campi sopra.</div>'}},[m,L,F,f,o,h,R,c,Y,Z]),aa=r.useMemo(()=>{if(g.length===0)return'<div style="font-family:system-ui,sans-serif;padding:24px;color:#86868b;font-size:13px;line-height:1.6">Nessun portale da revocare.</div>';try{return Ke({recipientName:F||"Membro",recipientEmail:f||"[email protected]",revokedPortals:g,customIntroHtml:h&&h.trim()?/<[a-z][\s\S]*>/i.test(h)?se(h):"<p>"+ie(h.trim())+"</p>":""})}catch{return'<div style="font-family:system-ui,sans-serif;padding:24px;color:#dc2626;font-size:13px;line-height:1.6">Errore di preview — controlla i campi sopra.</div>'}},[g,F,f,h]),sa=r.useMemo(()=>g.length===0?"":Be({revokedPortals:g}),[g]);r.useEffect(()=>{m.length===0&&g.length>0?q("revoke"):g.length===0&&m.length>0&&q("add")},[m.length,g.length]),r.useMemo(()=>{const a=(F||"collega").trim().split(/\s+/)[0],t=m.length;if(t===0)return"Nessun nuovo portale selezionato — l'email non verrà inviata.";if(L==="incremental"){if(t===1){const i=ge(m[0].portalKey);return"Caro/a "+a+", ti è stato aggiunto accesso al portale "+i.fullName+"."}return"Caro/a "+a+", ti è stato aggiunto accesso a "+t+" nuovi portali del progetto CLIMPACT."}if(t===1){const i=ge(m[0].portalKey);return m[0].portalKey==="sab"?"Caro/a "+a+", è un piacere darti il benvenuto nel "+i.fullName+". La mail conterrà l'invito formale e l'accesso al portale.":m[0].portalKey==="crp"?"Caro/a "+a+", benvenuto/a nel "+i.fullName+". La mail conterrà l'invito al panel e l'accesso al portale.":"Caro/a "+a+", ti diamo il benvenuto nel "+i.fullName+". La mail conterrà le credenziali e il link per impostare la password."}return"Caro/a "+a+", ti diamo il benvenuto nella Climpact Platform. Hai ricevuto accesso ai portali selezionati del progetto CLIMPACT."},[F,m,L]);const G=T.trim(),C=f.trim(),ta=o?m.length>0||g.length>0:m.length>0,de=!j&&G.length>0&&C.length>0&&/@/.test(C)&&ta,ia=r.useMemo(()=>{const a=new Set(d?[d]:[]),t=Object.keys(z).filter(i=>z[i].selected);return t.length!==a.size?!0:t.some(i=>!a.has(i))},[z,d]),ze=!oe&&!j&&(C.length>0||G.length>0||ia||p.size>0||R.trim().length>0||h.trim().length>0);async function Ae(){var a,t,i,b;if(X(null),!!de){le(!0);try{const x=m.length>
10?await ga({name:G,email:C,grants:m}):{uid:o.uid,isExistingUser:!0,resolvedName:((a=o.data)==null?void 0:a.name)||[(t=o.data)==null?void 0:t.first_name,(i=o.data)==null?void 0:i.last_name].filter(Boolean).join(" ")||G,addedGrants:[]};let pe={uid:x.uid,removedPortalKeys:[]};o&&p.size>0&&(pe=await fa({uid:x.uid,portalKeys:[...p]}));let Me=null;if(!x.isExistingUser&&M)try{const U=Ie().find(I=>I.name==="[DEFAULT]")||Ie()[0],H=ma(U,"europe-west1"),A=await da(H,"generateBrandedResetLink")({email:C,continueUrl:`${Ue}/`});Me=((b=A==null?void 0:A.data)==null?void 0:b.link)||null}catch(U){console.warn("[AddSuiteMemberDialog] reset link generation failed",U)}if(M&&(x.addedGrants||[]).length>0){const U=x.resolvedName||G,{html:H,subject:ae}=He({grants:x.addedGrants,mode:x.isExistingUser?"incremental":"cumulative",recipientName:U,recipientEmail:C,resetLink:x.isExistingUser?null:Me,tempPassword:x.generatedPassword||null,crpPanelLabel:Ee(x.addedGrants),headerGradient:Y,pillStyle:Z,sender:{name:c&&(c.name||c.displayName)||"Giuseppe Naglieri",email:c&&c.email||""},customIntroHtml:h&&h.trim()?/<[a-z][\s\S]*>/i.test(h)?se(h):"<p>"+ie(h.trim())+"</p>":"",customSubject:R});try{await Ge({to:C,subject:ae,html:H,portalKey:d})}catch(A){X("Membro aggiunto, ma l'invio email è fallito: "+((A==null?void 0:A.message)||String(A))),ee(!0);return}}if(M&&(pe.removedPortalKeys||[]).length>0){const U=x.resolvedName||G,H=pe.removedPortalKeys.map(I=>({portalKey:I})),ae=Ke({recipientName:U,recipientEmail:C,revokedPortals:H,customIntroHtml:h&&h.trim()?/<[a-z][\s\S]*>/i.test(h)?se(h):"<p>"+ie(h.trim())+"</p>":""}),A=Be({revokedPortals:H});try{await Ge({to:C,subject:A,html:ae,portalKey:d})}catch(I){X("Accessi modificati, ma l'invio della notifica di revoca è fallito: "+((I==null?void 0:I.message)||String(I))),ee(!0);return}}ee(!0),setTimeout(()=>l&&l(),1500)}catch(x){X(Ma(x))}finally{le(!1)}}}if(!n)return null;we.current=de,me.current=Ae,Ce.current=ze;const na=La,ue=!!(o&&B.size>0),la=o&&(((Re=o.data)==null?void 0:Re.name)||[(Le=o.data)==null?void 0:Le.first_name,(Te=o.data)==null?void 0:Te.last_name].filter(Boolean).join(" ")||((_e=o.data)==null?void 0:_e.email)||C),D=re?"error":oe?"done":j?"busy":ze?"dirty":"idle",ra={error:s("Non salvato","Not saved"),done:s("Salvato","Saved"),busy:s("Salvataggio in corso","Saving"),dirty:s("Modifiche non salvate","Unsaved changes"),idle:s("Nessuna modifica","No changes")};return oa.createPortal(e.jsx("div",{className:"asm-scrim",onMouseDown:$,role:"presentation",children:e.jsxs("div",{className:"asm-win is-light-surface",role:"dialog","aria-modal":"true","aria-label":ue?s("Modifica accessi","Edit access"):s("Aggiungi membro","Add member"),onMouseDown:a=>a.stopPropagation(),style:{"--asm-tint":na},children:[e.jsxs("header",{className:"asm-titlebar",children:[e.jsx("span",{className:"asm-head-glyph",children:e.jsx(ve,{size:18})}),e.jsxs("div",{className:"asm-head-text",children:[e.jsx("h2",{className:"asm-head-title",children:ue?s("Modifica accessi — ","Edit access — ")+la:s("Aggiungi una persona alla Climpact Platform","Add someone to the Climpact Platform")}),e.jsx("p",{className:"asm-head-sub",children:ue?s("Spunta per aggiungere un portale, togli la spunta per revocarlo. La mail parte solo per cio’ che cambia.","Tick to grant a portal, untick to revoke it. The email only covers what changes."):s("Indirizzo, nome, i portali a cui dare accesso. La mail di benvenuto si vede qui accanto prima di partire.","Address, name, the portals to grant. The welcome email is shown alongside before it goes out.")})]}),e.jsx("button",{type:"button",className:"asm-iconpill",onClick:$,disabled:j,"aria-label":s("Chiudi","Close"),children:e.jsx(Je,{size:17})})]}),e.jsxs("div",{className:"asm-body",children:[e.jsxs("div",{className:"asm-col asm-col-who",children:[e.jsxs("section",{className:"asm-card",children:[e.jsxs("div",{className:"asm-card-head",children:[e.jsx("span",{className:"asm-card-step",children:"1"}),e.jsx("h3",{className:"asm-card-title",children:s("Chi","Who")}),P&&e.jsxs("span",{className:"asm-card-note",children:[e.jsx(ne,{size:11,className:"asm-spin",style:{verticalAlign:"-1px",marginRight:4}}),s("verifico","checking")]})]}),e.jsxs("div",{className:"asm-grid2",children:[e.jsxs("label",{className:"asm-field",children:[e.jsx("span",{className:"asm-label",children:s("Email","Email")}),e.jsxs("span",{className:"asm-input-wrap",children:[e.jsx(Ca,{size:14}),e.jsx("input",{type:"email",autoFocus:!0,className:"asm-input",value:f,onChange:a=>k(a.target.value),placeholder:"[email protected]",disabled:j,autoComplete:"off",spellCheck:!1})]})]}),e.jsxs("label",{className:"asm-field",children:[e.jsx("span",{className:"asm-label",children:s("Nome completo","Full name")}
1),e.jsx("input",{type:"text",className:"asm-input",value:T,onChange:a=>_(a.target.value),placeholder:s("es. Maria Rossi","e.g. Maria Rossi"),disabled:j,autoComplete:"off"})]})]}),e.jsxs("div",{style:{marginTop:11,display:"flex",flexDirection:"column",gap:6,alignItems:"flex-start"},children:[e.jsx(Ia,{busy:P,existing:o,havePortals:B,email:C,t:s}),o&&e.jsx("span",{className:"asm-hint",children:s("Nome precompilato dall’account esistente: cambialo solo se e’ sbagliato.","Name pre-filled from the existing account: change it only if it is wrong.")}),v&&e.jsxs("span",{className:"asm-hint",style:{color:"#b91c1c"},children:[s("Errore durante la verifica: ","Lookup failed: "),v]})]})]}),e.jsxs("section",{className:"asm-card",children:[e.jsxs("div",{className:"asm-card-head",children:[e.jsx("span",{className:"asm-card-step",children:"2"}),e.jsx("h3",{className:"asm-card-title",children:s("Dove entra","Where they get in")}),e.jsxs("span",{className:"asm-card-note",children:[m.length>0&&m.length+s(" da aggiungere"," to grant"),m.length>0&&g.length>0&&" · ",g.length>0&&g.length+s(" da revocare"," to revoke"),m.length===0&&g.length===0&&s("nessun portale scelto","no portal picked")]})]}),e.jsx("div",{className:"asm-portals",children:Ve.map(a=>e.jsx(Oa,{portal:a,state:z[a.key],alreadyGranted:B.has(a.key),alreadyRole:B.get(a.key)||null,isExistingUser:!!o,willBeRevoked:p.has(a.key),disabled:j,crpPanels:a.key==="crp"?O:null,t:s,onToggle:()=>K(t=>({...t,[a.key]:{...t[a.key],selected:!t[a.key].selected}})),onRevokeToggle:()=>J(t=>{const i=new Set(t);return i.has(a.key)?i.delete(a.key):i.add(a.key),i}),onRoleChange:t=>K(i=>({...i,[a.key]:{...i[a.key],role:t}})),onPanelChange:t=>K(i=>({...i,[a.key]:{...i[a.key],panel:t}}))},a.key))})]})]}),e.jsxs("div",{className:"asm-col asm-col-mail",children:[e.jsxs("section",{className:"asm-card",children:[e.jsxs("div",{className:"asm-card-head",children:[e.jsx("span",{className:"asm-card-step",children:"3"}),e.jsx("h3",{className:"asm-card-title",children:s("Cosa riceve","What they get")})]}),e.jsxs("label",{className:"asm-switch",children:[e.jsx("input",{type:"checkbox",checked:M,onChange:a=>je(a.target.checked),disabled:j}),e.jsx("span",{className:"asm-switch-track"}),e.jsxs("span",{children:[s("Manda la mail di benvenuto","Send the welcome email"),e.jsxs("span",{style:{fontWeight:400,color:"var(--text-tertiary)",marginLeft:6,fontSize:12},children:["(",L==="incremental"?s("incrementale","incremental"):s("cumulativa","cumulative"),")"]})]})]}),!M&&e.jsxs("div",{className:"asm-alert asm-alert-warn",style:{marginTop:11},children:[e.jsx(te,{size:14}),e.jsx("span",{children:s("Nessuna mail partira’. La persona avra’ l’accesso ma non sapra’ di averlo, e per un account nuovo non ricevera’ il collegamento per impostare la password.","No email will go out. They will have the access without knowing it, and on a brand-new account they will not get the link to set their password.")})]}),M&&e.jsxs(e.Fragment,{children:[m.length>0&&g.length>0&&e.jsxs("div",{className:"asm-tabs",style:{marginTop:12},children:[e.jsxs("button",{type:"button",className:"asm-tab"+(Q==="add"?" is-on":""),onClick:()=>q("add"),disabled:j,children:[e.jsx(ve,{size:11})," ",s("Aggiunte","Grants")," (",m.length,")"]}),e.jsxs("button",{type:"button",className:"asm-tab is-danger"+(Q==="revoke"?" is-on":""),onClick:()=>q("revoke"),disabled:j,children:[e.jsx(Fe,{size:11})," ",s("Revoche","Revokes")," (",g.length,")"]})]}),e.jsxs("div",{style:{marginTop:12,display:"flex",flexDirection:"column",gap:6},children:[e.jsx("span",{className:"asm-label",children:s("Oggetto","Subject")}),e.jsx("div",{className:"asm-subject",children:Q==="revoke"&&g.length>0?sa:Ze})]}),e.jsxs("div",{style:{marginTop:12,display:"flex",flexDirection:"column",gap:6},children:[e.jsx("span",{className:"asm-label",children:s("Anteprima","Preview")}),e.jsx("iframe",{className:"asm-frame",title:s("Anteprima della mail","Email preview"),srcDoc:Q==="revoke"&&g.length>0?aa:ea,sandbox:""})]}),e.jsx("div",{style:{marginTop:12},children:e.jsxs("button",{type:"button",className:"asm-pill asm-pill-sm",onClick:()=>Ne(a=>!a),disabled:j,children:[be?e.jsx(wa,{size:12}):e.jsx(Pa,{size:12}),s("Scrivi tu oggetto e apertura","Write your own subject and opening")]})}),be&&e.jsxs("div",{style:{marginTop:11,display:"flex",flexDirection:"column",gap:10},children:[e.jsxs("label",{className:"asm-field",children:[e.jsx("span",{className:"asm-label",children:s("Oggetto su misura","Custom subject")}),e.jsx("input",{type:"text",className:"asm-input",value:R,onChange:a=>ke(a.target.value),placeholder:fe({grants:m,mode:L}),disabled:j})]}),e.jsxs("div",{className:"asm-field",children:[e.jsx("span",{className:"asm-label",children:s("Paragrafo di apertura","Opening paragraph")}),e.jsx(ya,{className:"rtf-evt",value:h,onChange:Se,minHeight:88,placeholder:s("Va subito sotto il saluto, prima dell’elenco dei portali.","Goe
1s right under the greeting, before the list of portals."),ariaLabel:s("Paragrafo di apertura","Opening paragraph")})]}),e.jsx(ja,{value:Y,onChange:Qe,fallbackTint:(xa(d)||{}).tint||"#0e7068",label:s("Fondo di questa mail","Background for this email"),hint:s("vale solo per questo invito","applies to this invitation only")}),e.jsxs("div",{className:"asm-field",children:[e.jsx("span",{className:"asm-label",children:s("Pastiglia del portale","Portal pill")}),e.jsx("div",{style:{display:"flex",gap:14,alignItems:"center",flexWrap:"wrap"},children:[{key:"solid",label:s("Piena","Solid")},{key:"glass",label:s("Traslucida","Translucent")}].map(a=>e.jsxs("label",{style:{display:"inline-flex",gap:6,alignItems:"center"},children:[e.jsx("input",{type:"radio",name:"asm-pill-style",checked:Z===a.key,onChange:()=>Ye(a.key),disabled:j}),e.jsx("span",{children:a.label})]},a.key))})]})]})]})]}),re&&e.jsxs("div",{className:"asm-alert asm-alert-error",children:[e.jsx(te,{size:15}),e.jsx("span",{children:re})]})]})]}),e.jsx("footer",{className:"asm-foot",children:ce?e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"asm-status is-dirty",children:[e.jsx(te,{size:14}),s("Ci sono modifiche non salvate. Chiudo lo stesso?","There are unsaved changes. Close anyway?")]}),e.jsxs("div",{className:"asm-foot-actions",children:[e.jsx("button",{type:"button",className:"asm-pill",onClick:()=>V(!1),children:s("Torna indietro","Keep editing")}),e.jsxs("button",{type:"button",className:"asm-pill asm-pill-danger",onClick:()=>{V(!1),l&&l()},children:[e.jsx(Fe,{size:13})," ",s("Chiudi e scarta","Close and discard")]})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"asm-status is-"+D,children:[D==="busy"&&e.jsx(ne,{size:14,className:"asm-spin"}),D==="done"&&e.jsx(Ea,{size:14}),D==="error"&&e.jsx(za,{size:14}),D==="dirty"&&e.jsx(te,{size:14}),D==="idle"&&e.jsx(ye,{size:14}),oe?o&&g.length>0&&m.length===0?s("Accessi aggiornati","Access updated"):o&&g.length>0?s("Accessi aggiornati (aggiunti e revocati)","Access updated (granted and revoked)"):s("Membro aggiunto","Member added"):ra[D]]}),e.jsxs("div",{className:"asm-foot-actions",children:[e.jsx("span",{className:"asm-kbd",title:s("Salva con la tastiera","Save from the keyboard"),children:"⌘S"}),e.jsx("button",{type:"button",className:"asm-pill",onClick:$,disabled:j,children:s("Annulla","Cancel")}),e.jsxs("button",{type:"button",className:"asm-pill asm-pill-primary",onClick:Ae,disabled:!de,children:[j?e.jsx(ne,{size:13,className:"asm-spin"}):e.jsx(Aa,{size:13}),j?o&&g.length>0&&m.length===0?s("Aggiorno...","Updating..."):s("Creo...","Creating..."):o&&g.length>0?M?s("Aggiorna e avvisa","Update and notify"):s("Aggiorna accessi","Update access"):M?s("Crea e invia invito","Create and send invite"):s("Crea membro","Create member")]})]})]})})]})}),document.body)}function We(n){const l={};for(const c of Ve)l[c.key]={selected:c.key===n,role:xe(c.key),panel:""};return l}function Ma(n){const l=(n==null?void 0:n.code)||"",c=(n==null?void 0:n.message)||String(n||"");return l==="auth/email-already-in-use"?"L'email esiste già in Firebase Auth ma non corrisponde a un membro nella Suite. Contatta l'amministratore.":l.includes("weak-password")?"La password generata non è abbastanza robusta — riprova.":l.includes("invalid-email")?"Email non valida.":l.includes("permission-denied")?c||"Permessi mancanti per questa operazione.":c||"Errore sconosciuto."}function ie(n){return String(n||"").replace(/[&<>"']/g,l=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[l])}function Ia({busy:n,existing:l,havePortals:c,email:d,t:u}){if(!d||!d.includes("@"))return null;if(n)return e.jsxs("span",{className:"asm-verdict asm-verdict-neutral",children:[e.jsx(ne,{size:12,className:"asm-spin"}),e.jsx("span",{children:u("Verifico l’indirizzo","Checking the address")})]});if(!l)return e.jsxs("span",{className:"asm-verdict asm-verdict-neutral",children:[e.jsx(ve,{size:12}),e.jsxs("span",{children:[e.jsx("strong",{children:u("Persona nuova","New person")}),u(" — creo l’account e mando il collegamento per la password."," — I will create the account and send the password link.")]})]});const w=l.data.name||[l.data.first_name,l.data.last_name].filter(
1Boolean).join(" ")||l.data.email||d,s=c.size;return e.jsxs("span",{className:"asm-verdict asm-verdict-known",children:[e.jsx(ye,{size:12}),e.jsxs("span",{children:[e.jsx("strong",{children:u("Gia’ sulla piattaforma:","Already on the platform:")})," ",w,s>0?" — "+s+(s===1?u(" portale attivo"," active portal"):u(" portali attivi"," active portals")):u(" — nessun portale attivo"," — no active portal")]}),s>0&&e.jsx("span",{className:"asm-verdict-portals",children:[...c.keys()].map(f=>{let k;try{k=ge(f)}catch{return null}return e.jsx("span",{className:"asm-verdict-portal",style:{"--p":k.tint},children:k.label},f)})})]})}function Oa({portal:n,state:l,alreadyGranted:c,alreadyRole:d,disabled:u,isExistingUser:w,willBeRevoked:s,onToggle:f,onRoleChange:k,onPanelChange:T,onRevokeToggle:_,crpPanels:P,t:y}){const o=n.icon,S=n.tint,v=w&&c,N=v?!s:!!(l&&l.selected),E=va[n.key]||[],W=n.key==="crp",O=v&&s,z=()=>{u||(v?_():f())},K="asm-portal"+(O?" is-off-existing":N?" is-on":"");return e.jsxs("div",{className:K,style:{"--p":S},children:[e.jsxs("div",{className:"asm-portal-row",role:"checkbox","aria-checked":N,"aria-disabled":u||void 0,tabIndex:u?-1:0,onClick:z,onKeyDown:p=>{(p.key===" "||p.key==="Enter")&&(p.preventDefault(),z())},style:{cursor:u?"default":"pointer"},children:[e.jsxs("span",{className:"asm-portal-mark",children:[N&&e.jsx(ye,{size:13,strokeWidth:3}),O&&e.jsx(Je,{size:13,strokeWidth:3})]}),e.jsx("span",{className:"asm-portal-glyph",children:o?e.jsx(o,{size:15}):null}),e.jsxs("span",{style:{minWidth:0,flex:1},children:[e.jsx("span",{className:"asm-portal-name",children:n.fullName}),O&&e.jsx("span",{className:"asm-portal-state is-danger",children:y("Sara’ rimosso","Will be removed")}),v&&!O&&e.jsxs("span",{className:"asm-portal-state",children:[y("Ha gia’ accesso","Already has access")," · ",he[d]||d]})]})]}),N&&!v&&E.length>1&&e.jsx("div",{className:"asm-portal-extra",children:e.jsx(De,{tone:"inherit",tint:"var(--p, var(--asm-tint))",size:"sm",value:l&&l.role||xe(n.key),onChange:p=>k(p),disabled:u,ariaLabel:y("Ruolo su ","Role on ")+n.fullName,options:E.map(p=>({value:p,label:he[p]||p}))})}),N&&!v&&E.length===1&&e.jsx("div",{className:"asm-portal-extra",children:e.jsx("span",{className:"asm-hint",children:n.key==="drp"?e.jsxs(e.Fragment,{children:[y("Ruolo: ","Role: "),e.jsx("strong",{style:{color:S},children:y("membro del team DRP","DRP team member")}),y(" — accesso completo al portale. La super-admin dell’intera piattaforma e’ un altro flag, riservato al PI."," — full access to the portal. Platform-wide super-admin is a separate flag, reserved to the PI.")]}):n.key==="management_pi"?e.jsxs(e.Fragment,{children:[y("Ruolo: ","Role: "),e.jsx("strong",{style:{color:S},children:"Principal Investigator"}),y(" — budget, rendicontazione FIS, scenari. Normalmente solo il PI."," — budget, FIS reporting, scenarios. Normally the PI only.")]}):e.jsxs(e.Fragment,{children:[y("Ruolo: ","Role: "),e.jsx("strong",{style:{color:S},children:he[E[0]]||E[0]})]})})}),W&&N&&!v&&Array.isArray(P)&&P.length>0&&e.jsxs("div",{className:"asm-portal-extra",children:[e.jsx("span",{className:"asm-label",children:y("Panel CRP","CRP panel")}),e.jsx(De,{tone:"inherit",tint:"var(--p, var(--asm-tint))",size:"sm",value:l&&l.panel||"",onChange:p=>T(p),disabled:u,ariaLabel:y("Panel CRP","CRP panel"),options:[{value:"",label:y("— Scegli un panel —","— Pick a panel —")},...P.map(p=>({value:p.id,label:p.label}))]}),l&&l.panel&&(()=>{const p=P.find(J=>J.id===l.panel);return p?e.jsx("span",{className:"asm-hint",children:p.description}):null})()]})]})}export{zs as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.