From 28da5e678ea7bb470b3d72cd3d4da658863c3aee Mon Sep 17 00:00:00 2001 From: Alexis Sanehisa Date: Thu, 5 Mar 2026 14:09:16 -0500 Subject: [PATCH 1/7] add --- .../components/address/address.stories.tsx | 25 ++++++++ .../src/components/address/address.test.tsx | 52 +++++++++++++++++ .../src/components/address/address.tsx | 57 ++++++++++++++++++- .../src/components/address/types.ts | 2 + 4 files changed, 134 insertions(+), 2 deletions(-) diff --git a/packages/pages-components/src/components/address/address.stories.tsx b/packages/pages-components/src/components/address/address.stories.tsx index 4f79a475..61525b11 100644 --- a/packages/pages-components/src/components/address/address.stories.tsx +++ b/packages/pages-components/src/components/address/address.stories.tsx @@ -94,3 +94,28 @@ export const Address_SanFrancisco: StoryFn = Template.b Address_SanFrancisco.args = { address: SanFrancisco, }; + +// Address with country hidden (default formatting only) +export const Address_HideCountry: StoryFn = Template.bind({}); + +Address_HideCountry.args = { + address: Arlington, + showCountry: false, +}; + +// Address with region hidden (default formatting only) +export const Address_HideRegion: StoryFn = Template.bind({}); + +Address_HideRegion.args = { + address: Arlington, + showRegion: false, +}; + +// Address with both country and region hidden (default formatting only) +export const Address_HideCountryAndRegion: StoryFn = Template.bind({}); + +Address_HideCountryAndRegion.args = { + address: Arlington, + showCountry: false, + showRegion: false, +}; diff --git a/packages/pages-components/src/components/address/address.test.tsx b/packages/pages-components/src/components/address/address.test.tsx index 507ce606..5d868a80 100644 --- a/packages/pages-components/src/components/address/address.test.tsx +++ b/packages/pages-components/src/components/address/address.test.tsx @@ -13,6 +13,16 @@ const address: AddressType = { region: "AL", }; +const argentinianAddress: AddressType = { + city: "Buenos Aires", + countryCode: "AR", + line1: "Av. Corrientes 1234", + localizedCountryName: "Argentina", + localizedRegionName: "Buenos Aires", + postalCode: "C1043", + region: "B", +}; + describe("Address", () => { it("renders a default US Address", () => { render(
); @@ -64,4 +74,46 @@ describe("Address", () => { console.error = originalError; }); + + it("hides country in default format when showCountry is false", () => { + render(
); + + const countryEl = screen.queryByText("US"); + + expect(countryEl).toBeFalsy(); + }); + + it("hides region in default format when showRegion is false", () => { + render(
); + + const regionEl = screen.queryByText("AL"); + + expect(regionEl).toBeFalsy(); + }); + + it("hides both country and region in default format when both are false", () => { + render(
); + + const countryEl = screen.queryByText("US"); + const regionEl = screen.queryByText("AL"); + + expect(countryEl && regionEl).toBeFalsy(); + }); + + it("does not apply showCountry/showRegion when custom lines are provided", () => { + render(
); + + const countryEl = screen.queryByText("US"); + const regionEl = screen.queryByText("AL"); + + expect(countryEl && regionEl).toBeTruthy(); + }); + + it("does not render a trailing comma in AR default format when showRegion is false", () => { + render(
); + + const separatorEl = screen.queryByText(","); + + expect(separatorEl).toBeFalsy(); + }); }); diff --git a/packages/pages-components/src/components/address/address.tsx b/packages/pages-components/src/components/address/address.tsx index 7ec899f1..096835fc 100644 --- a/packages/pages-components/src/components/address/address.tsx +++ b/packages/pages-components/src/components/address/address.tsx @@ -1,9 +1,32 @@ import * as React from "react"; +import type { AddressLine } from "./types.js"; import { AddressProps, AddressLineProps } from "./types.js"; import { localeAddressFormat } from "./i18n.js"; import { getUnabbreviated } from "./methods.js"; import "./address.css"; +const cleanupAddressLine = (line: AddressLine): AddressLine => { + const trimmed = [...line]; + + while (trimmed[0] === ",") { + trimmed.shift(); + } + + while (trimmed[trimmed.length - 1] === ",") { + trimmed.pop(); + } + + const cleaned: AddressLine = []; + for (const token of trimmed) { + if (token === "," && cleaned[cleaned.length - 1] === ",") { + continue; + } + cleaned.push(token); + } + + return cleaned; +}; + /** * Renders an HTML address based from the Yext Knowledge Graph. Example of using the component to render * a location entity's address from Yext Knowledge Graph: @@ -16,12 +39,42 @@ import "./address.css"; * US * const customAddress = (
); * --> 1101 Wilson Blvd., Arlington, VA + * const addressWithoutCountryOrRegion = (
); + * --> 1101 Wilson Blvd., Suite 2300, + * Arlington, 22201 * ``` * + * `showCountry` and `showRegion` only apply when using locale-based default formatting (no custom `lines`). + * * @public */ -export const Address = ({ address, lines, separator = ",", ...props }: AddressProps) => { - const renderedLines = (lines || localeAddressFormat(address.countryCode)).map((line) => ( +export const Address = ({ + address, + lines, + separator = ",", + showCountry = true, + showRegion = true, + ...props +}: AddressProps) => { + const baseLines = lines || localeAddressFormat(address.countryCode); + const renderedLinesToUse = lines + ? baseLines + : baseLines + .map((line) => + line.filter((field) => { + if (!showCountry && field === "countryCode") { + return false; + } + if (!showRegion && field === "region") { + return false; + } + return true; + }) + ) + .map(cleanupAddressLine) + .filter((line) => line.length > 0); + + const renderedLines = renderedLinesToUse.map((line) => ( )); diff --git a/packages/pages-components/src/components/address/types.ts b/packages/pages-components/src/components/address/types.ts index 9d044c86..43813d23 100644 --- a/packages/pages-components/src/components/address/types.ts +++ b/packages/pages-components/src/components/address/types.ts @@ -28,6 +28,8 @@ export interface AddressProps extends React.HTMLProps { address: AddressType; lines?: AddressLine[]; separator?: string; + showCountry?: boolean; + showRegion?: boolean; } /** From 98318c16f9dda7989c39552822fd2ed73af09bf5 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:47:15 +0000 Subject: [PATCH 2/7] Automated linting/formatter update --- packages/pages-components/CHANGELOG.md | 4 ++-- .../src/components/address/address.test.tsx | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/pages-components/CHANGELOG.md b/packages/pages-components/CHANGELOG.md index 5b39389c..6bc5a1f4 100644 --- a/packages/pages-components/CHANGELOG.md +++ b/packages/pages-components/CHANGELOG.md @@ -2,11 +2,11 @@ ##### Chores -* swap from prettier to oxlint ([#141](https://github.com/yext/js/pull/141)) ([07f698ad](https://github.com/yext/js/commit/07f698ad55f9464289ea3cc5d0a0e5b8bb0e40d6)) +- swap from prettier to oxlint ([#141](https://github.com/yext/js/pull/141)) ([07f698ad](https://github.com/yext/js/commit/07f698ad55f9464289ea3cc5d0a0e5b8bb0e40d6)) ##### New Features -* expose optOut and isYextAnalyticsEnabled functions ([#142](https://github.com/yext/js/pull/142)) ([d0c3010a](https://github.com/yext/js/commit/d0c3010a16e84b6f8a4b7959f9cf7aeadcaa6a52)) +- expose optOut and isYextAnalyticsEnabled functions ([#142](https://github.com/yext/js/pull/142)) ([d0c3010a](https://github.com/yext/js/commit/d0c3010a16e84b6f8a4b7959f9cf7aeadcaa6a52)) #### 2.0.0 (2025-12-30) diff --git a/packages/pages-components/src/components/address/address.test.tsx b/packages/pages-components/src/components/address/address.test.tsx index 5d868a80..35d4d311 100644 --- a/packages/pages-components/src/components/address/address.test.tsx +++ b/packages/pages-components/src/components/address/address.test.tsx @@ -101,7 +101,14 @@ describe("Address", () => { }); it("does not apply showCountry/showRegion when custom lines are provided", () => { - render(
); + render( +
+ ); const countryEl = screen.queryByText("US"); const regionEl = screen.queryByText("AL"); From fea114bd7c5961e98a87ed81b711cc91b00a454e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 19:49:32 +0000 Subject: [PATCH 3/7] Update snapshots --- ...-address--address-hide-country-and-region.png | Bin 0 -> 7581 bytes .../components-address--address-hide-country.png | Bin 0 -> 7971 bytes .../components-address--address-hide-region.png | Bin 0 -> 7963 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country-and-region.png create mode 100644 packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country.png create mode 100644 packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-region.png diff --git a/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country-and-region.png b/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country-and-region.png new file mode 100644 index 0000000000000000000000000000000000000000..55eb617eb1b7af6f6786fd2b5af6965ecdf58e08 GIT binary patch literal 7581 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 QH;_|_NuO~)`R2QS0Sxd8+yDRo literal 0 HcmV?d00001 diff --git a/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-region.png b/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-region.png new file mode 100644 index 0000000000000000000000000000000000000000..857b8b5741d7b90af5323b586e3be2f9cb9b6cdf GIT binary patch literal 7963 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 g4d7zcf6lW_Z=9rTzgZvyW Date: Fri, 6 Mar 2026 11:25:13 -0500 Subject: [PATCH 4/7] comments --- .../src/components/address/address.test.tsx | 40 +++++++-- .../src/components/address/address.tsx | 87 ++++++++++--------- 2 files changed, 79 insertions(+), 48 deletions(-) diff --git a/packages/pages-components/src/components/address/address.test.tsx b/packages/pages-components/src/components/address/address.test.tsx index 35d4d311..a731d89d 100644 --- a/packages/pages-components/src/components/address/address.test.tsx +++ b/packages/pages-components/src/components/address/address.test.tsx @@ -67,7 +67,7 @@ describe("Address", () => { ["line1", ",", "line2"], ["city", ",", "region", ",", "postalCode"], ]} - /> + />, ); expect(console.error).not.toHaveBeenCalled(); @@ -92,7 +92,9 @@ describe("Address", () => { }); it("hides both country and region in default format when both are false", () => { - render(
); + render( +
, + ); const countryEl = screen.queryByText("US"); const regionEl = screen.queryByText("AL"); @@ -100,20 +102,20 @@ describe("Address", () => { expect(countryEl && regionEl).toBeFalsy(); }); - it("does not apply showCountry/showRegion when custom lines are provided", () => { + it("applies showCountry/showRegion when custom lines are provided", () => { render(
+ />, ); const countryEl = screen.queryByText("US"); const regionEl = screen.queryByText("AL"); - expect(countryEl && regionEl).toBeTruthy(); + expect(countryEl || regionEl).toBeFalsy(); }); it("does not render a trailing comma in AR default format when showRegion is false", () => { @@ -123,4 +125,32 @@ describe("Address", () => { expect(separatorEl).toBeFalsy(); }); + + it("removes commas immediately before hidden fields in custom lines", () => { + render( +
, + ); + + const separatorEl = screen.queryByText(","); + + expect(separatorEl).toBeFalsy(); + }); + + it("keeps commas after hidden fields in custom lines", () => { + render( +
, + ); + + const separatorEl = screen.queryByText(","); + + expect(separatorEl).toBeTruthy(); + }); }); diff --git a/packages/pages-components/src/components/address/address.tsx b/packages/pages-components/src/components/address/address.tsx index 096835fc..0e2e01be 100644 --- a/packages/pages-components/src/components/address/address.tsx +++ b/packages/pages-components/src/components/address/address.tsx @@ -5,28 +5,6 @@ import { localeAddressFormat } from "./i18n.js"; import { getUnabbreviated } from "./methods.js"; import "./address.css"; -const cleanupAddressLine = (line: AddressLine): AddressLine => { - const trimmed = [...line]; - - while (trimmed[0] === ",") { - trimmed.shift(); - } - - while (trimmed[trimmed.length - 1] === ",") { - trimmed.pop(); - } - - const cleaned: AddressLine = []; - for (const token of trimmed) { - if (token === "," && cleaned[cleaned.length - 1] === ",") { - continue; - } - cleaned.push(token); - } - - return cleaned; -}; - /** * Renders an HTML address based from the Yext Knowledge Graph. Example of using the component to render * a location entity's address from Yext Knowledge Graph: @@ -44,7 +22,8 @@ const cleanupAddressLine = (line: AddressLine): AddressLine => { * Arlington, 22201 * ``` * - * `showCountry` and `showRegion` only apply when using locale-based default formatting (no custom `lines`). + * `showCountry` and `showRegion` apply to both locale-based default formatting and custom `lines`. + * Only separators immediately before hidden fields are removed. * * @public */ @@ -57,25 +36,41 @@ export const Address = ({ ...props }: AddressProps) => { const baseLines = lines || localeAddressFormat(address.countryCode); - const renderedLinesToUse = lines - ? baseLines - : baseLines - .map((line) => - line.filter((field) => { - if (!showCountry && field === "countryCode") { - return false; - } - if (!showRegion && field === "region") { - return false; - } - return true; - }) - ) - .map(cleanupAddressLine) - .filter((line) => line.length > 0); + const isHiddenField = (field: AddressLine[number]): boolean => { + if (field === "countryCode") { + return !showCountry; + } + + if (field === "region") { + return !showRegion; + } + + return false; + }; + + const renderedLinesToUse = baseLines + .map((line) => + line.filter((field, index) => { + if (isHiddenField(field)) { + return false; + } + + if (field === "," && isHiddenField(line[index + 1])) { + return false; + } + + return true; + }), + ) + .filter((line) => line.length > 0); const renderedLines = renderedLinesToUse.map((line) => ( - + )); return ( @@ -85,13 +80,19 @@ export const Address = ({ ); }; -const AddressLine = ({ address, line, separator }: AddressLineProps): React.ReactElement => { +const AddressLine = ({ + address, + line, + separator, +}: AddressLineProps): React.ReactElement => { const addressDOM: React.ReactElement[] = []; let separatorCount = 0; for (const field of line) { if (field === ",") { - addressDOM.push({separator}); + addressDOM.push( + {separator}, + ); continue; } @@ -107,7 +108,7 @@ const AddressLine = ({ address, line, separator }: AddressLineProps): React.Reac {" "} {value} - + , ); continue; } From 890757a5e22c79f8880ddbaca9d31327bf3e58eb Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:25:41 +0000 Subject: [PATCH 5/7] Automated linting/formatter update --- .../src/components/address/address.test.tsx | 24 ++++--------------- .../src/components/address/address.tsx | 21 ++++------------ 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/packages/pages-components/src/components/address/address.test.tsx b/packages/pages-components/src/components/address/address.test.tsx index a731d89d..53ce6564 100644 --- a/packages/pages-components/src/components/address/address.test.tsx +++ b/packages/pages-components/src/components/address/address.test.tsx @@ -67,7 +67,7 @@ describe("Address", () => { ["line1", ",", "line2"], ["city", ",", "region", ",", "postalCode"], ]} - />, + /> ); expect(console.error).not.toHaveBeenCalled(); @@ -92,9 +92,7 @@ describe("Address", () => { }); it("hides both country and region in default format when both are false", () => { - render( -
, - ); + render(
); const countryEl = screen.queryByText("US"); const regionEl = screen.queryByText("AL"); @@ -109,7 +107,7 @@ describe("Address", () => { showCountry={false} showRegion={false} lines={[["region"], ["countryCode"]]} - />, + /> ); const countryEl = screen.queryByText("US"); @@ -127,13 +125,7 @@ describe("Address", () => { }); it("removes commas immediately before hidden fields in custom lines", () => { - render( -
, - ); + render(
); const separatorEl = screen.queryByText(","); @@ -141,13 +133,7 @@ describe("Address", () => { }); it("keeps commas after hidden fields in custom lines", () => { - render( -
, - ); + render(
); const separatorEl = screen.queryByText(","); diff --git a/packages/pages-components/src/components/address/address.tsx b/packages/pages-components/src/components/address/address.tsx index 0e2e01be..1da3c22f 100644 --- a/packages/pages-components/src/components/address/address.tsx +++ b/packages/pages-components/src/components/address/address.tsx @@ -60,17 +60,12 @@ export const Address = ({ } return true; - }), + }) ) .filter((line) => line.length > 0); const renderedLines = renderedLinesToUse.map((line) => ( - + )); return ( @@ -80,19 +75,13 @@ export const Address = ({ ); }; -const AddressLine = ({ - address, - line, - separator, -}: AddressLineProps): React.ReactElement => { +const AddressLine = ({ address, line, separator }: AddressLineProps): React.ReactElement => { const addressDOM: React.ReactElement[] = []; let separatorCount = 0; for (const field of line) { if (field === ",") { - addressDOM.push( - {separator}, - ); + addressDOM.push({separator}); continue; } @@ -108,7 +97,7 @@ const AddressLine = ({ {" "} {value} - , + ); continue; } From a4d3f689415da24145e3adc3563eb7c0927b2e1e Mon Sep 17 00:00:00 2001 From: Alexis Sanehisa Date: Fri, 6 Mar 2026 11:26:54 -0500 Subject: [PATCH 6/7] fix tsdoc --- packages/pages-components/src/components/address/address.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pages-components/src/components/address/address.tsx b/packages/pages-components/src/components/address/address.tsx index 1da3c22f..e876d111 100644 --- a/packages/pages-components/src/components/address/address.tsx +++ b/packages/pages-components/src/components/address/address.tsx @@ -19,7 +19,7 @@ import "./address.css"; * --> 1101 Wilson Blvd., Arlington, VA * const addressWithoutCountryOrRegion = (
); * --> 1101 Wilson Blvd., Suite 2300, - * Arlington, 22201 + * Arlington 22201 * ``` * * `showCountry` and `showRegion` apply to both locale-based default formatting and custom `lines`. From fdecdc92593110931b08a09c340ec62548de1f40 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:27:44 +0000 Subject: [PATCH 7/7] Update snapshots --- ...dress--address-hide-country-and-region.png | Bin 7581 -> 7526 bytes ...omponents-address--address-hide-region.png | Bin 7963 -> 7907 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country-and-region.png b/packages/pages-components/.storybook/snapshots/__snapshots__/components-address--address-hide-country-and-region.png index 55eb617eb1b7af6f6786fd2b5af6965ecdf58e08..e13509ceab343988462fb66972e8319b7677675f 100644 GIT binary patch literal 7526 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 IP3jN-3%qoXQ~&?~ delta 2779 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 g4d7zcf6lW_Z=9rTzgZvyW