index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import React, {
  2. useContext,
  3. useState,
  4. useEffect,
  5. ChangeEvent,
  6. FC,
  7. useMemo,
  8. } from "react";
  9. import Select from "../../forms/select";
  10. import CalendarInput from "../../forms/calendarInput";
  11. import {
  12. DispatchContext,
  13. StateContext,
  14. } from "../../../../context/dashboard/Provider";
  15. import * as actions from "../../../../context/dashboard/actions";
  16. import { sectors } from "../../../../api";
  17. import { UserStateContext } from "../../../../context/auth/AuthProvider";
  18. import { Station } from "../../../../types";
  19. import { campMaxMin, campString, getCampList, mustCheckDateOrder } from "../../../../utils";
  20. import Modal from "../../../portals/modal";
  21. const Cockpit: FC = () => {
  22. const [error, setError] = useState<string | null>(null);
  23. const dashboardState = useContext(StateContext);
  24. const dashboardDispatch = useContext(DispatchContext);
  25. const userState = useContext(UserStateContext);
  26. const [sectorList, setSectorList] = useState<Station[]>([]);
  27. // Opciones para selector de campania
  28. const selectedCampaignYear = dashboardState.year;
  29. const campaignList = dashboardState.years.map((v, _) => ({ title: v, value: v }));
  30. // Inicializacion del selector de fincas
  31. useEffect(() => {
  32. const token = userState.userToken;
  33. if (!token) return;
  34. sectors(token).then((list) => {
  35. setSectorList(list);
  36. if (list.length > 0) {
  37. dashboardDispatch(actions.setSector(list[0].station_code));
  38. }
  39. });
  40. }, []);
  41. const sectorChoices = useMemo(
  42. () =>
  43. sectorList.map(({ title, station_code }) => ({
  44. title,
  45. value: station_code,
  46. })),
  47. [sectorList]
  48. );
  49. const handleCampChange = (e: ChangeEvent<HTMLInputElement>) => {
  50. const camp = campMaxMin(e.target.value);
  51. dashboardDispatch(actions.setMinMaxDate(camp.min, camp.max));
  52. dashboardDispatch(actions.setYearControl(e.target.value));
  53. };
  54. const handleFromChange = (e: ChangeEvent<HTMLInputElement>) => {
  55. try {
  56. mustCheckDateOrder(e.target.value, dashboardState.to);
  57. } catch (e) {
  58. setError(e as any);
  59. return;
  60. }
  61. return dashboardDispatch(actions.setFromControl(e.target.value));
  62. };
  63. const handleToChange = (e: ChangeEvent<HTMLInputElement>) => {
  64. try {
  65. mustCheckDateOrder(dashboardState.from, e.target.value);
  66. } catch (e) {
  67. setError(e as any);
  68. return;
  69. }
  70. return dashboardDispatch(actions.setToControl(e.target.value));
  71. };
  72. return (
  73. <>
  74. {error && (
  75. <Modal
  76. key="Error"
  77. title={"Error"}
  78. staticBackdrop
  79. accept={() => setError(null)}
  80. >
  81. <p style={{ color: "red" }}>{error.toString()}</p>
  82. </Modal>
  83. )}
  84. <section className="row mb-3">
  85. {/* Finca */}
  86. <div className="col-12 col-lg-4 mb-2 col-xl-3 mb-xl-0">
  87. <Select
  88. labelTitle="Finca"
  89. list={sectorChoices}
  90. onChange={(e: ChangeEvent<HTMLInputElement>) =>
  91. dashboardDispatch(actions.setSector(e.target.value))
  92. }
  93. name="finca"
  94. placeholder="Fincas"
  95. />
  96. </div>
  97. {/* Campania */}
  98. <div className="col-6 col-lg-4 mb-2 col-xl-auto mb-xl-0">
  99. <Select
  100. list={campaignList}
  101. onChange={handleCampChange}
  102. value={selectedCampaignYear}
  103. name="campania"
  104. labelTitle="Campaña"
  105. placeholder="Camapaña"
  106. />
  107. </div>
  108. {/* Desde */}
  109. <div className="col-6 col-lg-4 mb-2 col-xl-auto mb-xl-0">
  110. <CalendarInput
  111. onChange={handleFromChange}
  112. value={dashboardState.from}
  113. min={dashboardState.minDate}
  114. max={dashboardState.maxDate}
  115. name="desde"
  116. labelTitle="Fecha desde"
  117. />
  118. </div>
  119. {/* Hasta */}
  120. <div className="col-6 col-lg-4 mb-2 col-xl-auto mb-xl-0">
  121. <CalendarInput
  122. onChange={handleToChange}
  123. value={dashboardState.to}
  124. min={dashboardState.minDate}
  125. max={dashboardState.maxDate}
  126. name="hasta"
  127. labelTitle="Fecha hasta"
  128. />
  129. </div>
  130. </section>
  131. <h5>
  132. Temporada {campString(dashboardState.from, dashboardState.to, true)}
  133. </h5>
  134. </>
  135. );
  136. };
  137. export default Cockpit;