From a3e23ace5560802e919ab29d76eca09733744230 Mon Sep 17 00:00:00 2001 From: Ben Life Date: Tue, 24 Feb 2026 17:21:18 -0500 Subject: [PATCH 1/4] more alpha quick fixes --- packages/visual-editor/src/components/Locator.tsx | 3 +-- .../src/components/directory/DirectoryWrapper.tsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/visual-editor/src/components/Locator.tsx b/packages/visual-editor/src/components/Locator.tsx index cba0553ff..1ffe98d14 100644 --- a/packages/visual-editor/src/components/Locator.tsx +++ b/packages/visual-editor/src/components/Locator.tsx @@ -47,7 +47,7 @@ import { } from "../editor/DynamicOptionsSelector.tsx"; import { YextField } from "../editor/YextField.tsx"; import { useDocument } from "../hooks/useDocument.tsx"; -import { Button } from "../internal/puck/ui/button.tsx"; +import { Button } from "./atoms/button.tsx"; import { TranslatableString } from "../types/types.ts"; import { getPreferredDistanceUnit, @@ -1293,7 +1293,6 @@ const LocatorInternal = ({ diff --git a/packages/visual-editor/src/components/directory/DirectoryWrapper.tsx b/packages/visual-editor/src/components/directory/DirectoryWrapper.tsx index 20503295f..3bfd464a6 100644 --- a/packages/visual-editor/src/components/directory/DirectoryWrapper.tsx +++ b/packages/visual-editor/src/components/directory/DirectoryWrapper.tsx @@ -42,7 +42,7 @@ export const DirectoryList = ({ {sortedDirectoryChildren.map((child, idx) => { const childSlug = resolveDirectoryListChildren(streamDocument, child); let label; - switch (streamDocument?.dm_directoryChildren?.meta?.entityType?.id) { + switch (child?.meta?.entityType?.id) { case "dm_country": label = child.c_addressCountryDisplayName ?? child.name; break; From 6a642cc2584c81bcac9710e66ed819d4242c3761 Mon Sep 17 00:00:00 2001 From: Ben Life Date: Wed, 25 Feb 2026 10:02:03 -0500 Subject: [PATCH 2/4] fix locator profile urls --- .../urls/legacyResolveUrlTemplate.test.ts | 39 +++++++++++++++++++ .../utils/urls/legacyResolveUrlTemplate.ts | 30 +++++++++----- .../src/utils/urls/resolveUrlTemplate.test.ts | 33 ++++++++++++++++ 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts index 35ba535dc..6ce747f1a 100644 --- a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts +++ b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts @@ -73,6 +73,29 @@ const mockLocatorMergedDocument: StreamDocument = { }), }; +const mockNewLocatorMergedDocument: StreamDocument = { + name: "Yext", + id: "123", + locale: "en", + address: { + line1: "61 9th Ave", + city: "New York", + region: "NY", + country: "USA", + }, + __: { + codeTemplate: "locator", + entityPageSetUrlTemplates: JSON.stringify({ + primary: "[[address.region]]/location/[[id]]", + includePrimaryLocalePrefixForPrimaryLocale: true, + primaryLocale: "en", + }), + }, + _pageset: JSON.stringify({ + type: "LOCATOR", + }), +}; + describe("legacyResolveUrlTemplate with isChild flag", () => { it("handles primary url template on directory pages", () => { expect( @@ -114,6 +137,22 @@ describe("legacyResolveUrlTemplate with isChild flag", () => { ).toBe("es/ny/location/123"); }); + it("handles primary locale on new locator pages", () => { + expect( + legacyResolveUrlTemplate(mockNewLocatorMergedDocument, "", true) + ).toBe("ny/location/123"); + }); + + it("handles primary locale on new locator pages", () => { + expect( + legacyResolveUrlTemplate( + { ...mockNewLocatorMergedDocument, locale: "es" }, + "", + true + ) + ).toBe("es/ny/location/123"); + }); + it("uses base entity template (entityPageSetUrlTemplates) for directory pages", () => { const directoryDocWithBothTemplates = { ...mockDirectoryMergedDocument, diff --git a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts index 7d0ffd66f..03bef40c4 100644 --- a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts +++ b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts @@ -48,7 +48,12 @@ export const legacyResolveUrlTemplate = ( const legacyResolveUrlTemplateWithTemplates = ( streamDocument: StreamDocument, relativePrefixToRoot: string, - urlTemplates: { primary?: string; alternate?: string } + urlTemplates: { + primary?: string; + alternate?: string; + includeLocalePrefixForPrimaryLocale?: boolean; + primaryLocale?: string; + } ): string | undefined => { const locale = streamDocument.locale || streamDocument?.meta?.locale || ""; if (!locale) { @@ -64,12 +69,18 @@ const legacyResolveUrlTemplateWithTemplates = ( ); } - return buildUrlFromTemplate( - urlTemplate, - streamDocument, - locale, - relativePrefixToRoot - ); + const resolvedUrl = buildUrlFromTemplate(urlTemplate, streamDocument, locale); + + // On sites with pathInfo, locator links will use the legacy URL template resolution but include the new primary locale handling + if ( + "primaryLocale" in urlTemplates && + (urlTemplates.primaryLocale !== locale || + urlTemplates.includeLocalePrefixForPrimaryLocale) + ) { + return `${relativePrefixToRoot}${normalizeSlug(locale)}/${resolvedUrl}`; + } + + return `${relativePrefixToRoot}${resolvedUrl}`; }; /** @@ -96,8 +107,7 @@ const selectUrlTemplate = ( export const buildUrlFromTemplate = ( urlTemplate: string, streamDocument: StreamDocument, - locale: string, - relativePrefixToRoot: string + locale: string ): string | undefined => { const normalizedSlug = normalizeSlug( resolveEmbeddedFieldsInString(urlTemplate, streamDocument, locale) @@ -107,5 +117,5 @@ export const buildUrlFromTemplate = ( return; } - return relativePrefixToRoot + normalizedSlug; + return normalizedSlug; }; diff --git a/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts b/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts index 86795c4ea..44e59b2e7 100644 --- a/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts +++ b/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts @@ -44,6 +44,23 @@ const mockDMCityDocument: StreamDocument = { }), }; +const mockLocatorDocument: StreamDocument = { + name: "Locator", + id: "locator", + locale: "en", + __: { + codeTemplate: "locator", + entityPageSetUrlTemplates: JSON.stringify({ + primary: "location/[[address.city]]/[[id]]", + includePrimaryLocalePrefixForPrimaryLocale: true, + primaryLocale: "en", + }), + }, + _pageset: JSON.stringify({ + type: "LOCATOR", + }), +}; + const mockChildProfile = { id: "child-profile-1", locale: "en", @@ -191,4 +208,20 @@ describe("resolveUrlTemplateOfChild", () => { resolveUrlTemplateOfChild(mockChildProfile, mockDMCityDocument, "") ).toBe("va/fairfax/2000-university-dr"); }); + + it("resolves locator profile links for primary locale", () => { + expect( + resolveUrlTemplateOfChild(mockChildProfile, mockLocatorDocument, "") + ).toBe("location/fairfax/child-profile-1"); + }); + + it("resolves locator profile links for primary locale", () => { + expect( + resolveUrlTemplateOfChild( + { ...mockChildProfile, locale: "es" }, + mockLocatorDocument, + "" + ) + ).toBe("es/location/fairfax/child-profile-1"); + }); }); From a092074f63a426960ab0b1d1f26ef00c12ca9ce1 Mon Sep 17 00:00:00 2001 From: Ben Life Date: Wed, 25 Feb 2026 10:13:07 -0500 Subject: [PATCH 3/4] rabbit fixes --- .../urls/legacyResolveUrlTemplate.test.ts | 4 ++-- .../utils/urls/legacyResolveUrlTemplate.ts | 5 +++- .../src/utils/urls/resolveUrlTemplate.test.ts | 23 +++++++++++++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts index 6ce747f1a..11d567d09 100644 --- a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts +++ b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.test.ts @@ -87,7 +87,7 @@ const mockNewLocatorMergedDocument: StreamDocument = { codeTemplate: "locator", entityPageSetUrlTemplates: JSON.stringify({ primary: "[[address.region]]/location/[[id]]", - includePrimaryLocalePrefixForPrimaryLocale: true, + includeLocalePrefixForPrimaryLocale: false, primaryLocale: "en", }), }, @@ -143,7 +143,7 @@ describe("legacyResolveUrlTemplate with isChild flag", () => { ).toBe("ny/location/123"); }); - it("handles primary locale on new locator pages", () => { + it("handles non-primary locale on new locator pages", () => { expect( legacyResolveUrlTemplate( { ...mockNewLocatorMergedDocument, locale: "es" }, diff --git a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts index 03bef40c4..7d5ce1c14 100644 --- a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts +++ b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts @@ -70,10 +70,13 @@ const legacyResolveUrlTemplateWithTemplates = ( } const resolvedUrl = buildUrlFromTemplate(urlTemplate, streamDocument, locale); + if (!resolvedUrl) { + return; + } // On sites with pathInfo, locator links will use the legacy URL template resolution but include the new primary locale handling if ( - "primaryLocale" in urlTemplates && + urlTemplates.primaryLocale && (urlTemplates.primaryLocale !== locale || urlTemplates.includeLocalePrefixForPrimaryLocale) ) { diff --git a/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts b/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts index 44e59b2e7..2c49966aa 100644 --- a/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts +++ b/packages/visual-editor/src/utils/urls/resolveUrlTemplate.test.ts @@ -52,7 +52,7 @@ const mockLocatorDocument: StreamDocument = { codeTemplate: "locator", entityPageSetUrlTemplates: JSON.stringify({ primary: "location/[[address.city]]/[[id]]", - includePrimaryLocalePrefixForPrimaryLocale: true, + includeLocalePrefixForPrimaryLocale: false, primaryLocale: "en", }), }, @@ -215,7 +215,7 @@ describe("resolveUrlTemplateOfChild", () => { ).toBe("location/fairfax/child-profile-1"); }); - it("resolves locator profile links for primary locale", () => { + it("resolves locator profile links for non-primary locale", () => { expect( resolveUrlTemplateOfChild( { ...mockChildProfile, locale: "es" }, @@ -224,4 +224,23 @@ describe("resolveUrlTemplateOfChild", () => { ) ).toBe("es/location/fairfax/child-profile-1"); }); + + it("resolves locator profile links for primary locale with includeLocalePrefixForPrimaryLocale", () => { + expect( + resolveUrlTemplateOfChild( + { ...mockChildProfile, locale: "en" }, + { + ...mockLocatorDocument, + __: { + codeTemplate: "locator", + entityPageSetUrlTemplates: JSON.stringify({ + primary: "location/[[address.city]]/[[id]]", + includeLocalePrefixForPrimaryLocale: true, + primaryLocale: "en", + }), + }, + } + ) + ).toBe("en/location/fairfax/child-profile-1"); + }); }); From 1629b8498051ce37345d59713a2fb40afde877fb Mon Sep 17 00:00:00 2001 From: Ben Life Date: Wed, 25 Feb 2026 12:48:48 -0500 Subject: [PATCH 4/4] refactor --- .../utils/urls/legacyResolveUrlTemplate.ts | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts index 7d5ce1c14..61b0df73d 100644 --- a/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts +++ b/packages/visual-editor/src/utils/urls/legacyResolveUrlTemplate.ts @@ -69,12 +69,16 @@ const legacyResolveUrlTemplateWithTemplates = ( ); } - const resolvedUrl = buildUrlFromTemplate(urlTemplate, streamDocument, locale); + const resolvedUrl = normalizeSlug( + resolveEmbeddedFieldsInString(urlTemplate, streamDocument, locale) + ); if (!resolvedUrl) { return; } - // On sites with pathInfo, locator links will use the legacy URL template resolution but include the new primary locale handling + // On sites that have an updated entity pageset that sets pathInfo + // but the locator pageset does not yet set pathInfo, locator links + // will use the legacy URL template resolution but include the new primary locale handling if ( urlTemplates.primaryLocale && (urlTemplates.primaryLocale !== locale || @@ -103,22 +107,3 @@ const selectUrlTemplate = ( return urlTemplates.primary || urlTemplates.alternate; } }; - -/** - * Builds a URL from a template string by resolving embedded fields and normalizing the slug. - */ -export const buildUrlFromTemplate = ( - urlTemplate: string, - streamDocument: StreamDocument, - locale: string -): string | undefined => { - const normalizedSlug = normalizeSlug( - resolveEmbeddedFieldsInString(urlTemplate, streamDocument, locale) - ); - - if (!normalizedSlug) { - return; - } - - return normalizedSlug; -};