feat: agenda polish, SLA sync, filters

This commit is contained in:
Esdras Renan 2025-11-08 02:34:43 -03:00
parent 7fb6c65d9a
commit 6ab8a6ce89
40 changed files with 2771 additions and 154 deletions

View file

@ -1,8 +1,49 @@
import { TicketsPageClient } from "./tickets-page-client"
import { requireAuthenticatedSession } from "@/lib/auth-server"
import type { TicketFiltersState } from "@/lib/ticket-filters"
import type { TicketStatus } from "@/lib/schemas/ticket"
export default async function TicketsPage() {
type TicketsPageProps = {
searchParams?: Record<string, string | string[] | undefined>
}
export default async function TicketsPage({ searchParams }: TicketsPageProps) {
await requireAuthenticatedSession()
return <TicketsPageClient />
const initialFilters = deriveInitialFilters(searchParams ?? {})
return <TicketsPageClient initialFilters={initialFilters} />
}
function getParamValue(value: string | string[] | undefined): string | undefined {
if (Array.isArray(value)) {
return value[0]
}
return value
}
function deriveInitialFilters(params: Record<string, string | string[] | undefined>): Partial<TicketFiltersState> {
const initial: Partial<TicketFiltersState> = {}
const view = getParamValue(params.view)
if (view === "completed" || view === "active") {
initial.view = view
}
const status = getParamValue(params.status)
if (status && ["PENDING", "AWAITING_ATTENDANCE", "PAUSED", "RESOLVED"].includes(status)) {
initial.status = status as TicketStatus
}
const priority = getParamValue(params.priority)
if (priority) initial.priority = priority
const queue = getParamValue(params.queue)
if (queue) initial.queue = queue
const channel = getParamValue(params.channel)
if (channel) initial.channel = channel
const company = getParamValue(params.company)
if (company) initial.company = company
const assigneeId = getParamValue(params.assignee)
if (assigneeId) initial.assigneeId = assigneeId
const focus = getParamValue(params.focus)
if (focus === "visits") {
initial.focusVisits = true
}
return initial
}

View file

@ -4,6 +4,7 @@ import dynamic from "next/dynamic"
import { AppShell } from "@/components/app-shell"
import { SiteHeader } from "@/components/site-header"
import type { TicketFiltersState } from "@/components/tickets/tickets-filters"
const TicketQueueSummaryCards = dynamic(
() =>
@ -29,7 +30,11 @@ const NewTicketDialog = dynamic(
{ ssr: false }
)
export function TicketsPageClient() {
type TicketsPageClientProps = {
initialFilters?: Partial<TicketFiltersState>
}
export function TicketsPageClient({ initialFilters }: TicketsPageClientProps = {}) {
return (
<AppShell
header={
@ -44,7 +49,7 @@ export function TicketsPageClient() {
<div className="px-4 lg:px-6">
<TicketQueueSummaryCards />
</div>
<TicketsView />
<TicketsView initialFilters={initialFilters} />
</div>
</AppShell>
)