[FEATURE] [MER-4057] Remixing/Customize Content Updates (PR2: Frontend Polish)#6445
Conversation
…o new Modal, design system updates
AI Review — performanceLarge
|
AI Review — securityNo issues found |
AI Review — elixirSave Action In Unsaved-Changes Flow Does Not Continue Navigationfile: lib/oli_web/live/delivery/remix_section.ex LiveView Can Crash On Reload Failure Due To Hard Matchfile: lib/oli_web/live/delivery/remix_section.ex Preselected Guard Removed From Table Rows, Enabling Duplicate Selection If Caller Misses Filteringfile: lib/oli_web/live/common/hierarchy/hierarchy_picker_table_model.ex |
AI Review — uiSave/Cancel appear disabled but remain actionablefile: lib/oli_web/live/delivery/remix_section.html.heex Decorative breadcrumb chevron is exposed to assistive techfile: lib/oli_web/live/breadcrumb/breadcrumb_trail_workspace_live.ex Add Materials modal close target is too small for touch accessibilityfile: lib/oli_web/live/delivery/remix/add_materials_modal.ex Unsaved Changes modal close target is too small for touch accessibilityfile: lib/oli_web/live/delivery/remix/unsaved_changes_modal.ex |
PrivSignal Risk:
|
AI Review — typescriptEmpty
|
…ens, action icons
…ns, modifier keys, tests
…ursor, MapSet, direct el ref
…uired to block LiveView link handler
Summary
PR2 of MER-4057 — Frontend polish for the Template Customize Content (remix) page. Builds on PR1 (#6416) which added the backend container creation, scope isolation, and functional UI.
What changed
Phase 4: Add Materials Modal
OliWeb.Common.Modal(Bootstrap) toOliWeb.Components.Modalexclude_resource_idsButtoncomponent (primary/secondary)Phase 5: Unsaved Changes Modal + Saving Feedback
UnsavedChangesModalcomponent with warning icon, "Leave Without Saving" / "Save Changes" buttonsNavigationGuardJS hook intercepts all link clicks (capture phase) when unsaved changes exist — shows modal instead of navigatingbeforeunloadfallback for hard navigation (tab close, refresh)Phase 6: Design System Updates
Buttoncomponentarrow_circle_rightandtrash_filledicons from Figma SVGs,!px-4padding!cursor-defaulton disabled buttons (no "not-permitted" icon)text-Text-text-hightokenborder-Fill-Buttons-fill-primaryhome_filled), white bg with border on nav barborder-Border-border-default,bg-Surface-surface-backgroundDesign System Fixes (cross-cutting)
Buttonsecondary bg:bg-Background-bg-primary→bg-Surface-surface-backgroundButtondisabled primary: white text on muted blue (was dark text, no shadow)Buttondisabled secondary: transparent bg, muted border/text (was grey)fill-primarytoken:#0062F2→#0080FF(synced with Figma)Text-text-mediumtoken (#737373)home_filled,arrow_circle_right,trash_filled,warning_trianglecontainer_class,title_class,subtitle_classattrs to Modal componentpx-3padding removed from workspace layoutSecurity
NavigationGuardvalidates navigation targets server-side (valid_internal_path?/1)Performance
modal_assigns(computed once per publication selection)Sections.get_section!DB call on saveScreen.Recording.2026-04-16.at.10.34.39.AM.mov