- {member.role !== 'owner' ? (
+ {!isOwner && (
+
+
- ) : null}
- {member.role !== 'owner' ? (
- ) : null}
-
-
- {member.role === 'owner' && Владелец}
- {(skills ?? []).map((s) => (
-
- {s}
-
- ))}
-
-
-
-
-
- Загруженность
-
-
- {wl.text}
- {workload}%
-
-
+
+ )}
);
diff --git a/src/pages/team/ui/members/MembersPage.tsx b/src/pages/team/ui/members/MembersPage.tsx
index 8e90d92..0b725ef 100644
--- a/src/pages/team/ui/members/MembersPage.tsx
+++ b/src/pages/team/ui/members/MembersPage.tsx
@@ -1,6 +1,6 @@
'use client';
-import { Filter, Plus, SlidersHorizontal } from 'lucide-react';
+import { Plus } from 'lucide-react';
import { InviteTeamMemberDialog } from 'features/teams/invite';
import { Button, Search } from 'shared/ui';
import { MemberCard } from './MemberCard';
@@ -15,7 +15,7 @@ export function MembersPage() {
-
@@ -25,14 +25,6 @@ export function MembersPage() {
Показано {filtered.length} из {total}
-
-
- Фильтр
-
-
- Сортировка
-
-
diff --git a/src/pages/team/ui/settings/SettingsPage.tsx b/src/pages/team/ui/settings/SettingsPage.tsx
index 94c4045..1700871 100644
--- a/src/pages/team/ui/settings/SettingsPage.tsx
+++ b/src/pages/team/ui/settings/SettingsPage.tsx
@@ -5,13 +5,9 @@ import { FormProvider, useForm } from 'react-hook-form';
import { useQueryTeam } from '../../api/useQueryTeam';
import { TeamSettingsFormSchema, type TeamSettingsFormValues } from '../../model/settings';
import { DangerZone } from './DangerZone';
-import { DefaultSettings } from './DefaultSettings';
-import { InvitationSecurity } from './InvitationSecurity';
import { SaveBar } from './SaveBar';
import { TeamIdentity } from './TeamIdentity';
import { DangerZoneSkeleton } from './skeletons/DangerZone.skeleton';
-import { DefaultSettingsSkeleton } from './skeletons/DefaultSettings.skeleton';
-import { InvitationSecuritySkeleton } from './skeletons/InvitationSecurity.skeleton';
import { TeamIdentitySkeleton } from './skeletons/TeamIdentity.skeleton';
import { zodResolver } from '@hookform/resolvers/zod';
@@ -52,8 +48,6 @@ export function Settings() {
{team ? : null}
diff --git a/src/shared/ui/card-section/CardSection.tsx b/src/shared/ui/card-section/CardSection.tsx
index 3f6e778..081faed 100644
--- a/src/shared/ui/card-section/CardSection.tsx
+++ b/src/shared/ui/card-section/CardSection.tsx
@@ -12,7 +12,7 @@ function CardSection({ title, description, ...props }: ICardSectionProps) {
{title}
- {description}
+ {description}
diff --git a/src/widgets/app-sidebar/config/sidebar.ts b/src/widgets/app-sidebar/config/sidebar.ts
index 7652ac1..8c425c0 100644
--- a/src/widgets/app-sidebar/config/sidebar.ts
+++ b/src/widgets/app-sidebar/config/sidebar.ts
@@ -1,4 +1,4 @@
-import { Mail, Settings, ShieldUser, UsersRound } from 'lucide-react';
+import { BriefcaseBusiness, Mail, Settings, UsersRound } from 'lucide-react';
import { routes } from 'shared/config';
export const team = [
@@ -7,7 +7,7 @@ export const team = [
title: 'Участники',
icon: UsersRound,
},
+ { url: routes.team.projects.all(), title: 'Проекты', icon: BriefcaseBusiness },
{ url: routes.team.invitations(), title: 'Приглашения', icon: Mail },
- { url: routes.team.roles(), title: 'Роли', icon: ShieldUser },
{ url: routes.team.settings(), title: 'Настройки', icon: Settings },
] as const;
diff --git a/src/widgets/app-sidebar/ui/projects/ProjectsContent.tsx b/src/widgets/app-sidebar/ui/projects/ProjectsContent.tsx
index 53339f0..ae7b453 100644
--- a/src/widgets/app-sidebar/ui/projects/ProjectsContent.tsx
+++ b/src/widgets/app-sidebar/ui/projects/ProjectsContent.tsx
@@ -67,7 +67,8 @@ export function ProjectsContent() {
asChild
>
- {projectIconCodeToEmoji(project.icon)} {project.name}
+ {projectIconCodeToEmoji(project.icon)}
+ {project.name}
@@ -80,15 +81,15 @@ export function ProjectsContent() {
- Новый проект
+ Новый проект
{totalProjects > 0 ? (
-
+
- Все проекты ({totalProjects})
+ Все проекты ({totalProjects})
diff --git a/src/widgets/app-sidebar/ui/teams/TeamContent.tsx b/src/widgets/app-sidebar/ui/teams/TeamContent.tsx
index 974a57e..7eef692 100644
--- a/src/widgets/app-sidebar/ui/teams/TeamContent.tsx
+++ b/src/widgets/app-sidebar/ui/teams/TeamContent.tsx
@@ -60,7 +60,7 @@ export function TeamContent() {
- Добавить участника
+ Добавить участника
diff --git a/src/widgets/tabs-nav/index.ts b/src/widgets/tabs-nav/index.ts
index 408ab4f..ac3dc31 100644
--- a/src/widgets/tabs-nav/index.ts
+++ b/src/widgets/tabs-nav/index.ts
@@ -1,2 +1,3 @@
export { type TabNavItem } from './model/types';
export { TabsNav } from './ui/TabsNav';
+export { VerticalTabsNav } from './ui/VerticalTabsNav';
diff --git a/src/widgets/tabs-nav/model/types.ts b/src/widgets/tabs-nav/model/types.ts
index 6404556..853d56e 100644
--- a/src/widgets/tabs-nav/model/types.ts
+++ b/src/widgets/tabs-nav/model/types.ts
@@ -7,4 +7,5 @@ export type TabNavItem = {
label: string;
matchPrefix?: boolean;
badge?: { value: string | ReactNode; variant: ComponentProps['variant'] };
+ icon?: ReactNode;
};
diff --git a/src/widgets/tabs-nav/ui/VerticalTabsNav.tsx b/src/widgets/tabs-nav/ui/VerticalTabsNav.tsx
new file mode 100644
index 0000000..854a03a
--- /dev/null
+++ b/src/widgets/tabs-nav/ui/VerticalTabsNav.tsx
@@ -0,0 +1,54 @@
+'use client';
+
+import Link from 'next/link';
+import { usePathname } from 'next/navigation';
+import { ComponentProps } from 'react';
+import { classNames } from 'shared/lib/utils';
+import { Badge, Button } from 'shared/ui';
+import { TabNavItem } from '../model/types';
+
+interface TabsNavProps extends Omit, 'children'> {
+ tabs: TabNavItem[];
+}
+
+export function VerticalTabsNav({ className, tabs, ...props }: TabsNavProps) {
+ const pathname = usePathname();
+
+ if (tabs.length === 0) {
+ return null;
+ }
+
+ return (
+
+ {tabs.map((tab) => {
+ const active = tab.matchPrefix
+ ? (pathname ?? '').startsWith(tab.key)
+ : pathname === tab.key;
+
+ return (
+
+
+ {tab.icon}
+ {tab.label}
+ {tab.badge && (
+
+ {tab.badge.value}
+
+ )}
+
+
+ );
+ })}
+
+ );
+}