import React from 'react' import PropTypes from "prop-types"; import { Select as AntdSelect, Tag } from 'antd' import { useModels } from '../hooks'; import { agregarFaltantes } from '../utilities'; const Selector = ({ modelsParams, labelProp, valueProp, render, append, deleteSelected, extraParams, onChange, labelInValue = false, filtered = [], tagOptions, ...props }) => { const [request, setRequest] = React.useState({}); const [buscarValue, setBuscarValue] = React.useState(''); const [timer, setTimer] = React.useState(null); const [selected, setSelected] = React.useState([...filtered]); const extraParamsMemo = React.useMemo(() => ({ buscar: buscarValue, ...extraParams }), [buscarValue, extraParams] ); const requestMemo = React.useMemo(() => ({ name: modelsParams?.name || "", ordenar: modelsParams?.ordenar || "id-desc", limite: modelsParams?.limite || 20, expand: modelsParams?.expand || "", extraParams: extraParamsMemo, }), [extraParamsMemo, modelsParams]); const { models: modelsData, modelsLoading: modelsDataLoading, modelsError } = useModels(request); const onSearch = (value) => { clearTimeout(timer); const newTimer = setTimeout(() => { setBuscarValue(value); }, 300); setTimer(newTimer); }; if(!render) { render = (value) => value; } if (!append) { append = []; } const _onChange = (_, option) => { setSelected(ultimoEstado => agregarFaltantes(ultimoEstado, option, "id")); } const options = React.useMemo(() => { let aux = agregarFaltantes([...modelsData], [...append], valueProp); aux = aux.filter(item => !selected.find(i => item.id === i.id)); return aux; }, [append, modelsData, selected, valueProp]); let _options = [] if (tagOptions) { for (let i = 10; i < 36; i++) { _options.push({ value: i.toString(36) + i, label: i.toString(36) + i, }); } } React.useEffect(() => { setRequest(requestMemo); return () => { setRequest({}); }; }, [requestMemo]); React.useEffect(() => { if(onChange) { onChange && onChange(selected); } }, [selected, onChange]); if(modelsError) { return error al obtener información de selector. } return ( setSelected([])} options={ options.map(i => ({ ...i, label: render(i[labelProp], i), value: i[valueProp], }))} onDeselect={(v) => { setSelected(ls => ls.filter(i => i.id !== v.value)) }} /> ) } Selector.propTypes = { modelsParams: PropTypes.object.isRequired, labelProp: PropTypes.string.isRequired, valueProp: PropTypes.string.isRequired, render: PropTypes.func, notIn: PropTypes.string, onDeselected: PropTypes.func, deleteSelected: PropTypes.string, filtered: PropTypes.array, }; export default Selector