diff --git a/libs/blocks/caas-config/caas-config.js b/libs/blocks/caas-config/caas-config.js index 0b71778de2..738bc11319 100644 --- a/libs/blocks/caas-config/caas-config.js +++ b/libs/blocks/caas-config/caas-config.js @@ -999,6 +999,7 @@ const Configurator = ({ rootEl }) => { }, [state.placeholderUrl]); useEffect(async () => { + if (!state.tagsUrl) return; const { tags, errorMsg } = await loadCaasTags(state.tagsUrl); setPanels(getPanels(tags)); setError(errorMsg || ''); diff --git a/libs/blocks/caas-config/caas-tags.js b/libs/blocks/caas-config/caas-tags.js index e8050ccbae..dcdad5d843 100644 --- a/libs/blocks/caas-config/caas-tags.js +++ b/libs/blocks/caas-config/caas-tags.js @@ -172,7 +172,7 @@ const caasTags = { 'title.zh_cn': '网络讲座', 'title.pt': 'Webinário', 'title.fr': 'Webinaire', - 'title.ja': 'ウェビナー', + 'title.ja': 'オンデマンド ウェビナー', 'title.zh_tw': '網路研討會', 'title.it': 'Webinar', 'title.ko': '온라인 세미나', @@ -217,7 +217,7 @@ const caasTags = { 'title.zh_cn': '活动环节', 'title.pt': 'SESSÃO DE EVENTO', 'title.fr': 'Événement session', - 'title.ja': 'イベントセッション', + 'title.ja': '近日公開予定 ウェビナー', 'title.zh_tw': '活動會議', 'title.it': 'Sessione', 'title.ko': '이벤트 세션', @@ -2271,6 +2271,16 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'public-sector': { + path: '/content/cq:tags/caas/industry/public-sector', + tagID: 'caas:industry/public-sector', + name: 'public-sector', + tagImage: '', + title: 'Public Sector', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, events: { @@ -2701,6 +2711,16 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'strategy-keynote': { + path: '/content/cq:tags/caas/events/session-type/strategy-keynote', + tagID: 'caas:events/session-type/strategy-keynote', + name: 'strategy-keynote', + tagImage: '', + title: 'Strategy Keynote', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, max: { @@ -4459,6 +4479,16 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 2024: { + path: '/content/cq:tags/caas/events/year/2024', + tagID: 'caas:events/year/2024', + name: '2024', + tagImage: '', + title: '2024', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, 'speaker-type': { @@ -4640,6 +4670,46 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'preconference-training': { + path: '/content/cq:tags/caas/events/speaker-type/preconference-training', + tagID: 'caas:events/speaker-type/preconference-training', + name: 'preconference-training', + tagImage: '', + title: 'Preconference Training', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'skill-exchange': { + path: '/content/cq:tags/caas/events/speaker-type/skill-exchange', + tagID: 'caas:events/speaker-type/skill-exchange', + name: 'skill-exchange', + tagImage: '', + title: 'Skill Exchange', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'strategy-keynote': { + path: '/content/cq:tags/caas/events/speaker-type/strategy-keynote', + tagID: 'caas:events/speaker-type/strategy-keynote', + name: 'strategy-keynote', + tagImage: '', + title: 'Strategy Keynote', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + lab: { + path: '/content/cq:tags/caas/events/speaker-type/lab', + tagID: 'caas:events/speaker-type/lab', + name: 'lab', + tagImage: '', + title: 'Lab', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, 'event-session-type': { @@ -4721,6 +4791,16 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'on-demand': { + path: '/content/cq:tags/caas/events/event-session-type/livestreamed-content/on-demand', + tagID: 'caas:events/event-session-type/livestreamed-content/on-demand', + name: 'on-demand', + tagImage: '', + title: 'On-Demand', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, }, @@ -5460,6 +5540,176 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'social-strategist': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/social-strategist', + tagID: 'caas:events/summit/area-of-expertise/social-strategist', + name: 'social-strategist', + tagImage: '', + title: 'Social Strategist', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'project-program-manager': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/project-program-manager', + tagID: 'caas:events/summit/area-of-expertise/project-program-manager', + name: 'project-program-manager', + tagImage: '', + title: 'Project or Program Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'operations-professional': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/operations-professional', + tagID: 'caas:events/summit/area-of-expertise/operations-professional', + name: 'operations-professional', + tagImage: '', + title: 'Operations Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'omnichannel-architect': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/omnichannel-architect', + tagID: 'caas:events/summit/area-of-expertise/omnichannel-architect', + name: 'omnichannel-architect', + tagImage: '', + title: 'Omnichannel Architect', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'marketing-technologist': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/marketing-technologist', + tagID: 'caas:events/summit/area-of-expertise/marketing-technologist', + name: 'marketing-technologist', + tagImage: '', + title: 'Marketing Technologist', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'marketing-operations': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/marketing-operations', + tagID: 'caas:events/summit/area-of-expertise/marketing-operations', + name: 'marketing-operations', + tagImage: '', + title: 'Marketing Operations', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'marketing-analyst': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/marketing-analyst', + tagID: 'caas:events/summit/area-of-expertise/marketing-analyst', + name: 'marketing-analyst', + tagImage: '', + title: 'Marketing Analyst', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'email-manager': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/email-manager', + tagID: 'caas:events/summit/area-of-expertise/email-manager', + name: 'email-manager', + tagImage: '', + title: 'Email Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'it-professional': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/it-professional', + tagID: 'caas:events/summit/area-of-expertise/it-professional', + name: 'it-professional', + tagImage: '', + title: 'IT Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + designer: { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/designer', + tagID: 'caas:events/summit/area-of-expertise/designer', + name: 'designer', + tagImage: '', + title: 'Designer', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'data-practitioner': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/data-practitioner', + tagID: 'caas:events/summit/area-of-expertise/data-practitioner', + name: 'data-practitioner', + tagImage: '', + title: 'Data Practitioner', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'content-manager': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/content-manager', + tagID: 'caas:events/summit/area-of-expertise/content-manager', + name: 'content-manager', + tagImage: '', + title: 'Content Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'business-development-representative': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/business-development-representative', + tagID: 'caas:events/summit/area-of-expertise/business-development-representative', + name: 'business-development-representative', + tagImage: '', + title: 'Business Development Representative', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'commerce-professional': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/commerce-professional', + tagID: 'caas:events/summit/area-of-expertise/commerce-professional', + name: 'commerce-professional', + tagImage: '', + title: 'Commerce Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'business-decision-maker': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/business-decision-maker', + tagID: 'caas:events/summit/area-of-expertise/business-decision-maker', + name: 'business-decision-maker', + tagImage: '', + title: 'Business Decision Maker', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'legal-privacy-officer': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/legal-privacy-officer', + tagID: 'caas:events/summit/area-of-expertise/legal-privacy-officer', + name: 'legal-privacy-officer', + tagImage: '', + title: 'Legal or Privacy Officer', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'people-manager': { + path: '/content/cq:tags/caas/events/summit/area-of-expertise/people-manager', + tagID: 'caas:events/summit/area-of-expertise/people-manager', + name: 'people-manager', + tagImage: '', + title: 'People Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, track: { @@ -5721,6 +5971,96 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + analytics: { + path: '/content/cq:tags/caas/events/summit/track/analytics', + tagID: 'caas:events/summit/track/analytics', + name: 'analytics', + tagImage: '', + title: 'Analytics', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + commerce: { + path: '/content/cq:tags/caas/events/summit/track/commerce', + tagID: 'caas:events/summit/track/commerce', + name: 'commerce', + tagImage: '', + title: 'Commerce', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'content-management': { + path: '/content/cq:tags/caas/events/summit/track/content-management', + tagID: 'caas:events/summit/track/content-management', + name: 'content-management', + tagImage: '', + title: 'Content Management', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'customer-data-management-and-acquisition': { + path: '/content/cq:tags/caas/events/summit/track/customer-data-management-and-acquisition', + tagID: 'caas:events/summit/track/customer-data-management-and-acquisition', + name: 'customer-data-management-and-acquisition', + tagImage: '', + title: 'Customer Data Management and Acquisition', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'customer-journey-management': { + path: '/content/cq:tags/caas/events/summit/track/customer-journey-management', + tagID: 'caas:events/summit/track/customer-journey-management', + name: 'customer-journey-management', + tagImage: '', + title: 'Customer Journey Management', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + developers: { + path: '/content/cq:tags/caas/events/summit/track/developers', + tagID: 'caas:events/summit/track/developers', + name: 'developers', + tagImage: '', + title: 'Developers', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'generative-ai': { + path: '/content/cq:tags/caas/events/summit/track/generative-ai', + tagID: 'caas:events/summit/track/generative-ai', + name: 'generative-ai', + tagImage: '', + title: 'Generative AI', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'personalized-insights-and-engagement': { + path: '/content/cq:tags/caas/events/summit/track/personalized-insights-and-engagement', + tagID: 'caas:events/summit/track/personalized-insights-and-engagement', + name: 'personalized-insights-and-engagement', + tagImage: '', + title: 'Personalized Insights and Engagement', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'planning-and-workflow': { + path: '/content/cq:tags/caas/events/summit/track/planning-and-workflow', + tagID: 'caas:events/summit/track/planning-and-workflow', + name: 'planning-and-workflow', + tagImage: '', + title: 'Planning and Workflow', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, giveaway: { @@ -5909,7 +6249,8 @@ const caasTags = { name: 'trends-and-inspiration', tagImage: '', title: 'Trends and Inspiration', - description: '', + description: + 'Join fellow CMOs, CIOs, and digital leaders as they discuss generative AI, customer experience, digital trends, leadership, and how a new approach to people, processes, and technology can help drive growth and build customer loyalty.', 'cq:movedTo': '', tags: {}, }, @@ -5929,7 +6270,7 @@ const caasTags = { name: 'keynotes-sneaks', tagImage: '', title: 'Keynotes & Sneaks', - description: '', + description: 'Learn from leading brands, take a sneak peek at what’s new and next from Adobe Labs, and get an exclusive look at Adobe’s vision for experience-led growth.', 'cq:movedTo': '', tags: {}, }, @@ -5999,7 +6340,8 @@ const caasTags = { name: 'b2b-marketing', tagImage: '', title: 'B2B Marketing', - description: '', + description: + 'From the first customer touchpoint, marketing and sales must create a seamless customer journey. Learn how Adobe’s innovation in personalization, automation, and measurement — powered by data and generative AI — help deliver exceptional experiences.', 'cq:movedTo': '', tags: {}, }, @@ -6033,6 +6375,94 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + analytics: { + path: '/content/cq:tags/caas/events/summit/primary-track/analytics', + tagID: 'caas:events/summit/primary-track/analytics', + name: 'analytics', + tagImage: '', + title: 'Analytics', + description: + 'Customer journeys can take place anywhere, on any device, so having a complete view is critical. Learn how teams across the organization — from analysts to marketers — get complete, real-time customer views across digital and omnichannel journeys.', + 'cq:movedTo': '', + tags: {}, + }, + commerce: { + path: '/content/cq:tags/caas/events/summit/primary-track/commerce', + tagID: 'caas:events/summit/primary-track/commerce', + name: 'commerce', + tagImage: '', + title: 'Commerce', + description: + 'Successful companies use data and customer insights to personalize shopping experiences across business models and channels. Discover how to deliver the most impactful end-to-end commerce journeys that increase revenue, productivity, and innovation.', + 'cq:movedTo': '', + tags: {}, + }, + 'content-management': { + path: '/content/cq:tags/caas/events/summit/primary-track/content-management', + tagID: 'caas:events/summit/primary-track/content-management', + name: 'content-management', + tagImage: '', + title: 'Content Management', + description: + "Achieving content success requires a dual approach: producing it rapidly and ensuring it’s driving engagement through stand-out experiences. Learn how Adobe's unmatched content management tools can help you harness the power of customer experiences.", + 'cq:movedTo': '', + tags: {}, + }, + 'content-supply-chain': { + path: '/content/cq:tags/caas/events/summit/primary-track/content-supply-chain', + tagID: 'caas:events/summit/primary-track/content-supply-chain', + name: 'content-supply-chain', + tagImage: '', + title: 'Content Supply Chain', + description: + 'Disconnected teams, disparate tools, and inefficient workflows keep brands from achieving their required content velocity. Learn how to optimize each step of the content supply chain, from workflows, to content creation, to delivery and activation.', + 'cq:movedTo': '', + tags: {}, + }, + 'customer-data-management-and-acquisition': { + path: '/content/cq:tags/caas/events/summit/primary-track/customer-data-management-and-acquisition', + tagID: 'caas:events/summit/primary-track/customer-data-management-and-acquisition', + name: 'customer-data-management-and-acquisition', + tagImage: '', + title: 'Customer Data Management and Acquisition', + description: + 'An integrated approach to customer data is foundational for how data is collected, analyzed, governed, and activated for personalization at scale. Learn how to transform data into impactful customer experiences while maintaining privacy and trust.', + 'cq:movedTo': '', + tags: {}, + }, + 'customer-journey-management': { + path: '/content/cq:tags/caas/events/summit/primary-track/customer-journey-management', + tagID: 'caas:events/summit/primary-track/customer-journey-management', + name: 'customer-journey-management', + tagImage: '', + title: 'Customer Journey Management', + description: + 'Higher-than-ever consumer expectations demand sophisticated customer journeys with real-time, 1:1 personalization across all devices and channels. Explore how Adobe solutions can help you connect data and content to do it all at scale — every time.', + 'cq:movedTo': '', + tags: {}, + }, + 'planning-and-workflow': { + path: '/content/cq:tags/caas/events/summit/primary-track/planning-and-workflow', + tagID: 'caas:events/summit/primary-track/planning-and-workflow', + name: 'planning-and-workflow', + tagImage: '', + title: 'Planning and Workflow', + description: + 'Optimize efficiency and drive critical business outcomes by automating process flows, centralizing programs, enabling collaboration, and aligning execution with objectives to seamlessly connect the way people, projects, and strategy come together.', + 'cq:movedTo': '', + tags: {}, + }, + 'generative-ai': { + path: '/content/cq:tags/caas/events/summit/primary-track/generative-ai', + tagID: 'caas:events/summit/primary-track/generative-ai', + name: 'generative-ai', + tagImage: '', + title: 'Generative AI', + description: + 'Delve into the critical role of Adobe Sensei GenAI — learn how it empowers marketers to work more efficiently, generate content optimized for key business objectives, and maximize ROI with the seamless delivery of personalized experiences at scale.', + 'cq:movedTo': '', + tags: {}, + }, }, }, }, @@ -6791,6 +7221,166 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'business-decision-maker': { + path: '/content/cq:tags/caas/events/audience-type/business-decision-maker', + tagID: 'caas:events/audience-type/business-decision-maker', + name: 'business-decision-maker', + tagImage: '', + title: 'Business Decision Maker', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'business-development-representative': { + path: '/content/cq:tags/caas/events/audience-type/business-development-representative', + tagID: 'caas:events/audience-type/business-development-representative', + name: 'business-development-representative', + tagImage: '', + title: 'Business Development Representative', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'commerce-professional': { + path: '/content/cq:tags/caas/events/audience-type/commerce-professional', + tagID: 'caas:events/audience-type/commerce-professional', + name: 'commerce-professional', + tagImage: '', + title: 'Commerce Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'content-manager': { + path: '/content/cq:tags/caas/events/audience-type/content-manager', + tagID: 'caas:events/audience-type/content-manager', + name: 'content-manager', + tagImage: '', + title: 'Content Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'data-practitioner': { + path: '/content/cq:tags/caas/events/audience-type/data-practitioner', + tagID: 'caas:events/audience-type/data-practitioner', + name: 'data-practitioner', + tagImage: '', + title: 'Data Practitioner', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + designer: { + path: '/content/cq:tags/caas/events/audience-type/designer', + tagID: 'caas:events/audience-type/designer', + name: 'designer', + tagImage: '', + title: 'Designer', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'email-manager': { + path: '/content/cq:tags/caas/events/audience-type/email-manager', + tagID: 'caas:events/audience-type/email-manager', + name: 'email-manager', + tagImage: '', + title: 'Email Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'it-professional': { + path: '/content/cq:tags/caas/events/audience-type/it-professional', + tagID: 'caas:events/audience-type/it-professional', + name: 'it-professional', + tagImage: '', + title: 'IT Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'marketing-operations': { + path: '/content/cq:tags/caas/events/audience-type/marketing-operations', + tagID: 'caas:events/audience-type/marketing-operations', + name: 'marketing-operations', + tagImage: '', + title: 'Marketing Operations', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'marketing-technologist': { + path: '/content/cq:tags/caas/events/audience-type/marketing-technologist', + tagID: 'caas:events/audience-type/marketing-technologist', + name: 'marketing-technologist', + tagImage: '', + title: 'Marketing Technologist', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'omnichannel-architect': { + path: '/content/cq:tags/caas/events/audience-type/omnichannel-architect', + tagID: 'caas:events/audience-type/omnichannel-architect', + name: 'omnichannel-architect', + tagImage: '', + title: 'Omnichannel Architect', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'operations-professional': { + path: '/content/cq:tags/caas/events/audience-type/operations-professional', + tagID: 'caas:events/audience-type/operations-professional', + name: 'operations-professional', + tagImage: '', + title: 'Operations Professional', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'people-manager': { + path: '/content/cq:tags/caas/events/audience-type/people-manager', + tagID: 'caas:events/audience-type/people-manager', + name: 'people-manager', + tagImage: '', + title: 'People Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'social-strategist': { + path: '/content/cq:tags/caas/events/audience-type/social-strategist', + tagID: 'caas:events/audience-type/social-strategist', + name: 'social-strategist', + tagImage: '', + title: 'Social Strategist', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'legal-privacy-officer': { + path: '/content/cq:tags/caas/events/audience-type/legal-privacy-officer', + tagID: 'caas:events/audience-type/legal-privacy-officer', + name: 'legal-privacy-officer', + tagImage: '', + title: 'Legal or Privacy Officer', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'project-program-manager': { + path: '/content/cq:tags/caas/events/audience-type/project-program-manager', + tagID: 'caas:events/audience-type/project-program-manager', + name: 'project-program-manager', + tagImage: '', + title: 'Project or Program Manager', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, products: { @@ -7593,7 +8183,7 @@ const caasTags = { tagID: 'caas:events/products/marketo-measure', name: 'marketo-measure', tagImage: '', - title: 'Marketo Measure', + title: 'Adobe Marketo Measure', description: '', 'cq:movedTo': '', tags: {}, @@ -7718,6 +8308,56 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'adobe-dynamic-chat': { + path: '/content/cq:tags/caas/events/products/adobe-dynamic-chat', + tagID: 'caas:events/products/adobe-dynamic-chat', + name: 'adobe-dynamic-chat', + tagImage: '', + title: 'Adobe Dynamic Chat', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'adobe-experience-manager-screens': { + path: '/content/cq:tags/caas/events/products/adobe-experience-manager-screens', + tagID: 'caas:events/products/adobe-experience-manager-screens', + name: 'adobe-experience-manager-screens', + tagImage: '', + title: 'Adobe Experience Manager Screens', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'adobe-gen-studio': { + path: '/content/cq:tags/caas/events/products/adobe-gen-studio', + tagID: 'caas:events/products/adobe-gen-studio', + name: 'adobe-gen-studio', + tagImage: '', + title: 'Adobe Gen Studio', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'adobe-mix-modeler': { + path: '/content/cq:tags/caas/events/products/adobe-mix-modeler', + tagID: 'caas:events/products/adobe-mix-modeler', + name: 'adobe-mix-modeler', + tagImage: '', + title: 'Adobe Mix Modeler', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'adobe-product-analytics': { + path: '/content/cq:tags/caas/events/products/adobe-product-analytics', + tagID: 'caas:events/products/adobe-product-analytics', + name: 'adobe-product-analytics', + tagImage: '', + title: 'Adobe Product Analytics', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, region: { @@ -8009,7 +8649,7 @@ const caasTags = { tagID: 'caas:events/industry/healthcare-lifesciences', name: 'healthcare-lifesciences', tagImage: '', - title: 'Healthcare & Lifesciences', + title: 'Healthcare & Life Sciences', description: '', 'cq:movedTo': '', tags: {}, @@ -8104,6 +8744,66 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'financial-services': { + path: '/content/cq:tags/caas/events/industry/financial-services', + tagID: 'caas:events/industry/financial-services', + name: 'financial-services', + tagImage: '', + title: 'Financial Services', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + healthcare: { + path: '/content/cq:tags/caas/events/industry/healthcare', + tagID: 'caas:events/industry/healthcare', + name: 'healthcare', + tagImage: '', + title: 'Healthcare', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'it-professional-services': { + path: '/content/cq:tags/caas/events/industry/it-professional-services', + tagID: 'caas:events/industry/it-professional-services', + name: 'it-professional-services', + tagImage: '', + title: 'IT Professional Services', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + lifesciences: { + path: '/content/cq:tags/caas/events/industry/lifesciences', + tagID: 'caas:events/industry/lifesciences', + name: 'lifesciences', + tagImage: '', + title: 'Lifesciences', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'media-entertainment-communications': { + path: '/content/cq:tags/caas/events/industry/media-entertainment-communications', + tagID: 'caas:events/industry/media-entertainment-communications', + name: 'media-entertainment-communications', + tagImage: '', + title: 'Media, Entertainment, & Communications', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'travel-hospitality-dining': { + path: '/content/cq:tags/caas/events/industry/travel-hospitality-dining', + tagID: 'caas:events/industry/travel-hospitality-dining', + name: 'travel-hospitality-dining', + tagImage: '', + title: 'Travel, Hospitality, and Dining', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, type: { @@ -9286,6 +9986,16 @@ const caasTags = { }, }, }, + 'on-demand-post-event': { + path: '/content/cq:tags/caas/events/session-format/in-person/on-demand-post-event', + tagID: 'caas:events/session-format/in-person/on-demand-post-event', + name: 'on-demand-post-event', + tagImage: '', + title: 'On demand post event', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, online: { @@ -9405,6 +10115,16 @@ const caasTags = { }, }, }, + 'max-london': { + path: '/content/cq:tags/caas/events/max-london', + tagID: 'caas:events/max-london', + name: 'max-london', + tagImage: '', + title: 'MAX London', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, gated: { @@ -10568,6 +11288,16 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + express: { + path: '/content/cq:tags/caas/source/express', + tagID: 'caas:source/express', + name: 'express', + tagImage: '', + title: 'Express', + description: 'adobe.com/express source tag', + 'cq:movedTo': '', + tags: {}, + }, }, }, products: { @@ -11608,6 +12338,36 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + genstudio: { + path: '/content/cq:tags/caas/products/genstudio', + tagID: 'caas:products/genstudio', + name: 'genstudio', + tagImage: '', + title: 'GenStudio', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'adobe-journey-optimizer---b2b-edition': { + path: '/content/cq:tags/caas/products/adobe-journey-optimizer---b2b-edition', + tagID: 'caas:products/adobe-journey-optimizer---b2b-edition', + name: 'adobe-journey-optimizer---b2b-edition', + tagImage: '', + title: 'Adobe Journey Optimizer - B2B Edition', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'content-supply-chain': { + path: '/content/cq:tags/caas/products/content-supply-chain', + tagID: 'caas:products/content-supply-chain', + name: 'content-supply-chain', + tagImage: '', + title: 'Content Supply Chain', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, 'product-categories': { @@ -15338,6 +16098,36 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'ai-prompts': { + path: '/content/cq:tags/caas/topic/ai-prompts', + tagID: 'caas:topic/ai-prompts', + name: 'ai-prompts', + tagImage: '', + title: 'AI Prompts', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + trends: { + path: '/content/cq:tags/caas/topic/trends', + tagID: 'caas:topic/trends', + name: 'trends', + tagImage: '', + title: 'Trends', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + news: { + path: '/content/cq:tags/caas/topic/news', + tagID: 'caas:topic/news', + name: 'news', + tagImage: '', + title: 'News', + description: '', + 'cq:movedTo': '', + tags: {}, + }, }, }, 'technical-level': { @@ -15859,6 +16649,47 @@ const caasTags = { 'cq:movedTo': '', tags: {}, }, + 'webinar-timing': { + path: '/content/cq:tags/caas/webinar-timing', + tagID: 'caas:webinar-timing', + name: 'webinar-timing', + tagImage: '', + title: 'Webinar Timing', + description: '', + 'cq:movedTo': '', + tags: { + live: { + path: '/content/cq:tags/caas/webinar-timing/live', + tagID: 'caas:webinar-timing/live', + name: 'live', + tagImage: '', + title: 'Live', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + 'on-demand': { + path: '/content/cq:tags/caas/webinar-timing/on-demand', + tagID: 'caas:webinar-timing/on-demand', + name: 'on-demand', + tagImage: '', + title: 'On Demand', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + upcoming: { + path: '/content/cq:tags/caas/webinar-timing/upcoming', + tagID: 'caas:webinar-timing/upcoming', + name: 'upcoming', + tagImage: '', + title: 'Upcoming', + description: '', + 'cq:movedTo': '', + tags: {}, + }, + }, + }, }, }, }, diff --git a/libs/blocks/global-footer/global-footer.js b/libs/blocks/global-footer/global-footer.js index 6a6c280e94..32dafa537f 100644 --- a/libs/blocks/global-footer/global-footer.js +++ b/libs/blocks/global-footer/global-footer.js @@ -18,6 +18,8 @@ import { lanaLog, logErrorFor, toFragment, + getFederatedUrl, + federatePictureSources, } from '../global-navigation/utilities/utilities.js'; import { replaceKey } from '../../features/placeholders.js'; @@ -90,6 +92,9 @@ class Footer { regionParent?.appendChild(region); socialParent?.appendChild(social); + const path = getFederatedUrl(url); + federatePictureSources({ section: this.body, forceFederate: path.includes('/federal/') }); + // Order is important, decorateFooter makes use of elements // which have already been created in previous steps const tasks = [ diff --git a/libs/blocks/global-navigation/global-navigation.js b/libs/blocks/global-navigation/global-navigation.js index bf0b41e2a2..2e55f418bd 100644 --- a/libs/blocks/global-navigation/global-navigation.js +++ b/libs/blocks/global-navigation/global-navigation.js @@ -269,7 +269,6 @@ class Gnav { }; this.setupUniversalNav(); - decorateLinks(this.content); this.elements = {}; } @@ -949,7 +948,7 @@ export default async function init(block) { try { const { locale, mep } = getConfig(); const url = getMetadata('gnav-source') || `${locale.contentRoot}/gnav`; - const content = await fetchAndProcessPlainHtml({ url, shouldDecorateLinks: false }) + const content = await fetchAndProcessPlainHtml({ url }) .catch((e) => lanaLog({ message: `Error fetching gnav content url: ${url}`, e, diff --git a/libs/blocks/global-navigation/utilities/utilities.js b/libs/blocks/global-navigation/utilities/utilities.js index a335f99cac..e36b31194b 100644 --- a/libs/blocks/global-navigation/utilities/utilities.js +++ b/libs/blocks/global-navigation/utilities/utilities.js @@ -320,9 +320,11 @@ export async function fetchAndProcessPlainHtml({ url, shouldDecorateLinks = true await Promise.all(fragPromises); } - if (shouldDecorateLinks) decorateLinks(body); - - federatePictureSources({ section: body, forceFederate: path.includes('/federal/') }); + // federatePictureSources should only be called after decorating the links. + if (shouldDecorateLinks) { + decorateLinks(body); + federatePictureSources({ section: body, forceFederate: path.includes('/federal/') }); + } const blocks = body.querySelectorAll('.martech-metadata'); if (blocks.length) { diff --git a/libs/blocks/modal/modal.js b/libs/blocks/modal/modal.js index d8c34964d5..443ff92c29 100644 --- a/libs/blocks/modal/modal.js +++ b/libs/blocks/modal/modal.js @@ -176,14 +176,45 @@ export async function getModal(details, custom) { return dialog; } +export function getHashParams(hashStr) { + if (!hashStr) return {}; + return hashStr.split(':').reduce((params, part) => { + if (part.startsWith('#')) { + params.hash = part; + } else { + const [key, val] = part.split('='); + if (key === 'delay' && parseInt(val, 10) > 0) { + params.delay = parseInt(val, 10) * 1000; + } + } + return params; + }, {}); +} + +export function delayedModal(el) { + const { hash, delay } = getHashParams(el?.dataset.modalHash); + if (!delay || !hash) return false; + el.classList.add('hide-block'); + const modalOpenEvent = new Event(`${hash}:modalOpen`); + const pagesModalWasShownOn = window.sessionStorage.getItem(`shown:${hash}`); + el.dataset.modalHash = hash; + el.href = hash; + if (!pagesModalWasShownOn?.includes(window.location.pathname)) { + setTimeout(() => { + window.location.replace(hash); + sendAnalytics(modalOpenEvent); + window.sessionStorage.setItem(`shown:${hash}`, `${pagesModalWasShownOn || ''} ${window.location.pathname}`); + }, delay); + } + return true; +} + // Deep link-based export default function init(el) { const { modalHash } = el.dataset; - if (window.location.hash === modalHash && !document.querySelector(`div.dialog-modal${modalHash}`)) { - const details = findDetails(window.location.hash, el); - if (details) return getModal(details); - } - return null; + if (delayedModal(el) || window.location.hash !== modalHash || document.querySelector(`div.dialog-modal${modalHash}`)) return null; + const details = findDetails(window.location.hash, el); + return details ? getModal(details) : null; } // Click-based modal diff --git a/libs/features/personalization/add-preview-to-config.js b/libs/features/personalization/add-preview-to-config.js index 911f2cefc7..365956efe0 100644 --- a/libs/features/personalization/add-preview-to-config.js +++ b/libs/features/personalization/add-preview-to-config.js @@ -27,7 +27,7 @@ export default async function addPreviewToConfig({ } }); - config.mep.override.split(',').forEach((manifestPair) => { + config.mep.override.split('---').forEach((manifestPair) => { const manifestPath = manifestPair.trim().toLowerCase().split('--')[0]; if (!persManifestPaths.includes(manifestPath)) { persManifests.push({ manifestPath }); diff --git a/libs/features/personalization/personalization.js b/libs/features/personalization/personalization.js index 8028300537..2c651274ce 100644 --- a/libs/features/personalization/personalization.js +++ b/libs/features/personalization/personalization.js @@ -755,6 +755,8 @@ export async function applyPers(manifests) { const config = getConfig(); if (!manifests?.length) return; + if (!config?.mep) config.mep = {}; + config.mep.handleFragmentCommand = handleFragmentCommand; let experiments = manifests; for (let i = 0; i < experiments.length; i += 1) { experiments[i] = await getPersConfig(experiments[i], config.mep?.override); @@ -788,7 +790,5 @@ export async function applyPers(manifests) { const val = r.experiment?.manifestOverrideName || r.experiment?.manifest; return getFileName(val).replace('.json', '').trim().slice(0, 15); }); - if (!config?.mep) config.mep = {}; config.mep.martech = `|${pznVariants.join('--')}|${pznManifests.join('--')}`; - config.mep.handleFragmentCommand = handleFragmentCommand; } diff --git a/libs/utils/utils.js b/libs/utils/utils.js index 055c1c816a..8f15beb56f 100644 --- a/libs/utils/utils.js +++ b/libs/utils/utils.js @@ -100,7 +100,6 @@ const AUTO_BLOCKS = [ { 'pdf-viewer': '.pdf' }, { video: '.mp4' }, { merch: '/tools/ost?' }, - { 'offer-preview': '/tools/commerce' }, ]; const DO_NOT_INLINE = [ 'accordion', @@ -1044,6 +1043,7 @@ async function processSection(section, config, isDoc) { const { default: loadInlineFrags } = await import('../blocks/fragment/fragment.js'); const fragPromises = inlineFrags.map((link) => loadInlineFrags(link)); await Promise.all(fragPromises); + await decoratePlaceholders(section.el, config); const newlyDecoratedSection = decorateSection(section.el, section.idx); section.blocks = newlyDecoratedSection.blocks; section.preloadLinks = newlyDecoratedSection.preloadLinks; diff --git a/test/blocks/modals/modals.test.js b/test/blocks/modals/modals.test.js index 9a825b2953..daf6ddc950 100644 --- a/test/blocks/modals/modals.test.js +++ b/test/blocks/modals/modals.test.js @@ -1,11 +1,26 @@ import { readFile, sendKeys } from '@web/test-runner-commands'; import { expect } from '@esm-bundle/chai'; +import sinon from 'sinon'; import { delay, waitForElement, waitForRemoval } from '../../helpers/waitfor.js'; -import init, { getModal } from '../../../libs/blocks/modal/modal.js'; document.body.innerHTML = await readFile({ path: './mocks/body.html' }); +const { + default: init, + getModal, + getHashParams, + delayedModal, +} = await import('../../../libs/blocks/modal/modal.js'); describe('Modals', () => { + beforeEach(() => { + // eslint-disable-next-line no-underscore-dangle + window._satellite = { track: sinon.spy() }; + }); + + afterEach(() => { + sinon.restore(); + }); + it('Doesnt load modals on page load with no hash', async () => { window.location.hash = ''; const modal = document.querySelector('.dialog-modal'); @@ -169,4 +184,43 @@ describe('Modals', () => { // Test passing, means there was no error thrown await hashChangeTriggered; }); + + it('validates and returns proper hash parameters', () => { + expect(getHashParams()).to.deep.equal({}); + expect(getHashParams('#delayed-modal:delay=0')).to.deep.equal({ hash: '#delayed-modal' }); + expect(getHashParams('#delayed-modal:delay=1')).to.deep.equal({ + delay: 1000, + hash: '#delayed-modal', + }); + }); + + it('shows the modal with a delay, and remembers it was shown on this page', async () => { + window.sessionStorage.removeItem('shown:#delayed-modal'); + const el = document.createElement('a'); + el.setAttribute('data-modal-hash', '#delayed-modal:delay=1'); + expect(delayedModal(el)).to.be.true; + await delay(1000); + expect(el.classList.contains('hide-block')).to.be.true; + const modal = waitForElement('#delayed-modal'); + expect(modal).to.be.not.null; + expect(window.sessionStorage.getItem('shown:#delayed-modal').includes(window.location.pathname)).to.be.true; + // eslint-disable-next-line no-underscore-dangle + expect(window._satellite.track.called).to.be.true; + window.sessionStorage.removeItem('shown:#delayed-modal'); + el.remove(); + }); + + it('does not show the modal if it was shown on this page', async () => { + const el = document.createElement('a'); + el.setAttribute('data-modal-hash', '#dm:delay=1'); + window.sessionStorage.setItem('shown:#dm', window.location.pathname); + expect(delayedModal(el)).to.be.true; + await delay(1000); + // eslint-disable-next-line no-underscore-dangle + expect(window._satellite.track.called).to.be.false; + const modal = document.querySelector('#dm'); + expect(modal).to.not.exist; + window.sessionStorage.removeItem('shown:#dm'); + el.remove(); + }); }); diff --git a/test/features/personalization/mocks/deprecatedActions/manifestInsertContentAfter.json b/test/features/personalization/mocks/deprecatedActions/manifestInsertContentAfter.json index 59c00ee71e..15b8d8facb 100644 --- a/test/features/personalization/mocks/deprecatedActions/manifestInsertContentAfter.json +++ b/test/features/personalization/mocks/deprecatedActions/manifestInsertContentAfter.json @@ -12,6 +12,16 @@ "firefox": "", "android": "", "ios": "" + }, + { + "action": "insertContentAfter", + "selector": "main > div", + "page filter (optional)": "", + "param-newoffer=123": "", + "chrome": "/fragments/insertafter#delayed-modal:delay=1", + "firefox": "", + "android": "", + "ios": "" } ], ":type": "sheet"