fix(schema-editor): preserve nested objects via 'opaque' kind

Bug: parseSchemaJson fallback на line 196 возвращал {kind: 'string'}
для unknown types (object с nested properties, array of objects, etc.).
При save back to schema это давало lossy round-trip:

  spacecraft.orbit (object с 7 nested fields)
  → parseSchemaJson → kind: 'string'
  → propertyToSchema → {type: 'string'}
  → diffSchemas → BREAKING CHANGE 'object → string' → save blocked

Симптом видел user: edit modal spacecraft показывает 'НЕСОВМЕСТИМОЕ
ИЗМЕНЕНИЕ СХЕМЫ' для orbit, save заблокирован, хотя admin не трогал
orbit.

Fix:
- Новый PropertyKind 'opaque' для unknown types
- PropertyDef.rawSchema (optional JsonSchema) хранит оригинал
- parseSchemaJson fallback теперь {kind:'opaque', rawSchema:raw}
- propertyToSchema для opaque возвращает rawSchema verbatim (с
  description override если admin менял в Поля-табе)
- PropertyEditor: 'opaque' исключён из Type dropdown (admin не может
  вручную выбрать), для existing opaque поля показывается warning
  card с raw JSON read-only + hint что редактируется через JSON-таб

Test coverage: 73 tests passing (5 + 10 SchemaBuilder + 7 + ...).
Эффект: edit любого справочника с nested objects (orbit) больше не
триггерит false-positive breaking change.

i18n: schema.kind.opaque + schema.opaque.{title,hint} × ru-RU/en-US.
This commit is contained in:
Zimin A.N.
2026-05-06 17:29:42 +03:00
parent 0759a5a150
commit e300d4ea8b
3 changed files with 45 additions and 5 deletions
+6
View File
@@ -210,6 +210,9 @@ i18n
'schema.kind.date': 'Дата',
'schema.kind.datetime': 'Дата+время',
'schema.kind.array_string': 'Массив строк',
'schema.kind.opaque': 'Сложный (JSON)',
'schema.opaque.title': 'Сложное поле — редактируется только через JSON-таб',
'schema.opaque.hint': 'Nested object / array of objects. Поля-табе нет редактора, raw schema показан ниже. Меняй через вкладку "JSON".',
'field.name': 'Наименование',
'field.designator': 'Designator (COSPAR)',
'field.norad_id': 'NORAD ID',
@@ -432,6 +435,9 @@ i18n
'schema.kind.date': 'Date',
'schema.kind.datetime': 'Date+time',
'schema.kind.array_string': 'Array of strings',
'schema.kind.opaque': 'Complex (JSON)',
'schema.opaque.title': 'Complex field — edit only via JSON tab',
'schema.opaque.hint': 'Nested object / array of objects. No editor in Fields tab, raw schema shown below. Edit via JSON tab.',
'field.name': 'Name',
'field.designator': 'Designator (COSPAR)',
'field.norad_id': 'NORAD ID',