Frontend: чтение и UI-паттерны
Ядро не предоставляет auto-form по backend.entityFields. Расширение само решает, нужен ли UI.
Чтение значений
ts
const client = getGraphQLClient();
const { resolvedEntityFieldValues } = await client.request(
`query ($entityType: String!, $entityId: ID!) {
resolvedEntityFieldValues(entityType: $entityType, entityId: $entityId)
}`,
{ entityType: 'space', entityId: spaceId },
);
// [{ key: 'my-ext.strictMode', value: 'true' }, ...]Преобразуйте в Record<string, string> на клиенте.
Запись значений
Варианты:
- Feathers route расширения — extension backend service, внутри
hostApis.entityFields.setValues. - GraphQL mutation хоста — если добавите обёртку; в v1 часто пишут через extension API.
- Settings panel — форма в
app.settingsTabs/app.uiSlots, submit → ваш backend endpoint.
Пример паттерна settings tab:
ts
// frontend setup
getExtensionRegistry('app.settingsTabs').register('my-ext-space-fields', {
label: 'My extension',
component: MySpaceFieldsPanel,
});MySpaceFieldsPanel грузит resolvedEntityFieldValues, сохраняет через Feathers PATCH /ext/my-ext/space/:id/fields.
UI slots на экранах space / artifact
app.uiSlots regions (space.artifact.inspector, space.settings.section, …) — монтируйте компонент редактирования полей рядом с нативным UI.
Связь с abilities
Показывайте редактор поля только если can('space.manage') или custom ability расширения. Запись на backend должна дублировать проверку.
Boolean / enum в формах
vue
<Checkbox
:model-value="values['my-ext.strictMode'] === 'true'"
@update:model-value="(v) => patch['my-ext.strictMode'] = v ? 'true' : 'false'"
/>Не храните boolean в Vue state как source of truth для persistence — всегда сериализуйте в string перед save.