Files
aistory-generate/ui/projects_tab.py
T

70 lines
3.0 KiB
Python

import gradio as gr
from locales.i18n import t
from services.project_manager import ProjectManager, list_project_titles
import logging
logger = logging.getLogger(__name__)
def build_projects_tab():
with gr.Tab(t("tabs.projects")):
gr.Markdown(f"### {t('projects.header')}")
projects_table = gr.Dataframe(
headers=["ID", t("ui.col_project_name"), t("ui.col_type"), t("ui.col_created_at"), t("ui.col_chapters")],
interactive=False
)
with gr.Row():
refresh_projects_btn = gr.Button(t("projects.refresh_btn"))
delete_project_btn = gr.Button(t("projects.delete_btn"), variant="stop")
gr.Markdown(f"#### {t('projects.delete_header')}")
delete_project_selector = gr.Dropdown(
choices=list_project_titles(),
label=t("projects.delete_select_project"),
interactive=True
)
project_manage_status = gr.Textbox(label=t("projects.status_label"), interactive=False)
def on_refresh_projects():
try:
projects = ProjectManager.list_projects()
table_data = []
for p in projects:
table_data.append([
p.get("id", ""),
p.get("title", ""),
p.get("genre", ""),
p.get("created_at", "")[:10] if p.get("created_at") else "",
f"{p.get('completed_chapters', 0)}/{p.get('chapter_count', 0)}"
])
titles = [p.get("title", "") for p in projects]
return table_data, gr.update(choices=titles, value=None)
except Exception as e:
logger.error(f"Refresh projects failed: {e}")
return [], gr.update()
def on_delete_project(project_title):
if not project_title or not project_title.strip():
return f"❌ {t('projects.select_project_first')}", gr.update(), gr.update()
try:
project_data = ProjectManager.get_project_by_title(project_title)
if not project_data:
return f"❌ {t('projects.project_not_found')}", gr.update(), gr.update()
project_id = project_data.get("id")
success, msg = ProjectManager.delete_project(project_id)
if success:
new_table, new_dropdown = on_refresh_projects()
return f"✅ {t('projects.delete_success')}", new_table, new_dropdown
return f"❌ {t('projects.delete_failed')}: {msg}", gr.update(), gr.update()
except Exception as e:
return f"❌ {str(e)}", gr.update(), gr.update()
refresh_projects_btn.click(fn=on_refresh_projects, outputs=[projects_table, delete_project_selector])
delete_project_btn.click(
fn=on_delete_project,
inputs=[delete_project_selector],
outputs=[project_manage_status, projects_table, delete_project_selector]
)