From 6df0a88fd4f3ba513af9eec08c502221b802741c Mon Sep 17 00:00:00 2001 From: hz Date: Fri, 24 Jul 2026 23:12:47 -0500 Subject: [PATCH] Feature-gate Dynamic Questions and CCS Cases to UAT only Both are still in progress and shouldn't be reachable in production (or local dev) yet - hide every entry point (nav sidebar, the dashboard's "dynamic concepts due" review card, and the CCS Cases mode card on the study selector) unless step3/deployment_environment is "uat", the same setting that already drives the UAT badge. Added Brand.is_uat_environment() as the shared check. --- scripts/ui/dashboard_screen.gd | 9 +++++---- scripts/ui/main.gd | 9 +++++---- scripts/ui/medmind_style.gd | 4 ++++ scripts/ui/study_selector.gd | 25 +++++++++++++------------ 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/scripts/ui/dashboard_screen.gd b/scripts/ui/dashboard_screen.gd index 6051c07..20d688f 100644 --- a/scripts/ui/dashboard_screen.gd +++ b/scripts/ui/dashboard_screen.gd @@ -244,10 +244,11 @@ func _render_review(data: Dictionary) -> void: missed_action.disabled = missed_count <= 0 or pending_review_launch missed_action.pressed.connect(_start_review_queue) review_list.add_child(missed_action) - var dynamic_due := int(data.get("dynamicReviewsDue", 0)) - review_list.add_child(_review_action( - "%d dynamic concepts due" % dynamic_due if dynamic_due > 0 else "Dynamic concepts up to date", - "activity", Brand.PURPLE if dynamic_due > 0 else Brand.ROYAL_BLUE, "dynamic_questions")) + if Brand.is_uat_environment(): + var dynamic_due := int(data.get("dynamicReviewsDue", 0)) + review_list.add_child(_review_action( + "%d dynamic concepts due" % dynamic_due if dynamic_due > 0 else "Dynamic concepts up to date", + "activity", Brand.PURPLE if dynamic_due > 0 else Brand.ROYAL_BLUE, "dynamic_questions")) var flashcards_due := int(data.get("flashcardsDue", 0)) review_list.add_child(_review_action( "%d flashcards due" % flashcards_due if flashcards_due > 0 else "Flashcards up to date", diff --git a/scripts/ui/main.gd b/scripts/ui/main.gd index 168135d..511a711 100644 --- a/scripts/ui/main.gd +++ b/scripts/ui/main.gd @@ -154,7 +154,7 @@ func _build_ui() -> void: environment_badge = Label.new() environment_badge.text = "UAT" environment_badge.tooltip_text = "User acceptance testing environment" - environment_badge.visible = str(ProjectSettings.get_setting("step3/deployment_environment", "development")) == "uat" + environment_badge.visible = Brand.is_uat_environment() environment_badge.add_theme_font_override("font", Brand.font) environment_badge.add_theme_font_size_override("font_size", 13) environment_badge.add_theme_color_override("font_color", Color("052e16")) @@ -416,8 +416,8 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void _add_nav_button(container, "home", "Dashboard", "chart-no-axes-column-increasing", true) _add_nav_button(container, "question_bank", "Question Bank", "clipboard-list", true) - _add_nav_button(container, "dynamic_questions", "Dynamic Questions", "activity", true) - _add_nav_button(container, "ccs", "CCS Cases", "stethoscope", true) + _add_nav_button(container, "dynamic_questions", "Dynamic Questions", "activity", true, Brand.is_uat_environment()) + _add_nav_button(container, "ccs", "CCS Cases", "stethoscope", true, Brand.is_uat_environment()) _add_nav_button(container, "exams", "Exam Simulations", "clipboard-list", true) _add_nav_button(container, "flashcards", "Flashcards", "clipboard-plus", true) _add_nav_button(container, "bookmarks", "Bookmarks", "bookmark", true) @@ -433,7 +433,7 @@ func _populate_navigation(container: VBoxContainer, include_brand: bool) -> void _add_nav_button(container, "logout", "Log out", "log-out", true) -func _add_nav_button(container: VBoxContainer, key: String, label_text: String, icon_name: String, enabled: bool) -> void: +func _add_nav_button(container: VBoxContainer, key: String, label_text: String, icon_name: String, enabled: bool, visible_flag: bool = true) -> void: var button := Button.new() button.text = label_text button.name = "Nav%s" % key.to_pascal_case() @@ -447,6 +447,7 @@ func _add_nav_button(container: VBoxContainer, key: String, label_text: String, button.add_theme_font_size_override("font_size", 18) button.disabled = not enabled button.tooltip_text = "Coming Soon" if not enabled else label_text + button.visible = visible_flag button.pressed.connect(_on_navigation_pressed.bind(key)) container.add_child(button) if not nav_buttons.has(key): diff --git a/scripts/ui/medmind_style.gd b/scripts/ui/medmind_style.gd index 8f01cf3..3b7dd4d 100644 --- a/scripts/ui/medmind_style.gd +++ b/scripts/ui/medmind_style.gd @@ -26,6 +26,10 @@ static func ranaze_mark_texture() -> Texture2D: return preload("res://assets/branding/ranaze-mark.png") +static func is_uat_environment() -> bool: + return str(ProjectSettings.get_setting("step3/deployment_environment", "development")) == "uat" + + static func text_color(dark: bool) -> Color: return DARK_TEXT if dark else LIGHT_TEXT diff --git a/scripts/ui/study_selector.gd b/scripts/ui/study_selector.gd index 2950c23..4d2cc27 100644 --- a/scripts/ui/study_selector.gd +++ b/scripts/ui/study_selector.gd @@ -187,18 +187,19 @@ func _build_mode_view() -> void: retry_button = question_card.retry retry_button.pressed.connect(_retry_question_bank) - var ccs_card := _add_mode_card( - "CCS Cases", - "Interactive case simulations", - "Available", - "Available", - "Practice real-world clinical scenarios and\nimprove your management skills.", - "stethoscope", - true, - Brand.TEAL) - ccs_button = ccs_card.action - ccs_status_label = ccs_card.status - ccs_button.pressed.connect(_select_ccs) + if Brand.is_uat_environment(): + var ccs_card := _add_mode_card( + "CCS Cases", + "Interactive case simulations", + "Available", + "Available", + "Practice real-world clinical scenarios and\nimprove your management skills.", + "stethoscope", + true, + Brand.TEAL) + ccs_button = ccs_card.action + ccs_status_label = ccs_card.status + ccs_button.pressed.connect(_select_ccs) func _build_question_bank_launch_view() -> void: