feat: Fase 1 MVP — Cadastro, QR Code, Ocorrências e Dashboard#4
Conversation
- Cadastro de locais e materiais com formulários completos - Geração automática de QR Code único ao salvar material (biblioteca qrcode) - Página pública /qr/:codigo com todos os dados do material (leve, mobile-first) - Formulário de ocorrência em campo (Não Conformidade / Aviso / Melhoria) - Dashboard operacional com indicadores e lista de ocorrências recentes - Gestão de ocorrências com filtros por tipo/status e atualização de tratativa - Autenticação via login protegendo rotas administrativas - Layout admin com sidebar de navegação - Stores reativos com persistência em localStorage - Seed de dados iniciais (2 locais, 2 materiais, 2 QR Codes, usuário admin) - Typecheck, lint e build limpos https://claude.ai/code/session_01Lqxw22g3Qc7SPJhy5YfVYP
…n test
Home.test.tsx: componentes com <A> precisam de contexto Router; envolve
render() com <Router><Route path="/*" component={Home} /></Router>.
Admin.test.tsx: admin.tsx virou redirect, o teste estava testando componente
que não existe mais; migrado para AdminDashboard com asserções adequadas ao
novo painel (heading "Dashboard", labels de indicadores).
https://claude.ai/code/session_01Lqxw22g3Qc7SPJhy5YfVYP
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a314932962
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| import { seedIfNeeded } from './lib/seed'; | ||
|
|
||
| render(() => <App />, document.getElementById("app")!); | ||
| seedIfNeeded(); |
There was a problem hiding this comment.
Seed data before initializing reactive stores
Calling seedIfNeeded() here runs after App has already been imported, and that import eagerly loads route/store modules that initialize signals from localStorage at module scope. On a first run with empty storage, the seed is written only after those signals are created, so dashboards/tables start empty until a full page reload or an explicit refresh function runs.
Useful? React with 👍 / 👎.
| } | ||
|
|
||
| export function getQRByCodigo(codigo: string): QRCodeItem | undefined { | ||
| return qrcodes().find((qr) => qr.codigo_qr === codigo); |
There was a problem hiding this comment.
Exclude inactive QR codes from public lookup
This lookup ignores status_qr, but /qr/:codigo depends on it to show material data and submit new occurrences. That means a QR marked as inativo in admin can still be accessed publicly and continue generating occurrences, which makes the inactivation action ineffective for field operations.
Useful? React with 👍 / 👎.
P1 — seed antes das stores: seedIfNeeded() agora é side-effect em seed.ts e o import em main.tsx é o primeiro estático, garantindo que o localStorage esteja populado antes de qualquer store inicializar seus signals. P2 — QR inativo inacessível publicamente: getQRByCodigo filtra por status_qr === 'ativo', impedindo que códigos inativados continuem gerando ocorrências via página de campo. https://claude.ai/code/session_01Lqxw22g3Qc7SPJhy5YfVYP
$(cat <<'EOF'
Resumo
Implementação completa da Fase 1 — MVP do SRCM conforme roadmap documentado em
docs/roadmap.md.O que foi implementado
Fundação
src/lib/types.ts) — todas as entidades: Material, Local, QRCode, Ocorrencia, Usuario, HistoricoOcorrenciasrc/lib/storage.ts) — CRUD genérico sobre localStoragesrc/lib/qr.ts) — usa bibliotecaqrcodepara gerar data URLsrc/lib/seed.ts) — 2 locais, 2 materiais, 2 QR Codes e usuário admin na primeira cargaStores reativos (SolidJS signals + localStorage)
auth.store.ts— login/logout com persistência de sessãomateriais.store.ts— CRUD de materiaislocais.store.ts— CRUD de locaisqrcodes.store.ts— criação automática e inativação de QR Codesocorrencias.store.ts— registro, atualização de status e histórico de tratativasRotas públicas
/— Landing page com cards de funcionalidades/login— Autenticação com e-mail e senha/qr/:codigo— Página de campo leve: exibe todos os dados do material (identificação, fabricação, pintura, responsáveis) + formulário de ocorrência com 3 categorias (Não Conformidade / Aviso / Melhoria)Área administrativa (protegida por auth)
/admin/dashboard— Indicadores (materiais, QRs ativos, ocorrências por status) + tabela de ocorrências recentes/admin/materiais— Listagem + formulário completo de cadastro (gera QR automaticamente)/admin/locais— Listagem + formulário de cadastro/admin/qrcodes— Listagem com imagem do QR renderizada, link para página de campo, inativação/admin/ocorrencias— Listagem com filtros por tipo/status + painel de tratativa com histórico/admin/usuarios— Listagem de usuários do sistemaLayout e componentes
AdminLayout— sidebar de navegação com link ativo, info do usuário logado, botão de logoutBadge— componentes de badge para tipo de ocorrência (vermelho/amarelo/verde) e statusCredenciais padrão
admin@srcm.comadmin123Verificações
pnpm run typecheck— sem errospnpm run lint— sem erros ou warningspnpm run build— build de produção OK (103 kB gzip: 35 kB)Próximos passos (Fase 2)
https://claude.ai/code/session_01Lqxw22g3Qc7SPJhy5YfVYP
EOF
)
Generated by Claude Code