diff --git a/src/app/(protected)/vendors/_components/vendors-table.tsx b/src/app/(protected)/vendors/_components/vendors-table.tsx index e524630c..a680c78b 100644 --- a/src/app/(protected)/vendors/_components/vendors-table.tsx +++ b/src/app/(protected)/vendors/_components/vendors-table.tsx @@ -61,7 +61,9 @@ function VendorTableRow({ row, onOpenDetail, onOpenEdit }: VendorTableRowProps) const trades = splitTrades(row.tradeSpecialties); const primaryTrade = trades[0] ?? "—"; const extraTrades = trades.length > 1 ? trades.length - 1 : 0; - const locationText = [row.city, row.state].filter(Boolean).join(", ") || "—"; + const cityStateText = [row.city.trim(), row.state.trim()].filter(Boolean).join(", "); + const locationText = cityStateText || row.address.trim() || "—"; + const phoneText = row.phone.trim() || row.companyPhone.trim(); const rowKey = String(row.id ?? `company-${row.companyId ?? ""}`); const handleKeyDown = (event: KeyboardEvent) => { @@ -132,14 +134,14 @@ function VendorTableRow({ row, onOpenDetail, onOpenEdit }: VendorTableRowProps) )} - {row.phone ? ( + {phoneText ? ( - {row.phone} + {phoneText} ) : ( "—" diff --git a/src/domain/vendors/mappers/vendor-mapper.ts b/src/domain/vendors/mappers/vendor-mapper.ts index 33a31223..321e4542 100644 --- a/src/domain/vendors/mappers/vendor-mapper.ts +++ b/src/domain/vendors/mappers/vendor-mapper.ts @@ -119,6 +119,7 @@ export function mapVendorListItem(raw: unknown): VendorListItem { googleMapsUrl: readString(item, "googleMapsUrl", "GoogleMapsUrl"), notes: readString(item, "notes", "Notes"), totalJobs: readNumber(item, "totalJobs", "TotalJobs"), + address: readString(item, "address", "Address"), city: readString(item, "city", "City"), state: readString(item, "state", "State"), tradeSpecialties: readString(item, "tradeSpecialties", "TradeSpecialties"), diff --git a/src/domain/vendors/types/vendor.ts b/src/domain/vendors/types/vendor.ts index d4140afa..74e6519e 100644 --- a/src/domain/vendors/types/vendor.ts +++ b/src/domain/vendors/types/vendor.ts @@ -13,6 +13,7 @@ export interface VendorListItem { googleMapsUrl: string; notes: string; totalJobs: number; + address: string; city: string; state: string; tradeSpecialties: string; diff --git a/src/test/app/(protected)/vendors/vendor-detail-drawer.test.tsx b/src/test/app/(protected)/vendors/vendor-detail-drawer.test.tsx index a882b91f..cf38b5bb 100644 --- a/src/test/app/(protected)/vendors/vendor-detail-drawer.test.tsx +++ b/src/test/app/(protected)/vendors/vendor-detail-drawer.test.tsx @@ -33,6 +33,7 @@ const vendor: VendorListItem = { googleMapsUrl: "", notes: "", totalJobs: 0, + address: "", city: "", state: "", tradeSpecialties: "", diff --git a/src/test/app/(protected)/vendors/vendors-list.test.tsx b/src/test/app/(protected)/vendors/vendors-list.test.tsx index ae5a18d3..cb7164e1 100644 --- a/src/test/app/(protected)/vendors/vendors-list.test.tsx +++ b/src/test/app/(protected)/vendors/vendors-list.test.tsx @@ -40,6 +40,7 @@ const activeVendor: VendorListItem = { googleMapsUrl: "", notes: "", totalJobs: 0, + address: "1 Market St", city: "St. Louis", state: "MO", tradeSpecialties: "Backflow Preventers", @@ -133,6 +134,53 @@ describe("VendorsListPage", () => { expect(screen.queryByRole("button", { name: "Deactivate vendor" })).not.toBeInTheDocument(); }); + it("prefers trimmed city and state over address and technician phone over company phone", () => { + setupDefaults(); + const vendorWithAllFields: VendorListItem = { + ...activeVendor, + id: 3, + address: " 1 Market St ", + city: " St. Louis ", + state: " MO ", + phone: " (314) 555-0198 ", + }; + useVendorsList.mockImplementation((params: { isActive?: boolean; pageSize?: number }) => { + if (params.pageSize === 1) return result([], 1); + return params.isActive ? result([vendorWithAllFields], 1) : result([], 0); + }); + + renderWithProviders(, { route: "/vendors", withAuth: false }); + + expect(screen.getByText("St. Louis, MO")).toBeInTheDocument(); + expect(screen.queryByText(/1 Market St/)).not.toBeInTheDocument(); + const phoneLink = screen.getByRole("link", { name: "(314) 555-0198" }); + expect(phoneLink).toHaveAttribute("href", "tel:(314) 555-0198"); + expect(screen.queryByText("(314) 555-0100")).not.toBeInTheDocument(); + }); + + it("falls back to the trimmed address and company phone when technician fields are absent", () => { + setupDefaults(); + const fallbackVendor: VendorListItem = { + ...activeVendor, + id: 3, + address: " 1 Market St ", + city: " ", + state: "", + phone: " ", + }; + useVendorsList.mockImplementation((params: { isActive?: boolean; pageSize?: number }) => { + if (params.pageSize === 1) return result([], 1); + return params.isActive ? result([fallbackVendor], 1) : result([], 0); + }); + + renderWithProviders(, { route: "/vendors", withAuth: false }); + + expect(screen.getByText("1 Market St")).toBeInTheDocument(); + const companyPhoneLink = screen.getByRole("link", { name: "(314) 555-0100" }); + expect(companyPhoneLink).toHaveAttribute("href", "tel:(314) 555-0100"); + expect(screen.queryByText(/555-0198/)).not.toBeInTheDocument(); + }); + it("reports the filtered totalCount in the footer when page rows are fewer than total", () => { setupDefaults(); const pageVendors = Array.from({ length: 3 }, (_, index) => ({ diff --git a/src/test/domain/vendors/api/vendors-api.test.ts b/src/test/domain/vendors/api/vendors-api.test.ts index 8ed78f32..b5a65e52 100644 --- a/src/test/domain/vendors/api/vendors-api.test.ts +++ b/src/test/domain/vendors/api/vendors-api.test.ts @@ -28,6 +28,7 @@ describe("vendorsApi.getList", () => { CompanyId: "co-1", CompanyName: "Gateway Plumbing", ContactName: "Adam Whyte", + Address: "1 Market St", City: "St. Louis", State: "MO", IsActive: false, @@ -45,6 +46,7 @@ describe("vendorsApi.getList", () => { searchParams: { search: "gateway", isActive: "false", page: 1, pageSize: 12 }, }); expect(result.items[0]).toMatchObject({ + address: "1 Market St", city: "St. Louis", state: "MO", isActive: false,