diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a808001..1a12f45 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -84,7 +84,8 @@ "Bash(dir \"D:\\Projetos IA\\sistema-de-chamados\\src\\components\\ui\" /b)", "Bash(timeout 120 bun:*)", "Bash(bun run tauri:build:*)", - "Bash(git remote:*)" + "Bash(git remote:*)", + "Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"D:/Projetos IA/sistema-de-chamados/scripts/test-windows-collection.ps1\")" ] } } diff --git a/src/components/admin/devices/device-software-list.tsx b/src/components/admin/devices/device-software-list.tsx index d6b1fef..63eaf15 100644 --- a/src/components/admin/devices/device-software-list.tsx +++ b/src/components/admin/devices/device-software-list.tsx @@ -4,7 +4,7 @@ import { useState } from "react" import { useQuery } from "convex/react" import { formatDistanceToNow } from "date-fns" import { ptBR } from "date-fns/locale" -import { Package, Search, ChevronLeft, ChevronRight } from "lucide-react" +import { Package, Search, ChevronLeft, ChevronRight, Eraser } from "lucide-react" import { api } from "@/convex/_generated/api" import type { Id } from "@/convex/_generated/dataModel" @@ -25,7 +25,10 @@ export function DeviceSoftwareList({ machineId }: DeviceSoftwareListProps) { const viewerId = convexUserId as Id<"users"> | undefined const [search, setSearch] = useState("") - const [cursor, setCursor] = useState(null) + const [cursorHistory, setCursorHistory] = useState<(string | null)[]>([null]) + const [pageIndex, setPageIndex] = useState(0) + + const currentCursor = cursorHistory[pageIndex] ?? null const result = useQuery( api.machineSoftware.listByMachine, @@ -36,7 +39,7 @@ export function DeviceSoftwareList({ machineId }: DeviceSoftwareListProps) { machineId, search: search.trim() || undefined, limit: 30, - cursor: cursor ?? undefined, + cursor: currentCursor ?? undefined, } : "skip" ) @@ -45,17 +48,26 @@ export function DeviceSoftwareList({ machineId }: DeviceSoftwareListProps) { const handleSearch = (value: string) => { setSearch(value) - setCursor(null) + setCursorHistory([null]) + setPageIndex(0) } const handleNextPage = () => { if (result?.nextCursor) { - setCursor(result.nextCursor) + const nextIndex = pageIndex + 1 + setCursorHistory((prev) => { + const updated = [...prev] + updated[nextIndex] = result.nextCursor + return updated + }) + setPageIndex(nextIndex) } } const handlePrevPage = () => { - setCursor(null) + if (pageIndex > 0) { + setPageIndex(pageIndex - 1) + } } if (!viewerId) { @@ -76,14 +88,28 @@ export function DeviceSoftwareList({ machineId }: DeviceSoftwareListProps) { -
- - handleSearch(e.target.value)} - className="pl-9" - /> +
+
+ + handleSearch(e.target.value)} + className="pl-9" + /> +
+ {search && ( + + )}
{result === undefined ? ( @@ -147,7 +173,7 @@ export function DeviceSoftwareList({ machineId }: DeviceSoftwareListProps) { variant="ghost" size="sm" onClick={handlePrevPage} - disabled={!cursor} + disabled={pageIndex === 0} className="h-8 w-8 p-0" > diff --git a/src/components/admin/slas/slas-manager.tsx b/src/components/admin/slas/slas-manager.tsx index 657a1f6..cfb7fe1 100644 --- a/src/components/admin/slas/slas-manager.tsx +++ b/src/components/admin/slas/slas-manager.tsx @@ -138,11 +138,11 @@ export function SlasManager() { const handleSave = async () => { if (!name.trim()) { - toast.error("Informe um nome para a politica") + toast.error("Informe um nome para a política") return } if (!convexUserId) { - toast.error("Sessao nao sincronizada com o Convex") + toast.error("Sessão não sincronizada com o Convex") return } @@ -151,7 +151,7 @@ export function SlasManager() { setSaving(true) const toastId = editingSla ? "sla-edit" : "sla-create" - toast.loading(editingSla ? "Salvando alteracoes..." : "Criando politica...", { id: toastId }) + toast.loading(editingSla ? "Salvando alterações..." : "Criando política...", { id: toastId }) try { if (editingSla) { @@ -164,7 +164,7 @@ export function SlasManager() { timeToFirstResponse, timeToResolution, }) - toast.success("Politica atualizada", { id: toastId }) + toast.success("Política atualizada", { id: toastId }) } else { await createSla({ tenantId, @@ -174,12 +174,12 @@ export function SlasManager() { timeToFirstResponse, timeToResolution, }) - toast.success("Politica criada", { id: toastId }) + toast.success("Política criada", { id: toastId }) } closeDialog() } catch (error) { console.error(error) - toast.error(editingSla ? "Nao foi possivel atualizar a politica" : "Nao foi possivel criar a politica", { id: toastId }) + toast.error(editingSla ? "Não foi possível atualizar a política" : "Não foi possível criar a política", { id: toastId }) } finally { setSaving(false) } @@ -213,7 +213,7 @@ export function SlasManager() { - Politicas globais + Políticas globais Regras que valem para todas as empresas. @@ -245,23 +245,23 @@ export function SlasManager() {
- {/* Politicas globais de SLA */} + {/* Políticas globais de SLA */}
- Politicas globais de SLA + Políticas globais de SLA - Estas regras valem para todas as empresas e categorias. Sao sobrescritas por regras mais especificas + Estas regras valem para todas as empresas e categorias. São sobrescritas por regras mais específicas (por empresa ou por categoria).
@@ -275,9 +275,9 @@ export function SlasManager() { ) : slas.length === 0 ? (
-

Nenhuma politica global cadastrada

+

Nenhuma política global cadastrada

- Crie politicas de SLA para definir metas de resposta e resolucao para os chamados. + Crie políticas de SLA para definir metas de resposta e resolução para os chamados.

) : ( @@ -300,7 +300,7 @@ export function SlasManager() { )}
Resposta: {formatMinutes(policy.timeToFirstResponse)} - Resolucao: {formatMinutes(policy.timeToResolution)} + Resolução: {formatMinutes(policy.timeToResolution)}
@@ -328,30 +328,30 @@ export function SlasManager() { !open && closeDialog()}> - {editingSla ? "Editar politica de SLA" : "Nova politica de SLA"} + {editingSla ? "Editar política de SLA" : "Nova política de SLA"} {editingSla - ? "Altere os dados da politica. Ela continua valendo para todas as empresas e categorias." - : "Crie uma politica global que vale para todas as empresas e categorias. Voce pode criar regras mais especificas depois."} + ? "Altere os dados da política. Ela continua valendo para todas as empresas e categorias." + : "Crie uma política global que vale para todas as empresas e categorias. Você pode criar regras mais específicas depois."}
- + setName(event.target.value)} autoFocus />
- +