From 6c8fa873d24d6161afa95bcf8c40e993ecaef8cc Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 18 Jan 2026 07:07:33 +0300 Subject: [PATCH 1/2] Add files via upload --- src/locales/en.json | 3 ++- src/locales/ru.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index c66fe28..1b3ec48 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -727,7 +727,8 @@ "checkIntervalDesc": "How often to check for overdue tickets (30-600 seconds)", "reminderCooldown": "Reminder interval (minutes)", "reminderCooldownDesc": "Minimum time between reminders (1-120 minutes)", - "settingsUpdateError": "Error saving settings" + "settingsUpdateError": "Error saving settings", + "copyTelegramId": "Click to copy Telegram ID" }, "tariffs": { "title": "Tariff Management", diff --git a/src/locales/ru.json b/src/locales/ru.json index 73b6ffe..94422cc 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -727,7 +727,8 @@ "checkIntervalDesc": "Как часто проверять просроченные тикеты (30-600 секунд)", "reminderCooldown": "Интервал напоминаний (минуты)", "reminderCooldownDesc": "Минимальное время между напоминаниями (1-120 минут)", - "settingsUpdateError": "Ошибка сохранения настроек" + "settingsUpdateError": "Ошибка сохранения настроек", + "copyTelegramId": "Нажмите чтобы скопировать Telegram ID" }, "tariffs": { "title": "Управление тарифами", From 808c59c8f07a947974b831e4145c4c0c48289094 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 18 Jan 2026 07:07:59 +0300 Subject: [PATCH 2/2] Add files via upload --- src/pages/AdminTickets.tsx | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/pages/AdminTickets.tsx b/src/pages/AdminTickets.tsx index 1ca8c7c..83f2d9c 100644 --- a/src/pages/AdminTickets.tsx +++ b/src/pages/AdminTickets.tsx @@ -155,10 +155,21 @@ export default function AdminTickets() { const formatUser = (ticket: AdminTicket | AdminTicketDetail) => { if (!ticket.user) return 'Unknown' - const { first_name, last_name, username, telegram_id } = ticket.user + const { first_name, last_name, username } = ticket.user if (first_name || last_name) return `${first_name || ''} ${last_name || ''}`.trim() if (username) return `@${username}` - return `ID: ${telegram_id}` + return 'User' + } + + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text).catch(() => { + const textarea = document.createElement('textarea') + textarea.value = text + document.body.appendChild(textarea) + textarea.select() + document.execCommand('copy') + document.body.removeChild(textarea) + }) } return ( @@ -248,7 +259,17 @@ export default function AdminTickets() {
- {formatUser(ticket)} | {new Date(ticket.updated_at).toLocaleDateString()} + {formatUser(ticket)} + {ticket.user?.telegram_id && ( + + )} + {' '}| {new Date(ticket.updated_at).toLocaleDateString()}
{ticket.last_message && (
@@ -315,8 +336,17 @@ export default function AdminTickets() {
- {t('admin.tickets.from')}: {formatUser(selectedTicket)} |{' '} - {t('admin.tickets.created')}: {new Date(selectedTicket.created_at).toLocaleString()} + {t('admin.tickets.from')}: {formatUser(selectedTicket)} + {selectedTicket.user?.telegram_id && ( + + )} + {' '}| {t('admin.tickets.created')}: {new Date(selectedTicket.created_at).toLocaleString()}
{['open', 'pending', 'answered', 'closed'].map((s) => (