/v1.0

DropdownButton

DropdownButton combina un botón disparador (ya sea un botón de ícono o un botón completo) con un menú emergente que lista elementos DropdownOption. Cada opción puede ejecutar un callback local o disparar una petición HTTP remota (incluyendo exportaciones de archivos). Úsalo como reemplazo flexible de ActionsMenuButton cuando necesites soporte para acciones remotas o un botón disparador con etiqueta.

Props

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | options | DropdownOption[] | Sí | — | Array de elementos del dropdown. Ver la definición de DropdownOption a continuación. | | buttonVariant | "icon" \| "button" | No | "icon" | Si el disparador se renderiza como botón de ícono o botón con etiqueta. | | buttonSize | "xs" \| "sm" \| "md" \| "lg" \| "xl" | No | "md" | Tamaño del botón disparador. | | buttonType | "clear" \| "outline" \| "solid" | No | "clear" | Variante visual del botón disparador. | | buttonIcon | string | No | "moreVertical" | Identificador del ícono para el botón disparador. | | buttonTitle | string | No | "" | Etiqueta del botón disparador cuando buttonVariant es "button". | | buttonStyle | React.CSSProperties | No | — | Estilos en línea aplicados al botón disparador. | | buttonClassName | string | No | — | Clase CSS aplicada al botón disparador (solo cuando buttonVariant es "button"). | | popoverStyle | React.CSSProperties | No | — | Estilos en línea aplicados al contenedor del popover. | | popoverZIndex | number | No | 9999 | Z-index del popover. | | onItemSelect | (actionName: string) => void | No | — | Manejador global llamado con el name del elemento cuando se selecciona (se usa cuando el elemento no tiene su propio manejador). | | closeOnSelect | boolean | No | true | Si el popover se cierra después de seleccionar un elemento. |

DropdownOption

| Campo | Tipo | Requerido | Descripción | |-------|------|-----------|-------------| | name | string | Sí | Clave única que identifica la opción. | | label | string | Sí | Texto que se muestra en el dropdown. | | config.icon | string | No | Identificador del ícono mostrado antes de la etiqueta. | | config.color | string | No | Color del botón de la opción. | | config.style | React.CSSProperties | No | Estilos en línea para el botón de la opción. | | config.onClick | (actionName: string) => void | No | Manejador de clic por elemento. Tiene prioridad sobre onItemSelect. | | config.mode | "local" \| "remote" | No | Cuando es "remote", el elemento usa ActionButton para hacer una petición HTTP. | | config.path | string | No | Ruta del endpoint de la API (requiere mode: "remote"). | | config.method | "GET" \| "POST" \| "PUT" \| "DELETE" | No | Método HTTP (requiere mode: "remote"). | | config.useAuthToken | boolean | No | Usa el cliente HTTP autenticado (requiere mode: "remote"). | | config.apiBaseUrl | string | No | Sobreescritura de la URL base (requiere mode: "remote"). | | config.data | Record<string, any> | No | Cuerpo de la petición (requiere mode: "remote"). | | config.onSuccess | (response: any) => void | No | Callback al éxito de la petición (requiere mode: "remote"). | | config.onError | (error: any) => void | No | Callback al fallo de la petición (requiere mode: "remote"). | | config.isExport | boolean | No | Usa getBlob() en lugar de la petición estándar para descargas de archivos. | | config.closeOnSelect | boolean | No | Sobreescritura por elemento para closeOnSelect. |

Uso

Disparador de ícono básico

import DropdownButton from '@/components/buttons/DropdownButton';

export default function Example() {
  return (
    <DropdownButton
      options={[
        { name: 'edit', label: 'Editar', config: { icon: 'edit' } },
        { name: 'delete', label: 'Eliminar', config: { icon: 'trash', color: 'danger' } },
      ]}
      onItemSelect={(name) => console.log('Seleccionado:', name)}
    />
  );
}

Botón disparador con etiqueta

import DropdownButton from '@/components/buttons/DropdownButton';

export default function Example() {
  return (
    <DropdownButton
      buttonVariant="button"
      buttonTitle="Acciones"
      buttonIcon="chevronDown"
      buttonType="outline"
      options={[
        { name: 'export', label: 'Exportar CSV' },
        { name: 'archive', label: 'Archivar' },
      ]}
      onItemSelect={(name) => console.log(name)}
    />
  );
}

Acción remota con exportación de archivo

import DropdownButton from '@/components/buttons/DropdownButton';

export default function Example({ orderId }: { orderId: string }) {
  return (
    <DropdownButton
      options={[
        {
          name: 'pdf',
          label: 'Descargar PDF',
          config: {
            mode: 'remote',
            method: 'GET',
            path: `/v1/orders/${orderId}/pdf`,
            useAuthToken: true,
            isExport: true,
            onSuccess: (blob) => {
              const url = URL.createObjectURL(blob);
              window.open(url);
            },
          },
        },
      ]}
    />
  );
}