feat: integrate reports into Campaign navigation

This commit is contained in:
2026-07-29 22:19:24 +02:00
parent 101f3ccd7d
commit cc93945f79
7 changed files with 123 additions and 28 deletions

View File

@@ -11,8 +11,9 @@ import { OPERATOR_QUEUE_ROUTE_SCOPES } from "../operator/operatorQueueAccess";
const CampaignListPage = lazy(() => import("./CampaignListPage"));
const OperatorQueuePage = lazy(() => import("../operator/OperatorQueuePage"));
const AggregateReportsPage = lazy(() => import("../reports/AggregateReportsPage"));
export type CampaignModuleSection = "campaigns" | "queue";
export type CampaignModuleSection = "campaigns" | "queue" | "reports";
export default function CampaignModulePage({
active,
@@ -24,24 +25,42 @@ export default function CampaignModulePage({
auth: AuthInfo;
}) {
const navigate = useGuardedNavigate();
const canReadCampaigns = hasAnyScope(auth, ["campaigns:campaign:read"]);
const canUseQueue =
canReadCampaigns && hasAnyScope(auth, OPERATOR_QUEUE_ROUTE_SCOPES);
const canReadReports = hasAnyScope(auth, ["campaigns:report:read"]);
const groups: ModuleSubnavGroup<CampaignModuleSection>[] = [{
items: [
{
id: "campaigns",
label: "i18n:govoplan-campaign.all_campaigns.2bd1ee3a",
primary: true
},
...(hasAnyScope(auth, OPERATOR_QUEUE_ROUTE_SCOPES)
...(canReadCampaigns
? [{
id: "campaigns" as const,
label: "i18n:govoplan-campaign.all_campaigns.2bd1ee3a",
primary: true
}]
: []),
...(canUseQueue
? [{
id: "queue" as const,
label: "i18n:govoplan-campaign.operator_queue.72492fb5"
}]
: []),
...(canReadReports
? [{
id: "reports" as const,
label: "i18n:govoplan-campaign.reports.88bc3fe3",
primary: !canReadCampaigns
}]
: [])
]
}];
function select(section: CampaignModuleSection) {
navigate(section === "queue" ? "/campaigns/queue" : "/campaigns");
const routes: Record<CampaignModuleSection, string> = {
campaigns: "/campaigns",
queue: "/campaigns/queue",
reports: "/campaigns/reports"
};
navigate(routes[section]);
}
return (
@@ -50,7 +69,9 @@ export default function CampaignModulePage({
<section className="workspace-content">
{active === "queue"
? <OperatorQueuePage settings={settings} auth={auth} />
: <CampaignListPage settings={settings} />}
: active === "reports"
? <AggregateReportsPage settings={settings} />
: <CampaignListPage settings={settings} />}
</section>
</div>
);