Skip to content

Пользовательские поля

Пользовательские поля позволяют расширять данные задач (или других сущностей) пользовательскими атрибутами помимо встроенных title, description, status и priority.

Модель

CustomField
├── entityType (например "task", "project")
├── name, type, config (JSON)
└── values (CustomFieldValue[])

CustomFieldValue
├── entityId (ссылка на экземпляр сущности)
├── fieldId (ссылка на определение CustomField)
└── value (JSON)

Типы полей

ТипКонфигФормат значения
textstring
number{ min?, max? }number
select{ options: string[] }string (одно из options)
dateISO строка даты
checkboxboolean

API Эндпоинты

Определения полей

МетодПутьОписание
GET/api/custom-fields/:entityTypeСписок полей для типа сущности
POST/api/custom-fieldsСоздать определение поля
PATCH/api/custom-fields/:idОбновить определение поля
DELETE/api/custom-fields/:idУдалить определение поля

Значения полей

МетодПутьОписание
GET/api/custom-field-values/:entityIdПолучить значения для сущности
POST/api/custom-field-values/:entityIdУстановить значения (upsert)

Фронтенд

Store пользовательских полей

typescript
const store = useCustomFieldsStore()

await store.fetchFields(entityType)
await store.createField({ entityType, name, type, config })
await store.updateField(id, { name, type, config })
await store.deleteField(id)

await store.fetchValues(entityId)
await store.setValues(entityId, [{ fieldId, value }])

Компонент CustomFieldEditor

Компонент CustomFieldEditor.vue динамически рендерит форму на основе определений полей:

  • text → текстовое поле
  • number → числовое поле с min/max
  • select → выпадающий список из настроенных опций
  • date → выбор даты
  • checkbox → переключатель

Ключевые детали

  • Имена полей должны быть уникальными в пределах типа сущности (ограничение @@unique([entityType, name]))
  • Значения хранятся как JSON, что позволяет гибкие типы
  • Удаление поля каскадно удаляет все его значения
  • Пользовательские поля отображаются на боковой панели деталей задачи