File size: 5,116 Bytes
86725d8
3ee5dd7
 
0ab7867
86725d8
 
 
 
 
 
 
 
0ab7867
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f0bb8f
86725d8
 
 
 
 
 
 
 
 
 
 
5f0bb8f
86725d8
5f0bb8f
 
 
 
 
 
86725d8
5f0bb8f
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f0bb8f
 
 
 
 
86725d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f0bb8f
 
 
 
 
86725d8
 
 
3d2ee11
86725d8
 
 
 
 
3d2ee11
3ee5dd7
 
3d2ee11
3ee5dd7
 
 
 
 
3d2ee11
 
 
86725d8
3ee5dd7
 
86725d8
 
 
 
 
0ab7867
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# teacher_panel.py
from typing import List, Tuple

import gradio as gr  # needed for gr.SelectData type

import qa_store
from qa_store import normalize_question
from loader import (
    generate_new_manual_id,
    save_manual_qa_file,
    rebuild_combined_qa,
    manual_qa_table_data,
    sync_upload_manual_qa,  # <--- IMPORT THE NEW FUNCTION
)


def _table() -> List[List[str]]:
    return manual_qa_table_data()


def teacher_save_add_overwrite(
    question: str, answer: str, current_id: str
) -> Tuple[str, str, str, List[List[str]], str]:
    question = (question or "").strip()
    answer = (answer or "").strip()
    current_id = current_id or ""

    if not question or not answer:
        msg = "❌ ກະລຸນາໃສ່ທັງຄໍາຖາມແລະຄໍາຕອບ."
        return question, answer, current_id, _table(), msg

    norm_q = normalize_question(question)
    entry = qa_store.MANUAL_QA_INDEX.get(norm_q)

    if entry:
        entry["q"] = question
        entry["a"] = answer
        entry["norm_q"] = norm_q
        current_id = entry["id"]
        local_msg = "✅ ອັບເດດ Q&A ແລ້ວ."
    else:
        new_id = generate_new_manual_id()
        entry = {
            "id": new_id,
            "q": question,
            "a": answer,
            "norm_q": norm_q,
        }
        qa_store.MANUAL_QA_LIST.append(entry)
        qa_store.MANUAL_QA_INDEX[norm_q] = entry
        current_id = new_id
        local_msg = "✅ ບັນທຶກ Q&A ໃໝ່ແລ້ວ."

    save_manual_qa_file()
    rebuild_combined_qa()
    
    # 👇 NEW: Capture the upload status and add it to the message
    cloud_status = sync_upload_manual_qa()
    final_msg = f"{local_msg} ({cloud_status})"

    return question, answer, current_id, _table(), final_msg


def teacher_update_current(
    question: str, answer: str, current_id: str
) -> Tuple[str, str, str, List[List[str]], str]:
    question = (question or "").strip()
    answer = (answer or "").strip()
    current_id = current_id or ""

    if not current_id:
        msg = "❌ ກະລຸນາເລືອກ Q&A ຈາກຕາຕະລາງກ່ອນ."
        return question, answer, current_id, _table(), msg

    if not question or not answer:
        msg = "❌ ກະລຸນາໃສ່ທັງຄໍາຖາມແລະຄໍາຕອບ."
        return question, answer, current_id, _table(), msg

    entry = next((e for e in qa_store.MANUAL_QA_LIST if e["id"] == current_id), None)
    if not entry:
        msg = "⚠️ ບໍ່ພົບ Q&A ທີ່ເລືອກ."
        current_id = ""
        return question, answer, current_id, _table(), msg

    qa_store.MANUAL_QA_INDEX.pop(entry["norm_q"], None)

    new_norm = normalize_question(question)
    entry["q"] = question
    entry["a"] = answer
    entry["norm_q"] = new_norm
    qa_store.MANUAL_QA_INDEX[new_norm] = entry

    save_manual_qa_file()
    rebuild_combined_qa()

    # 👇 NEW: Capture the upload status
    cloud_status = sync_upload_manual_qa()
    final_msg = f"✅ ແກ້ໄຂ Q&A ສໍາເລັດ. ({cloud_status})"

    return question, answer, current_id, _table(), final_msg


def teacher_delete_current(
    current_id: str,
) -> Tuple[str, str, str, List[List[str]], str]:
    current_id = current_id or ""

    if not current_id:
        msg = "❌ ກະລຸນາເລືອກ Q&A ກ່ອນຈະລຶບ."
        return "", "", current_id, _table(), msg

    entry = next((e for e in qa_store.MANUAL_QA_LIST if e["id"] == current_id), None)
    if not entry:
        msg = "⚠️ ບໍ່ພົບ Q&A ທີ່ຈະລຶບ."
        return "", "", "", _table(), msg

    qa_store.MANUAL_QA_LIST = [e for e in qa_store.MANUAL_QA_LIST if e["id"] != current_id]
    qa_store.MANUAL_QA_INDEX.pop(entry["norm_q"], None)

    save_manual_qa_file()
    rebuild_combined_qa()

    # 👇 NEW: Capture the upload status
    cloud_status = sync_upload_manual_qa()
    final_msg = f"🗑️ ລຶບ Q&A ສໍາເລັດ. ({cloud_status})"

    return "", "", "", _table(), final_msg


def teacher_on_table_select(
    evt: gr.SelectData,
) -> Tuple[str, str, str, str]:
    """
    When teacher clicks a row in the Q&A table, load Q/A into textboxes.
    """
    try:
        if evt is None or evt.index is None or evt.row_value is None:
            raise ValueError("Empty select event")

        row = list(evt.row_value)

        current_id = str(row[0]) if len(row) > 0 else ""
        question = str(row[1]) if len(row) > 1 else ""
        answer = str(row[2]) if len(row) > 2 else ""

        if not current_id:
            raise ValueError("Empty ID from selected row")

        msg = f"✏️ ເລືອກ Q&A ID {current_id} ສໍາລັບແກ້ໄຂ."
    except Exception as e:  # noqa: BLE001
        print(f"[WARN] teacher_on_table_select error: {e}")
        current_id = ""
        question = ""
        answer = ""
        msg = "⚠️ ບໍ່ສາມາດເລືອກແຖວໄດ້."

    return question, answer, current_id, msg