File size: 5,375 Bytes
d09f6aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c77082
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d09f6aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# Module for functions that build or manage UI sections/logic

import gradio as gr
import pandas as pd  # Needed for use_selected_subjects type hinting


def update_mode_visibility(
    mode: str,
    current_subject: str,
    current_description: str,
    current_text: str,
    current_url: str,
):
    """Updates visibility and values of UI elements based on generation mode."""
    is_subject = mode == "subject"
    is_path = mode == "path"
    is_text = mode == "text"
    is_web = mode == "web"

    # Determine value persistence or clearing
    subject_val = current_subject if is_subject else ""
    description_val = current_description if is_path else ""
    text_val = current_text if is_text else ""
    url_val = current_url if is_web else ""

    # Return a tuple of gr.update() calls in the order expected by app.py
    return (
        gr.update(visible=is_subject),
        gr.update(visible=is_path),
        gr.update(visible=is_text),
        gr.update(visible=is_web),
        gr.update(visible=is_path),
        gr.update(visible=is_subject or is_text or is_web),
        gr.update(value=subject_val),
        gr.update(value=description_val),
        gr.update(value=text_val),
        gr.update(value=url_val),
        gr.update(value=None),
        gr.update(value=None),
        gr.update(value=""),
        gr.update(value=""),
        gr.update(value="", visible=False),
        gr.update(value=0, visible=False),
    )


def use_selected_subjects(subjects_df: pd.DataFrame | None):
    """Updates UI to use subjects from learning path analysis."""
    if subjects_df is None or subjects_df.empty:
        gr.Warning("No subjects available to copy from Learning Path analysis.")
        # Return updates that change nothing or clear relevant fields if necessary
        # Returning updates for all potential outputs to match the original signature
        return {
            "generation_mode_radio": gr.update(),
            "subject_mode_group": gr.update(),
            "path_mode_group": gr.update(),
            "text_mode_group": gr.update(),
            "web_mode_group": gr.update(),
            "path_results_group": gr.update(),
            "cards_output_group": gr.update(),
            "subject_textbox": gr.update(),
            "description_textbox": gr.update(),
            "source_text_textbox": gr.update(),
            "url_textbox": gr.update(),
            "topic_number_slider": gr.update(),
            "preference_prompt_textbox": gr.update(),
            "output_dataframe": gr.update(),
            "subjects_dataframe": gr.update(),
            "learning_order_markdown": gr.update(),
            "projects_markdown": gr.update(),
            "progress_html": gr.update(),
            "total_cards_number": gr.update(),
        }

    try:
        subjects = subjects_df["Subject"].tolist()
        combined_subject = ", ".join(subjects)
        suggested_topics = min(len(subjects) + 1, 20)
    except KeyError:
        gr.Error("Learning path analysis result is missing the 'Subject' column.")
        # Return no-change updates
        return {
            "generation_mode_radio": gr.update(),
            "subject_mode_group": gr.update(),
            "path_mode_group": gr.update(),
            "text_mode_group": gr.update(),
            "web_mode_group": gr.update(),
            "path_results_group": gr.update(),
            "cards_output_group": gr.update(),
            "subject_textbox": gr.update(),
            "description_textbox": gr.update(),
            "source_text_textbox": gr.update(),
            "url_textbox": gr.update(),
            "topic_number_slider": gr.update(),
            "preference_prompt_textbox": gr.update(),
            "output_dataframe": gr.update(),
            "subjects_dataframe": gr.update(),
            "learning_order_markdown": gr.update(),
            "projects_markdown": gr.update(),
            "progress_html": gr.update(),
            "total_cards_number": gr.update(),
        }

    # Keys here are placeholders, matching the outputs list in app.py's .click handler
    return {
        "generation_mode_radio": "subject",  # Switch mode to subject
        "subject_mode_group": gr.update(visible=True),
        "path_mode_group": gr.update(visible=False),
        "text_mode_group": gr.update(visible=False),
        "web_mode_group": gr.update(visible=False),
        "path_results_group": gr.update(visible=False),
        "cards_output_group": gr.update(visible=True),
        "subject_textbox": combined_subject,
        "description_textbox": "",  # Clear path description
        "source_text_textbox": "",  # Clear text input
        "url_textbox": "",  # Clear URL input
        "topic_number_slider": suggested_topics,
        "preference_prompt_textbox": "Focus on connections between these subjects and their practical applications.",  # Suggest preference
        "output_dataframe": gr.update(value=None),  # Clear previous card output if any
        "subjects_dataframe": subjects_df,  # Keep the dataframe in its output component
        "learning_order_markdown": gr.update(),  # Keep learning order visible for reference if desired
        "projects_markdown": gr.update(),  # Keep projects visible for reference if desired
        "progress_html": gr.update(visible=False),
        "total_cards_number": gr.update(visible=False),
    }