/v1.0

EditableAutocompleteField

EditableAutocompleteField envuelve AutocompleteField en el patrón editable. En modo lectura el autocompletado se renderiza en un estado deshabilitado y atenuado. Al hacer clic en el ícono de edición se habilita para que el usuario pueda buscar y seleccionar un nuevo valor. Opcionalmente, se pueden crear nuevos registros inline a través de un popover de formulario integrado. Al guardar, el valor seleccionado se persiste mediante un request PATCH/PUT.

Props

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | name | string | Sí | — | Nombre del campo enviado como clave en el payload de actualización. | | value | any \| any[] | No | — | Valor actualmente seleccionado o array de valores (cuando multiple es true). | | updatePath | string | Sí | — | Ruta del endpoint API para persistir el cambio. | | apiBaseUrl | string | Sí | — | URL base usada tanto para los requests de búsqueda como para el de actualización. | | searchPath | string | Sí | — | Ruta API para la búsqueda de autocompletado (ej. "/v1/products/search"). | | label | string | No | — | Etiqueta mostrada sobre el campo. | | description | string | No | — | Texto de ayuda mostrado debajo de la etiqueta. | | multiple | boolean | No | false | Cuando es true, permite seleccionar múltiples ítems. | | placeholder | string | No | "Escriba para buscar..." | Placeholder dentro del input de búsqueda. | | useAuthToken | boolean | No | false | Cuando es true, los requests de búsqueda y actualización incluyen el token. | | searchParam | string | No | — | Nombre del parámetro de query usado para el término de búsqueda. | | noResultsText | string | No | "No results found" | Texto mostrado cuando la búsqueda no devuelve resultados. | | searchingText | string | No | "Searching..." | Texto mostrado mientras el request de búsqueda está en curso. | | itemLabelKey | string | No | "name" | Clave del objeto usada como etiqueta de cada resultado. | | itemDescriptionKey | string | No | — | Clave del objeto usada como descripción secundaria de cada resultado. | | itemImageKey | string | No | — | Clave del objeto usada para una URL de imagen junto a cada resultado. | | itemLabelStyle | React.CSSProperties | No | — | Estilo del texto de etiqueta dentro de cada resultado. | | itemDescriptionStyle | React.CSSProperties | No | — | Estilo del texto de descripción dentro de cada resultado. | | itemImageStyle | React.CSSProperties | No | — | Estilo de la imagen dentro de cada resultado. | | allowCreate | boolean | No | false | Cuando es true, muestra un botón para crear un nuevo registro inline. | | formFields | Field[] | No | [] | Definiciones de campo para el formulario de creación inline. | | formTitle | string | No | "Crear nuevo registro" | Título del formulario de creación inline. | | formButtonText | string | No | — | Etiqueta del botón de envío del formulario de creación. | | formButtonTitle | string | No | "Crear nuevo" | Tooltip/title del botón de creación. | | createPath | string | No | — | Ruta API usada para enviar el formulario de creación inline. | | createButtonType | "solid" \| "clear" \| "outline" | No | "solid" | Estilo del botón disparador de creación. | | createButtonSize | "sm" \| "md" \| "lg" | No | "sm" | Tamaño del botón disparador de creación. | | createButtonColor | string | No | — | Color personalizado para el botón de creación. | | createButtonTitle | string | No | — | Tooltip del botón de creación. | | createButtonIcon | string | No | "add" | Nombre del ícono del botón de creación. | | formWidth | number \| string | No | 500 | Ancho del popover del formulario de creación inline. | | onCreateSuccess | (newRecord: any) => void | No | — | Llamado tras crear un nuevo registro exitosamente de forma inline. | | onCreateError | (error: any) => void | No | — | Llamado cuando la creación inline de un registro falla. | | onEditStart | () => void | No | — | Llamado cuando comienza el modo edición. | | onEditSuccess | (updatedValue: any, newFormData: any) => void | No | — | Llamado tras un guardado exitoso. | | onEditError | (error: any) => void | No | — | Llamado al fallar el request; el valor se revierte. | | onEditCancel | () => void | No | — | Llamado al cancelar; el valor se revierte. | | editIcon | string | No | "pencil" | Nombre del ícono para el botón de edición. | | saveIcon | string | No | "check" | Nombre del ícono para el botón de guardar. | | cancelIcon | string | No | "close" | Nombre del ícono para el botón de cancelar. | | containerStyle | React.CSSProperties | No | — | Estilo del contenedor externo. | | labelStyle | React.CSSProperties | No | — | Estilo del elemento <label>. | | descriptionStyle | React.CSSProperties | No | — | Estilo del texto de descripción. | | popoverStyle | React.CSSProperties | No | — | Estilo del popover de resultados del autocompletado. |

Uso

Básico

import React, { useState } from 'react';
import EditableAutocompleteField from '@/components/editable-fields/EditableAutocompleteField';

export default function Example() {
  const [category, setCategory] = useState(null);

  return (
    <EditableAutocompleteField
      label="Category"
      name="category_id"
      value={category}
      apiBaseUrl="https://api.example.com"
      searchPath="/v1/categories/search"
      updatePath="/v1/products/7"
      itemLabelKey="name"
      useAuthToken
      onEditSuccess={(updated) => setCategory(updated)}
    />
  );
}

Multi-selección con creación inline

<EditableAutocompleteField
  label="Tags"
  name="tag_ids"
  value={tags}
  multiple
  apiBaseUrl="https://api.example.com"
  searchPath="/v1/tags/search"
  updatePath="/v1/articles/12"
  itemLabelKey="name"
  allowCreate
  createPath="/v1/tags"
  formTitle="New Tag"
  formFields={[{ type: 'text', name: 'name', label: 'Tag name' }]}
  useAuthToken
  onEditSuccess={(updated) => setTags(updated)}
/>