diff --git a/service_desk/handlers.py b/service_desk/handlers.py index e9c9d0f..4db8c23 100644 --- a/service_desk/handlers.py +++ b/service_desk/handlers.py @@ -45,6 +45,12 @@ from utils.texts import ( sd_file_attached, 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 # 🔌 Импортируем централизованную функцию сбора статистики из main from utils.stats_logger import log_menu_stats @@ -338,20 +344,32 @@ async def sd_module_handler(msg: Message): # Инициализация шаблонов при первом входе в SD_MODE 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() if 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)} + # Пагинация по 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 = "" - for i, t in enumerate(templates): - template_menu_text += f"{EMOJI_DIGITS[str(i+1)]} - {t['name']}\n" + 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" 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]["step"] = "choose_template" + sd_sessions[user_id]["template_page"] = page + 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📄 Страница {page + 1} из {total_pages}" await msg.answer( f"Выберите шаблон для заявки:\n\n" - f"{template_menu_text}\n\n" + f"{template_menu_text}{page_info}\n\n" f"Или отправьте пропустить для создания без шаблона.", parse_mode="html" ) @@ -391,6 +409,59 @@ async def sd_module_handler(msg: Message): session["step"] = "need_text" await msg.answer(SD_MAIN_MENU_TEXT, parse_mode="html") 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📄 Страница {page + 1} из {total_pages}", + 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📄 Страница {page + 1} из {total_pages}", + 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", {}): template_id = session["template_names"][cmd] 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( f"Неверный номер. Выберите из списка:\n\n" f"{session.get('template_menu_text', '')}\n\n" - f"Или отправьте пропустить для создания без шаблона.", + f"7⃣ — Пред. страница\n8⃣ — След. страница\n9⃣ — Назад\n0⃣ — В меню", parse_mode="html" ) return