feat: ui updates
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -84,8 +84,8 @@ export function NavMain({
|
||||
<item.icon
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
(isActive || hasActiveSubmenu) &&
|
||||
"text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
// (isActive || hasActiveSubmenu) &&
|
||||
// "text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
@@ -114,8 +114,8 @@ export function NavMain({
|
||||
<subItem.icon
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
isSubActive &&
|
||||
"text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
// isSubActive &&
|
||||
// "text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
@@ -153,8 +153,8 @@ export function NavMain({
|
||||
<item.icon
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
(isActive || hasActiveSubmenu) &&
|
||||
"text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
// (isActive || hasActiveSubmenu) &&
|
||||
// "text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
@@ -177,8 +177,8 @@ export function NavMain({
|
||||
<subItem.icon
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
isSubActive &&
|
||||
"text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
// isSubActive &&
|
||||
// "text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
@@ -203,8 +203,8 @@ export function NavMain({
|
||||
<item.icon
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
isActive &&
|
||||
"text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
// isActive &&
|
||||
// "text-[#2B1D49] dark:text-[#5F31F4]"
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user