contentoh-components-library 21.0.9 → 21.0.13

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