/* Views: Feed, Faturamento, Jurídico, Gestão, Config */
const { useState:vS, useMemo:vM } = React;
const canalCor = {Gestão:['#eef0f4','#3a4159'],RH:['#f5edde','#9a743b'],Jurídico:['#e6edf2','#3f6079'],Financeiro:['#e7f0ea','#3f7a57'],Geral:['#f3e6e3','#a8554a']};
const canPublish = (profile)=> profile.id==='ceo'||profile.id==='admin';
/* ============== FEED ============== */
function FeedView({profile,onToast}){
const [posts,setPosts]=vS(MX.feed.map(p=>({...p})));
const [canal,setCanal]=vS('Todos');
const [compose,setCompose]=vS(false);
const canais=['Todos','Gestão','RH','Jurídico','Financeiro'];
const list = canal==='Todos'?posts:posts.filter(p=>p.canal===canal);
const toggle=(id,key)=>setPosts(posts.map(p=>{
if(p.id!==id) return p;
const np={...p};
if(key==='reagiu'){ np.reagiu=!p.reagiu; np.likes=p.likes+(p.reagiu?-1:1); }
if(key==='imp'){ np.imp=!p.imp; np.importante=p.importante+(p.imp?-1:1); }
return np;
}));
return (
{canais.map(c=>(
))}
{canPublish(profile) && (
{profile.ini}
setCompose(true)}>Compartilhar um comunicado com a equipe…
)}
{list.map(p=>{
const [bg,fg]=canalCor[p.canal]||canalCor.Geral;
return (
{p.ini}
{p.autor}
{p.tempo} · {p.audiencia}
{p.pinned &&
Fixado}
{p.canal}
{p.titulo}
{p.corpo}
{p.img &&
imagem · resultados-1o-semestre.jpg
}
{p.anexo && (
{p.anexo}
)}
{p.lido} leram
);
})}
{/* right rail */}
Engajamento
{[['Comunicados ativos','12'],['Taxa de leitura','87%'],['Não lidos por você','3']].map((x,i)=>(
{x[0]}{x[1]}
))}
Canais
{Object.entries(canalCor).filter(([k])=>k!=='Geral').map(([k,[bg,fg]])=>(
{k}
{Math.floor(Math.random()*6)+2} posts
))}
Publicações segmentadas
Cada colaborador vê apenas o que é direcionado ao seu perfil e unidade. A leitura é registrada automaticamente.
{compose &&
setCompose(false)} onPublish={(np)=>{
setPosts([{...np,id:'new'+Date.now()},...posts]); setCompose(false); onToast('Publicação criada e enviada à audiência selecionada.');
}}/>}
);
}
function Composer({profile,onClose,onPublish}){
const [titulo,setTitulo]=vS('');
const [corpo,setCorpo]=vS('');
const [canal,setCanal]=vS('Gestão');
const [aud,setAud]=vS('todos');
const [unitsSel,setUnitsSel]=vS([]);
const [agendar,setAgendar]=vS(false);
const audMap={todos:'Todos os colaboradores',unidades:'Unidades selecionadas',perfis:'Perfis específicos',individual:'Usuários selecionados'};
const audDesc = aud==='unidades' && unitsSel.length? unitsSel.map(u=>MX.unitById(u).nome).join(', ') : audMap[aud];
return (
>}>
{['Gestão','RH','Jurídico','Financeiro','Geral'].map(c=>(
))}
{Object.entries(audMap).map(([k,v])=>(
))}
{aud==='unidades' && (
{MX.units.map(u=>{
const on=unitsSel.includes(u.id);
return ;
})}
)}
Agendar publicação
Definir data e hora de envio
setAgendar(a=>!a)}>
{agendar && }
);
}
/* ============== FATURAMENTO INDIVIDUAL ============== */
function FaturamentoView({profile,onToast}){
const pid = profile.pessoaId || (profile.id==='gestor'?5:1);
const me = MX.personById(pid);
const [period,setPeriod]=vS('mes');
const pf = period==='mes'?1:period==='tri'?2.96:7.0;
const fat = Math.round(me.fatMes*pf), meta=Math.round(me.meta*pf);
const serie = MX.meses.map((m,i)=> Math.round(me.fatMes*(0.82+0.05*i+ (i%2?-0.03:0.03))));
const tipos=[
{label:'Contencioso',value:Math.round(fat*0.52),color:'#b68b4c'},
{label:'Consultivo',value:Math.round(fat*0.31),color:'#3f6079'},
{label:'Administrativo',value:Math.round(fat*0.17),color:'#3f7a57'},
];
const meusCasos = MX.casos.filter(c=>c.resp===pid);
const f=(n)=>MX.fmtBRL(n,{compact:true});
const pct=Math.round(fat/meta*100);
return (
{me.ini}
{me.nome}
{me.cargo} · {MX.unitById(me.unit).nome}
{[['mes','Mês'],['tri','Trimestre'],['ano','Ano']].map(([k,l])=>)}
Evolução do meu faturamento
Honorários atribuídos · últimos 8 meses
me.meta),color:'#3a4159',dashed:true}]} labels={MX.meses} height={240} fmt={(v)=>MX.fmtBRL(v,{compact:true}).replace('R$ ','')}/>
Meus casos
{meusCasos.length} casos vinculados a você
| Processo | Cliente | Área | Status | Honorários |
{meusCasos.length?meusCasos.map(c=>(
| {c.id} {c.titulo} |
{c.cliente} |
{MX.areaById(c.area).nome} |
{statusLabel(c.status)} |
{MX.fmtBRL(c.valor)} |
)):| Nenhum caso vinculado neste período. |
}
);
}
function pLabelOf(p){return p==='mes'?'mês':p==='tri'?'trim.':'ano';}
function statusLabel(s){return {andamento:'Em andamento',encerrado:'Encerrado',suspenso:'Suspenso'}[s];}
/* ============== JURÍDICO ============== */
const jurCatCor={gold:['#f5edde','#9a743b'],info:['#e6edf2','#3f6079'],navy:['#eef0f4','#3a4159'],green:['#e7f0ea','#3f7a57']};
function JuridicoView({onToast}){
const [cat,setCat]=vS('Todas');
const [onlySaved,setOnlySaved]=vS(false);
const [items,setItems]=vS(MX.juridico.map(j=>({...j})));
const cats=['Todas','Legislação','Jurisprudência','Trabalhista','Cível','Criminal','Tributário'];
let list=items;
if(cat!=='Todas') list=list.filter(j=>j.cat===cat);
if(onlySaved) list=list.filter(j=>j.salvo);
const toggleSave=(id)=>setItems(items.map(j=>j.id===id?{...j,salvo:!j.salvo}:j));
return (
{cats.map(c=>)}
{/* destaque */}
{cat==='Todas' && !onlySaved && (()=>{ const j=items[0]; const[bg,fg]=jurCatCor[j.cor]; return (
{j.cat}
{j.urgente && Urgente}
{j.titulo}
{j.resumo}
{j.fonte}
{j.data}{j.leitura} de leitura
imagem · destaque-juridico.jpg
);})()}
{list.slice(cat==='Todas'&&!onlySaved?1:0).map(j=>{
const[bg,fg]=jurCatCor[j.cor];
return (
{j.urgente &&
Urgente}
{j.cat}
{j.titulo}
{j.resumo}
{j.data}{j.leitura}
);
})}
{list.length===0 &&
Nenhuma novidade nesta seleção.
}
);
}
window.FeedView=FeedView; window.FaturamentoView=FaturamentoView; window.JuridicoView=JuridicoView;