feat: update permissions

This commit is contained in:
ivannoskov
2026-02-10 17:41:11 +03:00
parent e1117e46c8
commit f0574db79f
7 changed files with 335 additions and 140 deletions

View File

@@ -12,6 +12,7 @@ import {
ArrowUpDown,
ArrowUp,
ArrowDown,
Lock,
} from "lucide-react";
import { DashboardHeader } from "@/components/layout/dashboard-header";
import { useWorkspace } from "@/components/providers/workspace-provider";
@@ -74,14 +75,41 @@ type SortOrder = "asc" | "desc" | null;
export default function ChannelsAnalyticsPage() {
const params = useParams();
const workspaceId = params?.workspaceId as string;
const { getProjectFilterId } = useWorkspace();
const { getProjectFilterId, canViewSubscriptions, hasAnyAnalyticsPermission } = useWorkspace();
const projectFilterId = getProjectFilterId();
const canViewSubs = canViewSubscriptions;
const hasPermission = hasAnyAnalyticsPermission;
const [channels, setChannels] = useState<ChannelAnalyticsItem[]>([]);
const [loading, setLoading] = useState(true);
const [sortField, setSortField] = useState<SortField | null>("cost");
const [sortOrder, setSortOrder] = useState<SortOrder>("desc");
if (!hasPermission) {
return (
<>
<DashboardHeader
breadcrumbs={[
{ label: "Главная", href: `/dashboard/${workspaceId}` },
{ label: "Аналитика", href: `/dashboard/${workspaceId}/analytics` },
{ label: "Каналы" },
]}
/>
<div className="flex flex-1 flex-col gap-4 p-4 pt-0 mt-4">
<Card>
<CardContent className="flex flex-col items-center justify-center py-16">
<Lock className="h-12 w-12 text-muted-foreground mb-4" />
<h3 className="text-lg font-semibold mb-2">Доступ ограничен</h3>
<p className="text-muted-foreground text-center">
У вас нет разрешения на просмотр аналитики. Обратитесь к администратору рабочего пространства.
</p>
</CardContent>
</Card>
</div>
</>
);
}
useEffect(() => {
loadData();
}, [workspaceId, projectFilterId]);
@@ -250,17 +278,19 @@ export default function ChannelsAnalyticsPage() {
{getSortIcon("views")}
</Button>
</TableHead>
<TableHead>
<Button
variant="ghost"
size="sm"
className="-ml-3 h-8"
onClick={() => handleSort("cps")}
>
Ср. CPS
{getSortIcon("cps")}
</Button>
</TableHead>
{canViewSubs && (
<TableHead>
<Button
variant="ghost"
size="sm"
className="-ml-3 h-8"
onClick={() => handleSort("cps")}
>
Ср. CPS
{getSortIcon("cps")}
</Button>
</TableHead>
)}
<TableHead>
<Button
variant="ghost"
@@ -287,11 +317,11 @@ export default function ChannelsAnalyticsPage() {
</TableCell>
<TableCell>{channel.placements_count}</TableCell>
<TableCell>{formatCurrency(channel.total_cost)}</TableCell>
<TableCell>
{formatNumber(channel.total_subscriptions)}
</TableCell>
<TableCell>{formatNumber(channel.total_views)}</TableCell>
<TableCell>{formatCurrency(channel.avg_cps)}</TableCell>
{canViewSubs && (
<TableCell>
{formatCurrency(channel.avg_cps)}
</TableCell>
)}
<TableCell>{formatCurrency(channel.avg_cpm)}</TableCell>
</TableRow>
))}