Feature: Formulario de edición en lugar de modal
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 57s
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 57s
- Crear componente UserProfileForm con diseño glassmorphism - Alternar entre lista de apps y formulario de edición - Quitar modal de UserHeader, usar emit event - Agregar nuevos campos deshabilitados: * Avatar URL * Teléfono * Cédula * Fecha de nacimiento * NFC vinculada * PIN numérico * Código Nucleo V2 - Sistema de eventos entre componentes
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
<div class="user-info">
|
||||
<div class="user-name-row">
|
||||
<h1 class="user-name">{{ user?.name || user?.username }}</h1>
|
||||
<button class="edit-button" @click.stop="openEditProfile" title="Editar perfil">
|
||||
<button class="edit-button" @click="$emit('edit-profile')" title="Editar perfil">
|
||||
<UIcon name="i-heroicons-pencil-square" class="w-4 h-4" />
|
||||
</button>
|
||||
</div>
|
||||
@@ -53,135 +53,15 @@
|
||||
<UIcon v-else key="sun" name="i-heroicons-sun" class="w-6 h-6" />
|
||||
</transition>
|
||||
</button>
|
||||
|
||||
<!-- Modal de edición de perfil -->
|
||||
<UModal v-model:open="isEditModalOpen" title="Editar Perfil">
|
||||
<template #content>
|
||||
<div class="p-4 space-y-4">
|
||||
<UFormGroup label="Nombre de usuario" name="username">
|
||||
<UInput
|
||||
:model-value="user?.username"
|
||||
disabled
|
||||
:ui="{ base: 'cursor-not-allowed opacity-50' }"
|
||||
/>
|
||||
<template #help>
|
||||
<span class="text-xs text-gray-500">El username no se puede cambiar</span>
|
||||
</template>
|
||||
</UFormGroup>
|
||||
|
||||
<UFormGroup label="Nombre completo" name="name" required>
|
||||
<UInput
|
||||
v-model="formData.name"
|
||||
placeholder="Tu nombre completo"
|
||||
:disabled="isSubmitting"
|
||||
/>
|
||||
</UFormGroup>
|
||||
|
||||
<UFormGroup label="Email" name="email" required>
|
||||
<UInput
|
||||
v-model="formData.email"
|
||||
type="email"
|
||||
placeholder="tu@email.com"
|
||||
:disabled="isSubmitting"
|
||||
/>
|
||||
</UFormGroup>
|
||||
|
||||
<div class="flex justify-end gap-3 pt-4">
|
||||
<UButton
|
||||
color="neutral"
|
||||
variant="ghost"
|
||||
@click="isEditModalOpen = false"
|
||||
:disabled="isSubmitting"
|
||||
>
|
||||
Cancelar
|
||||
</UButton>
|
||||
<UButton
|
||||
color="primary"
|
||||
:loading="isSubmitting"
|
||||
@click="handleSubmit"
|
||||
>
|
||||
Guardar cambios
|
||||
</UButton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</UModal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const { user } = useAuthentik()
|
||||
const { isNight, toggleTheme } = useTheme()
|
||||
const toast = useToast()
|
||||
|
||||
// Estado del modal
|
||||
const isEditModalOpen = ref(false)
|
||||
const isSubmitting = ref(false)
|
||||
|
||||
// Datos del formulario
|
||||
const formData = ref({
|
||||
name: user.value?.name || '',
|
||||
email: user.value?.email || ''
|
||||
})
|
||||
|
||||
// Abrir modal de edición
|
||||
const openEditProfile = () => {
|
||||
if (user.value) {
|
||||
formData.value = {
|
||||
name: user.value.name || '',
|
||||
email: user.value.email || ''
|
||||
}
|
||||
isEditModalOpen.value = true
|
||||
}
|
||||
}
|
||||
|
||||
// Enviar formulario
|
||||
const handleSubmit = async () => {
|
||||
if (!formData.value.name || !formData.value.email) {
|
||||
toast.add({
|
||||
title: 'Error',
|
||||
description: 'Por favor completa todos los campos',
|
||||
color: 'error',
|
||||
icon: 'i-heroicons-exclamation-triangle'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
isSubmitting.value = true
|
||||
|
||||
try {
|
||||
await $fetch('/api/authentik/user', {
|
||||
method: 'PATCH',
|
||||
body: {
|
||||
name: formData.value.name,
|
||||
email: formData.value.email
|
||||
}
|
||||
})
|
||||
|
||||
toast.add({
|
||||
title: 'Perfil actualizado',
|
||||
description: 'Tus cambios se guardaron correctamente. Recarga la página para verlos.',
|
||||
color: 'success',
|
||||
icon: 'i-heroicons-check-circle',
|
||||
actions: [{
|
||||
label: 'Recargar',
|
||||
onClick: () => window.location.reload()
|
||||
}]
|
||||
})
|
||||
|
||||
isEditModalOpen.value = false
|
||||
} catch (error) {
|
||||
console.error('Error updating profile:', error)
|
||||
toast.add({
|
||||
title: 'Error',
|
||||
description: 'No se pudo actualizar el perfil',
|
||||
color: 'error',
|
||||
icon: 'i-heroicons-x-circle'
|
||||
})
|
||||
} finally {
|
||||
isSubmitting.value = false
|
||||
}
|
||||
}
|
||||
// Emits
|
||||
defineEmits(['edit-profile'])
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
Reference in New Issue
Block a user