From 58489d1344fbbcd7c43790eba4bcf8ca631b1863 Mon Sep 17 00:00:00 2001 From: George Haberis Date: Thu, 5 Feb 2026 14:25:40 +0000 Subject: [PATCH 1/4] read the filterAtAGlance switch on the server --- dotcom-rendering/src/model/enhance-product-summary.test.ts | 3 +++ dotcom-rendering/src/model/enhance-product-summary.ts | 5 +++++ dotcom-rendering/src/model/enhanceBlocks.ts | 3 +++ dotcom-rendering/src/server/handler.article.apps.ts | 1 + dotcom-rendering/src/server/handler.article.web.ts | 1 + dotcom-rendering/src/types/article.ts | 1 + 6 files changed, 14 insertions(+) diff --git a/dotcom-rendering/src/model/enhance-product-summary.test.ts b/dotcom-rendering/src/model/enhance-product-summary.test.ts index 7e345f3e8c8..53878ae8470 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.test.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.test.ts @@ -224,6 +224,7 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'carousel' }, renderingTarget: 'Web', + filterAtAGlanceEnabled: true, })(input); const carousel = findCarousel(output); @@ -265,6 +266,7 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, renderingTarget: 'Web', + filterAtAGlanceEnabled: true, })(input); const stacked = findStacked(output); @@ -306,6 +308,7 @@ describe('enhanceProductSummary', () => { pageId: allowedPageId, serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, renderingTarget: 'Apps', + filterAtAGlanceEnabled: true, })(input); const stacked = findStacked(output); diff --git a/dotcom-rendering/src/model/enhance-product-summary.ts b/dotcom-rendering/src/model/enhance-product-summary.ts index 01c6b59d7fb..5b6d1666de9 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.ts @@ -180,17 +180,22 @@ export const enhanceProductSummary = pageId, serverSideABTests, renderingTarget, + filterAtAGlanceEnabled, }: { pageId: string; serverSideABTests?: Record; renderingTarget: RenderingTarget; + filterAtAGlanceEnabled: boolean; }) => (elements: FEElement[]): FEElement[] => { const abTestVariant = serverSideABTests?.['thefilter-at-a-glance-redesign']; + console.log('**** filterAtAGlanceEnabled ****', filterAtAGlanceEnabled); + // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps if ( + filterAtAGlanceEnabled && abTestVariant && isCarouselOrStacked(abTestVariant) && isEligibleForSummary(pageId) && diff --git a/dotcom-rendering/src/model/enhanceBlocks.ts b/dotcom-rendering/src/model/enhanceBlocks.ts index ddc7f8c6076..b8d63221638 100644 --- a/dotcom-rendering/src/model/enhanceBlocks.ts +++ b/dotcom-rendering/src/model/enhanceBlocks.ts @@ -1,6 +1,7 @@ import { isUndefined } from '@guardian/libs'; import { type ArticleFormat } from '../lib/articleFormat'; import type { Block } from '../types/blocks'; +import type { Switches } from '../types/config'; import type { FEElement, ImageBlockElement, @@ -37,6 +38,7 @@ type Options = { shouldHideAds: boolean; pageId: string; serverSideABTests?: Record; + switches?: Switches; }; const enhanceNewsletterSignup = @@ -101,6 +103,7 @@ export const enhanceElements = pageId: options.pageId, serverSideABTests: options.serverSideABTests, renderingTarget: options.renderingTarget, + filterAtAGlanceEnabled: !!options.switches?.filterAtAGlance, }), ].reduce( (enhancedBlocks, enhancer) => enhancer(enhancedBlocks), diff --git a/dotcom-rendering/src/server/handler.article.apps.ts b/dotcom-rendering/src/server/handler.article.apps.ts index 199ffae2529..e3639bf5d7a 100644 --- a/dotcom-rendering/src/server/handler.article.apps.ts +++ b/dotcom-rendering/src/server/handler.article.apps.ts @@ -55,6 +55,7 @@ export const handleAppsBlocks: RequestHandler = ({ body }, res) => { hasAffiliateLinksDisclaimer: false, shouldHideAds, pageId, + switches, }); const html = renderAppsBlocks({ blocks: enhancedBlocks, diff --git a/dotcom-rendering/src/server/handler.article.web.ts b/dotcom-rendering/src/server/handler.article.web.ts index af9be3118cf..2d4b3a4a7a0 100644 --- a/dotcom-rendering/src/server/handler.article.web.ts +++ b/dotcom-rendering/src/server/handler.article.web.ts @@ -60,6 +60,7 @@ export const handleBlocks: RequestHandler = ({ body }, res) => { shouldHideAds, pageId, serverSideABTests, + switches, }); const html = renderBlocks({ blocks: enhancedBlocks, diff --git a/dotcom-rendering/src/types/article.ts b/dotcom-rendering/src/types/article.ts index 808923e3629..fce46392341 100644 --- a/dotcom-rendering/src/types/article.ts +++ b/dotcom-rendering/src/types/article.ts @@ -105,6 +105,7 @@ export const enhanceArticleType = ( shouldHideAds: data.shouldHideAds, pageId: data.pageId, serverSideABTests: data.config.serverSideABTests, + switches: data.config.switches, }); const crosswordBlock = buildCrosswordBlock(data); From c9056012f86870365a24aba4255619002dddb143 Mon Sep 17 00:00:00 2001 From: George Haberis Date: Thu, 5 Feb 2026 14:29:35 +0000 Subject: [PATCH 2/4] remove log --- dotcom-rendering/src/model/enhance-product-summary.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/dotcom-rendering/src/model/enhance-product-summary.ts b/dotcom-rendering/src/model/enhance-product-summary.ts index 5b6d1666de9..0736fffaf6f 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.ts @@ -191,8 +191,6 @@ export const enhanceProductSummary = const abTestVariant = serverSideABTests?.['thefilter-at-a-glance-redesign']; - console.log('**** filterAtAGlanceEnabled ****', filterAtAGlanceEnabled); - // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps if ( filterAtAGlanceEnabled && From 47d897dee114e88babf2ebe27b36c21100ee4a86 Mon Sep 17 00:00:00 2001 From: George Haberis Date: Fri, 6 Feb 2026 11:40:08 +0000 Subject: [PATCH 3/4] add unit test --- .../src/model/enhance-product-summary.test.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/dotcom-rendering/src/model/enhance-product-summary.test.ts b/dotcom-rendering/src/model/enhance-product-summary.test.ts index 53878ae8470..fd6bcc4be68 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.test.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.test.ts @@ -315,4 +315,46 @@ describe('enhanceProductSummary', () => { expect(stacked).toBeUndefined(); }); + + it('does not return stacked cards when the filterAtAGlance switch is OFF', () => { + const allowedPageId = + 'thefilter/test-article-example-for-product-summary'; + + const input = [ + atAGlanceHeading(), + linkElement( + 'https://www.homebase.co.uk/en-uk/tower-airx-t17166-5l-grey-single-basket-air-fryer-digital-air-fryer/p/0757395', + 'Buy now', + ), + linkElement( + 'https://www.lakeland.co.uk/27537/lakeland-slimline-air-fryer-black-8l', + 'Buy now', + ), + linkElement( + 'https://ninjakitchen.co.uk/product/ninja-double-stack-xl-9-5l-air-fryer-sl400uk-zidSL400UK', + 'Buy now', + ), + dividerElement(), + productElement([ + 'https://www.homebase.co.uk/en-uk/tower-airx-t17166-5l-grey-single-basket-air-fryer-digital-air-fryer/p/0757395', + ]), + productElement([ + 'https://www.lakeland.co.uk/27537/lakeland-slimline-air-fryer-black-8l', + ]), + productElement([ + 'https://ninjakitchen.co.uk/product/ninja-double-stack-xl-9-5l-air-fryer-sl400uk-zidSL400UK', + ]), + ]; + + const output = enhanceProductSummary({ + pageId: allowedPageId, + serverSideABTests: { 'thefilter-at-a-glance-redesign': 'stacked' }, + renderingTarget: 'Web', + filterAtAGlanceEnabled: false, + })(input); + + const stacked = findStacked(output); + + expect(stacked).toBeUndefined(); + }); }); From 66cdb1513d7ca7f740680c703875ae928e5a810f Mon Sep 17 00:00:00 2001 From: George Haberis Date: Fri, 6 Feb 2026 11:43:05 +0000 Subject: [PATCH 4/4] update comment --- dotcom-rendering/src/model/enhance-product-summary.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotcom-rendering/src/model/enhance-product-summary.ts b/dotcom-rendering/src/model/enhance-product-summary.ts index 0736fffaf6f..c741dd3e462 100644 --- a/dotcom-rendering/src/model/enhance-product-summary.ts +++ b/dotcom-rendering/src/model/enhance-product-summary.ts @@ -191,7 +191,7 @@ export const enhanceProductSummary = const abTestVariant = serverSideABTests?.['thefilter-at-a-glance-redesign']; - // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps + // do nothing if article is not on allow list / not in the test / variant is 'control' / renderingTarget is Apps / filterAtAGlance switch is OFF if ( filterAtAGlanceEnabled && abTestVariant &&