diff --git a/front-end/app/middleware/auth.global.ts b/front-end/app/middleware/auth.global.ts
index 25fbf2b..6d90e1e 100644
--- a/front-end/app/middleware/auth.global.ts
+++ b/front-end/app/middleware/auth.global.ts
@@ -1,9 +1,11 @@
+const PUBLIC_ROUTES = ['/login', '/register']
+
export default defineNuxtRouteMiddleware((to) => {
const { isAuthenticated } = useAuth()
- if (!isAuthenticated.value && to.path !== '/login') {
+ if (!isAuthenticated.value && !PUBLIC_ROUTES.includes(to.path)) {
return navigateTo('/login')
}
- if (isAuthenticated.value && to.path === '/login') {
+ if (isAuthenticated.value && PUBLIC_ROUTES.includes(to.path)) {
return navigateTo('/')
}
})
diff --git a/front-end/app/pages/login.vue b/front-end/app/pages/login.vue
index 0680764..d7b0491 100644
--- a/front-end/app/pages/login.vue
+++ b/front-end/app/pages/login.vue
@@ -75,6 +75,10 @@ async function handleSubmit() {
>
Entrar
+
+
+ Não tem conta? Criar conta
+
@@ -99,4 +103,6 @@ async function handleSubmit() {
background: linear-gradient(135deg, #667eea, #764ba2) !important;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
}
+.register-link { text-align: center; font-size: 13px; color: #64748b; margin-top: 16px; }
+.register-link a { color: #667eea; font-weight: 600; text-decoration: none; }
diff --git a/front-end/app/pages/register.vue b/front-end/app/pages/register.vue
new file mode 100644
index 0000000..01dfa23
--- /dev/null
+++ b/front-end/app/pages/register.vue
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
diff --git a/front-end/app/pages/sistema/configuracoes.vue b/front-end/app/pages/sistema/configuracoes.vue
index 7a40b8f..72a16c9 100644
--- a/front-end/app/pages/sistema/configuracoes.vue
+++ b/front-end/app/pages/sistema/configuracoes.vue
@@ -6,6 +6,9 @@ interface ApiTenant {
ID: string
Slug: string
Name: string
+ LegalName: string
+ DocumentType: string
+ Document: string
Plan: string
MaxUsers: number
IsActive: boolean
@@ -15,19 +18,35 @@ const { data: tenant, refresh } = await useAsyncData('tenant-me', () =>
apiFetch('/tenant/me')
)
-const nome = ref(tenant.value?.Name ?? '')
+const form = reactive({
+ name: tenant.value?.Name ?? '',
+ legalName: tenant.value?.LegalName ?? '',
+ documentType: tenant.value?.DocumentType ?? 'pj',
+ document: tenant.value?.Document ?? '',
+})
+
const saving = ref(false)
const saved = ref(false)
async function salvar() {
saving.value = true
saved.value = false
- await apiFetch('/tenant/me', { method: 'PUT', body: { name: nome.value } })
+ await apiFetch('/tenant/me', {
+ method: 'PUT',
+ body: {
+ name: form.name,
+ legal_name: form.legalName,
+ document_type: form.documentType,
+ document: form.document,
+ },
+ })
await refresh()
saving.value = false
saved.value = true
setTimeout(() => { saved.value = false }, 3000)
}
+
+const documentLabel = computed(() => form.documentType === 'pj' ? 'CNPJ' : 'CPF')
@@ -36,8 +55,24 @@ async function salvar() {
Dados da Empresa
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -45,6 +80,7 @@ async function salvar() {
+
Salvar Alterações
Salvo!
@@ -59,9 +95,16 @@ async function salvar() {
.content { padding: 20px 22px; flex: 1; overflow-y: auto; }
.card { background: white; border-radius: 11px; border: 1px solid #e2e8f0; }
.pad { padding: 24px; }
-.section-title { font-size: 15px; font-weight: 700; color: #0f172a; margin-bottom: 20px; }
-.field { margin-bottom: 16px; }
-.actions { display: flex; align-items: center; gap: 12px; }
+.section-title { font-size: 15px; font-weight: 700; color: #0f172a; margin-bottom: 16px; }
+.type-toggle { display: flex; gap: 8px; margin-bottom: 18px; }
+.type-btn {
+ flex: 1; padding: 7px; border-radius: 8px; border: 1.5px solid #e2e8f0;
+ font-size: 13px; font-weight: 500; color: #64748b; cursor: pointer; background: white;
+ transition: all 0.15s;
+}
+.type-btn.active { border-color: #667eea; color: #667eea; background: #f0f3ff; }
+.field { margin-bottom: 14px; }
+.actions { display: flex; align-items: center; gap: 12px; margin-top: 4px; }
.btn-primary { background: linear-gradient(135deg, #667eea, #764ba2) !important; }
.saved-msg { font-size: 13px; color: #10b981; font-weight: 500; }