✨ Добавление функционала пагинации задач в Telegram-бот
🔧 Изменения: - Добавлено поле `currentTasksList` в контекст сессии для хранения текущего списка задач. - Реализована логика очистки данных пагинации при переходе в главное меню. - Добавлены методы для обработки пагинации задач и отображения текущей страницы задач. - Обновлено отображение задач с учетом пагинации и общего количества страниц. ✅ Теперь пользователи могут удобно просматривать задачи с возможностью навигации по страницам.
This commit is contained in:
@ -19,6 +19,11 @@ interface BotContext extends Context {
|
||||
reminderMinutesBefore?: number;
|
||||
}>;
|
||||
taskId?: number;
|
||||
currentTasksList?: {
|
||||
tasks: Task[];
|
||||
title: string;
|
||||
type: 'my' | 'shared' | 'partner';
|
||||
};
|
||||
[key: string]: any;
|
||||
};
|
||||
}
|
||||
@ -110,6 +115,11 @@ export class TelegramBotService implements OnModuleInit {
|
||||
}
|
||||
|
||||
private async showMainMenu(ctx: BotContext, user: User) {
|
||||
// Очищаем данные пагинации при переходе в главное меню
|
||||
if (ctx.session?.currentTasksList) {
|
||||
delete ctx.session.currentTasksList;
|
||||
}
|
||||
|
||||
const partner = await this.userService.getPartner(user.id);
|
||||
const partnerName = partner ? partner.getFullName() : 'Партнер';
|
||||
const partnerEmoji = partner ? partner.getRoleEmoji() : '👤';
|
||||
@ -200,6 +210,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
else if (data === 'partner_tasks') {
|
||||
await this.showPartnerTasks(ctx);
|
||||
}
|
||||
// Пагинация задач
|
||||
else if (data.startsWith('tasks_page_')) {
|
||||
await this.handleTasksPagination(ctx, data);
|
||||
}
|
||||
// Управление задачами
|
||||
else if (data.startsWith('task_')) {
|
||||
await this.handleTaskAction(ctx, data);
|
||||
@ -266,7 +280,8 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
ctx.session = {
|
||||
...ctx.session,
|
||||
step: 'task_title',
|
||||
taskData: {}
|
||||
taskData: {},
|
||||
currentTasksList: undefined // Очищаем данные пагинации
|
||||
};
|
||||
|
||||
const keyboard = Markup.inlineKeyboard([
|
||||
@ -615,7 +630,11 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
return;
|
||||
}
|
||||
|
||||
// Показываем первые 5 задач с кнопками для навигации
|
||||
// Сохраняем контекст в сессии и показываем первые 5 задач
|
||||
ctx.session = {
|
||||
...ctx.session,
|
||||
currentTasksList: { tasks, title: 'Мои задачи', type: 'my' }
|
||||
};
|
||||
await this.showTasksList(ctx, tasks, 'Мои задачи', 0);
|
||||
}
|
||||
|
||||
@ -642,6 +661,10 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
return;
|
||||
}
|
||||
|
||||
ctx.session = {
|
||||
...ctx.session,
|
||||
currentTasksList: { tasks, title: 'Общие задачи', type: 'shared' }
|
||||
};
|
||||
await this.showTasksList(ctx, tasks, 'Общие задачи', 0);
|
||||
}
|
||||
|
||||
@ -688,12 +711,23 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
return;
|
||||
}
|
||||
|
||||
await this.showTasksList(
|
||||
ctx,
|
||||
partnerTasks,
|
||||
`Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`,
|
||||
0
|
||||
);
|
||||
const partnerTitle = `Задачи ${partner.getFullName()} ${partner.getRoleEmoji()}`;
|
||||
ctx.session = {
|
||||
...ctx.session,
|
||||
currentTasksList: { tasks: partnerTasks, title: partnerTitle, type: 'partner' }
|
||||
};
|
||||
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) {
|
||||
@ -702,7 +736,12 @@ ${partner ? `👥 Партнер: ${partnerName} ${partnerEmoji}` : ''}
|
||||
const endIndex = Math.min(startIndex + pageSize, tasks.length);
|
||||
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[][] = [];
|
||||
|
||||
|
Reference in New Issue
Block a user