import React from "react"; import { Button, Input, Select, SelectItem } from "@heroui/react"; import { type TFunction } from "i18next"; import { type EdiHeaderForm, type PSectResult } from "@/types/edi"; import { type BandOption } from "@/hooks/useRoundMeta"; type HeaderFormFieldsProps = { headerForm: EdiHeaderForm; setHeaderForm: React.Dispatch>; markEdited: () => void; onPbandChange: (value: string) => void; onSpoweChange: (value: string) => void; onApplyPsectCanonical: () => void; t: TFunction<"common">; tNameInvalid: boolean; tDateError: string | null; pCallEmpty: boolean; pCallInvalid: boolean; pwwloEmpty: boolean; pwwloFormatInvalid: boolean; pwwloInvalid: boolean; psectMissing: boolean; psectHasErrors: boolean; psectValidation: PSectResult; psectNeedsFormat: boolean; psectCanonical: string | null; shouldShowIaruAdjustButton: boolean; bands: BandOption[]; bandsLoading: boolean; bandsError: string | null; bandUnknown: boolean; bandMissing: boolean; bandValue: string; pbandInfo: string | null; rhbbsWarning: string | null; spoweInvalid: boolean; spoweEmpty: boolean; spoweTooLong: boolean; spoweOverLimit: boolean; spoweLimitError: string | null; spoweInfo: string | null; santeInvalid: boolean; santeValue: string; santeTooLong: boolean; sectionNeedsSingle: boolean; sectionNeedsMulti: boolean; rcallInvalid: boolean; mopeInvalid: boolean; }; export default function HeaderFormFields({ headerForm, setHeaderForm, markEdited, onPbandChange, onSpoweChange, onApplyPsectCanonical, t, tNameInvalid, tDateError, pCallEmpty, pCallInvalid, pwwloEmpty, pwwloFormatInvalid, pwwloInvalid, psectMissing, psectHasErrors, psectValidation, psectNeedsFormat, psectCanonical, shouldShowIaruAdjustButton, bands, bandsLoading, bandsError, bandUnknown, bandMissing, bandValue, pbandInfo, rhbbsWarning, spoweInvalid, spoweEmpty, spoweTooLong, spoweOverLimit, spoweLimitError, spoweInfo, santeInvalid, santeValue, santeTooLong, sectionNeedsSingle, sectionNeedsMulti, rcallInvalid, mopeInvalid, }: HeaderFormFieldsProps) { return ( <> { setHeaderForm((prev) => ({ ...prev, TName: e.target.value })); markEdited(); }} isInvalid={tNameInvalid} errorMessage={tNameInvalid ? "TName je povinné." : undefined} /> { setHeaderForm((prev) => ({ ...prev, TDate: e.target.value })); markEdited(); }} isInvalid={!!tDateError} errorMessage={tDateError || undefined} /> { setHeaderForm((prev) => ({ ...prev, PCall: e.target.value })); markEdited(); }} isInvalid={pCallInvalid} errorMessage={ pCallEmpty ? "PCall je povinné." : pCallInvalid ? "PCall musí být validní volací znak." : undefined } /> { const normalized = e.target.value.toUpperCase(); setHeaderForm((prev) => ({ ...prev, PWWLo: normalized })); markEdited(); }} isInvalid={pwwloInvalid} errorMessage={ pwwloEmpty ? "PWWLo je povinné." : pwwloFormatInvalid ? "PWWLo musí mít 6 znaků ve formátu lokátoru (AA00AA)." : undefined } />
{ setHeaderForm((prev) => ({ ...prev, PSect: e.target.value })); markEdited(); }} isInvalid={psectMissing || psectHasErrors} errorMessage={ psectMissing ? (t("upload_error_psect_required") as string) || "PSect je povinné." : psectHasErrors ? psectValidation.errors.join(" ") : undefined } /> {shouldShowIaruAdjustButton && ( )}
{psectNeedsFormat && (
{(t("upload_error_psect_not_iaru") as string) || "PSect není ve formátu IARU."}
)}
{bands.length > 0 ? ( ) : ( onPbandChange(e.target.value)} isDisabled={bandsLoading} errorMessage={bandsError ?? undefined} /> )} {pbandInfo &&
{pbandInfo}
}
{ setHeaderForm((prev) => ({ ...prev, RHBBS: e.target.value })); markEdited(); }} isInvalid={false} /> {rhbbsWarning &&
{rhbbsWarning}
}
onSpoweChange(e.target.value)} isInvalid={spoweInvalid} errorMessage={ spoweEmpty ? (t("upload_error_spowe_required") as string) || "SPowe je povinné." : spoweTooLong ? (t("upload_error_spowe_length") as string) || "SPowe může mít maximálně 12 znaků." : spoweInvalid || spoweOverLimit ? (t("upload_error_spowe_format") as string) || "SPowe musí být celé číslo (bez jednotek)." : undefined } /> {spoweLimitError &&
{spoweLimitError}
} {spoweInfo &&
{spoweInfo}
}
{ setHeaderForm((prev) => ({ ...prev, SAnte: e.target.value })); markEdited(); }} isInvalid={santeInvalid} errorMessage={ santeValue === "" ? (t("upload_error_sante_required") as string) || "SAnte je povinné." : undefined } /> {santeTooLong && (
{t("upload_warn_sante_length") ?? "Ve výsledcích bude zobrazeno pouze 12 znaků, váš popis antény je delší a bude oříznut."}
)}
{(sectionNeedsSingle || sectionNeedsMulti) && ( { setHeaderForm((prev) => ({ ...prev, RCall: e.target.value })); markEdited(); }} isInvalid={rcallInvalid} errorMessage={ headerForm.RCall.trim() === "" ? "RCall je povinné pro zvolenou kategorii." : rcallInvalid ? "RCall musí být validní volací znak." : undefined } /> )} {sectionNeedsMulti && ( <> { setHeaderForm((prev) => ({ ...prev, MOpe1: e.target.value })); markEdited(); }} isInvalid={mopeInvalid} errorMessage={ mopeInvalid ? (t("upload_error_mope_missing") as string) || "Vyplň alespoň MOpe1 nebo MOpe2 (můžeš zadat více značek oddělených mezerou/středníkem/čárkou)." : undefined } /> { setHeaderForm((prev) => ({ ...prev, MOpe2: e.target.value })); markEdited(); }} isInvalid={mopeInvalid} errorMessage={ mopeInvalid ? (t("upload_error_mope_missing") as string) || "Vyplň alespoň MOpe1 nebo MOpe2 (můžeš zadat více značek oddělených mezerou/středníkem/čárkou)." : undefined } /> )} ); }