Ajuste rotas, Menus, Layout, Permissãoes UserRoleGuard

This commit is contained in:
Leonardo
2026-02-24 12:04:59 -03:00
parent b1c0cb47c0
commit d58dc21297
15 changed files with 1925 additions and 259 deletions

View File

@@ -235,22 +235,22 @@ onMounted(async () => {
<!-- CARDS -->
<div class="px-8 pb-10">
<div class="grid grid-cols-12 gap-6">
<!-- CLÍNICA (antigo ADMIN) -->
<!-- PACIENTE -->
<div class="col-span-12 md:col-span-3">
<div
class="group h-full cursor-pointer rounded-2xl border border-[var(--surface-border)] bg-[var(--surface-ground)] p-6 transition-all hover:shadow-xl hover:-translate-y-1"
@click="go('clinic_admin')"
@click="go('patient')"
>
<div class="flex items-center justify-between mb-4">
<div class="text-xl font-semibold text-[var(--text-color)]">
Clínica
Paciente
</div>
<i class="pi pi-building text-sm opacity-70" />
<i class="pi pi-user text-sm opacity-70" />
</div>
<div class="text-sm text-[var(--text-color-secondary)] leading-relaxed">
Gestão da clínica, controle de usuários, permissões, planos e configurações globais.
Visualização de informações pessoais, documentos e interações com a clínica.
</div>
<div class="mt-6 text-sm font-medium text-primary opacity-80 group-hover:opacity-100 transition">
@@ -281,22 +281,22 @@ onMounted(async () => {
</div>
</div>
</div>
<!-- PACIENTE -->
<!-- CLÍNICA (antigo ADMIN) -->
<div class="col-span-12 md:col-span-3">
<div
class="group h-full cursor-pointer rounded-2xl border border-[var(--surface-border)] bg-[var(--surface-ground)] p-6 transition-all hover:shadow-xl hover:-translate-y-1"
@click="go('patient')"
@click="go('clinic_admin')"
>
<div class="flex items-center justify-between mb-4">
<div class="text-xl font-semibold text-[var(--text-color)]">
Paciente
Clínica
</div>
<i class="pi pi-user text-sm opacity-70" />
<i class="pi pi-building text-sm opacity-70" />
</div>
<div class="text-sm text-[var(--text-color-secondary)] leading-relaxed">
Visualização de informações pessoais, documentos e interações com a clínica.
Gestão da clínica, controle de usuários, permissões, planos e configurações globais.
</div>
<div class="mt-6 text-sm font-medium text-primary opacity-80 group-hover:opacity-100 transition">
@@ -304,7 +304,7 @@ onMounted(async () => {
</div>
</div>
</div>
<!-- SAAS MASTER -->
<div class="col-span-12 md:col-span-3">
<div

View File

@@ -7,7 +7,17 @@ import StatsWidget from '@/components/dashboard/StatsWidget.vue';
</script>
<template>
ADMIN DASHBOARD
<div class="card mb-0">
<div class="flex justify-between mb-4">
<div>
<span class="text-primary font-medium">Área</span>
<span class="text-muted-color"> da Clínica</span>
</div>
<div class="flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-user text-blue-500 text-xl!"></i>
</div>
</div>
</div>
<div class="grid grid-cols-12 gap-8">
<StatsWidget />

View File

@@ -0,0 +1,51 @@
<script setup>
import { useRouter } from 'vue-router'
import { useTenantStore } from '@/stores/tenantStore'
const router = useRouter()
const tenant = useTenantStore()
function goHome () {
const role = tenant.activeRole
if (role === 'tenant_admin' || role === 'clinic_admin' || role === 'admin') {
router.push('/admin')
return
}
if (role === 'therapist') {
router.push('/therapist')
return
}
if (role === 'patient') {
router.push('/portal')
return
}
router.push('/')
}
</script>
<template>
<div class="flex flex-col items-center justify-center min-h-[60vh] text-center px-6">
<div class="text-6xl font-bold text-[var(--primary-color)] mb-4">
403
</div>
<h1 class="text-2xl font-semibold mb-2">
Acesso negado
</h1>
<p class="text-[var(--text-color-secondary)] max-w-md mb-6">
Você está autenticado, mas não possui permissão para acessar esta área.
Caso acredite que isso seja um erro, entre em contato com o administrador da clínica.
</p>
<Button
label="Voltar para minha área"
icon="pi pi-home"
@click="goHome"
/>
</div>
</template>

View File

@@ -7,7 +7,17 @@ import StatsWidget from '@/components/dashboard/StatsWidget.vue';
</script>
<template>
PATIENT DASHBOARD
<div class="card mb-0">
<div class="flex justify-between mb-4">
<div>
<span class="text-primary font-medium">Portal</span>
<span class="text-muted-color"> = Área do Paciente</span>
</div>
<div class="flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-user text-blue-500 text-xl!"></i>
</div>
</div>
</div>
<div class="grid grid-cols-12 gap-8">
<StatsWidget />

View File

@@ -7,7 +7,17 @@ import StatsWidget from '@/components/dashboard/StatsWidget.vue';
</script>
<template>
THERAPIST DASHBOARD
<div class="card mb-0">
<div class="flex justify-between mb-4">
<div>
<span class="text-primary font-medium">Área</span>
<span class="text-muted-color"> do Terapeuta</span>
</div>
<div class="flex items-center justify-center bg-blue-100 dark:bg-blue-400/10 rounded-border" style="width: 2.5rem; height: 2.5rem">
<i class="pi pi-user text-blue-500 text-xl!"></i>
</div>
</div>
</div>
<div class="grid grid-cols-12 gap-8">
<StatsWidget />