feat: Telegram Mini App integration and UX improvements

- Добавлена полная интеграция с Telegram Mini App (динамическая загрузка SDK)
- Отдельный компактный дизайн для Telegram Mini App
- Добавлен loader при инициализации (предотвращает мелькание SMS-авторизации)
- Улучшена навигация: кнопки "Назад" и "К списку заявок" теперь сохраняют авторизацию
- Telegram Mini App: кнопка "Выход" просто закрывает приложение
- Telegram Mini App: заявки "В работе" скрыты из списка
- Веб-версия: для заявок "В работе" добавлена кнопка "Просмотреть в Telegram" (ссылка на @klientprav_bot)
- Telegram Mini App: кнопки действий в черновиках расположены вертикально
- Веб-версия: убрано отображение номера телефона в приветствии
- Исправлена проблема с возвратом к списку черновиков (не требует повторной SMS-авторизации)
- Заблокировано удаление и редактирование заявок со статусом "В работе"
- Добавлена документация по Telegram Mini App интеграции
This commit is contained in:
AI Assistant
2026-01-29 16:12:48 +03:00
parent 73524465fd
commit 2e45786e46
57 changed files with 6776 additions and 234 deletions

View File

@@ -0,0 +1,65 @@
// ============================================================================
// n8n Code Node: Подготовка данных запроса рейса
// ============================================================================
// Используйте эту ноду ПЕРЕД "причесываем данные"
// Она безопасно получает данные из ноды "запрос рейса" и передаёт их дальше
// ============================================================================
// Получаем данные из ноды "запрос рейса"
let requestData = {
flight_number: null,
departure_date_local: null,
arrival_date_local: null
};
try {
const requestNode = $('запрос рейса');
if (requestNode && requestNode.first()) {
const requestJson = requestNode.first().json;
if (requestJson) {
requestData = {
flight_number: requestJson.flight_number || requestJson.ident || requestJson.flight || null,
departure_date_local: requestJson.departure_date_local || null,
arrival_date_local: requestJson.arrival_date_local || null
};
}
}
} catch (e) {
console.log('⚠️ Не удалось получить данные из ноды "запрос рейса":', e.message);
}
// Получаем данные из входных элементов (fallback)
const inputItems = $input.all();
inputItems.forEach(item => {
if (item.json) {
if (!requestData.flight_number && item.json.flight_number) {
requestData.flight_number = item.json.flight_number;
}
if (!requestData.departure_date_local && item.json.departure_date_local) {
requestData.departure_date_local = item.json.departure_date_local;
}
if (!requestData.arrival_date_local && item.json.arrival_date_local) {
requestData.arrival_date_local = item.json.arrival_date_local;
}
}
});
// Передаём данные дальше вместе с входными данными
const outputItems = inputItems.map(item => ({
...item,
json: {
...item.json,
// Добавляем данные запроса
request_flight_number: requestData.flight_number,
request_departure_date: requestData.departure_date_local,
request_arrival_date: requestData.arrival_date_local
}
}));
return outputItems.length > 0 ? outputItems : [{
json: {
request_flight_number: requestData.flight_number,
request_departure_date: requestData.departure_date_local,
request_arrival_date: requestData.arrival_date_local
}
}];