task_search: add pagination with inline navigation buttons

parent bc9c37a6
......@@ -29,6 +29,32 @@ def tasks_nav_kb(maintainer: str, branch: str, offset: int, total: int, per_page
return kb.get_markup()
def task_search_nav_kb(query: str, offset: int, total: int, per_page: int = 20):
if total <= per_page:
return None
kb = InlineKeyboard()
nav_buttons = []
if offset > 0:
nav_buttons.append(InlineButton(
text="← Назад",
callback_data=f"task_search/{query}/{offset - per_page}",
))
if offset + per_page < total:
nav_buttons.append(InlineButton(
text="Вперёд →",
callback_data=f"task_search/{query}/{offset + per_page}",
))
for btn in nav_buttons:
kb.add(btn)
kb.row()
return kb.get_markup()
def task_page_kb(task: int):
kb = InlineKeyboard()
kb.add(
......
......@@ -97,6 +97,9 @@ async def tasks_page_handler(
await cb.answer()
SEARCH_PER_PAGE = 20
@dp.message(Command("task_search", Argument("args", optional=True)))
async def task_search_handler(m: Message, args: str | None = None) -> None:
if not args:
......@@ -110,13 +113,42 @@ async def task_search_handler(m: Message, args: str | None = None) -> None:
if not tasks_data.tasks:
return await m.answer("Нет тасков.")
msg = ""
for task in tasks_data.tasks:
msg += await format_task_entry(task)
tasks = tasks_data.tasks
total = len(tasks)
page = tasks[:SEARCH_PER_PAGE]
query = "+".join(args.split())
await m.answer(
await format_tasks_page(page, 0, total),
reply_markup=tasks_keyboards.task_search_nav_kb(query, 0, total, SEARCH_PER_PAGE),
)
answer = (await m.answer(_bold("Таски:\n\n") + msg)).unwrap_or_none()
if answer is None:
await m.answer("Слишком много результатов, уточните поиск.")
@dp.callback_query(CallbackDataMarkup("task_search/<query>/<offset:int>"))
async def task_search_page_handler(
cb: CallbackQuery, query: str, offset: int,
) -> None:
args = query.split("+")
try:
tasks_data = await altrepo.api.task.progress.find_tasks(input=args)
except DataNotFoundError:
await cb.answer("Таски не найдены.")
return
if not tasks_data.tasks:
await cb.answer("Нет тасков.")
return
tasks = tasks_data.tasks
total = len(tasks)
page = tasks[offset:offset + SEARCH_PER_PAGE]
await cb.edit_text(
await format_tasks_page(page, offset, total),
reply_markup=tasks_keyboards.task_search_nav_kb(query, offset, total, SEARCH_PER_PAGE),
)
await cb.answer()
@dp.message(Command("task", Argument("task", [int_validator], optional=True)))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment