feat(rich-text, types): Tiptap editor, SSR-safe, comments + description; stricter typing (no any) across app

- Add Tiptap editor + toolbar and rich content rendering with sanitize-html
- Fix SSR hydration (immediatelyRender: false) and setContent options
- Comments: rich text + visibility selector, typed attachments (Id<_storage>)
- New Ticket: description rich text; attachments typed; queues typed
- Convex: server-side filters using indexes; priority order rename; stronger Doc/Id typing; remove helper with any
- Schemas/Mappers: zod v4 record typing; event payload record typing; customFields typed
- UI: replace any in header/play/list/timeline/fields; improve select typings
- Build passes; only non-blocking lint warnings remain
This commit is contained in:
esdrasrenan 2025-10-04 14:25:10 -03:00
parent 9b0c0bd80a
commit ea60c3b841
26 changed files with 1390 additions and 245 deletions

128
web/build.log Normal file
View file

@ -0,0 +1,128 @@
> web@0.1.0 build C:\Users\monke\OneDrive\Documentos\Projetos\sistema-de-chamados\web
> next build
Ôû▓ Next.js 15.5.3
- Environments: .env.local
Creating an optimized production build ...
Ô£ô Compiled successfully in 3.0s
Linting and checking validity of types ...
./src/app/ConvexClientProvider.tsx
4:21 Warning: 'useMemo' is defined but never used. @typescript-eslint/no-unused-vars
./src/app/tickets/new/page.tsx
16:9 Warning: The 'queues' logical expression could make the dependencies of useMemo Hook (at line 28) change on every render. To fix this, wrap the initialization of 'queues' in its own useMemo() Hook. react-hooks/exhaustive-deps
28:53 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
35:33 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
35:49 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
43:27 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
44:30 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
48:42 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
48:67 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/app/tickets/[id]/page.tsx
27:61 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/new-ticket-dialog.tsx
6:1 Warning: Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free. @typescript-eslint/ban-ts-comment
50:35 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
58:32 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
63:44 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
63:69 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
63:140 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
71:14 Warning: 'err' is defined but never used. @typescript-eslint/no-unused-vars
116:111 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
128:109 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
150:41 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/play-next-ticket-card.tsx
39:34 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
43:169 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
43:240 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
75:37 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
109:103 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
109:141 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/recent-tickets-panel.tsx
4:1 Warning: Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free. @typescript-eslint/ban-ts-comment
9:10 Warning: 'Spinner' is defined but never used. @typescript-eslint/no-unused-vars
27:58 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
30:41 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/ticket-comments.rich.tsx
31:9 Warning: 'generateUploadUrl' is assigned a value but never used. @typescript-eslint/no-unused-vars
52:100 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
61:49 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
61:74 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
64:14 Warning: 'err' is defined but never used. @typescript-eslint/no-unused-vars
113:34 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
151:83 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/ticket-detail-view.tsx
11:10 Warning: 'Separator' is defined but never used. @typescript-eslint/no-unused-vars
20:108 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
21:15 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
23:50 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
57:46 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
60:45 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
61:45 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
63:47 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/ticket-queue-summary.tsx
18:70 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/ticket-summary-header.tsx
50:50 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
59:63 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
59:85 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
59:109 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
61:26 Warning: 'e' is defined but never used. @typescript-eslint/no-unused-vars
98:63 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
98:89 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
98:113 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
107:31 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
121:42 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
125:60 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
125:82 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
125:106 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
134:31 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/ticket-timeline.tsx
12:10 Warning: 'cn' is defined but never used. @typescript-eslint/no-unused-vars
15:10 Warning: 'Separator' is defined but never used. @typescript-eslint/no-unused-vars
72:28 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/tickets/tickets-view.tsx
12:10 Warning: 'Spinner' is defined but never used. @typescript-eslint/no-unused-vars
27:80 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
31:31 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
36:76 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
49:51 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
./src/components/ui/dropzone.tsx
4:1 Warning: Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free. @typescript-eslint/ban-ts-comment
./src/components/ui/field.tsx
11:52 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
28:58 Warning: Unexpected any. Specify a different type. @typescript-eslint/no-explicit-any
info - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/app/api-reference/config/eslint#disabling-rules
Failed to compile.
./src/components/tickets/play-next-ticket-card.tsx:43:9
Type error: Type '{ queue: { id: string; name: string; pending: number; waiting: number; breached: number; }; nextTicket: { id: string; reference: number; tenantId: string; subject: string; status: "RESOLVED" | "CLOSED" | "PENDING" | "ON_HOLD" | "OPEN" | "NEW"; ... 14 more ...; lastTimelineEntry?: string | undefined; } | null; } | { ...' is not assignable to type '{ queue: { id: string; name: string; pending: number; waiting: number; breached: number; }; nextTicket: { id: string; reference: number; tenantId: string; subject: string; status: "RESOLVED" | "CLOSED" | "PENDING" | "ON_HOLD" | "OPEN" | "NEW"; ... 14 more ...; lastTimelineEntry?: string | undefined; } | null; } | null'.
Type '{ queue: { id: string; name: string; pending: number; waiting: number; breached: number; }; nextTicket: { id: any; reference: any; tenantId: any; subject: any; summary: any; status: any; priority: any; channel: any; ... 11 more ...; metrics: null; }; }' is not assignable to type '{ queue: { id: string; name: string; pending: number; waiting: number; breached: number; }; nextTicket: { id: string; reference: number; tenantId: string; subject: string; status: "RESOLVED" | "CLOSED" | "PENDING" | "ON_HOLD" | "OPEN" | "NEW"; ... 14 more ...; lastTimelineEntry?: string | undefined; } | null; }'.
The types of 'nextTicket.lastTimelineEntry' are incompatible between these types.
Type 'null' is not assignable to type 'string | undefined'.
41 | })?.[0]
42 |
> 43 | const cardContext: TicketPlayContext | null = context ?? (nextTicketFromServer ? { queue: { id: "default", name: "Geral", pending: queueSummary.reduce((a: number, b: any) => a + b.pending, 0), waiting: queueSummary.reduce((a: number, b: any) => a + b.waiting, 0), breached: 0 }, nextTicket: nextTicketFromServer } : null)
| ^
44 |
45 | if (!cardContext || !cardContext.nextTicket) {
46 | return (
Next.js build worker exited with code: 1 and signal: null
ÔÇëELIFECYCLEÔÇë Command failed with exit code 1.