From e88073d892e09e0753f60bce255e3e15777ed76a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 2 Aug 2026 23:08:31 +0000 Subject: [PATCH] =?UTF-8?q?B137=20=E2=80=94=20simplify=20pass:=20dedupe=20?= =?UTF-8?q?picker=20type,=20derive=20territory=20columns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Francisco Solla --- .../campanha/(app)/dobradinhas/page.tsx | 5 ++-- .../campanha/(app)/liderancas/page.tsx | 5 ++-- .../campanha/(app)/territorios/page.tsx | 7 +++-- .../campaign/municipality/TerritoryList.tsx | 28 +++++++++---------- .../municipality/TerritoryListColumns.tsx | 14 ---------- .../campaign/shared/CampaignColumnPicker.tsx | 7 +---- .../campaign/shared/CampaignTable.tsx | 6 ++-- 7 files changed, 25 insertions(+), 47 deletions(-) diff --git a/src/app/(campaign)/campanha/(app)/dobradinhas/page.tsx b/src/app/(campaign)/campanha/(app)/dobradinhas/page.tsx index ccadfd1c..f107903f 100644 --- a/src/app/(campaign)/campanha/(app)/dobradinhas/page.tsx +++ b/src/app/(campaign)/campanha/(app)/dobradinhas/page.tsx @@ -34,7 +34,7 @@ import { EmptyMedia, EmptyTitle, } from '@/components/ui/Empty' -import { resolveVisibleColumns, toCampaignColumnPickerColumns } from '@/lib/campaignColumnVisibility' +import { toCampaignColumnPickerColumns } from '@/lib/campaignColumnVisibility' import { campaignPageMetadataFromCatalog } from '@/lib/campaignPageChrome' import type { MunicipalityPortfolioIndexEntry } from '@/lib/municipalityPortfolio' import { cn } from '@/lib/utils' @@ -187,8 +187,7 @@ export default async function StateDeputiesPage({ searchParams }: StateDeputiesP ]) const columnVisibility = await readCampaignColumnVisibility('dobradinhas') - const isLeadershipVisible = - resolveVisibleColumns([{ id: 'leaderships' }], columnVisibility.hiddenColumnIds).length > 0 + const isLeadershipVisible = !columnVisibility.hiddenColumnIds.includes('leaderships') const [ { rows, totalDocs, totalPages, filterFacets }, diff --git a/src/app/(campaign)/campanha/(app)/liderancas/page.tsx b/src/app/(campaign)/campanha/(app)/liderancas/page.tsx index eee62cbf..86a39b18 100644 --- a/src/app/(campaign)/campanha/(app)/liderancas/page.tsx +++ b/src/app/(campaign)/campanha/(app)/liderancas/page.tsx @@ -41,7 +41,7 @@ import { EmptyMedia, EmptyTitle, } from '@/components/ui/Empty' -import { resolveVisibleColumns, toCampaignColumnPickerColumns } from '@/lib/campaignColumnVisibility' +import { toCampaignColumnPickerColumns } from '@/lib/campaignColumnVisibility' import { campaignPageMetadataFromCatalog } from '@/lib/campaignPageChrome' import { formatBahiaDateTimeLabel } from '@/lib/campaignTime' import { @@ -328,8 +328,7 @@ export default async function LeadershipsPage({ searchParams }: LeadershipsPageP ]) const columnVisibility = await readCampaignColumnVisibility('liderancas') - const isStateDeputyVisible = - resolveVisibleColumns([{ id: 'stateDeputies' }], columnVisibility.hiddenColumnIds).length > 0 + const isStateDeputyVisible = !columnVisibility.hiddenColumnIds.includes('stateDeputies') const [ { rows, totalDocs, totalPages, filterFacets }, diff --git a/src/app/(campaign)/campanha/(app)/territorios/page.tsx b/src/app/(campaign)/campanha/(app)/territorios/page.tsx index 19c21d00..ba9cbc67 100644 --- a/src/app/(campaign)/campanha/(app)/territorios/page.tsx +++ b/src/app/(campaign)/campanha/(app)/territorios/page.tsx @@ -3,7 +3,7 @@ import { redirect } from 'next/navigation' import { getPayload } from 'payload' import { TerritoryFilters } from '@/components/campaign/municipality/TerritoryFilters' -import { territoryListPickerColumns } from '@/components/campaign/municipality/TerritoryListColumns' +import { territoryListColumns } from '@/components/campaign/municipality/TerritoryListColumns' import { TerritoryList } from '@/components/campaign/municipality/TerritoryList' import { CampaignColumnPickerTrailing } from '@/components/campaign/shared/CampaignColumnPickerTrailing' import { CampaignListFooter } from '@/components/campaign/shared/CampaignListFooter' @@ -13,6 +13,7 @@ import { } from '@/components/campaign/shared/CampaignListPending' import { CampaignPageShell } from '@/components/campaign/shell/CampaignPageShell' import { campaignPageMetadataFromCatalog } from '@/lib/campaignPageChrome' +import { toCampaignColumnPickerColumns } from '@/lib/campaignColumnVisibility' import { readCampaignColumnVisibility } from '@/utilities/campaignColumnVisibilityCookie' import { requireCampaignPageActor } from '@/utilities/campaignPageActor' import { loadTerritoryOverview } from '@/utilities/territory/loadTerritoryOverview' @@ -56,7 +57,9 @@ export default async function TerritoriesPage({ searchParams }: TerritoriesPageP trailing={ } /> diff --git a/src/components/campaign/municipality/TerritoryList.tsx b/src/components/campaign/municipality/TerritoryList.tsx index 34214d28..541fb207 100644 --- a/src/components/campaign/municipality/TerritoryList.tsx +++ b/src/components/campaign/municipality/TerritoryList.tsx @@ -71,20 +71,18 @@ export const TerritoryList = ({ return ( - row.variant === 'parent' ? row.region : `${row.parentRegion}-${row.label}` - } - rowId={(row) => (row.variant === 'parent' ? territoryAnchorId(row.region) : undefined)} - rowClassName={(row) => - row.variant === 'sub' ? 'bg-muted/30' : 'scroll-mt-6 target:bg-muted/50' - } - empty={} - /> + className="overflow-visible" + containerClassName="overflow-x-auto" + headerClassName="[&_th]:sticky [&_th]:top-0 [&_th]:z-10 [&_th]:bg-background [&_th]:shadow-[inset_0_-1px_0_var(--border)] [&_th:first-child]:rounded-tl-xl [&_th:last-child]:rounded-tr-xl [&_tr]:border-b-0" + columns={territoryListColumns({ state, regionOptions })} + columnVisibility={columnVisibility} + rows={flattenTerritoryRows(rows)} + rowKey={(row) => (row.variant === 'parent' ? row.region : `${row.parentRegion}-${row.label}`)} + rowId={(row) => (row.variant === 'parent' ? territoryAnchorId(row.region) : undefined)} + rowClassName={(row) => + row.variant === 'sub' ? 'bg-muted/30' : 'scroll-mt-6 target:bg-muted/50' + } + empty={} + /> ) } diff --git a/src/components/campaign/municipality/TerritoryListColumns.tsx b/src/components/campaign/municipality/TerritoryListColumns.tsx index bbf8c200..ee63bf9a 100644 --- a/src/components/campaign/municipality/TerritoryListColumns.tsx +++ b/src/components/campaign/municipality/TerritoryListColumns.tsx @@ -4,7 +4,6 @@ import { TerritorySortableHead } from '@/components/campaign/municipality/Territ import { CampaignTransitionAnchor } from '@/components/campaign/shared/CampaignListPending' import type { CampaignTableColumn } from '@/components/campaign/shared/CampaignTable' import { Badge } from '@/components/ui/Badge' -import type { CampaignColumnPickerColumn } from '@/lib/campaignColumnVisibility' import { formatElectionNumber } from '@/lib/electionFormat' import { formatGoalCoverageDeficitShortLabel, @@ -140,19 +139,6 @@ const captureTooltipContent = (row: TerritoryTableRow) => { ) } -export const territoryListPickerColumns: CampaignColumnPickerColumn[] = [ - { id: 'region', label: territoryListSortLabels.region, mandatory: true }, - { id: 'municipalities', label: territoryListSortLabels.municipalities }, - { id: 'votes2022', label: territoryListSortLabels.votes2022 }, - { id: 'pct', label: territoryListSortLabels.pct }, - { id: 'validVotes2022', label: territoryListSortLabels.validVotes2022 }, - { id: 'estimate2026', label: territoryListSortLabels.estimate2026 }, - { id: 'cobertura', label: territoryListSortLabels.cobertura }, - { id: 'captura', label: territoryListSortLabels.captura }, - { id: 'classe', label: territoryListSortLabels.classe }, - { id: 'coverage', label: territoryListSortLabels.coverage }, -] - export const territoryListColumns = ({ state, regionOptions, diff --git a/src/components/campaign/shared/CampaignColumnPicker.tsx b/src/components/campaign/shared/CampaignColumnPicker.tsx index e59b5b0a..2b160aba 100644 --- a/src/components/campaign/shared/CampaignColumnPicker.tsx +++ b/src/components/campaign/shared/CampaignColumnPicker.tsx @@ -15,16 +15,11 @@ import { parseCampaignHiddenColumns, serializeCampaignHiddenColumns, toggleHiddenColumn, + type CampaignColumnPickerColumn, type CampaignListId, } from '@/lib/campaignColumnVisibility' import { sameIdSet } from '@/lib/sameIdSet' -type CampaignColumnPickerColumn = { - id: string - label: string - mandatory?: boolean -} - type CampaignColumnPickerProps = { listId: CampaignListId /** Every column of the table, hidden ones included — this is the menu. */ diff --git a/src/components/campaign/shared/CampaignTable.tsx b/src/components/campaign/shared/CampaignTable.tsx index b3deb4b1..4d2eebb5 100644 --- a/src/components/campaign/shared/CampaignTable.tsx +++ b/src/components/campaign/shared/CampaignTable.tsx @@ -177,8 +177,7 @@ export const CampaignTable = ({ const visibleColumns = resolveVisibleColumns(columns, columnVisibility?.hiddenColumnIds) return ( - <> -
+
{caption ? {caption} : null} @@ -229,7 +228,6 @@ export const CampaignTable = ({ ))}
-
- +
) }