diff --git a/backend/package.json b/backend/package.json index d79656f..ce2fa3b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "rosterchirp-backend", - "version": "0.12.39", + "version": "0.12.40", "description": "RosterChirp backend server", "main": "src/index.js", "scripts": { diff --git a/build.sh b/build.sh index 2ddcebe..ad50a51 100644 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # ───────────────────────────────────────────────────────────── set -euo pipefail -VERSION="${1:-0.12.39}" +VERSION="${1:-0.12.40}" ACTION="${2:-}" REGISTRY="${REGISTRY:-}" IMAGE_NAME="rosterchirp-dev" diff --git a/frontend/package.json b/frontend/package.json index 467b8b8..4dd5c17 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "rosterchirp-frontend", - "version": "0.12.39", + "version": "0.12.40", "private": true, "scripts": { "dev": "vite", diff --git a/frontend/src/components/MobileEventForm.jsx b/frontend/src/components/MobileEventForm.jsx index 16b626c..6948aea 100644 --- a/frontend/src/components/MobileEventForm.jsx +++ b/frontend/src/components/MobileEventForm.jsx @@ -74,38 +74,46 @@ function TimeInputMobile({ value, onChange }) { const [inputVal, setInputVal] = useState(fmt12(value)); const wrapRef = useRef(null); const listRef = useRef(null); + const inputRef = useRef(null); useEffect(() => { setInputVal(fmt12(value)); }, [value]); + // Programmatically disable autocomplete after mount + useEffect(() => { + if (inputRef.current) { + inputRef.current.setAttribute('autocomplete', 'off'); + inputRef.current.setAttribute('autocorrect', 'off'); + inputRef.current.setAttribute('autocapitalize', 'off'); + inputRef.current.setAttribute('spellcheck', 'false'); + } + }, []); + useEffect(() => { if (!open || !listRef.current) return; const idx = TIME_SLOTS.findIndex(s => s.value === value); if (idx >= 0) listRef.current.scrollTop = idx * 40 - 40; }, [open, value]); - useEffect(() => { - if (!open) return; - const h = e => { if (wrapRef.current && !wrapRef.current.contains(e.target)) setOpen(false); }; - document.addEventListener('mousedown', h); - return () => document.removeEventListener('mousedown', h); - }, [open]); - const commit = (raw) => { const parsed = parseTypedTime(raw); if (parsed) { onChange(parsed); setInputVal(fmt12(parsed)); } else setInputVal(fmt12(value)); + setOpen(false); }; return (