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