Spaces:
Running
Running
# 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, | |
], | |
) | |
) |