feat: ui updates

This commit is contained in:
ivannoskov
2026-01-07 17:54:58 +03:00
parent 646e97df3e
commit 52a4425751
11 changed files with 950 additions and 442 deletions

View File

@@ -155,13 +155,14 @@ const TRAINING_STEPS: TrainingStep[] = [
],
},
{
title: "Что происходит сейчас",
title: "Обзор показателей",
description:
"Лента событий показывает новые заявки, комментарии и дедлайны. Так команда не пропускает задачи.",
"На главной панели отображаются ключевые метрики эффективности рекламных кампаний: общие расходы, охват, количество размещений и подписчиков, а также средние показатели CPM и CPF.",
icon: CalendarClock,
points: [
"Фильтр по типу событий помогает отделить, например, комментарии от обновлений статусов.",
"Кнопка «Создать» рядом ведёт к быстрому созданию проектов и размещений.",
"Метрики показывают динамику с процентным изменением относительно предыдущего периода.",
"Выбор периода позволяет анализировать данные за любой временной интервал.",
"Фильтр по проектам позволяет просматривать статистику по выбранным каналам или всем сразу.",
],
},
],
@@ -435,11 +436,11 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
});
}
// 8. Доступы (без подразделов, админ)
// 8. Настройки (без подразделов, админ)
if (isAdmin) {
items.push({
title: "Доступы",
url: buildRoute.members(workspaceId),
title: "Настройки",
url: buildRoute.settings(workspaceId),
icon: Settings,
requiredPermission: "admin_full",
});
@@ -512,7 +513,7 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
() => [
{
title: "Наш канал",
href: "https://t.me/tgex_news",
href: "https://t.me/+xqHlRelJ2etkMGIy",
icon: Megaphone,
external: true,
},
@@ -766,25 +767,40 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
<SidebarSeparator />
{/* User */}
{user && (
<NavUser
user={{
name: user.username || `User ${user.telegram_id}`,
email: user.username
? `@${user.username}`
: `ID: ${user.telegram_id}`,
avatar: user.username
? `https://ui-avatars.com/api/?name=${user.username}`
: `https://ui-avatars.com/api/?name=User`,
}}
workspaceSwitcher={{
workspaces,
currentWorkspaceId: currentWorkspace?.id,
onSelect: (workspace) => handleWorkspaceSelect(workspace.id),
onCreate: isDemoMode ? undefined : () => setShowCreateDialog(true),
}}
/>
)}
{user && (() => {
// Формируем полное имя из first_name и last_name
const fullName = [user.first_name, user.last_name]
.filter(Boolean)
.join(" ") || user.username || `User ${user.telegram_id}`;
// Для аватара используем полное имя или username
const avatarName = [user.first_name, user.last_name]
.filter(Boolean)
.join(" ") || user.username || "User";
// Telegram avatar URL
const avatarUrl = user.username
? `https://t.me/i/userpic/320/${user.username}.jpg`
: `https://ui-avatars.com/api/?name=${encodeURIComponent(avatarName)}`;
return (
<NavUser
user={{
name: fullName,
email: user.username
? `@${user.username}`
: `ID: ${user.telegram_id}`,
avatar: avatarUrl,
}}
workspaceSwitcher={{
workspaces,
currentWorkspaceId: currentWorkspace?.id,
onSelect: (workspace) => handleWorkspaceSelect(workspace.id),
onCreate: isDemoMode ? undefined : () => setShowCreateDialog(true),
}}
/>
);
})()}
</SidebarFooter>
<SidebarRail />
</Sidebar>