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,124 @@
// ============================================================================
// n8n Code Node: HTML → PDF через Browserless (вариант с прямым HTML)
// ============================================================================
// Альтернативный вариант - передача HTML напрямую в body
// ============================================================================
// Получаем HTML из предыдущей ноды
let html = null;
if ($json.html) {
html = $json.html;
} else if ($json.html_base64) {
html = Buffer.from($json.html_base64, 'base64').toString('utf8');
} else if ($json.body?.html) {
html = $json.body.html;
} else if ($binary && $binary.data) {
html = $binary.data.toString('utf8');
} else {
throw new Error('HTML не найден');
}
console.log('📄 HTML получен, длина:', html.length);
// ================== НАСТРОЙКИ ==================
const BROWSERLESS_URL = 'http://147.45.146.17:3000';
const BROWSERLESS_TOKEN = 'YOUR_TOKEN'; // ⚠️ ЗАМЕНИТЕ на ваш токен
// ================== ВАРИАНТ: Использование /screenshot или /pdf ==================
// Browserless может иметь разные эндпоинты
// Вариант A: POST /pdf с HTML в body
const requestA = {
method: 'POST',
url: `${BROWSERLESS_URL}/pdf`,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
},
body: JSON.stringify({
html: html,
options: {
format: 'A4',
printBackground: true,
margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm' }
}
})
};
// Вариант B: POST /pdf с data URL
const htmlBase64 = Buffer.from(html, 'utf8').toString('base64');
const dataUrl = `data:text/html;base64,${htmlBase64}`;
const requestB = {
method: 'POST',
url: `${BROWSERLESS_URL}/pdf`,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
},
body: JSON.stringify({
url: dataUrl,
options: {
format: 'A4',
printBackground: true,
margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm' }
}
})
};
// Вариант C: POST /screenshot (если /pdf не работает)
const requestC = {
method: 'POST',
url: `${BROWSERLESS_URL}/screenshot`,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
},
body: JSON.stringify({
url: dataUrl,
options: {
type: 'pdf',
format: 'A4',
printBackground: true
}
})
};
return [{
json: {
// Используйте один из вариантов ниже
// Попробуйте сначала вариант A, если не работает - B, затем C
// === ВАРИАНТ A: Прямой HTML ===
method_a: requestA.method,
url_a: requestA.url,
headers_a: requestA.headers,
body_a: requestA.body,
// === ВАРИАНТ B: Data URL ===
method_b: requestB.method,
url_b: requestB.url,
headers_b: requestB.headers,
body_b: requestB.body,
// === ВАРИАНТ C: Screenshot (PDF) ===
method_c: requestC.method,
url_c: requestC.url,
headers_c: requestC.headers,
body_c: requestC.body,
// Метаданные
html_length: html.length,
instruction: 'Попробуйте сначала вариант A в HTTP Request ноде'
}
}];
// ============================================================================
// ОТЛАДКА:
// ============================================================================
// Если получаете ошибку аутентификации:
// 1. Проверьте, нужен ли токен для вашего Browserless
// 2. Если токен не требуется, уберите строку Authorization из headers
// 3. Проверьте документацию Browserless: https://docs.browserless.io
// ============================================================================