Rename the operational unit "Praça"/"Núcleo" to "Município" (code identifier `municipality`) and land the 2026-07-23 course changes: - New `candidate` role with unrestricted visibility (`isCampaignStaff` now includes it) alongside coordinator/advisor; leader is locked down to the supporter contact tool only. - Demandas become staff-only; dobradinhas modeled via a `stateDeputy` entity. - Camaçari consolidated to a single município (ZE 170/171 aggregated); Salvador keeps its 19 zone municípios. - Map moves to the staff dashboard; `/campanha/municipios` is list/overview. - Vote pledges keep the declared vs estimated (scenario) asymmetry; leaders never see estimates. Destructive migration for the campaign vertical (drops nucleus/plaza-era tables, wipes campaign rows, seeds 435 municípios). Public-site data untouched. Includes the post-delivery /simplify cleanups: shared reloadStaffActor / reloadCoordinatorActor helpers, req.context cache for getFreshCampaignUser, parallelized dashboard loads, candidate dashboard-copy fix, and dead leader-dashboard / roleKind code removal.
25 lines
683 B
TypeScript
25 lines
683 B
TypeScript
import Link from 'next/link'
|
|
|
|
import { Badge } from '@/components/ui/Badge'
|
|
import type { StateDeputySummary } from '@/utilities/stateDeputyData'
|
|
|
|
type StateDeputyChipsProps = {
|
|
deputies: StateDeputySummary[]
|
|
}
|
|
|
|
export const StateDeputyChips = ({ deputies }: StateDeputyChipsProps) => {
|
|
if (deputies.length === 0) return null
|
|
|
|
return (
|
|
<div className="flex flex-wrap gap-1">
|
|
{deputies.map((deputy) => (
|
|
<Badge key={deputy.id} variant="outline" asChild>
|
|
<Link href={`/campanha/dobradinhas/${deputy.slug}`}>
|
|
{deputy.name}
|
|
{deputy.party ? ` (${deputy.party})` : ''}
|
|
</Link>
|
|
</Badge>
|
|
))}
|
|
</div>
|
|
)
|
|
}
|