Files
SGF/resources/js/WorkspaceHome.jsx
T

28 lines
3.4 KiB
React

import React from 'react';
export default function WorkspaceHome({context,can,groups,navigate}) {
const unit=context.unit?.id??null;
const available=groups.flatMap(g=>g.items);
const links=(rules)=>rules.filter(([,permission,scope])=>can(permission,scope)).map(([id,,,label])=>({id,label:label??available.find(i=>i.id===id)?.label})).filter(i=>available.some(a=>a.id===i.id));
const prepare=links([
['workshop_billing','workshop_billing.prepare',unit],
['clients','clients.create',null],['services','services.create',null],['service_drafts','service_drafts.create',unit],['billing_drafts','billing_drafts.create',unit],
['documents','issuer_documents.edit',null],['documents','client_documents.edit',null],['documents','draft_documents.edit',unit],
['catalogue_accounting','catalogue_accounting.propose',null],['service_fiscal','service_fiscal.propose',null],
['workshop','workshop.open',unit],['direct_costs','direct_costs.prepare',unit],['industrial_costs','industrial_costs.prepare',unit],['industrial_budgets','industrial_budgets.prepare',unit],
]);
const validate=links([
['workshop_billing','workshop_billing.review',unit],
['catalogue_accounting','catalogue_accounting.approve',null],['service_fiscal','service_fiscal.approve',null],['service_invoices','invoice_series.approve',null],
['service_receivables','service_receivables.confirm',unit],['service_receivables','service_receivables.correction_approve',unit],['workshop','workshop.verify',unit],['direct_costs','direct_costs.validate',unit],['industrial_costs','industrial_costs.validate',unit],['industrial_budgets','industrial_budgets.validate',unit],
]);
function actions(items){return <div className="home-shortcuts">{[...new Map(items.map(i=>[i.id,i])).values()].map(i=><button key={i.id} onClick={()=>navigate(i.id)}>{i.label}<span aria-hidden="true"> →</span></button>)}</div>;}
return <><div className="page-title"><p className="eyebrow">O SEU ESPAÇO DE TRABALHO</p><h1>Início</h1><p className="muted">Escolha o percurso no contexto seleccionado. Cada acção mantém a sua autorização própria.</p></div>
{!context.unit&&<p className="alert home-notice" role="status">Seleccione uma unidade para consultar os percursos de trabalho dessa unidade.</p>}
<div className="home-work-grid">{prepare.length>0&&<section className="panel"><h2>A preparar e acompanhar</h2><p>Abra o percurso para preparar propostas e acompanhar o estado das versões.</p>{actions(prepare)}</section>}{validate.length>0&&<section className="panel"><h2>A validar</h2><p>Consulte as versões no respectivo percurso antes de tomar uma decisão. Não é permitida a auto-validação.</p>{actions(validate)}</section>}</div>
<section className="panel"><h2>Consultas e atalhos permitidos</h2>{actions(available.filter(i=>!['home','company','units','access'].includes(i.id)))}</section>
<p className="help">Esta página não agrega nem conta tarefas pendentes. Abra cada percurso para consultar os estados actuais.</p>
<section className="panel home-context"><h2>Contexto actual</h2><dl><div><dt>Empresa</dt><dd>{context.company.name}</dd></div><div><dt>Unidade</dt><dd>{context.unit?.name??'Sem unidade seleccionada'}</dd></div></dl><div className="actions"><button onClick={()=>navigate('company')}>Consultar empresa</button><button onClick={()=>navigate('units')}>Ver unidades autorizadas</button></div></section>
</>;
}