fix(admin-ui): translate field labels + responsive header + modal max-h

Issues:
- Field labels (ORBIT/STATUS/COUNTRY/MASS_KG/...) показывались raw'ом потому
  что backend schema не присылает title. Добавил humanize() (snake_case → 'Snake Case')
  + i18n fallback t('field.$key') для известных полей spacecraft/satellite_type/
  ground_station: name, designator, norad_id, status, country, operator, mass_kg,
  mission, orbit, launch_date, decay_date, spectrum_bands, satellite_type_code, etc.
- Modal panel рос в высоту бесконечно (nstart-ui Modal не клампит max-h),
  на iPad портрете форма уходила за viewport. panelClassName=max-h-[calc(100vh-2rem)]
  flex flex-col + bodyClassName=overflow-y-auto flex-1.
- Header в __root: padding/gap responsive (px-4 sm:px-6, py-3 sm:py-4, gap-3 sm:gap-6),
  flex-wrap чтобы LanguageSwitch на узких экранах переносился под навигацию.
- Main container: px-4 sm:px-6 + py-4 sm:py-8.
This commit is contained in:
Zimin A.N.
2026-05-04 02:47:06 +03:00
parent 7aed67fce5
commit 43a06d1a7b
4 changed files with 50 additions and 5 deletions
@@ -43,7 +43,11 @@ const ajv = new Ajv({ allErrors: true, strict: false })
addFormats(ajv)
const isLocalized = (s: JsonSchema): boolean => Boolean(s['x-localized'])
const fieldLabel = (key: string, schema: JsonSchema): string => schema.title ?? key
const humanize = (key: string): string =>
key
.replace(/[_-]+/g, ' ')
.replace(/\b\w/g, (ch) => ch.toUpperCase())
export const SchemaDrivenForm = ({
schema,
@@ -134,6 +138,7 @@ export const SchemaDrivenForm = ({
supportedLocales={supportedLocales}
defaultLocale={defaultLocale}
fieldError={formState.errors.data?.[key as keyof FormValues['data']]}
labelOf={(k, s) => s.title ?? t(`field.${k}`, { defaultValue: humanize(k) })}
/>
))}
</div>
@@ -169,6 +174,7 @@ type FieldRendererProps = {
supportedLocales: string[]
defaultLocale: string
fieldError?: unknown
labelOf: (key: string, schema: JsonSchema) => string
}
const FieldRenderer = (props: FieldRendererProps) => {
@@ -188,8 +194,9 @@ const FieldBody = ({
supportedLocales,
defaultLocale,
fieldError,
labelOf,
}: FieldRendererProps) => {
const label = fieldLabel(fieldKey, schema)
const label = labelOf(fieldKey, schema)
const errorMsg = (fieldError as { message?: string } | undefined)?.message
if (isLocalized(schema)) {