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