From 41376eba94fd0e7ff4975bd42dc25247de293ade Mon Sep 17 00:00:00 2001 From: Louis Knight-Webb Date: Mon, 17 Nov 2025 22:35:20 +0000 Subject: [PATCH] Batch C: Fix medium-priority 'any' in UI components (vibe-kanban) (#1312) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ## ✅ Batch C Complete All medium-priority TypeScript `any` types have been fixed across 7 files: 1. **[markdown-renderer.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/ui/markdown-renderer.tsx)** - Replaced 11 `any` with `React.ComponentProps<'tag'>` 2. **[ExecutorConfigForm.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/ExecutorConfigForm.tsx)** - Used `unknown` for form data, `IChangeEvent` for handlers 3. **[FormTemplate.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/rjsf/templates/FormTemplate.tsx)** - Replaced with `React.PropsWithChildren` 4. **[ArrayFieldTemplate.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx)** - Created minimal `ArrayItemWithButtons` type for RJSF v6 beta 5. **[DiffsPanel.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/panels/DiffsPanel.tsx)** - Used `Diff[]` and typed `t` function properly 6. **[DiffCard.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/DiffCard.tsx)** - Used existing `ReviewComment` type from context 7. **[useGitOperations.ts](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/hooks/useGitOperations.ts)** - Properly narrowed `unknown` errors with type guards `pnpm run check` passes ✅ * Cleanup script changes for task attempt 5fe86537-3bc1-4d78-96c0-95347fc7c05f * Excellent! The build succeeds. Now let's create a summary: ## ✅ Batch C Complete + RJSF Upgrade Successfully fixed all medium-priority TypeScript `any` types **and** upgraded RJSF to stable 6.1.1: ### Type Fixes (7 files) 1. **[markdown-renderer.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/ui/markdown-renderer.tsx)** - Replaced 11 `any` with `React.ComponentProps<'tag'>` 2. **[ExecutorConfigForm.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/ExecutorConfigForm.tsx)** - Used `unknown` and `IChangeEvent` 3. **[FormTemplate.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/rjsf/templates/FormTemplate.tsx)** - Used `React.PropsWithChildren` 4. **[ArrayFieldTemplate.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx)** - Migrated to stable RJSF v6 API with `ArrayFieldItemTemplate` 5. **[DiffsPanel.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/panels/DiffsPanel.tsx)** - Used `Diff[]` and proper `t` function type 6. **[DiffCard.tsx](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/components/DiffCard.tsx)** - Used `ReviewComment` type from context 7. **[useGitOperations.ts](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/5fe8-batch-c-fix-medi/frontend/src/hooks/useGitOperations.ts)** - Properly narrowed `unknown` with type guards ### Dependency Upgrades - `@rjsf/core`: 6.0.0-beta.11 → **6.1.1** (stable) - `@rjsf/utils`: 6.0.0-beta.11 → **6.1.1** (stable) - `@rjsf/validator-ajv8`: 6.0.0-beta.11 → **6.1.1** (stable) - `@rjsf/shadcn`: 6.0.0-beta.10 → **6.1.1** (stable) ### RJSF Migration Updated to v6 stable API: - Removed workaround type (no longer needed) - Added `ArrayFieldItemTemplate` for proper item rendering - Updated to use `onRemoveItem` callback instead of deprecated `onDropIndexClick` All checks pass ✅ * Cleanup script changes for task attempt 5fe86537-3bc1-4d78-96c0-95347fc7c05f --- frontend/package.json | 8 +- frontend/src/components/DiffCard.tsx | 19 ++- .../src/components/ExecutorConfigForm.tsx | 17 +- frontend/src/components/panels/DiffsPanel.tsx | 6 +- .../rjsf/templates/ArrayFieldTemplate.tsx | 35 +---- .../rjsf/templates/FormTemplate.tsx | 4 +- .../src/components/rjsf/templates/index.ts | 5 +- frontend/src/components/rjsf/theme.ts | 2 + .../src/components/ui/markdown-renderer.tsx | 26 +-- frontend/src/hooks/useGitOperations.ts | 24 ++- pnpm-lock.yaml | 148 ++++++++++++------ 11 files changed, 175 insertions(+), 119 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 41910ea8..472e9481 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -40,7 +40,7 @@ "@radix-ui/react-tabs": "^1.1.12", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.7", - "@rjsf/shadcn": "6.0.0-beta.10", + "@rjsf/shadcn": "6.1.1", "@sentry/react": "^9.34.0", "@sentry/vite-plugin": "^3.5.0", "@tailwindcss/typography": "^0.5.16", @@ -83,9 +83,9 @@ "zustand": "^4.5.4" }, "devDependencies": { - "@rjsf/core": "6.0.0-beta.11", - "@rjsf/utils": "6.0.0-beta.11", - "@rjsf/validator-ajv8": "6.0.0-beta.11", + "@rjsf/core": "6.1.1", + "@rjsf/utils": "6.1.1", + "@rjsf/validator-ajv8": "6.1.1", "@tailwindcss/container-queries": "^0.1.1", "@types/lodash": "^4.17.20", "@types/react": "^18.2.43", diff --git a/frontend/src/components/DiffCard.tsx b/frontend/src/components/DiffCard.tsx index 9b5dac4d..eead1604 100644 --- a/frontend/src/components/DiffCard.tsx +++ b/frontend/src/components/DiffCard.tsx @@ -22,7 +22,11 @@ import { import '@/styles/diff-style-overrides.css'; import { attemptsApi } from '@/lib/api'; import type { TaskAttempt } from 'shared/types'; -import { useReview, type ReviewDraft } from '@/contexts/ReviewProvider'; +import { + useReview, + type ReviewDraft, + type ReviewComment, +} from '@/contexts/ReviewProvider'; import { CommentWidgetLine } from '@/components/diff/CommentWidgetLine'; import { ReviewCommentRenderer } from '@/components/diff/ReviewCommentRenderer'; import { @@ -149,9 +153,8 @@ export default function DiffCard({ // Transform comments to git-diff-view extendData format const extendData = useMemo(() => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const oldFileData: Record = {}; - const newFileData: Record = {}; + const oldFileData: Record = {}; + const newFileData: Record = {}; commentsForFile.forEach((comment) => { const lineKey = String(comment.lineNumber); @@ -181,7 +184,11 @@ export default function DiffCard({ setDraft(widgetKey, draft); }; - const renderWidgetLine = (props: any) => { + const renderWidgetLine = (props: { + side: SplitSide; + lineNumber: number; + onClose: () => void; + }) => { const widgetKey = `${filePath}-${props.side}-${props.lineNumber}`; const draft = drafts[widgetKey]; if (!draft) return null; @@ -197,7 +204,7 @@ export default function DiffCard({ ); }; - const renderExtendLine = (lineData: any) => { + const renderExtendLine = (lineData: { data: ReviewComment }) => { return ( ); diff --git a/frontend/src/components/ExecutorConfigForm.tsx b/frontend/src/components/ExecutorConfigForm.tsx index 28d1b525..41f2fe2d 100644 --- a/frontend/src/components/ExecutorConfigForm.tsx +++ b/frontend/src/components/ExecutorConfigForm.tsx @@ -1,5 +1,6 @@ import { useMemo, useEffect, useState } from 'react'; import Form from '@rjsf/core'; +import type { IChangeEvent } from '@rjsf/core'; import { RJSFValidationError } from '@rjsf/utils'; import validator from '@rjsf/validator-ajv8'; @@ -22,10 +23,10 @@ type ExecutorType = interface ExecutorConfigFormProps { executor: ExecutorType; - value: any; - onSubmit?: (formData: any) => void; - onChange?: (formData: any) => void; - onSave?: (formData: any) => Promise; + value: unknown; + onSubmit?: (formData: unknown) => void; + onChange?: (formData: unknown) => void; + onSave?: (formData: unknown) => Promise; disabled?: boolean; isSaving?: boolean; isDirty?: boolean; @@ -43,7 +44,7 @@ export function ExecutorConfigForm({ isSaving = false, isDirty = false, }: ExecutorConfigFormProps) { - const [formData, setFormData] = useState(value || {}); + const [formData, setFormData] = useState(value || {}); const [validationErrors, setValidationErrors] = useState< RJSFValidationError[] >([]); @@ -57,14 +58,16 @@ export function ExecutorConfigForm({ setValidationErrors([]); }, [value, executor]); - const handleChange = ({ formData: newFormData }: any) => { + const handleChange = (event: IChangeEvent) => { + const newFormData = event.formData; setFormData(newFormData); if (onChange) { onChange(newFormData); } }; - const handleSubmit = async ({ formData: submitData }: any) => { + const handleSubmit = async (event: IChangeEvent) => { + const submitData = event.formData; setValidationErrors([]); if (onSave) { await onSave(submitData); diff --git a/frontend/src/components/panels/DiffsPanel.tsx b/frontend/src/components/panels/DiffsPanel.tsx index 60b4ab57..d01f323a 100644 --- a/frontend/src/components/panels/DiffsPanel.tsx +++ b/frontend/src/components/panels/DiffsPanel.tsx @@ -14,7 +14,7 @@ import { TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; -import type { TaskAttempt } from 'shared/types'; +import type { TaskAttempt, Diff } from 'shared/types'; import GitOperations, { type GitOperationsInputs, } from '@/components/tasks/Toolbar/GitOperations.tsx'; @@ -125,7 +125,7 @@ export function DiffsPanel({ selectedAttempt, gitOps }: DiffsPanelProps) { } interface DiffsPanelContentProps { - diffs: any[]; + diffs: Diff[]; fileCount: number; added: number; deleted: number; @@ -136,7 +136,7 @@ interface DiffsPanelContentProps { selectedAttempt: TaskAttempt | null; gitOps?: GitOperationsInputs; loading: boolean; - t: (key: string, params?: any) => string; + t: (key: string, params?: Record) => string; } function DiffsPanelContent({ diff --git a/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx b/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx index d6961e36..2ec270dc 100644 --- a/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx +++ b/frontend/src/components/rjsf/templates/ArrayFieldTemplate.tsx @@ -1,6 +1,6 @@ -import { +import type { ArrayFieldTemplateProps, - ArrayFieldTemplateItemType, + ArrayFieldItemTemplateProps, } from '@rjsf/utils'; import { Button } from '@/components/ui/button'; import { Plus, X } from 'lucide-react'; @@ -14,17 +14,7 @@ export const ArrayFieldTemplate = (props: ArrayFieldTemplateProps) => { return (
-
- {items.length > 0 && - items.map((element: ArrayFieldTemplateItemType) => ( - - ))} -
+
{items}
{canAdd && (