✨ Добавление функционала пагинации задач в Telegram-бот
🔧 Изменения: - Добавлено поле `currentTasksList` в контекст сессии для хранения текущего списка задач. - Реализована логика очистки данных пагинации при переходе в главное меню. - Добавлены методы для обработки пагинации задач и отображения текущей страницы задач. - Обновлено отображение задач с учетом пагинации и общего количества страниц. ✅ Теперь пользователи могут удобно просматривать задачи с возможностью навигации по страницам.
This commit is contained in:
@ -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[][] = [];
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user