ui: alternar botao encerrar/reabrir no header do ticket
This commit is contained in:
parent
aadf156ba5
commit
6560e7047c
1 changed files with 25 additions and 13 deletions
|
|
@ -19,7 +19,7 @@ import { DeleteTicketDialog } from "@/components/tickets/delete-ticket-dialog"
|
||||||
import { StatusSelect } from "@/components/tickets/status-select"
|
import { StatusSelect } from "@/components/tickets/status-select"
|
||||||
import { CloseTicketDialog, type AdjustWorkSummaryResult } from "@/components/tickets/close-ticket-dialog"
|
import { CloseTicketDialog, type AdjustWorkSummaryResult } from "@/components/tickets/close-ticket-dialog"
|
||||||
import { TicketCustomFieldsSection } from "@/components/tickets/ticket-custom-fields"
|
import { TicketCustomFieldsSection } from "@/components/tickets/ticket-custom-fields"
|
||||||
import { CheckCircle2 } from "lucide-react"
|
import { CheckCircle2, RotateCcw } from "lucide-react"
|
||||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
|
|
@ -147,7 +147,8 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
||||||
: null
|
: null
|
||||||
const viewerId = convexUserId ?? null
|
const viewerId = convexUserId ?? null
|
||||||
const viewerRole = (role ?? "").toLowerCase()
|
const viewerRole = (role ?? "").toLowerCase()
|
||||||
const viewerEmail = (session?.user?.email ?? machineContext?.assignedUserEmail ?? "").trim().toLowerCase()
|
const viewerEmailRaw = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
|
||||||
|
const viewerEmail = (viewerEmailRaw ?? "").trim().toLowerCase()
|
||||||
const [status, setStatus] = useState<TicketStatus>(ticket.status)
|
const [status, setStatus] = useState<TicketStatus>(ticket.status)
|
||||||
const rawReopenDeadline = ticket.reopenDeadline ?? null
|
const rawReopenDeadline = ticket.reopenDeadline ?? null
|
||||||
const fallbackClosedMs = ticket.closedAt?.getTime() ?? ticket.resolvedAt?.getTime() ?? null
|
const fallbackClosedMs = ticket.closedAt?.getTime() ?? ticket.resolvedAt?.getTime() ?? null
|
||||||
|
|
@ -174,19 +175,18 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}, [inferredDeadline, rawReopenDeadline])
|
}, [inferredDeadline, rawReopenDeadline])
|
||||||
const viewerEmail = session?.user?.email ?? machineContext?.assignedUserEmail ?? null
|
|
||||||
const viewerAvatar = session?.user?.avatarUrl ?? null
|
const viewerAvatar = session?.user?.avatarUrl ?? null
|
||||||
const viewerAgentMeta = useMemo(
|
const viewerAgentMeta = useMemo(
|
||||||
() => {
|
() => {
|
||||||
if (!convexUserId) return null
|
if (!convexUserId) return null
|
||||||
return {
|
return {
|
||||||
id: String(convexUserId),
|
id: String(convexUserId),
|
||||||
name: agentName ?? viewerEmail ?? null,
|
name: agentName ?? viewerEmailRaw ?? null,
|
||||||
email: viewerEmail,
|
email: viewerEmailRaw,
|
||||||
avatarUrl: viewerAvatar,
|
avatarUrl: viewerAvatar,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[convexUserId, agentName, viewerEmail, viewerAvatar]
|
[convexUserId, agentName, viewerEmailRaw, viewerAvatar]
|
||||||
)
|
)
|
||||||
useDefaultQueues(ticket.tenantId)
|
useDefaultQueues(ticket.tenantId)
|
||||||
const changeAssignee = useMutation(api.tickets.changeAssignee)
|
const changeAssignee = useMutation(api.tickets.changeAssignee)
|
||||||
|
|
@ -1097,13 +1097,25 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
|
||||||
return (
|
return (
|
||||||
<div id="ticket-summary-header" className={cardClass}>
|
<div id="ticket-summary-header" className={cardClass}>
|
||||||
<div className="absolute right-6 top-6 flex items-center gap-3">
|
<div className="absolute right-6 top-6 flex items-center gap-3">
|
||||||
<Button
|
{status !== "RESOLVED" ? (
|
||||||
type="button"
|
<Button
|
||||||
className="inline-flex items-center gap-2 rounded-lg border border-sidebar-border bg-sidebar-accent px-3 py-1.5 text-sm font-semibold text-sidebar-accent-foreground transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-sidebar-ring hover:bg-sidebar-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--sidebar-ring)]/30 active:translate-y-0 active:border-sidebar-ring"
|
type="button"
|
||||||
onClick={() => setCloseOpen(true)}
|
className="inline-flex items-center gap-2 rounded-lg border border-sidebar-border bg-sidebar-accent px-3 py-1.5 text-sm font-semibold text-sidebar-accent-foreground transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-sidebar-ring hover:bg-sidebar-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--sidebar-ring)]/30 active:translate-y-0 active:border-sidebar-ring"
|
||||||
>
|
onClick={() => setCloseOpen(true)}
|
||||||
<CheckCircle2 className="size-4" /> Encerrar
|
>
|
||||||
</Button>
|
<CheckCircle2 className="size-4" /> Encerrar
|
||||||
|
</Button>
|
||||||
|
) : canReopenTicket ? (
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
className="inline-flex items-center gap-2 rounded-lg border border-sidebar-border bg-white px-3 py-1.5 text-sm font-semibold text-neutral-800 transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-sidebar-ring hover:bg-slate-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--sidebar-ring)]/30 active:translate-y-0 active:border-sidebar-ring"
|
||||||
|
onClick={handleReopenTicket}
|
||||||
|
disabled={isReopening}
|
||||||
|
>
|
||||||
|
{isReopening ? <Spinner className="size-4 text-neutral-600" /> : <RotateCcw className="size-4" />}
|
||||||
|
Reabrir
|
||||||
|
</Button>
|
||||||
|
) : null}
|
||||||
{workSummary ? (
|
{workSummary ? (
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue