Skip to content

UiFormModal ​

El componente más usado en el proyecto. Encapsula UiModal + UiCard + protección de cambios sin guardar.

Props ​

PropTipoDefaultDescripción
titlestring''Título del modal
descriptionstring''Subtítulo descriptivo
size'small' | 'default' | 'large''default'Tamaño del modal
dirtybooleanfalseSi hay cambios sin guardar
confirmOnDirtybooleanfalseMuestra confirmación al cerrar con cambios
confirmMessagestring'Tienes cambios sin guardar. ¿Cerrar de todos modos?'Mensaje del diálogo de confirmación
submitLabelstring'Guardar'Texto del botón de envío (footer por defecto)
cancelLabelstring'Cancelar'Texto del botón de cancelar (footer por defecto)
loadingbooleanfalseEstado loading del botón de envío
hideFooterbooleanfalseOculta el footer completamente

Model ​

v-model: boolean — controla si el modal está abierto

Emits ​

EventoDescripción
submitCuando el formulario se envía (via @submit.prevent)

Slots ​

SlotScopeDescripción
#header—Reemplaza el header título/descripción
default—Cuerpo del formulario
#footer{ requestClose }Footer personalizado. Si no se provee, se usa el footer por defecto.

Expone ​

MétodoDescripción
requestClose()Cierra el modal pasando por la validación dirty

Cuando NO se provee el slot #footer, UiFormModal renderiza automáticamente:

html
<div class="modal-footer">
  <UiButton type="button" variant="outline" @click="requestClose">
    {{ cancelLabel }}
  </UiButton>
  <UiButton type="submit" :loading="loading">
    {{ submitLabel }}
  </UiButton>
</div>

Ejemplos ​

vue
<UiFormModal
  v-model="isOpen"
  title="Nueva Sede"
  description="Agrega una ubicación a tu empresa."
  submit-label="Crear Sede"
  :loading="branchStore.isLoading"
  :dirty="isDirty"
  :confirm-on-dirty="true"
  @submit="handleSubmit"
>
  <UiInput v-model="form.name" label="Nombre" required />
  <UiInput v-model="form.city" label="Ciudad" />
</UiFormModal>
vue
<UiFormModal
  v-model="isOpen"
  title="Invitar Miembro"
  size="large"
  :dirty="isAddDirty"
  :confirm-on-dirty="true"
  @submit="handleAddSubmit"
>
  <!-- formulario complejo -->

  <template #footer="{ requestClose }">
    <div class="modal-footer">
      <UiButton type="button" variant="outline" @click="requestClose">
        Cancelar
      </UiButton>
      <UiButton type="submit" :loading="memberStore.isLoading">
        Agregar al Equipo
      </UiButton>
    </div>
  </template>
</UiFormModal>

Integración con useDirtyForm ​

ts
const { isDirty, capture } = useDirtyForm(() => ({ ...form }))

const openModal = () => {
  form.name = ''
  capture()  // guarda el estado inicial como referencia
  isOpen.value = true
}
vue
<UiFormModal
  v-model="isOpen"
  :dirty="isDirty"
  :confirm-on-dirty="true"  // activa el diálogo de confirmación
  ...
/>

Documentación de Kaleo — plataforma SaaS multi-tenant