Пользовательские поля
Пользовательские поля позволяют расширять данные задач (или других сущностей) пользовательскими атрибутами помимо встроенных title, description, status и priority.
Модель
CustomField
├── entityType (например "task", "project")
├── name, type, config (JSON)
└── values (CustomFieldValue[])
CustomFieldValue
├── entityId (ссылка на экземпляр сущности)
├── fieldId (ссылка на определение CustomField)
└── value (JSON)Типы полей
| Тип | Конфиг | Формат значения |
|---|---|---|
text | — | string |
number | { min?, max? } | number |
select | { options: string[] } | string (одно из options) |
date | — | ISO строка даты |
checkbox | — | boolean |
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/maxselect→ выпадающий список из настроенных опцийdate→ выбор датыcheckbox→ переключатель
Ключевые детали
- Имена полей должны быть уникальными в пределах типа сущности (ограничение
@@unique([entityType, name])) - Значения хранятся как JSON, что позволяет гибкие типы
- Удаление поля каскадно удаляет все его значения
- Пользовательские поля отображаются на боковой панели деталей задачи