tts_labeling / components /dashboard_page.py
Navid Arabi
load annotation data done
e1df50c
raw
history blame
5.23 kB
# 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,
],
)
)