contentoh-components-library 12.0.0 → 12.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/.env.development +8 -2
  2. package/.env.production +8 -2
  3. package/CHANGELOG.md +39 -0
  4. package/dist/assets/images/carouselImagesLogin/login2.svg +117 -0
  5. package/dist/assets/images/carouselImagesLogin/login3.svg +147 -0
  6. package/dist/assets/images/carouselImagesLogin/loginImage.svg +301 -0
  7. package/dist/assets/images/editField/showPassword.png +0 -0
  8. package/dist/assets/images/generalButton/downloadIcon.svg +3 -0
  9. package/dist/assets/images/genericModal/closeWhite.svg +3 -0
  10. package/dist/assets/images/genericModal/errorModal.svg +3 -0
  11. package/dist/assets/images/genericModal/yellowAlert.svg +12 -0
  12. package/dist/assets/images/sliderToolTip/infoIcon.svg +4 -0
  13. package/dist/assets/images/sliderToolTip/slide1.svg +5 -0
  14. package/dist/assets/images/sliderToolTip/slide2.svg +9 -0
  15. package/dist/assets/images/sliderToolTip/slide3.svg +9 -0
  16. package/dist/assets/images/sliderToolTip/slide4.svg +9 -0
  17. package/dist/assets/images/sliderToolTip/slide5.svg +40 -0
  18. package/dist/assets/images/verticalSideMenuMainPage/closeMenu.svg +4 -0
  19. package/dist/assets/images/verticalSideMenuMainPage/iconFAQS.svg +12 -0
  20. package/dist/assets/images/verticalSideMenuMainPage/iconGroup.svg +3 -0
  21. package/dist/assets/images/verticalSideMenuMainPage/iconLogo.svg +12 -0
  22. package/dist/assets/images/verticalSideMenuMainPage/iconLogoContentoh.svg +15 -0
  23. package/dist/assets/images/verticalSideMenuMainPage/iconProduct.svg +3 -0
  24. package/dist/assets/images/verticalSideMenuMainPage/iconSpeedometer.svg +12 -0
  25. package/dist/assets/images/verticalSideMenuMainPage/iconTask.svg +10 -0
  26. package/dist/assets/images/verticalSideMenuMainPage/openMenu.svg +4 -0
  27. package/dist/components/atoms/AsignationOption/index.js +24 -2
  28. package/dist/components/atoms/AsignationOption/styles.js +1 -1
  29. package/dist/components/atoms/CharCounter/CharCounter.stories.js +31 -0
  30. package/dist/components/atoms/CharCounter/index.js +22 -0
  31. package/dist/components/atoms/CharCounter/styles.js +20 -0
  32. package/dist/components/atoms/CheckBox/index.js +4 -2
  33. package/dist/components/atoms/DropDownButton/styles.js +1 -1
  34. package/dist/components/atoms/GeneralButton/styles.js +4 -2
  35. package/dist/components/atoms/GeneralInput/index.js +121 -65
  36. package/dist/components/atoms/GeneralInput/styles.js +8 -2
  37. package/dist/components/atoms/GenericModal/index.js +4 -2
  38. package/dist/components/atoms/GenericModal/styles.js +1 -1
  39. package/dist/components/atoms/GradientPanel/styles.js +2 -2
  40. package/dist/components/atoms/Input/index.js +1 -1
  41. package/dist/components/atoms/Input/style.js +4 -4
  42. package/dist/components/atoms/InputFormatter/Wysiwyg.stories.js +30 -0
  43. package/dist/components/atoms/InputFormatter/index.js +187 -0
  44. package/dist/components/atoms/InputFormatter/styles.js +33 -0
  45. package/dist/components/atoms/LabelToInput/index.js +0 -1
  46. package/dist/components/atoms/LabelToInput/style.js +3 -3
  47. package/dist/components/atoms/Loading/Loading.stories.js +28 -0
  48. package/dist/components/atoms/Loading/index.js +27 -0
  49. package/dist/components/atoms/Loading/styles.js +22 -0
  50. package/dist/components/atoms/LogoImage/index.js +1 -0
  51. package/dist/components/atoms/ProductPercentCard/Percent.stories.js +41 -0
  52. package/dist/components/atoms/ProductPercentCard/index.js +45 -0
  53. package/dist/components/atoms/ProductPercentCard/styles.js +20 -0
  54. package/dist/components/atoms/ProgressBar/styles.js +1 -1
  55. package/dist/components/atoms/ScreenHeader/index.js +1 -1
  56. package/dist/components/atoms/ScreenHeader/styles.js +1 -1
  57. package/dist/components/atoms/Select/index.js +4 -2
  58. package/dist/components/atoms/Select/style.js +1 -1
  59. package/dist/components/atoms/SliderToolTip/SliderToolTip.stories.js +47 -0
  60. package/dist/components/atoms/SliderToolTip/index.js +200 -0
  61. package/dist/components/atoms/SliderToolTip/styles.js +24 -0
  62. package/dist/components/atoms/StatusTag/index.js +37 -2
  63. package/dist/components/atoms/StatusTag/styles.js +1 -1
  64. package/dist/components/atoms/ValidationPanel/index.js +4 -3
  65. package/dist/components/atoms/VerticalSideMenuMainPage/VerticalSideMenuMainPage.stories.js +28 -0
  66. package/dist/components/atoms/VerticalSideMenuMainPage/index.js +98 -0
  67. package/dist/components/atoms/VerticalSideMenuMainPage/styles.js +24 -0
  68. package/dist/components/molecules/AvatarAndValidation/index.js +9 -12
  69. package/dist/components/molecules/CarouselImagesLogin/CarouselImagesLogin.stories.js +37 -0
  70. package/dist/components/molecules/CarouselImagesLogin/index.js +92 -0
  71. package/dist/components/molecules/CarouselImagesLogin/styles.js +21 -0
  72. package/dist/components/molecules/EmailResetPasswordLogin/EmailResetPasswordLogin.stories.js +28 -0
  73. package/dist/components/molecules/EmailResetPasswordLogin/index.js +153 -0
  74. package/dist/components/molecules/EmailResetPasswordLogin/styles.js +20 -0
  75. package/dist/components/molecules/GalleryElement/index.js +32 -7
  76. package/dist/components/molecules/GalleryHeader/index.js +19 -2
  77. package/dist/components/molecules/LoginPasswordStrength/LoginPasswordStrength.stories.js +28 -0
  78. package/dist/components/molecules/LoginPasswordStrength/index.js +126 -0
  79. package/dist/components/molecules/LoginPasswordStrength/styles.js +78 -0
  80. package/dist/components/molecules/LogoLoading/Loading.stories.js +28 -0
  81. package/dist/components/molecules/LogoLoading/index.js +22 -0
  82. package/dist/components/molecules/LogoLoading/styles.js +18 -0
  83. package/dist/components/molecules/RegistrationFirstStep/RegistrationFirstStep.stories.js +28 -0
  84. package/dist/components/molecules/RegistrationFirstStep/index.js +308 -0
  85. package/dist/components/molecules/RegistrationFirstStep/styles.js +20 -0
  86. package/dist/components/molecules/RegistrationSecondStep/RegistrationSecondStep.stories.js +28 -0
  87. package/dist/components/molecules/RegistrationSecondStep/index.js +172 -0
  88. package/dist/components/molecules/RegistrationSecondStep/styles.js +20 -0
  89. package/dist/components/molecules/RegistrationThirdStep/RegistrationThirdStep.stories.js +28 -0
  90. package/dist/components/molecules/RegistrationThirdStep/index.js +155 -0
  91. package/dist/components/molecules/RegistrationThirdStep/styles.js +20 -0
  92. package/dist/components/molecules/RetailerSelector/index.js +11 -3
  93. package/dist/components/molecules/RetailerSelector/styles.js +1 -1
  94. package/dist/components/molecules/SignInLogin/SignInLogin.stories.js +28 -0
  95. package/dist/components/molecules/SignInLogin/index.js +315 -0
  96. package/dist/components/molecules/SignInLogin/styles.js +20 -0
  97. package/dist/components/molecules/StatusAsignationInfo/index.js +19 -33
  98. package/dist/components/molecules/TableHeader/index.js +7 -3
  99. package/dist/components/molecules/TableHeader/styles.js +1 -1
  100. package/dist/components/molecules/TagAndInput/index.js +23 -5
  101. package/dist/components/molecules/TagAndInput/styles.js +10 -2
  102. package/dist/components/molecules/VerificationCodeResetPasswordLogin/VerificationCodeResetPasswordLogin.stories.js +28 -0
  103. package/dist/components/molecules/VerificationCodeResetPasswordLogin/index.js +211 -0
  104. package/dist/components/molecules/VerificationCodeResetPasswordLogin/styles.js +20 -0
  105. package/dist/components/molecules/VerificationCodeResetPasswordLogin/utils.js +69 -0
  106. package/dist/components/organisms/ChangePassword/ChangePassword.stories.js +28 -0
  107. package/dist/components/organisms/ChangePassword/index.js +124 -0
  108. package/dist/components/organisms/ChangePassword/styles.js +18 -0
  109. package/dist/components/organisms/FullProductNameHeader/index.js +40 -15
  110. package/dist/components/organisms/FullTabsMenu/index.js +11 -11
  111. package/dist/components/organisms/GlobalModal/index.js +73 -0
  112. package/dist/components/organisms/GlobalModal/styles.js +66 -0
  113. package/dist/components/organisms/ImageDataTable/index.js +19 -13
  114. package/dist/components/organisms/InputGroup/index.js +17 -12
  115. package/dist/components/organisms/InputGroup/styles.js +1 -1
  116. package/dist/components/organisms/ProductImageModal/index.js +3 -6
  117. package/dist/components/organisms/ProductImageModal/styles.js +1 -1
  118. package/dist/components/pages/ChangePasswordLogin/ChangePasswordLogin.stories.js +38 -0
  119. package/dist/components/pages/ChangePasswordLogin/index.js +108 -0
  120. package/dist/components/pages/ChangePasswordLogin/styles.js +18 -0
  121. package/dist/components/pages/EmailResetPassword/EmailResetPassword.stories.js +37 -0
  122. package/dist/components/pages/EmailResetPassword/index.js +130 -0
  123. package/dist/components/pages/EmailResetPassword/styles.js +20 -0
  124. package/dist/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +175 -0
  125. package/dist/components/pages/ProviderProductEdition/index.js +1800 -0
  126. package/dist/components/pages/ProviderProductEdition/styles.js +23 -0
  127. package/dist/components/pages/RegistrationLoginFirstStep/RegistrationLoginFirstStep.stories.js +37 -0
  128. package/dist/components/pages/RegistrationLoginFirstStep/index.js +269 -0
  129. package/dist/components/pages/RegistrationLoginFirstStep/styles.js +20 -0
  130. package/dist/components/pages/RegistrationLoginSecondStep/RegistrationLoginSecondStep.stories.js +38 -0
  131. package/dist/components/pages/RegistrationLoginSecondStep/index.js +176 -0
  132. package/dist/components/pages/RegistrationLoginSecondStep/styles.js +20 -0
  133. package/dist/components/pages/RegistrationLoginThirdStep/RegistrationLoginThirdStep.stories.js +37 -0
  134. package/dist/components/pages/RegistrationLoginThirdStep/index.js +178 -0
  135. package/dist/components/pages/RegistrationLoginThirdStep/styles.js +20 -0
  136. package/dist/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +34 -75
  137. package/dist/components/pages/RetailerProductEdition/index.js +937 -641
  138. package/dist/components/pages/RetailerProductEdition/styles.js +1 -1
  139. package/dist/components/pages/VerificationCodeResetPassword/VerificationCodeResetPassword.stories.js +37 -0
  140. package/dist/components/pages/VerificationCodeResetPassword/index.js +121 -0
  141. package/dist/components/pages/VerificationCodeResetPassword/styles.js +20 -0
  142. package/dist/components/pages/VerificationCodeResetPassword/utils.js +69 -0
  143. package/dist/global-files/data.js +36 -12
  144. package/dist/index.js +316 -100
  145. package/package.json +21 -8
  146. package/src/assets/images/carouselImagesLogin/login2.svg +117 -0
  147. package/src/assets/images/carouselImagesLogin/login3.svg +147 -0
  148. package/src/assets/images/carouselImagesLogin/loginImage.svg +301 -0
  149. package/src/assets/images/editField/showPassword.png +0 -0
  150. package/src/assets/images/generalButton/downloadIcon.svg +3 -0
  151. package/src/assets/images/genericModal/closeWhite.svg +3 -0
  152. package/src/assets/images/genericModal/errorModal.svg +3 -0
  153. package/src/assets/images/genericModal/yellowAlert.svg +12 -0
  154. package/src/assets/images/sliderToolTip/infoIcon.svg +4 -0
  155. package/src/assets/images/sliderToolTip/slide1.svg +5 -0
  156. package/src/assets/images/sliderToolTip/slide2.svg +9 -0
  157. package/src/assets/images/sliderToolTip/slide3.svg +9 -0
  158. package/src/assets/images/sliderToolTip/slide4.svg +9 -0
  159. package/src/assets/images/sliderToolTip/slide5.svg +40 -0
  160. package/src/assets/images/verticalSideMenuMainPage/closeMenu.svg +4 -0
  161. package/src/assets/images/verticalSideMenuMainPage/iconFAQS.svg +12 -0
  162. package/src/assets/images/verticalSideMenuMainPage/iconGroup.svg +3 -0
  163. package/src/assets/images/verticalSideMenuMainPage/iconLogo.svg +12 -0
  164. package/src/assets/images/verticalSideMenuMainPage/iconLogoContentoh.svg +15 -0
  165. package/src/assets/images/verticalSideMenuMainPage/iconProduct.svg +3 -0
  166. package/src/assets/images/verticalSideMenuMainPage/iconSpeedometer.svg +12 -0
  167. package/src/assets/images/verticalSideMenuMainPage/iconTask.svg +10 -0
  168. package/src/assets/images/verticalSideMenuMainPage/openMenu.svg +4 -0
  169. package/src/components/atoms/AsignationOption/index.js +17 -0
  170. package/src/components/atoms/AsignationOption/styles.js +13 -1
  171. package/src/components/atoms/CharCounter/CharCounter.stories.js +11 -0
  172. package/src/components/atoms/CharCounter/index.js +13 -0
  173. package/src/components/atoms/CharCounter/styles.js +10 -0
  174. package/src/components/atoms/CheckBox/index.js +8 -2
  175. package/src/components/atoms/DropDownButton/styles.js +6 -0
  176. package/src/components/atoms/GeneralButton/styles.js +14 -0
  177. package/src/components/atoms/GeneralInput/index.js +109 -68
  178. package/src/components/atoms/GeneralInput/styles.js +34 -0
  179. package/src/components/atoms/GenericModal/index.js +2 -2
  180. package/src/components/atoms/GenericModal/styles.js +11 -3
  181. package/src/components/atoms/GradientPanel/styles.js +8 -1
  182. package/src/components/atoms/Input/index.js +2 -1
  183. package/src/components/atoms/Input/style.js +9 -5
  184. package/src/components/atoms/InputFormatter/Wysiwyg.stories.js +12 -0
  185. package/src/components/atoms/InputFormatter/index.js +146 -0
  186. package/src/components/atoms/InputFormatter/styles.js +41 -0
  187. package/src/components/atoms/LabelToInput/index.js +0 -1
  188. package/src/components/atoms/LabelToInput/style.js +15 -4
  189. package/src/components/atoms/Loading/Loading.stories.js +10 -0
  190. package/src/components/atoms/Loading/index.js +13 -0
  191. package/src/components/atoms/Loading/styles.js +57 -0
  192. package/src/components/atoms/LogoImage/index.js +1 -1
  193. package/src/components/atoms/ProductPercentCard/Percent.stories.js +41 -0
  194. package/src/components/atoms/ProductPercentCard/index.js +23 -0
  195. package/src/components/atoms/{Percent → ProductPercentCard}/styles.js +11 -7
  196. package/src/components/atoms/ProgressBar/styles.js +2 -1
  197. package/src/components/atoms/ScreenHeader/index.js +7 -3
  198. package/src/components/atoms/ScreenHeader/styles.js +14 -2
  199. package/src/components/atoms/Select/index.js +3 -1
  200. package/src/components/atoms/Select/style.js +1 -2
  201. package/src/components/atoms/SliderToolTip/SliderToolTip.stories.js +23 -0
  202. package/src/components/atoms/SliderToolTip/index.js +182 -0
  203. package/src/components/atoms/SliderToolTip/styles.js +168 -0
  204. package/src/components/atoms/StatusTag/index.js +30 -2
  205. package/src/components/atoms/StatusTag/styles.js +9 -4
  206. package/src/components/atoms/ValidationPanel/index.js +4 -3
  207. package/src/components/atoms/VerticalSideMenuMainPage/VerticalSideMenuMainPage.stories.js +12 -0
  208. package/src/components/atoms/VerticalSideMenuMainPage/index.js +54 -0
  209. package/src/components/atoms/VerticalSideMenuMainPage/styles.js +45 -0
  210. package/src/components/molecules/AvatarAndValidation/index.js +14 -15
  211. package/src/components/molecules/CarouselImagesLogin/CarouselImagesLogin.stories.js +17 -0
  212. package/src/components/molecules/CarouselImagesLogin/index.js +65 -0
  213. package/src/components/molecules/CarouselImagesLogin/styles.js +60 -0
  214. package/src/components/molecules/EmailResetPasswordLogin/EmailResetPasswordLogin.stories.js +11 -0
  215. package/src/components/molecules/EmailResetPasswordLogin/index.js +85 -0
  216. package/src/components/molecules/EmailResetPasswordLogin/styles.js +23 -0
  217. package/src/components/molecules/GalleryElement/index.js +26 -6
  218. package/src/components/molecules/GalleryHeader/index.js +8 -2
  219. package/src/components/molecules/LoginPasswordStrength/LoginPasswordStrength.stories.js +8 -0
  220. package/src/components/molecules/LoginPasswordStrength/index.js +84 -0
  221. package/src/components/molecules/LoginPasswordStrength/styles.js +91 -0
  222. package/src/components/molecules/LogoLoading/Loading.stories.js +10 -0
  223. package/src/components/molecules/LogoLoading/index.js +12 -0
  224. package/src/components/molecules/LogoLoading/styles.js +16 -0
  225. package/src/components/molecules/RegistrationFirstStep/RegistrationFirstStep.stories.js +11 -0
  226. package/src/components/molecules/RegistrationFirstStep/index.js +227 -0
  227. package/src/components/molecules/RegistrationFirstStep/styles.js +87 -0
  228. package/src/components/molecules/RegistrationSecondStep/RegistrationSecondStep.stories.js +11 -0
  229. package/src/components/molecules/RegistrationSecondStep/index.js +135 -0
  230. package/src/components/molecules/RegistrationSecondStep/styles.js +64 -0
  231. package/src/components/molecules/RegistrationThirdStep/RegistrationThirdStep.stories.js +11 -0
  232. package/src/components/molecules/RegistrationThirdStep/index.js +130 -0
  233. package/src/components/molecules/RegistrationThirdStep/styles.js +44 -0
  234. package/src/components/molecules/RetailerSelector/index.js +7 -1
  235. package/src/components/molecules/RetailerSelector/styles.js +3 -0
  236. package/src/components/molecules/SignInLogin/SignInLogin.stories.js +11 -0
  237. package/src/components/molecules/SignInLogin/index.js +226 -0
  238. package/src/components/molecules/SignInLogin/styles.js +120 -0
  239. package/src/components/molecules/StatusAsignationInfo/index.js +23 -30
  240. package/src/components/molecules/TableHeader/index.js +5 -1
  241. package/src/components/molecules/TableHeader/styles.js +8 -0
  242. package/src/components/molecules/TagAndInput/index.js +19 -1
  243. package/src/components/molecules/TagAndInput/styles.js +28 -0
  244. package/src/components/molecules/VerificationCodeResetPasswordLogin/VerificationCodeResetPasswordLogin.stories.js +11 -0
  245. package/src/components/molecules/VerificationCodeResetPasswordLogin/index.js +171 -0
  246. package/src/components/molecules/VerificationCodeResetPasswordLogin/styles.js +54 -0
  247. package/src/components/molecules/VerificationCodeResetPasswordLogin/utils.js +54 -0
  248. package/src/components/organisms/ChangePassword/ChangePassword.stories.js +11 -0
  249. package/src/components/organisms/ChangePassword/index.js +77 -0
  250. package/src/components/organisms/ChangePassword/styles.js +13 -0
  251. package/src/components/organisms/FullProductNameHeader/index.js +47 -16
  252. package/src/components/organisms/FullTabsMenu/index.js +9 -9
  253. package/src/components/organisms/GlobalModal/index.js +68 -0
  254. package/src/components/organisms/GlobalModal/styles.js +113 -0
  255. package/src/components/organisms/ImageDataTable/index.js +25 -8
  256. package/src/components/organisms/InputGroup/index.js +28 -8
  257. package/src/components/organisms/InputGroup/styles.js +2 -2
  258. package/src/components/organisms/ProductImageModal/index.js +8 -5
  259. package/src/components/organisms/ProductImageModal/styles.js +3 -0
  260. package/src/components/pages/ChangePasswordLogin/ChangePasswordLogin.stories.js +18 -0
  261. package/src/components/pages/ChangePasswordLogin/index.js +77 -0
  262. package/src/components/pages/ChangePasswordLogin/styles.js +20 -0
  263. package/src/components/pages/EmailResetPassword/EmailResetPassword.stories.js +17 -0
  264. package/src/components/pages/EmailResetPassword/index.js +77 -0
  265. package/src/components/pages/EmailResetPassword/styles.js +27 -0
  266. package/src/components/pages/ProviderProductEdition/ProviderProductEdition.stories.js +172 -0
  267. package/src/components/pages/ProviderProductEdition/index.js +1275 -0
  268. package/src/components/pages/ProviderProductEdition/styles.js +118 -0
  269. package/src/components/pages/RegistrationLoginFirstStep/RegistrationLoginFirstStep.stories.js +17 -0
  270. package/src/components/pages/RegistrationLoginFirstStep/index.js +160 -0
  271. package/src/components/pages/RegistrationLoginFirstStep/styles.js +85 -0
  272. package/src/components/pages/RegistrationLoginSecondStep/RegistrationLoginSecondStep.stories.js +18 -0
  273. package/src/components/pages/RegistrationLoginSecondStep/index.js +111 -0
  274. package/src/components/pages/RegistrationLoginSecondStep/styles.js +64 -0
  275. package/src/components/pages/RegistrationLoginThirdStep/RegistrationLoginThirdStep.stories.js +17 -0
  276. package/src/components/pages/RegistrationLoginThirdStep/index.js +106 -0
  277. package/src/components/pages/RegistrationLoginThirdStep/styles.js +48 -0
  278. package/src/components/pages/RetailerProductEdition/RetailerProductEdition.stories.js +31 -66
  279. package/src/components/pages/RetailerProductEdition/index.js +790 -448
  280. package/src/components/pages/RetailerProductEdition/styles.js +13 -3
  281. package/src/components/pages/VerificationCodeResetPassword/VerificationCodeResetPassword.stories.js +17 -0
  282. package/src/components/pages/VerificationCodeResetPassword/index.js +92 -0
  283. package/src/components/pages/VerificationCodeResetPassword/styles.js +54 -0
  284. package/src/components/pages/VerificationCodeResetPassword/utils.js +56 -0
  285. package/src/global-files/data.js +27 -6
  286. package/src/index.js +23 -8
  287. package/src/components/atoms/Percent/Percent.stories.js +0 -38
  288. package/src/components/atoms/Percent/index.js +0 -15
@@ -7,6 +7,7 @@ import { FullTabsMenu } from "../../organisms/FullTabsMenu";
7
7
  import { InputGroup } from "../../organisms/InputGroup";
8
8
  import { useEffect, useReducer, useState, useCallback } from "react";
9
9
  import { GalleryElement } from "../../molecules/GalleryElement";
10
+ import { saveAs } from "file-saver";
10
11
  import {
11
12
  getRetailerServices,
12
13
  getPercentage,
@@ -24,6 +25,12 @@ import imagesSent from "../../../assets/images/modalsSVGs/uploadingImages.svg";
24
25
  import { TagAndInput } from "../../molecules/TagAndInput/index";
25
26
  import { Button } from "../../atoms/GeneralButton";
26
27
  import { Commentary } from "../../atoms/Commentary";
28
+ import { GenericModal } from "../../atoms/GenericModal";
29
+ import { ScreenHeader } from "../../atoms/ScreenHeader";
30
+ import { Loading } from "../../atoms/Loading";
31
+ import succes from "../../../assets/images/genericModal/genericModalCheck.svg";
32
+ import { getNewStatus } from "../../../global-files/data";
33
+ import errorModal from "../../../assets/images/genericModal/errorModal.svg";
27
34
 
28
35
  const reducerImages = (state, action) => {
29
36
  let { values, attrForImgs } = state;
@@ -37,8 +44,17 @@ const reducerImages = (state, action) => {
37
44
  values[action.index][action.attribute] = action.value;
38
45
  return { ...state, values };
39
46
  case "changeAttrValue":
40
- attrForImgs[action.retailer][action.index].value = action.value;
47
+ action.retailersId.forEach((ret) => {
48
+ attrForImgs[ret][action.index].name === action.name &&
49
+ (attrForImgs[ret][action.index].value = action.value);
50
+ });
51
+
41
52
  return { ...state, attrForImgs, values };
53
+ case "deleteImage":
54
+ values = values.filter(
55
+ (value) => action.selectedImages.indexOf(value) === -1
56
+ );
57
+ return { ...state, values };
42
58
  default:
43
59
  return state;
44
60
  }
@@ -58,22 +74,20 @@ const myBucket = new AWS.S3({
58
74
  });
59
75
 
60
76
  export const RetailerProductEdition = ({
61
- productData,
62
77
  tabsSections,
63
- articleId,
64
78
  productSelected = {},
65
79
  user = {},
80
+ location = {},
66
81
  token,
67
82
  }) => {
68
83
  const [activeTab, setActiveTab] = useState("Descripción");
69
84
  const [activeImage, setActiveImage] = useState();
70
- const [imageLayout, setImageLayout] = useState(true);
85
+ const [imageLayout, setImageLayout] = useState(false);
71
86
  const [headerTop, setHeaderTop] = useState(0);
72
87
  const [descriptions, setDescriptions] = useState([]);
73
88
  const [datasheets, setDatasheets] = useState([]);
74
89
  const [images, setImages] = useReducer(reducerImages, {});
75
90
  const [showModal, setShowModal] = useState(false);
76
- const [retailerSelected, setRetailerSelected] = useState(54); // revisar después como trabajar esto de mejor forma
77
91
  const { getRootProps, getInputProps } = useDropzone({
78
92
  accept: "image/*",
79
93
  noKeyboard: true,
@@ -84,23 +98,25 @@ export const RetailerProductEdition = ({
84
98
  acceptedFiles.map((file) => {
85
99
  const reader = new FileReader();
86
100
  reader.fileName = file.name;
87
- reader.onload = async function (e) {
101
+ reader.onload = function (e) {
88
102
  const ext = e.srcElement.fileName.split(".");
89
103
  const img = new Image();
90
104
  img.src = e.target.result;
91
- const width = img.width;
92
- const height = img.height;
93
- const newImg = {
94
- action: "addImg",
95
- img: {
96
- src: e.target.result,
97
- name: e.target.fileName,
98
- ext: ext[ext.length - 1],
99
- width: width,
100
- height: width,
101
- },
102
- };
103
- setImages(newImg);
105
+ setTimeout(() => {
106
+ const width = img.width;
107
+ const height = img.height;
108
+ const newImg = {
109
+ action: "addImg",
110
+ img: {
111
+ src: e.target.result,
112
+ name: e.target.fileName,
113
+ ext: ext[ext.length - 1],
114
+ width: width,
115
+ height: height,
116
+ },
117
+ };
118
+ setImages(newImg);
119
+ }, 500);
104
120
  };
105
121
  reader.onerror = function (error) {
106
122
  console.log("dropzoneError: ", error);
@@ -115,61 +131,83 @@ export const RetailerProductEdition = ({
115
131
  const [imagesUploaded, setImagesUploaded] = useState(false);
116
132
  const [dataImages, setDataImages] = useState();
117
133
  const [percentages, setPercentages] = useState(
118
- new Array(productSelected.retailers.length).fill({ percentage: 0 })
134
+ new Array(product?.retailers?.length).fill({ percentage: 0 })
119
135
  );
120
136
  const [activePercentage, setActivePercentage] = useState(0);
121
137
  const [activeRetailer, setActiveRetailer] = useState({});
122
138
  const [services, setServices] = useState([]);
123
139
  const [servicesData, setServicesData] = useState([]);
124
140
  const [message, setMessage] = useState("");
125
- const [product, setProduct] = useState({});
141
+ const [product, setProduct] = useState(
142
+ JSON.parse(sessionStorage.getItem("productSelected"))
143
+ ? JSON.parse(sessionStorage.getItem("productSelected"))
144
+ : productSelected
145
+ );
126
146
  const [icon, setIcon] = useState(null);
127
- const [version, setVersion] = useState(productSelected?.version);
147
+ const [version, setVersion] = useState(product?.version);
128
148
  const [comments, setComments] = useState({});
129
149
  const [comment, setComment] = useState("");
130
- const [requiredNull, setRequiredNull] = useState(0);
150
+ const [requiredNull, setRequiredNull] = useState({
151
+ "Ficha técnica": 0,
152
+ Descripción: 0,
153
+ Imágenes: 0,
154
+ });
131
155
  const [crossComment, setCrossComment] = useState(false);
132
156
  const [userGroups, setUserGroups] = useState([]);
133
157
  const [assig, setAssig] = useState({});
158
+ const [selectedImages, setSelectedImages] = useState([]);
159
+ const [componentsArray, setComponentsArray] = useState([]);
160
+ const [checkAll, setCheckAll] = useState(false);
134
161
  const isRetailer = user?.is_retailer;
162
+ const [loading, setLoading] = useState(true);
163
+ const [retailerStatus, setRetailerStatus] = useState("-");
164
+ const [statusArray, setStatusArray] = useState([]);
165
+ const [socketType, setSocketType] = useState(null);
166
+ const [servicesStatus, setServicesStatus] = useState([]);
167
+ const [saving, setSaving] = useState(loading);
168
+
169
+ useEffect(() => {
170
+ checkAll && setSelectedImages(images.values);
171
+ }, [checkAll]);
135
172
 
136
173
  const loadData = async () => {
137
- const services = await getRetailerServices(
138
- productSelected.article.id_article,
139
- parseInt(productSelected.article.id_category),
140
- productSelected.version
141
- );
174
+ try {
175
+ const services = await getRetailerServices(
176
+ product?.article?.id_article,
177
+ parseInt(product?.article?.id_category),
178
+ product?.version
179
+ );
180
+ //Converts the data inside the datasheets object to array
181
+ setServices(services);
182
+ getServices();
142
183
 
143
- //Converts the data inside the datasheets object to array
144
- setServices(services);
145
- setActiveRetailer(productSelected?.retailers[0]);
146
- setImages({
147
- action: "init",
148
- init: services[2],
149
- });
150
- if (services[2]?.values?.length > 0) setActiveImage(0);
151
- setProduct(productSelected);
152
- };
184
+ //setActiveRetailer(product?.retailers[0]);
185
+ setImages({
186
+ action: "init",
187
+ init: services[2],
188
+ });
189
+ if (services[2]?.values?.length > 0) setActiveImage(0);
153
190
 
154
- const getServices = async (tab) => {
155
- let serviceActive = "";
156
- switch (tab) {
157
- case "Ficha técnica":
158
- serviceActive = "datasheet";
159
- break;
160
- case "Imágenes":
161
- serviceActive = "images";
162
- break;
163
- default:
164
- serviceActive = "description";
165
- break;
191
+ getPercentage({ data: [product] }).then((res) => setPercentages(res));
192
+ setLoading(false);
193
+ } catch (error) {
194
+ console.log(error);
166
195
  }
167
- const selected = productSelected;
196
+ };
197
+
198
+ const getServices = async () => {
168
199
  const servicesResponse = await axios.get(
169
- `${process.env.REACT_APP_SERVICES_ENDPOINT}?articleId=${selected.article.id_article}&orderId=${selected.article.id_order}&end=true`
200
+ `${process.env.REACT_APP_SERVICES_ENDPOINT}?articleId=${
201
+ product?.article?.id_article
202
+ }&orderId=${product?.article?.id_order || product.orderId}&end=true`
170
203
  );
171
- const parsedResponse = JSON.parse(servicesResponse.data.body).data;
204
+ const parsedResponse = JSON.parse(servicesResponse?.data?.body).data;
172
205
 
206
+ let retailers = product.retailers || product.retailersAvailable;
207
+ let active = retailers?.filter((retailer) =>
208
+ parsedResponse?.map((srv) => srv.id_retailer).includes(retailer.id)
209
+ )[0];
210
+ !activeRetailer.id && setActiveRetailer(active ? active : retailers[0]);
173
211
  setServicesData(parsedResponse);
174
212
  };
175
213
 
@@ -188,23 +226,23 @@ export const RetailerProductEdition = ({
188
226
  const getComments = async (tab = "Descripción") => {
189
227
  const commentsResponse = await Promise.all([
190
228
  axios.get(
191
- `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${productSelected?.article?.id_article}&concept=description&orderIdColab=${productSelected?.orderId}&version=${version}`
229
+ `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${product?.article?.id_article}&concept=description&orderIdColab=${product?.orderId}&version=${version}`
192
230
  ),
193
231
  axios.get(
194
- `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${productSelected?.article?.id_article}&concept=datasheet&orderIdColab=${productSelected?.orderId}&version=${version}`
232
+ `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${product?.article?.id_article}&concept=datasheet&orderIdColab=${product?.orderId}&version=${version}`
195
233
  ),
196
234
  axios.get(
197
- `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${productSelected?.article?.id_article}&concept=images&orderIdColab=${productSelected?.orderId}&version=${version}`
235
+ `${process.env.REACT_APP_COMMENTS_ENDPOINT}?articleId=${product?.article?.id_article}&concept=images&orderIdColab=${product?.orderId}&version=${version}`
198
236
  ),
199
237
  ]);
200
238
 
201
239
  let comments = {};
202
240
  commentsResponse.forEach(
203
241
  (comment) =>
204
- JSON.parse(comment.data.body).data[0] &&
242
+ JSON.parse(comment?.data?.body).data[0] &&
205
243
  (comments[
206
- translateConcept(JSON.parse(comment.data.body).data[0]?.concept)
207
- ] = JSON.parse(comment.data.body).data[0])
244
+ translateConcept(JSON.parse(comment?.data?.body)?.data[0]?.concept)
245
+ ] = JSON.parse(comment?.data?.body).data[0])
208
246
  );
209
247
  setComment(comments[tab]);
210
248
  setComments(comments);
@@ -212,13 +250,27 @@ export const RetailerProductEdition = ({
212
250
 
213
251
  useEffect(async () => {
214
252
  loadData();
215
- getPercentage({ data: [productSelected] }).then((res) =>
216
- setPercentages(res)
217
- );
218
- getServices();
219
253
  getComments();
220
254
  setUserGroups(await fetchUsers(token));
221
- }, []);
255
+ let arr = [];
256
+ switch (user.id_role) {
257
+ case 7:
258
+ case 8:
259
+ arr = ["IN_PROGRESS", "RF", "RA"];
260
+ break;
261
+ case 4:
262
+ case 5:
263
+ arr = ["RF", "AF", "AA", "AP", "AC"];
264
+ break;
265
+ case 6:
266
+ arr = ["RP", "RC", "AF", "RA"];
267
+ break;
268
+ default:
269
+ arr = [];
270
+ break;
271
+ }
272
+ setStatusArray(arr);
273
+ }, [product]);
222
274
 
223
275
  const loadAssignations = (currentProduct) => {
224
276
  setAssig({
@@ -274,64 +326,74 @@ export const RetailerProductEdition = ({
274
326
  };
275
327
 
276
328
  useEffect(() => {
277
- loadAssignations(productSelected);
329
+ loadAssignations(product);
278
330
  }, [userGroups]);
279
331
 
280
332
  useEffect(() => {
281
- productSelected.retailers.forEach((retailer) => {
282
- retailer["percentage"] = percentages.filter(
283
- (percent) => retailer.id === percent.id_retailer
333
+ product?.retailers?.forEach((retailer) => {
334
+ retailer["percentage"] = percentages?.filter(
335
+ (percent) => retailer?.id === percent?.id_retailer
284
336
  )[0]?.percentage;
285
337
  });
286
- setActivePercentage(productSelected?.retailers[0]?.percentage);
338
+ setActivePercentage(product?.retailers[0]?.percentage);
287
339
  }, [percentages]);
288
340
 
289
341
  useEffect(() => {
290
342
  if (services.length > 0) {
291
- services[0][activeRetailer?.id].data = Object.values(
292
- services[0][activeRetailer?.id].data
293
- );
294
- setActivePercentage(Math.round(activeRetailer.percentage, 0));
295
- setDatasheets([services[0][activeRetailer.id], services[0].inputs]);
296
- setDescriptions(
297
- services[1].filter((service) => service.id === activeRetailer.id)
343
+ if (services[0][activeRetailer.id]?.data)
344
+ services[0][activeRetailer.id].data = Object.values(
345
+ services[0][activeRetailer.id].data
346
+ );
347
+ setActivePercentage(Math.round(activeRetailer?.percentage, 0));
348
+
349
+ const datagroups = services[0][activeRetailer?.id];
350
+ const inputs = services[0]?.inputs;
351
+ const descriptions = services[1]?.filter(
352
+ (service) => service?.id === activeRetailer?.id
298
353
  );
354
+ setDatasheets([datagroups, inputs]);
355
+ setDescriptions(descriptions);
299
356
  }
300
- }, [activeRetailer]);
357
+ }, [activeRetailer, services]);
301
358
 
302
359
  const thumbs = () => {
303
- const imageInputs = images.inputs.map((e) => ({
304
- value: e.id,
305
- name: e.name,
306
- }));
307
- const imageType = images.imageType.map((e) => ({
308
- value: e.id,
309
- name: e.name,
360
+ const imageInputs = socketType?.slice();
361
+ const imageType = images?.imageType?.map((e) => ({
362
+ value: e?.id,
363
+ name: e?.name,
310
364
  }));
311
- const imagePackagingType = images.imagePackagingType.map((e) => ({
312
- value: e.id,
313
- name: e.name,
365
+ const imagePackagingType = images?.imagePackagingType?.map((e) => ({
366
+ value: e?.id,
367
+ name: e?.name,
314
368
  }));
315
369
  return images?.values?.map((image, index) => (
316
370
  <GalleryElement
371
+ setCheckAll={setCheckAll}
317
372
  key={index}
318
373
  image={image}
319
374
  gridLayout={imageLayout}
320
375
  id={"gallery-element-" + index}
321
- index={index}
376
+ index={index + "-" + image.name}
377
+ number={index}
322
378
  imageType={imageType}
323
379
  imagePackagingType={imagePackagingType}
324
380
  imageInputs={imageInputs}
381
+ setSocketType={setSocketType}
325
382
  changeImage={setImages}
383
+ selectedImages={selectedImages}
384
+ setSelectedImages={setSelectedImages}
326
385
  />
327
386
  ));
328
387
  };
329
388
 
330
389
  const saveDescriptions = async () => {
390
+ setLoading(true);
391
+ const productTemp = product;
331
392
  const dataObject = {
332
- articleId: productSelected?.article?.id_article,
393
+ articleId: product?.article?.id_article,
333
394
  articleData: updatedDescriptions,
334
395
  };
396
+ if (product?.orderId) dataObject["orderId"] = product?.orderId;
335
397
  try {
336
398
  await axios.put(
337
399
  `${process.env.REACT_APP_ARTICLE_DATA_ENDPOINT}?description=true&version=${version}`,
@@ -342,16 +404,28 @@ export const RetailerProductEdition = ({
342
404
  },
343
405
  }
344
406
  );
407
+ if (productTemp.status === "ASSIGNED") {
408
+ productTemp.status = "IN_PROGRESS";
409
+ setProduct(productTemp);
410
+ sessionStorage.setItem("productSelected", JSON.stringify(productTemp));
411
+ }
412
+
413
+ setMessage("Descripciones guardadas con éxito");
414
+ loadData();
345
415
  } catch (error) {
346
416
  console.log(error);
347
417
  }
348
418
  };
349
419
 
350
420
  const saveDatasheets = async () => {
421
+ setLoading(true);
422
+ const productTemp = product;
351
423
  const dataObject = {
352
- articleId: productSelected?.article?.id_article,
424
+ articleId: product?.article?.id_article,
353
425
  articleData: updatedDatasheets,
354
426
  };
427
+ console.log(updatedDatasheets, "updatedDatasheets");
428
+ if (product?.orderId) dataObject["orderId"] = product?.orderId;
355
429
  try {
356
430
  await axios.put(
357
431
  `${process.env.REACT_APP_ARTICLE_DATA_ENDPOINT}?datasheet=true&version=${version}`,
@@ -362,61 +436,79 @@ export const RetailerProductEdition = ({
362
436
  },
363
437
  }
364
438
  );
365
- console.log("saved");
439
+ setMessage("Fichas técnicas guardadas");
440
+ if (productTemp.status === "ASSIGNED") {
441
+ productTemp.status = "IN_PROGRESS";
442
+ setProduct(productTemp);
443
+ sessionStorage.setItem("productSelected", JSON.stringify(productTemp));
444
+ }
445
+ loadData();
366
446
  } catch (error) {
367
447
  console.log(error);
368
448
  }
369
449
  };
370
450
 
451
+ useEffect(() => {
452
+ const imageInputs = images?.inputs?.map((e) => ({
453
+ value: e?.id,
454
+ name: e?.name,
455
+ required: e?.required,
456
+ active: images?.values.some((value) => value?.image_id === e?.id),
457
+ }));
458
+ setSocketType(imageInputs);
459
+ }, [images]);
460
+
371
461
  const updateImages = useCallback(async () => {
372
462
  const imagesList = images?.values?.slice();
373
- const imagesListTemp = imagesList.reduce((acc, image) => {
374
- acc[image.image_id] = ++acc[image.image_id] || 0;
463
+ const imagesListTemp = imagesList?.reduce((acc, image) => {
464
+ acc[image?.image_id] = ++acc[image?.image_id] || 0;
375
465
  return acc;
376
466
  }, {});
377
467
 
378
- const duplicated = imagesList.filter((image) => {
379
- return imagesListTemp[image.image_id];
468
+ const duplicated = imagesList?.filter((image) => {
469
+ return imagesListTemp[image?.image_id];
380
470
  });
381
471
 
382
472
  const attrForImgs = Object.values(images?.attrForImgs);
383
473
  attrForImgs.pop();
384
474
  const data = {
385
- articleId,
386
- attrReqImgs: attrForImgs.map((e) => ({
387
- attrId: e[0].id,
388
- value: e[0].value,
475
+ articleId: product?.article?.id_article,
476
+ attrReqImgs: attrForImgs?.map((e) => ({
477
+ attrId: e[0]?.id,
478
+ value: e[0]?.value,
389
479
  })),
390
- articleData: imagesList.filter((e) => !e.id),
391
- updateImages: imagesList.filter((e) => e.id),
480
+ articleData: imagesList?.filter((e) => !e.id),
481
+ updateImages: imagesList?.filter((e) => e.id),
392
482
  };
483
+ if (product?.orderId) data["orderId"] = product?.orderId;
393
484
  let valid =
394
- data.articleData.length === 0
485
+ data?.articleData?.length === 0
395
486
  ? true
396
- : data.articleData.every((e, i) => {
397
- if (e.image_id && e.packing_type && e.image_type) {
487
+ : data?.articleData?.every((e, i) => {
488
+ if (e?.image_id && e?.packing_type && e?.image_type) {
398
489
  return true;
399
490
  }
400
491
  return false;
401
492
  });
402
- if (valid && data.updateImages.length > 0 && duplicated.length === 0) {
403
- valid = data.updateImages.every((e, i) => {
404
- if (e.image_id && e.packing_type && e.image_type) {
493
+ if (valid && data?.updateImages?.length > 0 && duplicated?.length === 0) {
494
+ valid = data?.updateImages?.every((e, i) => {
495
+ if (e?.image_id && e?.packing_type && e?.image_type) {
405
496
  return true;
406
497
  }
407
498
  return false;
408
499
  });
409
500
  }
410
- if (valid && duplicated.length === 0) {
501
+ if (valid && duplicated?.length === 0) {
502
+ setLoading(true);
411
503
  try {
412
- data.articleData.forEach((e) => {
504
+ data?.articleData?.forEach((e) => {
413
505
  e.uuid = uuidv4();
414
506
  });
415
507
  setDataImages(data);
416
- if (data.articleData.length > 0) {
508
+ if (data?.articleData?.length > 0) {
417
509
  setImagesUploaded(false);
418
510
  const promiseArray = [];
419
- data.articleData.forEach((e) => {
511
+ data?.articleData?.forEach((e) => {
420
512
  const file = Buffer.from(
421
513
  e.src.replace(/^data:image\/\w+;base64,/, ""),
422
514
  "base64"
@@ -425,7 +517,7 @@ export const RetailerProductEdition = ({
425
517
  ACL: "public-read",
426
518
  Body: file,
427
519
  Bucket: S3_BUCKET,
428
- Key: `id-${data.articleId}/${version}/${e.image_id}-${e.uuid}.${e.ext}`,
520
+ Key: `id-${data.articleId}/${version}/${e?.image_id}-${e?.uuid}.${e?.ext}`,
429
521
  };
430
522
  promiseArray.push(myBucket.putObject(params).promise());
431
523
  });
@@ -434,35 +526,36 @@ export const RetailerProductEdition = ({
434
526
  } else {
435
527
  setImagesUploaded(true);
436
528
  }
529
+ let productTemp = product;
530
+ if (productTemp.status === "ASSIGNED") {
531
+ productTemp.status = "IN_PROGRESS";
532
+ setProduct(productTemp);
533
+ sessionStorage.setItem(
534
+ "productSelected",
535
+ JSON.stringify(productTemp)
536
+ );
537
+ }
437
538
  } catch (err) {
438
539
  console.log(err);
439
540
  // setMainLoading(false);
440
541
  }
441
542
  } else {
442
543
  // setMainLoading(false);
443
- console.log(
444
- "Completa los campos que solicita cada una de la imágenes o hay imágenes con el mismo tipo de toma.",
445
- "Recuerda hay campos obligatorios y no podras avanzar si no estan completos."
544
+ setMessage(
545
+ "Completa los campos que solicita cada una de la imágenes o hay imágenes con el mismo tipo de toma.\nRecuerda hay campos obligatorios y no podras avanzar si no estan completos."
446
546
  );
447
- // setAlertList((prev) => [
448
- // ...prev,
449
- // {
450
- // titleMsg: "Completa los campos que solicita cada una de la imágenes",
451
- // alertMsg:
452
- // "Recuerda hay campos obligatorios y no podras avanzar si no estan completos.",
453
- // },
454
- // ]);
455
547
  }
456
548
  // eslint-disable-next-line react-hooks/exhaustive-deps
457
549
  }, [images, imagesUploaded]);
458
550
 
459
551
  useEffect(async () => {
460
552
  if (imagesUploaded) {
461
- dataImages.articleData = dataImages.articleData.map((e) => {
553
+ dataImages.articleData = dataImages?.articleData.map((e) => {
462
554
  delete e.src;
463
555
  e.imageID = e.image_id;
464
556
  e.packingType = e.packing_type;
465
557
  e.imageType = e.image_type;
558
+ if (product?.orderId) e["orderId"] = product?.orderId;
466
559
  return e;
467
560
  });
468
561
  try {
@@ -475,35 +568,83 @@ export const RetailerProductEdition = ({
475
568
  },
476
569
  }
477
570
  );
478
- console.log("imágenes guardadas con éxito");
571
+ setMessage("Imágenes guardadas con éxito");
572
+ sessionStorage.removeItem("imagesList");
573
+ loadData();
479
574
  } catch (error) {
480
575
  console.log(error);
481
576
  }
482
577
  }
483
578
  }, [dataImages, imagesUploaded]);
484
579
 
485
- const approveRejectButtons = (action) => {
486
- let concept = "";
487
- switch (activeTab) {
488
- case "Descripción":
489
- concept = "description";
580
+ const evaluationFinished = (userId, tab, statusArray) => {
581
+ const srv = servicesData.filter((serv) => serv.service === getConcept(tab));
582
+ const [srvActive] = srv.filter(
583
+ (serv) => serv.id_retailer === activeRetailer?.id
584
+ );
585
+ const unvalidated =
586
+ product[`${getConcept(tab)}_status`] === "QF" ||
587
+ product[`${getConcept(tab)}_status`] === "IN_PROGRESS";
588
+
589
+ const auditorUnvalidated = !["RA", "AA", "AC", "AP"].includes(
590
+ product[`${getConcept(tab)}_status`]
591
+ );
592
+
593
+ switch (userId) {
594
+ case 7:
595
+ case 8:
596
+ return (
597
+ (["RA", "RF"].includes(product?.status) && //"IN_PROGRESS", "RF", "RA"
598
+ statusArray.includes(srvActive?.status)) ||
599
+ (statusArray.includes(product.status) &&
600
+ srv.filter((serv) => statusArray.includes(serv.status)).length ===
601
+ srv.length)
602
+ );
603
+ case 4:
604
+ case 5:
605
+ return (
606
+ unvalidated &&
607
+ ["IN_PROGRESS", "QF"].includes(product.status) && //"RF", "AF", "AA", "AP", "AC
608
+ srv.filter((serv) => statusArray.includes(serv.status)).length ===
609
+ srv.length
610
+ );
611
+ case 6:
612
+ return (
613
+ statusArray.includes(product.status) && //RP, RC, AF, RA true
614
+ srv.every((serv) => ["RA", "AA", "AP", "AC"].includes(serv.status)) &&
615
+ auditorUnvalidated
616
+ );
617
+ default:
490
618
  break;
619
+ }
620
+ };
621
+
622
+ const getConcept = (tab) => {
623
+ switch (tab) {
624
+ case "Descripción":
625
+ return "description";
491
626
  case "Ficha técnica":
492
- concept = "datasheet";
493
- break;
627
+ return "datasheet";
494
628
  case "Imágenes":
495
- concept = "images";
496
- break;
497
- default:
498
- break;
629
+ return "images";
499
630
  }
500
- concept = action ? action : concept;
631
+ };
632
+
633
+ const approveRejectButtons = (action) => {
634
+ let concept = getConcept(action || activeTab);
635
+
636
+ const [retailerStatus] = servicesData.filter(
637
+ (srv) => srv.id_retailer === activeRetailer?.id && srv.service === concept
638
+ );
639
+
501
640
  return (
502
- (productSelected[`${concept}_status`] === "QF" &&
641
+ (retailerStatus?.status === "QF" &&
503
642
  (user.id_role === 1 || user.id_role === 4 || user.id_role === 5)) ||
504
- (productSelected[`${concept}_status`] === "AF" &&
643
+ (retailerStatus?.status === "AF" && //sessionStorage product
644
+ (user.id_role === 1 || user.id_role === 6)) ||
645
+ (retailerStatus?.status === "RP" &&
505
646
  (user.id_role === 1 || user.id_role === 6)) ||
506
- (productSelected[`${concept}_status`] === "RP" &&
647
+ (retailerStatus?.status === "RC" &&
507
648
  (user.id_role === 1 || user.id_role === 6))
508
649
  );
509
650
  };
@@ -524,215 +665,132 @@ export const RetailerProductEdition = ({
524
665
  }
525
666
  };
526
667
 
527
- const updateCompaniesList = (status, result, retailerId, concept) => {
528
- let serv = servicesData.slice();
529
- let item = serv.find(
530
- (item) => item.id_retailer === retailerId && item.service === concept
531
- );
532
- let index = serv.indexOf(item);
533
- if (
534
- status === "IN_PROGRESS" ||
535
- status === "QF" ||
536
- status === "RF" ||
537
- status === "RA"
538
- ) {
539
- if (result === "A") {
540
- if (activeTab === "Imágenes") {
541
- serv.map((item) => {
542
- item.status = "AF";
543
- });
544
- } else {
545
- serv[index].status = "AF";
546
- }
547
- } else if (result === "R") {
548
- if (activeTab === "Imágenes") {
549
- serv.map((item) => {
550
- item.status = "RF";
551
- });
552
- } else {
553
- serv[index].status = "RF";
554
- }
668
+ const sendToFacilitator = async (result) => {
669
+ setLoading(true);
670
+ try {
671
+ let concept = getConcept(activeTab);
672
+
673
+ let productTemp = { ...product };
674
+ let evalStatus = product[`${concept}_status`];
675
+
676
+ let data = {};
677
+ if (result) {
678
+ data = {
679
+ articleId: product.article.id_article,
680
+ orderId: product.orderId,
681
+ concept: concept,
682
+ result: result,
683
+ evalStatus: evalStatus,
684
+ retailerId: activeRetailer.id,
685
+ };
686
+
687
+ await axios.put(`${process.env.REACT_APP_EVALUATION_ENDPOINT}`, data, {
688
+ headers: {
689
+ Authorization: token,
690
+ },
691
+ });
692
+ getServices();
555
693
  } else {
556
- if (status === "IN_PROGRESS" || status === "ASSIGNED") {
557
- serv.map((item) => {
558
- item.status = "QF";
559
- });
560
- } else {
561
- serv.map((item) => {
562
- if (item.status === "RF" || item.status === "RA") {
563
- item.status = "QF";
564
- }
565
- return item;
566
- });
567
- }
568
- }
569
- } else if (status === "AF" || status === "RP") {
570
- if (result === "A") {
571
- if (activeTab === "Imágenes") {
572
- serv.map((item) => {
573
- item.status = "AA";
574
- });
575
- } else {
576
- serv[index].status = "AA";
694
+ const specialistDone =
695
+ evalStatus === "RF" ||
696
+ evalStatus === "RA" ||
697
+ evalStatus === "IN_PROGRESS";
698
+
699
+ if (specialistDone) {
700
+ setMessage(`${activeTab} enviada a facilitador`);
701
+ getSectionIcon();
702
+ } else if (evalStatus === "QF") {
703
+ setMessage("Evaluación enviada");
704
+ getSectionIcon();
705
+ } else if (evalStatus === "AF") {
706
+ setMessage("Evaluación enviada");
707
+ getSectionIcon();
708
+ } else if (evalStatus === "RP") {
709
+ setMessage("Evaluación enviada");
710
+ getSectionIcon();
711
+ } else if (evalStatus === "RC") {
712
+ setMessage("Evaluación enviada");
713
+ getSectionIcon();
577
714
  }
578
- } else {
579
- if (activeTab === "Imágenes") {
580
- serv.map((item) => {
581
- item.status = "RA";
582
- });
583
- } else {
584
- serv[index].status = "RA";
715
+ let statusArr = [];
716
+ servicesData.forEach((srv) => {
717
+ srv.service === concept && statusArr.push(srv.status);
718
+ });
719
+
720
+ productTemp[`${concept}_status`] = getNewStatus(statusArr);
721
+
722
+ let newStatus = getNewStatus([
723
+ productTemp.datasheet_status,
724
+ productTemp.description_status,
725
+ productTemp.images_status,
726
+ ]);
727
+
728
+ productTemp.status = newStatus;
729
+
730
+ data = {
731
+ articleId: product.article.id_article,
732
+ orderId: product.orderId,
733
+ concept: concept,
734
+ evalStatus: evalStatus,
735
+ retailerId: activeRetailer.id,
736
+ };
737
+
738
+ switch (user.id_role) {
739
+ case 7:
740
+ case 8:
741
+ data.especialist = true;
742
+ break;
743
+ case 4:
744
+ case 5:
745
+ data.facilitator = true;
746
+ break;
747
+ default:
748
+ break;
585
749
  }
750
+ await axios.put(`${process.env.REACT_APP_SEND_EVAL}`, data, {
751
+ headers: {
752
+ Authorization: token,
753
+ },
754
+ });
586
755
  }
756
+ loadData();
757
+ sessionStorage.setItem("productSelected", JSON.stringify(productTemp));
758
+ setProduct(productTemp);
759
+ } catch (error) {
760
+ console.log(error);
587
761
  }
588
- setServicesData(serv);
762
+ setLoading(false);
589
763
  };
590
764
 
591
- const sendToFacilitator = async (result) => {
592
- let concept = "";
593
- switch (activeTab) {
594
- case "Descripción":
595
- concept = "description";
596
- break;
597
- case "Ficha técnica":
598
- concept = "datasheet";
599
- break;
600
- case "Imágenes":
601
- concept = "images";
602
- break;
603
- default:
604
- break;
605
- }
606
- let evalStatus = "";
607
- let productTemp = { ...productSelected };
608
- evalStatus = productSelected[`${concept}_status`];
609
- const specialistDone =
610
- evalStatus === "RF" ||
611
- evalStatus === "RA" ||
612
- evalStatus === "IN_PROGRESS";
613
-
614
- if (specialistDone) {
615
- setMessage(`${activeTab} enviada a facilitador`);
616
- getSectionIcon();
617
- productTemp[`${concept}_status`] = "QF";
618
- } else if (evalStatus === "QF") {
619
- setMessage("Evaluación enviada");
620
- getSectionIcon();
621
- productTemp[`${concept}_status`] = "AF";
622
- } else if (evalStatus === "AF") {
623
- setMessage("Evaluación enviada");
624
- getSectionIcon();
625
- productTemp[`${concept}_status`] = "AA";
626
- } else if (evalStatus === "RP") {
627
- setMessage("Evaluación enviada");
628
- getSectionIcon();
629
- productTemp[`${concept}_status`] = "AA";
630
- }
631
- let data = {};
632
- if (result) {
633
- updateCompaniesList(evalStatus, result, activeRetailer.id, concept);
634
- data = {
635
- articleId: productSelected.article.id_article,
636
- orderId: productSelected.orderId,
637
- concept: concept,
638
- result: result,
639
- evalStatus: evalStatus,
640
- retailerId: activeRetailer.id,
641
- };
642
- await axios.put(`${process.env.REACT_APP_EVALUATION_ENDPOINT}`, data, {
643
- headers: {
644
- Authorization: token,
645
- },
646
- });
647
- } else {
648
- if (specialistDone) {
649
- updateCompaniesList(evalStatus, result, activeRetailer.id);
650
- }
651
- data = {
652
- articleId: productSelected.article.id_article,
653
- orderId: productSelected.orderId,
654
- concept: concept,
655
- evalStatus: evalStatus,
656
- retailerId: activeRetailer.id,
657
- };
765
+ const userAssigned = (tab, rol) => {
766
+ let concept = getConcept(activeTab);
767
+
768
+ const allowedRoles = [1, 4, 5, 6, 7, 8];
769
+ const validUser = allowedRoles.includes(user?.id_role);
658
770
 
771
+ if (!rol) {
659
772
  switch (user.id_role) {
660
- case 7:
661
- case 8:
662
- data.especialist = true;
663
- break;
664
773
  case 4:
665
774
  case 5:
666
- data.facilitator = true;
775
+ rol = "facilitator";
667
776
  break;
668
- default:
777
+ case 7:
778
+ case 8:
779
+ rol = "especialist";
669
780
  break;
670
781
  }
671
-
672
- axios.put(`${process.env.REACT_APP_SEND_EVAL}`, data, {
673
- headers: {
674
- Authorization: token,
675
- },
676
- });
677
- setProduct(productTemp);
678
- setModalSent(true);
679
782
  }
680
- };
681
-
682
- const userAssigned = (tab, rol) => {
683
- let concept = "";
684
- switch (tab) {
685
- case "Ficha técnica":
686
- concept = "datasheet";
687
- break;
688
- case "Imágenes":
689
- concept = "images";
690
- break;
691
-
692
- default:
693
- concept = "description";
694
- break;
695
- }
696
-
697
- const allowedRoles = [1, 4, 5, 6, 7, 8];
698
-
699
- const validUser = allowedRoles.indexOf(user?.id_role) !== -1;
700
783
 
701
784
  return (
702
- productSelected.article[`id_${concept}_${rol}`] === user.id_user &&
703
- validUser
785
+ user.id_role === 1 ||
786
+ (product.article[`id_${concept}_${rol}`] === user.id_user && validUser)
704
787
  );
705
788
  };
706
789
 
707
790
  const auditorAssigned = () => {
708
- return productSelected?.article[`id_auditor`] === user.id_user;
791
+ return product?.article[`id_auditor`] === user.id_user;
709
792
  };
710
793
 
711
- function specialistValid(tab) {
712
- let concept = "";
713
- switch (tab) {
714
- case "Ficha técnica":
715
- concept = "datasheet";
716
- break;
717
- case "Imágenes":
718
- concept = "images";
719
- break;
720
-
721
- default:
722
- concept = "description";
723
- break;
724
- }
725
- return (
726
- product[`${concept}_status`] === "IN_PROGRESS" ||
727
- product[`${concept}_status`] === "RF" ||
728
- product[`${concept}_status`] === "RA"
729
- );
730
- }
731
-
732
- function versionMatch() {
733
- return productSelected?.version === version;
734
- }
735
-
736
794
  const createComment = async (e, body, tab) => {
737
795
  let concept = "";
738
796
  switch (activeTab) {
@@ -754,16 +812,95 @@ export const RetailerProductEdition = ({
754
812
  concept: concept,
755
813
  version: version,
756
814
  };
757
- e.preventDefault();
758
815
  await axios.post(`${process.env.REACT_APP_COMMENTS_ENDPOINT}`, data, {
759
816
  headers: {
760
817
  Authorization: token,
761
818
  },
762
819
  });
763
820
  await getComments(tab);
821
+ setMessage("");
822
+ setComponentsArray([]);
764
823
  };
765
824
 
766
- useEffect(async () => {
825
+ const getRequired = (services) => {
826
+ try {
827
+ const objetcTemp = {};
828
+ const datasheetServicesArray = Object.values(services[0]);
829
+ const dsInputs = datasheetServicesArray.pop();
830
+ const descriptionsServicesArray = services[1];
831
+
832
+ let dsInputsRequired = [];
833
+ let desInputsRequired = 0;
834
+ datasheetServicesArray?.forEach((datasheet) => {
835
+ const [requested] = servicesData?.filter(
836
+ (srv) =>
837
+ srv.id_retailer === datasheet.retailer.id &&
838
+ srv.service === getConcept(activeTab)
839
+ );
840
+ requested &&
841
+ datasheet?.data &&
842
+ Object.values(datasheet?.data).forEach((dataGroup) =>
843
+ dsInputsRequired.push(
844
+ ...dataGroup.inputs.filter(
845
+ (input) =>
846
+ dsInputs[input].required &&
847
+ (dsInputs[input].value === undefined ||
848
+ !dsInputs[input].value)
849
+ )
850
+ )
851
+ );
852
+ });
853
+
854
+ objetcTemp["Ficha técnica"] = dsInputsRequired.length;
855
+
856
+ descriptionsServicesArray.forEach((description) => {
857
+ const [requested] = servicesData.filter(
858
+ (srv) =>
859
+ srv.id_retailer === description.id &&
860
+ srv.service === getConcept(activeTab)
861
+ );
862
+ requested &&
863
+ description.inputs.forEach(
864
+ (input) =>
865
+ input.required &&
866
+ (!input.value ||
867
+ input.value.replace(/(<\/?p>)|(<\/?strong>)|(<br>)/gm, "") ===
868
+ "") &&
869
+ desInputsRequired++
870
+ );
871
+ });
872
+
873
+ objetcTemp["Descripción"] = desInputsRequired;
874
+
875
+ const retailersRequested = [];
876
+ services[2]?.retailerMandatories?.forEach((retMan) =>
877
+ retMan.forEach((rm) => retailersRequested.push(rm))
878
+ );
879
+ const requiredImages = services[2]?.inputs?.filter(
880
+ (e) =>
881
+ e.required === 1 &&
882
+ retailersRequested.filter(
883
+ (ret) =>
884
+ ret.id_image === e.id &&
885
+ servicesData.filter((srv) => srv.id_retailer === ret.id_retailer)
886
+ .length > 0
887
+ ).length > 0
888
+ );
889
+
890
+ let requiredCounter = 0;
891
+ requiredImages?.forEach(
892
+ (req) =>
893
+ services[2].values.filter((img) => img.image_id === req.id).length ===
894
+ 0 && requiredCounter++
895
+ );
896
+ objetcTemp["Imágenes"] = requiredCounter;
897
+ setRequiredNull(objetcTemp);
898
+ } catch (error) {
899
+ console.log(error);
900
+ }
901
+ };
902
+
903
+ useEffect(() => {
767
904
  setComment(comments[activeTab]);
768
905
  }, [activeTab]);
769
906
 
@@ -794,7 +931,7 @@ export const RetailerProductEdition = ({
794
931
  concept = "description";
795
932
  break;
796
933
  }
797
- const productTemp = productSelected;
934
+ const productTemp = product;
798
935
  productTemp.article[`id_${concept}_${assignationType}`] = assignationId;
799
936
  const data = {
800
937
  articleList: [
@@ -818,6 +955,123 @@ export const RetailerProductEdition = ({
818
955
  sessionStorage.setItem("productSelected", JSON.stringify(productTemp));
819
956
  };
820
957
 
958
+ const downloadImages = () => {
959
+ selectedImages.forEach((e) => {
960
+ if (e.id) {
961
+ saveAs(
962
+ `https://${process.env.REACT_APP_IMAGES_BUCKET}.s3.amazonaws.com/${e.srcDB}`,
963
+ `${product.article.upc}_${e.name}.${e.ext}`
964
+ );
965
+ }
966
+ });
967
+ };
968
+
969
+ const deleteImages = () => {
970
+ setLoading(true);
971
+ const { values } = images;
972
+ const imgsInBack = [];
973
+
974
+ selectedImages.forEach((selectedImg) => {
975
+ if (selectedImg.id) imgsInBack.push(selectedImg);
976
+ });
977
+
978
+ const imgsLeft = values.filter(
979
+ (value) => selectedImages.indexOf(value) === -1
980
+ );
981
+
982
+ if (imgsInBack.length > 0) {
983
+ const data = {
984
+ articleId: product.article.id_article,
985
+ deleteImages: imgsInBack,
986
+ orderId: product.orderId,
987
+ };
988
+ try {
989
+ axios.put(
990
+ `${process.env.REACT_APP_ARTICLE_DATA_ENDPOINT}?image=true&version=${version}`,
991
+ data,
992
+ {
993
+ headers: { Authorization: token },
994
+ }
995
+ );
996
+ } catch (err) {
997
+ console.log(err);
998
+ }
999
+ }
1000
+
1001
+ setImages({
1002
+ action: "deleteImage",
1003
+ selectedImages,
1004
+ });
1005
+
1006
+ getRequired([
1007
+ services[0],
1008
+ services[1],
1009
+ { ...services[2], values: imgsLeft },
1010
+ ]);
1011
+
1012
+ setTimeout(() => {
1013
+ setLoading(false);
1014
+ }, 500);
1015
+
1016
+ setMessage("");
1017
+ setComponentsArray([]);
1018
+ };
1019
+
1020
+ const askToDeleteImages = () => {
1021
+ if (selectedImages.length > 0) {
1022
+ setMessage("¿Está seguro de eliminar las imágenes seleccionadas?");
1023
+ setComponentsArray([
1024
+ <ScreenHeader
1025
+ key={"1"}
1026
+ text={"¿Está seguro de eliminar las imágenes seleccionadas?"}
1027
+ headerType="retailer-name-header"
1028
+ color={"white"}
1029
+ />,
1030
+ <Button
1031
+ key={"2"}
1032
+ buttonType="general-white-button"
1033
+ label={"Cancelar"}
1034
+ onClick={() => setMessage("")}
1035
+ />,
1036
+ <Button
1037
+ key={"3"}
1038
+ buttonType="general-button-default"
1039
+ label={"Aceptar"}
1040
+ onClick={() => {
1041
+ setMessage("");
1042
+ deleteImages();
1043
+ }}
1044
+ />,
1045
+ ]);
1046
+ }
1047
+ };
1048
+
1049
+ const getRetailerStatus = (servicesData, tab) => {
1050
+ const arr = servicesData?.slice();
1051
+ let concept = getConcept(tab);
1052
+
1053
+ let retailerService = {};
1054
+ [retailerService] = arr?.filter(
1055
+ (service) =>
1056
+ service.id_retailer === activeRetailer?.id &&
1057
+ service.service === concept
1058
+ );
1059
+ return retailerService ? retailerService.status : "NS";
1060
+ };
1061
+
1062
+ useEffect(() => {
1063
+ let status = getRetailerStatus(servicesData, activeTab);
1064
+ setRetailerStatus(status);
1065
+ }, [activeTab, servicesData, activeRetailer]);
1066
+
1067
+ useEffect(() => {
1068
+ services.length > 0 && getRequired(services);
1069
+ }, [services, servicesData, activeTab]);
1070
+
1071
+ useEffect(() => {
1072
+ setSaving(loading);
1073
+ }, [loading]);
1074
+
821
1075
  return (
822
1076
  <Container headerTop={headerTop}>
823
1077
  <HeaderTop setHeaderTop={setHeaderTop} />
@@ -832,12 +1086,16 @@ export const RetailerProductEdition = ({
832
1086
  <ImageDataTable
833
1087
  lists={images}
834
1088
  activeImage={images?.values ? images?.values[activeImage] : {}}
835
- retailerSelected={activeRetailer.id}
1089
+ retailerSelected={activeRetailer?.id}
836
1090
  setImages={setImages}
837
1091
  assignationsImages={assig["Imágenes"]}
838
- imagesStatus={productSelected?.images_status}
1092
+ imagesStatus={product?.images_status}
839
1093
  setAssignation={setAssignation}
840
1094
  isRetailer={isRetailer}
1095
+ onClickSave={() =>
1096
+ product?.services?.images === 1 && updateImages()
1097
+ }
1098
+ showSaveButton={userAssigned()}
841
1099
  />
842
1100
  </div>
843
1101
  <div className="product-information">
@@ -845,37 +1103,80 @@ export const RetailerProductEdition = ({
845
1103
  headerData={product}
846
1104
  percent={activePercentage}
847
1105
  activeRetailer={activeRetailer}
1106
+ servicesData={servicesData}
848
1107
  setActiveRetailer={setActiveRetailer}
849
- approveRejectButtons={approveRejectButtons}
850
1108
  sendToFacilitator={sendToFacilitator}
851
- auditorAssigned={auditorAssigned}
852
- userAssigned={userAssigned(activeTab, "facilitator")}
1109
+ approve={() => {
1110
+ sendToFacilitator("A");
1111
+ }}
1112
+ reject={() => {
1113
+ sendToFacilitator("R");
1114
+ setMessage("Rechazado");
1115
+ setComponentsArray([
1116
+ <img src={errorModal} />,
1117
+ <ScreenHeader
1118
+ text={"Agrega tu comentarios para enviar el rechazo"}
1119
+ headerType={"input-name-header"}
1120
+ color={"white"}
1121
+ />,
1122
+ <TagAndInput
1123
+ label={"Caja de Comentario"}
1124
+ inputType={"textarea"}
1125
+ inputId={"modal-commentary-box"}
1126
+ index={0}
1127
+ color={"white"}
1128
+ />,
1129
+ <Button
1130
+ buttonType={"general-default-button"}
1131
+ label={"Enviar comentario"}
1132
+ onClick={(e) =>
1133
+ createComment(
1134
+ e,
1135
+ document.querySelector(
1136
+ "#modal-commentary-box .ql-container .ql-editor > p"
1137
+ ).innerHTML,
1138
+ activeTab
1139
+ )
1140
+ }
1141
+ />,
1142
+ ]);
1143
+ }}
1144
+ showValidationButtons={
1145
+ approveRejectButtons() && (auditorAssigned() || userAssigned())
1146
+ }
853
1147
  />
854
1148
  <FullTabsMenu
855
1149
  tabsSections={tabsSections}
856
- status={{
857
- Descripción: servicesData.filter(
858
- (service) =>
859
- service.id_retailer === activeRetailer?.id &&
860
- service.service === "description"
861
- )[0]?.status,
862
- "Ficha técnica": servicesData.filter(
863
- (service) =>
864
- service.id_retailer === activeRetailer?.id &&
865
- service.service === "datasheet"
866
- )[0]?.status,
867
- Imágenes: product?.images_status,
868
- }}
869
- profileImage={productData.asigned}
1150
+ status={retailerStatus}
870
1151
  activeTab={activeTab}
871
1152
  setActiveTab={setActiveTab}
872
1153
  setImageLayout={setImageLayout}
873
- saveDescriptions={saveDescriptions}
874
- saveDatasheets={saveDatasheets}
875
- updateImages={updateImages}
1154
+ downloadImages={downloadImages}
1155
+ askToDeleteImages={askToDeleteImages}
876
1156
  assig={assig[activeTab]}
877
1157
  setAssignation={setAssignation}
878
1158
  isRetailer={isRetailer}
1159
+ showSaveButton={userAssigned()}
1160
+ onClickSave={() => {
1161
+ switch (activeTab) {
1162
+ case "Descripción":
1163
+ !saving &&
1164
+ product?.description_status !== "NS" &&
1165
+ saveDescriptions();
1166
+ break;
1167
+ case "Ficha técnica":
1168
+ !saving &&
1169
+ product?.datasheet_status !== "NS" &&
1170
+ saveDatasheets();
1171
+ break;
1172
+ case "Imágenes":
1173
+ !saving && product?.images_status !== "NS" && updateImages();
1174
+ break;
1175
+
1176
+ default:
1177
+ break;
1178
+ }
1179
+ }}
879
1180
  />
880
1181
  <div
881
1182
  className={
@@ -883,108 +1184,130 @@ export const RetailerProductEdition = ({
883
1184
  (imageLayout && activeTab === "Imágenes" ? "image-services" : "")
884
1185
  }
885
1186
  >
886
- {!imageLayout && <GalleryHeader />}
887
- {activeTab === "Ficha técnica" &&
888
- (product?.services?.datasheets === 1 ? (
889
- datasheets[0]?.data?.map((dataGroup, index) => (
890
- <InputGroup
891
- key={index + "-" + activeRetailer.name}
892
- articleId={productSelected.article.id_article}
893
- version={version}
894
- activeSection={activeTab}
895
- inputGroup={dataGroup}
896
- dataInputs={datasheets[1]}
897
- updatedDatasheets={updatedDatasheets}
898
- setUpdatedDatasheets={setUpdatedDatasheets}
899
- />
900
- ))
901
- ) : (
902
- <p>no tienes este servicio</p>
903
- ))}
904
- {activeTab === "Descripción" &&
905
- (product?.services?.descriptions === 1 ? (
906
- <InputGroup
907
- activeSection={activeTab}
908
- inputGroup={descriptions[0]}
909
- updatedDescriptions={updatedDescriptions}
910
- setUpdatedDescriptions={setUpdatedDescriptions}
911
- articleId={articleId}
912
- version={version}
913
- dinamicHeight={true}
914
- />
915
- ) : (
916
- <p>no tienes este servicio</p>
917
- ))}
918
-
919
- {activeTab === "Imágenes" &&
920
- (product?.services?.images === 1 ? (
921
- <section className="container">
922
- <div {...getRootProps({ className: "dropzone" })}>
923
- <input {...getInputProps()} />
924
- <aside>{thumbs()}</aside>
925
- </div>
926
- </section>
927
- ) : (
928
- <p>no tienes este servicio</p>
929
- ))}
1187
+ {loading ? (
1188
+ <Loading />
1189
+ ) : (
1190
+ <>
1191
+ {!imageLayout &&
1192
+ activeTab === "Imágenes" &&
1193
+ product?.services?.images === 1 && (
1194
+ <GalleryHeader
1195
+ setSelectedImages={setSelectedImages}
1196
+ checkAll={checkAll}
1197
+ setCheckAll={setCheckAll}
1198
+ />
1199
+ )}
1200
+ {activeTab === "Ficha técnica" &&
1201
+ (product?.datasheet_status !== "NS" ? (
1202
+ datasheets[0]?.data?.map((dataGroup, index) => (
1203
+ <InputGroup
1204
+ key={index + "-" + activeRetailer.name}
1205
+ articleId={product.article.id_article}
1206
+ version={version}
1207
+ activeSection={activeTab}
1208
+ inputGroup={dataGroup}
1209
+ dataInputs={datasheets[1]}
1210
+ updatedDatasheets={updatedDatasheets}
1211
+ setUpdatedDatasheets={setUpdatedDatasheets}
1212
+ />
1213
+ ))
1214
+ ) : (
1215
+ <ScreenHeader
1216
+ text={"No cuentas con este servicio"}
1217
+ headerType={"input-name-header"}
1218
+ />
1219
+ ))}
1220
+ {activeTab === "Descripción" &&
1221
+ (product?.description_status !== "NS" ? (
1222
+ <InputGroup
1223
+ activeSection={activeTab}
1224
+ inputGroup={descriptions[0]}
1225
+ updatedDescriptions={updatedDescriptions}
1226
+ setUpdatedDescriptions={setUpdatedDescriptions}
1227
+ articleId={product?.article?.id_article}
1228
+ version={version}
1229
+ dinamicHeight={true}
1230
+ />
1231
+ ) : (
1232
+ <ScreenHeader
1233
+ text={"No cuentas con este servicio"}
1234
+ headerType={"input-name-header"}
1235
+ />
1236
+ ))}
1237
+
1238
+ {activeTab === "Imágenes" &&
1239
+ (product?.images_status !== "NS" ? (
1240
+ <section className="container">
1241
+ <div {...getRootProps({ className: "dropzone" })}>
1242
+ <input {...getInputProps()} />
1243
+ <aside>{thumbs()}</aside>
1244
+ </div>
1245
+ </section>
1246
+ ) : (
1247
+ <ScreenHeader
1248
+ text={"No cuentas con este servicio"}
1249
+ headerType={"input-name-header"}
1250
+ />
1251
+ ))}
1252
+ </>
1253
+ )}
930
1254
  </div>
931
- {(userAssigned(activeTab, "especialist" || "facilitator") ||
932
- auditorAssigned()) && (
933
- <div className="commentary-box">
934
- {!comment ? (
935
- <div className="commentary">
936
- <TagAndInput
937
- label={"Caja de Comentario"}
938
- inputType={"textarea"}
939
- inputCols={80}
940
- inputRows={4}
941
- inputId={"commentary-box"}
942
- index={0}
943
- />
944
- <div className="buttons-box">
945
- <Button
946
- buttonType={"general-transparent-button"}
947
- label={"Enviar comentario"}
948
- onClick={(e) =>
949
- createComment(
950
- e,
951
- document.getElementById(
952
- "description-commentary-box-0"
953
- ).value,
954
- activeTab
955
- )
956
- }
1255
+ {(userAssigned(activeTab) || auditorAssigned()) &&
1256
+ product[`${getConcept(activeTab)}_status`] !== "NS" && (
1257
+ <div className="commentary-box">
1258
+ {!comment ? (
1259
+ <div className="commentary">
1260
+ <TagAndInput
1261
+ label={"Caja de Comentario"}
1262
+ inputType={"textarea"}
1263
+ inputCols={80}
1264
+ inputRows={4}
1265
+ inputId={"commentary-box"}
1266
+ index={0}
1267
+ />
1268
+ <div className="buttons-box">
1269
+ <Button
1270
+ buttonType={"general-transparent-button"}
1271
+ label={"Enviar comentario"}
1272
+ onClick={(e) =>
1273
+ createComment(
1274
+ e,
1275
+ document.querySelector(
1276
+ "#commentary-box .ql-container .ql-editor > p"
1277
+ ).innerHTML,
1278
+ activeTab
1279
+ )
1280
+ }
1281
+ />
1282
+ </div>
1283
+ </div>
1284
+ ) : (
1285
+ <div className="feedback-box">
1286
+ <Commentary
1287
+ comment={comment.message}
1288
+ reviewed={crossComment}
957
1289
  />
958
1290
  <Button
959
- buttonType={
960
- requiredNull !== 0 ||
961
- !specialistValid(activeTab) ||
962
- !versionMatch()
963
- ? "general-button-disabled"
964
- : "general-green-button"
965
- }
966
- label={"Enviar evaluación"}
967
- onClick={() => sendToFacilitator()}
1291
+ buttonType={"circular-button accept-button"}
1292
+ onClick={async () => {
1293
+ setCrossComment(true);
1294
+ commentRevised();
1295
+ }}
968
1296
  />
969
1297
  </div>
970
- </div>
971
- ) : (
972
- <div className="feedback-box">
973
- <Commentary
974
- comment={comment.message}
975
- reviewed={crossComment}
976
- />
977
- <Button
978
- buttonType={"circular-button accept-button"}
979
- onClick={async () => {
980
- setCrossComment(true);
981
- commentRevised();
982
- }}
983
- />
984
- </div>
985
- )}
986
- </div>
987
- )}
1298
+ )}
1299
+ <Button
1300
+ buttonType={
1301
+ evaluationFinished(user.id_role, activeTab, statusArray) &&
1302
+ requiredNull[activeTab] === 0
1303
+ ? "general-green-button"
1304
+ : "general-button-disabled"
1305
+ }
1306
+ label={"Enviar evaluación"}
1307
+ onClick={() => sendToFacilitator()}
1308
+ />
1309
+ </div>
1310
+ )}
988
1311
  </div>
989
1312
  </div>
990
1313
  {showModal && (
@@ -995,6 +1318,25 @@ export const RetailerProductEdition = ({
995
1318
  approveRejectButtons={approveRejectButtons}
996
1319
  />
997
1320
  )}
1321
+ {message.length > 0 && (
1322
+ <GenericModal
1323
+ buttonType={componentsArray.length > 0 && "delete-product"}
1324
+ componentsArray={
1325
+ componentsArray.length > 0
1326
+ ? componentsArray
1327
+ : [
1328
+ <img key="1" src={succes} alt="success icon" />,
1329
+ <ScreenHeader
1330
+ key="2"
1331
+ headerType={"retailer-name-header"}
1332
+ text={message}
1333
+ color={"white"}
1334
+ />,
1335
+ ]
1336
+ }
1337
+ onClick={() => setMessage("")}
1338
+ />
1339
+ )}
998
1340
  </Container>
999
1341
  );
1000
1342
  };