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:
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user