Skip to content

T3-26.29 Prod Release - #189

Merged
qiyundai merged 112 commits into
mainfrom
stage
Jul 16, 2026
Merged

T3-26.29 Prod Release#189
qiyundai merged 112 commits into
mainfrom
stage

Conversation

@qiyundai

Copy link
Copy Markdown
Collaborator

Release notes

Quoting T3-26.29 prod deployment.

  • New Sessions Guide block: interactive event-sessions widget with a featured sessions carousel, My Sessions/Favorites views, on-demand sessions grouped by track, and shared session-state across the page
  • RSVP forms: restored multi-select/radio rendering that had regressed, auto-inject a submit button when the RSVP config doesn't define one, and fixed false-positive phone-field detection
  • Promotional content: fixed matching of custom-attribute promotional items and locale-aware fragment path resolution
  • Mobile Rider (ASL) live player: fixed sign-language stream not reconnecting after toggling ASL, and a timing issue causing a stale player to load
  • Event agenda: event times now render using the event's own locale/timezone instead of the visitor's

🤖 Generated with Claude Code

hnvadobe and others added 30 commits May 14, 2026 00:04
…te-branch workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ive day and sort sessions by start time

- MySessionsView and MyFavoritesView now filter by activeDay via sessionsForDay() so only sessions on the selected day are shown
- groupByStartTime sorts time slot groups chronologically (ISO 8601 string comparison)
- Live carousel in LiveUpcomingView also sorted by startTimeUtc
- Updated MySessionsView test mock to include activeDay; added sort-order assertion to session-filters tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduced featured sessions that populate the live carousel when no live sessions are available.
- Updated configuration to allow authors to specify featured session IDs via JSON.
- Implemented a fallback mechanism to use mock featured session IDs if none are provided.
- Enhanced LiveUpcomingView to display featured sessions in a dedicated carousel section.
- Added utility function to filter and retrieve featured sessions based on active day and provided IDs.
- Updated unit tests to cover new featured sessions functionality.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…eviously aired sessions

- Added functionality to display previously aired sessions in LiveUpcomingView when no upcoming or live sessions are available.
- Updated SessionCard to support a forceOnDemand prop, allowing for better handling of on-demand session states.
- Modified TimeSlotRow to pass the forceOnDemand prop to SessionCard, ensuring consistent behavior across components.
- Enhanced time label logic in SessionCard to differentiate between on-demand and previously aired sessions.

These changes improve the user experience by providing clearer visibility of session availability.
qiyundai and others added 27 commits July 7, 2026 22:23
[MWPW-194614] feat(events-form): inject submit button when rsvp-config has no submit button
fix(promotional-content): rehydrate custom-attribute promotional items
Revert "fix(promotional-content): rehydrate custom-attribute promotional items"
…name field

Custom Attributes-selected promotional items were never picked up because
the code checked attr.attribute instead of the actual attr.name field EMC
sends, and only read a single attr.value instead of the multi-select
values[] array. Product blades now render for items selected via Custom
Attributes, using the fragment path already present in each value.
fix(mobile-rider): re-attach streamend listener on every ASL toggle
…name and resolve locale-aware fragment paths

The Custom Attributes promotionalItems entry is keyed by `name` (not
`attribute`), and its `values[]` array holds one fragment path per
selected item directly - not a product name requiring a promotional-content.json
lookup like the legacy path. Product blades now render for items
selected via Custom Attributes.

Relative fragment paths are also resolved with the event's locale
prefix (mirroring getPromotionalContentUrl), so non-English pages load
the correct localized fragment instead of always falling back to the
default-locale path. Locale resolution degrades gracefully to no
prefix if the Milo import fails.
…no domain/locale resolution

Fragment paths from custom-attributes were being prefixed with
event-libs' own domain (derived from import.meta.url), which pointed
loadFragment at the wrong host instead of resolving relatively against
the client da-events page, matching how the legacy fragment-path was
always used unmodified. Locale-specific fragments should be authored
as separate custom-attribute values per locale in EMC rather than
resolved client-side.
…o's shared modal

Replaces the hand-rolled backdrop/dialog with Milo's modal component (already
used by sessions-hub) to get focus trap, Escape-to-close, scroll lock, and
focus restoration for free, and updates styling to match the Figma handoff.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ndle

Replaces the vendored htm-preact.js (pinned to an old Milo snapshot) with a
locally built bundle of current preact@10.29.7 + @preact/signals@2.9.3 +
htm@3.1.1. The old snapshot predates a core Preact fix for Context updates
being dropped by @preact/signals' shouldComponentUpdate override, which was
silently breaking date-tab/search/filter re-renders. Also exposes the full
public API of all three packages (computed, effect, Fragment, etc.) so future
code can use them without another rebuild, and uses batch() in
scheduleSession()/favoriteSession() to coalesce their state + pending-flag
writes into a single render.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The fallback toLocaleTimeString calls in convertEventTimeToLocalTime
omitted timeZone, so times without a LOCALE_FORMATTERS entry (e.g.
en-GB) were reformatted in the rendering environment's local zone
instead of the event's timezone, shifting displayed agenda times by
the offset between the two.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…eal ESL sessions payload

Wraps the per-render session filtering/grouping in MySessionsView, MyFavoritesView,
and FilterPanel's category-options derivation in useMemo/useComputed, since those
components re-render on every context dispatch (e.g. opening the detail overlay),
not just when their actual inputs change. Adds useComputed to the test htm-preact
mock and batches loadSessions()'s sessions/sessionsStatus writes into one render.

Also adds a temporary, fire-and-forget probeEslPayload() in sessions-api.js, called
from loadSessions(), that hits the real ESL/ESP sessions endpoint (now available)
through the existing constructRequestOptions()/ENV_MAP auth plumbing and logs the
raw response for payload-shape inspection. fetchSessions() itself is untouched and
still returns MOCK_SESSIONS — real wiring is blocked on backend auth questions
(service-token vs user-token, x-adobe-esp-group-id) tracked outside this repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…S specificity lint

MySessionsView.test.js computed session times as fixed hour offsets from real
Date.now(), which crosses the LA midnight boundary (and mismatches the test's
"today" activeDay) whenever the suite runs late at night Pacific time — caught
by a full `npm test` run right now. Clamps the offset relative to time-until/
since LA midnight instead, preserving correct ordering relative to the real
clock (needed for upcoming/on-demand classification) while guaranteeing the
session never lands on a different calendar day than intended.

Also reorders the anim-fav/anim-sched keyframe-trigger rules in
sessions-guide.css to sit before the higher-specificity :not(:hover) rules
they conflict with, fixing `no-descending-specificity` lint failures introduced
by earlier commits on this branch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…p on explicit opt-in metadata

initSessionState() was only gated on `event-id`, which is already authored broadly
across prod event pages for unrelated purposes — that would seed sessions-guide's
mock data (sg:dev-auth, mock scheduled/favorited) on any page with an event-id,
whether or not it actually wants the shared session store. decorateEvent() now
additionally requires `tier-1-event-state-enabled` metadata to be 'true' before
calling initSessionState() at all. Documents the new metadata requirement in
PLAN.md and REAL-API-CHECKLIST.md alongside the existing rainfocus-api-url gate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds SHARED-STATE-USAGE.md documenting how other blocks — both Preact and
vanilla JS — read and mutate the page-level session-store signals, when to
use scheduleWithFeedback()/favoriteWithFeedback() versus the lower-level
session-actions.js, and the tier-1-event-state-enabled/rainfocus-api-url
metadata prerequisite. Cross-linked from PLAN.md's architecture-update note.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…t to session-store.js

Co-locates SHARED-STATE-USAGE.md with the module it documents (utils/session-store.js)
instead of the sessions-guide block directory — the doc's audience is any block
consuming the shared store, not sessions-guide specifically, so it belongs where a
block author importing session-store.js would actually look. Updates its cross-references
to PLAN.md/REAL-API-CHECKLIST.md and PLAN.md's link back to the new path accordingly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… usage guide

Follow-up to the previous commit's rename — that commit only captured the file
move itself; this captures the actual content changes: PLAN.md's link now points
to the new ../../utils/SHARED-STATE-USAGE.md path, and the guide's own references
to PLAN.md/REAL-API-CHECKLIST.md are updated to ../blocks/sessions-guide/ since
it no longer lives in that directory.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
feat(event-agenda): derive agenda time format from event locale
fix(promotional-content): match custom-attribute promotionalItems by name field
…shared session state

Reference implementation for SHARED-STATE-USAGE.md's vanilla-JS pattern: reads
sessions/sessionsStatus/favorited/scheduled/auth via .subscribe() and mutates
through favoriteWithFeedback() rather than session-store.js's raw mutators,
matching the doc's guidance. Registered in EVENT_BLOCKS so it's loadable like
any other block. Not authored on any real event page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
[Mwpw 199065] Add Sessions Guide shared state, conflict modal, and full-page URL params
Stage Release for T3-26.29
…rendering

ESP's scope-config field type enum has no dedicated multi-select value —
select is single-choice, checkbox is multi-choice. EMC now writes a
displayAs render-style hint (dropdown/radio for select; checkbox/dropdown
for checkbox) that ESP already stores and passes through untouched. This
file already implements distinct widgets for 'multi-select' (compact
dropdown with an internal checkbox list, used by the legacy per-cloud JSON
path) and 'radio-group' (radio buttons), but getRsvpConfigFromMeta() never
consulted a render hint for the new scope-config path — it passed type
straight through, so a checkbox field could only ever render as a flat
checkbox-group, and select could only ever render as a plain dropdown.

Remap type based on displayAs before dispatch: checkbox+dropdown becomes
multi-select, select+radio becomes radio-group. Default behavior (no
displayAs, or displayAs matching the type's default) is unchanged, so this
is backward compatible with existing scope configs.
Radio inputs sharing a name are mutually exclusive by native browser
semantics, so constructPayload's checkbox/radio collection always produces
a 0-or-1-element array for a radio group. That's fine for fields declared
type: 'array' in BASE_ATTENDEE_DATA_FILTER, but string-typed fields (e.g.
industry, jobTitle, companySize) have no array-to-string coercion — they'd
submit ["Technology"] instead of "Technology" to the base attendee API.

This was latent since radio-group was only reachable via a hard-coded
per-cloud JSON Type value; the prior commit (select + displayAs: 'radio'
remap) makes it reachable from any ESP-backed scope config, so it needed
fixing before that path could ship. Collapses the array to its single
value (or undefined if none checked), mirroring the existing single-option
checkbox-to-boolean collapse right above it.
fix(events-form): honor RSVP displayAs to restore multi-select/radio rendering
Stage Release for T3-26.30
@aem-code-sync

aem-code-sync Bot commented Jul 16, 2026

Copy link
Copy Markdown

Hello, I'm the AEM Code Sync Bot and I will run some actions to deploy your branch and validate page speed.
In case there are problems, just click a checkbox below to rerun the respective action.

  • Re-run all PSI checks
  • Re-run failed PSI checks
  • Re-sync branch
Commits

@qiyundai
qiyundai merged commit 1d3af01 into main Jul 16, 2026
10 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants