select.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React from "react";
  2. // _____
  3. // const {doctors, appointment, timeArray,services} = this.props.app;
  4. // ________
  5. const mock = [
  6. { id: 1, text: "Закрытие рецессии десны" },
  7. { id: 2, text: "Удаление кисты" },
  8. { id: 3, text: "THREE" }
  9. ];
  10. export const CustomSelect = ({ label, options = mock, emptyLine = false, searchInput = true, reset }) => {
  11. const [copyOption, setCopyOption] = React.useState([]);
  12. const [show, toggleShow] = React.useState(false);
  13. const [value, toggleValue] = React.useState("");
  14. const [inputValue, toggleInputValue] = React.useState("");
  15. const list = React.createRef();
  16. React.useEffect(() => {
  17. document.addEventListener("mousedown", handleClickOutSide);
  18. return () => document.removeEventListener("mousedown", handleClickOutSide);
  19. });
  20. React.useEffect(() => {
  21. if (reset) {
  22. toggleValue("");
  23. toggleInputValue("");
  24. setCopyOption(options);
  25. toggleShow(false);
  26. }
  27. }, [options, reset]);
  28. React.useEffect(() => {
  29. setCopyOption(options);
  30. }, [options]);
  31. const handleClickOutSide = e => {
  32. if (!show) return;
  33. if (list.current && !list.current.contains(e.target)) {
  34. toggleShow(false);
  35. }
  36. };
  37. const toggleEvent = text => {
  38. toggleValue(text);
  39. toggleInputValue(text);
  40. toggleShow(false);
  41. };
  42. const clickOnEptyLine = () => {
  43. toggleValue("");
  44. toggleInputValue("");
  45. toggleShow(false);
  46. };
  47. const chahgeValueEvent = e => {
  48. const { value } = e.target;
  49. toggleInputValue(e.target.value);
  50. if (!value) {
  51. setCopyOption(options);
  52. toggleInputValue(value);
  53. } else {
  54. const filtered = copyOption.filter(el => el.text.toLowerCase().indexOf(value.toLowerCase()) >= 0);
  55. setCopyOption(filtered);
  56. toggleInputValue(value);
  57. }
  58. };
  59. return (
  60. <div className="select">
  61. {label && (
  62. <label htmlFor="select" className="select__lable">
  63. {label}
  64. </label>
  65. )}
  66. <div className="select__value-box " onClick={() => toggleShow(true)}>
  67. {searchInput ? null : <span>{value} &nbsp;</span>}
  68. <input
  69. value={inputValue}
  70. autoComplete="off"
  71. type={searchInput ? "text" : "hidden"}
  72. onChange={chahgeValueEvent}
  73. id="select"
  74. className="select__input icon-angle-down"
  75. />
  76. <span class="icon-angle-down"></span>
  77. </div>
  78. {show && (
  79. <ul className="select__list " ref={list}>
  80. {emptyLine && (
  81. <li className="select__item" onClick={clickOnEptyLine}>
  82. &nbsp;
  83. </li>
  84. )}
  85. {copyOption.map(el => (
  86. <li className="select__item" key={el.id} onClick={toggleEvent.bind(null, el.text)}>
  87. {el.text}
  88. </li>
  89. ))}
  90. </ul>
  91. )}
  92. </div>
  93. );
  94. };