Компактный диалог операции и кнопки, которые не уезжают

Пары Switch + Label заменены на Checkbox с встроенной подписью: строка
вместо трёх. Поля стали однострочными, чекбоксы дампа встали в ряд,
заголовок и имя базы слились в одну строку — диалог ужался с почти
целого экрана до 17-18 строк на любом размере консоли.

Ряд кнопок пропадал потому, что .dialog с height: auto складывал высоту
детей и упирался в max-height, обрезая нижнюю строку. Теперь у диалога
операции своя высота, а форма забирает остаток через height: 1fr и
скроллится сама. Диалог restore приведён к тому же виду.
This commit is contained in:
2026-08-20 05:36:01 +03:00
parent 9fdb02c72a
commit e8fd19714a
3 changed files with 129 additions and 72 deletions
+31 -3
View File
@@ -21,7 +21,7 @@ sys.path.insert(0, str(Path(__file__).parent))
import pg_stand_sync as core
import pg_stand_sync_tui as tui
from textual.widgets import Input, Switch
from textual.widgets import Checkbox, Collapsible, Input
PY = sys.executable
DBS = [("zpas", "1284 MB"), ("zpas_arch", "312 MB"), ("zpas_test", "88 MB"),
@@ -763,7 +763,7 @@ def test_db_dialog_carries_dump_options(cfg, monkeypatch):
await settle(app, pilot)
modal = await _open_db_dialog(app, pilot)
assert isinstance(modal, tui.DbOpModal)
modal.query_one("#schema-only", Switch).value = True
modal.query_one("#schema-only", Checkbox).value = True
modal.query_one("#compress", Input).value = "0"
modal.query_one("#ex-schemas", Input).value = "audit, tmp"
modal.action_start()
@@ -790,7 +790,7 @@ def test_autorestore_switch_picks_operation(cfg, monkeypatch):
async with app.run_test(size=(120, 40)) as pilot:
await settle(app, pilot)
modal = await _open_db_dialog(app, pilot)
switch = modal.query_one("#autorestore", Switch)
switch = modal.query_one("#autorestore", Checkbox)
assert switch.value is True # главный сценарий по умолчанию
switch.value = False
await pilot.pause()
@@ -970,3 +970,31 @@ def test_ru_layout_covers_every_ctrl_hotkey():
if key.startswith("ctrl+") and len(key) == 6 and key[5].isascii():
twin = f"ctrl+{tui.RU_LAYOUT[key[5]]}"
assert pairs.get(twin) == action, f"нет двойника для {key}"
def test_op_dialog_fits_and_keeps_buttons_visible(cfg, monkeypatch):
"""Форма не должна выдавливать ряд кнопок за нижнюю границу диалога."""
app = make_app(cfg, monkeypatch)
async def scenario():
async with app.run_test(size=(80, 24)) as pilot:
await settle(app, pilot)
app.dashboard.open_db_op(autorestore=True)
for _ in range(40):
await pilot.pause()
if isinstance(app.screen, tui.DbOpModal):
break
modal = app.screen
modal.query_one(Collapsible).collapsed = False # самый длинный вариант формы
await pilot.pause()
dialog = modal.query_one(".dialog")
start = modal.query_one("#start")
assert dialog.size.height <= 24
assert start.region.height > 0
assert dialog.region.y <= start.region.y
assert start.region.bottom <= dialog.region.bottom
form = modal.query_one(".form")
assert form.virtual_size.height > form.size.height # длинное уезжает в скролл
await pilot.press("escape")
await pilot.pause()
asyncio.run(scenario())