Spaces:
Sleeping
Sleeping
| import dash | |
| from dash import html, dcc, Input, Output, callback | |
| from services.tracking_service import get_pending_testimonials, approve_testimonial, reject_testimonial | |
| dash.register_page(__name__, path="/admin/testimonials", name="Gestion Témoignages") | |
| layout = html.Div(className="admin-testimonials", children=[ | |
| html.H1("Gestion des témoignages", className="admin-title"), | |
| html.Div(id="pending-testimonials-list"), | |
| dcc.Interval(id="testimonials-refresh", interval=5000, n_intervals=0) | |
| ]) | |
| def refresh_pending(n): | |
| testimonials = get_pending_testimonials() | |
| if not testimonials: | |
| return html.Div("Aucun témoignage en attente", className="empty-state") | |
| cards = [] | |
| for t in testimonials: | |
| t_id, email, name, content, rating, investment, gain, period, date = t | |
| card = html.Div(className="testimonial-card", children=[ | |
| html.Div(className="testimonial-header", children=[ | |
| html.H3(name), | |
| html.Span(f"Note: {'★'*rating}", className="rating"), | |
| ]), | |
| html.P(content), | |
| html.Div(className="testimonial-meta", children=[ | |
| html.Span(f"Email: {email}"), | |
| html.Span(f"Invest: {investment}€" if investment else ""), | |
| html.Span(f"Gain: +{gain}€" if gain else ""), | |
| ]), | |
| html.Div(className="testimonial-actions", children=[ | |
| html.Button("Approuver", id=f"approve-{t_id}", className="approve-btn"), | |
| html.Button("Rejeter", id=f"reject-{t_id}", className="reject-btn"), | |
| ]), | |
| ]) | |
| cards.append(card) | |
| return cards | |
| def handle_testimonial_action(approve_clicks, reject_clicks): | |
| ctx = dash.callback_context | |
| if not ctx.triggered: | |
| return dash.no_update | |
| button_id = ctx.triggered[0]["prop_id"].split(".")[0] | |
| if "approve" in button_id: | |
| testimonial_id = button_id.split("-")[1] | |
| approve_testimonial(testimonial_id) | |
| elif "reject" in button_id: | |
| testimonial_id = button_id.split("-")[1] | |
| reject_testimonial(testimonial_id) | |
| # Rafraîchir la liste | |
| return refresh_pending(None) |