Dannyar608 commited on
Commit
9cf39ac
·
verified ·
1 Parent(s): dd48ae0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -31
app.py CHANGED
@@ -881,6 +881,15 @@ def create_interface():
881
  session_token = gr.State(value=generate_session_token())
882
  profile_manager.set_session(session_token.value)
883
 
 
 
 
 
 
 
 
 
 
884
  # Custom CSS for better styling
885
  app.css = """
886
  .gradio-container {
@@ -915,6 +924,29 @@ def create_interface():
915
  .chatbot {
916
  min-height: 500px;
917
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
918
  """
919
 
920
  gr.Markdown("""
@@ -923,18 +955,24 @@ def create_interface():
923
  Complete each step to get customized learning recommendations.
924
  """)
925
 
926
- # Progress tracker
927
  with gr.Row():
928
  with gr.Column(scale=1):
929
- step1 = gr.Button("1. Upload Transcript", variant="primary")
930
  with gr.Column(scale=1):
931
- step2 = gr.Button("2. Learning Style Quiz")
932
  with gr.Column(scale=1):
933
- step3 = gr.Button("3. Personal Questions")
934
  with gr.Column(scale=1):
935
- step4 = gr.Button("4. Save & Review")
936
  with gr.Column(scale=1):
937
- step5 = gr.Button("5. AI Assistant")
 
 
 
 
 
 
938
 
939
  # Main tabs
940
  with gr.Tabs() as tabs:
@@ -966,10 +1004,22 @@ def create_interface():
966
  )
967
  transcript_data = gr.State()
968
 
 
 
 
 
 
 
 
 
 
 
 
 
969
  upload_btn.click(
970
- fn=parse_transcript,
971
- inputs=transcript_file,
972
- outputs=[transcript_output, transcript_data]
973
  )
974
 
975
  # ===== TAB 2: Learning Style Quiz =====
@@ -1011,13 +1061,28 @@ def create_interface():
1011
  outputs=progress
1012
  )
1013
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1014
  quiz_submit.click(
1015
- fn=lambda *answers: learning_style_quiz.evaluate_quiz(*answers),
1016
- inputs=quiz_components,
1017
- outputs=learning_output
1018
- ).then(
1019
- fn=lambda: gr.Markdown(visible=True),
1020
- outputs=learning_output
1021
  )
1022
 
1023
  # ===== TAB 3: Personal Questions =====
@@ -1064,6 +1129,31 @@ def create_interface():
1064
  inputs=blog_checkbox,
1065
  outputs=blog_text
1066
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1067
 
1068
  # ===== TAB 4: Save & Review =====
1069
  with gr.Tab("Save Profile", id=3) as tab4:
@@ -1094,14 +1184,29 @@ def create_interface():
1094
  )
1095
 
1096
  # Save profile
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1097
  save_btn.click(
1098
- fn=profile_manager.save_profile,
1099
  inputs=[
1100
  name, age, interests, transcript_data, learning_output,
1101
  movie, movie_reason, show, show_reason,
1102
- book, book_reason, character, character_reason, blog_text
 
1103
  ],
1104
- outputs=output_summary
1105
  ).then(
1106
  fn=lambda: profile_manager.list_profiles(session_token.value),
1107
  outputs=load_profile_dropdown
@@ -1159,6 +1264,15 @@ def create_interface():
1159
  book, book_reason, character, character_reason,
1160
  blog_text
1161
  ]
 
 
 
 
 
 
 
 
 
1162
  )
1163
 
1164
  # ===== TAB 5: AI Teaching Assistant =====
@@ -1179,29 +1293,42 @@ def create_interface():
1179
  title=""
1180
  )
1181
 
1182
- # Tab navigation logic
1183
- def navigate_to_tab(tab_index: int):
1184
- return gr.Tabs(selected=tab_index)
 
 
 
 
 
 
 
 
1185
 
1186
  step1.click(
1187
- fn=lambda: navigate_to_tab(0),
1188
- outputs=tabs
 
1189
  )
1190
  step2.click(
1191
- fn=lambda: navigate_to_tab(1),
1192
- outputs=tabs
 
1193
  )
1194
  step3.click(
1195
- fn=lambda: navigate_to_tab(2),
1196
- outputs=tabs
 
1197
  )
1198
  step4.click(
1199
- fn=lambda: navigate_to_tab(3),
1200
- outputs=tabs
 
1201
  )
1202
  step5.click(
1203
- fn=lambda: navigate_to_tab(4),
1204
- outputs=tabs
 
1205
  )
1206
 
1207
  return app
 
881
  session_token = gr.State(value=generate_session_token())
882
  profile_manager.set_session(session_token.value)
883
 
884
+ # Track completion status for each tab
885
+ tab_completed = gr.State({
886
+ 0: False, # Transcript Upload
887
+ 1: False, # Learning Style Quiz
888
+ 2: False, # Personal Questions
889
+ 3: False, # Save & Review
890
+ 4: False # AI Assistant
891
+ })
892
+
893
  # Custom CSS for better styling
894
  app.css = """
895
  .gradio-container {
 
924
  .chatbot {
925
  min-height: 500px;
926
  }
927
+ .completed-tab {
928
+ background: #2196F3 !important;
929
+ color: white !important;
930
+ }
931
+ .incomplete-tab {
932
+ background: #E0E0E0 !important;
933
+ }
934
+ .alert-box {
935
+ padding: 15px;
936
+ margin-bottom: 20px;
937
+ border: 1px solid transparent;
938
+ border-radius: 4px;
939
+ color: #31708f;
940
+ background-color: #d9edf7;
941
+ border-color: #bce8f1;
942
+ }
943
+ .nav-message {
944
+ padding: 10px;
945
+ margin: 10px 0;
946
+ border-radius: 4px;
947
+ background-color: #ffebee;
948
+ color: #c62828;
949
+ }
950
  """
951
 
952
  gr.Markdown("""
 
955
  Complete each step to get customized learning recommendations.
956
  """)
957
 
958
+ # Progress tracker - now with dynamic styling
959
  with gr.Row():
960
  with gr.Column(scale=1):
961
+ step1 = gr.Button("1. Upload Transcript", elem_classes="incomplete-tab")
962
  with gr.Column(scale=1):
963
+ step2 = gr.Button("2. Learning Style Quiz", elem_classes="incomplete-tab", interactive=False)
964
  with gr.Column(scale=1):
965
+ step3 = gr.Button("3. Personal Questions", elem_classes="incomplete-tab", interactive=False)
966
  with gr.Column(scale=1):
967
+ step4 = gr.Button("4. Save & Review", elem_classes="incomplete-tab", interactive=False)
968
  with gr.Column(scale=1):
969
+ step5 = gr.Button("5. AI Assistant", elem_classes="incomplete-tab", interactive=False)
970
+
971
+ # Alert box for quiz submission
972
+ quiz_alert = gr.HTML(visible=False)
973
+
974
+ # Navigation message
975
+ nav_message = gr.HTML(elem_classes="nav-message", visible=False)
976
 
977
  # Main tabs
978
  with gr.Tabs() as tabs:
 
1004
  )
1005
  transcript_data = gr.State()
1006
 
1007
+ def process_transcript_and_update(file_obj, current_tab_status):
1008
+ output_text, data = parse_transcript(file_obj)
1009
+ if "Error" not in output_text:
1010
+ new_status = current_tab_status.copy()
1011
+ new_status[0] = True
1012
+ return output_text, data, new_status, \
1013
+ gr.update(elem_classes="completed-tab"), \
1014
+ gr.update(interactive=True), \
1015
+ gr.update(visible=False)
1016
+ return output_text, data, current_tab_status, \
1017
+ gr.update(), gr.update(), gr.update()
1018
+
1019
  upload_btn.click(
1020
+ fn=process_transcript_and_update,
1021
+ inputs=[transcript_file, tab_completed],
1022
+ outputs=[transcript_output, transcript_data, tab_completed, step1, step2, nav_message]
1023
  )
1024
 
1025
  # ===== TAB 2: Learning Style Quiz =====
 
1061
  outputs=progress
1062
  )
1063
 
1064
+ def submit_quiz_and_update(*args):
1065
+ # The first argument is the tab_completed state, followed by answers
1066
+ current_tab_status = args[0]
1067
+ answers = args[1:]
1068
+
1069
+ result = learning_style_quiz.evaluate_quiz(*answers)
1070
+
1071
+ new_status = current_tab_status.copy()
1072
+ new_status[1] = True
1073
+
1074
+ return result, \
1075
+ gr.update(visible=True), \
1076
+ new_status, \
1077
+ gr.update(elem_classes="completed-tab"), \
1078
+ gr.update(interactive=True), \
1079
+ gr.update(value="<div class='alert-box'>Quiz submitted successfully! Scroll down to view your results.</div>", visible=True), \
1080
+ gr.update(visible=False)
1081
+
1082
  quiz_submit.click(
1083
+ fn=submit_quiz_and_update,
1084
+ inputs=[tab_completed] + quiz_components,
1085
+ outputs=[learning_output, learning_output, tab_completed, step2, step3, quiz_alert, nav_message]
 
 
 
1086
  )
1087
 
1088
  # ===== TAB 3: Personal Questions =====
 
1129
  inputs=blog_checkbox,
1130
  outputs=blog_text
1131
  )
1132
+
1133
+ # Check if required fields are filled to mark as complete
1134
+ def check_personal_info_complete(name, age, interests, current_tab_status):
1135
+ if name.strip() and age and interests.strip():
1136
+ new_status = current_tab_status.copy()
1137
+ new_status[2] = True
1138
+ return new_status, gr.update(elem_classes="completed-tab"), gr.update(interactive=True), gr.update(visible=False)
1139
+ return current_tab_status, gr.update(), gr.update(), gr.update()
1140
+
1141
+ # Monitor changes to required fields
1142
+ name.change(
1143
+ fn=check_personal_info_complete,
1144
+ inputs=[name, age, interests, tab_completed],
1145
+ outputs=[tab_completed, step3, step4, nav_message]
1146
+ )
1147
+ age.change(
1148
+ fn=check_personal_info_complete,
1149
+ inputs=[name, age, interests, tab_completed],
1150
+ outputs=[tab_completed, step3, step4, nav_message]
1151
+ )
1152
+ interests.change(
1153
+ fn=check_personal_info_complete,
1154
+ inputs=[name, age, interests, tab_completed],
1155
+ outputs=[tab_completed, step3, step4, nav_message]
1156
+ )
1157
 
1158
  # ===== TAB 4: Save & Review =====
1159
  with gr.Tab("Save Profile", id=3) as tab4:
 
1184
  )
1185
 
1186
  # Save profile
1187
+ def save_profile_and_update(*args):
1188
+ # Extract inputs
1189
+ inputs = args[:-1] # All except the last which is tab_completed
1190
+ current_tab_status = args[-1]
1191
+
1192
+ # Call the original save function
1193
+ summary = profile_manager.save_profile(*inputs)
1194
+
1195
+ # Update completion status
1196
+ new_status = current_tab_status.copy()
1197
+ new_status[3] = True
1198
+
1199
+ return summary, new_status, gr.update(elem_classes="completed-tab"), gr.update(interactive=True), gr.update(visible=False)
1200
+
1201
  save_btn.click(
1202
+ fn=save_profile_and_update,
1203
  inputs=[
1204
  name, age, interests, transcript_data, learning_output,
1205
  movie, movie_reason, show, show_reason,
1206
+ book, book_reason, character, character_reason, blog_text,
1207
+ tab_completed
1208
  ],
1209
+ outputs=[output_summary, tab_completed, step4, step5, nav_message]
1210
  ).then(
1211
  fn=lambda: profile_manager.list_profiles(session_token.value),
1212
  outputs=load_profile_dropdown
 
1264
  book, book_reason, character, character_reason,
1265
  blog_text
1266
  ]
1267
+ ).then(
1268
+ fn=lambda: gr.update(value=""),
1269
+ outputs=output_summary
1270
+ ).then(
1271
+ fn=lambda: gr.update(value=False),
1272
+ outputs=blog_checkbox
1273
+ ).then(
1274
+ fn=lambda: gr.update(visible=False),
1275
+ outputs=blog_text
1276
  )
1277
 
1278
  # ===== TAB 5: AI Teaching Assistant =====
 
1293
  title=""
1294
  )
1295
 
1296
+ # Tab navigation logic with completion check
1297
+ def navigate_to_tab(tab_index: int, tab_completed_status):
1298
+ # Always allow going back to previous tabs
1299
+ current_tab = tabs.selected
1300
+ if current_tab is not None and tab_index > current_tab:
1301
+ # Check if current tab is completed
1302
+ if not tab_completed_status.get(current_tab, False):
1303
+ return gr.Tabs(selected=current_tab), \
1304
+ gr.update(value=f"<div class='nav-message'>Please complete the current tab before proceeding to tab {tab_index + 1}</div>", visible=True)
1305
+
1306
+ return gr.Tabs(selected=tab_index), gr.update(visible=False)
1307
 
1308
  step1.click(
1309
+ fn=lambda idx, status: navigate_to_tab(idx, status),
1310
+ inputs=[gr.State(0), tab_completed],
1311
+ outputs=[tabs, nav_message]
1312
  )
1313
  step2.click(
1314
+ fn=lambda idx, status: navigate_to_tab(idx, status),
1315
+ inputs=[gr.State(1), tab_completed],
1316
+ outputs=[tabs, nav_message]
1317
  )
1318
  step3.click(
1319
+ fn=lambda idx, status: navigate_to_tab(idx, status),
1320
+ inputs=[gr.State(2), tab_completed],
1321
+ outputs=[tabs, nav_message]
1322
  )
1323
  step4.click(
1324
+ fn=lambda idx, status: navigate_to_tab(idx, status),
1325
+ inputs=[gr.State(3), tab_completed],
1326
+ outputs=[tabs, nav_message]
1327
  )
1328
  step5.click(
1329
+ fn=lambda idx, status: navigate_to_tab(idx, status),
1330
+ inputs=[gr.State(4), tab_completed],
1331
+ outputs=[tabs, nav_message]
1332
  )
1333
 
1334
  return app