ADR-UI-009. Формы

ADR Версия: 1.0 accepted

Приложению нужны формы — ввод идентификаторов, поля значений, фильтры. Фиксируем один способ: формы на Signal Forms (signals-first), единое базовое поле с плавающей меткой, единый стиль валидации, показа ошибок и связки со значением.

⟨/⟩ Исходник

1. Контекст и постановка задачи

Нужен один способ реализации форм, чтобы стиль валидации, показа ошибок и связки со значением был единым, а разработчик и ИИ-ассистент не выбирали подход в каждой задаче.

Фронт строится signals-first (ADR-UI-001), поэтому формы делаем на Signal Forms (@angular/forms/signals) — значения и валидность и так сигналы, без моста к реактивным потокам. Базовое поле и его поведение берём по единому визуальному образцу (плавающая метка).

2. Драйверы решения

  1. Signals-first — форма выражена сигналами; не заводим параллельный поток и подписки ради отображения.
  2. Единый стиль — одинаковые валидация, показ ошибок, submit во всех формах.
  3. Типизация — значения и валидаторы типизированы, без any.
  4. Кросс-полевая и асинхронная валидация — поддерживаются из коробки подхода.

3. Рассмотренные варианты

4. Решение

Выбран Вариант C: формы на Signal Forms. Значения, валидность и состояния — сигналы; шаблон использует их напрямую (@if, [disabled]) без async-моста. Самодельных оболочек поверх (createForm() и т. п.) не вводим — используем нативный API (form, field, Control, validate, правила required/min/max/minLength/email/pattern, validateAsync, submit).

4.1. Базовое поле — Field (плавающая метка)

Общий атом всех полей ввода: рамка-капсула (скругление, padding, фон/обводка по состоянию) с плавающей меткой:

Состояния (различаются фоном/обводкой, геометрия одна): default, hover, focus (кольцо), error, error-focus, disable, autofill.

Под контролом — под-блок description: сюда идут пояснение к полю (helper, опц.) и сообщение об ошибке. То есть подпись-пояснение и ошибка — ниже контрола.

Слоты prefix / suffix; суффикс задаёт вариант поля: Input, Select (▾), Date (календарь) — всё на одной рамке. Поле — base-компонент набора ui/.

4.2. Раскладка форм

4.3. Валидация

4.4. Submit

  1. показать ошибки (пометить поля «тронутыми» / submitted);
  2. если форма невалидна — выйти (без «тихого» отказа);
  3. вызвать метод per-page service со значением формы (или после маппинга в API-модель).

На время отправки — сигнал submitting (блокировка формы), по завершении — снять.

4.5. Что не используем

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы