File size: 5,233 Bytes
1ef4e10
 
 
 
 
 
 
 
e1df50c
 
1ef4e10
e1df50c
1ef4e10
 
e1df50c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ef4e10
 
e1df50c
 
 
 
 
 
 
 
 
0fb23b8
e1df50c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# components/dashboard_page.py
import gradio as gr
from components.header import Header


class DashboardPage:
    """UI elements + event wiring for the post-login dashboard."""

    # ───────── ساخت UI ───────── #
    def __init__(self) -> None:
        with gr.Column(visible=False) as self.container:
            # هدر بالا (نام کاربر + خروج)
            self.header = Header()

            # اطلاعات فایل صوتی و انوتیشن
            with gr.Row():
                with gr.Column():
                    self.tts_id = gr.Textbox(
                        label="tts_data.id", interactive=False
                    )
                    self.filename = gr.Textbox(
                        label="tts_data.filename", interactive=False
                    )
                    self.sentence = gr.Textbox(
                        label="tts_data.sentence", interactive=False
                    )
                    self.ann_sentence = gr.Textbox(
                        label="annotations.annotated_sentence",
                        interactive=False,
                    )
                    self.ann_at = gr.Textbox(
                        label="annotations.annotated_at",
                        interactive=False,
                    )
                    self.validated = gr.Checkbox(
                        label="annotations.validated",
                        interactive=False,
                    )

            # دکمه‌های پیمایش
            with gr.Row():
                self.btn_prev = gr.Button("⬅️ Previous")
                self.btn_next = gr.Button("Next ➡️")

            # stateهای مخفی
            self.items_state = gr.State([])   # list[dict]
            self.idx_state   = gr.State(0)    # اندیس فعلی



    # ───────── wiring رویدادها ───────── #
    def register_callbacks(
        self,
        login_page,               # برای اجازه‌ی logout در Header
        session_state: gr.State,  # gr.State شامل دیکشنری نشست
        root_blocks: gr.Blocks    # بلوک ریشه‌ی برنامه
    ) -> None:

        # ۱) رویداد خروج (در Header)
        self.header.register_callbacks(login_page, self, session_state)

        # ---------- توابع کمکی ---------- #
        def show_current(items: list, idx: int):
            """رکورد idx را روی فیلدها می‌ریزد؛ در صورت خالی بودن لیست مقادیر تهی."""
            if not items:
                return ["", "", "", "", "", False]

            data = items[idx]
            return [
                data["id"],
                data["filename"],
                data["sentence"],
                data.get("annotated_sentence", ""),
                data.get("annotated_at", ""),
                bool(data.get("validated", False)),
            ]

        def next_idx(items: list, idx: int):
            return min(idx + 1, max(len(items) - 1, 0))

        def prev_idx(items: list, idx: int):
            return max(idx - 1, 0)

        # ---------- بارگذاری اولیه (یک بار در شروع) ---------- #
        def load_items(sess: dict):
            items = sess.get("dashboard_items", [])
            return (
                items,                   # → items_state
                0,                       # → idx_state
                *show_current(items, 0), # → شش فیلد
            )

        root_blocks.load(
            fn=load_items,
            inputs=[session_state],
            outputs=[
                self.items_state,
                self.idx_state,
                self.tts_id,
                self.filename,
                self.sentence,
                self.ann_sentence,
                self.ann_at,
                self.validated,
            ],
        )

        # ---------- دکمه «قبلی» ----------
        (
            self.btn_prev
            .click(
                fn=prev_idx,
                inputs=[self.items_state, self.idx_state],
                outputs=self.idx_state,
            )
            .then(
                fn=show_current,
                inputs=[self.items_state, self.idx_state],
                outputs=[
                    self.tts_id,
                    self.filename,
                    self.sentence,
                    self.ann_sentence,
                    self.ann_at,
                    self.validated,
                ],
            )
        )

        # ---------- دکمه «بعدی» ----------
        (
            self.btn_next
            .click(
                fn=next_idx,
                inputs=[self.items_state, self.idx_state],
                outputs=self.idx_state,
            )
            .then(
                fn=show_current,
                inputs=[self.items_state, self.idx_state],
                outputs=[
                    self.tts_id,
                    self.filename,
                    self.sentence,
                    self.ann_sentence,
                    self.ann_at,
                    self.validated,
                ],
            )
        )