From 911b041136614c636b8add3b26eff4dcada4f6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Mon, 27 Apr 2026 18:13:06 +0200 Subject: [PATCH] Replace native selects with custom dropdown for mobile usability Native add(e.target.value)} - > - - {available.map((b) => ( - - ))} - + ({ value: String(b.ID), label: `${b.Kuerzel} — ${b.Name}` }))} + onChange={add} + /> )} ); diff --git a/components/CustomSelect.tsx b/components/CustomSelect.tsx new file mode 100644 index 0000000..d581a66 --- /dev/null +++ b/components/CustomSelect.tsx @@ -0,0 +1,69 @@ +'use client'; + +import { useEffect, useRef, useState } from 'react'; + +export interface SelectOption { + value: string; + label: string; + disabled?: boolean; +} + +interface Props { + options: SelectOption[]; + placeholder: string; + onChange: (value: string) => void; +} + +export default function CustomSelect({ options, placeholder, onChange }: Props) { + const [open, setOpen] = useState(false); + const ref = useRef(null); + + useEffect(() => { + function handleOutside(e: MouseEvent) { + if (ref.current && !ref.current.contains(e.target as Node)) { + setOpen(false); + } + } + if (open) document.addEventListener('mousedown', handleOutside); + return () => document.removeEventListener('mousedown', handleOutside); + }, [open]); + + function select(value: string) { + setOpen(false); + onChange(value); + } + + return ( +
+ + + {open && ( +
+ {options.map((opt) => ( + + ))} +
+ )} +
+ ); +} diff --git a/components/ObjektSelector.tsx b/components/ObjektSelector.tsx index 85cd236..6c1dfe0 100644 --- a/components/ObjektSelector.tsx +++ b/components/ObjektSelector.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'; import type { ObjektOption, SelectedObjekt } from '@/types/logbuch'; +import CustomSelect from './CustomSelect'; interface Props { selected: SelectedObjekt[]; @@ -46,19 +47,24 @@ export default function ObjektSelector({ selected, onChange }: Props) { onChange(selected.filter((o) => o.Name !== name)); } + const options = [ + { value: 'neu', label: '— Neues Objekt eingeben —' }, + ...available.map((o) => ({ value: String(o.ID), label: o.Name })), + ]; + return ( -
+
{selected.map((o) => ( {o.Name}
- + {showNewInput && (
@@ -89,19 +87,19 @@ export default function ObjektSelector({ selected, onChange }: Props) { onChange={(e) => setNewName(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); addNew(); } }} placeholder="Objektname eingeben" - className="flex-1 px-3 py-1.5 border-2 border-gray-400 rounded-lg bg-white text-sm focus:border-blue-500 focus:outline-none" + className="flex-1 px-3 py-3 border-2 border-gray-400 rounded-lg bg-white text-base focus:border-blue-500 focus:outline-none" />