feat(email): adiciona templates React Email e melhora UI admin
Some checks failed
Some checks failed
- Cria 10 novos templates React Email (invite, password-reset, new-login, sla-warning, sla-breached, ticket-created, ticket-resolved, ticket-assigned, ticket-status, ticket-comment) - Adiciona envio de email ao criar convite de usuario - Adiciona security_invite em COLLABORATOR_VISIBLE_TYPES - Melhora tabela de equipe com badges de papel e colunas fixas - Atualiza TicketCard com nova interface de props - Remove botao de limpeza de dados antigos do admin 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
8546a1feb1
commit
498b9789b5
17 changed files with 1422 additions and 190 deletions
85
emails/ticket-status-email.tsx
Normal file
85
emails/ticket-status-email.tsx
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
import * as React from "react"
|
||||
import { Button, Heading, Hr, Section, Text } from "@react-email/components"
|
||||
|
||||
import { RavenEmailLayout } from "./_components/layout"
|
||||
import { TicketCard, type TicketCardProps } from "./_components/ticket-card"
|
||||
import { EMAIL_COLORS } from "./_components/tokens"
|
||||
import { formatStatus } from "./_components/utils"
|
||||
|
||||
export type TicketStatusEmailProps = TicketCardProps & {
|
||||
ticketUrl: string
|
||||
previousStatus: string
|
||||
newStatus: string
|
||||
}
|
||||
|
||||
export default function TicketStatusEmail(props: TicketStatusEmailProps) {
|
||||
const { ticketUrl, previousStatus, newStatus, ...ticketProps } = props
|
||||
|
||||
return (
|
||||
<RavenEmailLayout title="Status atualizado" preview={`Chamado #${ticketProps.ticketNumber} mudou de ${formatStatus(previousStatus)} para ${formatStatus(newStatus)}`}>
|
||||
<Section style={{ textAlign: "center", margin: "24px 0" }}>
|
||||
<div
|
||||
style={{
|
||||
display: "inline-block",
|
||||
width: "64px",
|
||||
height: "64px",
|
||||
backgroundColor: "#e0f2fe",
|
||||
borderRadius: "50%",
|
||||
lineHeight: "64px",
|
||||
fontSize: "28px",
|
||||
border: "1px solid #0ea5e9",
|
||||
}}
|
||||
>
|
||||
🔄
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<Heading style={{ margin: "0 0 12px 0", fontSize: "26px", fontWeight: 700, color: EMAIL_COLORS.textPrimary, textAlign: "center" }}>
|
||||
Status atualizado
|
||||
</Heading>
|
||||
|
||||
<Text style={{ margin: "0 0 24px 0", fontSize: "15px", lineHeight: "1.7", color: EMAIL_COLORS.textSecondary, textAlign: "center" }}>
|
||||
O status do seu chamado foi alterado de <strong>{formatStatus(previousStatus)}</strong> para <strong>{formatStatus(newStatus)}</strong>.
|
||||
</Text>
|
||||
|
||||
<TicketCard {...ticketProps} status={newStatus} />
|
||||
|
||||
<Section style={{ textAlign: "center", margin: "32px 0" }}>
|
||||
<Button
|
||||
href={ticketUrl}
|
||||
style={{
|
||||
display: "inline-block",
|
||||
backgroundColor: EMAIL_COLORS.primary,
|
||||
color: EMAIL_COLORS.primaryForeground,
|
||||
textDecoration: "none",
|
||||
borderRadius: "12px",
|
||||
padding: "14px 24px",
|
||||
fontWeight: 800,
|
||||
fontSize: "14px",
|
||||
border: `1px solid ${EMAIL_COLORS.primaryDark}`,
|
||||
}}
|
||||
>
|
||||
Ver chamado
|
||||
</Button>
|
||||
</Section>
|
||||
|
||||
<Hr style={{ borderColor: EMAIL_COLORS.border, margin: "24px 0" }} />
|
||||
|
||||
<Text style={{ margin: 0, fontSize: "12px", color: EMAIL_COLORS.textMuted, textAlign: "center" }}>
|
||||
Voce recebera atualizacoes por e-mail quando houver novidades.
|
||||
</Text>
|
||||
</RavenEmailLayout>
|
||||
)
|
||||
}
|
||||
|
||||
TicketStatusEmail.PreviewProps = {
|
||||
ticketNumber: "41025",
|
||||
ticketTitle: "Computador nao liga apos atualizacao",
|
||||
status: "AWAITING_ATTENDANCE",
|
||||
priority: "HIGH",
|
||||
category: "Hardware",
|
||||
subcategory: "Desktop",
|
||||
ticketUrl: "https://raven.rever.com.br/tickets/abc123",
|
||||
previousStatus: "PENDING",
|
||||
newStatus: "AWAITING_ATTENDANCE",
|
||||
} satisfies TicketStatusEmailProps
|
||||
Loading…
Add table
Add a link
Reference in a new issue