diff --git a/app/routes/users.py b/app/routes/users.py index 5bd948c..88ee673 100644 --- a/app/routes/users.py +++ b/app/routes/users.py @@ -112,69 +112,96 @@ def users_page(request: Request, message: str = "", error: str = "", user=Depend enabled = bool(managed_user.get("is_enabled", True)) gitea_user_id = managed_user.get("gitea_user_id") gitea_sync_status = managed_user.get("gitea_sync_status", "not_required") or "not_required" - gitea_sync_error = html.escape(managed_user.get("gitea_sync_error", "") or "") - gitea_synced_at = html.escape(managed_user.get("gitea_synced_at", "") or "") + gitea_sync_error = (managed_user.get("gitea_sync_error", "") or "").strip() + gitea_synced_at = (managed_user.get("gitea_synced_at", "") or "").strip() gitea_username_value = (managed_user.get("gitea_username") or "").strip() current_gitea_username = gitea_username_value or (f"portal-{user_id}" if gitea_user_id else "") - gitea_details = f"ID {html.escape(str(gitea_user_id))}" if gitea_user_id else "No account" + toggle_label = "Vypnout" if enabled else "Zapnout" + toggle_action = "disable" if enabled else "enable" + + # Gitea: pill (synced/…) + (i) s detaily v tooltipu (ID, jméno, čas synchronizace, chyba). + detail_parts = [] + if gitea_user_id: + detail_parts.append(f"ID {gitea_user_id}") if current_gitea_username: - gitea_details += f"
@{html.escape(current_gitea_username)}" + detail_parts.append(f"@{current_gitea_username}") if gitea_synced_at: - gitea_details += f"
{gitea_synced_at}" + detail_parts.append(f"synced {gitea_synced_at}") if gitea_sync_error: - gitea_details += f'
{gitea_sync_error}' - gitea_cred_form = f""" -
- Změnit jméno/heslo -
- + detail_parts.append(f"chyba: {gitea_sync_error}") + tooltip = html.escape(" · ".join(detail_parts) or "Bez Gitea účtu", quote=True) + gitea_info = ( + f'' + '' + ) + + avatar_block = avatar or '' + provider_label = auth_provider or "—" + email_line = f'
{email}' if email else "" + + # Nastavení Gitea jména a hesla – v modálu (nezarovnává řádek a neořízne se scrollem tabulky). + gitea_modal_id = f"gitea-modal-{user_id_html}" + gitea_modal = f""" + + + +

Nastaví uživatelské jméno a/nebo heslo přímo v Gitea. Heslo se nikam neukládá.

+ -
+ -
+ """ - toggle_label = "Disable" if enabled else "Enable" - toggle_action = "disable" if enabled else "enable" rows += f""" - - {user_id_html} - {username} - {display_name} - {avatar} - {email} - {auth_provider} + + +
+ {avatar_block} +
+ {display_name or username}
+ @{username}{email_line} +
+
+
- +
- {render_enabled_pill(enabled)} - {render_sync_pill(gitea_sync_status)}
{gitea_details}{gitea_cred_form} - {created_at} - {last_login_at} + {render_enabled_pill(enabled)}
{provider_label} + {render_sync_pill(gitea_sync_status)} {gitea_info} + + vytvořeno
{created_at or "—"}
+ poslední přihlášení
{last_login_at or "—"} +
- +
-
- + + +
+ {gitea_modal} """ if not rows: - rows = 'No users found.' + rows = 'Žádní uživatelé.' return page( "Users", @@ -186,21 +213,15 @@ def users_page(request: Request, message: str = "", error: str = "", user=Depend
-

User List

+

Seznam uživatelů

- - - - - - + - - - - - + + + + {rows}
IDUsernameDisplay nameAvatarEmailProviderUživatel RoleStatusGitea syncCreatedLast loginActionsStavGiteaAktivitaAkce
diff --git a/app/static/styles.css b/app/static/styles.css index 8b3f675..0deef16 100644 --- a/app/static/styles.css +++ b/app/static/styles.css @@ -1037,26 +1037,22 @@ pre { border-radius: 10px; } -/* Rozbalovací formulář pro změnu Gitea jména/hesla v tabulce uživatelů. */ -.gitea-cred { - margin-top: 8px; +/* Tabulka uživatelů: zarovnání do řádků jako u seznamu služeb. */ +.user-row td { + vertical-align: middle; } -.gitea-cred summary { - cursor: pointer; - font-size: 12px; - font-weight: 600; - color: var(--primary); +.user-avatar-empty { + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--muted); } -.gitea-cred .metadata-form { - margin-top: 8px; - min-width: 200px; - gap: 4px; -} - -.gitea-cred input { - min-height: 32px; +.muted-cell { + font-size: 13px; + line-height: 1.5; + white-space: nowrap; } .log-stdout {