Контролы формы: бизнес-логика¶
form-controls описывает поведение контролов дополнительных параметров в форме задачи:
- как пользователь вводит/редактирует значения;
- какие настройки типа ДП влияют на UI и валидацию;
- как отличать проблемы layout формы от проблем конкретного контрола.
Граница:
form-controls= контроль и сохранение значения конкретного ДП;task-forms= контейнеры блоков и общий layout формы.
Крупные группы контролов¶
Система различает четыре основные группы контролов по бизнес-назначению.
| Группа | Бизнес-назначение |
|---|---|
| File / MultiFile | Прикрепление и использование файлов в задаче |
| Lookup / MultiLookup | Выбор связанных задач из другой категории |
| SelectUsers | Выбор пользователей, групп и оргструктуры |
| Table EP | Структурированные табличные данные в карточке |
Бизнес-правила по группам¶
1. File / MultiFile¶
Контролы вложений определяют, как пользователь прикрепляет файлы к задаче и ДП.
- Тип определяется настройкой
IsMultifile(один или несколько файлов). - Ограничения расширений и размера применяются до сохранения.
- Один и тот же файл может быть связан с задачей и с ДП через link-таблицы.
2. Lookup / MultiLookup¶
Контролы выбора задач позволяют связывать текущую задачу с задачами из других категорий.
- Lookup хранит одиночный выбор, MultiLookup — множественный.
- Источник значений задается категорией/сводным разделом и может фильтроваться smart-условием.
- Каскадные связи между ДП влияют на доступный набор значений в runtime.
3. SelectUsers¶
Контролы выбора людей позволяют назначить задаче пользователей, группы и подразделения.
- Поддерживаются три подсистемы выбора: пользователи, группы, оргструктура.
- В
SingleUserModeсохраняется не более одного выбранного элемента. - Фильтрация может идти по группе, подразделению или смарт-фильтру.
4. Table EP¶
Табличный ДП структурирует произвольные данные в виде таблицы строк непосредственно в карточке задачи.
- Таблица — это отдельный под-домен внутри ДП со схемой колонок и строк.
- Колонки имеют типы, права, валидацию и настройку отображения.
- Изменения строк проходят через отдельный pipeline сохранения и валидации.
Сквозные пользовательские сценарии¶
Уход из поля и сохранение. Tab и Shift+Tab переносят фокус на соседнее поле и сохраняют набранное, Esc отменяет правку и возвращает прежнее значение. В полях с выбором из списка Enter подтверждает выбор и закрывает список, пробел в поле с несколькими значениями переключает элемент под фокусом. Сводная таблица «группа поля × клавиша» — в Интерфейсе пользователя — Frontend, раздел про клавиатуру внутри полей формы.
Типовой сценарий взаимодействия пользователя с контролом формы задачи.
- Пользователь открывает MTF/NTF и видит контролы по настройкам категории.
- Пользователь меняет значение и сохраняет форму.
- Сервер валидирует значение по типу ДП и записывает в таблицы значений.
- UI получает новое состояние (pull/hybrid) и синхронизирует отображение.
В выпадающих списках Lookup, MultiLookup и SelectUsers выбор доступен с клавиатуры: стрелки вверх и вниз перебирают варианты, пропуская недоступные; Escape закрывает список, не применяя значение. Если список был открыт, первое Escape закрывает только список: поле остаётся в режиме редактирования, а фокус возвращается к полю. Повторное Escape при закрытом списке отменяет правку и сворачивает поле; у полей без выпадающего списка прежнее поведение не меняется. Дальше поведение зависит от того, сколько значений допускает параметр.
- Одно значение (Lookup, выбор пользователя с одиночным выбором):
Enterилипробелприменяют вариант под фокусом и закрывают список; фокус возвращается на поле. - Несколько значений (Multilookup, выбор пользователя с множественным выбором):
пробелпереключает выбор элемента под фокусом — не выбранный добавляет, уже выбранный снимает, — список остаётся открытым, а фокус не уходит с элемента, поэтому подряд можно набрать и снять несколько значений;Enterподтверждает выбор: список закрывается, а элемент под фокусом не добавляется и не снимается. Выбранные значения в раскрытом списке отмечены, поэтому видно и результат пробела, и то, что повторное нажатие снимет выбор.TabиShift+Tabиз открытого списка переносят фокус на следующее или предыдущее поле формы: набранное сохраняется, элемент под фокусом не меняется.
Во всех случаях выбранное значение сохраняется, а наружу уходит событие подтверждения выбора. Опции виртуального списка фокус по Tab не перебирают: Tab из открытого списка ведёт сразу на соседнее поле формы, а не по строкам списка и не в конец страницы. Клавиша Backspace в строке поиска стирает текст и не снимает выбранные значения — значение убирается крестиком на чипе. Ввод адресов электронной почты через запятую в строке поиска работает как прежде. Если пробел нажать первым символом в строке поиска, в поле ввода появится пробел, а поиск не запустится — запрос из одного пробела отбрасывается.
Такое поведение действует в полях дополнительных параметров в карточке задачи. В остальных местах — в редакторах таблиц, фильтрах, формах администратора — пробел работает как Enter: применяет вариант под фокусом и закрывает список.
Поля выбора пользователя. В строке поиска такого поля текст набирается с клавиатуры при любом режиме: нажатая буква попадает в строку и сразу сужает список, Tab и Shift+Tab переводят фокус на соседнее поле, Enter выбирает найденного пользователя. Поле не перехватывает событие клавиатуры, поэтому стандартное поведение браузера сохраняется.
Клавиши в этих полях работают так: пробел переключает выбор элемента под фокусом и не закрывает список (для поля с несколькими значениями), Enter подтверждает выбор и закрывает список, Escape закрывает список без применения значения, Tab и Shift+Tab переносят фокус на следующее поле и сохраняют выбранное. В поле с одним значением Enter и пробел равнозначны.
Клавиатурная модель карточки — дополнительный слой поверх этого: она добавляет перебор пунктов стрелками, переключение выбора пробелом и переход Tab на соседнее поле с сохранением текущего значения. Модель включена у дополнительных параметров типа «Выбор пользователей» в карточке задачи. У системных полей «Заказчик», «Исполнитель», «Подписчики» и «Уведомлять» — и в форме создания задачи, и в карточке — её нет: они используют тот же контрол выбора пользователя, но работают на базовых клавишах — ввод, Tab, Enter.
Вход в поле с клавиатуры. Когда фокус стоит на закрытом поле, Enter и пробел открывают его для редактирования одинаково: страница не прокручивается, а уже открытое поле повторно не открывается. Исключение — поля, значение которых меняется одной клавишей: у «Галочки» Enter и пробел ставят и снимают отметку, у «Выпадающего списка» в виде радиокнопок — выбирают вариант под фокусом. Правило действует и в карточке задачи, и в форме создания задачи.
Поля на базе блочного редактора. При редактировании поля типа «Большой текст с форматированием» на базе блочного редактора клавиши Tab и Shift + Tab изолируются внутри редактора и последовательно переводят фокус между блоками текста, таблицами и вложениями, не перескакивая на следующее поле формы задачи. Для выхода из редактора и возврата к переходу между полями карточки используется Esc.
Список в контролах Lookup и MultiLookup открывается по клику на поле или на стрелку. Повторный клик по уже открытому списку ничего не меняет: список остаётся открытым, поле не выходит из режима редактирования (с версии 2.268). Закрыть список можно тремя способами: нажать Escape, кликнуть вне списка или выбрать значение. В мультивыборе клик по строке список не закрывает — следующие значения можно отмечать, не раскрывая список заново. У других выпадающих контролов (простой выпадающий список, выбор адреса, выбор пользователя) повторный клик по стрелке по-прежнему сворачивает список. А если в этот момент значение уходит в обработку, список закрывается, а поле становится недоступным до её завершения; закрытие списка при этом не считается отменой правки.
Простой выпадающий список (vh-control-dropdown) по умолчанию хранит выбранный элемент целиком. Если разработчик указал поле значения — в форме хранится только оно (например идентификатор), а в поле виден текст элемента. Во множественном выборе в поле видны все выбранные значения через запятую, список после отметки не закрывается — следующие значения отмечаются сразу. Если задан особый шаблон выбранного — вместо строки показывается он.

Подтверждение и отмена ввода в карточке задачи¶
У полей дополнительных параметров с клавиатурным вводом ввод можно подтвердить и отменить не только с клавиатуры. В карточке существующей задачи, когда поле открыто на редактирование и у пользователя есть право на изменение параметра, рядом с полем появляются две иконки: галочка подтверждает ввод — значение сохраняется, поле возвращается в режим просмотра; крестик отменяет ввод — в поле возвращается прежнее значение, подсветка ошибки проверки снимается, сохранение не выполняется, поле также возвращается в режим просмотра. Работают и привычные способы: Enter подтверждает, Esc отменяет, уход из поля сохраняет значение.
Иконки вешаются поверх текста ошибки или подсказки под полем, прикреплены к нижнему правому краю поля и область ввода не перекрывают. Механизм действует для типов «Текст», «Число (NumericValue)», «Деньги», «Нумератор» и «URL». У остальных типов подтверждение своё: у выпадающего списка, выбора из справочника и выбора пользователя значение применяется кликом по варианту, у даты и даты со временем — кнопкой внутри календаря.
Кнопок нет в форме создания задачи — там поля всегда в режиме ввода, подтверждать отдельно нечего. Нет их и в формах Календаря при создании и редактировании события.
У полей «Большой текст с форматированием», «Большой текст без форматирования» и системного поля «Задача» подтверждение выглядит иначе — под полем в режиме редактирования показываются две подписанные кнопки, «Сохранить» и «Отмена». Кнопки идут сразу под полем и толкают вёрстку вниз, не накладываясь на текст, блок ошибки и подсказку: поле большого текста растёт при вводе, и кнопки остаются под ним. «Сохранить» записывает введённый текст и возвращает поле в режим просмотра, «Отмена» возвращает прежнее значение и тоже закрывает редактирование; Esc, Tab и клик вне поля работают как раньше.
Поле не сворачивается в момент подтверждения ввода — ни по Enter, ни по клику на галочку. Пока запрос на сохранение идёт и ответ ещё не пришёл, поле остаётся открытым на редактирование; уход из поля по Esc или клику вне его в этот момент свёртку не выполняют. В режим просмотра поле переходит по успешному ответу сервера — один раз. Если сохранение не удалось — значение отклонено проверкой, ввод отменён автоматизацией или запрос завершился сетевой ошибкой, — поле остаётся открытым, введённое значение в нём сохраняется, а рядом с полем показывается сообщение об ошибке; задача при этом не перечитывается, поэтому введённое не затирается серверным значением. Эти правила одинаковы для подтверждения с клавиатуры и для галочки с крестиком; в форме создания задачи запрос не отправляется, поэтому поле сворачивается сразу.
Иконки показаны второстепенными кнопками платформы — 36×36, иконка 24px, фон container-default, иконка oncontainer-default, радиус 8px. Они лежат оверлеем под полем, прижаты к его правому краю, с отступом 4px от нижней грани, и не занимают места в разметке: поле не сжимается по ширине, соседние параметры не сдвигаются. Иконки рисуются поверх нижнего содержимого блока — текста ошибки, подсказки или соседнего поля, — поэтому частично перекрывают его; это ожидаемое поведение, а не дефект.
Кнопки большого текста, в отличие от иконок скалярных полей, идут в потоке разметки и толкают вёрстку вниз, не накладываясь на текст, блок ошибки и подсказку.
Отменить неудачное подтверждение можно любым из четырёх способов — крестиком, клавишами Cmd/Ctrl+Z, пунктом «Отмена» контекстного меню или Esc: значение возвращается к последнему принятому сервером, а сообщение проверки под полем гаснет.
Типовые инциденты¶
Наиболее частые симптомы при работе с контролами и их вероятные причины.
| Симптом | Наиболее вероятная причина |
|---|---|
| Поле видно, но не сохраняется | формат значения не соответствует ожиданию серверной части |
| Lookup пустой | фильтрация/каскад исключили данные источника |
| Список не закрывается повторным кликом по полю или стрелке | Штатное поведение с версии 2.268: повторный клик по открытому списку ничего не меняет, закрывать — Escape, кликом вне списка или выбором значения |
| Список значений у поля «Ссылка» или «Множественной ссылки» пропал во время сохранения, поле не реагирует на клики | Штатное поведение с версии 2.268: пока система обрабатывает значение, список закрыт, а поле недоступно. Список вернётся сам по завершении обработки, если был открыт |
| SelectUsers показывает «не тех» | неверные allow/filtration настройки |
В строке поиска поля выбора пользователя не набирается текст, Tab не уводит фокус |
старая сборка: условные обработчики клавиш отменяли действие браузера по умолчанию; обновиться до сборки 2.268 «Скульптор» |
| Файл загрузился, но не отображается | link к ДП не создан или удален |
| Таблица отображает старые строки | не сработал refresh после update |