diff --git a/src/app/(campaign)/campanha/(app)/municipios/[slug]/CityDetailSections.tsx b/src/app/(campaign)/campanha/(app)/municipios/[slug]/CityDetailSections.tsx index b199516d..fb8890c3 100644 --- a/src/app/(campaign)/campanha/(app)/municipios/[slug]/CityDetailSections.tsx +++ b/src/app/(campaign)/campanha/(app)/municipios/[slug]/CityDetailSections.tsx @@ -20,6 +20,11 @@ import { const CITY_SERIES_YEARS = [2014, 2018, ELECTION_YEAR_2022] as const +const activityDateFormatter = new Intl.DateTimeFormat('pt-BR', { + day: '2-digit', + month: 'short', +}) + const now = () => new Date() /** @@ -187,7 +192,7 @@ export const CityOverviewTab = async ({

    - {topZones.map(({ entry, votes }, index) => ( + {topZones.map(({ entry, votes }) => (
  1. {formatElectionNumber(votes)} -
  2. ))}
@@ -240,11 +242,25 @@ export const CityOverviewTab = async ({

Agenda na capital

- {upcoming.length ? ( + {cityZoneIDs.length === 0 ? ( +

+ A capital não está no seu recorte de atuação. +

+ ) : upcoming.length ? (
    {upcoming.map((activity) => ( -
  1. - {activity.title} +
  2. + + + {activity.startAt + ? activityDateFormatter.format(new Date(activity.startAt)) + : null} + {' '} + {activity.title} +
  3. ))}
diff --git a/src/app/(campaign)/campanha/(app)/municipios/[slug]/page.tsx b/src/app/(campaign)/campanha/(app)/municipios/[slug]/page.tsx index bd7ca040..a25ca158 100644 --- a/src/app/(campaign)/campanha/(app)/municipios/[slug]/page.tsx +++ b/src/app/(campaign)/campanha/(app)/municipios/[slug]/page.tsx @@ -38,11 +38,12 @@ const CITY_PAGE_SUBTITLE = 'Metropolitano de Salvador · ZE 1–19 · capital (a export async function generateMetadata({ params }: MunicipalityDetailPageProps) { const { slug } = await params + // Same gate as the page itself: the city metadata is staff-only too. + const user = await requireCampaignPageActor({ gate: 'noLeader' }) if (isCitySlug(slug)) { return campaignPageMetadata({ title: salvadorCity.name, subtitle: CITY_PAGE_SUBTITLE }) } const payload = await getPayload({ config }) - const user = await requireCampaignPageActor({ gate: 'noLeader' }) try { const context = await resolveAccessibleMunicipalityContext(payload, user, slug) @@ -86,6 +87,7 @@ export default async function MunicipalityDetailPage({ municipalitySlug={salvadorCity.slug} searchParams={rawSearchParams} tabs={cityMunicipalityDetailTabs} + ariaLabel="Seções da capital" /> {cityTab === 'overview' ? : null} {cityTab === 'elections' ? ( diff --git a/src/components/campaign/municipality/MunicipalityList.tsx b/src/components/campaign/municipality/MunicipalityList.tsx index 86b8e7a5..236ab233 100644 --- a/src/components/campaign/municipality/MunicipalityList.tsx +++ b/src/components/campaign/municipality/MunicipalityList.tsx @@ -323,7 +323,9 @@ const municipalityListColumns = ({
{municipality.isCity ? ( - SALVADOR_CITY_AGGREGATE_LABEL + <> + {SALVADOR_CITY_AGGREGATE_LABEL} · {municipality.region} + ) : ( )} diff --git a/src/components/campaign/municipality/MunicipalityListMobileCards.tsx b/src/components/campaign/municipality/MunicipalityListMobileCards.tsx index 02b5997e..1a8352de 100644 --- a/src/components/campaign/municipality/MunicipalityListMobileCards.tsx +++ b/src/components/campaign/municipality/MunicipalityListMobileCards.tsx @@ -116,7 +116,9 @@ export const MunicipalityListMobileCards = ({

{isCity ? ( - SALVADOR_CITY_AGGREGATE_LABEL + <> + {SALVADOR_CITY_AGGREGATE_LABEL} · {region} + ) : ( <> @@ -209,7 +211,10 @@ export const MunicipalityListMobileCards = ({

Última atualização
{isCity ? ( - + // The city never has a signal (nothing is recorded on the + // aggregate) — a plain dash, not the cold-signal alert the + // readout would paint for a null timestamp. + — ) : ( (