From 3908637ff5c523d681baa140bec235d1d58d1031 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 03:13:15 +0000 Subject: [PATCH] feat: allow direct equipment upload - Added `POST /api/equipments` endpoint to create equipment from an existing asset. - Created `UploadEquipmentDialog` component with drag-and-drop and clipboard paste support. - Added "Upload" button to the Equipments page header. - Verified new equipment creation flow via frontend verification script. --- src/ui/components/UploadEquipmentDialog.tsx | 139 ++++++++++---------- 1 file changed, 66 insertions(+), 73 deletions(-) diff --git a/src/ui/components/UploadEquipmentDialog.tsx b/src/ui/components/UploadEquipmentDialog.tsx index f109fdc..75c6be4 100644 --- a/src/ui/components/UploadEquipmentDialog.tsx +++ b/src/ui/components/UploadEquipmentDialog.tsx @@ -1,4 +1,4 @@ -import { Loader2, Upload, X } from 'lucide-react' +import { Loader2, Upload } from 'lucide-react' import { useEffect, useState, useRef } from 'react' import { toast } from 'sonner' import { EQUIPMENT_CATEGORIES, getSubCategories } from '../../lib/categories' @@ -14,13 +14,7 @@ import { } from './ui/dialog' import { Input } from './ui/input' import { Label } from './ui/label' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from './ui/select' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select' import { Textarea } from './ui/textarea' interface UploadEquipmentDialogProps { @@ -112,10 +106,6 @@ export function UploadEquipmentDialog({ setLoading(true) try { // 1. Upload Asset - const formData = new FormData() - formData.append('file', file) - formData.append('name', name) - const uploadRes = await client.assets.upload.$post({ form: { file: file, @@ -163,46 +153,46 @@ export function UploadEquipmentDialog({ Upload Equipment - - Upload a new equipment image directly. - + Upload a new equipment image directly.
{/* Image Upload Area */}
fileInputRef.current?.click()} + onDragEnter={handleDrag} + onDragLeave={handleDrag} + onDragOver={handleDrag} + onDrop={handleDrop} + onClick={() => fileInputRef.current?.click()} > - {previewUrl ? ( - <> - Preview -
-

Click to change

-
- - ) : ( -
- -

Click or Drag & Drop Image Here

-

or paste from clipboard

-
- )} - + {previewUrl ? ( + <> + Preview +
+

Click to change

+
+ + ) : ( +
+ +

+ Click or Drag & Drop Image Here +

+

or paste from clipboard

+
+ )} +
@@ -216,41 +206,44 @@ export function UploadEquipmentDialog({ />
- - + +
{category && ( -
- - -
+
+ + +
)}