From 3a7d2444330f0e491285da38ca1a3c2d62f536ca Mon Sep 17 00:00:00 2001 From: elpatron Date: Sun, 31 May 2026 11:12:43 +0200 Subject: [PATCH] =?UTF-8?q?fix(logs):=20Kompass-Dial-Locales=20und=20UI-La?= =?UTF-8?q?bels=20vervollst=C3=A4ndigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ergänzt fehlende i18n-Keys (Himmelsrichtungen, Platzhalter, Schrittweite) und zeigt Validierungsfehler im Kurs-Dial. Co-authored-by: Cursor --- client/src/App.css | 8 + client/src/components/CourseDialInput.tsx | 34 ++- client/src/i18n/locales/de.json | 9 +- client/src/i18n/locales/en.json | 9 +- docs/plan-compass-course-dial.md | 296 ++++++++++++++++++++++ 5 files changed, 350 insertions(+), 6 deletions(-) create mode 100644 docs/plan-compass-course-dial.md diff --git a/client/src/App.css b/client/src/App.css index 78e8f9e..4ff0cc6 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -287,6 +287,14 @@ select.input-text { line-height: 1.4; } +.course-dial__error { + margin: 0; + width: 100%; + font-size: 12px; + color: #f87171; + text-align: center; +} + .course-dial__input { width: 100%; text-align: center; diff --git a/client/src/components/CourseDialInput.tsx b/client/src/components/CourseDialInput.tsx index 0769835..bd7f996 100644 --- a/client/src/components/CourseDialInput.tsx +++ b/client/src/components/CourseDialInput.tsx @@ -55,6 +55,7 @@ export default function CourseDialInput({ const svgRef = useRef(null) const [step, setStep] = useState(() => stepProp ?? loadCourseDialStep()) const [inputDraft, setInputDraft] = useState(null) + const [inputError, setInputError] = useState(null) const [outputModeOverride, setOutputModeOverride] = useState(null) const effectiveStep = stepProp ?? step @@ -72,10 +73,22 @@ export default function CourseDialInput({ [value, allowCardinal] ) + const tickLabel = useCallback( + (degrees: number) => { + if (degrees === 0) return t('logs.compass_n') + if (degrees === 90) return t('logs.compass_e') + if (degrees === 180) return t('logs.compass_s') + if (degrees === 270) return t('logs.compass_w') + return String(degrees).padStart(3, '0') + }, + [t] + ) + const applyDegrees = useCallback( (degrees: number) => { onChange(dialDegreesToStorageValue(degrees, outputMode, effectiveStep)) setInputDraft(null) + setInputError(null) }, [onChange, outputMode, effectiveStep] ) @@ -120,15 +133,21 @@ export default function CourseDialInput({ setInputDraft(null) if (!draft) { onChange('') + setInputError(null) return } if (allowCardinal && outputMode === 'cardinal' && isCardinalDirection(draft)) { onChange(draft.toUpperCase()) + setInputError(null) return } const parsed = parseCourseAngle(draft) - if (parsed === null) return + if (parsed === null) { + setInputError(t('logs.course_invalid')) + return + } onChange(formatCourseAngle(snapDegrees(parsed, effectiveStep))) + setInputError(null) } const handleInputKeyDown = (e: React.KeyboardEvent) => { @@ -170,7 +189,7 @@ export default function CourseDialInput({ className={`course-dial course-dial--${size}${disabled ? ' course-dial--disabled' : ''}`} > {!stepProp && ( -
+
{([1, 5, 10] as const).map((s) => (