feat: пагинация шаблонов Service Desk по 10 на страницу

This commit is contained in:
2026-07-15 12:33:56 +07:00
parent efda2c8ae9
commit e07b546f08
+78 -7
View File
@@ -45,6 +45,12 @@ from utils.texts import (
sd_file_attached, sd_file_attached,
sd_file_upload_error, sd_file_upload_error,
) )
# Цифры для пагинации (1-0, 0 = 10)
DIGIT_MAP = {
"1": "1⃣", "2": "2⃣", "3": "3⃣", "4": "4⃣", "5": "5⃣",
"6": "6⃣", "7": "7⃣", "8": "8⃣", "9": "9⃣", "0": "0⃣"
}
from utils.texts import UNKNOWN_MAIN_CMD_TEXT from utils.texts import UNKNOWN_MAIN_CMD_TEXT
# 🔌 Импортируем централизованную функцию сбора статистики из main # 🔌 Импортируем централизованную функцию сбора статистики из main
from utils.stats_logger import log_menu_stats from utils.stats_logger import log_menu_stats
@@ -338,20 +344,32 @@ async def sd_module_handler(msg: Message):
# Инициализация шаблонов при первом входе в SD_MODE # Инициализация шаблонов при первом входе в SD_MODE
if user_id not in sd_sessions: if user_id not in sd_sessions:
sd_sessions[user_id] = {"step": "need_text", "files_queue": [], "post_create_queue": [], "templates": [], "template_names": {}, "template_menu_text": ""} sd_sessions[user_id] = {"step": "need_text", "files_queue": [], "post_create_queue": [], "templates": [], "template_names": {}, "template_menu_text": "", "template_page": 0}
templates = await get_sd_templates() templates = await get_sd_templates()
if templates: if templates:
sd_sessions[user_id]["templates"] = templates sd_sessions[user_id]["templates"] = templates
sd_sessions[user_id]["template_names"] = {str(i+1): str(t["id"]) for i, t in enumerate(templates)} sd_sessions[user_id]["template_names"] = {str(i+1): str(t["id"]) for i, t in enumerate(templates)}
# Пагинация по 10 шаблонов на страницу
per_page = 10
page = 0
total_pages = (len(templates) + per_page - 1) // per_page if templates else 1
start = page * per_page
end = start + per_page
page_items = templates[start:end]
template_menu_text = "" template_menu_text = ""
for i, t in enumerate(templates): for idx, t in enumerate(page_items):
template_menu_text += f"{EMOJI_DIGITS[str(i+1)]} - {t['name']}\n" num = idx + 1
digit = DIGIT_MAP[str(num)] if num <= 9 else "0⃣" if num == 10 else str(num)
template_menu_text += f"{digit} - {t['name']}\n"
sd_sessions[user_id]["template_menu_text"] = template_menu_text.strip() sd_sessions[user_id]["template_menu_text"] = template_menu_text.strip()
sd_workflow_logger.info(f"[Template] Loaded {len(templates)} templates for user {user_id}") sd_sessions[user_id]["template_page"] = page
sd_sessions[user_id]["step"] = "choose_template" sd_sessions[user_id]["template_per_page"] = per_page
sd_sessions[user_id]["template_total_pages"] = total_pages
sd_workflow_logger.info(f"[Template] Loaded {len(templates)} templates, page {page+1}/{total_pages}")
page_info = f"\n📄 <b>Страница {page + 1} из {total_pages}</b>"
await msg.answer( await msg.answer(
f"Выберите шаблон для заявки:\n\n" f"Выберите шаблон для заявки:\n\n"
f"{template_menu_text}\n\n" f"{template_menu_text}{page_info}\n\n"
f"Или отправьте пропустить для создания без шаблона.", f"Или отправьте пропустить для создания без шаблона.",
parse_mode="html" parse_mode="html"
) )
@@ -391,6 +409,59 @@ async def sd_module_handler(msg: Message):
session["step"] = "need_text" session["step"] = "need_text"
await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html") await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html")
return return
# Пагинация: 7 = пред, 8 = след, 9 = назад, 0 = в меню
if cmd in ["7", "пред", "prev"]:
page = session.get("template_page", 0)
if page > 0:
page -= 1
per_page = session.get("template_per_page", 10)
total_pages = session.get("template_total_pages", 1)
templates = session.get("templates", [])
start = page * per_page
end = start + per_page
page_items = templates[start:end]
template_menu_text = ""
for idx, t in enumerate(page_items):
num = idx + 1
digit = DIGIT_MAP[str(num)] if num <= 9 else "0⃣" if num == 10 else str(num)
template_menu_text += f"{digit} - {t['name']}\n"
session["template_menu_text"] = template_menu_text.strip()
session["template_page"] = page
sd_workflow_logger.info(f"[Template] Page {page+1}/{total_pages}")
await msg.answer(
f"Выберите шаблон:\n\n"
f"{template_menu_text}\n📄 <b>Страница {page + 1} из {total_pages}</b>",
parse_mode="html"
)
return
if cmd in ["8", "след", "next"]:
page = session.get("template_page", 0)
total_pages = session.get("template_total_pages", 1)
if page < total_pages - 1:
page += 1
per_page = session.get("template_per_page", 10)
templates = session.get("templates", [])
start = page * per_page
end = start + per_page
page_items = templates[start:end]
template_menu_text = ""
for idx, t in enumerate(page_items):
num = idx + 1
digit = DIGIT_MAP[str(num)] if num <= 9 else "0⃣" if num == 10 else str(num)
template_menu_text += f"{digit} - {t['name']}\n"
session["template_menu_text"] = template_menu_text.strip()
session["template_page"] = page
sd_workflow_logger.info(f"[Template] Page {page+1}/{total_pages}")
await msg.answer(
f"Выберите шаблон:\n\n"
f"{template_menu_text}\n📄 <b>Страница {page + 1} из {total_pages}</b>",
parse_mode="html"
)
return
if cmd in ["9", "0"]:
session["step"] = "need_text"
await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html")
return
if cmd in session.get("template_names", {}): if cmd in session.get("template_names", {}):
template_id = session["template_names"][cmd] template_id = session["template_names"][cmd]
template_name = next((t["name"] for t in session.get("templates", []) if str(t["id"]) == str(template_id)), "Неизвестно") template_name = next((t["name"] for t in session.get("templates", []) if str(t["id"]) == str(template_id)), "Неизвестно")
@@ -407,7 +478,7 @@ async def sd_module_handler(msg: Message):
await msg.answer( await msg.answer(
f"Неверный номер. Выберите из списка:\n\n" f"Неверный номер. Выберите из списка:\n\n"
f"{session.get('template_menu_text', '')}\n\n" f"{session.get('template_menu_text', '')}\n\n"
f"Или отправьте пропустить для создания без шаблона.", f"7⃣ — Пред. страница\n8⃣ — След. страница\n9⃣ — Назад\n0⃣ — В меню",
parse_mode="html" parse_mode="html"
) )
return return