From f2a9c5181b6c702bc2272b86380d989bf5df9c26 Mon Sep 17 00:00:00 2001 From: andre Date: Tue, 29 Sep 2026 12:39:36 +0100 Subject: [PATCH] feat: mapa carrega logo no site; sysadmin edita utilizadores (incl. promover a admin) Co-Authored-By: Claude Sonnet 5.5 --- config/functions_privacy.php | 18 +------ site/privacidade.php | 4 +- views/user/edit.php | 101 +++++++++++++++++++++++++++++++++++ views/user/index.php | 7 ++- 4 files changed, 111 insertions(+), 19 deletions(-) create mode 100644 views/user/edit.php diff --git a/config/functions_privacy.php b/config/functions_privacy.php index 7eb06ec..faa2316 100644 --- a/config/functions_privacy.php +++ b/config/functions_privacy.php @@ -9,22 +9,8 @@ // e o browser pede-a ao próprio site. function map_click_to_load(string $iframeHtml, string $mapsLink = ''): string { - if (trim($iframeHtml) === '') return ''; - static $n = 0; - $id = 'map-consent-' . (++$n); - $esc = fn(string $s): string => htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); - $link = $mapsLink !== '' - ? 'Abrir no Google Maps' - : ''; - return ''; + // O mapa aparece logo com a página; o nome ficou por compatibilidade. + return trim($iframeHtml); } function review_avatar_url(array $r): string { diff --git a/site/privacidade.php b/site/privacidade.php index 354814b..e1af9b6 100644 --- a/site/privacidade.php +++ b/site/privacidade.php @@ -86,7 +86,7 @@ if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
  • [FORNECEDOR DO SERVIDOR] — centro de dados onde a plataforma está alojada, na União Europeia;
  • Zoho Corporation — processa o formulário de contacto, com alojamento na União Europeia.
  • -

    O mapa da secção de contactos é do Google Maps e só é carregado se carregares em «Mostrar mapa»; nesse momento a Google recebe o teu endereço IP e pode guardar cookies, segundo a política da Google. As avaliações apresentadas vêm do perfil público do ginásio no Google; as fotos dos autores são guardadas neste site para o teu navegador não ter de as pedir à Google.

    +

    O mapa da secção de contactos é do Google Maps: ao abrires a página a Google recebe o teu endereço IP e pode guardar cookies, segundo a política da Google. As avaliações apresentadas vêm do perfil público do ginásio no Google; as fotos dos autores são guardadas neste site para o teu navegador não ter de as pedir à Google.

    5. Os teus direitos

    Tens direito de acesso, retificação, apagamento, limitação, portabilidade e oposição, e de retirar o consentimento a qualquer momento (sem afetar o tratamento feito até aí). Podes pedir a exportação dos teus dados ou o seu apagamento com o formulário abaixo; respondemos no prazo de um mês. @@ -125,7 +125,7 @@ if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {

    6. Cookies

    -

    Este site usa apenas um cookie técnico de sessão (FIT_SESS), necessário para os formulários e para a área reservada, que expira ao fechar o navegador. Não usamos cookies de publicidade nem de estatística. O Google Maps só coloca cookies se escolheres ver o mapa.

    +

    Este site usa apenas um cookie técnico de sessão (FIT_SESS), necessário para os formulários e para a área reservada, que expira ao fechar o navegador. Não usamos cookies de publicidade nem de estatística. O mapa do Google Maps pode colocar cookies da Google.

    7. Segurança

    As comunicações são cifradas (HTTPS), o acesso ao backoffice é restrito e registado, e as cópias de segurança são cifradas.

    diff --git a/views/user/edit.php b/views/user/edit.php new file mode 100644 index 0000000..5f15801 --- /dev/null +++ b/views/user/edit.php @@ -0,0 +1,101 @@ + 100) { + $error = 'Indique um nome (máx. 100 caracteres).'; + } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL) || strlen($email) > 190) { + $error = 'Email inválido.'; + } elseif (!in_array($role, $roles, true)) { + $error = 'Perfil inválido.'; + } elseif (mb_strlen($phone) > 20) { + $error = 'Telefone demasiado longo (máx. 20 caracteres).'; + } else { + $other = db_get_user_by_email($pdo, $email); + if ($other && (int) $other['id'] !== (int) $target['id']) { + $error = 'Já existe outro utilizador com esse email.'; + } + } + + if ($error === '') { + $fields = ['name', 'email', 'phone', 'role', 'is_active']; + $before = array_intersect_key($target, array_flip($fields)); + $new = ['name' => $name, 'email' => $email, 'phone' => $phone !== '' ? $phone : null, + 'role' => $role, 'is_active' => $active]; + $pdo->prepare('UPDATE users SET name=?, email=?, phone=?, role=?, is_active=? WHERE id=?') + ->execute([$name, $email, $new['phone'], $role, $active, (int) $target['id']]); + $changes = platform_audit_diff($before, $new); + if ($changes) { + audit('user.update', [ + 'target_type' => 'user', 'target_id' => (int) $target['id'], + 'target_label' => $name, 'changes' => $changes, + ]); + } + $saved = true; + $target = db_get_user($pdo, (int) $target['id']) ?? $target; + } else { + // Mantém o que foi escrito para o formulário não perder as alterações. + $target = array_merge($target, ['name' => $name, 'email' => $email, 'phone' => $phone, 'role' => $role, 'is_active' => $active]); + } +} + +$page_title = 'Editar utilizador'; +include __DIR__ . '/../../includes/header.php'; +?> +
    +

    Editar utilizador

    +
    Utilizador atualizado.
    +
    + +
    É a sua própria conta: o perfil e o estado não podem ser alterados aqui, para não perder o acesso.
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    > +
    + + Voltar +
    +
    + diff --git a/views/user/index.php b/views/user/index.php index 1931f76..f0910c2 100644 --- a/views/user/index.php +++ b/views/user/index.php @@ -36,7 +36,12 @@ include __DIR__ . '/../../includes/header.php'; · — - + + + +