Добавление функционала пагинации задач в Telegram-бот

🔧 Изменения:
- Добавлено поле `currentTasksList` в контекст сессии для хранения текущего списка задач.
- Реализована логика очистки данных пагинации при переходе в главное меню.
- Добавлены методы для обработки пагинации задач и отображения текущей страницы задач.
- Обновлено отображение задач с учетом пагинации и общего количества страниц.

 Теперь пользователи могут удобно просматривать задачи с возможностью навигации по страницам.
This commit is contained in:
Bivekich
2025-07-27 21:08:34 +03:00
parent 45431ba6c2
commit 84d1f25a69

View File

@ -19,6 +19,11 @@ interface BotContext extends Context {
reminderMinutesBefore?: number; reminderMinutesBefore?: number;
}>; }>;
taskId?: number; taskId?: number;
currentTasksList?: {
tasks: Task[];
title: string;
type: 'my' | 'shared' | 'partner';
};
[key: string]: any; [key: string]: any;
}; };
} }
@ -110,6 +115,11 @@ export class TelegramBotService implements OnModuleInit {
} }
private async showMainMenu(ctx: BotContext, user: User) { private async showMainMenu(ctx: BotContext, user: User) {
// Очищаем данные пагинации при переходе в главное меню
if (ctx.session?.currentTasksList) {
delete ctx.session.currentTasksList;
}
const partner = await this.userService.getPartner(user.id); const partner = await this.userService.getPartner(user.id);
const partnerName = partner ? partner.getFullName() : 'Партнер'; const partnerName = partner ? partner.getFullName() : 'Партнер';
const partnerEmoji = partner ? partner.getRoleEmoji() : '👤'; const partnerEmoji = partner ? partner.getRoleEmoji() : '👤';
@ -200,6 +210,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
else if (data === 'partner_tasks') { else if (data === 'partner_tasks') {
await this.showPartnerTasks(ctx); await this.showPartnerTasks(ctx);
} }
// Пагинация задач
else if (data.startsWith('tasks_page_')) {
await this.handleTasksPagination(ctx, data);
}
// Управление задачами // Управление задачами
else if (data.startsWith('task_')) { else if (data.startsWith('task_')) {
await this.handleTaskAction(ctx, data); await this.handleTaskAction(ctx, data);
@ -266,7 +280,8 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
ctx.session = { ctx.session = {
...ctx.session, ...ctx.session,
step: 'task_title', step: 'task_title',
taskData: {} taskData: {},
currentTasksList: undefined // Очищаем данные пагинации
}; };
const keyboard = Markup.inlineKeyboard([ const keyboard = Markup.inlineKeyboard([
@ -615,7 +630,11 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
return; return;
} }
// Показываем первые 5 задач с кнопками для навигации // Сохраняем контекст в сессии и показываем первые 5 задач
ctx.session = {
...ctx.session,
currentTasksList: { tasks, title: 'Мои задачи', type: 'my' }
};
await this.showTasksList(ctx, tasks, 'Мои задачи', 0); await this.showTasksList(ctx, tasks, 'Мои задачи', 0);
} }
@ -642,6 +661,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
return; return;
} }
ctx.session = {
...ctx.session,
currentTasksList: { tasks, title: 'Общие задачи', type: 'shared' }
};
await this.showTasksList(ctx, tasks, 'Общие задачи', 0); await this.showTasksList(ctx, tasks, 'Общие задачи', 0);
} }
@ -688,12 +711,23 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
return; return;
} }
await this.showTasksList( const partnerTitle = `Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`;
ctx, ctx.session = {
partnerTasks, ...ctx.session,
`Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`, currentTasksList: { tasks: partnerTasks, title: partnerTitle, type: 'partner' }
0 };
); await this.showTasksList(ctx, partnerTasks, partnerTitle, 0);
}
private async handleTasksPagination(ctx: BotContext, data: string) {
const pageNumber = parseInt(data.replace('tasks_page_', ''));
if (isNaN(pageNumber) || !ctx.session?.currentTasksList) {
await ctx.answerCbQuery('❌ Ошибка навигации');
return;
}
const { tasks, title } = ctx.session.currentTasksList;
await this.showTasksList(ctx, tasks, title, pageNumber);
} }
private async showTasksList(ctx: BotContext, tasks: Task[], title: string, page: number = 0) { private async showTasksList(ctx: BotContext, tasks: Task[], title: string, page: number = 0) {
@ -702,7 +736,12 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
const endIndex = Math.min(startIndex + pageSize, tasks.length); const endIndex = Math.min(startIndex + pageSize, tasks.length);
const pageTasks = tasks.slice(startIndex, endIndex); const pageTasks = tasks.slice(startIndex, endIndex);
let message = `📋 *${title}* (${tasks.length})\n\n`; const totalPages = Math.ceil(tasks.length / pageSize);
let message = `📋 *${title}* (${tasks.length})\n`;
if (totalPages > 1) {
message += `📄 Страница ${page + 1} из ${totalPages}\n`;
}
message += '\n';
const buttons: any[][] = []; const buttons: any[][] = [];