Readiness
| Dimension | Status and evidence |
|---|---|
| Specification | Документ описывает текущий desktop fixture-прототип с fixed columns, motion, семью ролями, разнообразными fixtures и per-tab states. [S2] [S3] [S39] [S40] [S41] [S42] |
| Figma | Read-only evidence задаёт role visibility и permissions для «Новых», «В работе», «Ожидают оплаты» и «Архивных». [S39] [S40] [S41] [S42] |
| Local prototype | Route /transport-requests реализует fixture-сценарий и текущий UI Kit alignment для modal, toast, tabs, filters, table и Sidebar. [S1] [S4] [S16] [S17] [S18] |
| Verification | Предыдущие 78 focused tests и Browser QA экрана предшествуют D-038 и его default m rail. D-038 добавляет отдельную component-focused и browser QA проверку текущей геометрии контейнера. [S5] |
lifecycle: active означает, что документ описывает текущий локальный
Angular-прототип. Production-интеграция не реализована.
Current layout and table behavior
Layout and table geometry
- Весь обычный контент экрана — Header Widget, вкладки, Filter Row, таблица и
экранные состояния — использует один центрированный default
mrail с максимальной шириной1440pxвнутри Main Container. App shell передаётsize="m"и[verticalScroll]="false". - Table, включая Filter Row, Action Bar и scroll frame, не выходит за границы этого rail. В contained-scroll режиме нативный gutter для scrollbar остаётся внутри этого же Table viewport и не меняет его внешние inline-границы; горизонтальный overflow остаётся внутри Table viewport.
- Во вкладке «Предварительные» колонки
IDи действий передаютfixedColumn: false; все колонки прокручиваются вместе с таблицей. - Во вкладках «Новые», «В работе», «Ожидают оплаты» и «Архивные»
ID / статуси следующая за ней колонкаТип заявкиобразуют последовательную fixed-группу слева, а колонка действий фиксируется справа. Table рассчитываетfixedOffsetкак сумму ширин предыдущих fixed columns и закрепляет группы через нативныеinset-inline-start/inset-inline-end. Boundary separators определяются изfixedColumn: true; scroll-driven transforms и signals не используются.
Filters per tab
- Компоновка и набор фильтров подтверждены отдельным Figma-состоянием. [S6]
- Фильтр
Тип заявкипоказывается во вкладках «Предварительные», «Новые», «В работе» и «Архивные», использует multiselect и включает действие «Выбрать все» через[showSelectAll]="true". «Предварительные» используют три значения, остальные показанные вкладки — полный каталог из 11 значений. Во вкладке «Ожидают оплаты» control скрыт, а fixtures имеют тип «Коммерческая». - Постоянный фильтр
IDиспользует searchable single-select по ID заявки. - Только вкладка «Новые» показывает switch «Показать просроченные»; он оставляет строки со статусом «Просрочена» и сбрасывает visible limit к первой порции.
- Через
+ Фильтрдобавляется per-tab каталог из 10, 12, 11 или 12 controls, перечисленный ниже. Добавленный фильтр исчезает из списка доступных и может быть удалён из Filter Row. - Каждая из пяти вкладок хранит собственные applied values и набор видимых optional filters. Переключение вкладки восстанавливает её последнее состояние и не переносит значения из другой вкладки.
Сбросить фильтрыочищает значения постоянных и optional filters только в активной вкладке и очищаетvisibleOptional. Добавленные controls исчезают, а полный per-tab каталог снова доступен в меню+ Фильтр. Состояния других вкладок сохраняются. Reset disabled, когда значения фильтров активной вкладки уже находятся в исходном состоянии.- Фильтрация применяется к данным активной вкладки. Нулевая выдача после применения фильтра выбирает filtered-empty, а отсутствие записей до фильтрации выбирает обычный empty.
Sorting and loading more
- В «Предварительных» sortable остаются
IDиДата создания; в остальных вкладках к ним добавляетсяДата подачи машины. Исходный active sort —Дата созданияпо убыванию. Пользовательский sort применяется только к данным активной вкладки. - Список использует infinite scroll без Pagination: сначала показывает 18 строк, а при приближении Table viewport к концу синхронно добавляет следующую fixture-порцию из 12 строк без потери applied filters, active sort или фокуса. После отображения всех fixtures подгрузка прекращается.
- Длинное значение
Маршрутостаётся компактным. Существующий Line Clamp Popup открывается только при фактическом клиппинге и показывает полный текст, сохраняя существующую pointer-only accessibility boundary компонента. [S15]
States
loading: вместо Table и Filter Row показывается screen-level loader с доступным именем «Загрузка заявок». [S11]empty: данных активной вкладки нет до применения фильтров; показывается обычный Empty State. [S12]filtered-empty: applied filters дали ноль строк; показывается вариантfilter-resultс отдельным title активной вкладки и caption «Попробуйте изменить фильтры», а Filter Row и reset остаются доступны. Table viewport скрывает overflow, scrollbar и divider под текстом. [S13]load-error: initial load завершился ошибкой; вместо строк показывается error-state с повторным запросом. Applied filter state активной вкладки не теряется. [S14]- Состояния взаимоисключающие; modal и toast являются overlay/feedback поверх последнего успешного списка и не превращаются в состояние таблицы.
Deletion and feedback
- Выбор «Удалить» для строки открывает подтверждающий Modal, связанный с выбранной заявкой; до подтверждения данные не меняются. [S7] [S8]
- Отмена, Escape и допустимое закрытие modal сохраняют строку. Подтверждение
выполняется Button с вариантом
dangerи запускает screen-owned fixture- результат удаления. - При success строка удаляется из данных активной вкладки, modal закрывается и показывается success Toast. [S9]
- При error строка остаётся, modal закрывается и показывается error Toast с понятным текстовым результатом. [S10]
- Toast объявляет результат через существующие
status/alertsemantics, закрывается только по своему screen-owned состоянию и не полагается на цвет.
Fixed header and table viewport
Текущая вертикальная композиция экрана:
- Header Widget с заголовком и вкладками, а также Filter Row остаются неподвижны внутри Main Container.
- Вертикальный overflow получает только ограниченный viewport строк Table. Заголовок колонок остаётся sticky в верхней границе этого viewport, а горизонтальная прокрутка по-прежнему принадлежит Table.
- Infinite scroll слушает viewport строк Table и добавляет следующую fixture- порцию при приближении к его нижней границе.
- Экран передаёт
[verticalScroll]="false"в Main Container и[containedScroll]="true"в Table. Table viewport имеетrole="region",tabindex="0"и доступное имя таблицы.
UI Kit alignment
Текущая M-002 интеграция:
- Delete Modal сохраняет title как имя диалога, а поясняющий текст переносит из
descriptionTextв обычный<p>, проецируемый в.wbl-modal__content. InputsdescriptionиdescriptionTextне используются. Footer по-прежнему содержит отмену и danger-подтверждение. [S7] [S8] - Success/error Toast шириной 372px соответствует UI Kit node
3910:389. Появление занимает 300ms через--duration-slow(Fade-in+Slide-right), закрытие — 200ms через--duration-toast-dismiss(Fade-out+Slide-left). Toast остаётся в DOM доanimationend, после которого существующийdismissочищает screen-owned состояние. [S9] [S10] [S16] - Toast расположен на 16px от левого края content-области рядом с Sidebar и на 32px от нижней границы экрана.
- Ширина каждой вкладки и всей строки остаётся стабильной при переключении active/inactive; label, badge и соседние вкладки не сдвигаются.
- Disabled reset рендерится как disabled Button Flat с
variant='primary'. Disabled token — graphite-300 (#c4c4d4). Дополнительные 8pxmargin-inline-endдают итоговый интервал 16px до следующего divider. - Active Filter Chip без applied value/count показывает только label, без двоеточия. Двоеточие остаётся частью заполненного состояния.
- Sort affordance в Table Header получает Tooltip «Сортировать» для hover и keyboard focus. [S17]
- Table viewport и Sidebar navigation используют нативный 4px UI Kit scrollbar:
прозрачный track и pill-radius thumb tertiary
#c4c4d4; декоративный Table rail удалён. Sidebar thumb прозрачен в покое и становится видимым при hover илиfocus-within, не меняя scroll geometry. [S17] [S18] - Collapse-кнопка Sidebar получает Tooltip «Свернуть Ctrl B» / «Развернуть Ctrl B» на Windows/Linux или «Свернуть ⌘ B» / «Развернуть ⌘ B» на macOS. Shortcut переключает то же controlled состояние Sidebar и игнорируется в input, textarea, select и editable content.
Tab states and overflow refinement
- Четыре дополнительные выбранные вкладки сверяются с отдельными Figma-узлами:
«Новые» —
17034:24286, «В работе» —17065:57356, «Ожидают оплаты» —17065:77149, «Архивные» —17113:98641. Эти refs задают только визуальное состояние и содержимое соответствующей вкладки. Интеграция остаётся fixture- only и сохраняет общий infinite scroll. [S19] [S20] [S21] [S22]
| Вкладка | Текущие колонки и ширины |
|---|---|
| «Предварительные» | ID 112px; Тип заявки 196px; Маршрут minmax(376px, 1fr); Ответственный 244px; Дата создания 160px; действия 68px. При rail 1156px таблица занимает всю ширину. |
| «Новые» | ID / статус 136px; Тип заявки 224px; Маршрут 360px; Ответственный 248px; Детали 304px; Норматив 196px; Дата подачи машины 168px; Перевозчик / водитель 272px; ТС / прицеп 260px; Дата создания 156px; действия 68px. |
| «В работе» | ID / статус 208px; те же common columns от Тип заявки до ТС / прицеп; Транспортное задание 184px; Отгрузка 184px; Дата создания 156px; Дата взятия в работу 172px; действия 68px. |
| «Ожидают оплаты» | ID / статус 176px; Тип заявки 144px; common columns от Маршрут до ТС / прицеп; Транспортное задание 184px; Дата создания 156px; Дата взятия в работу 172px; действия 68px. |
| «Архивные» | ID / статус 152px; Тип заявки 224px; common columns от Маршрут до ТС / прицеп; Транспортное задание 184px; Отгрузка 148px; Дата создания 156px; Дата взятия в работу 172px; Дата закрытия 156px; действия 68px. |
Во всех расширенных вкладках
Деталипоказывает primaryГруз: {cargo} · Расстояние: {distance}и descriptionСтавка: {rate}. ДляКоммерческаяdescription продолжается как· Грузовладелец: {cargoOwner}.Нормативпоказывает primaryВремя: {duration}и descriptionТип маршрута: {routeType}. Во вкладке «Предварительные» колонокДеталииНормативнет.В колонке
ID / статусBadge показывается под обычным ID, когда fixture- статус задан. «Новые» использует «Просрочена»/error; «В работе» — «В работе»/ info, «Едет на погрузку»/warning, «Просрочена»/error, «Осуществляется доставка»/success и «На погрузке»/warning; «Ожидают оплаты» — «Ожидает подтверждения»/info и «Ожидает оплаты»/warning; «Архивные» — «Закрыта»/ success и «Отменена»/error.В contained/paginated Table scroll frame является flex-контейнером с
overflow: visibleи безpadding-inline-end. Viewport используетinline-size: 100%,overflow: autoиscrollbar-gutter: stable; native scrollbar gutter резервируется внутри rail, без правого внешнего продолжения.Sidebar menu использует
overflow-x: hiddenи внешний gutter--space-300через равные отрицательный margin и padding. Collapsed Sidebar не создаёт horizontal scroll; тот же/logo/Logo.svgостаётся на x=12, а wrapper клипует только текст логотипа.Collapse Tooltip не содержит разделительную интерпункцию. На macOS он показывает «Свернуть ⌘ B» / «Развернуть ⌘ B», на Windows/Linux — «Свернуть Ctrl B» / «Развернуть Ctrl B»; между modifier и
Bиспользуется thin space U+2009.Поясняющий
<p>в delete Modal использует--typography-body-horseregular без bold.
Все правила этого раздела реализованы локально; они не добавляют backend или production integration.
Tab transition, fixed columns, and row actions
Текущая M-002 реализация использует лёгкое, едва заметное переключение вкладок:
- визуальные состояния Tab Standard меняют цвет текста, underline и Badge за
--duration-fastс--ease-out; - обёртка содержимого таблицы при смене вкладки переходит только от
opacity: 0.9кopacity: 1за--duration-fastс--ease-standard; - переход не сдвигает соседние вкладки, Header Widget, Filter Row, sticky header, fixed columns или action column и не блокирует keyboard/pointer interaction;
- при смене вкладки Table сохраняет внешнюю геометрию, а horizontal scroll viewport сбрасывается в начало;
- при
prefers-reduced-motion: reducetransition вкладки и animation содержимого полностью отключаются; выбранное состояние и содержимое заменяются сразу.
Fixed-конфигурация поколоночная и зависит от активной вкладки:
- «Предварительные» не фиксируют ни одной колонки;
- «Новые», «В работе», «Ожидают оплаты» и «Архивные» фиксируют
ID / статусиТип заявкислева, а действия справа; - Table не получает screen-specific ID колонок по умолчанию: экран передаёт
конфигурацию активной вкладки через существующий
WblTableColumn.fixedColumn.
Состав действий строк реализован по отдельным read-only refs и выбранной роли.
Текстовые команды передаются с overflow: true. На вкладках «Новые», «В
работе» и «Ожидают оплаты» строка с комментарием показывает рядом с More trigger
direct icon-only действие «Комментарий» с variant: 'flat-primary', иконкой
message-lines, showLabel: false и полным текстом комментария в
tooltipText. Tooltip доступен по hover/focus; label остаётся accessible name:
- «Предварительные»: overflow «Редактировать» и «Удалить»; Comment нет.
- «Архивные»: только overflow «Посмотреть детали»; Comment нет, архив read-only для всех ролей.
- «Новые»: старший логист видит overflow «Удалить» для просроченной строки; для остальных — «Взять в работу», отделённое «Редактировать», «Удалить». Поставщик и главный поставщик видят «Удалить» для просроченной строки, иначе «Взять в работу». Менеджер продаж видит «Посмотреть детали». Администратор видит «Создать основную заявку» для автоматической заявки, иначе «Посмотреть детали». Direct Comment добавляется в любом из этих вариантов только при непустом комментарии строки. [S23]
- «В работе»: «Снять перевозчика» доступно только старшему логисту для автоматической заявки не в статусах «На погрузке» и «Осуществляется доставка»; direct Comment добавляется при непустом комментарии. [S24]
- «Ожидают оплаты»: всегда доступно overflow «Посмотреть детали»; direct Comment добавляется при непустом комментарии; «Скопировать» добавляется для статуса «В работе», а «Снять перевозчика» в этом статусе видит только старший логист. [S25]
Table Cell передаёт separatorBefore в Dropdown, поэтому separator перед
«Редактировать» остаётся частью screen-owned массива действий. Команды являются
fixture-заглушками, кроме уже описанного удаления; backend-навигация и mutations
не добавлены.
Sorting, filters, request types, and table scrollbar
Текущий локальный fixture-сценарий реализует следующие Figma-аннотации:
Sorting
- Во вкладках «Новые», «В работе», «Ожидают оплаты» и «Архивные» sortable
становятся
ID,Дата созданияиДата подачи машины. [S26] [S27] [S28] [S29] IDсравнивается через существующийlocaleCompareсnumeric: true. Значения форматаDD.MM.YYYY HH:mmраспознаются Table и сравниваются хронологически, поэтому обе даты не зависят от строкового порядка.- Исходный sort для этих вкладок —
Дата созданияпо убыванию. - Table Header сохраняет controlled
aria-sort, текущий cycle и Tooltip «Сортировать»; конкретный comparator и набор sortable columns остаются ответственностью Table и экрана. - Поведение «Предварительных» остаётся без изменений.
Filter availability and state
- Filter Row хранит applied values и controlled
openedFilterIdотдельно для каждой вкладки.Тип заявки(когда показан) иID—pinnedcontrols; каждый пункт add-filter —optional. Семантическое действие pinned control сбрасывает только его screen-owned значение; действие optional control очищает его значение и скрывает control. - Меню добавления фильтра исключает уже показанные controls, открывает новый optional control и использует полный каталог первой и второй итераций:
| Вкладка | Количество | Добавляемые фильтры |
|---|---|---|
| «Новые» | 10 | Маршрут, Номер ТС, Статус, Точка отправления, Точка назначения, Ответственный, Грузовладелец, Перевозчик, Номер прицепа, Водитель |
| «В работе» | 12 | набор «Новых» плюс Транспортное задание и Отгрузка |
| «Ожидают оплаты» | 11 | набор «В работе» без Отгрузка |
| «Архивные» | 12 | тот же набор, что у «В работе» |
- «Показать просроченные» остаётся отдельным switch вкладки «Новые» и не считается добавляемым dropdown-filter.
Статус— multiselect;Маршрут— searchable multiselect. Остальные новые поля — searchable single select. Все options строятся из статических fixtures активной вкладки.- Applied filters фильтруют только статические fixtures. При закрытии пустого
optional control он удаляется. «Сбросить фильтры» очищает значения,
visibleOptionalиopenedFilterIdтекущей вкладки, возвращая полный каталог в add-filter menu; состояние остальных вкладок сохраняется.
Request types
- «Предварительные» допускают только
Мебель,Внешний поставщикиТМЦ склада; другие типы в этой вкладке не показываются. [S34] - «Новые», «В работе» и «Архивные» используют 11 значений:
Стандартный,Стандартный новый,Автоматическая,Мебель,Внешний поставщик,Прочее,ТМЦ склада,Технический ПЛ,Перегон ТС,Обслуживание или ремонт ТС,Коммерческая. [S35] [S36] [S38] - «Ожидают оплаты» содержит только тип
Коммерческая; скрытый в текущей версии type-filter не добавляется обратно только ради одного значения. [S37] - Option sets задаёт экран. Filter Dropdown Select не хранит глобальный каталог типов и не переносит выбор между вкладками.
Contained table scrollbar
- В contained-scroll Table
.wbl-table__scroll-frameиспользует flex,overflow: visibleи не резервирует внутренний padding. Viewport имеетinline-size: 100%,overflow: autoиscrollbar-gutter: stable. - Нативный vertical scrollbar резервирует место внутри Table viewport: Table, scroll frame и viewport имеют те же внешние inline-границы, что и выбранный Main Container rail. Gutter не создаёт внешнего продолжения и не перекрывает header, cells или действия строк. Вертикальная и горизонтальная прокрутка принадлежат одному доступному Table viewport; новый публичный input не добавлен.
Fixed columns, interaction polish, roles, and fixtures
Table geometry and feedback
- Зафиксированные слева/справа колонки остаются визуально неподвижны при
горизонтальной прокрутке данных. Table рассчитывает
fixedOffsetиз ширин предыдущих fixed columns и нативно закрепляет их черезinset-inline-start/inset-inline-end; scroll-driven transforms/signals не используются. Browser-проверка приscrollLeft0 и 1200 сохраняет левые колонки на x=92–228 и x=228–452, правую — на x=1177–1249. Новый public API не добавлен. - Переключение вкладки, роли, состояния или набора row actions не меняет внешний
размер Table viewport, позиции fixed columns и ширину action column. Action
column во всех вкладках равна 68px. Ячейка выравнивает группу вправо, использует
8px inline padding и gap 4px: одна кнопка остаётся у правого края, а две
занимают
24 + 4 + 24 + 16 = 68px. - Success/error Toast находится на 16px от левого и на 32px от нижнего края viewport. Это screen-owned placement, которое не меняет Toast API или его retained-exit lifecycle.
- Каждая вкладка имеет собственные воспроизводимые
loading,empty,errorиfiltered-emptyсостояния. Они применяются к выбранной вкладке с учётом активной роли; вfiltered-emptyпод текстом результата нет divider.
| Вкладка | Loading | Empty | Filtered empty | Error |
|---|---|---|---|---|
| «Предварительные» | «Загружаем предварительные заявки...» | «Предварительных заявок пока нет»; «Чтобы создать предварительную заявку, нажмите на кнопку вверху страницы „Создать заявку“». | «Предварительные заявки не найдены.» | «Не удалось загрузить предварительные заявки» |
| «Новые» | «Загружаем новые заявки...» | «Новых заявок пока нет»; «Новые заявки появятся здесь после создания.» | «Новые заявки не найдены.» | «Не удалось загрузить новые заявки» |
| «В работе» | «Загружаем заявки в работе...» | «Заявок в работе пока нет»; «Взятые в работу заявки появятся здесь.» | «Заявки в работе не найдены.» | «Не удалось загрузить заявки в работе» |
| «Ожидают оплаты» | «Загружаем заявки, ожидающие оплаты...» | «Заявок, ожидающих оплаты, пока нет»; «Заявки появятся здесь после завершения перевозки.» | «Заявки, ожидающие оплаты, не найдены.» | «Не удалось загрузить заявки, ожидающие оплаты» |
| «Архивные» | «Загружаем архивные заявки...» | «Архивных заявок пока нет»; «Закрытые и отменённые заявки появятся здесь.» | «Архивные заявки не найдены.» | «Не удалось загрузить архивные заявки» |
У всех filtered-empty состояний caption «Попробуйте изменить фильтры», у error — «Проверьте подключение к интернету и попробуйте ещё раз.». Loading не имеет caption.
Cell and sort motion
- Line Clamp Popup смещается относительно origin на
-1pxпо inline-start и block-start, совпадает border с верхней границей ячейки и принимает ширину originating Table Cell. Enter/leave используют opacity и translate за 140ms; при reduced motion переход отключается без изменения pointer-only semantics. - Sort control всегда резервирует место. Иконка появляется через opacity/scale
на hover или в sorted-состоянии, а
arrow-upповорачивается на 180 градусов для descending; оба перехода используют--duration-fastи--ease-standard, отключаются при reduced motion и не задерживаютaria-sortили сортировку.
Actions and fixture content
- В role/status action matrix «Комментарий» является optional per-row direct
icon-only action с
{ id: 'comment', label: 'Комментарий', variant: 'flat-primary', iconName: 'message-lines', showLabel: false, tooltipText: <полный текст комментария> }. Он доступен только во вкладках «Новые», «В работе» и «Ожидают оплаты», показывает Tooltip по hover/focus и не открывает production route или mutation. Fixtures содержат разные длинные комментарии и строки без комментария. - Статические fixture-наборы разнообразны по типам, статусам, маршрутам, ответственным, перевозчикам, водителям, ТС, прицепам и значениям документов; часть строк намеренно не имеет назначения, отгрузки, перевозчика, водителя, ТС или прицепа.
- Для commercial row «Детали» показывает description
Грузовладелец: <название>через существующую primary/description композицию Table Cell.
Role switcher island and visibility matrix
Role switcher island — screen-only fixture control для проверки матрицы семи
ролей. aside имеет доступное имя «Роль для просмотра интерфейса», показывает
выбранную роль и атомарно обновляет tabs, rows, filters, states и actions. Он не
моделирует production authentication, permissions API или persistence.
supplierиmain-supplierимеют одинаковые права на данные: видят «Новые», «В работе» и «Архивные», не видят «Предварительные» и «Ожидают оплаты», а строки, забранные другим перевозчиком, исключаются. В архиве остаются только доступные заявки своего перевозчика. [S39] [S40] [S42]sales-managerвидит только commercial rows и действие «Посмотреть детали»; вкладка «Ожидают оплаты» скрыта. В архиве некоммерческие заявки не показываются. [S39] [S40] [S42]senior-logisticвидит все вкладки и оба статуса во вкладке «Ожидают оплаты». Он может удалить любую «Новую» заявку до взятия в работу, включая чужую, commercial и основную автоматическую. Во вкладке «В работе» может снять перевозчика только у основной автоматической заявки в разрешённом статусе; после взятия удаление недоступно. Архив read-only. [S39] [S40] [S41] [S42]administratorвидит все вкладки и строки. Для новой автоматической заявки он получает «Создать основную заявку», для другой новой — «Посмотреть детали»; universal delete старшего логиста не получает. [S39] [S40]- Во вкладке «Ожидают оплаты»
senior-commercial-logisticвидит только статус «В работе», специалист по документам — только «Ожидает оплаты», старший логист — оба статуса. Для первых двух ролей filterСтатусскрыт;supplier,main-supplierи менеджер продаж не видят вкладку. [S41] senior-commercial-logisticвидит «В работе», «Ожидают оплаты» и «Архивные»;document-specialist— «Ожидают оплаты» и «Архивные». Архив всегда read-only. [S42]
Кнопка «Создать заявку» доступна senior-logistic, main-supplier,
sales-manager и administrator. По умолчанию и при неизвестном role
выбирается senior-logistic; при недоступной для новой роли текущей вкладке
экран выбирает первую разрешённую. Во вкладке «Ожидают оплаты» filter Статус
скрыт для senior-commercial-logistic и document-specialist.
Purpose
Экран позволяет открыть раздел «Заявки на транспорт» внутри «Логистика внешняя» и просмотреть записи в плотной desktop-таблице. Figma подтверждает поля ID, тип заявки, маршрут, ответственного и дату создания; бизнес-сценарии требуют отдельного продуктового контракта. [S1] [S3]
Source and Route
- Визуальный источник: Figma file
uGBDiLA947AJwkuvpohikQ, node16970:22753. Узел прошёл свежую проверку через design context, variables и screenshot. [S3] - Точка входа: существующий пункт
external-logistics-transport-requests(«Заявки на транспорт») внутри раздела «Логистика внешняя». [S1] - Route:
/transport-requests. - Управляемые fixture-состояния доступны на
/transport-requests?state=loading,?state=empty,?state=filtered-emptyи?state=error;?tab=<TabId>и?role=<RoleId>выбирают вкладку и роль, поэтому параметры можно объединять для проверки per-tab copy и role-filtered data. Ошибочный результат удаления — на/transport-requests?deleteResult=error. - Source files:
src/app/features/transport-requests/transport-requests.component.ts,.html,.scssи.spec.ts. [S4] [S5] - Выходы в карточку, форму редактирования или другой экран не определены.
Primary Scenario
Текущий сценарий fixture-версии:
- Пользователь выбирает «Заявки на транспорт» в «Логистика внешняя».
- Shell показывает заголовок «Заявки на транспорт», primary action «Создать заявку», вкладки «Предварительные», «Новые», «В работе», «Ожидают оплаты» и «Архивные», Filter Row и таблицу. По умолчанию выбрана вкладка «Предварительные» со счётчиком 23. [S3]
- Filter Row показывает постоянные фильтры «Тип заявки» и «ID» там, где они применимы, позволяет добавить per-tab каталог optional filters и фильтрует fixtures активной вкладки.
- Доступные действия зависят от вкладки и статуса строки согласно текущей action-матрице выше. «Удалить» запускает подтверждение и success/error feedback; остальные команды остаются визуальными fixture-заглушками.
Alternate Scenarios
- Экран открывается по прямому URL
/transport-requestsи через пункт Sidebar. - Действия строки зависят от вкладки, fixture-статуса и одной из семи ролей по текущей матрице выше; optional direct «Комментарий» может оставаться единственным действием строки на трёх рабочих вкладках.
- Переключение вкладки восстанавливает отдельное состояние её фильтров.
- Query-параметры
state,tab,roleиdeleteResultвыбирают воспроизводимые fixture-сценарии для QA; неизвестные значения возвращают безопасные значения по умолчанию.
States, Errors, and Edge Cases
- Реализованы взаимоисключающие состояния ready, loading, empty, filtered-empty и load-error. Access denied и production network semantics не определены.
- Длинные значения и горизонтальный overflow должны оставаться внутри Table.
Текущая вкладка «Предварительные» использует ID 112px, тип заявки 196px,
маршрут
minmax(376px, 1fr), ответственного 244px, дату создания 160px и действия 68px. Screen-owned preliminary class задаёт Table inner, header и rowsinline-size/min-inline-size: 100%, поэтому таблица заполняет rail без пустой области и ненужного horizontal overflow. Дата создания отсортирована по убыванию. [S3] - Действие «Удалить» имеет danger-семантику и отдельное доступное имя; fixture- строка меняется только после подтверждения в Modal и успешного результата.
Data and Integration Boundary
- Данные — статические fixtures для визуального handoff; первая порция содержит 18 строк, следующая — 12.
- Backend API, загрузка, мутации, сохранение, права, production navigation и мобильная адаптация не входят в текущий контракт.
- Вкладка «Предварительные» использует компактный набор
ID,Тип заявки,Маршрут,Ответственный,Дата созданияи действия. Остальные вкладки используют точные расширенные наборы выше и status Badge под ID. Все строки остаются статическими fixtures. [S3] [S19] [S20] [S21] [S22] - Расширенные вкладки сохраняют реальную
max-contentширину Table inner и grid rows. Для «Предварительных» screen-owned class задаёт inner/header/rowsinline-sizeиmin-inline-size: 100%. - Filter Row реализован существующей композицией
component.filter-rowс projected select-контролами, добавлением optional filters и reset активной вкладки. Поиск, switches, column settings и more-actions скрыты; download- action остаётся визуальной заглушкой. - Figma показывает в action-cell один trigger
more-vert. Table Cell поддерживает явныйoverflow, а конкретный набор меню зависит от вкладки и статуса согласно action-матрице выше. [S2] [S3] [S23] [S24] [S25]
D-039 Filter Row behavior
The current fixture implementation uses the lifecycle contract above. Changing the active tab keeps each tab's filter values and visible optional controls separate; reset applies only to the active tab. These rules do not add a backend, persistence, or production permissions contract. [S43] [S44] [S45]
Components and Accessibility
- Sidebar предоставляет существующую точку входа; App shell связывает её с маршрутом и показывает целевой экран со свёрнутым Sidebar, как в подтверждённом Figma-состоянии. [S1] [S3] [S4]
- Main Container сохраняет общий desktop-rail и делегирует вертикальную прокрутку Table viewport на этом экране.
- Header Widget показывает H1, primary action «Создать заявку» и пять подтверждённых вкладок со счётчиками 23, 43, 54, 24 и 146. [S3]
- Table владеет Filter Row, вертикальным и горизонтальным overflow viewport строк и отображением typed cells.
- Filter Row используется как рабочая панель с постоянными и optional filter controls.
- Table Cell рендерит строковые действия
через
type: 'actions'; каждому действию нужен отдельный русский accessible name. Для расширенных вкладок тот же компонент рендерит status Badge под ID черезbadgeText/badgeAppearance. Удаление не должно полагаться только на цвет. - Заголовки колонок должны быть связаны с ячейками, строки иметь устойчивые
уникальные ID и осмысленные
ariaLabel, а иконки действий — tooltip и label.
Related Flows
Межэкранный flow не определён. Переход к редактированию остаётся за пределами M-002, пока не задан destination. Удаление выполняется внутри текущего экрана через Modal и Toast и не создаёт отдельного route.
Verification
Для Angular-прототипа прошли focused tests, включая:
- route и связка Sidebar с shell-state — unit-тестами AppComponent;
- заголовок, пять вкладок и счётчики, отдельное состояние фильтров по вкладкам, Type/select-all, optional filters и reset;
- numeric-сортировку ID, chronological-сортировку
DD.MM.YYYY HH:mmдат, initial 18 + batch 12 infinite scroll, отсутствие Pagination, fixedColumn opt-out и длинный маршрут; - loading, empty, filtered-empty, error, подтверждение удаления и success/error Toast;
- четыре tab-specific column sets, status Badge под ID, new-only overdue switch, скрытый type filter в awaiting-payment, scrollbar geometry внутри rail, collapsed Sidebar geometry/tooltip, regular delete body, полные per-tab catalogs фильтров и request types.
Browser QA подтвердил готовый экран, фильтр Type с «Выбрать все», optional filters, текстовые пункты row actions, delete modal/success Toast и управляемые loading, empty, filtered-empty и error-состояния. Визуальная структура сверена с точными Figma-узлами [S3] [S6] [S7] [S8] [S9] [S11] [S12] [S13] [S14].
Open Questions
- Какой route или другой destination должен открывать пункт «Редактировать»?
- Какие production permissions и backend-контракты применяются к загрузке, фильтрации и удалению заявок?
- Каковы размер порции, условие окончания списка и retry-контракт для infinite scroll после подключения production API?
- Должен ли download-action стандартного Filter Row получить бизнес-обработчик или быть скрыт в интеграционной версии?
Documentation Review
Документация и Angular-прототип обновлены в задаче M-002 по локальным Git-контрактам и точной пользовательской ссылке на Figma. Figma, tokens и assets не изменялись. Обновлены feature-код, route, focused tests и Storybook stories.