Skip to content

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> на клиенте.

Запись значений

Варианты:

  1. Feathers route расширения — extension backend service, внутри hostApis.entityFields.setValues.
  2. GraphQL mutation хоста — если добавите обёртку; в v1 часто пишут через extension API.
  3. 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.

AI workspace для командных материалов и знаний