Skip to content

fix(filter-bar): keep a short pipe name from collapsing, cap the whole pipe at its max-width token (#DS-5588) - #2073

Merged
lskramarov merged 5 commits into
mainfrom
fix/DS-5588
Sep 23, 2026
Merged

lskramarov merged 5 commits into
mainfrom
fix/DS-5588

Conversation

@lskramarov

@lskramarov lskramarov commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Имя пайпа в filter-bar схлопывалось до одного символа рядом с длинным значением. Имя и значение были flex-элементами с overflow: hidden, который обнуляет автоматический минимальный размер, поэтому flexbox отбирал у обеих частей одинаковую долю: значение из 48 символов теряло 8 и оставалось читаемым, а имя из 3 символов теряло 1 и рисовалось как «Т…».

Теперь это два сжимаемых grid-трека minmax(0, max-content): часть, которой нужно меньше своей доли, сохраняет её целиком и отдаёт остаток соседу, а две длинные части делят строку поровну. Grid при этом никогда не режет часть, которую не резал flex.

20-символьная эвристика KbqPipeMinWidth, раньше защищавшая короткую часть, больше не применяется: её не было на пайпах multi-select, date и datetime и на значении multi-tree-select, перемер шёл только на смену filterBar.filter(), а порог был обрывом — имя ровно из 20 символов защиты уже не получало. Класс остаётся экспортом и помечен @deprecated: его удаление — breaking change с миграцией.

--kbq-filter-bar-pipe-max-width теперь задаёт ширину всего пайпа: правило переехало с .kbq-button-wrapper внутри триггера на базовый класс .kbq-pipe, который каждому пайпу, включая кастомные, ставит KbqBasePipe. Раньше токен ограничивал только подпись — при 320px длинный пайп был 344px, с кнопкой очистки 374px, а кастомный пайп с триггером не на kbq-button не ограничивался вовсе. Цепочка min-width: 0 не нужна: у grid-треков подписи нет min-content, и триггер ужимается до собственных паддингов. Пайп input исключён — его явная ширина --kbq-filter-bar-pipe-input-width побеждает.

Тултип пайпа (kbq-title) не открывался, когда часть обрезана соседом: директива сравнивала полную ширину каждого #kbqTitleText с шириной всего контейнера, а текст такой части в контейнер помещается. При нескольких #kbqTitleText обрезанной теперь считается и часть, которая уже собственного текста. Хосты с одним текстом измеряются как раньше, вместе с обработкой субпикселей.

List of notable changes:

  • updated раскладка пайпа: имя и значение — два grid-трека вместо flex-элементов;
  • updated --kbq-filter-bar-pipe-max-width ограничивает весь пайп вместе с кнопками очистки и удаления; пайп input исключён;
  • fixed kbq-title: при нескольких #kbqTitleText тултип открывается и тогда, когда часть обрезана соседом;
  • deprecated KbqPipeMinWidth; атрибут снят с шаблонов Select, TreeSelect, MultiTreeSelect, Text и ReadOnly и с примера кастомного пайпа в документации;
  • added в e2e-сценарий E2eFilterBarPipeTruncation пайп с коротким именем и длинным значением (multi-select, с кнопкой удаления) и пайп input;
  • added тесты: короткое имя сохраняет полную ширину; две длинные части делят место поровну; при токене 200px ни один пайп, кроме input, не шире 200px и кнопка удаления внутри, а input остаётся 240px; тултип пайпа открывается, когда соседи обрезали части, каждая из которых помещается в контейнер; то же для kbq-title в юнит- и e2e-тестах самой директивы.

What should reviewers focus on?

  • Скриншоты. Нужен ещё один /approve-snapshots для 01-* — локального Docker нет, первый раунд покрыл только grid. Геометрия трёх скриншотных маршрутов измерена до и после переноса кэпа: меняется только E2eFilterBarStates — длинные text-пайпы 344 → 320px, datetime 338/374 → 320px, и первый ряд перестраивается (cleanable text-пайп поднимается в него). 02-filters-* и 03-option-caption-* совпали, так что их расхождение было бы поводом остановиться. Правка kbq-title на скриншоты не влияет: она меняет только то, откроется ли тултип при наведении.
  • Смысл токена изменился. Для потребителей, задавших --kbq-filter-bar-pipe-max-width, он теперь означает ширину всего пайпа, а не области подписи: при тех же 320px подписи достаётся на 23px меньше, у пайпа с кнопкой очистки — на 54px. Заметно уже на значениях по умолчанию: диапазон дат в E2eFilterBarStates теперь обрезается (237 из 255px, с кнопкой очистки 198 из 255px) — и теперь с тултипом.
  • Общая директива. Правка kbq-title затрагивает только хосты с несколькими #kbqTitleText: в библиотеке это пайпы filter-bar, в документации — примеры «Multiple text elements» и «List option». Новая проверка требует ненулевой clientWidth, поэтому inline-части, которые ничего не обрезают, её не проходят. Весь юнит-набор components (5711 тестов) и e2e kbq-title, включая субпиксельные случаи, зелёные. Проверил в обе стороны: без правки новые юнит- и e2e-тесты падают.
  • Деление поровну при двух длинных частях — это дизайн-решение, а не побочный эффект раскладки.

Пересекается с #2064, который решает ту же задачу тем же способом и тоже переносит max-width на .kbq-pipe, но добавляет цепочку min-width: 0 (по замеру она ничего не меняет) и новую публичную директиву KbqPipeTitle — здесь тот же тултип починен в общем kbq-title.

Задача: DS-5588.

…g value (#DS-5588)

The pipe's name and value were flex items with `overflow: hidden`, which drops their automatic
minimum size to zero, so flexbox took the same percentage from both. A three-character name gave
up as much of itself as a forty-character value gave up of its own, and rendered as one glyph.

They are now two shrinkable `minmax(0, max-content)` grid tracks: a part that asks for less than
its share keeps all of it and hands the rest to its neighbour, and two long parts split the row
evenly. Measured against the old layout, only the pipe whose name and value are both too long
moves at all (168/148px to 160/156px), plus one pixel of rounding on a date range.

`KbqPipeMinWidth`, the 20-character heuristic that used to protect the short part, is no longer
applied: it never reached the multi-select, date and datetime pipes, re-measured only when the
whole filter changed, and could not express the split. It stays exported and is now deprecated.
@github-actions github-actions Bot added the bug Something isn't working label Sep 18, 2026
@lskramarov lskramarov self-assigned this Sep 18, 2026
@github-actions

github-actions Bot commented Sep 18, 2026

Copy link
Copy Markdown

Visit the preview URL for this PR (updated for commit 9ab977f):

https://koobiq-next--prs-2073-45y0g7gy.web.app

(expires Fri, 25 Sep 2026 12:08:06 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: c9e37e518febda70d0317d07e8ceb35ac43c534c

@github-actions

Copy link
Copy Markdown

🚨 E2E tests failed

Review the report for details.


💡 Comment /approve-snapshots to approve snapshot changes.

@lskramarov

Copy link
Copy Markdown
Contributor Author

/approve-snapshots

@github-actions

Copy link
Copy Markdown

🔄 Updating snapshots.

@github-actions

Copy link
Copy Markdown

✅ Snapshots updated!

@lskramarov
lskramarov requested a review from rmnturov September 22, 2026 09:28
@lskramarov
lskramarov marked this pull request as ready for review September 22, 2026 09:28
…h (#DS-5588)

The token sat on `.kbq-button-wrapper` inside the trigger, so it capped only the label. At 320px
a long pipe measured 344px and one with a clear button 374px, and a custom pipe whose trigger is
not a `kbq-button` was not capped at all. It now sits on `.kbq-pipe`, which every pipe gets from
`KbqBasePipe`, and caps the pipe together with its clear and remove buttons.

No `min-width: 0` is needed on the way down, since the label's grid tracks have no min-content and
the trigger gives way down to its own paddings. The input pipe keeps its explicit width.
@github-actions

Copy link
Copy Markdown

🚨 E2E tests failed

Review the report for details.


💡 Comment /approve-snapshots to approve snapshot changes.

@lskramarov lskramarov changed the title fix(filter-bar): keep a short pipe name from collapsing next to a long value (#DS-5588) fix(filter-bar): keep a short pipe name from collapsing, cap the whole pipe at its max-width token (#DS-5588) Sep 22, 2026
… elements (#DS-5588)

With several `#kbqTitleText` elements the directive compared each one's full width with the whole
container, so a part that lost width to its siblings, while its text would still fit the container
on its own, was clipped without a tooltip. A filter-bar pipe hits this at its default max width: a
255px date range squeezed to 237px next to its name.

Such hosts now also count a text element that is narrower than its own text. Single-element hosts
keep the container comparison and its sub-pixel handling unchanged.
@lskramarov
lskramarov marked this pull request as draft September 22, 2026 10:29
@github-actions

Copy link
Copy Markdown

🚨 E2E tests failed

Review the report for details.


💡 Comment /approve-snapshots to approve snapshot changes.

@lskramarov

Copy link
Copy Markdown
Contributor Author

/approve-snapshots

@github-actions

Copy link
Copy Markdown

🔄 Updating snapshots.

@lskramarov
lskramarov marked this pull request as ready for review September 22, 2026 11:48
@github-actions

Copy link
Copy Markdown

✅ Snapshots updated!

@lskramarov
lskramarov merged commit 9a17f28 into main Sep 23, 2026
14 checks passed
@lskramarov
lskramarov deleted the fix/DS-5588 branch September 23, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants